为什么C语言是编译器的语言-当一个模式子集似乎更适合的时候?

为什么C语言是编译器的语言-当一个模式子集似乎更适合的时候?,c,gcc,scheme,compiler-construction,C,Gcc,Scheme,Compiler Construction,我刚才在听软件工程广播第57集 (谈话稿:) 我只花了40分钟,但我想知道为什么C是编译器的语言——而Scheme子集似乎更适合?(或其他HLL) (不包括不想重写gcc的明显原因) PS最初在LtU发布了这篇文章,其中一个原因是在不受支持的体系结构上引导编译器的问题。这通常需要为该体系结构提供一个可用的编译器,这通常意味着C。我记得我曾试图从源代码处编译MIT scheme,但在我构建MIT scheme之前,它要求安装MIT scheme,这让我非常恼火 顺便说一句,我不确定我是否同意你的前

我刚才在听软件工程广播第57集 (谈话稿:) 我只花了40分钟,但我想知道为什么C是编译器的语言——而Scheme子集似乎更适合?(或其他HLL) (不包括不想重写gcc的明显原因)


PS最初在LtU发布了这篇文章,其中一个原因是在不受支持的体系结构上引导编译器的问题。这通常需要为该体系结构提供一个可用的编译器,这通常意味着C。我记得我曾试图从源代码处编译MIT scheme,但在我构建MIT scheme之前,它要求安装MIT scheme,这让我非常恼火


顺便说一句,我不确定我是否同意你的前提。。。当然,C语言似乎是应用最广泛的语言,但其他语言编译器(如MIT scheme)通常都是用这些语言实现的。

为了更彻底地理解您的问题,我不想费心听40分钟的广播,但我想说的恰恰相反。只有少数编译器是用C编写的。我的印象是(至少在适当的情况下),大多数编译器都是用它们要编译的语言实现的。

C不一定是编译器的语言,但它确实有一些优点。C在几乎所有的平台上都可用,这使得移植和引导编译器变得很容易。C更接近于硬件,并使许多在其他语言中难以实现的优化成为可能。用C编写的编译器很容易与其他语言、库和系统共存,因为它们大多数都提供C接口。其他人也很容易扩展编译器,因为C是系统程序员的世界语。

这可能是多种因素的组合:

  • 几乎所有平台都可以使用C编译器,这使得为新语言构建新编译器变得更加容易
  • 历史:C语言是一种非常流行的语言,所以很多项目都使用C语言是有道理的(无论是哪个项目)
  • 具体来说,Scheme非常不受欢迎(与C相比)

  • C语言有助于实现编译器的前端(解析器和词法分析器),如果我没记错的话,它们的输出仅限于C代码

    现在许多编译器是用C语言以外的语言编写的(比如Scheme)。为了使它们具有可移植性,它们最初生成C代码作为目标语言

    我认为这与后端有很大关系。有人提到了Flex和Yacc,但还有GCC和LLVM可以帮助您完成许多其他重要的事情,比如优化。

    啊,LtU的人都很铁杆:“如果您不能在Scheme中编程,就不值得编程”;)Lisp是一种伟大的语言,它通过少量的语法和关键字为表带来了许多伟大的功能,但因为它们不提供对底层数据类型(byte、char、short、int…)的透明支持,大多数人不相信它们在性能上是一流的。Scheme子集的概念引起了我的兴趣。我认为它已经是一种非常简单的语言了。@David:R5RS及其后代(我认为ERR5RS)是非常简单的,是的。其他的,嗯,取决于你和谁交谈,要么不是最低限度的,要么是不存在的-P@Carl Smotricz:嗯,无处不在的C编译器gcc是用C编写的。类似地,Erlang编译器也是用Erlang编写的。Lisp eval函数,也就是Lisp编译器,是在Lisp仅仅是一个理论的时候用Lisp编写的,直到一个研究生看到了代码,意识到他可以在汇编中直接音译大部分代码。所以我猜第一个实用的Lisp编译器是由人类编译的。它被称为“bootstrapping”,在最基本的编译器教科书《龙之书》中提到过。基本上,首先用另一种语言实现语言编译器的一小部分,然后使用新语言为该语言构建下一个编译器(具有更多语言功能)并进行迭代。你认为最早的编译器(甚至汇编程序)是如何编写的?当然是机器代码。第一个编辑器和其他实用程序也是如此,“少数编译器是用C编写的”。无论如何,计算编译器可能会产生误导。绝大多数编译器可能是Scheme或ML编译器,由CS本科生学习计划或ML编写;-)@Alan:Lisp、Pascal、FORTRAN和COBOL都是编译语言,它们最初的编译实现没有使用C。当然,在4种情况中有3种情况下C当时不存在。例如,第一个Lisp编译器是用Lisp编写的,并使用机器代码编写的Lisp解释器进行引导。我记得当所有这些都是字段时,你知道(嗯,我不知道,但我读过关于当所有这些都是字段时是什么样子的…)当然,我只是想推测艾伦所说的“任何我听说过的起源的语言”实际上是什么意思。显然,他故意排除所有实现都被解释的语言,因为它们当然不会翻译成C。所以我不知道将Java与Lisp等一起作为反例是否合理。他可能知道它的起源,但故意打消了它,而不是仅仅忘记它或不知道它的起源(如Lisp等)。在其他情况下,我完全同意你的看法,JIT是一个合适的编译器。YACC有许多变体和后续版本,可以输出到多种语言。我在许多不同的语言中看到过类似的功能,但在Scheme中没有看到。我并不是说没有Scheme解析器生成器,但我见过的唯一一个Lispy解析器生成器是针对Common Lisp的。如果我们接受(2),为什么会有人首先为不同的语言编写编译器?如果他们编写编译器,我们可以假设他们知道不止一种语言,所以(3)听起来也不是一个令人信服的理由