تتبع التجميع في الوقت المناسب
تُعدّ تقنية التجميع الفوري المُتتبّع أسلوبًا تستخدمه الآلات الافتراضية لتحسين تنفيذ البرنامج أثناء التشغيل . ويتم ذلك عن طريق تسجيل تسلسل خطي للعمليات التي تُنفّذ بشكل متكرر، وتجميعها إلى لغة الآلة الأصلية ، ثم تنفيذها. في المقابل، يقوم التجميع الفوري التقليدي (JIT) بتجميع كل دالة على حدة، دون إجراء أي تحسينات بينها.
ملخص
الترجمة الفورية (JIT) هي تقنية لزيادة سرعة تنفيذ البرامج عن طريق ترجمة أجزاء منها إلى لغة الآلة أثناء التشغيل. إحدى طرق تصنيف مترجمات JIT المختلفة هي نطاق الترجمة. فبينما تترجم مترجمات JIT القائمة على الأساليب أسلوبًا واحدًا في كل مرة إلى لغة الآلة، تستخدم مترجمات JIT التتبعية الحلقات المتكررة كوحدة ترجمة. تعتمد مترجمات JIT التتبعية على سلوك العديد من البرامج التي تقضي معظم وقتها في بعض حلقات البرنامج، والتي تُسمى الحلقات الساخنة ، وغالبًا ما تسلك تكرارات الحلقات اللاحقة مسارات متشابهة. غالبًا ما تكون الآلات الافتراضية التي تحتوي على مترجم JIT تتبعي بيئات تنفيذ مختلطة، أي أنها تحتوي إما على مترجم فوري أو مترجم أساليب، بالإضافة إلى مترجم JIT التتبعي.
التفاصيل الفنية
يمر مُترجم JIT المُتتبّع بمراحل مُتعددة أثناء التشغيل. أولًا، تُجمع معلومات التنميط للحلقات. بعد تحديد الحلقة الأكثر استهلاكًا للوقت، تبدأ مرحلة تتبع خاصة ، تُسجل جميع العمليات المُنفذة في تلك الحلقة. يُطلق على تسلسل العمليات هذا اسم "التتبع". ثم يُحسّن التتبع ويُترجم إلى لغة الآلة. عند تنفيذ هذه الحلقة مرة أخرى، يُستدعى التتبع المُترجم بدلًا من البرنامج المُقابل.
تم شرح هذه الخطوات بالتفصيل فيما يلي:
مرحلة تحديد الخصائص
يهدف تحليل الأداء إلى تحديد الحلقات المتكررة. ويتم ذلك عادةً عن طريق حساب عدد التكرارات لكل حلقة. بعد أن يتجاوز عدد تكرارات الحلقة حدًا معينًا، تُعتبر الحلقة متكررة، ويتم البدء في مرحلة التتبع.
مرحلة التتبع
في مرحلة التتبع، يستمر تنفيذ الحلقة بشكل طبيعي، ولكن بالإضافة إلى ذلك، يتم تسجيل كل عملية مُنفذة في سجل التتبع. تُخزن العمليات المُسجلة عادةً في شجرة تتبع ، وغالبًا في تمثيل وسيط (IR). يتبع التتبع استدعاءات الدوال، مما يؤدي إلى تضمينها في سجل التتبع. يستمر التتبع حتى تصل الحلقة إلى نهايتها ثم تعود إلى البداية.
بما أن التتبع يُسجّل باتباع مسار تنفيذ محدد للحلقة، فقد تنحرف عمليات التنفيذ اللاحقة لهذا التتبع عن هذا المسار. ولتحديد المواضع التي قد يحدث فيها ذلك، تُضاف تعليمات حماية خاصة إلى التتبع. ومن أمثلة هذه المواضع عبارات "if". تُعدّ عبارة الحماية فحصًا سريعًا لتحديد ما إذا كان الشرط الأصلي لا يزال صحيحًا. إذا فشلت عبارة الحماية، يُوقف تنفيذ التتبع.
بما أن عملية التتبع تتم أثناء التنفيذ، يمكن تضمين معلومات وقت التشغيل في سجل التتبع (مثل معلومات النوع ). ويمكن استخدام هذه المعلومات لاحقًا في مرحلة التحسين لزيادة كفاءة الكود.
مرحلة التحسين وتوليد الكود
يسهل تحسين مسارات التنفيذ، لأنها تمثل مسار تنفيذ واحد فقط، مما يعني عدم وجود تدفق تحكم ولا حاجة إلى معالجته. تشمل التحسينات النموذجية إزالة التعبيرات الفرعية المشتركة ، وإزالة التعليمات البرمجية غير المستخدمة ، وتخصيص السجلات ، ونقل التعليمات البرمجية الثابتة ، وطي الثوابت ، وتحليل الهروب . [ 1 ]
بعد التحسين، يتم تحويل التتبع إلى لغة الآلة. ومثل التحسين، فإن هذا سهل نظرًا للطبيعة الخطية للتتبعات.
تنفيذ
بعد ترجمة التتبع إلى لغة الآلة، يمكن تنفيذه في التكرارات اللاحقة للحلقة. ويستمر تنفيذ التتبع حتى يفشل شرط الحماية.
تاريخ
بينما يعود مفهوم الترجمة الفورية (JIT) إلى ستينيات القرن الماضي، لم يُستخدم تتبع الترجمة الفورية على نطاق واسع إلا مؤخرًا. أول إشارة إلى فكرة مشابهة لفكرة تتبع الترجمة الفورية الحالية كانت في عام 1970. [ 2 ] وقد لوحظ حينها أنه يمكن استخلاص الكود المُترجم من المفسر أثناء التشغيل ببساطة عن طريق تخزين الإجراءات التي تم تنفيذها أثناء الترجمة.
أول تطبيق لتقنية التتبع هو برنامج Dynamo، وهو "نظام برمجي لتحسين الأداء الديناميكي قادر على تحسين أداء سلسلة التعليمات الأصلية أثناء تنفيذها على المعالج بشكل شفاف". [ 3 ] ولتحقيق ذلك، تُفسَّر سلسلة التعليمات الأصلية حتى يتم العثور على تسلسل تعليمات "ساخن". ثم يُولَّد إصدار مُحسَّن لهذا التسلسل، ويُخزَّن مؤقتًا، ويُنفَّذ.
تم تطوير Dynamo لاحقًا إلى DynamoRIO . وكان أحد المشاريع القائمة على DynamoRIO عبارة عن إطار عمل لبناء المفسرات يجمع بين التتبع والتقييم الجزئي. وقد استُخدم "لإزالة عبء المفسر ديناميكيًا من تطبيقات اللغة". [ 4 ]
في عام ٢٠٠٦، طُوِّرَ HotpathVM، وهو أول مُترجم JIT مُتتبِّع للغات البرمجة عالية المستوى . [ ٥ ] كانت هذه الآلة الافتراضية قادرة على تحديد تعليمات البايت كود المُنفَّذة بشكل متكرر ديناميكيًا، والتي يتم تتبُّعها ثم ترجمتها إلى كود الآلة باستخدام بنية التعيين الفردي الثابت (SSA). كان الدافع وراء تطوير HotpathVM هو توفير آلة افتراضية JVM فعالة للأجهزة المحمولة ذات الموارد المحدودة.
مثال آخر على تقنية التتبع الفوري (JIT) هو TraceMonkey ، وهو أحد تطبيقات جافا سكريبت من موزيلا لمتصفح فايرفوكس (2009). [ 6 ] يقوم TraceMonkey بتجميع مسارات الحلقات المتكررة في لغة جافا سكريبت الديناميكية أثناء التشغيل، ويُخصّص الكود المُولّد للأنواع الديناميكية الفعلية التي تظهر في كل مسار.
مشروع آخر يستخدم تقنية تتبع الترجمة الفورية (JIT) هو PyPy . فهو يُمكّن من استخدام هذه التقنية لتطبيقات اللغات المكتوبة باستخدام مجموعة أدوات الترجمة الخاصة بـ PyPy، مما يُحسّن أداء أي برنامج يُنفّذ باستخدام هذا المفسر. ويتحقق ذلك من خلال تتبع المفسر نفسه، بدلاً من تتبع البرنامج الذي يُنفّذه. [ 7 ]
استكشفت مايكروسوفت أيضًا تقنية تتبع الترجمة الفورية (JIT) في مشروع SPUR الخاص بلغة الوسيط المشتركة (CIL). SPUR هو أداة تتبع عامة للغة CIL، ويمكن استخدامها أيضًا لتتبع تنفيذ جافا سكريبت. [ 8 ]
مثال على أثر
لنفترض برنامج بايثون التالي الذي يحسب مجموع مربعات الأعداد الصحيحة المتتالية حتى يتجاوز هذا المجموع 100000:
دالة مربع ( س ): تُرجع س * سi = 0 y = 0 بينما صحيح : y += مربع ( i ) إذا كان y > 100000 : توقف i = i + 1قد يبدو سجل تتبع هذا البرنامج كالتالي:
loopstart ( i1 , y1 ) i2 = int_mul ( i1 , i1 ) # i*i y2 = int_add ( y1 , i2 ) # y += i*i b1 = int_gt ( y2 , 100000 ) guard_false ( b1 ) i3 = int_add ( i1 , 1 ) # i = i+1 jump ( i3 , y2 )لاحظ كيف يتم تضمين استدعاء الدالة squareفي التتبع وكيف يتم تحويل عبارة if إلى guard_false.
انظر أيضاً
مراجع
- ↑ بولز، كارل فريدريش؛ كوني، أنطونيو؛ فيجابكوفسكي، ماسيج؛ لويشل، مايكل؛ بيدروني، سامويل؛ ريغو، أرمين (يناير 2011). "إزالة التخصيص عن طريق التقييم الجزئي في JIT التتبعي" (ملف PDF) . وقائع ورشة عمل ACM SIGPLAN العشرين حول التقييم الجزئي ومعالجة البرامج . PEPM '11. الصفحات 43-52 . doi : 10.1145/1929501.1929508 . S2CID 15871223. تاريخ الاسترجاع : 13 ديسمبر 2020 .
- ↑ ميتشل، جيمس ج. (29 يونيو 1970). تصميم وبناء أنظمة برمجة تفاعلية مرنة وفعالة (أطروحة دكتوراه). جامعة كارنيجي ميلون . ISBN 978-0-8240-4414-5LCCN 79050563. OCLC 633313022. S2CID 36249021. Docket AAI7104538 . تاريخ الاسترجاع: 13 ديسمبر 2020 .
- ↑ بالا، فاسانث؛ دويستروالد، إيفلين؛ بانيرجيا، سانجيف (مايو 2000). "دينامو: نظام تحسين ديناميكي شفاف" (ملف PDF) . وقائع مؤتمر ACM SIGPLAN 2000 حول تصميم لغات البرمجة وتنفيذها . PLDI '00. الصفحات 1-12 . doi : 10.1145/349299.349303 . ISBN 978-1-58113-199-4. S2CID 53223267 . تم الاسترجاع بتاريخ 13-12-2020 .
- ↑ سوليفان، غريغوري ت.؛ برونينغ، ديريك ل.؛ بارون، إيريس؛ غارنيت، تيموثي؛ أماراسينغ، سامان (يونيو 2003). "التحسين الديناميكي الأصلي للمترجمات" (ملف PDF) . وقائع ورشة عمل 2003 حول المترجمات والآلات الافتراضية والمحاكيات . IVME '03. الصفحات 50-57 . CiteSeerX 10.1.1.14.9819 . doi : 10.1145/858570.858576 . ISBN 978-1-58113-655-5. S2CID 509405 . تم الاسترجاع بتاريخ 13-12-2020 .
- ↑ غال، أندرياس ؛ بروبست، كريستيان دبليو؛ فرانز، مايكل (يونيو 2006). "HotpathVM: مُترجم JIT فعال للأجهزة ذات الموارد المحدودة" (ملف PDF) . وقائع المؤتمر الدولي الثاني حول بيئات التنفيذ الافتراضية . VEE '06. الصفحات 144-153 . doi : 10.1145/1134760.1134780 . ISBN 978-1-59593-332-4. S2CID 17846788 . ويكي بيانات Q56580114 . تم الاسترجاع 2020-12-13 .
- ↑ غال، أندرياس؛ أوريندورف، جيسون؛ رودرمان، جيسي؛ سميث، إدوين دبليو؛ رايتماير، ريك؛ بيبينيتا، مايكل؛ تشانغ، ماسون؛ فرانز، مايكل؛ إيش، بريندان؛ شيفر، مايك؛ أندرسون، ديفيد؛ ماندلين، ديفيد؛ حقيقيات، محمد ر.؛ كابلان، بليك؛ هوار، غرايدون ؛ زبارسكي، بوريس (يونيو 2009). "تخصيص النوع في الوقت المناسب القائم على التتبع للغات الديناميكية" (ملف PDF) . وقائع المؤتمر الثلاثين لجمعية ACM SIGPLAN حول تصميم وتنفيذ لغات البرمجة . PLDI '09. الصفحات 465-478 . doi : 10.1145/1542476.1542528 . ISBN 978-1-60558-392-1S2CID 207172806. تم الاسترجاع بتاريخ 13-12-2020 .
- ↑ بولز، كارل فريدريش؛ كوني، أنطونيو؛ فيالكوفسكي، ماسيج؛ ريغو، أرمين (يوليو 2009). "تتبع المستوى الفوقي: مُجمِّع PyPy JIT للتتبع" (ملف PDF) . وقائع ورشة العمل الرابعة حول تنفيذ وتجميع وتحسين لغات البرمجة كائنية التوجه وأنظمة البرمجة . ICOOOLPS '09. الصفحات 18-25 . doi : 10.1145/1565824.1565827 . ISBN 978-1-60558-541-3. S2CID 7478596 . تم الاسترجاع بتاريخ 13-12-2020 .
- ↑ بيبينيتا، مايكل؛ براندنر، فلوريان؛ فاندريش، مانويل؛ لوغوزو، فرانشيسكو؛ شولت، وولفرام؛ تيلمان، نيكولاي؛ فينتر، هيرمان (أكتوبر 2010). "SPUR: مُترجم JIT قائم على التتبع للغة CIL" (ملف PDF) . وقائع المؤتمر الدولي لجمعية ACM حول أنظمة لغات البرمجة وتطبيقاتها الموجهة للكائنات . OOPSLA '10. الصفحات 708-725 . doi : 10.1145/1869459.1869517 . ISBN 978-1-4503-0203-6. S2CID 3395746 . تم الاسترجاع بتاريخ 13-12-2020 .
روابط خارجية
- الموقع الرسمي ، LuaJIT
- بناء المترجم
- تحسين البرمجيات
