2024年又讨论是否将Linux内核从C转换为现代C++

2024年又讨论是否将Linux内核从C转换为现代C++

💡 原文中文,约1200字,阅读约需3分钟。
📝

内容提要

最近,Linux内核邮件列表讨论重新引发了将Linux内核转换为支持现代C++代码的可能性。一些资深的Linux开发人员认为,现代C++的特性可以改进内核基础设施,并提供更好的错误消息。尽管过去Linus Torvalds反对C++,但现在有人支持将Linux内核转换为C++代码的讨论,并可能在2024年后实现。

🔎

延伸解读

C++20 概念:错误信息改善的关键

文章指出,C++20 的概念(concepts)是改变游戏规则的主要因素。早期 C++ 版本虽然可以通过 SFINAE 技巧实现元编程,但错误信息几乎无用。C++20 的概念使得编译器能够给出合理的错误提示,这对于内核开发中大量使用模板和宏的场景尤为重要。开发者认为,这能显著提升内核基础设施的可维护性。

为何不选 Rust:迁移成本与语法差异

文章对比了 C++ 与 Rust 的迁移路径。Rust 语法不同,内核开发者需要重新熟悉才能达到与 C 相同的“感觉”,且将 C 代码转换为 Rust 并非零敲碎打,必须经过清理。而现有 C 代码可以快速编译为 C++,迁移成本更低。这解释了为何讨论聚焦于 C++ 而非 Rust。

内核 C++ 子集:严格定义与前瞻性

开发者建议定义“内核 C++”,即 C++20 的一个严格子集,类似当前的“内核 C”(C11 子集加编译器扩展)。这意味着不会使用 C++ 全部功能,而是精选适合内核的特性。文章也承认,C++20 的编译器支持仍较新,部分设想具有前瞻性,实际落地需等待工具链成熟。

❓

Q&A

Linux内核最近为什么又讨论用C++?

因为一些资深开发者认为现代C++(尤其是C++14和C++20)的特性可以改进内核基础设施,并提供更好的错误消息,所以重新引发了将内核转换为C++的讨论。

Linux内核如果转C++,会使用哪个C++标准?

讨论中建议最低版本是C++14,而C++20被认为是改变游戏规则的主要因素,因此会采用严格定义的C++20子集作为“内核C++”。

为什么开发者认为C++20对内核特别重要?

C++20引入的概念(concepts)可以提供合理的错误信息,而早期版本虽然能用SFINAE技巧,但错误信息完全无用,因此C++20能显著改善内核开发体验。

为什么不用Rust重写内核而是考虑C++?

因为Rust语法不同,所有内核开发者需要非常熟悉才能获得与C相同的“感觉”,且将C代码转换为Rust需要清理,不能零敲碎打;而现有C代码可以快速编译为C++。

Linus Torvalds对内核用C++的态度有变化吗?

过去Linus Torvalds强烈反对C++,但现在有人支持将Linux内核转换为C++代码的讨论,并且可能在2024年后实现,表明态度有所松动。

内核C++会使用C++的所有功能吗?

不会,就像当前有“内核C”(C11的子集加编译器扩展)一样,会有一个严格定义的“内核C++”子集,基于C++20并包含类似的编译器扩展,不会使用C++的所有功能。

🏷️

标签

➡️

继续阅读