Haxe3の新機能まとめ

本日2013/05/25、プログラミング言語Haxeのバージョン3が正式にリリースされました!
Haxe3のダウンロード:http://haxe.org/download

ということで、Haxe3がこれまでのHaxe2.10とどうが違うのかを徹底的に紹介していきます!


新機能

Java, C#ターゲットのサポート

これまで、Flash(AIRも)、JavaScript、C++、PHP、Nekoへの出力がサポートされていましたが、これらに新たにJava、C#が追加されました。

‘シングルクオテーション内での、変数展開

Haxe3から、「’」と「”」の扱いが変わります。

var x = 10;
trace( 'x is $x' )	//x is 10
trace( "x is $x" )	//x is $x

これまでのString.Format()関数の代替です。
「’」内で$変数名や${式}と記述した場合に、その変数や式が文字列内に組み込まれます。

新しいハッシュテーブルのクラス(Map)

クロスプラットフォームの辞書(ハッシュテーブル)のクラスが文法レベルでサポートされました。

var price:Map <String , Int > = [
	"カレー"        => 420,
	"カツカレー"    => 550,
	"ラーメン"      => 380
];

price.set("カレー",400);
trace( price.get( "カレー" ) ); //400

さらに、配列の演算子を使って値を参照することができます。

price["カレー"] += 30;

さらに、enumをカギに使うことも可能です。

配列内包表記

for文や、while文を使った配列の初期化がサポートされました。

//0~20の偶数の配列!
var evenArray = [for (i in 0...21) if (i & 1 == 0) i];

パターンマッチング

switch文を使ったパターンマッチングがサポートされました。
多機能なので、詳しくはhttp://haxe.org/manual/pattern_matchingを見てください。

パッケージをまとめてインポート

import my.pack.*;

のような書き方が出来るようになりました。

bind関数

callback構文の代替です。
より簡単に、関数の引数を束縛することができます。

function add(a:Int, b:Int) { trace( '$a,$b' ); }
var func1 = add.bind(3);
var func2 = add.bind(_, 4);

func1( 2 ); //add(3,2)と同じ
func2( 0 ); //add(0,4)と同じ

抽象型(abstract)

Haxe3では、新たに抽象型(abstract)が加わりました。
これは、JavaやC#の抽象クラスや抽象メソッドとは大きく異なるものです。

Haxeの抽象型は実行時には他の型として実行される型で、変換元となる型、変換先となる型、変換方法などを定義して使用します。
カスタム配列アクセス、演算子オーバーロードなどが使用出来ます。

NekoのIntが31bit整数から32bit整数に

Haxe2.10までのNeko出力では、

var argb = 0x66FFFFFF;

のように、31bitであらわせない数値が含まれているとコンパイルエラーになってました。
Haxe3では上記のコードは正常に動作します。

出力されるコードが綺麗に

Haxeには、未使用の関数や変数を自動で取り除くデッドコード削除という機能があります。
Haxe3では、この強さを3段階から選択することが出来ます。

