Site icon آکادمی آمانج

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

وب اسمبلی چیست

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

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

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

 

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

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

 

 

 

تعریف Wasm

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

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

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

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

 

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

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

 

 

 

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) کار با آن را یاد گرفت و تمرین کرد. 

 

مشاهده نسخه گرافیکی و کامل