الملعب — جرّب لغة ص
اكتبْ كودَ لغة ص وشغِّلْه. وما تراه مخرَجُ المترجِّمِ نفسِه — يُترجَمُ مصدرُك إلى ثنائيٍّ أصيلٍ ثمّ يُشغَّلُ الثنائيّ، لا محاكاةَ ولا تفسير.
كيف يعمل
كودك .ص → ① sad-build (ترجمة) → ثنائيٌّ أصيل → ② تشغيل → النتيجةمرحلتان، ويُبلَّغُ عن كلٍّ منهما على حِدَة. 🔑 وإخفاقُ الترجمةِ ليس عطبًا يُخفى: هو جوابُ المترجِّمِ برمزٍ من الكتالوجِ ونصٍّ عربيٍّ وعلاج — وهو أنفعُ ما يراه المتعلّم. فيُعرَضُ كما خرج:
برنامج.ص: error: [SEM001] (AR) المتغير 'س' غير معرَّف
→ عرّف المتغير قبل استخدامه: متغير س = <قيمة>أين يُترجَم؟ على خادم، لا في متصفّحك
هذا فرقٌ يُقالُ ولا يُخفى. والسببُ مقيسٌ لا مُقدَّر: sad-build يربطُ LLVM ١٨ (cmake/llvm.cmake) ويستدعي رابطًا خارجيًّا بـstd::system في compiler/src/backend/arm64_codegen.cpp:355. فحملُه إلى المتصفّحِ يعني حملَ LLVM وlld معه — مشروعٌ مستقلٌّ لا رقعةُ موقع.
كان هنا sad.wasm
شحنَ هذا الموقعُ يومًا ثلاثةً ونصفًا ميغابايت من WebAssembly إلى كلِّ زائر — وكانت المفسّرَ مترجَمًا. والمفسّرُ حُذِفَ من اللغة، ومعه tools/wasm/ وملفُّ بنائه، فذلك الثنائيُّ لا يُعادُ بناؤه لو وُجِدَ فيه عطب. والملعبُ اليومَ يبلغُ المحرّكَ الوحيدَ الباقيَ — وهو المحرّكُ الذي يُنتِجُ برامجَك.
على جهازك — بالمترجِّمِ نفسِه
يعملُ الملعبُ كاملًا محلّيًّا، ويلتقطُه الموقعُ في وضعِ التطويرِ تلقائيًّا:
npm run api # يبحثُ عن sad-build في مستودعٍ شقيق
SAD_BUILD=/path/to/sad-build npm run api # أو بمسلكٍ صريحdocker build -f api/Dockerfile -t sad-playground .
# سطرُ التشغيلِ بأعلامِ العزلِ كاملةً في api/README.mdirm https://sad-lang.org/install.ps1 | iex
sad-build برنامجي.ص -o برنامجي.exe
.\برنامجي.execurl -fsSL https://sad-lang.org/install.sh | bash
sad-build برنامجي.ص -o برنامجي
./برنامجيالحدودُ المُعلَنة
ما لا يفعلُه الملعب
- لا ترجمةَ في المتصفّح — التشغيلُ يمرُّ بخادم، وقد قِيسَ سببُه أعلاه.
- مهلةُ التشغيلِ ثمانِ ثوانٍ، ومهلةُ الترجمةِ عشرون؛ ويُوقَفُ البرنامجُ متى تجاوزَ مخرَجُه ٦٤ ك.بايت.
- حجمُ المصدرِ ٦٤ ك.بايت، وأربعُ ترجماتٍ متزامنةٍ على الأكثر، و٣٠ طلبًا في الدقيقةِ لكلِّ عنوان.
- البرنامجُ يعملُ في حاويةٍ معزولةٍ بلا حالةٍ باقية — لا ملفَّ يُحفَظُ بين تشغيلَين، ولا شبكةَ يُعتمَدُ عليها.
🔑 وهذه الحدودُ مقيسةٌ لا مذكورة.
npm run check:playgroundيسبرُ كلَّ واحدٍ منها بطلبٍ يخرقُه على خادمٍ حيّ، وnpm run calib:playgroundيُبرهِنُ أنّ الحارسَ يعَضُّ بأن يُشغِّلَه على خادمٍ بلا حدٍّ واحدٍ ويُلزِمَه بالحمرةِ في كلِّ سبرة. فحدٌّ مكتوبٌ ولا يُقاسُ دعوى لا عقد.