Rust: emscripten์œผ๋กœ Rust๋ฅผ ์ž‘๋™์‹œํ‚ค์‹ญ์‹œ์˜ค.

์— ๋งŒ๋“  2012๋…„ 04์›” 18์ผ  ยท  30์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

๋‚˜๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํŒŒํ—ค์น˜๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๊ณ  ์ด์ œ rustc๋Š” emscripten์ด ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋Ÿฐํƒ€์ž„ ๊ธฐ๋Šฅ์— ๋„๋‹ฌํ•˜๋ฉด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” emcc ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ๋นŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. EMSCRIPTEN ifdef ๋’ค์— ๊ตฌ์ถ•๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

Emscripten์€ ์ธ๋ผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ emscripten์œผ๋กœ ๋นŒ๋“œํ•˜์ง€ ์•Š๋Š” ๋Ÿฐํƒ€์ž„์˜ ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ธ๋ผ์ธ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋Ÿฐํƒ€์ž„ ๋‹จํŽธ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๊ณ  C++์—์„œ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์„ ์ „ํ˜€ ๊ท€์ฐฎ๊ฒŒ ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

A-runtime E-hard

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

1.0์„ ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๋Œ€์ ์ธ ๋ถ„๋ฅ˜ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ์ผ๋ถ€๋กœ, RFC ์ €์žฅ์†Œ๋กœ ์œ„์‹œ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์˜ฎ๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ณณ์—์„œ ์ฃผ์š” ์ƒˆ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋…ผ์˜/์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” RFC ์ €์žฅ์†Œ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค: rust-lang/rfcs#604

๋ชจ๋“  30 ๋Œ“๊ธ€

#3608๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์—ฌ์ „ํžˆ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์„ฑ์ˆ™ ์ด์ •ํ‘œ์—๋„ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์ข‹๊ฒ ์ง€๋งŒ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๋Ÿฐํƒ€์ž„์ด ๋…น์œผ๋กœ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ๋” ์‰ฌ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ๋Ÿฐํƒ€์ž„์ด Rust๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ ์ด ๋ฒ„๊ทธ์— ๋Œ€ํ•œ ์ „๋ง์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋‚˜์š”? emscripten์„ ํ†ตํ•ด ์‹คํ–‰๋˜๋Š” ๋Ÿฐํƒ€์ž„ ์—†๋Š” Hello World๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šธ๊นŒ์š”?

์ง€๊ธˆ emscripten์— ๋Œ€ํ•œ ์ •๋ง ๋ฉ‹์ง„ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ํŠน๋ณ„ํžˆ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ด๋ฏธ Rust-core์™€ ๊ฑฐ์˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ ์ ˆํ•œ ๋Œ€์ƒ ํŠธ๋ฆฌํ”Œ์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ๋Œ€์ƒ ์†์„ฑ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•œ ๋‹ค์Œ ํ˜„์žฌ js, ์Šค๋ ˆ๋”ฉ ๋ฐ ์ปจํ…์ŠคํŠธ ์ „ํ™˜์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋Ÿฐํƒ€์ž„์˜ ์ผ๋ถ€ ๋ถ€๋ถ„์„ ์ฐจ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1:1 ์ผ์ • ๋ชจ๋“œ๊ฐ€ ์ข€ ๋” ์„ฑ์ˆ™ํ•ด์ง€๋ฉด ์›น ์ž‘์—…์ž๋ฅผ ํ†ตํ•ด ์ž‘์—…์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๋ณ‘๋ ฌ ์ง€์›์ด js/emscripten์— ์ถ”๊ฐ€๋˜๋Š”์ง€์— ๋”ฐ๋ผ ์šฐ๋ฆฌ๋Š” ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๋Š” rust์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒฐ๊ตญ ์ง€์›ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@brson :

-Z no-landing-pads ๋•๋ถ„์— ์ด์ œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ์ด์— ๋Œ€ํ•œ ๋ช…์‹œ์  ์ง€์›์„ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ์–ด์จŒ๋“ (ํŒŒ์ผ, tcp, udp ๋“ฑ) ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋…๋ฆฝ ์ง€์›์„ ์„ ํƒํ•˜๋ฉด ์ž‘๋™์„ ์‹œ์ž‘ํ•˜๊ณ  JavaScript์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์œผ์‹œ๋‹ค๋ฉด ์ง€๊ธˆ์€ ์ด ๋ถ€๋ถ„์„ ์—ด์–ด๋‘๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์—ฌ๋Ÿฌ ํ”Œ๋žซํผ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ข‹์€ ๋‹จ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉฐ emscripten๋ณ„ I/O๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด libemscripten ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฐœ๋œ ๋ฌธ์ œ(์—ฌ์ „ํžˆ ํฅ๋ฏธ๋กœ์šด ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค!)

