主にC/C++に組み込んで使えるプログラミング言語についてまとめています。
ゲーム開発用途で使われるものが中心です。
各言語の内容を完全に把握しているわけではないので、間違いがあるかもしれません。
Lua †
多くのゲームやアプリケーションで採用されているブラジル産の組み込み言語。
Luaという名前はポルトガル語で「月」を意味する。
ライセンスはMITライセンス。
参考ページ †
- 公式
- ダウンロード
- 概要
- リファレンス
- その他情報
長所と短所 †
- 長所
- 非常に高速。
- ライブラリサイズが小さくコンパクト。
- ネットや書籍等の資料が多い。
- 多くのゲームで採用された実績がある。
- C/C++のバインダに優秀なものが多い。
- 短所
- 整数型が存在せず、数値は全て実数型(既定ではdouble)として扱われる。
- DirectX等のFPUの精度を落とすライブラリと併用すると、32ビット整数値を表せなくなる*1。
- 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++コードを書く必要がある。
- マルチバイト文字対応がなされているものの、判別処理が不十分であり、Shift_JISには対応できていない。
- Unicode対応がなされていない。
- ライブラリファイルのサイズが大きい(ビルド方法にもよるが、Luaの約5倍*2)。
- 資料が少ない。
- 採用例が少なく、実績がない。
Xtal †
国産の組み込み言語。
読みは「クリスタル」…なのか?
ライセンスはMITライセンスっぽい。
参考ページ †
- 配布元
- その他情報
長所と短所 †
- 長所
- 整数、クラス等々は当然サポート。
- C++とのバインド処理がAPIに組み込まれており、その使いやすさは他言語のバインダと比べてもピカイチ。
- 予めバイトコードにコンパイルしたバイナリからも実行できる。
- 標準でShift_JIS、EUC-JP、UTF-8、UTF-16、UTF-32の文字コードに対応しており、初期化時の設定で好きな文字コードを選択できる。
- 他の文字コードにエンコードしてくれるわけではないので普通はシステム標準の文字コードを指定することになる。
- 日本語で丁寧に書かれたドキュメントがあるため、迷うことが少ない。
- 短所
- 構文がかなり独特(日本語のマニュアルがあるのでそれほど迷わないが)。
- ライブラリファイルのサイズがAngelScript以上に大きい(実行ファイルはそれほど大きくならないようだが…)。
- 低速。
- 実績ゼロ。
上記4言語の比較 †
記号評価の順位付けは × < △ < ○ < ◎ となる。
比較項目 | Lua | Squirrel | AngelScript | Xtal |
---|
言語仕様 |
C++ライクな構文 | △ | ○ | ◎ | △ |
---|
型付け | 動的 | 動的 | 静的 | 動的 |
---|
整数型 | なし | int*3 | int8 int16 int int64 uint8 uint16 uint uint64 | ビルド環境による。 32ビット:int 64ビット:long long*4 |
---|
実数型 | double | float | float double | ビルド環境による。 32ビット:float 64ビット:double*5 |
---|
配列 | △*6 | ○ | ○ | ○ |
---|
連想配列 | ○ | ○ | × | ○ |
---|
クラス | ×*7 | ○ | ○*8 | ○ |
---|
多重代入 | ○ | × | × | ○ |
---|
メモリ管理 | ガーベジコレクション | リファレンスカウンタ ガーベジコレクション*9 | リファレンスカウンタ ガーベジコレクション*10 | リファレンスカウンタ ガーベジコレクション*11 |
---|
マルチバイト文字対応 | ×*12 | × | △*13 | ○ |
---|
その他特徴 | | クラス属性 | インタフェース | |
---|
C/C++との連携 |
Unicode対応 | × | ○ | × | ○ |
---|
バイトコードの小ささ*14 | ○ | × | × | 未検証 |
---|
ライブラリの小ささ*15 | ◎ | ○ | △ | × |
---|
バインダ | luabind tolua++ etc... | sqrat SqPlus etc... | APIに内蔵 | APIに内蔵 |
---|
その他 |
処理速度(数値)*16 | △ | × | ○ | ×*17 |
---|
処理速度(文字列値)*18 | ○ | × | × | ×*19 |
---|
ライセンス | MITライセンス | zlib/libpngライセンス | zlibライセンス | MITライセンス |
---|
資料の豊富さ | ○ | △ | × | ×*20 |
---|
利用実績 | ○ | △ | △*21 | × |
---|
その他の組み込み言語 †
まだあまり詳しくまとめていないもの。
Python †
- 参考ページ
- 特徴
- Google、YouTubeなど大手IT企業で採用されている。
- Python自体は枯れた言語であるため信頼度が高い。
- .NET Frameworkに対応したIronPythonという言語がMicrosoftからリリースされている。
- 組み込みとして使うには重い…?
Ruby †
- 参考ページ
- 特徴
- 国産で資料が豊富。
- 組み込みとして使うには重い…?
文字コードについて †
マルチバイト文字対応について †
XtalやRubyといった国産の言語以外は基本的にマルチバイト文字コードに非対応である。
ただしLua等は有志によってShift_JIS対応パッチが提供されている。
Shift_JISに非対応の言語で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で記述する必要がある。