ملف ودالة بداية
ابدأ بملف واحد ودوال على المستوى الأعلى. لا توجد عبارات تنفيذية أو متغيرات عامة خارج الدوال. تستقبل دالة البداية صفرا من المعاملات وتعيد حالة العملية.
اقرأ المثال وافحصه تابع إلى العقد الدقيق الحدود المعيارية للإصدارجارٍ تحميل المحرر…
يجمع هذا البرنامج الأعداد من 1 إلى 10. عند نجاحه يطبع 55 ويعيد الحالة 0. عدّل المصدر ثم اضغط «شغّل».
تجري الترجمة والتنفيذ داخل متصفحك. لا يُرسل المصدر إلى خادم.
تابع إلى تعلّم اللغةابدأ بملف واحد ودوال على المستوى الأعلى. لا توجد عبارات تنفيذية أو متغيرات عامة خارج الدوال. تستقبل دالة البداية صفرا من المعاملات وتعيد حالة العملية.
اقرأ المثال وافحصه تابع إلى العقد الدقيق الحدود المعيارية للإصدارالأنواع القابلة للتخزين هي bool, i64, f64, string, c_ptr. تعني unit غياب النتيجة. استخدم دع / let للثبات ومتغير / var للتغيير. تتطلب الشروط قيمة منطقية. يجمع المثال الأعداد بحلقة ثم يطبع النص الحرفي عند النجاح.
صرّح بأنواع معاملات الدالة ونتيجتها. افحص المثال المرفوض ثم صحح الربط القابل للتغيير. التشخيص يحدد سبب الخطأ وموضعه، أما توقف وقت التشغيل فينهي التنفيذ فورا.
اقرأ المثال وافحصه تابع إلى العقد الدقيق الحدود المعيارية للإصداراربط اسما محليا بمكتبة ورمز حرفيين عبر محوّل محدد. ضع غير_آمن / unsafe على التصريح وعلى كل استدعاء. افحص المثال محليا قبل تشغيله على المضيف المدعوم.
يحتوي ملف .aspl واحد على تعريفات الدوال والتصريحات الخارجية. دالة ابدأ_الرئيسية / start_main إلزامية بلا معاملات وبنتيجة i64. المجال الصحيح للحالة 0..255، وأي قيمة أخرى توقف التنفيذ ولا تُختزل.
مقبول: دوال على المستوى الأعلى. مرفوض: متغير عام، عبارة خارج دالة، دالة بداية مفقودة أو استدعاؤها من المصدر.
المتصفح والمضيف الأصلي
دالة ابدأ_الرئيسية() -> ص64 {
أرجع 0.
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "" native: check 0; success / status 0; stdout ""نزّل المصدر افتح في المحرر
aspl check hello.aspl
aspl run hello.aspl
المتصفح والمضيف الأصلي
fn start_main() -> i64 {
return 0;
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "" native: check 0; success / status 0; stdout ""نزّل المصدر افتح في المحرر
aspl check hello.aspl
aspl run hello.aspl
الأسباب والنتائج: missing-entry-function, invalid-entry-signature, entry-call-not-allowed; trap / invalid-process-status
تطبيق المضيف: shared
المصدر UTF-8 صارم وفق Unicode 17.0. الأسماء حساسة لحالة الحروف وبتطبيع NFC، وبخط عربي أو لاتيني واحد لكل اسم. المفردات والعوامل الإنجليزية بدائل مطابقة ويمكن مزجها. الأرقام وعلامات الترقيم في الشيفرة من ASCII، وتكتب المساواة والاقتران والفصل بـ matches وand وor أو ببدائلها العربية يطابق وتطابق وو وأو؛ ويختار مصدر العربية صيغة المساواة الموافقة لسياقه النحوي. تنتهي العبارات بـ . أو ;، وتستخدم الأمثلة العربية النقطة. ترتيب العرض لا يغير بايتات المصدر.
مقبول: كلمات عربية وإنجليزية في البرنامج نفسه. مرفوض: أرقام غير محولة خارج النصوص والتعليقات أو اسم يجمع الخطين. يعرض المحرر محارف التحكم غير المرئية بوضوح.
الأسباب والنتائج: non-ascii-digit, mixed-script-identifier
تطبيق المضيف: shared
لا توجد تحويلات ضمنية. العدد الصحيح i64 موقّع وفائضه يوقف التنفيذ. العدد f64 هو IEEE 754 binary64. النص ثابت ويأتي من قيمة حرفية أو من إدخال سطر ناجح، والمؤشر c_ptr معتم وقابل للقيمة الفارغة. لا يمكن تخزين unit. يتيح الربط المهيأ استنتاج النوع. لا يوجد حجب للأسماء؛ المعاملات والروابط ثابتة ما لم يصرّح الرابط المحلي بالتغيير. تتطلب if, while شرطا منطقيا، وreturn نتيجة من النوع المعلن.
مقبول: تعديل رابط معلن للتغيير، ومقارنة تنتج شرطا منطقيا. مرفوض: رابط بلا تهيئة، تعديل رابط ثابت أو مزج أنواع الأعداد ضمنيا.
المتصفح والمضيف الأصلي
دالة ابدأ_الرئيسية() -> ص64 {
متغير المجموع: ص64 = 0.
متغير العدد: ص64 = 1.
طالما (العدد <= 10) {
المجموع = المجموع + العدد.
العدد = العدد + 1.
}
إذا (المجموع يطابق 55) {
اطبع("55\n").
أرجع 0.
}
أرجع 1.
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "55\n" native: check 0; success / status 0; stdout "55\n"نزّل المصدر افتح في المحرر
aspl check sum-ar.aspl
aspl run sum-ar.aspl
المتصفح والمضيف الأصلي
fn start_main() -> i64 {
var المجموع: i64 = 0;
var العدد: i64 = 1;
while (العدد <= 10) {
المجموع = المجموع + العدد;
العدد = العدد + 1;
}
if (المجموع matches 55) {
print("55\n");
return 0;
}
return 1;
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "55\n" native: check 0; success / status 0; stdout "55\n"نزّل المصدر افتح في المحرر
aspl check sum-en.aspl
aspl run sum-en.aspl
المتصفح والمضيف الأصلي
fn ابدأ_الرئيسية() -> ص64 {
متغير المجموع: ص64 = 0;
متغير العدد: ص64 = 1;
طالما (العدد <= 10) {
المجموع = المجموع + العدد;
العدد = العدد + 1;
}
إذا (المجموع matches 55) {
print("55\n");
return 0;
}
أرجع 1;
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "55\n" native: check 0; success / status 0; stdout "55\n"نزّل المصدر افتح في المحرر
aspl check sum-mixed.aspl
aspl run sum-mixed.aspl
الأسباب والنتائج: immutable-assignment, type-mismatch; trap / integer-overflow
تطبيق المضيف: shared
الدوال فريدة الاسم وعلى المستوى الأعلى، بمعاملات ونتيجة معلنة النوع. تمر القيم بالنسخ. ترتيب التعريفات لا يهم ويسمح بالاستدعاء الذاتي. يجب أن يعيد كل مسار في دالة ذات نتيجة غير unit قيمة. مثال المضروب يعيد الحالة 120 بلا خرج.
مقبول: دالة معرفة لاحقا أو استدعاء ذاتي. مرفوض: تحميل زائد، دالة متداخلة، عدد معاملات خاطئ أو مسار بلا إرجاع.
المتصفح والمضيف الأصلي
دالة مضروب(القيمة: ص64) -> ص64 {
إذا القيمة <= 1 {
أرجع 1.
}
أرجع القيمة * مضروب(القيمة - 1).
}
دالة ابدأ_الرئيسية() -> ص64 {
أرجع مضروب(5).
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 120; stdout "" native: check 0; success / status 120; stdout ""نزّل المصدر افتح في المحرر
aspl check functions-ar.aspl
aspl run functions-ar.aspl
المتصفح والمضيف الأصلي
fn مضروب(القيمة: i64) -> i64 {
if القيمة <= 1 {
return 1;
}
return القيمة * مضروب(القيمة - 1);
}
fn start_main() -> i64 {
return مضروب(5);
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 120; stdout "" native: check 0; success / status 120; stdout ""نزّل المصدر افتح في المحرر
aspl check functions-en.aspl
aspl run functions-en.aspl
الأسباب والنتائج: argument-count-mismatch, type-mismatch, missing-return
تطبيق المضيف: shared
يحمل التشخيص مفتاح سبب ثابت وشدة ومعاملات ذات أنواع ومواضع مصدر وتعديلا اختياريا. اللغة تغير الصياغة فقط. التحذير لا يمنع التشغيل. يربط التشغيل المباشر التشخيص بالمصدر؛ البرامج المبنية لا تحتوي خريطة المصدر. المثال الأول يحاول تعديل رابط ثابت. يستبدل المثال الثاني دع / let بـمتغير / var ويعيد الحالة 1 بصورة طبيعية.
مقبول: تصحيح الرابط ثم إعادة الفحص. مرفوض: اعتبار كل حالة غير صفرية خطأ مصدر. استخدم صنف النتيجة والتشخيص للتمييز.
المتصفح والمضيف الأصلي
دالة ابدأ_الرئيسية() -> ص64 {
دع قيمة = 0.
قيمة = 1.
أرجع قيمة.
}
النتائج المتوقعة والخرج الحرفي
browser: check source-error; source-error / immutable-assignment; stdout "" native: check 1; source-error / status 1 / immutable-assignment; stdout ""نزّل المصدر افتح في المحرر
aspl check diagnostic-ar.aspl
المتصفح والمضيف الأصلي
fn start_main() -> i64 {
let قيمة = 0;
قيمة = 1;
return قيمة;
}
النتائج المتوقعة والخرج الحرفي
browser: check source-error; source-error / immutable-assignment; stdout "" native: check 1; source-error / status 1 / immutable-assignment; stdout ""نزّل المصدر افتح في المحرر
aspl check diagnostic-en.aspl
المتصفح والمضيف الأصلي
دالة ابدأ_الرئيسية() -> ص64 {
متغير قيمة = 0.
قيمة = 1.
أرجع قيمة.
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 1; stdout "" native: check 0; success / status 1; stdout ""نزّل المصدر افتح في المحرر
aspl check corrected-ar.aspl
aspl run corrected-ar.aspl
المتصفح والمضيف الأصلي
fn start_main() -> i64 {
var قيمة = 0;
قيمة = 1;
return قيمة;
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 1; stdout "" native: check 0; success / status 1; stdout ""نزّل المصدر افتح في المحرر
aspl check corrected-en.aspl
aspl run corrected-en.aspl
الأسباب والنتائج: source-error / immutable-assignment; success / start_main 1
تطبيق المضيف: shared
توقيع الطباعة المدمجة هو اطبع / print: (string) -> unit. يكتب بايتات النص بالترتيب، بما فيها NUL، بلا سطر جديد أو تفريغ تلقائي. أضف \n صراحة. لا يمكن إعادة تعريف أي من الاسمين. يعرض المتصفح بايتات الخرج بأمان ولا يفسرها كترميز صفحة.
مقبول: نص واحد، بما فيه النص الفارغ. مرفوض: عدد أو معاملات متعددة أو تخزين النتيجة.
الكتابة متزامنة، والنص الفارغ لا يلمس المضيف. يعيد المضيف الأصلي محاولة الكتابات المقطوعة ويتابع الكتابات القصيرة. يبقى أي خرج مقبول قبل الفشل ظاهرا. لا توجد معالجة خاصة لإشارة SIGPIPE؛ قد ينهي الأنبوب المغلق العملية بها. إذا تجاهلت البيئة الإشارة أو حجبتها وأعادت الكتابة EPIPE، تكون النتيجة فشل مضيف بالحالة 8.
المتصفح والمضيف الأصلي
دالة ابدأ_الرئيسية() -> ص64 {
اطبع("مرحبا\n").
أرجع 0.
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "مرحبا\n" native: check 0; success / status 0; stdout "مرحبا\n"نزّل المصدر افتح في المحرر
aspl check output-ar.aspl
aspl run output-ar.aspl
المتصفح والمضيف الأصلي
fn start_main() -> i64 {
print("مرحبا\n");
return 0;
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "مرحبا\n" native: check 0; success / status 0; stdout "مرحبا\n"نزّل المصدر افتح في المحرر
aspl check output-en.aspl
aspl run output-en.aspl
الأسباب والنتائج: type-mismatch, argument-count-mismatch; host-failure / host-operation-failed / write-program-output; limit-stop / output-limit
تطبيق المضيف: shared
الدالة المدمجة اقرأ_سطر / read_line: () -> string تقرأ سطرا واحدا. لا تقبل معاملات أو وسم غير_آمن / unsafe، ولا يمكن تعريف اسم من أسمائها. اطبع أي مطالبة قبل الاستدعاء، فالدالة نفسها لا تكتب مطالبة أو صدى أو فاصلة نهاية. ينتهي السطر بـLF أو CRLF وتزال النهاية. السطر الفارغ نص فارغ. يعاد السطر الأخير غير المنتهي مرة واحدة عند EOF، ثم يوقف الاستدعاء التالي بـinput-exhausted.
مقبول: تمرير النص المقروء إلى دالة أو إعادته أو مقارنته أو طباعته. مرفوض: تحويله إلى رقم أو إضافة نصوص له، فليست هناك مكتبة نصوص أو أرقام جديدة.
يتحقق وقت التشغيل من بايتات السطر كلها بوصفها UTF-8 صارما. تبقى المسافات وNUL وعلامات العربية ومحارف الاتجاه والأرقام العربية الهندية وشكل التطبيع كما أرسله المضيف. لا يمر إدخال البرنامج عبر محرر المصدر أو محلله أو تحويل أرقامه. السطر غير الصالح يوقف التنفيذ بـinvalid-input-utf8 مع موضع أول بايت غير صالح.
الحد في المضيفين هو 65536 بايت حمولة للسطر، من دون LF أو CRLF. يقبل الحد بالضبط، أما تجاوزه فينهي التنفيذ بـinput-line-limit من دون نص مبتور. إلغاء التنفيذ أثناء الانتظار إلغاء وليس EOF.
تملك العملية الناجحة النص غير الفارغ حتى تدمر العملية. تمرره السجلات والمعاملات والنتائج بالقيمة نفسها، ولا يحرر الرجوع من الدالة النص. لا تستعيد إعادة الإسناد نصوص الإدخال السابقة، لذلك قد يصل برنامج يقرأ كثيرا إلى حد ذاكرة الآلة.
المتصفح والمضيف الأصلي
دالة ابدأ_الرئيسية() -> ص64 {
اطبع("ما اسمك؟ ").
دع الاسم = اقرأ_سطر().
اطبع("مرحبا ").
اطبع(الاسم).
اطبع("\n").
أرجع 0.
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "ما اسمك؟ مرحبا ليلى\n" native: check 0; success / status 0; stdout "ما اسمك؟ مرحبا ليلى\n" scripted stdin lines: ["ليلى"]نزّل المصدر افتح في المحرر
aspl check input-ar.aspl
aspl run input-ar.aspl
المتصفح والمضيف الأصلي
fn start_main() -> i64 {
print("ما اسمك؟ ");
let الاسم = read_line();
print("مرحبا ");
print(الاسم);
print("\n");
return 0;
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "ما اسمك؟ مرحبا Mina\n" native: check 0; success / status 0; stdout "ما اسمك؟ مرحبا Mina\n" scripted stdin lines: ["Mina"]نزّل المصدر افتح في المحرر
aspl check input-en.aspl
aspl run input-en.aspl
المتصفح والمضيف الأصلي
fn مرر(value: string) -> string {
return value;
}
fn start_main() -> i64 {
print("first: ");
let first = اقرأ_سطر();
اطبع("second: ").
let second = read_line().
let returned = مرر(first).
إذا returned matches second {
print("equal: ");
print(returned).
اطبع(" / ").
print(second).
اطبع("\n").
return 0.
}
أرجع 1.
}
النتائج المتوقعة والخرج الحرفي
browser: check success; success / start_main 0; stdout "first: second: equal: ١٢٣ / ١٢٣\n" native: check 0; success / status 0; stdout "first: second: equal: ١٢٣ / ١٢٣\n" scripted stdin lines: ["١٢٣","١٢٣"]نزّل المصدر افتح في المحرر
aspl check input-mixed.aspl
aspl run input-mixed.aspl
الأسباب والنتائج: argument-count-mismatch, unsafe-on-safe-call; trap / input-exhausted, invalid-input-utf8; limit-stop / input-line-limit; cancelled
تطبيق المضيف: shared
تقبل الأداة ملف مصدر واحدا. يفحص check المصدر، ويشغّل run داخل العملية، وينشر build برنامج ELF باستبدال ذري بعد التحقق. لا يفتح الفحص والبناء مكتبات البرنامج. لا يستدعي البناء مترجم C أو رابطا. تعيش البرامج المبنية مستقلة عن تثبيت الأداة.
مقبول: خيارات التشخيص قبل الأمر ومسار واحد بعده. مرفوض: مصادر متعددة أو إخراج بايت كود عام أو معاملات برنامج. استخدم -- قبل مسار يبدأ بشرطة.
الأسباب والنتائج: 0 success; 1 source-error; 2 usage-error; 3 policy-rejection; 4 load-failure; 5 trap; 6 limit-stop; 7 cancelled; 8 host-failure; 9 internal-failure
تطبيق المضيف: native
aspl --diagnostic-language=en check hello.aspl
aspl run hello.aspl
aspl build -o hello hello.aspl
./hello
اقرأ المثال وافحصه
الحدود المعيارية للإصدار
يقرأ aspl run من stdin الموروث، سواء أكان طرفية أم أنبوبا أم ملفا معادا توجيهه. يعمل القارئ نفسه داخل برنامج مبني بـaspl build من نوع ELF. يحتوي البرنامج المبني البايت كود وإصدار الآلة 2، ويعمل بعد إزالة المترجم ووقت التشغيل من PATH.
تظهر المطالبة التي تطبعها ASPL قبل الانتظار، حتى بلا سطر جديد. يزيل القارئ نهاية السطر فقط ولا يقرأ إلى السطر التالي، ولذلك تبقى بايتات لاحقة لدالة خارجية تقرأ stdin. تقاطع الإشارة أو طلب الإيقاف أثناء الانتظار لا يتحول إلى input-exhausted.
تطبيق المضيف: native
printf 'Mina\n' | aspl run input.en.aspl
aspl build -o input input.en.aspl
printf 'Mina\n' | ./input
الحدود المعيارية للإصدار
حين يصل البرنامج إلى read_line يعرض الملعب حالة انتظار وحقل سطر واحد وزري Send وClose input وStop. يرسل Send المسودة الحالية للطلب المعروض فقط، ثم يمسحها بعد إقرار العامل. يرسل Close input EOF ولا يرسل المسودة، وتبقى ظاهرة بوصفها غير مرسلة. يوقف Stop التنفيذ ولا يعني EOF.
لا يقبل الحقل لصقا متعدد الأسطر أو محرفي CR وLF، ويعرض حد البايتات. تبقى بايتات المسودة والأرقام كما أدخلت ولا تمر عبر محرر المصدر. تسجل أصداء الإدخال كسجلات واجهة منفصلة ولا تدخل في خرج البرنامج أو حد خرجه.
يقيس حد التنفيذ زمن العمل المتراكم فقط. الوقت الذي يقضيه البرنامج منتظرا الإدخال لا يستهلكه. تحافظ أزرار Auto وLTR وRTL على بايتات الخرج والمسودة ولقطة المصدر وهوية الطلب، وتعيد تنسيق العرض والمحاذاة فقط.
تطبيق المضيف: browser
المتصفح يشغّل البايت كود محليا ويطبق سقف 10000000 تعليمة لكل تشغيل. الحلقة التالية تنتهي بالصنف limit-stop عند هذا السقف. يعرض الجدول حدود المضيفين. الوحدة MiB = 1048576 bytes والوحدة KiB = 1024 bytes. تعني none غياب سقف منتج، وتعني n/a عدم التطبيق.
مقبول: تشغيل اللغة المشتركة في المتصفح. مرفوض: استيراد خارجي حتى إن لم يُستدع. لا ترسل المثال ذي الحلقة غير المنتهية إلى التشغيل الأصلي.
| المورد | المضيف الأصلي | المتصفح |
|---|---|---|
| بايتات المصدر | 16 MiB | 1 MiB |
| الوحدات المعجمية | 1048576 | 131072 |
| عقد الصياغة | 1048576 | 131072 |
| عمق الصياغة | 256 | 128 |
| ذاكرة المترجم العاملة | 512 MiB | 128 MiB |
| بايتات البايت كود | 64 MiB | 8 MiB |
| الدوال | 65536 | 4096 |
| الاستيرادات الخارجية | 4096 | 0 |
| ثوابت الأعداد الصحيحة | 1048576 | 131072 |
| ثوابت الأعداد العائمة | 1048576 | 131072 |
| مراجع النصوص | 1048576 | 131072 |
| بايتات النصوص | 16 MiB | 2 MiB |
| حمولة سطر الإدخال | 65536 bytes | 65536 bytes |
| تعليمات البايت كود | 4194304 | 524288 |
| السجلات لكل دالة | 65536 | 8192 |
| التعليمات المنفذة | none | 10000000 |
| إطارات وقت التشغيل | 4096 | 512 |
| مواضع قيم وقت التشغيل | 1048576 | 131072 |
| ذاكرة التنفيذ المملوكة للآلة | 256 MiB | 64 MiB |
| الخرج الملتقط | none | 256 KiB |
| زمن الفحص | none | 2 s |
| زمن التنفيذ | none | 3 s |
| الذاكرة الخطية | n/a | 256 MiB |
| وظائف العامل المتزامنة | n/a | 1 |
يشمل المصدر كل بايت مقروء بما فيه علامة بداية النص. تشمل ذاكرة المترجم كل تخصيص حي للترجمة. تشمل ذاكرة التنفيذ الإطارات ومواضع القيم وإعارة النص ونصوص الإدخال المملوكة للتنفيذ، وتستبعد البرنامج الثابت والمكتبات وتخصيصات الشيفرة الخارجية. يتقدم فشل الحد البنيوي على حد الذاكرة عند العملية نفسها. فشل التخصيص دون السقف هو host-failure / allocation-failed.
يبدأ مؤقت الفحص حين يقبل العامل المحمّل المهمة، ومؤقت التنفيذ حين يقبل التشغيل بعد نجاح الفحص. لا يدخل التحميل في المؤقتين، ولا يدخل انتظار إدخال المستخدم في مؤقت التنفيذ. أول حد ملحوظ يحدد النتيجة؛ بلوغ الموعد ينهي العامل بسبب time-limit. يرفض حد الخرج الاستدعاء الذي يتجاوزه بأكمله ويبقي الخرج السابق جزئيا. ليس للتنفيذ الأصلي سقف منتج للتعليمات أو الوقت أو الخرج، مع بقاء الحد التمثيلي لعداد التعليمات.
تستخدم ASPL 0.2.0 صيغة البايت كود الخاصة بالإصدار 2. لا تقبل البنى الحالية البايت كود للإصدار 1. ليست الصيغة واجهة توافق عامة.
المتصفح فقط
دالة ابدأ_الرئيسية() -> ص64 {
طالما صواب {}
أرجع 0.
}
النتائج المتوقعة والخرج الحرفي
browser: check success; limit-stop / execution-instruction-limit / ceiling 10000000; stdout ""نزّل المصدر افتح في المحرر
المتصفح فقط
fn start_main() -> i64 {
while true {}
return 0;
}
النتائج المتوقعة والخرج الحرفي
browser: check success; limit-stop / execution-instruction-limit / ceiling 10000000; stdout ""نزّل المصدر افتح في المحرر
الأسباب والنتائج: policy-rejection / foreign-imports-not-supported; limit-stop / execution-instruction-limit
تطبيق المضيف: browser
هذه حدود أرشيف بيان المطابقة 0.1.1. يربط كل معرّف بالنص المرجعي الذي يملكه، ولا تصف ميزات إدخال ASPL 0.2.0.
على x86-64 Linux مع glibc، يستطيع برنامج ASPL أصلي تحميل أي مكتبة مشتركة يقبلها المحمّل الديناميكي لـglibc واستدعاء دالة مسماة حين يطابق نوعها الدقيق في C أحد محوّلات الاستدعاء الخارجي المدعومة. يدعم الإصدار الأدنى int(const char *) وdouble(double). تبقى إتاحة المكتبة وصلاحية المؤشر وسلوك الدالة الخارجية مسؤولية البرنامج.
مقبول: مكتبة ورمز حرفيان غير فارغين وبلا NUL، مع وسم عدم الأمان في الموضعين. مرفوض: تكرار المكتبة والرمز، توقيع لا يطابق المحوّل أو غياب الوسم.
المحوّل سي_صحيح__مؤشر_محرف_ثابت / c_int__const_char_ptr يحول (string) -> i64 إلى int (*)(const char *). قبل دخول C يرفض النص ذا NUL وينسخ البايتات ويضيف فاصلة النهاية. تنتهي الإعارة بعودة الدالة. يجوز القراءة فقط أثناء الاستدعاء ولا يجوز التعديل أو الاحتفاظ بالمؤشر. تحول نتيجة int بالقيمة، وتبقى القيم السالبة بيانات عادية.
المحوّل سي_مزدوج__مزدوج / c_double__double يطابق (f64) -> f64 مع double (*)(double). يمرر القيم الثنائية ويطبّع نتيجة NaN ويستعيد بيئة الحساب العائم. لا يفحص أي من المحوّلين errno أو أعلام الاستثناءات أو اصطلاحات أخطاء المكتبة.
يفحص check وbuild التصريحات بلا فتح مكتبات. يجهز التنفيذ كل الاستيرادات قبل دالة البداية بترتيب بايتات المكتبة ثم الرمز ثم رقم المحوّل. يفتح كل اسم مرة واحدة باستخدام RTLD_NOW | RTLD_LOCAL ثم يبحث عبر dlsym وdlerror. تمر الأسماء بلا تعديل وفق قواعد محمّل glibc. أول فشل يمنع دالة البداية ويغلق المقابض المفتوحة بالترتيب العكسي.
في مثال puts، نزّل المصدر وافحصه ثم شغّله على المضيف الأصلي. تضيف دالة المكتبة السطر الجديد. افحص النتيجة السالبة بنفسك ولا تستخدم القيمة الموجبة غير المحددة كحالة العملية. فشل تخصيص الإعارة فشل مضيف؛ ولا يضمن النظام تحويل انهيار الدالة الخارجية أو احتفاظها بالمؤشر إلى توقف مضبوط.
المضيف الأصلي فقط
خاص بالمضيف الأصلي. يرفض المتصفح هذا الاستيراد بالصنف policy-rejection / foreign-imports-not-supported قبل التنفيذ، حتى إن لم يُستدع.
غير_آمن خارجي اطبع_سطر(رسالة: نص) -> ص64
= سي_صحيح__مؤشر_محرف_ثابت("libc.so.6", "puts").
دالة ابدأ_الرئيسية() -> ص64 {
دع النتيجة = غير_آمن اطبع_سطر("مرحبا").
إذا النتيجة < 0 { أرجع 1. }
أرجع 0.
}
النتائج المتوقعة والخرج الحرفي
browser: check policy-rejection; policy-rejection / foreign-imports-not-supported; stdout "" native: check 0; success / status 0; stdout "مرحبا\n"نزّل المصدر افحص رفض المتصفح
aspl check puts-ar.aspl
aspl run puts-ar.aspl
المضيف الأصلي فقط
خاص بالمضيف الأصلي. يرفض المتصفح هذا الاستيراد بالصنف policy-rejection / foreign-imports-not-supported قبل التنفيذ، حتى إن لم يُستدع.
unsafe foreign اطبع_سطر(رسالة: string) -> i64
= c_int__const_char_ptr("libc.so.6", "puts");
fn start_main() -> i64 {
let النتيجة = unsafe اطبع_سطر("مرحبا");
if النتيجة < 0 { return 1; }
return 0;
}
النتائج المتوقعة والخرج الحرفي
browser: check policy-rejection; policy-rejection / foreign-imports-not-supported; stdout "" native: check 0; success / status 0; stdout "مرحبا\n"نزّل المصدر افحص رفض المتصفح
aspl check puts-en.aspl
aspl run puts-en.aspl
المضيف الأصلي فقط
خاص بالمضيف الأصلي. يرفض المتصفح هذا الاستيراد بالصنف policy-rejection / foreign-imports-not-supported قبل التنفيذ، حتى إن لم يُستدع.
غير_آمن خارجي جذر(قيمة: ع64) -> ع64
= سي_مزدوج__مزدوج("libm.so.6", "sqrt").
دالة ابدأ_الرئيسية() -> ص64 {
دع النتيجة = غير_آمن جذر(4.0).
إذا النتيجة تطابق 2.0 { أرجع 0. }
أرجع 1.
}
النتائج المتوقعة والخرج الحرفي
browser: check policy-rejection; policy-rejection / foreign-imports-not-supported; stdout "" native: check 0; success / status 0; stdout ""نزّل المصدر افحص رفض المتصفح
aspl check double-ar.aspl
aspl run double-ar.aspl
المضيف الأصلي فقط
خاص بالمضيف الأصلي. يرفض المتصفح هذا الاستيراد بالصنف policy-rejection / foreign-imports-not-supported قبل التنفيذ، حتى إن لم يُستدع.
unsafe foreign جذر(قيمة: f64) -> f64
= c_double__double("libm.so.6", "sqrt");
fn start_main() -> i64 {
let النتيجة = unsafe جذر(4.0);
if النتيجة matches 2.0 { return 0; }
return 1;
}
النتائج المتوقعة والخرج الحرفي
browser: check policy-rejection; policy-rejection / foreign-imports-not-supported; stdout "" native: check 0; success / status 0; stdout ""نزّل المصدر افحص رفض المتصفح
aspl check double-en.aspl
aspl run double-en.aspl
الأسباب والنتائج: unknown-foreign-adapter, foreign-signature-mismatch, invalid-foreign-library-name, invalid-foreign-symbol-name, duplicate-foreign-target, unsafe-required-on-foreign-declaration, unsafe-required-on-foreign-call; load-failure / foreign-library-open-failed, foreign-symbol-lookup-failed; trap / foreign-string-contains-nul; host-failure / allocation-failed; policy-rejection / foreign-imports-not-supported
تطبيق المضيف: native
الهدف Linux x86-64 الأساسي مع glibc 2.34 أو أحدث. يجب أن تكون النتائج Linux وx86_64 وglibc 2.34 أو أحدث. فشل تحديد مكتبة GNU libc لا يثبت التوافق. راجع الحدود المعيارية للمضيف.
uname -s
uname -m
getconf GNU_LIBC_VERSION
الحدود المعيارية للإصدار
إصدار ASPL الحالي هو 0.2.0. نزّل أرشيف Linux x86-64 وملف البصمة، ثم افحصهما قبل الفك. هذا إصدار مشروع معلن ولا يدعي المطابقة الرسمية الكاملة لـASPL MVP.
يتضمن مجلد التنزيل الأرشيف وSHA256SUMS والتراخيص. يحتوي المجلد المطابق داخل الأرشيف على aspl, LICENSE-MIT, LICENSE-APACHE وTHIRD-PARTY-NOTICES فقط. الترخيص باختيار MIT OR Apache-2.0.
نزّل أرشيف 0.2.0 وملف البصمة إلى المجلد نفسه. يحتوي ملف البصمة سطرا واحدا من 64 رقما سداسيا صغيرا ومسافتين ثم اسم الملف وسطر جديد. يجب أن يبلغ الفحص aspl-0.2.0-x86_64-linux-gnu.tar.xz: OK قبل الفك. البصمة تحقق سلامة المحتوى ولا تثبت هوية الناشر.
يتضمن هذا الأرشيف إشعارات Unicode لأن الأداة تحتوي جداول مشتقة منه. اقرأ النصوص الكاملة: MIT وApache-2.0 وإشعارات الطرف الثالث.
اعمل في مجلد تنزيل جديد لكل إصدار. افحص القائمة قبل الفك؛ يجب أن تطابق المجلد والملفات والصلاحيات المذكورة. توقف عند فشل أي أمر أو اختلاف القائمة أو النسخة، ولا تنفذ أوامر التثبيت التالية.
يضيف إصدار 0.2.0 القراءة التفاعلية بالسميتين اقرأ_سطر / read_line ويستخدم صيغة البايت كود الخاصة بالإصدار 2. صيغة البايت كود داخلية وليست واجهة توافق عامة.
sha256sum --check SHA256SUMS &&
tar -tvJf aspl-0.2.0-x86_64-linux-gnu.tar.xz
tar -xJf aspl-0.2.0-x86_64-linux-gnu.tar.xz &&
./aspl-0.2.0-x86_64-linux-gnu/aspl --version
الحدود المعيارية للإصدار
بعد التحقق، ضع أداة إصدار 0.2.0 المستخرجة في مسارك أو ثبّت بناء المصدر محليا. يجب أن تطبع aspl 0.2.0. وحدة التحكم المكتبية اختيارية وتبنى منفصلة.
يجب أن يحل command -v aspl إلى $HOME/.local/bin/aspl. إن لم يحدث ذلك استخدم export PATH="$HOME/.local/bin:$PATH" في الصدفة الحالية. للاستمرار أضف السطر نفسه يدويا إلى ~/.bashrc في Bash أو ~/.zshrc في Zsh. في Fish استخدم fish_add_path "$HOME/.local/bin". افتح صدفة جديدة وأعد فحص المسار والنسخة.
للتثبيت بإدارة المسؤول بعد الفحص نفسه استخدم sudo install -m 0755 ./build/aspl /usr/local/bin/aspl. افحص المسار حتى لا تحجب نسخة قديمة الأداة المختارة.
لبناء وحدة التحكم المكتبية على Linux ثبّت Qt 6.11 وCMake 3.21 أو أحدث، ثم نفّذ أوامر البناء. يحدد الخيار --aspl أداة ASPL التي يستخدمها التشغيل. الملف المختار من سطر الأوامر لا يبدأ حتى تختار Run.
test "$(./build/aspl --version)" = "aspl 0.2.0" &&
install -d "$HOME/.local/bin" &&
install -m 0755 ./build/aspl "$HOME/.local/bin/aspl"
command -v aspl
aspl --version
cmake -S projects/terminal -B build/terminal &&
cmake --build build/terminal &&
build/terminal/aspl-console --aspl ./build/aspl docs/examples/input.en.aspl
الحدود المعيارية للإصدار
احفظ المثال العربي أو الإنجليزي المرتبط باسم hello.aspl. يجب أن تطبع النسخة aspl 0.2.0. ينجح الفحص بلا خرج على أي من القناتين وبالحالة 0. بعد ذلك جرّب مثال الإدخال الصريح.
aspl --version
aspl check hello.aspl
اقرأ المثال وافحصه
تابع إلى العقد الدقيق
الحدود المعيارية للإصدار
للترقية أعد فحص المضيف وتنزيل الإصدار الجديد والتحقق والفك وفحص النسخة المستخرجة ثم استبدل الأداة بأمر التثبيت نفسه. للتراجع اتبع الخطوات نفسها مع إصدار مؤرشف مختار وبصمته. كل إصدار منشور ثابت ولا يتغير تحت الاسم نفسه. لا توجد نسخة احتياطية آلية؛ احتفظ بالأرشيف إن أردت التراجع دون اتصال. أحدث إصدار فقط يتلقى الإصلاحات قبل 1.0.
الإزالة تحذف الأداة المختارة فقط، وتترك إعداد الصدفة والمصدر والبرامج المبنية والأرشيفات. احذف المسار الذي اخترته فقط.
بعد الإزالة شغّل command -v aspl لاكتشاف نسخة أخرى ما زالت على المسار.
rm -- "$HOME/.local/bin/aspl"
للموضع الذي يديره المسؤول فقط: sudo rm -- /usr/local/bin/aspl