موتور جاوا اسکریپت یک برنامهی کامپیوتری هست که کدِ جاوا اسکریپت رو به اون میدیم و اون به کامپیوتر میگه که چطور اون رو اجرا کنه. به طور خلاصه این موتور یک مترجم هست برای رایانه، بین جاوا اسکریپت و زبانی که رایانه اون رو درک میکنه. اما در داخلِ موتور چه اتفاقی میافته؟ خب این به موتور بستگی داره!
موتورهای جاوا اسکریپتیِ زیادی وجود دارن و معمولا توسط ارائه دهندگانِ مرورگرِ وب ایجاد میشن. همه موتورهای جاوا اسکریپت توسط ECMA Script یا ES استاندارد شدن.
کار تجزیه کنندهها، تجزیه و تحلیلِ کد، بررسی خطاها و تقسیم کردنِ کد به قسمتهای کوچکتر هست.
تجزیه کننده یا parser، یک ساختار دادهی درختی به نام درختِ نحوی انتزاعی (Abstract Syntax Tree) یا AST تولید میکنه. در حقیقت، AST یک نمودارِ درختی از کد اصلی هست که تمام جزئیات رو نشون نمیده اما حاوی جزئیاتِ ساختاری یا مرتبط با محتواست. چیزهای خاصی در درختِ اصلی به طور ضمنی وجود دارن که نیازی به نشون دادن ندارن. به همین دلیل، این درخت که چکیدهی درخت اصلی هست تولید میشه.
یک مفسر مستقیماً کد رو میخونه و اون رو خط به خط اجرا میکنه؛ بدون اینکه نیازی به کامپایل شدن کد به زبان ماشین داشته باشه. مفسرها می تونن از استراتژیهای مختلفی برای افزایش عملکرد استفاده کنن. اونها می تونن کد اصلی رو تجزیه و بلافاصله اجرا کنن، اون رو به کد ماشین کارآمدتر ترجمه کنن و کدهای از پیش کامپایل شده و ساخته شده توسط یک کامپایلر یا ترکیبی از اینها رو اجرا کنن.
کامپایلرها اما زودتر از موعد کار میکنن تا دستورالعملها رو به یک کد ماشین یا فرمِ سطح پایین تبدیل کنن تا کامپیوتر بتونه اونها رو بخونه و اجرا کنه. کامپایلر، ابتدا تمام کدها رو اجرا میکنه و سعی میکنه بفهمه کد چه کار میکنه و بعد اون رو به زبانِ دیگری که خوندنش برای رایانه آسونتر هست، کامپایل میکنه.
بیایید با یک مثال توضیح بدیم:
فرض کنید کد بالا رو داشته باشیم. اگر از مفسر برای اجراش استفاده کنیم، چون نمیتونه کل کد رو تحلیل کنه، توی حلقه هربار که تابع رو میبینه از اول اون رو میخونه و اجرا میکنه؛ و خب این باعث کند شدنِ روندِ اجرای برنامه میشه. درحالیکه اگر از کامپایلرها برای اجرا استفاده میکردیم؛ کامپایلر تابع رو میخوند، متوجه میشد، ذخیره میکرد و هربار از همون استفاده میکرد.
خب ما تا اینجا نتیجه گرفتیم که گرچه مفسرها و کامپایلرها مزایا و معایبی دارن؛ اما به تنهایی مفید نیستن و ما برای اجرای کد جاوا اسکریپت نمیخوایم از یکی از اینها استفاده کنیم. پس اومدن و هردوی اینها رو با هم قاطی کردن و چیزی به اسم JIT Compilerها رو معرفی کردن که ترکیبی از کامپایلرها و مفسرهاست.
پروفایلر تمام کدِ ما رو زیر نظر داره. اطلاعاتی از جمله اینکه چطور میتونیم این کد رو بهینهتر کنیم، چه بخشی چندبار اجرا میشه، چه انواعی وجود دارند و ... رو یادداشت میکنه.
این برای ما چطور مفید هست؟ درحالیکه کد ما داره توسط مفسر اجرا میشه، بخشهایی از کد که قابل بهینه سازی هستند توسط پروفایلر شناسایی شده و به compiler فرستاده میشن. این اتفاق در حین اجرا شدنِ کد اتفاق میوفته و به همین دلیل سرعت کار ما رو بیشتر میکنه.
وقتی کسی میگه جاوا اسکریپت یک زبانِ تفسیر شدهست؛ این تا حدی درسته؛ اما در واقع به نحوهی اجرا بستگی داره. شما میتونید یک پیاده سازی از موتور جاوا اسکریپت داشته باشید که فقط کامپایل بشه. به هرحال این تنها در مورد جاوا اسکریپت نیست و در مورد زبانی مثل پایتون هم صادقه. پایتون رو میشه از طریق یک کامپایلر اجرا کرد یا میشه اون رو تفسیر کرد. بنابراین جواب این سوال اینه که همه چیز از نظر فنی به نحوه اجرا بستگی داره.
منبع: Advanced JavaScript Concepts