読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

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!")
  }
}
コンパイル

「scalac」でコンパイル

$ scalac HelloWorld.scala 

→「HelloWorld.class」と「HelloWorld$.class」が作成されます。

実行

scala」で実行します。

$ scala -cp . HelloWorld

実行結果です。

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 (  ){
    }

}

ぐらいしかわかりませんな。んー。あんまし参考にならない。