๋๋ ์ด ๋ฌธ์ ๋ฅผ ํํค์น๋ ๋ฐ ์๊ฐ์ ๋ณด๋๊ณ ์ด์ rustc๋ emscripten์ด ๋ฒ์ญํ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง ์ปดํ์ผ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฐํ์ ๊ธฐ๋ฅ์ ๋๋ฌํ๋ฉด ์คํจํฉ๋๋ค. ๋ค์ ๋จ๊ณ๋ emcc
๋ฅผ ์ปดํ์ผ๋ฌ๋ก ์ฌ์ฉํ์ฌ ๋ฐํ์ ๋น๋๋ฅผ ์์ํ๋ ๊ฒ์
๋๋ค. EMSCRIPTEN
ifdef ๋ค์ ๊ตฌ์ถ๋์ง ์๋ ๋ชจ๋ ๊ฒ์ ์ ๊ฑฐํ์ญ์์ค.
Emscripten์ ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ถ๊ฐํ๊ณ ์์ผ๋ฏ๋ก emscripten์ผ๋ก ๋น๋ํ์ง ์๋ ๋ฐํ์์ ๋ชจ๋ ๋ถ๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ธ๋ผ์ธ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐํ์ ๋จํธ์ ๋ค์ ๊ตฌํํ๊ณ C++์์ ์ปดํ์ผํ๋ ๊ฒ์ ์ ํ ๊ท์ฐฎ๊ฒ ํ์ง ์์ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ถ์ฅ๋์ง ์์ต๋๋ค.
#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 ๋ฐ ์ปฌ๋ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์น์ผ๋ก ์ปดํ์ผํ๋ ๊ฒ์ ๊ฑฐ์ ๊ฐ๋จํด์ผ ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฝค ์ข์ ์์์ ๋๋ค!
์ข์, ๊ทธ๋์ ๋๋ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ก ์๋ํ๊ณ ๋ถ๋ช ํ ๋ฐ์ฅ์์ ๋ฐ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
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์ผ๋ก ๊ฐ๋จํ ํ ์คํธ๋ฅผ ์ปดํ์ผํ ์ฌ๋๋ค์๊ฒ ํ๋ก์ธ์ค์ ๋ํด ๋ฌผ์ด๋ณผ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์์ด๋์ด๋ง ์์ต๋๋ค.
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์ฉ์ผ๋ก ์ปดํ์ผํ๋ ค๊ณ ํ๋ ์ ์ผํ ์ฌ๋์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๊ธฐ๋ก์ ์ํด ๋ด๊ฐ ์๋ํ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
--llvm-root
Rust stage1 ์ปดํ์ผ ; ARM/MIPS/etc์ ๋ํ ์ง์์ ์ ๊ฑฐํ๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์์ต๋๋ค. ๊ทธ๋ค์ ํฌํฌ์์ (๋๋ ์ด๊ฒ ๋๋ฌธ์ ๋ฉ์ดํฌ ํ์ผ๊ณผ ์ฐ๊ฒฐ ์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค)--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์ ๋ณํฉ"
์ด๋ ๊ฒ ํ๊ณ ์ถ์ง ์์ ์๋ ์์ต๋๋ค. 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
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
1.0์ ์ค๋นํ๊ธฐ ์ํด ๋๋์ ์ธ ๋ถ๋ฅ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ด๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ์ผ๋ถ๋ก, RFC ์ ์ฅ์๋ก ์์๋ฆฌ์คํธ์ ๊ฐ์ ํญ๋ชฉ์ ์ฎ๊ธฐ๊ณ ์์ต๋๋ค. ๊ทธ๊ณณ์์ ์ฃผ์ ์ ํญ๋ชฉ์ ๋ํด ๋ ผ์/์ฐ์ ์์๋ฅผ ์ง์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ๋ฌธ์ ๋ RFC ์ ์ฅ์๋ก ์ด๋๋์์ต๋๋ค: rust-lang/rfcs#604