์ผ๋ถ C API์๋ ๋นํธ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ตฌ์กฐ์ฒด๊ฐ ์์ผ๋ฉฐ ํ์ฌ ๋ น์์ ์ฌ์ฉํ๊ธฐ์๋ ๋ค์ ๋ฒ๊ฑฐ๋กญ์ต๋๋ค. ์๋ง๋ ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๋ํ ์ผ์ข ์ ์ง์ ๋๋ ์ ์ด๋ ๊ทธ๊ฒ์ ์ฒ๋ฆฌํ๋ ๋งคํฌ๋ก๊ฐ ์์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ํนํ Servo์์ ์ฌ์ฉ๋๋ Azure์ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค.
๋ถ๊ฐํผํด ๋ณด์ ๋๋ค. ๋งคํฌ๋ก ๊ฒฝ๋ก๋ฅผ ๋จผ์ ์๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๊ฒ์ ๋์๊ฒ ๋ถ๊ฐํผํด ๋ณด์ด์ง๋ ์๋๋ค... ๋๋ ์ฐ๋ฆฌ๊ฐ uint์ ๋ช ์์ ๋ง์คํน์ ์ฌ์ฉํ์ฌ ์ ํ ์ ์๋ค๊ณ ๋๋๋ค. ๋ฌผ๋ก ๋นํธ ์งํฉ์ ์ง์ํ๋ ์ผ๋ถ ๋งคํฌ๋ก๋ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค. ๋นํธ ํ๋์ ๋ ์ด์์์ด LLVM์ด ์๋ clang์ผ๋ก ์์ ํ ์ํ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋น๋ก ์ ๊ฐ ํ๋ฆด ์ ์์ง๋ง, ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ง์ํ๋ ๋ฐ ์๋นํ ๊ณ ํต์ด ๋ ๊ฒ์ ๋๋ค.
์์งํ ๋งํด์ C์์๋ ๋นํธํ๋์ ๋งค๋ ฅ์ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ํญ์ ๋ ์ด์์๊ณผ ๋ง์คํน์ ๋ํ ์ ์ด๊ถ์ ์ปดํ์ผ๋ฌ์ ๋๊ธฐ๋ ๊ฒ์ฒ๋ผ ๋ณด์์ง๋ง ์ธ๋ถ ์ฌํญ์ ๋ํด ๋ง์ด ์ ๊ฒฝ ์ธ ๋๋ง ์ฌ์ฉํฉ๋๋ค. -- ์ ํํ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ ํํ ์๊ณ ์ถ์ ๋.
์ปดํ์ผ๋ฌ์ ์ฝ๋ ์์ฑ์ด ์ ๋ขฐํ ์ ์๊ธฐ ๋๋ฌธ์ Linux ์ปค๋(๋ฐ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ์ผ๋ฐ์ ์ผ๋ก ๋นํธ ํ๋๋ฅผ ํผํฉ๋๋ค. ์ ๋ ฌ, ์์ ๋ฐ ๋ ์ด์์์ ๊ตฌํ์ ๋ฌ๋ ค ์์ผ๋ฏ๋ก ๋ค๋ฅธ ABI๋ฅผ ์ง์ํด์ผ ํฉ๋๋ค. http://gcc.gnu.org/onlinedocs/gcc/Structures-unions-enumerations-and-bit_002dfields-implementation.html
๋ค, ์ ๋ ์ด๊ฒ์ ํผํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ด๊ฒ์ Servo์์ ์ด๋ฅผ ์ํํ๊ธฐ ์ํด C shim์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ๊ฐ ํ๋๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ค์ ํด์ผ ํจ์ ์๋ฏธํฉ๋๊น?
Rust์ ๋ํด ์ฝ๋ ๋์ ์ด ๋ฌธ์ ๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ ๋ ์๋ฒ ๋๋ C/C++ ์ฝ๋ ๊ฐ๋ฐ์ ๋ง์ด ํ๊ณ UART ์ฐ๊ฒฐ ์ฅ์น์ ์ํ๋ฅผ ํํํ๊ธฐ ์ํด ๋นํธ ํ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋นํธ ํ๋์ ๋ํด ๊ถ๊ธํ์ต๋๋ค. ์ํ๋ ๊ฝค ํฌ์ง๋ง ๋นํธํ๋ ๋๋ถ์ ๋์์ง ์์ต๋๋ค. ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ผ๋ก ์ธํด ๋ถ์ธ, ํน์ ์์ ์ ์ ๋ฐ ์ด๊ฑฐํ์ ๋จ์ผ์์ ์์์ ๋นํธ๋ก ํ์ํ๋ ๊ฒ์ ๋งค์ฐ ๊นจ๋ํฉ๋๋ค. Rust๊ฐ 4KB - 16KB ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ๊ฐ์ง ์ฅ์น์์ ์คํ๋๊ธฐ๋ฅผ ์ํ๋์ง ํ์คํ์ง ์์ง๋ง ๋จ์ผ ๋นํธ ํ๋๊ทธ๋ฅผ ์ป๊ธฐ ์ํด ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ Rust๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ๋นํธํ๋๋ ๋งคํฌ๋ก๊ฐ ์ฝ์ ์ ์๋ ํฝ์ฐฝ์ ๋ง๋๋ ๋งค์ฐ ๋์ ์์ค์ ์ฝ๋๋ฅผ ํ์ฉํฉ๋๋ค. ABI/ํน์ ์ ๋ ฌ ํธํ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ ๋ฌผ๋ก ๋งคํฌ๋ก๊ฐ ์ ์ผํ ์ ํ์ผ ์ ์์ต๋๋ค. ์๋ง๋ Servo์ ๊ฐ์ ํ๋ก์ ํธ ๋๋ Rust์ ๋ฏธ๋ Javascript ์์ง์ ๋ด๋ถ์ ์ผ๋ก ๋นํธ ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๊ฒฝ์ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.
@RushPL : Rust ๋งคํฌ๋ก๋ C ๋งคํฌ๋ก์ ๋ค๋ฆ
๋๋ค. ๊ทธ๊ฒ๋ค์ ํ
์คํธ ๋์ฒด๊ฐ ์๋๋ผ ํจํด ์ผ์น(์ ์ธ์ ๋งคํฌ๋ก) ๋๋ Rust ์ฝ๋(์ ์ฐจ์ ๋งคํฌ๋ก)๋ฅผ ํตํด ํ ํฐ ํธ๋ฆฌ๋ฅผ ์กฐ์ํฉ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ๊ทธ๊ฒ๋ค ์์ด ๋ ๋์ ๊ตฌ๋ฌธ์ ์ ๊ณตํ ์ ์์ง๋ง, Rust๋ ์ด๋ฏธ ์ ํ ๊ฒ์ฌ ํ์ ๋ฌธ์์ด( std::fmt
)๊ณผ ๊ฐ์ ๊ฒ์ ๋ํด ๋งคํฌ๋ก๋ฅผ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
๊ธ์, ๊ทธ๊ฒ์ ์ฌ์ ํ โโํน์ ๋นํธ ๋ฒํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ํฌํจํ ๊ฒ์
๋๋ค. ๋ง์ต๋๊น? (๋ฐ๋ผ์ ์ฝ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค)
let some_state = int_from_bits!(object.state, 3, 5) // 5 bit number from bit 3
๋
let some_state = object.some_state // compiler does all the magic as it should be
๊ธ์, ๋น์ ์ด ํ ์ ์๋ ํ ๊ฐ์ง๋ ๊ทธ๊ฒ์ ์ ๊ทผํ๊ธฐ ์ํ ๋ฉ์๋๋ก struct
๋ฅผ ์์ฑํ๋ ๊ฒ์
๋๋ค. ์์ค์ Rust์ ์ปดํ์ผ ํ์ ํจ์ ์คํ ๋ถ์กฑ์ผ๋ก ์ธํด ์์ ํํ์์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๋นํธ ํ๋๋ฅผ ์ฌ์ฉํ์ง ์์ง๋ง ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ ๋ต์ด๋ผ๋ฉด C ๋๋ C++๋ก ํ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ์ ๋๊น? ์ง์ํ๋ ์ ๋ค๋ฆญ์ ๊ฑด๋๋ฐ๊ณ ๋์ ๋ค๋ฅธ ์ ํ์ ๋ํ ๋ชจ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด์จ๋ , ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ํฌ๊ธฐ์ ์๋ฒ ๋๋ ํ๋์ ์ฌ์ฉ ์ฉ์ด์ฑ์ ๊ด์ฌ์ด ์๋ ์ฌ๋์ ๊ด์ ์์ ๋ณผ ๋ ๋จ์ง 2์ผํธ์ ๋๋ค.
์ฐธ์กฐ: RFC: ๋นํธ ํ๋ ๋ฐ ๋นํธ ์ผ์น
https://github.com/rust-lang/rfcs/pull/29
์๋ก์ด bitflags!
๋งคํฌ๋ก๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๊น?
https://github.com/mozilla/rust/pull/13072
๋ฏธ์ง๊ทผํ ์๋ต๊ณผ ๋ชจํธํ ์๊ตฌ ์ฌํญ์ ๊ณ ๋ คํ ๋ ์ด ๋ฌธ์ ๋ฅผ ๋ซ๋ ๊ฒ์ด ํ๋ช ํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ RFC ์ ์ฅ์๋ก ์ด๋๋์์ต๋๋ค: rust-lang/rfcs#314
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Rust์ ๋ํด ์ฝ๋ ๋์ ์ด ๋ฌธ์ ๋ฅผ ์ฐ์ฐํ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ ๋ ์๋ฒ ๋๋ C/C++ ์ฝ๋ ๊ฐ๋ฐ์ ๋ง์ด ํ๊ณ UART ์ฐ๊ฒฐ ์ฅ์น์ ์ํ๋ฅผ ํํํ๊ธฐ ์ํด ๋นํธ ํ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋นํธ ํ๋์ ๋ํด ๊ถ๊ธํ์ต๋๋ค. ์ํ๋ ๊ฝค ํฌ์ง๋ง ๋นํธํ๋ ๋๋ถ์ ๋์์ง ์์ต๋๋ค. ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ผ๋ก ์ธํด ๋ถ์ธ, ํน์ ์์ ์ ์ ๋ฐ ์ด๊ฑฐํ์ ๋จ์ผ์์ ์์์ ๋นํธ๋ก ํ์ํ๋ ๊ฒ์ ๋งค์ฐ ๊นจ๋ํฉ๋๋ค. Rust๊ฐ 4KB - 16KB ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ๊ฐ์ง ์ฅ์น์์ ์คํ๋๊ธฐ๋ฅผ ์ํ๋์ง ํ์คํ์ง ์์ง๋ง ๋จ์ผ ๋นํธ ํ๋๊ทธ๋ฅผ ์ป๊ธฐ ์ํด ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ Rust๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค. ๋นํธํ๋๋ ๋งคํฌ๋ก๊ฐ ์ฝ์ ์ ์๋ ํฝ์ฐฝ์ ๋ง๋๋ ๋งค์ฐ ๋์ ์์ค์ ์ฝ๋๋ฅผ ํ์ฉํฉ๋๋ค. ABI/ํน์ ์ ๋ ฌ ํธํ์ฑ์ด ํ์ํ ๊ฒฝ์ฐ ๋ฌผ๋ก ๋งคํฌ๋ก๊ฐ ์ ์ผํ ์ ํ์ผ ์ ์์ต๋๋ค. ์๋ง๋ Servo์ ๊ฐ์ ํ๋ก์ ํธ ๋๋ Rust์ ๋ฏธ๋ Javascript ์์ง์ ๋ด๋ถ์ ์ผ๋ก ๋นํธ ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๊ฒฝ์ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์ต๋๋ค.