# Native Code > برنامه نویسی با C > بحث و گفتگوی فنی - خانواده C >  سوال پایه ای در مورد مفهوم کد مستقل از پلتفرم

## bita_naz

سلام دوستان

لطفا به این سوال من نخندید و مسخره نکنید. چون من تازه سال دومم :خجالت: 

وقتی صحبت از کد native می کنیم مگر منظورمون همون کدهای صفر و یک قابل درک واسه کامپوتر نیست؟ پس آیا هنگام اجرای چنین کدهایی بازم باید کامپایلر روی سیستم هدف نصب باشه ؟؟ و اگر کد صفر و یک هست دیگه چه فرقی داره سیستم عامل چیه؟؟

اینکه می گیم بعضی از زبانها مثل C#‎ یا جاوا مستقل از پلتفرم هستند آیا به این معنی هستش که کامپایلر هونا روی هر سیستمی نصب می شه ؟؟

آیا این همون بستگی داشتن Runtime هستش؟؟

و در آخر اینکه کد بایتهای جاوا , کد های IL ماکروسافت و کدهای Native همه در فایلی با پسوند exe هستن. پس چطور سیستم عامل متوجه تفاوت اونا میشه؟؟

باور کنید اینارو سر کلاسم پرسیدم ولی جواب نگرفتم. استاد گفت سوال خارج از درس نکن
مرسی

----------


## Sepidar

> سلام دوستان


علیک!



> لطفا به این سوال من نخندید و مسخره نکنید. چون من تازه سال دومم


قطعا طلب علم موجب تمسخر نخواهد بود



> وقتی صحبت از کد native می کنیم مگر منظورمون همون کدهای صفر و یک قابل درک واسه کامپوتر نیست؟


اوهوم



> پس آیا هنگام اجرای چنین کدهایی بازم باید کامپایلر روی سیستم هدف نصب باشه ؟؟


طبیعتا خیر



> و اگر کد صفر و یک هست دیگه چه فرقی داره سیستم عامل چیه؟؟


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



> اینکه می گیم بعضی از زبانها مثل C#‎ یا جاوا مستقل از پلتفرم هستند آیا به این معنی هستش که کامپایلر هونا روی هر سیستمی نصب می شه ؟؟


خیر. اینها یه محیز مجازی برای برنامه های ایجاد میکنن که در مورد جاوا تقریبا همه جا نصبه و در مورد دات نت عمو بیلی فقط رو ویندوز ازش پشتیبانی میکنه؛  گرچه لینوکسیا یه پروژه به اسم مونو واسه پورت کردن دات نت رو لینوکس راه انداختن.



> آیا این همون بستگی داشتن Runtime هستش؟؟


؟؟؟



> و در آخر اینکه کد بایتهای جاوا , کد های IL ماکروسافت و کدهای Native همه در فایلی با پسوند exe هستن. پس چطور سیستم عامل متوجه تفاوت اونا میشه؟؟


بازم ؟؟؟

----------


## Nima_NF

native در لغت به معنی بومی هست که در هر جا معانی خود را دارد.
وقتی در مورد برنامه نویسی در سطح سیستم عامل صحبت می شود معمولا  native به کد هایی می گویند که خود سیستم عامل بر مبنای آن پیاده سازی شده است و بالاترین  performance یا کارآیی را برای ارتباط با سخت افزار نسبت به سایر روش ها دارد.(به این مورد platform-specific native APIs می گویند)

ولی در بحث مستقل از پلتفرم ، بله به کد صفر و یک که زبان ماشین می نامند و آن را native machine language در سیستم مورد نظر نیز می گویند که به دلیل حضور معماری سخت افزاری مختلف و پردازنده های مختلف با هم متفاوت هستند، پس نباید native در این مورد را با مورد قبل اشتباه بگیرید.

کدهای EXE درست هست که به زبان ماشین تبدیل می شود ولی وابسته به پلتفرم یا همان سیستم عامل هست، چرا که بسیاری از کارها برای سهولت در توسعه به صورت run-time از طریق کتابخانه های آن سیستم عامل و یا مثلا در ویندوز از dll های مختص به ویندوز فراهم می شود (که به طور معمول آن ها هم به زبان ماشین ترجمه شده اند) و ضمنا بهینه سازی ها بر روی کدها را نیز نباید فراموش کرد و اینکه هر فایلی با پسوند EXE قرار نیست دارای یک محتویات مشخص باشد و حتما روی ویندوز اجرا شود، مانند فایل های EXE ساخته شده برای گوشی های ویندوز موبایل و CE  که در ویندوز دسکتاب اجرا نمی شوند. به همین دلایل هست که در سایر سیستم عامل ها و دستگاه ها فرمت های اجرایی مختلفی و مختص آن وجود دارد.

