Haxe

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
Haxe
パラダイム マルチパラダイム
登場時期 2005
開発者 Haxe Foundation, Nicolas Cannasse
最新リリース 3.1.3 / 2014年04月13日(2か月前) (2014-04-13
型付け ハイブリッド(静的型付け&動的型付け)
影響を受けた言語 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の実行バイナリや、JavaScriptActionScriptC++C#JavaPHPのソースコードを生成する。複数のプラットフォームに「コンパイルする」この戦略は、"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++ WindowsLinuxMac OS X

iOSAndroidTizenBlackBerryHP webOS

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(OpenFL)が開発されている。また、JavaScript、C++、PHP等の既存コードとの連携も可能である。

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);
    }
}

Haxeは静的型付き言語であるが、Dynamic型やuntypedを用いることで動的型付き言語であるJavaScriptとの連携が行える。また、externによる型定義を行うことでIDEの補完やコンパイル時のチェックが有効になる。標準でHTML5およびjQueryのexternが提供されている。

次に、クロスプラットフォームのライブラリであるOpenFLを用いて画像を表示するプログラムを示す。同一コードがFlash、HTML5、Windows/Mac/Linux/iOS/Androidネイティブで実行可能である。描画には、FlashではDisplayObject、HTML5では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では精緻な型宣言が可能である。

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のコンパイラはオーバーヘッドのほぼない効率的なコードを出力する。また、インライン関数やマクロを用いた最適化も可能である。JSXと比較するベンチマーク[5]においてHaxeの出力コードは JSXとほぼ同等の速度で動作することが報告された。

C++出力において、Googleのmulti-language-bench[6]を使ったベンチマークでは、最初からC++で書かれたコードと比較して39%、Javaとの比較で19%遅くなる程度の差であるという結果が出た[7]

Flash出力において、HaxeのコンパイラはAdobe社純正のコンパイラより高速なバイトコードを出力するとされる。2007年のベンチマーク結果[8]では、同等のActionScriptソースコードから生成されるAVM2バイトコードよりもHaxeは優れたパフォーマンスを示した。このベンチマークの公表以後、Haxeのコンパイラは、ActionScriptにはないインライン関数やAdobe Alchemyのオペコードを使用することで、さらにパフォーマンスを改善した[9]

以上に比べ、JavaおよびC#出力に関してはややオーバーヘッドが大きい。今後のバージョンで最適化が予定されている。

統合開発環境[編集]

Haxeでのプログラミングには各種の統合開発環境およびエディタが利用できる。Haxeのコンパイラには、IDEに対してコンパイル・補完機能を提供するサーバー機能が備わっている。

Haxeで書かれたソフトウェア[編集]

Flashコミュニティを出自とする言語のため、ゲームの用例が多い(言語上はそれに限定されない)。以下に代表的なものを挙げる。

  • Evoland - Haxe創始者(Nicolas Cannasse)ほかによるインディーRPG
  • Papers, Please - 架空の共産国の入国審査官を疑似体験するゲーム。OpenFLを使用。Metacriticのメタスコア85を獲得。GDC 2014のIndependent Games Festivalにおいて最優秀賞を受賞。
  • OpenFL - Showcase - OpenFLを使用したゲームのショーケース
  • Stencyl - 2Dゲームエディタ。OpenFLを使用。

歴史[編集]

Haxeは、2005年10月にフランスのブラウザゲーム開発会社Motion-Twinの独自ActionScriptコンパイラMTASCの後継プロジェクトとして誕生した(当初の綴りはhaXeであった)。今日に至るまでプロジェクトのリーダーであるNicolas Cannasseを中心としたチームメンバーによって開発されている。2006年5月にHaxe 1.0がリリースされ、JavaScriptターゲットに対応した。

2008年7月のHaxe 2.0においてFranco PonticelliによりPHPターゲットが、2009年7月のHaxe 2.04においてHugh SandersonによりC++ターゲットが追加された。Bruno GarciaがJavaScriptターゲットのメンテナとして参加し、2011年の2.08と2.09のリリースにおいてJavaScriptターゲットの著しい最適化が行われた。その後、Simon Krajewskiがチームに参加し、さらにCauê WaneckによってJavaおよびC#ターゲットが追加された。

2012年4月パリ開催のWorld Wide Haxeカンファレンスにおいて、表記をHaxeに変更すること、次のメジャーバージョンとなるHaxe 3に向けて破壊的変更を行うことがアナウンスされた。また、同2012年に、プロジェクトリーダーであるNicolas CannasseがMotion-Twinより独立、インディーゲーム開発会社Shiro GamesおよびHaxe Foundationを設立した。2013年5月にHaxe 3.0がリリースされた。

ActionScriptの代替コンパイラとして開発されたため、Flashターゲットの用途が多かったものの、現在はプラットフォーム中立な言語環境となることを目指している[10]

言語名の由来[編集]

Haxeの名前は、短くシンプルで使われていないこと、また新しい技術を成功に導くために必要な X を中に持っていること(has a X inside)[11]から命名された。

当初の綴りはhaXeであったが、2012年4月のWorld Wide Haxeカンファレンスにおいて、表記を固有名詞として馴染みやすいHaxeに変更することがアナウンスされた[3]

比較される言語[編集]

HaxeはJavaScript生成言語(いわゆる「altJS」)のひとつとしてしばしば言及される。比較対象となる主な言語として、以下が挙げられる。

参照[編集]

  1. ^ Haxeの発音について言語開発者による回答
  2. ^ 公式メーリングリストにおけるHaxeの読み方についての会話
  3. ^ a b haXe is now Haxe
  4. ^ Haxe reference detailing the use of enum
  5. ^ JSX vs Haxeベンチマーク戦争 (2012年6月4日)
  6. ^ multi-language-bench - Benchmarks implemented in multiple languages - Google Project Hosting
  7. ^ Multi-Language-Bench - Game Haxe
  8. ^ AS3->Haxe port of the Actionscript Physics Library
  9. ^ なぜHaxeを使うのですか? - Haxe
  10. ^ Getting Rid of Flash ?
  11. ^ Haxeのネーミングについて言語開発者のコメント

外部リンク[編集]