C言語で書かれたRustコンパイラ
(notgull.net)なぜCでRustコンパイラを書くのか?
-
最近活動が減っていた理由はいくつかある
- 家族の死などの個人的な出来事
- 職場での責任の増加
- オープンソースへの情熱の低下
- 新しいプロジェクトへの集中
-
このプロジェクトは純粋なCでRustコンパイラを書くというもの
- C++や
flex、yacc、Makefileなしで純粋なCで記述 - プロジェクト名はDozer
- C++や
なぜこんなことをするのか?
- ブートストラップとその重要性を理解する必要がある
- Rustコードを実行するにはコンパイラが必要
- Rustの主要コンパイラはrustc
- rustcはRustで書かれており、Rustコードをコンパイルするために必要
- rustcをコンパイルするには以前のバージョンのrustcが必要
- 初期バージョンのrustcはOCamlで書かれていた
- OCamlコンパイラはGuileでコンパイル可能で、GuileはCで書かれている
降下の原理
-
Bootstrappable Buildsプロジェクトの紹介
- 512バイトのバイナリシードから開始
- 単純なコンパイラから徐々により複雑なコンパイラを生成
- 最終的にTinyCC、GCC、Linuxなどをコンパイル可能
-
Rustはこの過程で非常に遅く登場する
- mrustcを使ってrustc 1.56バージョンをコンパイル
- C++導入以前にRustを使いたいなら不可能
-
DozerはCでブートストラップ可能なRustコンパイラを目指す
- TinyCCでブートストラップ可能であるべき
計画
-
この2か月間Dozerを開発
- TinyCCとcprocでコンパイル可能
- QBEをバックエンドとして使用
- 現在レキサと一部のパーサを完了
- マクロ/モジュール拡張は先送りしている
- 型チェックは
i32のみサポート - コード生成はまだ不十分
-
今後の計画
- Dozerを段階的に発展させ、基本的な
libcサンプル、libcore、rustcをコンパイル可能にする cargoに似たツールを作り、Rustパッケージをコンパイル可能にする- 自動生成されたコードを削除
- rustcと
cargoをコンパイルするプロセスを作成
- Dozerを段階的に発展させ、基本的な
GN⁺のまとめ
- この記事は純粋なCでRustコンパイラを書くプロジェクトについての話
- ブートストラップの重要性と、それを通じてRustコンパイラを作る過程を説明
- DozerプロジェクトはCでブートストラップ可能なRustコンパイラを目標としている
- このプロジェクトは非常に挑戦的で、成功するかどうかは不確かだが、試み自体に意義がある
1件のコメント
Hacker Newsのコメント
Rustをブートストラップするには、CでプロトRustを書き、その後プロトRustで完全なRustコンパイラを書くのがよい
趣味でRustでCコンパイラを書いており、"Small C Compiler"と呼んでいる
printf("Hello World!")を処理できるようになるまではオープンソース化する予定はないハードウェアにも同じブートストラップ問題が存在する
ブートストラップの利点を見つけるために4つのリンクをたどる必要があった
ブートストラップチェーンにC++が導入されると、ブートストラップはほぼ終わったようなもの
ターゲットシステム上で新しいバイナリを生成するには、rustcがそのシステムをサポートしている必要がある
SchemeでC++インタプリタやコンパイラを書くことを想像する
スタック全体を見ると、"trusting trust" 問題を回避する方法になりうる
バックエンドとしてQBEを使うのは気に入っている
ブートストラップ過程で、ツールチェーンの一部としてFORTHを使うことを検討してもよい