直观地说,Foo语言的编译器本身似乎不能用Foo来编写。更具体地说,Foo语言的第一个编译器不能用Foo编写,但任何后续的编译器都可以为Foo编写。
但这是真的吗?我隐约记得读过一种语言,它的第一个编译器是用“自身”编写的。这可能吗?如果可能,如何实现?
直观地说,Foo语言的编译器本身似乎不能用Foo来编写。更具体地说,Foo语言的第一个编译器不能用Foo编写,但任何后续的编译器都可以为Foo编写。
但这是真的吗?我隐约记得读过一种语言,它的第一个编译器是用“自身”编写的。这可能吗?如果可能,如何实现?
当前回答
是的,你可以用一种语言编写编译器。不,你不需要第一个编译器来引导该语言。
您需要引导的是该语言的实现。它可以是编译器,也可以是解释器。
历史上,语言通常被认为是解释语言或编译语言。解释器只为前者编写,编译器只为后者编写。所以通常,如果要为一种语言编写编译器,第一个编译器会用其他语言编写以引导它,然后,可选地,编译器会为主题语言重新编写。但是用另一种语言编写解释器也是一种选择。
这不仅仅是理论上的。我自己也在做这件事。我正在为自己开发的语言Salmon编写编译器。我首先用C创建了一个Salmon编译器,现在我正在用Salmon编写编译器,所以我可以让Salmon编译器工作,而不需要用任何其他语言为Salmon编写编译器。
其他回答
这是一个dump(实际上很难搜索的话题):
闲聊 C
这也是PyPy和Rubinius的想法:
(我想这也适用于Forth,但我对Forth一无所知。)
是的,你可以用一种语言编写编译器。不,你不需要第一个编译器来引导该语言。
您需要引导的是该语言的实现。它可以是编译器,也可以是解释器。
历史上,语言通常被认为是解释语言或编译语言。解释器只为前者编写,编译器只为后者编写。所以通常,如果要为一种语言编写编译器,第一个编译器会用其他语言编写以引导它,然后,可选地,编译器会为主题语言重新编写。但是用另一种语言编写解释器也是一种选择。
这不仅仅是理论上的。我自己也在做这件事。我正在为自己开发的语言Salmon编写编译器。我首先用C创建了一个Salmon编译器,现在我正在用Salmon编写编译器,所以我可以让Salmon编译器工作,而不需要用任何其他语言为Salmon编写编译器。
GNAT是GNU Ada编译器,需要完全构建Ada编译器。当将其移植到一个没有现成的GNAT二进制文件的平台时,这可能是一个麻烦。
也许你可以用BNF来描述BNF。
Mono项目的c#编译器已经“自托管”很长一段时间了,这意味着它是用c#本身编写的。
据我所知,编译器最初是纯C代码,但一旦实现了ECMA的“基本”特性,他们就开始用c#重写编译器。
我不知道用同一种语言编写编译器有什么好处,但我确信它至少与语言本身可以提供的特性有关(例如,C不支持面向对象编程)。
你可以在这里找到更多信息。