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

ماذا تستطيع ميم وما لا تستطيع

مصدر هذه الصفحة الجزء الأول من «تقرير التوجّه 0.9.1» في مستودع المجمّع: كُتب لكل نوع برنامج حقيقي وشُغّل وقيس على 0.9.1، وما تغيّر في 0.10.0 من docs/memory-safety.md وdocs/release-0.10.0.md هناك. والمشاريع الخمسة أُعيد تشغيلها بـ 0.10.0 ونواتجها لم تتغير. ولا وعد فيها بما بعد 0.10.0.

النوع المثال المجرَّب النتيجة
أدوات سطر أوامر تعالج نصوصاً أكثر الكلمات تكراراً تعمل؛ الزمن بمستوى بايثون (0.70 ث مقابل 0.74)، والذاكرة أكثر بنحو 7 مرات
معالجة ملفات CSV ونصية تتسع للذاكرة تلخيص ملف CSV تعمل؛ 0.64 ث مقابل 0.54 لبايثون
خوارزميات وهياكل بيانات دايكسترا وشجرة بحث بمستوى C: 0.27–0.31 ث مقابل 0.29 لـ gcc -O2
تطبيقات تعليمية في الطرفية لعبة إكس-أو تعمل؛ 0.24 ث
برامج نظامية صغيرة على الملفات عدّاد أسطر المجلدات تعمل؛ 0.02 ث لـ 64 ملفاً
غلاف رفيع حول مكتبة C بحث نمطي بـ regcomp وCRC-32 بـ zlib عبر خارجي يعمل، بشرط أن يتولى كاتبه خطر والبايتات، وبناؤه حركي إجباري

وما يسهّل الكتابة: لغة صغيرة، ورسائل خطأ عربية بمعرّف ثابت وتلميح، ومعالجة أخطاء إلزامية بثلاث كلمات، وملف تنفيذي واحد بعشرات الكيلوبايتات بلا اعتماد، وكاشف ذاكرة يعمل افتراضياً في التشغيل المباشر ويذكر سطر الإنشاء وسطر التحرير، و--debug-mem يقول أي سطر لم يحرّر.

ما لا تستطيعه بعد، والحلول الالتفافية

رابط إلى قسم «ما لا تستطيعه بعد، والحلول الالتفافية»

مرتب بشدة أثره على برنامج حقيقي:

ما لا تستطيعه حل التفافي اليوم؟
قراءة ملف سطراً سطراً أو بكتل (الوحدة ملفات تقرأ الملف كله) نعم: fopen وfgets من C عبر خارجي ومخزن خام في خطر، أو توجيه الملف إلى الإدخال القياسي وقراءته بـ اقرأ()
ملفات ثنائية وبايتات (اقرأ_ملف يرفض غير UTF-8، وطول بالأحرف لا البايتات) جزئياً: fread من C إلى مخزن خام
الشبكة بكلفة: sockets من libc عبر خارجي
أنواع معمَّمة (كومة أو شجرة لأي نوع) لا: تُنسخ الشيفرة لكل نوع
تشغيل أوامر وعمليات نعم: system() من C
الخيوط والتوازي خطِر: pthread يعمل لحساب بلا حجز، والحجز من خيطين غير معرَّف
JSON يدوياً فقط، ولم يُجرَّب
تعابير نمطية نعم: regcomp وregexec من libc
مكتبة تُستدعى من C لا رسمياً
الإغلاقات والدوال المتداخلة لا: دالة في المستوى الأعلى وحالتها في هيكل
قيمة اختيارية لغير النص قيمة حارسة (-1)، أو هيكل بحقل موجود، أو !عدد
إرجاع أكثر من قيمة هيكل
مفتاح قاموس من هيكل، والمجموعات مفتاح نصي مركّب، وقاموس[نص, منطقي] مجموعةً
دوال بعدد متغير من الوسائط، وprintf من C اطبع بالفواصل، ورياضيات.نسق ونسق_عدد
الطرائق (س.دالة()) والواجهات دوال تأخذ الهيكل
هيكل بالقيمة إلى C أو منها مؤشر إلى هيكل_سي
واجهات رسومية لم تُجرَّب

وما ظُنّ ناقصاً ووُجد موجوداً: مدى بخطوة، وتعديل حقل عنصر في قائمة مباشرة (ق[0].ك += 10)، والتكرار العميق، وخطأ.لا_ذاكرة من حاول_احجز.

  • البناء الساكن الافتراضي أبطأ من --dynamic بـ 1.2 إلى 1.6 مرة في البرامج الكثيرة الحجز.
  • فهرسة النص بالحرف ن[ف] تمرّ على النص من أوله في كل مرة: 20 ألف فهرسة في 2.2 ث، ولكل ح في ن على النص نفسه في جزء من الألف من الثانية. امشِ على النص بـ لكل حين تستطيع.
  • الذاكرة: حرر لا يتبع ما في داخل الحاوية، ونمو += يترك مخازن قديمة (تسرب محدود)، والملف المبني بلا كاشف لا يكشف الاستعمال بعد التحرير عبر اسم آخر. والكاشف الافتراضي في التشغيل المباشر أبطأ بـ 0% إلى 32%. التفصيل في الذاكرة في ميم.
  • الأخطاء بلا بيانات ولا تتبّع. التفصيل في التعامل مع الأخطاء.
  • التشغيل المباشر (meem برنامج.م) يحمل المجمّع كله: لا يقل عن نحو 95 م.ب لأي برنامج. والملف المبني بين 8 و76 م.ب في الأمثلة.

مناسبة: أدوات طرفية على ملفات نصية تتسع للذاكرة، وتمارين الخوارزميات وهياكل البيانات، وتعليم البرمجة والذاكرة اليدوية بالعربية، وغلاف رفيع حول مكتبة C.

غير مناسبة بعد: خادم أو برنامج طويل العمر (لم يُجرَّب، وحرر لا يتبع البنى المتداخلة)، وأي شيء ثنائي أو شبكي أو متوازٍ بلا C، وأي مكتبة تُستدعى من لغة أخرى، وأي منصة غير لينكس x86_64.

ميم مقابل C وZig · المشاريع الخمسة · جرّب 0.10 معنا