الدرس1 / 4

ليه Rust؟ وإيه اللي هتتعلمه

قراءة

اللي هتفهمه

  • المشكلة اللي كل اللغات بتحاول تحلها في إدارة الذاكرة، وإيه الحلين المشهورين وعيوبهم.
  • إيه الحل التالت اللي Rust بتقدمه، وإيه تمنه عليك كمتعلم.
  • إنت رايح فين بالظبط في المسار ده، وإيه اللي هتقدر تفهمه في الآخر.

الشرح

كل برنامج بتكتبه بيحتاج ذاكرة. بيحجزها، بيستخدمها، والمفروض يسيبها لما يخلص. السؤال اللي كل لغة برمجة بتجاوب عليه بطريقتها هو: مين المسؤول عن إن الذاكرة دي تترجع؟

فيه إجابتين مشهورين، وكل واحدة ليها تمن.

الإجابة الأولى: إنت المسؤول. دي طريقة C و‏C++‎. إنت بتحجز الذاكرة وإنت اللي بتسيبها بنفسك. النتيجة إن البرنامج بيطلع سريع جداً ومفيش أي حاجة بتشتغل في الخلفية من ورا ظهرك. لكن لو نسيت تسيب الذاكرة، البرنامج بيكبر لحد ما ياكل الجهاز. ولو سيبتها واستخدمتها بعد كده، بتدخل في نوع من الأخطاء صعب جداً تلاقيه — لأن البرنامج ممكن يشتغل صح تسعة وتسعين مرة ويقع في المرة المية، وممكن يقع في مكان بعيد تماماً عن السطر اللي فيه الغلط الحقيقي.

الإجابة التانية: اللغة هي المسؤولة. دي طريقة Java و‏Go و‏Python و‏JavaScript. فيه حاجة اسمها الـ garbage collector بتشتغل مع برنامجك، بتبص على الذاكرة اللي محدش بيستخدمها وبترجعها لوحدها. ده بيريحك من فئة كاملة من الأخطاء، بس بتدفع التمن في وقت التشغيل: البرنامج بيقف لحظات عشان الـ GC يشتغل، وإنت مش متحكم في اللحظات دي. في معظم البرامج مفيش مشكلة. في أنظمة التشغيل، وسواقات الأجهزة، والألعاب، والأنظمة اللي لازم ترد في وقت محدد — المشكلة دي كبيرة.

Rust بتقدّم إجابة تالتة: الكومبايلر هو المسؤول، وقت الترجمة.

بدل ما تفتكر إنت، وبدل ما فيه حاجة تشتغل وقت التشغيل، الكومبايلر بيتتبع كل قيمة في برنامجك ويعرف بالظبط إمتى محدش هيحتاجها تاني — وبيحط أمر تحريرها في المكان الصح وهو بيترجم. يعني الأمان بتاع اللغات اللي فيها GC، من غير الـ GC نفسه.

ده مش سحر. ده شرط. عشان الكومبايلر يقدر يعمل كده، لازم يكون متأكد من حاجات معينة عن الكود بتاعك، وعشان يتأكد لازم يرفض أي كود مش قادر يتأكد منه — حتى لو الكود ده كان هيشتغل صح فعلاً.

المرئي

مفيش مرئي في الدرس ده — إحنا لسه بنحدد الوجهة. أول مرئي حقيقي هيبقى في الدرس اللي بيشرح الستاك والهيب.

الكود

مفيش كود في الدرس ده. هنبدأ نكتب في الدرس الرابع، بعد ما تكون البيئة جاهزة عندك.

ليه بيشتغل كده

الجزء اللي بيرفض كودك اسمه الـ borrow checker، وهو تحليل ساكن — يعني بيشتغل على النص بتاع الكود وهو بيتترجم، مش وهو شغال.

ودي النقطة اللي بتفسر كل حاجة تانية في اللغة: مفيش أي تكلفة وقت التشغيل، لأن كل الفحص خلص قبل ما البرنامج يبدأ أصلاً. البرنامج اللي بيطلع في الآخر مفيهوش أي أثر للفحص ده.

وده كمان اللي بيفسر إحساسك في أول أسبوعين. الكومبايلر مش بيقولك “غلطت”، هو بيقولك “مقدرتش أتأكد”. الفرق بين الاتنين مهم: أوقات كتير الكود بتاعك صح فعلاً، بس مكتوب بطريقة الكومبايلر مش قادر يثبت صحتها. الحل مش إنك تتحايل عليه — الحل إنك تتعلم تكتب بالشكل اللي بيخليه يقدر يثبت.

ولما ده يحصل — ومعظم الناس بتوصله بعد أسبوعين تلاتة — بتكتشف إن نفس الطريقة دي بتمنع عنك أخطاء تانية خالص، زي مشاكل الـ threads.

تمرين

مش تمرين كود. فكّر في آخر مرة برنامج كتبته وقع أو اتصرف بشكل غريب، وحاول تحط الغلط في واحدة من التلات فئات دي:

  1. استخدمت حاجة بعد ما اتمسحت أو اتقفلت.
  2. حاجتين كانوا بيغيّروا نفس البيانات في نفس الوقت.
  3. غلطة في المنطق نفسه — الكود عمل بالظبط اللي قلته له، بس اللي قلته كان غلط.
ليه التقسيمة دي مهمة

الفئتين الأولانيين هما اللي Rust بتمنعهم وقت الترجمة — مش بتقلل احتمالهم، بتخليهم مستحيلين في الكود الآمن.

الفئة التالتة مش بتحلها ولا أي لغة تانية. لو أغلب مشاكلك من النوع التالت، Rust هتديك أمان أكتر لكن مش هتحل مشكلتك الأساسية — وده كلام أمين أحسن من إني أبيعلك اللغة على إنها بتحل كل حاجة.

مشاكل شائعة

لسه مفيش — مكتبناش سطر كود لحد دلوقتي. أول المشاكل الحقيقية هتقابلك وإنت بتجهّز البيئة في الدرسين الجايين، وكل واحدة منها ليها صفحة كاملة في مكتبة المشاكل فيها رسالة الخطأ بالحرف والحل.

إنت رايح فين

المسار ده بيبدأ من عندك ومفيش حاجة متثبتة، وبينتهي عند مفهوم اسمه الملكية — وهو المفهوم اللي بيقرر عند معظم الناس: يكمّلوا في اللغة دي ولا يسيبوها.

الطريق: تثبيت اللغة، تجهيز المحرر، أول برنامج، المتغيرات والأنواع والدوال، وبعدين الستاك والهيب والملكية.

مش هنشرح الملكية بالكلام بس. هتشوف بعينك إيه اللي بيحصل في الذاكرة خطوة بخطوة.

النقاش

لو عندك سؤال أو لقيت غلطة في الصفحة دي، اكتبها فيالنقاشات على GitHub. كل صفحة ليها موضوعها الخاص.