compiler-construction - 如何创建自己的面向 JVM 的编程语言?

标签 compiler-construction jvm programming-languages

我想创建自己的面向 JVM 的编程语言。我不确定如何做到这一点。我必须创建自己的编译器吗?是否所有的编程语言都有独特的编译器,或者是否有可以适应的现有编译器?

我找到了一些关于定位 .NET CLI 的信息。 .

我还找到了 Dragon Book关于编译器设计。

最佳答案

是的,每种语言都有自己的编译器。有几种类型的编译器可以编写,每一种都变得更加复杂并建立在前一种之上:

  • 识别器,只回答输入源是否有效语法,
  • 解析器,创建输入源的内存表示(称为 AST - 抽象语法树),
  • 编译器(生成输入的翻译形式),
  • 优化编译器,如 3,但在生成输出之前优化 AST。

  • 所有这些编译器形式通常会重用专门设计用于帮助不同编译阶段的工具。简要地是:

    解析 : 我会推荐 parboiled对于 Java。较旧的工具曾经是 lex 和 yacc 的变体,这两个 unix 工具用于词法和语法分析阶段。 ANTLR 和 Javacc 是两个在 JVM 上运行的例子;然而,煮过的真是太棒了。

    AST :我不知道这里有任何工具,可以重用来自另一种 JVM 语言(例如 javac)的模型,但是我会亲自创建它。

    输出生成 : 一种快速的方法是生成 Java 源代码,它有一些限制,但总体上是一种很好的试水方法。当/如果您决定继续生成 JVM 字节码,可以在 here 中找到一组帮助程序库.然而,在尝试这条路线之前,有很多关于 JVM 的知识需要了解,Oracle 的 JVM 规范/书籍是必读的。

    对于一般知识,llvm tutorial非常好,它很短而且写得很好。我知道您说过要以 JVM 为目标,但是本教程涵盖的几乎所有内容都将帮助您理解所需的部分。

    我建议遵循教程,并使用 Java 重写它。它的步骤非常合乎逻辑。本质上,人们会为一种非常简单的语言编写一个识别器,例如仅“1+2”。然后为该语言编写一个解释器。这将是一个非常合理的停止点,许多语言都被解释过; Java 也是这样开始的。可选地,然后可以继续发出目标输出,首先说 Java 源代码。用于此的代码将相当短,并且比尝试首先完整地编写任何单个层会给您更快的反馈。如果你沿着这条路走下去,就有很多机会消耗你的编码时间。

    关于compiler-construction - 如何创建自己的面向 JVM 的编程语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25999540/

    相关文章:

    c++ - 关于在 C++ 中为酷语言制作编译器的问题

    java - 在类里面找不到符号

    haskell - Haskell在输入 `<-'上解析错误

    java - 如何避免垃圾回收 IBM Java/JVM 中的 Stop the World Events

    vba - VB : What is missing in scripting host while it is present in "full" VB?

    c - 为什么其他语言不支持类似于 C 及其后代的预处理器指令的东西?

    syntax - 什么是 := operator?

    css - 覆盖 div 添加边距

    java - Linux下最大线程数

    java - JVM 的 Xss 选项是只覆盖 Java Stacks 还是也包括 Native Stacks?