@alexcrichton :

์ƒํƒœ ์—…๋ฐ์ดํŠธ:

@alexcrichton ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ข…์†์„ฑ์„ ๊ฐ€์ง„ ์ž‘์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฌถ์Œ์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ฝ”์–ด, alloc, rand ๋ฐ ์ปฌ๋ ‰์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์›น์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • asm.js๋กœ ํฌ๋กœ์Šค ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด codegen์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด Rust ๋ฐ LLVM ๋„๊ตฌ ์ฒด์ธ์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ์‹คํ—˜์„ ํ•˜์‹ญ์‹œ์˜ค.
  • emscripten์œผ๋กœ libcore๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋นŒ๋“œํ•˜๊ณ  ์›น์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ์ฆ๋ช…ํ•˜์‹ญ์‹œ์˜ค.
  • emscripten ํŠน์ • ๋Œ€์ƒ ํŠธ๋ฆฌํ”Œ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด rustc ๋ฐ mk/platform.mk๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  libcore.rlib๋งŒ ํฌํ•จํ•˜๋Š” ํฌ๋กœ์Šค ์ปดํŒŒ์ผ ๋„๊ตฌ ์ฒด์ธ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • liballoc์ด ์‹œ์Šคํ…œ(์ด ๊ฒฝ์šฐ emscripten ์ œ๊ณต) malloc๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ—ˆ์šฉํ•œ ๋‹ค์Œ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„ ํ”„๋ฆฌ ํฌ๋ ˆ์ดํŠธ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•˜์—ฌ liballoc์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๊ฝค ์ข‹์€ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค!

์ข‹์•„, ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ ์‹œ๋„ํ–ˆ๊ณ  ๋ถ„๋ช…ํžˆ ๋ฐ•์ฅ์—์„œ ๋ฐ”๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

libcore ๋ฅผ --emit bc libcore ๋กœ ๋น„ํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ–ˆ๊ณ  emcc -O0 ๋กœ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

/Users/arcnor/emscripten-fastcomp/build/bin/llvm-nm: /tmp/tmpfTkmfj/core_0.o: Invalid CMPXCHG record.
/Users/arcnor/emscripten-fastcomp/build/bin/opt: /tmp/tmpfTkmfj/core.bc: error: Invalid CMPXCHG record
Traceback (most recent call last):
  File "/Users/arcnor/emscripten/emcc", line 1573, in <module>
    shared.Building.llvm_opt(final, link_opts)
  File "/Users/arcnor/emscripten/tools/shared.py", line 1335, in llvm_opt
    assert os.path.exists(target), 'Failed to run llvm optimizations: ' + output
AssertionError: Failed to run llvm optimizations:

์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด rustc --emit ์ถœ๋ ฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‹ฌ ์ˆ˜ ์žˆ๋Š” ๊ณณ์ด ์•„๋‹ˆ๋ผ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค...

๋˜ํ•œ ๋” ๊ฐ„๋‹จํ•œ libnum ์‹œ๋„ํ–ˆ๋Š”๋ฐ bc ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ƒ์„ฑ๋˜์ง€๋งŒ emcc ํ”„๋กœ์„ธ์Šค ์ค‘์— ์ž˜๋ชป๋œ ํŠธ๋ฆฌํ”Œ์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ฒฐ๊ณผ . js์—๋Š” libnum ๋‚ด๋ถ€์— ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ ๋„ˆ๋ฌด ์ˆœ์ง„ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :)

