Come eseguire il codice C ++ nel browser utilizzando asm.js?


21

Un'applicazione asm.js è molto veloce (vicino alla velocità C ++ nativa):

inserisci qui la descrizione dell'immagine

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

Ma come è possibile scriverne uno in C ++, convertirlo in codice LLVM, quindi fare qualche trucco con emscripten / asm.js? Non ho trovato alcun tutorial al riguardo.

E se scrivo il codice in C ++, come utilizzare le API js, ad esempio XMLHttpRequest, WebSocket, Canvas o WebGL?


3
Condividere la tua ricerca aiuta tutti. Dicci cosa hai provato e perché non ha soddisfatto le tue esigenze. Ciò dimostra che hai impiegato del tempo per cercare di aiutarti, ci salva dal ribadire risposte ovvie e soprattutto ti aiuta a ottenere una risposta più specifica e pertinente. Vedi anche Come chiedere
moscerino

Questo tutorial di terze parti sembra rispondere ad alcune di queste domande: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

Risposte:


36

Credo che vi sbagliate nella vostra comprensione di asm.js .

Prima di tutto, dalle loro FAQ

D. asm.js è una nuova lingua?
R. No, è solo (un sottoinsieme di) JavaScript.

E hai chiesto chiarimenti aggiunti :

Ma come è possibile scrivere una [un'applicazione asm.js] in C ++

Non scrivi una "applicazione asm.js", piuttosto asm.js è un obiettivo 1 a cui compilare il tuo codice C ++.

Questo articolo di John Resig fornisce una serie di dettagli che potrebbero spiegare meglio come verrebbe utilizzato asm.js.

A partire da questa immagine:
C ++ => clang / LLVM => emscripten => motore JS

puoi vedere che asm.js è un obiettivo di traduzione di emscripten . Emscripten gestisce la traduzione del bytecode LLVM in JavaScript e asm.js è un sottoinsieme di JavaScript. Rimanere all'interno del sottoinsieme limitato di JavaScript di asm.js consente di ottimizzare il codice e di eseguirlo più rapidamente.

Hai anche chiesto:

E se scrivo il codice in C ++, allora come usare le API js

Ancora una volta, ti manca un po 'il punto. Asm.js consente il porting delle applicazioni C / C ++ esistenti in JavaScript in modo che possano essere eseguite all'interno di un browser. Normalmente non saresti in grado di utilizzare le API JS nel tuo codice C / C ++ e non c'è nulla di magico in asm.js per permetterlo.

Se hai una nuova applicazione da scrivere che necessita di API JS, allora dovresti scrivere l'applicazione in JS e non futz con il tentativo di scrivere in C ++ e poi port su JavaScript.

E tornando all'articolo di Resig, ci sono due citazioni chiave per la tua domanda:

il tipo di applicazioni destinate ad Asm.js, nel prossimo futuro, sono quelle che trarranno vantaggio dalla portabilità dell'esecuzione in un browser ma che hanno un livello di complessità in cui una porta diretta su JavaScript sarebbe impossibile

e

Come probabilmente vedrai dal codice sopra, Asm.js non è progettato per essere scritto a mano. ... Il caso d'uso più comune per Asm.js in questo momento è nelle applicazioni rispettate da C / C ++ a JavaScript. Quasi nessuna di queste applicazioni interagisce con il DOM in modo significativo, oltre all'utilizzo di WebGL e simili.

Quello che potresti considerare di fare invece è avere un programma JavaScript che chiama le API JS di cui hai bisogno insieme a effettuare chiamate al C ++ che hai compilato in JavaScript. Dai un'occhiata a questo tutorial di emscripten per vedere come chiamare il codice C ++ da JavaScript.


Per alcune ricerche aggiuntive, emscripten ha un tutorial che potrebbe aiutarti a iniziare a capire come prendere il codice C ++, eseguirlo tramite LLVM e quindi target asm.js.

1 A rigor di termini, non è vero. Il codice C / C ++ non è a conoscenza di ciò che verrà compilato, quindi non posso davvero chiamare asm.js una destinazione. Un altro strumento (emscripten) utilizza l'output di LLVM e quindi si traduce in JavaScript conforme a asm.js. Ma lo chiamerò un obiettivo perché è più facile da capire.


ASM.js è un obiettivo di compilazione per C / C ++. Quindi non scrivere C ++ in asm.js compilando C ++ in asm.js
Calvin,

Mi viene in mente solo una menzione per le applicazioni avviate da zero. Nel caso dei giochi, avere il codice in C ++ potrebbe essere utile per la distribuzione su più piattaforme.
Vlad Nicula,

6

Sì, puoi scrivere il codice C ++ e compilarlo in asm.js, usando emscripten. Non l'ho provato da solo, e non sono sicuro di quanto sia pronto per la prima serata. Sembra essere abbastanza buono per eseguire un sacco di giochi però.

Ecco un tutorial: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html . Guardando il tutorial, sembra abbastanza facile compilare il codice C ++:

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

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html

4
Questo è in realtà il codice C. Un compilatore C ++ è di circa due o tre ordini di grandezza più complesso. Fortunatamente, emscripten evita questo difficile problema compilando LLVM e c'è un compilatore C ++ - LLVM esistente.
MSalters,

3
@MSalters: è anche un codice C ++ valido. Immaginalo! Wow!
Thomas Eding,

@ThomasEding: hai perso il punto. Più piccola è la lingua che devi supportare, più facile è compilare quella lingua. L'intersezione di C e C ++ non è necessariamente più grande di nessuno dei due.
MSalters il

Supponiamo che questo codice fosse puro C ++, che un compilatore C non avrebbe gestito, l'uso di emccsarebbe valido?
Hamza Ouaghad,

@HamzaOuaghad - si. un semplice mondo di ciao con le classi cout & string di c ++ funziona perfettamente con questa riga di comando emcc. utilizzando la versione 1.35.0.
Orion Elenzil,

0

Il modo più semplice sarebbe usare WCPP , un pacchetto che ti consente di importare C ++ quasi direttamente nel tuo progetto Node.

Il nostro C ++

// addTwo.cpp 

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

Nel terminale (per compilare il nostro C ++)

$ wcpp

Il nostro JavaScript

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

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

Per ulteriori informazioni, consultare il pacchetto NPM o Git Repo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.