نموذج التعيين الفردي الثابت
في تصميم المترجمات ، يُعدّ شكل التعيين الفردي الثابت (يُختصر غالبًا إلى شكل SSA أو ببساطة SSA ) نوعًا من التمثيل الوسيط (IR) حيث يتم تعيين قيمة لكل متغير مرة واحدة فقط. يُستخدم SSA في معظم المترجمات عالية الجودة والمحسّنة للغات الإجرائية، بما في ذلك LLVM ومجموعة مترجمات GNU والعديد من المترجمات التجارية.
توجد خوارزميات فعّالة لتحويل البرامج إلى صيغة SSA. وللتحويل إلى هذه الصيغة، تُقسّم المتغيرات الموجودة في التمثيل الوسيط الأصلي إلى نسخ، حيث تُشار إلى المتغيرات الجديدة عادةً بالاسم الأصلي متبوعًا برمز سفلي، بحيث يحصل كل تعريف على نسخته الخاصة. وقد يلزم أيضًا إدخال عبارات إضافية تُسند قيمًا إلى النسخ الجديدة من المتغيرات عند نقطة التقاء مساري تدفق التحكم. كما أن التحويل من صيغة SSA إلى لغة الآلة فعّال أيضًا.
تُسهّل تقنية SSA إجراء العديد من التحليلات اللازمة للتحسينات، مثل تحديد سلاسل الاستخدام والتعريف ، لأنه عند النظر إلى استخدام متغير ما، لا يوجد سوى مكان واحد قد يكون هذا المتغير قد حصل فيه على قيمة. يمكن تكييف معظم التحسينات للحفاظ على شكل SSA، بحيث يمكن إجراء تحسين تلو الآخر دون الحاجة إلى تحليل إضافي. عادةً ما تكون التحسينات القائمة على SSA أكثر كفاءة وقوة من نظيراتها التي لا تعتمد على شكل SSA.
في مُجمِّعات لغات البرمجة الوظيفية ، مثل تلك الخاصة بـ Scheme و ML ، يُستخدم أسلوب تمرير الاستمرارية (CPS) بشكل عام. يُعدّ أسلوب SSA مُكافئًا رسميًا لمجموعة فرعية مُحسّنة من CPS باستثناء تدفق التحكم غير المحلي، لذا فإن التحسينات والتحويلات المُصاغة باستخدام أحدهما تنطبق عمومًا على الآخر. يُعدّ استخدام CPS كتمثيل وسيط أكثر طبيعية للدوال ذات الرتبة العليا والتحليل بين الإجراءات. كما يُسهّل CPS ترميز استدعاءات الدوال/التحويلات المُستمرة ، بينما لا يُسهّل SSA ذلك. [ 1 ]
تاريخ
طُوِّرت خوارزمية SSA في ثمانينيات القرن العشرين على يد عدد من الباحثين في شركة IBM . وانتقل كينيث زاديك، العضو البارز في الفريق، إلى جامعة براون مع استمرار التطوير. [ 2 ] [ 3 ] في عام 1986، قُدِّمت في ورقة بحثية نقاط الولادة، وتعيينات الهوية، وإعادة تسمية المتغيرات بحيث يكون لكل متغير تعيين ثابت واحد. [ 4 ] وفي عام 1987، أثبتت ورقة بحثية أخرى لجين فيرانتي ورونالد سيترون [ 5 ] أن إعادة التسمية التي أُجريت في الورقة السابقة تُزيل جميع التبعيات الزائفة للقيم العددية. [ 3 ] وفي عام 1988، استبدل باري روزن ومارك ن . ويغمان وكينيث زاديك تعيينات الهوية بدوال Φ، وقدّموا مصطلح "صيغة التعيين الثابت الأحادي"، وعرضوا طريقةً شائعةً لتحسين خوارزمية SSA. [ 6 ] وقد اختار روزن اسم "دالة Φ" ليكون أكثر ملاءمةً للنشر من مصطلح "الدالة الوهمية". [ 3 ] قدم ألبيرن وويغمان وزاديك تحسينًا آخر، ولكن تحت مسمى "التخصيص الفردي الثابت". [ 7 ] وأخيرًا، في عام 1989، وجد روزن وويغمان وزاديك وسيترون وفيرانتي وسيلة فعالة لتحويل البرامج إلى صيغة التخصيص الفردي الثابت. [ 8 ]
فوائد
تكمن الفائدة الأساسية لـ SSA في قدرتها على تبسيط وتحسين نتائج العديد من تحسينات المُصرّف في آنٍ واحد ، وذلك من خلال تبسيط خصائص المتغيرات. على سبيل المثال، انظر إلى هذا الجزء من الكود:
ص := 1 ص := 2 x := y
يستطيع البشر إدراك أن التعيين الأول غير ضروري، وأن قيمة yاستخدام القيمة في السطر الثالث مستمدة من التعيين الثاني y. يتطلب الأمر من البرنامج إجراء تحليل تعريف شامل لتحديد ذلك. أما إذا كان البرنامج مكتوبًا بصيغة SSA، فإن كلا الأمرين واضحان ومباشران.
y 1 := 1 y 2 := 2 x 1 := y 2
تتضمن خوارزميات تحسين المترجم التي يتم تمكينها أو تحسينها بشكل كبير باستخدام SSA ما يلي:
- الطي الثابت – تحويل العمليات الحسابية من وقت التشغيل إلى وقت الترجمة، على سبيل المثال، معاملة التعليمات
a=3*4+5;كما لو كانتa=17; - نشر نطاق القيم [ 9 ] - حساب النطاقات المحتملة التي يمكن أن تتضمنها العملية الحسابية مسبقًا، مما يسمح بإنشاء تنبؤات الفروع مسبقًا.
- نشر الثوابت الشرطية المتفرقة – فحص نطاق بعض القيم، مما يسمح للاختبارات بتوقع الفرع الأكثر احتمالاً
- إزالة التعليمات البرمجية غير المستخدمة - إزالة التعليمات البرمجية التي لن يكون لها أي تأثير على النتائج
- ترقيم القيم العامة – استبدال العمليات الحسابية المكررة التي تنتج نفس النتيجة
- إزالة التكرار الجزئي - إزالة العمليات الحسابية المكررة التي تم إجراؤها مسبقًا في بعض فروع البرنامج
- تقليل القوة - استبدال العمليات المكلفة بعمليات أقل تكلفة ولكنها مكافئة، على سبيل المثال استبدال ضرب أو قسمة الأعداد الصحيحة على قوى العدد 2 بعملية الإزاحة إلى اليسار (للضرب) أو الإزاحة إلى اليمين (للقسمة) الأقل تكلفة.
- تخصيص السجلات – تحسين كيفية استخدام العدد المحدود من سجلات الجهاز لإجراء العمليات الحسابية
التحويل إلى إدارة الضمان الاجتماعي
إن تحويل الكود العادي إلى صيغة SSA يتم في الأساس عن طريق استبدال هدف كل عملية إسناد بمتغير جديد، واستبدال كل استخدام لمتغير بـ "نسخة" المتغير التي وصلت إلى تلك النقطة. على سبيل المثال، انظر إلى مخطط تدفق التحكم التالي :

