You are on page 1of 37

‫‌طراحی‌و‌پیاده‌سازی‌زبان‌های‌برنامه‌سازی‬

‫بحث‌انواع‌داده‌اولیه‬
‫استاد‌درس‪‌‌‌‌‌:‬مهدی‌جبل‌عاملی‬
‫• شی داده (‪)Data Object‬‬
‫• یک شی داده گروهی از یک یا چند قسمت از اطالعات است که در کامپیوترهای مجازی استفاده‬
‫می شود‪.‬‬
‫• در واقع شی داده ظرفی برای مقادیری از داده هاست ‪.‬‬
‫• یعنی محلی است که داده ها در آنجا ذخیره و بازیابی می شوند‪.‬‬

‫‪2‬‬
‫• طول عمر )‪(life time‬‬
‫یکی از صفات شی داده طول عمر است‪ .‬فاصله زمانی بین لحظه ای که حافظه به شی داده تخصیص‬
‫داده میشوند تا زمانی که حافظه از آن پس گرفته می شود را طول عمر شی داده گویند‪.‬‬
‫هر یک از اشیا داده دارای طول عمر مخصوص به خود هستند‪ .‬بعضی از اشیا داده در شروع اجرای‬
‫برنامه وجود دارند و برخی در حین اجرا بصورت پویا ایجاد میشوند و برخی در حین اجرای برنامه‬
‫از بین می روند و برخی تا آخر اجرای برنامه باقی می مانند‪.‬‬

‫‪3‬‬
‫• شی داده اولیه )‪ : (Elementary‬یک شی داده اولیه است اگر تنها شامل یک محل حافظه برای‬
‫مقدار داده باشد‪ .‬مانند اشیا داده از نوع ‪… , CHAR , FLOAT , INT‬‬

‫• شی داده ساختمان داده)‪ : (Structure‬اگر شی داده شامل مجموعه ای از سایر اشیا داده ای‬
‫باشد‪ .‬مانند رکورد ‪،‬آرایه مقدار یک شی داده ای توسط الگویی از بیت ها مشخص میشود ‪.‬‬

‫‪4‬‬
‫صفات شیء داده‬

‫نوع‬ ‫•‬
‫محل‬ ‫•‬
‫مقدار‬ ‫•‬
‫نام‬ ‫•‬
‫اجزاء‬ ‫•‬

‫‪Prentice Hall, 2002‬‬


‫متغیرها ‪ :‬یک شی داده ای است که توسط برنامه نویس تعریف شده و به‬
‫صورت صریح استفاده می شود‪.‬‬
‫; ‪Int n‬‬
‫;‪Char ch‬‬
‫ثابت ‪ :‬یک شی داده ای با نام است و مقداری که به آن نسبت داده می شود‬
‫در طول عمر آن ثابت است‪.‬‬
‫;‪Const int max =30‬‬
‫ثابت لیترال ‪ :‬یک ثابت لیترال ‪ ،‬ثابتی است که نام آن همان نمایش‬
‫الً “‪ ”37‬یک ثابت لیترال است که یک شی داده با مقدار‬
‫مقدارش است ‪ .‬مث ‌‬
‫‪ 37‬می باشد‪.‬‬

‫‪6‬‬
: ‫مثال‬
int max = 100;

If (max <20) then


{…
..
..}

7
‫• نوع داده ‪Data Type‬‬
‫نوع داده طبقه ای از اشیا داده به همراه مجموعه ای از عملیات برای تولید و دستکاری می باشد‪.‬‬

‫هر زبان مجموعه ای از انوع داده اولیه مانند ‪ char , int , bool , float‬دارد که هنگام تعریف‬
‫زبان مشخص شده اند‪.‬‬
‫عالوه بر این زبان ممکن است به برنامه نویس اجازه دهد انواع جدیدی را تعریف کند‪.‬‬

‫‪8‬‬
‫انواع‌داده‌اولیه‬
‫زیر نوع ها ‪:‬‬
‫وقتی نوع داده جدیدی را توصیف می کنیم اغلب تمایل داریم بگوییم که‬
‫این نوع مشابه نوع دیگری است به عنوان مثال در زبان ‪ c‬انواع ‪short ,‬‬
‫‪ long int‬شکل های گوناگونی از نوع داده صحیح هستند و رفتار آنها‬
‫یکسان است و عالقه داریم که عملیاتی مانند جمع و ضرب به طور یکسان‬
‫تعریف شود‪ .‬بنابراین اگر نوعی به عنوان بخشی از نوع بزرگتر باشد آن‬
‫نوع را زیر نوع و به نوع بزرگتر ابرنوع می گوییم‪ .‬یا به عبارت دقیق تر اگر‬
‫مجموعه مقادیر یک نوع ‪ ،‬زیر مجموعه ی مجموعه مقادیر نوع دیگر باشد‬
‫نوع با مجموعه مقادیر بزرگتر را ابر نوع و نوع دیگر را زیر نوع گویند‪ .‬به‬
‫عنوان مثال ‪ short int‬زیر نوع ‪ int , int‬زیر نوع ‪ long int‬می‬
‫باشد‪.‬‬

‫‪11‬‬
‫• ‪ -3-5‬اعالن ‪Declaration‬‬
‫• اعالن دستوری از برنامه است که نام‪ ،‬نوع و طول عمر اشیا داده را‬
‫مشخص می سازد‬
‫;‪• int x‬‬

‫‪12‬‬
‫• ‪ -3-5‬اعالن ‪Declaration‬‬
‫• اعالن دستوری از برنامه است که نام‪ ،‬نوع و طول عمر اشیا داده را‬
‫مشخص می سازد‬
‫;‪• int x‬‬
‫• در زبان ‪ perl‬انتساب مقداری به متغیر آن را اعالن می کند‪.‬‬
‫• متغیر رشته ای ”‪$x = “abc‬‬
‫‪$y = 123‬‬ ‫• متغیر صحیح‬

‫‪13‬‬
‫• عالوه‌بر‌این‌اعالن‌ها‌می‌توانند‌اطالعاتی‌راجع‌به‌‌عملیات‌را‌به‌مترجم‌بدهند‌مثل‌اعالن‌تابع‌زیر‌که‌تعداد‌‪،‬ترتیب‌‬
‫‪،‬نوع‌پارامتر‌و‌نتیجه‌را‌مشخص‌می‌کند‪‌.‬‬
‫‪Function sub ( int x , float y ): real‬‬

‫‪14‬‬
‫• اهدف اعالن‬
‫• الف ) انتخاب نمایش حافظه ‪:‬‬

