java - 为 JVM 编写语言

标签 java compiler-construction jvm jvm-bytecode

假设我写了一种编程语言;为了同名,我将其称为 lang

为了开始编写 lang 的漫长旅程,我决定从编写 lang 本身开始。我实际上不能运行它,因为没有什么可以运行它自己运行的程序。

所以我开始用 Java 为 lang 编写另一个编译器。这一次,当我完成后,我决定将它转换为字节码,并就此保留。我现在有一个可以工作的编译器,它将我所有的 lang 代码转换成字节码。

所以我决定将我的语言自编译器插入到我刚刚用 Java 制作的编译器中。然后我将自编译器转换为字节码,并丢弃 Java 编译器。我现在有一个 lang 编译器,纯粹自己编写,转换成字节码,可以使用。

这创建了一个可靠的程序,我理解所有这些,但我的问题是,相对于 JVM 的编译器设计,如果我决定为我的语言发布更新怎么办?我该如何去更新字节码?我是否只是用旧语言重写更新版本的语言?

我问这个是因为这是我想做的。编写一种本身不存在的语言,然后通过首先在 Java 中创建编译器将其引导到 JVM。

这与使用 C++ 所做的相同。编写了带有类的 C,然后在其中编写了 C++,最后放弃了带有类的 C,转而使用自举的 C++。但是他们究竟是如何着手更新语言的呢?

最佳答案

我将从您开发中的两个可能场景来回答这个问题。您可以随时使用任何字节码语言更新虚拟机或语言。

假设您首先想要更新您的语言以获得新语法或更改当前语义。然后,您将使用 lang(编译器 A)编写当前编译的编译器并编辑其源代码,以便它可以正确编译您的新功能。然后你使用旧的编译器编译你的编译器,为你提供编译器 B。如有必要,您现在可以重写编译器以使用新功能,然后使用编译器 B 编译它以获得编译器 C

如果 JVM 发生变化怎么办?那么在那种情况下,你保留一个旧版本的 JVM,调整你的编译器以应对新的字节码变化,然后用旧版本编译它(这类似于之前的编译器 B) .这将为您提供一个编译为新字节码但在旧 VM 上运行的编译器。下一步是让它自己编译,现在您有一个在新 VM 上运行的新编译器(类似于编译器 C)。

关于java - 为 JVM 编写语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42272029/

相关文章:

java - 将 jvm 与应用程序 bundle 在一起

java - 如何使用 JAVA_OPTS 环境变量?

java - 如何获取 .kt 文件中所有类的列表

java - 无法从其他 EJB2 查找 EJB2,但可以从 servlet 查找

java - php 服务器端和 java (Android) 客户端之间的 RSA。

java - Web 服务和 hibernate - 您如何将这两者结合起来?

java - 对于不同的图表数据集,颜色不会改变

database - 在 Lua 中更新数据库版本

compiler-construction - 如何避免 LLVM 的代码生成器执行不需要的常量折叠?

c - 如何将 C 编译器安装到 Eclipse?