据我所知, 即使常见的操作系统有部分是用其他语言编写的, 内核也完全是用C语言编写的。
我想知道是否可以用C++编写内核,如果不行,会有什么缺点。
据我所知, 即使常见的操作系统有部分是用其他语言编写的, 内核也完全是用C语言编写的。
我想知道是否可以用C++编写内核,如果不行,会有什么缺点。
有很多使用C ++实现的操作系统(或其部分)的良好示例- IOKit- MacOSX和IOS的设备驱动程序子系统是用EC ++实现的。然后还有eCOS RTOS-内核是用C ++实现的,甚至使用了模板。
传统上,操作系统中充满了在C中以艰难的方式实现的OO概念的示例。在Linux设备模型中,kobject
实际上是驱动程序和设备对象的基类,完整地具备DIY虚函数表和一些通过宏实现的奇特排列用于向上和向下转换。
Windows NT内核具有更深层次的内核对象继承层次结构。对于所有反对在内核代码中使用异常处理机制的人,正是提供了这样的机制。
传统上,反对在内核代码中使用C ++的论点有:
毫无疑问,使用异常和RAII范例会极大地提高内核代码质量-您只需查看BSD或Linux的源代码即可看到替代方案-大量的错误处理代码使用goto
实现。
这一点在OSDev Wiki中有明确说明。
基本上,你要么必须为某些事情(如RTTI、异常)实现运行时支持,要么不使用它们(只留下C++的一个子集可用)。
除此之外,C++是一种更复杂的语言,因此需要更具有竞争力的开发人员才能避免出错。当然,Linus Torvalds憎恨C++纯属巧合。
<vector>
之外没有任何东西可供选择,那我会选择它。在过去的15年中,我做的大部分工作都是用C++重新实现C代码(或者是由C / Java程序员编写的非常糟糕的C++代码,他们没有理解其中的区别),以使其更易于维护。我归咎于教师、在线教程和“试错”心态,而不是语言本身。 - DevSolar您可以使用任何语言编写操作系统内核。
但是,有几个原因更倾向于使用C语言。
相比之下,C++是一种潜在的非常复杂的语言,它涉及大量的“魔法”来将您日益高级的面向对象编程(OOP)代码转化为机器码。很难理解生成的机器码,当您需要开始调试紧急情况下的内核或不稳定的设备驱动程序时,OOP抽象的复杂性会变得非常恼人......尤其是如果您必须通过用户不友好的调试端口进入目标系统进行调试。
顺便说一下,Linus并不是唯一一个对系统编程语言有强烈看法的操作系统开发者; OpenBSD的Theo de Raadt也对此发表了一些选择性的言论。
多年后的修订:
回顾过去,我认为最大的问题实际上在于 C++ 中大量高级特性的存在,这些特性可能被隐藏或超出程序员的控制。标准并不强制要求以任何特定方式实现事物,即使大多数实现都遵循常见的理智,但有许多充分的理由要求100%明确并完全控制操作系统内核中的实现方式。
这样做可以(只要您知道自己在做什么)减少内存占用,根据访问模式优化数据布局而不是面向对象编程范例,从而提高缓存友好性和性能,并避免可能隐藏在 C++ 的大量高级特性中的潜在错误。
请注意,即使更简单的 C 语言在某些情况下也难以预测,这也是内核代码中存在大量平台特定汇编的原因之一。
unique_ptr
与抽象工厂单例包装器bean一样是OOP的应用,甚至更加重要。 - Kerrek SBfoo.do_something();
或者:
my_class_do_something(&foo);
C版本在每次使用foo时都明确指定了foo的类型。而在C++中,背后有很多模糊的“魔法”正在发生。因此,如果你只看一小段代码,可读性会大大降低。