电子产业一站式赋能平台

PCB联盟网

搜索
查看: 149|回复: 0
收起左侧

曾遭 Linus 炮轰“很烂”的 C++,现受开发者支持:Linux 内核应从 C 转到 C++!

[复制链接]

1077

主题

1077

帖子

1万

积分

论坛法老

Rank: 6Rank: 6

积分
11496
发表于 2024-2-20 08:30:00 | 显示全部楼层 |阅读模式

1zo0sbywfa06402027840.png

1zo0sbywfa06402027840.png

  ]' H5 m+ C( F- B1 ?) o1 e% R$ e最近有小伙伴说没有收到当天的文章推送,这是因为微信改了推送机制,有一部分小伙伴刷不到当天的文章,一些比较实用的知识和信息,错过了就是错过了,建议大家加个星标??,就能第一时间收到推送。
5 T! v, E" a. ?/ O

p0ovij0f0tv6402027941.png

p0ovij0f0tv6402027941.png

# W& t0 m4 @  e) T* a0 t+ q整理 | 屠敏
3 J# p' d* R& T出品 | CSDN(ID:CSDNnews)前有 C 语言当道,后有 Rust “杀入”,时下又有一场关于 C++ 才应该成为 Linux 内核语言的争论被旧事重提了。8 N4 b; v" G2 p/ u& ]
1 月 9 日,Linux 基金会技术顾问委员会成员、长期从事 Linux 内核开发的 H. Peter Anvin 写了一篇长长的 LKML(Linux Kernel Mailing List,Linux 内核邮件列表)帖子,推翻 Linus Torvalds 多年前的一句“C++ 真是一门很烂的语言”言论,其认为「现在是 Linux 内核从 C 语言转向 C++」的正确时机。
. T$ v1 [3 c- t

s0ijjg25w0o6402028041.png

s0ijjg25w0o6402028041.png

  n, m+ ?7 b3 E
  _8 J& O- S9 G8 n9 `( n

fj4jnthbeku6402028141.png

fj4jnthbeku6402028141.png
0 y3 ]3 c  n' M5 t- |
) b" K" P% d7 b5 r: o
重启停滞六年的讨论!5 e- y( s' O0 o8 @( y$ e
之所以称之为旧事重提,实际上,早在 2018 年 4 月 1 日,红帽工程师 David Howells 发布了一组 45 个补丁,开始将 Linux 内核转换为 C++。这将允许主线内核使用内联模板函数、内联重载函数、类继承以及其他目前 Linux 内核的 C 代码不支持的功能。
1 @& |% Q* x. d; h4 i; J, j

kuchlew2srt6402028241.jpg

kuchlew2srt6402028241.jpg
9 e+ G. D' F5 C7 B6 g4 Y
但是彼时因为诸多因素,讨论未能进行下去,最终那些补丁在 Linux 内核邮件列表上停留了六年,没有引起太多关注。4 n& o: ~  a2 V: P# K& v
时间回到当下,作为 Linux 内核的重要参与者,H. Peter Anvin 发现了这条帖子的存在,他表示,红帽工程师 David Howells 在 2018 年分享这个观点时,在不少人来看,要么是个玩笑,要么可能被当成了玩笑。- H* E8 \# R2 m. s- |
不过,结合时下最新的 C++20 等版本来看,其率直地表示,“大家好,我要捅马蜂窝,做一件亵渎神明的事...我认为它有其合理性,我将在此尝试分享我的观点。”; a$ X- X# H- b

kgxnmriirmu6402028341.png

kgxnmriirmu6402028341.png

& o, M7 e0 v0 u  E; Y现在是将 Linux 内核的 C 转为 C++ 的最好时机?( H' o! L6 s' a( E: o
H. Peter Anvin 认为,自 1999 年以来,C 和 C++ 都有了长足的发展,而站在其视角,他发现 C++ 终于“长大”了,对于操作系统内核所体现的嵌入式编程而言,它是一种更好的 C 语言。9 K: Z" }: V  ^: u  X) x
“我是作为内核中大量宏和内联汇编 Hacks 的作者才这么说的”,H. Peter Anvin 说道,“让我有此感觉的真正原因是,Linux 最近提出的许多针对 GCC 扩展的要求,其实在标准 C++ 中很容易实现,而且在许多情况下,无需修改全局代码即可改进基础架构。”
9 ]0 y$ u) b5 c3 P* ]( g+ @- R& gH. Peter Anvin 表示:
0 x& S7 A% m: D' c% I" G
  • C++14 是拥有合理元编程支持的“最低”版本,它拥有大部分元编程支持,却没有早期版本的类型地狱(C++11 拥有大部分元编程支持,但 C++14 填补了一些关键缺失)。
  • 此外,C++20 才是真正改变游戏规则的主要因素。虽然早期版本可以使用大量 SFINAE hacks(Substitution Failure Is Not An Error,是 C++ 语言中的一种特性,允许开发人员在编译时根据类型条件来选择模板的特化版本),但它们也提供了完全无用的错误信息。C++20 增加了一些概念,这使得真正获得合理的错误信息成为可能。
    : }# O$ I5 X# N2 \- D, O& q
    在对 Linux 的不断实践中,H. Peter Anvin 透露,其在 Linux 内核中进行了大量的元编程,这些代码通常使用一些极其糟糕的宏定义来实现,而且几乎无法调试。例如 uaccess.h 中的类型欺骗,其中一些是 H. Peter Anvin 设计和编写的。
    - n' Y' ^! |, m相比之下,C++ 可以通过各种类型转换和 case 语句将其分解成单独的模板实例,而且通过一些巧妙的方法,还可以严格地强制区分用户空间指针与内核空间指针、已验证与未验证过的用户空间指针等事项,更不用说轻松处理 64 位内核中 32 位用户空间类型的情况,并强制执行字节序转换。
    % R* G3 M. v, Z" r: \, Z' W3 w6 N5 f3 l+ z. _% F! k$ F

    z110t35wi1c6402028441.png

    z110t35wi1c6402028441.png
    $ w  |9 c7 r0 m
    " F3 t+ F9 _' S* D7 }. y' u- g2 d6 ]
    Linus 曾怒喷:“C++ 真是一门很烂的语言”
    4 A0 n1 k, E7 p; H! H在 H. Peter Anvin 看来,C++ 已经有了不少改进,现在让 Linux 内核去尝试 C++ 语言,未尝不是一件坏事。6 H' h* ^  @) F, q* e
    但是,在不少网友眼中,此事估计有点悬,毕竟曾经还年轻、脾气也火爆的 Linus Torvalds 在多个场合公开吐槽过 C++。4 m! Y& c7 Q0 [' l1 Q
    在 2007 年,有位名为 Dmitry Kakurin 的开发者查看了 Git 源代码发现使用的是纯 C 而非 C++ 后表示不可理解,另外还附带了一句脏话。当 Linus 知晓此事后,直接进行了反击还怒批道,C++ 是一门糟糕的语言。它之所以糟糕,是因为有很多水平一般的程序员使用它,导致代码质量低下。
      M9 |% c' j1 F) \# C那时的 Linus 也给出了自己不看好在 Linux 内核上用 C++ 的几层理由:
    - w  r$ u4 g* U" D  @
  • 使用  C++ 库(例如 STL 和 Boost)可能会带来问题。这些库可能不稳定、不兼容,而且使用时可能会出错。
  • 过度依赖抽象对象模型,会导致代码难以优化,甚至需要重写。
  • 同时,C++ 的一些优势在注重性能的项目中反而会带来弊端。
    7 P+ ]! v9 |% ]0 m3 }; M
    2010 年,Linus 又在邮件列表中开始吐槽 C++,无论什么时候 C++ 都不可能是最正确的选择,在系统编程里直接用 C 就可以,而在非系统编程里,有很多垃圾收集的语言可供选择,而 C++ 只能用来捣乱。7 q  _% @  J" G+ H: |9 L6 t
    近两年间,脾气开始转好的 Linus 不仅减少了说脏话的频次,也在 Linux 内核中接纳了另一门编程语言 Rust。
    : y0 j0 F; U8 v7 z  S* I2 ^2021 年,Linux 内核和 Rust on Linux 的主要开发者 Miguel Ojeda 向 Linux Kernel 邮件列表提交了一个新补丁,其中指出为 Linux 内核增加对 Rust 作为第二语言的支持。! @$ p& G" L- f
    对于此举,有网友提出质疑,即当代码调用不安全函数时,Rust 的内存安全就得不到保证了,而目前几乎所有内核 API 都在其中。  C+ z4 J, X$ Z: h7 ~0 Z
    同时网友给出一个用 C++ 代替 Rust 的解决方案时,Linus 依然忍不住地说道:“C++ 根本解决不了 C 语言的问题,它只会让事情变得越来越糟。那些不喜欢 C 语言的人可以去寻找真正能给你带来价值的语言。比如具有内存安全性并可以避免 C 导致的隐患的语言,或者具有内部 GC(垃圾回收)支持并简化内存管理的语言。”
    . W8 h" o# o- B) u相比对 C++ 的不看好,Linus 对 Rust 则有耐心得多。在不久前的 Open Source Summit Japan 2023 上,Torvalds 谈到 Linux 中 Rust 的最新进展,“它一直在成长,但我们还没有内核的任何部分真正依赖 Rust。对我来说,Rust 是技术上有意义的事情之一,但对我个人来说,更重要的是,作为内核和开发人员,我们不能停滞不前。”
    ( n3 n' w# Q& G! X& y3 ^: d, Z+ j尽管如此,Torvalds 继续说道:“Rust 还没有真正成为下一个伟大的事物。但我认为,在明年,我们将开始集成驱动程序,甚至一些主要的子系统也将开始积极使用 Rust。因此,要让它成为内核的重要组成部分,还需要数年时间。但它肯定会成为内核的一部分。9 M% l) I* C; ]" \! n9 ?! ]

      g& E, K. D9 S7 X7 a2 ]) }& @

    wxxxxclassb6402028541.png

    wxxxxclassb6402028541.png
    ; z+ E! d# j# M) B
    3 ?1 B6 g% a3 w* z! G0 e. n* ]
    H. Peter Anvin 不用 Rust 重写 C 代码的观点
    # H' w" f2 |3 U: i7 Y, |+ A" t3 o然而,在最新的讨论中,H. Peter Anvin 似乎并不看好 Rust 在 Linux 内核中的使用。2 H$ f  W+ @6 ~; X
    他补充说道,至于为什么不用 Rust 重写 C 代码:7 ?( {" L1 i0 }6 x( k  y/ m# a
    首先,Rust 使用的是不同的语法,不仅所有内核开发人员都需要非常熟悉才能获得与 C 相同的“感觉”,而且将 C 代码转换为 Rust 并不是一件可以零敲碎打的事情,而现有的 C 代码经过一些清理就可以编译为 C++。/ ~/ R  ]9 ^1 Q9 b, R6 j
    不过,H. Peter Anvin 也在帖子中特别指出,没有一个正常人会期望使用 C++ 的所有功能。就像 Linux 内核中有“kernel C”(目前是 C11 的一个子集,包含一组相对较大的允许编译器特定扩展)一样,H. Peter Anvin 认为也可以有“Kernel C++”,他建议它是 C++20 的一个严格定义的子集,包含一组类似的编译器扩展。" O* q/ b7 s2 E" U7 t, X$ I
    “我意识到,由于显而易见的原因,C++20 的编译器支持仍然非常新,因此至少其中一些是前瞻性的”,H. Peter Anvin 说道。6 c6 c4 w. t7 j  g

    wgdg21srxvs6402028641.png

    wgdg21srxvs6402028641.png

    # M6 X9 v) S1 X: ?! w; n拭目以待 + w- S' S- X+ b/ ?
    众所周知,Linux 内核主要是用 C 语言编写的,但也包含了少量的汇编语言代码,加上 Linux 内核支持 Rust 的工作也在不断增加,现在又提出要用 C++ 来写,无疑也引起了巨大的争议。% t- _: J, W  @+ }9 }  I
    对于最新提案,据外媒 phoronix 报道,SUSE Lans 的 Jiri Slaby 表示支持 Linux 内核的 C++ 计划。最初发布内核补丁的红帽公司的 David Howells 也表示支持这一讨论。7 Q0 T9 h) Y1 a- Q3 e
    也有很多网友表示支持:
    ; E, |+ r, A2 }9 X; A我完全同意。就像他们已经在使用 C11 标准的子集一样,Linux 也可以迁移到现代 C++ 的子集上。如果 OOP、异常或 RTTI 在内核中没有意义的话,Linux 就不需要使用它们,但用更安全的模板元编程和概念来取代 C 语言中容易出错的宏,会让错误较少的代码编程变得更容易。% ~0 g7 s1 J! z" t- [. {
    SerenityOS 目前使用的是一种非常独特的现代 C++ 编程风格,并带有一个自定义标准库。7 f( z; P" A) J$ A3 h
    我希望 Linus 对 C++ 的看法在过去二十年中有所改变,因为从那时起,C++ 已经成为一种大不相同(而且更好)的语言。+ T" y: {( b6 }% c' R$ U' C
    在 HN 上,不少开发者却持相反意见:
    & X/ s* P2 C5 C0 Y
  • 现代 C++ 并没有解决 Linus 最初反对它的理由。我也不同意添加 C++ 比使用 Rust 更省力的说法。C 和 C++ 已经天差地别。了解 C 意味着你基本可以用 C++ 编写 C(而且只是基本),但这并不意味着你了解 C++ 了。也许在 30 年前,你可以向 C 程序员展示 C++ 是如何编译成 C 语言的,这就足以让 C 程序员开始对 C++ 大加挞伐,但那一天早已过去。至于让内核开发人员学习 Rust 更容易还是学习 C++ 更容易,考虑到内核开发人员几乎需要学习 C++ 的全部内容、每一个怪癖和每一个细节,老实说,Rust 在这方面还是有优势的。
  • 我希望他们能选择与 C++ 不同的东西,也许是 Zig。C++ 的问题在于,就像 Scala 一样,你很难坚持使用一个子集,而不会在事后意识到你使用了超出预期的内容。也许内核团队可以做到这一点,因为他们有一种保持简洁的文化。
    2 J: I. {1 X" t+ K- \
    虽然目前还不清楚是否有足够的力量将其变为现实,但 Linux 内核邮件列表已经重新开始讨论未来将 Linux 内核 C 代码转换为 C++ 的可能性,很多人也想了解 Linus 对此的观点是否随着时间的推移以及 C++ 的改进迭代而发生了变化,我们也将对 LKML 讨论的结果拭目以待。
    ! p  I5 i- X3 Q6 L% H参考:
    5 m1 }5 x( ^+ m5 l; E1 _( k( Nhttps://lore.kernel.org/lkml/3465e0c6-f5b2-4c42-95eb-29361481f805@zytor.com/
    5 d$ m. O- \. shttps://lwn.net/Articles/249460/
    5 t' U$ l1 D; n  u( x, i* ~https://news.ycombinator.com/item?id=38939151/ |) q) n: ?* P$ q  t7 C8 R; I
    https://www.phoronix.com/news/CPP-Linux-Kernel-2024-Discuss' e6 M7 p9 f9 v7 a1 |
    编程资源&影视资源分享近期发现了一份 20T各类编程/影视/学习资源的腾讯文档,其中除了互联网编程学习资源外,还有不少影视资源,分享给各位:; |, @( Z4 o* G% _
    ! ]" A1 U% t; T. x; Q

    s3fcbiakxpe6402028741.png

    s3fcbiakxpe6402028741.png
    0 a1 T7 P) n3 M: v
    8 {: F- I- B0 e" D$ e6 B, g

    kolcykh20fa6402028841.png

    kolcykh20fa6402028841.png

    : }% @, e: m9 k9 W' x8 _+ g6 |5 T) P5 s8 ]6 {3 f0 u: D0 K; K

    riqom5hshiw6402028942.png

    riqom5hshiw6402028942.png
    & E  q: N8 u& Z1 C% L7 P+ ?
    资源链接:http://1v9.xyz/1NbXud (右键复制到浏览器地址栏打开),或者点击文末「阅读原文」也可查看。
    0 \- B: m4 y* d9 U欢迎你添加我的微信,我拉你进技术交流群。此外,我也会经常在微信上分享一些好用工具、白嫖福利、各类资源以及工作体验,还有一些内推机会。
    ( G! {9 F4 _) }" y9 {8 p+ V

    4t4o2wfkei46402029042.png

    4t4o2wfkei46402029042.png
    & `# n6 }( r3 w2 ~
    加个微信,打开另一扇窗( ?, J& ~3 `' R& V2 \

    2xgtnrwf54v6402029142.gif

    2xgtnrwf54v6402029142.gif
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表