Bosh sahifa Wiki WebAssembly

WebAssembly

WebAssemblybrowser va boshqa runtime’larda yuqori samarali, portable binary code bajarish uchun yaratilgan ochiq instruction format va execution modeli. U qisqacha Wasm deb ataladi. WebAssembly C, C++, Rust va boshqa tillarda yozilgan kodni web platformaga yoki standalone runtime’ga kompilyatsiya qilish imkonini beradi.

WebAssembly JavaScriptni almashtirish uchun emas, u bilan birga ishlaydigan qo‘shimcha execution target sifatida yaratilgan.

Binary instruction format

WebAssembly module odatda .wasm binary fayl ko‘rinishida tarqatiladi.

Binary format:

  • compact;
  • tez decode;
  • type tekshiruvli;
  • platformadan mustaqil;
  • deterministic instruction semanticsga yaqin

xususiyatlarga ega.

Runtime module’ni validationdan o‘tkazib, keyin compile yoki execute qiladi.

Text format

Inson o‘qishi uchun WebAssembly Text Format mavjud.

Keng extension:

.wat

Misol:

(module
  (func (export "add")
    (param i32 i32)
    (result i32)
    local.get 0
    local.get 1
    i32.add))

Text format debugging va o‘rganish uchun qulay.

Stack machine

WebAssembly instructionlari stack-based virtual machine modelidan foydalanadi.

Operandlar stackga qo‘yiladi va instruction ularni oladi.

Masalan, ikki son stackga kelib, i32.add natijani qaytaradi.

Local variable va control flow ham mavjud.

Type tizimi

Asosiy numeric turlar:

  • i32;
  • i64;
  • f32;
  • f64.

Kengaytmalar orqali vector, reference va boshqa type’lar qo‘shilishi mumkin.

Function parameter va return type validation vaqtida tekshiriladi.

Module

Module quyidagilarni saqlashi mumkin:

Module mustaqil executable emas; host environment import va capability beradi.

Import

Wasm module tashqi function, memory, table yoki globalni import qilishi mumkin.

Browserda JavaScript function import qilinishi ehtimoli bor.

Standalone runtime system interface yoki application API beradi.

Module faqat host aniq bergan capability’ga ega.

Export

Module function, memory yoki boshqa elementni hostga export qiladi.

JavaScript exported functionni chaqirishi mumkin:

instance.exports.add(2, 3)

Parameter conversion va memory exchange bridge orqali bajariladi.

Linear memory

WebAssembly memory linear byte array sifatida ko‘rinadi.

Compiled language heap va stackni shu memory ichida boshqarishi mumkin.

JavaScript ArrayBuffer view orqali memoryga murojaat qilishi ehtimoli bor.

Bounds check runtime tomonidan bajariladi.

Memory growth

Linear memory page birliklarida kengayishi mumkin.

Growth oldingi JavaScript view’larini yaroqsiz qilishi ehtimoli bor.

Maksimal memory va resource limit belgilanishi mumkin.

Cheksiz growth host availability’iga xavf.

Table

Table function reference yoki boshqa reference qiymatlarni saqlashi mumkin.

Indirect call table orqali bajariladi.

Runtime table index va function signature’ni tekshiradi.

Bu compiled language function pointerlariga o‘xshash imkoniyat beradi.

Browser integration

Browser WebAssembly module’ni Fetch bilan yuklab, instantiate qilishi mumkin.

JavaScript:

bilan ishlashda vositachi bo‘ladi.

Wasm DOMga bevosita native huquq bilan kira olmaydi.

Compilation

Source language compiler WebAssembly targetga code yaratadi.

Toolchain:

ni o‘z ichiga olishi mumkin.

C/C++ code uchun system API va standard library compatibility alohida qatlam talab qiladi.

JavaScript bilan aloqa

Oddiy numeric function chaqirish tez.

String, object va complex data almashishda:

kerak bo‘lishi mumkin.

Bridge overhead kichik operationlarni juda ko‘p chaqirishda seziladi.

Sandbox modeli

Browserdagi Wasm web sandbox ichida ishlaydi.

U file system, raw socket yoki device’ga avtomatik access olmaydi.

Host function bermasa module tashqi dunyo bilan aloqa qilolmaydi.

Browser va runtime zaifligi sandbox escape xavfini yaratishi mumkin.

Portability

Bir .wasm module turli CPU va OS runtime’larida ishlashi mumkin.

Runtime uni local machine codega compile qiladi yoki interpret qiladi.

Host API va system interface mavjudligi portabilityga ta’sir qiladi.

Foydalanish sohalari

WebAssembly:

  • image va video processing;
  • game engine;
  • CAD;
  • audio;
  • scientific calculation;
  • compression;
  • cryptography;
  • language runtime;
  • plugin;
  • serverless function

uchun ishlatiladi.

Har vazifa avtomatik tezlashmaydi.

Performance

Wasm predictable typed instruction va nativega yaqin compilationdan foyda olishi mumkin.

Real performance:

ga bog‘liq.

Benchmark ayni workload bilan bajariladi.

Security

Untrusted module:

  • CPU;
  • memory;
  • import capability;
  • execution time;
  • file/network access;
  • module size

bo‘yicha cheklanadi.

Memory-safe source language ishlatilsa ham host binding va unsafe code xavfi qoladi.

Thread

WebAssembly shared memory va atomic instructionlar orqali parallel thread modelini qo‘llashi mumkin. Browserda SharedArrayBuffer security headerlari va cross-origin isolation talab qilishi ehtimoli bor. Workerlar execution threadlarini beradi. Data race va synchronization compiled language darajasida boshqariladi.

SIMD

SIMD bir instruction bilan bir nechta numeric element ustida parallel operation bajaradi. Image, audio va matrix calculationda performance yaxshilanishi mumkin. Runtime feature supportini tekshiradi va fallback module saqlashi mumkin.

Garbage collection

Managed language’larni WebAssemblyga samarali target qilish uchun GC va reference type imkoniyatlari rivojlangan. Bu har language o‘z garbage collectorini linear memory ichida olib yurish zaruratini kamaytirishi mumkin. Runtime support va toolchain versiyasi mos bo‘ladi.

Bog‘liq tushunchalar

WebAssembly, Wasm, WAT, Linear memory, Module, Import, Export, Stack machine, JavaScript, WASI, Portable binary