وب اسمبلی به زبان ساده

وب اسمبلی (WebAssembly) چیست؟ چرا در طراحی وبسایت کاربردی و مهم است؟ چه مزایایی دارد؟ چرا بعضی از متخصصان آن را در آینده‌ وب دیزاین بسیار موثر می‌دانند؟

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

از جدیدترین ابزارها و پیشرفت‌هایی که در سال‌های اخیر با همکاری غول‌های دنیای تکنولوژی (گوگل، اپل، مایکروسافت، موزیلا و W3C) ساخته شده و کار طراحی وبسایت را راحت‌تر و بهینه‌تر کرده است، وب اسمبلی (WebAssembly or Wasm) نام دارد. Wasm (وسم) زبان جدیدی برای طراحی و توسعه وب است. این محتوا درباره‌ی آن زبان جدید است و به سوالاتی که در آغاز درباره‌ی آن طرح شد پاسخ می‌دهد.

وب اسمبلی (WebAssembly) چیست؟

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

  • JavaScript: پایه و اساس وب دیزاین را زبان نشانه‌گذاری HTML و CSS و زبان برنامه‌نویسی JavaScript می‌سازند. جاوا اسکریپت زبان برنامه‌نویسی سطح بالا و تفسیری است که در مرورگر اجرا می‌شود. کاربرد اصلی جاوا اسکریپت تعاملی و داینامیک کردن صفحات و همچنین پیاده‌سازی طراحی UI وبسایت است. مثلا، اگر طراح سایت بخواهد انیمیشن به صفحه‌ی سایت اضافه کند از جاوا اسکریپت استفاده می‌کند.
  • Compiled languages: زبان‌های برنامه‌نویسی به دو دسته تقسیم می‌شوند: زبان‌های تفسیری یا کامپایلری. زبان‌های برنامه‌نویسی سطح بالا مثل جاوا اسکریپت و پایتون برای کامپیوتر قابل‌فهم نیستند. چون زبان‌های سطح بالا به زبان طبیعی (زبان انسان) شبیه است تا کار کدنویسی برای توسعه‌دهنده راحت باشد. پس، قبل از اینکه ماشین (کامپیوتر) بتواند کدها را اجرا کند، اول باید آن‌ها را به زبان خودش، زبان صفر و یک‌ها، ترجمه کند. فرآیند ترجمه ممکن است به دو صورت اتفاق بیفتد: خط به خط یا یک‌جا. یعنی یا همه‌ی کد‌های نوشته شده یک‌جا به زبان ماشین کامپایل می‌شوند یا خط به خط تفسیر می‌شوند.
  • Binary code: زبان کامپیوتر یا ماشین زبان صفر و یک، زبان باینری یا دودویی است. هر چیزی را که بخواهیم کامپیوتر بفهمد باید در قالب صفر و یک‌ها به آن بدهیم. به زبان‌هایی که با صفر و یک نوشته می‌‌شوند زبان‌های سطح پایین می‌گویند چون فهمیدن آن برای انسان و برنامه‌نویس بسیار سخت و زمان‌بر است. درنتیجه، برنامه‌نویسی به زبان‌های سطح پایین، مانند زبان اسمبلی، نیز بسیار سخت و زمان‌بر است.

تعریف Wasm

خب مفاهیم بالا چه ارتباطی با Wasm دارد؟ برای طراحی سایت نمی‌شود از زبان‌های سطح پایین و دیگر زبان‌های سطح بالا به راحتی استفاده کرد. در حالی که اگر با کامپیوتر به زبان اصلی (Native) خودش حرف زد، همه‌چیز (پردازش و اجرای کدها و درنتیجه عملکرد سایت) سریع‌تر می‌شود. علاوه‌ بر آن، استفاده از زبان‌های برنامه‌نویسی دیگر (در کنار جاوا اسکریپت) امکانات بیشتری را در اختیار توسعه‌دهنده و برنامه‌نویس قرار می‌دهد.

ماشین وب اسمبلی ساخته شد تا به طراحان سایت امکان دهد که در طراحی وبسایت از زبان‌های دیگر هم استفاده کنند. وب اسمبلی کدهای نوشته‌ شده به هر زبان سطح بالایی را به کدهای باینری (کدهای اجرایی سطح پایین) تبدیل می‌کند. مرورگرها می‌توانند کدهای باینری Wasm را، مثل کدهای جاوا اسکریپت، بفهمند و اجرا کنند.

تا قبل از وب اسمبلی،‌ جاوا اسکریپت تنها زبان برنامه‌نویسی آشنا و قابل‌فهم برای مرورگرها بود. اما امروزه نسخه‌های جدید مرورگرها با کدهای Wasm سازگارند و آن‌ها را می‌شناسند و اجرا می‌کنند. از میان تعریف‌هایی که از وب اسمبلی ارائه شده است، تعریف developer.mozilla.org از بقیه ساده‌تر و آسان‌فهم‌تر است.

