λ°μΈλ©μ λ§λλ μ¬λλ€μ΄ C ν¨μκ° νΈμΆν μ μλ μ½λ°±μ μ 곡ν μ μκΈ°λ₯Ό μνλ λ§μ μλ리μ€κ° μμ΅λλ€. νμ¬ μ루μ μ μΌλΆ μ§μ λμ§ μμ λ΄λΆ APIλ₯Ό μ¬μ©νμ¬ λ©μμ§λ₯Ό Rust μ½λλ‘ λ€μ 보λ΄λ λ€μ΄ν°λΈ C ν¨μλ₯Ό μμ±νλ κ²μ λλ€. μ΄μμ μΌλ‘λ C μ½λλ₯Ό μμ±νμ§ μλ κ²μ΄ ν¬ν¨λ©λλ€.
λ€μμ C μ½λμμ νΈμΆν μ μλ Rustμμ ν¨μλ₯Ό λ§λ€κΈ° μν μ΅μνμ μ루μ μ λλ€. μμ§λ λ€μκ³Ό κ°μ΅λλ€. 1) λ λ€λ₯Έ μ’ λ₯μ ν¨μ μ μΈμ΄ μμ΅λλ€. 2) μ΄ ν¨μλ Rust μ½λμμ νΈμΆν μ μμ΅λλ€. 3) κ°μ λΆν¬λͺ ν μμ νμ§ μμ ν¬μΈν°λ‘ μ¬μ©ν μ μμ΅λλ€. 4) μ€ν μ ν λ§λ²μ μ μ©νκ³ μ μν©λλ€. C ABIμμ Rust ABIλ‘.
C-to-Rust(crust) ν¨μ μ μΈ:
crust fn callback(a: *whatever) {
}
C ABI ν¨μμ λν μμ νμ§ μμ ν¬μΈν° μ»κΈ°:
let callbackptr: *u8 = callback;
μ΄ λͺ©μ μ μν΄ νΉλ³ν λͺ κ°μ§ μ νμ μ μν μλ μμ΅λλ€.
λλΆλΆ κ°λ¨νμ§λ§ νΈλμ€λ μΆμ ν΄μ§λλ€. νΈλμ€μμλ κΈ°λ³Έ λͺ¨λ κΈ°λ₯μ λν΄ κΈ°λ³Έμ μΌλ‘ λ°λ μμ μ μνν΄μΌ ν©λλ€.
μ΄λ₯Ό μν΄ λ°νμμ λͺ κ°μ§ λ°©μμΌλ‘ λ³κ²½λμ΄μΌ ν©λλ€.
λ€μ΄ν°λΈ μ½λκ° C++ μμΈλ‘ ν릴 μ μλ€λ 보μ₯μ΄ μκΈ° λλ¬Έμ Rust μ€νμ λ€μ λ€μ΄κ° νμ λ¨μν μμΈλ₯Ό λμ§ μλ μμ΅λλ€. Go μΈμ΄λ λΆλͺ ν μ΄ μλ리μ€μμ λͺ¨λ κΈ°λ³Έ νλ μμ 건λλ°κ³ λͺ¨λ κ²μ λμΆν©λλ€. λμ μ€λ¨ν κ²μ λλ€. μ¬μ©μκ° μΉλͺ μ μΈ μ€ν¨λ₯Ό νΌνλ €λ©΄ Rust μ½λ°±μ μ¬μ©νμ¬ λ©μμ§λ₯Ό μ λ¬νκ³ μ¦μ λ°νν΄μΌ ν©λλ€.
C μ€νμ μ²λ¦¬νλ λ°©μμ λ³κ²½νμ§ μκ³ μλ Rust ν¨μκ° C μ½λμμ Rust μ€νμ λ€μ λ€μ΄κ° ν μ€μΌμ€λ¬λ‘ 컨ν μ€νΈ μ ννλ κ²μ νμ©ν μ μμ΅λλ€. λ κ°μ§ μ루μ μ΄ μμ΅λλ€.
1) λ¬μ€νΈ μ€νμ μ¬μ§μ
ν ν μμ΅λ₯ μ΄ λ¬λΌμ§λ©° λ¨μν μ°¨λ¨ν©λλ€. μ΄λ₯Ό μννλ €λ μμ
μ μ체 μ€μΌμ€λ¬(#1721)κ° μλμ§ νμΈν΄μΌ ν©λλ€.
2) μ€μΌμ€λ¬μ μ€νμ μ¬μ©νμ¬ λ€μ΄ν°λΈ μ½λλ₯Ό μ€ννλ λμ νμ€ν¬λ κ° μ€μΌμ€λ¬μ μλ νμμ C μ€νμ 체ν¬μμν©λλ€. μμ
μ΄ C μ€νμ λ€μ λ€μ΄κ° λλ§λ€ μ΄λ―Έ μ€νμ΄ μλμ§ νμΈνκ³ λ€μ μ¬μ©ν©λλ€. κ·Έλ μ§ μμΌλ©΄ μ€μΌμ€λ¬μμ μ μ€νμ μμ²ν©λλ€. μ΄λ κ² νλ©΄ λ¬μ€νΈ μ½λκ° μ€μΌμ€λ¬λ₯Ό λ¬Άμ§ μκ³ λ νμ μ μμ μΌλ‘ μ보ν μ μμ΅λλ€.
λλ λ λ²μ§Έ μ΅μ μ μ νΈν©λλ€.
μ°Έμ‘° #1508
μ¬κΈ°λ‘ λ°μ΄λ€μ΄μ μ£μ‘νμ§λ§ C ν¨μλ₯Ό νΈμΆνλ κ²μ _blazing_ fastμμμ κ°μ΄ λΉ¨λΌμΌ νλ€λ μ μ κ°μ‘°νκ³ μΆμ΅λλ€. Allegro, SDL λλ Openglκ³Ό κ°μ C λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ λ ΉμΌλ‘ κ²μμ μμ±νλ €λ©΄ μ΄κ²μ΄ νμμ μ λλ€. κ·Έλ μ§ μμΌλ©΄ C νΈμΆμ΄ λ§μ λ λλ§ μ½λμμ κ²μ μλκ° λλ €μ§λ―λ‘ νμ©ν μ μμ΅λλ€. cgoλ₯Ό μ¬μ©νλ κΈ°λ³Έ Go μΈμ΄ μ»΄νμΌλ¬μλ μ΄λ¬ν λ¬Έμ κ° μμ΅λλ€.
λ°λΌμ Rust μΈ‘μ κΈ°λ₯μ΄ μνν μ μλ μμ μ μ νν μ μμ§λ§ λΉ λ₯Έ μ루μ μ μ νΈν©λλ€.
λν "ν¬λ¬μ€νΈ fn" λμ "λ€μ΄ν°λΈ fn"μ μ¬μ©νλ κ²μ΄ μμ΄λμ΄κ° μλκΉμ? μλλ©΄ λ€λ₯Έ κ³νλ μλ―Έκ° μμ΅λκΉ?
@beoran λΉμ μ μ΄κ²μ λ€λ‘ κ°μ§κ³ μμ΅λλ€. μ°λ¦¬λ Rustλ₯Ό νΈμΆνλ Cμ λν΄ μ΄μΌκΈ°νκ³ μμ΅λλ€. Rustμμ C ν¨μλ₯Ό νΈμΆνλ κ²μ μ΄λ―Έ κ½€ λΉ λ¦ λλ€(μ’ λ λΉ¨λΌμ§ μ μμ).
κ·Έλ μμμ΄. λ Ήμμ Cλ₯Ό νΈμΆνλ μλλ₯Ό λμΌ μ μλ λ°©λ²μ΄ μμ΅λκΉ?
@beoran λ΄κ° λ§νλ―μ΄ μ΄κ²μ μ΄ λ¬Έμ μ μΌμ’ μ μ§κ΅μ΄μ§λ§ μλ§λ λΉμ μ΄ ν μ μλ μ΅μ μ μ±λ₯μ΄ μΌλ§λ λΆμ μ νμ§λ₯Ό 보μ¬μ£Όλ λ²€μΉλ§ν¬λ₯Ό λ§λλ κ²μ λλ€. :)
μ’μ, λλ Rust Rustμμ νΈμΆνλ μ€λ²ν€λμ Cμμ νΈμΆνλ μ€λ²ν€λλ₯Ό λΉκ΅νκΈ° μν΄ Allegroλ₯Ό λννλ λ° μΆ©λΆν μ΅μν΄μ§λ©΄ κ·Έλ κ² ν κ²μ λλ€. μ§κΈμ μ΄ λ¬Έμ λ₯Ό κ·Έλλ‘ λκ³ μΌλ¨ μ λ¬Έμ λ₯Ό μ΄κ² μ΅λλ€. λ²€μΉλ§ν¬.
νμ¬ Rust->C νΈμΆμ΄ νλ κ²μ²λΌ C ν¨μκ° Rust μ€νμ μ§μ μ°λλ‘ νμ¬ μΈμμ 볡μ¬λ³Έ μ€ νλλ₯Ό νΌν μ μμ΅λκΉ?
λλ shim ꡬ쑰체μμ Rust ν¨μμ μΈμλ‘ λ€μ΄κ°λ μΈμμ μ΅μ’ 볡μ¬λ³Έμ΄ μΈλΌμΈμ ν΅ν΄ μ κ±°λκΈ°λ₯Ό λ°λλλ€. κ·Έκ²μ΄ λΉμ μ΄ μΈκΈνλ κ²μΈμ§ νμ€νμ§ μμ΅λλ€.
μ λ μ°λ¦¬μ C νΈμΆμ΄ νμ¬ Rust μ€νμ ꡬ쑰체μ μΈμλ₯Ό 볡μ¬ν λ€μ ν΄λΉ ꡬ쑰체λ₯Ό C μ€νμ 볡μ¬νλ€κ³ λ―Ώμ΅λλ€.
@pcwalton Rust->Cλ νμ¬ i386μλ§ ν΄λΉλκΈ° λλ¬Έμ C μ€νμ μ§μ μ°μ§ μμ΅λλ€. 64λΉνΈ μλμ μν΄ μ½κ°μ μ±λ₯μ ν¬μνλλΌλ νΉμ νΈμΆ κ·μΉμ νΉμ ν μ½λλ₯Ό μμ±νλ κ²μ νΌνκ³ μΆμμ΅λλ€. (μ΄λ¬ν μ΅μ νκ° μ΄μ λ μλ―Έκ° μμ μ μλ€κ³ μκ°ν©λλ€. νΉν #1402μμ LLVMμ΄ νΈμΆ κ·μΉμ μμ ν _μ΄μ¨λ _ μ²λ¦¬νμ§ λͺ»νλ€κ³ μ§μ νκΈ° λλ¬Έμ)
μ€ν μ ν ν¨μλ₯Ό μ½μ νμλ arg κ΅¬μ‘°μ²΄κ° μ€ν κ°μ μ ν 볡μ¬λμ§ μκ³ μ΄μ μ€νμ λν ν¬μΈν°κ° μ μ€νμμ μ€νλλ ν¨μλ‘ μ λ¬λλ―λ‘ μλ²½ν©λλ€.
arg ꡬ쑰체λ 볡μ¬λμ§ μμ§λ§ shim ν¨μλ ꡬ쑰체μμ κ°μ λ‘λνκ³ μ μ€νμ λ€μ νΈμν©λλ€. λ§ κ·Έλλ‘ μΈμ κ°μ λμ μ€νμ μ§μ μ°λ λ° μ¬μ©λλ μ΄μ μ½λμ λλ€. μ΄κ²μ i386μμλ μλ―Έκ° μμμ§λ§ x86_64μμλ μ€ν λ±μ μ΄λ€ κ°μ΄ λ€μ΄κ°μ§ μμλ΄λ κ²μ΄ ν¨μ¬ λ 볡μ‘ν©λλ€.
λͺ κ°μ§ ν μ€νΈ νμ λλ ν¬λ¬μ€νΈ κΈ°λ₯μ΄ μ€ν¨νμ§ μλλ€λ κ²μ 보μ₯νλ κ²μ΄ λ§€μ° μ΄λ ΅λ€λ κ²μ λ°κ²¬νμ΅λλ€. νμ¬ λ°μνλ μΌμ μ΅μμ μμ (μ: main)μ΄ μ€ν¨νλ©΄ λͺ¨λ μμ μ΄ μ€ν¨νλλ‘ νκΈ° λλ¬Έμ μ½λ°±μ΄ λ©μμ§λ₯Ό 보λ΄λ €κ³ νμλ§μ(λλ λ©μμ§λ₯Ό λ³΄λΈ ν λμμ¬ λ) μ€ν¨ν μ μμ΅λλ€. λ°νμμ΄ λΉμ μμ μΌλ‘ μ€λ¨λλλ‘ ν©λλ€.
μμ μ΄ Rust μ€νμ λ€μ λ€μ΄κ°λ©΄ kill μμ²μ 무μνλλ‘ rust_taskλ₯Ό λ³κ²½ν μ μλ€κ³ μκ°ν©λλ€. μ΄λ²€νΈ 루νλ₯Ό ꡬννλ μμ μ κ²½μ° λ°νμμ΄ μ€ν¨νκ³ μμμ λνλ΄λ λ©μμ§λ₯Ό μ°Ύλ μΌλΆ λͺ¨λν° ν¬νΈλ₯Ό μΏλ³΄κ³ μ μμ μΌλ‘ μ’ λ£νλ λ°©λ²μ νμ ν μ μμ΅λλ€.
κ·Έλμ μ΅μμ μμ μ΄ μ€ν¨νλ©΄ μμμκ² μ€λ₯λ₯Ό μ νν©λκΉ? λλ μ°λ¦¬μ μ€λ₯ μ ν λͺ¨λΈμ μ΄ν΄νμ§ λͺ»νλ€κ³ μκ°ν©λλ€. C μ€νμμ μ€νλλ μ½λλ κ°λ λμ§ μμ μμ μ΄λ μ΄μ μ μ¬ν μμ μμ μ€νν μ μμ΄μΌ νλ κ² κ°μ΅λλ€.
κΈ°λ³Έμ μΌλ‘ 'main'μ΄ μ»€λμ μν΄ κ°λ λλ κ²μ²λΌ μλνλ―λ‘ mainμ΄ μ€ν¨νλ©΄ λͺ¨λ κ²μ΄ μ€ν¨ν©λλ€.
λλ μ΄κ²μ μλ£λΌκ³ λΆλ₯Έλ€. μ½κ°μ μ λ¦¬κ° μμΌλ©° λλ¨Έμ§ λ¬Έμ μ λν΄ λ³λμ λ²κ·Έλ₯Ό μ μΆνμ΅λλ€.
μ΄ λΆνμ μ©μν΄ μ£ΌμΈμ. νμ§λ§ μ΄ λ¬Έμ λ y-combinator μ‘°κ°κ³Ό λ€λ₯Έ λͺ κ°μ§ μ¬μ΄νΈμμ μ°κ²°λμ΄ μμΌλ©° μ΅κ·Όμ λ©μ²ν λμ΄ μ΄μ λν΄ μ§λ¬ΈνκΈ° λλ¬Έμ μ΄ λ¬Έμ λ° μ΄ν λ³κ²½ μ¬νμ λ°λΌ Cμμ Rustλ₯Ό νΈμΆνλ€λ μ μ μ£Όλͺ©ν©λλ€ κ°λ¨ν©λλ€ :
#[no_mangle]
pub extern fn hello_rust() -> *const u8 {
"Hello, world!\0".as_ptr()
}
#include "stdio.h"
const char *hello_rust(void);
int main(void) {
printf("%.32s\n", hello_rust());
}
κ°μ₯ μ μ©ν λκΈ
μ΄ λΆνμ μ©μν΄ μ£ΌμΈμ. νμ§λ§ μ΄ λ¬Έμ λ y-combinator μ‘°κ°κ³Ό λ€λ₯Έ λͺ κ°μ§ μ¬μ΄νΈμμ μ°κ²°λμ΄ μμΌλ©° μ΅κ·Όμ λ©μ²ν λμ΄ μ΄μ λν΄ μ§λ¬ΈνκΈ° λλ¬Έμ μ΄ λ¬Έμ λ° μ΄ν λ³κ²½ μ¬νμ λ°λΌ Cμμ Rustλ₯Ό νΈμΆνλ€λ μ μ μ£Όλͺ©ν©λλ€ κ°λ¨ν©λλ€ :