تغيير الاسم الموجود على الجانب الأيسر من "x"سيؤدي تغيير اسم المتغير x إلى x - 3 في الحالات اللاحقة إلى عدم تغيير البرنامج. يمكن استغلال هذه الثغرة في SSA بإنشاء متغيرين جديدين: x1 و x2 ، حيث يُسند لكل منهما قيمة واحدة فقط. وبالمثل، فإن إعطاء رموز فرعية مميزة لجميع المتغيرات الأخرى يُنتج ما يلي :

من الواضح إلى أي تعريف يشير كل استخدام، باستثناء حالة واحدة: يمكن أن يشير كلا استخدامي y في الكتلة السفلية إلى y 1 أو y 2 ، اعتمادًا على المسار الذي سلكه تدفق التحكم.
لحل هذه المشكلة، يتم إدراج عبارة خاصة في الكتلة الأخيرة، تُسمى دالة Φ (فاي) . ستُنشئ هذه العبارة تعريفًا جديدًا لـ y يُسمى y3 عن طريق "اختيار" إما y1 أو y2 ، اعتمادًا على مسار التحكم السابق.

الآن، يمكن استخدام y 3 ببساطة في الكتلة الأخيرة ، وسيتم الحصول على القيمة الصحيحة في كلتا الحالتين. لا حاجة لدالة Φ لـ x : إذ أن نسخة واحدة فقط من x ، وهي x 2، تصل إلى هذا الموضع، لذا لا توجد مشكلة (بمعنى آخر، Φ( x 2 , x 2 )= x 2 ).
بالنظر إلى مخطط تدفق تحكم عشوائي، قد يكون من الصعب تحديد مكان إدخال دوال Φ، ولأي متغيرات. لهذه المسألة العامة حل فعال يمكن حسابه باستخدام مفهوم يُسمى حدود الهيمنة (انظر أدناه).
لا تُنفَّذ دوال Φ كعمليات آلية على معظم الأجهزة. يمكن للمُصرِّف تنفيذ دالة Φ بإضافة عمليات "نقل" في نهاية كل كتلة سابقة. في المثال أعلاه، قد يُضيف المُصرِّف عملية نقل من y1 إلى y3 في نهاية الكتلة الوسطى اليسرى، وعملية نقل من y2 إلى y3 في نهاية الكتلة الوسطى اليمنى . قد لا تُدرج عمليات النقل هذه في الكود النهائي بناءً على إجراء تخصيص السجلات الخاص بالمُصرِّف . مع ذلك، قد لا تنجح هذه الطريقة عندما تُنتج عمليات متزامنة مدخلات لدالة Φ بشكل تخميني، كما يحدث في الأجهزة ذات الإصدار الواسع . عادةً، تحتوي الأجهزة ذات الإصدار الواسع على تعليمة اختيار يستخدمها المُصرِّف في مثل هذه الحالات لتنفيذ دالة Φ.
حساب الحد الأدنى لمساحة السطح المفردة باستخدام حدود الهيمنة
في مخطط تدفق التحكم، يُقال إن العقدة A تُهيمن تمامًا على عقدة أخرى B إذا كان من المستحيل الوصول إلى B دون المرور عبر A أولًا. بعبارة أخرى، إذا تم الوصول إلى العقدة B، فيمكن افتراض أن A قد تم تشغيلها. ويُقال إن A تُهيمن على B (أو أن B تُهيمن عليها A) إذا كانت A تُهيمن تمامًا على B أو A = B.
العقدة التي تنقل التحكم إلى العقدة A تسمى العقدة السابقة المباشرة لـ A.
حدود الهيمنة للعقدة A هي مجموعة العقد B حيث لا تهيمن A بشكل صارم على B، ولكنها تهيمن على بعض العقد السابقة المباشرة لـ B. هذه هي النقاط التي تندمج عندها مسارات التحكم المتعددة مرة أخرى في مسار واحد.
على سبيل المثال، في الكود التالي:
[1] x = random() إذا كانت قيمة x أقل من 0.5 [2] النتيجة = "رؤوس" آخر [3] النتيجة = "ذيول" نهاية [4] print(النتيجة)
تهيمن العقدة 1 بشكل صارم على العقد 2 و3 و4، والعقدتان 2 و3 هما السلف المباشر للعقدة 4.
تحدد حدود الهيمنة النقاط التي تُستخدم فيها دوال Φ. في المثال أعلاه، عند انتقال التحكم إلى العقدة 4، resultيعتمد تعريف المتغير المستخدم على ما إذا كان التحكم قد انتقل من العقدة 2 أو 3. لا تُستخدم دوال Φ للمتغيرات المُعرَّفة في عقدة الهيمنة، إذ لا يوجد سوى تعريف واحد ممكن ينطبق عليها.
توجد خوارزمية فعالة لإيجاد حدود الهيمنة لكل عقدة. وقد وُصفت هذه الخوارزمية لأول مرة في بحث بعنوان "الحساب الفعال لنموذج التعيين الفردي الثابت ومخطط التحكم" من تأليف رون سيترون، وجين فيرانتي، وآخرين في عام 1991. [ 10 ]
يصف كيث دي. كوبر، وتيموثي جيه. هارفي، وكين كينيدي من جامعة رايس خوارزمية في ورقتهم البحثية بعنوان "خوارزمية هيمنة بسيطة وسريعة : [ 11 ]" .
لكل عقدة ب dominance_frontier(b) := {} لكل عقدة b إذا كان عدد العقد السابقة المباشرة لـ b ≥ 2 لكل p في العقد السابقة المباشرة لـ b العداء := ص بينما يكون العداء ≠ idom(b) dominance_frontier(runner) := dominance_frontier(runner) ∪ { b } runner := idom(runner)في الكود أعلاه، idom(b)يمثل المسيطر المباشر على b، وهو العقدة الفريدة التي تهيمن بشكل صارم على b ولكنها لا تهيمن بشكل صارم على أي عقدة أخرى تهيمن بشكل صارم على b.
المتغيرات التي تقلل عدد دوال Φ
يُدرج نظام SSA "الأدنى" الحد الأدنى من دوال Φ اللازمة لضمان تخصيص قيمة لكل اسم مرة واحدة فقط، وأن كل استخدام لاسم في البرنامج الأصلي يُمكنه الإشارة إلى اسم فريد. (هذا الشرط الأخير ضروري لضمان قدرة المُصرّف على كتابة اسم لكل مُعامل في كل عملية).
مع ذلك، قد تكون بعض دوال Φ هذه غير فعالة . ولهذا السبب، لا ينتج عن استخدام الحد الأدنى من تحليل SSA بالضرورة أقل عدد من دوال Φ اللازمة لإجراء معين. ففي بعض أنواع التحليل، تكون هذه الدوال زائدة عن الحاجة، وقد تؤدي إلى انخفاض كفاءة التحليل.
تم تقليم نبات SSA
يعتمد نموذج SSA المُختصر على ملاحظة بسيطة: لا تُستخدم دوال Φ إلا للمتغيرات التي تُصبح "فعّالة" بعد تطبيق دالة Φ. (هنا، تعني "فعّالة" أن القيمة تُستخدم في مسار ما يبدأ من دالة Φ المعنية). إذا لم يكن المتغير فعّالاً، فلا يمكن استخدام نتيجة دالة Φ، وتُعتبر عملية الإسناد بواسطة دالة Φ غير مُجدية.
تعتمد عملية إنشاء نموذج SSA المُختصر على معلومات المتغيرات النشطة في مرحلة إدراج دالة Φ لتحديد ما إذا كانت دالة Φ معينة مطلوبة. إذا لم يكن اسم المتغير الأصلي نشطًا عند نقطة إدراج دالة Φ، فلن يتم إدراج دالة Φ.
ثمة احتمال آخر يتمثل في التعامل مع عملية التقليم كمسألة إزالة التعليمات البرمجية غير المستخدمة . عندئذٍ، تُعتبر دالة Φ نشطة فقط إذا أُعيد كتابة أي استخدام لها في البرنامج المُدخل، أو إذا استُخدمت كوسيط في دالة Φ أخرى. عند إدخال صيغة SSA، يُعاد كتابة كل استخدام إلى أقرب تعريف يُهيمن عليه. وبالتالي، تُعتبر دالة Φ نشطة طالما أنها أقرب تعريف يُهيمن على استخدام واحد على الأقل، أو على وسيط واحد على الأقل لدالة Φ نشطة.
شبه مشذب
يُعدّ شكل SSA شبه المُختزل [ 12 ] محاولةً لتقليل عدد دوال Φ دون تكبّد التكلفة العالية نسبيًا لحساب معلومات المتغيرات النشطة. ويستند هذا الشكل إلى الملاحظة التالية: إذا لم يكن المتغير نشطًا عند دخوله إلى كتلة أساسية، فلن يحتاج إلى دالة Φ. أثناء إنشاء SSA، تُحذف دوال Φ لأي متغيرات "محلية على مستوى الكتلة".
يُعدّ حساب مجموعة المتغيرات المحلية للكتل إجراءً أبسط وأسرع من تحليل المتغيرات الحية الكامل، مما يجعل صيغة SSA شبه المُقَلَّمة أكثر كفاءةً في الحساب من صيغة SSA المُقَلَّمة. من ناحية أخرى، ستحتوي صيغة SSA شبه المُقَلَّمة على عدد أكبر من دوال Φ.
وسائط الكتلة
تُعدّ وسائط الكتل بديلاً لدوال Φ، وهي متطابقة معها من حيث التمثيل، ولكنها قد تكون أكثر ملاءمةً أثناء التحسين. تُسمى الكتل وتأخذ قائمةً من وسائط الكتل، المُشار إليها بمعاملات الدوال. عند استدعاء كتلة، تُربط وسائط الكتل بقيم مُحددة. تستخدم MLton و Swift SIL و MLIR وسائط الكتل. [ 13 ] تُوضح وسائط الكتل العلاقة بأسلوب تمرير الاستمرارية (CPS): فالكتل الأساسية هي دوال، ومتغيرات الدوال هي وسائط الكتل (دوال Φ).
تحويل نموذج إدارة الضمان الاجتماعي
لا يُستخدم نموذج SSA عادةً للتنفيذ المباشر (مع أنه من الممكن تفسيره [ 14 ] )، ويُستخدم غالبًا "فوق" نموذج وسيط آخر (IR) يرتبط به ارتباطًا مباشرًا. ويمكن تحقيق ذلك من خلال "بناء" SSA كمجموعة من الدوال التي تربط أجزاءً من النموذج الوسيط الحالي (الكتل الأساسية، والتعليمات، والمعاملات، وما إلى ذلك ) بنظيره في SSA. وعندما لا يعود نموذج SSA ضروريًا، يمكن حذف دوال الربط هذه، ليتبقى فقط النموذج الوسيط المُحسَّن.
عادةً ما تؤدي عمليات التحسين على صيغة SSA إلى شبكات SSA متشابكة، أي أن هناك تعليمات Φ لا تشترك جميع معاملاتها في نفس المعامل الجذري. في مثل هذه الحالات، تُستخدم خوارزميات التلوين للخروج من حالة SSA. تُدخل الخوارزميات البسيطة نسخةً على طول كل مسار سابق، مما يتسبب في وضع رمز جذر مختلف في Φ عن وجهتها. توجد خوارزميات متعددة للخروج من حالة SSA بنسخ أقل، وتستخدم معظمها رسومًا بيانية للتداخل أو ما يقاربها لدمج النسخ. [ 15 ]
الإضافات
يمكن تقسيم التمديدات لنموذج إدارة الضمان الاجتماعي إلى فئتين.
تُغيّر امتدادات مخطط إعادة التسمية معيار إعادة التسمية. تذكر أن نموذج SSA يُعيد تسمية كل متغير عند إسناد قيمة له. تشمل المخططات البديلة نموذج الاستخدام الفردي الثابت (الذي يُعيد تسمية كل متغير في كل عبارة عند استخدامه) ونموذج المعلومات الفردي الثابت (الذي يُعيد تسمية كل متغير عند إسناد قيمة له، وعند حدود ما بعد الهيمنة).
تحتفظ الإضافات الخاصة بميزات معينة بخاصية التعيين الفردي للمتغيرات، ولكنها تُدمج دلالات جديدة لنمذجة ميزات إضافية. تُنمذج بعض هذه الإضافات ميزات لغات البرمجة عالية المستوى مثل المصفوفات والكائنات والمؤشرات المُستعارة. بينما تُنمذج إضافات أخرى ميزات معمارية منخفضة المستوى مثل التخمين والتنبؤ.
المترجمون الذين يستخدمون نموذج إدارة الضمان الاجتماعي
مفتوح المصدر
- يستخدم Mono تقنية SSA في مُترجم JIT الخاص به المسمى Mini
- يستخدم WebKit تقنية SSA في مُجمِّعات JIT الخاصة به. [ 16 ] [ 17 ]
- تُعرّف لغة Swift شكلها الخاص SSA فوق LLVM IR، والذي يُسمى SIL (لغة Swift الوسيطة). [ 18 ] [ 19 ]
- أُعيدت كتابة مُصرّف لغة إرلانج في OTP 22.0 لاستخدام تمثيل وسيط داخليًا يعتمد على التعيين الفردي الثابت (SSA)، مع وجود خطط لإجراء المزيد من التحسينات المبنية على SSA في الإصدارات المستقبلية. [ 20 ]
- تستخدم بنية مُجمِّع LLVM صيغة SSA لجميع قيم السجلات العددية (باستثناء الذاكرة) في تمثيلها الأساسي للتعليمات البرمجية. ولا يتم حذف صيغة SSA إلا بعد تخصيص السجلات، في مرحلة متأخرة من عملية التجميع (غالبًا أثناء الربط) .
- تستخدم مجموعة مُترجمات جنو (GCC) تقنية SSA على نطاق واسع منذ الإصدار 4 (الذي صدر في أبريل 2005). تُولّد الواجهات الأمامية شيفرة " عامة " تُحوّل بدورها إلى شيفرة " مبسطة " بواسطة مُبسّط الشيفرة. ثم تُطبّق تحسينات عالية المستوى على شيفرة "المبسطة" المُحوّلة إلى SSA. بعد ذلك، تُترجم الشيفرة الوسيطة المُحسّنة إلى لغة وصف الأجهزة (RTL) ، حيث تُطبّق عليها تحسينات منخفضة المستوى. وأخيرًا، تُحوّل الواجهات الخلفية الخاصة بكل بنية شيفرة RTL إلى لغة التجميع .
- Go (1.7: لبنية x86-64 فقط؛ 1.8: لجميع البنى المدعومة). [ 21 ] [ 22 ]
- تستخدم آلة جافا الافتراضية التكيفية مفتوحة المصدر من IBM ، Jikes RVM ، تقنية SSA الموسعة للمصفوفات، وهي امتداد لتقنية SSA يسمح بتحليل القيم العددية والمصفوفات وحقول الكائنات ضمن إطار عمل موحد. ولا يتم تفعيل تحليل SSA الموسع للمصفوفات إلا عند أعلى مستوى للتحسين، والذي يُطبق على أجزاء التعليمات البرمجية الأكثر تنفيذًا.
- يستخدم محرك جافا سكريبت SpiderMonkey الخاص بمتصفح موزيلا فايرفوكس تقنية IR القائمة على SSA. [ 23 ]
- يُطبّق محرك جافا سكريبت Chromium V8 تقنية SSA في بنية مُجمّع Crankshaft الخاصة به، كما أُعلن في ديسمبر 2010.
- يستخدم PyPy تمثيل SSA خطي للآثار في مترجم JIT الخاص به.
- يستخدم كل من وقت تشغيل Android [ 24 ] وآلة Dalvik الافتراضية SSA. [ 25 ]
- يستخدم مُترجم لغة ML القياسي MLton نظام SSA في إحدى لغاته الوسيطة.
- تعتمد LuaJIT بشكل كبير على التحسينات القائمة على SSA. [ 26 ]
- يستخدم مُترجم PHP و Hack المسمى HHVM نظام SSA في تمثيله الوسيط. [ 27 ]
- يستخدم مُصرّف OCaml نظام SSA في تمثيله الوسيط CMM (الذي يرمز إلى C--). [ 28 ]
- تستخدم مكتبة libFirm، وهي مكتبة تُستخدم كطبقة وسيطة وخلفية للمترجم ، صيغة SSA لجميع قيم السجلات العددية حتى توليد الكود باستخدام مُخصِّص سجلات مُدرك لصيغة SSA. [ 29 ]
- برامج تشغيل Mesa المختلفة عبر NIR، وهو تمثيل SSA للغات التظليل. [ 30 ]
تجاري
- تستخدم آلة جافا الافتراضية HotSpot من أوراكل لغة وسيطة قائمة على SSA في مترجم JIT الخاص بها. [ 31 ]
- يستخدم برنامج Microsoft Visual C++ compiler backend المتوفر في Microsoft Visual Studio 2015 Update 3 تقنية SSA [ 32 ]
- SPIR-V ، وهو معيار لغة التظليل لواجهة برمجة تطبيقات الرسومات Vulkan ولغة النواة لواجهة برمجة تطبيقات الحوسبة OpenCL ، هو تمثيل SSA. [ 33 ]
- تستخدم لغة التظليل DXIL ، الخاصة بمترجم تظليل Microsoft DirectX، تمثيل SSA لأنها نسخة معدلة من LLVM. [ 34 ]
- عائلة IBM من مترجمات XL، والتي تشمل C و C++ و Fortran . [ 35 ]
- NVIDIA CUDA [ 36 ]
البحث والتخلي
- كان برنامج ETH Oberon-2 المترجم أحد أوائل المشاريع العامة التي دمجت "GSA"، وهو شكل مختلف من SSA.
- يستخدم مُصرّف Open64 صيغة SSA في مُحسِّنه القياسي العام، مع العلم أن الكود يُحوَّل إلى صيغة SSA قبل المعالجة ويُعاد إلى صيغة SSA بعدها. يستخدم Open64 امتدادات لصيغة SSA لتمثيل الذاكرة بصيغة SSA بالإضافة إلى القيم القياسية.
- في عام 2002، قام الباحثون بتعديل JikesRVM من IBM (الذي كان يسمى Jalapeño في ذلك الوقت) لتشغيل كل من بايت كود Java القياسي وملفات فئة بايت كود SSA الآمنة من حيث النوع ( SafeTSA )، وأظهروا فوائد أداء كبيرة لاستخدام بايت كود SSA.
- يُعدّ jackcc مُترجمًا مفتوح المصدر لمجموعة تعليمات Jackal 3.0 الأكاديمية. يستخدم رمزًا بسيطًا بثلاثة معاملات مع SSA لتمثيله الوسيط. ومن بين الميزات المثيرة للاهتمام، استبداله لدوال Φ بتعليمات SAME، التي تُوجّه مُخصِّص السجلات لوضع نطاقي القيم النشطة في نفس السجل الفعلي.
- استخدم برنامج تجميع موسيقى الحفلات الموسيقية في إلينوي، الذي يعود تاريخه إلى عام 1994 تقريبًا [ 37 ]، صيغةً معدلةً من SSA تُسمى SSU (الاستخدام الفردي الثابت)، والتي تُعيد تسمية كل متغير عند إسناد قيمة له، وفي كل سياق شرطي يُستخدم فيه هذا المتغير؛ وهي في جوهرها صيغة المعلومات الفردية الثابتة المذكورة أعلاه. وقد وُثِّقت صيغة SSU في أطروحة الدكتوراه لجون بليفياك .
- يستخدم مُجمِّع COINS تحسينات نموذج SSA كما هو موضح هنا .
- يدعم مُجمِّع R-Stream من Reservoir Labs أشكالًا غير SSA (قائمة رباعية)، وSSA، وSSI (معلومات ثابتة مفردة [ 38 ] ). [ 39 ]
- على الرغم من أن برنامج Boomerang ليس مُترجمًا، إلا أنه يستخدم صيغة SSA في تمثيله الداخلي. تُستخدم صيغة SSA لتبسيط عملية نشر التعبيرات، وتحديد المعاملات والقيم المُعادة، وتحليل الحفاظ على البيانات، وغير ذلك.
- استخدم DotGNU Portable.NET مكتبة SSA في مُترجم JIT الخاص به.
انظر أيضاً
- أسلوب تمرير الاستمرارية – شكل مكافئ يُستخدم في الغالب في لغات البرمجة الوظيفية
- الشكل الطبيعي أ
مراجع
ملحوظات
- ↑ كيلسي، ريتشارد أ. (1995). "مُطابقة بين أسلوب تمرير الاستمرارية وشكل التعيين الفردي الثابت" (ملف PDF) . أوراق من ورشة عمل ACM SIGPLAN لعام 1995 حول التمثيلات الوسيطة . الصفحات 13-22 . doi : 10.1145/202529.202532 . ISBN 0897917545. S2CID 6207179 .
- ^ راستيلو وتيشدو 2022 ، ثانية. 1.4.
- 1 2 3 زاديك، كينيث (أبريل 2009). تطوير نموذج التكليف الفردي الثابت (ملف PDF) . ندوة نموذج التكليف الفردي الثابت . أوتران، فرنسا.
- ↑ سيترون، رون؛ لوري، آندي؛ زاديك، ف. كينيث (1986). "نقل التعليمات البرمجية لهياكل التحكم في لغات البرمجة عالية المستوى". وقائع الندوة الثالثة عشرة لجمعية ACM SIGACT-SIGPLAN حول مبادئ لغات البرمجة - POPL '86 . الصفحات 70-85 . doi : 10.1145/512644.512651 . S2CID 9099471 .
- ↑ سيترون، رونالد كابلان؛ فيرانتي، جين. ما أهمية الاسم؟ أو، قيمة إعادة التسمية للكشف عن التوازي وتخصيص التخزين . المؤتمر الدولي للمعالجة المتوازية، ICPP'87، 1987، الصفحات 19-27 .
- ↑ باري روزن؛ مارك ن. ويغمان؛ ف. كينيث زاديك (1988). "أعداد القيم العامة والحسابات الزائدة" (ملف PDF) . وقائع الندوة الخامسة عشرة لجمعية ACM SIGPLAN-SIGACT حول مبادئ لغات البرمجة - POPL '88 . الصفحات 12-27 . doi : 10.1145/73560.73562 . ISBN 0-89791-252-7.
- ↑ ألبيرن، ب.؛ ويغمان، م.ن.؛ زاديك، ف.ك. (1988). "الكشف عن تساوي المتغيرات في البرامج". وقائع الندوة الخامسة عشرة لجمعية ACM SIGPLAN-SIGACT حول مبادئ لغات البرمجة - POPL '88 . الصفحات 1-11 . doi : 10.1145/73560.73561 . ISBN 0897912527. S2CID 18384941 .
- ↑ سيترون، رون؛ فيرانتي، جين؛ روزن، باري ك.؛ ويغمان، مارك ن.؛ زاديك، ف. كينيث (1991). "حساب فعال لصيغة التعيين الفردي الثابت ومخطط تبعية التحكم" (ملف PDF) . معاملات ACM في لغات البرمجة والأنظمة . 13 (4): 451-490 . CiteSeerX 10.1.1.100.6361 . doi : 10.1145/115372.115320 . S2CID 13243943 .
- ↑ انتشار نطاق القيمة
- ↑ سيترون، رون؛ فيرانتي، جين؛ روزن، باري ك.؛ ويغمان، مارك ن.؛ زاديك، ف. كينيث (1 أكتوبر 1991). "حساب فعال لصيغة التعيين الفردي الثابت ومخطط تبعية التحكم" . معاملات ACM في لغات البرمجة والأنظمة . 13 (4): 451-490 . doi : 10.1145/115372.115320 . S2CID 13243943 .
- ↑ كوبر، كيث د.؛ هارفي، تيموثي ج.؛ كينيدي، كين (2001). خوارزمية هيمنة بسيطة وسريعة (ملف PDF) (تقرير فني). جامعة رايس، تقرير فني لعلوم الحاسوب 06-33870. مؤرشف من الأصل (ملف PDF) بتاريخ 26-03-2022.
- ↑ بريغز، بريستون؛ كوبر، كيث د.؛ هارفي، تيموثي ج.؛ سيمبسون، ل. تايلور (1998). تحسينات عملية على بناء وتدمير نموذج التكليف الفردي الثابت (ملف PDF) (تقرير فني). مؤرشف من الأصل (ملف PDF) بتاريخ 7 يونيو 2010.
- ↑ "حجج الكتلة مقابل عقد PHI - الأساس المنطقي لـ MLIR" . mlir.llvm.org . تم الاطلاع عليه في 4 مارس 2022 .
- ↑ فون رون، جيفري؛ نينغ وانغ؛ مايكل فرانز (2004). "تفسير البرامج في شكل تعيين ثابت أحادي" . وقائع ورشة عمل 2004 حول المفسرات والآلات الافتراضية والمحاكيات - IVME '04 . ص 23. doi : 10.1145/1059579.1059585 . ISBN 1581139098. S2CID 451410 .
- ^ بواسينوت، بينوا؛ دارتي، آلان؛ راستيلو، فابريس. دينشين، بينوا دوبونت دي؛ غيلون، كريستوف (2008). "إعادة النظر في الترجمة خارج نطاق اتفاقات الضمان الاجتماعي للتأكد من صحتها وجودة الكود والكفاءة" . هال-إنريا Cs.DS : 14.
- ↑ "تقديم WebKit FTL JIT" . 13 مايو 2014.
- ↑ "تقديم مُجمِّع B3 JIT" . 15 فبراير 2016.
- ↑ "لغة سويفت الوسيطة (GitHub)" . GitHub . 30 أكتوبر 2021.
- ↑ "التمثيل الوسيط عالي المستوى في لغة Swift: دراسة حالة حول استكمال تمثيل LLVM الوسيط بتحسين خاص باللغة، لقاء مطوري LLVM أكتوبر 2015" . يوتيوب . 9 نوفمبر 2015. مؤرشف من الأصل في 21 ديسمبر 2021.
- ↑ "ملاحظات إصدار OTP 22.0" .
- ↑ "ملاحظات إصدار Go 1.7 - لغة برمجة Go" . golang.org . تم الاطلاع عليه بتاريخ 17 أغسطس 2016 .
- ↑ "ملاحظات إصدار Go 1.8 - لغة برمجة Go" . golang.org . تم الاطلاع عليه بتاريخ 17-02-2017 .
- ↑ "نظرة عامة على IonMonkey" .،
- ↑ تطور الفن - مؤتمر جوجل I/O 2016. جوجل . 25 مايو 2016. يبدأ الحدث عند الدقيقة 3 و47 ثانية.
- ^ رامانان ، نيراجا (12 ديسمبر 2011). “JIT عبر العصور” (PDF) .
- ↑ "تحسينات البايت كود" . مشروع LuaJIT.
- ↑ "تمثيل وسيط الهيب هوب (HHIR)" . جيت هاب . 30 أكتوبر 2021.
- ↑ شامبار، بيير؛ لافيرون، فنسنت؛ بينتو، داريو (18-03-2024). "خلف كواليس مُصرّف OCaml المُحسِّن" . OCaml Pro .
- ↑ "شركة - تحسين وتوليد كود الآلة" .
- ^ إكستراند ، جيسون (16 ديسمبر 2014). "إعادة تقديم NIR، IR جديد لميسا" .
- ↑ "بنية محرك أداء Java HotSpot" . شركة أوراكل.
- ↑ "تقديم مُحسِّن كود Visual C++ جديد ومتطور" . 4 مايو 2016.
- ↑ "مواصفات SPIR-V" (ملف PDF) .
- ↑ "لغة DirectX الوسيطة" . مايكروسوفت.
- ↑ ساركار، ف. (مايو 1997). "الاختيار التلقائي للتحويلات عالية الرتبة في مُجمِّعات IBM XL FORTRAN" (ملف PDF) . مجلة IBM للبحوث والتطوير . 41 (3). IBM: 233-264 . doi : 10.1147/rd.413.0233 .
- ↑ تشاكرابارتي، غوتام؛ غروفر، فينود؛ آرتس، باستيان؛ كونغ، شيانغيون؛ كودلور، مانجوناث؛ لين، يوان؛ ماراثي، جايديب؛ مورفي، مايك؛ وانغ، جيان-تشونغ (2012). "CUDA: التجميع والتحسين لمنصة وحدة معالجة الرسومات" . وقائع علوم الحاسوب . 9 : 1910-1919 . doi : 10.1016/j.procs.2012.04.209 .
- ↑ "مشروع حفلات إلينوي" . مؤرشف من الأصل بتاريخ 13-03-2014.
- ↑ أنانيان، سي. سكوت؛ رينارد، مارتن (1999). نموذج معلومات ثابت فردي (PDF) (تقرير فني). CiteSeerX 10.1.1.1.9976 .
- ↑ موسوعة الحوسبة المتوازية .
مراجع عامة
- راستيلو، فابريس. تيتشادو، فلوران بوشيز، محرران. (2022). تصميم المترجم القائم على SSA (PDF) . شام. دوى : 10.1007/978-3-030-80515-9 . رقم ISBN 978-3-030-80515-9. S2CID 63274602 .
{{cite book}}: CS1 maint: موقع الناشر مفقود ( رابط ) - أبيل، أندرو و. (1999). تنفيذ المترجمات الحديثة في لغة ML . مطبعة جامعة كامبريدج. ISBN 978-0-521-58274-2.متوفر أيضًا بلغة جافا ( ISBN) 0-521-82060-X(2002) و C ( ISBN 0-521-60765-5، إصدارات 1998).
- كوبر، كيث د. وتوركزون، ليندا (2003). هندسة المترجمات . مورغان كوفمان. ISBN 978-1-55860-698-2.
- موشنيك، ستيفن س. (1997). تصميم وتنفيذ المترجمات المتقدمة . مورغان كوفمان. ISBN 978-1-55860-320-2.
- كيلسي، ريتشارد أ. (مارس 1995). "التوافق بين أسلوب تمرير الاستمرارية ونموذج التكليف الفردي الثابت" . إشعارات ACM SIGPLAN . 30 (3): 13-22 . doi : 10.1145/202530.202532 .
- أبيل، أندرو و. (أبريل 1998). "SSA هي برمجة وظيفية" . إشعارات ACM SIGPLAN . 33 (4): 17-20 . doi : 10.1145/278283.278285 . S2CID 207227209 .
- بوب، سيباستيان (2006). إطار تمثيل SSA: الدلالات والتحليلات وتنفيذ GCC (أطروحة دكتوراه). مدرسة المناجم في باريس .
- ماتياس براون؛ سيباستيان بوخوالد؛ سيباستيان هاك؛ رولاند ليسا؛ كريستوف مالون؛ أندرياس زوينكاو (2013)، "بناء بسيط وفعال لنموذج التعيين الفردي الثابت" ، بناء المترجمات ، سلسلة محاضرات في علوم الحاسوب، المجلد 7791، سبرينغر برلين هايدلبرغ، الصفحات 102-122 ، doi : 10.1007/978-3-642-37051-9_6 ، ISBN 978-3-642-37050-2تم الاطلاع عليه بتاريخ 24 مارس 2013
روابط خارجية
- بوسشر، ستيفن؛ ونوفيلو، دييغو. يحصل GCC على إطار عمل مُحسِّن جديد . مقال حول استخدام GCC لتقنية SSA وكيف يُحسِّن الأداء مقارنةً بتقنيات IR القديمة.
- قائمة مراجع جمعية الدراسات الاجتماعية الأمريكية . فهرس شامل لأوراق البحث في جمعية الدراسات الاجتماعية الأمريكية.
- زاديك، ف. كينيث. "تطوير نموذج التعيين الفردي الثابت" ، حديث ديسمبر 2007 حول أصول SSA.
- تحسينات المُترجم
