أسس البرمجة: من المنطق الثنائي إلى الخوارزمية
كل شيء هو صفر وواحد
الحاسوب — مهما بدا معقداً — لا يفهم سوى شيء واحد: الجهد الكهربائي موجود أم لا. هذا يُعبَّر عنه بـ:
- 1 = جهد موجود (دائرة مغلقة، "صحيح")
- 0 = لا جهد (دائرة مفتوحة، "خاطئ")
هذا هو النظام الثنائي (Binary System)، واللبنة الأساسية لكل ما يفعله الحاسوب. كل صورة، كل كلمة، كل فيديو، كل برنامج — في النهاية هو سلسلة طويلة من الأصفار والآحاد.
البت، البايت، والأرقام
البت (Bit): أصغر وحدة معلومات — إما 0 أو 1 البايت (Byte): 8 بتات معاً
بـ 8 بتات يمكن تمثيل 2⁸ = 256 حالة مختلفة (الأرقام من 0 إلى 255).
مثال: الرقم 42 في النظام الثنائي:
42 = 32 + 8 + 2
= 2⁵ + 2³ + 2¹
= 00101010
البوابات المنطقية: أدمغة الحاسوب
البوابة المنطقية هي دائرة إلكترونية بسيطة تنفذ عمليات منطقية على البتات. المعالج الحديث يحتوي على مليارات منها:
| البوابة | الوصف | مثال |
|---|---|---|
| AND | 1 فقط إذا كلا الدخلين 1 | 1 AND 1 = 1 |
| OR | 1 إذا أي دخل 1 | 0 OR 1 = 1 |
| NOT | يعكس القيمة | NOT 1 = 0 |
| XOR | 1 إذا الدخلان مختلفان | 1 XOR 0 = 1 |
| NAND | عكس AND | 1 NAND 1 = 0 |
المتغيرات: صناديق لتخزين البيانات
المتغير هو اسم يشير إلى مكان في الذاكرة يخزّن قيمة. أنواع المتغيرات الشائعة:
- رقم صحيح (Integer): أرقام بدون كسر —
42,-7,1000 - رقم عشري (Float): أرقام بكسر عشري —
3.14,-0.5 - نص (String): سلسلة من الحروف —
"دكتور ماشين" - منطقي (Boolean): قيمة إما صحيحة أو خاطئة —
trueأوfalse
مثال بلغة Rust:
let age: i32 = 25;
let temperature: f64 = 36.6;
let machine_name: &str = "الآلة A1";
let is_running: bool = true;
الشروط: كيف يتخذ البرنامج قرارات
إذا (درجة الحرارة > 80):
أرسل تنبيه "الآلة سخنت"
وإلا إذا (درجة الحرارة > 60):
سجّل تحذيراً
وإلا:
استمر في العمل الطبيعي
هذا هو جوهر القرار البرمجي: if / else if / else. كل نظام تحكم، كل تطبيق، كل موقع ويب — مبني من ملايين هذه القرارات المتداخلة.
الحلقات: تكرار الأفعال
لماذا تكتب نفس الكود ألف مرة؟ لا تفعل. تستخدم الحلقات:
لكل آلة في قائمة الآلات:
افحص درجة حرارتها
إذا تجاوزت الحد: سجّل التحذير
أنواع الحلقات الرئيسية:
- for: تكرار لعدد محدد من العناصر أو المرات
- while: تكرار طالما شرط ما صحيح
- loop: تكرار لا نهائي حتى أمر الإيقاف (مفيد في حلقات نظام التحكم)
الدوال: وحدات قابلة لإعادة الاستخدام
الدالة هي كتلة من الكود لها اسم ويمكن استدعاؤها عند الحاجة بدلاً من إعادة كتابتها:
دالة: احسب_الطاقة(جهد, تيار)
أعد جهد × تيار
نهاية الدالة
// الاستخدام في أماكن متعددة
طاقة_المحرك_1 = احسب_الطاقة(380, 15) // = 5700 واط
طاقة_المحرك_2 = احسب_الطاقة(220, 8) // = 1760 واط
مزايا الدوال:
- إعادة الاستخدام: كتابة مرة، استخدام في كل مكان
- الصيانة: تصحيح الخطأ في مكان واحد يصلحه في كل مكان
- الوضوح: اسم الدالة يشرح ماذا تفعل
الخوارزمية: خطوات الحل
الخوارزمية هي تسلسل محدد من الخطوات لحل مشكلة ما. خصائصها الجوهرية:
- محدودة: لها نهاية — لا تدوم إلى الأبد
- واضحة: كل خطوة لا تقبل التأويل
- صحيحة: تنتج الناتج المطلوب لجميع الحالات
- مدخلات ومخرجات: تأخذ بيانات وتُنتج نتيجة
مثال — خوارزمية الكشف عن الأعطال في خط إنتاج:
1. اجمع قراءات جميع الحساسات
2. لكل حساس:
2.1 هل القراءة خارج النطاق الآمن؟
2.2 نعم: سجّل رقم الحساس والوقت والقيمة
2.3 هل الخروج حرج (فوق 90% من الحد)؟
2.4 نعم: أوقف الخط وأرسل إشعاراً فورياً
3. انتظر 5 ثوان ثم عُد إلى الخطوة 1
هياكل البيانات: كيف نُنظّم المعلومات
اختيار هيكل البيانات الصحيح يؤثر على سرعة البرنامج وكفاءته:
- المصفوفة (Array/Vec): قائمة عناصر متجاورة —
[23.5, 24.1, 22.8]— الوصول السريع بالترتيب - القاموس (HashMap): مفتاح → قيمة —
{"آلة_1": 23.5}— بحث سريع بالاسم - الكومة (Stack): آخر داخل أول خارج (LIFO) — تتبع سجل العمليات
- الطابور (Queue): أول داخل أول خارج (FIFO) — قائمة انتظار المهام
في نظام ERP صناعي: الآلات تُخزَّن في HashMap (بحث سريع بالرقم التسلسلي)، أوامر الإنتاج في Queue (تنفيذ بالترتيب)، سجل الأحداث في Vec (قراءة مرتبة).
من الكود إلى التنفيذ
البرنامج المكتوب بلغة عالية المستوى (Python، Rust، C++) لا يفهمه المعالج مباشرةً. يمر بمراحل:
- الكود المصدري: ما كتبه المبرمج بلغة مفهومة للإنسان
- المُجمِّع (Compiler): يترجم الكود إلى لغة الآلة (أرقام ثنائية)
- الملف التنفيذي: سلسلة من التعليمات يفهمها المعالج
- التنفيذ: المعالج ينجز التعليمات واحدة تلو الأخرى — مليارات العمليات في الثانية
لغة Rust تُجمَّع مسبقاً (AOT compilation) — البرنامج يتحول كاملاً إلى كود آلة قبل التشغيل، مما يعطيها سرعة فائقة مقارنة باللغات المُفسَّرة.
الخلاصة
البرمجة ليست سحراً ولا موهبة فطرية حكراً على أناس دون غيرهم — هي منطق منظّم مبني على ثنائيات، قرارات، تكرار، ودوال. أي مشكلة معقدة يمكن تفكيكها إلى خطوات صغيرة بسيطة، وهذا هو جوهر تفكير المبرمج. المهارة الحقيقية ليست حفظ الأوامر — بل تعلّم كيف تُقسّم المشكلة وتُصمّم الحل.