由于工作原因,需要对squirrel语言进行学习,通过互联网搜索,了解了squirrel该语言是一个意大利很年轻的小伙子用c写的,所以和c一起嵌入使用非常棒,而且是轻量化、嵌入式语言。很好的和C语言进行粘合。
该语言语法是类C语言,很多语法和C语言都是特别相似的,所以只要会C语言,基本的语法学习成本非常低。学起来非常的容易。建议查看官方的Squirrel Reference Manual即可快速入门。但是该语言的魅力之所在是与C语言联合使用。所以把该语言嵌入到C语言写的主程序中就是非常重要的一块内容。而且是也是很难理解的一块。因为该语言是从LUA语言延伸而来,要想搞明白squirrel的堆栈,函数等概念,还是要看看LUA语言。因为squirrel的堆栈是从LUA语言继承而来的。
宿主程序首要做的事情就是要首先初始化一个虚拟机。宿主程序可以通过sq_open()新建任意数量的虚拟机。当虚拟机不在使用时需要使用q_close()函数释放该资源。
代码片
// An highlighted block
int main(int argc, char* argv[])
{
HSQUIRRELVM v;
v = sq_open(1024); //creates a VM with initial stack size 1024
//do some stuff with squirrel here
sq_close(v);
}
堆栈:
Squirrel通过使用堆栈与虚拟机进行数据的交换。这样的处理机制是继承自LUA语言。例如在C语言程序中调用Squirrel函数时,需要把该函数和函数参数压入堆栈中。这样才能调用该函数。同时如果Squirrel要调用C语言函参数,也需要同样的操作。
堆栈可用通过两种方式访问该堆栈。一种是正向,一种是逆向的。正向访问时堆栈底的标示是1,如果使用逆向访问时-1代表堆栈顶部。
在这种情况下,sq_gettop函数返回值为4。
以下函数把C语言的值压入堆栈:
// An highlighted block
void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
void sq_pushbool(HSQUIRRELVM v,SQBool b);
以下函数把squirrel值转换为C语言的值。
// An highlighted block
SQRESULT sq_getstring(HSQUIRRELVM v,SQInteger idx,const SQChar **c);
SQRESULT sq_getinteger(HSQUIRRELVM v,SQInteger idx,SQInteger *i);
SQRESULT sq_getfloat(HSQUIRRELVM v,SQInteger idx,SQFloat *f);
SQRESULT sq_getuserpointer(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p);
SQRESULT sq_getuserdata(HSQUIRRELVM v,SQInteger idx,SQUserPointer *p,SQUserPointer *typetag);
SQRESULT sq_getbool(HSQUIRRELVM v,SQInteger idx,SQBool *p);