Linuxカーネルメーリングリストでは、カーネル内でのプログラミング言語「Rust」の使用に関し、活発な議論が続いています。
Linuxの生みの親であるLinus Torvalds氏はこれまで、Rust使用に関するLKMLでの議論にほとんど参加せず、静観する立場をとってきましたが、ついにこの議論に口を挟むことを決めたようです(Phoronix)。
Linus氏は、数日前、メンテナの反対を押し切って、Rustコードをカーネルにマージすると「プライベートで」発言したと報じられていましたが、今回は、Rust反対派のChristoph Hellwig氏への返信の中で、メンテナは、「カーネル内で自身が管理する領域における Rust バインディングに積極的に関与するか、あるいは一切関与せずに補完的なものとして扱うかを選ぶことができる」ものの、「Rustのコードが自分の管理するCコードの"ユーザー"であることを理由に、新しいRustのコードに異議を唱えることはできない」と説明しています。
すなわち、Linuxカーネルのメンテナは、提案されたRustのコードが、「自分のコードの利用者だから」という理由で、それを一方的にブロックすることはできないと説明したのです。
Linus氏は次のように説明しています。
私は期待していましたし、この長いスレッドが何か建設的な結果をもたらすのか見守っていましたが、どうやら話が後退しているようです(少なくとも前進はしていない)。
事実として、あなたが異議を唱えたプルリクエストはDMAレイヤーには一切手を加えていません。
それは単にDMAの新しい利用者を追加しただけであり、完全に別のサブディレクトリにあるもので、あなたが管理しているコードには 一切の変更を加えていません。
にもかかわらず、あなたが新しいユーザーがあなたのコードを使うことに文句を言い、その上でこうした完全に無意味な議論を持ち出すことに、私は非常に困惑しています。
正直に言うと、あなたの言い分は「DMA のメンテナとして、私は DMA コードの利用用途を決める権限がある」と言っているのと同じです。
しかし、それはまったくもって間違っています。
このままいくと、次は「このドライバでは DMA を使えない、なぜなら私はそのデバイスが好きではないし、DMA メンテナとして誰が DMA コードを使うかを決める権限がある」とでも言い出すのでしょうか?
それは まさに あなたが Rust のコードに対してやろうとしていることです。
あなたは Rust に反対の立場を取っている。それは問題ありませんし、誰もあなたに Rust のコードを書けとも読めとも強制していません。
しかし、その立場をもって Rust のコードがあなたの管理するコードを利用することすら許されない というのは、まったくの筋違いです。
はっきりさせておきますが、もしあなたがメンテナとして「誰が何に自分のコードを使うかを決める権限がある」と思っているなら、それは 間違いです。
私はあなたの技術力を尊敬していますし、一緒に仕事をするのは好きです。
また、私はイエスマンを求めているわけではありませんし、あなたが私の誤りを指摘してくれることも歓迎しています。私も時々馬鹿げたことを言うので、それを指摘してくれる人が必要です。
しかし、今は あなた の誤りを指摘させてもらいます。
このメールは「Rust に関する方針」の話ではありません。これは もっと根本的な問題 です。メンテナとしてあなたはコードの管理をする立場ですが、そのコードの 利用者や利用方法を決める権限はありません。
Rust を好きになる必要はありませんし、気にする必要もありません。それは最初から明確にされていたことであり、誰も突然新しい言語を学ぶことを強制されるわけではありませんし、C だけを扱いたい人は今まで通り C だけを扱い続けることができます。
さて、あなたの主張の核心に戻りましょう。
「このドキュメントは、どのサブシステムも Rust を受け入れることを強制されないと主張している」
これは 完全にその通り です。
あなたは Rust のコードを受け入れる必要はありませんし、DMA コードに関して Rust のコードを気にする必要もありません。 無視すればいいのです。
しかし、「Rust を無視する」ということは、「Rust に対して発言権を持たない」ということでもあります。
両方を都合よく使うことはできません。「私は Rust とは関わりたくない」と言いながら、「Rust のコードは私の管理する C のインターフェースを利用できない」と主張するのは矛盾しています。
Rust の側に関わりたいメンテナは関わることができ、そうすることで Rust のバインディングがどうあるべきかについて発言権を持つことになります。つまり、Rust のインターフェースの管理者にもなるということです。
一方で、「Rust には関わりたくない」と言うメンテナは Rust のバインディングに対して責任を持つ必要はありません。しかし、それと同時に Rust 側のことに 口出しもできません。
C のインターフェースを変更すれば、Rust の開発者が対応し、Rust のバインディングを修正することになります。その約束があるからこそ、「Rust に関わらなくてもいい」という仕組みが成り立っているのです。
しかし、この「Rust に関わらなくてもいい」という仕組みは双方向に働きます。Rust に関わらないのであれば、Rust のコードに 口を出す権利もない ということです。
言い換えれば、「誰も Rust に関わることを強制されない」 ということは、 「誰もが Rust のコードを拒否する権利を持つ」 という意味ではない ということです。
わかりますか?
ただし、私はこの話を完全な二元論にするつもりはありません。ここでは話を単純化して「Rust バインディングのメンテナになるか、完全に無関係を貫くか」のように述べましたが、実際にはそれほど厳密な線引きではないでしょう。
Rust のバインディングを 認識しつつ、協力する意思はあるが積極的に関与するわけではない、という立場のメンテナもいるでしょう。
つまり、「完全に関わるか、完全に無視するか」という二択ではなく、柔軟な対応が可能なのです。
Linus
LinuxカーネルにRustを導入しようとする提案は2020年ごろから活発化しました。Rustはメモリ安全性を重視する言語で、安全性の向上やバグ削減が期待されるため、一部の開発者がカーネル内でのRustの使用を積極的に推進していったのです。
主な目的は、カーネル内でのメモリ管理や競合状態のバグを減らし、安全なドライバやモジュールの開発を可能にすることで、Linux 6.1でRustの初期実装がマージされ、Rustを用いたカーネルコードの記述が正式に可能となりました。
ただし現段階では、Linuxカーネルの中核部分にはRustは使われておらず、主にドライバなどの周辺コードの実装を目的としています。
最近はカーネルの重要部分へRustを導入しようという動きがあり、古参のメンテナとの対立が発生していました。Hellwig氏は、DMA(Direct Memory Access)関連のコードのメンテナで、DMA APIのRustコードからの利用を拒否していましたが、Linus氏はそれに対し、ユーザーがRustだからといって拒否することはできないという見解を示したようです。
Linuxの神である、Linus Torvalds氏が立場を明確化したことで、この議論が収まることになるのか注目です。