جستاری در زبان Assembly و آشنایی بیشتر با مفهوم WebAssembly

جستاری در زبان Assembly و آشنایی بیشتر با مفهوم WebAssembly

در دهه‌های دور، برای برنامه‌نویسی کامپیوترها یکسری سوئیچ را خاموش/روشن می‌کردند که این کاری کُند، خسته‌کننده و مستعد بروز خطا بود اما این داستان تا زمانی ادامه داشت که زبان Assembly به بازار عرضه شد؛ یک نوع زبان ماشین که دولوپرها نیز می‌توانستند آن‌ را بخوانند و درک کنند.

اولین کسی باشید که به این سؤال پاسخ می‌دهید

نگاهی به تاریخچهٔ زبان Assembly
عصر شکوهمند اسمبلی از اوایل دههٔ 1980 میلادی آغاز شد؛ یعنی از زمانی که از آن برای ساخت بازی‌های تجاری مختص کامپیوترهای 8‌بیتی مثل کمودور 64 یا CBM-64 استفاده شد و در آن سال‌ها که مفسرها کُند بودند و هنوز سروکلهٔ کامپایلرهای C پیدا نشده بود، فقط کدهای نوشته شده با زبان Assembly بود که سرعت به‌ نسبت قابل‌قبولی داشت.

استفاده از اسمبلی هنوز هم متوقف نشده است، اما توسعهٔ این زبان همچنان کُند است به طوری که در همان مدت زمانی که صرف می‌کنید تا 10 خط کد اسمبلی بنویسید، می‌توانید 10 خط کد با زبان سطح بالایی همچون #پایتون بنویسید با این تفاوت که آن 10 خط کد نوشته شده به زبان پایتون از نظر نرم‌افزاری بسیار بسیار غنی‌تر و پرکاربردتر از  10 خط کد اسمبلی است! با این وجود، هنوز هم هستند کسانی که به کدنویسی اسمبلی 8بیتی علاقه دارند (حتی نسخه‌ای از کامپایلر C هم ساخته شده است که برای کمودور 64 یا کمودور Vic-20 خروجی زبان ماشین 6502 تولید می‌کند). چالش دیگر زبان اسمبلی برای دولوپرها، پرتابل نبودن آن است و به‌ رَغم برخی پیشرفت‌های صورت‌‌ گرفته در حوزهٔ اتوماسیون، تبدیل کردن کدهای 6502 به Z80 (یا یک زبان اسمبلی دیگر)، کار ساده‌ای نیست.

جالب است بدانید که تقریباً چیزی در حدود سی سال پیش کاری همچون تبدیل، تست و دیپلوی برنامه‌ای متشکل از 5000 خط کد اسمبلی شاید یک ماه زمان می‌بُرد و امروزه هم با اینکه پروسهٔ کدنویسی با اسمبلی کُند است، اما این زبان همچنان در سیستم‌ها و نرم‌افزارهای قدیمی‌ و حتی پلتفرم‌های جدیدی همچون #اینترنت اشیاء که باید مستقیماً با سخت‌افزار ارتباط برقرار کنند، جایگاه خود را دارد (از جمله نرم‌افزارهای مهمی که با اسمبلی نوشته شده می‌توان به نرم‌افزار نرم‌‌افزار آپولو 11 اشاره کرد که برای کسب اطلاعات بیشتر، می‌توانید به مقالهٔ آشنایی با سورس‌کد نرم‌‌افزار آپولو 11 که به ماه سفر کرد مراجعه نمایید.)

معرفی WebAssembly
زبان اسمبلی از طریق جاوااسکریپت و فریمورکی تحت عنوان asm.js حیاتی دوباره یافت و میراث آن هنوز هم با WebAssembly ادامه دارد. وب‌اسمبلی طراحی شد تا فرآیند پارس و اجرا تسریع شود (asm.js زیرمجموعهٔ بهینه‌شده‌ای از جاوااسکریپت است که برای زبان‌هایی نظیر ++C/C یک ماشین مجازی سندباکس‌شده در اختیار دولوپرها می‌گذارد که با این تکنیک‌ها، کارایی مرورگر در برنامه‌هایی که از ++C/C به asm.js تبدیل شده‌اند، بسیار سریع‌تر از زمانی خواهد بود که کد اصلی کامپایل شده، اجرا می‌شود.) با این وجود، حتی asm.js نیز مشکلات خود را دارا است. دانلود و کامپایل کردن اپ‌های بزرگ asm.js به‌ ویژه در پلتفرم‌های موبایلی ممکن است بسیار کُند باشد (برای کسب اطلاعات بیشتر در مورد asm.js توصیه می‌کنیم به مقالهٔ تغییر آیندهٔ بازی‌های کامپیوتری با فناوری Asm.js و تبدیل مرورگرها به یک پلتفرم بازی مراجعه نمایید.)

حال سؤالی که پیش می‌آید این است که به جای سورس‌کدی حجیم که مستلزم کامپایل شدن است، چرا زبان ماشین یا چیزی نزدیک به آن را مورد استفاده قرار ندهیم؟ این سؤالی بود که به ذهن تعدادی دولوپر رسید که در نهایت منجر به تولد WebAssembly شد.

WebAssembly یک فرمت سطح‌ پایین و نزدیک به سخت‌افزار است و از این حیث به زبان Assembly بی‌شباهت نیست؛ اما کدهای نوشته شده با وب‌اسمبلی چندان خوانا و قابل‌درک نیستند. برای مثال، آیا می‌توانید حدس بزنید که قطعه کد زیر چه کاری انجام می‌دهد؟

get_local 0

i64.const 0

i64.eq

if i64

i64.const 1

else

get_local 0

get_local 0

i64.const 1

i64.sub

call 0

i64.mul

end

کد فوق، فانکشن فاکترویل بازگشتی بوده و i64 در آن یک متغیر عددی 64‌بیتی است. برای هرچه سریع‌تر شدن وب‌اسمبلی، آن‌ دسته از قابلیت‌‌های جاوااسکریپت که به تخصیص‌ حافظه (Memory Allocation) در زمان اجرا می‌پرداختند کنار گذاشته شدند. متغیرهای عددی شامل اعداد صحیح یا اعشاری 32‌بیتی و یا 64بیتی، از جمله ویژگی‌هایی هستند که سرعت وب‌اسمبلی را در مقایسه با asm.js افزایش داده است؛ ضمن اینکه همهٔ دستورالعمل‌ها و عملگرها (اپراتورها) صراحتاً بدون هیچ‌گونه قوانین سرباری، طبقه‌بندی شده‌اند.

بنیاد موزیلا هم در مستندسازی روند پیشرفت وب‌اسمبلی، عملکرد بسیار خوبی داشته است که با مراجعه به مستندات WebAssembly در وب‌سایت دولوپرهای موزیلا، می‌توانید به آشنایی بیشتر با تلاش‌های این بنیاد در این راستا بپردازید. در خاتمه جا دارد اشاره کنیم WebAssembly هدفی فراتر از وب در سر دارد. کارهایی صورت پذیرفته است تا این زبان بتواند بدون وجود ماشین مجازی جاوااسکریپت نیز اجرا شود. به‌ هر حال، اگر به زبان‌های برنامه‌نویسی قدیمی‌تر علاقه دارید یا صرفاً کنجکاوید بدانید که وب‌اسمبلی چه‌طور با سخت‌افزار ارتباط برقرار می‌کند، بهتر است دست به امتحان آن بزنید.

منبع