وب اسمبلی نوع جدیدی کد است که در مرورگرهای مدرن اجرا می‌شود. کدهای وب اسمبلی امکانات جدیدی را در اختیار طراح سایت قرار می‌دهد و عملکرد سایت را نیز بسیار بهتر و سریع‌تر می‌کند. وب اسمبلی طوری طراحی نشده است که برنامه‌نویس آن را بنویسد. بلکه طوری طراحی شده تا کامپایلری قوی باشد و کدهای نوشته شده به زبان‌های مبدا مثل C, C++, Rust و … را ترجمه کند.

اهمیت وب اسمبلی در طراحی وبسایت

برای اینکه اهمیت کدهای وب اسمبلی معلوم شود، لازم است مزایا و ویژگی‌های آن در طراحی سایت شمرده شود. وب اسمبلی چه امکانات و ویژگی‌هایی را در اختیار طراح سایت می‌گذارد که تا پیش از سال ۲۰۱۷ و تولد آن، در طراحی وب امکان‌پذیر نبوده است؟

  • بعد از وب اسمبلی، طراح سایت از هر زبانی که بخواهد می‌تواند برای کدنویسی استفاده کند. او کدها را می‌نویسد و خیالش راحت است که وقتی آن‌ها را به کدهای Wasm تبدیل کرد، در مرورگر اجرا می‌شوند. همین ویژگی دست طراحان سایت و وب اپلیکیشن‌ها را برای توسعه‌ی پروژه‌های پیچیده و سنگین (مثل Google Earth یا بازی‌های سه بعدی و سایت‌ها و وب اپ‌های واقعیت مجازی و واقعیت افزوده) باز می‌گذارد.
  • Wasm عملکرد سایت را بهینه می‌کند چون کدهایش سبک‌تر است، پس سریع‌تر در مرورگر اجرا می‌شوند و زمان بارگذاری کمتری را نیاز دارند. این یعنی طراح سایت می‌تواند صفحات پیچیده‌تر و پرجزئیات‌تری را طراحی کند اما نگران زمان بارگذاری صفحه و معطل‌ شدن کاربر نباشد. اما مگر جاوا اسکرپیت همان ویژگی‌ها را ندارد؟ بله، اما در همه‌ی موارد و همه‌ی پروژه‌ها جاوا اسکریپت سرعت و عملکرد لازم را، مخصوصا برای تسک‌های خیلی سنگین، فراهم نمی‌کند.
  • درست است که توسعه‌دهنده یا برنامه‌نویس کدهای Wasm را نمی‌نویسد، اما می‌تواند آن‌ها را بخواند و در صورت لزوم ویرایش یا اصلاح کند (debugging). از دو فایل اکستنشن برای ذخیره‌ی کدهای وب اسمبلی استفاده می‌شود: wat. که برای داشتن text فرمت کدهاست و wasm. برای فرمت binary کدها. توسعه‌دهنده به ‌راحتی قادر است فرمت متنی را ویرایش کند.

Wasm & JavaScript

چه ارتباطی میان جاوا اسکریپت (JS) و وب اسمبلی وجود دارد؟ وب اسمبلی و جاوا اسکریپت یکدیگر را تکمیل می‌کنند. JS زبانی است ۲۶ ساله که کتابخانه‌ها و پلاگین‌های زیادی دارد. همچنین مرورگرها برای پردازش و اجرای کدهای جاوا اسکریپت زیرساخت‌هایی قوی دارند. در کل، جاوا اسکریپت زبانی قدیمی‌ و قوی‌ است. اما همان‌طور که اشاره شد، جاوا اسکریپت محدودیت‌هایی دارد و قدرتش برای همه‌ی پروژه‌ها کافی نیست.

وب اسمبلی زبان بسیار جدیدی است و امکانات و ویژگی‌هایی دارد که آن را از جاوا اسکریپت متمایز می‌کند. اما Wasm ساخته شده تا در کنار جاوا اسکریپت عمل و محدودیت‌هایش را با کمک گرفتن از امکانات JS برطرف کند. یعنی این دو زبان به یکدیگر مرتبط می‌شوند و از امکانات یکدیگر استفاده می‌کنند. با وب اسمبلی می‌شود کدهای جاوا اسکریپت را فراخوانی کرد و از جاوا اسکریپت داده گرفت و برعکس.

نمونه کدهای Wasm

قطعه کد زیر به زبان C نوشته شده است.

int factorial(int n) {    if (n == 0)        return 1;     else        return n * factorial(n-1);  }

قطعه کد زیر کامپایل‌شده‌ی کدهای C بالا در فرمت متنی وب اسمبلی (wat.) است.

(module     (table 0 anyfunc)     (memory $0 1)     (export "memory" (memory $0)) (export "factorial" (func $factorial))     (func $factorial (; 0 ;) (param $0 i32) (result i32)       (local $1 i32)        (local $2 i32)        (block $label$0           (br_if $label$0              (i32.eqz                 (get_local $0)              )          )          (set_local $2              (i32.const 1)           )           (loop $label$1              (set_local $2                 (i32.mul                    (get_local $0) (get_local $2)                 )              )              (set_local $0                 (tee_local $1        (i32.add                    (get_local $0) (i32.const -1)                 )                 )              )              (br_if $label$1      (get_local $1)              )           )           (return              (get_local $2)          )        )        (i32.const 1)     ) )

قطعه کدهای زیر دو نمونه از کدهای Wasm است که اولی در فرمت متنی است و دومی باینری.

(module   (func (export "addTwo") (param i32 i32) (result i32)     local.get 0     local.get 1     i32.add))
0000000: 0061 736d                                 ; WASM_BINARY_MAGIC 0000004: 0100 0000                                 ; WASM_BINARY_VERSION ; section "Type" (1) 0000008: 01                                        ; section code 0000009: 00                                        ; section size (guess) 000000a: 01                                        ; num types ; func type 0 000000b: 60                                        ; func 000000c: 02                                        ; num params 000000d: 7f                                        ; i32 000000e: 7f                                        ; i32 000000f: 01                                        ; num results 0000010: 7f                                        ; i32 0000009: 07                                        ; FIXUP section size ; section "Function" (3) 0000011: 03                                        ; section code 0000012: 00                                        ; section size (guess) 0000013: 01                                        ; num functions 0000014: 00                                        ; function 0 signature index 0000012: 02                                        ; FIXUP section size ; section "Export" (7) 0000015: 07                                        ; section code 0000016: 00                                        ; section size (guess) 0000017: 01                                        ; num exports 0000018: 06                                        ; string length 0000019: 6164 6454 776f                           addTwo  ; export name 000001f: 00                                        ; export kind 0000020: 00                                        ; export func index 0000016: 0a                                        ; FIXUP section size ; section "Code" (10) 0000021: 0a                                        ; section code 0000022: 00                                        ; section size (guess) 0000023: 01                                        ; num functions ; function body 0 0000024: 00                                        ; func body size (guess) 0000025: 00                                        ; local decl count 0000026: 20                                        ; local.get 0000027: 00                                        ; local index 0000028: 20                                        ; local.get 0000029: 01                                        ; local index 000002a: 6a                                        ; i32.add 000002b: 0b                                        ; end 0000024: 07                                        ; FIXUP func body size 0000022: 09                                        ; FIXUP section size ; section "name" 000002c: 00                                        ; section code 000002d: 00                                        ; section size (guess) 000002e: 04                                        ; string length 000002f: 6e61 6d65                                name  ; custom section name 0000033: 02                                        ; local name type 0000034: 00                                        ; subsection size (guess) 0000035: 01                                        ; num functions 0000036: 00                                        ; function index 0000037: 00                                        ; num locals 0000034: 03                                        ; FIXUP subsection size 000002d: 0a                                        ; FIXUP section size

جمع‌بندی و نتیجه‌گیری

۱. وبسایت‌ها و وب اپلیکیشن‌ها هر روز پویاتر و تعاملی‌تر می‌شوند. تجربه کاربر وبسایت‌ها و وب اپلیکیشن‌ها در آینده‌ای نه‌ چندان دور با طراحی سه بعدی و هوش مصنوعی (ماشین لرنینگ) شکل خواهند گرفت. این یعنی وب دیزاینر با پروژه‌های سنگین‌تر و متفاوت‌تری روبرو خواهد شد.

۲. وب اسمبلی با نگاه به آینده‌ی طراحی سایت و نیازهای آینده ساخته شده است. Wasm جاوا اسکریپت را کامل می‌کند و با دیگر تکنولوژی‌های طراحی و توسعه سایت نیز سازگار است.

۳. ماشین وب اسمبلی به توسعه‌‌دهنده و برنامه‌نویس امکان می‌دهد تا از دیگر زبان‌های برنامه‌نویسی نیز در طراحی سایت و برای پیاده‌سازی رابط کاربر وبسایت‌ها استفاده کنند.

۴. برای استفاده از Wasm اولین قدم این است که به جاوا اسکریپت و طراحی وب مسلط شد (جاوا اسکریپت در آموزش طراحی و برنامه‌نویسی سایت درس داده می‌شود). در دومین قدم، با کمک گرفتن از منابع آنلاین (مثل webassembly.org) کار با آن را یاد گرفت و تمرین کرد.

The post وب اسمبلی به زبان ساده appeared first on آمانج آکادمی مرکز آموزش های برنامه نویسی ، دیجیتال مارکتینگ و دیزاین.

دیدگاهتان را بنویسید