fundamentalな部分についてまだ書くよ

前述のSQObject構造体はすべてのSquirrelが提供する型を格納できるようになっている。ハッシュテーブルや配列や文字列、プリミティブ型は当然のことながら、C++側で定義された関数の定義(native closureと呼ばれる)、squirrelで定義された関数の定義(closureと呼ばれる)、クラス定義、インスタンス、すべてこの中へ収められる。

これらの複数のSQObjectに名前をつけてまとめるのがtableと呼ばれる、ハッシュテーブルである。Squirrel内の記憶構造はこの何でも入る変数とハッシュテーブルでできている。まず、VM自体はroot tableと呼ばれるglobalスコープ的なテーブルをひとつだけ最初から持っていて、例えばprint()等の基本的な関数はここへ登録されている。クラスの定義も実際は書き込みロックがされたテーブルである。グローバル変数の参照やメンバの参照、関数の呼び出しが結局はどこかのテーブルを文字列キーで検索することで為されることを意識しておきたい。(closure内のlocal変数はちがうけど)ここらへんの構造のシンプルさはLuaの良いところをそのままもらってきたのだろうと思う。大好きだ。

ちょっといい話

ハッシュテーブルのキーになる文字列だが、検索を極限まで高速化するためにLuaSquirrelも独自の文字列プールを用意している。検索ごとにハッシュ値を割り出すのに文字列中の全文字を評価しているわけにはいかないので、ハッシュを予め算出し、これを付属させた独自の文字列型をプールを介して同一文字列間で共有するようになっている。だからSquirrel系内での文字列型(SQString)を使ってテーブルを検索する限り極めて高速なレスポンスを期待してよい。そのかわり、系へ新しい文字列が追加された時に文字列プール内に重複を探す時間がかかる。例えばホストプログラム(C++等の組み込む親側)側で文字列を直接指定しての検索にはそれなりの時間がかかってしまうということだ。できるなら、頻繁に利用する文字列は前もってSQString化しておくと良い。

// "foo"をSQStringにしてSQObjectPtrにいれておく
SQObjectPtr sqstr_foo(SQString::Create(_ss(v),"foo",-1)); 

こんなかんじで。