Ahmed Aljaberi
Ahmed Aljaberi

@ahmed_aljabri

10 تغريدة 17 قراءة Jul 17, 2020
جافاسكريبت في العمق : الجزء الثالث ( الأخير)
في السلسلة السابقة ذكرنا ان الV8 لديه Interpreter ينتج bytecode و Optimizing Compiler ينتج Machine Code
لنبدأ بكود جافاسكريبت بسيط عبارة عن function تقوم بإيجاد مربع العدد. سننتبع في هذه السلسلة رحلة جافاسكريبت إلى الأسمبلي.
في الكود السابق هذا "ظاهر" جافاسكريبت اللطيف و الجميل و وجهها الذي تقابلنا به , لكن عندما تدخل لمعملها فلها وجه مختلف فأول ماتقوم به هو عملية تحليل الكود الذي كتبناه في عملية اولية تسمى الParsing و تخرج بما يسمى الAST او abstract syntax tree كما في الصورة :
لنشرح ذلك : لدينا شيئين رئيسيين جملة تعريف تبدأ من العمود 0 الى 26. ثم تعبير Expression نوعه CallExpression من الخانة 28 الى 40 خاص بمناداة الfunction. الparser d يرى كل الكود كسطر واحد طويل . الCallExpression يوجد Literal ( حروف مدخلة ) هي الرقم 5 الذي ارسلناه كبارامتر.
بعد هذا يبدا دور الInterpreter للتشغيل السريع و الذي يحوّل تلك الأجزاء إلى بايتكود . هناك امر في nodejs يعرض لنا الbytecode المنتج لكن سيظهر لك المئات و ربما الاف الأسطر من الاكواد لل bytecode. و سنرى كود الfunction في النهاية ..
من حسن الحظ الv8 يعطي امكانية اننا نفلتر باسم الfunction كما في الصورة . هذا هو البايت كود , قريب من لغة لAssembly لكنه يعتبر أعلى قليلاً. سنحاول الشرح للتبسيط.
اولا سترى انه يشيك على الStack قبل أي شيء من خلال تعليمة StackCheck لأجل ما يحصل اي StackOverflow بعدها Ldar الLd اختصار Load و الar اختصار لل accumulator register يعني قم بعملية تحميل القيمة الموجودة في الregister التي عنوانها a0 الى الaccumulator.
لأن العملية رياضية فالaccumulator اسرع هنا لأنه تجميعي و لا يحتاج لتخزين كل نتيجة في الذاكرة الرئيسية ثم يستدعيها.
بعدها تعليمة Mul نفس الassembly و هنا يضرب القيمة الموجودة في الa0 مع القيمة الموجودة في اول خانة في الaccumulator و بعدها return يرجع الناتج في الaccumulator
طيب ما ذا عن جزئية استدعاء الfunction ؟ نحتاج للبحث في الكود. لكن على العموم هناك عدة تعليمات لاستدعاء الfunctions حسب نوعها لكن هنا سيستدعي تعليمة CallUndefinedReceiver لانه لا يعرف حتى الان ماهو نوع المتغير الذي ستعيده الfunction.
العمل السابق قام به الInterpreter المسمى Ignition لكن V8 سيحاول ان يسرع التنفيذ بواسطة الOptimizing Compiler المسمى TurbuFan و ذلك بمساعدة المعلومات التي جمعها الIgnition. هناك امر يمكننا من رؤية الAssembly Code في TurbuFan و الassembly الناتج قد يختلف حسب نوع المعالج
هذا بعض ناتج الأمر السابق و كود الAssembly. سيكون مشابهاً لما تمت دراسته في الجامعة و هذه فائدة اللغات العالية المستوى و التي سهلت لنا الكثير.
هنا تنتهي اجزاء السلسلة و اشكر صبركم و متابعتكم و دمتم بخير.

جاري تحميل الاقتراحات...