我们知道编译器可以使用称为bootstrapping的技巧以自己的语言编写。我的问题是这个技巧是否也适用于口译员?
理论上答案肯定是肯定的,但有一点担心,当我们经历迭代时,源代码的解释将变得越来越低效。这会是一个严重的问题吗?
我正在引导一个非常动态的系统,程序会不断变化,所以它排除了编译器。
让我用这种方式说出来:
让我成为口译员。
让L's成为编程语言。
我们上面不需要任何编译器,只需要解释器。正确?
可能效率低下。这是我的问题,如果确实效率低下,如何克服它。
答案 0 :(得分:4)
这没有意义。解释器不会生成二进制文件,因此无法创建可以独立运行的东西。在某个地方,最终,你需要一个二进制文件作为解释器。
编译器引导的示例。假设我们有两种语言A(ssembler)和C.我们想要引导用C编写的C编译器。但是我们只有一个汇编器来开始。
后来的运行只是
现在让我们说你有一种解释语言,我称之为Y.第一个版本可以称为Y1,下一个Y2可以称为Y1,依此类推。让我们尝试“引导”它。
首先,我们没有任何可以解释Y程序的东西,我们需要编写一个基本的解释器。假设我们有一个C编译器并在C中编写Y1解释器。
问题是你永远无法逃脱解释器堆栈,因为你从不编译更高级别的解释器。因此,您总是需要编译并运行用C编写的第一个版本解释器。您永远无法逃避它,我认为这是编译器引导过程的基本点。这就是为什么我说你的问题没有意义。
答案 1 :(得分:2)
答案取决于所解释的内容。如果你的目标是一个解释字节码的虚拟机,并且你的语言是在字节码不变的情况下迭代开发的,那么你就不会失去性能。在目标VM上有大量语言示例,这些语言并非专门针对该语言而设计,并且它们不会直接影响性能(例如,JVM上的Scala)。
以JVM为例,您将用Java编写第一个编译器,它将您的源语言编译为JVM字节码。然后你会用你的新源语言重写你的编译器来做同样的事情。得到的字节码在两者之间无法区分。请注意,这与在解释语言中编写解释器不同,每次迭代都会变慢。
答案 2 :(得分:0)
这句话似乎没有意义:
我正在引导一个非常动态的系统,程序会不断变化,所以它排除了编译器。
无论你是否有翻译或编译器:两者都必须处理不更改的内容,即使用您的语言。即使语言以某种方式“动态”,也会有一种固定的元语言。很可能你也有一些低级代码,或者至少是解释器正在使用的数据结构。
你可以先设计并形式化这个低级代码(无论它是什么)并编写一些可以“运行”它的程序。一旦你有了这个,你可以添加一堆解释器,只要它们都产生这个低级别的代码,效率应该不是问题。
答案 3 :(得分:-1)
你的确可以,这就是吱吱声使用的方法(我相信很多其他的小伙伴)。这是一种方法:https://github.com/yoshikiohshima/SqueakBootstrapper/blob/master/README