编译器是否使用不同的语言?
答案 0 :(得分:16)
以下是几个例子:
通常,编译器可以用任何语言编写,这种语言实际上足以编写编译器。这显然包括任何图灵完备语言。但是甚至可以用非图灵完备语言编写编译器。 (例如,我没有看到任何明显的原因,为什么编译器不能成为一个完整的函数,但总函数显然不是图灵完备的。)
然而,在实践中,编译器大多是用三种特定类型的语言编写的,具有不同的优缺点:
所有这些基本上都是权衡:用同一种语言编写编译器使其更容易理解,因为您不必学习另一种语言。它也可能使它更难理解,因为语言实际上并不擅长编写编译器。 (想象一下,例如,在SQL中编写SQL编译器。)例如,甚至可能不可能编写编译器(对于“语言”和“编译器”的相当松散的定义)它是无法在CSS中编写CSS编译器或在HTML中编写HTML编译器。
另一方面:用专门的编译器编写语言编写编译器可能使它更容易理解,但同时它需要你学习一门新语言。
请注意,这三个类不是不相交的:编译器可以属于多个类。例如,编写专门的编译器编写语言的编译器本身就属于类别1(本身编写)和3类(用编写编译器的语言编写)。
在某些情况下,你实际上能够达到最佳位置。例如,F#是一种在CLI上具有原生速度的本机语言,它非常擅长编写编译器。因此,在F#中编写F#编译器会给你#1(自己编写),#2(用本地快速语言编写)和#3(用编写编译器的语言编写)。这同样适用于Scala。
答案 1 :(得分:10)
compiler可能用任何语言编写。在最基本的形式中,编译器仅将代码从一种语言转换为另一种语言。从某种意义上说,大多数人今天使用术语“编译器”,它们指的是某些更高级语言的源代码,并将其转换为汇编或某种低级中间语言(CIL)。 / p>
答案 2 :(得分:4)
有时是,有时没有。习惯上尽快尝试用该语言编写新语言的编译器,部分证明它可以“繁重”。
但是,当然,您首先需要一个编译器或至少需要解释器才能运行 编译器并让它自行编译 - 所以您首先必须用不同的语言实现它。
对于许多专业语言而言,用语言本身编写编译器是不实际的,因为该语言并不适用于编译器之类的东西。
答案 3 :(得分:3)
编译器通常用所述编译器的语言编写。例如,C编译器通常用C语言编写。
...提出了“你如何第一次编译它?”的问题。我已经听过两个答案:要么是手工编译(听起来很可怕),要么是作弊并使用现有的编译器来处理该语言。
正如@jball所评论,请阅读Bootstrapping上的维基百科文章,了解完整的详细信息。
答案 4 :(得分:2)