Як запустити код C ++ у браузері за допомогою asm.js?


21

Додаток asm.js дуже швидкий (поблизу нативної швидкості C ++):

введіть тут опис зображення

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

Але як можна записати його в C ++, перетворити його в код LLVM, а потім зробити якийсь трюк з emscripten / asm.js? Я не знайшов жодного підручника з цього приводу.

І якщо я записую код у C ++, то як використовувати js API-и, наприклад XMLHttpRequest, WebSockets, Canvas або WebGL?


3
Обмін дослідженнями допомагає всім. Розкажіть, що ви пробували і чому це не відповідало вашим потребам. Це свідчить про те, що ви знайшли час, щоб спробувати допомогти собі, це позбавляє нас від повторення очевидних відповідей, а найбільше це допомагає вам отримати більш конкретну та релевантну відповідь. Також дивіться Як запитувати
gnat

Цей третій підручник, як видається, вирішує деякі з цих питань: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

Відповіді:


36

Я вважаю , що ви помиляєтеся в вашому розумінні asm.js .

По-перше, з їх FAQ

Q. Чи є asm.js новою мовою?
А. Ні, це просто (підмножина) JavaScript.

І ви запитали пояснення, додані :

Але як можна написати один [додаток asm.js] в C ++

Ви не пишете "додаток asm.js", скоріше asm.js - це ціль 1, до якого слід скомпонувати свій C ++ код.

У цій статті Джона Резіга подано ряд деталей, які можуть краще пояснити, як використовувався asm.js.

Починаючи з цього зображення:
C ++ => clang / LLVM => emscripten => двигун JS

ви можете бачити, що asm.js - ціль перекладу emscripten . Emscripten обробляє переклад байт-коду LLVM в JavaScript, а asm.js - це підмножина JavaScript. Перебування в обмеженому наборі JavaScript на основі asm.js дозволяє оптимізувати код та працювати швидше.

Ви також запитували:

І якщо я записую код на C ++, то як використовувати js API-и

Знову-таки, ви начебто не вистачаєте суті. Asm.js дозволяє переносити існуючі програми C / C ++ в JavaScript, щоб вони могли працювати в браузері. Ви, як правило, не можете використовувати API JS у своєму C / C ++ коді, і немає нічого магічного в тому, що це дозволяє asm.js.

Якщо у вас є нова програма для написання, яка потребує API JS, тоді ви повинні писати програму в JS, а не futz, намагаючись писати на C ++, а потім портувати в JavaScript.

І повертаючись до статті Резіга, є два ключові цитати вашого питання:

вид програм, які найближчим часом націлять на Asm.js, - це ті, які отримають користь від портативності роботи в браузері, але мають рівень складності, при якому прямий порт на JavaScript був би нездійсненним

і

Як ви, мабуть, видно з коду вище, Asm.js не призначений для написання від руки. ... Найпоширеніший випадок використання Asm.js зараз - у програмах, сумісних з C / C ++ до JavaScript. Майже жодна з цих програм не взаємодіє з DOM змістовно, крім використання WebGL тощо.

Натомість ви можете подумати про те, щоб створити програму JavaScript, яка викликає API JS, які вам потрібні, а також здійснювати дзвінки на C ++, які ви компілювали в JavaScript. Перегляньте цей підручник для емскриптованих файлів, щоб побачити, як викликати код C ++ з JavaScript.


Для деяких додаткових досліджень emscripten має підручник, який може допомогти вам розпочати розуміння того, як приймати код C ++, запускати його через LLVM, а потім націлювати на asm.js.

1 Строго кажучи, це неправда. Код C / C ++ не знає, до чого він збирається збиратись, тому я не можу дійсно назвати asm.js цілью. Інший інструмент (emscripten) приймає вихід LLVM і переводить на JavaScript, сумісний з asm.js. Але я буду називати це мішенню, тому що це легше зрозуміти.


ASM.js - ціль компіляції для C / C ++. Отже, не пишіть C ++ у asm.js, коли ви компілюєте C ++ на asm.js
Calvin,

Лише одна згадка приходить на думку про програми, розпочаті з нуля. У випадку з іграми, наявність коду в C ++ може бути корисним для розгортання на декількох платформах.
Влад Нікула

6

Так, ви можете написати код C ++ і компілювати його до asm.js, використовуючи emscripten. Я сам цього не пробував, і не впевнений, наскільки це готово до прайм-тайму. Здається, це досить добре, щоб запустити купу ігор.

Ось підручник: http://kripken.github.io/emscripten-site/docs/getting_started/Tutorial.html . Дивлячись на підручник, скласти код C ++ здається досить просто:

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

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

4
Це власне код C. Компілятор C ++ є приблизно на два-три порядки складнішим. На щастя, emscripten уникає цієї важкої проблеми, компілюючи LLVM, і є існуючий компілятор C ++ - LLVM.
MSalters

3
@MSalters: Це також дійсний код C ++. Уяви це! Оце Так!
Томас Едінг

@ThomasEding: Ви пропустили бал. Чим менше ви маєте підтримувати мову, тим простіше її скласти. Перетин С і С ++ обов'язково не більший, ніж будь-який із цих двох.
MSalters

Припустимо, що цей код був чистим C ++, що компілятор C не обробляв би, чи буде використання emccдійсним?
Гамза Уагад

@HamzaOuaghad - так. простий світ привіт з класами cout + string c ++ працює чудово за допомогою цього командного рядка emcc. використовуючи версію 1.35.0.
orion elenzil

0

Найпростішим способом було б використовувати WCPP , пакет, який дозволяє імпортувати C ++ майже безпосередньо у проект Node.

Наш C ++

// addTwo.cpp 

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

У терміналі (для компіляції наших C ++)

$ wcpp

Наш JavaScript

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

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

Для отримання додаткової інформації дивіться пакет NPM або Git Repo

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.