wrecc
เป็นคอมไพเลอร์ x86-64 C99 ขนาดเล็กที่เขียนตั้งแต่เริ่มต้น ชื่อนี้เป็นการเล่นคำว่า ซากเรือ ซึ่งหมายถึงเรือที่เกิดสนิมบนพื้นทะเล คอมไพเลอร์ส่งเสียงแอสเซมบลี x86-64 ในรูปแบบไวยากรณ์ของ AT&T โดยเป็นไปตาม System V ABI ซึ่งฉันสามารถทดสอบได้เฉพาะกับ Ubuntu และ Macos เท่านั้น ไม่มีการขึ้นต่อกันที่คุณต้องการเพียงแอสเซมเบลอร์และตัวเชื่อมโยงซึ่งคอมไพเลอร์เรียกใช้เพื่อสร้างไบนารีสุดท้าย
หากคุณไม่ได้ติดตั้ง toolchain สนิมบนระบบของคุณ คุณสามารถติดตั้งไบนารีล่าสุด (MacOs, Linux) จากรุ่นได้โดยตรง:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/PhilippRados/wrecc/releases/download/v0.2.0/wrecc-installer.sh | sh
การใช้ cargo binstall
cargo binstall wrecc
หรือสร้างจากแหล่งที่มา
cargo install wrecc
เนื่องจากปัจจุบันมีการใช้งานคำหลักบางคำ wrecc จึงใช้ส่วนหัวมาตรฐานที่กำหนดเองซึ่งสร้างไว้ในไบนารีโดยตรง
พรีโปรเซสเซอร์ใช้คำสั่งพรีโปรเซสเซอร์ C99 ทั้งหมด ยกเว้น #line
, #error
และ #pragma
ที่โดดเด่นที่สุดคือขณะนี้ยังขาดมาโครที่มีลักษณะคล้ายฟังก์ชันซึ่งอยู่ในวาระการประชุม
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 ];
นอกเหนือจากคีย์เวิร์ดที่หายไปแล้ว ยังมีคุณสมบัติหลักที่ขาดหายไปอีกด้วย:
นี่คือรายการของทุกสิ่งที่ยังขาดหายไป: สิ่งที่ต้องทำ
Wrecc ยังมีข้อความที่ดูดีอีกด้วย การรายงานข้อผิดพลาดจะไม่หยุดหลังจากข้อผิดพลาดครั้งแรก การใช้ตัวเลือก --no-color
คุณสามารถปิดการเน้นสีเมื่อมีข้อผิดพลาดได้ ขณะนี้มีเพียงข้อผิดพลาดและไม่มีคำเตือน
รหัสซี | ข้อผิดพลาด |
---|---|
int foo ( void );
int main () {
int a = foo ( 1 );
long * p = a ;
return p * 2 ;
} |
เมื่อคอมไพล์โดยใช้ตัวเลือก --dump-ast
มันจะพิมพ์ parse-tree
รหัสซี | อสท |
---|---|
#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
การดำเนินการนี้จะรันโปรแกรมการแข่งขันทั้งหมดและเปรียบเทียบกับสแน็ปช็อตที่คาดหวัง
bash tests/snapshot_tests.sh
รัน fuzzer โดยใช้ afl.rs
// in fuzzer directory
cargo afl build
cargo afl fuzz -i inputs -o outputs target/debug/fuzz_target
สาเหตุที่ wrecc
ทำงานไม่ถูกต้องบนเครื่องของคุณ:
-L
) หากคุณต้องการช่วยฉันเกี่ยวกับคอมไพเลอร์นี้ ฉันยินดีเป็นอย่างยิ่ง จุดเริ่มต้นที่ง่ายที่สุดน่าจะเป็นโดยการใช้คำหลัก/ประเภทที่ขาดหายไปซึ่งกล่าวถึงในส่วนคุณสมบัติที่ยังไม่ได้ใช้งาน ตรวจสอบให้แน่ใจว่าการทดสอบทั้งหมดยังคงผ่านและดำเนินการด้วยตนเองหากเป็นสิ่งใหม่ที่ยังไม่ได้ทดสอบ
ดูเอกสารประกอบเพื่อดูภาพรวมระดับสูงของไปป์ไลน์คอมไพเลอร์
แหล่งข้อมูลต่อไปนี้ช่วยฉันในการสร้างคอมไพเลอร์นี้: