如何创建一个针对JVM的编程语言?

3
我想创建一个针对JVM的编程语言,但不确定如何实现。我需要创建自己的编译器吗?所有编程语言都有独特的编译器,还是可以改编现有的编译器?
我已经找到了一些关于针对.NET CLI的信息。
我也找到了《编译器设计》(Dragon Book)的相关资料。

2
这个问题太宽泛了。但是一般来说,你需要先编写一个解析器来解析你的语言,并将其编译成一些中间表示(例如AST或某些中间语言)。之后,你需要将中间表示翻译成字节码。 - Vivin Paliath
1
LLVM教程非常优秀,篇幅短小且写作精良。我知道你想要针对JVM进行开发,但是这个教程涵盖的几乎所有内容都将有助于你理解所需的部分(http://llvm.org/docs/tutorial/)。 - Chris K
1
我也在stackoverflow上找到了这个链接:https://dev59.com/x3VD5IYBdhLWcg3wXaed - Chris K
@ChrisK 我之前参考过那个链接。但说实话,我不太确定它是否是一个开始的好地方。 - Rohan Sethi
1
@RohanSethi 学习编写编译器可谓是一门玄学,我很幸运在大学里学到了它。你会遇到两个问题,1)理论非常深奥难以理解,2)你的前二十次尝试都会变成一团乱麻。 :) - Chris K
显示剩余6条评论
3个回答

7
是的,每种语言都有自己的编译器。可以编写几种类型的编译器,每一种都更加复杂并建立在之前的基础上:
1. 识别器,仅回答输入源是否有效的语法。 2. 解析器,创建输入源的内存表示(称为 AST - 抽象语法树)。 3. 编译器(生成输入的翻译形式)。 4. 优化编译器,与第三种类似,但在生成输出之前优化 AST。
所有这些编译器形式通常重用专门设计的工具,以帮助不同阶段的编译。简而言之,它们通常包括以下几个阶段:
解析:我建议使用 Java 的 parboiled。旧工具曾经是 lex 和 yacc 的变体,两个用于解析的 Unix 工具。ANTLR 和 Javacc 是在 JVM 上运行的两个示例;然而,parboiled 真是太棒了。
AST:我不知道有任何工具在这里,可以重用另一种 JVM 语言(例如 javac)的模型,但我个人会自己创建它。 输出生成:一种快速的方法是生成Java源代码,这种方法有一些限制,但总体上是一个测试水温的绝佳方法。当您决定转向生成JVM字节码时,可以在此处找到一系列辅助库。然而,在尝试该路线之前,需要了解关于JVM的很多知识,Oracle的JVM规范/书籍是必读的。

对于一般知识,llvm教程非常出色,它相当简短并且写得非常好。我知道您说您想针对JVM进行目标设置,但是这个教程涵盖的几乎所有内容都将帮助您理解所需的部分。

我建议跟随教程,使用Java进行重写。它的步骤非常逻辑化。本质上,您将为一个非常简单的语言编写识别器,例如仅包含'1+2'。然后编写该语言的解释器。那将是一个非常合理的停止点,许多语言都是解释型的;Java也是这样开始的。可选地,您可以继续发出目标输出,比如首先是Java源代码。这个代码会相当短,并且会比尝试完整编写任何单个层次结构更快地给您反馈。如果您选择这条路,有很多机会消耗您的编码时间。

4
Chris K.提供了一个相当不错的答案,然而,在某一点上,我(作为至少已经为非平凡JVM语言编写过工作编译器的人)必须严格反对:
出于以下原因,代码生成器应该在开始时生成仅为Java(或者,如果您喜欢的话,Scala、Ceylon、Kotlin、Clojure等等)的代码:
- 其他任务(词法分析、语法分析、维护编译器状态(也称符号表)、语义分析等)已经足够耗费精力。因此,学习另一个库会过度,会大大延迟您的第一个结果。 - 一旦您拥有所有内容,包括代码生成并编译您的第一个程序,您将发现您的编译器充满错误。它要比错误的类文件更容易看到这些错误在非意义或错误的Java代码中显现出来。您是希望从字节码验证器那里获得加密的消息还是查看以文本形式生成的代码? - 无论如何,代码生成都应该是一个单独的模块,编译器的其余部分不依赖于(或者不应该依赖于)代码生成。因此,一旦您可以确定您的编译器确实能够理解其输入(证明是可编译的Java代码,可以通过一些测试等),替换它就相对容易。要确保,在类文件生成不是100%无错的情况下,是否将代码生成为Java或二进制码应该是一个选项。这样,您可以将测试程序编译为Java和字节码,并使用两种结果运行测试。这使得在生成的类文件突然失败的情况下进行错误分析更加容易。 - 我个人甚至不会开始生成类文件,直到您的编译器(用您自己的语言编写)可以将自身编译成Java,并且生成的程序可以将编译器源代码编译为完全相同的Java代码。

@rohan-sethi 在创建编程语言时,另一个重要方面是首先设计您的语言。考虑一下,在纸上尝试编写几个程序,并手动“编译”它们为Java。一旦您对语言设计感到满意,另一个重要且有用的步骤是编写http://en.wikipedia.org/wiki/Bootstrapping_(compilers)。 - xmojmr

3

2
MPS 的 IDE 支持非常强大,教程视频也相当丰富。它还带有一个 Java 语法,可以修改以启动自己的语言。非常值得一试。 - Chris K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接