rust에서 WebAssembly로 컴파일

소개



평소 일에서는 WEB 주위의 개발을 하고 있으므로, 「rust로 쓴 코드를 컴파일→WebAssembly」를 시험해 보고 싶습니다.

Emscripten없이 Rust 단독으로 wasm으로 컴파일 할 수 있습니다.
wasm32-unknown-unknown landed & enabled

환경


  • ArchLinux(Kernel 4.12.4-1)
  • Intel(R) Core(TM) i7-4790T CPU @ 2.70GHz
  • Memory 16GB
  • Vivaldi 1.11.917.39

  • 설치



    rustc를 공식 패키지에서 설치했는데 "wasm32-unknown-emscripten"을 타겟으로 지정하고,
    컴파일해야하기 때문에 rustup을 설치했습니다.
    (아마도, 충돌하고 있는 취지의 메세지가 나올까 생각합니다만, 그대로 덮어쓰는 형태로 인스톨을 진행합니다)

    rust를 WebAssembly로 컴파일 할 때 emscripten을 사용하여 WebAssembly로 컴파일하기 때문에 emscripten도 설치합니다 (cargo로 빌드 할 때 emcc 사용).
    또한 컴파일 과정에서 cmake를 사용하므로 동시에 cmake도 설치합니다.
    $ yaourt -S rustup
    $ yaourt -S emscripten
    $ yaourt -S cmake
    

    emscripten이란?



    emscripten은 C/C++ 코드에서 JavaScript를 출력하는 컴파일러입니다.
    매우 거칠게 말하면, 「C/C++로부터 LLVM-IR(중간 언어)를 생성해, 그것들을 JavaScript로 변환」, 라고 하는 흐름이 됩니다.

    환경설정



    설치한 rustup를 사용하여 대상을 추가합니다.
    또한 WebAssembly에 대한 프로젝트를 만듭니다.
    $ rustup target add wasm32-unknown-emscripten
    $ rustup target list
    
    aarch64-apple-ios
    aarch64-linux-android
    aarch64-unknown-fuchsia
    aarch64-unknown-linux-gnu
    arm-linux-androideabi
    arm-unknown-linux-gnueabi
    arm-unknown-linux-gnueabihf
    arm-unknown-linux-musleabi
    arm-unknown-linux-musleabihf
    armv7-apple-ios
    armv7-linux-androideabi
    armv7-unknown-linux-gnueabihf
    armv7-unknown-linux-musleabihf
    armv7s-apple-ios
    asmjs-unknown-emscripten
    i386-apple-ios
    i586-pc-windows-msvc
    i586-unknown-linux-gnu
    i686-apple-darwin
    i686-linux-android
    i686-pc-windows-gnu
    i686-pc-windows-msvc
    i686-unknown-freebsd
    i686-unknown-linux-gnu
    i686-unknown-linux-musl
    mips-unknown-linux-gnu
    mips-unknown-linux-musl
    mips64-unknown-linux-gnuabi64
    mips64el-unknown-linux-gnuabi64
    mipsel-unknown-linux-gnu
    mipsel-unknown-linux-musl
    powerpc-unknown-linux-gnu
    powerpc64-unknown-linux-gnu
    powerpc64le-unknown-linux-gnu
    s390x-unknown-linux-gnu
    sparc64-unknown-linux-gnu
    wasm32-unknown-emscripten (installed) ※ wasm32-unknown-emscriptenがインストールされている
    x86_64-apple-darwin
    x86_64-apple-ios
    x86_64-linux-android
    x86_64-pc-windows-gnu
    x86_64-pc-windows-msvc
    x86_64-rumprun-netbsd
    x86_64-unknown-freebsd
    x86_64-unknown-fuchsia
    x86_64-unknown-linux-gnu (default)
    x86_64-unknown-linux-musl
    x86_64-unknown-netbsd
    
    $ cargo new --bin web_assembly
        Created binary (application) `web_assembly` project
    

    빌드 해 보자



    실제로 방금 만든 프로젝트를 빌드해 보겠습니다.
    $ cargo build --target wasm32-unknown-emscripten
    error: could not exec the linker `emcc`: No such file or directory (os error 2)
    

    emcc가 존재하지 않는다는 오류가 출력되었습니다.
    방금 전, emscripten은 설치했기 때문에, 「PATH가 다니지 않는 것이 아닌가?」라고 하는 것으로 실제로 어느 디렉토리에 인스톨 되고 있는지 조사해 보겠습니다.
    $ pacman -Ql emscripten | grep emcc
    (標準入力):88:emscripten /usr/lib/emscripten/emcc
    

    /usr/lib/emscripten은 PATH 환경 변수에 포함되어 있지 않으므로 PATH를 지정하여 빌드해 보겠습니다.
    (본래는 .zshrc 등에 PATH 추가하면 좋을까 생각합니다)
    $ PATH=$PATH:/usr/lib/emscripten cargo build --target wasm32-unknown-emscripten
       Compiling web_assembly v0.1.0 
        Finished dev [unoptimized + debuginfo] target(s) in 1.73 secs
    

    빌드가 완료되었습니다.
    WebAssembly 본문은 "target/wasm32-unknown-emscripten/debug/deps/xxxx.wasm"입니다(xxxx는 선택 사항).

    WebAssembly를 사용해보기



    빌드가 완료된 WebAssembly 파일을 사용해 봅니다.
    이 기사 를 참고해 WebAssembly의 동작 확인을 실시했습니다(유익한 기사가 있어, 고맙습니다!).



    확실히 개발자 툴의 Console에, 「Hello, World!」가 출력되고 있습니다.

    요약



    위의 단계에서 rust에서 WebAssembly로 컴파일 할 수있었습니다.
    처음에는 cmake를 설치하는 것을 잊지 않았기 때문에 빌드 오류가 발생했습니다.
    제대로 매뉴얼을 읽자! ! !

    다음번은 WebAssembly로 하는 것으로 퍼포먼스가 향상한다고 말해지고 있습니다만, 실제로 「얼마나 퍼포먼스가 오르는 것인가?」, 등을 검증하고 싶습니다.

    참고


  • Emscripten WikiPedia
  • Emscripten github
  • Emscripten Manual
  • ArchLinux Manual
  • Rust로 웹 프런트 엔드 개발
  • LLVM
  • 좋은 웹페이지 즐겨찾기