Linux内核(或其他低级别的东西)是否是编写C语言的“好”示例?

5

在针对“C语言最佳用途”的问题之后。

Linux内核似乎是一款非常著名且备受推崇的C程序。但它是否是主流“最佳实践”C语言的好例子呢?

9个回答

19

我知道这可能会让人不爽,但是Linux内核是一个失控的学生项目。更严肃地说,从编程角度来看,Linux内核所做的好事情是制定了非常严格的设计和编码准则,使得非常多的人可以贡献代码而仍然保持一切协调一致。

我信任的那些专门从事操作系统工作的人告诉我,BSD内核是良好的C编程和操作系统设计的更好例子。我认识伯克利的教授,所以对这种说法并不感到惊讶。

更广泛地说,操作系统内核是高度专业化的东西——内核没有任何“主流”的东西。如果您想要良好C编程实践的例子,可以尝试Kernighan和Pike关于The Practice of Programming的书。或者如果您想研究一个真正的系统,Lua的实现足够小,您可以阅读所有内容,非常好地设计,并且非常易于移植——可以在任何具有ANSI C编译器的平台上运行。

很抱歉我的回答带有主观性和争议性 :(


1
我一点也不觉得你的建议会令人惊讶。我认为Linux的成功更多地是社会学而不是技术层面的。 - tsimon

16

你所说的好例子是什么意思? 我认为Linux内核是用C语言编写的非常出色的内核,但存在一些问题,其中许多问题正在得到解决。然而,就将其作为如何编写通用C代码的示例而言,我认为它并不完全适用。阅读和理解内核将教你很多关于C语言的知识。但你在内核中找不到任何可用的库。标准库是不可用的。因此,例如,你会看到“printk”而不是“printf”,等等。还有一些黑魔法。内核是一个非常特殊的情况。如果你要编写一些通用应用程序,如文件管理器或数据库,我不会使用它来寻找最佳实践。


9

是的,没错。

如果你不想被内核的细节淹没,可以从一些用C语言编写的Linux实用函数开始学习。查看这个问题的答案以了解如何获取源代码。

另一个阅读C源代码的好地方就是C语言自己的标准库

最后,我听说还有一个近期很受欢迎的C项目,那就是Git


标准C库对我来说也是一个很好的起点。 - Gustavo Rubio
1
Plauger写了一本书,其中包含C标准库的非常好的示例。http://www.amazon.com/Standard-C-Library-P-J-Plauger/dp/0131315099 - Bill the Lizard

3
我建议查看GNU工具(例如标准Unix实用程序'ls'和'awk'的源代码),因为它们更容易理解,而且很可能编写得更加清晰(内核对性能需求和兼容性关注不同于其他类型的软件)。

3

对于主流程序?不是。*nix内核代码通常不在userland中,因此具有与大多数“主流”编程不同的惯例和要求。然而,它是一些最好和最高质量的C代码,你可以从中学习。它有它的缺点,并不完全写得很好,但大部分情况下它是非常有效、清晰的代码。


1

如果从学习C的角度来看,那么可能对初学者来说会太过于压力山大。就C的使用而言,它最适用于需要可移植性和性能的应用程序。通常用于系统级编程。但这是以牺牲抽象为代价的。因此,与像Java或甚至C++这样的语言不同,您必须自己编写大部分代码。理想情况下,应用程序类型应确定语言选择,并且在操作系统方面,C是首选语言。

了解Linux内核的一种方法是从非常旧的Linux内核版本开始。这将包含实质内容并隐藏当前内核中存在的其他复杂性。这应足以理解基础知识。


我认为这个问题更多地涉及到使用 C 的最佳实践。 - BobbyShaftoe

1

这是否是“最佳实践”取决于你问的人是谁。在 Windows 平台上也有很多低级 C 程序编写,但如果你看一下它们(例如 WINDDK 的设备驱动程序示例),你会意识到微软已经成功地“发明”了另一种语言,他们称之为 C :-) 但是,如果你想在 Windows 上开发设备驱动程序,那么这些应该被视为“最佳实践”。


0

一个很好的方法是查看一些已经在使用中的开源编译器的代码。编写编译器需要良好的数据结构和指针技巧。


当然可以,只要你忽略GCC。但它并不是特别好。 - Cromulent

0

我认为内核是写模块化代码的很好例子。尽管它是用C编写的,但它有些面向对象。


虽然它实现“面向对象”的方式非常复杂,对于初学者来说绝对不是一个学习的好地方。我猜编译器会是在C语言中学习“面向对象”更好的地方。 - Vanwaril

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