Ahmed Aljaberi
Ahmed Aljaberi

@ahmed_aljabri

13 تغريدة 23 قراءة Jul 13, 2020
جافاسكريبت في العمق: الجزء الثاني
في البداية عند التنفيذ يمر الكود على Parser يستكشف الكود و يستخرج منه تعريفات المتغيرات و الأوامر و الأقواس و غيرها. و ينشيء ما يسمى بالSyntax Tree او اختصاراً AST. تحتاج تعرف بالضبط ماذا يفعل ؟
جرب أي كود في الموقع هذا astexplorer.net
عملية الParsing وحدها قد تأخذ اكثر من 30% من وقت تحميل الموقع مثل موقع CNN قبل قليل و انظر ماذا تقول ادوات Google Chrome عن الأداء .. للوصول للصفحة اضغط باليمين على الموقع اختر Inspect ثم Performance ثم Others ثم اختر Buttom-Up و فلتر بكلمة parse.
هذه الأداة مهمة قد تقول لك لا تحمل شيء لا تحتاجه, لا تستخدم import * وحدد ماتريده تماماً , لا تبني ملفات Js كبيرة
استخدم مكتبات كoptimize.js لمساعدة الparser متى و ماذا عليه ان يحمل eager او lazy. الموضوع ليس بسيطاً لكن هذا اختصارا للوقت سننتقل للcompiling.
شركة Google لديها لتشغيل جافاسكريبت V8 Engine في متصفحها Chrome , متصفح مايكروسوفت Edge يعمل على محرك مفتوح المصدر اسمه ChakraCore. شركة Apple لديها WebKit شركة Firefox كان لديها SpiderMoneky و الان TraceMonkey.سفاري لديها SquirrelFish Exterme
ليعمل كود JavaScript على جميع تلك المتصفحات. قامت هيئة المقاييس الاوروبية ECMA International بتنظيم عملية التوافقية بين المتصفحات بأن قالت لتلك الشركات هذا الميثاق الذي على كل الشركات اتباعه و تنفيذه كاملاً لأجل التوافقية و عندها تقدروا تقولوا انكم تدعمون ECMAScript 2016 او غيره.
ان كان لديك فضول لمعرفة شكل الميثاق فهو عبارة عن Interfaces لنصوص اللغة مثل ان يقولوا يجب ان يكون هناك كلاس و ميثود Console.log يأخذ كذا و يعيد كذا لكن لا يتدخلون في طريقة كتابة كود الImplementation الذي عادة يكون بال++C وقت بناء الEngine من الشركات.
لنركز في محرك قوقل V8. قوقل طورت اغلب اجزاء الV8 Engine في ميونخ في ألمانيا بلد المحركات. لا أعلم لماذا سموه V8 لكن محركات السيارات V8 سميت لانه لها 8 اسطوانات و شكل المحرك مثل حرف V اربعة اسطوانات في كل جهة. من يعرف المعلومة يرجى اضافتها.
الV8 موجود في Google Chrome و في Electron و في Node مع ان مايكروسوفت اتاحت لNode استخدام Chakra و كذلك فايرفوكس. و بما أن الV8 مفتوح المصدر تقدر انك تضمنه لأي برنامج ++C تريد إنشاءه و لهذا ظهرت قواعد بيانات مثل MongoDB و Couchbase اللي تعتمد لغة جافاسكريبت.
قوقل في V8 لديها كومبايلرين اثنين هي واغلب الشركات نفس الشيء حتى ان بعضها عندها 3. المهم الأول كومبايلر عادي Baseline Compiler اسمه Ignition و يعتبر Interpreter لانه اسرع في التشغيل مثل ما قلنا في الجزء الأول و الثاني Optimizing compiler يسرع التنفيذ و اسمه TurboFan.
بعد عملية الParsing يبدا الكومبايلر الاول ويحول الكود إلى Machine Code و يعطي خلال عملية الCompiling معلومات للكومبايلر الثاني , مثلاً يشوف function يتكرر مناداتها او لما يصادف type معين لمتغير او اوبجكت يقول للكومبايلر الثاني حاول انك تحسن الأداء.
الثاني يشوف اذا هذا الtype ما تغير نوعه فعندها ينتج Machine Code جديد اسرع بدل اللي انتجه الكومبايلر الأول. اما اذا تغير فيقوم بعملية decompiling و يقول للاول انا فشلت , استخدم كودك السابق.
هذا يقولنا إذا كنا نريد تسريع الكود فعلينا ان نبتعد عن تغيير النوع في الكود. اذا اسندت له string خله دايم string و اذا number خله دايم number. و اذا عندك object لا تغير الstructure فيه , خذ اكبر object من ناحية الfields
و اذا كانت القيم فارغه لبعض الobjects اجعلها undefined.
هذه بعض فوائد فهم الlow level. الجزء الثالث غداً ان شاء الله سنرى فيه بعض كود Assembly و بعض معلومات أخرى.
موفقين.

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