تعتبر وحدة المعالجة المركزية CPU المكون الأساسي للحاسوب، ويُشاع اصطلاحًا أنها “ذكية” لكن في الحقيقة فإن الحاسوب ينفذ ما يُقال له فقط، ومثلما يحتاج البشر للغة للتواصل فإن الحاسوب يملك لغته الخاصة بقواعدها وسياقها، وهنا يأتي دور البرنامج Program أو برمجة الحاسوب .

ما هو البرنامج

هو لائحةٌ من التعليمات التي تدفع وحدة المعالجة المركزية لإنجاز مهمةٍ محددةٍ، وبما أن CPU لا تفهم سوى “لغة الآلة Machine Language” والتي تتبع نظامًا ثنائيًّا (أصفار وواحدات) فإن كل تعليمة تصل إليها تكون وفق هذا النظام.

وبما أن العمليات التي تستطيع CPU القيام بها ذات طبيعة بسيطة وأساسية، فيمكن أن يصل البرنامج إلى ملايين التعليمات بلغة الآلة لإنجاز مهمة ما.

آلية تنفيذ وحدة المعالجة المركزية للتعليمات في برمجة الحاسوب

عند تنفيذ CPU لأمر ما، فإنها تمر بحلقةٍ من ثلاث خطوات تكررها من أجل كل تعليمة في عملية برمجة الحاسوب :

  1. مرحلة إحضار التعليمة Fetch

    كما ذكرنا سابقًا، البرنامج هو سلسلةٌ طويلةٌ من التعليمات، وأول خطوة في الحلقة هي إحضار – أو بمصطلحٍ أدق “قراءة” – التعليمة التالية من الذاكرة إلى وحدة المعالجة المركزية.

  2. مرحلة فك الشيفرة Decode

    قلنا أن تعليمات لغة الآلة هي أرقامٌ ثنائيةٌ تمثل أمرًا على وحدة المعالجة المركزية تنفيذه لإتمام مهمة، وفي هذه المرحلة تعمل CPU على فك شيفرة التعليمة التي أتت من الذاكرة لتحديد آليةٍ عمليةٍ عليها القيام بها.

  3. مرحلة التنفيذ Execute

    وهي المرحلة الأخيرة من الحلقة وهنا تقوم CPU بتنفيذ العملية المطلوبة في التعليمة لتنتقل بعدها إلى الخطوة الأولى من أجل تعليمةٍ جديدةٍ.

ما هي لغة التجميع Assembly Language

برمجة الحاسوب باستخدام لغة الآلة قد تكون صعبة، منهكة، ومستهلكة للوقت حيث كما ذكرنا من الممكن أن تصل لملايين التعليمات الثنائية، وإن قام المبرمج بوضع صفرٍ أو واحدٍ بغير مكانه فسيؤدي ذلك إلى خلل في البرنامج بكامله.

لذلك ظهرت لغة التجميع وهي تعتبر من اللغات المنخفضة المستوى Low-Level والتي تستخدم كلماتٍ قصيرةً Mnemonics بدلًا من النظام الثنائي؛ على سبيل المثال: add تعني جمع أرقام، mul تعني ضرب الأرقام، mov تعني نقل قيمة إلى مكانٍ ما في الذاكرة.

ما هي لغات برمجة الحاسوب عالية المستوى High-Level Programming Languages

على الرغم أن لغة التجميع لا تستخدم النظام الثنائي، ولكنها بديلٌ مباشرٌ عن لغة الآلة وما زال المبرمج يحتاج لكتابة كميةٍ كبيرةٍ من التعليمات لينفذ الحاسب عملياتٍ بسيطةً، كما أن على المستخدم أن يكون على معرفةٍ بآلية عمل CPU.
لذا ظهر في الخمسينيات جيلٌ جديدٌ من لغات البرمجة عالية المستوى تتيح للمستخدم كتابة برامج معقدة دون الحاجة لمعرفة آلية عمل وحدة المعالجة المركزية وباستخدام كلماتٍ مفهومةٍ.

على سبيل المثال: إن أراد المبرمج من الحاسب إظهار عبارة Arageek Website باستخدام لغة Python على الشاشة فالتعليمة تكون بالشكل التالي: ‘print ‘Arageek Website.

كل لغة من اللغات العالية المستوى تملك مجموعةً من الكلمات التي تستخدم لأغراضٍ معينةٍ ولا يمكن استخدام غيرها أو استخدامها لأغراضٍ أخرى تدعى كلمات مفتاحية أو كلمات محجوزة Keywords أو Reserved words.
كما أن كل لغة تمتلك مجموعةً من المعاملات Operators لتقوم بعملياتٍ متعددةٍ على البيانات، مثل المعاملات الرياضية على سبيل المثال التي تجري العمليات الحسابية (مثل + التي تستخدم لجمع الأعداد).

