1 ポイント 投稿者 GN⁺ 2024-08-26 | 1件のコメント | WhatsAppで共有

なぜCでRustコンパイラを書くのか?

  • 最近活動が減っていた理由はいくつかある

    • 家族の死などの個人的な出来事
    • 職場での責任の増加
    • オープンソースへの情熱の低下
    • 新しいプロジェクトへの集中
  • このプロジェクトは純粋なCでRustコンパイラを書くというもの

    • C++やflexyaccMakefileなしで純粋なCで記述
    • プロジェクト名はDozer

なぜこんなことをするのか?

  • ブートストラップとその重要性を理解する必要がある
    • 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をコンパイルするプロセスを作成

GN⁺のまとめ

  • この記事は純粋なCでRustコンパイラを書くプロジェクトについての話
  • ブートストラップの重要性と、それを通じてRustコンパイラを作る過程を説明
  • DozerプロジェクトはCでブートストラップ可能なRustコンパイラを目標としている
  • このプロジェクトは非常に挑戦的で、成功するかどうかは不確かだが、試み自体に意義がある

1件のコメント

 
GN⁺ 2024-08-26
Hacker Newsのコメント
  • Rustをブートストラップするには、CでプロトRustを書き、その後プロトRustで完全なRustコンパイラを書くのがよい

    • プロトRustには借用チェッカーやマクロのサポートがなく、メモリを解放せず、良いコードを生成する必要もない
    • プロトRustはRust構文を持つCのようなもの
    • なぜこのルートが選ばれなかったのか気になる
  • 趣味でRustでCコンパイラを書いており、"Small C Compiler"と呼んでいる

    • バックエンドにCraneliftを使っており、コンパイラアーキテクチャはプラグ可能でハックしやすい
    • printf("Hello World!") を処理できるようになるまではオープンソース化する予定はない
    • プリプロセッサとパーサの実装に取り組んでおり、rust-pegとHimeCCに関わっている
    • typedefの問題について、学術界の解決策が気になる
  • ハードウェアにも同じブートストラップ問題が存在する

    • コンピュータは、以前に作られたコンピュータとソフトウェアによって作られる
    • 考えてみる価値のある興味深い話題
  • ブートストラップの利点を見つけるために4つのリンクをたどる必要があった

    • タイトルの「なぜ」の部分がその理由を説明してくれると期待していた
  • ブートストラップチェーンにC++が導入されると、ブートストラップはほぼ終わったようなもの

    • Rustを使うなら、C++導入前に使うべき
    • RustコンパイラがCからブートストラップできればよいのにと思う
    • しかし以前のバージョンのrustcは以前のバージョンのrustcでコンパイルされる
    • OCamlコンパイラはGuileでうまくコンパイルできる
    • 著者はC++段階を取り除き、C段階を好んでいる
    • 著者の動機は明確ではない
  • ターゲットシステム上で新しいバイナリを生成するには、rustcがそのシステムをサポートしている必要がある

    • rustcにそのサポートを追加すれば、自分自身をビルドできる
  • SchemeでC++インタプリタやコンパイラを書くことを想像する

    • Schemeから現在のgccへ直接行くのは大きな近道になるだろう
    • しかしC++コンパイラを書くのはほとんど不可能だというのが一般的な見解
  • スタック全体を見ると、"trusting trust" 問題を回避する方法になりうる

  • バックエンドとしてQBEを使うのは気に入っている

    • RustとLLVMとの比較を見るのは面白そう
    • 幸運を祈る
  • ブートストラップ過程で、ツールチェーンの一部としてFORTHを使うことを検討してもよい