Linux での C++ の使用が再び提案されました
のようだ 第二言語としてのRustの導入 プログラミング Linux カーネルにおける最も重要な変更の 1 つは、 これは Linux が持っていたものであり、機能の範囲については話していませんが、Linus Torvalds と開発チームが Linux をより良いものに最新化するために重要な一歩を踏み出した非常に重要な出発点となりました。
これは最近になってから注目できることですが、 Linux カーネル メーリング リストについて 議論が復活しました これは 1 年前に開始され、冗談めかして 2018 年 XNUMX 月 XNUMX 日を表していました。
そして再びテーブルの上に戻されました。 「Linux カーネルに最新の C++ コードを採用することの実現可能性」の問題、アセンブラーフラグメントを使用した従来の C 言語の使用を超え、Rust 言語を推進します。
最初の提案は 2018 年に開始されましたが、 Red Hat エンジニアによる 冗談として 有名なエイプリルフールのお祝いのため、多くの人がこの機会を利用してコミュニティにいたずらを仕掛けます。当時、コミュニティはテンプレートの使用、クラスの継承、 C++ 関数のオーバーロード。
私の意見では、C++14 は妥当なメタプログラミング サポートを備え、以前のバージョンの型を含まないほとんどのバージョンです (C++11 にはほとんどの型がありましたが、C++14 はいくつかの重要な欠落部分を埋めています)。しかし、私の意見では、C++20 は実際に最大のゲームチェンジャーです。以前のバージョンでは多くの SFINAE ハックを実行できましたが、まったく役に立たないエラー メッセージも表示されました。
私たちは Linux カーネルで多くのメタプログラミングを行っており、多くの場合非常に恐ろしいマクロ トリックを使用して実装されています。これらをデバッグすることも事実上不可能です。 uaccess.h タイプのハックの例を見てみましょう。そのうちのいくつかは私が設計し、作成しました。 C++ では、さまざまなキャストと case ステートメントを個別のテンプレート インスタンスに分割でき、少し工夫することで、ユーザー空間ポインターとカーネル ユーザー空間ポインターのようなものを厳密に適用したり、すでにマークされたユーザー空間ポインターとマークされていないユーザー空間ポインターを厳密に適用したりすることもできます。 32 ビット カーネルでの 64 ビット ユーザー空間タイプの処理とエンディアン変換の適用が簡単になることは言うまでもありません。
今、 この約6年後、ハンス・ピーター・アンヴィンは、 主要なインテル カーネル開発者であり、syslinux、klibc、LANANA などのプロジェクトの作成者、 彼は議論を続けるために率先して取り組んだ。アンビン氏によると、1999 年以来、C 言語と C++ 言語の開発は大幅に進歩しており、C++ 言語はオペレーティング システムのカーネル開発には C よりも適していることが証明されています。
アンヴィン 以前は特定の拡張機能が必要だった機能について言及 GCCから、 標準 C++ で簡単に実装できるようになりました。 多くの場合、C++ を使用すると、コードを完全に変更することなくインフラストラクチャが改善されます。
それに加えて、 少なくとも C++ 14 仕様を使用することが提案されています。 これにはメタプログラミング ツールが含まれており、エラーの発生を減らすことができる概念のサポートを導入する C++ 20 仕様の使用が推奨されています。
Rust よりも C++ の方が望ましいと主張されています。後者は C 言語とは構文が大きく異なるため、現在のカーネル開発者にとっては一般的ではなく、段階的なコードの書き換えができません。 C++ 言語の場合、C コードを C++ としてコンパイルできるのと同様に、C 言語コードの一部を段階的に変換することができます。
Linux カーネルは主に C コードであり、さまざまな部分がアセンブリで書かれており、Linux カーネルでの Rust サポートをめぐる取り組みが拡大していますが、Linux カーネルの C コードが見られる可能性について、これが現実となるのに十分な重みがあるかどうかはまだ不明です。将来的には C++ に変換されます。
最後にあなたが それについてもっと知りたい、詳細はで確認できます 次のリンク。