رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
ابهام در سی و سی ++
#1
۱-وقتی برنامه های سی کامپایل میشوند مستقیما به زبان ماشین تبدیل می شوند؟ و همین طور برنامه هایی که با سی++ نوشته شدند؟ درسته؟
 خب در این صورت برنامه ای که با gcc روی یک سیستم کامپایل شده نباید روی یکی دیگه با سخت افزار متفاوت اجرا شود .
۲- اگر جواب سوال اول منفی باشد پس باید برنامه ای که در محیط گنو لینوکس کامپایل شده روی ویندوز هم اجرا شود. ولی نمیشه چرا ؟  

۳- برنامه های جاوا که با کامپایلر جاوای گنو کامپایل میشوند چطور؟ اصلا منظور از native چیست؟ یعنی به چی تبدیل میشوند؟
 وبلاگ من => jgeek.ir

System.out.PrintLn("Say to Prof.James Gosling Java Never Dies ! I HATE Microsoft and its Technologies ! ");
پاسخ
تشکر شده توسط:
#2
1- بله برنامه ها به زبان ماشین تبدیل میشن که بهش میگن کد Native. برنامه ای که روی یک سیستم کامپایل شده روی سیستمی با سخت افزار متفاوت اجرا نمیشه ولی این تفاوت فقط محدود به معماری پردازنده است و فرضاً ربطی به نوع و میزان RAM نداره. مواردی مثل 32 بیتی یا 64 بیتی بودن پردازنده، نوع (Intel یا AMD) یا حتی خانواده (Pentium 2 یا Core i7 و...) اهمیت دارن.

2- چون جواب سؤال اول مثبته.

3- این برنامه ها به یک کد IL (مخفف Intermediate Language) تبدیل میشن و روی هر سیستم یه JVM نصبه (Java Virtual Machine) که کد IL رو در هربار اجرا به کد Native همون ماشین تبدیل میکنه و در این تبدیل، همون مواردی که توی شماره 1 گفتم اهمیت دارن. البته اینقدر سرعت این تبدیل بالاست که در اکثر مواقع اصلاً به چشم نمیاد و احساس نمیکنید کامپایل مجددی هم این وسط داره اتفاق میفته. البته توی سیستمهای Realtime (مثل سیستم ناوبری هواپیما یا هدایت موشک شاتل) که اختلاف چند ده هزارم ثانیه هم اهمیت پیدا میکنه، از همون ++C یا حتی اسمبلی استفاده میشه.
پاسخ
تشکر شده توسط: __undercover , YN97
#3
(21-06-1394، 12:55 ق.ظ)YN97 نوشته: ۱-وقتی برنامه های سی کامپایل میشوند مستقیما به زبان ماشین تبدیل می شوند؟ و همین طور برنامه هایی که با سی++ نوشته شدند؟ درسته؟
آره ولی این برنامه ها اکثرا بر کتابخانه ها و سرویسهای ارائه شده سیستم عامل هم متکی هستن اینطور نیست همه کار رو خودشون به تنهایی انجام بدن.

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

نقل قول:اگر جواب سوال اول منفی باشد پس باید برنامه ای که در محیط گنو لینوکس کامپایل شده روی ویندوز هم اجرا شود. ولی نمیشه چرا ؟  
خب توی فایل اجرایی برنامه ها فقط یکسری کد ماشین پردازندهء مورد نظر نیست بلکه یکسری ساختمان داده ها و اطلاعات دیگر هم معمولا هست که توسط سیستم عامل برای اجرای صحیح و مدیریت اون برنامه استفاده میشه. فرمت فایلهای اجرایی و نوع و شکل اطلاعات موجود در اونا و مثلا حتی روش فراخوانی توابع در سطح پایین و استفاده از کتابخانه های دینامیک از سیستم عامل به سیستم عامل تفاوت میکنه. ضمنا مسئلهء متکی بودن برنامه ها بر کتابخانه ها و سرویسهای سیستم عامل رو هم قبلا گفتم. مثلا وقتی برنامه داره از کتابخانهء سی لینوکس استفاده میکنه، درسته ویندوز هم کتابخانهء سی داره ولی یکسری جزییات و فرمت های اینا با هم متفاوت هست و همچنین نامگذاری ها، تعداد و نوع و شکل و ترتیب پارامترها و غیره (حالا اگر فقط از امکانات کتابخانه های استاندارد یک زبان استفاده کرده باشید امکان سازگاری بیشتره). کتابخانه های گرافیک و شتاب دهنده و سرویسهای سیستم عامل مثل سیستم فایل و غیره و غیره. شما حساب کن اینقدر تفاوت هست و اتکا بر ویژگیهای هر سیستم عامل، بنابراین نمیشه انتظار داشت یه برنامهء لینوکس همینطور و به این راحتی روی ویندوز هم بشه بدون شبیه سازی چیزی اجرا کرد. ولی ساده ترین برنامه ها رو که درشون از کتابخانه ها و سرویسهای و ساختار سیستم عامل خاصی استفاده نشه شاید بشه با کمی تغییرات و تنظیم و آماده سازی یا تبدیل به فرمت فایل اجرایی سیستم عامل مقصد، اجرا کرد.

نقل قول:برنامه های جاوا که با کامپایلر جاوای گنو کامپایل میشوند چطور؟ اصلا منظور از native چیست؟ یعنی به چی تبدیل میشوند؟
در این مورد اطلاعات در منابع زیاد هست مهندس شهرکی هم توضیح دادن.
البته با توجه به اینکه من به وراجی علاقه دارم بازم توضیح میدم  Big Grin
خب توی یه فایل اجرایی Native کدهایی که هست دستوراتی هست که پردازنده مستقیما میفهمه. حالا بحث اطلاعات جانبی مورد استفاده سیستم عامل و کتابخانه ها و سرویس های سیستم عامل و اینها به کنار. اونا جزییات و پیچیدگی های خاص خودش رو داره. مثلا ممکنه سیستم عامل قبل از اینکه برنامه بتونه اجرا بشه بیاد و یکسری محتویات اون رو تغییراتی بده کدهایی رو اضافه کنه جایگزین کنه و غیره، که برنامه برای اجرا روی CPU تحت اون سیستم عامل آماده بشه.
برنامه های جاوا و امثالهم هم که حاوی کدهای یک زبان میانی یا ماشین مجازی هستن یا در زمان اجرا به کدهای ماشین مبداء تبدیل میشن یا مستقیما توسط یک مفسر یا ماشین مجازی اجرا میشن؛ بهرحال همینطور مستقیم نمیتونن به سیستم عامل و پردازنده داده بشن برای اجرا.
پاسخ
تشکر شده توسط: __undercover , YN97




کاربران در حال بازدید این موضوع: 1 مهمان