プログラミング/組み込み言語/主な言語まとめ のバックアップ(No.3)


主にC/C++に組み込んで使えるプログラミング言語についてまとめています。
ゲーム開発用途で使われるものが中心です。

各言語の内容を完全に把握しているわけではないので、間違いがあるかもしれません。

Lua

多くのゲームやアプリケーションで採用されているブラジル産の組み込み言語。
Luaという名前はポルトガル語で「月」を意味する。

ライセンスはMITライセンス

参考ページ

公式
ダウンロード
概要
リファレンス
その他情報

長所と短所

長所
  • 非常に高速。
  • ライブラリサイズが小さくコンパクト。
  • ネットや書籍等の資料が多い。
  • 多くのゲームで採用された実績がある。
  • C/C++のバインダに優秀なものが多い。
短所
  • 整数型が存在せず、数値は全て実数型(既定ではdouble)として扱われる。
    • DirectX等のFPUの精度を落とすライブラリと併用すると、32ビット整数値を表せなくなる。
  • switch 構文や、ループを抜ける continue 文がない。
  • いわゆる普通の配列を扱う構文がない。
    • テーブルを配列代わりとして使えるものの、インデックスが 1 から始まるなど若干扱いにくい。
  • クラスの構文がない。
    • 一応、テーブルでクラスもどきを作ることはできる。
  • メモリ管理に用いられているガーベジコレクションの性能が悪い(最悪、数秒以上止まる)。
  • 2バイト文字の考慮やUnicode対応がなされていない。
    • Shift_JISで日本語を扱うと一部文字で問題が起きる。
    • 有志のパッチで対応は可能。
  • C/C++との値の受け渡しにスタック機構を用いており、クラスの受け渡しなどはバインダを使わないと厳しい。

C++とLuaのバインダ

luabind
C++のテンプレートを駆使して各種データをバインドする。
使うためにはboostの導入が必要。
tolua++
ヘッダファイル風の記述を基にバインド用のソースファイルを生成するという、他の組み込み言語と比べても異色のバインダ。
テンプレートを使わないため、ビルド時間は他のバインダと比べてかなり短く済む。
ちなみにC言語でも使える。

Squirrel

Luaの良い部分を残し悪い部分を改善した組み込み言語。
Squirrelという名前は英語で「リス」を意味する。

ライセンスはzlib/libpngライセンス

参考ページ

公式
ダウンロード
概要
リファレンス
その他情報

長所と短所

長所
  • C++ライクな構文で見た目にわかりやすい。
  • 数値型は整数型と実数型に分かれている。
  • Luaにはない switch 構文やループ内での continue 文がある。
  • Luaにはない配列、クラスの構文がある。
    • クラスやそのメソッドにはC#のように属性を持たせることができる。
  • メモリ管理はリファレンスカウンタ+任意タイミングでのガーベジコレクションであり、不意に固まるようなことがない。
  • Unicode対応がなされている。
短所
  • 実数型が float 型。
  • 組み込み言語の中では低速(Luaの倍くらいの処理時間が掛かる)。
  • Luaと同じくC/C++との値の受け渡しにはスタック機構を用いており、バインダを使わないと厳しい。
  • C++のバインダがどれも微妙。

C++とSquirrelのバインダ

Sqrat
C++のテンプレートを駆使して各種データをバインドする。
ヘッダファイルをインクルードするだけで済み、内容もコンパクトにまとまっている。
ただしまだ発展途上。
SqPlus
C++のテンプレートを駆使して各種データをバインドする。
導入は楽だが、設計に問題あり(複数のVMの作成が考慮されていない等)。
構造が難解なためデバッグもしづらい。

AngelScript

組み込み言語としては珍しい静的型付け(=コンパイル時に型が決定される)の言語。
LuaやSquirrelといった一般的な組み込み言語は動的型付け(=実行時に型が決定される)。

ライセンスはzlibライセンス(zlib/libpngライセンスと同じと思われる)。

参考ページ

公式
ダウンロード
概要
リファレンス
その他情報

長所と短所

長所
  • 静的型付けであり、変数の型をチェックする等のコーディングが不要。
  • Squirrel以上にC++ライクな構文。
  • C++が持つほぼすべての数値型を扱える(8,16,32,64ビット整数値、float、double)。
  • もちろんクラス等々の構文もサポートしている。
  • インタフェース(interface)の構文をサポートしている。
  • メモリ管理はリファレンスカウンタ+ガーベジコレクション。
  • そこそこ高速(Luaと比べて数値の扱いに長け、文字列の扱いに劣る)。
  • C++とのバインド処理がAPIに組み込まれており、別途バインダを導入する必要がない。
  • C++との値の受け渡しはスタックではなく変数名の直接指定のため、見た目にわかりやすい。
