とらきす の ぐだログ

とらきすのぐだログ

ぐだぐだとなんかするブログ。

(個人的)最強のプログラミング言語「Haxe」

プログラミング言語

まぁ、もはや宗教ですよね。こういうのって。
そら一長一短はあるでしょうけど、慣れてるものが一番なのは変わりませんよ。

という訳で、下記は「個人的な意見」ですのでね。参考程度にお読みください。


Haxe?何それ聞いた事ない!

Haxe(ヘックス)は、そこそこマイナーなオブジェクト指向+関数型プログラミング言語です。
とはいえ、「関数型よくわからん」って人は、別に関数型構文使わなくても問題ありません。

まずは世界にこんにちはしておきましょう。

// Main.hx

package;

class Main
{
  public static function main():Void
  {
    Sys.println("Hello World!");
  }
}

このコードからだけでも、Haxeの特徴が幾つか見えてくるかと思います。
Haxeシンタックスハイライトまで用意してくれているはてなさんホント神

  1. packageとかいう謎の構文
  2. とりあえず全部クラスで囲っとけ記法
  3. エントリーポイントはMain.hxのmain関数
  4. 型は名前の後に書く

ん、こんなもんでしょうか。
まぁ際立っておかしな部分はないですよね。

ただ、もしかしたらこの特徴を見てハッと思い当たるフシがある人もいるかも知れません。

実はこのHaxe、かの有名なAdobe Flashスクリプト言語であるActionScriptとほとんど同じ構文なのです。
というより、もともとActionScriptの代替として開発された言語だそうで。

また、HaxeはaltJSとしての一面も持ち合わせています。

altJSってのはつまり、JavaScriptがフリーダムすぎるから書きやすくしよーぜ、ってノリで開発された、いわばJavaScriptの亜種みたいなもんですね。
Microsoftが開発しているTypeScriptなんかが有名な例でしょう。

HaxeにもJavaScriptのコードを出力する機能が付いていますし、何ならHaxeから出力した方が10%程早く動作するそうで。
そもそも、Haxeの構文そのものがJavaScriptの標準化であるECMAScriptと似通っています。

というかですね。

Haxeが出力できる言語の一覧を見てみましょう。

多い…多くない?

その結果、Haxeがターゲットとしているプラットフォームの一覧が、こちら。


クッソ画質荒いやん、気が向いたら直しときます

いや…マジで多いって。

ここで重要なのが、ソースコードを出力するという点。つまり、ネイティブコードでのクロスプラットフォームが実現できるという事になります。

それじゃ、出力されたソースコードを元に、更にコンパイルの作業をしなきゃいけないの?それは面倒だよ…

一応、FlashとNeko、HashlinkについてはHaxe単体でのコンパイルが可能ですが、確かに面倒ですよね。

そこでLimeの出番です。

Limeは、ウィンドウ処理や入出力、音声処理などの低レイヤー層を管理するフレームワークです。しかも、ビルド機能付き。
WindowsならVisual C++macOSならXcode…といったように別途ソフトのインストールが必要ですが、シームレスに実行ファイルを作成できるようになります。


Haxeの言語機能

まず、Haxeは静的型付け言語です。
先ほども書きました通り、変数名やメソッド名の後に型を指定します。

// 32bit整数型
var i:Int = 5;

基本型はInt32(Int)、Int64、Float、Boolのみのようです。
Intは環境に関わらず32bitとなるようです。
Floatは倍精度、つまりはCにおけるdouble型ですね。
一応、符号なし整数型としてUInt型も定義されているようですが、非推奨となっています。

インスタンスの生成や、配列の作成時にも型を指定します。

// インスタンスの生成
var c:Test = new Test();

// 整数型配列の作成
var a:Array<Int> = new Array();

まぁ、でもいちいち書いてたら面倒ですよね。インスタンス作成時とか。

という訳で、もちろんあります型推論

var i = 5;
var c = new Test();
var a = [0];

