hakobera's blog

技術メモ。たまに雑談

はじめてのScala その4 Hello, world! を改造して学ぶ

今回はJavaとの連携 + α でいこうと思う。
ということで、前回のHelloWorldをちょこっと改造。

object Main {
  def main(args: Array[String]) {
    var hello:HelloWorld = new HelloWorld()
    hello.hello()
  }
}

class HelloWorld {
  def hello() {
    System.out.println("Hello, World!")
  }
}

これを hello.scala という名前で保存し、コンパイルして実行。

> scalac hello.scala
> scala Main
Hello, World!

ここから次のことがわかる。

  • Javaのようにクラス名とファイル名は一致させなくてよい
  • 1つのクラスに複数のpublicクラスを記述することが可能
  • java.langに所属するJavaクラス(この例だとjava.lang.System)は特別なことをしなくても呼び出せる

これだと面白くないので、今度はjava.lang以外のクラスを呼びだすコードを書く。

import java.util.Date

object Main {
  def main(args:Array[String]) {
    var hello:HelloWorld = new HelloWorld
    hello.hello
  }
}

class HelloWorld {
  def hello() {
    System.out.println(new Date())
  }
}

Javaのクラスを呼び出すのは普通に import文。Javaと違うのは最後のセミコロンがないくらいだ。
これをコンパイルして、次のように実行。

> scalac hello.scala
> java -classpath "%SCALA_HOME%\lib\*";. Main
Mon Jun 02 23:11:22 JST 2008

というわけで、Scalacでコンパイルしたクラスはjavaコマンドで実行できることがわかる。
これはコンパイル後のディレクトリを除いてみれば明白。

> dir
hello.scala
HelloWorld.class
Main$.class
Main.class

要するに、scalacはScalaプログラムをJavaのクラスファイルにコンパイルしているのだ。
これをみれば、「JVM上で動く」ことや「Javaとほぼ実行速度が同じ」というのも納得できるものだ。

HelloWorldを少しいじっただけでもScalaという言語の特徴がわかって少し面白い。
このお題でもう少しかけそうなので、明日も引き続きHelloWorld改造日記にすることにした。