SQUIRREL语言的中文介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQUIRREL语言的中文介绍相关的知识,希望对你有一定的参考价值。

参考技术A

Squirrel的作者是意大利人Alberto Demichelis,SQUIRREL开发的本意是用于替代LUA,LUA的很多语法与C/C++ 不一致,C/C++程序员写脚本时,容易犯错误,而SQUIRREL语法与C/C++很相似,因此Squirrel更适合C/C++ 程序员。
Squirrel是一种动态语言,它有一个编译器和虚拟机,代码会被动态编译成字节码,然后在虚拟机上执行。当然,这种编译比C/C++或者Java的编译要简单很多,它的虚拟机也不会有JVM这样“底层”,Squirrel的虚拟机更像是一个“函数执行队列”,这个虚拟机是建立在标准libc基础上的(也就是说标准C函数在这个虚拟机中是元操作,而JVM是建立在汇编语言基础上的)。
Squirrel在设计上就是要做到嵌入C/C++程序,因此,Squirrel虚拟机可以与C/C++工作在一个进程/线程当中,通过虚拟机的接口,C/C++的数据可以被嵌入的Squirrel代码访问,反之Squirrel的代码和数据也可以被C/C++完全控制。
从语言结构上看,Squirrel与Lua一脉相承,Squirrel与Lua的基础都是广义表(或者说是一颗多叉树),Hash算法在这个广义表中起到一个关键的作用。
Squirrel代码和数据都是组织在一个广义表当中的。数据、函数、类(Lua不支持OO,Squirrel支持有限的OO)都是广义表的一个值,值都是采用<名称,值>的方式存储的,通过对名称的Hash,可以很方便的找到值。
Squirrel比Lua更好的支持OO,Squirrel可以定义类,允许类继承,能够自动执行构造(constructor函数),而Lua只能通过Table来模拟类。更关键的一点,Squirrel允许类产生实例(instance),每个实例拥有自己的存储空间,在这点上,比Lua的模拟类明显好用。
Squirrel支持在每个实例上设置一个Userpoint,这个特性非常有利与与C++Object的接口,一个Squirrel类可以的作为一个C++ class的影子运行,我们只需要在Squirrel上实现C++class的接口,通过Squirrel的Userpoint,即可操控这个C++ Object。
值得关注的是Squirrel的执行速度,执行一个10000元素的数组创建及遍历,其速度大约是C++的1/4,比Lua快20%。
Squirrel的保留字与C++几乎一致,但Squirrel没有指针,内存由虚拟机管理,不需要手工申请和释放,所以没有new和delete关键字。Squirrel是弱类型的,所以也就没有char、float、int、double等关键字,值得注意到是Squirrel不支持double(Squirrel 3.0支持使用double代替float),其浮点数内部是float,这可能与Squirrel主要为游戏设计有关。
Squirrel新增了一些关键字,主要有local、typeof、instanceof、resum、yield、delegate、parent等(其中delegate、 parent关键字在Squirrel3.0Alpha版中似乎有变化),resum、yield用于Squirrel的“协程”,可以理解为非抢先式的内部线程(Squirrel虚拟机是单线程的,一个虚拟机内部不支持系统的线程,这和Lua很相似)。
值得注意的是local关键字,Squirrel中的变量是需要定义的,和C++一样,你可以在程序的任何地方定义,但定义的时候必须使用local关键字。使用local表明变量在堆栈里创建,离开函数才会自动销毁。
Squirrel循环控制语句增加了foreach循环,而且这个foreach不像Lua一样需要什么“闭包”,可以很简单的使用,例如foreach(local i in arrayVar),这完成对一个数组的遍历,foreach(local key,value in tableVar), 这完成对一个表达遍历。

游戏引擎脚本语言

【中文标题】游戏引擎脚本语言【英文标题】:Game Engine Scripting Languages 【发布时间】:2010-09-10 09:57:22 【问题描述】:

我正在尝试用 Ogre3d 渲染引擎构建一个有用的 3d 游戏引擎,用于模拟我提出的一些想法,并且已经走到了一个十字路口。有许多可用的脚本语言,我想知道是否有一两种经过审查并有适当的追随者。

LUA 和 Squirrel 似乎更受审查,但我对任何人都持开放态度。

如果有一个用于分发和易于加载的语言的编译形式,那将是最好的。

【问题讨论】:

squirrel 的一个优点是内存管理。它使用结合了 GC 的引用计数算法。这提供了非常稳定的实时行为(CPU 无突发)请参阅 Docu 【参考方案1】:

我会选择 Lua,因为编写绑定非常容易,许可证非常友好 (MIT),并且现有的库也往往在上述许可证下。 Scheme 也很好并且易于绑定,这就是为什么选择它用于 Gimp 图像编辑器的原因。但是 Lua 简直太棒了。魔兽世界使用它,作为一个非常引人注目的例子。 LuaJIT 为您提供本地编译的性能。它是来自纯 C 的 less than an order of magnitude。

【讨论】:

【参考方案2】:

我不推荐 LUA,它有一种特殊的语法,所以需要一些时间来适应。取决于谁将编写脚本,这可能不是问题,但我会尝试使用一些相当容易获得的东西。

我可能会选择 python。它通常编译为字节码,因此您需要嵌入解释器。但是,如果必须,您可以使用 PyPy 将代码转换为 C,然后进行编译。

【讨论】:

【参考方案3】:

嵌入解释器没有问题。我现在对功能和性能更感兴趣。 LUA 和 Squirrel 都被解释了,这很好,因为我正在构建的游戏之一是包含可修改的代码,它在游戏中有一个编辑器。

我很想听听有关 python 的信息,因为我已经看到它在我相信的战场系列中的使用。

【讨论】:

【参考方案4】:

语法是个人喜好问题,Lua 类似于 Javascript,但花括号替换为类似 Pascal 的关键字。它有一个很好的语法特性,分号从来不需要,但空格仍然不重要,所以你甚至可以删除所有换行符并让它仍然工作。作为一个从 C 开始的人,我会说 Python 是一种与所有其他语言相比语法深奥的语言。

LuaJIT 的速度也大约是 Python 的 10 倍,而且 Lua 解释器要小得多(150kb 或大约 15k 行的 C 代码,您实际上可以通读和理解)。您可以让用户编写您的游戏脚本,而无需嵌入大量语言。另一方面,如果你将解析器部分从 Lua 中剥离出来,它会变得更小。

【讨论】:

【参考方案5】:

一个有趣的选项是stackless-python。这是在 Eve-Online 游戏中使用的。

【讨论】:

【参考方案6】:

Python/C API 手册比整个 Lua 手册(包括 Lua/C API)更长。

Lua 的另一个原因是对协程的内置支持(一个操作系统线程内的协作多任务)。它允许一个人拥有 1000 多个看似独立的脚本,它们彼此并排运行得非常快。就像每个怪物/武器一个脚本一样。

(为什么人们在 SO 上这么大写 Lua?它是“Lua”(见here)。)

【讨论】:

【参考方案7】:

再投一票给 Lua。小巧、快速、易于集成,这对现代游戏机来说很重要——您可以轻松控制其内存操作。

【讨论】:

【参考方案8】:

python 也很好,因为它具有实际的 OGRE 绑定,以防万一您需要即时修改较低级别的内容。我不知道 Lua 的任何等效绑定。

【讨论】:

【参考方案9】:

由于它是一个 C++ 库,我建议使用 JavaScript 或 Squirrel,后者是我个人最喜欢的两者,因为它更接近 C++,尤其是它处理表/结构和类的方式。由于所有的相似性,这对于 C++ 编码器来说是最容易习惯的。

但是,如果您使用 JavaScript 并找到 Ogre3D 的 HTML5 版本,您应该能够将您的游戏代码直接移植到网络版本中,而只需进行最少的(如果有的话)更改。

这两种方法都是不错的选择,各有利弊,但两者都绝对是最容易学习的,因为您可能已经在使用 C++ 工作了。如果您正在使用 Java,则可能同样如此,如果它是 Game Maker,则您不需要任何一个,除非您尝试制作人们不需要 Game Maker 本身来运行的可执行文件,其中情况下,祝你好运找到运行其中任何一个的扩展。

【讨论】:

以上是关于SQUIRREL语言的中文介绍的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB + SQuirreL:按块读取数据

Phoenix实践——Phoenix图形化工具SQuirrel SQL安装使用小记

Squirrel 客户端与 SAP Hybris

连接HiveServer2的图形化工具SQuirrel和Dbeaver

HSQLDB 和 SQuirreL 中的批量删除

在 SQuirrel-sql 中调试 SQL 查询