خطّ الأنابيب: من المصدر إلى التنفيذ
ماذا ستتعلّم: رحلة برنامج
.صخطوةً بخطوة عبر الطبقات، بفرعَي التفسير والترجمة.
المسار الكامل
flowchart LR
A["مصدر .ص"] --> B["LexerCore.nextToken()<br/>→ تيار Tokens"]
B --> C["ParserCore.parseProgram()<br/>→ StmtList (AST)"]
C --> D{المسار}
D -->|تفسير| E["InterpreterCore<br/>زيارة AST وتقييمه"]
D -->|ترجمة| F["SIRBuilder<br/>AST → SIR"]
F --> G["SIROptimizer<br/>تمريرات تحسين"]
G --> H["LLVMCodeGen<br/>SIR → LLVM IR"]
H --> I["LLVM → كائن → ربط → تنفيذيّ"]
المرحلة 1 — التحليل المعجمي
LexerCore يحوّل النصّ (UTF-8) إلى Tokenات (نوع + قيمة + Position). يتخطّى
المسافات والتعليقات، ويجمّع تعليقات التوثيق ##. الكلمات المحجوزة الأربعون تُعرَّف
في lexer_keywords.cpp. → المعجمي.
المرحلة 2 — التحليل النحوي
ParserCore (نزوليّ تعاوديّ) يبني AST. نقطة الدخول parseProgram() تكرّر
parseDeclaration()، الذي يوزّع حسب الرمز إلى تصريحات/جمل/تعابير. سلسلة أسبقيّة
التعابير تُعرّف العوامل. → النحوي وقواعد المحلل SoT.
المرحلة 3 — AST
شجرة من عقد (StmtPtr/ExprPtr) يزورها المستهلِكون عبر ASTVisitor (نمط Visitor).
→ AST.
المرحلة 4أ — التفسير
InterpreterCore يزور AST مباشرةً: يدير النطاقات والمتغيّرات والدوال، ويقيّم التعابير،
وينفّذ الجمل. سريع للتطوير والاختبار.
المرحلة 4ب — الترجمة (sadc)
SIRBuilder: AST → SIR (تمثيل وسيط بتعليمات ملكية،sir_types.h).SIROptimizer: تمريرات على SIR.LLVMCodeGen: SIR → LLVM IR، ثم LLVM يُنتج كائنًا يُربَط لملفّ تنفيذيّ.
لماذا SIR وسيط؟ يفصل دلالة الملكية/الأنواع عن تفاصيل LLVM، ويسهّل التحسين والتشخيص (
--emit-llvm, SIR dumps).
نقاط تشخيص مفيدة
- اختلاف سلوك المفسّر عن المترجم ⇒ المشكلة في
SIRBuilderأوLLVMCodeGen(BF-08). - ولّد LLVM IR بـ
--emit-llvmوافحص: الكتلة الأولى، تطابق أنواع الحقول، ترتيب التعليمات،getelementptr.
اقرأ بعده: الأنظمة المتشابكة.