crustc: Mengonversi seluruh rustc ke C
(github.com/FractalFir)crustcadalah demo yang mengonversi seluruhrustc 1.98.0-nightly (c712ea946 2026-06-16)menjadi 46 juta baris kode C; jika dibangun denganGCCdanmake, hasilnya adalah compiler Rust yang berfungsi- Tool dasarnya,
cilly, adalah backend compiler Rust yang mengompilasi Rust ke C, dan repositori ini dibuat sebagai showcase paling mencolok: compiler yang mengompilasi dirinya sendiri cillymenanyai tata letak tipe, ukuran, alignment, encoding karakter, format integer, dan lain-lain dari compiler C serta platform target melalui program witness, lalu menghasilkan kode C yang dapat diterima oleh compiler C tertentu- Tujuan utamanya adalah memungkinkan penggunaan Rust pada hardware lama atau tidak biasa yang tidak didukung LLVM/GCC tetapi memiliki compiler C; termasuk juga transparansi jaringan untuk berkomunikasi dengan compiler C jarak jauh melalui TCP
- C yang dihasilkan saat ini menargetkan ARM64 Linux, ISA workstation penulis; keseluruhan toolchain
cillybelum siap untuk penggunaan publik, dan bug terkait optimisasi juga masih dilacak
Demo mengonversi rustc ke C
crustcadalah repositori yang mengonversirustc 1.98.0-nightly (c712ea946 2026-06-16)menjadi 46 juta baris kode C- Kode C ini dapat dibangun dengan
GCCdanmake, dan hasil build-nya menjadi compiler Rust yang berfungsi - Contoh eksekusinya: setelah menentukan path library LLVM, menjalankan
./rustc/rustc --versionakan mencetak versirustc 1.98.0-nightlyyang sama - Compiler Rust yang dihasilkan dapat mengompilasi kode serta membangun
core,alloc, danstd - Selain kode C, kode ini menyertakan sebagian wrapper C++ LLVM
- Rust menggunakan C++ untuk mengekspos sebagian fitur LLVM
- Wrapper tersebut bergantung pada versi LLVM dan merepotkan untuk dibangun secara mandiri, sehingga disediakan dalam keadaan sudah dikompilasi
Peran cilly
crustcadalah demo/teaser untukcilly, toolchain compiler Rust-to-C baru- Keseluruhan toolchain
cillybertujuan mengompilasi kode Rust pengguna menjadi C untuk target arbitrer - Repositori ini dibuat untuk menunjukkan
cillymengompilasi compiler itu sendiri cillyadalah library Rust sekaligus backend compiler Rust; dengan kata lain, ia mengompilasi Rust ke C dalam bentuk plugin- Penulis menyatakan telah mengerjakan kompilasi Rust ke C selama 3 tahun terakhir, dan setelah upaya publik seperti
rustc_codegen_clrserta beberapa upaya privat,cillyadalah percobaan ke-14
Cara menghasilkan kode yang sesuai dengan compiler C
- Fitur utama
cillyadalah kemampuannya beradaptasi dengan compiler C - Ia dapat membuat program witness untuk memeriksa apa saja yang didukung oleh compiler dan platform tertentu
- Contohnya adalah
_Thread_local int KEYWORD_TLS_SUPPORTED;, yang hanya akan terkompilasi jika compiler C tersebut mendukung_Thread_local
- Contohnya adalah
cillyberupaya menghasilkan kode C yang dapat diterima oleh compiler C tertentu- Tata letak tipe, ukuran, alignment, encoding karakter, dan format integer adalah objek yang ditanyai
- Encoding karakter memeriksa apakah ASCII digunakan
- Format integer memeriksa apakah two's complement digunakan
- Jika memungkinkan, fallback digunakan
- Ia berusaha menghindari asumsi di luar ANSI C, dan menyediakan workaround untuk perilaku terkait standar C modern seperti strict aliasing
- Dalam kasus yang jarang, asumsi yang masuk akal seperti konversi bolak-balik
(void*)(uintptr_t)(ptr)mungkin diperlukan- Asumsi seperti ini didokumentasikan, dan jika memungkinkan ditambahkan assert seperti
CHAR_BIT = 8
- Asumsi seperti ini didokumentasikan, dan jika memungkinkan ditambahkan assert seperti
Kode C per target dan batasan ABI
- Kode C keluaran
cillybersifat spesifik per compiler- C
cillyyang dihasilkan untuk Arm64 tidak bisa langsung dijalankan di riscv32 - C
cillyuntuk riscv32 bisa dihasilkan secara terpisah
- C
- C hasil generasi
rustcdalam repositori ini menargetkan ARM64 Linux karena ISA workstation penulis - Kode yang dihasilkan
cillypada umumnya kompatibel secara ABI dengan kode yang dikompilasirustcbiasa - Pada sebagian platform,
rustcmemilih ABI yang tidak dapat diekspresikan dalam C, sehingga kompatibilitas penuh sulit dicapai - Di Arm64 ada batasan karena
sret, pointer pengembalian struct- Pada sebagian besar platform,
sretditeruskan melalui register yang sama dengan argumen pertama, sehingga argumen pertama dapat dijadikan pointer output - Di Arm64, pointer
sretditeruskan melalui register berbeda - Penulis menjelaskan bahwa compiler C native seharusnya memilih return-by-sret untuk struct kecil, tetapi tidak melakukannya untuk struct kecil berukuran kurang dari 16 byte
- Pada sebagian besar platform,
Dukungan untuk target lama atau tidak biasa
- Tujuan utama proyek ini adalah memungkinkan Rust digunakan pada hardware lama atau tidak biasa yang tidak didukung LLVM/GCC tetapi mendukung C
- Ketika suatu proyek berpindah dari Rust ke C, atau alternatif Rust untuk proyek C dibuat, kurangnya dukungan untuk target semacam itu dapat disebut sebagai kelemahan Rust
cillymembungkusrustcdan compiler C, lalu mengubah kode Rust menjadi C secara langsung- Dari sudut pandang pengguna, ini mirip dengan mendefinisikan compiler C yang akan digunakan untuk target tertentu
- Contoh konfigurasinya menggunakan triple
sdcc_z180-unknown-noneserta argumen/usr/bin/sdcc,-mz180,--std-c89, dan-c
Transparansi jaringan dan compiler C jarak jauh
cillymemiliki transparansi jaringan dan dapat berkomunikasi dengan compiler C melalui TCP- Jika diperlukan, ia dapat diperluas ke metode komunikasi yang lebih tidak biasa seperti UART
- Pendekatan ini dimaksudkan untuk menyelesaikan paradoks bootstrap pada platform yang tidak memiliki cross-compiler C
- Sebuah server C kecil dapat dibangun dan dijalankan di OS target, kemudian
rustcdijalankan di platform umum seperti Linux, lalucillyberkomunikasi melalui jaringan - Penulis berhasil mengompilasi program Rust kecil untuk VM x86 Plan 9 sambil menjalankan
rustcdi Arm64 Linux- Output lingkungan Plan 9 adalah
gnot osversion 2000 cputype 386 - Hasil eksekusi
/tmp/hello_plan9adalahHello, world! - Hasil
nmmenampilkan simbolrust_begin_unwind
- Output lingkungan Plan 9 adalah
Fitur pembuatan makefile
cillysecara opsional dapat menyisipkan marker ke dalam file objek dan menyimpan IR di direktori cache- Setelah itu, marker tersebut dapat dibaca untuk memisahkan fungsi dan global berdasarkan lokasi definisinya
- Berdasarkan informasi ini, ia menghasilkan direktori berisi makefile, sehingga Rust dapat dibangun hanya dengan compiler C dan
make
Syarat build dan eksekusi
- Sistem yang digunakan untuk build demo adalah ARM64 Linux berbasis Ubuntu
- String kernelnya adalah
Linux spark-2773 6.17.0-1021-nvidia ... aarch64
- String kernelnya adalah
- Informasi compiler C yang digunakan adalah GCC 13.3.0 dan Ubuntu LLD 18.1.3
- Untuk membangun, diperlukan library LLVM yang benar; cara termudah adalah memasang nightly terkait dengan
rustup install nightly-2026-06-16 - Perintah build menjalankan
make -j20denganLLVM_LIB_DIRyang menunjuk ke pathlibLLVM.so.22.1-rust-1.98.0-nightly CFLAGSberfungsi, tetapi sebagian flag dapat membuat kompilasi menjadi lambat- Optimisasi tidak disarankan
- Demo ini masih kasar dan optimisasi dapat menimbulkan masalah
- Pada skala sebesar ini, optimisasi memakan banyak waktu
- Tanpa optimisasi, build di mesin penulis selesai dalam beberapa menit
- Angka pengukurannya adalah
937.98s user,123.77s system,1352% cpu,1:18.48 total
- Angka pengukurannya adalah
- Jika optimisasi diaktifkan, sebagian besar kode lewat dengan cepat, tetapi dapat tersendat pada beberapa file Rust yang besar
Pengujian dan masalah yang diketahui
- Pengujian build dilakukan dengan menetapkan library LLVM nightly dan
./rustc_driverpadaLD_LIBRARY_PATH, lalu menjalankan./rustc/rustc --version - Untuk membangun program umum,
stdharus dibangun- Jika
stdtidak ada, errorerror[E0463]: can't find crate for stdakan muncul - Untuk build standard library, lihat
BUILDING_STD.md
- Jika
- Sebagai bug yang diketahui, karena masalah normalisasi path yang aneh,
crustcdapat crash saat dijalankan dari direktori tempat ia dibangun, yaitu root repositori - Di lokasi lain, ia berjalan normal
Status publik cilly
cillybelum siap untuk penggunaan publik- Penulis menyatakan berencana merilisnya secepat mungkin
- Alasan keterlambatan rilis disebutkan meliputi pekerjaan, tesis universitas, dan cedera tangan
- Salah satu alasan keseluruhan toolchain
cillybelum dirilis adalah karena bug terkait optimisasi masih sedang dilacak
1 komentar
Komentar di Lobste.rs
Agak aneh rasanya bahwa rantai build C
configuretradisional pada dasarnya bekerja dengan cara seperti ini, tetapi masuk akal jika compiler, atau transpiler, ini mengikuti pola tersebut.“Percobaan ke-14: cilly” menunjukkan kegigihan yang luar biasa, dan saya iri dengan ketekunan seperti itu.
Ukurannya 4,6 juta baris, jadi hampir tepat satu digit lebih kecil daripada proyek ini. Kode C yang dihasilkan berbeda menurut target, tetapi tidak berbeda menurut compiler.
Keunggulan Zig mencakup dukungan untuk berbagai target cross-compilation, toolchain yang self-hosted, serta LLVM sebagai dependensi opsional; janji bahwa Rust dapat dikompilasi menjadi C untuk platform langka juga terasa seperti sinyal yang mengarah ke kubu Zig.
crustc. Itu karena compiler yang sudah diterjemahkan juga hanya mendukung target kompilasi yang sama dengan compiler aslinya.Namun, proyek Rust lain memang bisa diterjemahkan ke C lalu dijalankan dan dikompilasi pada target yang hanya mendukung C.
Meski begitu, dampaknya jangan dilebih-lebihkan. Ini lebih mirip solusi yang agak merepotkan untuk masalah yang sangat niche.
rustcsudah memiliki dukungan target yang luas, dan akan bertambah lagi melalui backendgcc.Alat cross-compilation Zig memang keren, tetapi terutama meningkatkan kenyamanan, khususnya pada bagian C yang lebih merepotkan daripada Zig atau Rust; maknanya sebagai dukungan untuk lebih banyak target relatif lebih kecil.
Pada akhirnya, dukungan target Zig dan Rust sudah cukup mirip sehingga sulit menjadi faktor penentu, dan ada banyak perbedaan yang jauh lebih penting di antara kedua bahasa itu.
crustchanyalah contoh yang menunjukkan apa yang bisa dilakukancilly, toolchain yang mengubah Rust menjadi C.Seluruh toolchain
cillymengompilasi kode Rust pengguna menjadi C untuk target sembarang. Repositori ini menunjukkan compiler yang mengompilasi dirinya sendiri karena menurut saya itu demonstrasi yang paling mencolok.rustcjuga bisa diubah menjadi C.