Как работает сборка (asm.js) в браузере?

Asm.js происходит из новой категории приложений JavaScript: приложений C/C++, которые были скомпилированы в JavaScript. Это часть JavaScript, созданная проектом Mozilla Emscripten.

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

1 ответ

Решение

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

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

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

Как asm.js вписывается в картину?

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

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

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

Дальнейшее чтение: Алон Закай из Mozilla имеет фантастическую слайд-колоду, в которой более подробно рассказывается о том, как все это работает.

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

Почему бы просто не превратить ваш код JavaScript в asm.js?

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

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

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

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

Я вхожу в более подробно и фотографии в этом посте.

Другие вопросы по тегам