O que é o ASM.js e o que isso significa para todos?

27

Eu estou começando a ouvir rumores sobre este projeto chamado ASM.js . Atualmente, seu site é terrível e confuso. Aqui está o que eu sei da minha pesquisa na web.

  • É um subconjunto de JavaScript que pode ser altamente otimizado. Eu estou supondo, porque evita as partes mais dinâmicas da linguagem.
  • O desempenho do código compilado no ASM.js é executado aproximadamente à metade da velocidade de C (não é leve).
  • A intenção é que os compiladores tornem o idioma alvo ASM.js.
  • O Firefox será lançado com a otimização do ASM.js.
  • As equipes Mozilla e Unreal transportaram o Unreal Engine para a Web com ele e estão rodando em uma compilação do Firefox em velocidades quase nativas.

Não parece haver nenhuma informação concreta na web sobre o que realmente é, a utilidade ou o objetivo final. É possível compilar minhas bases de códigos do lado do servidor e executá-las no navegador a velocidades próximas da nativa? Quais são as ramificações para os desenvolvedores?

Jarrod Nettles
fonte

Respostas:

21

Você já descreveu o que é . O uso é que é uma linguagem de baixo nível que funciona em todos os navegadores, é bastante rápida na maioria e muito rápida em alguns. O que você faz disso é tão aberto quanto o que você faz com qualquer outra linguagem de programação.

O caso de uso que o Mozilla parece mais interessado é o seguinte: já existem maneiras de compilar linguagens com back-end LLVM (principalmente C e C ++) para JavaScript, via Emscripten. o asm.js está muito próximo do que o Emscripten já emite, portanto, isso permite que o código do Emscripten (que já é impressionantemente rápido nos compiladores JavaScript JIT de hoje) se torne ainda mais rápido, promovendo o objetivo de portar bases de código existentes na Web. Novamente, o que exatamente você usa para isso é a sua decisão. Portar jogos é um dos casos de uso (no qual o Mozilla aparentemente está envolvido ativamente), mas existem inúmeras coisas escritas em C e C ++, algumas das quais podem ser úteis para o site de alguém. Alguns que eu vi foram lançados (além de alguns dos meus próprios projetos), sem garantia de viabilidade:

  • Portar algoritmos de uso geral (por exemplo, implementações zlib, libjpeg, openssl, FFT) para capacitar JavaScript / sites a fazer mais, sem precisar criar um novo padrão da web e dependendo de navegadores individuais para implementá-lo.
  • Portando intérpretes, para que outros idiomas que não sejam JavaScript possam ser executados no navegador, com menos sobrecarga e esforço mínimo de portabilidade.
  • Usando o asm.js como back-end para mais compiladores, especialmente aqueles que não mapeiam bem o JavaScript e não precisam da maioria de seus recursos e despesas gerais. Um exemplo pode ser um idioma projetado para trabalhos numéricos rápidos, sem alocação de memória.
  • Usando asm.js para criar um JIT em JavaScript. Ele pode implementar qualquer linguagem - por exemplo, o ActionScript .
  • Na mesma linha, portando compiladores JIT existentes para execução no navegador (consulte portando intérpretes, com efetivamente nulo overhead sobre JS). Provavelmente, isso só é possível quando os compiladores JIT são gerados automaticamente, como no PyPy.

fonte
2
Aqui é outra boa explicação: ejohn.org/blog/asmjs-javascript-compile-target
Jarrod Nettles
1
Aqui está uma prova de conceito para portar um JIT para asm.js. É um ponto de venda único, a maioria das plataformas emergentes não é compatível com JIT.
Tobu
Existe uma explicação em algum lugar de como o asm.js suporta a compilação JIT? Não consigo encontrar nenhuma informação sobre isso. Mais interessado em como as implicações de segurança são tratadas.
Roman Starkov
@romkyns Compilação JIT de asm.js no código de máquina pelos navegadores ou compilação JIT no asm.js. (por um programa JavaScript)? No primeiro, pelo menos no Firefox, os recursos de geração de código de máquina dos compiladores JIT pure-JS são reutilizados. Como o asm.js pode chamar apenas JS, executar aritmética e ler / gravar uma matriz de heap com verificações de índice no intervalo, a segurança é tão boa quanto a segurança da execução de JS. Para o último, você apenas gera o código-fonte asm.js. e deixa o navegador executá-lo, e não há implicações de segurança adicionais além do que mencionei antes.
(Eu quis dizer o último) Ooh, é claro; de alguma forma, imaginei compiladores JIT emitindo código de máquina nativo. Obrigado pelo esclarecimento!
Roman Starkov
4

Imagine o ASM.js como um grande ArrayBuffer binário chamado heap e um conjunto de módulos JavaScript, que começam com uma diretiva de prólogo: "use asm";e executam operações rápidas de baixo nível em dados binários brutos, semelhantes às linguagens de montagem. Esses módulos podem ser escritos manualmente ou melhor compilados a partir do código LLVM por scripts como Emscripten. Seu desempenho pode ser aprimorado graças ao mecanismo Mozilla OdinMonkey, mas eles são compatíveis com a maioria dos intérpretes modernos do ECMAScript.

O ASM.js não se limita a jogos, você pode até executar aplicativos Qt inteiros no seu navegador, como estes !

niutech
fonte