شجرة شاك

في مجال الحوسبة ، تُعدّ تقنية "Tree Shaking" أسلوبًا لإزالة التعليمات البرمجية غير المستخدمة، وتُطبّق عند تجميع التعليمات البرمجية مع تبعياتها. وهي شائعة الاستخدام في اللغات الديناميكية ، وتحديدًا في JavaScript / ECMAScript . [ 1 ] وعلى عكس تقنيات إزالة التعليمات البرمجية غير المستخدمة التقليدية التي تعتمد على مكتبة واحدة، والتي تُستخدم عادةً في برامج تصغير حجم الملفات، فإن تقنية "Tree Shaking" تُزيل الدوال غير المستخدمة من جميع أجزاء الحزمة، بدءًا من نقطة الدخول، بحيث لا تُضمّن إلا الدوال التي يُمكن تنفيذها. [ 2 ] [ 3 ] ويمكن وصفها باختصار بأنها "تضمين التعليمات البرمجية النشطة".

في اللغات الأقل ديناميكية مثل لغة C، يصبح حذف التعليمات البرمجية غير المستخدمة مكافئًا لعملية تحسين البرنامج بالكامل ، والتي تستخدم أيضًا معرفة نقاط الدخول.

تاريخ

يُعدّ حذف التعليمات البرمجية غير المستخدمة في اللغات الديناميكية مشكلةً أصعب بكثير منها في اللغات الثابتة. وقد نشأت فكرة "مُحَرِّك الشجرة" في لغة ليسب [ 4 ] في تسعينيات القرن الماضي. وتتلخص الفكرة في إمكانية تمثيل جميع مسارات تنفيذ البرنامج المحتملة على شكل شجرة من استدعاءات الدوال، بحيث يمكن حذف الدوال التي لا يتم استدعاؤها مطلقًا.

تم تطبيق الخوارزمية على جافا سكريبت في أدوات جوجل كلوجر ، ثم على دارت في مترجم دارت2js الذي كتبته جوجل أيضًا ، وقدمه بوب نيستروم في عام 2012 [ 5 ] [ 3 ] ووصفه كتاب دارت في العمل للمؤلف كريس باكيت في عام 2013:

عند تحويل الكود من لغة دارت إلى جافا سكريبت، يقوم المترجم بعملية "تخفيض حجم المكتبة". في جافا سكريبت، يجب إضافة مكتبة كاملة حتى لو كنت تحتاجها لوظيفة واحدة فقط، ولكن بفضل تقنية تخفيض حجم المكتبة، فإن جافا سكريبت المشتقة من دارت لا تتضمن إلا الوظائف الفردية التي تحتاجها من المكتبة.

كريس باكيت

ويعزى الانتشار التالي للمصطلح إلى مشروع Rollup الذي طوره ريتش هاريس [ 6 ] في عام 2015.

العلاقة بوحدات ECMAScript 6

تستند شعبية تقنية "Tree Shaking" في جافا سكريبت إلى حقيقة أن تحميل الوحدات في ECMAScript 6، على عكس وحدات CommonJS ، يتم بشكل ثابت، وبالتالي يمكن استنتاج شجرة التبعيات بالكامل من خلال تحليل شجرة بناء الجملة بشكل ثابت. علاوة على ذلك، يمكن استيراد ES6 بدقة تصل إلى مستوى القيم المسماة الفردية (الدوال هي قيم) بدلاً من استيراد الملفات بأكملها. وهكذا، تصبح تقنية "Tree Shaking" عملية سهلة.

ومع ذلك، فإن تقنية "Tree Shaking" لا تنطبق فقط على مستوى الملف أو القيمة: بل يمكن أن تعمل أيضًا على مستوى العبارة، اعتمادًا على التنفيذ.

مقارنة بتقنيات DCE في اللغات المترجمة

إن عملية إزالة الملفات من الشجرة على مستوى ملف المصدر مماثلة لمعالجة الرابط القياسي (C/C++/...) للمكتبات الثابتة ، والتي تقوم فقط بربط ملفات الكائنات المطلوبة.

إن عملية إزالة الأجزاء غير المستخدمة من الشجرة على مستوى الوظيفة/المتغير تشبه إنشاء أقسام فردية للوظائف و/أو القيم ( -ffunction-sections -fdata-sections) وجعل الرابط يزيل الأقسام غير المستخدمة ( --gc-sections).

إن عملية إزالة الأجزاء غير الضرورية من الشجرة على مستوى العبارة تشبه عملية DCE للمترجم في ظل تحسين البرنامج بأكمله .

في الحالات الثلاث جميعها، يوجد مفهوم نقاط الدخول لتحديد ما يمكن الوصول إليه وما لا يمكن الوصول إليه.

مراجع