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

Haxe
Haxe
Haxeのロゴ
パラダイム マルチパラダイム
登場時期 2005
開発者 Haxe Foundation, Nicolas Cannasse
最新リリース 4.2.2/ 2021年5月14日 (3年前) (2021-05-14)[1]
評価版リリース 4.0.0-rc.5 / 2019年9月12日 (4年前) (2019-09-12)[2]
型付け 静的型付け
影響を受けた言語 ActionScript, OCaml
プラットフォーム クロスプラットフォーム
ライセンス

コンパイラ:GPL v2以降

標準ライブラリ:MIT
ウェブサイト haxe.org
テンプレートを表示

HaxeActionScript 3ECMAScript 4Adobe FlashJavaNekoHashLinkJavaScriptActionScript 3C++CppiaC#JavaPHP 7Python 3Lua使FlashHTML5

20124haXeHaxe[5]

対応プラットフォーム

編集

HaxeAVMJava VMNekoHashLinkJavaScriptActionScript 3C++CppiaC#JavaPHPPython 3Lua"Write once, run anywhere" 

Haxe

haXe Beta(20062)[6]Adobe FlashAdobe AIR

20073AVM2[6]

haXe Betaより対応(2006年2月)[6]。バイトコードへコンパイルされる。

JavaScript

編集

1.0(20065)[6]Node.jsElectron

DynamicJavaScriptHaxelib()extern使[7]

Haxe 4.0ECMAScript 5[8]4.0ECMA Script 6[9]

ActionScript 3

編集

1.xより対応(2007年3月)[6]。複数のソースファイルを出力する。主な想定プラットフォームは、Adobe FlashやAdobe AIR。


2.0.0(20087)[10]

Haxe 3PHP 5.1.0Haxe 4PHP 7.0.0[11]

2.4.0(20097)[12]WindowsmacOSLinuxiOSAndroidTizenBlackBerry

C++Haxelibhxcpp[13]

2.10.0(20124)[14].NET FrameworkMonoASP.NETUnity

Haxelibhxcs.NET Framework 2.04.0[15].NET Framework

2.10.0(20124)[14]

HaxelibhxjavaJava 8[16][17]

Python

編集

3.2.0-rc.2より対応(2015年5月)[18]。単一のソースファイルを出力する。


3.2.0-rc.2(20155)[18]

CppiaHaxeC++[19]Haxelibhxcpp

3.3.0-rc.1より対応[20]。単一のソースファイルを出力する。

編集

3.3.0-rc.1より対応[21]。バイトコードへコンパイルされる。主な想定プラットフォームは、WindowsやmacOS、Linux、iOS、Android、Nintendo SwitchPlayStation 4

Java VM

編集

4.0.0-rc.3より対応[22]。バイトコードへコンパイルされる。

言語

編集

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

機能

編集

ActionScript3と共通する機能

編集

HaxeActionScript3







publicprivate2







ActionScript3ActionScript3
ActionScript3との相違点
編集

ActionScript3Haxe

ifswitch



privateActionScript3protected


%  *  / 

|&^

|&^==!=

ActionScript3Haxe
  • for(初期化式; 継続条件式; 再初期化式){} のC言語形式のfor文

独自の機能

編集

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

型システム

編集

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

HaxeHaxeenumMLHaskell[24]



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

ターゲット共通

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

各ターゲット個別

編集
  • SWC、SWFのライブラリの利用(Flash)
    • 静的リンク・動的リンク
    • SWC、SWFのライブラリからのexternの生成
    • SWCファイルの生成
  • ソースマップの生成(JavaScript)
  • jarライブラリの利用(Java)
  • dllライブラリの利用(C#)

統合開発環境

編集

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

Haxeで書かれたソフトウェア

編集

Flash

Evoland - HaxeNicolas CannasseRPG

Papers, Please - OpenFL使Metacritic85GDC 2014Independent Games Festival

OpenFL - Showcase - OpenFL使

Stencyl - 2DOpenFL使

TiVo - AndroidiOS使[25]

歴史

編集

Nicolas CannasseActionScriptFlash[26]

200510 Motion TwinActionScriptMTASCHaxehaXe

20065 Haxe 1.0JavaScript

20087 Haxe 2.0Franco PonticelliPHP

20097 Haxe 2.04Hugh SandersonC++

2011
JavaScriptBruno Garcia2.082.09JavaScript

Simon Krajewski

Cauê WaneckJavaC#

2012
4 World Wide HaxeHaxeHaxe 3

Nicolas CannasseMotion TwinShiro GamesHaxe Foundation

20135 Haxe 3.0

言語名の由来

編集

Haxe使Xhas a X inside[27]

haXe20124World Wide HaxeHaxe[5]

よく比較される言語

編集

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

編集

HashLinkNeko20161020"London Haxe Meetup 20th October 2016"[28]x86x86-64WindowsmacOSLinuxDirectXSDLOpenALzlibWindowsGUINeko VMHashLink(.hl)

HashLinkHL/JITHL/C2HL/JITHL/C使CCC[29]iOSAndroidOSPlayStation 4Nintendo SwitchHashLinkHeapsMotion TwinDead Cells[30][31]PlayStation 4Nintendo SwitchXbox One

参照

編集


(一)^ Haxe 4.2.2. 2021616

(二)^ Haxe 4.0.0-rc.5. 2019113

(三)^ Haxe

(四)^ Haxe

(五)^ abhaXe is now Haxe

(六)^ abcdeHistory. 2019113

(七)^ Using external JavaScript libraries. 2019113

(八)^ JavaScript. 2019113

(九)^ JavaScript. 2019113

(十)^ Haxe 2.0.0. 2019113

(11)^ Getting started with Haxe/PHP. 2019113

(12)^ Haxe 2.4.0. 2019113

(13)^ Getting started with Haxe/C++. 2019113

(14)^ abHaxe 2.10.0. 2019113

(15)^ .NET version and external libraries. 2019113

(16)^ Getting started with Haxe/Java. 2019113

(17)^ Replace hxjava-std with Java 8.. 2019113

(18)^ abHaxe 3.2.0-rc.2. 2019113

(19)^ Getting started with Haxe/Cppia. 2019113

(20)^ Haxe 3.3.0-rc.1. 2019113

(21)^ Haxe 3.3.0-rc.1. 2019113

(22)^ Haxe 4.0.0-rc.3. 2019113

(23)^ Language Features - Haxe - The Cross-platform Toolkit

(24)^ Enum Instance - Haxe - The Cross-platform Toolkit

(25)^ WWX2015 Haxe in the Enterprise

(26)^ Getting Rid of Flash ?

(27)^ Haxe

(28)^ London Haxe Meetup 20th October 2016 - Part 2. Haxe Foundation. 2019315

(29)^ HashLink - Haxe Virtual Machine. Haxe Foundation. 2019315

(30)^ About - Haxe Game Engine. Heaps.io. 2019315

(31)^ Hello HashLink. Heaps.io. 2019315

外部リンク

編集