Como executar o código C ++ no navegador usando asm.js.

21

Um aplicativo asm.js. é muito rápido (quase na velocidade C ++ nativa):

insira a descrição da imagem aqui

http://kripken.github.io/mloc_emscripten_talk/micro4b.png

Mas como é possível escrever um em C ++, convertê-lo em código LLVM e depois fazer alguns truques com emscripten / asm.js? Não encontrei nenhum tutorial sobre isso.

E se eu escrever o código em C ++, como usar as APIs js, por exemplo, XMLHttpRequest, WebSockets, Canvas ou WebGL?

LO kaka
fonte
3
Compartilhar sua pesquisa ajuda a todos. Conte-nos o que você tentou e por que ele não atendeu às suas necessidades. Isso demonstra que você reservou um tempo para tentar ajudar a si mesmo, evita reiterar respostas óbvias e, acima de tudo, ajuda a obter uma resposta mais específica e relevante. Veja também How to Ask
gnat
Este tutorial de terceiros parece abordar algumas dessas perguntas: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

Respostas:

36

Eu acredito que você está enganado em sua compreensão de asm.js .

Primeiro, a partir do FAQ

P. o asm.js. é um novo idioma?
R. Não, é apenas (um subconjunto de) JavaScript.

E você pediu esclarecimentos adicionados :

Mas como é possível escrever um [um aplicativo asm.js.] em C ++

Você não escreve um "aplicativo asm.js.", mas sim o asm.js. é o alvo 1 para compilar seu código C ++.

Este artigo de John Resig fornece vários detalhes que podem explicar melhor como o asm.js seria usado.

Começando com esta imagem:
C ++ => clang / LLVM => emscripten => mecanismo JS

você pode ver que o asm.js é um destino de tradução do emscripten . O Emscripten manipula a tradução do bytecode do LLVM em JavaScript, e o asm.js é um subconjunto de JavaScript. Permanecer no subconjunto restrito de JavaScript do asm.js. permite que o código seja otimizado e executado mais rapidamente.

Você também perguntou:

E se eu escrever o código em C ++, como usar o js API-s

Novamente, você está meio que perdendo o objetivo. O Asm.js permite transportar aplicativos C / C ++ existentes para JavaScript, para que possam ser executados em um navegador. Normalmente, você não seria capaz de usar APIs JS no seu código C / C ++, e não há nada mágico no asm.js para permitir isso.

Se você tiver um novo aplicativo para gravação que precise de APIs JS, deverá gravá-lo em JS e não futz tentando gravar em C ++ e, em seguida, portar para JavaScript.

E voltando ao artigo de Resig, há duas citações principais para sua pergunta:

os tipos de aplicativos que atingirão o Asm.js, em um futuro próximo, serão aqueles que se beneficiarão da portabilidade de execução em um navegador, mas que terão um nível de complexidade em que uma porta direta para JavaScript seria inviável

e

Como você provavelmente pode ver no código acima, o Asm.js não foi projetado para ser escrito à mão. ... O caso de uso mais comum para o Asm.js agora é em aplicativos compatíveis de C / C ++ a JavaScript. Quase nenhum desses aplicativos interage com o DOM de maneira significativa, além do uso de WebGL e similares.

O que você pode querer considerar fazer é ter um programa JavaScript que chame as APIs JS necessárias, além de fazer chamadas para o C ++ que você compilou para JavaScript. Dê uma olhada neste tutorial emscripten para ver como chamar o código C ++ do JavaScript.


Para alguma pesquisa adicional, o emscripten possui um tutorial que pode ajudá-lo a entender como usar o código C ++, executá-lo no LLVM e, em seguida, direcionar para asm.js.

1 Estritamente falando, isso não é verdade. O código C / C ++ não tem conhecimento do que será compilado, então não posso realmente chamar o asm.js de destino. Outra ferramenta (emscripten) pega a saída do LLVM e depois converte para JavaScript compatível com asm.js. Mas vou chamá-lo de alvo porque é mais fácil de entender.

TehShrike
fonte
O ASM.js é um destino de compilação para C / C ++. Portanto, não o seu não escrever C ++ em asm.js sua compilação C ++ para asm.js
Calvin
Apenas uma menção vem à mente para aplicativos iniciados do zero. No caso de jogos, ter o código em C ++ pode ser útil para implantar em várias plataformas.
Vlad Nicula
6

Sim, você pode escrever o código C ++ e compilá-lo no asm.js, usando o emscripten. Eu ainda não tentei e não tenho certeza de como isso está pronto para o horário nobre. Parece ser bom o suficiente para rodar um monte de jogos.

Aqui está um tutorial: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html . Olhando para o tutorial, parece bastante fácil compilar código C ++:

// hello.cpp
#include<stdio.h>

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html
jdm
fonte
4
Na verdade, isso é código C. Um compilador C ++ é cerca de duas ou três ordens de magnitude mais complexa. Felizmente, o emscripten evita esse problema difícil ao compilar o LLVM, e existe um compilador C ++ - para LLVM existente.
MSalters
3
@ MSalters: Também é um código C ++ válido. Imagine isso! Uau!
Thomas Eding
@ Thomashoding: Você perdeu o ponto. Quanto menor o idioma que você precisa suportar, mais fácil é compilar esse idioma. A interseção de C e C ++ não é necessariamente maior que os dois.
MSalters
Vamos supor que esse código fosse C ++ puro, que um compilador C não manipularia, o uso de emccseria válido?
Hamza Ouaghad 18/01/16
@HamzaOuaghad - yes. um simples olá mundo com as classes cout & string do c ++ funciona muito bem com esta linha de comando emcc. usando a versão 1.35.0.
Orion elenzil
0

A maneira mais fácil seria usar o WCPP , um pacote que permite importar C ++ quase diretamente no seu projeto Node.

Nosso C ++

// addTwo.cpp 

export int addTwo(int a, int b) {
  return a + b;
}

No terminal (para compilar nosso C ++)

$ wcpp

Nosso JavaScript

const ourModule = await require('wcpp')('./addTwo.cpp')

console.log(ourModule.addTwo(2, 3))

Para obter mais informações, consulte o pacote NPM ou o repositório Git.

Brandon Dyer
fonte