سلسلة أدوات Clang على WebAssembly وواجهة ABI v1 لسكربتات لغة C++
يستطيع Senzoukria ترجمة سكربت C++17 إلى WebAssembly داخل بيئته المعزولة بمترجم Clang حقيقي، ثم تشغيله على شموع الرسم. وسلسلة الأدوات تُنزَّل مرّةً واحدة عند الطلب، ويُتحقَّق منها بالحجم وبـ SHA-256، وتعرض واجهة صغيرة: of_compute يرسم قيمةً واحدة لكل شمعة، وof_strategy يعيد نوايا شراء أو بيع للحساب المحاكى.
Senzoukria · التوثيق · آخر تحديث: سبتمبر 2026
أين تجده
- الموضع
- صفحة البرمجة النصية ← مُحدِّد اللغة ← C++ (فيظهر شريط «C++ toolchain» فوق محرّر الشفرة)
- سلسلة الأدوات
- Clang 8.0.1 + LLD + libc++ مترجَمة إلى WebAssembly، مثبَّتة على إيداع Binji wasm-clang رقم 648c4a89؛ نحو 60.4 ميغابايت (تُعرض «60.4 Mo») تُنزَّل مرّةً واحدة
- السعة
- 256 شمعة هي الأحدث في كل نداء؛ والمصدر حتى 64 كيبيبايت؛ وثانيتان لكل تشغيل؛ ومهلة الترجمة 45 ثانية
- نطاق الاستراتيجية
- الحساب المحاكى وحده؛ ولا يحوّل التطبيق نيّة C++ إلى أمر لدى وسيط أبدًا
ما الذي يفعله
محرّك C++ هو لغة البرمجة النصية الثالثة إلى جانب JavaScript وPython. واختيار C++ في مُحدِّد اللغة بصفحة البرمجة النصية يُظهر شريط «C++ toolchain». وحاله الأولى هي Not installed مع زرّ Install the C++ toolchain والملاحظة «About 60.4 Mo to download, once (Clang 8.0.1 + LLD + libc++, Apache-2.0).». والملفّات الخمسة (clang وlld وmemfs وsysroot.tar وshared.js) تُجلب من إيداع GitHub المثبَّت، ويُرفض كلٌّ منها إن اختلف عدد بايتاته أو بصمة SHA-256 عن القيمة المكتوبة في التطبيق، وتُخزَّن في IndexedDB حتى لا يقع التنزيل إلا مرّةً واحدة.
وإقلاع المحرّك يترجم نحو 50 ميغابايت من WebAssembly، ولهذا كانت «Starting the engine…» حالةً مرئية متمايزة عن تشغيل سكربت. وبعد الجاهزية يطبع الشريط «Version wasm-clang-648c4a89, started in {ms} ms» متبوعًا بسطر الحدود. ويُترجَم كل سكربت مرّةً واحدة، مفهرَسًا ببصمة SHA-256 للمصدر المركَّب (ترويسة المضيف + شفرتك)؛ وإعادة تشغيل السكربت نفسه بإيقاع الرسم لا تعيد الترجمة أبدًا. ويحتفظ المضيف بحتى 8 وحدات مترجَمة، ويحتفظ العامل بـ 8 كذلك.
الواجهة التي يراها سكربتك
| الرمز | المعنى | ملاحظات |
|---|---|---|
| struct OfBar | bucket_ts_ns (int64)، وopen وhigh وlow وclose وvolume وdelta (double)، وtrades (uint32) | 64 بايتًا، الشمعة الأقدم أولًا، وn ≤ 256 |
| int of_compute(const OfBar* bars, uint32_t n, double* out, uint32_t out_len) | اكتب قيمةً واحدة لكل شمعة في out[i]؛ وNaN تعني لا قيمة؛ وأعِد n | يُرسم خطًّا أخضر واحدًا (#7ed321، بعرض 1) على الرسم |
| int of_strategy(const OfBar* bars, uint32_t n, int32_t* out, uint32_t out_len) | اكتب نيّةً واحدة لكل شمعة: −1 بيع، و0 لا شيء، و+1 شراء | لا تُقرأ إلا نيّة الشمعة الأخيرة؛ وqty وstopTicks وtargetTicks تأتي من وسائط السكربت |
| OF_CAPACITY | 256 | الشموع الأقدم من السعة لا تُنقَل؛ وسطر تحذير يقول كم شمعة تُخطّيت |
| #line 1 "script.cpp" | أرقام الأسطر في التشخيصات تطابق محرّرك | أول «script.cpp:N:M: error» يحدّد السطر المُبرَز |
حالات المحرّك وعناصر التحكّم
| الحالة | تُعرض بصيغة | الإجراء المتاح |
|---|---|---|
| absent | Not installed مع ملاحظة الحجم | Install the C++ toolchain |
| downloading | Downloading the engine… {percent}% | Cancel the download |
| starting | Starting the engine… | لا شيء (مهلة الإقلاع 120 ثانية) |
| ready | Engine ready، مع النسخة ووقت الإقلاع والحدود | Remove the engine (يطهّر وحدات العامل وذاكرة IndexedDB) |
| error | Engine unavailable مع الرسالة | Try again |
كيف تستعمله
أنشئ سكربتًا جديدًا، واختر C++، وابدأ من القالب الافتراضي: متوسّط متحرّك بسيط بفترة 20 مكتوب بمجموع جارٍ، مع NaN أثناء الإحماء، ويعيد n. وشغّله بزرّ Run نفسه الذي تشغّل به سكربتات JavaScript. وتصل تحذيرات المترجم وأخطاؤه إلى الكونسول أسطرَ سجلّ؛ والتشغيل الذي يتجاوز ميزانية الثانيتين يخفق كأي سكربت آخر. ولا يأتي اليوم إلا قالب C++ واحد، هو ذلك المتوسّط المتحرّك؛ ولا توجد استراتيجية C++ جاهزة. وكتابة of_strategy بنفسك تكفي: فنواياها تتبع مسار القرار نفسه الذي تتبعه استراتيجيات JavaScript، نحو حساب التقييم المحاكى وحده.
وإن كان الرسم يحمل أكثر من 256 شمعة، طبع الكونسول «C++ ABI v1 computes the 256 most recent bars: N older bar(s) have no value.». والشموع الأقدم تُرسم ببساطة بلا قيمة بدل ملئها بتخمين.
الحدود والمزالق
- C++17 مدعومة؛ وC++20 غير موعود بها صراحةً. والترويسات مثل <cmath> و<vector> و<numeric> متاحة من libc++.
- والمصدر محدود بـ 64 كيبيبايت بما في ذلك ترويسة المضيف؛ والوحدة المترجَمة قد تستعمل حتى 64 ميبيبايت من الذاكرة.
- والمحرّك يُنزَّل من raw.githubusercontent.com وحده؛ وإعادة التوجيه مرفوضة، والملفّ الذي يختلف حجمه أو بصمته يُرفض قبل بلوغه البيئة المعزولة.
- وإن أُعيد تشغيل البيئة المعزولة أو أُزيلت سلسلة الأدوات أثناء ترجمة، بلّغ التشغيل بـ «sandbox restarted or toolchain removed during compilation — run again».
- وتشغيل سكربت C++ قبل تثبيت سلسلة الأدوات يعيد «C++ toolchain not started — install it from the Scripting page»؛ وينجح التشغيل تلقائيًّا بمجرّد جاهزية المحرّك.
صفحات ذات صلة
- محرّر مؤشرات المستخدم على الرسم
- مخرجات السكربت: فوق الرسم، ولوحة، وجدول، ولوحة قيم
- مساعد السكربتات (ذكاء اصطناعي)
- اختبار استراتيجية تداول
هذه الصفحة بلغات أخرى
أسئلة شائعة
- هل تحتاج سلسلة أدوات C++ اتصالًا بالإنترنت في كل مرّة؟
- لا. فالملفّات الخمسة تُنزَّل مرّةً واحدة، ويُتحقَّق منها، وتُحفظ في IndexedDB. والإقلاعات اللاحقة تقرأ الذاكرة وتعمل دون اتصال بالكامل؛ وزرّ Remove the engine يمسح تلك الذاكرة.
- هل تستطيع استراتيجية C++ إرسال أوامر إلى وسيطي؟
- لا. فـ of_strategy تنتج نوايا −1/0/+1 تُحوَّل إلى قرارات للحساب المحاكى، عبر المسار نفسه الذي تسلكه استراتيجيات JavaScript. ولا يضع أي سكربت في Senzoukria أمرًا لدى وسيط.
- لماذا يتوقّف مؤشري بعد 256 شمعة؟
- ABI v1 ينقل 256 شمعة هي الأحدث في كل نداء. والشموع الأقدم بلا قيمة، والكونسول يقول كم شمعة تُخطّيت.