تخطَّ إلى المحتوى

سجل التغييرات القديم (0.5 إلى 0.6)

المصدر: CHANGELOG.md في مستودع المجمّع، والوثائق التي يحيل إليها. هذه الصفحة تقف عند 0.6.0؛ وما تغيّر بعدها في صفحات الترحيل: من 0.6 إلى 0.7، وإلى معالجة الأخطاء، ومن 0.7 إلى 0.8. و0.9 بلا ميزة لغة جديدة (جرّب 0.9 معنا).

  • تجاوز عمق العودية يلتقطه حارس المكدس بدل عدّاد الاستدعاءات المتداخلة، في التشغيل المباشر والملف المبني (ساكناً وحركياً). الرسالة صارت بلا سطر ولا اسم دالة، والرمز 3 كما كان. الحدّ لم يعد 100000 استدعاء بل ما يتسع له مكدس 256 م.ب. العودية الذيلية لا تُحوَّل حلقة حتى مع التحسين، فالعودية بلا توقف خطأ تشغيل في كل وضع.
عودية_بلا_توقف.م
داله بلا_توقف(ن عدد) عدد:
ارجع بلا_توقف(ن + 1) + 1
اطبع("قبل")
اطبع(بلا_توقف(0))
مخرجات مسجّلة من المجمّعmeem عودية_بلا_توقف.م · meem 0.10.0+b01b55f
قبل
[خطأ تشغيل E0342] تجاوز عمق العودية: امتلأ مكدس البرنامج (هل للدالة حالة توقف؟)

رمز الخروج: 3

في فهرس الأخطاء: E0342

بُني أيضاً بـ meem build عند بناء الموقع: ملف ساكن حجمه 30.4 ك.ب، شُغّل وحده وطابق مخرجه المخرج أعلاه.

  • meem build محسَّن افتراضياً (مسار O2 في LLVM). -O0 يعيده إلى التحسين الخفيف (أسرع بناءً). -O مقبول ولا أثر له. وخرج البناء build.optimized صواب افتراضياً.
  • خطأ الذاكرة الذي لا علاقة له بالمكدس (من دالة C مثلاً) يُعطِّل البرنامج كما كان من قبل (رمز 139).
  • meem build --cpu=native: تعليمات معالج هذا الجهاز (للبناء المحلي؛ الملف قد لا يعمل على معالج أقدم).
  • features: build-o0، cpu-native، stack-guard.
  • --check --json على ملف ليس UTF-8 يطبع سطر JSON صالحاً فيه التشخيص (phase: lexical، بسطره وعموده)، لا نصاً. عقد الأدوات.
  • --check --stdin بمدخل ليس UTF-8 ينتهي بالتشخيص نفسه (JSON أو نص) لا بانهيار.

الأرقام في الأداء.

  • تحسين خفيف على شيفرة LLVM في كل تشغيل: المتغيرات في مسجِّلات لا في الذاكرة. لا يتغير ناتج أي برنامج.
  • دمج النصوص والإلحاق بلا snprintf: القطع تُنسخ مباشرة.
  • meem build -O: مسار O1 للملف المبني. أسرع تنفيذاً وأطول بناءً.

الأرقام ومنهج قياسها في الأداء.

  • meem --list-options [--json]: خيارات سطر الأوامر، ما يأخذه كلٌّ منها ومتى أُضيف. سطر الأوامر.
  • features: build-opt، list-options. وخرج البناء فيه build.optimized.
  • حالات على كسر خطأ ترجمة. قارن بـ اذا.
حالات_كسر.م
ك = 2.5
حالات ك:
حاله 2.5:
اطبع("كسر")
مخرجات مسجّلة من المجمّعmeem حالات_كسر.م · meem 0.10.0+b01b55f
​[خطأ دلالي E0217] سطر 2:7 - لا يمكن استخدام النوع 'كسر' في 'حالات'   2 | حالات ك:     |       ^  تلميح: مساواة الكسور لا يُعتمد عليها؛ قارن بـ 'اذا' ومدى (مثل: اذا س > 1.4 و س < 1.6). 'حالات' تعمل مع الأعداد والنصوص والرموز والقيم المنطقية.

