Home / ぼやきごと / 2009-11-03
2009-11-03

組み込み言語Squirrel

最近、ゲームの設定ファイル的に使えそうな組み込み言語ということで、Luaを調べたり使ったりしていました。

とりあえず、tolua++を使ってLuaの関数にC++のクラスを渡して操作させることまではできました。
便利ですね、これは。
例えばC++側で描画インタフェースクラスを定義して、それをLua側の描画関数に渡して描画…なんてこともできます。
S-RPG製作の編成画面の表示構成を外に出したりできるわけで、開発時のトライ&チェックがしやすいことはもちろん、カスタマイズ性の面からいっても有用です。
実際にそれをやるとなるとオーバーヘッドの考慮は必要ですけどね(固定表示部分は最初に内部でテクスチャにしておく等)。

しかしここまでやったところでもっと使えそうな組み込み言語を見つけてしまいました。
それはSquirrelという言語です。

上述のページを見て貰えれば大体わかりますが、Luaと比較したときの利点として次のようなものがあります。

  • C/C++によく似た構文を採用している。
    • Luaはかなり独特な構文である。
  • 整数と浮動小数点数を個別に言語要素として持つ。
    • Luaの数値は浮動小数点数のみ。
  • テーブル(連想配列)とは別に配列を言語要素として持つ。
    • Luaはテーブルのみ。
  • 配列のインデックスが 0 から始まる。
    • Luaのテーブルで作る配列もどきは 1 から始まる。
  • クラスとその継承の構文を言語要素として持つ。
    • Luaはテーブルでクラスもどきを作れるのみ。
  • 例外処理を言語要素として持つ。
  • メモリ管理は参照カウント方式がベースで、ガーベジコレクションはプログラム側での呼び出し時にしか行われないため、解放タイミングの制御が可能。
    • Luaはガーベジコレクションのみ(Lua5.1ではインクリメンタルガーベジコレクション)。
  • ライブラリビルド時の設定でUnicodeや64ビット環境に対応可能。

逆に欠点としては次のようなものがあります。

  • グローバル変数にいきなり = 演算子を使って代入することができず、 <- 演算子を使う必要がある。
    • 変数名のタイプミスを防ぐという観点からいえば利点でもある。
  • 多重代入、複数の戻り値をサポートしない(要らないといえば要らないが)。
  • クラスの静的メンバ変数をサポートするものの、その値は読み取り専用で変更できない。
    • ただしインスタンス作成前ならば変更できる。
  • Luaと比べて可変長引数の扱いが若干弱い(とはいえC/C++と比べれば十分すぎるレベル)。
  • Luaと比べて資料や関連モジュールが圧倒的に少ない。
  • SquirrelのC++ラッパーとなるSqPlusはテンプレートを駆使しており、記述やデバッグがややしづらい。

ちなみにライセンスはzlib/libpngライセンス(LuaはMITライセンス)。
著作権を偽らず、かつライセンス表記さえしておけば、特に使用に関する制限はありません。

SqPlusに付いているサンプル(?)のDXSquirrelがこの言語の凄さの一端を見せつけています。
SquirrelのコードだけでDirectXによる描画を行っています(サンプルに必要なクラスしか実装されていませんが)。
コードがC/C++ライクなので見るだけで大体何をやっているのかわかるのも凄いところ。
ゲーム業界の一部ではLuaからSquirrelに移行する向きがあるらしいですが、それも納得というものです。

とりあえず、Squirrelを使って編成画面を表示するサンプルとか作ってみようかな。

Next: [組み込み言語は戦国時代?]
Category: [Lua][Squirrel][組み込み言語][プログラミング] - 2009-11-03 20:09:16