در مورد کد های مدیریت شده ، .Net Framework شامل دو جزء اصلی هست:
1- common language runtime یا همان CLR 
.NET Framework class library - 2

CLR بخشی هست که اعمالی مثل مدیریت حافظه ، اجرای کد ها و thread ها ، حفظ امنیت کدها و کامپایل آن ها و سایر سرویس های سیستمی را انجام می دهد.

class library همان بخش اصلی .Net برای تولید نرم افزار ها با رابط گرافیکی کاربری (GUI) ، نوشتن برنامه های  کنسول ، XML ، ASP.NET و غیره هست.

وقتی گفته می شود کدهای مدیریت شده مستقل از پلتفرم هست یعنی اینکه هر جایی که CLR وجود داشته باشد امکان اجرای آن وجود دارد، به این شکل:
ابتدا آن ها باید به زبان میانی مایکروسافت (MSIL) کامپایل شوند و سپس در هنگام اجرا از طریق کامپایلر JIT /  just-in-time  به کد های Native سیستمی ترجمه شوند که کدهایی مختص CPU هستند و از آنجایی که CLR از طریق کامپایلر JIT همه پردازنده ها را پشتیبانی و پیاده سازی کرده است پس می توانید برنامه هایی  بنویسید که در همه کامپیوترها با ساختار معماری مختلف اجرا شود.

اما این  موضوع مهمی است که تا کنون درهمین حد تبلیغاتی باقی مانده است، چرا که اگر در کدهای مدیریت شده از API های  Native سیستم عامل یا کتابخانه های مختص آن سیستم عامل استفاده کنید (از جمله class library .NET که چاره ای نیست و باید از آن ها استفاده کرد) لذا برنامه مدیریت شده فقط در همان سیستم عامل قابل اجرا شدن می باشد و تنها راهی که وجود دارد این است که همه شرکت ها یک لیسانس از مایکروسافت با هزینه های بسیار بالا برای کتابخانه های .Net دریافت کنند تا برنامه های نوشته شده در ویندوز که از همان class library استفاده کرده است بتواند در سایر کامپایلرها نیز اجرا و یا کامپایل شود که تا کنون شرکتی این کار را نکرده است و فقط برخی از شرکت ها به شبیه سازی آن اقدام کرده اند.

توجه کنید که CLR و C#‎ استاندارد جهانی هستند و نیاز به خرید ندارند و هر کسی با دریافت استاندارد ها، می تواند کامپایلر آن را پیاده سازی کند ویا حتی زبان خود را نیز مبتنی بر CLR ارائه کند تا از قابلیت های دات نت بهره مند شود. پس بخش مشکل ساز، بخش class library می باشد که تا کنون مختص ویندوز بوده است.

در مورد Java هم وضع تقریبا به همین شکل هست اما با آزادی بیشتر، یعنی اینکه کدهای شما به کدهای میانی (کد بایت) تبدیل می شوند و هر جا که java Runtime یا مثلا ماشین مجازی جاوا وجود داشته باشد برنامه شما می تواند اجرا شود چون که کدهای میانی شما در حین اجرا باید خط به خط به زبان قابل فهم سیستم ترجمه و تفسیر شوند.

در مورد C و  ++C هم به همین شکل که اگر همانند کدهای مدیریت شده از API های Native سیستم عامل استفاده نکنند، با طراحی کامپایلر آن به عنوان یک زبان مستقل از پلتفرم هستند، اما با یک تفاوت اساسی نسبت به سایر زبان ها:
این تفاوت که از همان ابتدا استاندارد و دردسترس همگان بودند و وابسته به کتابخانه های تغییر پذیر مثل کتابخانه های .NET نیز نبودند، لذا با توجه به محبوبیت آن ها با حضور کتابخانه های Cross-platform می توان از API های Native هر سیستم عامل به دلیل ثبات بالای آن ها و البته با درجه اعتماد بالایی استفاده کرد.

پس با توجه به این مطالب  در حال حاضر Java  و ++C را می توان پرکاربردترین و مهم ترین ابزار مستقل از پلتفرم مطرح کرد، آن هم به دلیل حضور چشمگیر در سایر ابزارها و پلتفرم های نرم افزاری و سخت افزاری.
هر چند که در این بین نباید از سایر زبان ها از جمله python غفلت کرد که مسیری همانند این دو زبان را در پیش دارند. 

موفق باشید

----------


## apocalipto