رمز الخروج: 2

في فهرس الأخطاء: E0217

  • حقل بلا قيمة افتراضية بعد حقل له قيمة افتراضية خطأ ترجمة: الحقول الافتراضية في آخر الهيكل.
  • كسر(نص) تقبل العشري والأسّي و"inf" و"+inf" و"-inf" و"nan" فقط. الست عشري و"Infinity" خطأ تشغيل، وعدد يتجاوز مدى الكسر ("1e400") خطأ تشغيل.
  • ملفات.اقرأ_ملف ترفض ما ليس UTF-8 وما فيه بايت صفري بخطأ تشغيل.
  • قراءة حاوية[م].مصفوفة[ف()] محددة الآن: ما كان في المصفوفة قبل تقييم الفهرس.

التفصيل في التعابير.

  • وحدات قياسية، كلها تعمل في التشغيل المباشر وفي meem build بالنتيجة نفسها، ومع --no-ffi:
    • نظام: وسائط()، بيئة(اسم)، انهِ(رمز)، الوقت()، مؤقت().
    • ملفات (تجريبية): اقرأ_ملف، اكتب_ملف، الحق_بملف، يوجد_ملف. الفشل خطأ تشغيل برمز 3.
    • عشوائي: صحيح(من, الى)، كسر()، بذرة(ن)؛ مولّد حتمي لا يتغير تسلسله بين المنصات.
    • رياضيات.نسق(ك, خانات): الكسر نصاً بعدد خانات ثابت.
  • المدمجة انتهى_الدخل(): تميّز نهاية الإدخال من السطر الفارغ.
  • meem ملف.م -- وسائط: ما بعد -- وسائط للبرنامج. الملف المبني يأخذها من سطر أوامره.
وسائط.م
استورد نظام
و = نظام.وسائط()
اطبع(طول(و), " ", و)
لكل وسيط في و:
اطبع("- ", وسيط)
مخرجات مسجّلة من المجمّعmeem وسائط.م -- اول "ثانٍ بفراغ" --خيار · meem 0.10.0+b01b55f
3 [اول, ثانٍ بفراغ, --خيار]- اول- ثانٍ بفراغ- --خيار

بُني أيضاً بـ meem build عند بناء الموقع: ملف ساكن حجمه 40.5 ك.ب، شُغّل وحده وطابق مخرجه المخرج أعلاه.

شرحها وأمثلتها في المكتبة القياسية.

  • أخطاء الاستعمال (رمز الخروج 1) وسطر فشل --self-test على stderr. القاعدة الآن واحدة: كل تشخيص على stderr، وstdout لمخرجات البرنامج ونتيجة --json وقوائم --list-*.
  • دالة للمستخدم اسمها انتهى_الدخل تحجب المدمجة (بتحذير)، كما مع كل مدمجة.

إصدار فيه تغييرات كاسرة. برنامج كان يعمل في 0.4 قد يحتاج تعديلاً.

استعماله خطأ ترجمة، ولا يُنفَّذ من البرنامج شيء. البديل: + بين نصين مع التحويل الصريح، أو الفاصلة داخل اطبع:

رسالة = "العدد " + نص(5)
اطبع(رسالة)
اطبع("العدد ", 5)
  • للتحويل الآلي شغّل meem --fix بالإصدار 0.4 قبل الترقية. --fix في 0.5.0 لا يحوّله.
  • معرّف الصيغة المهجورة concat-dots خرج من --list-deprecated، والعامل خرج من operators في --list-keywords.

القواعد كلها في التعابير.

في الوضع النصي كانت على stdout. خرج --json على stdout كما كان. أداة تقرأ نص الخطأ من stdout تقرؤه الآن من stderr. الميزة errors-on-stderr في features تدل على السلوك الجديد.

