تالار گفتمان مانشت

نسخه‌ی کامل: تشخیص خطاهای وابسته به متن در برنامه
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
خطاهای وابسته به متن زیر توسط چه قسمتی و در چه زمانی تشخیص داده میشود؟
1. خارج از محدوده بودن اندیس آرایه
2.دسترسی به آرایه دو بعدی با 3 اندیس
3.اعلان دوباره یک شناسه: مثلا int x رو داریم و دوباره Char x رو تعریف کنیم.
4.دسترسی به یک شناسه خارج از بلوک آن
اولی رو سیستم عامل نمیتونه تشخیص بده و توسط کدهایی که توسط خود کامپایلر تولید میشه کشف میشه ولی زمانش رو نمیدونم موقع اجرا هست یا کامپایل.
2و3و4هم به نظر میرسه باید توسط تحلیلگر معنایی در زمان کامپایل باشه.
نظر شما چیه؟
(28 دى 1389 12:26 ق.ظ)sepid نوشته شده توسط: [ -> ]خطاهای وابسته به متن زیر توسط چه قسمتی و در چه زمانی تشخیص داده میشود؟
1. خارج از محدوده بودن اندیس آرایه
2.دسترسی به آرایه دو بعدی با 3 اندیس
3.اعلان دوباره یک شناسه: مثلا int x رو داریم و دوباره Char x رو تعریف کنیم.
4.دسترسی به یک شناسه خارج از بلوک آن
اولی رو سیستم عامل نمیتونه تشخیص بده و توسط کدهایی که توسط خود کامپایلر تولید میشه کشف میشه ولی زمانش رو نمیدونم موقع اجرا هست یا کامپایل.
2و3و4هم به نظر میرسه باید توسط تحلیلگر معنایی در زمان کامپایل باشه.
نظر شما چیه؟

اولی هم توسط تحلیلگر معنایی تشخیص داده می شه و قطعا در زمان اجرا. چون زمان ترجمه که مشخص نیست محدوده ارایه و اندیس‌ها چی هست و کل کنترل‌ها در زمان اجرا انجام می شه.
در مورد 2 و 3و 4 باهات موافقم گمونم حق با تو باشه... اما مطمئن نیستمConfused
به نظر من قسمت چهار سوال زمان اجرا کشف میشه
به این دلیل که به مدیریت حافظه میتونه ربط داشته باشه
خودتون قضاوت کنید !
البته اطلاعات دامنه متغییر‌ها در جدول نماد‌ها ذخیره میشه و میتونه زمان کامپایل هم کشف بشه
بچه‌ها یک سوال مرتبط با موضوع:
[تصویر:  attachment.php?aid=302]
چرا برای این سوال که برای سال 82 هست ننوشته در زمان اجرا توسط تجزیه کننده مفهومی و نوشته توسط خود برنامه حاوی دستورات فوق.
چه فرقی بینشون هست؟
همه موارد 1و3 و4 جزو Semantic analysis هستند.

مورد 1 تنها در زمان اجرا قابل کشف هست. دلیلش هم واضح هست flow برنامه مشخص می کنه که کی index چه مقداری می گیره. و میشه گفت توسط کد هایی که کامپایلر در لابه لای کد مقصد قرار میده کشف میشه.
مورد 4و2و3 در مان کامپایل قابل کشف هست.

در مورد سوال سال 82‌:

گزینه 4 درست هست( به نظر من!). فرق بین گزینه 3 و4 اینه که گزینه 3 میگه در زمان کامپایل خطا تشخیص داده میشه که این درست نیست. وقتی کامپایلر به چنین مواردی بر می خوره که اطلاع کافی برای بررسی نداشته باشه کد هایی برای بررسی در زمان اجرا تولید می کنه که این کدها در زمان اجرا بررسی می کنن که خطایی رخ نداده باشه.
(30 دى 1389 01:24 ق.ظ)_Milad_ نوشته شده توسط: [ -> ]همه موارد 1و3 و4 جزو Semantic analysis هستند.

مورد 1 تنها در زمان اجرا قابل کشف هست. دلیلش هم واضح هست flow برنامه مشخص می کنه که کی index چه مقداری می گیره. و میشه گفت توسط کد هایی که کامپایلر در لابه لای کد مقصد قرار میده کشف میشه.
مورد 4و2و3 در مان کامپایل قابل کشف هست.

در مورد سوال سال 82‌:

گزینه 4 درست هست( به نظر من!). فرق بین گزینه 3 و4 اینه که گزینه 3 میگه در زمان کامپایل خطا تشخیص داده میشه که این درست نیست. وقتی کامپایلر به چنین مواردی بر می خوره که اطلاع کافی برای بررسی نداشته باشه کد هایی برای بررسی در زمان اجرا تولید می کنه که این کدها در زمان اجرا بررسی می کنن که خطایی رخ نداده باشه.

درسته.
در واقع سوال من اینجاست که وقتی گفته میشه کامپایلر کد میزاره، منظور از کامپایلر کدوم قسمتش هست؟
خوب کامپایلراز قسمتهایی مختلفی تشکیل شده که ما همه رو میشناسیم.
آیا تحلیلگر معنایی این کار رو انجام میده؟
کامپایلر در واقع کدهایی شبیه try و catch داخل کد شما می‍گذاره. البته این کار هزینه سربار زیادی داره و برخی اوقات کامپایلرها بیخیالش می‍شن (مثل کامپایلرهای ++c)

در پاسخ دادن به این سوالات زمان bind رو در نظر داشته باشید. اعمالی که زمان bind اونها در زمان اجرای برنامه است رو تحلیلگر معنایی کاریش نمی‍تونه بکنه.
خطای خارج از محدوده بودن اندیس آرایه هم در زمان اجرا و هم در زمان کامپایل قابل شناسایی است
اگر مثلاً [11] a در برنامه داشته باشیم و کل آرایه 10 عنصر داشته باشد این در زمان کامپایل شناسایی میشود
ولی اگر مثلاً i=11 باشد و داشته باشیم a[i ] آنگاه این خطا در زمان اجرا کشف میشود.
در مورد تست هم گزینه 4 درست است
لینک مرجع