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

Compiler construction 编译器的语言是什么?它们是用不同的语言写的吗?,compiler-construction,Compiler Construction,编译器是否使用不同的语言?编译器通常使用所述编译器的语言编写。例如,C编译器通常是用C编写的 。。。这就引出了一个问题:“第一次是如何编译的?”。对此,我听到了两个答案:要么是手工编译的(听起来很可怕),要么是一个作弊并使用该语言的现有编译器 正如@jball所评论的,请阅读上的维基百科文章以获取完整的详细信息。什么是语言?例如,是用英文写的。 有一个关于口译员的故事是用Lisp写的 这带来了以下问题-如果C编译器是用C编写的,那么是什么编译了第一个C编译器?因此,.A可能用任何语言编写。在最基

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

编译器通常使用所述编译器的语言编写。例如,C编译器通常是用C编写的

。。。这就引出了一个问题:“第一次是如何编译的?”。对此,我听到了两个答案:要么是手工编译的(听起来很可怕),要么是一个作弊并使用该语言的现有编译器


正如@jball所评论的,请阅读上的维基百科文章以获取完整的详细信息。

什么是语言?例如,是用英文写的。
有一个关于口译员的故事是用Lisp写的


这带来了以下问题-如果C编译器是用C编写的,那么是什么编译了第一个C编译器?因此,.

A可能用任何语言编写。在最基本的形式中,编译器只是将代码从一种语言转换为另一种语言。从现在大多数人使用“编译器”这个术语的意义上说,他们指的是一些接受某种高级语言的源代码并将其转换为汇编语言或某种低级中间语言()的东西。

有时是的,有时是不行的。习惯上,我们会尽快用一种新的语言来实现编译器,部分原因是为了证明它可以完成“繁重的工作”

但当然,首先需要一个编译器或至少是解释器来运行该编译器并让它自己编译——所以首先必须用不同的语言实现它


对于许多专业语言来说,用语言本身编写编译器并不实用,因为该语言不适用于编译器之类的东西。

以下是几个示例:

  • Rubinius Ruby编译器是用Ruby编写的
  • YARV Ruby编译器是用C编写的
  • XRuby编译器是用Java编写的
  • Ruby.NET Ruby编译器是用C#编写的
  • MacRuby编译器是用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编写的
  • CLangC编译器是用C++编写的,
  • 大多数Pascal编译器都是用Pascal编写的
  • 大多数Oberon编译器都是用Oberon编写的
  • 6g/8g和gccgo Go编译器都是用C编写的
一般来说,编译器可以用任何强大到足以编写编译器的语言编写。这显然包括任何图灵完备语言。但甚至可以用非图灵完全语言编写编译器。(例如,我看不出编译器不能成为total函数的任何明显原因,但total函数显然不是图灵完备的。)

然而,在实践中,编译器大多是用三种特定的语言编写的,各有利弊:

  • 编译器实现的同一种语言(优点:更大的社区,因为了解该语言的每个人都可以使用编译器,否则他们需要同时了解这两种语言;缺点:引导问题)
  • 编译器应该在平台上运行的主要低级系统编程语言,例如Unix上的C、JVM上的Java、CLI上的C(优点:非常快;缺点:通常这些语言不太适合编写编译器,而且我并不认为性能优势是实实在在的)
  • 这是一种非常适合编写ML、Haskell、Lisp和Scheme等编译器的语言(优点:这些编译器往往很容易理解和使用;缺点:您仍然需要了解这两种语言)
  • 上述情况的特例:一种用于编写编译器的特定于域的语言,如OMeta或用于解析前端ANTLR、YACC(优点:同上,但更重要的是;缺点:同上)
  • 所有这些本质上都是权衡:用同一种语言编写编译器更容易理解,因为您不必学习另一种语言。这也会使它更难理解,因为这种语言实际上并不擅长编写编译器。(例如,想象一下,用SQL编写SQL编译器。)甚至可能不可能编写编译器,例如(对于“语言”和“编译器”的定义非常松散),不可能用CSS编写CSS编译器或用HTML编写HTML编译器

    另一方面:用专门的编译器编写语言编写编译器可能更容易理解,但同时需要学习一种新的语言

    请注意,这三个类不是不相交的:编译器可以分为多个类。例如,一个专门的编译器编写语言的编译器,它本身就可以分为第1类(它自己编写)和第3类(用一种擅长编写编译器的语言编写)

    在某些情况下,你实际上能够达到最佳状态。例如,F#是一种在CLI上具有本机速度的本机语言,它非常擅长编写编译器。因此,用F#编写F#编译器可以得到#1(自行编写)、2(使用本机快速语言编写)和#3(使用适合编写编译器的语言编写)。这同样适用于Scala。

    不总是:可能的重复