代码之家  ›  专栏  ›  技术社区  ›  Erik Campobadal Christophe Herreman

创建快速解释语言

  •  4
  • Erik Campobadal Christophe Herreman  · 技术社区  · 6 年前

    我现在正在创建一种用 .

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

    像LLVM和GraalVM这样的工具可以帮上忙,但我还是不知道如何将我的AST与这些东西联系起来。

    If-JIT:如何用动态语言编译东西。例如

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

    我有点困惑在这个哑光,任何照明都会很感激。

    3 回复  |  直到 6 年前
        1
  •  5
  •   Ira Baxter    6 年前

    你希望有一本书,描述如何建立超高性能的口译员。要做到这一点,你基本上模糊了“解释器”和“编译器”以获得效率。待办事项 那个 ,简单的答案是,使用书中的每一个编译器技巧(明显的复数形式)。你有很多书要读。

    但是,您想知道的核心内容可以在有关SELF的文章中找到,SELF是一种快速运行时“解释器”,它定义了JIT编译器的工作方式,尤其是在动态类型的情况下:

    基于原型的SELF-a动态类型面向对象语言的有效实现 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

    您可以访问scholar.google.com搜索“JIT编译器”和“Craig Chambers”的任何东西。

        2
  •  0
  •   amcgregor    6 年前

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

    总而言之:即使变量是“动态”的,代码通常不是,因此静态分析可以为每个变量的类型提供答案。

        3
  •  0
  •   Oleg Å elajev    6 年前

    如果您有兴趣在GraalVM上为您的语言构建一个解释器,请看 simple language

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

    您可以找到更多在Truffle上实现的语言示例 here gitter chat

    推荐文章