AMACC هو مترجم بنية ذراع 32 بت مبنية من الصفر. إنه بمثابة نسخة مجردة من C ، مصممة كأداة تربوية للتعرف على المترجمين والروابط والمحمل.
هناك وضعان تنفيذ ينفذ AMACC:
تجدر الإشارة إلى أن AMACC مصمم لتجميع مجموعة فرعية من C اللازمة للمضيف الذاتي مع أوضاع التنفيذ أعلاه. على سبيل المثال ، يدعم المتغيرات العالمية ، وخاصة المصفوفات العالمية.
يتم إنشاء شجرة بناء جملة بسيطة قائمة على المكدس (AST) من خلال وظائف التحليل التعاونية stmt() و expr() ، وكلاهما يتم تغذيته بواسطة وظيفة توليد الرمز المميز. تؤدي وظيفة expr() بعض التحسينات الثابتة الحرفية. يتم تحويل AST إلى تمثيل متوسط VM المستند إلى المكدس (IR) باستخدام وظيفة gen() . يمكن فحص الأشعة تحت الحمراء عبر خيار سطر الأوامر. أخيرًا ، تقوم دالة codegen() بإنشاء تعليمات ARM32 من IR ، والتي يمكن تنفيذها عبر جيل jit() أو elf32() قابل للتنفيذ
AMACC يجمع بين الهبوط العودية الكلاسيكية وأسبقية المشغل. يثبت محلل الأسبقية للمشغل أنه أسرع بكثير من محلل النسب المتكرر (RDP) للتعبير عندما يتم تعريف أسبقية المشغل باستخدام إنتاجات القواعد التي يمكن تحويلها إلى طرق.
Amacc قادر على تجميع ملفات مصدر C المكتوبة في بناء الجملة التالي:
int i = [expr]int foo[2][2] = { { 1, 0 }, { 0, 1 } };يستهدف دعم الهندسة المعمارية ARMV7HF مع Linux ABI ، وتم التحقق منه على Raspberry PI 2/3/4 مع GNU/Linux.
يستمتع مولد الرمز في AMACC بالعديد من سلوكيات GNU/Linux ، ومن الضروري تثبيت ARM/Linux في بيئة البناء الخاصة بك.
قم بتثبيت أدوات GNU للهندسة المعمارية A-profile
arm-linux-none-gnueabihf (AARCH32 Target مع تعويم صلب)قم بتثبيت QEMU لمضاهاة مستخدم ARM
sudo apt-get install qemu-user قم make check ويجب أن ترى هذا:
[ C to IR translation ] Passed
[ JIT compilation + execution ] Passed
[ ELF generation ] Passed
[ nested/self compilation ] Passed
[ Compatibility with GCC/Arm ] ........................................
----------------------------------------------------------------------
Ran 52 tests in 8.842s
OK
تحقق من الرسائل التي تم إنشاؤها عن طريق make help لمعرفة المزيد.
AMACC قادر على إنشاء رمز الجهاز بسرعة كبيرة ويوفر 70 ٪ من أداء gcc -O0 .
بيئة الاختبار:
ملف مصدر الإدخال: amacc.c
| برنامج التحويل البرمجي | الحجم الثنائي (KIB) | وقت التجميع (ق) |
|---|---|---|
GCC مع -O0 -ldl (ترجمة+رابط) | 56 | 0.5683 |
GCC مع -O0 -c (ترجمة فقط) | 56 | 0.4884 |
| amacc | 100 | 0.0217 |
تحقق من التمثيل الوسيط (IR) لتجميع AMACC.
يعتمد AMACC على البنية التحتية لـ C4.