Language agnostic 理解运行时代码解释和执行

Language agnostic 理解运行时代码解释和执行,language-agnostic,language-design,interpreter,interpreted-language,Language Agnostic,Language Design,Interpreter,Interpreted Language,我正在用XNA创建一个游戏,并考虑创建我自己的脚本语言(请注意,非常简单)。我知道有更好的方法来实现这一点(我正在重新发明轮子),但我更希望学习经验,而不是高效和快速 在运行时遇到代码时,据我所知,通常的方法是解析成机器代码或字节码或其他实际上可执行的东西,然后执行,对吗?但是,例如,当Chrome第一次出现时,他们说他们的JavaScript引擎很快,因为它将JavaScript编译成机器代码。这意味着其他引擎没有编译成机器代码 我不喜欢编译到较低的语言,所以有没有已知的现代技术可以在不编译到

我正在用XNA创建一个游戏,并考虑创建我自己的脚本语言(请注意,非常简单)。我知道有更好的方法来实现这一点(我正在重新发明轮子),但我更希望学习经验,而不是高效和快速

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


我不喜欢编译到较低的语言,所以有没有已知的现代技术可以在不编译到较低级别的情况下解析和执行代码?也许类似于将代码解析成某种树,在树中分支,比较每个符号并调用处理该符号的函数?(疯狂猜测和暗中刺伤)

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

对于执行您解析过的代码,我会考虑运行一个简单的虚拟机,或者更好地考虑哪一个是开源(ish)的尝试,以标准化虚拟机字节码格式,并提供诸如JIT(将脚本编译的字节码转换为汇编)之类的良好功能

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


厄尔兹指出,我的回答似乎暗示着‘不要自己费心做这件事’。重新阅读我的帖子,听起来确实有点像这样。我提到ANTLR和LLVM的原因是它们都有大量的源代码和教程,所以我觉得这是一个很好的参考源代码。以它为基础,开始游戏

您可以尝试此框架来构建语言(它与XNA配合得很好):

有一些教程:


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

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


编辑:看起来IronPython可以为您节省更多的工作。它是CPython的C#实现,有自己的嵌入API:

处理器只懂机器语言。。。所以,如果你不编译成机器语言,就必须有其他的东西来做,否则就我所知它不会运行。@Tony那么解释器的工作怎么样?你说:“他们说他们的JavaScript引擎很快,因为它能将JavaScript编译成机码。”Donald Knuth说“过早优化是万恶之源。”在您发明脚本语言之前,您似乎正在优化它@msw,但他接着说“我不想编译成较低的语言”,我相信这只是一个无关紧要的注释。@Earlz有点正确。只需注意,它似乎暗示代码执行是可能的,而无需编译为低级语言。嗯,提到了“学习经验”。此外,我还用C#编写了一个解释器,实际上相当简单。。。(如中所述,我在编程的2-3周内完成了它和图灵)@Earlz当然,但我提到的这两个工具都有源代码,如果您对该领域感兴趣,它们都是很好的通用资源。我不想阻止“自己翻滚”,但是有一个基础来参考链接总是很好的。看到源代码肯定会让人感觉到解析和词法分析是如何完成的。我删除了my-1。我还以为你是在劝阻自己。。将它们用作源代码参考完全是另一回事:)