C/C++์—์„œ WebAssembly๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์ธ Emscripten 3.0์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Emscripten 3.0 ์ปดํŒŒ์ผ๋Ÿฌ ๋ฆด๋ฆฌ์Šค๊ฐ€ ์ถœ์‹œ๋˜์–ด C/C++ ๋ฐ LLVM ๊ธฐ๋ฐ˜ ํ”„๋ŸฐํŠธ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ์–ธ์–ด์˜ ์ฝ”๋“œ๋ฅผ ๋ฒ”์šฉ ํ•˜์œ„ ์ˆ˜์ค€ ์ค‘๊ฐ„ ์ฝ”๋“œ WebAssembly๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ JavaScript ํ”„๋กœ์ ํŠธ์™€์˜ ํ›„์† ํ†ตํ•ฉ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ Node.js์—์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ wasm ๋Ÿฐํƒ€์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋˜๋Š” ๋…๋ฆฝํ˜• ๋‹ค์ค‘ ํ”Œ๋žซํผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” LLVM ํ”„๋กœ์ ํŠธ์˜ ๊ฐœ๋ฐœ์„ ์‚ฌ์šฉํ•˜๊ณ  Binaryen ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” WebAssembly ์ƒ์„ฑ ๋ฐ ์ตœ์ ํ™”์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Emscripten ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š” ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๊ด€๊ณ„์—†์ด ์›น์—์„œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ‘œ์ค€ C ๋ฐ C++ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(libc, libcxx), C++ ํ™•์žฅ, pthread ๊ธฐ๋ฐ˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ, POSIX API ๋ฐ ๋‹ค์–‘ํ•œ ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Web API์™€ JavaScript ์ฝ”๋“œ์™€์˜ ํ†ตํ•ฉ์„ ์œ„ํ•œ API๋Š” ๋ณ„๋„๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

Emscripten์€ Canvas๋ฅผ ํ†ตํ•ด SDL2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ถœ๋ ฅ ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…์„ ์ง€์›ํ•˜๊ณ  WebGL์„ ํ†ตํ•ด OpenGL ๋ฐ EGL๋„ ์ง€์›ํ•˜๋ฏ€๋กœ ๊ทธ๋ž˜ํ”ฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฒŒ์ž„์„ WebAssembly๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด Qt ํˆดํ‚ท ํฌํŠธ๊ฐ€ ์žˆ๊ณ  Unreal Engine์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค) 4 ๋ฐ ์œ ๋‹› ๊ฒŒ์ž„ ์—”์ง„, ๋ฌผ๋ฆฌ์  Bullet ์—”์ง„). C/C++๋กœ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ Lua, C#, Python, Ruby ๋ฐ Perl ์–ธ์–ด์šฉ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฐ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ณ„๋„๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Swift, Rust, D ๋ฐ Fortran๊ณผ ๊ฐ™์€ ์–ธ์–ด์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋น„ Clang ํ”„๋ŸฐํŠธ์—”๋“œ๋ฅผ LLVM์— ์ ์šฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Emscripten 3.0์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • emscripten์— ์‚ฌ์šฉ๋œ musl C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฒ„์ „ 1.2.2๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๋ฒ„์ „ 2๋Š” Emscripten 1.1.15.x ๋ถ„๊ธฐ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค).
  • ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ํ•จ์ˆ˜ ์ค‘ ์ผ๋ถ€๊ฐ€ parseTools.js ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: RemovePointing, PointingLevels, RemoveAllPointing, isVoidType, isStructPointerType, isArrayType, isStructType, isVectorType, isStructuralType getStructuralTypeParts, getStructuralTypePartBits, isFunctionDef, isPossilyFunctionType, isFunctionType, getReturnType, SplitTo kenList, _IntToHex, IEEEUnHex, Compiletime.isPointerType, Compiletime.isStructType, Compiletime.INT_TYPES, isType.
  • shell.html ๋ฐ shell_minimal.html ํ…œํ”Œ๋ฆฟ์—์„œ emscripten ์ž‘์—… ์ค‘์— ๋ฐœ์ƒํ•˜๊ณ  stderr๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ถœ๋ ฅ๋˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์ถœ๋ ฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ console.error ๋Œ€์‹  console.warn์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ์ด๋ฆ„์— ์‚ฌ์šฉ๋˜๋Š” ํŠน์ • ํ…์ŠคํŠธ ์ธ์ฝ”๋”ฉ์„ ์ง€์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์„ ์ „๋‹ฌํ•  ๋•Œ ์ ‘๋ฏธ์‚ฌ ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: "a.rsp.utf-8" ๋˜๋Š” "a.rsp.cp1251").

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€