asm.js를 사용하여 브라우저에서 C ++ 코드를 실행하는 방법은 무엇입니까?


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는 새로운 언어입니까?
A. 아니요. 단지 JavaScript의 일부입니다.

그리고 당신은 설명을 추가 물었다 :

그러나 C ++로 하나의 [asm.js 애플리케이션]을 작성하는 것이 어떻게 가능합니까

"asm.js 애플리케이션"을 작성하지 않고 asm.js는 C ++ 코드를 컴파일하기 위한 대상 1 입니다.

John Resig 의이 기사 는 asm.js가 어떻게 사용되는지 더 잘 설명 할 수있는 많은 세부 사항을 제공합니다.

이 이미지로 시작 :
C ++ => clang / LLVM => emscripten => JS 엔진

asm.js가 emscripten의 번역 대상임을 알 수 있습니다. Emscripten은 LLVM 바이트 코드를 JavaScript로 변환하는 작업을 처리 하며 asm.js는 JavaScript의 하위 집합입니다. asm.js의 제한된 JavaScript 하위 세트 내에 머무르면 코드를 최적화하고 더 빠르게 실행할 수 있습니다.

당신은 또한 물었다 :

그리고 C ++로 코드를 작성하면 js API를 사용하는 방법

다시 말하지만, 당신은 요점을 놓치고 있습니다. Asm.js를 사용하면 기존 C / C ++ 응용 프로그램을 JavaScript로 이식하여 브라우저 내에서 실행할 수 있습니다. 일반적으로 C / C ++ 코드 내에서 JS API를 사용할 수 없으며이를 허용하는 asm.js에 대한 마법은 없습니다.

JS API가 필요한 새 애플리케이션을 작성하는 경우 JS로 애플리케이션을 작성하고 C ++로 작성하고 JavaScript로 포팅하려고 시도하면 안됩니다.

그리고 Resig의 기사로 돌아가서 질문에 대한 두 가지 핵심 인용문이 있습니다.

가까운 장래에 Asm.js를 대상으로 할 응용 프로그램의 종류는 브라우저에서 실행하는 이식성의 이점은 있지만 JavaScript 로의 직접 포트를 실행할 수없는 수준의 복잡성을 갖는 응용 프로그램입니다.

위의 코드에서 볼 수 있듯이 Asm.js는 직접 작성하도록 설계되지 않았습니다. ... Asm.js의 가장 일반적인 사용 사례는 C / C ++에서 JavaScript로 호환되는 응용 프로그램입니다. 이러한 응용 프로그램은 WebGL 등을 사용하는 것 외에 의미있는 방식으로 DOM과 상호 작용하지 않습니다.

대신 고려해야 할 것은 필요한 JS API를 호출하는 JavaScript 프로그램과 함께 JavaScript로 컴파일 한 C ++를 호출하는 것입니다. 한 번 봐 가지고 이 emscripten 튜토리얼 자바 스크립트에서 C ++ 코드를 호출하는 방법을 볼 수 있습니다.


추가 연구를 위해 emscripten에는 C ++ 코드를 가져오고 LLVM을 통해 코드를 실행 한 다음 asm.js를 대상으로하는 방법을 이해하는 데 도움 이되는 자습서 가 있습니다.

1 엄밀히 말하면, 사실이 아닙니다. C / C ++ 코드는 컴파일 될 내용을 인식하지 못하므로 실제로 asm.js를 대상으로 호출 할 수 없습니다. 다른 도구 (emscripten)는 LLVM 출력을 가져와 asm.js 호환 JavaScript로 변환합니다. 하지만 이해하기 쉽기 때문에 대상이라고하겠습니다.


ASM.js는 C / C ++의 컴파일 대상입니다. 따라서 asm.js에서 C ++를 작성하지 않는 것은 컴파일 C ++를 asm.js로
Calvin

처음부터 시작된 응용 프로그램에 대해서는 한 가지 언급 만 명심하십시오. 게임의 경우 C ++로 코드를 작성하면 여러 플랫폼에 배포하는 데 도움이 될 수 있습니다.
블라드 니 쿨라

6

예, emscripten을 사용하여 C ++ 코드를 작성하고 asm.js로 컴파일 할 수 있습니다. 나는 그것을 직접 시도하지 않았으며, 이것이 프라임 타임에 얼마나 준비되어 있는지 확실하지 않습니다. 그래도 많은 게임을 실행하기에 충분할 것 같습니다.

여기 튜토리얼입니다 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 ++ 컴파일러는 약 2-3 배 정도 더 복잡합니다. 운 좋게도 emscripten은 LLVM을 컴파일하여 이러한 어려운 문제를 피할 수 있으며 기존 C ++-to-LLVM 컴파일러가 있습니다.
MSalters 2016 년

3
@MSalters : 또한 유효한 C ++ 코드입니다. 상상 해봐! 와우!
Thomas Eding

@ThomasEding : 요점을 놓쳤다. 지원해야하는 언어가 작을수록 해당 언어를 쉽게 컴파일 할 수 있습니다. C와 C ++의 교차점은 반드시이 둘 중 어느 것보다 클 필요는 없습니다.
MSalters

이 코드가 순수한 C ++이고 C 컴파일러가 처리하지 않을 것이라고 가정 해 봅시다 emcc.
Hamza Ouaghad

@HamzaOuaghad-그렇습니다. c ++의 cout & string 클래스가있는 간단한 hello world는이 emcc 명령 줄에서 잘 작동합니다. 버전 1.35.0 사용.
오리온 엘렌 질

0

가장 쉬운 방법은 C ++를 거의 직접 Node 프로젝트로 가져올 수있는 패키지 인 WCPP 를 사용하는 것 입니다.

우리의 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를 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.