Seorang pembangun telah berjaya menyelesaikan perjalanan selama tiga bulan untuk menterjemah keseluruhan terminal multiplexer tmux dari C kepada Rust secara manual. Projek ini, dipanggil tmux-rs, merupakan satu usaha yang besar yang mengurangkan kod asas daripada kira-kira 65,000 baris kod C kepada 40,000 baris kod Rust sambil mengekalkan fungsi penuh.
Perbandingan Pengurangan Kod
- Kod asli C: ~65,000 baris
- Terjemahan Rust: ~40,000 baris
- Pengurangan: ~38% kurang baris kod
- Masa terjemahan: 3 bulan (proses manual)
Cabaran Alat Terjemahan Automatik
Pembangun pada mulanya cuba menggunakan C2Rust, sebuah transpiler automatik yang menukar kod C kepada Rust. Walau bagaimanapun, pendekatan ini terbukti bermasalah. Kod Rust yang dihasilkan adalah bertele-tele, sukar diselenggara, dan dipenuhi dengan pemeriksaan keselamatan yang tidak perlu serta operasi pointer mentah yang menjadikannya lebih sukar untuk digunakan berbanding kod C asal. Selepas bergelut dengan pemfaktoran semula manual output yang ditranspil, pembangun meninggalkan pendekatan ini sepenuhnya dan memilih untuk menterjemah setiap fail secara manual dari awal.
C2Rust adalah alat yang secara automatik menukar kod C kepada Rust, tetapi sering menghasilkan kod yang sukar untuk diselenggara.
Alat Terjemahan yang Dicuba
- C2Rust: Transpiler automatik - ditinggalkan kerana output yang tidak dapat diselenggara
- Cursor AI: Dicuba pada pertengahan pembangunan - dihentikan kerana masa yang dihabiskan untuk menyemak kod yang dijana
- Terjemahan manual: Pendekatan akhir yang digunakan - proses fungsi demi fungsi
Proses Terjemahan Fungsi demi Fungsi
Daripada menterjemah keseluruhan fail sekaligus, pembangun memperhalusi pendekatan mereka untuk bekerja pada fungsi individu. Kaedah ini melibatkan penyalinan header fungsi C, mengulas pelaksanaan C asal, dan kemudian menulis yang setara dalam Rust. Kod C kemudiannya akan dipautkan dengan pelaksanaan Rust menggunakan atribut kompiler khusus. Pendekatan berperingkat ini membolehkan pengesahan dan penyahpepijatan yang lebih baik sepanjang proses.
Penyahpepijatan Isu Integrasi Kompleks
Proses terjemahan mendedahkan beberapa pepijat menarik yang menyerlahkan cabaran integrasi merentas bahasa. Satu isu yang ketara melibatkan deklarasi fungsi tersirat dalam C, di mana kompiler mengandaikan jenis pulangan yang salah untuk fungsi Rust. Pepijat lain berpunca daripada definisi medan struct yang tidak sepadan antara C dan Rust, menyebabkan pelanggaran akses memori apabila kedua-dua bahasa mempunyai pandangan yang berbeza terhadap struktur data yang sama.
Cabaran Teknikal yang Dihadapi
- Deklarasi fungsi tersirat yang menyebabkan jenis pulangan yang tidak betul
- Ketidakpadanan medan struct antara definisi C dan Rust
- Pengurusan penunjuk mentah dan blok kod tidak selamat
- Integrasi struktur data intrusif dan makro
- Pelaksanaan parser menggunakan crate Lalrpop
Sambutan Komuniti dan Rancangan Masa Depan
Komuniti pengaturcaraan telah menunjukkan reaksi bercampur terhadap projek ini. Walaupun ramai yang menghargai nilai pendidikan dan dokumentasi telus pembangun mengenai proses tersebut, yang lain mempersoalkan faedah praktikal menulis semula perisian yang stabil dan diselenggara dengan baik. Sesetengah pembangun menyatakan kebimbangan tentang memperkenalkan pepijat baru ke dalam kod yang telah teruji dalam pertempuran, manakala yang lain melihat potensi untuk penambahbaikan masa depan.
Pemahaman saya ialah, walaupun tmux-rs ditulis dalam bahasa yang lebih selamat, ia masih tidak dapat mengalahkan kestabilan projek lama yang teruji dalam pertempuran dan diselenggara dengan baik yang ditulis oleh sekumpulan pembangun yang sangat cekap.
Pembangun mengakui bahawa versi Rust semasa masih menggunakan blok kod tidak selamat yang meluas, menjadikannya tidak jauh lebih selamat daripada pelaksanaan C asal. Fasa seterusnya projek ini bertujuan untuk menukar kod asas kepada Rust yang selamat, yang akan memberikan faedah keselamatan memori yang terkenal dengan Rust.
Memandang ke Hadapan
Walaupun menghadapi cabaran dan keraguan komuniti, tmux-rs mewakili kajian kes yang menarik dalam terjemahan kod berskala besar. Projek ini menunjukkan kedua-dua kemungkinan dan batasan alat serta teknik terjemahan semasa. Untuk pengguna yang berminat dengan terminal multiplexer, projek ini menawarkan alternatif fungsional kepada tmux tradisional, walaupun ia mungkin mengambil masa untuk mencapai kestabilan dan kebolehpercayaan kod asas asal.
Projek lengkap tersedia di GitHub, dan pembangun menggalakkan penglibatan komuniti melalui perbincangan dan sumbangan. Sama ada projek hobi ini akan mendapat penerimaan yang lebih luas masih belum dapat dipastikan, tetapi ia pastinya memberikan wawasan berharga tentang kerumitan memodenkan kod asas C warisan.
Rujukan: Introducing tmux-rs