Что именно делает asm?

Насколько я знаю, Asm.js — это просто строгая спецификация JavaScript, он использует возможности JavaScript и не является новым языком.

Например, вместо var a = e; предлагается var a = e|0;.

Мой вопрос: если asm.js — это просто определение и его можно достичь, изменив способ использования и объявления переменных и динамических типов, что на самом деле делает "use asm";? Нужно ли помещать эту строку перед объявлением тела функции или нет?


person Afshin Mehrabani    schedule 03.05.2014    source источник
comment
Это декларативный параметр, который позволяет поддерживаемым механизмам JS узнать о вашем намерении предоставить код, оптимизированный для asm.js, и, следовательно, попытаться выполнить эту оптимизацию. Кажется, я помню, как слышал, что V8 реализовывал эти оптимизации без декларативного подхода. Хотя не уверен в этом.   -  person cookie monster    schedule 03.05.2014
comment
Вы должны прочитать об ASM здесь, чтобы лучше понять его. ejohn.org/blog/asmjs-javascript-compile-target   -  person Rob M.    schedule 03.05.2014
comment
@cookiemonster Я не могу понять, что вы имеете в виду под оптимизацией. Это своего рода оптимизации, созданные разработчиком, я прав? Посмотрите на побитовую операцию, которую я написал в вопросе.   -  person Afshin Mehrabani    schedule 03.05.2014
comment
Нет, оптимизации обеспечивает сам движок. Для этих оптимизаций требуется очень специфический синтаксис, который должен быть написан разработчиком (или, что более вероятно, сгенерировано генератором кода). В реализации, которая не поддерживает такие оптимизации, код, скорее всего, будет работать медленнее, чем код JS, написанный обычным образом.   -  person cookie monster    schedule 03.05.2014
comment
Это как использовать строгий, строгий JS также является подмножеством обычного JS. Таким образом, вы сообщаете движку (обратно совместимым образом), что используете это подмножество, и можно следовать немного другим правилам.   -  person Juan Mendes    schedule 03.05.2014
comment
@cookiemonster ага, и просто в завершение, используя обе побитовые операции (или другие спецификации asm.js), как я сказал в вопросе, И также использование "use asm"; будет выполнять данный код быстрее. В противном случае код будет медленнее обычного JS-кода, верно?   -  person Afshin Mehrabani    schedule 03.05.2014
comment
В основном. Я не знаю, сколько места для оптимизации в одной строке кода, но для кода, который интенсивно использует процессор и может выиграть от таких оптимизаций, тогда да, если движок распознает декларативное использование asm, и если код правильно написанный для asm.js, тогда да, он должен работать быстрее. И да, весьма вероятно, что код, написанный для asm.js, снизит производительность в реализациях, не предлагающих такую ​​оптимизацию. Я говорю «вероятно», потому что не хочу делать никаких абсолютных заявлений, но я думаю, что в целом так и будет.   -  person cookie monster    schedule 04.05.2014


Ответы (2)


Asm.js — это очень строгое подмножество JavaScript, оптимизированное для машин, а не для людей. Если вы хотите, чтобы ваш браузер интерпретировал определенный код как код asm.js, вам необходимо создать модуль, к которому применяются следующие условия:

  • весь код полностью статически типизирован и ограничен очень строгим подмножеством JavaScript asm.js.
  • ваш модуль начинается с прагмы "use asm"

Кроме того, модуль asm.js позволяет использовать только три необязательных, но очень специфических параметра:

  • объект стандартной библиотеки, обеспечивающий доступ к подмножеству стандартных библиотек JavaScript
  • интерфейс внешней функции (FFI), обеспечивающий доступ к пользовательским внешним функциям JavaScript.
  • буфер кучи, предоставляющий один ArrayBuffer для работы в качестве кучи asm.js

Итак, ваш модуль должен выглядеть примерно так:

function MyAsmModule(stdlib, foreign, heap) {
    "use asm";

    // module body...

    return {
        export1: f1,
        export2: f2,
        // ...
    };
}

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

Опустите "use asm", и ваш браузер не будет знать, что он должен интерпретировать ваш код как модуль asm.js. Он будет рассматривать ваш код как «обычный» JavaScript. Однако простого использования "use asm" недостаточно, чтобы ваш код интерпретировался как asm.js. Если вы не соответствуете ни одному из других критериев, упомянутых выше, ваш код также будет интерпретироваться как «обычный» JavaScript:

введите описание изображения здесь

Для получения дополнительной информации об asm.js см., например. статья Джона Резига 2013 года или официальные спецификации.

person John Slegers    schedule 22.06.2017

«use asm» — это прагма, которая сообщает движку JavaScript, как именно его интерпретировать. Хотя это допустимый JavaScript и его можно использовать без прагмы, FireFox может выполнять дополнительные оптимизации подмножества Asm.js для повышения производительности. Для этого он должен знать, что это Asm.js.

person Syntax    schedule 03.05.2014