C语言(或任何其他低级语言)是否拥有源代码,或者编译器是“做所有工作”的部分,包括解析?如果是这样,不同的编译器是否可以有不同的C方言?标准库在这方面起了什么作用?我真的很想知道这是怎么工作的。
C语言(或任何其他低级语言)是否拥有源代码,或者编译器是“做所有工作”的部分,包括解析?如果是这样,不同的编译器是否可以有不同的C方言?标准库在这方面起了什么作用?我真的很想知道这是怎么工作的。
C是一种标准,规定了C编译器应该如何生成程序。
C本身没有任何源代码,就像一个音符没有任何塑料。
一些C编译器例如GCC是开源的。
C语言只是一种标准化的编程语言,它实际上就是“做所有工作”的编译器。在 C99 ANSI 标准之前,不同的编译器有不同的方言;例如Borland C和其他竞争性编译器以自己独特的方式实现了C语言。
stdlib
是一个约定俗成的标准库集合,在任何符合 ANSI C 规范的实现中都必须存在。
-std = ...
来指定要使用的C标准,每个标准在语法上略有不同或加入了一些特性,其中最常见的可能是c99
。typeof()
不在C标准中,因此编译器不必实现它,但它非常有用,大多数编译器提供它。这里是gcc C扩展列表
stdlib是C标准中指定的一组函数。与编译器类似,stdlib可以具有不同的实现。GNU实现是开源的,就像gcc一样,但还有其他编译器和可能是封闭源代码的stdlib实现。GCC的C编译器是用C语言编写的。因此,我们知道至少有一个用C编写的C编译器。
GNU的stdlib(glibc)也是用C语言编写的(stdio.h、stdlib.h)。但它也有一些部分是用汇编语言编写的。
Helgi Hrafn Gunnarsson已经写了主要答案,但我认为值得注意的是,你也可以有效地得到方言。
编译器应该对它们支持的标准做同样的事情(现在应该几乎都是同一个版本),但是存在灰色地带。例如,编译器处理“未定义”功能的方式。如果C规范指定某个特定情况的行为是未定义的,那么编译器可以做任何它想做的事情。
还有一些例子,编译器制造商添加到库中的函数(和新库)以支持特定平台特性、创建竞争优势或仅仅是为了让生活更轻松。愤世嫉俗的人可能会认为,其中一些是为了帮助将人们锁定在特定的编译器中而添加的。
我不确定你对“开源”的定义是什么。
在标准化过程中,任何人都可以参与,但如果您想有投票权,则需要支付加入您所在国家的机构的费用(例如,美国的ANSI,英国的BSI,法国的AFNOR等)。通常情况下,大多数标准机构会员资格由公司支付。尽管如此,该过程还是相当开放的。您可以在标准网站上访问有关标准的讨论文件。
标准本身也不是免费的。ISO pdf store目前以198瑞士法郎的价格出售C标准。标准的草案副本可以轻松免费获取。
有很多开源编译器和库的实现。