2015-09-02 1 views
2

Asm.js - это новая категория приложений JavaScript: приложения C/C++, которые были скомпилированы в JavaScript. Это подмножество JavaScript, которое было создано проектом Mozilla Emscripten.Как работает сборка (asm.js) в браузере?

Но как это работает, и почему я должен его использовать?

ответ

7

Зачем компилироваться JavaScript?

JavaScript - это единственный язык, который работает во всех браузерах. Хотя в браузере будет работать только JavaScript, вы все равно можете писать на других языках и компилироваться на JavaScript, тем самым позволяя ему также запускаться в браузере. Это стало возможным благодаря технологии, известной как emscripten.

Emscripten - это проект на основе LLVM, который компилирует C и C++ в высокопроизводительный JavaScript в формате asm.js. Короче говоря, рядом с родными скоростями, используя C и C++, внутри браузера. Еще лучше, emscripten конвертирует OpenGL, графический API для настольных компьютеров в WebGL, который является веб-вариантом этого API.

Как подходит asm.js к картинке?enter image description here

Asm.js, сокращенный для ассемблера JavaScript, является подмножеством JavaScript. Программа asm.js будет вести себя одинаково независимо от того, запускается ли она в существующем JavaScript-движке или в компиляторе с задержкой (AOT), который распознает и оптимизирует asm.js, за исключением скорости, конечно!

С точки зрения скорости трудно точно определить, как оно сравнивается с собственным кодом, но предварительные тесты программ на языке С, скомпилированные в asm.js, обычно в 2 раза замедляются по сравнению с собственной компиляцией с помощью clang, компилятор для языков программирования C, C++ и Obj-C. Важно отметить, что это «лучший» случай для однопоточных программ. Подробнее об этом ограничении языка JavaScript ниже.

На бэкэнде Clang использует LLVM, который является библиотекой для построения, оптимизации и создания промежуточного и/или двоичного машинного кода (эти 0 и 1 снова). LLVM может использоваться как структура компилятора, где вы предоставляете «front end» (парсер и лексер, такие как Clang) и «back end» (код, который преобразует представление LLVM в фактический машинный код)

Дополнительная информация: Alon У Zakai Mozilla есть fantastic slide deck, в котором подробно описывается, как все это работает.

Итак, как здорово asm.js? Ну, у него есть собственный аккаунт в Twitter, @asmjs. В то время как сайт asm немного разрежен, он охватывает спецификацию W3C, в дополнение к подробному FAQ. Еще лучше, Mozilla скоординировала Humble Mozilla Bundle в 2014 году, что позволило вам купить кучу игр, которые использовали asm.js.

Why not just turn your JavaScript code into asm.js?

JavaScript не может действительно быть скомпилирован в asm.js и предлагает большую часть выгоды, из-за его динамичный характер. Это та же проблема, что и при попытке скомпилировать ее t o C или даже до native code - VM с ней необходимо будет позаботиться о тех нестатических аспектах. Однако вы можете написать asm.js вручную.

Если бы вы могли полностью перевести стандартный Javascript полностью статическим образом, не было бы необходимости в asm.js. Asm.js существует так для обещания, что Javascript будет быстрее работать без каких-либо усилий со стороны разработчика.Для JIT было бы очень сложно понять динамический язык, а также статический компилятор.

Чтобы лучше понять это, важно понять, почему asm.js предлагает преимущество в производительности; или почему статически типизированные языки работают лучше, чем динамически типизированные. Одна из причин заключается в том, что «проверка времени выполнения требует времени», и более продуманный ответ будет включать в себя улучшенную возможность оптимизации статически типизированного кода. Конечным преимуществом перехода от статически типизированного языка, такого как C, является тот факт, что компилятор знает тип каждого объекта при его компиляции.

Asm.js - это ограниченное подмножество JS, которое можно легко перевести на байт-код. Для достижения первого шага потребуется разбить все расширенные функции JS на это подмножество для получения этого преимущества, что немного сложно. Но JavaScript-движки оптимизированы и предназначены для перевода всех этих расширенных функций непосредственно в байт-код - поэтому промежуточный шаг, такой как asm.js, не дает большого преимущества.

захожу в более подробно и фотографии in this post.

+0

Последняя часть этого ответа, после * Почему бы не просто включить ... * кажется плагиатом этот ответ от Берги (который на 2 года раньше) без упоминания источника , https://stackoverflow.com/a/15632482/941240 –

+0

И это именно то, откуда я его получил. Благодарим за цитирование источника здесь. Я добавлю его в сообщение сейчас. –

+0

Нет проблем, ссылаясь на то, что вы ссылаетесь на оригинал. –