فرآیند کامپایل و لینک
اموزش c++ فرآیند کامپایل و لینک ، دیاگرام شکل ۱۴-۳ نمایشی از فرآیند کامپایل و لینک است که نتیجه آن یک برنامه اجرایی GradeBook بوده که می تواند توسط استاد بکار گرفته شود. غالباً واسط کلاس و ساختار پیادهسازی توسط یک برنامهنویس ایجاد و کامپایل می شود و توسط برنامهنویس دیگری که کد سرویسگیرنده کلاس را پیادهسازی کرده است، بکار گرفته می شود. بنابر این دیاگرام نشاندهنده نیازهای هر دو طرف برانهنویس کلاس و برنامهنویس کد سرویسگیرنده است. خطوط خطچین در دیاگرام نشاندهنده قسمتهای مورد نیاز برنامهنویس کلاس، برنامهنویس کد سرویسگیرنده و کاربر برنامه GradeBook هستند. [نکته: شکل ۱۴-۳ یک دیاگرام UML نیست.
فرآیند کامپایل و لینک
برنامهنویس کلاس مسئول ایجاد یک کلاس GradeBook با قابلیت استفاده مجدد در ایجاد فایل سرآیند GradeBook.h و فایل کد منبع GradeBook.cpp است که فایل سرآیند را وارد برنامه کرده (#include)، سپس فایل کد منبع را برای ایجاد کد شی GradeBook کامپایل می کند. برای پنهان ساختن جزئیات پیادهسازی توابع عضو GradeBook، برنامهنویس کلاس مبادرت به تدارک دیدن فایل سرآیند GradeBook.h برای برنامهنویس کد سرویسگیرنده و کد شی برای کلاس GradeBook می کند که حاوی دستورالعملهای زبان ماشین است که نشاندهنده توابع عضو می باشد. برنامهنویس کد سرویسگیرنده، فایل کد منبع را بطور آشکار بدست نمی آورد، از اینرو سرویسگیرنده از نحوه پیادهسازی توابع عضو GradeBook بی اطلاع باقی خواهد ماند.
شکل ۱۴-۳ | فرآیند کامپایل و لینک که یک برنامه اجرایی تولید میکند.
کد سرویسگیرنده فقط نیاز به شناخت واسط GradeBook به منظور نحوه استفاده از کلاس داشته و بایستی قادر به لینک آن به کد شی خود باشد. از آنجا که واسط کلاس بخشی از تعریف کلاس در فایل سرآیند GradeBook.h است، باید برنامهنویس کد سرویسگیرنده به این فایل دسترسی داشته و آن را در فایل کد منبع سرویسگیرنده وارد سازد (#include). زمانیکه کد سرویسگیرنده کامپایل می شود، کامپایلر از تعریف کلاس در GradeBook.h برای اطمینان از اینکه تابع main مبادرت به ایجاد و دستکاری صحیح شی های کلاس GradeBook می کند، استفاده می نماید. برای ایجاد برنامه اجرایی GradeBook قابل استفاده برای استاد (مربی)، آخرین مرحله لینک بصورت زیر است
۱- کد شی برای تابع main (یعنی، کد سرویسگیرنده)
۲- کد شی برای کلاس پیادهسازی کننده تابع عضو کلاس GradeBook
۳- کد شی کتابخانه استاندارد C++ برای کلاسهای C++ (همانند string) بکار رفته توسط برنامهنویس پیادهسازی کننده کلاس و برنامهنویس کد سرویسگیرنده.
خروجی لینکر، برنامه اجرایی GradeBook است که استاد می تواند با استفاده از آن نمرات دانشجویان را مدیریت نماید. برای کسب اطلاعات بیشتر در ارتباط با کامپایل برنامههای با چند فایل منبع، به مستندات کامپایلر خود مراجعه کنید.
۱۰-۳ اعتبارسنجی داده با توابع set
در بخش ۶-۳ به معرفی توابع set پرداختیم که به سرویسگیرندههای کلاس اجازه تغییر در مقدار یک عضو داده private را می دادند. در برنامه شکل ۵-۳، کلاس GradeBook مبادرت به تعریف تابع عضو setCourseName کرده که فقط مقدار دریافتی از پارامتر name خود را به عضو داده courseName تخصیص می دهد. این عضو داده مطمئن نیست که نام دوره دریافتی مطابق با یک فرمت مشخص یا معتبر است.
همانطوری که در ابتدا بحث مطرح کردیم، فرض می کنیم که دانشگاه می تواند از برگه ثبتنام دانشجو که در آن اسامی دوره فقط ۲۵ کاراکتر یا کمتر طول دارند، چاپ بگیرد. اگر دانشگاه از سیستمی استفاده نماید که حاوی شی های GradeBook برای تولید رونوشت ثبتنامی است، باید کاری کنیم که کلاس GradeBook مطمئن شود که عضو داده courseName هرگز بیش از ۲۵ کاراکتر نخواهد داشت. برنامه شکلهای ۱۵-۳ الی ۱۷-۳ سبب افزایش قابلیت تابع عضو setCourseName برای انجام فرآیند اعتبارسنجی می شوند.
تعریف کلاس GradeBook
توجه کنید که تعریف کلاس GradeBook در شکل ۱۵-۳ و واسط آن، یکسان با شکل ۱۱-۳ است. از آنجا که واسط بدون تغییر باقی مانده، سرویسگیرندههای این کلاس به هنگام تغییر در تعریف تابع setCourseName، نیازی به اصلاح نخواهند داشت. این ویژگی سبب می شود که سرویسگیرندهها از مزیت کلاس ارتقاء یافته GradeBook به آسانی و با لینک کد سرویسگیرنده به کد شی GradeBook ارتقاء یافته، برخوردار شوند.
اعتبارسنجی نام دوره با تابع عضو setCourseName
ارتقاء و بهبود کلاس GradeBook در تعریف تابع عضو setCourseName صورت می گیرد (شکل ۱۶-۳، خطوط ۱۸-۳۱). عبارت if در خطوط ۲۰-۲۱ تعیین می کند که آیا پارامتر name حاوی نام یک دوره معتبر (رشتهای به طول ۲۵ کاراکتر یا کمتر) است یا خیر.
اگر نام دوره معتبر باشد، خط ۲۱ مبادرت به ذخیره نام دوره در عضو داده courseName می کند. به عبارت name.length() در خط ۲۰ توجه کنید. این عبارت فراخوانی یک تابع عضو همانند myGradeBook.displayMessage() است. کلاس string متعلق به کتابخانه استاندارد C++ دارای تابع عضوی بنام length است که تعداد کاراکترهای موجود در یک شیstring را برگشت می دهد. پارامتر name یک شی از نوع رشته (string) است و از اینرو فراخوانی name.length() تعداد کاراکترهای موجود در name را برگشت می دهد. اگر این مقدار کمتر یا برابر ۲۵ باشد، نام دریافتی معتبر بوده و خط ۲۱ اجرا می شود.
شکل ۱۵-۳ | تعریف کلاس GradeBook.
شکل ۱۶-۳ | تعریف تابع عضو برای کلاس GradeBook با تابع set که مبادرت به اعتبارسنجی طول عضو داده courseName می کند.
عبارت if در خطوط ۲۳-۳۰ به حالتی رسیدگی می کند که setCourseName نام یک دوره نامعتبر دریافت کرده است (نامی که بیش از ۲۵ کاراکتر طول دارد). حتی اگر پارامتر name بسیار طولانی باشد، می خواهیم که شی GradeBook را در یک وضعیت پایدار حفظ کنیم. وضعیتی که در آن عضو داده courseName حاوی یک مقدار معتبر باشد (رشتهای بطول ۲۵ کاراکتر یا کمتر). از اینرو، مبادرت به کوتاه کردن نام دوره و تخصیص ۲۵ کاراکتر اول name به عضو داده courseName می کنیم (البته این روش کوتاهسازی نام دوره چندان جالب نیست). کلاس استاندارد string دارای تابع عضوی بنام substrsubstring“) است که یک شی جدید string با کپی کردن بخشی از شی string موجود، تهیه می کند. با فراخوانی خط ۲۶، عبارت name.substr(0,25) دو عدد صحیح (۰, ۲۵) به تابع عضو substr شی name ارسال می شوند. این آرگومانها نشاندهنده بخشی از رشته name هستند که substr آن را برگشت خواهد داد. آرگومان اول نشاندهنده موقعیت شروع در رشته اصلی است که کاراکترها از آن موقعیت شروع به کپی شدن خواهند کرد، توجه کنید که موقعیت اولین کاراکتر در هر رشتهای با صفر شروع می شود. آرگومان دوم نشاندهنده تعداد کاراکترهایی است که باید کپی شوند. بنابر این با فراخوانی خط ۲۶، بیست و پنج کاراکتر از رشته name از موقعیت صفر برگشت داده خواهد شد. برای مثال اگر نام موجود نگهداری شده “CS101 Introduction to Programming in C++” باشد، تابع substr رشته “CS101 Introduction to Pro” را برگشت خواهد داد. پس از فراخوانی substr، خط ۲۶ زیر رشته برگشتی توسط substr را به عضو داده courseName تخصیص می دهد. در این حالت، تابع عضو setCourseName مطمئن خواهد بود که courseName همیشه یک رشته بطول ۲۵ کاراکتر یا کمتر خواهد داشت. اگر تابع عضو مجبور به کوتاه کردن نام دوره برای تبدیل آن به یک مقدار معتبر شود، خطوط ۲۸-۲۹ یک پیغام هشدار به نمایش در می آورند. (کوتاه شده جمله ”
توجه کنید عبارت if در خطوط ۲۳-۳۰ حاوی دو عبارت در بدنه خود است، یکی برای تنظیم courseName با ۲۵ کاراکتر اول از پارامتر name و یکی برای چاپ پیغام اطلاع دهنده به کاربر. مایل بودیم تا هر دو این عبارات در زمانیکه طول name طولانی تر از حد مجاز باشند اجرا گردند، بنابر این هر دو آنها را در درون یک جفت براکت، {} قرار دادهایم. از فصل دوم بخاطر دارید که این براکتها بلوک ایجاد می کنند. در فصل چهارم اطلاعات بیشتری در زمینه قرار دادن عبارات مضاعف در بدنه یک عبارت کنترلی بدست خواهید آورد.
دقت کنید که عبارت cout در خطوط ۲۸-۲۹ بدون عملگر درج در ابتدای خط دوم ظاهر شده است:
cout<<“Name\””<<name<<“\”exceeds maximum length(25).\n”
“Limiting courseName to first 25 characters.\n”<<endl;
کامپایلر C++ مبادرت به ترکیب رشتههای لیترال مجاور هم می کند، حتی اگر این رشتهها بر روی خطوط مجزا شده از هم در برنامه قرار داشته باشند. بنابر این در عبارت فوق، کامپایلر C++ شروع به ترکیب رشتههای لیترال “\”exceeds maximum length(25).\n” و “Limiting courseName to first 25 characters.\n” در یک رشته لیترال واحد در خروجی همانند خطوط ۲۸-۲۹ برنامه شکل ۱۶-۳ می کند. چنین رفتاری امکان می دهد تا رشتههای طولانی را در چندین خط قرار دهید بدون اینکه مجبور به استفاده از چندین عملگر درج باشید.
شکل ۱۷-۳ | ایجاد و دستکاری شی GradeBook که در آن نام دوره محدود به ۲۵ کاراکتر است.
تست کلاس GradeBook
برنامه شکل ۱۷-۳ به توصیف نسخه اصلاح شده کلاس GradeBook (برنامههای ۱۵-۳ و ۱۶-۳) در زمینه اعتبارسنجی است. در خط ۱۴ یک شی GradeBook بنام gradeBook1 ایجاد شده است. بخاطر دارید که سازنده GradeBook تابع عضو setCourseName را برای مقداردهی اولیه عضو داده courseName فراخوانی می کرد. در نسخههای قبلی این کلاس، مزیت فراخوانی setCourseNamesetCourseName برخوردار می شود. سازنده بجای اینکه کد اعتبارسنجی خود را تکثیر یا تکرار کند، فقط مبادرت به فراخوانی ساده setCourseName می کند. زمانیکه خط ۱۴ از برنامه شکل ۷-۳ نام اولیه دوره “CS101 Introduction to Programming in C++” را به سازنده GradeBook ارسال می کند، سازنده این مقدار را به setCourseName انتقال می دهد، جائیکه مقداردهی اولیه واقعی در آنجا اتفاق می افتد. به دلیل اینکه نام دوره حاوی بیش از ۲۵ کاراکتر است، بدنه دومین عبارت if اجرا می شود، و در نتیجه courseName با ۲۵ کاراکتر اول نام دوره یعنی”CS101 Introduction to Pro” مقداردهی می گردد. توجه کنید که خروجی در شکل ۱۷-۳ حاوی پیغام هشدار ایجاد شده توسط خطوط ۲۸-۲۹ از شکل ۱۶-۳ در تابع عضو setCourseName است. خط ۱۵ یک شی دیگر از GradeBook بنام gradeBook2 ایجاد می کند. نام یک دوره معتبر که دقیقا برابر ۲۵ کاراکتر است به سازنده ارسال شده است. توسط سازنده مورد بررسی قرار نگرفت، که در اینجا به بررسی آن می پردازیم. سازنده از مزیت اعتبارسنجی تدارک دیده شده توسط
خطوط ۱۸-۲۱ از شکل ۱۷-۳ نام دوره کوتاه شده برای gradeBook1 و نام دوره برای gradeBook2 را به نمایش در می آورند. خط ۲۴ مستقیماً تابع عضو setCourseName شی gradeBook1 را فراخوانی می کند تا نام دوره در شی GradeBook را به یک نام کوتاهتر تغییر دهد تا دیگر نیازی به کوتاهسازی آن نباشد سپس خطوط ۲۷-۳۰ اسامی دوره را مجدداً به نمایش در می آورند.
هیچ دیدگاهی نوشته نشده است.