Rust — یک زبان برنامهنویسی سیستمی با تضمین امنیت حافظه در زمان کامپایل است. توسط Mozilla Research در سال ۲۰۱۰ به رهبری گریدون هور توسعه یافت. Rust از کلاسهای کاملی از آسیبپذیریها جلوگیری میکند: اشارهگرهای null، مراجع آویزان و رقابت دادهها. در توسعه موبایل، Rust برای ماژولهای بومی، SDKهای بینپلتفرمی و WebAssembly استفاده میشود. بر اساس نظرسنجی Stack Overflow (2025)، Rust برای نهمین سال متوالی رتبه اول «زبان محبوب» را دارد.
نکات اصلی
Rust — یک زبان برنامهنویسی سیستمی با تایپ ایستا و انتزاع با هزینه صفر (zero-cost abstractions) است. Rust به لطف سیستم مالکیت (ownership)، قرضگیری (borrowing) و طول عمر (lifetimes) امنیت حافظه را بدون زبالهروب تضمین میکند. کامپایلر Rust یکی از سختگیرانهترینهاست — کدی را که در C++ رفتار نامعین ایجاد میکند رد میکند.
Rust از طریق LLVM به کد بومی برای تمام معماریها کامپایل میشود: ARM، x86، RISC-V، WebAssembly. ابزارها: rustup (نصبکننده)، rustc (کامپایلر)، cargo (مدیر بسته و سیستم ساخت). cargo.toml — مشابه package.json، شامل وابستگیهای crates.io است. نسخه فعلی — Rust 1.81 (2025).
حوزههای کلیدی کاربرد Rust در توسعه موبایل: کتابخانههای بومی (Android NDK, iOS)، SDKهای بینپلتفرمی (Firefox, Dropbox)، جایگزینی C++ در بخشهای performance-critical، WebAssembly برای برنامههای ترکیبی. Google از Rust در AOSP (Android Open Source Project) برای کامپوننتهای Bluetooth، Wi-Fi و NFC استفاده میکند.
برای کامپایل متقاطع برای Android به toolchainهای هدف نیاز است: rustup target add aarch64-linux-android armv7-linux-androideabi. برای iOS — aarch64-apple-ios x86_64-apple-ios. cargo-ndk (برای Android) و cargo-lipo (برای iOS) ساخت را ساده میکنند.
# نصب Rust و پلتفرمهای هدف برای توسعه موبایل
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ rustup target add aarch64-linux-android
$ rustup target add armv7-linux-androideabi
$ rustup target add aarch64-apple-ios
$ rustup target add x86_64-apple-ios
# نصب cargo-ndk برای ساخت Android
$ cargo install cargo-ndk
# ساخت برای Android
$ cargo ndk -t arm64-v8a -o ./jniLibs build --releaseOwnership (مالکیت) — مفهوم بنیادین Rust. هر مقدار دقیقاً یک مالک دارد. هنگام انتساب یا ارسال به تابع، مالکیت منتقل میشود (move). پس از انتقال، مالک قدیمی نمیتواند از مقدار استفاده کند. این کار آزادسازی دوگانه حافظه و اشارهگرهای آویزان را حذف میکند.
Borrowing (قرضگیری) امکان استفاده موقت از مرجع به یک مقدار بدون انتقال مالکیت را فراهم میکند. مرجع &T (تغییرناپذیر) — هر تعداد خواننده. مرجع &mut T (تغییرپذیر) — دقیقاً یک نویسنده، بدون خواننده. کامپایلر این قوانین را در مرحله ساخت بررسی میکند.
fn process_data(data: &mut Vec<i32>) {
for item in data.iter_mut() {
*item *= 2;
}
}
fn main() {
let mut numbers = vec![1, 2, 3, 4, 5];
process_data(&mut numbers);
println!("پردازش شد: {:?}", numbers);
let first = &numbers[0]; // قرضگیری تغییرناپذیر
println!("اولین: {}", first);
}process_data یک مرجع تغییرپذیر به Vec دریافت میکند و هر عنصر را دو برابر میکند. iter_mut() یک تکرارکننده با مراجع تغییرپذیر برمیگرداند. *item مرجع را برای انتساب dereference میکند. بعد از process_data، numbers همچنان قابل دسترس است — مالکیت منتقل نشده، فقط قرض داده شده است.
Lifetimes ('a) — حاشیهنویسیهایی برای پیوند طول عمر مراجع. کامپایلر از آنها برای بررسی این که مرجع از دادهای که به آن اشاره میکند بیشتر عمر نمیکند استفاده میکند. در بیشتر موارد lifetimes به طور خودکار استنتاج میشوند — فقط در امضای توابع با مراجع باید آنها را مشخص کرد.
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
fn main() {
let string1 = String::from("rust");
let result;
{
let string2 = String::from("mobile");
result = longest(string1.as_str(), string2.as_str());
println!("طولانیترین: {}", result);
} // string2 تا این براکت زنده است، result در داخل معتبر است
// println!("{}", result); // خطا: string2 مرد
}Rust به کتابخانههای بومی برای Android (.so از طریق NDK) و iOS (.a کتابخانههای ایستا) کامپایل میشود. Google به طور رسمی از Rust در Android Open Source Project (AOSP) پشتیبانی میکند — کامپوننتهای Bluetooth (ava)، DNS-over-HTTP3 و CriticalNotification در Rust نوشته شدهاند. طبق Google (2025)، Rust در Android آسیبپذیریهای حافظه را در کامپوننتهای هدف ۷۰٪ کاهش داد.
برای Android از cargo-ndk استفاده میشود که Cargo را با toolchain مناسب برای ABI انتخاب شده میپیچد. ساخت برای Android شامل: aarch64-linux-android (ARM 64-bit، دستگاههای مدرن)، armv7-linux-androideabi (ARM 32-bit)، x86_64-linux-android (شبیهسازها).
// Cargo.toml — پیکربندی کتابخانه برای Android/iOS
[package]
name = "mobile_crypto"
version = "0.1.0"
[lib]
crate-type = ["staticlib", "cdylib"]
[dependencies]
serde = { version = "1", features = ["derive"] }
libc = "0.2"crate-type: staticlib — برای iOS (.a)، cdylib — برای Android (.so). serde — سریالسازی برای تبادل داده با Kotlin/Swift. libc — انواع سازگار با C برای FFI.
use std::ffi::{CStr, CString};
use std::os::raw::c_char;
/// تابع سازگار با C برای پردازش تصویر
#[no_mangle]
pub unsafe extern "C" fn process_image(
input: *const u8,
len: usize,
output: *mut u8,
out_len: *mut usize,
) {
let input_slice = std::slice::from_raw_parts(input, len);
let result: Vec<u8> = input_slice.iter()
.map(|b| b ^ 0xFF)
.collect();
let result_len = result.len();
std::ptr::copy_nonoverlapping(result.as_ptr(), output, result_len);
*out_len = result_len;
}#[no_mangle] name mangling را برای ABI سازگار با C غیرفعال میکند. extern "C" قرارداد فراخوانی C را تنظیم میکند. unsafe — نشانگر این که فراخوانی از خارج Rust امنیت را تضمین نمیکند. std::ptr::copy_nonoverlapping بایتهای نتیجه را در بافر خروجی کپی میکند.
Rust — نامزد ایدهآل برای SDKهای بینپلتفرمی است که از یک پایه کد روی Android و iOS کار میکنند. شرکتهای Mozilla (Firefox)، Dropbox (همگامسازی فایل) و Meta (Libra blockchain) Rust را برای کامپوننتهای حیاتی برنامههای موبایل خود انتخاب کردهاند.
مزایای کتابخانه Rust در مقایسه با C++: کامپایلر عدم وجود نشت حافظه و رقابت دادهها را در کد بینپلتفرمی تضمین میکند. کد نوشته شده و تست شده در Rust روی همه پلتفرمها یکسان کار میکند. Cargo وابستگیها را به صورت بومی و بدون CMake و vcpkg مدیریت میکند.
| کتابخانه/Crate | کاربرد |
|---|---|
| tonic | کلاینت/سرور gRPC در Rust |
| reqwest | کلاینت HTTP با async/await |
| ring | رمزنگاری (AES, RSA, ECDSA) |
| sqlx | کار ناهمگام با SQLite, PostgreSQL |
| wasm-bindgen | ادغام Rust با JavaScript/WASM |
| ndk-glue | Android NativeActivity در Rust |
| uniffi | تولید پیوندهای FFI برای Kotlin/Swift |
Rust به WebAssembly (Wasm) — فرمت باینری قابل اجرا در مرورگر و دستگاههای موبایل کامپایل میشود. Wasm عملکرد near-native را در محیط وب فراهم میکند. در توسعه موبایل، Wasm در برنامههای ترکیبی (WebView + Wasm) برای محاسبات پیچیده استفاده میشود: رندرینگ سهبعدی، تشخیص تصویر، رمزنگاری.
wasm-pack Rust را به .wasm کامپایل کرده و یک لفافه JS تولید میکند. wasm-bindgen توابع Rust را با فراخوانیهای JavaScript مرتبط میکند. در دستگاه موبایل، Wasm-runner میتواند در WebView یا از طریق SDKهای Wasmer/Wasmtime اجرا شود.
use wasm_bindgen::prelude::*;
/// محاسبه عدد فیبوناچی در Wasm (فراخوانی شده از JS)
#[wasm_bindgen]
pub fn fibonacci(n: u32) -> u64 {
match n {
0 => 0,
1 => 1,
_ => {
let mut a = 0;
let mut b = 1;
for _ in 2..=n {
let temp = a + b;
a = b;
b = temp;
}
b
}
}
}#[wasm_bindgen] یک لفافه JavaScript برای تابع fibonacci تولید میکند. در مرورگر، فراخوانی به صورت wasm.fibonacci(10) دیده میشود. انواع u32/u64 به طور خودکار به Number/BigInt تبدیل میشوند. ماژول Wasm برای چنین تابعی ~۵ کیلوبایت وزن دارد — سربار حداقلی.
FFI (Foreign Function Interface) — مکانیزم فراخوانی کد Rust از زبانهای دیگر است. توابع Rust با extern "C" و #[no_mangle] با ABI سازگار با C صادر میشوند. از Kotlin چنین توابعی از طریق JNI و از Swift از طریق @_cdecl ("name") یا CBridge.h فراخوانی میشوند.
UniFFI — ابزار Mozilla برای تولید پیوندهای FFI. API را در فایل .udl توصیف میکنید، UniFFI به طور خودکار لفافههای Kotlin و Swift را تولید میکند. این رویکرد استاندارد برای کامپوننتهای Rust در Firefox Android و Firefox iOS است.
// کتابخانه Rust با رابط UniFFI
uniffi::setup_scaffolding!();
#[derive(uniffi::Enum)]
pub enum EncryptionError {
InvalidKey,
EncryptionFailed,
}
#[derive(uniffi::Record)]
pub struct EncryptedData {
pub ciphertext: Vec<u8>,
pub nonce: Vec<u8>,
}
#[uniffi::export]
pub fn encrypt(key: &[u8], plaintext: &[u8]) -> Result<EncryptedData, EncryptionError> {
// پیادهسازی AES-256-GCM
todo!()
}UniFFI یک کلاس Kotlin با متد encrypt تولید میکند که ByteArray دریافت کرده و EncryptedData برمیگرداند. در Swift یک struct EncryptedData با فیلدهای ciphertext (Data) و nonce (Data) ایجاد میشود. خطاها به استثناهای Kotlin/Swift تبدیل میشوند.
Rust و C++ — دو زبان اصلی برای برنامهنویسی سیستمی در توسعه موبایل هستند. هر دو به کد بومی برای ARM کامپایل میشوند و FFI را از طریق C ABI پشتیبانی میکنند. تفاوت اصلی — مدل امنیت حافظه: Rust آن را در زمان کامپایل بررسی میکند، C++ به انضباط برنامهنویس متکی است.
| معیار | Rust | C++ |
|---|---|---|
| امنیت حافظه | تضمین شده (ownership) | مسئولیت برنامهنویس |
| زبالهروب | خیر (RAII + ownership) | خیر (مدیریت دستی) |
| نشت حافظه | جلوگیری شده توسط کامپایلر | ممکن (new بدون delete) |
| رقابت دادهها | جلوگیری شده (Send + Sync) | ممکن |
| Android NDK | از طریق cargo-ndk | از طریق CMake / NDK Build |
| پشتیبانی iOS | cargo-lipo + .a | Xcode + .a |
| ساخت | Cargo (داخلی) | CMake / Ninja |
| زمان ساخت | ۲–۵ دقیقه (clean) | ۵–۱۵ دقیقه (clean) |
| اکوسیستم | crates.io (۲۰۰k+ کریت) | vcpkg / Conan (۱۰۰k+ کتابخانه) |
Rust از C++ امنتر و پربازدهتر است — کامپایلر خطاهایی را میگیرد که در C++ در زمان اجرا ظاهر میشدند. C++ اکوسیستم غنیتری از کتابخانههای موبایل دارد. برای پروژههای جدید Rust ترجیح داده میشود؛ کد C++ موجود به تدریج منتقل میشود.
سؤالات متداول
تفاوت اصلی — امنیت حافظه در زمان کامپایل است. در Rust به لطف سیستم مالکیت (ownership) و borrow checker، nullptr، اشارهگرهای آویزان و رقابت دادهها وجود ندارد. C++ به انضباط برنامهنویس متکی است، Rust — به بررسیهای کامپایلر.
بله، از طریق Android NDK. Google به طور رسمی از Rust در AOSP (Android Open Source Project) پشتیبانی میکند. Rust از طریق cargo-ndk به کتابخانههای .so کامپایل میشود. FFI (Foreign Function Interface) از طریق JNI دقیقاً مانند C++ کار میکند.
Cargo — مدیر بسته و سیستم ساخت Rust است. وابستگیها را از crates.io دانلود میکند، پروژه را کامپایل کرده و تستها را اجرا میکند. در توسعه موبایل، cargo-ndk Cargo را برای کامپایل متقاطع برای Android ABI گسترش میدهد.
Rust از هر دو پلتفرم پشتیبانی میکند. برای iOS از cargo-lipo برای باینریهای جهانی (arm64 + x86_64 شبیهساز) استفاده میشود. کد Rust به کتابخانه ایستا .a کامپایل شده و از طریق Xcode لینک میشود.
بله، Rust در حال تبدیل شدن به استانداردی برای SDKهای بینپلتفرمی و ماژولهای بومی است. Google، Meta و Mozilla روی Rust سرمایهگذاری میکنند. برای کامپوننتهای performance-critical، Rust از C++ امنتر و پربازدهتر است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید