Rust: lib์˜ ๋‚ด๋ณด๋‚ธ ๊ธฐํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” C ํ—ค๋” ์ƒ์„ฑ ํ—ˆ์šฉ

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

์˜ˆ๋ฅผ ๋“ค์–ด,

#[crate_type="lib"];

pub struct Foo { x: i16 }

#[no_mangle]
pub extern "C" fn bar(x: u64) -> Foo { ... }

pub fn ignored() { ... } // wrong ABI

์— ํ•ด๋‹นํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

#ifndef FILENAME_H
#define FILENAME_H

#include<stdint.h>

struct Foo {
    int16_t x;
}

struct Foo bar(uint64_t);

#endif

๊ทธ๋ž˜์„œ C์—์„œ Rust๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(์ด๋Š” libclang์„ ์‚ฌ์šฉํ•˜์—ฌ Rustc๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ C ํ—ค๋”๋ฅผ ์ฝ๋Š” ์ œ์•ˆ๋œ #[header="stdio.h"] mod stdio; ๊ธฐ๋Šฅ์˜ ์—ญ ์—ฐ์‚ฐ์ž…๋‹ˆ๋‹ค: https://github.com/mozilla/rust/issues/2124)

A-ffi C-enhancement

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

์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์˜ ์ตœ์ฒจ๋‹จ ๊ธฐ์ˆ ์€ ๋…น์Šจ ์ฒด๋‹ค์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค: https://github.com/Sean1708/rusty-cheddar

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

์ด์™€ ๊ด€๋ จํ•˜์—ฌ rust.h ๊ฐ€ ์žˆ์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

typedef struct {
  void *data;
  uintptr_t len;
} RustSlice;

typedef struct {
  uintptr_t len;
  uintptr_t alloc;
  uint8_t data[0];
} RustString;

๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์œ ์šฉํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ •์˜.

์ด๊ฒƒ์— ๋Œ€ํ•œ ์–ด๋ ค์šด ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๋Š” FFI ์œ ํ˜•์˜ C ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. C์—์„œ ์ด๋“ค๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ •๋ง ์ข‹๊ฒ ์ง€๋งŒ ์ตœ์ ํ™”๋Š” ๋„ ์ž…๋ ฅ ๊ฐ€๋Šฅ ํฌ์ธํ„ฐ์™€ ํŒ๋ณ„ ํฌ๊ธฐ๋กœ ์ธํ•ด FFI ์œ ํ˜•์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

:+1:

https://gist.github.com/alexcrichton/4ea33d9a8b19ed15a65a ์—์„œ ์ด๊ฒƒ์˜ ๋ฒ„์ „์„ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ธํ”„๋ผ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

@alexcrichton ์ •๋ง ๋ฉ‹์ง€๋„ค์š”. ๋„ˆ๋น„๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ณ  char ์˜ ๋ถ€ํ˜ธ๊ฐ€ ์ •์˜๋œ ๊ตฌํ˜„์ด๋ฏ€๋กœ ์ •์ˆ˜ ์œ ํ˜•์„ ์ธ์‡„ํ•˜๊ธฐ ์œ„ํ•ด stdint.h typedef๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/๋‚˜๋ฅผ ์ฐธ์กฐ

bindgen์€ ์ด ์ค‘ ์ผ๋ถ€๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ rust.h ๋Š” Rust๋กœ FFIingํ•˜๋Š” ๋ฐ ํ™•์‹คํžˆ ์ข‹์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘: ์›, bindgen์ด ๋‘˜ ๋‹ค ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @huonw ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

(์˜คํ”„ํ† ํ”ฝ, ์ผ์ข…์˜: Bindgen์€ ์ ์ ˆํ•œ Rust ์ƒ์ž์กฐ์ฐจ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€๋‚œ๋ฒˆ์— ํ™•์ธํ–ˆ๊ณ  Debian์—์„œ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์€ FFI ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋Š” ๊ณ ํ†ต์œผ๋กœ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค. Rust์˜ ๊ธฐ๋Šฅ์€ ์ฃผ๋กœ ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. bindgen์ด build.rs ์—์„œ ์™„์ „ํžˆ C ํ—ค๋”์—์„œ Rust ์Šคํ…์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ ˆํ•œ Cargo dev-dependencies ํŒจํ‚ค์ง€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. build.rs ). ์—…. ๊ทธ๊ฑด ํšก์„ค์ˆ˜์„ค์ด์—ˆ๋‹ค. : }

์—ฌ๊ธฐ WIP ๋ฌผ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/tomjakubowski/custard/tree/dev ๋‚ด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚จ๊ธด ๊ฒƒ ๊ฐ™์€๋ฐ ๋ฆฌํŒฉํ„ฐ๋ง ์ค‘์ด์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Rustdoc๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค: ์œ ํ˜•์ด ์ง€์ •๋œ AST๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋„๊ตฌ๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ๊ฒƒ์„ ๊ฑธ๋Ÿฌ๋‚ด๊ณ , ์œ ํ˜•์„ ์•ฝ๊ฐ„ ์ •๋ฆฌํ•˜๊ณ , ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค(ํ—ค๋” ํŒŒ์ผ). ์†”์งํžˆ ๋งํ•ด์„œ ์ด๊ฒƒ์„ Rustdoc '๋ฐฑ์—”๋“œ'๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์˜ ์ตœ์ฒจ๋‹จ ๊ธฐ์ˆ ์€ ๋…น์Šจ ์ฒด๋‹ค์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค: https://github.com/Sean1708/rusty-cheddar

๋Ÿฌ์Šคํ‹ฐ์ฒด๋‹ค์™€ ๋Ÿฌ์Šคํ‹ฐ๋ฐ”์ธ๋”๋Š” ์š”์ฆ˜ ๋งŽ์ด ํ™œ๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Rust๊ฐ€ Rust-lang-nursery ๋“ฑ์—์„œ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? @alexcrichton

ํ์‡„; ์ด๊ฒƒ์€ ์™ธ๋ถ€ ๋„๊ตฌ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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