これは何
Rustプログラミング言語のコンパイラ開発の歴史を中心にまとめたものです。
Rust (programming language) - Wikipedia を参考にしています。
想定読者
プログラミング言語やコンパイラの基本的な概念に興味がある方
話すこと / 話さないこと
話すこと:
- Rustコンパイラの開発の歴史的経緯
- OCamlからRust Self-hosting compilerへの移行
- コンパイラに関連する基本的な用語の説明
話さないこと:
- Rustの言語仕様や文法の詳細
- 具体的なRustプログラミングの方法
- コンパイラの内部実装の詳細
- RFC(Request for Comments)プロセスやRust Foundationの組織的な側面
用語
まずは基本的な用語の説明をします。
コンパイラ
プログラミング言語で書かれたソースコードを、コンピュータが実行できる形式(機械語)に変換するソフトウェアのことです(ただ、近年は高級言語間で変換する処理について行うものもコンパイラと呼ぶことがあります)。
LLVM
コンパイラのバックエンドとして広く利用されているコンパイラ基盤の一つで、任意のプログラミング中間表現(IR: Intermediate Representation)を様々なターゲットアーキテクチャの機械語に変換することができます。LLVMはLow Level Virtual Machineの略です。
具体的なソースコードは llvm/llvm-project: The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. で公開されています。
Self-hosting compiler
その言語自身で書かれたコンパイラのことです。開発初期は既存の言語で書かれたコンパイラを使い、ある程度言語が成熟した段階で、その言語で書かれたコンパイラに置き換えることが多いです。
自分自身でコンパイラを書くことで、その行為自体が言語のテストとなったり、コンパイラの開発者やバグ報告者がコンパイルされる言語だけを知っているだけで十分であったりといった利点があります。
Channel
他のスレッドとデータをやり取りするための通信手段の一つで、メッセージパッシングを利用してプロセス間の通信を行うためのモデルです。
歴史(コンパイラ開発を中心に)
Rust (programming language) - Wikipedia を参考に、Rustのコンパイラの開発の歴史を振り返ります。
Rustの起源 2006-2009
Wikipediaによると、Graydon Hoareが2006年にMozillaで個人的なプロジェクトとしてRustの開発を始められ、初期にRustのコンパイラはOCamlで書かれていたようです。
実際のコンパイラのコードは見つけることができませんでした。
Mozillaの支援開始 と コンパイラの移行 2009-2012
2009年より、Mozillaが正式にRustの開発を支援し始めました。
そして、OCamlで書かれたコンパイラからLLVMを利用したRust自身のSelf-hosting compilerへと移行が完了しました。そして、所有権システムは2010年に導入されました。
Wikipediaにはその後のRFCプロセスの導入やCOVID-19によるRust Foundationの設立についても記載がありますが、ここではコンパイラの開発に関する内容に絞っています。
cargoの登場 2012-
2013年まではGCが存在していたが、所有権システムを優先して削除されました。
また、言語をシンプルにするためにchannelの構文サポートなどが削除されました。
削除されたとありますが、標準ライブラリとしては引き続き利用可能のようで、どの意味で削除されたと明記されているのかはいまいちわかりませんでした。
そして、パッケージマネージャであるcargoも導入されました。
2015年には安定版のRust 1.0がリリースされました。
その1年後の2016年には、1400人を超えるコントリビュータが集まり、パッケージの数は5000を超えました。
おわりに
Self-hosting compilerへの移行は、言語の成熟とともに行われることが多いですが、Rustの場合も例外ではなく、言語の設計と実装が進む中で重要なステップとなりました。
そのため、Rustの開発をする際にはRustさえ知っていればコンパイラの開発に参加できるようになり、コミュニティの拡大と活性化に寄与しました。
個人的な感想
- LLVMをバックエンドに利用しているため、LLVMの知識がなくてもRustのコンパイラの開発に参加できるかどうかは気になりました。おそらく、パフォーマンスチューニングや特定のアーキテクチャ向けの最適化を行う場合にはLLVMの知識が必要になると思いますが、基本的なコンパイラの開発には不要なのかもしれません。具体的な参加方法は、 rust-lang/rustc-dev-guide: A guide to how rustc works and how to contribute to it. で解説されているため、興味がある方は参照してみてください。