1 poin oleh GN⁺ 3 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • crustc adalah demo yang mengonversi seluruh rustc 1.98.0-nightly (c712ea946 2026-06-16) menjadi 46 juta baris kode C; jika dibangun dengan GCC dan make, 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
  • cilly menanyai 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 cilly belum siap untuk penggunaan publik, dan bug terkait optimisasi juga masih dilacak

Demo mengonversi rustc ke C

  • crustc adalah repositori yang mengonversi rustc 1.98.0-nightly (c712ea946 2026-06-16) menjadi 46 juta baris kode C
  • Kode C ini dapat dibangun dengan GCC dan make, dan hasil build-nya menjadi compiler Rust yang berfungsi
  • Contoh eksekusinya: setelah menentukan path library LLVM, menjalankan ./rustc/rustc --version akan mencetak versi rustc 1.98.0-nightly yang sama
  • Compiler Rust yang dihasilkan dapat mengompilasi kode serta membangun core, alloc, dan std
  • 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

  • crustc adalah demo/teaser untuk cilly, toolchain compiler Rust-to-C baru
  • Keseluruhan toolchain cilly bertujuan mengompilasi kode Rust pengguna menjadi C untuk target arbitrer
  • Repositori ini dibuat untuk menunjukkan cilly mengompilasi compiler itu sendiri
  • cilly adalah 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_clr serta beberapa upaya privat, cilly adalah percobaan ke-14

Cara menghasilkan kode yang sesuai dengan compiler C

  • Fitur utama cilly adalah 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
  • cilly berupaya 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

Kode C per target dan batasan ABI

  • Kode C keluaran cilly bersifat spesifik per compiler
    • C cilly yang dihasilkan untuk Arm64 tidak bisa langsung dijalankan di riscv32
    • C cilly untuk riscv32 bisa dihasilkan secara terpisah
  • C hasil generasi rustc dalam repositori ini menargetkan ARM64 Linux karena ISA workstation penulis
  • Kode yang dihasilkan cilly pada umumnya kompatibel secara ABI dengan kode yang dikompilasi rustc biasa
  • Pada sebagian platform, rustc memilih 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, sret diteruskan melalui register yang sama dengan argumen pertama, sehingga argumen pertama dapat dijadikan pointer output
    • Di Arm64, pointer sret diteruskan 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

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
  • cilly membungkus rustc dan 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-none serta argumen /usr/bin/sdcc, -mz180, --std-c89, dan -c

Transparansi jaringan dan compiler C jarak jauh

  • cilly memiliki 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 rustc dijalankan di platform umum seperti Linux, lalu cilly berkomunikasi melalui jaringan
  • Penulis berhasil mengompilasi program Rust kecil untuk VM x86 Plan 9 sambil menjalankan rustc di Arm64 Linux
    • Output lingkungan Plan 9 adalah gnot osversion 2000 cputype 386
    • Hasil eksekusi /tmp/hello_plan9 adalah Hello, world!
    • Hasil nm menampilkan simbol rust_begin_unwind

Fitur pembuatan makefile

  • cilly secara 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
  • 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 -j20 dengan LLVM_LIB_DIR yang menunjuk ke path libLLVM.so.22.1-rust-1.98.0-nightly
  • CFLAGS berfungsi, 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
  • 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_driver pada LD_LIBRARY_PATH, lalu menjalankan ./rustc/rustc --version
  • Untuk membangun program umum, std harus dibangun
    • Jika std tidak ada, error error[E0463]: can't find crate for std akan muncul
    • Untuk build standard library, lihat BUILDING_STD.md
  • Sebagai bug yang diketahui, karena masalah normalisasi path yang aneh, crustc dapat crash saat dijalankan dari direktori tempat ia dibangun, yaitu root repositori
  • Di lokasi lain, ia berjalan normal

Status publik cilly

  • cilly belum 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 cilly belum dirilis adalah karena bug terkait optimisasi masih sedang dilacak

1 komentar

 
GN⁺ 3 jam lalu
Komentar di Lobste.rs
  • Menarik bahwa ini membuat program witness untuk memastikan apa saja yang didukung oleh compiler dan platform tertentu.
    Agak aneh rasanya bahwa rantai build C configure tradisional 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.
  • Sebagai perbandingan, Zig memiliki versi seluruh compiler Zig yang diterjemahkan ke C, dan ini merupakan bagian dari prosedur umum untuk membangun dari source.
    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.
  • Saya bukan programmer sistem, tetapi saya penasaran apakah proyek seperti ini bisa memengaruhi pilihan antara Rust dan Zig.
    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.
    • Tidak hanya dengan memakai 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. rustc sudah memiliki dukungan target yang luas, dan akan bertambah lagi melalui backend gcc.
      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.
  • Memang keren, tetapi bukankah pada akhirnya tetap dibatasi oleh kemampuan LLVM?
    • Saya tidak tahu kenapa harus begitu. crustc hanyalah contoh yang menunjukkan apa yang bisa dilakukan cilly, toolchain yang mengubah Rust menjadi C.
      Seluruh toolchain cilly mengompilasi kode Rust pengguna menjadi C untuk target sembarang. Repositori ini menunjukkan compiler yang mengompilasi dirinya sendiri karena menurut saya itu demonstrasi yang paling mencolok.
  • mrustc(https://github.com/thepowersgang/mrustc) juga layak dilihat. Itu adalah compiler Rust yang ditulis dalam C++, yang mentranspilasi ke C lalu menyerahkannya ke GCC, sehingga rustc juga bisa diubah menjadi C.