假设我写了一种编程语言;为了同名,我将其称为 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/