duminică, octombrie 2, 2022

Ce este WebAssembly? 

Must Read

Platformă web de ultimă generație!

WebAssembly este un format de comandă binară și o mașină virtuală, care oferă performanțe aproape native aplicațiilor browser web și permite dezvoltatorilor să construiască aplicații web de mare viteză în limba pe care o alege fiecare.

De două decenii, a existat un singur limbaj de programare care poate fi folosit nativ într-un browser web: JavaScript. Moartea lentă a plugin-urilor binare impune o terță parte, care a înlocuit alte limbaje precum Java și Flash ActionScript ca limbaje de bază pentru dezvoltarea web. Alte limbaje web, cum ar fi CoffeeScript, sunt compilate numai în JavaScript.

Dar, acum, există o nouă opțiune: WebAssembly sau Wasm, pe scurt. WebAssembly are un format binar mic, rapid, care promite performanțe aproape native pentru aplicațiile web. De asemenea, WebAssembly este proiectat să servească drept țintă de compilare pentru orice limbaj – JavaScript este doar unul dintre ele! Acum, când fiecare browser major acceptă WebAssembly, este timpul să începeți să vă gândiți serios la scrierea de aplicații pe partea clienților pentru Web, care pot fi compilate ca WebAssembly.

Este de remarcat faptul că aplicațiile WebAssembly nu sunt destinate să înlocuiască aplicațiile JavaScript – cel puțin nu încă! Mai degrabă, gândiți-vă la WebAssembly ca o completare a JavaScript. În timp ce JavaScript este flexibil, tatat dinamic și livrat prin cod sursă care poate fi citit de om, WebAssembly este rapid, puternic tipat și livrat printr-un format binar ușor.

Dezvoltatorii ar trebui să ia în considerare WebAssembly pentru cazurile de utilizare cu performanță intensivă, cum ar fi jocuri, streaming de muzică, editare video și aplicații CAD. Multe servicii web, cum ar fi B. Google Earth, au făcut deja acest pas. Figma, o aplicație colaborativă de desen și diagramă, a apelat și la WebAssembly pentru a reduce timpii de încărcare și viteza de execuție, chiar dacă WebAssembly era relativ nou.

Acesta este modul în care funcționează WebAssembly

Dezvoltat de W3C, WebAssembly este, în cuvintele creatorilor săi, o „țintă de compilare”. Dezvoltatorii nu scriu WebAssembly direct, ci într-un limbaj la alegerea lor, care este apoi compilat în bytecode WebAssembly. Bytecode este apoi executat pe preferințele clienților – de obicei într-un browser web – unde este tradus în cod nativ de mașină și executat la viteză mare.

Codul WebAssembly este conceput pentru a încărca, analiza și rula mai rapid decât JavaScript. Dacă WebAssembly este utilizat de un browser web, modulul Wasm trebuie încă descărcat și configurat. Pentru proiecte Wasm mai mari, aceste module pot avea o dimensiune de câțiva megaocteți, astfel încât aceste întârzieri pot fi semnificative. Dar WebAssembly rulează mai repede.

WebAssembly oferă, de asemenea, un model de execuție sandbox, bazat pe aceleași modele de securitate care se aplică acum JavaScript. Aplicațiile Wasm nu pot accesa direct nimic din afara sandbox-ului, inclusiv DOM-ul paginii web pe care rulează. Toate interacțiunile cu restul programelor trebuie să utilizeze ABI, cum ar fi WebAssembly System Interface (WASI). WASI oferă acces controlat la fișiere, rețele, ceasul sistemului și alte servicii de sistem care sunt adesea necesare în programe .

În prezent, rularea WebAssembly în browserele web este cel mai frecvent exemplu de utilizare, dar WebAssembly își propune să fie mai mult decât o soluție bazată pe web. Proiectul Wasmer rulează aplicațiile WebAssembly pe partea serverului, la fel cum rulează Node.js rulează JavaScript în afara browserului.

Cazuri de utilizare WebAssembly

Cel mai de bază caz ​​de utilizare pentru WebAssembly este scrierea de software în interiorul browserului. Componentele care sunt compilate în WebAssembly pot fi scrise în orice limbaj. Sarcina finală WebAssembly este apoi livrată clientului prin JavaScript. WebAssembly a fost proiectat având în vedere o serie de cazuri de utilizare de înaltă performanță, bazate pe browser: jocuri, muzică în flux, editare video, CAD, criptare și recunoaștere a imaginilor, pentru a numi doar câteva. În general, este logic să vă concentrați asupra acestor trei zone atunci când vă determinați cazul de utilizare specific al WebAssembly:

  • Cod puternic, disponibil deja, într-o limbă orientată către țintă. Dacă, de exemplu, ați scris deja o funcție matematică de mare viteză în C și doriți să o integrați într-o aplicație web, o puteți expune ca modul WebAssembly. Părțile mai puțin sensibile la performanță, la nivelul utilizatorului, ale aplicației pot rămâne în JavaScript.
  • Cod puternic care trebuie rescris de la zero acolo unde JavaScript nu este ideal. Anterior, se putea folosi asm.js pentru a scrie un astfel de cod. Acest lucru este încă posibil, dar WebAssembly este poziționat ca o soluție mai bună pe termen lung.
  • Portarea unei aplicații desktop într-un mediu web. Multe dintre demonstrațiile de tehnologie pentru asm.js și WebAssembly se încadrează în această categorie. WebAssembly poate oferi un substrat pentru aplicațiile care necesită mai mult decât o interfață grafică de utilizator prezentată prin HTML. Două exemple în acest sens sunt demo-urile WebDSP și Windows 2000, în browser.

