主にC/C++に組み込んで使えるプログラミング言語についてまとめています。~ ゲーム開発用途で使われるものが中心です。 各言語の内容を完全に把握しているわけではないので、間違いがあるかもしれません。 #contents *Lua [#lua] 多くのゲームやアプリケーションで採用されているブラジル産の組み込み言語。~ Luaという名前はポルトガル語で「月」を意味する。 ライセンスは[[MITライセンス>http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license]]。 **参考ページ [#aa3d65f1] :公式| --[[The Programming Language Lua>http://www.lua.org/]] :ダウンロード| --[[Lua download>http://www.lua.org/download.html]](本家) --[[Lua@空想具現化プログラミング>http://hammm.dw.land.to/lua/]](SJIS対応版) --[[luabind - SourseForge.net>http://sourceforge.net/projects/luabind/files/luabind/]](luabind) --[[toLua++ - binding c/c++ code to lua>http://www.codenix.com/~tolua/]](tolua++) :概要| --[[Lua - Wikipedia>Wikipedia:Lua]] --[[Lua - Lua/組み込み系言語 Wiki*>http://wikiwiki.jp/lua/?Lua]] :リファレンス| --[[Lua 5.1 Reference Manual>http://www.lua.org/manual/5.1/manual.html]](本家) --[[Lua 5.1 リファレンスマニュアル>http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html]](日本語訳) :その他情報| --[[Lua - 自分用メモとか>http://www.tom.sfc.keio.ac.jp/~fjedi/wiki/?Lua]](慶應義塾大学の研究生のページっぽい) **長所と短所 [#pacc829d] :長所| --非常に高速。 --ライブラリサイズが小さくコンパクト。 --ネットや書籍等の資料が多い。 --多くのゲームで採用された実績がある。 --C/C++のバインダに優秀なものが多い。 :短所| --整数型が存在せず、数値は全て実数型(既定ではdouble)として扱われる。 ---DirectX等のFPUの精度を落とすライブラリと併用すると、32ビット整数値を表せなくなる¬e{:参考ページ:[[空想具現化プログラミング [Lua] Luaの数値型の精度の問題>http://hammm.blog21.fc2.com/blog-entry-52.html]]};。 --switch 構文や、ループを抜ける continue 文がない。 --いわゆる普通の配列を扱う構文がない。 ---テーブルを配列代わりとして使えるものの、インデックスが 1 から始まるなど若干扱いにくい。 --クラスの構文がない。 ---一応、テーブルでクラスもどきを作ることはできる。 --メモリ管理に用いられているガーベジコレクションの性能が悪い(最悪、数秒以上止まる)。 --2バイト文字の考慮やUnicode対応がなされていない。 ---Shift_JISで日本語を扱うと一部文字で問題が起きる。 ---有志のパッチで対応は可能。 --C/C++との値の受け渡しにスタック機構を用いており、クラスの受け渡しなどはバインダを使わないと厳しい。 **C++とLuaのバインダ [#o23ae1bf] :[[luabind>http://sourceforge.net/projects/luabind/files/luabind/]]| C++のテンプレートを駆使して各種データをバインドする。~ 使うためにはboostの導入が必要。 :[[tolua++>http://www.codenix.com/~tolua/]]| ヘッダファイル風の記述を基にバインド用のソースファイルを生成するという、他の組み込み言語と比べても異色のバインダ。~ テンプレートを使わないため、ビルド時間は他のバインダと比べてかなり短く済む。~ ちなみにC言語でも使える。 *Squirrel [#squirrel] Luaの良い部分を残し悪い部分を改善した組み込み言語。~ Squirrelという名前は英語で「リス」を意味する。 ライセンスは[[zlib/libpngライセンス>http://sourceforge.jp/projects/opensource/wiki/licenses%2Fzlib_libpng_license]]。 **参考ページ [#r4ba3934] :公式| --[[Squirrel>http://squirrel-lang.org/]] :ダウンロード| --[[The Squirrel programming language - SourseForge.net>http://sourceforge.net/projects/squirrel/files/]](本家) --[[Sq Plus>http://wiki.squirrel-lang.org/default.aspx/SquirrelWiki/SqPlus.html]](本体+SqPlusセット) --[[ダウンロード - Sqrat - SourseForge.JP>http://sourceforge.jp/projects/sfnet_scrat/releases/]](Sqrat) :概要| --[[Squirrel - Wikipedia>Wikipedia:Squirrel]] --[[Squirrel - Lua/組み込み系言語 Wiki*>http://wikiwiki.jp/lua/?Squirrel]] :リファレンス| --[[Squirrel 2.2 Reference Manual>http://squirrel-lang.org/doc/squirrel2.html]](本家) --[[Squirrel 2.2 リファレンスマニュアル>http://muffin.cias.osakafu-u.ac.jp/~matumoto/cgi-bin/xt.cgi?prog/squirrel_lang]](日本語訳) :その他情報| --[[Squirrel - assari>http://www.mokehehe.com/assari/?Squirrel]] **長所と短所 [#vea658ce] :長所| --C++ライクな構文で見た目にわかりやすい。 --数値型は整数型と実数型に分かれている。 --Luaにはない switch 構文やループ内での continue 文がある。 --Luaにはない配列、クラスの構文がある。 ---クラスやそのメソッドにはC#のように属性を持たせることができる。 --メモリ管理はリファレンスカウンタ+任意タイミングでのガーベジコレクションであり、不意に固まるようなことがない。 --Unicode対応がなされている。 :短所| --実数型が float 型。 --組み込み言語の中では低速(Luaの倍くらいの処理時間が掛かる)。 --Luaと同じくC/C++との値の受け渡しにはスタック機構を用いており、バインダを使わないと厳しい。 --C++のバインダがどれも微妙。 **C++とSquirrelのバインダ [#jcd2b51b] :[[Sqrat>http://sourceforge.jp/projects/sfnet_scrat/releases/]]| C++のテンプレートを駆使して各種データをバインドする。~ ヘッダファイルをインクルードするだけで済み、内容もコンパクトにまとまっている。~ ただしまだ発展途上。 :[[SqPlus>http://wiki.squirrel-lang.org/default.aspx/SquirrelWiki/SqPlus.html]]| C++のテンプレートを駆使して各種データをバインドする。~ 導入は楽だが、設計に問題あり(複数のVMの作成が考慮されていない等)。~ 構造が難解なためデバッグもしづらい。 *AngelScript [#angelscript] 組み込み言語としては珍しい静的型付け(=コンパイル時に型が決定される)の言語。~ LuaやSquirrelといった一般的な組み込み言語は動的型付け(=実行時に型が決定される)。 ライセンスはzlibライセンス([[zlib/libpngライセンス>http://sourceforge.jp/projects/opensource/wiki/licenses%2Fzlib_libpng_license]]と同じと思われる)。 **参考ページ [#m99c97b7] :公式| --[[AngelCode.com - scripting library>http://www.angelcode.com/angelscript/]] :ダウンロード| --[[Library download (AngelCode.com - scripting library)>http://www.angelcode.com/angelscript/downloads.asp]] :概要| --[[プログラム/AngelScript - L.I.W.>http://liw.rulez.jp/?%A5%D7%A5%ED%A5%B0%A5%E9%A5%E0%2FAngelScript]] --[[C++/オープンソースライブラリゲームプログラミング/AngelScript - Aki Wiki>http://www.10106.net/~hoboaki/wiki/?C%2B%2B%2F%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%B2%E3%83%BC%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%2FAngelScript]] :リファレンス| --[[AngelScript Manual>http://www.angelcode.com/angelscript/sdk/docs/manual/index.html]](本家) --日本語訳は今のところ無さそう? :その他情報| --9-Laboratory ---[[AngelScript 1>http://qo.sakuratan.com/2009/09/22/angelscript-1/]] ---[[AngelScript 2>http://qo.sakuratan.com/2009/09/22/angelscript-2/]] ---[[AngelScript 3>http://qo.sakuratan.com/2009/09/29/angelscript-3/]] ---[[AngelScript 4>http://qo.sakuratan.com/2009/10/15/angelscript4/]] **長所と短所 [#a8eaace3] :長所| --静的型付けであり、変数の型をチェックする等のコーディングが不要。 --Squirrel以上にC++ライクな構文。 --C++が持つほぼすべての数値型を扱える(8,16,32,64ビット整数値、float、double)。 --もちろんクラス等々の構文もサポートしている。 --インタフェース(interface)の構文をサポートしている。 --メモリ管理はリファレンスカウンタ+ガーベジコレクション。 --そこそこ高速(Luaと比べて数値の扱いに長け、文字列の扱いに劣る)。 --C++とのバインド処理がAPIに組み込まれており、別途バインダを導入する必要がない。 --C++との値の受け渡しはスタックではなく変数名の直接指定のため、見た目にわかりやすい。 :短所| --連想配列がない。 --クラスの継承はサポートしていない。 --C++クラスのコンストラクタ、デストラクタやvirtualなメンバ関数のバインドにはラッパ関数を介する必要がある。 --C++クラスを参照型としてバインドする場合、リファレンスカウンタを意識したC++コードを書く必要がある。 --マルチバイト文字対応がなされているものの、判別処理が不十分であり、Shift_JISには対応できていない。 --Unicode対応がなされていない。 --ライブラリファイルのサイズが大きい(ビルド方法にもよるが、Luaの約5倍¬e{gamelang:参考文献:[[Game Scripting Languages>http://codeplea.com/game-scripting-languages]]};)。 --資料が少ない。 --採用例が少なく、実績がない。 *Xtal [#xtal] 国産の組み込み言語。~ 読みは「クリスタル」…なのか? ライセンスは[[MITライセンス>http://sourceforge.jp/projects/opensource/wiki/licenses%2FMIT_license]]っぽい。 **参考ページ [#wf7513a7] :配布元| --[[xtal-language>http://code.google.com/p/xtal-language/]](本体もマニュアルもここにある) :その他情報| --[[新言語 Xtalを作る日記>http://d.hatena.ne.jp/xtalco/]](開発者の日記) **長所と短所 [#w7c9e0c1] :長所| --整数、クラス等々は当然サポート。 --C++とのバインド処理がAPIに組み込まれており、その使いやすさは他言語のバインダと比べてもピカイチ。 --予めバイトコードにコンパイルしたバイナリからも実行できる。 --標準でShift_JIS、EUC-JP、UTF-8、UTF-16、UTF-32の文字コードに対応しており、初期化時の設定で好きな文字コードを選択できる。 ---他の文字コードにエンコードしてくれるわけではないので普通はシステム標準の文字コードを指定することになる。 --日本語で丁寧に書かれたドキュメントがあるため、迷うことが少ない。 :短所| --構文がかなり独特(日本語のマニュアルがあるのでそれほど迷わないが)。 --ライブラリファイルのサイズがAngelScript以上に大きい(実行ファイルはそれほど大きくならないようだが…)。 --低速。 --実績ゼロ。 *上記4言語の比較 [#compare-langs] 記号評価の順位付けは × < △ < ○ < ◎ となる。 |~比較項目|~Lua|~Squirrel|~AngelScript|~Xtal|h |LEFT:|LEFT:|LEFT:|LEFT:|LEFT:|c |>|>|>|>|CENTER:BGCOLOR(#FFFFCC):言語仕様| |~C++ライクな構文|△|○|◎|△| |~型付け|動的|動的|静的|動的| |~整数型|なし|int¬e{:Microsoft C環境ならば __int64 に型変更可能。};|int8&br;int16&br;int&br;int64&br;uint8&br;uint16&br;uint&br;uint64|ビルド環境による。&br;32ビット:int&br;64ビット:long long¬e{xtal64bit:ビルドオプションで強制64ビット化可能。};| |~実数型|double|float|float&br;double|ビルド環境による。&br;32ビット:float&br;64ビット:double¬e{xtal64bit};| |~配列|△¬e{:連想配列で代用する。};|○|○|○| |~連想配列|○|○|×|○| |~クラス|׬e{:連想配列でクラスもどきを作ることは可能。};|○|○¬e{:継承をサポートしない。ただしインタフェースの実装は可能。};|○| |~多重代入|○|×|×|○| |~メモリ管理|ガーベジコレクション|リファレンスカウンタ&br;ガーベジコレクション¬e{:任意タイミングのみ。};|リファレンスカウンタ&br;ガーベジコレクション¬e{:循環参照のみ?};|リファレンスカウンタ&br;ガーベジコレクション¬e{:有効/無効切替可能。};| |~[[マルチバイト文字対応>#mbstring]]|׬e{:有志によりShift_JIS対応版が提供されている。};|×|△¬e{:Shift_JISには非対応。};|○| |~その他特徴||クラス属性|インタフェース|| //|~||||| |>|>|>|>|CENTER:BGCOLOR(#FFFFCC):C/C++との連携| |~[[Unicode対応>#unicode]]|×|○|×|○| |~バイトコードの小ささ¬e{gamelang};|○|×|×|未検証| |~ライブラリの小ささ¬e{gamelang};|◎|○|△|×| |~バインダ|luabind&br;tolua++&br;etc...|sqrat&br;SqPlus&br;etc...|APIに内蔵|APIに内蔵| //|~||||| |>|>|>|>|CENTER:BGCOLOR(#FFFFCC):その他| |~処理速度(数値)¬e{gamelang};|△|×|○|׬e{xtalspeed:開発者の弁であり未検証。};| |~処理速度(文字列値)¬e{gamelang};|○|×|×|׬e{xtalspeed};| |~ライセンス|MITライセンス|zlib/libpngライセンス|zlibライセンス|MITライセンス| |~資料の豊富さ|○|△|×|׬e{:日本語のリファレンスは整っている。};| |~利用実績|○|△|△¬e{:国内の実績は×。};|×| //|~||||| *その他の組み込み言語 [#others] まだあまり詳しくまとめていないもの。 **Python [#python] :参考ページ| --[[Python Programming Language -- Official Website>http://www.python.org/]](公式) --[[Python Japan User's Group>http://www.python.jp/Zope]](日本Pythonユーザ会) --[[Python/C APIリファレンスマニュアル>http://www.strawhat.net/python/pythondoc-jp/api/api.html]] :特徴| --Google、YouTubeなど大手IT企業で採用されている。 --Python自体は枯れた言語であるため信頼度が高い。 --.NET Frameworkに対応したIronPythonという言語がMicrosoftからリリースされている。 --組み込みとして使うには重い…? **Ruby [#ruby] :参考ページ| --[[オブジェクト指向スクリプト言語 Ruby>http://www.ruby-lang.org/ja/]](公式) --他、[[Googleで検索>Google:Ruby]]すれば大量に出てきます。 :特徴| --国産で資料が豊富。 --組み込みとして使うには重い…? *文字コードについて [#char-code] **マルチバイト文字対応について [#mbstring] 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を選択した場合、当然ながらスクリプト自体もUnicodeで記述する必要がある。