# عداد البرنامج

عداد البرنامج (بالإنجليزية: Program Counter)‏ هو سجل معالج يبين مكان وجود الحاسوب في تسلسل برامجه ويعرف كذلك باسم مؤشر التعليمات في معالجات إكس 86 إنتل وItanium الدقيقة، ويسمى أحيانًا سجل عنوان التعليمات، أو عداد التعليمات، أو مجرد جزء من متتالية التعليمات.
عادةً، يتم زيادة عداد البرنامج بعد جلب التعليمات، حيث يحفظ بعنوان الذاكرة التعليمات التالية التي سيتم تنفيذها.
تقوم المعالجات عادة بجلب التعليمات بالتسلسل من الذاكرة، في حين أن تعليمات نقل التحكم تغير التسلسل عن طريق وضع قيمة جديدة في الحاسوب. وهذه التعليمات تشمل فروع تسمى أحيانًا بالقفزات واستدعاء البرنامج الفرعي والعائدات. كما أن النقل المشروط بحقيقة تأكيد ما يسمح للحاسوب باتباع تسلسل مختلف في ظل ظروف مختلفة.
هناك فرع ينص على أن التعليمات التالية يتم جلبها من مكان آخر في الذاكرة. إن استدعاء البرنامج الفرعي لا يقتصر على الفروع فحسب، بل يحفظ المحتويات السابقة لعداد البرنامج في مكان ما. بينما تقوم العائدات باسترداد محتويات ال المحفوظة وإعادتها إلى عداد البرنامج، واستئناف التنفيذ المتسلسل بالتعليمات التي تلي استدعاء البرنامج الفرعي.

## عمل العتاد

