PDA

View Full Version : تفاوت اجرای فایل های کامپایلری و مفسری



lukaskain
چهارشنبه 25 اردیبهشت 1392, 10:52 صبح
با سلام خدمت همه دوستان و اساتید،
سوال بنده در خصوص نوع اجرای برنامه های مفسری (interpreter) و کامپایلری (Compiler) است، بنده مراحل تولید یک فایل کامپایلری را از کد اصلی (Source Code) تا فایل اجرایی (executable) را می دانم.
سوال من در خصوص نحوه اجرای فایل های مفسری و کامپایلری است.
آیا فایل های کامپایل شده در هنگام اجرا تمام کد های ماشین خود را برای پردازش (Process) به طور کامل در حافظه (RAM) بارگذاری می نمایند؟
آیا مفسر زمان تفسیر، خط به خط کد ها را به زبان ماشین تبدیل می کند و روی حافظه بارگذاری می نماید؟
این سوال زمانی برایم پیش آمد که به تست زیر بر خوردم:
.کدام گزینه یک مزیت زبانهای کامپایلیری نسبت به زبان های مفسری نیست؟
1)سرعت اجرای برنامه
2)امنیت کد
3)حجم کمتر
4)ساخت یافتگی
لطفاً مراحل اجرای دو برنامه کامپایلری و مفسری را توضیح دهید. (مراحل اجرا و بارگذاری روی حافظه)
آیا امنیت کدهای فایل های مفسری صرفاً در هنگام اجرا و بارگذاری روی حافظه بیشتر از فایل های کامپایلری است؟ (امنیت فایل کامپایلری مشخصاً بیشتر است اما در خصوص کد چطور؟)

lukaskain
پنج شنبه 26 اردیبهشت 1392, 09:53 صبح
مدیران محترم بخش لطفاً راهنمایی بفرمایید!

UfnCod3r
پنج شنبه 26 اردیبهشت 1392, 13:52 عصر
فایل های اجرایی exe. شامل کد های ماشین مختص سیستم عامل مورد نظر هستن + هرنوع منابعی مثل تصویر متن و .. هم میشه تو فایل اگزه گذاشت .
کدهای ماشینی ک تو فایل هست وارد رم می شه و بعد برنامه اجرا می شود ولی منابع ن . منابع رو خود برنامه نویس با کدی ک می نویسه لود می کنه .
توی زبان های مفسری و امثالش ما خروجیمون فایل اجرایی نیست ک سیستم عامل مستقیما اجرا کنه واسه همینه ک برنامه های دات نتی کند تر اجرا میشن .
ب عنوان مثال در جاوا ما فایل .jar داریم که ی فایل فشرده شده مثل زیپ هست و داخلش منابع هستن + بایت کد ها(کد هایی ک مفسر می گیره )
ک توسط ماشین مجازی خوانده میشه و بعد بایت کد ها تبدیل ب کد ماشین می شه و میره تو رم و بعد هم برنامه اجرا می شه
دردات نت هم دقیقا همین طوره اما این وسط مایکروسافت زرنگی کرده و پسوند خاصی برا بایت کد ها یا همون کد IL که دات نت تولید می کنه نذاشته .:عصبانی++:
شما برنامه یا دی ال ال دات نتی ک می نویسی خروجی exe,dll هست در صورتی ک با exeوdll هایی ک توسط زبان های بومی تولید شدن فرق داره .
درواقع فایل اگزه تولید شده محتوی یک سری کد IL هست . ینی فقط ب عنوان منابع داخل فایل گذاشته شده ن اینکه کد ماشین باشه.
فایل .exe رو ک اجرا می کنید اون محتویات رو ب دات نت می فرسته و دات نت اونا رو تجزیه می کنه و بعد برنامه اجرا میشه و ...

این سوال 4 گزینه ای رو از کجا اورادی؟ این کتاب های فارسی کلا مشکل دارن .

زبان های کامپایلری مزیت اصلیشون سرعت ، امنیت ، هست + اینکه خود این زبان ها چیزایی دارن ک هیچ زبانی نداره
بعضی وقتا حجمشون کمتر میشه بعضی وقتا بیشتر .
برنامه های دات نتی چون کتاب خونه و .. ای بهشون پیوست نمیشه معمولا هجمشون کمه . البته خب همه چی پیش دات نته ک خودش نزدیک 500 مگه :قهقهه:
ساخت یافتگی هم من نمی فهمم اصلا چ ربطی ب سوال داره

