Rust بهعنوان یک زبان سیستمی، ابزارهای قدرتمندی برای مدیریت مستقیم حافظه و ارتباط با کدهای سطح پایین فراهم میکند. در این بخش با اشارهگرهای هوشمند (Smart Pointers)، کدهای unsafe و اتصال به زبانهای C/C++ (FFI) آشنا میشویم.
Rust بهجای اشارهگرهای خام، اشارهگرهای هوشمند (Smart Pointers) ارائه میدهد که مدیریت ایمن و منعطف حافظه را ممکن میکنند.
Box
- برای ذخیره دادهها در heap استفاده میشود.
- سایز نوعهای بازگشتی یا دادههای بزرگ را کنترل میکند.
let b = Box::new(10);println!("Box contains: {}", b);
Box داده را در heap قرار میدهد اما مالکیت را همچنان بهصورت ایمن مدیریت میکند.
Rc
- مرجعشمار (Reference Counted) برای اشتراکگذاری دادهها بین چند مالک.
- فقط برای دادههای خواندنی (immutable) مناسب است.
use std::rc::Rc;let a = Rc::new(5);let b = Rc::clone(&a);println!("a: {}, b: {}", a, b);
use std::cell::RefCell;let data = RefCell::new(10);*data.borrow_mut() += 5;println!("data: {:?}", data.borrow());
Rust بهطور پیشفرض ایمنی حافظه را تضمین میکند، اما گاهی نیاز به کارهای سطح پایین داریم (مثل کار با اشارهگر خام یا ارتباط با کدهای C).
کد unsafe امکان:
- دسترسی به اشارهگر خام
- فراخوانی توابع unsafe
- تغییر دادههای immutable
- فراخوانی کد C
را میدهد.
let x: i32 = 10;let r: *const i32 = &x;
unsafe {println!("مقدار x از طریق اشارهگر: {}", *r);}
در بلاک unsafe، مسئولیت ایمنی با برنامهنویس است.
Rust بهراحتی میتواند با کدهای C (و با کمی کار اضافی، C++) ارتباط برقرار کند. این ویژگی برای نوشتن درایورها، کتابخانههای سیستمی یا استفاده از کتابخانههای موجود ضروری است.
تعریف تابع C:
فرض کنید یک تابع C دارید:
// example.cint add(int a, int b) {return a + b;}
در Rust:
extern "C" {fn add(a: i32, b: i32) -> i32;}fn main() {unsafe {let sum = add(3, 4);println!("نتیجه: {}", sum);}}
برای استفاده از این کد باید در زمان build لینک به کتابخانه C انجام شود.
در این بخش یاد گرفتیم:
- چطور با Smart Pointers مانند Box, Rc, و RefCell حافظه را بهصورت ایمن و منعطف مدیریت کنیم.
- چگونه از unsafe Rust برای دسترسی سطح پایین و کار با اشارهگرهای خام استفاده کنیم.
- و چطور با استفاده از FFI کدهای Rust را به کتابخانههای C/C++ متصل کنیم.
در ادامه به مباحث همزمانی و async در Rust خواهیم پرداخت.