C++嵌入式游戏脚本语言 - 找不到我喜欢的东西

7
我急需一种快速的、类C语法的、易于嵌入和包装的脚本语言,以嵌入到我的C++游戏中。目前为止,我尝试过:
- Lua: 它可以工作,但是将全局C++函数包装在它周围很麻烦,而且包装对象更加困难。此外,我真的不喜欢Lua的语法。 - AngelScript: 我无法让它工作。初学者文档很差,因为第一个示例无法编译,你必须先构建许多附加组件。尽管比Lua更容易包装C++对象和函数,但仍然可以更清晰。语法看起来不错。 - ChaiScript: 我无法让它工作。我在非git和git C++11版本中都遇到了很多错误。我不想使用boost版本,因为我不想在项目中引入boost依赖项。包装看起来很容易,语法也可以。
我还调查了:
- Pike: 语法看起来不错,但我没有找到有关嵌入的文档。 - Squirrel: 我不喜欢它的语法,而且嵌入/包装像Lua一样令人讨厌,需要处理堆栈。
那么:
- 是否有一个好的、快速的、类C语法的、易于嵌入和包装的替代方案? - 如果没有,创建脚本语言的最佳学习资源是什么?我喜欢重新发明轮子,这可能是一个有趣的学习体验。

你正在使用哪个编译器?目前ChaiScript 5不支持VC++,因为VC++缺乏基本的C++11功能... - MFH
自己创建一种脚本语言是一个很好的学习经验。虽然需要一些时间,但有相当不错的工具可以减轻痛苦。对于前端,我建议看看:http://goldparser.org/。 - Tim
4
“我不喜欢这种语法”并不是避免使用经过充分测试和设计的语言的好理由。这是一个幼稚的理由,而不是专业的理由。你永远无法开发出像即使是较新的脚本语言那样扎实、经过充分测试和广泛使用的语言,更不用说像 Lua 这样的老牌语言了。如果你对语法有些痛点,最好的方法是忽略它们。如果做不到这一点,可以使用一个小型前端将这种语法的微小变化转换为真正的语言。 - Nicol Bolas
很奇怪。我曾经用VS2012测试过ChaiScript 5——它几乎编译通过了。基于Clang支持整个标准这一事实,我本以为Clang可以编译ChaiScript 5...话虽如此,我不同意语法不重要这一说法——就我个人而言,语法和易于集成将是我的主要关注点(后者也是我避免使用Lua之类东西的原因…)。 - MFH
8个回答

4

对于类C语法,请查看:

  • Ch 一个商业的可嵌入C解释器
  • CINT 一个开源的C / C ++解释器
  • Pawn - “一种带有C样式语法的简单,无类型,32位扩展语言”

也许不适合你,但是由于这个问题可能会出现其他人会感兴趣的替代方案列表,我向您提供QtScript,它为您提供类似JavaScript的语法。封装可能很简单,但您需要采用Qt框架来做到这一点,特别是信号和插槽的概念。

还有来自Firefox的JS引擎SpiderMonkey


4

您可以考虑使用JavaScript。 V8脚本引擎可以嵌入到您的程序中,并且有关于如何公开您的类型的文档。


1
它也相当快,这是值得一提的! - Tim

3

您可能会对Dao(http://daoscript.org/, https://github.com/daokoder/dao)感兴趣。

Dao使用标准C实现,最小化依赖(如果不包括可选模块和工具)。它轻量高效,支持嵌入和扩展。它调用C函数的接口不基于堆栈。以下是一个简单的示例:

#include "stdio.h"
#include "daoValue.h"
static void Square( DaoProcess *proc, DaoValue *param[], int nparam )
{
    daoint num = param[0]->xInteger.value;
    DaoProcess_PutInteger( proc, num*num );
}
int DaoOnLoad( DaoVmSpace *vmspace, DaoNamespace *nspace )
{
    DaoNamespace_WrapFunction( nspace, Square, "Square( num : int ) => int" );
    return 0;
}

你可能会注意到,在包装函数中没有用于检查参数类型的样板代码。这是因为此函数被注册为Square(num:int)=>int,这意味着该函数只能接受一个整数作为参数,并由Dao运行时保证。
你可能还想知道,它还具有基于Clang的工具,用于自动/半自动生成C/C++绑定。
免责声明:我是这种语言的作者。

2
你可以使用类似Cling的工具,直接使用C++语言编程。这样做有利于你更快地熟悉语法,并且轻松地将其集成到你的静态C++程序中。此外,你还可以观看Qt + Cling, the LLVM based C++ interpreter (2:05)视频了解更多相关信息。

1

您可能对ObjectScript感兴趣。

ObjectScript,简称OS,是一种新的编程语言。它是免费的、跨平台的、轻量级的、可嵌入的和开源的。它结合了多种语言的优点,包括:JavaScript、Lua、Ruby、Python和PHP。OS具有Javascript的语法、来自lua的“多个结果”功能、来自Ruby的语法糖以及来自PHP和Ruby的魔术方法-甚至更多!

使用ObjectScript的最小程序可能像这样:

#include <objectscript.h>
using namespace ObjectScript;
int main(int argc, char* argv[])
{
    OS * os = OS::create(); // craete ObjectScript instance
    os->require("main.os"); // run ObjectScript program
    os->release();          // release the ObjectScript instance
    return 0;
}

1
我赞成使用Python作为脚本语言。我之前在我的程序(不是游戏)中使用过boost python,并且对它感到相当满意。如果你想尝试创建自己的脚本,你可以尝试boost spirit。请注意,保留HTML标签。

虽然作为参考很好,但是原帖作者不想在他的项目中引入boost作为依赖。 - PaperBirdMaster
2
@PaperBirdMaster 不想使用 Boost.Python 是因为“它引入了对 Boost 的依赖”,这让我想起了这个溺水者的笑话。任何脚本语言都会引入依赖,而使用 BCP 可以隔离出 Boost 中仅需的部分。 - TemplateRex
我基本上同意你的观点,@TemplateRex,但请告诉楼主,是他自己设置了限制。 - PaperBirdMaster

1
除了其他人提出的建议外,还有Cling被认为是实验性的。编写脚本语言并不容易,但现在至少可以使用LLVM作为后端。编程语言设计在N.Wirth的旧版《算法+数据结构=程序》中简要讨论(但请检查内容主题,在最新版本中该章节已被移除),如果您在Google上搜索作者,肯定会找到关于这个主题的其他出版物。

0

OP特别要求使用“类C”语法,并且需要一个易于嵌入的解释器。后者相当主观,但Python并不像嵌入式那么容易。 - user1596212

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接