هر چه قابلیت ابزار را بشناسیم ابزار شناسی بهتر می شود .
الگو ریتم های بهینه تر می شود .
قدرت انتخاب زبانها بالا تر می رود .
یادگیری زبانهای جدید آسان تر می شود .
برای طراحی زبان جدید می توان از قابلیتهای زبانهایی که شناختیم استفاده کنیم و نقاط ضعف را رفع کنیم .
(مانند java ) Attributes of a good language : ساختار زبان ساده و روشن و واضح (کد نویسی راحت باشد) سنخیت با آن طبیعت مسئله.
orthognaliy (تعامل) قابلیت ترکیب دستور العمل ها و استفاده ازساختاریدر ساختارهای دیگر .
مثال : A=b>3; if (a=b) استفاده یکassignment در ساختار if :Support for abstraction .4 data مجرد که ساخته میشود مهم نیست در کجا کار میکند و از محیط خارج مستقل است و محیط خارج هیچ دخل و تصرفی در بر نامه ندارد .
به data type یک زبان هر چه لازم است می توان اضافه کرد .
مثال : link list یک تایپ data type مجرد است .
5.
Ease of program verificatin ( تشخیص صحت برنامه ) : 6.
programming enviroment : ( محیط مجتمع توسعه IDE که محیط های user friendly هستند ) 7.
portability of programs : ( قابلیت حمل ) از یک دستگاه به دستگاه دیگر کار کند مانند زبان java .
8.
cost of use : ( هزینه اجرا ، هزینه ترجمه ، هزینه تولید ، هزینه نگهداری ) cost of program execution : برنامه سریع اجرا شود و کد بهینه وقت زیادی برای اجرا از cpu نگیرد .
cost of program translation:مدت زمانی که compile کد تولید می کند زمان کمی باشد .
مثال : pascal سریع تر اجرا می شود و کند تر compile می شود زیرا پاسکال بهینه سازی کد انجام می دهد ، زمان بیشتری می برد ولی c بر عکس .
cost of program creation , testing and use : برنامه نویس سریعتر تویط زبان ، برنامه را تولید کند و تعداد برنامه نویس کمتری لازم باشد .
cost of program maintenance : زبانی که توسعه و خوانایی بالاتری داشته باشد .
مثال : pascal هزینه نگهداری کمتری دارد چون ، چند ماه بعد قابل فهم تر است .
زبان خوب برای دانشجو زبانی است که هزینه compile پایین باشد .
بستگی به معیارهای زبان برنامه نویسی مناسب مشخص می شود .
Language paradiagms : Imperative languages : زبانهایی مانند : PLI ، Pascal ، c ، fortran زبانهایی که الگو ریتم ها را در غالب function ، procedure می نویسیم و هر procedure یک شرح وظیفه ای دارد که برنامه نویس کد آنرا می نویسد و مجموعه دستور العمل ها ، state ماشین ( موقعیت cpu و حافظه ) را تغببر می دهد .
بعد از انجام هر دستور العمل نتیجه را در جایی بریزیم و ببینیم .
( procedural languages ) Applicative languages : زبانهایی مانند ML ، Lisp اساس کار function است و زبان با کار کردن این function به نتیجه کار می رسد.
object- oriented programming : محور اصلی این زبان شی ها هستند و با استفاده از این زبان می توان data type پیچیده را از ترکیب data type های جدیدی بدست آورد .(link list : مجموعه ای از data type های ساده بدست آمده ) : Rule – based languages (شاخه ای از زبان توصیفی ) ساختار این rule ها دو بخش است : action validtion languages evtiarative : زبانهایی هستند که دانش (rule ، fact ) داخل آن توصیف می شود و از آنها برای پاسخگویی به یک سری پرسشها استفاده می شود .
زبانهایی که دانش در خطوط برنامه مستقر است .
زبان prolog اجازه داده می شود که دانش در قالب به صورت facts ، rules معرفی شود .
جلسه دوم : Enviroment : محیطی که تحت آن برنامه نویسی انجام می شود و بر طراحی و پیاده سازی زبان تأثیر گذار است .
در محیط dos ،می بینیم که زبان بر نامه نویسی هم تأثیر پذیر است به طور مثال در محیط dos ، mouse programming سخت است .
درc و turbo pascal مشکل است با mouse کار کنیم باید driver موس را داشته باشیم و بعدا با intrupt ها ، mouse را کنترل کنیم .
چون محیط اجازه کار با موس را راحت نمی دهد ، برنامه نویس باید با lintrupt این کار را پیاده کند .
ولی همین c و pascal در ویندوز به علت وجود توابع و امکانات os اجازه کار با موس به راحتی امکان پذیر می سازد.
اگر پاسکال در محیط ویندوز اجرا شود ( زبان Delphi) کار راحتتر است و با mouse می توان کار کرد .
بنابراین محیط در feature هایی که می تواند در اختیار قرار دهد تاثیر گذار است ، مثلا در سیستمهای قدیمی که main frame بودند batch proccessing داشتند .
batch proccessing: وقتی برنامه ای را برای اجرا می فرستیم در صفی قرار می گیرد تا نوبت به آن برسد .
در آن وقت چند برنامه در صف قرار می گیرند و میتوانند با هم کار کنند .
د ر آن وقت شروع به کار می کنند ، از زمانیکه در صف قرار می کیرند تا زمانیکه اجرا شود.userهیچ دخل و تصرفی نمی تواند به آن داشته باشد .
برنامه برای اجرا فرستاده می شود و دیگر منتظر نمی ایستد که کاربر data ای را وارد کند ( توسط کی برد ) یا مثلا اطلاعاتی را روی صفحه ببینیم .
بنا براین حالت interaction بین user و برنامه وجود ندارد .
چون محیط اینطور است زبانهایی که تحت این محیط طراحی و پیاده سازی می شوند ، featureهایی مثل demo کارهای mouse و کارهایی که حالت interaction بین user و برنامه باشد دیده نمی شود .
( ارتباط بر قرار کردن و رد و بدل کردن اطلاعات : interaction ) .
ولی در عوض بدلیل اینکه کار با دستگاههای جانبی مثل دیسکها و tape ها و کارتخوان و ...
بیشر نیاز است ، featureهایی که بتواند با آنها کار کند بیشتر شده است .( مثل cobol در Dosvs) .
یعنی محیط بسیار در طراحی زبان و feature هایی که آن زبان می تواند در اختیار کاربر بگذارد موثر است .
در بعضی سیستمها ممکن است feature هایی لازم باشد که محیط نمی دهد ، زبان برنامه سازی باید آنرا شبیه سازی software simulation کند .
برای طراحی و پیاده سازی زبان اولین کاری که باید بکنیم این است که چون می دانیم محیط روی زبان موثر است ، محیطی را که با این زبان قرار است کامپایل شود روی آن و یا محیطی که این زبان باید روی آن اجرا شود شناسایی کنیم .
پس شناسایی اینکه روی چه دستگاهی عملیات کامپایل انجام شود و برنامه روی چه دستگاهی اجرا می شود اهمیت دارد..معمولا روی همان دستگاه که برنامه کامپایل می شود روی همان اجرا می شود .
پس باید تا حدودی معماری کار را بشناسیم که چه اتفاقاتی می افتد داخلی ترین لایه Actual Computer است که همانن سخت افزار است و به تنهایی قابل استفاده نیست و برای قابل استفاده شدن به لایه های نرم افزاری روی آن نیاز است .
شکل Virtual Computer: AP PL OS BIOS AC یک لایه نازک نرم افزاری به اسم Bios که روی لایه Actual comp.
قرار میگیرد .
یک سری سرویسهای اولیه مربوط به ورودی و خروجی در آن قرار گرفته .
این نما سطوح Virtuality را نمایش میدهد.
وقتی کامپیوتر را روشن می کنیم قبل از اینکه سیستم عامل بالا بیاید Keyboard و Ram گراقیک روشن میشوند و hard چشمک می زند ، این سرویسها مربوط به bios است.
یک لایه دیگر روی bios قرار میگیرد به نام os .
این لایه یک سری امکانات بیشتر با خودش میآورد و از لایه زیرین (bios) یک سری امکانات را می گیرد و به لایه بالایی میدهد و خودش هم یکسری امکانات اضافه میکند .همین os مجموعه ای از managerها است ، بخاطر اینکه resurceها در این لایه محدود است .
Cpu وI/O device ها همگی resurce هستند ، منابعی که برنامه ها از آن استفاده میکنند برای اینکه هرج و مرج رخ ندهد ، نیاز به برنامه ای است که کنترل کند و مدیریت resurce ها را انجام دهد .بنابراین لازم است os یک سری سرویسها از لایه های پایین گرفته و به لایه بالایی دهد و یک سری هم خودش( برنامه ای مانند storage management ) را اضافه کند .
لایه بالاتر لایه programming language یا زبانهای برنامه سازی است .
این لایه ای است که ما روی آن بحث می کنیم .
این لایه سرویسهای لایه زیرین را گرفته و ضمن اینکه اگر نقاط ضعفی در لایه های پایینتر وجود دارد سعی می کند آن نقاط ضعف را برطرف نماید و سرویسها را به لایه های بالاتر منتقل می کند .
لایه بالاتر ، لایه application program است که شامل برنامه هایی که می نویسیم ،است .مجموعه ای از لایه های زیرین ممکن است که مستقیما سرویسها را از لایه پایینتر نگیرد بلکه از لایه های زیرین بگیرد ( چند لایه پایینتر) .مثل اینکه در لایه application program مستقیما با یک پورت کار کند .
یعنی مستقیما با یک پورت کار کند .یعنی مستقیما با لایه actual computer در ارتباط است.
یا در یک application program از intrupt bios یا intropt os استفاده کنیم و یا از زبانی استفاده کنیم که خودش می داند چه کار بکند مثل توابع کتابخانه ای sin،sqrt ، که اینجا از لایه programming lang.
استفاده کردیم.
Actual comp.
ای که اطرافش لایه های نرم افزاری است که سرویس دهی را بیشتر میکند تشکیل دهنده virtual comp.
است .زمانیکه بخواهیم زبانی را طراحی کنیم باید بدانیم روی چه virtual comp.
ای طراحی را انجام میدهیم .فقط actual comp.
به تنهایی کفایت نمیکند"،باید بدانیم تحت چه سیستم عاملی است .اگر c++ را تحت dos روی ibm compatible پیاده سازی کنیم ، با زمانیکه تحت ویندوز پیاده سازی میکنیم متفاوت است.
محیط روی feature های زبان تاثیر میگذارد.
لایه های نرم افزاری واقعی نیستند .به همین دلیل به آن virtual comp.
میگوییم و به لایه های آن virtuality levels می گوییم .
بنابراین در زمان طراحی و پیاده سازی لازم است بدانیم virtual comp.
مورد نظر چیست .
ممکن است سطوح های computer virtual مستقیما feature را در اختیار زبان برنامه نویسی قرار ندهد .
در آن وقت زبان برنامه نویسی سرویس ها را باید soft ware simulation کند .
مثال :در کامپوتر های قدیمی 80286 ، 80386 ، sx 80486 ،8086 ،actual computer نمی توانست پردازشهای floating point را انجام دهد و زبانهایی که طراحی میشدند نمی توانستند محاسبات اعشاری را انجام دهند پس از software simulation استفاده می شد مثال :در کامپوتر های قدیمی 80286 ، 80386 ، sx 80486 ،8086 ،actual computer نمی توانست پردازشهای floating point را انجام دهد و زبانهایی که طراحی میشدند نمی توانستند محاسبات اعشاری را انجام دهند پس از software simulation استفاده می شد .
مثلا : اگر با fortran برنامه ای که floating point processing داشت نوشتیم بنابر این به assemble code اش نگاه می کردیم از یک طرف function call استفاده شده بود که این function نرم افزاری ، این کار را انجام می دهد .
(software simulation ) .
بسته به computer virtual ای که زبان برنامه نویسی روی آن قرار گرفته سرویس داده می شود و هر چه قدر قوی باشد امکانات را از سطوح زیرین می گیرد و در اختیار سطوح بالاتر می گذارد و امکاناتی را که سطوح زیرین نمی دهد را program language همه سرویس ها را software simulation می کند .
اگر بخواهیم زبانی را طراحی و پیاده سازی کنیم باید بدانیم لایه های زیرین آن چه feature هایی دارند و ما از کدامیک از آنها می توانیم استفاده کنیم و نیاز لایه بالایی را از feature های لایه پایین و بعلاوه software simulation برطرف می کنیم .
Program language : زبانهای برنامه سازی دارای سطوح مختلف دارند : زبانهای سطح پایین مثل machin code ، اسمبلی ، macro زبانهای سطح بالا مثل pascal ، basic ، PLI ، cobol زبانهای سطح میانی مثل C زبانهای سطح خیلی بالا مثل SQL ، mathlab translator (مترجم ) interpreter (مفسر ) translater : با استفاده از یک سری روش ها و زبان ماشین پردازشی را روی زبان مبدأ با ساختار هایی که دارد به زبان مقصد با ساختارهای جدید انجام شود را translater می گویند .
(زبان مقصد : زبان ماشین ) مترجم ها چند گروهند : compiler : زبانهای سطح بالا را تبدیل به زبان ماشین می کنند .
assembler : زبانهای سطح پایین را تبدیل به زبان ماشین می کنند .
فرق اسمبلر و کامپایلر : در اسمبلر تناظر یک به یک بین دستور العمل ها و machine code است ، یعنی اگر بخواهیم فعالیتی انجام دهیم assembly code است که میشود چندین خط در خط یک دستور العمل یک ماشین کد نوشت و تناظر یک به چند است .
نحوه عمل translate : در اسمبلر تناظر یک به یک بین target ، source است یعنی یک دستور العمل source مستقیما یک دستور العمل target می شود .
(machine code دستورالعمل اسمبلی) در صورتیکه در کامپایلر ها فعالیتها نسبت به اسمبلر خیلی بیشتر است .
(تناظر یک به چند است .) یک دستررالعمل در source به چندین دستور العمل در target که اسمبلی یا ماشین کد است تبدیل می شود .
کار کامپایلر ترجمه است یعنی یک ساختار دیگر تبدیل می شود ، بدون در نظر گرفتن اینکه منطق پشت قضیه چیست ؟!
یک ساختار میگیرد ساختار دیگر می دهد .
لازم نیست که به اسمبلی تبدیل شود و از اسمبلی به ماشین کد یک شکل اند.
بوجود آمدن اسمبلی از آنجایی است که ماشین کد بوده در ابتداکه صفر و یک بود ، برای هر دستور کد صفر و یک بود، ولی حالا به جای صفر و یک آن را نمادین کردند .
هر چه به زبان ماشین نزدیک می شویم قدرت برنامه نویسی بالا می رود و سهولت پایین می آید .
خیلی جاها به خاطر اینکه لایه ای زبان قرار می دهد،نمی توان از تمام feature ها استفاده کرد،محیور هستیم مستقیما سراغ کد برویم .
مثلا در داخل کد C از اسمبلی کد به صورت embed استفاده کنیم یا 10 خط پاسکال بنویسیم که سه خط آن اسمبلی باشد .
در صفحه 55 روی کامپایلر ها یعنی زبانهایی مثل C و پاسکال و نمودارش کشیده شده که به چه شکل عمل می شود .
نحوه عملکردش مشخص است .
یک source کدی داریم و به کامپا یلر می دهیم .
کامپا یلر یک فاز کامپایل روی آن می گذارند این فاز کامپایل باعث می شود یک کد target ای برای ما تولید شود که به آن object code می گوییم ، که همان زبان ماشین است .
پس اینجا source code را می گیرد و کامپا یلر translate می کند .
زبان source را می گیرد ( پاسکال و C و PLI و بیسیک و ...
) و تبدیل به یک فاز خروجی با زبان ماشین کد که این object از روی source code ساخته شده ، حالا اگر source code از یک سری توابعی استفاده کرده باشد که source code آنرا ما ننوشتیم مثل Sqrt ، Sin ، Cout ، اینها توابعی است که از قبل تعریف شده و ما در برنامه از آن استفاده کرده ایم .
جلسه سوم : Binding : (انقیاد ، قید گذاری ) هر متغیری یک سری attribute هایی دارد از جمله : اسم متغیر ،vocation، data type ، data type sizeو مقدار مجاز هر زمان که به attribute های یک موجودیت مقدار بردیم و به آن مقدار محدودش کنیم عمل binding انجام شده است .
مثال : a=10 ; atribiute ، value یک موجودیت را به مقدار 10 , set میکنیم و این binding، value است .(در زمان run time) مثال: int k ; این تعریف نشان دهنده موجودیتی به نام kاست .
پس binding انجام شده و data type این متغیر integer است .(در زمان compile ) Classes of binding time : Binding ها ممکن است در زمانهای مختلف انجام شوند .
binding در زمان تعریف و طراحی یک زبان :language definition time) ) به طور مثال : تعریف می کنند زبانی را که support را object onented کند و class را داشته باشد data type از نوع integer و یا حلقه های تکرار و امکانات دیگری که می خواهیم داشته باشد و از این طریق محدودیت تعریف زبان را مشخص می کند و نتیجه می گیریم binding یک زبان de fenition است .
binding در زمان implementation ( language implementation time ) به طور مثال : integer را مطرح می کنیم که می تواند 16 بیتی ، 32 بیتی یا 64 بیتی ، طراحی pointer ، refrence بر اساس pointer ، پیاده سازی آرایه دو بعدی بر اساس آرایه ای از آرایه ها که این ترتیب پیاده سازی را مشخص و محدود می کنیم .
این دومورد تازمانیکه زبان برنامه سازی طراحی شود و پس از تولید زبان دو مرحله binding دیگری وجود دارد .
(compile time ) transaction time : در مرحله compile ، binding انجام می شود .
به طور مثال : ; k int که یک declaration است که در زمان compile انجام می شود .
(run time ) Execution time : به طور مثال : مقدار دهی یک متغیر ( چون در زمان run time است که مقدار دهی انجام می شود .) سئوال:Binding تعریف روبرو چیست؟
static int a=10 ; Location این متغیر در زمان run time مشخص می شود که کدام قسمت حافظه را اشغال می کند .چون در زمان run time کد برنامه توسط loader از دیسک برداشته می شود و در حافظه گذاشته می شود .
( location هم یکی از attribute های یک data object است .) توجه: به این گونه مقدار دهی initialize می گویند .
static variable ها در انتهای کد یا بین دو کد قرار می گیرند بنابراین جایش به صورت logic ای مشخص است .
فرض کنید پس از این تعریف a = 5 قرار دهیم ، برایش کد تعریف نشده است ولی برای دستور بالا کد تعریف شده است .
پس تعریف static int a=10; ، 10 در یک location قرار می گیرد و زمانیکه به خط ; a = 5 می رسد 10 تبدیل به 5 می شود و به این ترتیب ; a = 5 در زمان run time است.
فرض کنید تعریف بالا را به صورت int a=10; بنویسیم در این صورت این خط در زمان run time اجرا می شود ( توسط f7 ، f8 ) زیرا متغیر هایی که به صورت static تعریف نمی شوند ، معلوم نیست کجای حافظه قرار می گیرد وتا زمانیکه حافظه ای را نگرفته اند مقدار دهی اولیه هم نمی شوند و در زمان run time مقداری حافظه گرفته می شود و a به آن تخصیص داده می شود و مقدار دهی می شود مثلا با مقدار 10.
(فرق بین variable static ، dynamic variable ) زبانهایی که بیشتر عملیات binding شان را در مرحله compile انجام می دهند زبانهای early binding می گویند مانند : " compiler " زبانهایی که بیشتر عملیات binding شان را در مرحله اجرا می دهند زبانهای binding late می گویند مانند : interpreter - البته بعضی از فعالیتها در مرحله compile و بعضی از فعالیتها در مرحله run time انجام میشود .
Run time mov ax , 2 Compile static int a=2 ترجمه زبان : تعریف تر جمه : یک ساختار را به عنوان ورودی گرفته و به ساختار دیگر با vocab دیگر تبدیل شود.
برای تشخیص در ستی مسئله syntax عنوان می شود .
تعریف syntax: چیدمان عناصر اجرا تشکیل دهنده یک زبان در کنار هم که ساختار درست و تعریف شده ای داشته باشد .
( ساختار شناخته شده در زبان مورد نظر داشته باشد .) تعریف semantic : از لحاظ معنایی ساختار جمله بررسی می شود .
مثال: در زبان فارسی ساختار جمله که تشکیل شده از اعضای زیر (فعل، فاعل، مفعول) علی حسن را زد.
syntax√ X Semantic از لحاظ Syntax عبارت حسن علی را رفت ، درست است ولی از لحاظ Semantic خیر.
مثال : A+(B*C) (A+B)*C معیارهایی برای خوب بودن syntax : 1.
raedability: قابلیت خواندن خوانایی Syntax این خوب است که ساختارهای پیچیده نداشته باشد و زمانی که کدی به آن زبان syntax نوشته می شود بعدا به راحتی آنرا بتوان خواند .
2) writeability : توانایی نوشتاری توانایی نوشتاری بالا باشد و برنامه نویس به راحتی و بدون دردسر بتواند کد نویسی کند .
writeability و readability با هم رابطه متضادی دارند .
مثلا پاسکال یک زبان readability است.
C " " writeability است .
یعنی کدی را می توان با C نوشت و یک برنامه نویس حرفه ای هم بتواند این کد را write کند حسن های writeability : Redundant را کم می کند ،یعنی اگر قابلیت نوشتاری بالا باشد می توان با ترکیب ساختارها ، ساختار جدیدی داشته باشیم که نیازها را برطرف می کند .
مثال: در c داخل for می توان همه کار کرد ولی در پاسکال به خاطر محدود بودن syntax مجبور هستیم برای یک کار تعداد خطوط بیشتری بنویسیم .
redundant code یعنی کدهای تکراریو وقتی که writabilty بالا باشد ، کدهای تکراری کم می شود .
راحتی verifying (تعیین صحت برنامه): یعنی هر چه برنامه readable باشد ،راحتی verifying وجود دارد .
کدی داریم که اشکال زدایی می کنیم و با وجود readability اشکال زدایی راحتر می شود .ولی در صورتیکه readable و writeable با هم باندازه ای باید داشته باشیم که همه writeableباشند و تعداد خطوط کمتر باشد و هم readableباشد که پیچیدگی خیلی زیاد نداشته باشد .پسverifying هم با readability و هم با writeability در ارتباط است .
ease of translation : راحتی ترجمه کامپایلر راحتر بتواند زبان syntax را ترجمه کند و این زمانی است که ساختار ساده باشد و تعداد ساختار کمی داشته باشد.
کامپایلر پاسکال سریعتر از c است .
مثال : در c یک اپراتوری بشکل روبرو داریم (conditional operator) که اگر در چند خط استفاده شود ، ساختار پیچیده ای را بوجود می آورد و برای کامپایل زمان زیادی را میبرد برای تشخیص فعالیتی که انجام دهد و اطلاعات را نگهدارد و تشخیص دهد که کدام برای بخش if و کدام برای بخش else است .
Syntax زبان cobol نزدیک به زبان انسان است و کار کامپایلر سخت می شود زیرا هرچه زبان نزدیک به زبان ماشین باشد کار کامپایلر راحتر است .مانند زبان اسمبلی .زیرا به ازای هر دستور اسمبلی یک دستور machine code داریم .
فقدان ابهام (lake of ombiguity): Syntaxای خوب است که ابهام نداشته باشد .
مثال : در زبان fortran : می توان 2 تعبیر از عبارت داشت (i,j) A ماتریس A با اندیس i و j function ،A با پارامترi و j که در c و پاسکال این مسئله حل شده که اگر ماتریس با شد از [ ] و اگر function باشد از ( ) استفاده می شود .
عناصر تشکیل دهنده یک syntax : chracter set :یعنی در syntax چه کاراکترها و کدهایی valid هستند .
مثال: $ در c کاربرد ندارد ولی در pl1 بعنوان جزئی از اسم identifier استفاده می شود .
identifiers : یعنی شناسه ها چه هستند identifier : اسامی متغیرها اسامی lable ها اسامی function اسامی constant و مشخص باشد که ساختار ID چه باشد و با چه شروع می شود ،اجزاء Syntax را تشکیل می دهد.
operator symbols : نمادها مثال: در زبانی equal را با = set کند.
در زبانی equal را با :eg: set کند مانند fortran keywords and reservedwords : keywords کلماتی هستند که توسط کامپایلر شناسایی شده هستند ولی بعنئان identifier هم می توان استفاده کرد .
مثال : key word if,for در زبان pl1 در زبان c ، keyword نداریم و همه reserved word هستند.
Reservedwords : کلمات کلیدی هستند که کامپایلر می تواند بشناسدو فقط و فقط از آنها استفاده کند و ما نمی توانیم به آن نام identifier داشته باشیم.
noise words : کلماتی هستند که در دستورالعملها استفاده می شوند که خوانایی بالا می رود و عبارت شکیلتر می شود .
go lable در زبان cobol Go to lable وجود یا عدم وجود to در code تاثیر ندارد ولی شکیلتر میشود و به زبان انسان نزدیکتر است .
comments : توضیحات داخل برنامه که توسط برنامه نویس برای خوانایی بیشتر کد نوشته میشود و کامپایلر روی توضیحات هیچ action ندارد و از دید کامپایلر کاملا by pass است.
blanks(space) : برای خوانایی syntax به شرطی که در جای مناسب استفاده شود .
مثال : بین ++ ، blank استفاده نکنید.
delimiters and brackets : که tokenها (عناصر اتمی syntax مانند if,then,for, که تجزیه ناپذیرند)را از هم جدا می کنند .
A ( j , I ) delimiter 9.
free and fixed field format: syntax هایی هستند که در آنها دستورالعمل ها از یک ستون خاص شروع و تا یک ستون خاص دیگر تمام شود .
در یک خط نمیتوان بیش از یک دستورالعمل بکار برد .
یک دستورالعمل را نمیتوان در چند خط نوشت .
مانند fortran و اسمبلی که یکنوع fixed fit format هستند .
c و پاسکال free fix format هستند یعنی هر دستورالعمل در چند خط و در یک خط بیش از یک دستورالعمل.
10.
expression & statements : دستورالعملی که state ماشین را تغییر می دهد و کاری انجام میدهد ولی مقداری را برنمی گرداند را statement گویند .مانند procedure مثال : if statement ، for statement ، assignment statement دستورالعملی که مقدار برمی گرداند را expression می گویند .
مانند function مثال : a مقدار بر نمی گرداند assignment statement ( در پاسکال) a=b; Assignment expression ( در c ) a=b; a مقدار برمیگرداند a=b=c=2; Overall program subprogram structure (دید کلی روی ساختار برنامه و زیر برنامه ) گروهبندی برنامه ها و زیربرنامه ها از لحاظ syntax : 1.
separate subprogram definition : زیر برنامه ها بصورت مجزا از هم تعریف می شوند مانند c و fortran.
Syntax اجازه بدهد که برنامه ها را در داخل فایلهای مختلف بریزیم و جدا از هم کامپایل کنیم و سپس با هم ادغام کنیم(link) .
حسن این روش این است که اگر برنامه ای یک خطش دست بخورد فقط این فایل recompile می شود و بقیه نیازی نیست دوباره کامپایل شود .
2.
separate data definition : بخش تعریف data جدا از بخش برنامه باشد .
زبانهایی که abstract data type را support می کنند ، اجازه میدهند که برنامه نویس data type تعریف کند .مانند c++ ، java ،که data type ها در فایلهای جداگانه ای نوشته شوند .و این برنامه بتواند از اینها استفاده کند .
مثال: برنامه نویس یک data type ، link list و یا stack می نویسد که برنامه دیگر میتواند آن استفاده کند که این مفهوم .
separate data definition را میرساند.
3.
nested subprogram definition : زیر برنامه ها بصورت تودرتو داخل هم تعریف می شوند مانند پاسکال.
: یعنی میتوان متغیر تعریف کرد .
خود تعریف شدن زیر برنامه ها در داخل هم ، مسئله scope (میدان دید )را بوجود می آورد و زیر برنامه ای که در داخل زیر برنامه دیگر تعریف شده است از بیرون قابل رویت و Call کردن نیست .(این مسئله non-local ، local وglobal را بوجود می آورد) - c کاملا separate subprogram indef.
است و زیر برنامه ها کاملا مجزا از هم هستند .
4.
separate interfact definitions : فایل unit ها ساختار دو بخشی دارند: Interface Implementation کدی را مینویسیم بطور مثال 100 عدد function در بخش implementation نوشته می شود و بخواهیم از این 100 عدد ، 5 عدد آنرا همه ببینند .5 عدد از prototype های function هایی را که می خواهیم همه ببینند در interface می گذاریم .
interface مانند روابط عمومی سازمان می ماند (رابط با محیط خارجی) اگر چیزی در بخش implementation تعریف شود و در interface تعریف نشود، دیگران نمی توانند آنرا ببینند.
مثال: header file های c یک نمونه.
separate data definition است .زیرا بخش تعریف و برقرار شدن ارتباط در یک header file گذاشته شده است .
data description separated from excutable statements : بخش تعریف dataمجزا از بخش کد اجرایی باشد .
مثال : در cobol یک برنامه 4 بخش دارد : 1.
identification ، برنامه نویس کیست ، برنامه راجع به چیست و در چه زمانی نوشته شده است .
enviroment : مشخص کننده دستگاههای جانبی.
data : کلیه ساختارها و رکوردها و متغیر ها در این بخش تعریف می شود .
program : از این بخش به بعد نمی توان data ( رکورد ، ساختار، متغیر،ثابتها) تعریف کرد .
6.
unseparated subprogram definitions : data,interface ، data type مجزا از هم نیستند و همه در یک جا هستند .مانند زبانهای قدیمی 1978 basic .
مراحل ترجمه :stages in translation Object source lexical analysis : 1.
جمله ورودی را که بعنوان source گرفته به token ها می شکند (tokenize) که token ها معنی دار باشد .
Identification : (شناسایی) تشخیص reserve word ، key word ، پرانتز ، constant،operator را میدهد .
syntax analysis : (تحلیلگر نحوی) از لحاظ گرامر چک میکند ( گرامرهای production rule) و ساختار جمله را بررسی می کند .
مثال : حسن علی را رفت.
اگر از لحاظ syntactic درست باشد درخت parse درست می کند که برگها ترمینال زبان هستند .
اگر از لحاظ syntactic درست نباشد درخت parse درست نمی کند و ادامه پیدا نمی کند .
Parse tree : درختی که برگها ترمینالهای یک زبان هستند.
ترمینال تجزیه ناپذیر Identifier ترمینال است Expression ترمینال نیست analysis semantic ( تحلیلگر معنایی): بعد از ساخت درخت parse ، تشخیص اولویت را بر عهده دارد .
تشخیص اولویت با semantic است .
A+B*C B*C A+B*C شبه کد تولید می کند .
Symbol Table : جدولی که اطلاعات identifier ها را داخل خودش نگهداری می کند .
یک متغیر a که data type آن از نوع integer است ، این اطلاعات در int a ; symbol table نگهداری می شود و اطلاعاتی(نام ، مقدار اولیه ، location ، data type ) را در مورد متغیر نگهداری می کند .
4 وظیفه semantic analysis : 1.
symbol table maintenance : نگهداری و بروز رسانی اطلاعات symbol table .
مثال: scanner و parse تشخیص نمی دهند که a از نوع int باشد int a; فقط تشخیص می دهد که از لحاظ syntax درست است یا نه .
بلکه تشخیص اینکار برعهده semantic است .
Scanner : یک نرم افزار که یک identifier است و عمل tokenize را انجام میدهد .
Semantic : تعیین data type متغیر a .
Parse : درست بودن از لحاظ گرامری.
insertion of implicit information: درج اطلاعات ضمنی مثال : اینکه B*C و بعد A+B*C این اطلاعات ضمنی است .
A+B*C در Fortran اگر متغیری تعریف نشود و شروع متغیرها از I…N باشد integer تلقی میشود .و در غیر اینصورت float تعریف می شود و این اطلاعات ضمنی است که ذخیره می شود .
مثال : اگر متغیری را تعریف نکنیم و در جایی استفاده شود fortran ، error نمی دهد بلکه در قسمت semantic با آن متغیر data type و فضایی داده می شود که اینها یکسری اطلاعات ضمنی هستند.و یا تبدیل data type ها به یکدیگر چون اینها معنای جمله هستند .