D언어로 Emscripten하고 싶은 이야기

4773 단어 EmscriptenLLVMdlang
Emscripten 은 C/C++를 JavaScript로 컴파일하고,
웹 브라우저에서 실행할 수 있는 개발 환경 및 플랫폼입니다.

변환 과정은 다음과 같다.

C/C++ →(clang)→ LLVM-IR →(Emscripten)→ JavaScript

Clang LLVM의 백엔드로 JavaScript를 사용하고 있다는 것입니다.

D언어er적으로는, D에도 LDC라고 하는 LLVM계의 컴파일러가 있으므로,
D 프로그램도 JavaScript로 컴파일 할 수있는 것은! ? 그리고 꿈이 퍼집니다.

3년 전



Emscripten과 LDC를 사용하면 D 언어 SDL 게임이 브라우저에서 실행될 수 있습니다 - ABA의 일지
h tp // 아바. 하테나 bぉg. 코m/엔트리/20130331/p1

↑는 LDC에 -output-ll 옵션을 붙여 LLVM-IR을 출력, emcc로 링크라고 하는 방법이었습니다.
지금 환경에서 시험하면 emcc 연결에 실패. LLVM 버전 차이로 인해?

올해



Emscripten 호환 ldc2를 사용하는 본격적인 시도가있었습니다.

RUNNING A D GAME IN THE BROWSER
htp : // 여기. 오, 이런. 오 rg/wp/? p=103

dscripten
htps : // 기주 b. 코 m / 아세 17 / dsc 리 p

그런데, Github의 설명에 있는 ./fetch_toolchain 를 두드려도 왠지 실패…
이하, 여러가지 시행착오한 결과가 됩니다.

Emscripten 지원 ldc2 만들기



fetch_toolchain을 참조하면서 환경을 만듭니다.
이번에는 Mac을 사용했습니다.

Windows에서도 MinGW나 cygwin을 사용하면 할 수 있을지도 모릅니다만,
지금까지 수라의 길인 느낌입니다.

※또한, 미리 JavaSE를 인스톨 해 둘 필요가 있습니다.

toolchains 디렉토리 준비



llvm의 prefix 경로에 대한 도구 체인 디렉토리를 만듭니다.
mkdir -p $HOME/toolchains/llvm-js

Emscripten SDK 얻기


git clone --depth=1 -b master --single-branch https://github.com/kripken/emscripten.git $HOME/toolchains/emscripten

emscripten-llvm 빌드



작업 디렉토리에서 emscripten의 llvm과 clang을 가져옵니다.
git clone --depth=1 -b master --single-branch https://github.com/kripken/emscripten-fastcomp.git emscripten-llvm

git clone --depth=1 -b master --single-branch https://github.com/kripken/emscripten-fastcomp-clang.git emscripten-llvm/tools/clang

emscripten-llvm을 빌드.
mkdir -p bin/emscripten-llvm
cd bin/emscripten-llvm

../../emscripten-llvm/configure --enable-targets=host,js --disable-timestamps --disable-jit --enable-optimized --disable-assertions --enable-bindings=none --disable-docs --prefix=$HOME/toolchains/llvm-js

# 2プロセスでビルド(メモリを大量に食うので控えめに)
make -j2
# ビルド結果をインストール
make install

ldc2 빌드



작업 디렉토리로 이동하여 ldc를 가져옵니다.
git clone --recursive https://github.com/ldc-developers/ldc.git ldc
git checkout '9566fc58c800aad27b13f2c8d1f4a63b299e0e3e'

dscripten을 얻고 패치합니다.
git clone --recursive https://github.com/Ace17/dscripten.git dscripten
patch -d ldc -p1 -i (作業dir)/dscripten/ldc.patch

ldc2 빌드
mkdir -p bin/ldc
cd bin/ldc

cmake -G "Unix Makefiles" -D "CMAKE_INSTALL_PREFIX=$HOME/toolchains/llvm-js" -D "LLVM_CONFIG=$HOME/toolchains/llvm-js/bin/llvm-config" ../../ldc

# 2プロセスでビルド(メモリを大量に食うので控えめに)
make -j2
# ビルド結果をインストール
make install

데모를 빌드해보세요


export PATH=$HOME/toolchains/llvm-js/bin:$PATH
export PATH=$HOME/toolchains/emscripten:$PATH
EMMAKEN_JUST_CONFIGURE=1 PATH=$HOME/toolchains/llvm-js/bin:$PATH $HOME/toolchains/emscripten/emcc

cd dscripten
./build_asmjs

동작 확인을 위해 HTTP 서버를 설정
ruby -run -e httpd ./dscripten -p 8000

브라우저에서 localhost를 통해 열기



무언가 무작위 피하는 게임이었습니다.

현시점에서 사용할 수 있는 것은 D언어의 서브 세트



D언어에는 그 언어 사양을 실현하는데 상당히 거대한 DRuntime이 필요합니다만,
아직 이 Emscripten 환경에서 서비스되지 않았습니다.

dscripten의/rt 이하에 일단 그들 문장이 있습니다만…,
아직 필요 최소한이라고 하는 느낌입니다. 향후 확충에 기대하네요.

그래서 현시점에서는, RUNNING A D GAME IN THE BROWSER 에도 쓰고 있습니다만,
동적 배열, 연관 배열, 클래스, new 연산자, 런타임 형식 정보, 예외를 사용할 수 없습니다.
thread 관련은 Shared Array Buffer 대기합니다.

런타임 피쳐 레벨은 C 언어에 해당합니다.
그러나 컴파일 타임의 강력한 D2 사양은 그대로 사용할 수 있습니다.

또한 라이브러리는 Phobos는 사용할 수 없지만 SDL은 사용할 수있는 것 같습니다.
열심히하면 OpenGL도 사용할 수 있습니까? 조금 불편하지만 게임은 만들 수 있을 것 같다.

여담



어제 emscripten night!! #2 라는 Emscripten의 공부회가 열려 있었다고 합니다.

우연히는 참가하지 않았습니다만, 좀처럼 진한 이야기가 타임 라인을 흐르고 있었습니다.

좋은 웹페이지 즐겨찾기