‫‪15‬‬
‫• اهدف اعالن‬
‫• الف ) انتخاب نمایش حافظه ‪:‬‬
‫• ب ) مدیریت حافظه بهتر ‪:‬‬

‫‪16‬‬
‫• اهدف اعالن‬
‫• الف ) انتخاب نمایش حافظه ‪:‬‬
‫• ب ) مدیریت حافظه بهتر ‪:‬‬
‫• ج ) عملیات چند ریختی‬

‫)‪A(int x , int y‬‬


‫)‪A(int x , float y‬‬

‫‪17‬‬
‫• اهدف اعالن‬
‫• الف ) انتخاب نمایش حافظه ‪:‬‬
‫• ب ) مدیریت حافظه بهتر ‪:‬‬
‫• ج ) عملیات چند ریختی‬

‫)‪A(int x , int y‬‬


‫)‪A(int x , float y‬‬
‫• د ) کنترل نوع ایستا‬

‫‪18‬‬
‫‪ -4-5‬کنترل نوع‬

‫‪X= X+1‬‬

‫‪19‬‬
‫‪ -4-5‬کنترل نوع‬
‫منظور از کنترل نوع این است که هر عملیاتی که در برنامه انجام می گیرد تعداد و نوع آرگومان های‬
‫آن درست باشد‪.‬‬

‫‪20‬‬
‫‪ -4-5‬کنترل نوع‬
‫منظور از کنترل نوع این است که هر عملیاتی که در برنامه انجام می گیرد تعداد و نوع آرگومان های‬
‫آن درست باشد‪.‬‬
‫دو روش برای کنترل نوع وجود دارد‪.‬‬
‫کنترل نوع پویا (‪ :)D.T.C‬کنترل نوع در زمان اجرا صورت می گیرد‪.‬‬
‫کنترل نوع ایستا (‪ :)S.T.C‬عمل کنترل نوع در زمان ترجمه (کامپایل) صورت می گیرد‪.‬‬

‫‪21‬‬
‫جهت‌استفاده‌از‌کنترل‌نوع‌ایستا‌به‌موارد‌زیر‌‌نیازمندیم‪:‬‬ ‫•‬
‫نوع‌متغیرها‌در‌زمان‌تعریف‌متغیرها‌باید‌مشخص‌‌شود‌و‌ثابت‌باشد‪.‬‬ ‫•‬
‫در‌زیربرنامه‌ها‌باید‌تعداد‪‌،‬نوع‌و‌ترتیب‌پارامترها‌و‌نوع‌مقدار‌بازگشتی‌از‌تابع‌نیز‌مشخص‌باشند‪.‬‬ ‫•‬
‫نوع‌ثابت‌ها‌باید‌مشخص‌باشند‪.‬‬ ‫•‬
‫• در‌حالت‌پویا‌به‌یک‌توصیف‌کننده(‪‌)Descriptor‬نیاز‌داریم‌که‌مشخص‌می‌کند‌که‌نوع‌‬
‫شیءداده‌چیست‌‬
‫مقایسه‌کنترل‌نوع‌ایستا‌و‌پویا‪:‬‬

