Haxe

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索
Haxe
Haxe logo.svg
パラダイム マルチパラダイム
登場時期 2005
開発者 Haxe Foundation, Nicolas Cannasse
最新リリース 3.2.1 / 2015年10月11日(3か月前) (2015-10-11
型付け 静的型付け
影響を受けた言語 ActionScript, OCaml
プラットフォーム クロスプラットフォーム
ライセンス

コンパイラ:GPL v2

標準ライブラリ:MIT
ウェブサイト haxe.org

Haxe(ヘックス、発音記号は /heks/[1][2])はオープンソースの高級プログラミング言語、もしくはそのコンパイラである。

言語としてのHaxeは静的型付きオブジェクト指向言語であり、構文はActionScript3および標準化が中止されたECMAScript 4に似ている。Adobe Flashおよび独自のNekoVMで実行可能なバイトコードにコンパイルされるほか、JavaScript、ActionScript、C++、C#、Java、PHP、Pythonへのソースコードの変換が可能であるため、主にマルチプラットフォーム開発を目的として使用される。また、FlashからHTML5への移行にも使用される。

2012年4月に表記がhaXeからHaxeに変更された[3]

対応プラットフォーム[編集]

Haxeのコンパイラは、Flashおよび独自の仮想マシンNekoの実行バイナリや、JavaScriptActionScriptC++C#JavaPHPPythonのソースコードを生成する。複数のプラットフォームに「コンパイルする」この戦略は、"Write once, run anywhere"の思想に基づいている。これにより、プログラマが目的のために最良のプラットフォームを選択できる。

Haxeでは、これらプラットフォームは「ターゲット」と呼ばれる。

ターゲット 出力形式 プラットフォーム Haxeのバージョン
JavaScript ソースコード(1ファイル) ブラウザ、Node.jsPhoneGap 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、Unity 2.10 (2012年4月)
Java ソースコード(複数ファイル) JVM 2.10 (2012年4月)
PHP ソースコード(複数ファイル) PHP 2.0 (2008年7月)
Neko バイトコード NekoVM 1.0 (2005年11月)
Python ソースコード(1ファイル) Python 3.2 (2015年5月)

C++ターゲットについては独自のガベージコレクションの機構を持つという特徴がある。

言語[編集]

静的型付きのオブジェクト指向言語である。HaxeはActionScriptから派生した言語であるため、基本構文はActionScript3と共通する部分が多い。

機能[編集]

ActionScript3と共通する機能[編集]

HaxeはActionScript3が持つような以下の機能を持つ。

これらの機能は、クラスのようにActionScript3とよく似た構文で提供されるものもあるが、プロパティのようにActionScript3とは異なる文法で提供されるものもある。

ActionScript3との相違点[編集]

構文が似ていても細かい挙動がActionScript3と異なるものも多い。以下にそのようなHaxeの挙動をいくつか挙げる。

  • if文、switch文、ブロックが式であり、値を返す。
  • ローカル変数、関数のスコープが異なる。
  • privateのアクセス修飾子の意味合いが、ActionScript3のprotectedに相当する。
  • 演算子の優先順位が異なる。
    •  % が * と / より優先度が高い。
    • |、&、^の優先度が同じ。
    • |、&、^が、==、!=より優先度が高い。

また、ActionScript3にはあるがHaxeには存在しない機能もある。以下にその例を挙げる。

  • for(初期化式; 継続条件式; 再初期化式){} のC言語形式のfor文
  • XMLのリテラル

独自の機能[編集]

その他、以下のような独自の機能を持つ[4]

型システム[編集]

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)はHaxeの重要な特徴である。

Haxeの列挙型は他の多くの言語のように単に値を列挙して識別子をつけるものよりも抽象的で、列挙子(Haxeではenumコンストラクタと呼ぶ)ごとに異なるパラメータつことが可能である。このような列挙型はMLやHaskellのような言語の代数的データ型に相当する[5]

これにより、自身をパラメータにもって再帰構造をつくったり、木構造を作ったりできる。

