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