موضوع مقاله: نود جی‌اس | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # نود جی‌اس | مقدمه: نود جی‌اس یا نود دات جی‌اس یک محیط اجرایی سمت سرور متن‌باز و چندسکویی برای زبان جاوااسکریپت است. | ## بخش 1: نود جی‌اس | از لحاظ تاریخی از جاوااسکریپت در درجهٔ اول به عنوان یک زبان اسکریپت‌نویسی سمت کاربر به این صورت استفاده می‌شد که اسکریپت‌های نوشته شده با جاوااسکریپت درون صفحات اچ‌تی‌ام‌ال جاسازی می‌شدند و سپس این اسکریپت‌ها توسط یک موتور جاوااسکریپت در مرورگر وب کاربر پردازش می‌شد. نود جی‌اس امکان استفاده از جاوااسکریپت برای نوشتن اسکریپت‌های سمت سرور را فراهم می‌کند تا بدین صورت بتوان با آن صفحات وب پویا را قبل از فرستادن آن به مرورگر کاربر تولید کرد. در نتیجه نود جی‌اس به یکی از المان‌های اصلی در پارادایم «جاوااسکریپت در همه جا» تبدیل شده‌است که در آن به جای استفاده از زبان‌های برنامه‌نویسی مختلف در نوشتن اسکریپت‌های سمت سرور، از یک زبان واحد برای توسعهٔ برنامه‌های کاربردی وب استفاده می‌شود. به عنوان پسوند نام پروندههای جاوااسکریپت استفاده می‌شود اما این عبارت در نام نود جی‌اس (Node.js) اشاره به پروندهٔ خاصی ندارد و صرفاً قسمتی از نام این محصول است. معماری نرم‌افزاری نود جی‌اس یک معماری مبتنی بر رخداد است که توانایی ارتباط ورودی/خروجی ناهمگام (مسدود نشدنی) را دارد. هدف استفاده از این نوع طراحی نرم‌افزاری، بهینه‌سازی توان عملیاتی و مقیاس‌پذیری در برنامه‌های کاربردی وبی که عملیات ورودی/خروجی زیادی دارند و همچنین برنامه‌های کاربردی وب بلادرنگ (برنامه‌های ارتباط بلادرنگ مانند اتاق گفتگو یا بازی‌های تحت مرورگر) است. شرکت‌های استفاده‌کننده از نود جی‌اس شامل شرکت‌هایی مثل آی‌بی‌ام، گوگل، لینکداین، مایکروسافت، نت‌فلیکس، پی‌پل، یاهو!، توئیتر و سیسکو می‌شود. توسعه و نگهداری نود جی‌اس توسط رایان دال صورت می‌گرفت و سپس نیز توسط شرکت جوینت حمایت شد. مشاهدهٔ نوار پیشرفت بارگذاری فایل در سایت فلیکر توسط رایال دال، الهام بخش ایدهٔ ساخت نود جی‌اس شد. در آن موقع حین بارگذاری فایل در سایت فلیکر، مرورگر وب نمی‌توانست تشخیص دهد که چه میزان از فایل بارگذاری شده و بنابراین برای نمایش روند پیشرفت بارگذاری، مرورگر مجبور بود به وب سرور درخواست دهد. در برنامه‌نویسی ترتیبی در مواجهه با کانکشن‌های هم‌زمان یا کل فرایند برنامه موقتاً متوقف می‌شود یا بالاجبار مقداری زیادی از حافظهٔ اصلی به پشتهٔ فراخوانی اختصاص می‌یابد. رایان دال پروژهٔ نود جی‌اس را در ۸ نوامبر سال ۲۰۰۹، در افتتاحیهٔ همایش JSCond در اروپا به همگان معرفی کرد. نود جی‌اس تشکیل شده بود از موتور جاوااسکریپت وی۸ (V8) گوگل به همراه یک حلقهٔ رخداد (Event loop) و نیز یک رابط برنامه‌نویسی کاربردی سطح پایین برای ورودی/خروجی. ان‌پی‌ام فرایند انتشار و به اشتراک‌گذاری کد منبع کتابخانه‌های نود جی‌اس را آسان می‌کند و طراحی شده تا کار نصب، بروزرسانی و حذف کتابخانه‌های نرم‌افزاری را سهولت ببخشد. در ژوئن ۲۰۱۱، مایکروسافت و جوینت با همکاری یکدیگر کار پیاده‌سازی نسخهٔ بومی نود جی‌اس برای ویندوز را شروع کردند. اولین نسخهٔ نود جی‌اس که از سیستم‌عامل ویندوز پشتیبانی می‌کرد در ژوئیه ۲۰۱۱ منتشر شد. به خاطر اختلاف داخلی اعضای پروژه بر سر نظارت شرکت جوینت روی پروژه، آی‌او جی‌اس به عنوان یک پروژهٔ جایگزین برای نود جی‌اس با سیاست «حاکمیت [متن] باز» به همراه یک کمیتهٔ فنی جداگانه به وجود آمد. برخلاف نود جی‌اس پدیدآورندگان آی‌او جی‌اس تصمیم گرفتند تا نسخهٔ موتور وی۸ استفاده شده در پروژه، همواره بروز و مطابق آخرین نسخهٔ آن باشد. سپس در ژوئن همان سال، کمیته‌های هر دو پروژه رأی موافق به همکاری با یکدیگر تحت بنیاد نود جی‌اس دادند. در سپتامبر ۲۰۱۵، نسخهٔ ۰٫۱۲ نود جی‌اس با نسخهٔ ۳٫۳ آی‌او جی‌اس ادغام شد و تحت نام نود (Node) با ورژن ۴٫۰ منتشر شد. | ## بخش 2: نود جی‌اس | از سال ۲۰۱۶ به بعد، وب‌سایت آی‌او جی‌اس در پیامی به بازدیدکنندگان پیشنهاد می‌کند تا در نتیجهٔ ادغام دو پروژه و همچنین به خاطر عدم انتشار نسخهٔ جدیدی از آی‌او جی‌اس، دوباره به استفاده از نود جی‌اس بازگردند. مرور نود جی‌اس امکان ساخت وب سرورها و ابزارهای شبکه را با استفاده از زبان جاوااسکریپت و مجموعه‌ای از پیمانه‌ها (Modules) که قابلیت‌های پایه‌ای را عرضه می‌کنند، در اختیار استفاده‌کننده قرار می‌دهد. رابط برنامه‌نویسی کاربردی‌ای (API) که پیمانه‌های نود جی‌اس از آن استفاده می‌کنند به نحوی طراحی شده تا پیچیدگی نوشتن برنامه‌های کاربردی سمت سرور را کاهش دهد. برنامه‌های کاربردی نوشته شده با نود جی‌اس می‌توانند در سیستم‌عامل‌های لینوکس، مک‌اواس، مایکروسافت ویندوز، NonStop و سرورهای یونیکس اجرا شوند. برنامه‌های کاربردی نود جی‌اس را با کافی‌اسکریپت، زبان برنامه‌نویسی دارت، تایپ‌اسکریپت (یا هر شکل دیگر از جاوااسکریپت با وابستگی زیاد به نوع) یا هر زبان دیگری که قابل ترجمه به جاوااسکریپت باشد، می‌توان نوشت. نود جی‌اس در وهلهٔ اول برای نوشتن برنامه‌های تحت شبکه مانند سرورهای وب استفاده می‌شود. بزرگ‌ترین تفاوت میان نود جی‌اس و پی‌اچ‌پی در این است که برخلاف پی‌اچ‌پی که در آن بیشتر توابع تا تمام شدن کار مسدود می‌شوند (به این معنا که دستورها تنها زمانی اجرا می‌شوند که دستورهای قبلی انجام شده باشند)، توابع در نود جی‌اس به گونه‌ای طراحی شده‌اند تا ناهمگام باشند و در نتیجه مسدود نشوند (به این معنا که دستورهای همروند یا حتی به صورت موازی قابل اجرا هستند و برای اعلام موفقیت یا شکست در اجرا از بازخوان‌ها (Callbacks) استفاده می‌کنند. معماری پلت‌فرم نود جی‌اس امکان برنامه‌نویسی رویداد محور را به سرورهای وب عرضه می‌کند که در نتیجه امکان توسعهٔ وب سرورهای سریع در جاوااسکریپت فراهم می‌شود. با نود جی‌اس توسعه‌دهندگان قابلیت توسعهٔ سرورهایی با مقیاس‌پذیری بالا را بدون نیاز به ریسه‌ها (Threads) و تنها با استفاده از مدل ساده شدهٔ برنامه‌نویسی رویداد محور و استفاده از بازخوان‌ها دارند. نود جی‌اس پلی میان راحتی استفاده از یک زبان برنامه‌نویسی اسکریپتی (مثل جاوااسکریپت) و قدرت برنامه‌نویسی شبکه‌ای در یونیکس است. از آنجا که موتور جاوااسکریپت وی۸ گوگل به صورت متن باز و تحت پروانهٔ بی‌اس‌دی منتشر شده بود و فوق‌العاده سریع بود و نیز توانایی فوق‌العاده‌ای در تکنولوژی‌های پایهٔ اینترنت مثل HTTP, DNS و TCP داشت، نود جی‌اس نیز بر مبنای آن نوشته شد. همچنین به خاطر شناخته شده بودن جاوااسکریپت، نود جی‌اس به سرعت برای اجتماع توسعه‌دهنگان وب قابل استفاده بود. پشتیبانی از صنعت هزاران کتابخانهٔ متن‌باز برای نود جی‌اس وجود دارد که بیشتر آن‌ها در سایت ان‌پی‌ام میزبانی می‌شوند. جامعهٔ متن‌باز برای تسریع روند توسعهٔ برنامه‌های کاربردی چندین چارچوب نرم‌افزاری تحت وب توسعه داده‌است. محیط‌های مدرن یک‌پارچهٔ توسعه نرم‌افزار امکانات مختلفی از جمله ویرایش و اشکال زدایی را مخصوص نود جی‌اس ارائه می‌کنند. جزئیات فنی نود جی‌اس یک محیط اجرایی جاوااسکریپت است که درخواست‌های ورودی را در یک حلقه موسوم به حلقهٔ رخداد، پردازش می‌کند. چند نخی نود جی‌اس تنها روی یک نخ (ریسه) اجرا می‌شود و با استفاده از ورودی/خروجی ناهمگام (مسدود نشدنی) امکان پشتیبانی از ده‌ها هزار ارتباط هم‌زمان را بدون صرف هزینهٔ تعویض زمینه (Context switching) فراهم می‌کند. این نوع طراحی که در آن یک نخ (ریسه) بین تمام درخواست‌ها مشترک است به خاطر ساخت برنامه‌های کاربردی با همزمانی بسیار بالا، استفاده شده‌است که در آن هر تابعی که کار ورودی/خروجی انجام می‌دهد باید از بازخوانی (Callback) استفاده کند. نود جی‌اس برای پیاده‌سازی حلقهٔ رخداد تک نخی، از کتابخانهٔ libuv استفاده می‌کند که این کتابخانه برای انجام عملیات ورودی/خروجی ناهمگام (مسدود نشدنی) از یک مخزن نخ (Thread pool) با اندازهٔ ثابت بهره می‌گیرد. اگرچه توسعه‌دهندگان می‌توانند تعداد پیش‌فرض نخ‌ها در مخزن نخ کتابخانهٔ libuv را افزایش دهند؛ این نخ‌ها معمولاً توسط سیستم عامل سرور بین هسته‌های مختلف توزیع می‌شوند. | ## بخش 3: نود جی‌اس | فراخوانی توابع در نخ اصلی، وظایف را داخل یک صف وظایف قرار می‌دهد که بین نخ‌های مخزن نخ به اشتراک گذاشته شده‌است؛ سپس نخ‌ها وظایف را از این صف برمی‌دارند و آن‌ها را اجرا می‌کنند. در بطن ماجرا، عملکردهای مسدود نشدنی سیستم، مثل کار با شبکه، به سوکت‌های مسدود نشدنی سمت هستهٔ سیستم عامل ترجمه می‌شوند درحالی که عملکردهای مسدود شدنی سیستم، مثل ورودی/خروجی فایل، به شکل مسدود شدنی داخل نخ خود اجرا می‌شوند. یک نخ در مخزن نخ، اتمام وظیفهٔ خود را به اطلاع نخ اصلی می‌رساند که متعاقباً نخ اصلی نیز بازخوان متناظر با وظیفه را بیدار و اجرا می‌کند. از آنجایی که بازخوان‌ها به‌طور ترتیبی در نخ اصلی اجرا می‌شوند، محاسبات طولانی و دیگر وظایف وابسته به پردازش‌گر تمام حلقهٔ رخداد را تا زمانی که کارشان به پایان برسد مسدود خواهند کرد. وی۸ وی۸ موتور اجرای جاوااسکریپتی است که برای مرورگر گوگل کروم ساخته و در سال ۲۰۰۸ توسط گوگل متن‌باز شد. وی۸ که با زبان سی‌پلاس‌پلاس نوشته شده به جای اجرای آنی کدهای جاوااسکریپت ابتدا آن‌ها را به کد ماشین کامپایل می‌کند. libuv یک لایهٔ انتزاعی برای شبکه و قابلیت‌های سیستم فایل است که هم در ویندوز و هم در سیستم‌های برپایهٔ پازیکس مثل لینوکس و مک‌اواس، قابل استفاده است. بایندینگ‌های (bindings) نود جی‌اس (پیمانه‌هایی که با زبان سی‌پلاس‌پلاس نوشته شده‌اند و یک API به زبان جاوااسکریپت عرضه می‌کنند که می‌توان به راحتی از آن‌ها استفاده کرد)، این تکنولوژی‌های مختلف را با یکدیگر و نیز با سیستم‌عامل متصل می‌کند. مدیریت بسته ان‌پی‌ام (npm) مدیر بسته‌ی از پیش نصب شده و پیش‌فرض برای سکوی نود جی‌اس است. از ان‌پی‌ام برای نصب برنامه‌های نود جی‌اس از مخزن ان‌پی‌ام، ساماندهی به نصب‌ها و نیز مدیریت برنامه‌های شخص ثالث نود جی‌اس استفاده می‌شود. از ان‌پی‌ام برای بارگذاری کد استفاده نمی‌شود؛ بلکه از آن برای نصب کد و مدیریت وابستگی‌های کد از طریق خط فرمان استفاده می‌شود. بسته‌هایی که در مخزن ان‌پی‌ام قرار دارند بسیار متنوع‌اند و در آن از کتابخانه‌های سادهٔ کمکی مثل Lodash تا اجراکننده‌های وظیفه مثل گرانت (Grunt) را می‌توان پیدا کرد. همچنین یارن (Yarn) یک مدیر بسته برای نود جی‌اس است که توسط فیسبوک در سال ۲۰۱۶ ساخته شده‌است که سرعت، ثبات و امنیت را به عنوان جایگزینی برای ان‌پی‌ام فراهم می‌کند حلقهٔ رخداد نود. جی‌اس خودش را به سیستم‌عامل وصل می‌کند تا هرگاه اتصال جدیدی ایجاد شد، سیستم‌عامل یک بازخوان را فراخوانی کند. نود جی‌اس برای مقیاس‌پذیری بیشتر به جای پردازه‌ها یا نخ‌ها از یک حلقهٔ رخداد استفاده می‌کند. جی‌اس به‌طور صریح صدا زده شود؛ به جای آن بازخوان‌ها تعریف می‌شوند و سرور در آخر تعریف بازخوان به‌طور خودکار وارد حلقهٔ رخداد می‌شود. این ابزارها زیرساخت لازم برای ساخت، مدیریت و اجرای اپلیکیشن‌های مدرن React را فراهم می‌کنند. نمونه کد به عنوان یک محیط اجرایی ناهمگام جاوااسکریپت، نود جی‌اس برای ساختن برنامه‌های کاربردی مقیاس‌پذیر تحت شبکه طراحی شده. | ## جمع‌بندی | در مثال «سلام، دنیا!» که در ادامه آورده شده، تعداد زیادی اتصال به صورت هم‌زمان رسیدگی می‌شوند.