Come eseguire codice C ++ nel browser usando asm.js?

21

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

link

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

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

    
posta LO kaka 13.05.2013 - 17:00
fonte

3 risposte

36

Credo che tu abbia sbagliato nella comprensione di asm.js .

Prima di tutto, da le sue FAQ

Q. Is asm.js a new language?
A. No, it's just (a subset of) JavaScript.

E hai chiesto chiarimento aggiunto :

But how is it possible to write one [an asm.js application] in C++

Non scrivi "un'applicazione asm.js", piuttosto asm.js è un target 1 per compilare il tuo codice C ++.

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

A partire da questa immagine:

puoivederecheasm.jsèunobiettivoditraduzionedi emscripten . Emscripten gestisce la traduzione del bytecode LLVM in JavaScript e asm.js è un sottoinsieme di JavaScript. Rimanendo all'interno del sottoinsieme limitato di JavaScript di asm.js, il codice può essere ottimizzato ed eseguito più rapidamente.

Hai anche chiesto:

And if I write the code in C++, then how to use the js API-s

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

Se hai una nuova applicazione per scrivere che necessita di API JS, dovresti scrivere l'applicazione in JS e non con futz cercando di scrivere in C ++ e poi portarla su JavaScript.

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

the kind of applications that are going to target Asm.js, in the near future, are those that will benefit from the portability of running in a browser but which have a level of complexity in which a direct port to JavaScript would be infeasible

e

As you can probably see from the code above Asm.js isn’t designed to be written by hand. ... The most common use case for Asm.js right now is in applications complied from C/C++ to JavaScript. Almost none of these applications interact with the DOM in a meaningful way, beyond using WebGL and the like.

Quello che potresti voler prendere in considerazione invece è avere un programma JavaScript che chiami le API JS di cui hai bisogno insieme a effettuare chiamate al C ++ che hai compilato su JavaScript. Dai un'occhiata a questo tutorial descrittivo per vedere come chiamare Codice C ++ da JavaScript.

Per ulteriori ricerche, emscripten ha un tutorial che potrebbe aiutarti ad iniziare con la comprensione di come prendere il codice C ++, eseguirlo tramite LLVM e quindi selezionare asm.js.

1 Strettamente parlando, non è vero. Il codice C / C ++ non è a conoscenza di cosa verrà compilato, quindi non posso davvero chiamare asm.js come target. Un altro strumento (emscripten) prende l'output LLVM e quindi si traduce in JavaScript compatibile con asm.js. Ma lo chiamerò un obiettivo perché è più facile da capire.

    
risposta data 13.05.2013 - 17:32
fonte
6

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

Ecco un tutorial: link . Guardando il tutorial, sembra abbastanza facile compilare codice C ++:

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

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html
    
risposta data 13.05.2013 - 18:23
fonte
0

Il modo più semplice sarebbe utilizzare WCPP , un pacchetto che ti permette 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, consulta il pacchetto NPM o Git Repo

    
risposta data 16.08.2018 - 23:13
fonte

Leggi altre domande sui tag