الفصل 38: المترجم (sad-build)
مقدمة
المترجِّمُ هو محرّكُ لغة ص الوحيد: لا مفسّرَ ولا آلةَ بايت‑كود. كلُّ برنامجٍ يُترجَمُ إلى ملفٍّ تنفيذيٍّ أصيلٍ عبرَ LLVM، ثمّ يُشغَّلُ الناتج.
مراحل الترجمة
كود .ص → تحليل معجمي → تحليل نحوي → AST
↓
ملف تنفيذي ← LLVM IR ← SIR ← AST1. التحليل المعجمي
يحول الكود إلى رموز (tokens):
"دالة جمع(أ، ب)" → [KEYWORD_FUNCTION, IDENTIFIER("جمع"), LPAREN, IDENTIFIER("أ"), COMMA, IDENTIFIER("ب"), RPAREN]2. التحليل النحوي
يبني شجرة AST من الرموز.
3. SIR (Sad Intermediate Representation)
تمثيل وسيط خاص بلغة ص، يدعم 12 تعليمة:
| التعليمة | الوصف |
|---|---|
| LOAD | تحميل قيمة |
| STORE | تخزين قيمة |
| ADD | جمع |
| SUB | طرح |
| MUL | ضرب |
| DIV | قسمة |
| CMP | مقارنة |
| JMP | قفز |
| CALL | استدعاء دالة |
| RET | إرجاع |
| ALLOC | حجز ذاكرة |
| FREE | تحرير ذاكرة |
4. LLVM IR
تحويل SIR إلى LLVM IR الذي يُحسّن ويُترجم إلى كود أصلي.
استخدام المترجم
bash
# ترجمة ثمّ تشغيل — وهما خطوتان دائماً
sad-build برنامج.ص -o برنامج.exe
.\برنامج.exe
# إنتاج LLVM IR للفحص
sad-build برنامج.ص --emit-llvm
# إنتاج SIR للفحص
sad-build برنامج.ص --emit-sirماذا يعني «محرّكٌ واحد» عمليًّا
| الأثر | التفصيل |
|---|---|
| خطوةُ بناءٍ لازمة | لا يُشغَّلُ ملفُّ .ص مباشرةً؛ يُترجَمُ أوّلًا ثمّ يُشغَّلُ الناتج |
| التوزيع | الملفُّ التنفيذيُّ مستقلٌّ — لا يحتاجُ المستعمِلُ تثبيتَ لغة ص |
| سلوكٌ واحدٌ لا يلتبس | لا يختلفُ جوابُ البرنامجِ باختلافِ المحرّك، إذ ليس ثمّةَ محرّكٌ ثانٍ |
| التشخيص | كلُّ رفضٍ يحملُ رمزًا من الكتالوج (SEM001 · RUN002 · SYN009 …) ونصًّا عربيًّا وعلاجًا |
تمرين
ترجِمْ برنامجًا بسيطًا بـsad-build، ثمّ أعِدْ ترجمتَه بـ--emit-llvm وتأمّلْ ما يُخرِجُه المترجِّمُ من LLVM IR.