خطأ_نحوي.م
عمر = 20
اذا عمر > 18
اطبع("بالغ")
مخرجات مسجّلة من المجمّعmeem خطأ_نحوي.م · meem 0.10.0+b01b55f
​[خطأ نحوي E0019] سطر 2:13 - انتهى السطر بشكل مفاجئ: متوقع ':'   2 | اذا عمر > 18     |             ^  تلميح: هل نسيت ':' في نهاية سطر الشرط؟

رمز الخروج: 2

في فهرس الأخطاء: E0019

التفصيل في الأخطاء الشائعة.

كانت تُقبل بسلوك غير مقصود (الداخلية تتسرّب إلى الملف كله ولا ترى متغيرات المحيطة). الدوال تُعرَّف في المستوى الأعلى من الملف.

دالة_متداخلة.م
داله خارجية() عدد:
داله داخلية() عدد:
ارجع 1
ارجع داخلية()
اطبع(خارجية())
مخرجات مسجّلة من المجمّعmeem دالة_متداخلة.م · meem 0.10.0+b01b55f
​[خطأ نحوي E0015] سطر 2:5 - الدوال المتداخلة غير مدعومة: تعريف دالة داخل الدالة 'خارجية'   2 |     داله داخلية() عدد:     |     ^~~~  تلميح: عرّف الدالة في المستوى الأعلى من الملف (خارج أي دالة)، ومرّر لها ما تحتاجه معاملات.

رمز الخروج: 2

في فهرس الأخطاء: E0015

في حاوية()[فهرس()] تُقيَّم الحاوية ثم الفهرس، من اليسار كبقية اللغة. كان الفهرس يُقيَّم أولاً حين تكون الحاوية تعبيراً لا اسماً.

ترتيب_الفهرسة.م
داله حاوية() قائمة[عدد]:
اطبع("الحاوية")
ارجع [10, 20, 30]
داله فهرس() عدد:
اطبع("الفهرس")
ارجع 1
اطبع(حاوية()[فهرس()])
مخرجات مسجّلة من المجمّعmeem ترتيب_الفهرسة.م · meem 0.10.0+b01b55f
الحاويةالفهرس20

ملف تنفيذي مستقل يعمل بلا ميم ولا بايثون، ساكن افتراضاً. البناء.

البحث والإدراج والحذف بزمن ثابت في المتوسط. ترتيب المفاتيح ترتيب الإدراج، وهو ضمان من اللغة.

قياسات وثيقة المجمّع (docs/hashmap.md، زمن المعالج للبرنامج كله على جهاز التطوير):

البرنامج قبل بعد
20 ألف مفتاح نصي: إدراج ثم قراءة 2.4–3.0 ث 0.34 ث
20 ألف مفتاح عددي: إدراج ثم قراءة 1.2–1.4 ث 0.28 ث
20 ألف مفتاح نصي: إدراج، حذف نصفها، إعادة إدراجه، مرور 3.7–4.6 ث 0.35 ث
200 ألف مفتاح عددي: إدراج ثم قراءة 107 ث 0.40 ث
3 ملايين قاموس صغير (5 مفاتيح) تُنشأ وتُقرأ وتُعاد في حلقة 1.0–1.1 ث 1.1–1.2 ث

القواميس الصغيرة جداً لم تتسارع.

تُبنى داخل حاوية توزيعة قديمة: تعمل على glibc 2.35 فما فوق. التوزيعات المجرَّبة: أوبونتو 22.04 ودبيان 12.

أُضيف إلى features في --list-keywords --json: deny-deprecated، list-deprecated، build، self-test، emit-ir، errors-on-stderr. عقد الأدوات.

دلالات اللغة كمواصفات: الأولوية، القسمة والباقي، عدد مع كسر (وحدّ الدقة فوق 2^53 في المقارنة)، النطاق، ترتيب التقييم، ترتيب مفاتيح القاموس. الدلالات وقيود معروفة.