‫• سرعت‌اجرا‌‬
‫• مصرف‌حافظه‌‬
‫• انعطاف‌پذیری‬
‫)‪if ($x>15‬‬
‫;‪$y=15‬‬
‫‪else‬‬
‫;"‪$y="ABC‬‬
‫• اشکال‌زدایی‬
‫• نوع‌قوی(‪‌:)Strong Type‬‬
‫• اگر‌یک‌زبان‌تمام‌کنترل‌نوع‌هایش‌را‌در‌زمان‌ترجمه‌انجام‌دهد‪‌،‬می‌گوییم‌از‌نظر‌نوع‌قوی‌است‌‬
‫که‌در‌این‌حالت‌سرعت‌اجرای‌کدهای‌این‌زبان‌باال‌بوده‌و‌میزان‌حافظه‌مصرفی‌برنامه کم‌‬
‫می‌باشد‪‌.‬‬
‫• نوع‌قوی(‪‌:)Strong Type‬‬
‫• اگر‌یک‌زبان‌تمام‌کنترل‌نوع‌هایش‌را‌در‌زمان‌ترجمه‌انجام‌دهد‪‌،‬می‌گوییم‌از‌نظر‌نوع‌قوی‌است‌‬
‫که‌در‌این‌حالت‌سرعت‌اجرای‌کدهای‌این‌زبان‌باال‌بوده‌و‌میزان‌حافظه‌مصرفی‌برنامه کم‌‬
‫می‌باشد‪‌.‬‬
‫• استنتاج‌نوع(‪:)Type Inference‬‬
‫• یک‌زبان‌دارای‌امکان‌استنتاج‌نوع‌می‌باشد‌چنانچه‌بتواند‌بر‌اساس‌متن‌برنامه‌نوع اشیاءداده‌ای‌را‌‬
‫مشخص‌کند(استنتاج‌کند)‪‌:‬‬
‫;‪• fun Area(length : int, width : int) : int = length * width‬‬
‫نوع‌قوی(‪‌:)Strong Type‬‬ ‫•‬
‫اگر‌یک‌زبان‌تمام‌کنترل‌نوع‌هایش‌را‌در‌زمان‌ترجمه‌انجام‌دهد‪‌،‬می‌گوییم‌از‌نظر‌نوع‌قوی‌است که‌در‌‬ ‫•‬
‫این‌حالت‌سرعت‌اجرای‌کدهای‌این‌زبان‌باال‌بوده‌و‌میزان‌حافظه‌مصرفی‌برنامه‌کم‌می‌باشد‪‌.‬‬
‫استنتاج‌نوع(‪:)Type Inference‬‬ ‫•‬
‫یک‌زبان‌دارای‌امکان‌استنتاج‌نوع‌می‌باشد‌چنانچه‌بتواند‌بر‌اساس‌متن‌برنامه‌نوع‌اشیاءداده‌ای‌را‌مشخص‌‬ ‫•‬
‫کند(استنتاج‌کند)‪‌:‬‬
‫;‪• fun Area(l : int, w : int) : int = l * w‬‬
‫در‌کد‌باال‌نوع‌پارامتر‌ها‌و‌خروجی‌تابع‌مشخص‌می‌باشد‪‌.‬معادل‌تابع‌باال‪‌،‬می‌توان‌توابع‌زیر‌را‌نیز‌نوشت‪:‬‬ ‫•‬
‫;‪• fun Area(l : int, w : int) = l * w‬‬
‫;‪• fun Area(l, int w) : int = l* w‬‬
‌)Type Conversion(‫تبدیل‌نوع‬
• type1 → type2
‫تبدیل‌نوع(‪‌)Type Conversion‬‬
‫‪• type1 → type2‬‬
‫• جهت‌این‌منظور‌برنامه‌نویس‌می‌تواند‌به‌صورت‌صریح‌توسط‌دستوراتی‌که‌در‌خود زبان‌وجود‌‬
‫دارد‪‌،‬تبدیل‌نوع‌انجام‌دهد‪‌،‬مانند‌تابع‌ ‪round‬که‌نوع‌اعشاری‌را‌به‌نوع‌صحیح‌تبدیل‌می‌کند‪‌.‬‬
‫تبدیل‌نوع(‪‌)Type Conversion‬‬
‫‪• type1 → type2‬‬
‫• جهت‌این‌منظور‌برنامه‌نویس‌می‌تواند‌به‌صورت‌صریح‌توسط‌دستوراتی‌که‌در‌خود زبان‌وجود‌‬
‫دارد‪‌،‬تبدیل‌نوع‌انجام‌دهد‪‌،‬مانند‌تابع‌ ‪round‬که‌نوع‌اعشاری‌را‌به‌نوع‌صحیح‌تبدیل‌می‌کند‪‌.‬‬

‫• تبدیل‌نوع‌ضمنی(‪:)Coercion‬‬
‫• در‌این‌روش‌عمل‌تبدیل‌نوع‌به‌صورت‌خودکار‌و‌بدون‌دخالت‌برنامه‌نویس‌انجام‌می‌شود‪‌.‬‬
‫;‪float z,y‬‬
‫;‪int x‬‬
‫;‪z = x + y‬‬
‫مقایسه‌انواع‌تبدیل‌نوع‬
‫• انعطاف‌پذیری‬
‫• اشکال‌زدایی‌‬

‫• در‌هر‌دو‌نوع‌ممکن‌است‌‌که‌داده‌یا‌اطالعات‌ما‌از‌بین‌برود‪.‬‬
‫انتساب)‪:(Assignment‬‬

‫• توسط‌انتساب‪‌،‬یک‌شیءداده‌ای‌را‌به‌یک‌مقدارداده‌ای‌مقید‌می‌کنیم‪‌.‬‬
‫• در‌برخی‌از‌زبان‌ها‌انتساب‌یک‌دستور‌است‌و‌در‌برخی‌دیگر‌از‌زبان‌ها‌انتساب‌یک‌عمل‌است‪‌.‬‬
‫انتساب)‪:(Assignment‬‬

‫• توسط‌انتساب‪‌،‬یک‌شیءداده‌ای‌را‌به‌یک‌مقدارداده‌ای‌مقید‌می‌کنیم‪‌.‬‬
‫• در‌برخی‌از‌زبان‌ها‌انتساب‌یک‌دستور‌است‌و‌در‌برخی‌دیگر‌از‌زبان‌ها‌انتساب‌یک‌عمل‌است‪‌.‬‬
‫;‪x:=y‬‬ ‫• در‌زبان‌پاسکال‌دستور‌‬
‫• با‌امضای‌‬
‫‪• integer1*integer2→void‬‬
‫• مقدار‌‪ integer2‬را‌به‌‪ integer1‬انتساب‌می‌دهد‌و‌خروجی‌ندارد‪.‬‬
‫انتساب)‪:(Assignment‬‬

‫توسط‌انتساب‪‌،‬یک‌شیءداده‌ای‌را‌به‌یک‌مقدارداده‌ای‌مقید‌می‌کنیم‪‌.‬‬ ‫•‬
‫در‌برخی‌از‌زبان‌ها‌انتساب‌یک‌دستور‌است‌و‌در‌برخی‌دیگر‌از‌زبان‌ها‌انتساب‌یک‌عمل‌است‪‌.‬‬ ‫•‬
‫;‪x:=y‬‬ ‫در‌زبان‌پاسکال‌دستور‌‬ ‫•‬
‫با‌امضای‌‬ ‫•‬
‫‪• integer1*integer2→void‬‬
‫مقدار‌‪ integer2‬را‌به‌‪ integer1‬انتساب‌می‌دهد‌و‌خروجی‌ندارد‬ ‫•‬
‫;‪x=y‬‬ ‫در‌زبان‌های‌خانواده‌‪ C‬عمل‌‌‌‌‌‌‌‌‬ ‫•‬
‫‪integer1*integer2→integer3‬‬ ‫با‌امضای‬ ‫•‬
‫مقدار‌‪ integer2‬را‌در‌‪ integer1‬قرار‌می‌دهد‌و‌‪ integer3‬را‌با‌توجه‌به‌مقدار‌‪ integer1‬به‌عنوان‌‬ ‫•‬
‫نتیجه‌بر‌می‌گرداند‬
‫دستور انتساب روبرو را در نظر بگیرید‪:‬‬
‫‪X:=Y‬‬
‫‪‌ : Y‬به مقدار موجود در شی داده ای که دارای نام ‪ Y‬است مراجعه می کند‬
‫این ارجاع را مقدار راست شی داده (‪)Right Value‬گویند‪.‬‬
‫‪ : X‬به محلی از شی داده مراجعه می کند که حاوی مقدار جدید خواهد بود‬
‫این ارجاع را مقدار چپ شی داده (‪)Left Value‬گویند‪.‬‬

‫‪Y=++X‬‬

‫‪Y=X++‬‬

‫‪35‬‬
‫مفهوم‌انتساب‬
‫مقدار دهی اولیه •‬
‫شی‌داده‌فاقد‌مقدار‌اولیه‌شی‌داده‌ای‌است‌که‌ایجاد‌شده‌است‌ولی‌هنوز‌‬
‫مقداری‌به‌آن‌داده‌نشده‌است‪‌.‬‬

‫;‪int x,y‬‬
‫;‪y=2*x‬‬

‫‪37‬‬

You might also like