wrecc
عبارة عن مترجم صغير الحجم x86-64 C99 مكتوب من الصفر. الاسم عبارة عن تلاعب بكلمة "حطام" التي تصف سفينة صدئة في قاع البحر. يصدر المترجم تجميع x86-64 في بناء جملة AT&T، وهو يلتزم بـ System V ABI الذي يمكنني اختباره فقط مع Ubuntu وMacos. لا توجد تبعيات، فأنت تحتاج فقط إلى المجمّع والرابط الذي يستدعيه المترجم لإنشاء الملف الثنائي النهائي.
إذا لم تكن سلسلة أدوات الصدأ مثبتة على نظامك، فيمكنك تثبيت أحدث إصدار ثنائي (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
فإنه يطبع شجرة التحليل
كود ج | أست |
---|---|
#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
) إذا كنت تريد مساعدتي في هذا المترجم فأنا أرحب به حقًا. ربما يكون أسهل مكان للبدء هو تنفيذ إحدى الكلمات الرئيسية/الأنواع المفقودة المذكورة في قسم الميزات غير المنفذة. تأكد من اجتياز جميع الاختبارات وتنفيذ الاختبارات الخاصة بك إذا كان شيئًا جديدًا لم يتم اختباره بالفعل.
قم بإلقاء نظرة على الوثائق للحصول على نظرة عامة عالية المستوى على مسار برنامج التحويل البرمجي.
ساعدتني الموارد التالية في بناء هذا المترجم: