790 likes | 1.17k Views
بسم الله الرحمن الرحیم. فصل8 کنترل ترتیب اجرا. رضاخرمی ، علی رزمجویی استاد مربوطه : استاد بیدکی. فهرست مطالب. 1-مقدمه 2- کنترل ترتیب ضمنی و صریح 3-ترتیب اجرا در عبارات محاسباتی نمایش درختی عبارات نمایش زمان اجرا 3- کنترل ترتیب بین دستورات دستورات اصلی کنترل ترتیب ساخت یافته
E N D
فصل8کنترل ترتیب اجرا رضاخرمی، علی رزمجویی استاد مربوطه : استاد بیدکی طراحی و پیاده سازی زبان های برنامه نویسی
فهرست مطالب طراحی و پیاده سازی زبان های برنامه نویسی 1-مقدمه 2- کنترل ترتیب ضمنی و صریح 3-ترتیب اجرا در عبارات محاسباتی • نمایش درختی عبارات • نمایش زمان اجرا 3- کنترل ترتیب بین دستورات • دستورات اصلی • کنترل ترتیب ساخت یافته • برنامه های بنیاد 4-ترتیب در عبارات غیر محاسباتی • تطابق الگو • اتحاد • عقبگرد • اصل راه حل
مقدمه • ساختارهای کنترلی در زبان برنامه نویسی، چارچوبی اند که عملیات و داده ها را در برنامه ها و مجموعه ای از برنامه ها را با هم ترکیب میکند. • این کار دو جنبه دارد: • کنترل ترتیب اجرای عملیات است که آن را که کنترل ترتیب می نامند و در این فصل بررسی می شود. • کنترل انتقال داده ها بین زیربرنامه ها و برنامه ها است که آن را کنترل داده ها می نامند (در دو فصل بعد بررسی می شود). طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب ضمنی و صریح • ساختارهای کنترل ترتیب به چهار دسته تقسیم می شوند: • ساختارهایی که در عبارات مورد استفاده قرار می گیرند، مثل قاعده تقدم عملگرها و پرانتزها. • ساختارهایی که بین دستورات یا گروهی از دستورات به کار می روند، مثل دستورات شرطی و تکراری. • برنامه نویسی اعلانی، یک مدل اجرایی است که به دستورات بسنگی ندارد، اما موجب پیشروی کنترل اجرا در برنامه می شود. برنامه نویسی منطقی در پرولوگ نمونه ای از آن است. • کنترل ترتیب در زیر برنامه ها، مثل فراخوانی زیربرنامه ها و همروالها که مو جب انتقال کنترل از نقطه ای به نقطه ی دیگری از برنامه می شود. • زبانهایی مثل لیسپ و APL فاقد کنترل ترتیب دستورات هستند. طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب ضمنی و صریح (ادامه) • ساختارهای کنترل ترتیب ممکن است ضمنی یا صریح باشند: • ساختار های کنترل ضمنی ، اجراي دستورات به صورت پيش فرض توسط زبان برنامه نويسي مشخص مي شود. به عنوان مثال ترتیب اجرای عملیات ها در یک عبارت بدون پرانتز • ساختار کنترل ترتیب صریح، توسط برنامه نویس تعریف می شود.به عنوان مثال وارد کردن پرانتز در عبارات ریاضی و استفاده از goto طراحی و پیاده سازی زبان های برنامه نویسی
ترتیب اجرا در عبارات محاسباتی • عبارات وسیله ای قدرتمند و طبیعی برای نمایش دنباله از عملیات است. • اما برنامه نویس ترتیب اجرای آنها را چگونه درک میکند؟ • مکانییزم های کنترل ترتیب که برای تعیین ترتیب عملیات در این عبارات به کار می روند، پیچیده و ظریف اند. • مثال: فرمول محاسبه ی ریشه های معادله ی درجه دوم را در نظر بگیرید؟ طراحی و پیاده سازی زبان های برنامه نویسی
نمایش درختی عبارات • با در نظر گرفتن عملیات در عبارات آرگومانهای عملیات را عملوند می نامیم. • مکانیزم کنترل ترتیب در عبارات ترکیب تابعی است یعنی عملیات و عملوندهایش مشخص می شود. • ترکیب تابعی ساختار درختی را به عبارات اِعمال می کند. • نمایش رختی ساختار کنترلی عبارات را نشان می دهد . نتایج ارجاع به داده ها یا عملیات در در سطوح پایین تر درخت، به عنوان عملوند های عملیات سطوح بالاتر محسوب می شود. طراحی و پیاده سازی زبان های برنامه نویسی
مثال: عبارت مربوط به محاسبه ی معادله ی درجه ی دوم: / * + 2 A SQRT مشکلات - 1- آیا –B باید قبل یا بعد از B**2 ارزیابی شود. 2-مشخص نیست که دو ارجاع به شناسه ی B می تواند در یک ارجاع جا داده شود یا خیر. - * ** * C B B 2 A 4 طراحی و پیاده سازی زبان های برنامه نویسی
ترتیب اجرا در عبارات محاسباتی(ادامه) • نحو عبارات • اگر عبارات به صورت درختی نمایش داده شوند، در برنامه ها باید عبارات را به صورت یک دنباله ی خطی مشخص کرد: • نشانه گذاری prefix • نشانه گذاری postfix • نشانه گذاری infix طراحی و پیاده سازی زبان های برنامه نویسی
نمایش درختی عبارات -نحو عبارات • نشانه گذاری prefix : • در این نوع نشانه گذاری داریم: • ابتدا نماد عملیات نوشته می شود. و سپس عملوندها به ترتیب از چپ به راست نوشته خواهند شد. • اگرعملوند ی خودش یک عملیات باشد که این عملیات دارای عملوند های دیگری باشد، این قاعده تکرار می شود. • در این نوع نشانه گذاری پرانتز وجود ندارد، که آن را عبارات polish نیز می نامند. نکته: شکلی از این نمایش در لیسپ مورد استفاده قرار می گیرد که Cambridge Polish نام دارد. در این روش نشانه گذاری عملیات و آرگومانهایش در داخل پرانتز قرار می گیرند. بدین ترتیب عبارت مانند لیسی تودرتو است که هر لیست با یک نماد عملگر شروع می شود و بعد از آن لیستی ازعملوند ها قرار می گیرد. طراحی و پیاده سازی زبان های برنامه نویسی
مثال برای درخت زیر میخاهیم عبارات polish و Cambridge polish را به دست بیاوریم. × Polish: ×+ab-ca Cambridge polish: (×(+ab)(-ca)) - + a a b c طراحی و پیاده سازی زبان های برنامه نویسی
نمایش درختی عبارات-نحو عبارات • نشانه گذاری postfix • همانند نشانه گزاری prefix است با این تفاوت که عملگرها بعد از عملوندها می آیند. • * مثال • برای مثال قبل نشانه گذاری postfix آن را به دست بیاورد؟ • ab+ca-× • نشانه گذاری infix • برای عملیات دودویی بسیار مناسب است. • در این نوع نشانه گذاری عملگر بین عملوندها نوشته می شود. • در این نوع نشانه گذاری از پرانتز هم استفاده می شود. • برای عملیات محاسبه ای و منطقی و رابطه ای در ریاضیات به کار می رود. • برای عملگرهایی که بیش از دو عملوند دارند مناسب نیست. مثال برای مثال قبل داریم: Infix : (a+b)*(c-a) طراحی و پیاده سازی زبان های برنامه نویسی
ارزیابی عبارات • ارزیابی عبارات prefix: • با یک بار پیمایش عبارات می توانیم آن را ارزیابی کنیم. باید تعداد آرگومانهای هرعملیات را بدانیم، به همین دلیل نمادهای منحصر به فردی برای عملگرها در نظر گرفته می شود. • این نوع نشانه گذاری علاوه بر صرفه جویی در پرانتز، ارزشهای خاصی در زبان های برنامه سازی دارند، که می توان موارد زیر را نام برد: • فراخوانی تابع به صورت نشانه گذاری prefix انجام می شود. • برای نمایش عملیاتی با هر تعدادی از عملوندها به کار گرفته می شود. بنابراین یک شیوه ی کلی است. • نشانه گذاری prefix را به راحتی می توان رمز گشایی کرد و به همین دلیل، ترجمه ی عبارات prefix به دنباله ای از کدهای ساده، انجام پذیر است. طراحی و پیاده سازی زبان های برنامه نویسی
الگوریتم رمز گشایی prefix • رمزگشایی نشانه گذاری prefix: • برای اینکار مراحل زیر را باید انجام دهیم(فرض کنید p یک عبارت prefix هست). • اگر قلم بعدی در p یک عملگر است، آن را به بالای پشته اضاف کنید. • اگر قلم بعدی p یک عملوند باشد آن را در بالای پشته قرار دهید. • اگر عملوندهای مورد نیاز یک عملگر در بالای پشته قرار داشت، می توان عملگر را بر روی این عملوندها عمل کنیم. عیب این روش پس از قرار دادن هر عملوند در بالای پشته باید چک کنیم ببینیم آیا تعداد عملوندهای لازم برای عملگر فعلی بالای پشته، وجود دارد یا خیر. طراحی و پیاده سازی زبان های برنامه نویسی
الگوریتم رمز گشایی postfix • ارزیابی عبارات postfix: • مراحل الگوریتم postfix به صورت زیر است: • اگر قلم بعدی در p یک عملوند باشد، آن را در بالای پشته قرار دهید. • اگر قلم بعدی در p یک عملگر n تایی است، و n آرگومان آن در بالای پشتته قرار دارد، به جای این n قلم، نتیجه ی اجرای عملگر بر روی آنها در پشته قرار دهید. در اینجا برخلاف نشانه گذاری prefix، چون عملگر موجود در نشانه گذاری postfix بعد از عملوندهایش قرار دارد، وقتی عملگری پیمایش می شود، عملوندهایش قبلا ارزیابی شده اند. نکته: چون استراتژی ارزیابی و پیاده سازی آن ساده است، اساس کار بسیاری از مفسرها برای تولید کد است. مزیت: طراحی و پیاده سازی زبان های برنامه نویسی
ارزیابی عبارات infix • ارزیابی عبارات infix: • گرچه نشانه گذاری infix متداول است، استفاده از آن در زبان برنامه سازی مشکلاتی را به وجود می آورد: • چون نشانه گذاری infix فقط برای عملگرهای دودویی مناسب است، زبان نمی تواند تنها از این نشانه گذاری استفاده کند.بلکه باید نشانه گذاری infix را با postfix یا prefix ترکیب کند. این ترکیب ترجمه را دشوار میکند. • وقتی بیش از یک عملگر infix در عبارتی ظاهر شود، این نشانه گذاری مبهم است، مگر اینکه از پرانتز استفاده گردد. طراحی و پیاده سازی زبان های برنامه نویسی
مثال عبارت روبه رو که به صورت infix هست رادر نظر بگیرید:2*3+4 + * 4 + * 2 3 3 4 2 (2*3)+4=10 2*(3+4)=14 طراحی و پیاده سازی زبان های برنامه نویسی
قواعد ضمنی برای کاهش پرانتز • سلسله مراتب عملگرها(قواعد تقدم عملگرها): • عملگرهایی که در عبارات ظاهر می شوند، به ترتیب سلسله مراتبی یا تقدم قرار می گیرند. • در عبارتی که شامل عملگرهایی از چند سطح سلسله مراتب باشد، قاعده ی ضمنی این است که عملگرهایی با تقدم بالاتر زودتر اجرا شود. سلسله مراتب در ادا طراحی و پیاده سازی زبان های برنامه نویسی
قواعد ضمنی برای کاهش پرانتز • شرکت پذیری: • در عباراتی که شامل عملیاتی در یک سلسله مراتب هستند، قاعده ی ضمنی دیگری لازم است تا ترتیب عملیات را کاملا مشخص کند. • شرکت پذیری چپ به راست متداولترین قاعده ی ضمنی است • تقدم عملگرها برای عبارات محاسباتی به خوبی عمل می کند. زیرا اغلب برنامه نویسان مدل مربوط به معنای عبارات را می شناسند. • اگر زبان حاوی عملگرهایی باشد، که در ریاضیات کلاسیک موجود نباشند، تقدم ها با شکست مواجه می شوند. قواعد ریاضی طوری است که توان از چپ به راست انجام می شود. استثنا: طراحی و پیاده سازی زبان های برنامه نویسی
نمونه هایی از زبانهایی دارای عملگر توسعه یافته نمونه هایی از زبانهایی که عملگرهای توسعه یافته ای دارند: زبانی است که عملیات اولیه آن برای کار کردن بر روی آرایه ها و بردارها طراحی شده است. تقدم برای عملگرهای آن مصنوعی است و تمام عبارات از راست به چپ ارزیابی می شوند. مگر اینکه بعضی از عبارات قابل فهم نباشند. APL زبان این زبان از جدول تقدم پیشرفته ای استفاده می کند. اغلب آنها، از قاعده ی شرکت پذیری چپ به راست استفاده می کنند. C زبان طراحی و پیاده سازی زبان های برنامه نویسی
نمونه هایی از زبانهایی دارای عملگر توسعه یافته هدف اسمالتاک ایجاد توابع(متدهایی) برای کارایی است، روشن نیست که تابع جدید چه تقدمی باید داشته باشد. بنابراین تقدم به طور کلی حذف می شود و عبارات از چپ به راست ارزیابی می شود. فورث زبانی است که ساختار زمان اجرای آن پشته بوده ، و نحو آن postfix محض بود. در postfix محض تقدم به عنوان یک مشکل مطرح نیست. زبات اسمالتاک زبان فورث طراحی و پیاده سازی زبان های برنامه نویسی
ترتیب اجرا در عبارات محاسباتی-نمایش زمان اجرا • اگر هر عبارت را به یکی از سه شکل postfix ,prefix وinfix تبدیل کنیم مترجم برای ارزیابی آن عبارت گزینه هایی مختلفی دارد. • اولین مرحله در ترجمه، ایجاد ساختار کنترلی درختی برای عبارت است. • در مرحله ی اختیاری دوم تصمیمات مشروح در رابطه با ترتیب ارزیابی گرفته می شود. • چنانچه در مرحله ی اول عبارت شامل نشانه گذاری infix باشد، از قواعد تقدم و شرکت پذیری ضمنی استفاده می شود. طراحی و پیاده سازی زبان های برنامه نویسی
چندين آلترناتيو جهت ایجادفرم اجرايیيك عبارت • به دلیل مشکل بودن رمز گشایی عبارات به شکل infix، مطلوب است به شکل اجرایی تبدیل شود که در حین اجرا به راحتی رمز گشایی می شود. برای اینکار سه روش مختلف داریم: • دنباله ای از کد ماشین: اگر عبارات را به یک سری کد ماشین واقعی تبدیل کنیم. ترتیب این دستورات ترتیب عملیات را مشخص می کند.نمایش کد ماشین استفاده از مفسر سخت افزار را امکان پذیر می سازد و موجب افزایش سرعت اجرا می شود. • ساختارهای درختی:در این روش در مرحله ی اول عبارات به کمک مفسر نرم افزاری به شکل درختی در می آیند، سپس در مرحله ی دوم یعنی اجرا، پیمایش درخت انجام می شود. این تکنیک در زبان لیسپ استفاده می شود . • شکل prefix یا postfix: دو روش prefix یا postfix طبق الگوریتم های قبلی می توانند اجرا شوند. در برخی از کامپیوترهای واقعی که بر مبنای پشته کار می کنند کد واقعی ماشین به شکل postfixاست. اجرا از چپ به راست انجام می شود و هر عملیات مفسر خود را را به طور بازگشتی فراخوانی می کند تا عملوندهایش را ارزیابی کند. طراحی و پیاده سازی زبان های برنامه نویسی
نمایش زمان اجرا(ارزیابی نمایش درختی عبارات) گرچه ترجمه ی عبارات برنامه به نمایش های درختی گاهی دشوار است، رویه ی اصلی ترجمه آسان است. در مرحله ی دوم، که در آن درخت به دنباله ی اجرایی از عملیات اولیه تبدیل می شود، مسائلی در مورد ترتیب ارزیابی مطرح می شود. در اینجا نمی خواهیم الگوریتم هایی را مطالعه کنیم که کدی را از نمایش درختی تولید کند، بلکه مسئله های مربوط به ترتیب ارزیابی را در هنگام تولید کد، بررسی میکنیم. نکته ی خیلی مهم طراحی و پیاده سازی زبان های برنامه نویسی
مسائلی در مورد ترتیب ارزیابی • مسئله ی 1: قواعد ارزیابی یکنواخت: • در ارزیابی عبارات یا تولید کدی برای ارزیابی آن، باید این قاعده ارزیابی یکنواخت اعمال شود: • برای هر گره عملیاتی در درخت عبارت، ابتدا هر یک از عملوندهایش را ارزیابی کن ( یا کدی برای ارزیابی آن تولید کن) و سپس عملیات را بر روی عملوندهای ارزیابی شده اجرا کن( یا کدی را برای انجام عملیات تولید کن) این قاعده ی عملیاتی را عجول(aeger) می نامیم. • ترتیب دقیق ارزیابی برخی از اعمال مهم نیست، ترتیب ارزیابی عملوندها یا عملیات مستقل به طوری انتخاب می شود که از حافظه ی موقت یا سایر ویژگیهای ماشین به طور بهینه استفاده شود. طراحی و پیاده سازی زبان های برنامه نویسی
مثال: (a+b)*(c-a) ترتیب 2: عملوندها قبل از عملگرها ارزیابی شوند. ترتیب 1: ابتدا (a+b) محاسبه شود. 1 1- مقدار راست C را بگیر. 2-مقدار راست b را بگری. 3-مقدار راست a را بگیر. 4-a را از c کم کن و در e قرار بده. 5-a و b را جمع کن و در d قرار بده. 6- d و e را ضرب کن و در f قرار بده. 1 1- مقدار راست a را بگیر. 2-مقدار راست b را بگری. 3-a و b را جمع و در d قرار بده. 4-مقدار راست c را بگیر. 5-a را از c کم کن و در e قرار بده. 6- d و e را ضرب کن و در f قرار بده. طراحی و پیاده سازی زبان های برنامه نویسی
مسائلی در مورد ترتیب ارزیابی- ارزیابی یکنواخت • این روش همیشه انجام پذیرنیست. به عنوان مثال عبارت شرطی زیر را در نظر بگیرید. • مشکل مربوط به عملیات شرطی نشان می دهد که ممکن است قاعده ی ارزیابی یکنواخت دیگری به نام قاعده ی ارزیابی تنبل (lazy) بهتر باشد. z+(Y=0 ? X : X/Y) عبارت روبه رو را در نظر بگیرید. در این عبارت مشکلی در در رابطه با قواعد ارزیابی یکنواخت وجود دارد. اگر عملوندهای عملیات شرطی را ارزیابی کنیم نتیجه ای به دست می آید که مورد قبول نیست. یعنی اگر Y صفر باشد، X بر Y تقسیم می شود. بدیهی است که در این حالت نمی خاهیم قبل از انجام عملیات، عملوندها ارزیابی شوند. مثال طراحی و پیاده سازی زبان های برنامه نویسی
مسائلی در مورد ارزیابی- ارزیابی یکنواخت • قاعده ی ارزیابی تنبل: عملوندها را قبل از اجرای عملیات ارزیابی نکنید. بلکه عملوندها را ارزیابی نشده ارسال کنید و اجازه دهید عملیات تصمیم بگیرد که ارزیابی لازم است یا خیر. • این قاعده ی ارزیابی در تمام موارد عمل میکند. اما پیاده سازی آن دشوار است. این کار مستلزم شبیه سازی نرم افزاری زیادی است. • زبانهای محاورهای لیسپ و پرولوگ از این روش برای ارزیابی عبارات استفاده می کنند. • دو قاعده ی ارزیابی یکنواخت که مطرح شد، عجول وتنبل معادل ارسال پارامترها به زیر برنامه ها به ترتیب انتقال پارامترها با مقدار و نام است. • قاعده ی ارزیابی یکنواخت ساده ای وجود ندارد. در پیاده سازی های زبان معمولا از ترکیبی از این دو تکنیک استفاده می شود. • در اسنوبال 4، عملیات تعریف شده توسط برنامه نویس، همواره عملوندهای ارزیابی شده دریافت میکنند و لی عملیات اولیه ای که توسط زبان تعریف شده اند، عملوند های ارزیابی نشده را دریافت می کنند. طراحی و پیاده سازی زبان های برنامه نویسی
مسائلی در مورد ارزیابی- اثرات جانبی • مسئله ی 2: اثرات جانبی • استفاده از عملیاتی که اثرات جانبی بر عبارت دارند. • ترتیب ارزیابی باید به طور کامل در این عبارتها مشخص باشد. مثال: a*fun(x)+a فرض کنید مقدار اولیه a برابر با است، Fun مقدار سه را برگرداند، و a را به دو تغییر دهد. داریم: 1- هر ترم را به ترتیب ارزیابی کنید: 1*3+2=5 2- a را یک بار ارزیابی کنید: 1*3+1=4 3- تابع fun را قبل از a ارزیابی کنید: 3*2+2=8 طراحی و پیاده سازی زبان های برنامه نویسی
مسائلی در مورد ارزیابی-اثرات جانبی • در استفاده از اثرات جانبی در عبارات دو دیدگاه مطرح است: • دیدگاه اول این است که اثرات جانبی باید در عبارات ممنوع باشند که اینکار به دو صورت انجام می شود: • 1-توابع اجازه نداشته باشند اثرات جانبی به وجود آورند. • 2- مقدار هر عبارتی که اثرات جانبی در آن اثر داشته باشد، تعریف نشده معرفی گردد. • دیدگاه دیگر این است که اثرات جانبی وجود داشته باشد و تعریف زبان دقیقا باید مشخص کند که ترتیب ارزیابی عبارات چگونه است. • مشکل دیدگاه دوم این است که بسیاری از بهینه سازی ها را غیر ممکن می سازد. طراحی و پیاده سازی زبان های برنامه نویسی
مسائلی در مورد ارزیابی- اثرات جانبی به این سؤال به دو طریق می توان جواب داد: آیا وابستگی های داخلی از طریق اثرات جانبی ، باید امکان پذیر باشد یا خیر؟ سؤال طراحی و پیاده سازی زبان های برنامه نویسی
مسائلی در مورد ارزیابی- شرایط خطا • مسئله ی 3: شرایط خطا • نوع ویژه ای از اثر جانبی در عملیاتی وجود دارد که ممکن است با شکست مواجه شود و شرایط خطا را فراهم کند. • شرایط خطا ممکن است در بسیاری از عملیات های اولیه به وجود آیند مانند سرریز وتقسیم بر صفر. • معنا و حتی وقوع شرایط خطا ممکن است به خاطر تفاوت در ترتیب ارزیابی اجزای عبارات تحت تأثیر قرار بگیرد، در چنین شرایطی برنامه نویس ممکن است مجبور باشد ترتیب ارزیابی را دقیقا کنترل کند. • راه حل عمومي براي حل اين مشكل وجود ندارد و از يك زبان به زبان ديگر متفاوت است. طراحی و پیاده سازی زبان های برنامه نویسی
ارزیابی نمایش درختی عبارات(عبارات بولین مدار کوتاه) • مسئله ی 4: عبارات بولین مدار کوتاه • در برنامه نویسی از عملیات بولین andو or برای ترکیب عبارات رابطه ای استفاده می شود. • در هر دو عبارت ، ارزیابی عملوند دومِ عملگر بولین ممکن است شرایط خطایی به وجود آورد. لذا عملوند اول گنجانده شده تا تضمین کند که خطایی اتفاق نمی افتد. • اگر مقدار کل عبارت فقط با توجه به مقدار عملوند سمت چپ تعیین شود، این مقدار می تواند بقیه ی عبارت را کوتاه کند. دستورات زیرا در نظر بگیرید: if((A==0)||(B/A>C)) {…} while ((I<= UB) && (v[I]>C)){...} مثال طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب بین دستورات- دستورات اصلی • در این بخش می خواهیم مکانیزم های اصلی را برای کنترل ترتیب بین دستورات بررسی کنیم. • دستورات اصلی: • نتایج هر برنامه توسط دستورات اصلی آن تعیین می شود که عملیاتی را بر روی اشیای داده انجام میدهد. • می توانیم دستورات اصلی را واحدی از برنامه در نظر بگیریم، که یک مرحله از محاسبات را به ما نشان می دهد. • نمونه هایی از دستورات اصلی عبارتند از انتساب و دنباله ای از عملیات ها که با استفاده از عبارات فراخوانی می شوند. طراحی و پیاده سازی زبان های برنامه نویسی
دستورات اصلی-انتساب به اشیای داده • برنامه نویس می تواند از طریق انتساب مقادیر به اشیای داده حالت محاسبات را تغییر دهد. انتسابها به شیوه های گوناگونی انجام می شوند از جمله: • دستور انتساب: • هدف اولیه انتساب این است که مقدار راست عبارت ( یعنی مقدار اشیای داده) را به مقدار چپ آن (یعنی محل حافظه آن) نسبت دهد. در C انتساب یک عملگر است، عبارت روبه را در نظر بگیرید: c=b=1 با توجه به تقدم عملگرها در C، داریم : c=(b=1) 1- مقدار یک به b نسبت داده می شود. 2- عبارت b=1 مقدار یک را برمی گرداند. 3- مقدار یک در c قرار می گیرد. مثال طراحی و پیاده سازی زبان های برنامه نویسی
دستورات اصلی-انتساب به اشیای داده-دستورات اصلی • در برخی از زبانها، انتساب به عنوان یک دستور محسوب می شود. مثلا در زبان پاسکال، انتساب مقدار صحیحی را برنمیگرداند. • اغلب زبانها فقط یک عملگر انتساب دارند، ولی C چند عملگر دارد.(=، =+، ++A، A++) • انتساب قابلیت انعطاف را افزایش می دهد. • در C، عملگره * یک عملگر ارجاع غیر مستقیم است، که با مقدار راست یک متغیر مثل مقدار چپ آن رفتار می کند. • عملگر & یک عملگر آدرس هست، که مقدار چپ را به مقدار راست تبدیل میکند. inti,*p; P=&I; *P=7; مثال طراحی و پیاده سازی زبان های برنامه نویسی
دستورات اصلی-انتساب به اشیای داده- دستورات ورودی • دستورات وردی: • اغلب زبانهای برنامه سازی دستوراتی برای خواندن داده ها از پایانه، فایل یا خطوط ارتباطی دارند. این دستورات مقادیر متغیرها را با انتساب وردی به متغیرها تغییر میدهند. • نحو این دستورات به صورت read(file,data) است. • سایر عملیات انتساب: • انتقال پارامترها به عنوان انتساب مقدار آرگومان به پارامترهای مجازی محسوب می شود. • انتسابهای ضمنی نیز وجود دارد مثلا در اسنوبال 4، ارجاع به input موجب می شود مقدار جدیدی به آن نسبت داده شود. طراحی و پیاده سازی زبان های برنامه نویسی
دستورات اصلی- شکلهای مختلف کنترل ترتیب در سطح دستور • سه شکل مختلف برای کنترل ترتیب سطح دستور وجود دارد: • composition • ممکن است دستورات در یک دنباله ی متنی قرار گیرند و هر وقت که برنامه ی حاوی آن دنباله اجرا شود این دستورات نیز به ترتیب اجرا شوند. • alternation • دستوراتي كه دو يا چند آلترناتيو جهت اجرا وجود دارد.مثلا دو دنباله از دستورات ممکن است طوری باشند که یکی از آنها اجرا شود و دیگری اجرا نشود. ولی هر دو دنباله نمی توانند اجرا شوند. • iteration • كنترل ترتيب در دستوراتي كه براي چندين بار بايد تكرار شود. طراحی و پیاده سازی زبان های برنامه نویسی
دستورات اصلی-کنترل ترتیب ضمنی • زبانهای برنامه سازی اولیه از دستوراتی برای پیاده سازی کنترل ترتیب ضمنی استفاده می کردند که می توان موارد زیر را نام برد: • دستور goto • دستور break طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب ضمنی( دستور goto) • معمولا دو شکل از دستورات goto در بسیاری از زبانها وجود دارد: • پرش غير شرطي : • در اين نوع دستور كنترل برنامه بدون شرط به محل ديگري از برنامه داده مي شود . مثل : Goto NEXT • پرش شرطي : • در صورت برقراري يك شرط كنترل برنامه به محل ديگري انتقال داده مي شود . مثل : • if (A=0) then GOTO next end if نکته گرچه شکل دستور ساده است، ولی به دلیل اینکه برنامه را از حالت ساخت یافته خارج می کند، به ندرت مورد استفاده قرار می گیرد. طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب ضمنی-دستور break • دستور break • این دستور کنترل اجرا را طرف پایین برنامه و در نقطه ی مشخصی خارج از ساختار کنترلی است منتثل می کند. • این دستور یک ساختار کنترلی را ارائه می کند که یک نقطه ی ورود و یک نقطه ی خروج دارد. • دستور continue • در C دستوری به نام continue وجود دارد. این دستور موجب می شود کنترل اجرا به انتهای بدنه ی حلقه ی تکرار برود. طراحی و پیاده سازی زبان های برنامه نویسی
ساختار breakو continue While(){ while(){ ----------- ------------ --------- ----------- ---------- ----------- If () break; if () continue; ------------- ------------ ----------- ------------ ------------ ------------- } } در صورتی که شرط if درست باشد، دستورات break و continue اجرا می شود. طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب بین دستوراتدستورات اصلی طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب بین دستورات:دستورات اصلی طراحی برنامه نویسی ساخت یافته • گرچه اغلب زبان ها برچسب ها و دستورات go to را تعریف می کنند، اما استفاده از آنها از دهه ی 70 محدود شده است. • در بعضی از زبان های جدید همانند ML دستور goto وجود ندارد. • امتیاز goto : • اگر برچسب ها از نظر نحوی ساده باشند مستقیماً توسط سخت افزار پشتیبانی میشود و کارایی آن بالا است • استفاده از آن در برنامه های کوچک ساده است • برای برنامه نویسان اسمبلی و کسانی که با زبانهای قدیمی برنامه نویسی می کنند آشنا است • هدف کلی برای نمایش (شبیه سازی) شکلهای دیگری از کنترل است طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب بین دستورات:دستورات اصلی طراحی برنامه نویسی ساخت یافته معایب goto : • عدم وجود ساختار سلسله مراتبی برنامه: اجرای درست برنامه از اجرای کار آمد آن مهمتر است. طراحی زبان برنامه سازی ، باید این نیازمندی ها را برآورده کند. • مفهوم ساختار یک نقطه ورود، یک نقطه خروج، طراحی برنامه را قابل درک میکند. • برنامه ای که دستورات زیادی داشته باشد، وقتی قابلیت درک آن بالاست که به صورت سلسله مراتبی از گروهها سازماندهی شده باشد، به طوری که هر گروه یک واحد مفهومی از محاسبات باشد. • این سازمان سلسله مراتبی به برنامه نویس اجازه می دهد تا درک کند که بخش های مختلف برنامه چگونه با یکدیگر جور در می آیند. • اگر تمام دستورات برنامه ، به جای اینکه سازماندهی سلسله مراتبی داشته باشند، فقط در یک سطح ظاهر شوند، می گوییم برنامه ساختار مسطح دارد. طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب بین دستورات:دستورات اصلی : طراحی برنامه نویسی ساخت یافتهمعایب goto : • ترتیب دستورات در متن برنامه لازم نیست با ترتیب اجرا یکی باشد. • با استفادهدازgoto می توان برنامه هایی نوشت که کنترل اجرا به طور نامنظم بین دنباله های مختلفی از دستورات منتقل شود. • برای درک برنامه ، باید ترتیب اجرای دستورات را درک کنیم و درک برنامه وقتی ساده تر است که ترتیب اجرای دستورات تقریبا همان ترتیب فیزیکی دستورات باشد. • گروهی از دستورات ممکن است اهداف متعددی داشته باشد. • اگر هر گروه از دستورات ، یک هدف را در ساختار کلی برنامه دنبال کند ، درک برنامه آسان تر می شود. • به طور مثال ممکن است دو گروه از دستورات ، دستورات مشابهی داشته باشند ، با استفاده از goto می توانیم این دو گروه را طوری ترکیب کنیم که دستورات مشابه ، فقط یکبار نوشته شوند و در حین اجرای هر گروه ، کنترل به این دستورات مشترک منتقل شود. به این ترتیب درک این کد مشکل می شود. طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب بین دستورات:دستورات اصلی : طراحی برنامه نویسی ساخت یافتهمعایب goto : • برنامه نویسی ساخت یافته: این اصطلاح برای طراحی هایی از برنامه به کار می رود که : • بر طراحی سلسله مراتبی ساختار های برنامه با استفاده از شکل های کنترلی ساده مثل ترکیب، انتخاب و تکرار تاکید دارد. • بر نمایش طراحی سلسله مراتبی در متن برنامه ، با استفاده از دستورات کنترلی «ساختاری» تاکید دارد. • بر متنی از برنامه که ترتیب فیزیکی دستورات همان ترتیب اجرا باشد تاکید دارد. • بر استفاده از گرو هایی از دستورات با یک هدف تاکید دارد ، حتی اگر مستلزم کپی کردن دستورات باشد. درک، اشکال زدایی، کنترل، تصحیح و نگهداری برنامه های ساخت یافته آسان است. طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب بین دستوراتکنترل ترتیب ساخت یافته طراحی و پیاده سازی زبان های برنامه نویسی
کنترل ترتیب بین دستوراتکنترل ترتیب ساخت یافته • اغلب زبان ها مجموعه ای از دستورات کنترلی را برای بیان شکل های کنترلی اصلی ،یعنی ترکیب ،انتخاب و تکرار فراهم می کنند. • اگر یکی از دستورات کنترل ترتیب ساخت یافته به همراه دستورات دیگر به کار گرفته شود ، ترتیب اجرا از دستور قبلی به دستوری که یک نقطه ی ورود و یک نقطه ی خروج دارد منتقل می شود و پس از اجرای آن به دستور بعدی منتقل می شود. • در خواندن برنامه هایی که فقط از دستوراتی با یک نقطه ی ورود و یک نقطه ی خروج استفاده می کنند جریان اجرای برنامه باید با دنباله ای از دستورات موجود در متن برنامه مطابقت داشته باشد. طراحی و پیاده سازی زبان های برنامه نویسی