إضافةً لذلك كل لغة تملك بنية Syntax خاصة بها تحدد كيفية ترتيب واستخدام الكلمات المفتاحية والمعاملات وعلامات الترقيم؛ وأي خلل في هذه البنية (ولو كانت بمثابة فاصلة بغير مكانها أو غير موجودة) تسبب عطل في البرنامج بأكمله.1

ما هي معالجات اللغة Language Processors

ذكرنا سابقًا أن وحدة المعالجة المركزية لا تفهم إلا النظام الثنائي المكون من أصفارٍ وواحدات، وعلى الرغم أن لغة التجميع معتمدةٌ عليها إلا أنها تستخدم Mnemonics التي لا تفهمها CPU بالإضافة إلى أن لغات البرمجة العالية المستوى مستقلة وأيضًا لا تتمكن CPU من قراءتها.

تتم كتابة أغلب البرامج الآن بواسطة لغات البرمجة العالية المستوى وتسمى التعليمات المشكلة للبرنامج “كود المصدر Source Code”. ولا يمكن أن يتم تنفيذ هذه التعليمات مباشرةً من قبل الحاسب بل يجب أن تترجم إلى لغة الآلة أولًا وذلك عن طريق معالجات اللغة لتتحول بذلك إلى ما يُعرف Object Code.

أنواع معالجات اللغة

المجمع Assembler

يُستخدم لترجمة البرنامج المكتوب بلغة التجميع إلى لغة الآلة. يكون كود المصدر Source Code هو الدخل إلى المجمع الذي يحوي على تعليمات لغة التجميع، ويكون الخرج باللغة التي يفهمها الحاسب.

المترجم Compiler

يقوم بقراءة كامل البرنامج المكتوب بلغةٍ عالية المستوى دفعة واحدة وترجمته وتحويله إلى برنامجٍ مكافئٍ في لغة الآلة أو ما يسمى Object Code حتى تستطيع وحدة المعالجة المركزية قراءة التعليمات وتنفيذها.

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

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

المفسر Interpreter

يقوم بأخذ كل تعليمة على حدى وترجمتها إلى كود الآلة ثم تنفيذها مباشرةً (أي لا يحولها أو يولد Object Code)، وبعدها الانتقال إلى التعليمة التالية.

في حال وجود خطأ في التعليمة يتوقف المفسر عن الترجمة ويظهر إشعار بوجود خلل، وعند إصلاح الخطأ يكمل المفسر عمله وينتقل للتعليمة التالية.2

ما هي أنواع البرمجة

البرمجة البنيوية Structured Programming

في هذا النوع من البرمجة يتم تنفيذ التعليمات واحدةً تلو الأخرى، وتحدد تعليمات التحكم أية كتل Blocks من الكود ستنفذ تاليًا.

تهدف هذه الطريقة لتحسين وضوح وجودة ووقت تطوير برمجة الحاسوب بالاستخدام الفعال للبرامج الفرعية Subroutines وبنية كتل الكود Block Structures وحلقات For و While.

البرمجة غرضية التوجه Object Oriented Programming

هذه البرمجة قائمة على مفهوم “الكائنات Objects” والتي يمكن أن تحوي بيانات بشكل حقول تسمى أحيانًا “خصائص Attributes” وكود على شكل عمليات Procedures (تُعرف غالبًا بالطرق Methods).3

إحدى سمات “الكائنات” أن عمليات الكائن يمكنها الوصول إلى بيانات الحقول المرتبطة بهذا الكائن والتعديل عليها.
لا يوجد “تدفق” وحيد للبرنامج حيث يمكن للكائنات التفاعل مع بعضها بحرية.

في النهاية، لا بد من التذكير أن وحدة المعالجة المركزية ليست “دماغ” الحاسوب كما أنها لا تملك “ذكاء”، إنها مجرد قطعة إلكترونية مصممة لتأدية وظائف في غاية من البساطة، تقوم وحدة المعالجة بما يأمرها البرنامج بفعله فقط ولكن على المبرمج أن يتعلم الطريقة لمخاطبة هذه القطعة الإلكترونية بتفصيل العملية المطلوبة إلى خطواتٍ مبسطةٍ وفق ترتيبٍ معينٍ وسياقٍ محددٍ ودون أي خطأ.

المراجع