Dacă aveți o aplicație JavaScript existentă care nu atinge limita de performanță, cel mai bine este să o lăsați în pace în această etapă a dezvoltării WebAssembly. Cu toate acestea, dacă trebuie să faceți aplicația mai rapidă, WebAssembly vă poate ajuta.

Suport pentru limbajul WebAssembly

WebAssembly nu este destinat să fie scris direct. După cum sugerează și numele, este mai mult un limbaj de asamblare, ceva care poate fi procesat de mașină, decât o programare în limbaj de nivel înalt, prietenos cu oamenii. WebAssembly este mai aproape de reprezentarea intermediară (IR), produsă de infrastructura compilatorului limbajului LLVM decât de C sau Java.

Prin urmare, majoritatea scenariilor de lucru cu WebAssembly implică scrierea codului într-un limbaj de nivel înalt și convertirea lui în WebAssembly. Acest lucru se poate face într-unul din trei moduri de bază:

  • Compilare directă. Codul sursă este tradus în WebAssembly utilizând lanțul de instrumente al compilatorului propriu al limbajului. Rust, C/C++, Kotlin/Native și D au acum modalități native de a emite Wasm de la compilatoare care acceptă acele limbaje.
  • Instrumente de la terți. Limbajul nu are suport nativ Wasm în lanțul său de instrumente, dar un utilitar terț parte poate fi folosit pentru a converti în Wasm. Java, Lua și toată familia de limbaje.Net, care au toate un astfel de suport.
  • Interpret bazat pe WebAssembly. Aici, limbajul în sine nu este tradus în WebAssembly, ci este, mai degrabă, un interpret pentru limbajul scris în WebAssembly, care execută codul scris în limbaj. Aceasta este cea mai greoaie abordare, deoarece interpretul poate acoperi mai mulți megaocteți de cod, dar permite codului existent scris în limbaj să ruleze aproape neschimbat. Python (de exemplu, prin PyScript) și Ruby au, ambele, interpreți, care sunt portați în Wasm.

Funcții WebAssembly

WebAssembly este încă în faze incipiente. Lanțul de instrumente și implementarea WebAssembly rămân mai mult o dovadă de concept decât o tehnologie de producție. Cu toate acestea, dezvoltatorii WebAssembly urmăresc să facă WebAssembly mai util printr-o serie de inițiative:

Suportul nativ pentru threading este comun în limbaje precum Rust și C++. Lipsa suportului pentru threading în WebAssembly înseamnă că clase întregi de software axat pe WebAssembly nu pot fi scrise în aceste limbi. Propunerea de a adăuga threading la WebAssembly folosește modelul de threading C++ ca una dintre inspirațiile sale.

Operațiuni de stocare în masă și SIMD

Operațiunile de stocare în masă și paralelismul SIMD (instrucțiune unică, date multiple) sunt o necesitate pentru aplicațiile care procesează cantități mari de date și au nevoie de accelerare nativă a procesorului, pentru a evita sufocarea, cu aplicații cum ar fi învățarea automată sau aplicații științifice. Există deja propuneri  pentru a adăuga aceste capabilități la WebAssembly, prin noi operatori.

Construcții de limbaj de nivel înalt

Multe alte caracteristici avute în vedere pentru WebAssembly se traduc direct în construcții de nivel înalt în alte limbaje.

  • Excepțiile pot fi emulate în WebAssembly, dar nu pot fi implementate nativ, prin setul de instrucțiuni WebAssembly. Planul propus pentru excepții include limbaje primare de excepție, compatibile cu modelul de excepție C++, care, la rândul lor, ar putea fi utilizate de alte limbaje compilate în WebAssembly.
  • Tipurile de referință facilitează propagarea obiectelor utilizate ca referințe pentru mediul gazdă. Acest lucru ar facilita colectarea “gunoiului” și o serie de alte caracteristici de nivel înalt, mai ușor de implementat în WebAssembly.
  • Tail calls, un model de design folosit în multe limbi.
  • Funcții care returnează mai multe valori, de ex. B. prin tupluri în Python sau C#.
  • Operatori de extensie a semnelor, o operație matematică utilă de nivel scăzut. (LLVM acceptă și acestea.)

Instrumente de depanare și profilare

Una dintre cele mai mari probleme cu JavaScript transpilat a fost dificultatea depanării și profilării, din cauza incapacității de a corela codul transpilat cu codul sursă. WebAssembly are o problemă similară, care este abordată într-un mod similar (suport pentru hărți sursă). 

Latest News

Prăbușirea Pilonului II de pensii!

Sorin Roșca Stănescu Așa-numitul Pilon II de pensii e la pământ. Acolo s-au pierdut bani, nu glumă. O sumă colosală....

More Articles Like This