Unity에서 JavaScript Plugin 만들기 #1.5 - 심화항목

FGPRJS·2022년 5월 16일
0

Unity JavaScript Plugin

목록 보기
2/4

Unity가 JavaScript의 WebSocket기능을 활용하게 하기 위해서는 Callback등의 사용이 필수적이다.

기본적으로 참고할 문서는 다음과 같기는 한데, 이 문서 자체에는 별 내용이 없다.
추가적인 사항은 Emscripten을 참조하라고 기재되어 있다.
Emscripten에서 제공하는 Javascript와의 Interaction

그런데, 이 항목들에 대한 난이도가 굉장히 높다고 판단되어 이 기술에 대한 이해가 선행되어야 할 것 같아 이 문서를 기재한다.


wasm과 LLVM과 Enscripten

네이버 개발자 문서를 참조하여 정의를 살펴본다.


wasm (Web Assembly)

웹어셈블리(WebAssembly, 간단히 Wasm)는 실행 프로그램 및 그와 일치하는 텍스트 어셈블리어, 그리고 이러한 프로그램과 호스트 환경 간 통신을 용이케하는 인터페이스를 위한 이식 가능한 이진 코드 포맷을 정의하는 개방형 표준이다. 웹어셈블리의 주 목적은 웹 페이지에서 고성능의 애플리케이션을 가능케 하는 것이지만 포맷은 다른 환경에서도 실행 및 연동되도록 설계되어 있다.

키워드는 다음과 같다.

  • 이식 가능한 이진 코드(Binary Code) 포맷을 정의하는 개방형 표준
  • JavaScript에서 더 나아가 웹페이지에서 고성능의 애플리케이션을 가능케 하는 것

최초 시연을 Unity애플리케이션을 웹 브라우저 엔진을 사용해 구동하는 것으로 하였으므로, Unity와의 인연이 있다고 볼 수 있다.

  • 실제로 Unity를 Webgl 사양으로 빌드하면 wasm파일이 나온다. gzip 압축때문에 gz 확장자가 뒤에 더 붙었지만, wasm파일이다.

wasm은 어셈블리라는 이름이 붙을 정도 수준, 바이트 단위도 아닌 바이너리 단위의 저급 언어인 만큼 웹은 이제 고급언어 JavaScript와 같이 고급/저급 언어를 동시에 사용할 수 있는 강력한 환경이 되었다고 기재되어 있다.

물론, wasm은 어셈블리 언어와는 다르다. 특정한 장치를 위해 만들어진 언어가 아니기 때문. 결국 브라우저 위에서 돌아가야 하는 언어이기 때문에 어떤 CPU (x64? arm?)의 사양에 대응되게 하는 그런 기능을 갖고 있지는 않다.

wasm은 LLVM(컴파일러 기반 구조) 지원 언어가 모두 웹에서 사용될 수 있게 컴파일되는 Polyglot이라 할 수 있다.

네이버 개발자 문서에서 언급한 출처에서 제공하는 wasm의 설명은 다음과 같다.

  • 네이티브 코드(C, C++ 등)를 웹에서 실행 할 수 있게 바꿔준다.

  • JavaScript도, wasm도 최종적으로는 Web Browser Engine에서 이해할 수 있는 어떠한 Executable code로 번역되어 엔진에서 구동된다.
    • JavaScript의 경우, Script언어 답게 JIT 컴파일러를 통하여 런타임중에 컴파일이 이루어진다.
    • wasm은 JIT 컴파일러를 통할수도 있지만, 기본적으로 기계어에 가까워 굉장히 빠르게 수행될 수 있다.

LLVM

LLVM(이전 이름: Low Level Virtual Machine)은 컴파일러의 기반구조이다. 프로그램을 컴파일 타임, 링크 타임, 런타임 상황에서 프로그램의 작성 언어에 상관없이 최적화를 쉽게 구현할 수 있도록 구성되어 있다.

LLVM으로 언어에 가상 기계를 생성, 가상 기계가 언어에 독립적인 최적화를 실행한다. LLVM은 언어와 구조로부터 독립적이며, 언어 모듈과 시스템을 위한 코드 생성 부의 사이에 위치한다. LLVM은 컴파일 과정 동안 최적화와 함께 JIT을 정적 컴파일러로 사용, 개발의 각종 단계에서 사용할 수 있는 많은 부분을 가지고 있다.
LLVM은 전통적인 GCC 시스템에서 그랬듯이 코드를 정적으로 컴파일할 수도 있고, Java처럼 JIT를 이용하여 기계어(machine code)로 한 번 더 컴파일되는 중간 형식으로 코드를 컴파일할 수도 있다. 이말은 자바처럼 플랫폼에 독립적이란 뜻은 아니다.

LLVM은 프론트엔드 -> 백엔드의 단계를 거쳐 컴파일을 진행하게 된다.

Emscripten

Emscripten은 LLVM 컴파일러에 대한 백엔드로서 실행되는 소스 대 소스 컴파일러로서, Asm.js라는 이름의 자바스크립트 하위 집합을 생성한다. 웹어셈블리도 생성이 가능하다. 이를 통해 표준 실행 파일로서 실행되도록 설계된 애플리케이션과 라이브러리들이 클라이언트 사이드 웹 애플리케이션과 연동될 수 있게 해준다.

해당 사이트에서는 LLVM을 기반으로 C,C++로 짜여진 코드를 JavaScript로 바꿔주는 프로젝트라 설명하고 있다.

profile
FGPRJS

0개의 댓글