Чим відрізняється asm.js від WebAssembly?


101

Я недавно читав про asm.js та WebAssembly:

http://ejohn.org/blog/asmjs-javascript-compile-target/

https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

Я все ще плутаю кілька речей:

  1. Чи вчасно зібраний код asm.js і запускається? Складено в що?
  2. За винятком того, що текст asm.js є текстом, а wasm (веб-збірка) є двійковим, чим відрізняються два?
  3. Що це означає для інших мов сценарію, що працюють у браузері? Візьмемо для прикладу пітон, це буде
    • код python, зібраний у wasm? або
    • інтерпретатор python (Cpython), складений у wasm та інтерпретувати python?

Відповіді:


47

Чи вчасно зібраний код asm.js і запускається? Складено в що?

asm.js - це звичайний код JavaScript, і він компілюється в байт-код інтерпретатором JS, як завжди. Однак інтерпретатор із підтримкою asm повинен здійснювати дострокову компіляцію та, можливо, генерувати більш ефективне представлення коду через статичне введення тексту. Докладніше див. На http://asmjs.org/ .

які відмінності між ASM та Wasm (крім тексту порівняно з бінарними)?

Поки що немає. wasm повинен бути зворотним, сумісним з asm (що знову виконується як звичайний JS). Однак у майбутньому це може бути розширено з додатковими можливостями, оскільки підтримка цього зростатиме.

Що це означає для інших мов сценарію, що працюють у браузері?

Останнє, скоріше, як Python ще потребує тлумачення. Мови сценаріїв, які не потребують перекладача, звичайно, можуть бути безпосередньо зібрані в (w) asm, враховуючи, що є компілятор (ланцюг), який підтримує його як ціль.


Пара приміток. Перша частина вашої відповіді здається дещо неоднозначною; це здається, що ви говорите, що asm.js компілює AOT у "більш ефективний байт-код". Насправді, реалізація не повинна орієнтуватися на байт-код, і насправді багато хто орієнтується на рідну ISA безпосередньо та на AOT (що насправді є суть). Ви також говорите "компілюється в asm та js". Ви можете уточнити, що ви хотіли сказати "рідне зібрання" чи щось таке. Або, можливо, ви мали на увазі "asm.js та js", але це не надто корисно, оскільки один є підмножиною іншого.
TNE

1
@tne: Дякую за відгук, сподіваюся, що я міг би вирішити проблеми - не соромтеся (запропонуйте) відредагувати себе, я вдячний. Правильно, я трохи розслабився щодо "більш ефективного байт-коду", оскільки не був знайомий з точною архітектурою компіляції, адже ISA - це ще один "байт-код", який інтерпретується процесором. Пробачте, будь ласка, неточну термінологію :-)
Бергі

53

asm.js - це підмножина JS з "оптимізаційними" інструкціями. В основному ви можете оголосити тип (int, float), а движок js (у браузерах, але також і node.js) буде виконувати інструкції швидше. Це має переваги, якщо ваша програма робить багато обчислень чи графіків, якщо вона використовується разом із WebGL.

Веб-збірка - це двійковий формат для JS, усіх JS, не тільки asm.js. Це не байт-код, це бінарне кодування AST, яке обчислює аналізатор. Він має дві великі переваги:

  • двигун JS може пропустити крок розбору
  • це набагато компактніше, ніж оригінальне джерело JS

Ми вже можемо писати код для браузерів, які не є JS: EMSCripten може компілювати код c ++ у JS-код. Інші транскопілятори вже доступні для складання вашого коду в JS. Використовуючи asm.js, цей код може працювати швидше при математиці. Використовуючи веб-збірку, цей код стане більш компактним, і браузер зможе обробити його швидше (оскільки він зможе пропустити розбір). У вас не буде нового плагіна для завантаження, як DirectX, JavaApplets, Flash або Silverlight, тому що все працюватиме в пісочній частині JS.


5
Пропустити розбір? Повільно, там. Програмна підтримка вимкнена з карти в осяжному майбутньому. Ви маєте на увазі те, що синтаксичний аналіз став вузьким місцем з asm.js, а wasm виправляє це з ефективним бінарним форматом. Ваше обгрунтування asm.js / wasm здається дещо мінімалістичним, але це нормально. Реквізит для вказування байт-коду! = AST.
TNE

4
@ Cristian, WASM - це не бінарний формат для JS. Він буде використовувати ті ж веб-API, що і JS, але він набагато більш портативний та узагальнений, ніж JS. Єдині бінарні формати для JS або байт-кодів - це ті, які реалізовані в браузерах, як Firefox тут: developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/…
LearningFast

20

Чи вчасно зібраний код asm.js і запускається? Складено в що?

Різні браузери компілюють код asm.js різними способами. Станом на серпень 2015 року:

  • Firefox компілює asm.js до машинного коду (і кешує машинний код для майбутніх завантажень того ж asm.js) [ 1 ].
  • У Windows 10 як експериментальний прапор Edge також здійснить деяку попередню перевірку та компіляцію asm.js [ 2 ].
  • Chrome спеціально розпізнає директиву "використовувати asm" на початку asm.js для більш сильного аналізу та аналізу її коду та налаштування евристики компіляції.
  • Safari не робить спеціальної обробки asm.js.

За винятком того, що текст asm.js є текстом, а wasm (веб-збірка) є двійковим, чим відрізняються два?

asm.js - це просто JavaScript, тому він повинен поводитися точно відповідно до специфікації JavaScript. Як новий стандарт, WebAssembly може виправити деякі кутові випадки, коли поведінка JavaScript не є ідеальним (з точки зору продуктивності чи компіляції) [ 3 ]. В майбутньому [ 4 ] WebAssembly зможе додати функції, які інакше було б важко виразити в JavaScript.

Що це означає для інших мов сценарію, що працюють у браузері? Візьмемо для прикладу пітон, це буде

  • код python, зібраний у wasm? або
  • інтерпретатор python (Cpython), складений у wasm та інтерпретувати python?

У версії 1 найпростішим способом запустити Python у браузері буде складання інтерпретатора Python у Wasm, як ви вже говорили. Це означає, наприклад, що Python GC працює в коді Wasm і вручну управляє лінійною пам'яттю Wasm. Вже існували експериментальні проекти, щоб додати бекенд Asm.js до PyPy [ 5 ] (який міг би працювати так само добре для wasm). В даний час він стикається з обмеженнями asm.js, які можуть бути вирішені динамічним зв'язком майбутньої функції wasm. В подальшому, wasm прагне забезпечити як інтеграцію в GC, так і підтримку компіляції JIT, що дозволить більш ефективно та природно інтегруватись із веб-платформою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.