> سلام دوستان
> 
> لطفا به این سوال من نخندید و مسخره نکنید. چون من تازه سال دومم
> 
> وقتی صحبت از کد native می کنیم مگر منظورمون همون کدهای صفر و یک قابل درک واسه کامپوتر نیست؟ پس آیا هنگام اجرای چنین کدهایی بازم باید کامپایلر روی سیستم هدف نصب باشه ؟؟ و اگر کد صفر و یک هست دیگه چه فرقی داره سیستم عامل چیه؟؟
> 
> اینکه می گیم بعضی از زبانها مثل C#‎‎ یا جاوا مستقل از پلتفرم هستند آیا به این معنی هستش که کامپایلر هونا روی هر سیستمی نصب می شه ؟؟
> 
> آیا این همون بستگی داشتن Runtime هستش؟؟
> ...


سئوال هات کاملا بی ربطه
منظورت اینه که برنامه های نوشته شده در C#‎ در هر کامپیوتری با هر سیستم عاملی اجرا میشه ،یا اینکه framework دات نت بر روی هر سیستمی  نصب میشه؟

native chie dige?کوچکترین واحد حافظه بیت می باشد که هر بیت توانایی ذخیره یکی از ارقام 0 یا 1 را دارد و در range بزرگتر بایت را داریم که ظرفیت جا دادن 8 بیت را در خود دارد یعنی 8 تا 1 و0 ،حالا نمی دونم منظورت از native چی بود :لبخند گشاده!:  :اشتباه:  :ناراحت:

----------


## مرتضی پیروزی

> سئوال هات کاملا بی ربطه
> منظورت اینه که برنامه های نوشته شده در C#‎‎‎ در هر کامپیوتری با هر سیستم عاملی اجرا میشه ،یا اینکه framework دات نت بر روی هر سیستمی نصب میشه؟
> 
> native chie dige?کوچکترین واحد حافظه بیت می باشد که هر بیت توانایی ذخیره یکی از ارقام 0 یا 1 را دارد و در range بزرگتر بایت را داریم که ظرفیت جا دادن 8 بیت را در خود دارد یعنی 8 تا 1 و0 ،حالا نمی دونم منظورت از native چی بود


جواب شماهم چندان مربوط نبود!!!
دوستان سطح بالایی مثل آقا نیما جواب رو دادند حالا اگه ما نظرات منفی ندیم نمیشه؟

----------


## clover

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

----------


## مرتضی پیروزی

سلام 
ببخشید من تاریخ رو حواسم نبود نگاه کنم چون فکر نمیکردم کسی بیاد
از زیر یه خروار نوشته بیارش بالا
معذزت میخوام

----------


## code_baz

یک سوال:
آیا جاوا یک زبان interpreted حساب میشه
چون برای اجرا نیاز به java runtime  داره و آیا کدهای جاوا همانند C#‎  آخر سر تبدیل به فابل اجرایی میشن یا نه؟

----------


## mr AHR

> آیا جاوا یک زبان interpreted حساب میشه


هم آره هم نه
کامپایل شدن جاوا و نظایر اون دو مرحله داره

میدونین که هر نوع CPU زبان ماشین و اسمبلی مخصوص  خودشو داره ( مثلا Intel یه مدل AMD یه مدل ARM یه مدل و حتی بین معماری  های مختلف اینتل ، مثلا X86 یا X64 ، هم تفاوت وجود داره ) حالا تصور کنین  ما یه جور اسمبلی داریم ( در مورد جاوا ByteCode و C#‎ هم IL ) که برناممون  رو فقط به اون *کامپایل* میکنیم . دقت کنین هیچ CPU واقعی این کدها رو نمیفهمه !در  هنگام اجرا این کد اسمبلی حاصل از برنامه ما تحویل به یه برنامه ای داده  میشن که به طور شبیه سازی شده اونها رو اجری میکنن ( در مورد Java ، JVM و  در مورد .Net ، CLR) ، در واقع یعنی یه جورایی *تفسیر* میکنن ! حالا  این وسط برنامه های مذکور یک کلک هایی هم میزنن یعنی به هر بخشی از  برنامه‌ی شما که برای بار اوّل اجرا میشه رو به کد Native کامپایل میکنن و  برای بار دوّم دیگه تفسیری در کار نیست !
امیدوارم مقصود رو به درستی رسونده باشم
اگر میخواهید جاوا کار کنین به نظر من اینجا شروع خوبیه 
توضیحات من رو با عکس و یه متن درست و حسابی و مبسوط توضیح داده





> چون برای اجرا نیاز به java runtime  داره و آیا کدهای جاوا همانند C#‎‎  آخر سر تبدیل به فابل اجرایی میشن یا نه؟



کدهای Java و C#‎ تقریبا مثل هم پردازش میشن و C#‎ هم به IL کامپایل میشه و CLR اجراش میکنه و این بحثایی که بالا گفتم براش رخ میده

----------

