Как запустить код 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?

LO кака
источник
3
Поделиться своими исследованиями помогает всем. Расскажите нам, что вы пробовали и почему это не соответствует вашим потребностям. Это свидетельствует о том, что вы потратили время, чтобы попытаться помочь себе, избавляет нас от повторения очевидных ответов и, прежде всего, помогает получить более конкретный и актуальный ответ. Также см. Как спросить
Гнат
Эта третья сторона учебник , как представляется , решить некоторые из этих вопросов: devosoft.org/an-introduction-to-web-development-with-emscripten
nobar

Ответы:

36

Я считаю , что вы ошибаетесь в вашем понимании asm.js .

Во-первых, из их FAQ

В. Является ли asm.js новым языком?
О. Нет, это просто (подмножество) JavaScript.

А ты попросил уточнения добавил :

Но как можно написать одно [приложение asm.js] на C ++?

Вы не пишете «приложение asm.js», скорее, asm.js - это цель 1, для которой нужно скомпилировать код C ++.

Эта статья Джона Резига содержит ряд деталей, которые могут лучше объяснить, как будет использоваться asm.js.

Начиная с этого изображения:
C ++ => clang / LLVM => emscripten => JS engine

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

Вы также спросили:

И если я напишу код на C ++, то как использовать js API-ы

Опять же, вы как бы упускаете из виду. Asm.js позволяет портировать существующие приложения C / C ++ в JavaScript, чтобы их можно было запускать в браузере. Обычно вы не сможете использовать JS API в своем коде на C / C ++, и в asm.js нет ничего волшебного, чтобы это позволить.

Если у вас есть новое приложение для написания, которое нуждается в JS API, вы должны написать приложение на JS, а не пытаться писать на 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, а затем переводит его в совместимый с asm.js JavaScript. Но я собираюсь назвать это целью, потому что это легче понять.

TehShrike
источник
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
JDM
источник
4
Это на самом деле C-код. Компилятор C ++ примерно на два-три порядка сложнее. К счастью, emscripten позволяет избежать этой сложной проблемы, компилируя LLVM, и существует компилятор C ++ - to-LLVM.
MSalters
3
@MSalters: это также допустимый код C ++. Представь это! Вот Это Да!
Томас Эдинг
@ThomasEding: Вы упустили момент. Чем меньше поддерживаемый язык, тем легче его скомпилировать. Пересечение C и C ++ обязательно не больше, чем любой из этих двух.
MSalters
Давайте предположим, что этот код был чистым C ++, который компилятор C не смог бы обработать, будет ли использование emccдопустимым?
Хамза Уагад
@HamzaOuaghad - да. простой привет мир с классами cout и string c ++ прекрасно работает с этой командной строкой emcc. используя версию 1.35.0.
orion elenzil
0

Самый простой способ - использовать WCPP , пакет, который позволяет импортировать C ++ практически непосредственно в ваш проект Node.

Наш С ++

// 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.

Брэндон Дайер
источник