إعداد البيئة والبناء
ماذا ستتعلّم: كيف تجلب المستودع، تهيّئ الأدوات، وتبني المفسّر والمترجم.
📎 المصدر:
CMakeLists.txt·tests/config.yaml
المتطلبات
- C++17 ومُصرِّف حديث (MSVC على Windows، أو Clang/GCC).
- CMake ≥ 3.15 — هذا ما يشترطه
cmake_minimum_requiredفعلًا، لا 3.20. - LLVM 18 — للمترجم
sad-build. الخيارENABLE_LLVM_BACKENDافتراضيّهON، فلا تحتاج تمريره. ودقّق: هدفُsad-buildيُعرَّف داخلif(ENABLE_LLVM_BACKEND AND LLVM_FOUND)فيapps/CMakeLists.txt— فبلا LLVM لا يوجد الهدفُ أصلًا، ويسقطx.py buildمعه، ولا يُنتَجbuild/bin/Debug/sad-build.exeالذي يشترطهtests/config.yamlأبدًا. البديلُ الحقيقيّ هو الهدفُ المستقلّsad-build-native(المترجم النحيل، بلا LLVM، في كلّ التهيئات) — راجع فصل LLVM والخلفيّة الأصليّة. فإن لم تنوِ استعمالَ الخلفيّة الأصليّة، اعتبِر LLVM شرطًا لا خيارًا. - Python 3 — لمولّدات الكود (
scripts/codegen/gen_*.py) وtests/runner.py. - Git + GPG — للمساهمة (الفروع المحميّة تشترط توقيع GPG).
الجلب
git clone https://github.com/sadlang/s-programming-language.git
cd s-programming-language
البناء
الطريق المُوصى به هو البوّابة الموحّدة x.py — تبني المحرّكين معًا لكلّ تهيئة،
فلا تقع في اختلاف التهيئتين الموصوف تحت:
python x.py build # بناء المحرّكين
python x.py test # بناء + تحقّق + تشغيل الـrunner
python x.py gen # توليد المصدر من language-truth/
(الأوامر الأخرى: configure · verify · conformance · clean.)
وإن بنيتَ بـCMake مباشرةً (PowerShell على Windows):
cmake -S . -B build # تهيئة أولى
cmake --build build --config Debug --target sad-run # المفسّر
cmake --build build --config Debug --target sad-build # المترجم
cmake --build build --config Debug # كل شيء
⚠️ فخاخُ البناء:
- ابنِ الاثنين في تهيئةٍ واحدة، وأعِد بناءهما معًا.
tests/config.yamlيقرأ المسارَين منbuild/bin/Debug/كليهما. فإن بنيتَsad-buildفيReleaseلم يجده الـrunner، وإن أعدتَ بناءَ أحدهما وحدَه قِستَ ثنائيًّا بائتًا. وهذه بعينها عثرةُ «مفسّر Debug + مترجم Release» التي يقول تعليقُtests/config.yamlنفسِه إنّها أُزيلت جذريًّا فيcmake/llvm.cmake؛ لا تُعِدها بيدك.sadc.exeاسمٌ متقاعد — لا يُنتجه أيّ هدف. اسمُ الهدف مُوحَّدٌ مع اسم المُخرَج:sad-run⇒sad-run.exe، وsad-build⇒sad-build.exe. فلا تنسخ ثنائيًّا باسمٍ آخر لأجل الـrunner — فهو يقرأ المسارَين من ذلك الملفّ.sad.exeليس المفسّر بل موزِّع أوامرٍ (hub) يُشغّل الأدواتِ عمليّاتٍ فرعيّة؛ المفسّرُ الفعليّsad-run.exe، فاستدعِه مباشرةً.
التشغيل
الأمثلة الفعليّة تحت examples/ بأسماء عربيّة مرقّمة (01_مرحبا.ص … 07_مكوّن_مركّب.ص):
.\build\bin\Debug\sad-run.exe examples\01_مرحبا.ص # تفسير
.\build\bin\Debug\sad-build.exe examples\01_مرحبا.ص # ترجمة لملف تنفيذيّ
الاختبارات
الاختبارات معطّلة افتراضيًّا (option(BUILD_TESTS ... OFF))؛ فعّلها بـ-DBUILD_TESTS=ON.
للتنفيذ المزدوج (مفسّر + مترجم) استخدم tests/runner.py — لا يوجد runner.py
في جذر المستودع، وهذا هو الاستدعاء الذي يستعمله CI نفسه:
python tests/runner.py --level P0 # الحزمة الأساسيّة
python tests/runner.py --level P1 # المطلوبة قبل أي PR (لا تراجع)
(وpython x.py test يبني المحرّكين ثمّ يستدعي هذا الـrunner نفسَه — استعمِله حين
تريد البناءَ والقياسَ في خطوة، والاستدعاءَ المباشرَ حين يكون البناءُ حاضرًا.)
توليد الكود من مصدر الحقيقة
بعد تعديل أي YAML في language-truth/:
python x.py gen # كلُّ المولّدات دفعةً واحدة
python scripts/codegen/gen_keywords.py # أو مولِّدٌ بعينه
python scripts/codegen/gen_parser_grammar_docs.py # توثيق القواعد
راجع توليد الكود.
اقرأ بعده: خريطة المستودع.