–dce no: デッドコード削除を行わない(Haxe2.10のデフォルト)
–dce std: 自分で書いたコードから呼び出していない、標準ライブラリ、外部ライブラリのコードを削除。(新機能、Haxe3のデフォルト)
–dce full: main関数から呼び出していないコードについて削除を行う。(Haxe2.10で–dead-code-eliminationを指定した場合と同じ

デフォルトでのデッドコード削除は強化されたため、基本的にHaxe3から出力されるコードは綺麗になります。

型パラメータ(ジェネリクス)の強化。

構造的部分型による、型パラメータの束縛。

static function test < T: {function clone():T} >( a:T ) {}

enum(列挙型)のコンストラクタに対する、型パラメータの設定。

enum EnumTest{
	 HOGE < T >(t:T);
}

など、型パラメータの機能が強化されました。

マクロ機能の改善

詳しくはhttp://haxe.org/manual/haxe3/features

その他

  • コンストラクタのインライン化が可能に
  • Flashで、swcをそのまま外部ライブラリとして利用可能に
  • traceに複数の値が指定可能に

新しい標準ライブラリ

標準ライブラリの詳細はhttp://haxe.org/apiに載っています。

クロスプラットフォームのZIP圧縮、解凍

パッケージ: haxe.zip.*;
Flash, JavaScript, C++, PHP, Neko, C#, Javaで動くzipライブラリです。

暗号ライブラリの強化

パッケージ: haxe.crypto.*;
もともとあったMd5,Sha1,BaseCodeに加えて、Crc32,Adler32が使えるようになりました。

データ構造の追加

パッケージ: Map, haxe.ds.*;
いままで標準で、
Array < T >(可変長配列),
List < T >(連結リスト),
Hash < T >(文字列が鍵のハッシュ表)をサポートしていたのですが、

Hashが無くなり、

あらたに、
Map < K, V >(汎用なハッシュ表)、
GenericStack < T >(スタック)、
Vector < T >(固定長配列)、
BalancedTree < T >
が加わりました

これらはすべてクロスプラットフォームです。
VectorはいくつかのターゲットではArrayより速く、すべてのターゲットでArrayと同等以上の速度が出ます。

Enumの補助クラス

パッケージ: haxe.EnumTools;

JavaScriptターゲットがHTML5に対応

パッケージ: js.html.*;

HTML5の機能が標準で利用できるようになりました。
svg,webglなどもサポートされます。

その他

  • Array.map、Array.filter

移動したライブラリ

cpp.Sys Sys
php.Sys Sys
neko.Sys Sys
Lib.print Sys.print
neko.db sys.db
php.db sys.db
cpp.net sys.net
php.net sys.net
neko.net sys.net
cpp.io sys.io
php.io sys.io
neko.io sys.io
neko.zip haxe.zip
cpp.Utf8 haxe.Utf8
php.Utf8 haxe.Utf8
neko.Utf8 haxe.Utf8
haxe.BaseCode haxe.crypto.BaseCode
haxe.SHA haxe.crypto.Sha1
haxe.MD5 haxe.crypto.Md5
js.Lib.window js.Browser.window
js.Lib.document js.Browser.document
IntIter IntIterator
tringTools.isEOF StringTools.isEof
haxe.Stack haxe.CallStack
EReg.customReplace EReg.map

新しいメタデータ

@:to, @:from
抽象型(abstract)で使用します。型の変換方法を定義します。
@:arrayAccess
抽象型(abstract)で使用します。カスタム配列アクセスを定義します。
@:op
抽象型(abstract)で使用します。演算子オーバーロードを定義します。
@:publicFields
クラスのデフォルトの可視性をpublicに変更します。
@:noCompletion
コンパイラの補完機能に反映されないようにします。
@:noUsing
usingした際に反映されないようにします
@:font
Flashのみです。フォントの埋め込みを行います。文字コードの範囲指定も可能です。

新しいコンパイラオプション

-dce [std|full|no]
デッドコード削除の強さを(no,std,full)から選択します。
-swf-lib-extern < file >
externのSWFファイルを指定する
-version
バージョンの確認
–help-defines
有効なコンパイラ定義(-D)のリストを表示
–help-metas
コンパイル時に使用されるメタデータを表示

置き換えられたもの

–dead-code-eliminationが-dce fullに
–js-modernがデフォルトに
これにより、JavaScript全体が(function(){“use strict”; })()に囲まれます。コンパイラオプション-D js-classicでこれを回避できます。さらに詳しくは、http://haxe.org/doc/js/modern
extendsとimplementsを同時に指定するときの書き方が変わりました。
haxe2:

... extends haxe.Template, implements InterfaceSyntax2 { }

haxe3:

... extends haxe.Template implements InterfaceSyntax2 { }
プロパティのgetter,setterの書き方が変わりました
詳しくは、http://haxe.org/manual/haxe3/migration#property-accessors

無くなったもの、出来なくなったもの

jQueryライブラリの自動的な埋め込み
Haxe2以前では、標準ライブラリに含まれるJQueryのライブラリを使った場合に出力されるjsにjQueryのコードが埋め込まれていました。
Haxe3では、このjQueryの埋め込みが無くなりました。
対策: コンパイル時に-D embed-jsのオプションを指定する(2013/07/15加筆 コメントで教えてもらいました) または、jQueryのjsファイルをダウンロードしてきてHaxeのjsより前に埋め込む。
Array < Dynamic > に対する型推論
対策: 明示的に型指定を行う
inline変数を参照型の値で初期化
対策: inline関数を使う
Int32
対策: Intを使う
String.format()
対策: ”(シングルクオテーション)を使う。
callback
対策: bind関数を使う
プロパティでget, setを両方指定した際の、デフォルト変数
対策: @:isVarを明示的に指定する
Hash, IntHashクラス
対策: Mapを使う
haxe.Publicインターフェース
対策: @:publicメタデータを使う
haxe.rtti.Genericインターフェース
対策: @:genericメタデータを使う
コンパイラオプション -as3-native

Haxe3での主な変更点は以上のとおりです!あれが足りない、ここが間違ってるなどあればコメントしていただけると嬉しいです。

2013/05/31_訂正:
@:noCompleteって書いてありましたが、正しくは@:noCompletionでした。
3.0RC出たあたりでwikiが変更されてたのを見逃してました。
http://haxe.org/manual/tips_and_tricks?version=15566

2013/08/21_追記:

C#,Javaの正式サポートって書いたんですが、よくよくいろんなところ見返してみたら、betaから、stableになりましたよっていう正式な発表が見つかれませんでした…

2.09リリース時点では、Haxe3.0でC#,Javaをサポートする予定(http://www.silexlabs.org/133720/the-blog/haxe-3-and-4-plans-for-world-domination/)で、2.10リリース時http://haxe.org/doc/release/2.10にも”their final implementation in Haxe 3.0″って書いてあったので、3.0でC#,Javaが正式サポートだと思ってたのですが、3.0公開後の発表ではそこらへんに触れてるものがなかったです

逆に3.0のJava,C#周りの記述でまだbetaだよ記述も無くて、あたらしいgithubレポジトリにはJavaやC#のターゲットのところにもbetaと書かれてないので、このままこっそりbetaの文字が消えてくような気もします。

とはいえ、もしかしたら、次のリリース以降でbetaじゃなくなりましたよって発表があるかもしれません。

ここらへんちゃんと知ってる人がいたら教えてほしいです。

Haxe3の新機能まとめ」への3件のフィードバック

  1. bleis-tift

    3.0、結構変わったんですねー。
    一つ、用語の誤りがあったので報告します。

    部分的構造型->構造的部分型

    返信
    1. shohei909 投稿作成者

      報告ありがとうございます!訂正しました!

      返信
  2. terurou

    「jQueryライブラリの自動的な埋め込み」ですが、jQuery.hxのソースを読んでみたらコンパイルフラグに”embed_js”をつけたら埋め込んでくれるみたいです。

    返信

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です