طي ثابت
تُعدّ عملية طي الثوابت من تحسينات المُصرّفات المُستخدمة في العديد من المُصرّفات الحديثة ، حيث تُقيّم التعبيرات التي تُعرف قيمها مُسبقًا أثناء عملية المُصرّف، ثم تستبدلها بالنتيجة المحسوبة. [ 1 ]2 * 3 على سبيل المثال، يُمكن استبدال تعبير مثل بـ 6قبل تشغيل البرنامج.
يُستخدم هذا الأسلوب غالبًا مع نشر الثوابت ، الذي يستبدل المتغيرات التي تُعرف قيمها بأنها ثابتة. وهناك شكل متقدم من نشر الثوابت يُعرف باسم نشر الثوابت الشرطية المتفرقة، والذي يُمكنه نشر الثوابت بدقة أكبر وإزالة التعليمات البرمجية غير المستخدمة في الوقت نفسه .
طي ثابت
طي الثوابت هو عملية التعرف على التعبيرات الثابتة وتقييمها في وقت الترجمة بدلاً من حسابها في وقت التشغيل. عادةً ما تكون حدود التعبيرات الثابتة عبارة عن قيم حرفية بسيطة، مثل العدد الصحيح2 ، ولكنها قد تكون أيضًا متغيرات معروفة القيم في وقت الترجمة. لنأخذ العبارة التالية كمثال:
i = 320 * 200 * 32 ;معظم المترجمات لا تُولّد فعلياً تعليمتي ضرب وتخزين لهذه العبارة. بدلاً من ذلك، تُحدّد بنيات مثل هذه وتستبدل القيم المحسوبة في وقت الترجمة (في هذه الحالة، 2,048,000).
يمكن استخدام المتطابقات الحسابية في طي الثوابت. إذا xكان المتغير عدديًا، فإن قيمة المتغير 0 * xتكون صفرًا حتى لو لم يكن المترجم يعرف قيمة المتغير x. (لاحظ أن هذا لا ينطبق على الأعداد العشرية من نوع IEEE ، لأن xالمتغير قد يكون لانهائيًا أو غير معرف ).
قد لا يقتصر تطبيق طي الثوابت على الأرقام فقط. يمكن طي الثوابت من خلال دمج السلاسل النصية"abc" + "def" الثابتة مع السلاسل النصية. يمكن استبدال التعليمات البرمجية مثل بـ "abcdef".
الطي المستمر والتجميع المتقاطع
يجب على المترجمات المتقاطعة ضمان تطابق سلوك العمليات الحسابية على بنية النظام المضيف مع سلوكها على بنية النظام الهدف، وإلا فإن تفعيل طي الثوابت سيغير سلوك البرنامج. ويكتسب هذا الأمر أهمية خاصة في حالة عمليات الفاصلة العائمة ، التي قد يختلف تنفيذها الدقيق اختلافًا كبيرًا.
انتشار ثابت
نشر الثوابت هو عملية استبدال قيم الثوابت المعروفة في التعبيرات أثناء وقت الترجمة. تشمل هذه الثوابت تلك المُعرَّفة أعلاه، بالإضافة إلى الدوال المضمنة المُطبَّقة على قيم الثوابت. انظر إلى الشفرة الزائفة التالية:
int x = 14 ; int y = 7 - x / 2 ; return y * ( 28 / x + 2 );ينتج عن نشر x ما يلي:
int x = 14 ; int y = 7 - 14 / 2 ; return y * ( 28 / 14 + 2 );يؤدي الاستمرار في عملية الانتشار إلى ما يلي (والذي من المحتمل أن يتم تحسينه بشكل أكبر عن طريق إزالة التعليمات البرمجية غير المستخدمة لكل من x و y).
int x = 14 ; int y = 0 ; return 0 ;تُطبَّق آلية نشر الثوابت في المترجمات باستخدام نتائج تحليل تعريفات الوصول . إذا كانت جميع تعريفات الوصول لمتغير ما تُسند إليه نفس القيمة الثابتة، فإن المتغير سيحتفظ دائمًا بنفس القيمة، ويمكن استبداله بهذه القيمة الثابتة.
يمكن أن يؤدي الانتشار الثابت أيضًا إلى تبسيط الفروع الشرطية إلى عبارة واحدة أو أكثر غير مشروطة، إذا كان من الممكن تقييم التعبير الشرطي إلى صحيح أو خطأ في وقت الترجمة لتحديد النتيجة الوحيدة الممكنة.
التحسينات قيد التنفيذ
عادةً ما يتم استخدام الطي الثابت والانتشار معًا لتحقيق العديد من التبسيطات والاختزالات، ويستمر تطبيقها المتداخل والمتكرر حتى تتوقف تلك التأثيرات.
ضع في اعتبارك هذا الكود الزائف غير المُحسَّن الذي يُعيد رقمًا غير معروف في انتظار التحليل:
int a = 30 ; int b = 9 - ( a / 5 ); int c = b * 4 ;إذا كان ( ج > 10 ) { ج = ج - 10 ؛ } أرجع ج * ( 60 / أ )؛يؤدي تطبيق الانتشار الثابت مرة واحدة، متبوعًا بالطي الثابت، إلى:
int a = 30 ; int b = 3 ; int c = b * 4 ;إذا كان ( ج > 10 ) { ج = ج - 10 ؛ } أرجع ج * 2 ؛يؤدي تكرار الخطوتين مرتين إلى:
int a = 30 ; int b = 3 ; int c = 12 ;إذا كان ( صحيحًا ) { c = 2 ; } أرجع c * 2 ;بعد استبدال جميع استخدامات المتغيرات aبالثوابت ، يتم تطبيق عملية إزالة التعليمات البرمجية غير المستخدمةb من قبل المترجم على تلك المتغيرات، مما يترك:
int c = 12 ;ج = 2 ؛أعد c * 2 ;(تختلف البنى المنطقية بين اللغات والمترجمات، لكن تفاصيلها - مثل حالة وأصل وتمثيل القيمة الصحيحة - لا تؤثر على مبادئ التحسين هذه.)
لا ينتج عن نشر الثوابت التقليدي أي تحسين إضافي؛ فهو لا يعيد هيكلة البرامج.
مع ذلك، فإنّ تحسينًا مشابهًا، وهو نشر الثوابت الشرطية المتفرقة ، يتجاوز ذلك باختيار الفرع الشرطي المناسب، [ 2 ] وإزالة الاختبار الشرطي الصحيح دائمًا. وبالتالي، cيصبح المتغير زائدًا عن الحاجة، ولا يتبقى سوى عملية على ثابت.
أعد 4 ؛إذا كانت تلك الشفرة الزائفة تشكل جسم دالة، فإن المترجم يعرف أن الدالة تُقيّم إلى ثابت عدد صحيح 4، مما يسمح باستبدال استدعاءات الدالة بـ 4، ويزيد من كفاءة البرنامج.
انظر أيضاً
مراجع
- ↑ ستيفن موشنيك؛ موشنيك وشركاؤه (15 أغسطس 1997). تصميم وتنفيذ المترجمات المتقدمة . مورغان كوفمان. ISBN 978-1-55860-320-2
انتشار ثابت أو طي ثابت
. - ↑ ويغمان، مارك ن؛ زاديك، ف. كينيث (أبريل 1991)، "نشر الثوابت مع الفروع الشرطية"، معاملات ACM في لغات البرمجة والأنظمة ، 13 (2): 181-210 ، CiteSeerX 10.1.1.130.3532 ، doi : 10.1145/103135.103136 ، S2CID 52813828
للمزيد من القراءة
- موشنيك، ستيفن س. (1997)، تصميم وتنفيذ المترجمات المتقدمة ، مورغان كوفمان، ISBN 9781558603202
- تحسينات المُترجم
