PDA

View Full Version : سوال: دلیل قابل حمل بودن بالای کد های سی



taha11111
جمعه 12 تیر 1394, 16:51 عصر
آقا سلام. مگه نمیگن کد های باینری توی هر سخت افزار و پردازنده برای انجام یک کار معین فرق میکنن ؛ پس چرا زبونی مثل سی این قابلیت حمل بالا رو داره؟ یعنی چرا وقتی کدهای سی رو به زبون ماشین کامپایل میکنیم ، با این حال این قابلیت حمل بالا رو داره و نسبت به زبون ماشین تو اکثر سیستما بدون تغییر اجرا میشن؟ آیا زبون سی "کنار" خودش ماشین مجازی داره؟

Desaghi
جمعه 12 تیر 1394, 17:02 عصر
این قابلیت به خاطر سیستم عامل است.

taha11111
جمعه 12 تیر 1394, 17:11 عصر
این قابلیت به خاطر سیستم عامل است.

برای برنامه نویسی سیستمی دیگه سیستم عامل معنی نداره . شما مثلا میخواین ی سیستم عامل بنویسین. مثلا سیستم عامل لینوکس . اونوقت دیگه نمیتونیم بگیم سیستم عامل چون ما داریم از صفر شروع میکنیم

rahnema1
جمعه 12 تیر 1394, 17:34 عصر
سلام
نکته اول اینه که زبانهایی مثل c یا ++c دارای اصول و قواعد کاملا تعریف شده هستند که تحت عنوان استاندارد منتشر شده و این زمینه برای کامپایلرها فراهم شده که خودشان را با استاندارد تطبیق بدهند
اما کد ها را برای هر سیستم عامل جداگانه باید کامپایل کرد چون فرمت فایل اجرایی در سیستمهای مختلف متفاوته.
ضمن اینکه در همون استاندارد مواردی اشاره شده که بستگی به کامپایلر و سیستمی که برنامه تحت اون اجرا می شه داره
مثلا در استاندارد اشاره شده که سایز char یک بایته اما اشاره نکرده یک بایت چه قدر حافظه اشغال می کنه ممکنه 8 بیت یا 16 بیت یا بیشتر باشه که بسته به سیستم های مختلف می تونه متفاوت باشه ( گر چه اکثرا سایز بایت برابر 8 بیت هست)
در نتیجه اگه یک برنامه بدون در نظر گرفتن و اطلاع از این مسائل نوشته بشه نمیشه اسمش را قابل حمل گذاشت به عبارت دیگه قابل حمل کردن برنامه های c و ++C ممکنه خودش دردسر داشته باشه و نیاز به اطلاعات بالای برنامه نویس از سیستم مورد نظر داره برعکس برنامه های جاوا که مثلا مشخصه int سایزش 32 بیت هست و در هر سیستمی همینه ( دانستن سینتکس کافیه و به اطلاع از سیستم مورد نظر نیاز چندانی نیست)
البته کتابخانه ها و فریمورکهایی نظیر Qt برای زبان ++c توسعه داده شده اند که خیلی از مسائل این چنینی را رفع کرده اند و مثلا نوع داده های خاص خودشون را تعریف کرده اند تا کاربری که از این فریمورک استفاده می کنه توی همه جا یک نتیجه داشته باشه
بنابراین در جاوا خود زبان قابل حمل هست اما در ++c اگه استاندارد رعایت بشه قابل حمل بودن در کتابخانه ها می تونه صورت بگیره

Desaghi
جمعه 12 تیر 1394, 20:00 عصر
اینکه کدهای باینری در هر سخت افزار و پردازنده (انواع cpu , ram) اجرا می شوند مگر به خاطر سیستم عامل نیست؟

golbafan
جمعه 12 تیر 1394, 20:21 عصر
اینکه کدهای باینری در هر سخت افزار و پردازنده (انواع cpu , ram) اجرا می شوند مگر به خاطر سیستم عامل نیست؟

نه دوست عزیز، سخت افزار قبل از سیستم عامل قرار میگیره

Desaghi
جمعه 12 تیر 1394, 22:48 عصر
نه دوست عزیز، سخت افزار قبل از سیستم عامل قرار میگیرهخوب البته درسته ولی سیسنم عامل هست که باعث میشه به نوع و مدل سخت افزار فکر نکنیم. مثلا سی پی یو چه مدلی است.