@Arcnor ์ด์ „์— emscripten์œผ๋กœ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ปดํŒŒ์ผํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

  • LLVM ๋น„ํŠธ์ฝ”๋“œ๋Š” ๋ฒ„์ „๋งˆ๋‹ค ๋ณ€๊ฒฝ๋˜๋ฉฐ Rust๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „์€ ํ•ญ์ƒ emscripten๊ณผ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„๊ต์  ์œ ์‚ฌํ•œ ๋ฒ„์ „์˜ LLVM์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘˜ ๋‹ค ๊ฐ€์ ธ์˜ค๋ฉด ํ˜ธํ™˜์„ฑ์ด ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ emscripten์˜ ์ƒˆ๋กœ์šด 'fastcomp' ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ „ ๋ฐฑ์—”๋“œ๋ณด๋‹ค Rusty ์›Œํฌ๋กœ๋“œ์—์„œ ๋œ ํ…Œ์ŠคํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ๋ฐฑ์—”๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์„ ํƒํ•˜๋ฉด ์ตœ์†Œํ•œ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Emscripten์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ž์ฒด ํƒ€๊ฒŸ ํŠธ๋ฆฌํ”Œ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋™์ผํ•œ ํƒ€๊ฒŸ ํŠธ๋ฆฌํ”Œ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด rustc๋ฅผ ์„ค๋“ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

libcore ๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋Š” ์ด emscripten ๋ฌธ์ œ์™€ ๊ด€๋ จ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. libcore ๋ฅผ llvm ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด llvm ์›์ž ๋ช…๋ น์–ด๊ฐ€ ์ƒ์„ฑ๋˜์ง€๋งŒ emscripten์€ ์›์ž ๋ช…๋ น์–ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋…น์Šจ ์ชฝ์—์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ emscripten ๋ฌธ์ œ์˜ ์ฃผ์„์„ ๊ธฐ๋ฐ˜์œผ๋กœ emscripten์—์„œ atomics์— ๋Œ€ํ•œ ์ง€์›์„ ์–ป๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

emscripten์— ์ž์ฒด ํ”Œ๋žซํผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ณ€ํ˜•์— ๋Œ€ํ•œ ๋ชจ๋“  ์›์ž๋ฅผ cfg-outํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์—…์ŠคํŠธ๋ฆผ emscripten์— ์ด๊ฒƒ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค!

๋‚ด๊ฐ€ ํ‹€๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด emscripten์˜ ์ƒˆ๋กœ์šด "fastcomp" ๋ฐฑ์—”๋“œ๋Š” LLVM์˜ ํฌํฌ์ด๋ฏ€๋กœ(์ด์ „ ๋ฐฑ์—”๋“œ๋Š” LLVM ์œ„์˜ ๊ณ„์ธต์ผ ๋ฟ์ž„) fastcomp์˜ LLVM ๋ฒ„์ „์€ ์•„๋งˆ๋„ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์—…๊ทธ๋ ˆ์ด๋“œ๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค ์ž์ฃผ.

์ด๊ฒƒ์€ Rust์˜ ์ถœ๋ ฅ๊ณผ ํ˜ธํ™˜๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ fastcomp์˜ LLVM ๋ฒ„์ „์€ 3.3์ด๊ณ  Rust์—์„œ ์‚ฌ์šฉํ•˜๋Š” LLVM์€ 3.4์ž…๋‹ˆ๋‹ค.

์˜ค๋ž˜๋œ emscripten ๋ฐฑ์—”๋“œ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฏ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์ด ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋กœ์„œ๋Š” emscripten์šฉ์œผ๋กœ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ํ•˜๋Š” ์œ ์ผํ•œ ์‚ฌ๋žŒ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ก์„ ์œ„ํ•ด ๋‚ด๊ฐ€ ์‹œ๋„ํ•œ ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋ฐ”์ดํŠธ์ฝ”๋“œ(Rust์˜ LLVM 3.4์— ์˜ํ•ด ์ƒ์„ฑ๋จ)๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์ด๋ฅผ fastcomp(LLVM 3.3์˜ ๋ถ„๊ธฐ)์— ์ „๋‹ฌ ; fastcomp๊ฐ€ ์ถฉ๋Œํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • IR๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  LLVM 3.3๊ณผ ํ˜ธํ™˜๋  ๋•Œ๊นŒ์ง€ ์ˆ˜๋™์œผ๋กœ ํŽธ์ง‘ํ•˜๊ณ  fastcomp์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์†Œํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์— ๋Œ€ํ•ด ์ˆ˜์ •ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ณ  ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • emscripten์˜ fastcomp๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” --llvm-root Rust stage1 ์ปดํŒŒ์ผ ; ARM/MIPS/etc์— ๋Œ€ํ•œ ์ง€์›์„ ์ œ๊ฑฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ํฌํฌ์—์„œ (๋‚˜๋Š” ์ด๊ฒƒ ๋•Œ๋ฌธ์— ๋ฉ”์ดํฌ ํŒŒ์ผ๊ณผ ์—ฐ๊ฒฐ ์ค‘์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค)
  • 3.3 ์‹œ๋Œ€์˜ ์˜ค๋ž˜๋œ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก Rust์˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ LLVM git ํ•˜์œ„ ๋ชจ๋“ˆ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. LLVM์˜ ํŠน์ • ์ง€์ ์—์„œ segfault๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ LLVM 3.3์„ ๊ฐ€๋ฆฌํ‚ค๋Š” --llvm-root Rust ์ปดํŒŒ์ผ(๊ณต์‹ ์šฐ๋ถ„ํˆฌ ์ €์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์˜ด) ; stage1 ์ปดํŒŒ์ผ์ด ๋๋‚  ๋•Œ ์–ด์„ค์…˜ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์ƒ์„ฑ๋œ rustc ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์•„์ด๋””์–ด๊ฐ€ ์—†๋Š” ํ•œ ์ œ ๊ฒฐ๋ก ์€ emscripten์ด ์—…๊ทธ๋ ˆ์ด๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Ÿผ ์ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

