Rust: مقدمة إلى لغة «Rust» وإعداد بيئة التطوير
لغة «Rust» هي لغة تمكّن الجميع من تطوير برامج موثوقة وفعالة — فهي لا تعتمد على آلية جمع القمامة، ومع ذلك تضمن أمان الذاكرة.
يستهدف هذا الدليل التعليمي المطورين الذين يمتلكون معرفة أساسية بلغة برمجة واحدة على الأقل. وسواء كانت خلفيتك في لغة C/C++ أو Java أو Python أو JavaScript، فإن نظام الملكية في Rust والتجريدات ذات التكلفة الصفرية ستغير مفهومك عن «الأمان». وقد تم اختيار Rust كـ«لغة البرمجة الأكثر شعبية» في استطلاع المطورين الذي أجرته Stack Overflow لعدة سنوات متتالية.
1. ما ستتعلمه
- ما هو «Rust»؟ فلسفته التصميمية الأساسية
- الاختلافات بين لغات «Rust» و«C/C++/Go»، وحالات الاستخدام المناسبة لكل منها
- تثبيت Rust على أنظمة التشغيل Windows أو macOS أو Linux باستخدام rustup
- إنشاء المشاريع وتطويرها وتشغيلها باستخدام Cargo
- اكتب برنامجك الأول بلغة Rust وقم بتشغيله
- منظومة Rust (crates.io والمكتبة القياسية)
2. قصة مبرمج أنظمة
(1) العذاب: كابوس لغة البرمجة C
توم مهندس أنظمة مدمجة. وفي أحد الأيام، كُلف بمهمة عاجلة:
"تقليل استهلاك الذاكرة لهذه الخدمة الإلكترونية من 300 ميغابايت إلى أقل من 50 ميغابايت، مع ضمان عدم تعطلها أبدًا."
وقد طوره بلغة البرمجة C ووجد أن:
- تؤدي إدارة الذاكرة يدويًّا إلى وجود أكثر من 30 مثيلًا لـ
mallocوfreeفي الكود؛ فإذا قمت بتصحيح أحدها، فقد تنسى الآخر. - تسبب مؤشر فارغ في تعطل الخدمة عبر الإنترنت مرتين في الأسبوع، وقد استيقظت في منتصف الليل لإصلاح المشكلة
- تجاوز سعة المخزن المؤقت — اتصل فريق الأمن ليقول: «هناك خطر وقوع هجوم عن بُعد».
- كتابة الاختبارات؟ في لغة C، يتعين عليك إعداد إطار عمل الاختبار الخاص بك، ويستغرق الأمر يومين لتشغيل نظام التكامل المستمر (CI).
ماذا اختار في النهاية؟ لقد تحول إلى Rust.
(2) حل Rust
بالنسبة للمهمة نفسها، كتب توم ما يلي بلغة Rust:
fn main() {
let msg = String::from("Hello, secure world!");
// Compiler Guarantees: msg memory is automatically released when it goes out of scope.
// Not necessary malloc, nor free
println!("{}", msg);
}
الوقت الإجمالي: تمت الترجمة بنجاح = آمن. يكتشف مُترجم لغة Rust أخطاء الذاكرة أثناء الترجمة. لا حاجة إلى Valgrind ولا إلى Sanitizer — إذا تمت الترجمة، فهذا يعني أن البرنامج آمن.
هذا هو جمال لغة Rust: القضاء على أخطاء الذاكرة في مرحلة الترجمة دون أي عبء إضافي على وقت التشغيل. وتقوم فلسفة تصميمها على مبدأ أن «الأمان لا يتحقق من خلال توخي المطور للحذر، بل يضمنه المُترجم».
3. ما هو Rust؟
Rust هي لغة برمجة على مستوى النظام أنشأها في عام 2015 الباحث في مؤسسة Mozilla Graydon Hoare، وقد صُممت في الأصل لمحرك متصفح Firefox.
(1) المبادئ الأساسية الثلاثة لـ Rust
graph LR
A[Rust Three Major Commitments] --> B[Zero-Cost Abstraction]
A --> C[Memory Safety]
A --> D[Concurrency-Safe]
B --> E[Expressiveness of High-Level Languages<br>Assembly-Level Performance]
C --> F[Ownership + Borrow<br>Eliminating Memory Errors at Compile Time]
D --> G[Send+Sync trait<br>Data race detected at compile time]
| الفئة | الوصف |
|---|---|
| التجريد بدون تكلفة | قدرة اللغات عالية المستوى على التعبير، وأداء لغة التجميع. بدون أي عبء إضافي أثناء التشغيل |
| ضمانات أمان الذاكرة | الملكية + الاستعارة + دورة الحياة؛ يضمن المُجمِّع في وقت التجميع عدم وجود مؤشرات فارغة، ولا مؤشرات عشوائية، ولا تضارب في الوصول إلى البيانات |
| التزامن الآمن | تتيح سمات «Send» و«Sync» اكتشاف أخطاء التزامن في مرحلة التحويل البرمجي |
(2) Rust مقابل C/C++ مقابل Go
| البعد | C/C++ | Go | Rust |
|---|---|---|---|
| إدارة الذاكرة | استخدام malloc/free يدويًا | GC (جمع القمامة) | فحوصات الملكية + الاستعارة (في وقت التحويل البرمجي) |
| الأداء | عالٍ جدًّا | عالٍ (مع فترات توقف بسبب جمع القمامة) | عالٍ جدًّا (بدون وقت تشغيل) |
| الالتزام بالأمان | لا شيء (يعتمد على المبرمجين) | جزئي (تمنع آلية التجميع التلقائي (GC) حدوث تسربات الذاكرة) | كامل (مضمون في وقت التحويل البرمجي) |
| نموذج التزامن | pthreads (دليل) | goroutine + قناة | std::thread + سمة Send/Sync |
| إدارة الحزم | Makefile / CMake | go mod | Cargo (جاهز للاستخدام) |
| منحنى التعلم | متوسط إلى مرتفع (قد تكون التلميحات مزعجة) | منخفض | متوسط إلى مرتفع (أداة التحقق من الاستعارة) |
4. تثبيت Rust
(1) التثبيت باستخدام rustup
الطريقة الموصى بها لتثبيت Rust هي من خلال rustup، وهي أداة لإدارة إصدارات Rust.
# Run in the terminal (Windows requires Visual Studio C++ Build Tools to be installed first)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
بعد التثبيت، تحقق من الإصدار:
rustc --version # Output: rustc 1.86.0 (05f9846f8 2025-03-31)
cargo --version # Output: cargo 1.86.0 (version number)
(2) ملاحظات خاصة بنظام ويندوز
يجب على مستخدمي Windows أولاً تثبيت Visual Studio Build Tools (أو Visual Studio 2019 أو إصدار أحدث) واختيار حزمة العمل "التطوير على سطح المكتب باستخدام C++". تعتمد لغة Rust على أداة الربط MSVC.
(3) التحديث وإلغاء التثبيت
rustup update # Update to the latest version
rustup self uninstall # Uninstall (for cache retention, use uninstall rather than directly deleting the directory)
5. برنامجك الأول بلغة Rust
(1) ▶ المثال:Hello World (مستوى الصعوبة ⭐)
// ============================================
// First Rust Program: Print Hello World
// ============================================
fn main() {
println!("Hello, world!");
}
الناتج:
Hello, world!
fn main()هي نقطة الدخول لكل برنامج مكتوب بلغة Rust.println!هي ماكرو (انظر!) تُستخدم لعرض النص على شاشة المحطة الطرفية.
(2) ▶ المثال:إنشاء مشروع باستخدام Cargo (مستوى الصعوبة ⭐)
# Create a New Project
cargo new hello_cargo
cd hello_cargo
سيُنتج cargo new البنية التالية:
hello_cargo/
├── Cargo.toml # Project Configuration File (Dependencies, Metadata)
├── src/
│ └── main.rs # Source Code Entry Point
Cargo.toml المحتوى:
[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
التجميع والتشغيل:
cargo build # Compilation (generates target/debug/ directory)
cargo run # Compilation + Run
الناتج:
Hello, world!
Cargo هو مدير الحزم ونظام البناء في Rust.
cargo buildيُنشئ نسخة تجريبية للتصحيح؛cargo runيُترجم البرنامج ويُشغّله بأمر واحد؛cargo checkيُجري فحصًا لنحو البرنامج فقط دون إنشاء ملف ثنائي (أسرع).
(3) ▶ المثال:آلة حاسبة بسيطة (مستوى الصعوبة ⭐⭐)
// ============================================
// A Simple Addition Calculator
// ============================================
fn main() {
let a: i32 = 10; // i32 is a 32-bit signed integer
let b: i32 = 20; // Rust type annotations use a colon
let sum = a + b;
println!("{} + {} = {}", a, b, sum);
}
الناتج:
10 + 20 = 30
المتغيرات في لغة Rust غير قابلة للتغيير افتراضيًّا. هنا، يتم إعلانها باستخدام
let؛ وإذا احتجت إلى تعديل قيمها لاحقًا، فيجب عليك استخدامlet mut. أما تعليقات الأنواع: i32فهي اختيارية — حيث يمكن للمترجم استنتاج النوع من السياق.
(4) ▶ المثال:تمرين شامل — تحويل درجات الحرارة وتقديم النتائج (مستوى الصعوبة ⭐⭐)
// ============================================
// Comprehensive Example: Temperature Conversion + Simple Report Generation
// Demo Variables, Types, Basic Syntax, Such as Formatted Output
// ============================================
fn celsius_to_fahrenheit(celsius: f64) -> f64 {
celsius * 9.0 / 5.0 + 32.0
}
fn fahrenheit_to_celsius(fahrenheit: f64) -> f64 {
(fahrenheit - 32.0) * 5.0 / 9.0
}
fn main() {
let cities = ["Beijing", "Shanghai", "Guangzhou"];
let temps_c = [28.5, 31.2, 33.8];
println!("=== City Temperature Report ===");
println!("{:<12} {:>10} {:>10}", "City", "Celsius(°C)", "Fahrenheit(°F)");
println!("{}", "-".repeat(34));
let mut index = 0;
while index < cities.len() {
let c = temps_c[index];
let f = celsius_to_fahrenheit(c);
println!("{:<12} {:>10.1} {:>10.1}", cities[index], c, f);
index += 1;
}
let freezing_f: f64 = 32.0;
let freezing_c = fahrenheit_to_celsius(freezing_f);
println!("\nFreezing Point: {:.1}°F = {:.1}°C", freezing_f, freezing_c);
const BOILING_C: f64 = 100.0;
let boiling_f = celsius_to_fahrenheit(BOILING_C);
println!("Boiling Point: {:.1}°C = {:.1}°F", BOILING_C, boiling_f);
}
الناتج:
=== City Temperature Report ===
City Celsius(°C) Fahrenheit(°F)
----------------------------------
Beijing 28.5 83.3
Shanghai 31.2 88.2
Guangzhou 33.8 92.8
Freezing Point: 32.0°F = 0.0°C
Boiling Point: 100.0°C = 212.0°F
يغطي هذا المثال الشامل تعريفات الدوال، وإعلانات الثوابت، والتكرار على المصفوفات، والإخراج المنسق، وصيغ تحويل درجات الحرارة، مما يوفر شرحًا تفصيليًّا كاملاً لقواعد اللغة الأساسية في Rust.
(5) ▶ المثال:لعبة «خمن الرقم» (مستوى الصعوبة ⭐⭐)
use std::io;
fn main() {
let secret = 42; // Hidden answer (random numbers will be used in subsequent lessons)
println!("🎯 Guess the Number Game! Range 1-100");
loop {
println!("Please enter your guess:");
let mut guess = String::new();
io::stdin()
.read_line(&mut guess)
.expect("Failed to read input");
let guess: i32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => {
println!("⚠️ Please enter a valid number!");
continue;
}
};
match guess.cmp(&secret) {
std::cmp::Ordering::Less => println!("Too small! ⬆️"),
std::cmp::Ordering::Greater => println!("Too big! ⬇️"),
std::cmp::Ordering::Equal => {
println!("🎉 Congratulations, you got it right! The answer is {}", secret);
break;
}
}
}
}
يوضح هذا المثال الاستخدام الأساسي لـ
loopوmatchوالمكتبة القياسيةio، بالإضافة إلى معالجة الأخطاء — وهو المشروع التمهيدي الكلاسيكي المأخوذ من الدليل التعليمي الرسمي للغة Rust.
6. نظرة عامة سريعة على منظومة Rust
تدور منظومة Rust حول ثلاث أدوات أساسية:
| الأداة | الغرض | الأمر |
|---|---|---|
| rustc | مُترجم لغة Rust | rustc main.rs |
| rustup | إدارة إصدارات Rust | rustup toolchain install nightly |
| Cargo | إدارة الحزم + التجميع | cargo build / run / test / doc |
يتم استضافة الحزم مفتوحة المصدر على crates.io (https://crates.io)، الذي يستضيف حاليًا أكثر من 150,000 حزمة. ومن بين الحزم الشائعة serde (التسلسل)، وclap (معلمات سطر الأوامر)، وtokio (وقت التشغيل غير المتزامن).
❓ أسئلة شائعة
cargo check وcargo build؟cargo check بإجراء فحوصات الصياغة والنوع فقط؛ ولا يقوم بإنشاء ملفات ثنائية، لذا فهو أسرع بكثير.📖 ملخص
- «Rust» هي لغة برمجة على مستوى الأنظمة تتميز بأمان الذاكرة في مرحلة التحويل البرمجي والتجريد بدون تكلفة.
- مقارنةً بلغة C/C++، تقوم Rust بإدارة الذاكرة تلقائيًّا؛ ومقارنةً بلغة Go، لا تتعرض لفترات توقف بسبب آلية جمع القمامة (GC)
- استخدم
rustupلتثبيت Rust؛ يدعم إدارة إصدارات متعددة Cargoهو نظام إدارة الحزم والبناء في Rust؛ أماcargo new/cargo build/cargo runفهي ميزاته الثلاث الرئيسية- يُعد نظام الملكية في لغة Rust السمة الأكثر تميزًا فيها (والتي سيتم تناولها بالتفصيل في الدرس 8)
- يقع جوهر النظام البيئي على موقع crates.io، حيث ينشط المجتمع ويستمر في النمو
📝 تمارين
- الصعوبة ⭐: استخدم
cargo newلإنشاء مشروع باسمmy_first_rust، وقم بتعديلmain.rsلطباعة اسمك، ثم قم بتشغيله باستخدامcargo run. - الصعوبة ⭐⭐: انطلاقًا من المثال 3، أضف عمليات الطرح والضرب والقسمة، ولاحظ نتائج أنواع العمليات المختلفة (هل يتم اقتطاع الباقي عند القسمة على الأعداد الصحيحة؟).
- الصعوبة ⭐⭐⭐: اقرأ الوثائق الرسمية لـ Rust التي فتحها
rustup doc، وابحث عن قسم «الملكية»، ولخصه بثلاث جمل بعباراتك الخاصة. أرسلها إلى أحد مطوري Rust الذين تعرفهم لتتأكد من صحتها.