Может ли обычный JavaScript быть преобразован в asm.js, или это только для ускорения статически типизированных языков низкого уровня?
Я прочитал вопрос, как тестировать и разрабатывать с asm.Джей? и принятый ответ дает ссылку на http://kripken.github.com/mloc_emscripten_talk/#/.
вывод этого слайд-шоу заключается в том, что"статически типизированные языки и особенно C / C++ могут быть эффективно скомпилированы в JavaScript", так что мы можем"ожидайте, что скорость скомпилированного C / C++ будет всего в 2 раза медленнее, чем собственный код, или лучше, позже это год".
а насчет номера-статически-типизированные языки, такие как регулярные собственно JavaScript? Может ли он быть скомпилирован в asm.Джей?
7 ответов:
может ли сам JavaScript быть скомпилирован в asm.Джей?
Не очень, из-за его динамической природы. Это та же проблема, что и при попытке скомпилировать его С или даже в машинный код - на самом деле вам нужно будет отправить виртуальную машину с ним, чтобы позаботиться об этих нестатических аспектах. По крайней мере, такая виртуальная машина возможна:
js.js является интерпретатором JavaScript в JavaScript. Вместо того, чтобы пытаться создайте интерпретатор с нуля,SpiderMonkey составлен в LLVM а то emscripten переводит вывод в JavaScript.
но если код asmjs работает быстрее, чем обычный JS, то имеет смысл скомпилировать JS в asmjs, нет?
нет. asm.js является довольно ограниченным подмножеством JS, которое может быть легко переведено в байт-код. Но сначала нужно сломать все расширенные возможности JS для этого подмножества для получения этого преимущества-довольно сложная задача imo. Но движки JavaScript разработаны и оптимизированы для перевода всех этих дополнительных функций напрямую в байт-код-так зачем беспокоиться о промежуточном шаге, как asm.Джей? Js.js утверждает, что примерно в 200 раз медленнее, чем "родной" JS.
а насчет номера-статически-типизированные языки вообще?
слайд-шоу говорит об этом от ... Просто C / C++? далее. В частности:
все среды выполнения C / C++ могут быть скомпилированы и на языке оригинала интерпретируется с правильной семантикой, но это не легкий
компиляторы Source-to-source из таких языков в JavaScript игнорируют семантические различия (например, числовые типы)
на самом деле, эти языки зависят от специальных виртуальных машин, чтобы быть эффективными
компиляторы от источника к источнику для них теряют оптимизацию, выполненную в этих виртуальных машинах
несколько фактов о asm.js, которые, надеюсь, делают концепцию ясной:
Да, вы можете написать asm.js диалект вручную.
Если вы посмотрите на примеры для asm.js, Они очень далеки от того, чтобы быть удобный. Очевидно, что Javascript не является языком интерфейса для создания этого кода.
перевод ванильного Javascript в asm.js диалект - это не возможно.
подумайте об этом - если бы вы уже могли перевести стандартный Javascript полностью статически, зачем было бы нужно asm.js? Единственное существование asm.js означает, что люди Javascript JIT у некоторых людей отказались от своего обещания, что Javascript будет быстрее без каких-либо усилий со стороны разработчика.
есть несколько причин для этого, но давайте просто скажем, что это будет действительно трудно для JIT понять динамический язык так же хорошо, как статический компилятор. И тогда, вероятно, для разработчиков, чтобы полностью понять JIT.
в конце концов это сводится к использованию правильного инструмента для выполнения задачи. Если вы хотите статический, очень производительный код, используйте C/C++ ( / Java ) - Если вы хотите динамический язык, используйте Javascript, Python, ...
в ответ на общий вопрос "это возможно?"тогда ответ таков, что уверен, как JavaScript и asm.подмножество js является полным Тьюрингом, поэтому существует перевод.
следует ли это делать и ожидать повышения производительности-это другой вопрос. Короткий ответ: "Нет, вы не должны". я сравниваю это с попыткой сжать сжатый файл; да, можно запустить алгоритм сжатия, но в целом вы не должны ожидать, что результирующий файл будет меньший.
короткий ответ: стоимость производительности динамически типизированных языков зависит от значения кода; статически типизированная программа с эквивалентным значением будет нести те же затраты.
чтобы понять это, важно понять почему asm.js предлагает преимущество в производительности вообще; или, в более общем плане, почему статически типизированные языки работают лучше, чем динамически типизированные. Короткий ответ: "тип времени выполнения проверка требует времени", и более длинный ответ будет включать улучшенную возможность оптимизации статически типизированного кода. Например:
function a(x) { return x + 1; } function b(x) { return x - 1; } function c(x, y) { return a(x) + b(y); }если
xиyоба известны как целые числа, я могу оптимизировать функциюcк паре инструкций машинного кода. Если бы они могли быть целыми числами или строками, проблема оптимизации становится намного сложнее; я должен рассматривать их как строку, добавленную в некоторых случаях, и добавление в других случаях. В частности, есть четыре возможных интерпретации операции сложения, которая происходит вc; это может быть добавление или добавление строки или два разных варианта принуждения к строке и добавлению. По мере добавления дополнительных возможных типов число возможных перестановок растет; в худшем случае для динамически типизированного языка у вас есть k^n возможные интерпретации выражения с участием n термины, которые могут иметь любое число k типы. На статически типизированном языке, k=1, поэтому всегда существует 1 интерпретация любого данного выражения. Из-за этого оптимизаторы принципиально более эффективны при оптимизации статически типизированного кода, чем динамически типизированный код: при поиске возможностей оптимизации необходимо учитывать меньше перестановок.дело в том, что при преобразовании из динамически типизированного кода в статически типизированный код (как это было бы при переходе от JavaScript к asm.js), вы должны учитывать семантику оригинальный код. Это означает, что проверка типа все еще происходит (только что был прописан статически типизированный код), и все эти перестановки все еще присутствуют, чтобы задушить компилятор.
asm.js был создан необходимостью иметь небольшое подмножество javascript, которое можно легко оптимизировать. Если у вас есть способ конвертировать javascript в javascript/asm.js, asm.js больше не нужен - этот метод может быть вставлен непосредственно в интерпретаторы js.
в теории, это возможно, чтобы преобразовать / компиляции / transpile любой операции JavaScript для АСМ.js, если он может быть выражен с ограниченным подмножеством языка, присутствующего в asm.js. На практике, однако, нет инструмента, способного конвертировать обычный JavaScript в asm.js на данный момент (июнь 2017 года).
в любом случае, было бы более разумно конвертировать язык с статическая типизация на ASM.js, потому что статическая типизация является требованием asm.js и их отсутствие одна из особенностей обычного JavaScript, что делает его исключительно трудно скомпилировать в asm.js.
назад в 2013 году, когда asm.js было жарко, была попытка скомпилировать статически типизированный язык, похожий на JavaScript, но и язык, и компилятор, похоже, были оставлены.
сегодня, в 2017 году, JavaScipt подмножества TypeScript и поток были бы подходящими кандидатами для преобразования в asm.js, но основной dev команды ни одного языка не заинтересованы в таком преобразовании. LLJS была вилка, которая могла компилироваться в asm.js, но этот проект в значительной степени мертв. ThinScript - это гораздо более поздняя попытка и основана на TypeScript, но она также не активна.
Так, самый лучший и самый легкий путь произвести АСМ.JS-код по-прежнему должен писать ваш код на C/C++ и конвертировать / компилировать / транспилировать его. Однако еще предстоит выяснить, захотим ли мы это сделать это в обозримом будущем. Web Assembly может скоро заменить asm.js в целом, и там уже появляются машинописные языки, такие как TurboScript и AssemblyScript которые преобразуются в веб-сборку. Фактически, TurboScript изначально был основан на ThinScript и использовался для компиляции в asm.js, но они, похоже, отказались от этой функции.
проверьте это http://badassjs.com/post/43420901994/asm-js-a-low-level-highly-optimizable-subset-of
в основном вам нужно проверить, что ваш код будет asm.js совместимость (без принуждения или приведения типа, вам нужно управлять памятью и т. д.). Идея этого заключается в написании кода на javascript, обнаружении горлышка бутылки и внесении изменений в ваш код для использования asm.компиляция js и aot вместо jit и dynamic compilation...is немного питы, но вы можете все еще используйте javascript или другие языки, такие как c++ или better..in в ближайшем будущем, lljs.....
Это может быть возможным, чтобы преобразовать регулярные JavaScript в АМС.js by first компиляции в C или C++, а затем компиляция сгенерированного кода в asm.Яш, используя Emscripten. Я не уверен, что это будет практично, но это интересная концепция, тем не менее.
Comments