مشاهده

Download Report

Transcript مشاهده

‫استاد مربوطه‪ :‬استاد بیدکی‬
‫‪1‬‬
‫• روای ادرایک‬
‫• فاطمه مصلحی‬
‫فهرست‬
‫‪2‬‬
‫‪‬‬
‫مفاهیم زیربرنامه ها و تعاریف اولیه‬
‫‪‬‬
‫‪‬‬
‫زبربرنامه ساده فراخوانی –برگشت‬
‫زیربرنامه های بازگشتی‬
‫صفات کنترل داده‬
‫حوزه ایستا و پویا‬
‫وابستگی ها و محیط های ارجاع‬
‫مفاهیم اصلی کنترل داده‬
‫نام مستعار‬
‫ساختار بلوکی‬
‫داده های محلی و محیط های ارجاع محلی‬
‫پارامترها و انتقال پارامترها‬
‫پیاده سازی انتقال پارامترها‬
‫محیط های مشترک صریح‬
‫اشتراک صریح متغیر‬
‫پیاده سازی حوزه پویا‬
‫پیاده سازی حوزه ایستا‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫مفاهیم زیربرنامه ها و تعاریف اولیه‬
‫در زبان های برنامه سازی مدرن ‪ ،‬مجموعه ای از دستورات که هدف مشترکی دنبال می کنند ‪ ،‬برای‬
‫استفاده مجدد درون زیربرنامه ها نوشته می شوند‪.‬‬
‫زیربرنامه سطحی از انتراع را در برنامه فراهم می کند ‪ ،‬زیرا مجموعه ای از دستورات درون برنامه با‬
‫یک دستور فراخوان جایگزین می شوند‪.‬‬
‫پس جزییات پیاده سازی را پنهان می کند و خوانایی برنامه ها با نمایش ساختار منطقی برنامه و پنهان‬
‫کردن جزییات سطح پایین ‪ ،‬افزایش می یابد‪.‬‬
‫‪3‬‬
‫زیربرنامه ساده فراخوانی ‪-‬برگشت‬
‫این پیاده سازی توسط قاعده کپی توضیح داده می شود‪ :‬اثر دستور فراخوانی مثل‬
‫این است که قبل از اجرا‪ ،‬یک کپی از زیربرنامه در نقطه ی فراخوانی قرار داده شده‬
‫است‪.‬‬
‫فرضیه های قاعده کپی‪:‬‬
‫‪4‬‬
‫‪.1‬زیربرنامه ها نمی توانند بازگشتی باشند‪.‬‬
‫‪.2‬نیاز به دستور فراخوانی صریح است‪.‬‬
‫‪.3‬زیربرنامه ها در هر فراخوانی باید بطور کامل‬
‫اجرا شوند‪.‬‬
‫‪.4‬کنترل به نقطه فراخوانی برمی گردد‪.‬‬
‫‪.5‬در هر زمان فقط یک زیربرنامه کنترل را در‬
‫دست دارد‪.‬‬
‫در فراخوانی های بازگشتی مستقیم‪،‬نمی توانیم از قاعده کپ ی استفاده کنیم‪ ،‬زیرا هر‬
‫جایگزینی که یک دستور فراخوانی را حذف می کند‪،‬فراخوانی جدیدی به همان زیربرنامه را‬
‫معرفی می کند که برای ان جایگزین دیگری الزم است‪.‬‬
‫‪5‬‬
‫برای اعمال قاعده کپ ی‪،‬هر نقطه از فراخوانی زیربرنامه باید‬
‫مشخص شود تا ترجمه گردد‪.‬‬
‫صریحا‬
‫‪6‬‬
‫‪‬‬
‫دستور فراخوانی صریح در یک برنامه نشان می دهد که کنترل در ان نقطه به‬
‫زیربرنامه منتقل می شود و لذا کپ ی کردن بدنه زیربرنامه در ان نقطه از برنامه نیز‬
‫همان اثر را دارد ‪.‬‬
‫اما‬
‫کنترل اجرا از برنامه فراخوان به زیربرنامه فراخوانی شده می رود و به برنامه‬
‫فراخوان برمی گردد‪.‬‬
‫اما‬
‫‪7‬‬
‫فراخوانی زیربرنامه ها به دوشکل انجام می شود‪:‬‬
‫فراخوانی تابع‪:‬‬
‫برای زیربرنامه هایی که مقادیر را بطور مستقیم برمیگردانند‪.‬‬
‫فراخوانی رویه یا زیرروال‪:‬‬
‫برای زیربرنامه هایی که اثرات جانبی روی داده های مشترک دارند‪.‬‬
‫پیاده سازی‪:‬‬
‫فرض می کنیم ترتیب دستورات و عبارات در زمان اجرا‪،‬بصورت بلوکی از کد هستند‪.‬‬
‫اجرای این کدها‬
‫‪8‬‬
‫مفسر سخت افزار یا مفسر نرم افزار‬
‫‪ .1‬سگمنت کد‪ :‬حاوی کد اجرایی و ثوابت است‪.‬‬
‫‪9‬است‬
‫‪.2‬رکورد فعالیت‪ :‬حاوی داده های محلی‪،‬پارامترها و سایر عناصر‬
‫؟؟؟؟؟؟‬
‫برای نگهداری نقطه ای که زیربرنامه برنامه از آنجا اجرا می شود‪،‬به چه چیزهایی نیاز داریم؟؟؟؟‬
‫‪ ‬در هر نقطه‪،‬در حین اجرای برنامه به اشاره گری نیاز داریم که‬
‫دستوری را که در سگمنت کد وجود دارد و فعأل توسط مفسر در‬
‫حال اجراست را‪،‬مشخص کند‪.‬‬
‫اشاره گر دستور‬
‫فعلی(‪(CIP‬‬
‫‪ ‬چون تمام سابقه های فعالیت یک زیربرنامه از یک سگمنت کد‬
‫استفاده می کنند‪،‬اشاره گری باید وجود داشته باشد که سابقه‬
‫فعالیت مورد استفاده را هم مشخص کند‪.‬‬
‫‪10‬‬
‫اشاره گر محیط‬
‫فعلی(‪(CEP‬‬
‫مثال‪:‬‬
‫وقتی دستوری در کد به متغیر ‪ X‬مراجعه می کند‪ ،‬هر رکورد فعالیت دارای شی ‪ X‬است ولی‬
‫محتویاتش ممکن است با شی دیگری متفاوت باشد‪.‬‬
‫وقتی کنترل به دستور فراخوانی زیربرنامه رسید‪،‬یک‬
‫به‬
‫به آن اشاره می کند‪ ،‬هم چنین‬
‫برنامه ایجاد و‬
‫سگمنت کد زیربرنامه اشاره خواهد کرد‪.‬‬
‫*رکورد فعالیت‪،‬محیط ارجاع را مشخص می کند‪.‬‬
‫‪11‬‬
‫از آن‬
‫‪‬‬
‫اگر زیربرنامه ای زیربرنامه دیگر را فراخوانی کند‪،‬برای رکورد فعالیت آن‬
‫زیربرنامه مقادیر جدیدی در ‪CEP‬و‪ CIP‬قرار می گیرد‪.‬‬
‫؟؟؟؟؟‬
‫تکلیف مقدار ‪ CEP‬و ‪ CIP‬زیربرنامه قبلی چی میشه؟؟‬
‫می توان ‪ CEP‬و ‪ CIP‬زیربرنامه فراخوان را در رکورد فعالیت‬
‫زیربرنامه ای که فراخوانی می شود ذخیره کرد‪.‬‬
‫در این حالت ش ی داده ای دیگری بنام نقطه برگشت توسط سیستم در‬
‫رکورد فعالیت بوجود می آید‪.‬‬
‫نقطه برگشت‪:‬شامل فضایی برای دو مقدار اشاره گر است(‪CIP‬و‪)CEP‬‬
‫‪12‬‬
‫فراخوانی برگشت‬
‫شکل صفحه‪• 295‬‬
‫‪13‬‬
‫مدل ساده تری از پیاده سازی زیربرنامه‬
‫برای افزایش سرعت اجرا‪ ،‬باید‬
‫شرط استفاده از این مدل‬
‫حافظه زیادی در اختیار داشته باشیم‪.‬‬
‫‪ ‬برای‬
‫رکورد فعالیت هر زیربرنامه بطور ایستا حافظه تخصیص می یابد‪.‬‬
‫(پیاده سازی های فرترن و کوبول)‬
‫و با هر فراخوانی زیربرنامه ‪،‬همان رکورد قبلی در اختیارش قرار می گیرد که در‬
‫این شرایط که هر زیربرنامه فقط یک رکورد فعالیت دارد‪،‬نیازی به اشاره گر‬
‫‪ CEP‬نمی باشد‪.‬‬
‫‪14‬‬
‫مدل کلی تری از فراخوانی و برگشت(برگشت‪-‬پرش)‬
‫در این مدل توسط سخت افزار نیز‪،‬پشتیبانی اندکی ارائه می شود‪.‬‬
‫‪ ‬سخت افزار یک دستور برگشت‪-‬پرش را تدارک می بیند که فراخوانی زیربرنامه را با یک دستور‬
‫سخت افزاری پیاده سازی می کند‪.‬‬
‫‪ ‬در این مدل ‪( CIP‬اشاره گر دستور فعلی) با ثبات آدرس برنامه ی سخت افزار نمایش داده می‬
‫شود‪.‬‬
‫نتیجه این مدل پیاده سازی‬
‫‪15‬‬
‫تخصیص ایستای رکوردهای فعالیت‬
‫برگشت‪ -‬پرش‬
‫‪ 296‬شکل صفحه‬
‫‪16‬‬
‫•‬
‫یاد آوری‪:‬پیاده سازی پشته ای‬
‫ساده ترین تکنیک مدیریت حافظه در زمان اجرا‪،‬روش استفاده از پشته‬
‫است‪.‬‬
‫‪ ‬برای مدیریت این پشته‪،‬نیاز به یک اشاره گر پشته است که همواره به باالی پشته اشاره می کند‪.‬‬
‫‪ ‬هنگامی که زیربرنامه ای صدا زده می شود‪،‬رکورد جدیدی باالی پشته ساخته می شود و با تمام‬
‫شدن برنامه‪ ،‬آن را از باالی پشته حذف می کند‪.‬‬
‫‪ ‬در اغلب پیاده سازی های پاسکال‪،‬یک پشته مرکزی برای رکوردهای فعالیت زیربرنامه و یک‬
‫حافظه ایستا برای سگمنت کد برنامه ها اختصاص داده می شود‪.‬‬
‫‪17‬‬
‫شکل صفحه‪• 298‬‬
‫‪18‬‬
‫زیربرنامه های بازگشتی‬
‫مشخصات‪ :‬اگر فراخوانی بازگشتی برنامه امکان پذیر باشد‪ A،‬می تواند هر‬
‫زیربرنامه ای از جمله خودش را فراخوانی کند‪.‬‬
‫پیاده سازی‪ :‬به دلیل امکان وجود چندین سابقه فعالیت بطور همزمان‪،‬به‬
‫دو اشاره گر‪ CEP‬و‪ CIP‬نیاز داریم‪.‬‬
‫هر‬
‫به این صورت که در ازای هر فراخوانی زیربرنامه‪،‬محتوای‬
‫هردو اشاره گر ‪CEP‬و‪ CIP‬در پشته ذخیره می شوند و در‬
‫ازای ‪ RETUTRN‬از پشته ‪ POP‬می شوند‪.‬‬
‫‪19‬‬
‫اعالن پیشرو در پاسکال‬
‫‪ ‬زبان هایی که کامپایلر آنها در یک گذر کار می کنند ‪ ،‬موقع ترجمه ی زیربرنامه های بازگشتی‬
‫ممکن است با مشکالتی مواجه شوند‪.‬‬
‫مثال‪ :‬اگر ‪B,A‬دو زیربرنامه باشند بطوریکه ‪A‬زیربرنامه ‪B‬را فراخوانی کند و‪ B‬نیز زیربرنامه ‪ A‬را‬
‫فراخوانی کند‪ ،‬نمی توان تعیین کرد که کدام زیربرنامه باید زودتر نوشته شود‪.‬‬
‫‪ ‬چون هر زیربرنامه ای که فراخوانی می شود ‪،‬کامپایلر باید آن را ترجمه کرده باشد تا بتواند‬
‫ارجاع به آن را بسازد‪.‬‬
‫‪ ‬پاسکال این مشکل را با اعالن پیشرو حل می کند‪:‬‬
‫;‪( ;forward‬پارامتر مجازی(‪Procedure A‬‬
‫‪20‬‬
)‫(اعالن پیشرو‬:‫مثال‬
‫ زیرا‬، ‫برنامه ترجمه نمی شود‬
.‫یک برنامه نامعتبر است‬anomly
‫ رویه موجود‬،2 ‫در محل‬S ‫فراخوانی‬
‫ را فراخوانی می کند و این‬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
21
‫صفات کنترل داده ها‬
‫وقتی که عملیاتی در یک زبان نوشته می شود‪،‬باید چگونگی آماده سازی داده ها‬
‫نیز معلوم باشد‪.‬‬
‫صفات کنترل داده ها تعیین می کند که وقتی به یک عملیات می رسیم‪:‬‬
‫‪ -1‬چه داده هایی باید برای آن عملیات قابل مشاهده و در دسترس باشند‪.‬‬
‫‪ -2‬این داده ها چگونه برای عملیات آماده شوند‪.‬‬
‫‪ -3‬نتایج عملیات چگونه ذخیره و توسط عملیات بعدی بازیابی شوند‪.‬‬
‫‪22‬‬
‫مثال‪:‬‬
‫دستور ‪ X:=y+2*Z‬را در نظر بگیرید‪.‬مساله مهم کنترل داده در مورد ‪:y‬‬
‫‪ Y -1‬ممکن است یک متغیر محلی یا غیرمحلی باشد‪.‬از کدام ‪ Y‬باید‬
‫استفاده کنیم(نقش حوزه)‪.‬‬
‫‪ -2‬اگر ‪ Y‬یک پارامتر مجازی باشد که از طریق زیربرنامه انتقال یافته‬
‫است‪،‬آنگاه روش های انتقال پارامتر مطرح می شود‪.‬‬
‫‪ -3‬اگر ‪ Y‬نام یک زیربرنامه فاقد پارامترباشد‪،‬مکانیزم های برگشت نتایج‬
‫مطرح می شود‪.‬‬
‫‪23‬‬
‫حوزه‬
‫حوزه ی یک متغیر ‪ ،‬محدوده ی دستوراتی است که متغییر در آنها قابل مشاهده است‪.‬‬
‫‪ ‬قوانین حوزه ی یک زبان تعیین می کند که حضور یک نام در برنامه چگونه و به چه‬
‫متغیری مربوط می شود‪.‬‬
‫‪ ‬یه عبارت بهتر به کمک قوانین حوزه می توانیم تعیین کنیم که ارجاع به متغیرهای‬
‫خارج از زیربرنامه ی فعلی به کدام اعالن مربوط می شوند‪.‬‬
‫‪ ‬پس از بدست آوردن اعالن مورد نظر‪ ،‬صفات آن متغیرها از جمله آدرس حافظه قابل‬
‫محاسبه می شود(برای کامپایلر)‬
‫‪24‬‬
‫داده ها به دو روش به عنوان عملوند عملیات به کار می روند‪:‬‬
‫‪-1‬‬
‫انتقال مستقیم‪ :‬در یک عبارت محاسباتی وقتی عبارتی محاسبه می شود‪،‬‬
‫نتیجه آن عبارت بصورت مستقیم در اختیار بخش بعدی عملیات قرارمیگیرد‪.‬این‬
‫نوع انتقال‪:‬‬
‫الف)در حافظه موقت ذخیره می شود‪.‬‬
‫ب)تا آخر طول عمرش معموال نامی ندارد‬
‫مثال‪:‬‬
‫عبارت ‪ 2*Z‬در عبارت ‪ X:=Y+2*Z‬با انتقال مستقیم به عملیات جمع با ‪ Y‬منتقل می شود‪.‬‬
‫‪-2‬‬
‫از طریق داده ی نامدار‪ :‬با اعالن های ضمنی و صریح در برنامه قابل استفاده هستند‪.‬‬
‫وقتی می خواهیم به داده ای دوباره مراجعه کنیم از طریق نام به آن رجوع می کنیم‪.‬‬
‫‪25‬‬
‫عناصر نامدار‬
‫عناصر زیادی در برنامه نامدار هستند‪،‬ولی سه مورد ازآنها در کنترل داده ها اهمیت دارند‪:‬‬
‫‪ -2‬پارامترهای مجازی‬
‫‪ -3‬انواع داده ای تعریف شده‬
‫‪ -1‬متغیرها‬
‫ساده‪ :‬نام یک متغیر ساده‪،‬پارامتر مجازی‪ ،‬زیربرنامه و ‪...‬‬
‫اسامی‬
‫مرکب‪ :‬نامی که به یک مولفه از ساختمان داده مربوط می شود‪.‬‬
‫مثال‪ :‬اگر‪ A‬یک آرایه باشد‪ ،‬نام ‪A‬‬
‫‪26.‬‬
‫اسمی ساده و ]‪ A[3‬یک نام مرکب است‪.‬‬
‫وابستگی ها و محیط های ارجاع‬
‫‪‬‬
‫در حین اجرای برنامه داده هایی در حافظه کامپیوتر ایجاد می شود و مورد‬
‫استفاده قرار می گیرند‪.‬‬
‫‪ ‬برای هر داده معموال یک نام(شناسه) در نظر می گیرند‪.‬‬
‫‪ ‬اینکه کدام شناسه به چه داده ای مربوط شده است را وابستگی می گویند‪.‬‬
‫(انقیاد زمان اجرا یا ترجمه)‬
‫در آغاز اجرای برنامه اصلی دو دسته از وابستگی ها اتفاق می افتد‪:‬‬
‫وابستگی شناسه ها‪ :‬نام هر متغیر درون برنامه را به یک داده(حافظه) مقید می کند‪.‬‬
‫وابستگی زیربرنامه ها‪ :‬که نام زیربرنامه هایی را که در برنامه فراخوانی می شود به یک تعریف‬
‫بخصوص مرتبط می سازد‪.‬‬
‫مثال‪:‬‬
‫در دستور)‪ A:=B+fun(C‬چهار عمل ارجاعی اتفاق می افتد‪ .‬سه عمل ارجاعی‪،‬‬
‫عملوندهای متناظر با سه شناسه ‪ A,B,C‬را تعیین می کنند و عمل ارجاعی چهارم زیر برنامه‬
‫مربوط به ‪ fun‬را ارزیابی می کند‪.‬‬
‫‪27‬‬
‫مفاهیم اصلی کنترل داده ها‬
‫در فراخوانی و برگشت از زیربرنامه ها‪،‬وابستگی ها مرتبا ایجاد و نابود می شوند‪ .‬بر این‬
‫اساس پنج مفهوم اصلی کنترل داده‪:‬‬
‫‪ -1‬محیط های ارجاع‬
‫‪ -2‬قابلیت مشاهده‬
‫‪-3‬حوزه پویا‬
‫‪-4‬عملیات ارجاع‬
‫‪-5‬ارجاع های محلی‪،‬غیر محلی و عمومی‬
‫‪28‬‬
‫‪ ‬محیط های ارجاع‬
‫محیط ارجاع یک دستور‪،‬مجموعه همه ی متغیرهایی(شناسه ها) است که برای آن‬
‫دستور قابل مشاهده و در دسترس هستند‪.‬‬
‫‪ ‬محیط ارجاع در حین اجرا ثابت است و در طول اجرا بدون تغییر می ماند‪.‬‬
‫‪ ‬محیط ارجاع یک دستور در یک زبان با حوزه ایستا شامل متغیرهایست که‬
‫در حوزه آن دستور اعالن شده اند بعالوه مجموعه متغیرهایی که از حوزه‬
‫های باالتر برای آن دستور قابل مشاهده اند‪.‬‬
‫‪ ‬محیط ارجاع چند جزء دارد‪:‬‬
‫‪-2‬محیط ارجاع غیرمحلی‬
‫‪ -1‬محیط ارجاع محلی‬
‫‪ -4‬محیط ارجاع از پیش تعریف شده‬
‫‪ -3‬محیط ارجاع عمومی‬
‫‪29‬‬
‫‪ ‬محیط ارجاع محلی‬
‫شامل متغیرها یا وابستگی هایست که در هنگام ورود به یک زیربرنامه ایجاد می شوند و‬
‫فقط در آن زیر برنامه قابل مشاهده هستند‪.‬‬
‫اند‪...‬‬
‫مثال‪ :‬پارامترهای مجازی‪،‬متغیرهای محلی‪،‬زیربرنامه های که درون زیربرنامه تشکیل شده‬
‫‪ ‬محیط ارجاع غیر محلی‬
‫مجموعه ای از وابستگی های مربوط به شناسه هایی که در زیربرنامه استفاده می شوند ولی‬
‫هنگام ورود به آن ایجاد نمی شوند‪.‬‬
‫مثال‪:‬در پاسکال اگر تابع ‪F‬در‪ G‬تعریف شده باشد‪،‬محیط ارجاع غیرمحلی برای‪F‬‬
‫محلی برای ‪ G‬می باشد‪.‬‬
‫‪،‬محیط ارجاع‬
‫‪30‬‬
‫‪ ‬محیط ارجاع عمومی‬
‫متغیرها و وابستگی هایی که در آغاز اجرای برنامه ایجاد می شوند و در همه زیربرنامه ها‬
‫قابل استفاده هستند را محیط ارجاع عمومی می گوییم‪.‬‬
‫*** محیط عمومی بخش ی از محیط غیرمحلی هستند‪.‬‬
‫‪ ‬محیط ارجاع از پیش تعریف شده‬
‫شامل اسامی است که توسط کامپایلر تعریف شده و داخل برنامه قابل دسترس‬
‫هستند‪ .‬این شناسه ها بدون اعالن صریح قابل استفاده هستند‪.‬‬
‫مثال‪ :‬داده ها یا نام زیربرنامه هایی که در کتابخانه استاندارد هر زبان تعریف‬
‫شده اند‪.‬‬
‫‪31‬‬
‫‪ ‬قابلیت مشاهده‬
‫‪ ‬وابستگی یک شناسه(یک متغیر یا زیربرنامه)‪ ،‬وقتی در یک زیربرنامه قابل‬
‫مشاهده است که بخش ی از محیط ارجاع آن باشد‪.‬‬
‫‪ ‬یک متغیر ممکن است وجود داشته باشد ولی در یک زیربرنامه قابل مشاهده نباشد‪.‬‬
‫اصطالحا متغیر پنهان است و در محیط ارجاع آن زیربرنامه یا دستور بخصوص قرار ندارد‪.‬‬
‫‪ ‬حوزه پویا‬
‫‪ ‬وابستگی هر شناسه یک وابستگی ایستا دارد و یک وابستگی پویا‪.‬‬
‫‪ ‬وابستگی ایستا هنگام ترجمه قابل تعیین است ولی وابستگی پویا هنگام اجرای برنامه تعیین‬
‫می شود(با مفهوم رکورد فعالیت در ارتباط است)‪.‬‬
‫‪32‬‬
‫‪ ‬حوزه پویا ‪:‬‬
‫در حوزه پویا برای پیدا کردن وابستگی یک شناسه باید در زمان اجرا رکورد فعالیت‬
‫جاری جست و جو شده و در صورت عدم پیداشدن وابستگی رکوردهای فعالیت‬
‫به ترتیب جستجو شوند تا وابستگی یافت شود‪.‬‬
‫از قانون تازه ترین وابستگی استفاده می کند‪.‬‬
‫لیسپ ‪ ،‬اسنوبال و ‪ APL‬از قواعد حوزه پویا استفاده می کنند‪.‬‬
‫در هنگام عملیات کنترل ترتیب‪،‬زنجیره ای از رکوردهای فعالیت روی پشته ساخته می‬
‫می گویند( هر رکورد فعالیت در آن به رکورد فعالیت زیربرنامه ای که‬
‫شود که اصطالحأ به آن‬
‫آن را صدازده اشاره می کند)‬
‫‪33‬‬
‫‪ ‬حوزه ایستا‬
‫‪ ‬قاعده حوزه ایستا ‪ ،‬ارجاع ها را به اعالن اسامی در متن برنامه ربط می دهد‪.‬‬
‫‪ ‬در حوزه ارجاعی ایستا اسامی در زمان کامپایل و بر اساس ساختار تودرتوی زیربرنامه ها‬
‫مشخص می شوند‪.‬‬
‫‪ ‬قواعد حوزه ایستا‪ ،‬بدون نیاز به ردیابی اجرای برنامه می تواند اسامی ارجاع شده در برنامه را‬
‫به اعالن آن ها ربط دهد‪.‬‬
‫اشاره گر زنجیره ایستا ‪ :‬حاوی ترتیب اعالن زیربرنامه هاست‪.‬‬
‫‪34‬‬
‫‪ ‬عملیات ارجاع‬
‫با توجه به یک شناسه و محیط ارجاع ‪ ،‬وابستگی مناسبی را برای آن شناسه در آن‬
‫محیط ارجاع پیدا می کند و ش یء داده ی وابسته یا تعریف برنامه را برمی گرداند‪.‬‬
‫کامپایلر برای تولید کد به عملیات ارجاع نیاز دارد‪.‬وقتی که نامی را پردازش می کند‬
‫باید بداند یک متغیر است یا زیربرنامه‪.‬‬
‫امضای ارجاع‪:‬‬
‫‪data_object or subprogram‬‬
‫‪35‬‬
‫‪Ref_op: id* refrencing_environment‬‬
‫نام مستعار برای اشیای داده‬
‫ اگر در یک محیط ارجاع بتوان از طریق بیش از یک نام به ش ی داده ای دست یافت هر کدام از نام ها را نام‬
.‫مستعار ش ی می نامند‬
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
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
36
‫‪ ‬نام مستعار مشکالتی را برای برنامه نویس به وجود می آورد‪،‬زیرا درک برنامه را دشوار می‬
‫کند‪.‬‬
‫مثال‪:‬‬
‫; ‪X := A + B‬‬
‫; ‪Y := C + D‬‬
‫انتساب به ‪ X,Y‬مستقل از یکدیگر است و به هر ترتیبی امکان پذیر می باشند‪.‬‬
‫اما اگر‪ X,C‬نام مستعاری برای یک ش یء داده باشند در این صورت این دو دستور به هم وابسته اند و نیاز به‬
‫ترتیب اجرای مشخص دارند‪.‬‬
‫‪ ‬به خاطر مشکالتی که نام مستعار ایجاد می کند ‪،‬طراحی زبان جدید سعی در حذف‬
‫یا محدود کردن نام مستعار دارند‪.‬‬
‫‪37‬‬
‫ساختار بلوکی‬
‫‪ ‬مفهوم ساختار بلوک در زبان های ساخت یافته بلوکی مثل پاسکال پیدا شد‪.‬‬
‫‪ ‬در یک زبان ساخت یافته بلوکی‪،‬هر برنامه یا زیربرنامه به صورت مجموعه ای از‬
‫بلوک های تودرتو سازمان دهی می شود‪.‬‬
‫‪ ‬هر بلوک‪ ،‬با مجموعه ای از اعالن ها برای اسامی(اعالن متغیرها‪،‬تعریف‬
‫نوع‪،‬تعریف ثوابت و غیره)شروع می شود و سپس دستورات قرار می گیرند‪.‬‬
‫‪ ‬اعالن های موجود در یک بلوک‪،‬محیط ارجاع محلی آن را تعریف می کند‪.‬‬
‫‪38‬‬
‫‪ ‬قواعد حوزه ی ایستا مربوط به برنامه های ساخت یافته بلوکی‪:‬‬
‫‪ .1‬اعالن های ابتدای هر بلوک محیط ارجاع محلی بلوک را می سازند‪.‬هر ارجاع به شناسه ای در بدنه‬
‫بلوک(که شامل بلوک های تودرتو نیست)‪،‬به عنوان ارجاع به اعالن محلی آن شناسه مربوط می شود‪.‬‬
‫‪ .2‬اگر در بدنه بلوک برای شناسه ای اعالن محلی وجود نداشته باشد‪،‬آن ارجاع به یک‬
‫در اولین بلوکی که آن را در بر گرفته محسوب می شود‪.‬‬
‫اعالن‬
‫‪ .3‬در بلوک های تودرتو هر اعالن در بلوک داخلی از بلوک های خارجی تر پنهان است‪.‬‬
‫‪.4‬بلوک می تواند دارای نام باشد‪ .‬نام بلوک به عنوان بخش ی از محیط ارجاع بلوکی که آن را در بر می گیرد‬
‫محسوب می شود‪.‬‬
‫مثال‪:‬‬
‫‪39‬‬
‫) ‪Procedure p ( A : real‬‬
‫‪ P ‬نام محلی در برنامه اصلی است‪.‬‬
‫‪ ‬پارامتر مجازی ‪ A‬بخش ی از محیط محلی‪p‬‬
‫‪ ‬در برنامه اصلی ‪P‬قابل ارجاع ولی ‪ A‬قابل ارجاع نیست‪.‬‬
‫اعالن ها در بلوک های محلی‬
‫برای پیاده سازی این اعالن ها نمی توان از رکورد فعالیت استفاده کرد بلکه از تکنیکی شبیه‬
‫ساختار حافظه استفاده می کنیم‪.‬‬
‫مثال‪:‬‬
‫‪K ‬و ‪ l‬همانند‪m‬و ‪ n‬می توانند از یک محل حافظه استفاده کنند‪،‬زیرا همزمان نمی‬
‫توانند فعال باشند‪.‬‬
‫‪40‬‬
‫داده های محلی و محیط های ارجاع محلی‬
‫‪ ‬محیط محلی زیربرنامه شامل شناسه های که در عنوان زیربرنامه (به جز نام‬
‫خود زیربرنامه) اعالن شده اند‪.‬‬
‫‪ ‬برای محیط های محلی قواعد حوزه پویا و ایستا سازگارند‪.‬‬
‫‪ ‬برای پیاده سازی حوزه ی ایستا کامپایلر ممکن است جدولی از اعالن های محلی‬
‫برای شناسه ها داشته باشد‪.‬‬
‫پیاده سازی قاعده حوزه ی پویا به دو روش انجام‬
‫‪.1‬نگهداری ‪ .2‬حذف‬
‫نگهداری ‪ :‬وابستگی ‪ x‬در حین فراخوانی‬
‫های مختلف‪ ،‬نگهداری می شود‪.‬‬
‫‪41‬‬
‫می گیرد ‪:‬‬
‫حذف ‪ :‬وابستگی ‪X‬در بین فرا خوانی های مختلف‬
‫حذف می شود‪.‬‬
‫مثال‪:‬‬
‫‪.‬‬
‫;‪Procedure R‬‬
‫…‬
‫;‪End‬‬
‫;‪Procedure Q‬‬
‫;‪Var X : integer := 30‬‬
‫‪Begin‬‬
‫;)‪write(X‬‬
‫;‪R‬‬
‫;‪X := X + 1‬‬
‫;)‪write(X‬‬
‫;‪End‬‬
‫;‪Procedure P‬‬
‫…‬
‫;‪Q‬‬
‫…‬
‫;‪End‬‬
‫‪، C ‬پاسکال ‪ ،‬ادا ‪ ،‬لیسپ ‪ ،‬اسنوبال‪4‬و ‪APL‬‬
‫‪ ‬کوبول و فرترن‬
‫‪42 ‬‬
‫‪PL/I‬‬
‫نگهداری‬
‫نگهداری و حذف‬
‫اگر وابستگی‪ x‬نگهداری شود ‪،‬‬
‫در فراخوانی دوم عدد‪ 31‬چاپ‬
‫می شود‪.‬‬
‫اگر وابستگی‪ x‬حذف شود‪ ،‬در‬
‫هر بار اجرای ‪ 30،Q‬چاپ می‬
‫شود‪.‬‬
‫حذف‬
‫‪ ‬پیاده سازی محیط های ارجاع‬
‫‪ ‬در این پیاده سازی بهتر است محیط محلی زیربرنامه به صورت جدول محیط ارجاع نشان داده شود‪.‬‬
‫‪ ‬با استفاده از این جدول ‪ ،‬پیاده سازی روش های حذف و نگهداری ساده تر خواهد شد‪.‬‬
‫‪43‬‬
‫‪‬نگهداری‪:‬‬
‫‪ ‬اگر محیط ارجاع محلی زیربرنامه بین فراخوانی های مختلف نگهداری شود فقط یک جدول‬
‫محیط محلی ایجاد می شود‪.‬‬
‫‪ ‬این جدول به عنوان بخش ی از سگمنت کد‬
‫‪ sub‬محسوب می شود‪.‬‬
‫‪ ‬کامپایلر اندازه هر متغیر را در جدول محیط‬
‫محلی تعیین می کند و آفست شروع ش ی داده را‬
‫از شروع سگمنت کد(آدرس پایه) پیدا می کند‪.‬‬
‫‪44‬‬
‫‪ ‬حذف‪:‬‬
‫‪ ‬اگر محیط محلی ‪ sub‬در بین فراخوانی ها حذف شود و هنگام ورود به‬
‫آن دوباره ایجاد شود‪،‬جدول محیط محلی متغیرهای حذف شده ‪،‬به عنوان‬
‫بخش ی از رکورد فعالیت ‪ sub‬تخصیص می یابد‪.‬‬
‫‪ ‬رکورد فعالیت هنگام ورود به ‪ sub‬در‬
‫یک پشته مرکزی ایجاد و با خروج از‬
‫زیربرنامه حذف می شود‪(.‬حذف محیط‬
‫محلی به صورت خودکار انجام می گیرد‪).‬‬
‫‪45‬‬
‫‪ ‬اگر ‪sub‬در حال اجرا باشد وبه متغیر‬
‫‪Y‬مراجعه کند‪،‬محل ش ی داده وابسته به‬
‫‪ Y‬با افزودن آفست‪ Y‬به محتویات‪CEP‬‬
‫به دست می آید‪.‬‬
‫در پیاده سازی نگهداری و حذف به چند نکته باید توجه کرد‪:‬‬
‫‪.1‬در پیاده سازی ساختار فراخوانی –برگشت(غیر بازگشتی)نگهداری و حذف پیاده سازی‬
‫یکسانی دارند‪.‬‬
‫‪.2‬با هر متغیر به دو شکل می توان برخورد‬
‫کرد‪:‬‬
‫‪.3‬نام زیر برنامه به اعالنی برای آن‬
‫زیربرنامه در محیط محلی وابسته است و‬
‫همواره نگهداری می شود‪.‬‬
‫‪ o‬آنهایی که مقادیرشان در سگمنت کد نگهداری می‬
‫شود‬
‫‪ o‬آنهایی که مقادیرشان در رکورد غعالیت قرار می‬
‫گیرد و باید حذف شوند‪.‬‬
‫‪‬در پاسکال‬
‫نگهداری‬
‫‪static‬‬
‫‪automatic‬‬
‫حذف‬
‫‪.4‬نام پارامتر مجازی ‪،‬یک ش ی داده را نشان‬
‫می دهد که در هر بار فراخوانی زیربرنامه ‪،‬‬
‫مقدار جدیدی می گیرد‪.‬با این پارامترها به روش حذف وابستگی برخورد می شود‪.‬‬
‫‪46‬‬
‫امتیازات ومعایب روش نگهداری و حذف‪:‬‬
‫‪ ‬روش نگهداری باعث ایجاد برنامه هایی می شود که نسبت به گذشته حساس هستند ‪.‬‬
‫‪ ‬در روش حذف برای نگهداری متغیرها بین فراخوانی های مختلف باید برای آن زیربرنامه به‬
‫صورت غیرمحلی اعالن شوند‪.‬‬
‫‪ ‬برای زیربرنامه بازگشتی ‪،‬روش حذف ‪،‬روش متداولتری است‪.‬‬
‫‪ ‬روش حذف باعث صرفه جویی در حافظه می شود‪ ،‬چون جدول های محیط محلی‬
‫وجود دارند‪.‬‬
‫فقط برای برنامه ای که در‬
‫‪47‬‬
‫‪ ‬در روش نگهداری‪،‬جدول های محیط محلی برای تمام زیربرنامه ها در‬
‫دارد‪.‬‬
‫وجود‬
‫پارامترها و انتقال پارامترها‬
‫در یک برنامه کامپیوتری‪،‬موارد بسیاری رخ می دهد که یک سری اطالعات باید بین‬
‫تعدادی از زیربرنامه ها به اشتراک گذاشته شود‪.‬‬
‫برای دسترس ی به داده های مشترک‪:‬‬
‫‪ .1‬انتقال پارامترها و نتایج‬
‫‪ .2‬محیط های مشترک صریح‬
‫به چهار طریق می توان محیط های مشترکی بین زیربرنامه ها ایجاد کرد‬
‫تا به اطالعات مشترک دسترس ی داشته باشند‪:‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪48‬‬
‫محیط های مشترک و غیرمحلی صریح‬
‫حوزه ی ایستا‬
‫حوزه ی پویا‬
‫وراثت‬
‫پارامترهای مجازی و واقعی‬
‫‪ ‬اصطالح آرگومان و نتیجه به داده هایی اطالق می شودکه با مکانیزم های مختلفی به زیربرنامه‬
‫ارسال و از آن دریافت می شود‪.‬‬
‫‪ ‬پارامتر مجازی نوعی ش ی داده محلی در یک زیربرنامه است که نام آن شناسه ای ساده است و‬
‫اعالن آن ‪،‬نوع و سایر صفات را مشخص می کند‪.‬‬
‫‪ ‬پارامتر واقعی یک ش ی داده است که با زیر برنامه فراخوان مشترک است‪.‬‬
‫‪49‬‬
‫تناظر بین پارامترهای واقعی و مجازی‬
‫‪ .1‬تناظر موقعیتی‬
‫‪ .2‬تناظر بر اساس نام‬
‫‪ o‬تناظر موقعیتی‪ :‬تناظر بین پارامترهای مجازی و واقعی بر اساس موقعیت آنها در‬
‫لیست پارامترهای واقعی و مجازی تعیین می شود‪.‬‬
‫‪ o‬تناظر بر اساس نام‪:‬در برخی زبان ها چون ادا پارامترهای مجازی با پارامترهای واقعی‬
‫)‪Sub(Y=>B,X=>27‬‬
‫صریحا توسط نام متناظر می شوند‪.‬‬
‫‪ ‬اغلب زبان ها از تناظر موقعیتی استفاده می کنند‪.‬‬
‫‪50‬‬
‫‪ ‬مدل های معنایی انتقال پارامترها‬
‫قبل از انتخاب روش انتقال پارامترها‪ ،‬باید مدل معنایی انتقال پارامتر خود را مشخص‬
‫کنیم و طبق مدل معنایی مورد انتظار بهترین روش را برگزینیم‪.‬‬
‫پارامترهای مجازی با یکی از سه مدل معنایی زیر شناخته می شوند‪:‬‬
‫‪ .1‬پارامترهای واقعی به پارامترهای مجازی ارسال شوند (حالت ورودی)‬
‫‪ .2‬مقدار پارامتر توسط زیربرنامه تولید و هنگام خروج به پارامتر واقعی زیربرنامه ارسال شود (حالت‬
‫خروجی)‬
‫‪ .3‬مقدار پارامتر هنگام فراخوانی به زیربرنامه ی فراخوانی شده منتقل می شود و هنگام خروج از آن ‪،‬‬
‫مقدارش در پارامتر واقعی در زیربرنامه فراخوان قرار می گیرد(حالت ورودی خروجی)‬
‫‪51‬‬
‫انتقال پارامترها‬
‫انتقال پارامترها روش هایی هستند که پارامترها را به زیربرنامه ها ارسال کرده و از‬
‫آنها دریافت می کنند‪.‬‬
‫روش های انتقال پارامتر‪:‬‬
‫‪.1‬‬
‫‪.2‬‬
‫‪.3‬‬
‫‪.4‬‬
‫‪.5‬‬
‫‪.6‬‬
‫‪52‬‬
‫فراخوانی با نام‬
‫فراخوانی با ارجاع(آدرس)‬
‫فراخوانی با مقدار‬
‫فراخوانی با مقدار ثابت‬
‫فراخوانی با نتیجه‬
‫فراخوانی با مقدار‪-‬نتیجه‬
‫‪ ‬فراخوانی با نام‬
‫‪ ‬فراخوانی با نام ‪ ،‬انتقال پارامتر در حالت ورودی‪/‬خروجی است‪.‬‬
‫‪ ‬وقتی پارامترها از طریق نام ارسال می شوند ‪ ،‬پارامتر واقعی جایگزین همه‬
‫ی تکرارهای پارامتر رسمی(مجازی) در متن زیربرنامه می شود‪.‬‬
‫‪ ‬فراخوانی با نام پارامترها را ارزیابی نشده ارسال می کند‪.‬‬
‫مثال‪:‬‬
‫)‪Procedure p(X , Y , Z‬‬
‫{‬
‫;‪int i , i=7‬‬
‫;)‪A = i+(7/(B+2))*(27+3‬‬
‫}‬
‫‪53‬‬
‫در صورت فراخوانی‪:‬‬
‫)‪P(A,B+2,27+3‬‬
‫)‪Procedure p(X , Y , Z‬‬
‫{‬
‫;‪int i , i=7‬‬
‫;‪X = I+(7/Y)*Z‬‬
‫}‬
‫پس برای پیاده سازی فراخوانی با نام باید از زیربرنامه ی فاقد پارامتر(‪ )thunk‬استفاده کنیم‪.‬‬
‫یک ‪ thunk‬کدی است که مقدار چپ و مقدار راست یک آرگومان را محاسبه می کند‪.‬‬
‫مثال‪:‬‬
‫اگر در مثال قبل ‪،‬فراخوانی با نام انجام شود‪،‬با وجود ‪،THUNK‬کدهای زیر تولید می‬
‫شود‪.‬‬
‫برای فراخوانی)‪ P(A,B+2,27+3‬داریم‪:‬‬
‫منظور از آدرس ‪Thunk‬‬
‫آدرس کدترجمه شده ی مطلوب است‪.‬‬
‫برای انتساب به‪X‬‬
‫روال ‪ Thunk1‬فراخوانی می شود‪.‬‬
‫برای دسترس ی به مقدار‪X‬‬
‫روال ‪ Thunk2‬فراخوانی می شود ‪.‬‬
‫‪54‬‬
‫‪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‬‬
‫‪ ‬فراخوانی با ارجاع( آدرس)‬
‫‪ ‬متداولترین روش انتقال پارامترهاست‪.‬‬
‫‪ ‬آدرس(مقدار چپ) پارامتر واقعی به زیربرنامه فرستاده می شود‪.‬‬
‫‪ ‬تغییراتی که به پارامترهای مجازی درون تابع داده می شود‪ ،‬به پارامترهای واقعی‬
‫متناظر در زیربرنامه صدازننده اعمال می شود‪.‬‬
‫مثال‪:‬‬
‫‪3‬‬
‫‪1‬‬
‫‪-4 -6‬‬
‫‪-6‬‬
‫‪-4‬‬
‫قبل از فراخوانی‬
‫{ )‪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‬‬
‫{‬
‫‪55‬‬
‫‪ ‬فراخوانی با مقدار‬
‫‪ ‬در این روش مقدار راست پارامتر واقعی در پارامتر مجازی کپی می شود‪.‬‬
‫‪ ‬در زیربرنامه دیگر به پارامتر واقعی دسترس ی نداریم و تغییراتی که در پارامتر مجازی‬
‫داده می شود‪،‬به پارامتر واقعی اعمال نمی شود‪.‬‬
‫‪3‬‬
‫‪1‬‬
‫‪-6‬‬
‫‪-4‬‬
‫‪3‬‬
‫‪1‬‬
‫قبل از فراخوانی‬
‫{ )‪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‬‬
‫{‬
‫‪56‬‬
‫‪ ‬فراخوانی با مقدار‪-‬نتیجه‬
‫‪ ‬در این روش فراخوانی‪،‬مقدار پارامتر واقعی در پارامتر مجازی کپی می شود‪.‬‬
‫‪ ‬داخل زیربرنامه هر تغییری فقط روی پارامتر مجازی انجام می گیرد و روی پارامتر‬
‫واقعی اثری ندارد‪.‬‬
‫‪ ‬هنگام بازگشت از زیربرنامه‪ ،‬پارامتر مجازی در پارامتر واقعی کپی می شود‪،‬یعنی پارامتر‬
‫واقعی تا زمان خاتمه زیربرنامه‪ ،‬مقدار اصلی خودش را حفظ کرده و پس از اجرای‬
‫زیربرنامه مقدار جدیدی می گیرد‪.‬‬
‫فراخوانی با ارجاع و مقدار‪-‬نتیجه از دید برنامه نویس نتایج یکسانی دارند‪.‬‬
‫در الگول‪ W-‬معرفی شد‪.‬‬
‫‪57‬‬
‫‪ ‬فراخوانی با مقدار ثابت‬
‫‪ ‬مشابه فراخوانی با مقدار ‪،‬ومقدار پارامتر واقعی در پارامتر مجازی کپی می شود و در‬
‫حین اجرای زیربرنامه پارامتر مجازی قابل تغییر نیست‪.‬‬
‫‪ ‬لذا این پارامتر مجازی مثل یک متغیر ثابت محلی عمل می کند‪.‬‬
‫‪ ‬فراخوانی با نتیجه‬
‫‪ ‬از این شیوه فقط جهت برگرداندن نتیجه به برنامه فراخوان استفاده می‬
‫شود‪.‬‬
‫‪ ‬مقدار اولیه پارامتر واقعی در زیربرنامه قابل استفاده نیست‪.‬‬
‫‪ ‬هنگامی که زیربرنامه تمام می شود‪ ،‬مقدار نهایی پارامتر مجازی بعنوان مقدار‬
‫جدید پارامتر واقعی محسوب می شود‪.‬‬
‫‪58‬‬
‫تابع ورودی ندارد و فقط دارای پارامتر خروجی است‪.‬‬
‫پیاده سازی انتقال پارامترها‬
‫اعمالی که در انتقال پارامترها انجام می شوند‪:،‬‬
‫‪(1‬اعمال که در هر نقطه ی فراخوانی زیربرنامه اتفاق می افتد‪.‬‬
‫‪(2‬اعمالی که مربوط به ورود و خروج در خود زیربرنامه هستند که مقدمه و مؤخره نامیده می شوند‪.‬‬
‫‪ (1‬اعمال نقطه‬
‫فراخوانی‪:‬‬
‫‪‬در نقطه ی فراخوانی‪،‬عبارات پارامتر واقعی ارزیابی می شوند و کپی هایی از مقادیر آن ها یا اشاره‬
‫گرهایی به داده ها ایجاد و تنظیم می شوند‪.‬‬
‫‪‬این ارزیابی در محیط ارجاع زیربرنامه فراخوان صورت می گیرند‪.‬‬
‫‪‬سپس کنترل به زیربرنامه منتقل می شود و دو اشاره گر موسوم به ‪(CEP‬اشاره گر محیط فعلی) و‬
‫‪(CIP‬اشاره گر دستور فعلی) تنطیم می شوند‪.‬‬
‫‪‬قبل از انتقال کنترل‪ ،‬رکورد فعالیتی برای فراخوانی فعلی زیربرنامه ایجاد و در باالی پشته زمان‬
‫اجرا درج می شود‪.‬‬
‫‪59‬‬
‫‪ )2‬اعمال بعد از ورود به زیربرنامه‪:‬‬
‫‪ ‬مقدمه ی زیربرنامه عملیات انتقال پارامترها را تکمیل می کند‪ .‬مقادیر پارامتر‬
‫واقعی در پارامتر مجازی کپی می شوند یا اشاره گر به پارامترهای واقعی در اشاره‬
‫گر به پارامتر مجازی کپی می شوند‪.‬‬
‫‪ ‬قبل از خاتمه زیربرنامه ‪ ،‬مؤخره آن‪ ،‬نتیجه را در پارامترهای واقعی که از طریق‬
‫نتیجه یا مقدار و نتیجه ارسال شده اند‪،‬کپی می کند‪ .‬مقادیر تابع به حافظه های‬
‫موقت یا ثبات ها کپی می شوند‪ .‬زیربرنامه خاتمه میابد و رکورد فعالیت آن از بین‬
‫می رود‪.‬‬
‫‪60‬‬
‫کامپایلر در پیاده سازی انتقال پارامترها دو وظیفه دارد‪:‬‬
‫‪ (1‬تولید کد اجرایی درست برای اعمال هنگام فراخوانی و مقدمه و مؤخره ی زیربرنامه‪ (.‬کد‬
‫اجرایی مورد نیاز برای هر روش انتقال پارامتر متفاوت است)‬
‫‪ (2‬کنترل نوع ایستا برای اطمینان از سازگاری نوع پارامترهای واقعی و پارامترهای رسمی متناظر‪.‬‬
‫برای این منظور کامپایلر باید امضای کامل زیربرنامه شامل تعداد‪ ،‬نوع و ترتیب آرگومان های‬
‫ورودی و نوع آرگومان خروجی را بداند‪(.‬مخصوصا برای زیربرنامه هایی که بطور مستقل‬
‫ترجمه می شوند)‬
‫‪61‬‬
‫نتیجه عبارت (ارسال پارامتر)‬
‫)‪Q (&(a+b), &b‬‬
‫مثال‪:‬‬
‫اگر بخواهیم عبارات ‪ a+b‬را از طریق ارجاع ارسال کنیم‪:‬‬
‫‪.1‬مترجم در نقطه ی فراخوانی ابتدا باید این عبارت را ارزیابی کند‪.‬‬
‫‪.2‬سپس آن را در حافظه موقت در ‪P‬ذخیره کند‪.‬‬
‫‪.3‬اشاره گر به آن محل (حافظه موقت در ‪ (p‬را بعنوان پارامتر به ‪ Q‬ارسال کند‪.‬‬
‫‪‬انتقال با ارجاع موجب می شود تا پارامتر مجازی‪ ،‬حاوی اشاره گر به محل حافظه موقت در‪ p‬باشد‪.‬‬
‫‪‬چون این محل در ‪ p‬نامی نداردکه بتوان به آن مراجعه کرد ‪،‬هر انتسابی که در ‪ Q‬صورت می گیرد ‪ ،‬مقداری را‬
‫‪62‬‬
‫از انتقال به روش مقدار استفاده می شود‬
‫تغیر نمی دهد‬
‫نام مستعار و پارامترها(ارسال پارامتر)‬
‫امکان استفاده از نام مستعار در ارتباط با انتقال پارامترها‪ ،‬در اغلب زبان ها وجود دارد‪.‬‬
‫هنگام انتقال پارامترها ‪ ،‬نام مستعار به دو روش بوجود می آید‪:‬‬
‫‪ (1‬پارامتر مجازی و متغیر غیرمحلی ‪ :‬ش یء داده ای که از طریق ارجاع ارسال شد‪ ،‬در داخل زیربرنامه ‪ ،‬از طریق یک نام‬
‫غیرمحلی ‪ ،‬بطور مستقیم قابل دستیابی است‪.‬‬
‫‪ (2‬دو پارامتر مجازی‪ :‬یک ش یء داده ممکن است در آن واحد‪ ،‬در دو موقعیت مختلف (در یک‬
‫فراخوانی) به عنوان پارامتر واقعی ارسال شود‪ .‬در این صورت نام های دو پارامتر مجازی ‪،‬‬
‫مستعار خواهند بود‪.‬‬
‫‪63‬‬
‫ارسال زیربرنامه به عنوان پارامتر‬
‫در بسیاری از زبان ها ‪ ،‬زیربرنامه را می توان به عنوان پارامتر واقعی به زیربرنامه دیگری ارسال‬
‫کرد‪.‬‬
‫در این حالت ‪،‬عبارت پارامتر واقعی شامل نام زیربرنامه است و هم چنین پارامتر مجازی‬
‫متناظر با آن از نوع زیربرنامه است‪.‬‬
‫مثال‪( :‬پاسکال)‬
‫)‪Procedure Q( x: integer ; function R(y,z:integer):integer‬‬
‫روال )(‪Q‬دو پارامتر مجازی دارد‪X .1 :‬از نوع صحیح‬
‫‪.2‬‬
‫)(‪R‬که یک تابع است‬
‫تابع )(‪ R‬نیز دو عدد صحیح به عنوان ورودی دریافت می کند و خروجی از نوع صحیح برمی گرداند‪.‬‬
‫پارامتر مجازی ‪R)( :‬‬
‫‪64‬‬
‫پارامتر واقعی‪fn :‬‬
‫)‪Q(27,fn‬‬
‫دو موضوع ‪ ،‬ارسال زیربرنامه ها را به عنوان پارامتر پیچیده می کند‪:‬‬
‫‪ .1‬کنترل نوع ایستا‬
‫‪ .2‬ارجاع های غیرمحلی(متغیرهای آزاد)‬
‫کنترل نوع ایستا‬
‫کامپایلر باید بتواند پارامترهای زیربرنامه ای که به عنوان پارامتر ارسال شده را از نظر نوع وارس ی‬
‫کند‪.‬‬
‫وقتی پارامتر زیربرنامه ای با استفاده از نام پارامتر مجازی فراخوانی می شود( مثل)‪،) R(I,x‬‬
‫کنترل نوع ایستا مهم است تا تضمین شود که تعداد و نوع این پارامترهای این فراخوانی مناسب‬
‫است‪.‬‬
‫‪65‬‬
‫ارجاع های غیرمحلی( متغیرهای آزاد)‬
‫اگر فرض کنیم ‪ FN‬به ‪ Z‬ارجاع دارد و این زیربرنامه)‪ (FN‬تعریف محلی برای این متغیرها‬
‫ندارند‪.‬‬
‫این ارجاع غیر محلی را متغیرهای آزاد گویند‪.‬‬
‫علت ‪ :‬وقتی زیربرنامه ای فراخوانی می شود‪ ،‬یک محیط ارجاع غیرمحلی به وجود می آید واین محیط‬
‫غیرمحلی در حین اجرای زیربرنامه مورد استفاده قرار می گیرد‪.‬‬
‫راه حل کلی ‪ :‬ارجاع غیرمحلی (ارجاع به متغیرهای آزاد ) ‪ ،‬باید همان معنا را در حین اجرای زیربرنامه ای که‬
‫بعنوان پارامتر ارسال شد داشته باشد که اگر این زیربرنامه در نقطه ای به عنوان پارامتر واقعی ظاهر شده‬
‫است اجرا می شد ‪ ،‬این معنا را تداعی می کرد‪.‬‬
‫‪66‬‬
(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
67
68
69
‫محیط های مشترک صریح‬
‫‪ ‬محیط مشترک برای به اشتراک گذاشتن اشیا داده به کار می رود‪.‬‬
‫‪ ‬مجموعه ای از اشیا داده که باید بین چندین زیربرنامه مشترک باشد در حافظه یک‬
‫بلوک خاص تخصیص می یابد‪.‬‬
‫‪ ‬بلوک ‪COMMON‬در فرترن ‪ package،‬در ادا و متغیرهایی که به صورت‪extern‬در ‪C‬‬
‫مشخص می شوند ‪،‬کالس ها در‪C++‬و اسمالتاک این ویژگی را دارا هستند‪.‬‬
‫‪ ‬محیط مشترک می تواند شامل تعریف متغیرها‪،‬ثوابت و انواع باشد اما نمی تواند شامل‬
‫تعریف زیربرنامه یا پارامترهای مجازی باشد‪.‬‬
‫‪70‬‬
‫مثال‪:‬‬
‫مشخصات ‪ package‬در ادا‪:‬‬
‫‪ ‬دسترس ی به محیط مشترک در‪ package‬با دستور ‪ with‬صورت می گیرد‪.‬‬
‫;‪With shared_table‬‬
‫‪ ‬برای دستیابی به نام های موجود در ‪:package‬‬
‫;‪Shared-table.T1‬‬
‫‪71‬‬
‫پیاده سازی محیط های مشترک صریح‬
‫‪ ‬در حین ترجمه کامپایلر در مواجعه با دستور ‪ with‬اعالن مربوط به محیط مشترک را از‬
‫کتابخانه یا بخش دیگری از متن برنامه بازیابی می کند‪.‬‬
‫‪ ‬اعالن های محیط مشترک نیز به عنوان اسامی محلی زیربرنامه در جدول نمادها ذخیره می شود تا‬
‫زیربرنامه به آنها مراجه کند‪.‬‬
‫‪ ‬با بلوک مشترک می توان مثل رکورد برخورد کرد بنابراین ارجاع به متغیر در بلوک به محاسبات «‬
‫» تفسیر می شود‪.‬‬
‫‪ ‬محلی در سگمنت کد زیربرنامه‪ ،‬اشاره گری به بلوک (یعنی آدرس پایه بلوک) را ذخیره می کند‪.‬‬
‫کار‬
‫‪72‬‬
‫را در‬
‫برعهده دارد‪.‬‬
‫اشتراک صریح متغیرها‬
‫‪ ‬اشتراک صریح متغیرها باعث می شود یک متغیر در محیط زیربرنامه‪،‬برای زیربرنامه های دیگر‬
‫قابل دسترس باشد‪.‬‬
‫‪ ‬برای این کار یک «تعریف صدور» باید ارائه شود‪(.‬توسط ‪) define‬‬
‫مثال‪:‬‬
‫‪ ‬زیربرنامه که می خواهد به متغیر صادرشده دسترس ی داشته باشد از «تعریف وارد کردن»‬
‫استفاده می کند‪(.‬توسط ‪)uses‬‬
‫‪73‬‬
‫پیاده سازی حوزه پویا‬
‫‪ ‬به جای استفاده از محیط مشترک ‪،‬می توان از وابستگی محیط غیرمحلی با هر زیربرنامه در‬
‫حال اجرا استفاده کرد‪.‬‬
‫‪ ‬محیط غیرمحلی برای زیربرنامه ( ‪ )p‬شامل محیط های محلی سابقه فعالیت سایر‬
‫زیربرنامه هایی است که در حین اجرا به زیربرنامه ( ‪ )p‬دستیابی دارند‪.‬‬
‫‪ ‬در روش حوزه ارجاعی پویا اغلب از قاعده «‬
‫پیاده سازی قاعده تازه ترین وابستگی به دو شیوه صورت می گیرد‪:‬‬
‫‪1‬‬
‫‪74‬‬
‫‪.‬با استفاده از پشته مرکزی‬
‫‪.2‬جدول محیط ارجاع مرکزی‬
‫» استفاده می شود‪.‬‬
‫‪.1‬پیاده سازی با توجه به پشته مرکزی‪:‬‬
‫‪ ‬در ورود به زیربرنامه ‪،‬رکورد فعالیت ایجاد و هنگام خروج از آن از بین می رود‪.‬‬
‫‪ ‬جستجو در هر ارجاع غیر محلی ‪،‬هم مستلزم زمان و هم ذخیره نمایش هایی از خود‬
‫شناسه ها در جدول های وابستگی محلی است‪.‬‬
‫‪ ‬در این روش نمی توان از محاسبات آدرس پایه و‬
‫آفست استفاده کرد‪.‬‬
‫‪75‬‬
‫‪.2‬جدول محیط ارجاع مرکزی‪:‬‬
‫‪ ‬این جدول در طول اجرای برنامه‪،‬تمام سابقه های فعالیت فعلی شناسه ها را در بر می‬
‫گیرد‪(.‬صرفنظر از اینکه شناسه ها محلی اند یا غیر محلی )‬
‫‪ ‬به ازای هر شناسه یک ورودی در جدول قرار می گیرد و هر ورودی یک نشانگر فعالیت دارد‬
‫که فعال بودن یا نبودن وابستگی را مشخص می کند‪.‬‬
‫‪ ‬تمام ارجاع ها توسط الگوی آدرس پایه و آفست‪،‬به پشته مرکزی سوق داده می شود‪.‬‬
‫‪ ‬ورود به زیربرنامه و خروج از آن‪،‬گران تمام می شود‪،‬زیرا هر تغییر در محیط ارجاع مستلزم‬
‫تغییرات در جدول مرکزی است‪.‬‬
‫‪ ‬برای بازیابی وابستگی ها نیاز به پشته زمان اجرا داریم که به عنوان یک پشته مخفی منظور‬
‫می شود‪.‬‬
‫‪76‬‬
77
‫پیاده سازی حوزه ایستا‬
‫‪ ‬رایج ترین روش برای پیاده سازی حوزه ایستا در زبان هایی که زیربرنامه های تودرتو دارند‬
‫ساخت زنجیرهای ایستا است‪.‬‬
‫‪ ‬نیاز به اشاره گر به رکورد فعالیت ( اشاره گر حوزه ایستا) داریم‪.‬‬
‫‪ ‬از پیوند ایستا به منظور دسترس ی به متغیرهای غیرمحلی استفاده می کنیم‪.‬‬
‫‪78‬‬
‫مثال‪:‬‬
‫‪79‬‬
‫در زمان رجوع به یک متغیر غیرمحلی ‪،‬رکورد فعالیت حاوی آن متغیر را به دو شیوه می توان یافت‪:‬‬
‫‪ .1‬از آغاز زنجیره ایستا‪،‬جستجو را انجام دهیم تا رکورد فعالیت موردنظر را پیدا کنیم‪.‬‬
‫‪ .2‬تودرتویی حوزه ها در زمان ترجمه معلوم می شود‪.‬بنابراین کامپایلر نه تنها غیرمحلی‬
‫بودن ارجاع را تعیین می کند بلکه می تواند طول زنجیر ایستا تا رکورد فعالیت موردنظر را‬
‫محاسبه کند‪.‬‬
‫‪80‬‬
‫ارجاع واقعی با یک زوج مرتب از اعداد صحیح می تواند نشان داده می شود‪(:‬آفست محلی‪،‬موقعیت‬
‫زنجیر)‬
‫برای رسیدن به رکورد فعالیت درست تا به ارجاع غیرمحلی‬
‫‪X‬برسیم عبارتست از‪:‬‬
‫مثال‪:‬‬
‫اختالف بین عمق ایستای روالی که حاوی ارجاع به ‪X‬است و عمق ایستای‬
‫روالی که ‪X‬را اعالن کرده است(عمق تودرتویی)‪.‬‬
‫عمق ایستا عددی است که به یک حوزه ایستا داده می شود این عددنشان‬
‫می دهد حوزه موردنظر در چه عمقی از خارجی ترین حوزه واقع شده است‪.‬‬
‫‪Procedure A is‬‬
‫‪procedure B is‬‬
‫‪procedure C is‬‬
‫…‬
‫‪end;:‬‬
‫‪81‬‬
‫…‬
‫;‪end‬‬
‫…‬
‫;‪end‬‬
‫در این پیاده سازی‪،‬از نمایشگر استفاده می کنیم‪:‬‬
‫‪ ‬نمایشگر بردار جداگانه ای است که زنجیر ایستای فعلی هنگام ورود به هر زیربرنامه‬
‫را در خود نگه می دارد‪.‬‬
‫‪ ‬نمایشگر جدا از پشته مرکزی است و در مجموعه ای از ثبات های سریع نمایش داده‬
‫می شود‪.‬‬
‫‪ ‬هر سطر آن مربوط به یک رکورد فعالیت می باشد‪.‬‬
‫‪ ‬ارجاع به نمایشگر توسط دو آفست گفته شده صورت می گیرد ‪.‬مقدار اول تعداد‬
‫مراحل برگشت به عقب از انتهای زنجیر تا به رکورد موردنظر برسیم و مقدار دوم‬
‫آفستی در رکورد فعالیت می باشد‪.‬‬
‫‪82‬‬
83
‫یک روز‬
‫یک ساعت‬
‫یک دقیقه‬
‫هرگز باز نمی گردند‬
‫پس لطفا‬
‫از جنگ بپرهیزید‬
‫از خشم دوری کنید‬
‫عاشقانه حرف بزنید‬
‫و لبخندتان را وسعت بخشید‪.‬‬
‫با سپاس‬
‫‪84‬‬