Dev*_*lar 23
这在OSDev Wiki中有明确说明.
基本上,您必须为某些事物(如RTTI,异常)实现运行时支持,或者不使用它们(只留下要使用的C++子集).
除此之外,C++是更复杂的语言,所以你需要有一些更有能力的开发人员,而不是搞砸它.当然,Linus Torvalds讨厌C++纯属巧合.
mar*_*rko 23
有很多用C++实现的常用操作系统(或部分)的例子 - IOKit - MacOSX和IOS的设备驱动子系统是用EC++实现的.然后是eCOS RTOS - 内核用C++实现,甚至使用模板.
操作系统传统上充斥着以C语言实现的OO概念的示例.在Linux设备模型kobject中实际上是驱动程序和设备对象的基类,完整的DIY v-table和一些在宏中实现的时髦安排.下铸造.
Windows NT内核具有更深入的内核对象继承层次结构.对于抱怨内核代码中异常处理的适用性的所有neigh-sayers,确实提供了这样的机制.
传统上,反对在内核代码中使用C++的论点是:
毫无疑问,使用异常和RAII范例将极大地提高内核代码质量 - 您只需要查看BSD或Linux的源代码以查看替代方案 - 使用gotos 实现的大量错误处理代码.
Sev*_*ive 10
为解决Torvalds的问题和其他地方提到的其他问题:在用C++编写的硬RT系统中,不使用STL/RTTI /异常,并且相同的主体可以应用于更宽松的Linux内核.关于"OOP内存模型"或"多态性开销"的其他问题基本上表明程序员从未真正检查在程序集级别或内存结构中发生的事情.C++是高效的,并且由于优化的编译器比C程序员编写查找表的效率高很多倍,因为他没有手头的虚函数.
在普通程序员手中,C++不会添加任何额外的汇编代码与C编写的代码.在阅读了大多数C++构造和机制的asm翻译之后,我会说编译器甚至有更多的空间来优化vs C,并且有时可以创建更精简的代码.因此,就性能而言,使用C++和C一样高效,同时仍然在C++中利用OOP的强大功能.
所以答案是它与事实无关,基本上围绕偏见而不是真正知道CPP创建的代码.我个人喜欢C几乎和C++一样多,我不介意,但是没有理由反对在Linux之上分层面向对象的设计,或者在内核本身,它会很好地完成Linux.
您可以用或多或少的语言编写OS内核.
但是,有几个理由喜欢C.
相比之下,C++可能是一种非常复杂的语言,它涉及到将大量日常高级OOP代码转换为机器代码所需的大量魔力.关于生成的机器代码更难以推理,当你需要开始调试恐慌的内核或片状设备驱动程序时,你的OOP抽象的复杂性将开始变得非常恼人......特别是如果你必须通过用户不友好的方式来做将端口调试到目标系统中.
顺便说一句,Linus并不是唯一对系统编程语言有强烈意见的操作系统开发人员; OpenBSD的Theo de Raadt也就这个问题做了一些选择.