C编译器语言

4

我只是想知道C编译器是用哪种语言编写的,请说一些与C不同的语言。


8
有些编译器确实是用C语言编写的。 - dreamlax
1
原始的K&R C主要是用C语言编写的,其中还包含一些引导汇编代码。 - Mitch Wheat
可能是在“自身”中实现编译器的重复问题。 - Greg Hewgill
C 编译器?有很多 C 编译器 - 哪一个? - nos
好的,使用一些BCPL编写的RCA1802A汇编语言。 - paxdiablo
7
我想知道问题X的答案,请说一些与正确答案不同的话。 - JeremyP
9个回答

8

这是一篇很棒的阅读材料:《Reflections on Trusting Trust》,作者是Ken Thompson。文章首先概述了最初的C编译器是如何编写的,具体来说是通过引导技术。虽然可能不能直接回答你的问题,但可以让你有所启发。


+1:你引用的ACM图灵奖论文是一篇非常棒的阅读材料! - Jonathan Leffler
这是一篇我不时会回头阅读的论文,是我个人最喜欢的。 - dirkgently

4
几乎所有主要的C编译器都是用C语言编写的。你可能认为这会出现先有鸡还是先有蛋的问题,但事实并非如此。这个过程被称为引导

不错的引导教程:http://scifac.ru.ac.za/compilers/cha03s.htm - user567879

2

GCC是用C语言编写的。大多数C编译器都是用C语言编写的。

在为某个平台上的语言(任何有编译自己的编译器野心的语言——COBOL是一个合理的例外,但还有很多其他语言)首次制作编译器时,会有一个引导阶段,但一旦你拥有了编译器,那么你就可以用该语言编写编译器。

除此之外,在汇编语言中进行编写太昂贵了。


关于“但是一旦你有了编译器,那么你就可以用这种语言编写编译器”的说法 - 并非总是如此。许多语言始终使用C语言编写它们的编译器/解释器,而许多编译器生成的是C代码而不是机器码 - 这也是C语言被视为高级汇编语言的原因之一。 - user180247
@Steve:有一些语言并不打算编译自己的编译器,这些语言不在我的陈述范围内。 - Jonathan Leffler
GCC 正在转向 C++,Python 有一个纯 Python 解释器(pypy),但实际工作中并未使用。许多语言可以用来实现它们自己,但并没有。clisp 主要是用 C 编写的。 - nmichaels
@Jonathon - 只是因为你写了一种适合编写编译器的语言,并不意味着你自动想要进行自托管。整个引导程序的事情起初就很麻烦。当然,通常情况下还是会这样做,但这并不能证明什么。没有规定说你必须这样做 - 只是有一定程度的错位自豪感。 - user180247

2

最初的C编译器是由K&R用一种叫做B或者BCPL的前身语言编写的。但是一旦C编译器运行得足够好,他们就转换到了C语言,并开始使用每个连续版本来编译下一个版本。

C语言中许多奇怪的特性(例如前缀和后缀自增运算符)存在的原因是因为它们代表了PDP-11上第一个C编译器开发时的特殊寻址模式,或者它们帮助编译器在编译自己的下一个版本时适应内存。

这就是整个故事的全部。


1

根据使用的C编译器,它很可能是用汇编语言编写的,然后最终可能变成了自编译,因此部分代码是用C编写的。

您可以在http://gcc.gnu.org/viewcvs/branches/上浏览GCC的源代码。


这就引出了一个问题,用什么来编写汇编代码呢? - jacknad
@JackN 或许是穿孔卡片等。 - ChrisW
在某个时候,您需要翻转开关来组合发送到处理器的每个机器指令的位。如果再低下去,那就是硬件工程而不是编程了。 - Tyler McHenry
@JackN - 汇编语言被用来编写汇编程序。在此之前,你可以争论机器码 - 但可能连那都是手工汇编的汇编代码。顺便说一句 - 手工汇编并不像有些人想象的那么困难(对于一个简单的处理器)。在8位时代,对于那些没有汇编器的人来说,手工汇编小片段以从Basic程序中调用是很常见的。我也做过这样的事情,虽然这可能意味着我选择了错误的“荒废青春”方式。曾经,我编写了一些简单的6502汇编器,作为一种新语言的“hello world”的升级版。 - user180247
@Steve314 我曾经通过用 Basic 写一个预处理器(因为 O/S 自带 Basic 解释器)并将其输入 debug.coma(汇编)命令,从而编写了一个汇编器; 然后我又用汇编语言编写了另一个汇编器。 - ChrisW
@ChrisW - 我也曾经写过一个管道调试汇编器!它必须多次执行整个过程,希望标签的地址稳定下来 - 对于任何实质性的东西都需要很长时间。老实说,我不记得我用什么语言写的 - 也许是GW-Basic,不确定。我从未编写过真正的i86汇编器,因为要担心太多助记符和寻址模式 - 这会分散注意力,而不是关注比“hello world”更高级的算术和逻辑、文件处理、字符串处理和一些基本数据结构。 - user180247

1

gcc 是用 C 写的

Clang 是用 C++ 写的。

这是我知道的两个。


0

你必须指定编译器。


0
在过去,人们会用汇编语言编写C语言的一个小子集,然后使用它来“引导”编译一种更好的用C语言编写的C编译器。如今,更常见的做法是通过从已经工作的架构进行交叉编译来为新架构创建C编译器。我相信,例如gcc编译器中很少有不是用C或C++编写的位。

-1

在我看来,用 Perl 编写编译器可能是最容易的。


4
当面交流,在汗水中,也许在哪里?上帝禁止,在 Perl 中! - leppie
1
@leppie - 只是确认一下 - 您打算使用 "perl!" 而不是 "peril" 吗?我知道它们差不多,但是... - user180247
“per” 不是 Perl 的一个好缩写? - jacknad
我曾经发了一个帖子,关于用Perl编写编译器的一部分,但是没有像你们这样警告我要小心Perl。你能给出理由吗?我需要建议。 - fat
问一个愚蠢的问题,得到一个愚蠢的答案,我猜吧。 ;) - rakslice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接