为什么Linux内核使用非标准C语言编写(gcc特定功能)?

25
Linux内核代码使用“语句表达式”和typeof扩展,这使得它只能在gcc编译器下进行编译。
越想越觉得不合理。
这破坏了可移植性和标准C的目的。(现在Linux内核代码需要一个支持GCC扩展的特定编译器)。
这是一个错误的设计选择还是有特定原因让Linux内核代码只能用GCC编译?
编辑:我说它破坏了可移植性时,我在不同的上下文中使用了它。我想,通过符合标准C,它将被接受到支持标准C的任何编译器中(这正是创建标准的目的——统一所有不同的C方言),因此更具可移植性。当然,由于gcc如此受欢迎,并且gcc支持大量架构,所以这个问题几乎毫无意义。我只是想知道是否有一个不符合标准C的特定理由。

10
为什么使用GNU编译器编译GNU Linux很奇怪?谁说过Linux的设计是要移植到其他编译器上? - Oliver Charlesworth
8
Linux 不是关于代码质量或可移植性,而是关于世界霸权。 - stefan
2
这似乎不是SO的主题。我不知道程序员的范围是否足够广泛,可以说它是否应该移动到那里。 - Josh Darnell
11
Linux内核并不等同于GNU/Linux。GNU/Linux指的是发行版中包含的核心工具是由GNU实现的。如果使用Linux内核与其他实现核心工具的操作系统(如BSD)配合使用,则不会是GNU/Linux。 - Kevin
2
@SHH 一旦发生这种情况,它们就不再是“gcc扩展”,而是“某些人需要的东西,由某些编译器实现”。许多以前的gcc扩展现在是标准C99特性。 - cnicutar
显示剩余8条评论
4个回答

36
为什么Linux内核开发人员要担心让他们的代码能够在Microsoft Visual Studio编译器或IBM xlC编译器上工作呢?
当你编写内核时,需要对比用户空间精细控制更多的内容,例如确切的内存布局。这些控件在C标准中没有明确规定(例如留给实现定义特征),因此需要进行一些扩展,或者需要依赖于编译器的怪癖。
坚持使用一个特定的编译器并利用它的扩展是明智的决定。代码不需要在编译器之间可移植-它需要在不同硬件平台上高效且可移植。

5
我不知道gcc扩展功能可以让你精确控制更多的内容,比如内存布局或最大化效率。这不是特定于体系结构的汇编语言的工作吗?我的意思是,如果内核开发人员想要最大化效率,为什么不使用汇编语言呢?看起来,在内核中使用的任何gcc扩展都可以被标准C替代(如果我错了,请纠正我)。 - SHH
1
编写汇编比编写C语言更耗时和困难。即使在内核中,它也仅限于以下两个领域:a) 无法用C语言表达的领域;b) 非常特定、性能关键的代码片段,C编译器无法完美地处理。一些扩展可能可以用标准C语言替换,但这有什么意义呢?如果使用扩展更容易编写,为什么要费劲去改呢?还要记住,C语言标准是不断发展的。一些扩展随着时间的推移被许多编译器实现,因为它们是有用的。然后,最终它们可以成为标准。 - Mat
6
最后,这一点非常重要:Linux内核与普通应用程序的可移植性完全不同。它编写运行环境并提供给用户空间,对于普通应用所关心的可移植性,内核根本不在意。内核关心的可移植性与“普通”应用程序的可移植性是完全不同的。 - Mat
1
被限制在gcc上可能是一种特性而不是错误,如果他们支持其他编译器,人们将尝试在这些编译器下编译内核,这将指数级地增加内核可以编译的不同配置数量以及其他使用空间程序。支持噩梦可能不值得。 - Lie Ryan
@SHH:如果C的扩展版本允许一段源代码在许多不同的架构上执行一个任务,而否则每个架构都需要单独的汇编语言代码,那么为什么程序员还要使用汇编语言呢?我观察到有些人似乎本能地反对将C用于这种目的,但我看不出这种反对的好理由。 - supercat
显示剩余2条评论

14

这里有一些有关所使用的具体扩展的良好背景知识。它并不是从“为什么?”的角度写的,但它应该为您选择这种方法提供了一些良好的背景知识:

https://developer.ibm.com/tutorials/l-gcc-hacks/


5
Linux内核代码是一段复杂的软件。GCC提供的功能越多,程序员们就会更加开心。他们为什么要关心可移植性?GCC可以在几乎所有硬件配置下编译代码,并且提供了很好的特性。如果Linux不能用另一个编译器编译,他们为什么要关心呢?
如今,可移植代码对我们来说是一个非常普遍的概念,我们认为它应该无处不在。但事实并非如此。例如,如果编译器为C语言提供了实时扩展,NASA将使用它,而不关心可移植性。重要的是这些特性太好了,不能为了从未使用的可移植性而牺牲它们(我的意思是,谁会使用MS Visual Studio编译内核呢?)

并非gcc支持的每种硬件都能获得良好的功能。 - osgx
你的意思是什么?我心中所想的特性是“语句表达式”和typeof,就像OP所问的那样。 - Shahbaz
我的意思是,gcc并不适用于每个支持的平台,性能表现也不尽相同。 - osgx

4
一旦内核被编译,它不会留下编译环境的"痕迹"来影响正在运行的内核体验。可能只是出于效率考虑吧。内核还包含一些汇编代码,而汇编代码也不太可移植。也许如果内核的"任务"是编写一个可在多个C编译器上编译的内核,这个抱怨就会引起更多人的关注。

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