【发布时间】:2017-02-16 11:01:15
【问题描述】:
假设我写了一种编程语言;同名,我将其称为 lang。
为了开始编写 lang 的漫长旅程,我决定从编写 lang 本身开始。我实际上无法运行它,因为没有什么可以运行自己运行的程序。
所以我开始用 Java 为 lang 编写另一个编译器。这一次,当我完成后,我决定将其转换为字节码,并保留它。我现在有一个可以工作的编译器,它将把我所有的 lang 代码转换成字节码。
所以我决定将我的语言自编译器插入到我刚刚用 Java 制作的编译器中。然后我将自编译器转换为字节码,并丢弃 Java 编译器。我现在有一个 lang 编译器,纯粹是自己编写的,转换成字节码,可以使用了。
这创建了一个可靠的程序,我理解所有这些,但我的问题是,相对于 JVM 的编译器设计,如果我决定发布我的语言的更新怎么办?我该如何更新字节码?我是否只需用旧版本重新编写语言的更新版本?
我问这个是因为这是我想做的。自己编写一种不存在的语言,然后通过首先在 Java 中创建编译器将其引导到 JVM。
这与使用 C++ 所做的相同。编写了带有类的 C,然后在其中编写了 C++,最后放弃了带有类的 C,而使用了自举的 C++。但是他们到底是怎么更新语言的呢?
【问题讨论】:
-
调试字节码会很痛苦。我建议你将
lang的翻译器写成java这样你就可以看到它在做什么并调试翻译后的Java。稍后您可以编写一个更高效的编译器直接生成字节码。 -
@Peter Lawrey:很少需要“调试字节码”。如果您生成的类文件具有指定源文件名和指令到行号的映射的调试属性,那么无论它实际上是用哪种语言编写的,您都可以像 Java 源代码一样顺利地调试它。
-
如果你升级你的语言,你必须只使用以前语言的特性来实现更新的特性。只有在完成之后,您才能开始使用编译器中的新功能。
标签: java compiler-construction jvm jvm-bytecode