メソッドの引数なんかにも型推論が使えますが、こちらはあまり推論の精度が良くないし、わかりにくくなるので使わない方が良いでしょう。

そして、Haxeだとこんな書き方ができちゃいます。

var a = [for(i in 0...10) i];

// [0,1,2,3,4,5,6,7,8,9]
Sys.println(a);

// Success
Sys.println(if(a.length == 10) "Success"; else "Failure";);

そう、Haxeではif文やfor文などが式として使えてしまうのです!
これがものすごく便利。
偶数だけを順に格納したければ、

var a = [for(i in 0...10) if(i % 2 == 0) i];

// [0,2,4,6,8]
Sys.println(a);

はたまた、

var a = [for(i in 0...4) i * 2];

// [0,2,4,6,8]
Sys.println(a);

と書けば良いのです。すごいっしょ?

ただ、Haxeだといわゆるforeach方式のfor文しか使う事ができません。逆順も不可能です。
つまりHaxeのfor文では、Cでいう所の

// C
for(int i = 10; i > 0; i--) {}

みたいな事ができないという事になります。


…forがないなら、whileを使えばいいじゃない!

var i = 10;
var a = [while(i > 0) i--];

// [10,9,8,7,6,5,4,3,2,1]
Sys.println(a)

いや、でもこれだと別に変数用意しなきゃなんでちょっと良くないですね。他になんか良い方法ないんやろか。

それと、新しい言語を習得するときにかなりのネックとなる多次元配列。これ、言語によってかなりバラつきありますからね。構文も概念も。

まず、Haxeには多次元配列という概念はありません。
その代わり、配列の中に配列を入れる事が可能です。JavaScriptと同じですね。わかりやすくて実に良い。

また、連想配列を作る事も可能です。

var a =
[
  [0, 1, 2],
  [for(i in 0...3) i],
  [
    "ぜろ" => 0,
    "いち" => 1,
    "に" => 2
  ]
];

// 全て 2
Sys.println(a[0][2]);
Sys.println(a[1][2]);
Sys.println(a[2]["に"]);

正確には、連想配列はMapオブジェクトとして実装されています。上記のは省略記法。

まぁ、他にも色々と便利な機能がてんこ盛りです。すげぇっすよ。


言語独自の機能があるって聞いたけど

Haxeには、どんな言語に出力しても使えるHaxe標準ライブラリのほか、言語独自のライブラリも幾つか含まれています。
C++なら標準ライブラリが移植されていますし、JavaScriptならjQueryが移植されています。当然、他の言語に出力する時には使えません。

特に、Haxeの唯一のマルチメディア機能と言っても過言ではないFlash API。これも、Flashでしか使えない機能となっております。残念。


が…あるッ…
OpenFLッ…


何それ

OpenFLは、Flash APIHaxeに移植するフレームワークです。Limeを下敷きに動作します。

…というか、Limeのリンク踏んでくれた方なら気づいたと思いますが、そもそもLimeはOpenFLの一環で作られたものです。

しっかし、Flash APIならマルチメディア系で出来ない事ほとんどないですよ。ゲームだってどんとかむです。

例えば、OpenFLを使って作られた有名なゲームにPapers, Pleaseがあります。
入国審査をするゲームですね。
どうやら映画化が決定しているらしく、Wikipediaに個別記事まである。そんなに売れてたんだあのゲーム。

それと…こちらはややマイナーですが、Evolandというゲーム。
初めは2Dのピクセルに始まり、次第に3Dポリゴンへと変わっていくというかなり特殊なゲームですね。
続編のほかモバイル版もリリースされており、まさにHaxeフル活用って感じです。

まぁ、デベロッパであるShiro Gamesの創立者の一人は、Haxe開発者であるNicolas Cannasse氏ですので、当然と言えば当然ですけどね。

また、OpenFLを使った2DゲームエンジンHaxeFlixel(ヘックスフリクセル)があります。

Flash向けのゲームライブラリであったFlixelを、Haxeに移植・改変したフレームワークですね。
今はまだあまり有名なゲームはないようですが、結構な数のゲームが作られています。見たところ、モバイル端末向けのゲームが多いようです。これもHaxeだから成せる技。


Haxeの開発環境

現状では、FlashDevelopVisual Studio Codeがベストな選択肢かと思います。

FlashDevelopの場合は標準でHaxeをサポートしていて、新規プロジェクトの作成も簡単に出来ます。
ただ、私が普段使い慣れていない為か使いにくかったです…申し訳ない。

Visual Studio Codeの場合、vshaxeというサードパーティの拡張プラグインを使う事になります。
しかしサードパーティとは言え、頻繁に更新されていてかなり信頼性は高いです。シンタックスハイライトやオートコンプリート、エラー診断、コンパイルなどなど、一通りの機能は揃っています。
というか、Haxeコンパイラそのものに構文を解析したりオートコンプリートしたりという機能が備わっていますので、それを利用している形になっています。C#のRoslynとVisual C#の関係性みたいなもんですかね。ですので、精度で他に劣るという事はないでしょう。

Limeのプラグインも別途公開されていますので、VSCodeから直接 実行ファイルの作成まで出来てしまいます。
vshaxe単体でも、JavaScriptだったりNekoだったりならコンパイルは可能ですが。

VSCodeは(一応)テキストエディタなので比較的動作も軽く、他の言語をササッと書く時にも便利です。
HTML/CSSに関してのみはBracketsの方が良いと思いますが、それ以外で専用IDEがない言語なら、だいたいVSCodeで間に合います。JSONとかね。

それに知ってる方も多いとは思いますが、ついこの間にGithubMicrosoftに買収されましたよね。VSCodeには以前からもGit連携機能が搭載されていましたが、今後はよりGithubに密接した機能が追加される事でしょう。期待です。

そして何より、VSCodeWindows/macOS/Linuxに対応しています。アレです、最近流行りのElectron製アプリです。
FlashDevelopはWindows専用なのが一番の難点と言えましょう。


Nekoって?

Nekoは、2005年あたりに登場した比較的若い言語です。

一応は言語仕様を持っており、中間言語に変換して、Windows/macOS/Linuxで動作するVM上で実行するタイプの言語なのですが、Haxeから変換して踏み台として使用される事が多いと思います。
そもそもNekoの開発者はNicolas Cannasse氏(また出た!Haxeの開発者)ですし。

しかしそのお陰とあって、PC向けのソフトウェアを作るのならNekoを選択しておけば間違いはないでしょう。


Hashlinkって?

Hashlinkは、2年前くらいに突如として登場した言語です。

というか、Haxe Foundationがお送りするHaxe専用VMですまたかよ

Neko VMと何が違うのかと言いますと、まずこちらはiOSAndroidにも対応しているらしいという点。
そして描画にSDL2を使用しており、独自のUIライブラリも将来的に提供されるそうです。
また、静的型付けになった事でよりHaxeとの親和性が向上していたり。

しかし、新参といってもなかなか侮れません。既にHashlinkで作られたゲームが幾つかリリースされています。

まず、お馴染みShiro GamesのNorthgard。すげー3D。かなり売れているようですね。
そしてDead Cells。ドットのハクスラですかね?こっちもなかなかの高評価。

ただね…情報が少なすぎる!!
日本語の情報がとかじゃなくて、英語の情報も超少ない。公式サイトとかGithub関連除いたら、ほぼ皆無と言って良いと思います。
Githubの方も、ドキュメントはたった数ページ。チュートリアルはありませんので、何を書けば良いのかわからない状態。

ドキュメントが充実していけば、かなり今後に期待できそうですね。


とまぁ色々と書いてきましたが、私自身もまだまだ勉強中です。
マクロとか、ほとんど理解してません。
結構厳格な言語ですので慣れるまで大変かもしれませんが、それを含めても素晴らしい言語ですよ。使おう!

そんな訳で、ざっくりとHaxeの紹介でした。


Haxeフレームワークメモ