بخشی از پاورپوینت
اسلاید 1 :
به نام خدا
فصل نهم
کنترل زیربرنامه
اسلاید 2 :
فهرست
مفاهیم زیربرنامه ها و تعاریف اولیه
زبربرنامه ساده فراخوانی –برگشت
زیربرنامه های بازگشتی
صفات کنترل داده
حوزه ایستا و پویا
وابستگی ها و محیط های ارجاع
مفاهیم اصلی کنترل داده
نام مستعار
ساختار بلوکی
داده های محلی و محیط های ارجاع محلی
پارامترها و انتقال پارامترها
پیاده سازی انتقال پارامترها
محیط های مشترک صریح
اشتراک صریح متغیر
پیاده سازی حوزه پویا
پیاده سازی حوزه ایستا
اسلاید 3 :
مفاهیم زیربرنامه ها و تعاریف اولیه
در زبان های برنامه سازی مدرن ، مجموعه ای از دستورات که هدف مشترکی دنبال می کنند ، برای استفاده مجدد درون زیربرنامه ها نوشته می شوند.
زیربرنامه سطحی از انتراع را در برنامه فراهم می کند ، زیرا مجموعه ای از دستورات درون برنامه با یک دستور فراخوان جایگزین می شوند.
پس جزییات پیاده سازی را پنهان می کند و خوانایی برنامه ها با نمایش ساختار منطقی برنامه و پنهان کردن جزییات سطح پایین ، افزایش می یابد.
اسلاید 4 :
زیربرنامه ساده فراخوانی -برگشت
این پیاده سازی توسط قاعده کپی توضیح داده می شود: اثر دستور فراخوانی مثل این است که قبل از اجرا، یک کپی از زیربرنامه در نقطه ی فراخوانی قرار داده شده است.
فرضیه های قاعده کپی
1.زیربرنامه ها نمی توانند بازگشتی باشند.
2.نیاز به دستور فراخوانی صریح است.
3.زیربرنامه ها در هر فراخوانی باید بطور کامل
اجرا شوند.
4.کنترل به نقطه فراخوانی برمی گردد.
5.در هر زمان فقط یک زیربرنامه کنترل را در دست دارد.
اسلاید 5 :
1.زیربرنامه ها نمی توانند بازگشتی باشند:
بازگشتی مستقیم: اگر زیربرنامه ای خودش را فراخوانی کند.
بازگشتی غیرمستقیم: اگر زیربرنامهA زیربرنامه B را فراخوانی کند و زیربرنامه B نیز زیربرنامه A را فراخوانی نماید.
در فراخوانی های بازگشتی مستقیم،نمی توانیم از قاعده کپی استفاده کنیم، زیرا هر جایگزینی که یک دستور فراخوانی را حذف می کند،فراخوانی جدیدی به همان زیربرنامه را معرفی می کند که برای آن جایگزین دیگری لازم است.
اسلاید 6 :
2.نیاز به دستور فراخوانی صریح است: برای اعمال قاعده کپی،هر نقطه از فراخوانی زیربرنامه باید صریحا مشخص شود تا ترجمه گردد.
3.زیربرنامه ها در هر فراخوانی باید بطور کامل اجراشوند
هر زیر برنامه ای در هر فراخوانی،از ابتدا تا انتها اجرا خواهد شد.
زیربرنامه هایی که برای پردازش استثنا به کار می روند،نیاز به فراخوانی صریح ندارند.
زیربرنامه هایی که به عنوان همروال مورد استفاده قرار می گیرند،هروقت فراخوانی می شوند از نقطه ای که آخرین بار اجرا شده اند،از سرگرفته می شوند.
اسلاید 7 :
4.کنترل به نقطه فراخوانی برمی گردد: دستور فراخوانی صریح در یک برنامه نشان می دهد که کنترل در آن نقطه به زیربرنامه منتقل می شود و لذا کپی کردن بدنه زیربرنامه در آن نقطه از برنامه نیز همان اثر را دارد .
5.در هر زمان فقط یک زیربرنامه کنترل را در دست دارد:
کنترل اجرا از برنامه فراخوان به زیربرنامه فراخوانی شده می رود و به برنامه
فراخوان برمی گردد.
اما برای فراخوانی زیربرنامه های زمانبندی شده،اجرای زیربرنامه ممکن است مدتی به تعویق افتد.
اما زیربرنامه هایی که بعنوان تسک مورد استفاده قرار می گیرند،ممکن است بطور همزمان اجرا شوند
اسلاید 8 :
فراخوانی زیربرنامه ها به دوشکل انجام می شود:
فراخوانی تابع:
برای زیربرنامه هایی که مقادیر را بطور مستقیم برمیگردانند.
فراخوانی رویه یا زیرروال:
برای زیربرنامه هایی که اثرات جانبی روی داده های مشترک دارند.
پیاده سازی:
فرض می کنیم ترتیب دستورات و عبارات در زمان اجرا،بصورت بلوکی از کد هستند.
اجرای این کدها مفسر سخت افزار یا مفسر نرم افزار
اسلاید 9 :
در مورد هر زیربرنامه دو مفهوم وجود دارد: تعریف زیربرنامه: آن چیزی است که در برنامه می نویسیم و به یک قالب تبدیلمی شود.مثل: نام و نوع متغیرها، دستورات حلقه و.سابقه فعالیت: در هربار فراخوانی با استفاده از قالب که از تعریف ایجاد شده، بوجود می آید.
1. سگمنت کد: حاوی کد اجرایی و ثوابت است.
سابقه فعالیت:
2.رکورد فعالیت: حاوی داده های محلی،پارامترها و سایر عناصر است.
در حین اجرا تغییر نمی کند.
توسط مترجم ایجاد می شود.
بطور ایستا در حافظه قرار می گیرد.
تمام سابقه فعالیت زیربرنامه از یک سگمنت کد استفاده می کنند.
اسلاید 10 :
در هر نقطه،در حین اجرای برنامه به اشاره گری نیاز داریم که دستوری را که در سگمنت کد وجود دارد و فعلأ توسط مفسر در حال اجراست را،مشخص کند.
؟؟؟؟؟؟
برای نگهداری نقطه ای که زیربرنامه برنامه از آنجا اجرا می شود،به چه چیزهایی نیاز داریم؟؟؟؟
اشاره گر دستور فعلی((CIP
چون تمام سابقه های فعالیت یک زیربرنامه از یک سگمنت کد استفاده می کنند،اشاره گری باید وجود داشته باشد که سابقه فعالیت مورد استفاده را هم مشخص کند.
اشاره گر محیط فعلی((CEP
اسلاید 11 :
مثال:
وقتی دستوری در کد به متغیر X مراجعه می کند، هر رکورد فعالیت دارای شی X است ولی محتویاتش ممکن است با شی دیگری متفاوت باشد.
وقتی کنترل به دستور فراخوانی زیربرنامه رسید،یک رکورد فعالیت* از آن برنامه ایجاد و CEP به آن اشاره می کند، هم چنین CIP به اولین دستور سگمنت کد زیربرنامه اشاره خواهد کرد.
*رکورد فعالیت،محیط ارجاع را مشخص می کند.
اسلاید 12 :
می توان CEP و CIP زیربرنامه فراخوان را در رکورد فعالیت زیربرنامه ای که فراخوانی می شود ذخیره کرد.در این حالت شی داده ای دیگری بنام نقطه برگشت توسط سیستم در رکورد فعالیت بوجود می آید.
؟؟؟؟؟
تکلیف مقدار CEP و CIP زیربرنامه قبلی چی میشه؟؟
نقطه برگشت:شامل فضایی برای دو مقدار اشاره گر است(CIPوCEP)
اگر زیربرنامه ای زیربرنامه دیگر را فراخوانی کند،برای رکورد فعالیت آن زیربرنامه مقادیر جدیدی در CEP وCIP قرار می گیرد.
اسلاید 13 :
فراخوانی برگشت
شکل صفحه295
اسلاید 14 :
شرط استفاده از این مدل برای افزایش سرعت اجرا، باید حافظه زیادی در اختیار داشته باشیم.
مدل ساده تری از پیاده سازی زیربرنامه
برای رکورد فعالیت هر زیربرنامه بطور ایستا حافظه تخصیص می یابد.
(پیاده سازی های فرترن و کوبول)
و با هر فراخوانی زیربرنامه ،همان رکورد قبلی در اختیارش قرار می گیرد که در
این شرایط که هر زیربرنامه فقط یک رکورد فعالیت دارد،نیازی به اشاره گر
CEP نمی باشد.
اسلاید 15 :
در این مدل توسط سخت افزار نیز،پشتیبانی اندکی ارائه می شود.
مدل کلی تری از فراخوانی و برگشت(برگشت-پرش)
سخت افزار یک دستور برگشت-پرش را تدارک می بیند که فراخوانی زیربرنامه را با یک دستور سخت افزاری پیاده سازی می کند.
در این مدل CIP (اشاره گر دستور فعلی) با ثبات آدرس برنامه ی سخت افزار نمایش داده می شود.
نتیجه این مدل پیاده سازی تخصیص ایستای رکوردهای فعالیت
اسلاید 16 :
برگشت- پرش
296 شکل صفحه
اسلاید 17 :
ساده ترین تکنیک مدیریت حافظه در زمان اجرا،روش استفاده از پشته است.
یاد آوری:پیاده سازی پشته ای
برای مدیریت این پشته،نیاز به یک اشاره گر پشته است که همواره به بالای پشته اشاره می کند.
هنگامی که زیربرنامه ای صدا زده می شود،رکورد جدیدی بالای پشته ساخته می شود و با تمام شدن برنامه، آن را از بالای پشته حذف می کند.
در اغلب پیاده سازی های پاسکال،یک پشته مرکزی برای رکوردهای فعالیت زیربرنامه و یک حافظه ایستا برای سگمنت کد برنامه ها اختصاص داده می شود.
اسلاید 18 :
شکل صفحه298
اسلاید 19 :
مشخصات: اگر فراخوانی بازگشتی برنامه امکان پذیر باشد،A می تواند هر زیربرنامه ای از جمله خودش را فراخوانی کند.
پیاده سازی: به دلیل امکان وجود چندین سابقه فعالیت بطور همزمان،به هر دو اشاره گر CEPوCIP نیاز داریم.به این صورت که در ازای هر فراخوانی زیربرنامه،محتوای هردو اشاره گر CEPوCIP در پشته ذخیره می شوند و درازای RETUTRN از پشته POP می شوند.
زیربرنامه های بازگشتی
اسلاید 20 :
اعلان پیشرو در پاسکال
زبان هایی که کامپایلر آنها در یک گذر کار می کنند ، موقع ترجمه ی زیربرنامه های بازگشتی ممکن است با مشکلاتی مواجه شوند.
مثلا: اگر B,Aدو زیربرنامه باشند بطوریکه Aزیربرنامه Bرا فراخوانی کند وB نیز زیربرنامهA را فراخوانی کند، نمی توان تعیین کرد که کدام زیربرنامه باید زودتر نوشته شود.
چون هر زیربرنامه ای که فراخوانی می شود ،کامپایلر باید آن را ترجمه کرده باشد تا بتواند ارجاع به آن را بسازد.
پاسکال این مشکل را با اعلان پیشرو حل می کند:
Procedure A( (پارامتر مجازی ;forward;