2

我在XNA中创建了一款游戏,并且正在考虑创建自己的脚本语言(非常简单)。我知道有更好的方法可以解决这个问题(而且我正在重新发明轮子),但是我希望学习体验不仅要高效而且快速。了解运行时间代码的解释和执行

在运行时遇到代码时,根据我的理解,通常的方法是解析机器代码或字节代码或其他实际可执行的代码,然后执行该代码,对吧?但是,例如,当Chrome第一次出现时,他们说他们的JavaScript引擎速度很快,因为它将JavaScript编译为机器代码。这意味着其他引擎不会编译成机器代码。

我宁愿不编译成较低的语言,所以有没有已知的现代技术解析和执行代码而不编译到低级别?也许就像将代码解析成某种树,分支树一样,比较每个符号并调用一些处理该符号的函数? (在黑暗中猜测和刺穿)

+0

处理器只能理解机器语言...所以,如果你不被编译成机器语言,别的东西将不得不这样做,要不然也不会运行到我的知识。 – 2010-03-10 23:52:18

+0

@Tony怎么做翻译的工作呢? – Earlz 2010-03-11 00:00:59

+0

你说:“他们说,他们的JavaScript引擎是快的,因为它编译的JavaScript成机器代码” 高德纳说:“过早的优化是所有罪恶的根源。” 你似乎是优化你的脚本语言,你发明了它。 ;) – msw 2010-03-11 00:02:28

回答

2

我个人不会推出自己的解析器(将输入转换为令牌)或词法分析器(检查语言语法的输入令牌)。看看ANTLR解析/ lexing - 这是一个伟大的框架,并有完整的源代码,如果你想深入了解它的胆量。

为了执行你已解析的代码,我会考虑运行一个简单的虚拟机,或者更好地看看llvm这是一个开源(ish)尝试标准化虚拟机字节码格式并提供很好的功能如JITing(将您的脚本编译成字节码转换为汇编)。

我不会阻止你从机器的更高级的选项,如本机机器代码执行,但要记住,这是一个非常专业的领域,并得到真正的复杂,真正快!

Earlz指出,我的答复似乎暗示'你自己不要这么做。重新阅读我的文章听起来有点这样。我提到ANTLR和LLVM的原因是他们都有一堆源代码和教程,所以我觉得这是一个很好的参考资源。以它为基础,发挥

+0

嗯,提到了“学习经验”。另外,我写在C#中的解释,它实际上是相当容易的......(如,我受够了,并像内2-3周编程的图灵完备) – Earlz 2010-03-10 23:58:57

+0

@Earlz肯定,但两者我提到有这些工具源代码,如果你对这个领域感兴趣的话,它们是很好的一般资源。不想阻止'滚动你自己',但总是很高兴有一个基地来参考 – zebrabox 2010-03-11 00:04:37

+0

感谢您的链接。看到源代码绝对应该感受一下如何解析和轻松完成 – Bob 2010-03-11 00:07:44

0

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

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

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