جاوا اسکریپت یک زبان برنامهنویسی سطح بالا است که ویژگیهایی از زبانهای کامپایل شده و تفسیر شده را ترکیب میکند. در گذشته، این زبان به عنوان یک زبان تفسیر شده در نظر گرفته میشد، زیرا کد آن به صورت خط به خط توسط یک مفسر اجرا میشد. با این حال، با معرفی موتورهای مدرن مانند V8، جاوا اسکریپت از کامپایل Just-In-Time (JIT) برای کامپایل بخشهایی از کد در هنگام اجرا استفاده میکند، که مرز بین زبانهای کامپایل شده و تفسیر شده را محو میکند. این رویکرد ترکیبی به جاوا اسکریپت این امکان را میدهد که هم انعطافپذیری و هم عملکرد بهینهای داشته باشد.
آیا جاوا اسکریپت کامپایل شده است یا تفسیر شده ؟
طبقهبندی جاوا اسکریپت به عنوان یک زبان کامپایل شده یا تفسیر شده بستگی به دیدگاه دارد:
- تفسیر شده: در گذشته، جاوا اسکریپت به صورت خط به خط و به طور مستقیم توسط مفسر اجرا میشد.
- کامپایل شده: موتورهای مدرن مانند V8، جاوااسکریپت را در زمان اجرا به کد ماشین تبدیل میکنند و از کامپایل Just-In-Time (JIT) برای بهینهسازی عملکرد استفاده میکنند.
جریان کاری مدرن جاوا اسکریپت ترکیبی از هر دو روش است. برخی از بخشهای کد برای بارگذاری سریعتر تفسیر میشوند، در حالی که بخشهای دیگر برای اجرای بهینه کامپایل میشوند.
کدام بخش از کد به صورت تفسیر شده اجرا میشود و کدام بخش کامپایل میشود؟
موتورهای مدرن مانند V8 از پروفایلسازی برای تصمیمگیری استفاده میکنند:
- کد تفسیر شده: بیشتر کد به صورت کد بایتکد تفسیر شده شروع میشود تا بارگذاری و اجرای سریعتری داشته باشد.
- کد کامپایل شده: کدهایی که به طور مکرر اجرا میشوند (کد داغ) توسط کامپایلر JIT به کد ماشین بهینه شده کامپایل میشوند.
function computeSum(a, b) {
return a + b
}
for (let i = 0; i < 1000000; i++) {
computeSum(i, i)
}
در این مثال، تابع computeSum
ابتدا به صورت تفسیر شده اجرا میشود، اما با فراخوانی مکرر آن، به کد ماشین بهینهشده تبدیل میشود.
کامپایلر جاوا اسکریپت | V8 چیست؟
V8 یک موتور جاوااسکریپت متنباز است که توسط گوگل توسعه یافته است. این موتور در مرورگرهایی مانند Chrome و محیطهایی مانند Node.js استفاده میشود. V8 به دلیل سرعت و کارایی خود شناخته شده است که این ویژگیها با استفاده از تکنیکهایی پیشرفته مانند کامپایل JIT و جمعآوری زباله (Garbage Collection) حاصل میشود.
نقشهای کلیدی V8 در کامپایل جاوااسکریپت
- پارس کردن: V8 کد منبع جاوااسکریپت را به یک درخت نحو انتزاعی (AST) تبدیل میکند.
- تولید بایتکد: AST را به بایتکد که یک نمایش میانه است، کامپایل میکند.
- اجرای کد: بایتکد با استفاده از مفسر اجرا میشود برای شروع سریع، سپس بخشهای کد داغ به کد ماشین بهینه شده کامپایل میشود.
- بهینهسازی: از تکنیکهایی مانند کلاسهای پنهان و کشینگ درونخطی برای بهبود عملکرد زمان اجرا استفاده میکند.
چه اتفاقی میافتد وقتی که کد جاوا اسکریپت را اجرا میکنید؟
هنگامی که کد جاوااسکریپت اجرا میشود، چندین مرحله را در موتور جاوااسکریپت طی میکند:
- پارس کردن: کد منبع به یک درخت نحو انتزاعی (AST) تجزیه میشود.
- کامپایل کردن: AST به بایتکد ترجمه میشود.
- اجرا: بایتکد توسط مفسر موتور اجرا میشود و توسط کامپایلر JIT بهینهسازی میشود.
بیایید به صورت دقیقتر به این مراحل بپردازیم.
1. پارس کردن
پارس کردن فرآیند تجزیه و تحلیل کد جاوااسکریپت و شکستن آن به قطعات معنادار است که موتور قادر به درک آن باشد. این فرآیند شامل دو مرحله فرعی است:
- تحلیل لغوی (توکنیزاسیون): کد منبع به واحدهای کوچک مانند کلمات کلیدی، شناسهها، عملگرها و مقادیر تقسیم میشود.
- تحلیل نحوی: توکنها به یک ساختار درختی به نام درخت نحو انتزاعی (AST) مونتاژ میشوند.
2. کامپایل کردن
موتور جاوااسکریپت از AST برای تولید کد میانه (بایتکد) استفاده میکند. بایتکد نمایشی سطح پایین از کد است که برای اجرای سریعتر توسط مفسر بهینه شده است.
موتورهای مدرن مانند V8 از کامپایلرهای بهینهسازی استفاده میکنند که به طور مداوم کدی را که در حال اجرا است، نظارت میکنند و از تکنیکهایی مانند کشینگ درونخطی و کلاسهای پنهان برای بهینهسازی آن استفاده میکنند.
3. اجرا
اجرای کد شامل اجرای بایتکد از طریق مفسر است. در همین حال، موتور کد را پروفایل میکند تا بخشهای پرکاربرد (کد داغ) را شناسایی کند. پس از شناسایی، کامپایلر بهینهسازی کد ماشین بسیار بهینهشده برای این بخشها تولید میکند. این فرآیند کامپایل Just-In-Time (JIT) نامیده میشود و به جاوااسکریپت اجازه میدهد که با سرعت نزدیک به کد بومی اجرا شود.
کامپایلر جاوا اسکریپت | جستوجوهای LHS و RHS
هنگامی که کد جاوااسکریپت اجرا میشود، متغیرها از طریق دو نوع جستوجو شناسایی میشوند:
- جستوجوی LHS (سمت چپ عملگر): زمانی که یک متغیر در سمت چپ یک عملیات انتساب قرار دارد، موتور به دنبال مخزن متغیر میگردد تا مقداری را به آن اختصاص دهد.
- جستوجوی RHS (سمت راست عملگر): زمانی که متغیری در سمت راست یک عملیات انتساب قرار دارد یا فقط دسترسی به آن انجام میشود، موتور مقدار متغیر را بازیابی میکند.
دیاگرام نحوه کارکرد کامپایلر جاوا اسکریپت
کامپایلر جاوااسکریپت برای اجرای توابع مراحل مختلفی را طی میکند که از تجزیه و تحلیل اولیه کد تا بهینهسازیهای پیچیده در هنگام اجرا را شامل میشود. این فرآیند با استفاده از تکنیکهایی مانند کامپایل Just-In-Time (JIT)، پروفایلسازی و جمعآوری زباله، عملکرد را بهبود میبخشد و به جاوااسکریپت این امکان را میدهد که کدهایی سریع و انعطافپذیر اجرا کند.
با درک این مراحل و نحوه عملکرد کامپایلر جاوااسکریپت، میتوانیم به بهینهسازی کدهای خود پرداخته و از ویژگیهای پیشرفته موتور جاوااسکریپت بهرهبرداری کنیم تا کدهایی سریعتر و کاراتر بنویسیم.