Linux 内核大转变:是否将迈入现代 C++ 的时代?

Linux开发者 H. Peter Anvin 在邮件列表中重启了关于 Linux内核C代码转换为C++的讨论,并陈述了自己的观点。说之前先看一下这个话题的历史背景。

198e83c36a97cc49e06f75d32a24a3a0.png

早在2018年4月1日,Andrew Pinski提议将 Linux 内核源码转为 C++,在文中写道之所以引入是由于以下优点:

(1) 内联模板函数,使得诸如 cmpxchg() 和 get_user() 这样的功能的实现更加清晰。

(2) 内联重载函数,使得诸如 static_branch_likely() 这样功能的实现更加清晰。

(3) 类继承。例如,所有那些需要包含基本 inode 结构并且必须通过类似以下方式访问的 inode 封装器:

inode->vfs_inode.i_mtime

当你可以改为:

inode->i_mtime

本次重新开启这个话题,Anvin提到:

  • 自 1999 年以来,C 和 C++ 都有了很大的发展,事实上,在我个人看来,C++ 最终"成长"为一种更好的C,适合操作系统那样的嵌入式编程内核的缩影。我是说,作为内核中大量宏和内联汇编黑客的作者。

  • 真正让我这么说的是,我们最近要求的 gcc 特定扩展的很多东西实际上是在标准 C++ 中相对容易实现,并且在许多情况下,允许在无需全局代码更改的情况下改进基础设施。

  • 在我的选择中,C++14 是具有合理元编程支持的“最低”版本。没有早期版本的类型地狱(C++11 拥有大部分,但 C++14 填补了一些关键的缺失部分)。

  • 然而,在我看来,C++20 确实是主要的游戏规则改变者;尽管早期版本可以玩很多 SFINAE hacks,但它们也给出了绝对无用的信息作为错误消息。C++20 添加了概念,这使得实际上获得合理的错误成为可能。

从上面可以看出几个关键点:

  • C++成熟性

  • 标准C++的易用性

  • C++14和C++20的增强支持

  • 元编程的便利性

当然除了以上的内容之外,还有陈述了不选用Rust的原因,相比Rust,C++的语法更加熟悉,而且通过一些清理,现有的C代码可以逐步转换为C++。作者认为Rust的语法不仅不必要,而且内核开发人员需要花费大量时间来适应。

SUSE Lans的Jiri Slaby表示支持Linux内核采用C++的倡议。最初发布内核补丁的Red Hat的David Howells也回应,支持这次讨论。

我们将看到LKML(Linux内核邮件列表)上的这次讨论是否能够取得足够的进展,以支持现代C++代码——或者至少是Linux内核中的某个定义的C++14~20子集——在2024年及以后。过去,Linus Torvalds曾对C++表示强烈反感,但我们将看到是否潮水终于已经转变,他是否对最近的C++标准更为满意,或者他是否仍然坚决主张将Linux内核保持在C语言中。

直到2022年,Linux内核才开始从C89过渡到C11。特别是如果有共识允许在内核中使用C++14/C++20的子集,可能在将更广泛的编译器支持推出之前,还需要一些时间,然后才能提高基础编译器的要求。即使得到Torvalds的神奇认可,也不是一个轻率的决定。


相关引用:

https://lore.kernel.org/lkml/152261521484.30503.16131389653845029164.stgit@warthog.procyon.org.uk/ https://lore.kernel.org/lkml/1681813.1704843645@warthog.procyon.org.uk/ https://lore.kernel.org/lkml/3465e0c6-f5b2-4c42-95eb-29361481f805@zytor.com/ https://www.zhihu.com/question/639186621

往期干货:

未来已来:C++17 并行STL性能测评

热度更新,手把手实现工业级线程池

7cd1955452e9b514e2070c606ee05cfc.jpeg

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-17 05:20:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-17 05:20:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-17 05:20:02       87 阅读
  4. Python语言-面向对象

    2024-01-17 05:20:02       96 阅读

热门阅读

  1. TCP服务器和客户端的创建步骤

    2024-01-17 05:20:02       51 阅读
  2. 1.1 面试经典 150 题-合并两个有序数组

    2024-01-17 05:20:02       59 阅读
  3. 设计模式——组合模式

    2024-01-17 05:20:02       49 阅读
  4. js 什么是外边距重叠怎么解决

    2024-01-17 05:20:02       43 阅读
  5. 运维工程师常用的ChatGPT通用提示词模板

    2024-01-17 05:20:02       53 阅读
  6. ZZULIOJ 1130: 杨辉三角

    2024-01-17 05:20:02       43 阅读