【问题标题】:Creating a fast interpreted language创建快速解释语言
【发布时间】:2018-06-19 22:44:49
【问题描述】:

我目前正在创建一种用 Nim 编写的编程语言。

编译器的前端已经完成,我现在正坐在一个精心构建的抽象语法树 (AST) 前面,我尝试实现一个简单的解释器,在每个树节点上调用一个评估 () 方法。这行得通,是的,我什至为函数和东西制作了环境。但是,结果证明比 python 慢 15-20 倍。 Python 在虚拟机上运行并将源程序转换为字节码。其他语言使用 JIT 编译。这两件事都不容易实现,但真正让我难过的是找不到任何一本书来尝试教你如何合并这两个世界,要么构建一个单独有用的 VM,要么构建一个编译好的语言。

LLVM 和 GraalVM 之类的工具可以提供帮助,但我不知道如何将我的 AST 链接到这些东西。

我的下一步应该是什么? JIT / 虚拟机?

如果是 VM:关于如何将 AST 转换为字节码并为其创建 VM 的任何建议?

如果 JIT:你甚至如何用动态语言编译东西。例如

fun add(a, b) {
    return a + b;
}

解释器只在运行时知道 a 和 b 的类型,因此在找到之前无法编译它,但是如果将其编译为机器代码,则必须知道参数,因此下一次调用会发生什么是不同的参数类型,重新编译?

我对这个遮罩有点困惑,任何照明都将不胜感激。

提前致谢!

【问题讨论】:

  • 如果您的目标是与 Python 相提并论,那么在 15-20% 之内就足够接近了,您应该分析您的解释器并寻找可以在尝试之前进行的简单优化转向更复杂的模型。
  • 我犯了一个错误。我的意思是慢了 15-20 倍……我的错!
  • 哦,那不一样了:)

标签: compiler-construction interpreter nim-lang


【解决方案1】:

您希望有一本描述如何构建超高性能解释器的书。为此,您基本上将“解释器”与“编译器”混淆以提高效率。要做到那个,简单的答案是,使用书中的每个编译器技巧(显着复数)。你有很多阅读要做。

但是,您想了解的核心内容可以在有关 SELF 的论文中找到,SELF 是一种快速运行时“解释器”,它定义了 JIT 编译器应该如何工作,尤其是在面对动态类型时:

SELF 的有效实现,一种基于原型的动态类型的面向对象语言,(Chambers/Ungar) ACM Sigplan Notices。此处提供 PDF:https://www.researchgate.net/profile/David_Ungar2/publication/234781317_An_Efficient_Implementation_of_Self_a_Dynamically-Typed_Object-Oriented_Language_Based_on_Prototypes/links/540f8fbe0cf2f2b29a3de0a6.pdf

您可以通过访问 Academic.google.com 并搜索“JIT Compilers”以及“Craig Chambers”的任何内容来找到有关此主题的更多技术论文。

【讨论】:

    【解决方案2】:

    虽然不完全直接相关,但您可能有兴趣研究 RPython(“简化”Python)如何处理初始代码分析。在生成流程图后strictly validates variable single-typing(尽管 CPython 是一种完全动态的语言,Pypy 是用 RPython 编写的 Python 解释器,通过装箱支持完全动态)。 RPython 还自然地集成了流程图级别的 JIT(使用“保护”指令来允许专门的代码在违反预期时安全地回退),而无需过多的显式注释,“赠送”该功能给使用任何语言编写的解释器它。此外,它还提供多种内存管理方案(例如多代标记/扫描)。

    总结:尽管变量是“动态的”,但代码通常不是,因此静态分析可以提供关于每个变量类型的答案。

    【讨论】:

    • RPython 的问题在于文档太少。我感到迷失在那里,我读过他们用你的解释器“免费”为你提供了一个 JIT 编译器。但是如果值得的话,我想......
    • @ErikCampobadal 根据您的解决方案的性能特征,您可以从中受益,即使是在 Pypy 本身下运行的普通 Python 代码也可以。例如,my template engine 从 CPython 2.7 上的 38,775 代/秒到 Pypy 下的 45,680 代/秒。当然,现代 CPython 一直在变得越来越好,例如在 CPython 3.7 下进行的相同测试可以达到 47,938/秒。 (相当重要且相关的说明:这不是模板代码的解析器/解释器;它是导入时的文本转换管道。)
    【解决方案3】:

    如果您有兴趣在 GraalVM 上为您的语言构建解释器,请查看 simple language,这是为 GraalVM 构建的示例编程语言,用于说明如何实现。

    简而言之,需要使用Truffle 来描述程序的 AST,这是一个用于实现 GraalVM 使用的编程语言的框架。它提供了一个 API 来描述 AST 中的节点以及它们应该做什么。

    您可以找到更多在 Truffle here 上实现的语言示例。如果您对此有更详细的问题,也许gitter chat 是最容易提问的地方。

    【讨论】:

    • 你受限于java,无法编译原生实现,然后呢? :C
    • 对不起,我不明白你的意思,你能详细说明一下吗?但以防万一,您绝对可以在不依赖 JVM 的情况下运行您的语言的实现。例如 TruffleRuby 就是这样做的,您可以查看来自github.com/oracle/truffleruby/releases 的“truffleruby-1.0.0-rc3-linux-amd64.tar.gz”版本。它使用 JIT 编译器和一切运行适当的 TruffleRuby,但不依赖于 JVM。
    • 那我去看看。我只是以为你被限制在仅在 linux 上免费提供的 GraalVM 上。
    • Windows 支持正在开发中(在 JVM 模式下它可以工作,但本地映像编译还没有),由于缺少开源 JDK8 和我们本可以使用的 JVMCI,至少在基于 JDK11 的构建中应该可用。
    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2011-02-13
    • 2015-07-03
    • 2015-10-28
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多