Rust: Cμ—μ„œ ν˜ΈμΆœν•  수 μžˆλŠ” Rust ν•¨μˆ˜

에 λ§Œλ“  2012λ…„ 02μ›” 02일  Β·  16μ½”λ©˜νŠΈ  Β·  좜처: rust-lang/rust

바인딩을 λ§Œλ“œλŠ” μ‚¬λžŒλ“€μ΄ 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 ABI ν•¨μˆ˜ 생성
  • κ΅¬μ‘°μ²΄μ—μ„œ C 인수λ₯Ό μ‚¬μš©ν•˜λŠ” shim ν•¨μˆ˜ 생성
  • C ν•¨μˆ˜λŠ” 인수λ₯Ό ꡬ쑰체에 λ„£μŠ΅λ‹ˆλ‹€.
  • C ν•¨μˆ˜λŠ” 인수 ꡬ쑰와 shim ν•¨μˆ˜μ˜ μ£Όμ†Œλ₯Ό μ‚¬μš©ν•˜μ—¬ upcall_call_shim_on_rust_stack을 ν˜ΈμΆœν•©λ‹ˆλ‹€.
  • μ„ μ–Έλœ μ„œλͺ…을 μ‚¬μš©ν•˜μ—¬ Rust ABI ν•¨μˆ˜ 생성
  • shim ν•¨μˆ˜λŠ” κ΅¬μ‘°μ²΄μ—μ„œ 인수λ₯Ό κ°€μ Έμ˜€κ³  Rust ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

λŸ°νƒ€μž„ κ΅¬ν˜„:

이λ₯Ό μœ„ν•΄ λŸ°νƒ€μž„μ€ λͺ‡ 가지 λ°©μ‹μœΌλ‘œ λ³€κ²½λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

  • Rust μŠ€νƒμœΌλ‘œ λ‹€μ‹œ μ „ν™˜ν•˜κΈ° μœ„ν•œ μƒˆλ‘œμš΄ 상ν–₯ 호좜
  • νƒœμŠ€ν¬λŠ” Rust μ»¨ν…μŠ€νŠΈμ™€ C μ»¨ν…μŠ€νŠΈ μŠ€νƒμ„ μœ μ§€ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • Rust μŠ€νƒμ— μž¬μ§„μž…ν•œ ν›„ μ‹€νŒ¨λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ „λž΅μ΄ ν•„μš”ν•©λ‹ˆλ‹€.
  • Rust μŠ€νƒμ— μž¬μ§„μž…ν•œ ν›„ yielding을 μ²˜λ¦¬ν•˜λŠ” μ „λž΅μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

μ‹€νŒ¨:

λ„€μ΄ν‹°λΈŒ μ½”λ“œκ°€ C++ μ˜ˆμ™Έλ‘œ 풀릴 수 μžˆλ‹€λŠ” 보μž₯이 μ—†κΈ° λ•Œλ¬Έμ— Rust μŠ€νƒμ— λ‹€μ‹œ λ“€μ–΄κ°„ 후에 λ‹¨μˆœνžˆ μ˜ˆμ™Έλ₯Ό 던질 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. Go μ–Έμ–΄λŠ” λΆ„λͺ…νžˆ 이 μ‹œλ‚˜λ¦¬μ˜€μ—μ„œ λͺ¨λ“  κΈ°λ³Έ ν”„λ ˆμž„μ„ κ±΄λ„ˆλ›°κ³  λͺ¨λ“  것을 λˆ„μΆœν•©λ‹ˆλ‹€. λŒ€μ‹  쀑단할 κ²ƒμž…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ 치λͺ…적인 μ‹€νŒ¨λ₯Ό ν”Όν•˜λ €λ©΄ Rust μ½œλ°±μ„ μ‚¬μš©ν•˜μ—¬ λ©”μ‹œμ§€λ₯Ό μ „λ‹¬ν•˜κ³  μ¦‰μ‹œ λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

꡽힐 수 μžˆλŠ”:

C μŠ€νƒμ„ μ²˜λ¦¬ν•˜λŠ” 방식을 λ³€κ²½ν•˜μ§€ μ•Šκ³ μ„œλŠ” Rust ν•¨μˆ˜κ°€ C μ½”λ“œμ—μ„œ Rust μŠ€νƒμ— λ‹€μ‹œ λ“€μ–΄κ°„ ν›„ μŠ€μΌ€μ€„λŸ¬λ‘œ μ»¨ν…μŠ€νŠΈ μ „ν™˜ν•˜λŠ” 것을 ν—ˆμš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 두 가지 μ†”λ£¨μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

1) 러슀트 μŠ€νƒμ— μž¬μ§„μž…ν•œ ν›„ 수읡λ₯ μ΄ 달라지며 λ‹¨μˆœνžˆ μ°¨λ‹¨ν•©λ‹ˆλ‹€. 이λ₯Ό μˆ˜ν–‰ν•˜λ €λŠ” μž‘μ—…μ€ 자체 μŠ€μΌ€μ€„λŸ¬(#1721)κ°€ μžˆλŠ”μ§€ 확인해야 ν•©λ‹ˆλ‹€.
2) μŠ€μΌ€μ€„λŸ¬μ˜ μŠ€νƒμ„ μ‚¬μš©ν•˜μ—¬ λ„€μ΄ν‹°λΈŒ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” λŒ€μ‹  νƒœμŠ€ν¬λŠ” 각 μŠ€μΌ€μ€„λŸ¬μ— μžˆλŠ” ν’€μ—μ„œ C μŠ€νƒμ„ μ²΄ν¬μ•„μ›ƒν•©λ‹ˆλ‹€. μž‘μ—…μ΄ C μŠ€νƒμ— λ‹€μ‹œ λ“€μ–΄κ°ˆ λ•Œλ§ˆλ‹€ 이미 μŠ€νƒμ΄ μžˆλŠ”μ§€ ν™•μΈν•˜κ³  λ‹€μ‹œ μ‚¬μš©ν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ μŠ€μΌ€μ€„λŸ¬μ—μ„œ μƒˆ μŠ€νƒμ„ μš”μ²­ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ 러슀트 μ½”λ“œκ°€ μŠ€μΌ€μ€„λŸ¬λ₯Ό 묢지 μ•Šκ³ λ„ 항상 μ •μƒμ μœΌλ‘œ 양보할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 두 번째 μ˜΅μ…˜μ„ μ„ ν˜Έν•©λ‹ˆλ‹€.

μ°Έμ‘° #1508

A-debuginfo A-runtime A-typesystem E-easy

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 λΆ€ν™œμ„ μš©μ„œν•΄ μ£Όμ„Έμš”. ν•˜μ§€λ§Œ 이 λ¬Έμ œλŠ” 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());
}

λͺ¨λ“  16 λŒ“κΈ€

μ—¬κΈ°λ‘œ λ›°μ–΄λ“€μ–΄μ„œ μ£„μ†‘ν•˜μ§€λ§Œ 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());
}
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