短所
  • 連想配列がない。
  • クラスの継承はサポートしていない。
  • C++クラスのコンストラクタ、デストラクタやvirtualなメンバ関数のバインドにはラッパ関数を介する必要がある。
  • C++クラスを参照型としてバインドする場合、リファレンスカウンタを意識したC++コードを書く必要がある。
  • 2バイト文字の考慮やUnicode対応がなされていない。
  • ライブラリファイルのサイズが大きい(ビルド方法にもよるが、Luaの約5倍*1)。
  • 資料が少ない。
  • 採用例が少なく、実績がない。

Xtal

国産の組み込み言語。
読みは「クリスタル」…なのか?

ライセンスはMITライセンスっぽい。

参考ページ

配布元
その他情報

長所と短所

長所
  • 整数、クラス等々は当然サポート。
  • C++とのバインド処理がAPIに組み込まれており、その使いやすさは他言語のバインダと比べてもピカイチ。
  • 予めバイトコードにコンパイルしたバイナリからも実行できる。
  • 日本語で丁寧に書かれたドキュメントがあるため、迷うことが少ない。
短所
  • 構文がかなり独特(日本語のマニュアルがあるのでそれほど迷わないが)。
  • ライブラリのサイズがかなり大きい(実行ファイルはそれほど大きくならないようだが…)。
  • 低速。
  • 実績ゼロ。

上記4言語の比較

記号評価の順位付けは × < △ < ○ < ◎ となる。

比較項目LuaSquirrelAngelScriptXtal
言語仕様
C++ライクな構文
型付け動的動的静的動的
整数型なしint*2int8
int16
int
int64
uint8
uint16
uint
uint64
ビルド環境による。
32ビット:int
64ビット:long long*3
実数型doublefloatfloat
double
ビルド環境による。
32ビット:float
64ビット:double*4
配列*5
連想配列×
クラス×*6*7
多重代入××
メモリ管理ガーベジコレクションリファレンスカウンタ
ガーベジコレクション*8
リファレンスカウンタ
ガーベジコレクション*9
リファレンスカウンタ
ガーベジコレクション*10
その他特徴クラス属性インタフェースShift_JIS対応
C/C++との連携
Unicode対応××
バイトコードの小ささ*11××未検証
ライブラリの小ささ*12×
バインダluabind
tolua++
etc...
sqrat
SqPlus
etc...
APIに含まれるAPIに含まれる
その他
処理速度(数値)*13××*14
処理速度(文字列値)*15×××*16
ライセンスMITライセンスzlib/libpngライセンスzlibライセンスMITライセンス
資料の豊富さ××*17
利用実績*18×

その他の組み込み言語

まだあまり詳しくまとめていないもの。

Python

参考ページ
特徴
  • Google、YouTubeなど大手IT企業で採用されている。
  • Python自体は枯れた言語であるため信頼度が高い。
  • .NET Frameworkに対応したIronPythonという言語がMicrosoftからリリースされている。
  • 組み込みとして使うには重い…?

Ruby

参考ページ
特徴
  • 国産で資料が豊富。
  • 組み込みとして使うには重い…?

文字コードについて

Shift_JIS対応について

XtalやRubyといった国産の言語以外は基本的にShift_JIS非対応である(Lua等は有志によって対応パッチが提供されている)。
より正確に言えばマルチバイト文字非対応である。

Shift_JIS非対応の言語では、例えば「ソ」という文字の2バイト目がエスケープシーケンス文字「\」として解釈されてしまう。
そのため、スクリプト内で日本語を扱う際に問題となる。

これが問題となるのは、標準文字コードがShift_JISとなるWindowsのマルチバイト文字セット使用プログラムのみである。
Linux等、標準文字コードがEUC-JPやUTF-8の環境では問題とはならない。

マルチバイト文字非対応の言語において、スクリプト内の文字列は単なる1バイト文字の配列として処理される。
そのため、例えばスクリプトをUTF-8等で書いておき、取得先のC/C++プログラム側でShift_JISへの変換を行うようにすれば、Shift_JIS環境で日本語を扱うことも可能となる。
ただしその場合、スクリプト標準の文字列出力処理等を行うと当然だが文字化けしてしまう。

Unicode対応言語の場合はUnicodeを選択する方が手っ取り早いだろう。

Unicode対応について

Unicode対応とは、実行時に文字コードを判別してくれるわけではなく、ビルド時のオプションで標準文字コードかUnicodeかを選択できるということである。
そのため、Unicodeを選択した場合、当然ながらスクリプト自体もUnicodeで記述する必要がある。

*1 *11 *12 *13 *15  参考文献:Game Scripting Languages
*2  Microsoft C環境ならば __int64 に型変更可能。
*3 *4  ビルドオプションで強制64ビット化可能。
*5  連想配列で代用する。
*6  連想配列でクラスもどきを作ることは可能。
*7  継承をサポートしない。ただしインタフェースの実装は可能。
*8  任意タイミングのみ。
*9  循環参照のみ?
*10  有効/無効切替可能。
*14 *16  開発者の弁であり未検証。
*17  日本語のリファレンスは整っている。
*18  国内の実績は×。