شمارنده برنامه
شمارنده برنامه (به انگلیسی: program counter = PC)، که معمولاً در اینتل اکس۸۶ و ریزپردازنده ی ایتانیوم نشانگر دستور (به انگلیسی: instruction pointer = IP) و گاهی اوقات نیز دستور آدرس ثبات (به انگلیسی: instruction address register = IAR) نامیده میشود، شمارنده دستور یا بخشی از دستور سنجش توالی در ثبات است که نشان میدهد رایانه در چه قسمتی از توالی برنامه قرار دارد. ) در اکثر فرایندها، PC پس از دریافت مجموعه دستورالعمل توسعه میابد و آدرس حافظه ی (نقاط مختلف) دستور بعدی را که باید اجرا شود در خود نگه میدارد. (در فرایندهای فراخوانی با اولویت، PC به دستوری که دقیقاً در حال اجرا است اشاره میکند)
دستورها اغلب به صورت ترتیبی از حافظه بیرون کشیده میشوند، اما کنترلکنندهٔ انتقال دستورها با قرار دادن مقدار جدیدی برای PC این ترتیب را تغییر میدهد. که این شامل انشعابات (برخی اوقات پرش نامیده میشود)، فراخوان رویه و بازگشتها است. انتقالی که مشروط به درست بودن یک ادعا است به رایانه این اجازه را میدهد که تحت شرایط مختلف از ترتیبهای متفاوتی پیروی کند.
یک انشعاب دستوری را آماده میکند که توسط بخشی دیگر از حافظه فراخوانی شدهاست. یک فراخوان رویه نه تنها انشعابات را ایجاد میکند بلکه محتویات سابق PC را نیز در جایی ذخیره میکند. یک بازگشت محتویات ذخیره شدهٔ PC را بازمی گرداند و دوباره در محل PC قرار میدهد، حاصل این عمل اجرای ترتیبی با دنبالکنندهٔ فراخوان رویه است.
پیادهسازی سخت افزاری
در یک پردازنده معمولی، PC یک شمارنده باینری است (منبع شمارنده برنامه) که ممکن است یکی از بسیار ثبات موجود در سخت افزار پردازنده باشد. شرخه دستورها با واکشی (به انگلیسی: fetch) آغاز میشود، که در آن پردازنده مقدار PC را در گذرگاه آدرس برای ارسال به حافظه قرار میدهد. حافظه با قرار دادن محتویات موقعیت اعلام شده بر روی گذرگاه به این عمل پاسخ میدهد. در ادامهٔ واکشی، فرایندهای پردازنده اجرا میشوند که شامل چندین فعالیت برحسب گرفتن اطلاعات از حافظه هستند. از طرفی در این چرخه، PC اصلاح میشود در نتیجه دستور بعدی که اجرا میشود با قبلی متفاوت است.(بهطور معمول، با فواصل کوچکی تغییر میابد در نتیجه دستور بعدی که شروع میشود در آدرس حافظهای است که بلافاصله بعد از مکان دستور کنونی در حافظه قرار دارد)
مانند دیگر ثباتهای فرایند، PC نیز ممکن است بانکی از قفلهای باینری باشد، که هر کدام مسئول یک بیت از ارزش PC هستند. تعداد بیت ها(طول PC) به معماری فرایند وابسته است. برای مثال، یک پردازندهٔ ۳۲بیتی ممکن است برای آدرس دهی به 2³² واحد از حافظه از کل ۳۲بیت خود استفاده کند.
برای تشخیص دستورها کنونی، ممکن است PC با دیگر ثباتها برای تشخیص قطعهبندی و صفحه ادغام شود.
نتایج در معماری ماشین
PC بهطور معمول در نظر میگیرد که رایانه در حال اجرای یک خط مرتب از دستورها است. این قبیل PC (یا دیگر سخت افزارهایی که خدمات و اهداف مشابهای دارند) بر مبنای معماری فون نویمان عمل میکند. به این صورت برنامهها دستورها پیرو جریان را حتی برای الگوریتمهایی که نباید ترتیبی باشند نیز می نویسند. نتیجهٔ معماری فون نویمان دستیابی به محاسبات موازی است. مدلهای غیر فون نویمان و جریان داده (به انگلیسی: dataflow) که از PC استفاده نمیکنند؛ به جای تعیین گامهای ترتیبی در آن ممکن است برنامه با اولویت بالا تابع مطلوب و برنامه با اولویت پایین استفاده از این منطق ترکیبی را تعیین کند.
همچنین این تحقیقات در مسیر ایجاد قراردادهایی بر مبنای PC و افزایش سرعت پردازنده پیش میروند که شامل موارد زیر هستند:
- خط لوله، که سخت افزارهای متفاوت در پردازنده مرحلههای متفاوت از یک دستور را بهطور همزمان اجرا میکنند.
- معماری کلمه دستورالعمل بسیار طولانی، که در آن یک دستور میتواند به چندین اثر دست یابد.
- تکنیکی برای پیشگویی اجرای خارج از دستور (به انگلیسی: Out-of-order execution) و آمادهسازی دستورها ثانویه برای اجرا در خارج از ترتیب مقرر.
نتایج در برنامهنویسی سطح بالا
زبانهای برنامهنویسی سطح بالای امروزه نیز؛ هنوز از مدل اجرای ترتیبی پیروی میکنند، و در حقیقت رایجترین راه برای تشخیص خطاهای برنامه در رویه اجرا این است که نشانگر برنامه؛ خطی را نشان دهد که PC به آن اشاره میکند. یک زبان سطح بالا در واقع یک ماشین مجازی برای زبان است، بسیار پیچیده برای ساخته شدن به شکل سخت افزار اما قابل تقلید یا تفسیر توسط نرمافزار. اگرچه، مدلهای برنامهنویسی امروزه فراتر از برنامهنویسی به روش اجرای ترتیبی هستند.
- زمانی که یک برنامهٔ چندریسمانی نوشته میشود، ممکن است برنامهنویس هر رشته را به عنوان ترتیبی از دستورها بنویسد؛ بدون توجه به آنکه زمان اجرای هر دستور به اجرای دستور ریسه دیگر وابسته است.
- دربرنامهنویسی رویدادمحور، ممکن است برنامهنویس ترتیبی از دستورها را برای پاسخگویی به رویدادها بدون مشخص کردن ترتیب کلی برنامه بنویسد.
- در برنامهنویسی جریان داده (به انگلیسی: dataflow programming)، ممکن است برنامهنویس هر بخش از محاسبات خط لوله را بدون مشخص کردن ارتباط زمانی آن با دیگر بخشها بنویسد.