haXe


概要

ActionScript に似たプログラミング言語とそのコンパイラ。

クロスプラットフォーム

の 6 種類の出力ができることが特徴。

サンプル - N クイーン問題

簡単なサンプルを書いてみた。 SWF、Neko、JavaScript のどれでも動きます。

コード

// -*- java -*-

// Java と同様に、一番外側はクラス。トップレベル(グローバル)の関数などはない。
class NQueens {
    // main 関数もクラスに属する。
    static function main() {
        var x = new NQueens ();
        x.queens (4);
    }

    // コンストラクタは new という名前。
    function new () {}

    // 関数の仮引数は原則として型を明示しなければいけない。
    function is_safe (pos : Array<Int>, newpos : Int) {
        var len = pos.length;
        var i;
        for (i in 0 ... len) {  // for は C などの一般的な構文は使えない。
            var distance = len - i;
            if (newpos == pos[i]
                || newpos == pos[i] - distance
                || newpos == pos[i] + distance)
                return false;
        }
        return true;
    }

    // 戻り値の型を指定。型が不定の場合は Dynamic と書く。
    function iter (pos : Array<Int>, k : Int, n : Int) : Dynamic {
        if (k == n)
            return pos;

        var i;
        for (i in 0 ... n) {
            if (is_safe (pos, i)) {
                var s = iter (pos.concat ([i]), k + 1, n);
                if (s != false)
                    return s;
            }
        }
        return false;
    }

    function queens (n:Int) : Void {
        var s = iter ([], 0, n);
        trace (s);  // trace はターゲットごとに適した形で文字列を出力してくれるので便利。
    }
}

起動

-swf、-js および -neko というコンパイルオプションでターゲットを指定する。

SWF を生成する:

% haxe -swf nqueen.swf -main NQueens NQueens.hx

JavaScript を生成する:

% haxe -js nqueen.js -main NQueens NQueens.hx

JavaScript のコードは、適当な HTML から <script> を使って読み込めば実行できます。

NekoVM のバイトコードを生成する:

% haxe -neko nqueen.n -main NQueens NQueens.hx

NekoVM を走らせる:

% neko nqueen.n 
NQueens.hx:43: [1, 3, 0, 2]

言語

NekoVM

オリジナルの仮想マシンで動くプログラミング言語の処理系。 この処理系をウェブサーバで動作させることで、 サーバサイドスクリプティングを可能にするのが狙いらしい。 ウェブに関してはサーバサイド、クライアントサイドともに haXe だけですべて記述できる。

また、Screenweaver HX では、 デスクトップアプリケーションをこの NekoVM で走らせる。 (でも結構不安定。)

Screenweaver HX

Screenweaver は Flash でデスクトップアプリが作れるツール。 現在は開発が停止されている。

Screenweaver HX は haXe の派生物で、Screenweaver の後継プロジェクトとなった。 でも中身はぜんぜん別物。

Screenweaver が Windows のネイティブコードを出力できていたのに対し、 HX の出力は NekoVM のバイトコード。 なので、ちょっと扱いづらくなった。