wrecc
adalah kompiler C99 x86-64 kecil dan ramping yang ditulis dari awal. Nama tersebut merupakan plesetan dari kata bangkai kapal yang menggambarkan sebuah kapal berkarat di dasar laut. Kompiler mengeluarkan perakitan x86-64 dalam sintaks AT&T, ia mematuhi System V ABI yang hanya dapat saya uji untuk Ubuntu dan Macos. Tidak ada ketergantungan, Anda hanya memerlukan assembler dan linker yang kemudian dipanggil oleh kompiler untuk membuat biner akhir.
Jika Anda belum memasang rantai alat karat di sistem, Anda dapat memasang biner terbaru (MacOs, Linux) langsung dari rilisnya:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PhilippRados/wrecc/releases/download/v0.2.0/wrecc-installer.sh | sh
Menggunakan cargo binstall
cargo binstall wrecc
atau membangun dari sumber
cargo install wrecc
Karena tidak semua kata kunci saat ini diimplementasikan, wrecc menggunakan header standar khusus yang dibuat langsung ke dalam biner
Praprosesor mengimplementasikan semua arahan praprosesor C99, kecuali #line
, #error
dan #pragma
. Yang paling menonjol saat ini adalah makro tersebut juga tidak memiliki fungsi seperti makro yang ada dalam agenda.
struct {
union {
int foo ;
long baz ;
} nested ;
int array [ 16 ];
} bar = { . nested . foo = 3 , . array [ 6 ] = 1 };
#include
typedef int ( * BinaryOperation )( int , int );
typedef struct {
BinaryOperation add ;
BinaryOperation subtract ;
} Calculator ;
int add ( int a , int b ) { return a + b ; }
int subtract ( int a , int b ) { return a - b ; }
int main () {
Calculator calc = { add , subtract };
printf ( "Result of addition: %dn" , calc . add ( 10 , 5 ));
printf ( "Result of subtraction: %dn" , calc . subtract ( 10 , 5 ));
}
char * * string_offset = ( char * * ) & "hello" + ( int )( 3 * 1 );
int array [( long ) 3 * 2 - 1 ];
Selain kata kunci yang hilang, berikut adalah fitur utama yang hilang:
Berikut adalah daftar semua hal yang masih hilang: tugas
Wrecc juga memiliki pesan yang terlihat bagus. Pelaporan kesalahan tidak berhenti setelah kesalahan pertama. Dengan menggunakan opsi --no-color
Anda dapat menonaktifkan penyorotan warna jika terjadi kesalahan. Saat ini hanya ada kesalahan dan tidak ada peringatan.
kode C | Kesalahan |
---|---|
int foo ( void );
int main () {
int a = foo ( 1 );
long * p = a ;
return p * 2 ;
} |
Saat mengkompilasi menggunakan opsi --dump-ast
ia akan mencetak pohon parse
kode C | AST |
---|---|
#define SIZE 16
void foo ( char );
int main () {
int arr [ SIZE ] = { 1 , 2 };
char p = ( char )( * arr + 3 );
switch ( p ) {
case 'c' :
foo ( p );
}
} | |
wrecc --help
cargo test --workspace
Ini menjalankan semua perlengkapan dan membandingkannya dengan snapshot yang diharapkan
bash tests/snapshot_tests.sh
Jalankan fuzzer menggunakan afl.rs
// in fuzzer directory
cargo afl build
cargo afl fuzz -i inputs -o outputs target/debug/fuzz_target
Alasan wrecc
tidak berfungsi dengan baik di mesin Anda:
-L
) Jika Anda ingin membantu saya dengan kompiler ini, saya akan sangat menyambutnya. Tempat termudah untuk memulai mungkin dengan menerapkan salah satu kata kunci/jenis yang hilang yang disebutkan di bagian fitur yang belum diterapkan. Pastikan semua pengujian masih lulus dan terapkan pengujian Anda sendiri jika itu adalah sesuatu yang baru yang belum diuji.
Lihat dokumentasi untuk mendapatkan gambaran umum tingkat tinggi tentang pipeline kompiler.
Sumber daya berikut membantu saya dalam membangun kompiler ini: