编译器的语言是什么?他们用不同的语言写的吗?

时间:2010-04-29 21:43:44

标签: compiler-construction

编译器是否使用不同的语言?

5 个答案:

答案 0 :(得分:16)

以下是几个例子:

  • Rubinius Ruby编译器是用Ruby编写的,
  • YARV Ruby编译器是用C编写的,
  • XRuby Ruby编译器是用Java编写的,
  • Ruby.NET Ruby编译器是用C#编写的,
  • MacRuby Ruby编译器是用Objective-C编写的,
  • IronJS ECMAScript编译器是用F#编写的,
  • MS Visual F#编译器是用F#编写的,
  • MS Visual C#编译器是用C ++编写的,目前正在用C#,
  • 重写
  • MS Visual Basic.NET编译器是用C ++编写的,目前正在用Visual Basic.NET重写,
  • GCC C编译器是用C编写的,
  • Clang C编译器是用C ++编写的,
  • 大多数Pascal编译器都是用Pascal编写的,
  • 大多数Oberon编译器都是用Oberon编写的,
  • 6g / 8g和gccgo Go编译器都是用C语言编写的。

通常,编译器可以用任何语言编写,这种语言实际上足以编写编译器。这显然包括任何图灵完备语言。但是甚至可以用非图灵完备语言编写编译器。 (例如,我没有看到任何明显的原因,为什么编译器不能成为一个完整的函数,但总函数显然不是图灵完备的。)

然而,在实践中,编译器大多是用三种特定类型的语言编写的,具有不同的优缺点:

  1. 与编译器实现的语言相同(优点:更大的社区,因为每个知道该语言的人都可以使用编译器,否则他们需要知道这两种语言;缺点:引导问题)
  2. 编译器应该运行的平台的主要低级系统编程语言,例如在Unix上使用C,在JVM上使用Java,在CLI上使用C#(专业:非常快;缺点:这些语言通常不太适合编写编译器,我实际上并不认为性能优势是真实的)
  3. 一种非常适合编写ML,Haskell,Lisp,Scheme等编译器的语言(优点:那些编译器往往很容易理解和破解;缺点:你还需要知道这两种语言)
    1. 上述特殊情况:用于编写编译器的特定于域的语言,如OMeta或解析前端ANTLR,YACC(优点:与上述相同,但更是如此;缺点:与上述相同)
  4. 所有这些基本上都是权衡:用同一种语言编写编译器使其更容易理解,因为您不必学习另一种语言。它也可能使它更难理解,因为语言实际上并不擅长编写编译器。 (想象一下,例如,在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)

什么是语言?例如,gcc写在C中 曾经有一个关于Lisp翻译的故事是用Lisp编写的。

这引出了以下问题 - 如果C编译器是用C编写的,那么编译第一个C编译器的是什么?为此,read here