في وحدة معالجة مركزية بسيطة، عداد البرنامج هو عداد رقمي (وهو أصل مصطلح «عداد البرنامج») التي قد تكون واحدة من عدة سجلات الأجهزة. كما تبدأ دورة التعليمات بالجلب، حيث تضع وحدة المعالجة المركزية قيمة عداد البرنامج على ناقل العنوان لإرساله إلى الذاكرة. في حين تستجيب الذاكرة عن طريق إرسال محتويات موقع الذاكرة على ناقل البيانات. (وهو نموذج الحاسوب المخزن للبرنامج، حيث تحتوي مساحة ذاكرة واحدة كلا من التعليمات القابلة للتنفيذ والبيانات العادية).وبعد عملية الجلب، تشرع وحدة المعالجة المركزية في التنفيذ، وتتخذ بعض الإجراءات بناءً على محتويات الذاكرة التي حصلت عليها. وفي مرحلة ما من هذه الدورة، سيتم تعديل عداد البرنامج بحيث تكون التعليمات التالية التي يتم تنفيذها مختلفة (عادةً، تتم العملية تدريجيا بحيث تكون التعليمت التالية هي التي تبدأ من عنوان الذاكرة مباشرةً بعد آخر موقع للذاكرة للتعليمة الحالية (.
و مثل سجلات المعالجات الأخرى، قد يكون عداد البرنامج بنكًا من المزالج الثنائية، يمثل كل منها بيتة واحده من قيمة عداد البرنامج. كما أن عدد البيتات يتعلق بهندسة المعالج. على سبيل المثال، قد تستخدم وحدة المعالجة المركزية«ذات ال 32 بيتة»,32 بيتة لتتمكن من معالج 2$^{32}$ وحدة من الذاكرة. وفي بعض المعالجات، يعتمد عرض عداد البرامج الذاكرة القابلة للعنونة، وعلي سبيل المثال، بعض وحدات تحكم AVR تحتوي على عداد برنامج يلتف بعد 12 بيتة.
وإذا كان عداد البرنامج عبارة عن عداد ثنائي، فقد يزداد عند تطبيق الذبذبات على مدخلاته في العد، أو قد تحسب وحدة المعالجة المركزية بعض القيم الأخرى ووتقوم بتحميلها في عداد البرنامج بواسطة إرسال ذبذبات إلى مدخلات التحميل.
ولتحديد التعليمات الحالية، يمكن دمج عداد البرنامج مع السجلات الأخرى التي تحدد مقطعًا أو صفحة. حيث يسمح هذا الأسلوب لعداد البرنامج مع عدد أقل من البيتات بافتراض أن معظم وحدات الذاكرة ذات الأهمية موجودة في المنطقة المجاورة الحالية.

## العواقب في هندسة الآلة

استخدام عداد البرنامج الذي يتزايد عادة والذي يفترض أن ما يفعله الحاسوب هو تنفيذ تسلسل خطي من التعليمات. مثل عداد البرنامج المركزي في بنية فون نيومان. وهكذا يكتب المبرمجون تدفق تحكم تسلسلي حتى بالنسبة للخوارزميات التي لا يجب أن تكون متسلسلة. كما أن نتيجة (عنق الزجاجة لفون نيومان) ادة إلى البحث في الحوسبة المتوازية، بما في ذلك نماذج non-von Neumann أو نماذج تدفق البيانات التي لا تستخدم عداد البرنامج، وعلى سبيل المثال، بدلاً من تحديد الخطوات المتسلسلة، قد يحدد المبرمج عالي المستوى الوظيفة المطلوبة وقد يحدد مبرمج المستوى المنخفض ذلك باستخدام المنطق التوافقي.
يقود هذا البحث أيضًا إلى طرق جعل وحدات المعالجة المركزية التقليدية، القائمة على البرامج المضادة، تعمل بشكل أسرع، بما في ذلك:
* خطوط الأنابيب، حيث تقوم الأجهزة المختلفة في وحدة المعالجة المركزية بتنفيذ مراحل مختلفة من التعليمات المتعددة في وقت واحد.
* بنية كلمات التعليمات الطويلة جدًا، حيث يمكن بتوجيه واحد تحقيق تأثيرات متعددة.
* تقنيات للتنبؤ بالتنفيذ خارج النظام وإعداد الإرشادات اللاحقة للتنفيذ خارج التسلسل المعتاد.

## العواقب في البرمجة عالية المستوى

لا تزال لغات البرمجة عالية المستوى الحديثة تتبع نموذج التنفيذ المتسلسل، وفي الواقع هناك طريقة شائعة لتحديد أخطاء البرمجة تتمثل في«تنفيذ الإجراء» حيث يحدد اصبع المبرمج نقطة التنفيذ كما يفعل عداد البرنامج. كما اللغة رفيعة المستوى هي في الأساس لغة الآلة افتراضيه، وهي معقدة للغاية بحيث لا يمكن بناؤها كأجهزة ولكن بدلاً من ذلك يتم محاكاتها أو تفسيرها بواسطة البرامج.
ومع ذلك، تتجاوز نماذج البرمجة الجديدة البرمجة التسلسلية
* عند كتابة برنامج متعدد المؤشرات الترابطية، قد يكتب المبرمج كل مؤشر ترابط كتسلسل من الإرشادات دون تحديد توقيت لأي تعليمات بالنسبة إلى الإرشادات في مؤشرات الترابط الأخرى.
* في برمجة تعتمد على الحدث، قد يقوم المبرمج بكتابة تسلسلات من التعليمات للاستجابة للأحداث دون تحديد تسلسل إجمالي للبرنامج.
* في برمجة تدفق البياناتبرمجة تدفق البيانات، قد يقوم المبرمج بكتابة كل مقطع من خط أنابيب الحوسبة دون تحديد التوقيت بالنسبة إلى الأقسام الأخرى.

## الرمز

يستخدم الموردون أحرف مختلفة لترمز إلى عداد البرنامج في برامج لغة التجميع. فاستخدام حرف '$' هو السائد في إنتل، وزيلوج، وتكساس أنسترومنتس، وتوشيبا NEC، وسيمنز و AMD وثائق المعالج، وموتورولا، وروكويل، و تكنولوجيا الرقاقة كما تستخدم هيتاشي حرف '*'، في حين تستخدم SGS طومسون للإلكترونيات الدقيقة عداد البرنامج.