واحد وصفر… لغة الآلة، وقصة لمبة النور التي بنت التكنولوجيا (سلسلة أصل البرمجة — 2)
واحد وصفر… لغة الآلة، وقصة لمبة النور التي بنت التكنولوجيا
من أول يوم دخلت فيه عالم التكنولوجيا، وأنت بتسمع الجملة الأيقونية دي:
«الكمبيوتر في الآخر مبيفهمش غير صفر وواحد (0 و 1)!»
بتشوفها في أفلام الخيال العلمي، بتشوف شاشات سودا بينزل عليها أرقام خضرا، وبتقول لنفسك:
«طب ليه وجع الدماغ ده؟ ما إحنا كبشر بنعد من 0 لـ 9 بمنتهى السهولة.. ليه المهندسين والرياضيين ما عملوش كمبيوتر بيفهم أرقامنا العادية بدل ما يحولوا كل حاجة لـ 0 و 1؟»
السؤال ده وراه عبقرية هندسية وفيزيائية لو فهمتها، هتفهم ليه أنظمة التشغيل، والداتابيز، وحتى مكتبات زي React و Node.js بتعتمد على الـ Bits في قلب معمارياتها لتسريع الأداء وتوفير الذاكرة.
القصة بتبدأ من الحيطة: مفتاح النور والفيزياء
تعال نتخيل إننا قررنا نعمل كمبيوتر بيعد زينا بالنظام العشري (Decimal: من 0 لـ 9).
الكمبيوتر في جوهره عبارة عن دوائر كهربية وأسلاك. عشان نخليه يفهم 10 أرقام، محتاجين نحدد 10 مستويات مختلفة من الجهد الكهربي (Voltage):
0 = 0.0 Volt
1 = 0.5 Volt
2 = 1.0 Volt
3 = 1.5 Volt
...
9 = 4.5 Volt
الفكرة تبان حلوة على الورق، بس في أرض الواقع والفيزياء دي كارثة هندسية محققة! ليه؟
- التشويش والحرارة (Electrical Noise & Heat):
أي سلك في الدنيا، لو جنبه سلك تاني، أو درجة حرارة الجهاز ارتفعت ربع درجة، الفولت بيتهز ويحصل فيه تذبذب طفيف.
لو الفولت اتهز من1.5Vلـ1.7V.. المعالج هيتلخبط: هو ده رقم 3 ولا رقم 4؟
غلطة زي دي في جهاز طبي أو حساب بنكي ممكن تودّي في داهية! - التعقيد وتكلفة التصنيع:
عشان تقيس 10 مستويات جهد بدقة متناهية، محتاج مقاومات وحساسات معقدة وغالية جداً.
الحل العبقري: لمبة النور (On / Off)
علماء الفيزياء والرياضيات قالوا:
«ليه نعقد نفسنا؟ إيه أوضح وأبسط حاجة في الكون لا تحتمل الشك؟»
مفتاح النور!
- يا إما المفتاح مقفول واللمبة طافية ومفيش كهربا: Off 0
- يا إما المفتاح مفتوح واللمبة منورة وفيه كهربا: On 1
0.0V ───────► [منطقة أمان ميتة] ───────► 3.3V / 5.0V
(0) (1)
مستحيل يتلخبطوا! لو الفولت بقى 4.2V أو 5.1V.. لسه شايفينه (1).
النظام ده اسمـه Binary (النظام الثنائي). ميزته الكبرى مش إنه “أسهل في الحساب”، ميزته الكبرى إنه محصن ضد التشويش الفيزيائي (Noise-Tolerant). يا فيه تيار يا مفيش.. مفيش احتمال تالت!
الفكرة كلها في سطر واحدالكمبيوتر لم يختر الـ 0 والـ 1 لأنه يحب الرياضيات الثنائية، بل لأن فيزياء السيليكون لا تثق إلا في حالتين: وجود تيار كهربي أو انقطاعه.
الرياضيات: إزاي رقمين بس يشيلوا كل علوم الكون؟
الرياضيات ببساطة: إزاي رقمين بس يشيلوا كل أرقام الكون؟
لو فتحت أي كتاب أكاديمي، هتلاقيه راصص لك معادلات وقوانين معقدة تخليك تقفل الكتاب.
تعال نفهمها مع بعض بطريقة بديهية جداً من غير أي تعقيد.
أولاً: إزاي بنعد أصلاً؟ (سر العداد في ابتدائي)
فاكر وإنت صغير لما اتعلمت العد من 0 لـ 9؟
- بتعد في خانة الآحاد:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 - طب لما الـ
9تخلص وعايز تعد الرقم اللي بعده.. بتعمل إيه؟ - بما إنه مفيش رمز جديد بعد الـ 9، كنت بتصفر خانة الآحاد (ترجعها 0)، وتفتح خانة جديدة على الشمال اسمها “العشرات” وتحط فيها
1.. فيطلع رقم:10! - ولما خانة العشرات هي كمان تتملي (
99).. بتصفر الخانتين وتفتح خانة تالتة اسمها “المئات”.. فيطلع رقم:100!
كل ما خانة تتملي، بتصفرها وتفتح خانة جديدة على الشمال قيمتها 10 أضعاف اللي قبلها:
ثانياً: تعال نعمل نفس الشيء بالمللي بس مع الصفر والواحد!
في عالم الكمبيوتر (Binary)، إحنا معندناش غير رقمين اتنين بس: 0 و 1.
تعال نعد زي ابتدائي بالظبط خطوة بخطوة:
- أول رقم:
0 - تاني رقم:
1 - طب الرقم اللي بعده (رقم 2 في دنيتنا)؟
الـ1خلص ومفيش رمز اسمه 2! هنعمل نفس اللي عملناه لما الـ 9 خلصت:
هنصفر الخانة الأولى (0) ونفتح خانة جديدة على الشمال (1).. فيتكتب:10! - طب الرقم اللي بعده (رقم 3)؟ هنزود واحد في الخانة الأولى: يتكتب:
11! - طب رقم 4؟ الخانتين اتملوا بالوحايد (زي حالة 99 بالظبط).. نعمل إيه؟
نصفر الخانتين ونفتح خانة تالتة على الشمال: يتكتب:100!
بص على الجدول ده وشوف إزاي كل رقم بيتحول لـ Binary بنفس البساطة:
| الرقم العادي عندنا | كوده في الباينري (Binary) | إيه اللي حصل؟ |
|---|---|---|
| 0 | 0 | البداية |
| 1 | 1 | الخانة الأولى اتملت |
| 2 | 10 | صفرنا الأولى وفتحنا خانة جديدة (قيمة 2) |
| 3 | 11 | الخانتين اتملوا |
| 4 | 100 | صفرنا الخانتين وفتحنا خانة تالتة (قيمة 4) |
| 5 | 101 | 4 + 1 |
| 6 | 110 | 4 + 2 |
| 7 | 111 | 4 + 2 + 1 (التلات خانات اتملوا) |
| 8 | 1000 | صفرنا كله وفتحنا خانة رابعة (قيمة 8) |
شايف الجمال؟ مفيش أي سحر ولا تعقيد، ده نفس العداد بتاع ابتدائي بس ببديلين فقط!
ثالثاً: تشبيه محفظة الفلوس (ليه الخانات: 1، 2، 4، 8، 16…)
ليه كل خانة لما بنمشي للشمال بتضاعف قيمتها؟
في النظام العشري، كل خانة بتضرب في 10 (آحاد = 1، عشرات = 10، مئات = 100).
في النظام الثنائي، عشان معندناش غير رقمين، كل خانة بتضرب في 2 (بتتضاعف):
تخيل معايا إن البنك طبع عملات ورقية بفئات غريبة، ومفيش في جيبك غير ورقة واحدة بس من كل فئة:
[ ورقة بـ 128 ] [ ورقة بـ 64 ] [ ورقة بـ 32 ] [ ورقة بـ 16 ] [ ورقة بـ 8 ] [ ورقة بـ 4 ] [ ورقة بـ 2 ] [ ورقة بـ 1 ]
دلوقتي دخلت تشتري طلب بـ 13 جنيه، ومعاك الفئات دي بس:
هتطلع أنهي أوراق من محفظتك عشان تجمع 13 جنيه بالمللي؟
- ورقة بـ 8 جنيه (كده جمعنا 8، وفاضلنا 5).
- ورقة بـ 4 جنيه (كده جمعنا 12، وفاضلنا 1).
- ورقة بـ 1 جنيه (كده جمعنا 13 بالظبط!).
أي ورقة طلعتها من محفظتك، اعتبر لمبتها نورت وحط مكانها (1).
أي ورقة فضلت جوة محفظتك ومستخدمتهاش، اعتبرها مطفية وحط مكانها (0).
تعال نرصهم كده في سطر واحد:
قيمة الورقة: 128 64 32 16 8 4 2 1
استخدمتها؟: 0 0 0 0 1 1 0 1
─────────────────────────────────────────────────────────────
الحسبة: 8 + 4 + 0 + 1 = 13!
الرقم طلع: 00001101 بالباينري!
بالطريقة العبقرية دي، الأرقام مابقتش مجرد أرقام لحساب الفلوس.. الأرقام بقت الحجر الأساسي لبناء كل التكنولوجيا اللي في إيدك النهاردة!
تعال أوريك 3 أسرار كلنا بنشوفهم كل يوم في الكود والـ Web Development ومكناش واخدين بالنا إنهم Bits صافية:
1. لغز الـ 255 في ألوان الـ CSS: ليه مش 100 وليه مش 1000؟
كلنا أول ما اتعلمنا Frontend وكتبنا CSS، كتبنا السطر ده:
color: rgb(255, 0, 0); /* أحمر صريح */
عمرك وقفت وسألت نفسك:
«ليه أقصى قيمة للون هي 255 بالذات؟ ليه مش 100 عشان تبقى نسبة مئوية سهلة؟ وليه مش 1000؟»
السر كله في الـ 8 بت (Byte واحد)!
مهندسو الشاشات خصصوا لكل لون من الألوان الأساسية التلاتة (الأحمر، الأخضر، الأزرق) بايت واحد بس في الذاكرة.
تعال نجمع كل الأوراق اللي في محفظتنا لو كل اللمبات منورة بالوحايد (11111111):
0: يعني كل اللمبات مطفية مفيش لون خالص (Black).255: يعني كل الـ 8 لمبات منورة على الآخر أقصى شدة إضاءة ممكنة!
حتى لما بتكتب Hex Color زي #FF0000:
الـ FF في النظام السادس عشري (Hexadecimal) هي الترجمة المباشرة لرقم 255، واللي في الذاكرة معناها: 11111111!
كل بيكسل بتشوفه في عينك على شاشة موبايلك دلوقتي هو عبارة عن 24 بت (8 بت أحمر + 8 بت أخضر + 8 بت أزرق) بتشكل أكتر من 16.7 مليون لون ()!
2. سر الكلمات.. وليه الإيموجي كان بيفرقع الداتابيز زمان؟
في الستينات، عملوا جدول بسيط اسمه ASCII Table.
قالوا: إحنا هندي لكل حرف إنجليزي رقم:
- حرف
'A'رقمه65بالباينري:01000001 - حرف
'B'رقمه66بالباينري:01000010 - المسافة (Space) رقمها
32بالباينري:00100000
الجدول ده كان بيستخدم 7 بت بس (يعني يشيل لحد 128 احتمال)، وده كان مكفي الحروف الإنجليزي والأرقام وعلامات الترقيم وزيادة.
بس لما الإنترنت لف العالم، وظهرت لغات زي العربي والصيني، وبعدها ظهرت الإيموجيز (Emojis).. الـ 128 احتمال مابقوش يكفوا ربع لغات الأرض!
هنا اخترعوا معيار Unicode (UTF-8):
- الحرف الإنجليزي العادي يفضل واخد بايت واحد (8 بت).
- الحرف العربي ياخد 2 بايت (16 بت) عشان يشيل التشكيل وكل الحروف.
- الإيموجي زي 🚀 أو 🔥 ياخد 4 بايت كاملين (32 بت)!
اللغز التاريخي في MySQL: utf8 vs utf8mb4غالباً قابلت الموقف ده وأنت بتعمل Database في MySQL:
لو عملت الـ Collation بتاعة الجدولutf8، واليوزر جه كتب في الكومنت أو الشات إيموجي زي 🚀.. السيرفر كان بيضرب Error ويرفض يسيف الريكورد!
ليه؟ لأن مهندسي MySQL في البداية عملواutf8بحد أقصى 3 بايت بس لكل حرف توفيراً للمساحة.
ولما العالم اخترع الإيموجيز واكتشفوا إنها محتاجة 4 بايت، اضطروا يعملوا نوع جديد اسمه:utf8mb4(اختصار لـ: UTF-8 4-Bytes) عشان يقدر يشيل الـ 32 بت بتاعة الإيموجي!
3. الصوت والفيديو: مجرد قراءات سريعة للمبات
- الصوت (Audio): الميكروفون بيقيس ضغط الهواء كل ثانية آلاف المرات (مثلاً 44,100 مرة في الثانية في جودة الـ CD). كل قياس بيتحول لرقم (رقم من 16 بت). لما المعالج يقرأ الأرقام دي ويبعتها للسماعة تتهز بنفس المعدل.. ودنك تسمع صوت مزيكا أو فويس نوت واضحة!
- الفيديو (Video): مجرد شاشات بيكسلز (24 بت لكل نقطة)، بتتعرض ورا بعضها بسرعة 30 أو 60 إطار في الثانية (FPS).
الواقع الفيزيائي: ضغط هواء (صوت) │ فوتونات ضوء (صورة) │ حروف وأفكار (نص)
│ │ │
الترجمة الرقمية: ▼ ▼ ▼
أرقام أرقام أرقام
│ │ │
الحقيقة في السيلكون: ▼ ▼ ▼
[ 0 1 1 0 1 ] [ 1 1 0 0 1 ] [ 0 1 0 1 0 ]
كل شيء في العالم الرقمي — من أول شات الواتساب لحد أعقد لعبة 3D — هو في النهاية ملايين اللمبات اللي بتطفي وتنور مليارات المرات في الثانية!
التاتش الـ Advanced: الـ Bits في شغلك النهاردة
هتقولي: «كلام جميل وتأسيس تاريخي ممتاز، بس أنا شغال TypeScript و Full-stack في 2026.. أنا مالي ومال الـ 0 والـ 1؟»
تعال أوريك إزاي الـ Senior Engineers بيستخدموا الـ Bits عشان يوفروا مئات الميغابايتات ويسرّعوا الأنظمة في الـ Production الحقيقي.
سيناريو الصلاحيات (User Permissions)
تخيل إنك بتصمم نظام صلاحيات (RBAC) لشركات ضخمة، وعندك لكل يوزر 6 صلاحيات:
canReadcanWritecanDeletecanExportisAdminisBillingManager
المبرمج العادي بيخزنها في الـ Database و بيبعتها للـ Frontend كده:
// ❌ أسلوب كلاسيكي ثقيل وغير كفء
const userPermissions = {
canRead: true,
canWrite: true,
canDelete: false,
canExport: false,
isAdmin: false,
isBillingManager: true,
};
لو عندك مليون يوزر أونلاين:
- الـ Object ده حجمه بالـ Keys والنصوص بتاعته حوالي 150 إلى 200 بايت في الذاكرة لكل يوزر!
- المليون يوزر هيحجزوا قرابة 200 ميجابايت في الرام مجرد بوليانز وأسماء خصائص.
الحل بالـ Bitwise Flags (زي ما بتعمل أنظمة التشغيل و React)
بما إن كل صلاحية هي عبارة عن True أو False.. يعني بت واحدة بس (1-bit)!
ليه نضيع أوبجكت كامل، لما نقدر نخزن كل الصلاحيات دي جوة رقم Integer واحد (4 بايت فقط)؟
بنستخدم قوى الـ 2 عشان كل صلاحية تاخد خانة مخصصة:
// كل صلاحية بتمثل خانة واحدة منورة في الـ Binary
export const Permissions = {
READ: 1 << 0, // 000001 (رقم 1)
WRITE: 1 << 1, // 000010 (رقم 2)
DELETE: 1 << 2, // 000100 (رقم 4)
EXPORT: 1 << 3, // 001000 (رقم 8)
IS_ADMIN: 1 << 4, // 010000 (رقم 16)
BILLING_MGR: 1 << 5, // 100000 (رقم 32)
} as const;
// 1. دمج الصلاحيات باستخدام الـ OR (|)
// لنفترض اليوزر عنده READ و WRITE و BILLING_MGR:
const myUserRole = Permissions.READ | Permissions.WRITE | Permissions.BILLING_MGR;
// الناتج الرياضي في الذاكرة: 1 + 2 + 32 = 35 (0b100011)
// 2. الفحص بسرعة الضوء باستخدام الـ AND (&)
function checkCanDelete(userRole: number): boolean {
return (userRole & Permissions.DELETE) !== 0;
}
function checkCanWrite(userRole: number): boolean {
return (userRole & Permissions.WRITE) !== 0;
}
console.log(checkCanDelete(myUserRole)); // false
console.log(checkCanWrite(myUserRole)); // true
إيه السحر اللي حصل هنا؟
- سرعة معالجة خرافية (O(1) على مستوى الـ CPU Registers):
عملية&و|بتتنفذ في دورة ساعة واحدة (1 CPU Cycle) مباشرة داخل المعالج بدون أي Loops أو Hash Map lookups. - ضغط استهلاك الذاكرة بنسبة 95%:
بدل 200 بايت لكل يوزر، الصلاحيات كلها متخزنة في رقم 4 بايت فقط! - هكذا تعمل React و Linux في الكواليس:
نظام صلاحيات لينكس الشهير (chmod 755) هو في الأصل Bitmask ().
وحتى الـ React Fiber داخلياً، بيخزن حالات الـ Component والأولويات (Lanes / Flags) كـ Bitmasks عشان يقدر يعرف الـ State في أجزاء من النانو ثانية!
تأمل بسيطكل التجريدات الحديثة (JSON, Objects, Classes) معمولة عشان راحة عين المبرمج البشري، لكن في قلب الماكينة، المعمارية اللي بتكسب دايماً هي اللي بتحترم طبيعة الصفر والواحد.
الخلاصة المعمارية
- الكمبيوتر ثنائي لحماية الداتا، مش لعشق الرياضيات: الـ 0 والـ 1 هو الحل الفيزيائي الوحيد اللي بيحمي الإشارات الكهربية من التشويش والحرارة.
- كل البيانات يمكن اختزالها لأرقام: الحروف، الصور، الصوت، والصلاحيات كلها ترجمة لمتتاليات من البتات.
- الـ Bitwise مش رفاهية أكاديمية: فهمك لكيفية عمل الـ Bits والـ Bitmasks هو اللي بيفرق بين مهندس بيكتب كود سطحي، ومهندس بيبني أنظمة عالية الكفاءة (High-Performance Systems) بتستحمل ملايين المستخدمين بدون استهلاك عشوائي للرام.
في المقال القادم (اليوم 3):
عرفنا إن الصفر والواحد هما لغة السلك والكهربا..
بس إزاي قدر راجل مدرس رياضيات إنجليزي اسمه جورج بول سنة 1854، يحول الـ 0 والـ 1 دول لـ قواعد تفكير ومنطق (&&, ||, !)؟
وليه المعادلة البسيطة دي هي اللي خلت الآلة تقدر تاخد أول “قرار” في تاريخها؟
استنونا في المقال الجاي: «جورج بول… الراجل اللي خلّى المنطق حساب»

