Jak uruchomić kod C ++ w przeglądarce za pomocą asm.js?

21

Aplikacja asm.js jest bardzo szybka (prawie natywna prędkość C ++):

wprowadź opis zdjęcia tutaj

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

Ale jak można napisać jeden w C ++, przekonwertować go na kod LLVM, a następnie zrobić sztuczkę z emscripten / asm.js? Nie znalazłem żadnego samouczka na ten temat.

A jeśli napiszę kod w C ++, to jak korzystać z API js, na przykład XMLHttpRequest, WebSockets, Canvas lub WebGL?

LO kaka
źródło
3
Udostępnianie badań pomaga wszystkim. Powiedz nam, co próbowałeś i dlaczego nie spełnia twoich potrzeb. To pokazuje, że poświęciłeś trochę czasu, aby spróbować sobie pomóc, oszczędza nam to powtarzania oczywistych odpowiedzi, a przede wszystkim pomaga uzyskać bardziej konkretną i odpowiednią odpowiedź. Zobacz także How to Ask
komnata
Ten samouczek innej firmy wydaje się odpowiadać na niektóre z tych pytań: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

Odpowiedzi:

36

Wierzę, że jesteś w błędzie w zrozumieniu asm.js .

Po pierwsze, z ich FAQ

P: Czy asm.js jest nowym językiem?
A. Nie, to tylko (część) JavaScript.

I poprosiłeś o wyjaśnienie :

Ale jak można napisać jedną [aplikację asm.js] w C ++

Nie piszesz „aplikacji asm.js”, a raczej asm.js jest celem 1 do kompilacji kodu C ++.

Ten artykuł autorstwa Johna Resiga zawiera szereg szczegółów, które mogą lepiej wyjaśnić, w jaki sposób zostanie wykorzystany plik asm.js.

Począwszy od tego obrazu:
C ++ => clang / LLVM => emscripten => silnik JS

widać, że asm.js jest celem tłumaczenia emscripten . Emscripten obsługuje tłumaczenie kodu bajtowego LLVM na JavaScript, a asm.js jest podzbiorem JavaScript. Przebywanie w ograniczonym podzbiorze JavaScript asm.js pozwala na optymalizację i szybsze działanie kodu.

Zapytałeś także:

A jeśli napiszę kod w C ++, to jak używać interfejsów API js

Znów brakuje ci sensu. Asm.js umożliwia przenoszenie istniejących aplikacji C / C ++ do JavaScript, aby można je było uruchamiać w przeglądarce. Zwykle nie można używać interfejsów API JS w kodzie C / C ++, a asm.js nie pozwala na to.

Jeśli masz nową aplikację do pisania, która wymaga interfejsów API JS, powinieneś napisać aplikację w JS, a nie pisać, próbując pisać w C ++, a następnie przenieść na JavaScript.

Wracając do artykułu Resiga, są dwa kluczowe cytaty na twoje pytanie:

aplikacje, które w najbliższej przyszłości będą atakować Asm.js, to takie, które skorzystają z przenośności działania w przeglądarce, ale mają poziom złożoności, w którym bezpośredni port JavaScript byłby niemożliwy

i

Jak zapewne widać z powyższego kodu, plik Asm.js nie został zaprojektowany do ręcznego pisania. ... Najczęstszym przypadkiem użycia Asm.js jest w aplikacjach zgodnych z C / C ++ do JavaScript. Prawie żadna z tych aplikacji nie współdziała z DOM w znaczący sposób, poza wykorzystaniem WebGL i tym podobnych.

Zamiast tego powinieneś rozważyć skorzystanie z programu JavaScript, który wywołuje potrzebne interfejsy API JS oraz wykonywanie wywołań do C ++ skompilowanego do JavaScript. Obejrzyj ten samouczek emscripten, aby dowiedzieć się, jak wywołać kod C ++ z JavaScript.


W przypadku niektórych dodatkowych badań emscripten ma samouczek, który może pomóc w zrozumieniu, jak pobrać kod C ++, uruchomić go przez LLVM, a następnie celować w asm.js.

1 Ściśle mówiąc, to nieprawda. Kod C / C ++ nie jest świadomy tego, do czego zostanie skompilowany, więc nie mogę tak naprawdę nazwać asm.js celem. Inne narzędzie (emscripten) pobiera dane wyjściowe LLVM, a następnie tłumaczy je na JavaScript zgodny z asm.js. Ale zamierzam nazwać to celem, ponieważ łatwiej to zrozumieć.

TehShrike
źródło
ASM.js jest celem kompilacji dla C / C ++. Więc nie musisz pisać C ++ w asm.js, kompilując C ++ do asm.js
Calvin
Tylko jedna wzmianka przychodzi na myśl w przypadku aplikacji uruchamianych od zera. W przypadku gier kod w C ++ może być pomocny przy wdrażaniu na wielu platformach.
Vlad Nicula,
6

Tak, możesz napisać kod C ++ i skompilować go do asm.js, używając emscripten. Sam tego nie próbowałem i nie jestem pewien, jak jest gotowy na najwyższy czas. Wydaje się jednak, że jest wystarczająco dobry, aby uruchomić wiele gier.

Oto samouczek: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html . Patrząc na samouczek, kompilowanie kodu C ++ wydaje się dość łatwe:

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

int main() {
  printf("hello, world!\n");
  return 1;
}
$ ./emcc tests/hello.cpp -o hello.html
jdm
źródło
4
To właściwie kod C. Kompilator C ++ jest o około dwa lub trzy rzędy wielkości bardziej złożony. Na szczęście emscripten pozwala uniknąć tego trudnego problemu, kompilując LLVM, i istnieje już kompilator C ++ do LLVM.
MSalters
3
@MSalters: Jest to również poprawny kod C ++. Wyobraź sobie, że! Łał!
Thomas Eding,
@ThomasEding: Nie trafiłeś w sedno. Im mniejszy język musisz obsługiwać, tym łatwiej jest go skompilować. Przecięcie C i C ++ niekoniecznie jest większe niż jedno z tych dwóch.
MSalters
Załóżmy, że ten kod był czystym C ++, którego kompilator C nie obsługiwałby, czy użycie emccbyłoby poprawne?
Hamza Ouaghad,
@HamzaOuaghad - tak. prosty świat cześć z klasami cout i string c ++ działa dobrze z tym wierszem poleceń emcc. przy użyciu wersji 1.35.0.
orion elenzil
0

Najprostszym sposobem byłoby użycie WCPP , pakietu, który pozwala importować C ++ prawie bezpośrednio do projektu Node.

Nasz C ++

// addTwo.cpp 

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

W terminalu (aby skompilować nasz C ++)

$ wcpp

Nasz JavaScript

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

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

Aby uzyskać więcej informacji, zobacz Pakiet NPM lub Git Repo

Brandon Dyer
źródło