Файл asm.js довольно сильно волнует то, как он сможет запускать некоторые очень тяжелые приложения. Однако он скомпилирован из кода C ++. Можно ли по-прежнему пользоваться преимуществами текущих улучшений, не зная C ++ или других языков низкого уровня?
Вот мысль, которая у меня возникла: это вообще возможно, что мы можем написать код на Js, перекомпилировать его для asm.js для оптимизации?
Однако он скомпилирован из кода C ++.
Это не. Это язык. Любая программа может создавать текстовые файлы, содержащие код asm.js. Emscripten компилирует LLVM IR в asm.js, и есть компиляторы из C и C ++ в LLVM IR, но это только один из возможных способов получения кода asm.js. Следует признать, что в настоящее время это наиболее зрелый, практичный и популярный способ, но я не удивлюсь, если в будущем появятся другие компиляторы asm.js для других языков.
Можно ли по-прежнему пользоваться преимуществами текущих улучшений, не зная C ++ или других языков низкого уровня?
Ну, теоретически любой язык, который может быть эффективно скомпилирован в машинный код заблаговременно, может быть эффективно реализован с использованием asm.js, и это включает в себя некоторые довольно высокоуровневые (например, Haskell).
Но в настоящее время ни у кого нет работающей реализации, и я не ожидаю, что это когда-нибудь станет очень популярным. Прямо сейчас, если вам нужна производительность asm.js, вы, вероятно, написали бы код на C или C ++ и скомпилировали бы его в asm.js, да.
Обратите внимание, что вышеизложенное исключает (среди многих других) Javascript. Тот факт, что asm.js является подмножеством Javascript, удобен тем, что код asm.js будет работать в неизмененных браузерах, но он не очень полезен для тех, кто пишет Javascript. asm.js — это просто тонкий слой над машинным кодом, с некоторыми поправками для безопасности и совместимости с JS. Компилировать JS в asm.js так же сложно, как и компилировать его в машинный код: это просто, если вам наплевать на производительность (просто всегда используются коробочные динамически типизированные значения, такие как интерпретатор, и генерация вызовов функций библиотеки времени выполнения), очень тяжело когда ты делаешь.
Фактически, после десятилетий исследований в этой области, до сих пор нет примера высокодинамичного языка, такого как Javascript, Ruby или Python, скомпилированного в машинный код. досрочно и работает намного быстрее, чем умный переводчик. Компиляция точно в срок, с другой стороны, очень практична — но основные движки JS уже делают это менее обходным путем, чем компиляция в asm.js, затем ее повторный анализ и компиляция в машинный код.
Если у вас есть небольшая функция, которая очень трудоемкая для вычислений (сокращение чисел, а не манипулирование DOM), вы можете вручную переписать ее в стиле asm.js. Возможно (я сделал это), но утомительно.
Есть и другие компиляторы asm.js, например LLJS что вы можете использовать вместо C ++.
Однако asm.js не волшебство. Вы получите только выигрыш в производительности, если будете использовать язык, который лучше подходит для досрочной оптимизации, чем JS. Вы не можете взять полнофункциональный JS и сделать его быстрее, запустив JS VM поверх JS VM, точно так же, как вы не можете уменьшить ZIP-файлы, сжав их.
asm.js это не отдельный язык, а подмножество Javascript. Это просто Javascript с большим количеством ресурсов для работы. Это означает, что вам не нужно изучать другой язык, хотя в этом случае знание C / C ++ может быть полезно для его понимания.
Asm.js — это очень строгое подмножество JavaScript, которое может быть сравнительно легко сгенерировано при компиляции из C / C ++ в JavaScript. Код Asm.js намного ближе к машинному коду, чем обычный код JavaScript, что позволило браузерам сильно оптимизировать любой код, написанный на asm.js. В браузерах, в которых реализована такая оптимизация, ваш код будет обычно работать примерно на 50% скорости программы на C / C ++, которая компилируется в машинный код … который может показаться медленным, но намного быстрее, чем любой обычный JavaScript !
Тем не менее, именно потому, что он оптимизирован для машин, а не людей, практически невозможно вручную написать asm.js любым разработчиком-человеком … даже если он просто JavaScript. Хотя технически возможно преобразовать — по крайней мере, подмножество — обычного JavaScript в эквивалент asm.js, такое преобразование не является легкой задачей, и я еще не сталкивался с каким-либо проектом, в котором предпринимались какие-либо попытки достичь этого.
До тех пор, пока кто-то не выполнит такую задачу Herculean, лучшим подходом к созданию кода asm.js остается написание вашего кода на C / C ++ и преобразование его в JavaScript.
Для получения дополнительной информации о asm.js, см., Например. Статья Джона Резига за 2013 год или официальные спецификации.