概要
ActionScript に似たプログラミング言語とそのコンパイラ。
クロスプラットフォーム
- Web ブラウザ用の JavaScript、
- SWF(Flash)ファイル、
- ActionScript3 ソースコード
- NekoVM のバイトコード
- PHP スクリプト
- C++ ソースコード
の 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]
言語
- ActionScript ベースだが Java みたいな外観。
- 原則として静的型付。
- Dynamic もある。
NekoVM
オリジナルの仮想マシンで動くプログラミング言語の処理系。 この処理系をウェブサーバで動作させることで、 サーバサイドスクリプティングを可能にするのが狙いらしい。 ウェブに関してはサーバサイド、クライアントサイドともに haXe だけですべて記述できる。
また、Screenweaver HX では、 デスクトップアプリケーションをこの NekoVM で走らせる。 (でも結構不安定。)
Screenweaver HX
Screenweaver は Flash でデスクトップアプリが作れるツール。 現在は開発が停止されている。
Screenweaver HX は haXe の派生物で、Screenweaver の後継プロジェクトとなった。 でも中身はぜんぜん別物。
Screenweaver が Windows のネイティブコードを出力できていたのに対し、 HX の出力は NekoVM のバイトコード。 なので、ちょっと扱いづらくなった。