ページ

2010年11月12日

JVM言語のFantom - fantomのfanは大好きのfan

Fantomは最近注目されている(?)新しい言語です。これは、そう、僕らみんなが大好きなJVM上で動きます。Javaは偉大です。(棒読み)。Fantomのfanは楽しいのfanです。これだけで、楽しくなってきました。さすがはJavaです。(やっぱり棒読み)

さて、この言語ですが、シンタックスはJavaっぽいですが、Javaではないです。Javaっぽいので、世界中にうじゃうじゃいるJavaプログラマにはとても取っつきやすい言語です。で、なんでJavaっぽいならJavaじゃいけないの?って、誰もが思います。理由はいくつかありますが、FantomはJVM上で動きますが、それだけじゃなくって、.netのcli上でも動きます。PythonやRubyなど既存の言語で両方で動くというのは聞いたことがありますが、新規の言語で両方で動くというのは珍しいかと思います。

で、Javaじゃだめなの?っていう理由のもう一つですが、基本的にFantomは静的な型付け言語ですが、ローカル変数などは型宣言を明示しなくてもよいです。このあたりは、golangとよく似ていると思います(思想的にもシンタックス的にも)。Java(というかほとんどの静的型付け言語)でめんどいな〜、と思うところが改善されています。インターフェースになる部分には型は明示されていた方がコードは書きやすいですが、ローカル変数までそれをやると冗長なだけです。

あとはAPIが洗練されていると書いてあったりしますが、そのあたりはそんなに主張するところじゃないでしょう。それから、JVM上で動く言語は既存のJava資産が使えるって声高に主張している人がいますが、Thriftをみていると、わざわざJVM上で動かさなくてもいいんじゃないか?と思ったりもします。

それじゃ、前置きが長くなりましたが、それそろ始めます。一応、Mac上で動かしてます。Javaのランタイムはすでに入っているという前提で・・・。まあ、XCode入れれば勝手にはいるし。

1. セットアップ
ダウンロードは、先ほどのページにダウンロードのリンクをクリックして、ダウンロードします。ダウンロード後、アーカイブを展開します(xの部分は適当なバージョン番号)。
$ unzip fantom-x.x.xx.zip
さて、このあと、システム全体にインストールしてもいいのですが、メインで使うわけもないので、やめます。とりあえずは、展開したディレクトリのbinディレクトリにPATHを通せばいいです。
$ export PATH=$path_to_bin_dir:%PATH
binディレクトリの中のファイルには実行属性がついていないので、つけてあげます。で、exeファイルがたくさんあってうっとうしいので、消しちゃいます。
$ cd $path_to_bin_dir
$ chmod +x *
$ rm *.exe
これでおしまい。

2. 動作確認
セットアップが終わったら動作確認です。fanshというしょぼいインタラクティブシェルがついてくるので、それでおきまりのHello, World.です。
$ fansh
Fantom Shell v1.0.55 ('?' for help)
fansh> echo("Hello, World!")
Hello, World!
fansh> quit
$

おー、動きました。

3. ざっとした文法とか・・・
みんなJavaプログラマなので、ここのサンプルコードをみれば、10分で理解できます。JavaプログラマじゃなくってPythonとかそれ以外のプログラマなら8分で理解できます。なので、省略します。ちゃんと勉強したいという頭の固い人は、こちらからどうぞ。
型がすべて大文字で始まるのですが、Voidっていうのは何度見てもキモイとか、言わないの!

4. ちょっとだけ
インタラクティブシェルで書いたHello, Worldをfantomのスクリプトファイルとして書いてみましょう。次のコードをhello.fanとして保存して、fan hello.fanとして実行します。
class MyScript {
    static Void main() {
        echo("Hello, World")
    }
}
まず、ファイルの中のトップレベルはclassでなければなりません。Javaの悪しき風習は守られています。ただし、一つのファイルの中に沢山classをつくれるので、すべての悪を引き継いだわけではありません。
で、実行がめちゃくちゃ遅い。Javaのバイトコードにコンパイルするからです。遅い理由もうなずけます。golangがコンパイルスピードまでこだわったのとは対照的です。

もう一個。
class MyScript {
    static Void main() {
        s := gets
        s = s[0..5]
        echo(s)
        t := Script()
        echo(Type.of(t))
    }
    static Str gets() {
        return "hello, world"
    }
}

なんとなく雰囲気がわかるとおもいます。配列のスライスとか、Javaと違ってすっきりしています。それと、Map型(Pythonの人なら辞書)も[]で表記します。こんな感じ。
[1:"ichi", 2:"ni", 3:"san"]

便利そうなんだけど、空のMapを作るのはどうするんだろう?

5. もっと
fantomはconcurrentがちゃんとサポートしているとか言っています。マルチスレッドで動くときは同じメモリを参照するものは自動で排他制御tかimmutableな変数して扱うとか、Actors model for message passing (Erlang style concurrency)とか、言っています。

それ以外にもGUIをサポートしていたりとか・・・。まあ、Javaの人にはわりと取っつきやすい言語じゃないかな?

0 件のコメント: