2

我正在 XNA 中创建游戏,并且正在考虑创建自己的脚本语言(请注意非常简单)。我知道有更好的方法来解决这个问题(而且我正在重新发明轮子),但我想要的学习体验不仅仅是高效和快速。

在运行时遇到代码时,据我了解,通常的方法是解析成机器码或字节码或其他实际可执行的东西,然后执行,对吧?但是,例如,当 Chrome 刚推出时,他们说他们的 JavaScript 引擎速度很快,因为它将 JavaScript 编译成机器代码。这意味着其他引擎没有编译成机器代码。

我宁愿不编译为低级语言,那么是否有任何已知的现代技术可以在不编译为低级的情况下解析和执行代码?也许像将代码解析成某种树,在树中分支,比较每个符号并调用一些处理该符号的函数?(在黑暗中疯狂的猜测和刺伤)

4

3 回答 3

2

我个人不会滚动您自己的解析器(将输入转换为标记)或词法分析器(检查输入标记的语言语法)。看看ANTLR的解析/词法分析——它是一个很棒的框架,如果你想深入了解它,它有完整的源代码。

对于执行您已解析的代码,我会考虑运行一个简单的虚拟机,或者更好地查看llvm,它是一种开源(ish)尝试标准化虚拟机字节码格式并提供诸如 JITing 之类的好功能(将您的脚本编译的字节码转换为程序集)。

我不会阻止您使用更高级的选项,例如本机机器代码执行,但请记住,这是一个非常专业的领域,并且变得非常复杂,非常快!

Earlz 指出,我的回复似乎暗示“不要费心自己做这件事”。重读我的帖子,听起来确实有点像。我提到 ANTLR 和 LLVM 的原因是它们都有大量的源代码和教程,所以我觉得这是一个很好的参考源。以它为基地玩

于 2010-03-10T23:53:02.767 回答
0

Python 作为一种脚本语言非常棒。我建议您为其 C API 制作一个 C# 绑定并使用它。嵌入 Python 很容易。您的应用程序可以在 Python 解释器可以访问的模块内定义函数、类型/类和变量。应用程序还可以调用 Python 脚本中的函数并返回结果。这两个功能的结合为您提供了一种双向通信方案。

基本上,您可以免费获得 Python 语法和语义。您需要实现的是您的应用程序向 Python 公开的 API。一个例子可以是访问游戏逻辑函数和渲染函数。然后 Python 脚本将定义调用这些函数的函数,主机应用程序将调用 Python 函数(带有参数)以完成工作。

编辑:似乎 IronPython 可以为您节省更多工作。它是 CPython 的 C# 实现,并且有自己的嵌入 API:http ://www.ironpython.net/

于 2010-03-16T09:39:48.663 回答
0

你可以试试这个框架来构建语言(它适用于 XNA): http ://www.meta-alternative.net/mbase.html

有一些教程: http ://www.meta-alternative.net/calc.pdf

http://www.meta-alternative.net/pfront.pdf

于 2010-03-16T09:21:06.960 回答