์‚ฌ์†Œํ•œ ์—…๋ฐ์ดํŠธ: emscripten-fastcomp๊ฐ€ LLVM 3.4๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์œผ๋ฉฐ ๋‚˜์ค‘์— LLVM 3.5๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

@tomaka 3.4 ๋ฒ„์ „์œผ๋กœ

@ibdknox 3.4๋Š” 3.5์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ hello world์กฐ์ฐจ๋„ ์‹คํŒจํ•œ ์ฃผ์žฅ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค: LLVM ERROR: 0 && "some i64 thing we can't legalize yet"

ํ . rustc --emit ir foo.rust ์—์„œ ์ถœ๋ ฅ์„ ๊ฐ€์ ธ์™€ emscripten-incoming์„ ํ†ตํ•ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋…น์ด ์ด์ œ LLVM 3.5์— ์žˆ์Šต๋‹ˆ๊นŒ?

Rust๋Š” ์˜ค๋žซ๋™์•ˆ LLVM 3.5๋ฅผ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค. ์šด์ด ์ข‹๊ณ  ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ ์ž˜ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

#[start]
fn main(_: int, _: *const *const u8) -> int {}

์ด๊ฒƒ์€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” IR ๋•Œ๋ฌธ์ด ์•„๋‹™๋‹ˆ๋‹ค.

fn main() { println!("hello world"); }

@ibdknox http://www.reddit.com/r/rust_gamedev/comments/2n0x08/emscripten_experiments/
์ƒ๊ฐ๋ณด๋‹ค ๋ถˆํ˜ธ๊ฐ€ ์ ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ๋กœ ํ˜„์žฌ 3.5๋กœ ์—…๋ฐ์ดํŠธ๋œ emscripten์œผ๋กœ hello world๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

Value:   %28 = call fastcc { i8, [0 x i8], [0 x i8] } @_ZN3fmt5write20h2c56fdda0b308d94DFAE({ i8*, void (i8*)** }* noalias nocapture dereferenceable(8) %arg.i, %"struct.core::fmt::Arguments[#3]"* noalias nocapture readonly dereferenceable(24) %__args31), !noalias !22
LLVM ERROR: Unrecognized struct value
Traceback (most recent call last):
  File "/Users/chris/Downloads/emsdk_portable/emscripten/incoming/emcc", line 1259, in <module>
    shared.Building.llvm_opt(final, link_opts)
  File "/Users/chris/Downloads/emsdk_portable/emscripten/incoming/tools/shared.py", line 1401, in llvm_opt
    assert os.path.exists(target), 'Failed to run llvm optimizations: ' + output
AssertionError: Failed to run llvm optimizations:

๋‚ด๊ฐ€ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

rustc --target i686-apple-darwin -C lto --emit ir foo.rust
emcc -v foo.ll -o test.html

