1 poin oleh GN⁺ 2024-08-26 | 1 komentar | Bagikan ke WhatsApp

Mengapa menulis kompiler Rust dalam C?

  • Ada beberapa alasan mengapa aktivitas saya belakangan ini berkurang

    • Peristiwa pribadi seperti kematian anggota keluarga
    • Bertambahnya tanggung jawab di tempat kerja
    • Berkurangnya gairah terhadap open source
    • Fokus pada proyek baru
  • Proyek ini adalah menulis kompiler Rust murni dalam C

    • Ditulis murni dalam C tanpa C++, flex, yacc, atau Makefile
    • Nama proyeknya adalah Dozer

Mengapa melakukan ini?

  • Kita perlu memahami bootstrapping dan pentingnya
    • Untuk menjalankan kode Rust, dibutuhkan kompiler
    • Kompiler utama Rust adalah rustc
    • rustc ditulis dalam Rust dan diperlukan untuk mengompilasi kode Rust
    • Untuk mengompilasi rustc, dibutuhkan versi rustc yang lebih lama
    • Versi awal rustc ditulis dalam OCaml
    • Kompiler OCaml dapat dikompilasi dengan Guile, dan Guile ditulis dalam C

Prinsip penurunan

  • Pengenalan proyek Bootstrappable Builds

    • Dimulai dari seed biner 512-byte
    • Secara bertahap menghasilkan kompiler yang lebih kompleks dari kompiler sederhana
    • Pada akhirnya dapat mengompilasi TinyCC, GCC, Linux, dan lainnya
  • Rust muncul sangat terlambat dalam proses ini

    • Menggunakan mrustc untuk mengompilasi rustc versi 1.56
    • Jika ingin menggunakan Rust sebelum pengenalan C++, itu tidak memungkinkan
  • Dozer menargetkan kompiler Rust yang dapat di-bootstrap dengan C

    • Harus bisa di-bootstrap dengan TinyCC

Rencana

  • Mengerjakan Dozer selama dua bulan terakhir

    • Dapat dikompilasi dengan TinyCC dan cproc
    • Menggunakan QBE sebagai backend
    • Saat ini lexer dan sebagian parser sudah selesai
    • Perluasan macro/modul sedang ditunda
    • Pemeriksaan tipe hanya mendukung i32
    • Pembuatan kode masih belum memadai
  • Rencana ke depan

    • Mengembangkan Dozer secara bertahap agar dapat mengompilasi sampel libc dasar, libcore, dan rustc
    • Membuat alat mirip cargo agar dapat mengompilasi paket Rust
    • Menghapus kode yang dibuat secara otomatis
    • Membuat proses untuk mengompilasi rustc dan cargo

Ringkasan GN⁺

  • Tulisan ini membahas proyek untuk menulis kompiler Rust murni dalam C
  • Menjelaskan pentingnya bootstrapping dan proses membuat kompiler Rust melalui pendekatan itu
  • Proyek Dozer menargetkan kompiler Rust yang dapat di-bootstrap dengan C
  • Proyek ini sangat menantang, dan meski keberhasilannya belum pasti, upayanya sendiri sudah bermakna

1 komentar

 
GN⁺ 2024-08-26
Komentar Hacker News
  • Untuk melakukan bootstrap Rust, tampaknya lebih baik menulis proto-Rust dalam C terlebih dahulu, lalu menulis kompiler Rust penuh dengan proto-Rust

    • Proto-Rust tidak memiliki borrow checker atau dukungan macro, tidak membebaskan memori, dan tidak perlu menghasilkan kode yang bagus
    • Proto-Rust pada dasarnya adalah C dengan sintaks Rust
    • Saya penasaran mengapa jalur ini tidak dipilih
  • Sebagai hobi, saya sedang menulis kompiler C dalam Rust, dan menyebutnya "Small C Compiler"

    • Menggunakan Cranelift sebagai backend, dan arsitektur kompiler dibuat dapat dipasang sebagai plugin serta mudah diutak-atik
    • Belum ada rencana open source sampai bisa menangani printf("Hello World!")
    • Saya sedang berusaha mengimplementasikan preprocessor dan parser, serta terlibat dalam rust-peg dan HimeCC
    • Saya penasaran dengan solusi akademis untuk masalah typedef
  • Masalah bootstrap yang sama juga ada pada hardware

    • Komputer dibuat dengan komputer dan perangkat lunak yang telah dibuat sebelumnya
    • Ini topik yang menarik untuk dipikirkan
  • Saya harus mengikuti 4 tautan untuk menemukan manfaat dari bootstrap

    • Saya berharap bagian "mengapa" pada judul akan menjelaskan alasannya
  • Jika C++ diperkenalkan ke rantai bootstrap, bootstrap itu praktis sudah berakhir

    • Jika ingin memakai Rust, itu harus dilakukan sebelum C++ diperkenalkan
    • Akan bagus jika kompiler Rust bisa di-bootstrap dari C
    • Namun versi-versi rustc sebelumnya dikompilasi dengan versi rustc sebelumnya
    • Kompiler OCaml dapat berhasil dikompilasi dengan Guile
    • Penulis tampaknya ingin menghilangkan tahap C++ dan lebih memilih tahap C
    • Motivasi penulis kurang jelas
  • Untuk menghasilkan biner baru pada sistem target, rustc harus mendukung sistem tersebut

    • Jika dukungan itu ditambahkan ke rustc, maka rustc bisa membangun dirinya sendiri
  • Saya membayangkan menulis interpreter atau kompiler C++ dalam Scheme

    • Dari Scheme langsung ke gcc saat ini akan menjadi jalan pintas yang sangat besar
    • Namun kebijaksanaan umum mengatakan bahwa menulis kompiler C++ itu nyaris mustahil
  • Jika melihat keseluruhan stack, ini bisa menjadi cara untuk menghindari masalah "trusting trust"

  • Saya suka penggunaan QBE sebagai backend

    • Menarik untuk melihat perbandingannya dengan Rust dan LLVM
    • Semoga berhasil
  • Patut dipertimbangkan untuk menggunakan FORTH sebagai bagian dari toolchain dalam proses bootstrap