Rust — একটি সিস্টেম প্রোগ্রামিং ভাষা যা কম্পাইল-টাইমে মেমরি নিরাপত্তার নিশ্চয়তা দেয়। Graydon Hoare-এর নেতৃত্বে 2010 সালে Mozilla Research দ্বারা উন্নত। Rust দুর্বলতার সম্পূর্ণ শ্রেণী প্রতিরোধ করে: null পয়েন্টার, ঝুলন্ত রেফারেন্স এবং ডেটা রেস। মোবাইল ডেভেলপমেন্টে, Rust নেটিভ মডিউল, ক্রস-প্ল্যাটফর্ম SDK এবং WebAssembly-এর জন্য ব্যবহৃত হয়। Stack Overflow Survey (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++ প্রতিস্থাপন, হাইব্রিড অ্যাপ্লিকেশনের জন্য WebAssembly। Google AOSP (Android Open Source Project)-এ Bluetooth, Wi-Fi এবং NFC উপাদানের জন্য Rust ব্যবহার করে।
Android-এ ক্রস-কম্পাইলেশনের জন্য টার্গেট টুলচেইন প্রয়োজন: 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
# Android বিল্ডের জন্য cargo-ndk ইনস্টল করা
$ 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!("Processed: {:?}", numbers);
let first = &numbers[0]; // অপরিবর্তনীয় ধার
println!("First: {}", first);
}process_data Vec-এর একটি পরিবর্তনীয় রেফারেন্স নেয় এবং প্রতিটি উপাদান দ্বিগুণ করে। iter_mut() পরিবর্তনীয় রেফারেন্স সহ একটি ইটারেটর ফেরত দেয়। *item অ্যাসাইনমেন্টের জন্য রেফারেন্স ডিরেফারেন্স করে। 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!("Longest: {}", result);
} // string2 এই ব্রেস পর্যন্ত বেঁচে আছে, result ভিতরে বৈধ
// println!("{}", result); // ত্রুটি: string2 মারা গেছে
}Rust Android (.so NDK-এর মাধ্যমে) এবং iOS (.a স্ট্যাটিক লাইব্রেরি)-এর জন্য নেটিভ লাইব্রেরিতে কম্পাইল হয়। Google Android Open Source Project (AOSP)-এ Rust-কে আনুষ্ঠানিকভাবে সমর্থন করে — Rust Bluetooth (ava), DNS-over-HTTP3 এবং CriticalNotification উপাদানের জন্য ব্যবহৃত হয়। Google (2025) অনুযায়ী, Rust Android-এ লক্ষ্যযুক্ত উপাদানে 70% মেমরি দুর্বলতা দূর করেছে।
Android-এর জন্য cargo-ndk ব্যবহৃত হয়, যা নির্বাচিত ABI-র জন্য সঠিক টুলচেইন দিয়ে Cargo-কে মোড়ানো করে। Android-এর জন্য বিল্ড অন্তর্ভুক্ত করে: aarch64-linux-android (64-bit ARM, আধুনিক ডিভাইস), armv7-linux-androideabi (32-bit ARM), 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 — FFI-র জন্য C-সামঞ্জস্যপূর্ণ প্রকার।
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] C-সামঞ্জস্যপূর্ণ ABI-র জন্য নাম ম্যাংলিং নিষ্ক্রিয় করে। extern "C" C কলিং কনভেনশন নির্দিষ্ট করে। unsafe — একটি চিহ্নিতকারী যে Rust-এর বাইরে থেকে কল নিরাপত্তার নিশ্চয়তা দেয় না। std::ptr::copy_nonoverlapping ফলাফল বাইটগুলি আউটপুট বাফারে কপি করে।
Rust ক্রস-প্ল্যাটফর্ম SDK-র জন্য আদর্শ প্রার্থী যা একটি কোডবেস থেকে Android এবং iOS-এ কাজ করে। Mozilla (Firefox), Dropbox (ফাইল সিঙ্ক্রোনাইজেশন) এবং Meta (Libra blockchain)-এর মতো কোম্পানিগুলি তাদের মোবাইল অ্যাপ্লিকেশনের গুরুত্বপূর্ণ উপাদানের জন্য Rust বেছে নিয়েছে।
C++-এর উপর Rust লাইব্রেরির সুবিধা: কম্পাইলার ক্রস-প্ল্যাটফর্ম কোডে মেমরি লিক এবং ডেটা রেসের অনুপস্থিতির নিশ্চয়তা দেয়। Rust-এ একবার লেখা এবং পরীক্ষিত কোড সমস্ত প্ল্যাটফর্মে সমানভাবে কাজ করে। Cargo CMake বা vcpkg ছাড়াই নির্ভরতা নেটিভভাবে পরিচালনা করে।
| লাইব্রেরি/Crate | উদ্দেশ্য |
|---|---|
| tonic | Rust-এ gRPC ক্লায়েন্ট/সার্ভার |
| reqwest | async/await সহ HTTP ক্লায়েন্ট |
| ring | ক্রিপ্টোগ্রাফি (AES, RSA, ECDSA) |
| sqlx | অ্যাসিঙ্ক্রোনাস SQLite, PostgreSQL |
| wasm-bindgen | JavaScript/WASM-এর সাথে Rust ইন্টিগ্রেশন |
| ndk-glue | Rust-এ Android NativeActivity |
| uniffi | Kotlin/Swift-এর জন্য FFI বাইন্ডিং জেনারেশন |
Rust WebAssembly (Wasm)-এ কম্পাইল হয় — একটি বাইনারি ফরম্যাট যা ব্রাউজার এবং মোবাইল ডিভাইসে নির্বাহযোগ্য। Wasm ওয়েব পরিবেশে নিয়ার-নেটিভ পারফরম্যান্স প্রদান করে। মোবাইল ডেভেলপমেন্টে, Wasm হাইব্রিড অ্যাপ্লিকেশন (WebView + Wasm)-এ জটিল গণনার জন্য ব্যবহৃত হয়: 3D রেন্ডারিং, ইমেজ রিকগনিশন, এনক্রিপশন।
wasm-pack Rust কে .wasm-এ কম্পাইল করে এবং JS র্যাপার তৈরি করে। wasm-bindgen Rust ফাংশনকে JavaScript কলের সাথে সংযুক্ত করে। মোবাইল ডিভাইসে, Wasm রানার WebView-এ বা Wasmer/Wasmtime SDK-র মাধ্যমে চলতে পারে।
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] fibonacci ফাংশনের জন্য একটি JavaScript র্যাপার তৈরি করে। ব্রাউজারে, কলটি wasm.fibonacci(10) এর মতো দেখায়। u32/u64 টাইপ স্বয়ংক্রিয়ভাবে Number/BigInt-এ রূপান্তরিত হয়। এই ধরনের ফাংশনের জন্য Wasm মডিউলের ওজন মাত্র ~5 KB — ন্যূনতম ওভারহেড।
FFI (Foreign Function Interface) — অন্যান্য ভাষা থেকে Rust কোড কল করার একটি প্রক্রিয়া। extern "C" এবং #[no_mangle] সহ Rust ফাংশন C-সামঞ্জস্যপূর্ণ ABI-র সাথে এক্সপোর্ট করা হয়। Kotlin থেকে, এই ফাংশনগুলি JNI-র মাধ্যমে কল করা হয়, Swift থেকে — @_cdecl ("name") বা CBridge.h-এর মাধ্যমে।
UniFFI — FFI বাইন্ডিং তৈরি করার জন্য একটি Mozilla টুল। আপনি .udl ফাইলে API বর্ণনা করেন, এবং UniFFI স্বয়ংক্রিয়ভাবে Kotlin এবং Swift র্যাপার তৈরি করে। Firefox Android এবং Firefox iOS-এ Rust উপাদানের জন্য এটি মানক পদ্ধতি।
// UniFFI ইন্টারফেস সহ Rust লাইব্রেরি
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 encrypt পদ্ধতি সহ একটি Kotlin ক্লাস তৈরি করে, যা ByteArray নেয় এবং EncryptedData ফেরত দেয়। Swift-এ, ciphertext (Data) এবং nonce (Data) ক্ষেত্র সহ EncryptedData স্ট্রাক্ট তৈরি হয়। ত্রুটিগুলি Kotlin/Swift ব্যতিক্রমে রূপান্তরিত হয়।
Rust এবং C++ মোবাইল ডেভেলপমেন্টে সিস্টেম প্রোগ্রামিংয়ের জন্য দুটি প্রধান ভাষা। উভয়ই ARM-এর জন্য নেটিভ কোডে কম্পাইল হয় এবং C ABI-র মাধ্যমে FFI সমর্থন করে। মূল পার্থক্য হল মেমরি নিরাপত্তা মডেল: Rust কম্পাইল-টাইমে এটি পরীক্ষা করে, C++ ডেভেলপারের শৃঙ্খলার উপর নির্ভর করে।
| মানদণ্ড | Rust | C++ |
|---|---|---|
| মেমরি নিরাপত্তা | নিশ্চিত (ownership) | ডেভেলপারের দায়িত্ব |
| আবর্জনা সংগ্রহকারী | না (RAII + ownership) | না (ম্যানুয়াল ব্যবস্থাপনা) |
| মেমরি লিক | কম্পাইলার দ্বারা প্রতিরোধিত | সম্ভব (delete ছাড়া new) |
| ডেটা রেস | প্রতিরোধিত (Send + Sync) | সম্ভব |
| Android NDK | cargo-ndk-র মাধ্যমে | CMake / NDK Build-র মাধ্যমে |
| iOS সমর্থন | cargo-lipo + .a | Xcode + .a |
| বিল্ড সিস্টেম | Cargo (অন্তর্নির্মিত) | CMake / Ninja |
| বিল্ড সময় | 2–5 মিনিট (পরিষ্কার) | 5–15 মিনিট (পরিষ্কার) |
| ইকোসিস্টেম | crates.io (200k+ ক্রেট) | vcpkg / Conan (100k+ লাইব্রেরি) |
Rust C++-এর চেয়ে নিরাপদ এবং আরও উৎপাদনশীল — কম্পাইলার সেই ত্রুটিগুলি ধরে যা C++-এ রানটাইমে প্রকাশ পাবে। C++-এর সমৃদ্ধ মোবাইল লাইব্রেরি ইকোসিস্টেম রয়েছে। নতুন প্রকল্পের জন্য, Rust পছন্দনীয়; বিদ্যমান C++ কোড ধীরে ধীরে পোর্ট করা হয়।
সচরাচর জিজ্ঞাসিত প্রশ্ন
প্রধান পার্থক্য হল কম্পাইল-টাইম মেমরি নিরাপত্তা। Rust-এ তার মালিকানা পদ্ধতি এবং borrow checker-এর কারণে কোনো nullptr, ঝুলন্ত পয়েন্টার বা ডেটা রেস নেই। C++ ডেভেলপারের শৃঙ্খলার উপর নির্ভর করে, Rust কম্পাইলার যাচাইয়ের উপর নির্ভর করে।
হ্যাঁ, Android NDK-র মাধ্যমে। Google AOSP (Android Open Source Project)-এ Rust-কে আনুষ্ঠানিকভাবে সমর্থন করে। Rust cargo-ndk-র মাধ্যমে .so লাইব্রেরিতে কম্পাইল হয়। JNI-র মাধ্যমে FFI (Foreign Function Interface) C++-এর মতোই কাজ করে।
Cargo Rust-এর প্যাকেজ ম্যানেজার এবং বিল্ড সিস্টেম। এটি crates.io থেকে নির্ভরতা ডাউনলোড করে, প্রকল্প কম্পাইল করে এবং পরীক্ষা চালায়। মোবাইল ডেভেলপমেন্টে, cargo-ndk Android ABI-র জন্য ক্রস-কম্পাইলেশনের জন্য Cargo-কে প্রসারিত করে।
Rust উভয় প্ল্যাটফর্ম সমর্থন করে। iOS-এর জন্য cargo-lipo ইউনিভার্সাল বাইনারি (arm64 + x86_64 সিমুলেটর) তৈরি করতে ব্যবহৃত হয়। Rust কোড একটি স্ট্যাটিক .a লাইব্রেরিতে কম্পাইল হয় এবং Xcode-র মাধ্যমে লিংক হয়।
হ্যাঁ, Rust ক্রস-প্ল্যাটফর্ম SDK এবং নেটিভ মডিউলের জন্য মানক হয়ে উঠছে। Google, Meta এবং Mozilla Rust-এ বিনিয়োগ করছে। পারফরম্যান্স-সংবেদনশীল উপাদানের জন্য, Rust C++-এর চেয়ে নিরাপদ এবং আরও উৎপাদনশীল।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন