Rust: C interop์— ๋Œ€ํ•œ ์ง€์› ๋น„ํŠธ ํ•„๋“œ

์— ๋งŒ๋“  2013๋…„ 08์›” 22์ผ  ยท  14์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

์ผ๋ถ€ C API์—๋Š” ๋น„ํŠธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉฐ ํ˜„์žฌ ๋…น์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๋‹ค์†Œ ๋ฒˆ๊ฑฐ๋กญ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ์ผ์ข…์˜ ์ง€์› ๋˜๋Š” ์ ์–ด๋„ ๊ทธ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋งคํฌ๋กœ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠนํžˆ Servo์—์„œ ์‚ฌ์šฉ๋˜๋Š” Azure์™€ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

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

Rust์— ๋Œ€ํ•ด ์ฝ๋Š” ๋™์•ˆ ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์—ฐํžˆ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ž„๋ฒ ๋””๋“œ C/C++ ์ฝ”๋“œ ๊ฐœ๋ฐœ์„ ๋งŽ์ด ํ•˜๊ณ  UART ์—ฐ๊ฒฐ ์žฅ์น˜์˜ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋น„ํŠธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํŠธ ํ•„๋“œ์— ๋Œ€ํ•ด ๊ถ๊ธˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๋Š” ๊ฝค ํฌ์ง€๋งŒ ๋น„ํŠธํ•„๋“œ ๋•๋ถ„์— ๋‚˜์˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ฎ์€ ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ๋ถ€์šธ, ํŠน์ • ์ž‘์€ ์ •์ˆ˜ ๋ฐ ์—ด๊ฑฐํ˜•์„ ๋‹จ์ผ์—์„œ ์†Œ์ˆ˜์˜ ๋น„ํŠธ๋กœ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊นจ๋—ํ•ฉ๋‹ˆ๋‹ค. Rust๊ฐ€ 4KB - 16KB ๋ฉ”๋ชจ๋ฆฌ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง„ ์žฅ์น˜์—์„œ ์‹คํ–‰๋˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹จ์ผ ๋น„ํŠธ ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Rust๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋น„ํŠธํ•„๋“œ๋Š” ๋งคํฌ๋กœ๊ฐ€ ์ฝ์„ ์ˆ˜ ์—†๋Š” ํŒฝ์ฐฝ์„ ๋งŒ๋“œ๋Š” ๋งค์šฐ ๋†’์€ ์ˆ˜์ค€์˜ ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ABI/ํŠน์ • ์ •๋ ฌ ํ˜ธํ™˜์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฌผ๋ก  ๋งคํฌ๋กœ๊ฐ€ ์œ ์ผํ•œ ์„ ํƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ Servo์™€ ๊ฐ™์€ ํ”„๋กœ์ ํŠธ ๋˜๋Š” Rust์˜ ๋ฏธ๋ž˜ Javascript ์—”์ง„์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋น„ํŠธ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๊ฒฝ์šฐ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ถˆ๊ฐ€ํ”ผํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๋งคํฌ๋กœ ๊ฒฝ๋กœ๋ฅผ ๋จผ์ € ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ถˆ๊ฐ€ํ”ผํ•ด ๋ณด์ด์ง€๋Š” ์•Š๋Š”๋‹ค... ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ 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

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