taha11111
شنبه 13 تیر 1394, 14:29 عصر
خوب البته درسته ولی سیسنم عامل هست که باعث میشه به نوع و مدل سخت افزار فکر نکنیم. مثلا سی پی یو چه مدلی است.

این که شما میگین وقتی سیستم عامل هست سخت افزار مهم نیست کاملا اشتباهه. (وگرنه برنامه های 32 بیت و 64 بیت معنی نداشتن) این تصور برای برنامه های مفسری و همچنین برنامه هایی که نیاز به ماشین مجازی دارند تا حدودی درست است . ولی در مورد کد های native ( اگه اشتباه نکرده باشم) چون به باینری ترجمه میشن کاملا فرق میکنه . چون کد های باینری در هر معماری فرق میکنن.بنابراین شما چون مستقیما می خواین توسط سخت افزار اجرا بشه پس باید تحت معماری مورد نظر کامپایل کنین و اگر هم میخواین تو پلتفرم خاصی اجرا بشه ، علاوه بر معماری ، باید تحت قوانین و استاندارد های پلتفرم مورد نظر کامپایل کنید تا پلتفرم اون رو به عنوان یک فایل اجرایی بشناسه و اجرا کنه (مثلا تو پلتفرم ویندوز ، سیستم عامل فایل هایی رو که پسوند .exe دارند رو به عنوان فایل اجرایی میشناسه و اگر کد مورد نظر native بود ، میبینه که برای چه معماری نوشته شده اگر با معماری مورد نظر همخوانی داشت که اجراش میکنه در غیر اینصورت ...) .
در بالا گفتم برنامه هایی که نیاز به ماشین مجازی دارند و یا مفسری اند ، تا حدودی درست است ؛ چون خود ماشین مجازی و مفسر ها توسط کدهای ناتیو ساخته شدن پس برای تفسیر سورس ها باید تو هر پلتفرم و معماری ماشین مجازی یا مفسر مخصوص رو نصب کنیم.

حامد مصافی
شنبه 13 تیر 1394, 16:27 عصر
پورتابل بودن زبان‌هایی مثل سی ربطی به اینکه در چه سیستم‌عاملی اجرا میشن نداره. علت کار در کامپایلر‌هاست. در سیستم‌عامل‌های مختلف کامپایلر سی وجود دارد و چون این یک زبان استاندارد است پیاده سازی آن در همه کامپایلر‌ها یکسان است. به همین دلیل برنامه نوشته شده به زبان سی می‌تواند با هر یک از این کامپایلر‌ها، کامپایل شود.

taha11111
شنبه 13 تیر 1394, 17:23 عصر
پورتابل بودن زبان‌هایی مثل سی ربطی به اینکه در چه سیستم‌عاملی اجرا میشن نداره. علت کار در کامپایلر‌هاست. در سیستم‌عامل‌های مختلف کامپایلر سی وجود دارد و چون این یک زبان استاندارد است پیاده سازی آن در همه کامپایلر‌ها یکسان است. به همین دلیل برنامه نوشته شده به زبان سی می‌تواند با هر یک از این کامپایلر‌ها، کامپایل شود.
خوب منظور منم همین بود. وقتی میگن فلان زبان مثلا سی قابلیت حمل بالایی داره یعنی این که "با حداقل تغییر توی سورسمون" میتونیم تو پلتفرمای مختلف کامپایل و اجرا کنیم. ولی کد که با زبان سی نوشته شده و سپس کامپایل شده ، رو نمیتونیم تو پلتفرم های مختلف اجرا کنیم . مثلا کدی که تو ویندوز با پسوند exe. کامپایل شده رو نمیتونیم تو مک اجرا کنیم و راهش اینه که همون سورس رو تو مک کامپایل کنیم تا بتونیم اجراش کنیم

deragonpc
یک شنبه 14 تیر 1394, 16:57 عصر
من جواب های بقیه دوستان رو مطالعه نکردم اما چیزی که خودم میدونم رو میگم . کامپایلر های زبانی مثل C یا C++ کد ها رو وقتی باینری تبدیل میکنه برای چندین نوع سخت افزار ترجمه میکنه مثلا شما در کامپایلر GCC میتونید خروجی خودتون رو فقط برای AMD a10 دریافت کنید یا Core i5 یا همه یا .......