Fin*_*ent 5 java compiler-construction jvm jvm-bytecode
假设我写了一种编程语言;对于同名,我将其称为lang。
为了开始编写lang的漫长旅程,我决定从自己编写lang开始。我实际上不能运行它,因为没有什么可以运行自己运行的程序。
因此,我首先使用Java 为lang编写另一个编译器。这次,当我完成后,我决定将其转换为Bytecode,然后保留它。我现在有一个正在运行的编译器,它将把我所有的lang代码转换为Bytecode。
因此,我决定将自己的语言编译器插入我刚用Java编写的编译器中。然后,我将自编译器转换为Bytecode,然后剔除Java编译器。现在,我有了一个纯粹由自己编写的lang编译器,可以将其转换为Bytecode,以备使用。
这样就创建了一个可靠的程序,我理解了所有这些内容,但是我的问题是,相对于JVM的编译器设计,如果决定发布针对该语言的更新该怎么办?我该如何更新字节码?我是否只用旧版本重写了该语言的更新版本?
我问这是因为这是我想要做的。自己编写一种不存在的语言,然后通过首先使用Java创建编译器将其引导到JVM。
这与使用C ++所做的相同。先编写带有类的C,然后再编写C ++,最后,将带有类的C替换为自举的C ++。但是他们到底是怎么更新语言的呢?
我将从您开发中的两种可能的场景来回答这个问题。对于任何字节码语言,您都可以随时更新虚拟机或语言。
假设首先您想要更新语言以具有新语法或更改当前语义。然后,您将保留当前用lang编写的编译器(编译器A)并编辑其源代码,以便它可以正确编译您的新功能。然后你使用旧的编译器编译你的编译器,给你编译器B。如有必要,您现在可以重写编译器以使用新功能,然后使用编译器B进行编译以得到编译器C。
如果 JVM 发生变化怎么办?在这种情况下,您保留旧版本的 JVM,调整编译器以应对新的字节码更改,然后使用旧版本进行编译(这类似于之前的编译器B )。这将为您提供一个编译器,该编译器可以编译为新字节码,但可以在旧虚拟机上运行。下一步是让它自行编译,现在您有了一个在新 VM 上运行的新编译器(类似于编译器C)。
| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |