Hello Scala World!
情報処理技術者試験も終わったしそろそろ新しい言語でも調べてみるかなー、ということでScalaです。
特徴などは、Wikipediaの説明がわかりやすいかと。
ダウンロード&インストール
ダウンロードサイトからダウンロード。インストーラもあったけど、何となくアーカイブ版を取得して展開しパスを通しました。
export SCALA_HOME=xxxx/scala-2.7.0-final export PATH=$SCALA_HOME/bin:$PATH
Hello Scala World!
とりあえず、beginner's guideを読みながらHello Worldまでやってみます。
ソースを書く
以下のコードをbeginner's guideからコピペして、「HelloWorld.scala」の名前で保存。
object HelloWorld { def main(args: Array[String]) { println("Hello Scala World!") } }
今日の感想
- コンパイルしたらclassになるし、Javaとの連携が楽そうだな。仕事でも採用しやすいかも。
- 「Hello World!」のくせにコンパイルにやたら時間がかかるんだけど、何とかならんかな。
おまけ
javaで実行してみる
classファイルなのでjavaで実行できたりするのかな、と思って試してみたけど、エラーになりました。Scalaのクラスに依存しているようです。それもパスに通せば実行できるのかも。
$ java -cp . HelloWorld Exception in thread "main" java.lang.NoClassDefFoundError: scala/ScalaObject at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:620) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) at java.net.URLClassLoader.access$100(URLClassLoader.java:56) at java.net.URLClassLoader$1.run(URLClassLoader.java:195) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at HelloWorld.main(HelloWorld.scala)
HelloWorld$.classってなんぞや?
HelloWorld.classと一緒にできるHelloWorld$.classって何?と思って解析機に投入。タイムリー過ぎる!
require "javaclass" [ "./HelloWorld.class", "./HelloWorld$.class" ].each { |c| open( c, "r+b" ) {|io| jc = JavaClass.from io puts jc.to_s puts "" } }
実行結果です。(メソッドの本文は作成途中につき出力していません。)
// version 49.0 // source HelloWorld.scala public final class HelloWorld extends java.lang.Object { public static final int $tag ( ){ } public static final void main ( java.lang.String[] arg1 ){ } } // version 49.0 // source HelloWorld.scala public final class HelloWorld$ extends java.lang.Object implements scala.ScalaObject { public static final HelloWorld$ MODULE$; public static void <clinit> ( ){ } public void <init> ( ){ } public void main ( java.lang.String[] arg1 ){ HelloWorld$ this; java.lang.String[] args; } public int $tag ( ){ } }
ぐらいしかわかりませんな。んー。あんまし参考にならない。