๊ทธ๋Ÿฌ๋‚˜ fmt๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๊ฒƒ๋“ค์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•˜๋Š” ์ง€๋‚œ ์ฃผ์— ๋‚˜์˜ ์ž์œ  ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๋ฆ„๊ณผ ์ง€๊ธˆ ์‚ฌ์ด์— ์–ธ์  ๊ฐ€ Rust์˜ ์ฑ…์„ ์ฝ์—ˆ๊ณ  ์–ธ์–ด์˜ ์—ญํ•™์„ ์ •๋ง ์ข‹์•„ํ–ˆ์ง€๋งŒ ์ตœ๊ทผ์—์„œ์•ผ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋ฒˆ ์ฃผ์— ๋ฐฐ์šด ๊ฒƒ์— ๋Œ€ํ•ด Rust ์ปดํŒŒ์ผ๋Ÿฌ์— ๋Œ€ํ•ด ์•„๋Š” ๋งŒํผ๋งŒ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ๋ฐฐ์šด ๊ฒƒ ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๊ฒƒ์€(๊ทธ๋Ÿฌ๋‚˜ ์•Œ์•„์ฐจ๋ฆฌ๊ธฐ๊นŒ์ง€ ๋ฉฐ์น ์ด ๊ฑธ๋ ธ๋‹ค) Rust๊ฐ€ 7์›”์— LLVM 3.6์œผ๋กœ ์˜ฎ๊ฒผ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜„์žฌ ๋ฒ„์ „์˜ Rust์™€ emscripten-fastcomp๋Š” ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

emscripten-fastcomp 1.29.2๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” --llvm-root ๋…น์„ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ๋Š”๋ฐ ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

rustc: x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libcore
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: http://doc.rust-lang.org/complement-bugreport.html
note: run with `RUST_BACKTRACE=1` for a backtrace
thread 'rustc' panicked at 'assertion failed: self.raw.hash != self.hashes_end', /Users/zen/Code/rust/src/libstd/collections/hash/table.rs:776


make: *** [x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/stamp.core] Error 101

์ด ์˜ค๋ฅ˜์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด emscripten-fastcomp๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค.

../configure --enable-optimized --disable-assertions --enable-targets=host,js,arm,aarch64,mips

emscripten์˜ ๊ฐ€์ด๋“œ๊ฐ€ ๊ถŒ์žฅํ•˜๋Š” ๋Œ€์‹ 

../configure --enable-optimized --disable-assertions --enable-targets=host,js

Rust๊ฐ€ ๋ชจ๋“  ๋Œ€์ƒ์— ๋Œ€ํ•ด ๋นŒ๋“œ๋  ํ•„์š”๋Š” ์—†์ง€๋งŒ ํ˜„์žฌ ํ•ญ์ƒ ๋ชจ๋“  ๋Œ€์ƒ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ๋œ CPU ์ง€์›์œผ๋กœ LLVM์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚˜์ค‘์— ์ˆ˜์ •๋  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ํ•ด๋‹น ๊ตฌ์„ฑ์œผ๋กœ emscripten-fastcomp๋ฅผ ํ•ญ์ƒ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Rust๊ฐ€ LLVM 3.6์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์„ ๋•Œ ๋‚˜๋Š” LLVM 3.5์ธ rust-lang/llvm์˜ ๋งˆ์ง€๋ง‰ ๋ถ„๊ธฐ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. https://github.com/rust-lang/llvm/tree/rust-llvm-2014-07-24 ๋‚˜๋Š” emscripten-fastcomp ๋Œ€์‹  ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผํ–ˆ๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค. emscripton-fastcomp ์ตœ๊ทผ LLVM 3.5๋กœ์˜ ์ด๋™์— ๋Œ€ํ•ด ์ปดํŒŒ์ผํ•  ๋•Œ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ Rust๊ฐ€ ํ˜„์žฌ LLVM 3.5์™€ ์–ด๋–ค ์‹์œผ๋กœ๋“  ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋ฐ›์•„๋“ค์ด๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹ค์ œ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ LLVM 3.6:wink์— ๋Œ€ํ•œ emscripten-fastcomp๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์นด์ด๋ธŒ๋œ 0.11 ์‚ฌ๋ณธ์„ ๋‹ค์šด๋กœ๋“œํ–ˆ๊ณ  emcc ์ดํ•ดํ–ˆ์ง€๋งŒ ๋งํฌ ๋ฌธ์ œ์— ๋„๋‹ฌํ•œ hello world๋ฅผ ์œ„ํ•œ LLVM IR์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ๊ฝค ํฅ๋ฏธ๋กœ์› ์ง€๋งŒ ์‹ค์ œ๋กœ ์—ฐ๊ฒฐํ•˜๋ ค๋ฉด Rust ์ฝ”๋“œ ๊ธฐ๋ฐ˜์—์„œ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Rust-lang/llvm์„ emscripten-fastcomp์— ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ์—๋Š” 43๊ฐœ์˜ ํŒŒ์ผ์— ๋Œ€ํ•ด 117๊ฐœ์˜ ์ถฉ๋Œํ•˜๋Š” ์„น์…˜์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฐ๊ฒฐ ๋‹จ๊ณ„์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด Rust 0.11๊ณผ emcc 1.29.2๋ฅผ ์–ป๋Š” ๊ฒƒ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ emcc -v hello.ll -o hello.js
INFO     root: (Emscripten: Running sanity checks)
WARNING: Linking two modules of different data layouts: '/Users/zen/.emscripten_cache/libc.bc' is 'e-p:32:32-i64:64-v128:32:128-n32-S128' whereas '/tmp/tmpv_yB8E/hello_0.o' is 'e-p:32:32-f64:32:64-f80:128-n8:16:32'
WARNING: Linking two modules of different target triples: /Users/zen/.emscripten_cache/libc.bc' is 'asmjs-unknown-emscripten' whereas '/tmp/tmpv_yB8E/hello_0.o' is 'i686-apple-darwin'
warning: incorrect target triple 'i686-apple-darwin' (did you use emcc/em++ on all source files and not clang directly?)
warning: unresolved symbol: _ZN2io5stdio12println_args20h0caae70b0e2eb347Iol7v0_11_0E
warning: unresolved symbol: _ZN10lang_start20h70f93b7d0a75f99atre7v0_11_0E

