Haxe
Haxe(ヘックス、発音記号は /heks/[3][4])はオープンソースの高級プログラミング言語、もしくはそのコンパイラである。
Haxeのロゴ | |
パラダイム | マルチパラダイム |
---|---|
登場時期 | 2005 |
開発者 | Haxe Foundation, Nicolas Cannasse |
最新リリース | 4.2.2/ 2021年5月14日[1] |
評価版リリース | 4.0.0-rc.5 / 2019年9月12日[2] |
型付け | 静的型付け |
影響を受けた言語 | ActionScript, OCaml |
プラットフォーム | クロスプラットフォーム |
ライセンス |
コンパイラ:GPL v2以降 標準ライブラリ:MIT |
ウェブサイト | haxe.org |
対応プラットフォーム
編集AVM
編集Neko
編集haXe Betaより対応(2006年2月)[6]。バイトコードへコンパイルされる。
JavaScript
編集ActionScript 3
編集1.xより対応(2007年3月)[6]。複数のソースファイルを出力する。主な想定プラットフォームは、Adobe FlashやAdobe AIR。
PHP
編集C++
編集C#
編集Java
編集Python
編集3.2.0-rc.2より対応(2015年5月)[18]。単一のソースファイルを出力する。
Cppia
編集Lua
編集3.3.0-rc.1より対応[20]。単一のソースファイルを出力する。
HashLink
編集3.3.0-rc.1より対応[21]。バイトコードへコンパイルされる。主な想定プラットフォームは、WindowsやmacOS、Linux、iOS、Android、Nintendo Switch、PlayStation 4。
Java VM
編集4.0.0-rc.3より対応[22]。バイトコードへコンパイルされる。
言語
編集静的型付きのオブジェクト指向言語である。HaxeはActionScriptから派生した言語であるため、基本構文はActionScript3と共通する部分が多い。
機能
編集ActionScript3と共通する機能
編集ActionScript3との相違点
編集- for(初期化式; 継続条件式; 再初期化式){} のC言語形式のfor文
独自の機能
編集その他、以下のような独自の機能を持つ[23]
- 型推論
- 型パラメータ(ジェネリクス)
- インライン関数
- 列挙型(一般化代数的データ型)
- 型エイリアス (typedef)
- パターンマッチング
- 構造的部分型付け
- 関数の部分適用
- 条件付きコンパイル
- 配列内包表記、辞書内包表記
- 文字列リテラル内での改行、文字列内の変数展開(ヒアドキュメント)
- 静的拡張 (Mixin)
- マクロ
型システム
編集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は静的型付き言語であるが、Dynamic型やuntypedを用いることで部分的に型チェックを無効化できる。逆にexternクラスによる型定義を行うことで、動的型のターゲットのライブラリに対して型チェックを有効にして連携できる。
列挙型
編集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の標準ライブラリはすべてのターゲットで動作するもの、すべてでは無いが複数のターゲットで動作するもの、個別のターゲットのみで動作するものがある。以下にそれぞれの例をあげる。
- すべてのターゲットで動作するもの
- すべてではないが複数のターゲットで動作するもの
- 個別のターゲットで動作するもの
このように機能それぞれに合わせた抽象化が行われているため、複数のターゲットで動作するような書き方と、個別のターゲットに依存してそのターゲットの利点を生かすような書き方の両方ができる。
JavaScript
編集個別のターゲットのに依存する場合の例として、JavaScript出力におけるHTML5 Canvasの使用例を示す。
import js.Browser;
import js.html.CanvasElement;
class Main
{
static public function main()
{
var canvas:CanvasElement = cast Browser.document.getElementById("canvas");
var ctx = canvas.getContext2d();
ctx.fillStyle = "#F00";
ctx.fillRect(50, 50, 100, 100);
}
}
サードパーティーのライブラリ
編集OpenFL
編集HaxeではFlashターゲットの場合はFlashのAPIをそのまま使用できるが、他のターゲットについてもFlashに類似したオープンソースのAPI (OpenFL) が開発されている。
クロスプラットフォームのライブラリであるOpenFLを用いて画像を表示するプログラムを示す。同一コードがFlash、HTML5、Windows/Mac/Linux/iOS/Androidネイティブで実行可能である。描画には、FlashではDisplayObject、HTML5ではWebGLまたはCanvas、ネイティブ環境ではOpenGLが使用される。
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.Lib;
class Main extends Sprite
{
public function new()
{
super();
var image = new Bitmap(openfl.Assets.getBitmapData("img/sample.png"));
addChild(image);
}
static public function main()
{
Lib.current.addChild(new Main());
}
}
コンパイラ
編集実装
編集HaxeのコンパイラはOCamlで実装されている。Haxeの利用者にはOCamlの知識は必要ない。
機能
編集Haxeのコンパイラは複数のプラットフォームへのコンパイルの他に以下のような機能を持つ。
ターゲット共通
編集各ターゲット個別
編集- SWC、SWFのライブラリの利用(Flash)
- 静的リンク・動的リンク
- SWC、SWFのライブラリからのexternの生成
- SWCファイルの生成
- ソースマップの生成(JavaScript)
- jarライブラリの利用(Java)
- dllライブラリの利用(C#)
統合開発環境
編集Haxeでのプログラミングには各種の統合開発環境 (IDE) およびエディタが利用できる。Haxeのコンパイラには、IDEに対してコンパイル・補完機能を提供するサーバ機能が備わっている。
- FlashDevelop
- Visual Studio Code - プラグイン
- Sublime Text - Haxeバンドル
- Atom - atom-haxe
- Vim - Vaxe
- IntelliJ IDEA - 公式プラグイン
- FDT
Haxeで書かれたソフトウェア
編集歴史
編集言語名の由来
編集よく比較される言語
編集HaxeはJavaScript生成言語(いわゆる「altJS」)のひとつとしてしばしば言及される。比較対象となる主な言語として、以下が挙げられる。
HashLink
編集.hl
)を用いる。
HashLinkの動作形態として、HL/JIT方式とHL/C方式の2種類がある。HL/JIT方式では、実行時コンパイラを通して仮想マシン上で動作させる為、コンパイル速度が高速でデバッグに向いている。一方、HL/C方式では仮想マシンは使用されず、代わりにC言語ソースコードを出力する。出力されたCソースコードは、任意のCコンパイラでビルドでき、より高いパフォーマンスと移植性が期待できる[29]。例えば、iOSやAndroidなどのモバイルOS、PlayStation 4やNintendo Switchなどの家庭用ゲーム機といった、デスクトップ環境に限定されない様々なプラットフォームへの移植が比較的容易となる。実例として、このHashLinkとゲームエンジンであるHeapsで開発されているMotion Twin社のDead Cellsは[30][31]、PlayStation 4、Nintendo Switch、Xbox One向けに移植されている。
参照
編集外部リンク
編集- 公式Haxeウェブサイト
- Try Haxe! - Web上でHaxeの動作を確認できる実行環境
- OpenFL - Haxeのゲーム用マルチプラットフォームライブラリ