به نام خدا
Download
1 / 84

به نام خدا - PowerPoint PPT Presentation


  • 81 Views
  • Uploaded on

به نام خدا. فصل نهم کنترل زیربرنامه. استاد مربوطه: استاد بیدکی. رویا ادراکی فاطمه مصلحی. فهرست. مفاهیم زیربرنامه ها و تعاریف اولیه زبربرنامه ساده فراخوانی –برگشت زیربرنامه های بازگشتی صفات کنترل داده حوزه ایستا و پویا وابستگی ها و محیط های ارجاع مفاهیم اصلی کنترل داده

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' به نام خدا' - spyridon-galen


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
به نام خدا

فصل نهم

کنترل زیربرنامه

استاد مربوطه: استاد بیدکی

  • رویا ادراکی

  • فاطمه مصلحی


فهرست

مفاهیم زیربرنامه ها و تعاریف اولیه

زبربرنامه ساده فراخوانی –برگشت

زیربرنامه های بازگشتی

صفات کنترل داده

حوزه ایستا و پویا

وابستگی ها و محیط های ارجاع

مفاهیم اصلی کنترل داده

نام مستعار

ساختار بلوکی

داده های محلی و محیط های ارجاع محلی

پارامترها و انتقال پارامترها

پیاده سازی انتقال پارامترها

محیط های مشترک صریح

اشتراک صریح متغیر

پیاده سازی حوزه پویا

پیاده سازی حوزه ایستا


در زبان های برنامه سازی مدرن ، مجموعه ای از دستورات که هدف مشترکی دنبال می کنند ، برای استفاده مجدد درون زیربرنامه ها نوشته می شوند.

زیربرنامه سطحی از انتراع را در برنامه فراهم می کند ، زیرا مجموعه ای از دستورات درون برنامه با یک دستور فراخوان جایگزین می شوند.

پس جزییات پیاده سازی را پنهان می کند و خوانایی برنامه ها با نمایش ساختار منطقی برنامه و پنهان کردن جزییات سطح پایین ، افزایش می یابد.

مفاهیم زیربرنامه ها و تعاریف اولیه


این پیاده سازی توسط مجموعه ای از دستورات که هدف مشترکی دنبال می کنند ، برای استفاده مجدد درون زیربرنامه ها نوشته می شوند. قاعده کپی توضیح داده می شود: اثر دستور فراخوانی مثل این است که قبل از اجرا، یک کپی از زیربرنامه در نقطه ی فراخوانی قرار داده شده است.

فرضیه های قاعده کپی:1.زیربرنامه ها نمی توانند بازگشتی باشند. 2.نیاز به دستور فراخوانی صریح است. 3.زیربرنامه ها در هر فراخوانی باید بطور کامل

اجرا شوند. 4.کنترل به نقطه فراخوانی برمی گردد. 5.در هر زمان فقط یک زیربرنامه کنترل را در

دست دارد.

زیربرنامه ساده فراخوانی -برگشت


1 مجموعه ای از دستورات که هدف مشترکی دنبال می کنند ، برای استفاده مجدد درون زیربرنامه ها نوشته می شوند. .زیربرنامه ها نمی توانند بازگشتی باشند:بازگشتی مستقیم: اگر زیربرنامه ای خودش را فراخوانی کند.بازگشتی غیرمستقیم: اگر زیربرنامهA زیربرنامه B را فراخوانیکندوزیربرنامه Bنیززیربرنامه A را فراخوانی نماید.

در فراخوانی های بازگشتی مستقیم،نمی توانیم از قاعده کپی استفاده کنیم، زیرا هر جایگزینی که یک دستور فراخوانی را حذف می کند،فراخوانی جدیدی به همان زیربرنامه را معرفی می کند که برای آن جایگزین دیگری لازم است.


2.نیاز به دستور فراخوانی صریح است: مجموعه ای از دستورات که هدف مشترکی دنبال می کنند ، برای استفاده مجدد درون زیربرنامه ها نوشته می شوند. برای اعمال قاعده کپی،هر نقطه از فراخوانی زیربرنامه باید صریحا مشخص شود تا ترجمه گردد.

  • 3.زیربرنامه ها در هر فراخوانی باید بطور کامل اجراشوند

    هر زیر برنامه ای در هر فراخوانی،از ابتدا تا انتها اجرا خواهد شد.

زیربرنامه هایی که برای پردازش استثنا به کار می روند،نیاز به فراخوانی صریح ندارند.

زیربرنامه هایی که به عنوان همروال مورد استفاده قرار می گیرند،هروقت فراخوانی می شوند از نقطه ای که آخرین بار اجرا شده اند،از سرگرفته می شوند.


4.کنترل به نقطه فراخوانی برمی گردد: دستور فراخوانی صریح در یک برنامه نشان می دهد که کنترل در آن نقطه به زیربرنامه منتقل می شود و لذا کپی کردن بدنه زیربرنامه در آن نقطه از برنامه نیز همان اثر را دارد .

  • 5.در هر زمان فقط یک زیربرنامه کنترل را در دست دارد:

    کنترل اجرا از برنامه فراخوان به زیربرنامه فراخوانی شده می رود و به برنامه

    فراخوان برمی گردد.

اما برای فراخوانی زیربرنامه های زمانبندی شده،اجرای زیربرنامه ممکن است مدتی به تعویق افتد.

اما زیربرنامه هایی که بعنوان تسک مورد استفاده قرار می گیرند،ممکن است بطور همزمان اجرا شوند


فراخوانی زیربرنامه ها به دوشکل انجام می شود:

فراخوانی تابع:

برای زیربرنامه هایی که مقادیر را بطور مستقیم برمیگردانند.

فراخوانی رویه یا زیرروال:

برای زیربرنامه هایی که اثرات جانبی روی داده های مشترک دارند.

پیاده سازی:

فرض می کنیم ترتیب دستورات و عبارات در زمان اجرا،بصورت بلوکی از کد هستند.

اجرای این کدها مفسر سخت افزار یا مفسر نرم افزار


در مورد هر زیربرنامه دو مفهوم وجود دارد: تعریف زیربرنامه: آن چیزی است که در برنامه می نویسیم و به یک قالب تبدیل می شود.مثل: نام و نوع متغیرها، دستورات حلقه و...سابقه فعالیت: در هربار فراخوانی با استفاده از قالب که از تعریف ایجاد شده، بوجود می آید.

1. سگمنت کد: حاوی کد اجرایی و ثوابت است.سابقه فعالیت:

2.رکورد فعالیت: حاوی داده های محلی،پارامترها و سایر عناصر است.

در حین اجرا تغییر نمی کند.

توسط مترجم ایجاد می شود.

بطور ایستا در حافظه قرار می گیرد.

