موتورهای جاوا اسکریپت چیست؟ – انجمن DEV

نوشتن کد برای وب گاهی اوقات کمی جادویی به نظر می رسد زیرا ما دنباله ای از کاراکترها را در یک فایل می نویسیم، آن فایل را در مرورگر باز می کنیم و زنده شدن آن را تماشا می کنیم. اما درک فناوری پشت سحر و جادو می تواند به شما کمک کند مهارت خود را به عنوان یک برنامه نویس بهتر تقویت کنید.
در این مقاله، با درک پیچیدگیهای موتورهای جاوا اسکریپت که مرورگرها را تقویت میکنند، متوجه خواهید شد که در پشت صحنه در یک وب یا پشته تلفن همراه با پشتیبانی از جاوا اسکریپت چه میگذرد. بیایید آنچه را که یک موتور جاوا اسکریپت انجام میدهد، چرا پلتفرمهای مختلف از موتورهای مختلف استفاده میکنند، چگونه طی سالها تکامل یافتهاند، و چرا ما بهعنوان توسعهدهندگان باید به آن اهمیت بدهیم، توضیح دهیم.
اول، کمی اصطلاحات
موتور جاوا اسکریپت اغلب نوعی ماشین مجازی نامیده می شود. «ماشین مجازی» به شبیهسازی نرمافزاری یک سیستم رایانهای معین اشاره دارد. انواع مختلفی از ماشینهای مجازی وجود دارد، و آنها بر اساس میزان دقیقی که میتوانند ماشینهای فیزیکی واقعی را شبیهسازی یا جایگزین کنند، طبقهبندی میشوند.
برای مثال، یک «ماشین مجازی سیستمی» یک شبیهسازی کامل از یک پلتفرم را ارائه میکند که میتوان یک سیستم عامل را بر روی آن اجرا کرد. کاربران مک ممکن است با Parallels آشنا باشند، یک ماشین مجازی سیستمی که به شما امکان می دهد ویندوز را روی مک خود اجرا کنید.
از سوی دیگر، «ماشین مجازی پردازشی» عملکرد کمتری دارد و میتواند یک برنامه یا فرآیند را اجرا کند. Wine یک ماشین مجازی فرآیندی است که به شما امکان میدهد برنامههای ویندوز را روی یک ماشین لینوکس اجرا کنید، اما کل سیستمعامل ویندوز را روی جعبه لینوکس ارائه نمیدهد.
موتور جاوا اسکریپت نوعی ماشین مجازی پردازشی است که به طور خاص برای تفسیر و اجرای کد جاوا اسکریپت طراحی شده است.
توجه: مهم است که بین موتورهایی که با چیدمان صفحات وب، یک مرورگر را تغذیه می کنند، در مقابل موتور جاوا اسکریپت سطح پایین که کد را تفسیر و اجرا می کند، تفاوت قائل شوید. توضیح خوبی در این مقاله در مورد نحوه کار مرورگرها آمده است.
بنابراین، موتور جاوا اسکریپت دقیقاً چیست و چه کاری انجام می دهد؟
کار اصلی یک موتور جاوا اسکریپت، زمانی که همه چیز گفته می شود و انجام می شود، این است که کد جاوا اسکریپتی را که یک توسعه دهنده می نویسد، دریافت کند و آن را به کد سریع و بهینه تبدیل کند که می تواند توسط یک مرورگر تفسیر شود یا حتی در یک برنامه کاربردی جاسازی شود. JavaScriptCore، در واقع، خود را «ماشین مجازی بهینهسازی» مینامد.
به طور دقیق تر، هر موتور جاوا اسکریپت نسخه ای از ECMAScript را پیاده سازی می کند که جاوا اسکریپت گویش آن است. همانطور که ECMAScript تکامل می یابد، موتورهای جاوا اسکریپت نیز پیشرفت می کنند. دلیل وجود موتورهای مختلف بسیار زیاد این است که هر کدام برای کار با یک مرورگر وب متفاوت، مرورگر هدلس یا زمان اجرا مانند Node.js طراحی شده اند.
احتمالاً با مرورگرهای وب آشنایی دارید، اما مرورگر بدون هد چیست؟ این یک مرورگر وب بدون رابط کاربری گرافیکی است. آنها برای اجرای تست های خودکار در برابر محصولات وب شما مفید هستند. از نسخه 59 کروم و نسخه 56 فایرفاکس، مرورگرهای معمولی را می توان به این روش، به ویژه برای آزمایش، استفاده کرد. و Node.js در کجا قرار می گیرد؟ Node.js یک چارچوب ناهمزمان و رویداد محور است که به شما امکان می دهد از جاوا اسکریپت در سمت سرور استفاده کنید. از آنجایی که آنها ابزارهای جاوا اسکریپت هستند، از موتورهای جاوا اسکریپت نیرو می گیرند.
با توجه به تعریف ماشین مجازی در بالا، منطقی است که یک موتور جاوا اسکریپت را ماشین مجازی پردازشی نامگذاری کنیم، زیرا تنها هدف آن خواندن و کامپایل کد جاوا اسکریپت است. این به این معنی نیست که یک موتور ساده است. به عنوان مثال، JavaScriptCore دارای شش “بلوک سازنده” است که کد جاوا اسکریپت را تجزیه و تحلیل، تفسیر، بهینه سازی و جمع آوری زباله می کند.
این چگونه کار می کند؟
این بستگی به موتور دارد. بیایید دو موتور مهم را در نظر بگیریم: JavaScriptCore WebKit و موتور V8 گوگل. این دو موتور به طور متفاوتی کد پردازش را مدیریت می کنند.
JavaScriptCore یک سری مراحل را برای تفسیر و بهینه سازی یک اسکریپت انجام می دهد:
یک تحلیل واژگانی انجام می دهد و منبع را به یک سری نشانه یا رشته هایی با معنای مشخص تقسیم می کند.
سپس توکن ها توسط تجزیه کننده برای نحو تجزیه و تحلیل می شوند و در یک درخت نحو ساخته می شوند.
سپس چهار فرآیند JIT (در زمان مقرر) شروع به تجزیه و تحلیل و اجرای بایت کد تولید شده توسط تجزیه کننده می کنند.
به زبان ساده، این موتور جاوا اسکریپت کد منبع شما را می گیرد، آن را به رشته ها تقسیم می کند (معروف به لکس آن)، آن رشته ها را می گیرد و به بایت کد تبدیل می کند که یک کامپایلر بتواند آن را بفهمد، و سپس آن را اجرا می کند.
موتور V8 گوگل که به زبان C++ نوشته شده است، کد منبع جاوا اسکریپت را نیز جمعآوری و اجرا میکند، تخصیص حافظه را مدیریت میکند و زبالهها را جمعآوری میکند. طراحی آن شامل یک خط لوله کامپایلر است که کد منبع را مستقیماً در کد ماشین کامپایل می کند:
-
Ignition، مفسری که بایت کد را تولید می کند
-
TurboFan، یک کامپایلر بهینه سازی که آن بایت کد را در کد ماشین کامپایل می کند
-
SparkPlug، کامپایلری که TurboFan را تکمیل می کند
اگر به تاریخ علاقه دارید، این خط لوله جدید جایگزین طراحی کامپایلر دوگانه Full-codegen و Crankshaft قدیمی شده است که قبلاً توسط V8 استفاده می شد.
هنگامی که کد ماشین توسط فرآیند کامپایل تولید می شود، موتور تمام انواع داده ها، اپراتورها، اشیاء و عملکردهای مشخص شده در استاندارد ECMA را در معرض مرورگر قرار می دهد، یا هر زمان اجرا که نیاز به استفاده از آنها دارد، مانند Node.js، Deno، یا Electron (که توسط Visual Studio Code استفاده می شود).
یک انحراف کوچک: زمان اجرا
اگر موتورهای جاوا اسکریپت بی سر و صدا در پس زمینه کار کنند، کد را تجزیه و آن را به رشته های قابل خواندن تقسیم کنند تا کامپایلر بتواند آن را بخواند و کامپایل کند، زمان اجرا توجه بیشتری را به خود جلب می کند. چرا اینطور است؟
زمانهای اجرا معروف بر روی موتورهای جاوا اسکریپت کار میکنند و قدرت آنها را افزایش میدهند. شناخته شده ترین آنها Node است، اما Deno و Bun تازه واردان این عرصه هستند. Node و Deno V8 را تعبیه می کنند و Bun جاوا اسکریپت کور را تعبیه می کند.
Bun ادعا می کند که سریعتر از Node یا Deno اجرا می شود زیرا JavaScriptCore سریعتر از V8 است و 69845 درخواست http در ثانیه در مقابل 16288 برای Node و 12926 برای Deno انجام می دهد.
همانطور که در Docs Bun بیان شده است، هدف این زمانهای اجرا، اجرای بیشتر جاوا اسکریپت دنیا در خارج از مرورگرها است، بهبود عملکرد و پیچیدگی در زیرساختهای آینده شما و همچنین بهرهوری توسعهدهندگان از طریق ابزار بهتر و سادهتر. این زمانهای اجرا، در واقع، از قدرت موتورهای جاوا اسکریپت برای اجرای جاوا اسکریپت خارج از مرورگرها استفاده میکنند.
NativeScript نمونه خوبی از زمان اجرا است که به طور خاص برای توسعه برنامه های کاربردی تلفن همراه بومی چند پلتفرمی ساخته شده با استفاده از جاوا اسکریپت ساخته شده است.
این زمان های اجرا همچنین برای حل برخی از مشکلات ذاتی ارائه شده توسط معماری تک رشته ای جاوا اسکریپت ساخته شده اند. برای مثال Node اجرای ناهمزمان و بدون رشته روتین ها را در اولویت قرار می دهد. همه این زمانها تجربه توسعهدهندهای را ارائه میکنند، از جمله پشتیبانی از APIهای محبوب مانند fetch، websocket و حتی JSX، مورد علاقه توسعهدهندگان React. این ممکن است دلیلی باشد که آنها تمایل به جلب توجه توسعه دهندگان دارند.
در مجموع، زمانهای اجرا، شکافهای درک شده در عملکرد معماری استاندارد مرورگر و موتورهایی که آنها را تامین میکنند، برطرف میکند. همانطور که موتورها تکامل مییابند، مطمئناً این زمانها نیز تکامل خواهند یافت.
چه موتورهای جاوا اسکریپت وجود دارد؟
تنوع زیادی از موتورهای جاوا اسکریپت برای تجزیه و تحلیل، تجزیه و اجرای کد سمت مشتری شما وجود دارد. با انتشار هر نسخه مرورگر، موتور جاوا اسکریپت ممکن است تغییر یا بهینه شود تا با وضعیت هنر در اجرای کد جاوا اسکریپت مطابقت داشته باشد.
به یاد داشته باشید، قبل از اینکه کاملاً با نام هایی که به این موتورها داده می شود گیج شوید، به یاد داشته باشید که فشار بازاریابی زیادی روی این موتورها و مرورگرهایی که زیربنای آنها هستند انجام می شود. در این تجزیه و تحلیل مفید از کامپایل جاوا اسکریپت، نویسنده با ناراحتی خاطرنشان می کند: “اگر نمی دانستید، کامپایلرها تقریباً 37٪ از بازاریابی تشکیل شده اند و تغییر نام تجاری یکی از معدود کارهایی است که می توانید برای یک کامپایلر انجام دهید. از این رو نام قطار: SquirrelFish، Nitro، SFX…”
با توجه به تغییرات نامگذاری و تغییر نام این موتورها، توجه به چند رویداد مهم در تاریخ موتور جاوا اسکریپت مفید است. من یک نمودار مفید برای شما جمع آوری کرده ام:
مرورگر، مرورگر بدون سر، یا زمان اجرا | موتور جاوا اسکریپت |
---|---|
موزیلا | میمون عنکبوتی |
کروم | V8 |
IE | چاکرا |
سافاری | JavaScriptCore* |
Node.js | V8 |
دنو | V8 |
نان | JavaScriptCore |
لبه** | چشمک زدن و V8 |
*JavaScriptCore با نام SquirrelFish بازنویسی شد که به SquirrelFish Extreme تغییر نام داد، همچنین Nitro نیز نامیده می شود. با این حال، هنوز هم یک بیانیه واقعی است که JavaScriptCore را موتور جاوا اسکریپت که زیربنای اجرای WebKit (مانند سافاری) است، بخوانیم.
**Edge در ابتدا از موتور چاکرا استفاده می کرد که برخی از آنها مایکروسافت منبع باز بود. سپس Edge به عنوان یک مرورگر Chromium با موتورهای Blink و V8 JavaScript در زیر کاپوت بازسازی شد.
چرا باید اهمیت دهیم؟
هدف از فرآیند تجزیه و اجرای کد موتور جاوا اسکریپت، تولید بهینه ترین کد در کوتاه ترین زمان ممکن است.
در پایان، تکامل این موتورها به موازات تلاش ما برای تکامل وب و محیط های تلفن همراه است تا آنها را تا حد امکان کارآمد کنیم. برای ردیابی این تکامل، میتوانید نحوه عملکرد موتورهای مختلف را در نمودارهای بنچمارکگذاری مانند آنچه در arewefastyet.com انجام میدهند، ببینید.
هر توسعهدهنده وب باید از تفاوتهای ذاتی در مرورگرهایی که کدهایی را که ما برای تولید، اشکالزدایی و نگهداری آنها سخت کار میکنیم، نمایش میدهند، آگاه باشد. چرا برخی از اسکریپت ها در یک مرورگر به کندی کار می کنند، اما در مرورگر دیگر با سرعت بیشتری کار می کنند؟
توسعه دهندگان موبایل، به طور مشابه، به ویژه آنهایی که برنامه های موبایل هیبریدی را با استفاده از نمای وب برای نمایش محتوای خود می نویسند، می خواهند بدانند چه موتورهایی کد جاوا اسکریپت آنها را تفسیر می کنند. همه توسعه دهندگان وب که به تجربه کاربر اهمیت می دهند باید محدودیت های ذاتی و امکانات ارائه شده توسط مرورگرهای مختلف در دستگاه های کوچک خود را درک کنند. همگام با تغییرات در
موتورهای جاوا اسکریپت زمانی که شما به عنوان یک توسعه دهنده وب، تلفن همراه یا برنامه توسعه مییابید، زمان خوبی را صرف میکنند.
این مقاله در ابتدا در سال 2015 در شبکه توسعهدهنده Telerik ظاهر شد و از آن زمان برای سال 2022 و پس از آن بازبینی و بهروزرسانی شده است. مقاله اصلی در ویکی پدیا در ورودی موتورهای جاوا اسکریپت ذکر شده است.