Haxe

言語

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

型システム

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のような言語の代数的データ型に相当する。
これにより、自身をパラメータにもって再帰構造をつくったり、木構造を作ったりできる。
以下の例のようにインスタンス化して使う。
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));            
    }}

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

言語名の由来

Haxeの名前は、短くシンプルで使われていないこと、また新しい技術を成功に導くために必要な X を中に持っていること（has a X inside）から命名された。
当初の綴りはhaXeであったが、2012年4月のWorld Wide Haxeカンファレンスにおいて、表記を固有名詞として馴染みやすいHaxeに変更することがアナウンスされた。

HashLink

HashLinkは、Nekoの後継とされる新しい仮想マシンで、2016年10月20日に開催された"London Haxe Meetup 20th October 2016"にて発表された。x86及びx86-64のWindows、macOS、Linux上で動作する。DirectXやSDL、OpenALをベースとしたマルチメディア機能のほか、zlibなどの著名なライブラリを内包する。またWindows限定ではあるが、一部のネイティブGUIコンポーネントも利用できる。なお、Neko VMとは異なり静的型付けである。実行にはHashLinkバイトコードファイル(拡張子は.hl)を用いる。
HashLinkの動作形態として、HL/JIT方式とHL/C方式の2種類がある。HL/JIT方式では、実行時コンパイラを通して仮想マシン上で動作させる為、コンパイル速度が高速でデバッグに向いている。一方、HL/C方式では仮想マシンは使用されず、代わりにC言語ソースコードを出力する。出力されたCソースコードは、任意のCコンパイラでビルドでき、より高いパフォーマンスと移植性が期待できる。例えば、iOSやAndroidなどのモバイルOS、PlayStation 4やNintendo Switchなどの家庭用ゲーム機といった、デスクトップ環境に限定されない様々なプラットフォームへの移植が比較的容易となる。実例として、このHashLinkとゲームエンジンであるHeapsで開発されているMotion Twin社のDead Cellsは、PlayStation 4、Nintendo Switch、Xbox One向けに移植されている。