用C ++实现C标准库

假设OS /内核是用C ++编写的,不会“做”任何纯C风格的东西,而是公开构建在完善的C ++标准库上的C标准库。 这可能吗? 如果没有,为什么?

PS:我知道C库是“C ++的一部分”,但我们可以说它是基于基于C ++的实现。

小更新:似乎我已经激起了关于我的规则“允许”的讨论。 一般来说:C标准库实现应该尽可能使用C ++ / Right (tm) 。 我主要考虑算法并在幕后对静态类对象进行操作。 我并没有真正排除任何语言function,而是试图将重点放在理智的C ++实现上。 关于setjmp示例,我认为没有理由为什么有效的C(将使用其他预先在C ++ C库部件中实现或根本不使用任何其他库函数)这将违反我的“规则”。 如果C ++库中没有对应物,为什么要讨论它的使用。

我没有理由为什么你不能这样做,但我也没有理由为什么有人会使用这样的实现。 它会比正常的实现使用更多的内存,并且至少有点慢……虽然它可能没比glibc差多少,glibc的stdio实现本质上已经是C ++ …(查找GNU libio 。 ..你会感到恐惧。)

是的,这是可能的。 这很像是从用C ++,FORTRAN,汇编程序或大多数其他任何语言编写的库中导出C API。

实际上,由于c ++能够支持许多翻译时结构,如表达模板,因此c ++能够以多种方式比c 更快 。 由于这个原因,c ++矩阵库往往比c更优化,涉及更少的临时,展开循环等。使用新的c ++ 0xfunction,如变体模板,例如,printf函数可能比它更快,类型安全。 c中实现的版本。 我甚至能够尊重许多c结构的接口并评估它们的一些参数(比如字符串文字)翻译时间。

不幸的是,许多人认为c比c ++更快,因为许多人使用OOP来表示所有关系和使用必须通过大型inheritance层次结构,虚拟调度等发生。这导致一些早期比较与被认为是良好用法的那些完全不同。天。 如果您在适当的地方使用虚拟分派(例如内核中的文件系统,它们通过函数指针构建vtable,并且通常基本上在c中构建c ++),那么c和c以及所有新function都不会让人失望,可以明显更快。

速度不仅是可能的改进,而且有些地方的实施将受益于更好的类型安全性。 c中有一些常见的技巧(比如在必须是通用的情况下在void指针中存储数据)会打破类型安全性,而c ++可以提供强大的错误检查。 这并不总是通过c库的接口转换,因为它们具有固定的类型,但它肯定会对库的实现者有用,并且可以在一些可能从调用中提取更多信息的地方提供帮助通过提供“as-if”接口(例如,接受void *的接口可以实现为通用接口,其概念检查参数可隐式转换为void *)。

我认为这将是对c ++相对于c的强大考验。

鉴于“纯C的东西”与C ++有如此大的重叠,我没有看到你如何完全避免它在任何东西,更不用说操作系统内核了。 毕竟, +操作是“纯C的东西”吗? 🙂

也就是说,你当然可以使用类和诸如此类的东西来实现某些C库函数。 使用std :: sort实现qsort? 好没问题。 只是不要忘记你的extern "C"

像Linux这样的内核具有非常严格的ABI,基于系统调用,ioctl,文件系统,并且符合相当多的标准(POSIX是主要标准)。 由于ABI必须稳定,因此其表面也是有限的。 这将是很多工作(特别是因为你需要一个最低限度有用的内核),但这些标准可以用任何语言实现。

编辑:您也提到了libc。 这不是内核的一部分,并且由于前面提到的ABI,libc的语言可能与内核的语言完全无关。 与内核不同,libc需要为C或具有非常好的ffi用于C语言。使用extern C部分C ++符合要求。