التحسينات

يستخدم MicroPython عدة تحسينات لتوفير ذاكرة RAM وأيضاً لضمان التنفيذ الفعّال للبرامج. يناقش هذا الفصل بعضاً من هذه التحسينات.

ملاحظة

يفصّل تجميع السلاسل في MicroPython (string interning) و الخرائط والقواميس تحسينات أخرى على السلاسل النصية والقواميس.

الشيفرة الثنائية المجمَّدة (Frozen bytecode)

عندما يحمّل MicroPython شيفرة Python من نظام الملفات، فإنه أولاً يحلّل الملف إلى تمثيل مؤقت في الذاكرة، ثم يولّد شيفرة ثنائية (bytecode) للتنفيذ، ويُخزَّن كلاهما في الكومة (في ذاكرة RAM). يمكن أن يؤدي هذا إلى استخدام كميات كبيرة من الذاكرة. يمكن استخدام المترجم العابر (cross compiler) الخاص بـ MicroPython لتوليد ملف .mpy، يحتوي على الشيفرة الثنائية المترجمة مسبقاً لوحدة Python. سيُحمَّل هذا في ذاكرة RAM، ولكنه يتجنب العبء الإضافي لمرحلة التحليل.

كتحسين إضافي، يمكن "تجميد" الشيفرة الثنائية المترجمة مسبقاً من ملف .mpy داخل صورة البرنامج الثابت كجزء من عملية ترجمة البرنامج الثابت الرئيسية، مما يعني أن الشيفرة الثنائية ستُنفَّذ من ذاكرة ROM. يمكن أن يؤدي هذا إلى توفير كبير في الذاكرة، وتقليل تجزئة الكومة.

انظر ملفات بيان (manifest) في MicroPython لمزيد من المعلومات.

المتغيرات

يعالج MicroPython المتغيرات المحلية والعامة بشكل مختلف. تُخزَّن المتغيرات العامة ويُبحث عنها من قاموس عام مخصَّص على الكومة (لاحظ أن كل وحدة لها قاموسها المنفصل الخاص، وبالتالي نطاق أسماء منفصل). أما المتغيرات المحلية فتُخزَّن على مكدس قيم Python، الذي قد يكون موجوداً على مكدس C أو على الكومة. ويُتاح الوصول إليها مباشرةً عبر إزاحتها ضمن مكدس Python، وهو أكثر كفاءة من البحث العام في قاموس.

يؤثر طول أسماء المتغيرات العامة أيضاً على مقدار ذاكرة RAM المستخدمة لأن المُعرّفات تُخزَّن في RAM. وكلما كان المُعرّف أقصر، قلّت الذاكرة المستخدمة.

الجانب الآخر هو أن المتغيرات const التي تبدأ بشَرطة سفلية تُعامَل كثوابت حقيقية ولا تُخصَّص ولا تُضاف في قاموس، مما يوفر بعض الذاكرة. تستخدم هذه المتغيرات const() من مكتبة MicroPython. لذلك:

from micropython import const

X = const(1)
_Y = const(2)
foo(X, _Y)

يُترجَم إلى:

X = 1
foo(1, 2)

تخصيص الذاكرة

معظم بُنى MicroPython الشائعة لا تُخصَّص على الكومة. ومع ذلك، فإن ما يلي يُخصَّص عليها:

  • بُنى البيانات الديناميكية مثل القوائم والتعيينات (mappings) وما إلى ذلك؛

  • الدوال والأصناف ونُسخ الكائنات؛

  • عمليات الاستيراد؛ و

  • الإسناد لأول مرة للمتغيرات العامة (لإنشاء الخانة في القاموس العام).

لمناقشة مفصّلة من منظور أكثر تركيزاً على المستخدم حول التحسين، انظر تعظيم سرعة MicroPython.