مقدمة: كيف يتفاعل الكود مع الدوائر الكهربائية؟
قد يتبادر إلى الذهن سؤال مهم: كيف يعمل المعالج (Processor)؟ الأمر قد يبدو بسيطاً للوهلة الأولى، فهو مجرد مجموعة من الترانزستورات والدوائر الكهربائية. لكن السؤال الأعمق هو: كيف لدائرة كهربائية أن تغير وظيفتها بناءً على كود برمجي؟ كيف يمكن لكود نكتبه ونحمّله على دائرة متصلة بمقبس كهربائي أن يؤثر أحدهما في الآخر؟
في هذا المقال، سنتناول الحديث عن المعالج، وتحديداً كيف يتفاعل كدائرة كهربائية بحتة مع عالم الإنسان من خلال كود البرمجة، بصرف النظر عما إذا كان هذا المعالج في حاسوب شخصي أو نظام مدمج في جهاز نستخدمه. فكرة عمل أي معالج دقيق (Microprocessor) هي نفسها في جوهرها. فهيا بنا نبدأ.
حجر الأساس: المفتاح الكهربائي
لنبدأ الموضوع من البداية تماماً، وهذا لكي نوضح أن المفهوم سهل. فكرة استخدام الدوائر الكهربائية لجعل الحاسوب ينفذ عمليات حسابية أو منطقية بناءً على مدخلات المستخدم هي فكرة قديمة جداً، وسبقت ظهور الحاسوب إطلاقاً، حيث بدأت مع مفتاح الكهرباء.
أول أداة مكنت الإنسان من التفاعل مع الدائرة الكهربائية وتغيير نتائجها كان المفتاح. نعم، مفتاح الكهرباء البسيط الذي يفصل ويوصل سلك الدائرة، هو ما مكننا من تشغيل وإطفاء المصباح وقتما نشاء. وهذا في حد ذاته يُعتبر تغييراً لنتائج دائرة كهربائية بتدخل من الإنسان. تدخل الإنسان على المفتاح يكون بالتحريك، ولهذا السبب يُسمى المفتاح العادي “مفتاحاً ميكانيكياً” لأنه يعمل بالحركة.
ملاحظة: للتسهيل وحتى نهاية هذا المقال، عندما يكون المفتاح مفتوحاً (يوصل كهرباء)، سنطلق عليه اسم ON
أو High
أو 1
. ولو كان المفتاح مغلقاً (يفصل كهرباء)، سنطلق عليه اسم OFF
أو Low
أو 0
. سأستخدم الصفر والواحد في بقية المقال.
الجيل التالي: المفتاح الكهروميكانيكي (الريلاي)
بعد ذلك، فكر الإنسان في تطوير المفتاح لتوفير عناء الذهاب إليه لتشغيله وإطفائه. وفعلاً، نجح الإنسان في إضافة نابض (زنبرك) ومغناطيس كهربائي إلى المفتاح.
- إذا مر التيار الكهربائي في المغناطيس، فإنه يُمغنطه ويجذب المفتاح، فيضيء المصباح.
- وإذا فُصل التيار عنه، يعيد النابض المفتاح إلى مكانه الأصلي، فينطفئ المصباح.
كل هذا يحدث دون الحاجة لوجودك بجانب المفتاح. يمكنك الجلوس بعيداً في “غرفة تحكم” (Control Room) افتراضية، وأمامك جميع الأزرار. فلو ضغطت على زر أمامك وأعطيت إشارة بـ 1
، سيصبح المفتاح البعيد في وضع 1
. ولو ألغيت الإشارة أو أطفأت الزر، ستُرسل إشارة بـ 0
، ويصبح المفتاح البعيد في وضع 0
. هذا المفتاح المطور يُسمى الريلاي (Relay).
قد يسأل سائل ذكي هنا: “طالما أنني سأمد سلكاً من الريلاي حتى غرفة التحكم، فلماذا لا أنقل المفتاح نفسه إلى غرفة التحكم وأستغني عن الريلاي تماماً؟” نظرياً، هذا صحيح. لكن عملياً، نستخدم الريلاي لتنفيذ عمليات أكثر ذكاءً وتعقيداً، مثل:
- التحكم المتعدد: يمكن توصيل عشرة مفاتيح إضاءة بعشرة أزرار في غرفة التحكم، وفي نفس الوقت توصيل هذه المفاتيح العشرة بزر واحد. بهذا، يمكنك بضغطة واحدة تشغيل إضاءة صالة الاستقبال كلها، أو تشغيل كل مصباح على حدة.
- التحكم المشروط: يمكن جعل تشغيل مصباح معين يعتمد على الضغط على زرين في نفس الوقت.
- الأتمتة (Automatic Control): يمكن أن يكون مصدر الإشارة للريلاي ليس زراً، بل جهاز آخر مثل:
- ثرموستات: يعطي إشارة للمفتاح بفصل سخان الماء عندما يصل الماء لدرجة حرارة معينة.
- مؤقت (Timer): يفصل الإشارة الكهربائية بعد فترة زمنية محددة، كما في جهاز إضاءة السلالم.
معلومة إضافية: الصوت الذي تسمعه عند الضغط على زر إضاءة السلم هو صوت ارتطام المفتاح داخل الريلاي عندما يجذبه المغناطيس أو يعيده النابض.
الريلاي هو مفتاح “كهروميكانيكي”؛ أي أنه مفتاح ميكانيكي به حركة، ولكنه يعمل بمغناطيس كهربائي. وهو أساس التحكم في الدوائر الكهربائية عن بعد، ويمكن بناء حاسوب كامل باستخدامه، ولكن ستواجهنا ثلاث مشكلات رئيسية:
- الضوضاء: سيصدر الحاسوب أصوات طقطقة وارتطام مستمرة أثناء عمله.
- البطء: سيكون بطيئاً جداً لوجود حركة ميكانيكية داخل المفتاح، مما يتطلب وقتاً لينتقل المفتاح.
- الحجم: المكونات الكهروميكانيكية كبيرة الحجم، مما يجعل حجم الحاسوب عملاقاً. (المعالج الحديث يحتاج إلى ما يزيد عن مليار ريلاي).
وهكذا، حل الريلاي مشكلة التحكم، لكنه لم يحل مشاكل السرعة والوزن والحجم.
الثورة الإلكترونية: الترانزستور
هذا ما دفع البشرية للتوصل إلى النوع الثالث والأخير من المفاتيح في مقال اليوم: المفتاح الإلكتروني، الذي جاء كبديل للريلاي بعد اختراع الترانزستور.
الترانزستور هو حجر الأساس في أي دائرة إلكترونية. يتم وضعه في الدوائر بطريقة تجعله يتصرف كمفتاح، تماماً مثل الريلاي، لكن مع فارق جوهري: هو مفتاح إلكتروني يمكنه الفتح والإغلاق دون أجزاء متحركة، ودون صوت الطقطقة.
بما أنه “شبه موصل”، فإننا نستغل هذه الخاصية لتحويله إلى ما يشبه الريلاي. نقوم بتوصيله بسلك يحمل إشارة كهربائية:
- إذا أعطيته إشارة بـ
1
، يتحول إلى “موصل” ويُخرج1
. - إذا أعطيته إشارة بـ
0
، يتحول إلى “عازل” ويُخرج0
.
بهذا، وصلنا إلى تقنية أفضل من الريلاي، لا تحتوي على أجزاء متحركة، ويمكن تصغير حجمها بشكل هائل، مما يسمح بوضع أكثر من مليار ترانزستور على معالج واحد، ونتحكم فيها جميعاً بإشارات كهربائية من “غرفة التحكم” الافتراضية.
ملاحظة: الفرق بين الجهاز الكهربائي والجهاز الإلكتروني يكمن في هذه النقطة. الجهاز الكهربائي يعتمد على المفاتيح والريلاي للتحكم، بينما الجهاز الإلكتروني هو نوع متقدم يحتوي على أشباه موصلات (كالترانزستور) ونتحكم في مسار الكهرباء داخله عبر إشارات نرسلها إليه. لذا، كل جهاز إلكتروني هو جهاز كهربائي، ولكن ليس العكس.
من الترانزستور إلى المنطق: البوابات المنطقية
هكذا عرفنا أن المفتاح الكهربائي هو وحدة بناء أي نظام تحكم وتفاعل بين الإنسان والدائرة الكهربائية. وطورنا هذه التقنية لصنع مفتاح إلكتروني صغير الحجم وعديم الأجزاء المتحركة. لكن كيف نجعل المعالج يتفاعل مع المستخدم من خلال كود برمجي؟
حتى هذه النقطة، قطعنا نصف المسافة. أصبح لدينا مفتاح نتحكم فيه بإشارات من “غرفة التحكم”، وباستخدامها يمكننا السماح للمدخلات بالمرور عبر دوائر كهربائية معينة ومنعها عن دوائر أخرى. بمعنى آخر، أصبح لدينا زر لكل دائرة كهربائية داخل المعالج.
ما ينقصنا الآن شيئان:
- كيفية ترتيب الترانزستورات لتكوين دوائر كهربائية يمكنها تنفيذ عمليات مثل الجمع أو الضرب.
- كيفية استبدال الأزرار في غرفة التحكم بأسطر من الكود.
لنشرح ذلك، سنتخيل نموذجاً مصغراً وغير واقعي للمعالج.
كما قلنا، الترانزستور يعمل كمفتاح له ثلاثة أسلاك. السلك الأوسط هو سلك التحكم (القادم من غرفة التحكم). إذا أعطيته 1
، يمرر التيار. إذا أعطيته 0
، يقطعه.
الآن، تخيل أننا وضعنا اثنين من الترانزستورات على التوالي (in series). لكي يمر التيار الكهربائي من البداية إلى النهاية ويُخرج 1
، يجب أن يكون كلا الترانزستورين في وضع التشغيل (1
). هذا يعني أن سلكي التحكم القادمين من غرفة التحكم يجب أن يكونا كلاهما 1
. أي حالة أخرى ستؤدي إلى نتيجة 0
.
هذا الترتيب للاثنين ترانزستور قد أنشأ عملية منطقية تُعرف بـ AND (اقتران).
- المدخل الأول
1
و المدخل الثاني1
= الناتج1
. - غير ذلك، الناتج
0
.
هذا الترتيب من الترانزستورات الذي ينفذ عملية منطقية نسميه بوابة (Gate). والبوابة التي تنفذ عملية AND نسميها AND Gate.
باستخدام الترانزستورات، يمكننا بناء بوابات منطقية مختلفة، كل منها تنفذ عملية حسابية مختلفة بناءً على طريقة ترتيب وعدد الترانزستورات بداخلها. إليك بعض الأمثلة الأخرى:
- OR Gate: تُخرج
1
إذا كان أي من مدخلاتها1
. - XOR Gate: تُخرج
1
فقط إذا كانت مدخلاتها مختلفة (واحد1
والآخر0
). - XNOR Gate: عكس الـ XOR، تُخرج
1
فقط إذا كانت مدخلاتها متشابهة (كلاهما1
أو كلاهما0
).
تجميع المعالج: المكونات الأساسية
الآن أصبح لدينا مجموعة من البوابات الحسابية المختلفة. إذا أدخلنا أي مدخلين، سيتم تطبيق كل العمليات عليهما بالتوازي. لكننا لا نريد ذلك. ما نريده هو أن نُدخل مدخلين، وننفذ عليهما عملية AND، ثم نغير المدخلين وننفذ عملية OR، وهكذا. نريد اختيار بوابة واحدة فقط لتعمل في كل مرة.
لتحقيق ذلك، نحتاج لإضافة مكونات أخرى داخل المعالج:
- المُضاعِف (Multiplexer): تدخل إليه جميع نتائج البوابات، ولكنه يُخرج نتيجة واحدة فقط، وهي نتيجة البوابة التي نختارها عبر رقمها.
- الساعة (Clock): لتنظيم تدفق البيانات، نضيف مكوناً يولد نبضة كهربائية منتظمة (تتأرجح بين
1
و0
). عند كل انتقال من0
إلى1
، نقرأ النتيجة القديمة وندخل البيانات الجديدة للعملية التالية. سرعة تغير هذه النبضة هي ما يُعرف بـ “تردد المعالج” (مثلاً 3.0 GHz). - الذاكرة (Memory): نحتاج إلى ذاكرة لتخزين نتائج الحسابات بعد كل نبضة ساعة، تمهيداً لكتابتها لاحقاً في الذاكرة الرئيسية (RAM).
لغة الآلة: كيف يفهم المعالج الكود؟
آخر عنصر هو التفاعل مع المستخدم. يتم ذلك عبر نوعين من البيانات:
- المدخلات (Data): هي البيانات التي نريد إجراء العمليات عليها. يمكن إدخالها عبر لوحة المفاتيح (Keyboard) أو تحميلها من الذاكرة.
- البرنامج (Code): هو مجموعة التعليمات التي تخبر المعالج بما يجب فعله بالمدخلات.
الكود الذي نكتبه بلغات البرمجة (مثل Python أو C++) لا يفهمه المعالج مباشرة. يجب أولاً تحويله عبر برنامج خاص (يُسمى المترجم Compiler) إلى لغة يفهمها المعالج، وهي لغة الآلة (Machine Code)، التي تتكون بالكامل من أصفار وآحاد.
السؤال الأخير: كيف تتحول هذه الأصفار والآحاد إلى إشارات كهربائية نرسلها للبوابات؟
الأمر بسيط جداً. تماماً كما حولنا ضغطات الأزرار في غرفة التحكم إلى إشارات 1
و 0
، يتم تخزين كود الآلة في ذاكرة خاصة. هذه الذاكرة هي دائرة كهربائية. عندما نطلب منها قراءة سطر من الكود (مثلاً 01
)، فإنها تُخرج على أسلاكها المتصلة بالمعالج فولت منخفض (0
) وفولت عالي (1
).
بهذا، نكون قد استبدلنا “غرفة التحكم” اليدوية بذاكرة إلكترونية. البرنامج هو عبارة عن مجموعة أوامر متسلسلة، مخزنة في ذاكرة البرنامج (Program Memory). نوصل خرج هذه الذاكرة بالمدخل الذي يختار العملية الحسابية في المضاعف (Multiplexer). وهكذا، كل سطر من الكود يُترجم إلى إشارة كهربائية تجعل المعالج ينفذ عملية مختلفة. مع كل نبضة ساعة، يتم تنفيذ سطر والانتقال إلى السطر الذي يليه.
أتمنى أن تكون العلاقة قد اتضحت الآن بين دائرة كهربائية وكيف تختلف نتائجها بناءً على برنامج مكتوب، والذي هو في الأصل بديل لمجموعة من المفاتيح. هذا المبدأ أساسي لفهم كيفية عمل أي دائرة رقمية تحتوي على معالج دقيق.
ملاحظات ختامية هامة
قبل أن نختتم، هناك بعض المعلومات الإضافية الهامة التي لم يتسنَّ إدراجها بسلاسة في الشرح السابق:
- ذاكرة الكاش (Cache Memory): ذاكرة البرنامج (Program Memory) وذاكرة البيانات (Data Memory) مع مكونات أخرى تشكل ما يُعرف بذاكرة الكاش. هي أقرب ذاكرة للمعالج وسرعتها توازي سرعته، وهي أسرع بكثير من الذاكرة العشوائية (RAM).
- وحدة التحكم (Control Unit): الوحدة المسؤولة عن تنظيم دخول وخروج البيانات، والانتقال بين أسطر الكود وتنفيذها بالتزامن مع الساعة، تُسمى وحدة التحكم (CU). لهذا السبب، تعلمنا دائماً أن المعالج يتكون من:
- وحدة التحكم (CU).
- وحدة الحساب والمنطق (ALU).
- حجم الكلمة (Word Size): في نموذجنا المبسط، كان كل مدخل ومخرج يتكون من سلك واحد (1-bit). في المعالجات الحديثة، يكون حجم الكلمة (أو Bus Size) عادة 64 بت. هذا يعني أن كل مدخل ومخرج يتكون من 64 سلكاً بالتوازي. وهذا هو المقصود بمصطلح معالج 32-bit أو 64-bit.
- فصل البيانات عن التعليمات: داخل المعالج، يتم فصل البيانات (المدخلات) عن التعليمات (الكود). لكل منهما ذاكرته الخاصة. من أشهر أسباب تعطل الحواسيب قديماً (حتى نظام Windows 98) هو أن يخلط الحاسوب بينهما، فيحاول تنفيذ البيانات المخزنة في ذاكرة البيانات على أنها كود، مما يؤدي إلى انهيار النظام. لحسن الحظ، هذه المشكلة أصبحت نادرة جداً الآن.
- نموذج مبسط: النموذج الذي تم شرحه في هذا المقال هو نموذج مبسط جداً لغرض التوضيح، وليس رسماً دقيقاً لمعالج حقيقي. الهدف كان ربط مفهوم كود البرمجة بتأثيره على الدوائر الإلكترونية داخل المعالج.
بهذا نكون قد انتهينا. آمل أن يكون المقال خفيفاً ومفهوماً.