以下の例のようにインスタンス化して使う。

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の標準ライブラリはすべてのターゲットで動作するもの、すべてでは無いが複数のターゲットで動作するもの、個別のターゲットのみで動作するものがある。以下にそれぞれの例をあげる。

  • すべてのターゲットで動作するもの
  • すべてではないが複数のターゲットで動作するもの
    • 標準入出力、標準エラー出力(Flash、JavaScript以外のターゲット)
    • SQLを操作するライブラリ(Neko、C++、PHP)
  • 個別のターゲットで動作するもの
    • Flash、Java、C#、PHP、Pythonのそれぞれのターゲットの標準のAPI
    • HTML5標準のAPIおよびjQueryのextern(JavaScript)
    • AST(抽象構文木)やコンパイルのオプションの操作(マクロ環境のみで動作)

このように機能それぞれに合わせた抽象化が行われているため、複数のターゲットで動作するような書き方と、個別のターゲットに依存してそのターゲットの利点を生かすような書き方の両方ができる。

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では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のコンパイラは複数のプラットフォームへのコンパイルの他に以下のような機能を持つ。

ターゲット共通[編集]

  • デッドコード削除
  • 定数畳み込み
  • リソースデータの埋め込み
  • IDEに対してコンパイル・補完・リファクタリング機能を提供するサーバー機能
  • ドキュメント生成用のXml出力

各ターゲット個別[編集]

  • SWC、SWFのライブラリの利用(Flash)
    • 静的リンク・動的リンク
    • SWC、SWFのライブラリからのexternの生成
    • SWCファイルの生成
  • ソースマップの生成(JavaScript)
  • jarライブラリの利用(Java)
  • dllライブラリの利用(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を使用。
  • TiVo - Android、iOS、デジタルビデオレコーダのアプリケーションに使用している。[6]

歴史[編集]

開発当初から現在まで、Nicolas Cannasseがプロジェクトのリーダーを務める。ActionScriptの代替コンパイラとして開発されたため、Flashターゲットの用途が多かったものの、現在はプラットフォーム中立な言語環境となることを目指している[7]

  • 2005年 10月 フランスのブラウザゲーム開発会社Motion-Twinの独自ActionScriptコンパイラMTASCの後継プロジェクトとしてHaxeが誕生(当初の綴りはhaXe)
  • 2006年 5月 Haxe 1.0がリリース、JavaScriptターゲットに対応
  • 2008年 7月 Haxe 2.0がリリース、Franco PonticelliによりPHPターゲットが追加
  • 2009年 7月 Haxe 2.04がリリース、Hugh SandersonによりC++ターゲットが追加
  • 2011年
    • JavaScriptターゲットのメンテナとして参加したBruno Garciaにより、2.08と2.09のリリースにおいてJavaScriptターゲットの最適化が行われた
    • Simon Krajewskiがチームに参加
    • Cauê WaneckによりJavaおよびC#ターゲットが追加
  • 2012年
    • 4月 パリ開催のWorld Wide Haxeカンファレンスにおいて、表記をHaxeに変更すること、次のメジャーバージョンとなるHaxe 3に向けて破壊的変更を行うことがアナウンスされる
    • Nicolas CannasseがMotion-Twinより独立、インディーゲーム開発会社Shiro GamesおよびHaxe Foundationを設立
  • 2013年 5月 Haxe 3.0がリリース

言語名の由来[編集]

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

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

よく比較される言語[編集]

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

参照[編集]

  1. ^ Haxeの発音について言語開発者による回答
  2. ^ 公式メーリングリストにおけるHaxeの読み方についての会話
  3. ^ a b haXe is now Haxe
  4. ^ Language Features - Haxe - The Cross-platform Toolkit
  5. ^ Enum Instance - Haxe - The Cross-platform Toolkit
  6. ^ WWX2015 Haxe in the Enterprise
  7. ^ Getting Rid of Flash ?
  8. ^ Haxeのネーミングについて言語開発者のコメント

外部リンク[編集]