emcc/fastcomp๋Š” ๊ธฐํ˜ธ์˜ ์ ์„ ๋ฐ‘์ค„๋กœ ๋ฐ”๊พธ๋Š” ๋ฐ˜๋ฉด Rust๋Š” ์ ‘๋‘์‚ฌ์— ๋‹ค๋ฅธ ๋ฐ‘์ค„์„ ๋ถ™์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์ฒซ ๋ฒˆ์งธ ๊ธฐํ˜ธ๋Š” i686-apple-darwin ๋นŒ๋“œ์˜ libstd์— __ZN2io5stdio12println_args20h0caae70b0e2eb347Iol7v0.11.0E ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. emcc๊ฐ€ ๋นŒ๋“œ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ด ๊ธฐํ˜ธ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜๋”๋ผ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  emcc์—๋Š” LLVM ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ emscripten์šฉ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ปดํŒŒ์ผํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•œ ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ ํ•„์š”์„ฑ์˜ ์ผ๋ถ€์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๋“ค ์ž์‹ ์„ ์˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋ฉด ๋‚ด๊ฐ€ ์‹œ๋„ํ•˜๊ณ  ๋…ธ๋ ฅํ•  ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (๋˜๋Š” ๋‚ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ์˜ณ๊ณ  ๊ทธ๋ฅธ์ง€ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

  • Rust-lang/llvm์„ emscripten-fastcomp์— ๋ณ‘ํ•ฉ
  • JS ๋ฐฑ์—”๋“œ ์ง€์› ์—†์ด ๋ณ‘ํ•ฉ๋œ fastcomp๋กœ ๋Ÿฌ์ŠคํŠธ ๋นŒ๋“œ
    ์ด๊ฒƒ์ด ๋ณ‘ํ•ฉ์„ ์œ„ํ•œ ์ข‹์€ ์˜จ์ „์„ฑ ํ…Œ์ŠคํŠธ๊ฐ€ ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.
  • emscripten์˜ ํŠธ๋ฆฌํ”Œ์„ Rust์— ์ถ”๊ฐ€ํ•˜๊ณ  ๋นŒ๋“œํ•˜์„ธ์š”.
    ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ํŒŒ์ผ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

    • mk/cfg/asmjs-unknown-emscripten.mk

    • rt/arch/asmjs/{morestack.S,record_sp.S}(๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?)

      ์ด ํŒŒ์ผ์€ Rust๊ฐ€ LLVM์˜ ๋ถ„ํ•  ์Šคํƒ์„ ์ง€์›ํ•˜๋„๋ก morestack.a๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด Emscripten์˜ ์Šคํƒ๋„ ํ—ค๋“œ์ž…๋‹ˆ๋‹ค. ํž™์˜ ๋ฐ˜๋Œ€์ชฝ ๋์„ ์Šคํƒ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  asmjs์˜ ๊ฒฝ์šฐ ์–ด๋ ˆ์ด์˜ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ƒˆ ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” librustc_back ๋Œ€์ƒ ํŒŒ์ผ์˜ TargetOption ํ•„๋“œ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

    • librustc_trans/trans/cabi_asmjs.rs

    • librustc_trans/trans/cabi.rs

      ์ด๊ฒƒ์ด ํ•„์š”ํ•œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ์ถ”์ธก์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

    • librustc_back/target/asmjs_unknown_emscripten.rs

    • librustc_back/asmjs.rs

    • librustc_syntax/abi.rs

    • librustc_back/back/write.js configure_llvm()

    • librustc_llvm/lib.rs static_link_hack_this_sucks()

  • ๋ˆ„๋ฝ๋œ ์‹œ์Šคํ…œ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„
    11์›”์— libgreen์ด ์ œ๊ฑฐ๋œ ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. emscripten์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘์—…์ž์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด libgreen๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๋ณต์›๋˜๊ฑฐ๋‚˜ pthread ๋˜๋Š” Windows ์Šค๋ ˆ๋“œ API์— ๋Œ€ํ•ด Rust๊ฐ€ ๋นŒ๋“œ๋˜๋Š” ๋ฐฉ์‹๊ณผ ๊ฐ™์ด emscripten์— ๋Œ€ํ•ด ํŠน์ •ํ•œ ๋ฐฉ์‹์œผ๋กœ pthread shim๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„์ด์˜ค๋„. ์•„๋งˆ ์ œ๊ฐ€ ๋ชจ๋ฅด๋Š” ๋‹ค๋ฅธ ๋ถ€๋ถ„๋“ค์ด ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.

"rust-lang/llvm์„ emscripten-fastcomp์— ๋ณ‘ํ•ฉ"

์ด๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Emscripten์€ pnacl-llvm/pnacl-clang์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฏ€๋กœ ํŒจ์น˜์— ํŒจ์น˜๊ฐ€ ์žˆ๋Š” ํฌํฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋Š” ์•„๋งˆ๋„ ๊ณ ํ†ต์Šค๋Ÿฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ด€์‹ฌ์ด ์žˆ์œผ์‹œ๋ฉด https://github.com/kripken/emscripten-fastcomp/issues/51#issuecomment -62323164์—์„œ r33 -> r34์—์„œ Emscripten ๋ณ‘ํ•ฉ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ ์กฐ์‚ฌ์—์„œ ๋ถ„๊ธฐ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

pnacl์ด ์—…์ŠคํŠธ๋ฆผ์„ ์ด์ „๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๊ฐ€๊น๊ฒŒ ์ถ”์ ํ•  ๊ณ„ํš์ด๋ผ๊ณ  ๋“ค์—ˆ์ง€๋งŒ pnacl ์ด์Šˆ ํŠธ๋ž˜์ปค์—์„œ 3.6์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•œ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํŠนํžˆ 3.6์€ 5์ผ ์ „์—๋งŒ ๋ถ„๊ธฐ๋จ!). ..๋‹น์‹ ์ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ์ž์‹ ์˜ Emscripten ํฌํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๋ฉด pnacl์„ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ Emscripten์ด pnacl์—์„œ ์—…์ŠคํŠธ๋ฆผ์œผ๋กœ ์ด๋™ํ•˜๋„๋ก ๋•๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜์ •: '์ง€๊ธˆ'์„ '์•„๋‹ˆ์š”'๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ •์ ์ธ ์ฐจ์ด.

1.0์„ ์ค€๋น„ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๋Œ€์ ์ธ ๋ถ„๋ฅ˜ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์˜ ์ผ๋ถ€๋กœ, RFC ์ €์žฅ์†Œ๋กœ ์œ„์‹œ๋ฆฌ์ŠคํŠธ์™€ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์˜ฎ๊ธฐ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ณณ์—์„œ ์ฃผ์š” ์ƒˆ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๋…ผ์˜/์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” RFC ์ €์žฅ์†Œ๋กœ ์ด๋™๋˜์—ˆ์Šต๋‹ˆ๋‹ค: rust-lang/rfcs#604

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