مثل این جوکه می مونه
ب طرف می گن فرق کچل با هواپیما چیه می گه : کچل ک فرق نداره هواپیما هم نکته انحرافی بود :قهقهه:

lukaskain
پنج شنبه 26 اردیبهشت 1392, 14:57 عصر
دوست عزیز با سلام
از پاسخ شما بی نهایت سپاسگزارم
تست ارشد پارسه هست!
پاسخش هم امنیت کد هست!
فرمایش شما کاملاً درست است، فایل های کامپایل شده از امنیت بالتری برخوردار هستند، اما سوال بنده در خصوص کد های زمان اجرا هست.
همانطور که می دانید هر تدبیر امنیتی نظیر انکریپت به کار بگیرید نهایتاً حافظه مرجع تمام کد های ماشین اجرایی است، اما سوال من این هست که آیا کد های ماشین کامپایل در هنگام اجرا تماماً به روی حافظه می رود؟
در زبان های مفسری خط به خط به روی حافظه می روند؟ و یکجا و تماماً به روی رم نمی روند؟
در نتیجه حافظه که نا امن ترین محل برای کدهای ماشین هست برای کد های زبان های مفسری امن تر و پایدار تر هست.
در واقع اگر پاسخ سوالاتم مثبت باشه برنام های اجرایی کامپایلری در روی حافظه به راحتی مموری ایمیج می شوند و بعد از این شما تمام کدهای اصلی برنامه را یکجا در اختیار دارید، اگر مفسری ها خط به خط بروند در واقع تمام کد ها روی حافظه یکجا قایل دامپ نیست.
درسته؟؟؟؟
از نظر لطف و توجه عزیزان سپاسگزارم

Beginner2013
پنج شنبه 26 اردیبهشت 1392, 15:02 عصر
سلام.
اگر چه زبان Java و زبان های دات نتی به کد محلی کامپایل نمیشن ولی به هرحال کامپایل میشن(بخصوص در مورد اسمبلی های دات نت که در دفعات دوم و به بعد کدهای محلی آنها اجرا میشه)پس شاید بهتر باشه اونها رو با زبان های تفسیر شده مثل JavaScript یا PHP قاطی نکنیم.
در رابطه با گزینه هایی که بیان کردید،در سرعت اجرا در اغلب موارد و نه همیشه برتری مسلما با برنامه های نوشته شده با زبان های Compiled خواهد بود.در رابطه با حجم برنامه هم اگر تعدادی فایل کد متنی + مفسر آنها رو مقایسه کرد با یه فایل اجرایی استند الون باز نمیشه گفت همیشه حجم یکی بیش تر هست و فکر نمی کنم حجم (فضای مصرفی دیسک) چیز زیاد مهمی باشه.در رابطه با امنیت بسته به امنیت مفسر و در طرف مقابل کامپایلر و نحوه مهارت برنامه نویس باز قضیه نسبی هست و نمیشه به این راحتی ها نظر داد.
البته خوب چیزی که معلوم هست فایل کد متنی که انکد نشده باشه خوب معلوم هست امنیتش.
بحث دیگری که می ماند کراس پلت فورم بودن هست که در این یک مورد برد با زبان های مفسری
،میان ماشین (همانند X-ByteCode یا IL) خواهد بود.چرا که هنوز فرصت دارند انتخاب شوند که به چه چیزی ترجمه بشن،

lukaskain
پنج شنبه 26 اردیبهشت 1392, 18:06 عصر
مطالبی که شما فرمودید درست هست، اما باز هم به مورد سوال من اشاره نشد یا حداقل کم تر پرداخته شد،
شیوه اجرای فایل های کامپایلری و ارتباط آن با حافظه و شیوه اجرای فایل های مفسری و ارتباط آن با حافظه.
همانطور که عرض کردم هر تدبیر امنیتی روی فایل فقط برای فایل حائز اهمین است، برای پراسس به هر حال روی رم با زبان ماشین بارگذاری می شود.
فقط می ماند تفاوت در بارگذاری ها! بین کامپایلری ها و مفسری ها
اگر نیاز به توضیح هست بفرمایید تا با مثال عرض نمایم

lukaskain
جمعه 27 اردیبهشت 1392, 12:04 عصر
دوستان اگر مرجعه هم در این خصوص معرفی بفرمایند ممنون می شوم.