تمام سابقه فعالیت زیربرنامه از یک سگمنت کد استفاده می کنند.


اشاره گر دستور فعلی( وجود دارد:(CIP

؟؟؟؟؟؟

برای نگهداری نقطه ای که زیربرنامه برنامه از آنجا اجرا می شود،به چه چیزهایی نیاز داریم؟؟؟؟

  • چون تمام سابقه های فعالیت یک زیربرنامه از یک سگمنت کد استفاده می کنند،اشاره گری باید وجود داشته باشد که سابقه فعالیت مورد استفاده را هم مشخص کند.

در هر نقطه،در حین اجرای برنامه به اشاره گری نیاز داریم که دستوری را که در سگمنت کد وجود دارد و فعلأ توسط مفسر در حال اجراست را،مشخص کند.

اشاره گر محیط فعلی((CEP


وقتی کنترل به دستور فراخوانی زیربرنامه رسید،یک رکورد فعالیت* از آن برنامه ایجاد و CEP به آن اشاره می کند، هم چنین CIPبه اولین دستور سگمنت کد زیربرنامه اشاره خواهد کرد.

*رکورد فعالیت،محیط ارجاع را مشخص می کند.

مثال:

وقتی دستوری در کد به متغیر X مراجعه می کند، هر رکورد فعالیت دارای شی X است ولی محتویاتش ممکن است با شی دیگری متفاوت باشد.


؟؟؟؟؟

تکلیف مقدار CEP و CIP زیربرنامه قبلی چی میشه؟؟

می توان CEP و CIP زیربرنامه فراخوان را در رکورد فعالیت زیربرنامه ای که فراخوانی می شود ذخیره کرد.در این حالت شی داده ای دیگری بنام نقطه برگشت توسط سیستم در رکورد فعالیت بوجود می آید.

نقطه برگشت:شامل فضایی برای دو مقدار اشاره گر است(CIPوCEP)


فراخوانی برگشت را فراخوانی کند،برای رکورد فعالیت آن زیربرنامه مقادیر جدیدی در

  • شکل صفحه295


مدل ساده تری از پیاده سازی زیربرنامه

  • برای رکورد فعالیت هر زیربرنامه بطور ایستا حافظه تخصیص می یابد.

  • (پیاده سازی های فرترن و کوبول)

  • و با هر فراخوانی زیربرنامه ،همان رکورد قبلی در اختیارش قرار می گیرد که در

  • این شرایط که هر زیربرنامه فقط یک رکورد فعالیت دارد،نیازی به اشاره گر

  • CEP نمی باشد.

شرط استفاده از این مدل برای افزایش سرعت اجرا، بایدحافظه زیادی در اختیار داشته باشیم.


مدل کلی تری از فراخوانی و برگشت(برگشت-پرش)

  • سخت افزار یک دستور برگشت-پرش را تدارک می بیند که فراخوانی زیربرنامه را با یک دستور سخت افزاری پیاده سازی می کند.

  • در این مدل CIP (اشاره گر دستور فعلی) با ثبات آدرس برنامه ی سخت افزار نمایش داده می شود.

در این مدل توسط سخت افزار نیز،پشتیبانی اندکی ارائه می شود.

نتیجه این مدل پیاده سازی تخصیص ایستای رکوردهای فعالیت


برگشت- پرش برگشت(برگشت-پرش)

  • 296 شکل صفحه


یاد آوری برگشت(برگشت-پرش):پیاده سازی پشته ای

  • برای مدیریت این پشته،نیاز به یک اشاره گر پشته است که همواره به بالای پشته اشاره می کند.

  • هنگامی که زیربرنامه ای صدا زده می شود،رکورد جدیدی بالای پشته ساخته می شود و با تمام شدن برنامه، آن را از بالای پشته حذف می کند.

  • در اغلب پیاده سازی های پاسکال،یک پشته مرکزی برای رکوردهای فعالیت زیربرنامه و یک حافظه ایستا برای سگمنت کد برنامه ها اختصاص داده می شود.

ساده ترین تکنیک مدیریت حافظه در زمان اجرا،روش استفاده از پشته است.



زیربرنامه های بازگشتی برگشت(برگشت-پرش)

مشخصات:اگر فراخوانی بازگشتی برنامه امکان پذیر باشد،A می تواند هر زیربرنامه ای از جمله خودش را فراخوانی کند.پیاده سازی: به دلیل امکان وجود چندین سابقه فعالیت بطور همزمان،به هر دو اشاره گرCEPوCIP نیاز داریم. به این صورت که در ازای هر فراخوانی زیربرنامه،محتوایهردو اشاره گرCEPوCIP در پشته ذخیره می شوند و در ازای retutrn از پشته pop می شوند.


زبان هایی که کامپایلر آنها در یک گذر کار می کنند ، موقع ترجمه ی زیربرنامه های بازگشتی ممکن است با مشکلاتی مواجه شوند.

مثلا: اگر B,Aدو زیربرنامه باشند بطوریکه Aزیربرنامه Bرا فراخوانی کند وB نیز زیربرنامهA را فراخوانی کند، نمی توان تعیین کرد که کدام زیربرنامه باید زودتر نوشته شود.

چون هر زیربرنامه ای که فراخوانی می شود ،کامپایلر باید آن را ترجمه کرده باشد تا بتواند ارجاع به آن را بسازد.

پاسکال این مشکل را با اعلان پیشرو حل می کند:

Procedure A( (پارامتر مجازی ;forward;

اعلان پیشرو در پاسکال


مثال:( گذر کار می کنند ، موقع ترجمه ی زیربرنامه های بازگشتی ممکن است با مشکلاتی مواجه شوند.اعلان پیشرو)

برنامه ترجمه نمی شود ، زیرا anomlyیک برنامه نامعتبر است.

فراخوانی S در محل 2، رویه موجود در محل 3 را فراخوانی می کند و این یک ارجاع پیشرو است که فاقد اعلان forward است.

Program anomaly;

procedure S; {1}

begin {of S}

end; {of S}

procedure T;

{missing procedure S; forward; here}

procedure U;

begin {of U}

S; {2}

end; {of U}

procedure S; {3}

begin {of S}

end; {of S}

begin {of T}

U;

end; {of T}

begin {of anomaly


صفات کنترل داده ها گذر کار می کنند ، موقع ترجمه ی زیربرنامه های بازگشتی ممکن است با مشکلاتی مواجه شوند.

وقتی که عملیاتی در یک زبان نوشته می شود،باید چگونگی آماده سازی داده ها نیز معلوم باشد. صفات کنترل داده ها تعیین می کند که وقتی به یک عملیات می رسیم:

1- چه داده هایی باید برای آن عملیات قابل مشاهده و در دسترس باشند.

2- این داده ها چگونه برای عملیات آماده شوند.

3- نتایج عملیات چگونه ذخیره و توسط عملیات بعدی بازیابی شوند.


مثال: گذر کار می کنند ، موقع ترجمه ی زیربرنامه های بازگشتی ممکن است با مشکلاتی مواجه شوند.

دستور X:=y+2*Zرا در نظر بگیرید.مساله مهم کنترل داده در مورد :y

1- y ممکن است یک متغیر محلی یا غیرمحلی باشد.از کدام y بایداستفاده کنیم(نقش حوزه).2- اگر y یک پارامتر مجازی باشد که از طریق زیربرنامه انتقال یافتهاست،آنگاه روش های انتقال پارامتر مطرح می شود.3- اگر y نام یک زیربرنامه فاقد پارامترباشد،مکانیزم های برگشت نتایجمطرح می شود.


حوزه گذر کار می کنند ، موقع ترجمه ی زیربرنامه های بازگشتی ممکن است با مشکلاتی مواجه شوند.

حوزه ی یک متغیر ، محدوده ی دستوراتی است که متغییر در آنها قابل مشاهده است.

  • قوانین حوزه ی یک زبان تعیین می کند که حضور یک نام در برنامه چگونه و به چه متغیری مربوط می شود.

  • یه عبارت بهتر به کمک قوانین حوزه می توانیم تعیین کنیم که ارجاع به متغیرهای خارج از زیربرنامه ی فعلی به کدام اعلان مربوط می شوند.

  • پس از بدست آوردن اعلان مورد نظر، صفات آن متغیرها از جمله آدرس حافظه قابل محاسبه می شود(برای کامپایلر)


داده ها به دو روش به عنوان عملوند عملیات به کار می روند:

1- انتقال مستقیم: در یک عبارت محاسباتی وقتی عبارتی محاسبه می شود، نتیجه آن عبارت بصورت مستقیم در اختیار بخش بعدی عملیات قرارمیگیرد.این نوع انتقال: الف)در حافظه موقت ذخیره می شود. ب)تا آخر طول عمرش معمولا نامی ندارد مثال: عبارت 2*Z در عبارت x:=y+2*Z با انتقال مستقیم به عملیات جمع با y منتقل می شود.

2-از طریق داده ی نامدار: با اعلان های ضمنی و صریح در برنامه قابل استفاده هستند.

وقتی می خواهیم به داده ای دوباره مراجعه کنیم از طریق نام به آن رجوع می کنیم.


عناصر نامدار عملیات به کار می روند:

ساده: نام یک متغیر ساده،پارامتر مجازی، زیربرنامه و ...

اسامی

مرکب: نامی که به یک مولفه از ساختمان داده مربوط می شود.

مثال:اگرA یک آرایه باشد، نام A اسمی ساده و A[3] یک نام مرکب است.

.

عناصر زیادی در برنامه نامدار هستند،ولی سه مورد ازآنها در کنترل داده ها اهمیت دارند:1- متغیرها 2- پارامترهای مجازی 3- انواع داده ای تعریف شده


  • برای هر داده معمولا یک نام(شناسه) در نظر می گیرند.

  • اینکه کدام شناسه به چه داده ای مربوط شده است را وابستگی می گویند.

  • (انقیاد زمان اجرا یا ترجمه)

وابستگی ها و محیط های ارجاع

در آغاز اجرای برنامه اصلی دو دسته از وابستگی ها اتفاق می افتد:

وابستگی شناسه ها: نام هر متغیر درون برنامه را به یک داده(حافظه) مقید می کند.

وابستگی زیربرنامه ها: که نام زیربرنامه هایی را که در برنامه فراخوانی می شود به یک تعریف

بخصوص مرتبط می سازد.

در حین اجرای برنامه داده هایی در حافظه کامپیوتر ایجاد می شود و مورد استفاده قرار می گیرند.

مثال:

در دستورA:=B+fun(C)چهار عمل ارجاعی اتفاق می افتد. سه عمل ارجاعی، عملوندهای متناظر با سه شناسه A,B,C را تعیین می کنند و عمل ارجاعی چهارم زیر برنامه مربوط به fun را ارزیابی می کند.


مفاهیم اصلی کنترل داده ها نام(شناسه) در نظر می گیرند.

در فراخوانی و برگشت از زیربرنامه ها،وابستگی ها مرتبا ایجاد و نابود می شوند. بر این اساس پنج مفهوم اصلی کنترل داده: 1- محیط های ارجاع 2- قابلیت مشاهده 3-حوزه پویا 4-عملیات ارجاع 5-ارجاع های محلی،غیر محلی و عمومی


  • محیط ارجاع در حین اجرا نام(شناسه) در نظر می گیرند. ثابت است و در طول اجرا بدون تغییر می ماند.

  • محیط ارجاع یک دستور در یک زبان با حوزه ایستا شامل متغیرهایست که در حوزه آن دستور اعلان شده اند بعلاوه مجموعه متغیرهایی که از حوزه های بالاتر برای آن دستور قابل مشاهده اند.

  • محیط ارجاع چند جزء دارد:

  • 1- محیط ارجاع محلی 2-محیط ارجاع غیرمحلی

  • 3- محیط ارجاع عمومی 4- محیط ارجاع از پیش تعریف شده

محیط های ارجاع

محیط ارجاع یک دستور،مجموعه همه ی متغیرهایی(شناسه ها) است که برای آن دستور قابل مشاهده و در دسترس هستند.


محیط ارجاع محلی نام(شناسه) در نظر می گیرند.

شامل متغیرها یا وابستگی هایست که در هنگام ورود به یک زیربرنامه ایجاد می شوند و

فقط در آن زیر برنامه قابل مشاهده هستند.

مثال: پارامترهای مجازی،متغیرهای محلی،زیربرنامه های که درون زیربرنامه تشکیل شده اند...

محیط ارجاع غیر محلیمجموعه ای از وابستگی های مربوط به شناسه هایی که در زیربرنامه استفاده می شوند ولی هنگام ورود به آن ایجاد نمی شوند.مثال:در پاسکال اگر تابع fدرg تعریف شده باشد،محیط ارجاع غیرمحلی برایf ،محیط ارجاع محلی برای G می باشد.


محیط ارجاع عمومی نام(شناسه) در نظر می گیرند.

متغیرها و وابستگی هایی که در آغاز اجرای برنامه ایجاد می شوند و در همه زیربرنامه ها

قابل استفاده هستند را محیط ارجاع عمومی می گوییم.

*** محیط عمومی بخشی از محیط غیرمحلی هستند.

محیط ارجاع از پیش تعریف شدهشامل اسامی است که توسط کامپایلر تعریف شده و داخل برنامه قابل دسترس هستند. این شناسه ها بدون اعلان صریح قابل استفاده هستند.مثال:داده ها یا نام زیربرنامه هایی که در کتابخانه استاندارد هر زبان تعریف شده اند.


قابلیت مشاهده نام(شناسه) در نظر می گیرند.

وابستگی یک شناسه(یک متغیر یا زیربرنامه)، وقتی در یک زیربرنامه قابل

مشاهده است که بخشی از محیط ارجاع آن باشد.

یک متغیر ممکن است وجود داشته باشد ولی در یک زیربرنامه قابل مشاهده نباشد.

اصطلاحا متغیر پنهان است و در محیط ارجاع آن زیربرنامه یا دستور بخصوص قرار ندارد.

  • حوزه پویا

  • وابستگی هر شناسه یک وابستگی ایستا دارد و یک وابستگی پویا.

  • وابستگی ایستا هنگام ترجمه قابل تعیین است ولی وابستگی پویا هنگام اجرای برنامه تعیین می شود(با مفهوم رکورد فعالیت در ارتباط است).


در حوزه پویا برای پیدا کردن وابستگی یک شناسه باید در زمان اجرا رکورد فعالیت جاری جست و جو شده و در صورت عدم پیداشدن وابستگی رکوردهای فعالیت زنجیره پویا به ترتیب جستجو شوند تا وابستگی یافت شود.

از قانون تازه ترین وابستگی استفاده می کند.

لیسپ ، اسنوبال و APL از قواعد حوزه پویا استفاده می کنند.

زنجیره پویا:در هنگام عملیات کنترل ترتیب،زنجیره ای از رکوردهای فعالیت روی پشته ساخته می شود که اصطلاحأ به آن زنجیره پویا می گویند( هر رکورد فعالیت در آن به رکورد فعالیت زیربرنامه ای که آن را صدازده اشاره می کند)


قاعده حوزه ایستا ، ارجاع ها را به اعلان اسامی در متن برنامه ربط می دهد.

در حوزه ارجاعی ایستا اسامی در زمان کامپایل و بر اساس ساختار تودرتوی زیربرنامه ها مشخص می شوند.

قواعد حوزه ایستا، بدون نیاز به ردیابی اجرای برنامه می تواند اسامی ارجاع شده در برنامه را به اعلان آن ها ربط دهد.

اشاره گر زنجیره ایستا : حاوی ترتیب اعلان زیربرنامه هاست.


عملیات ارجاع نام(شناسه) در نظر می گیرند.

با توجه به یک شناسه و محیط ارجاع ، وابستگی مناسبی را برای آن شناسه در آن محیط ارجاع پیدا می کند و شیء داده ی وابسته یا تعریف برنامه را برمی گرداند.کامپایلر برای تولید کد به عملیات ارجاع نیاز دارد.وقتی که نامی را پردازش می کند باید بداند یک متغیر است یا زیربرنامه.امضای ارجاع:

Ref_op: id* refrencing_environmentdata_object or subprogram


نام مستعار برای اشیای داده نام(شناسه) در نظر می گیرند.

  • اگر در یک محیط ارجاع بتوان از طریق بیش از یک نام به شی داده ای دست یافت هر کدام از نام ها را نام مستعار شی می نامند.

Program main(output);

Var I : integer;

Procedure sub1(var J: integer);

begin

…{ I and J refer to same }

end; { data object here }

Procedure sub2;

var I : integer;

begin

sub1(I); { I is visible, J is not}

end;

Begin

Sub2{I is visible, J is not}

End.

(b) I and J are aliased in sub1

Program main(output)

Procedure sub1(var J : Iinteger)

begin

…{J is visible , I not }

end;

Procedure sub2;

var I : integer;

sub1(I);{I is visible , J is not }

end;

begin

sub2{ neither is visible }

end.

(a) NO aliasing


X := A + B ;

Y := C + D ;

مثال:

انتساب به X,Y مستقل از یکدیگر است و به هر ترتیبی امکان پذیرمی باشند.

اما اگرX,Cنام مستعاری برای یک شیء داده باشند در این صورت این دو دستور به هم وابسته اند و نیاز به ترتیب اجرای مشخص دارند.

  • به خاطر مشکلاتی که نام مستعار ایجاد می کند ،طراحی زبان جدید سعی در حذف یا محدود کردن نام مستعار دارند.


ساختار بلوکی برنامه نویس به وجود می آورد،زیرا درک برنامه را دشوار می کند.

  • مفهوم ساختار بلوک در زبان های ساخت یافته بلوکی مثل پاسکال پیدا شد.

  • در یک زبان ساخت یافته بلوکی،هر برنامه یا زیربرنامه به صورت مجموعه ای از بلوک های تودرتو سازمان دهی می شود.

  • هر بلوک، با مجموعه ای از اعلان ها برای اسامی(اعلان متغیرها،تعریف نوع،تعریف ثوابت و غیره)شروع می شود و سپس دستورات قرار می گیرند.

  • اعلان های موجود در یک بلوک،محیط ارجاع محلی آن را تعریف می کند.


1. اعلان های ابتدای هر بلوک محیط ارجاع محلی بلوک را می سازند.هر ارجاع به شناسه ای در بدنه بلوک(که شامل بلوک های تودرتو نیست)،به عنوان ارجاع به اعلان محلی آن شناسه مربوط می شود.

2. اگر در بدنه بلوک برای شناسه ای اعلان محلی وجود نداشته باشد،آن ارجاع به یک اعلان در اولین بلوکی که آن را در بر گرفته محسوب می شود.

3.در بلوک های تودرتو هر اعلان در بلوک داخلی از بلوک های خارجی تر پنهان است.

4.بلوک می تواند دارای نام باشد. نام بلوک به عنوان بخشی از محیط ارجاع بلوکی که آن را در بر می گیرد محسوب می شود.

مثال: Procedure p ( A : real )

  • P نام محلی در برنامه اصلی است.

  • پارامتر مجازی A بخشی از محیط محلیp

  • در برنامه اصلی Pقابل ارجاع ولی A قابل ارجاع نیست.


اعلان ها در بلوک های محلی برنامه های ساخت یافته بلوکی:

برای پیاده سازی این اعلان ها نمی توان از رکورد فعالیت استفاده کرد بلکه از تکنیکی شبیه ساختار حافظه استفاده می کنیم.

  • مثال:

  • Kو l همانندmو n می توانند از یک محل حافظه استفاده کنند،زیرا همزمان نمی توانند فعال باشند.


داده های محلی و محیط های ارجاع محلی

  • محیط محلی زیربرنامه شامل شناسه های که در عنوان زیربرنامه (به جز نام خود زیربرنامه) اعلان شده اند.

  • برای محیط های محلی قواعد حوزه پویا و ایستا سازگارند.

  • برای پیاده سازی حوزه ی ایستا کامپایلر ممکن است جدولی از اعلان های محلی برای شناسه ها داشته باشد.

پیاده سازی قاعده حوزه ی پویا به دو روش انجام می گیرد :

  • نگهداری 2. حذف

نگهداری : وابستگی x در حین فراخوانی های مختلف، نگهداری می شود.

حذف : وابستگی X در بین فرا خوانی های مختلف حذف می شود.


مثال: محلی

.

Procedure R;

End;

Procedure Q;

Var X : integer := 30;

Begin

write(X);

R;

X := X + 1;

write(X);

End;

Procedure P;

Q;

End;

اگر وابستگیx نگهداری شود ، در فراخوانی دوم عدد31 چاپ می شود.

اگر وابستگیx حذف شود، در هر بار اجرای Q،30 چاپ می شود.

  • C ،پاسکال ، ادا ، لیسپ ،اسنوبال4و APLحذف

  • کوبول و فرترننگهداری

  • PL/Iنگهداری و حذف


  • در این پیاده سازی بهتر است محیط محلی زیربرنامه به صورت جدول محیط ارجاع نشان داده شود.

  • با استفاده از این جدول ، پیاده سازی روش های حذف و نگهداری ساده تر خواهد شد.


  • اگر محیط ارجاع محلی زیربرنامه بین فراخوانی های مختلف نگهداری شود فقط یک جدول محیط محلی ایجاد می شود.

  • این جدول به عنوان بخشی از سگمنت کد sub محسوب می شود.

  • کامپایلر اندازه هر متغیر را در جدول محیط محلی تعیین می کند و آفست شروع شی داده را از شروع سگمنت کد(آدرس پایه) پیدا می کند.


  • اگر محیط محلی sub در بین فراخوانی ها حذف شود و هنگام ورود به آن دوباره ایجاد شود،جدول محیط محلی متغیرهای حذف شده ،به عنوان بخشی از رکورد فعالیت sub تخصیص می یابد.

  • رکورد فعالیت هنگام ورود به sub در یک پشته مرکزی ایجاد و با خروج از زیربرنامه حذف می شود.(حذف محیط محلی به صورت خودکار انجام می گیرد.)

  • اگر sub در حال اجرا باشد وبه متغیر Yمراجعه کند،محل شی داده وابسته به Y با افزودن آفستY به محتویاتCEP به دست می آید.


در پیاده سازی محلی نگهداری و حذف به چند نکته باید توجه کرد:

1.در پیاده سازی ساختار فراخوانی –برگشت(غیر بازگشتی)نگهداری و حذف پیاده سازی یکسانی دارند.

  • آنهایی که مقادیرشان در سگمنت کد نگهداری می شود

  • آنهایی که مقادیرشان در رکورد غعالیت قرار می گیرد و باید حذف شوند.

  • در پاسکال

  • static نگهداری

  • automatic حذف

2.با هر متغیر به دو شکل می توان برخورد کرد:

3.نام زیر برنامه به اعلانی برای آن زیربرنامه در محیط محلی وابسته است و همواره نگهداری می شود.

4.نام پارامتر مجازی ،یک شی داده را نشان

می دهد که در هر بار فراخوانی زیربرنامه ،

مقدار جدیدی می گیرد.با این پارامترها به روش حذف وابستگی برخورد می شود.


امتیازات ومعایب روش نگهداری و حذف:

  • روش نگهداری باعث ایجاد برنامه هایی می شود که نسبت به گذشته حساس هستند .

  • در روش حذف برای نگهداری متغیرها بین فراخوانی های مختلف باید برای آن زیربرنامه به صورت غیرمحلی اعلان شوند.

  • برای زیربرنامه بازگشتی ،روش حذف ،روش متداولتری است.

  • روش حذف باعث صرفه جویی در حافظه می شود، چون جدول های محیط محلی فقط برای برنامه ای که در حال اجراست وجود دارند.

  • در روش نگهداری،جدول های محیط محلی برای تمام زیربرنامه ها در طول اجرا وجود دارد.


انتقال پارامترها و نتایج حذف:

محیط های مشترک صریح

پارامترها و انتقال پارامترها

به چهار طریق می توان محیط های مشترکی بین زیربرنامه ها ایجاد کرد تا به اطلاعات مشترک دسترسی داشته باشند:

در یک برنامه کامپیوتری،موارد بسیاری رخ می دهد که یک سری اطلاعات باید بین تعدادی از زیربرنامه ها به اشتراک گذاشته شود.برای دسترسی به داده های مشترک:

محیط های مشترک و غیرمحلی صریح

حوزه ی ایستا

حوزه ی پویا

وراثت


پارامترهای مجازی و واقعی حذف:

  • اصطلاح آرگومان و نتیجه به داده هایی اطلاق می شودکه با مکانیزم های مختلفی به زیربرنامه ارسال و از آن دریافت می شود.

  • پارامتر مجازی نوعی شی داده محلی در یک زیربرنامه است که نام آن شناسه ای ساده است و اعلان آن ،نوع و سایر صفات را مشخص می کند.

  • پارامتر واقعی یک شی داده است که با زیر برنامه فراخوان مشترک است.


تناظر بین پارامترهای واقعی و مجازی

1. تناظر موقعیتی 2. تناظر بر اساس نام

تناظر بر اساس نام:در برخی زبان ها چون ادا پارامترهای مجازی با پارامترهای واقعی صریحا توسط نام متناظر می شوند. Sub(Y=>B,X=>27)

  • تناظر موقعیتی: تناظر بین پارامترهای مجازی و واقعی بر اساس موقعیت آنها در لیست پارامترهای واقعی و مجازی تعیین می شود.

  • اغلب زبان ها از تناظر موقعیتی استفاده می کنند.


قبل از انتخاب روش انتقال پارامترها، باید مدل معنایی انتقال پارامتر خود را مشخص کنیم و طبق مدل معنایی مورد انتظار بهترین روش را برگزینیم.

پارامترهای مجازی با یکی از سه مدل معنایی زیر شناخته می شوند:

پارامترهای واقعی به پارامترهای مجازی ارسال شوند (حالت ورودی)

مقدار پارامتر توسط زیربرنامه تولید و هنگام خروج به پارامتر واقعی زیربرنامه ارسال شود (حالت خروجی)

مقدار پارامتر هنگام فراخوانی به زیربرنامه ی فراخوانی شده منتقل می شود و هنگام خروج از آن ، مقدارش در پارامتر واقعی در زیربرنامه فراخوان قرار می گیرد(حالت ورودی خروجی)

مدل های معنایی انتقال پارامترها


انتقال پارامترها پارامترها، باید

فراخوانی با نام

فراخوانی با ارجاع(آدرس)

فراخوانی با مقدار

فراخوانی با مقدار ثابت

فراخوانی با نتیجه

فراخوانی با مقدار-نتیجه

انتقال پارامترها روش هایی هستند که پارامترها را به زیربرنامه ها ارسال کرده و از آنها دریافت می کنند.روش های انتقال پارامتر:


  • فراخوانی با نام ، انتقال پارامتر در حالت ورودی/خروجی است.

  • وقتی پارامترها از طریق نام ارسال می شوند ، پارامتر واقعی جایگزین همه ی تکرارهای پارامتر رسمی(مجازی) در متن زیربرنامه می شود.

  • فراخوانی با نام پارامترها را ارزیابی نشده ارسال می کند.

  • مثال:

فراخوانی با نام

Procedure p(X , Y , Z)

{

int i , i=7;

A = i+(7/(B+2))*(27+3);

}

Procedure p(X , Y , Z)

{

int i , i=7;

X = I+(7/Y)*Z;

}

در صورت فراخوانی:

P(A,B+2,27+3)


Thunk p a b 2 27 3

پس برای پیاده سازی فراخوانی با نام باید از زیربرنامه ی فاقد پارامتر(thunk) استفاده کنیم.

یک thunkکدی است که مقدار چپ و مقدار راست یک آرگومان را محاسبه می کند.

Jump to subroutine p

Address of thunk1 to return L_value(A)

Address of thunk2 to return R_value(A)

Address of thunk3 to return L_value(B+2)

Address of thunk4 to return R_value(B+2)

Address of thunk5 to return L_value(27+3)

Address of thunk6 to return R_value(27+3)

مثال:اگر در مثال قبل ،فراخوانی با نام انجام شود،با وجود thunk،کدهای زیر تولید می شود.برای فراخوانی p(A,b+2,27+3)داریم:

منظور از آدرس Thunk

آدرس کدترجمه شده ی مطلوب است.

برای انتساب بهX

روال Thunk1 فراخوانی می شود.

برای دسترسی به مقدار X

روال Thunk2 فراخوانی می شود .


متداولترین روش انتقال پارامترهاست.

آدرس(مقدار چپ) پارامتر واقعی به زیربرنامه فرستاده می شود.

تغییراتی که به پارامترهای مجازی درون تابع داده می شود، به پارامترهای واقعی متناظر در زیربرنامه صدازننده اعمال می شود.

مثال:

Void fn(int x , int y) {

x= -4; y= -6;

print f(“%d %d” , x,y);

}

Main() {

int a=1 , b=3;

print f(“ %d % d” , a,b);

F(n) (&a , &b);

print f(“%d %d” , a ,b);

{

فراخوانی با ارجاع( آدرس)


در این روش مقدار راست پارامتر واقعی در پارامتر مجازی کپی می شود.

در زیربرنامه دیگر به پارامتر واقعی دسترسی نداریم و تغییراتی که در پارامتر مجازی داده می شود،به پارامتر واقعی اعمال نمی شود.

Void fn(int x , int y) {

x= -4; y= -6;

print f(“%d %d” , x,y);

}

Main() {

int a=1 , b=3;

print f(“ %d % d” , a,b);

F(n) (a , b);

print f(“%d %d” , a ,b);

{

فراخوانی با مقدار


در این روش فراخوانی،مقدار پارامتر واقعی در پارامتر مجازی کپی می شود.

داخل زیربرنامه هر تغییری فقط روی پارامتر مجازی انجام می گیرد و روی پارامتر واقعی اثری ندارد.

هنگام بازگشت از زیربرنامه، پارامتر مجازی در پارامتر واقعی کپی می شود،یعنی پارامتر واقعی تا زمان خاتمه زیربرنامه، مقدار اصلی خودش را حفظ کرده و پس از اجرای زیربرنامه مقدار جدیدی می گیرد.

فراخوانی با مقدار-نتیجه

فراخوانی با ارجاع و مقدار-نتیجه از دید برنامه نویس نتایج یکسانی دارند.

در الگول-W معرفی شد.


مشابه فراخوانی با مقدار ،ومقدار پارامتر واقعی در پارامتر مجازی کپی می شود و در حین اجرای زیربرنامه پارامتر مجازی قابل تغییر نیست.

لذا این پارامتر مجازی مثل یک متغیر ثابت محلی عمل می کند.

  • فراخوانی با نتیجه

  • از این شیوه فقط جهت برگرداندن نتیجه به برنامه فراخوان استفاده می شود.

  • مقدار اولیه پارامتر واقعی در زیربرنامه قابل استفاده نیست.

  • هنگامی که زیربرنامه تمام می شود، مقدار نهایی پارامتر مجازی بعنوان مقدار جدید پارامتر واقعی محسوب می شود.

فراخوانی با مقدار ثابت

تابع ورودی ندارد و فقط دارای پارامتر خروجی است.


اعمالی که در انتقال پارامترها انجام می شوند،:

اعمال که در هر نقطه ی فراخوانی زیربرنامه اتفاق می افتد.

اعمالی که مربوط به ورود و خروج در خود زیربرنامه هستند که مقدمه و مؤخره نامیده می شوند.

  • اعمال نقطه فراخوانی:

  • در نقطه ی فراخوانی،عبارات پارامتر واقعی ارزیابی می شوند و کپی هایی از مقادیر آن ها یا اشاره گرهایی به داده ها ایجاد و تنظیم می شوند.

  • این ارزیابی در محیط ارجاع زیربرنامه فراخوان صورت می گیرند.

  • سپس کنترل به زیربرنامه منتقل می شود و دو اشاره گر موسوم به CEP(اشاره گر محیط فعلی) و CIP(اشاره گر دستور فعلی) تنطیم می شوند.

  • قبل از انتقال کنترل، رکورد فعالیتی برای فراخوانی فعلی زیربرنامه ایجاد و در بالای پشته زمان اجرا درج می شود.

پیاده سازی انتقال پارامترها


مقدمه ی زیربرنامه عملیات انتقال پارامترها را تکمیل می کند. مقادیر پارامتر واقعی در پارامتر مجازی کپی می شوند یا اشاره گر به پارامترهای واقعی در اشاره گر به پارامتر مجازی کپی می شوند.

قبل از خاتمه زیربرنامه ، مؤخره آن، نتیجه را در پارامترهای واقعی که از طریق نتیجه یا مقدار و نتیجه ارسال شده اند،کپی می کند. مقادیر تابع به حافظه های موقت یا ثبات ها کپی می شوند. زیربرنامه خاتمه میابد و رکورد فعالیت آن از بین می رود.

2) اعمال بعد از ورود به زیربرنامه:


تولید کد اجرایی پارامترها را تکمیل می کند. مقادیر پارامتر واقعی در پارامتر مجازی کپی می شوند یا اشاره گر به پارامترهای واقعی در اشاره گر به پارامتر مجازی کپی می شوند.درست برای اعمال هنگام فراخوانی و مقدمه و مؤخره ی زیربرنامه.( کد اجرایی مورد نیاز برای هر روش انتقال پارامتر متفاوت است)

کنترل نوع ایستا برای اطمینان از سازگاری نوع پارامترهای واقعی و پارامترهای رسمی متناظر. برای این منظور کامپایلر باید امضای کامل زیربرنامه شامل تعداد، نوع و ترتیب آرگومان های ورودی و نوع آرگومان خروجی را بداند.(مخصوصا برای زیربرنامه هایی که بطور مستقل ترجمه می شوند)

کامپایلر در پیاده سازی انتقال پارامترها دو وظیفه دارد:


Q (&( پارامترها را تکمیل می کند. مقادیر پارامتر واقعی در پارامتر مجازی کپی می شوند یا اشاره گر به پارامترهای واقعی در اشاره گر به پارامتر مجازی کپی می شوند.a+b), &b)

مثال:

اگر بخواهیم عبارات a+b را از طریق ارجاع ارسال کنیم:

مترجم در نقطه ی فراخوانی ابتدا باید این عبارت را ارزیابی کند.

سپس آن را در حافظه موقت در Pذخیره کند.

اشاره گر به آن محل (حافظه موقت در (p را بعنوان پارامتر به Q ارسال کند.

انتقال با ارجاع موجب می شود تا پارامتر مجازی، حاوی اشاره گر به محل حافظه موقت در p باشد.

چون این محل در p نامی نداردکه بتوان به آن مراجعه کرد ،هر انتسابی که در Q صورت می گیرد ، مقداری را تغیر نمی دهداز انتقال به روش مقدار استفاده می شود

نتیجه عبارت (ارسال پارامتر)


امکان استفاده از نام مستعار در ارتباط با انتقال پارامترها، در اغلب زبان ها وجود دارد.

هنگام انتقال پارامترها ، نام مستعار به دو روش بوجود می آید:

پارامتر مجازی و متغیر غیرمحلی : شیء داده ای که از طریق ارجاع ارسال شد، در داخل زیربرنامه ، از طریق یک نام غیرمحلی ، بطور مستقیم قابل دستیابی است.

نام مستعار و پارامترها(ارسال پارامتر)

  • دو پارامتر مجازی: یک شیء داده ممکن است در آن واحد، در دو موقعیت مختلف (در یک

  • فراخوانی) به عنوان پارامتر واقعی ارسال شود. در این صورت نام های دو پارامتر مجازی ،

  • مستعار خواهند بود.


در بسیاری از زبان ها ، زیربرنامه را می توان به عنوان پارامتر واقعی به زیربرنامه دیگری ارسال کرد.

در این حالت ،عبارت پارامتر واقعی شامل نام زیربرنامه است و هم چنین پارامتر مجازی متناظر با آن از نوع زیربرنامهاست.

مثال: (پاسکال)

Procedure Q( x: integer ; function R(y,z:integer):integer)

ارسال زیربرنامه به عنوان پارامتر

روال Q()دو پارامتر مجازی دارد: 1. Xاز نوع صحیح 2. R()که یک تابع است

تابع R()نیز دو عدد صحیح به عنوان ورودی دریافت می کند و خروجی از نوع صحیح برمی گرداند.

Q(27,fn) fn پارامتر واقعی: Rپارامتر مجازی : ()


کنترل نوع ایستا را می توان به عنوان پارامتر واقعی به زیربرنامه دیگری ارسال کرد.

کامپایلر باید بتواند پارامترهای زیربرنامه ای که به عنوان پارامتر ارسال شده را از نظر نوع وارسی

کند.

وقتی پارامتر زیربرنامه ای با استفاده از نام پارامتر مجازی فراخوانی می شود( مثلR(I,x) )،

کنترل نوع ایستا مهم است تا تضمین شود که تعداد و نوع این پارامترهای این فراخوانی مناسب

است.

1. کنترل نوع ایستا 2. ارجاع های غیرمحلی(متغیرهای آزاد)

دو موضوع ، ارسال زیربرنامه ها را به عنوان پارامتر پیچیده می کند:


این ارجاع غیر محلی را متغیرهای آزاد گویند.

علت : وقتی زیربرنامه ای فراخوانی می شود، یک محیط ارجاع غیرمحلی به وجود می آید واین محیط غیرمحلی در حین اجرای زیربرنامه مورد استفاده قرار می گیرد.

ارجاع های غیرمحلی( متغیرهای آزاد) اگر فرض کنیم Fn به zارجاع دارد و این زیربرنامه(FN) تعریف محلی برای این متغیرها ندارند.

راه حل کلی : ارجاع غیرمحلی (ارجاع به متغیرهای آزاد ) ، باید همان معنا را در حین اجرای زیربرنامه ای که بعنوان پارامتر ارسال شد داشته باشد که اگر این زیربرنامه در نقطه ای به عنوان پارامتر واقعی ظاهر شده است اجرا می شد ، این معنا را تداعی می کرد.


(1) آزاد گویند.

Program main

var x0: integer;

procedure Q( var I0:integer ; function R(j: integer): integer);

var x1 : integer;

begin

X1 := 4;

write ( “in Q , before call of R , I = “,I0 , “x = “,x1);

I0 := R(I)

End;

Procedure p;

var I1: integer;

function FN (k: integer): integer;

begin

x0 := X0 + k;

FN := I1 + k;

write (“in p , I =“,I1, “k= “,K, “x=“,X0)

end;

begin

I1 := 2;

Q(x0 , FN);

write ( “ in p, I = “,I1 , “x=“, x0)

end;

(2)

begin

X0 :=7;

P();

writeln(‘in main,x=’,x0);

END


محیط های مشترک صریح آزاد گویند.

  • محیط مشترک برای به اشتراک گذاشتن اشیا داده به کار می رود.

  • مجموعه ای از اشیا داده که باید بین چندین زیربرنامه مشترک باشد در حافظه یک بلوک خاص تخصیص می یابد.

  • بلوک COMMONدر فرترن ،package در ادا و متغیرهایی که به صورتexternدر C مشخص می شوند ،کلاس ها درC++و اسمالتاک این ویژگی را دارا هستند.

  • محیط مشترک می تواند شامل تعریف متغیرها،ثوابت و انواع باشد اما نمی تواند شامل تعریف زیربرنامه یا پارامترهای مجازی باشد.


مثال: آزاد گویند.

مشخصاتpackage در ادا:

  • دسترسی به محیط مشترک در packageبا دستور with صورت می گیرد.

With shared_table;

  • برای دستیابی به نام های موجود در package:

Shared-table.T1;


پیاده سازی محیط های مشترک صریح آزاد گویند.

  • در حین ترجمه کامپایلر در مواجعه با دستور with اعلان مربوط به محیط مشترک را از کتابخانه یا بخش دیگری از متن برنامه بازیابی می کند.

  • اعلان های محیط مشترک نیز به عنوان اسامی محلی زیربرنامه در جدول نمادها ذخیره می شود تا زیربرنامه به آنها مراجه کند.

  • با بلوک مشترک می توان مثل رکورد برخورد کرد بنابراین ارجاع به متغیر در بلوک به محاسبات «آدرس پایه و آفست» تفسیر می شود.

  • محلی در سگمنت کد زیربرنامه، اشاره گری به بلوک (یعنی آدرس پایه بلوک) را ذخیره می کند.

  • ویراستار پیوندی کار ذخیره اشاره گر را در سگمنت کد برعهده دارد.


اشتراک صریح متغیرها آزاد گویند.

  • اشتراک صریح متغیرها باعث می شود یک متغیر در محیط زیربرنامه،برای زیربرنامه های دیگر قابل دسترس باشد.

  • برای این کار یک «تعریف صدور» باید ارائه شود.(توسط define )

مثال:

  • زیربرنامه که می خواهد به متغیر صادرشده دسترسی داشته باشد از «تعریف وارد کردن» استفاده می کند.(توسطuses )


پیاده سازی حوزه پویا آزاد گویند.

  • به جای استفاده از محیط مشترک ،می توان از وابستگی محیط غیرمحلی با هر زیربرنامه در حال اجرا استفاده کرد.

  • محیط غیرمحلی برای زیربرنامه (p ) شامل محیط های محلی سابقه فعالیت سایر زیربرنامه هایی است که در حین اجرا به زیربرنامه (p ) دستیابی دارند.

  • در روش حوزه ارجاعی پویا اغلب از قاعده «تازه ترین وابستگی» استفاده می شود.

پیاده سازی قاعده تازه ترین وابستگی به دو شیوه صورت می گیرد:

1.با استفاده از پشته مرکزی 2.جدول محیط ارجاع مرکزی


1.پیاده سازی با توجه به پشته مرکزی:

  • در ورود به زیربرنامه ،رکورد فعالیت ایجاد و هنگام خروج از آن از بین می رود.

  • جستجو در هر ارجاع غیر محلی ،هم مستلزم زمان و هم ذخیره نمایش هایی از خود شناسه ها در جدول های وابستگی محلی است.

  • در این روش نمی توان از محاسبات آدرس پایه و آفست استفاده کرد.


2.جدول محیط ارجاع مرکزی: مرکزی:

  • این جدول در طول اجرای برنامه،تمام سابقه های فعالیت فعلی شناسه ها را در بر می گیرد.(صرفنظر از اینکه شناسه ها محلی اند یا غیر محلی )

  • به ازای هر شناسه یک ورودی در جدول قرار می گیرد و هر ورودی یک نشانگر فعالیت دارد که فعال بودن یا نبودن وابستگی را مشخص می کند.

  • تمام ارجاع ها توسط الگوی آدرس پایه و آفست،به پشته مرکزی سوق داده می شود.

  • ورود به زیربرنامه و خروج از آن،گران تمام می شود،زیرا هر تغییر در محیط ارجاع مستلزم تغییرات در جدول مرکزی است.

  • برای بازیابی وابستگی ها نیاز به پشته زمان اجرا داریم که به عنوان یک پشته مخفی منظور می شود.


پیاده سازی حوزه ایستا مرکزی:

  • رایج ترین روش برای پیاده سازی حوزه ایستا در زبان هایی که زیربرنامه های تودرتو دارند ساخت زنجیرهای ایستا است.

  • نیاز به اشاره گر به رکورد فعالیت ( اشاره گر حوزه ایستا) داریم.

  • از پیوند ایستا به منظور دسترسی به متغیرهای غیرمحلی استفاده می کنیم.


مثال: مرکزی:


در زمان رجوع به یک متغیر غیرمحلی ،رکورد فعالیت حاوی آن متغیر را به دو شیوه می توان یافت:

1. از آغاز زنجیره ایستا،جستجو را انجام دهیم تا رکورد فعالیت موردنظر را پیدا کنیم.

2. تودرتویی حوزه ها در زمان ترجمه معلوم می شود.بنابراین کامپایلر نه تنها غیرمحلی بودن ارجاع را تعیین می کند بلکه می تواند طول زنجیر ایستا تا رکورد فعالیت موردنظر را محاسبه کند.


ارجاع واقعی با یک زوج مرتب از اعداد صحیح می تواند نشان داده می شود:(آفست محلی،موقعیت زنجیر)

طول زنجیر ایستا ( موقعیت زنجیره ایستا) برای رسیدن به رکورد فعالیت درست تا به ارجاع غیرمحلی Xبرسیم عبارتست از:

اختلاف بین عمق ایستای روالی که حاوی ارجاع به Xاست و عمق ایستای روالی که Xرا اعلان کرده است(عمق تودرتویی).

عمق ایستا عددی است که به یک حوزه ایستا داده می شود این عددنشان می دهد حوزه موردنظر در چه عمقی از خارجی ترین حوزه واقع شده است.

مثال:

Procedure A is

procedure B is

procedure C is

end;:

end;

end;


در این پیاده سازی،از اعداد صحیح می تواند نشان داده می شود:(نمایشگر استفاده می کنیم:

  • نمایشگر بردار جداگانه ای است که زنجیر ایستای فعلی هنگام ورود به هر زیربرنامه را در خود نگه می دارد.

  • نمایشگر جدا از پشته مرکزی است و در مجموعه ای از ثبات های سریع نمایش داده می شود.

  • هر سطر آن مربوط به یک رکورد فعالیت می باشد.

  • ارجاع به نمایشگر توسط دو آفست گفته شده صورت می گیرد .مقدار اول تعداد مراحل برگشت به عقب از انتهای زنجیر تا به رکورد موردنظر برسیم و مقدار دوم آفستی در رکورد فعالیت می باشد.


یک روز اعداد صحیح می تواند نشان داده می شود:(

یک ساعت

یک دقیقه

هرگز باز نمی گردند

پس لطفا

از جنگ بپرهیزید

از خشم دوری کنید

عاشقانه حرف بزنید

و لبخندتان را وسعت بخشید.

با سپاس


ad