Haxe
| Haxe | |
|---|---|
| パラダイム | マルチパラダイム |
| 登場時期 | 2005 |
| 開発者 | Haxe Foundation, Nicolas Cannasse |
| 最新リリース | 3.0 / 2013年5月25日 |
| 型付け | ハイブリッド(静的型付け&動的型付け) |
| 影響を受けた言語 | ActionScript, OCaml |
| プラットフォーム | クロスプラットフォーム |
| ライセンス | BSD, GPL v2 |
| ウェブサイト | haxe.org |
Haxe(ヘックス、発音記号は /heks/[1][2])は汎用プログラミング言語の一つである。静的型付けのオブジェクト指向言語であり、構文はActionScriptおよび標準化が中止されたECMAScript 4に類似している。Adobe Flashおよび独自のVMで実行可能なバイトコードにコンパイルされるほか、JavaScript、ActionScript、C++、C#、Java、PHPへのソースコードの変換が可能であるため、主にマルチプラットフォーム開発を目的として使用される。また、FlashからHTML5への移行にも使用される。
2012年4月に表記がhaXeからHaxeに変更された[3]。
目次 |
対応プラットフォーム[編集]
Haxeのコンパイラは、Flashおよび独自の仮想マシンNekoの実行バイナリや、JavaScript、ActionScript、C++、C#、Java、PHPのソースコードを生成する。複数のプラットフォームに「コンパイルする」この戦略は、"Write once, run anywhere"の思想に基づいている。これにより、プログラマが目的のために最良のプラットフォームを選択できる。
Haxeでは、これらプラットフォームは「ターゲット」と呼ばれる。ターゲットはHaxeのモジュールであり、それぞれのプラットフォームのコードを生成するコンパイラのバックエンドと、プラットフォーム固有のAPIおよびランタイムから成る。
| ターゲット | プラットフォーム | Haxeのバージョン | ステータス | パフォーマンス |
|---|---|---|---|---|
| JavaScript | ブラウザ | 1.0 (2005年11月) | 安定 | ○ |
| Flash | Flash Player、Adobe AIR | 1.0 (2005年11月) | 安定 | ○ |
| ActionScript 3(ソースコード) | Flash Player、Adobe AIR | 安定 | ○ | |
| C++ | Windwos, Linux, Mac OS X | 2.04 (2009年4月) | △ | |
| C# | Microsoft .NET、Mono | 2.10 (2012年4月) | 実験的 | △ |
| Java | JVM | 2.10 (2012年4月) | 実験的 | △ |
| PHP | PHP | 2.0 (2008年7月) | × | |
| Neko | NekoVM | 1.0 (2005年11月) | 安定 | ○ |
言語[編集]
静的型付け(ただし動的型も使用可能)のオブジェクト指向言語である。
HaxeはActionScriptから派生した言語であるため、基本構文はほぼ同じである。ActionScript同様のクラス機構のほか、型推論、ジェネリクス、インライン関数等の独自の機能を持つ。Flashターゲットの場合、FlashのAPIをそのまま使用でき、他のターゲットについても類似のAPIが提供されている。また、JavaScript、C++、PHPの既存のライブラリの利用も可能である。
JavaScript出力におけるHTML5 Canvasの使用例を示す。
import js.Browser; import js.html.CanvasElement; import js.html.CanvasRenderingContext2D; class Main { static public function main() { var canvas:CanvasElement = cast Browser.document.getElementById("canvas"); var ctx:CanvasRenderingContext2D = canvas.getContext2d(); ctx.fillStyle = "#F00"; ctx.fillRect(50, 50, 100, 100); } }
Haxeは静的型付け言語であるが、Dynamic型やuntypedを用いることで動的型付け言語であるJavaScriptのAPIにアクセスできる。また、externによる型定義を行うことでIDEの補完やコンパイル時のチェックが有効になる。jQuery等のexternが用意されている。
グラフィカルな用途におけるHaxeの例を示す。ここではクロスプラットフォームのライブラリであるNMEを使用して画像を描画する。同一コードがFlash、HTML5、PCネイティブ、iOS/Androidネイティブで実行可能である。描画には、FlashではDisplayObject、HTML5ではCanvas、ネイティブ環境ではOpenGLが使用される。
import nme.Assets; import nme.display.Bitmap; import nme.display.Sprite; import nme.Lib; class Main extends Sprite { public function new() { super(); var image = new Bitmap(Assets.getBitmapData("sample.png")); addChild(image); } static public function main() { Lib.current.addChild(new Main()); } }
Haxeでは精緻な型宣言が可能である。
function func1(threeDimensionalArray:Array<Array<Array<Int>>>, string:String, bool:Bool) { ... } // オプションのInt整数値を渡し、Intを返す function func2(?i:Int):Int { return 0; } // 引数のない関数をパラメータとして渡す function func3(f:Void -> Void) { f(); } // Intを渡しIntを返す関数をパラメータとして渡す function func4(f:Int -> Int) { var result = f(1); } // 任意型を取り、任意型を返す function func5(d:Dynamic):Dynamic { return d; }
列挙型はHaxeの重要な特徴である。自身のパラメータを持ち、再帰構造にできる[4]。これはMLやHaskellのような言語の代数的データ型に似ている。 Haxeの列挙型は、他の多くの言語のように単にマジックナンバーがインデックス化されたものよりも抽象的である。以下の例のようにインスタンス化することができる。
enum Color { red; green; blue; rgb: (r:Int, g:Int, b:Int); } class Colors { static function toInt(c:Color):Int { return switch (c) { case red: 0xFF0000; case green: 0x00FF00; case blue: 0x0000FF; case rgb(r, g, b): (r << 16) | (g << 8) | b; } } static function validCalls() { var redint = toInt(Color.red); var rgbint = toInt(Color.rgb(100,100,100)); } }
実装[編集]
HaxeのコンパイラはOCaml言語で実装されている。Haxeの利用者にはOCamlの知識は必要ない。
パフォーマンス[編集]
JavaScript出力において、Haxeのコンパイラはオーバーヘッドのほぼない効率的なコードを出力する。また、インライン関数やマクロを用いた最適化も可能である。あるベンチマーク[5]においてHaxeの出力コードはJSXとほぼ同等の速度で動作することが報告された。
C++出力において、Googleのmulti-language-bench[6]を使ったベンチマークでは、最初からC++で書かれたコードと比較して39%、Javaとの比較で19%遅くなる程度の差であるという結果が出た[7]。
Flash出力において、HaxeのコンパイラはAdobe社純正のコンパイラより高速なバイトコードを出力するとされる。あるベンチマーク結果[8]では、同等のActionScriptソースコードから生成されるAVM2バイトコードよりもHaxeは優れたパフォーマンスを示した。このベンチマークの公表以後、Haxeのコンパイラは、ActionScriptにはないインライン関数やAdobe Alchemyのオペコードを使用することで、さらにパフォーマンスを改善した[9]。
以上に比べ、JavaおよびC#出力に関してはややオーバーヘッドが大きい。今後のバージョンで最適化が予定されている。
統合開発環境[編集]
Haxeでのプログラミングには各種の統合開発環境およびエディタが利用できる。Haxeのコンパイラには、IDEに対してコンパイル・補完機能を提供するサーバー機能が備わっている。
- FlashDevelop
- Sublime Text - Haxeバンドル
- Vim - Vaxe
- IntelliJ IDEA - 公式プラグイン
- MonoDevelop - Haxe Language Binding (ベータ版)
- FDT
言語名の由来[編集]
Haxeの名前は、短くシンプルで使われていないこと、また新しい技術を成功に導くために必要な X を中に持っていること(has a X inside)[10]から命名された。
当初の綴りはhaXeであったが、2012年4月のWorld Wide Haxeカンファレンスにおいて、表記を固有名詞として馴染みやすいHaxeに変更することがアナウンスされた[3]。
比較される言語[編集]
HaxeはJavaScript生成言語(いわゆる「altJS」)のひとつとしてしばしば言及される。比較対象となる主な言語として、以下が挙げられる。
参照[編集]
- ^ Haxeの発音について言語開発者による回答
- ^ 公式メーリングリストにおけるHaxeの読み方についての会話
- ^ a b haXe is now Haxe
- ^ Haxe reference detailing the use of enum
- ^ JSX vs HaXeベンチマーク戦争
- ^ multi-language-bench - Benchmarks implemented in multiple languages - Google Project Hosting
- ^ Multi-Language-Bench - Game Haxe
- ^ AS3->Haxe port of the Actionscript Physics Library
- ^ なぜHaxeを使うのですか? - Haxe
- ^ Haxeのネーミングについて言語開発者のコメント
外部リンク[編集]
- 公式Haxeウェブサイト
- NME - Haxeのゲーム用マルチプラットフォームライブラリ
- haxe JS - HaxeのJavaScript出力に関する情報源
- haxenode : haxe->NodeJS - HaxeのNode.jsにおける使用に関する情報源