# Native Code > برنامه نویسی با C > برنامه نویسی با MFC و ++Visual C > سوال: ابهام در مورد کد های hex فایل اجرایی

## Irejx64

در منابع آموزشی گفته شده کدی که به صورت native نوشته می شه(حالا چه از mfc استفاده کنیم یا مستقیما از api ) توسط کامپایلر به کد hex تبدیل میشه و مستقیما توسط پردازنده اجرا می شه.

همونطور که همه می دونن فایل exe ای که به صورت native کامپایل میشه به کتابخانه های ویندوز مثل :kernel ، gdi ، user (البته اگه اشتباه نگفته باشم) و ... احتیاج داره تا اینجا ددرست !

ووقتی که دستورات اسمبلی که معادلشون به hex در فایل exe ما وجود دارن (اگه اشتباه نگفته باشم) توسط cpu قابل شناسایی و واکشی هستند پس برنامه ما به چه منبعی غیر از cpu احتیاج داره ؟ 

یک کد hex که یا دستوره یا داده ست یا ترکیبی از هردو ، توسط pc پردازنده شمارش می شه و cpu اجراش میکنه آیا این همون هگزیه که تو exe وجود داره یا توسط سیستم عامل تولید میشه ؟
اگه برنامه مستقیما توسط پردازده اجرا میشه پس دیگه نقش کتابخانه ها این وسط چیه؟

البته من زیاد راجع به ساختار داخلی یک فایل exe چیزی نمی دونم و تو هیچ کتاب برنامه نویسی
هم راجع بهش چیزی ندیم شاید هم دنبالش نرفتم. البته یه نکته ای هم مشخصه که اگه کد hex برنامه ما یعنی برنامه کاربر مستقیما کنترل cpu رو در دست بگیره دیگه سیستم عامل هیچ نقشی نداره  و فکر می کنم که  این کد hex (قابل اجرا توسط cpu) درون کتابخانه ها  ویندوز تعریف شده و سیستم عامل با محدودیت هایی که برای 
برنامه قائله (مثل حافظه و ...) اونو تولید می کنه.

میدونم شاید این سوال مربوط به این بخش نباشه ولی هر برنامه ای در نهایت  از api های درون کتابخانه های ویندوز استفاده می کنه و برای هربرنامه نویسی مهمه که بدونه این توابع با چه زبانی نوشته شدن(؟!!) و چطور مثلا یک پیکسل در صفحه روشن می شه البته مسلمه که باید به زبان اسمبلی باشه ولی چطور کد hex برنامه ما (که به کتاب خانه های ویندوز وابسته است) توسط cpu (که فقط به خودش وابسته است) اجرا میشه ؟

یه نکته (شاید) خارج از بحث هم بگم : اگه با برنامه نویسی میکروکنترکر ها آشنایی دارین(خودم ندارم) مخصوصا کامپایلر AVR به بالا ، سورس کتابخانه های کامپایلر  همراه با کامپایلر وجود داره و یکیشون رو نگاه کردم کاملا به زبان اسمبلیه و حین کامپایل کد C رو به کد hex (با پسوند obj)تبدیل می کنن البته میکرو ها سیستم عامل ندارن و(شاید) برای همینه که باید مستقیما برنامه توسط پردازنده میکرو اجرا بشه . و از اون موقع(وقتی سورس رو نگاه کردم) این سوال برام بوجود اومد که برای کامپیوتر های 
دسکتاپ هم همچین چیزی وجود داره یا نه ؟

ببخشید اگه طولانی شد ولی این نکته مبهم(!) شاید تو ذهن اکثر برنامه نویسان (شاید فقط native نویس ها)بوجود بیاد.

باتشکر و درود فراوان بر همه برنامه نویسان ایران زمین ...

----------


## Irejx64

hex


> یک مبنا هستش نه چیز دیگه ای. و معادل دستورات اسمبلی هم در فایل exe وجود ندارد.درواقع این کد ماشین هستش که در قسمتی از فایل exe وجود داره.فایل exe از فرمت PE هستش و بحث پیچیده ای داره. و فقط شامل کد ماشین نیست.


منظورتون از کد ماشین چیه ؟ همه می دونن که CPU فقط 0 و 1 رو میشناسه و بسته به قدرتش تعدادی صفر و یک(مثلا 32 بیت در cpu های 32 بیتی) رو همزمان پردازش میکنه
که این صفرو یک ها می تونن داده(data) باشن یا دستور(instruction).
همون کد ماشینی که فرمودین چی میتونه باشه به نظر شما ؟
کد ماشن رو کی اجرا می کنه؟ مسلمه که CPU

منظورم از معادل اینه که هر CPU یی یه سری دستورات اسمبلی براش تعریف شده و این دستورات در خود CPU آدرس دهی شدن حالا ما چه با آدرس در مبنای hex اونا رو فراخونی کنیم چه 
باآدرس در مبنای باینری فرقی نمی کنه مهم اینه که باید آدرس دستور روبرای اجرا بدونیم
 خوب حالا کی اینکارو میکنه ؟ کامپایلر کد هگز (همون کد ماشین)تولیدمیکنه و این کدها هرکدومش دستور باشن  آدرس اون دستورات تو CPU ان.نمی دونم متوجه شدین یا نه؟
اینکه می گم معالشون دستورات اسمبلی تو برنامه شاید از لحاظ لفضی غلط باشه ولی در مفهوم کد ماشین یعنی یا دستور یا داده و چیزی هم غیر از این نمیتونه باشه.




> درواقع این کامپایلر است که پشت پرده بعضی از کارها رو انجام میده که باعث میشه برنامه ی شما به این کتابخانه ها مرتبط بشه.


منظورم موقع اجراست نه موقع کامپایل . یعنی میگید که موقع کامپایل به این کتابخونه ها 
احتیاج داره ؟ پس زمان اجرا چی ؟ 




> دستوراتی که cpu اجرا میکند همون دستورهایی هستند که در فایل exe هستند ولی نه کل فایل exe رو.در واقع این سیستم عامل هست که فایل exe رو برای اجرا کردن آماده میکنه و اون رو طوری تو حافظه قرار میده که cpu اون رو اجرا کنه.(البته اینی که گفتم به صورت ساده بود ، خیلی پیچیده تر از اینهاست)


جواب سوال من همین بود . من کاری به بقیه قسمت های فایل exe ندارم . منظورم کد ماشیه.
پس اگه توی فایل exe ما کد ماشینی وجود داره که توسط cpu مستقیما (البته با راهنمایی سیستم عامل) اجرا میشه پس کد نهایی رو داریم و نیازی نیست حین اجرا به توابع درون کتابخانه ها مراجعه کنیم پس چرا گفته میشه که برنامه native غیر از کتابخانه های ویندوز به چیز دیگه ای برای اجرا احتیاج نداره ؟ 
اگه شما این جمله رو تایید می کنید پس حین اجرای برنامه چطور کد ما که به زبان ماشین
تبدیل شده می تونه از این کتابخونه ها استفاده کنه و اصلا احتیاجی دیگه نداره به این کتابخونه ها . لطفا اگه میشه راجع به زمان کامپایل کمی توضیح بدین . آیا* زمان کامپایل* ، کامپایلر توابعی رو که در برنامه صدا زده ایم از کتابخانه ی حاوی تابع  می خونه و نتیجه رو به صورت کد ماشین دخیره میکنه ؟ یا این اتفاق زمان اجرا توسط سیستم عامل انجام میشه ؟ (منظورم همین تبدیل کد زبان C به زبان ماشینه که در هرصورت باید انجام بشه) .حالا اینکه چه زمانی و چگونه کمی توضیح بدین.
باتشکر

----------


## Irejx64

آقای نیما جان ببخشید از اینکه اینطوری شده من تاحالا نقل قول نذاشتم
خواهشا ویرایش کنیدنقل قول ها رو بین تگ quoto قرار دادم نمی دونم چرا اینطوری شد

----------


## Nima_NF

> hex
> من کاری به بقیه قسمت های فایل exe ندارم . منظورم کد ماشیه.
> پس اگه توی فایل exe ما کد ماشینی وجود داره که توسط cpu مستقیما (البته با  راهنمایی سیستم عامل) اجرا میشه پس کد نهایی رو داریم و نیازی نیست حین  اجرا به توابع درون کتابخانه ها مراجعه کنیم پس چرا گفته میشه که برنامه  native غیر از کتابخانه های ویندوز به چیز دیگه ای برای اجرا احتیاج نداره ؟


فایل exe یک نوع ساختار فایل در ویندوز هست، در لینوکس فایل اجرایی ساختار دیگری دارد و پسوند هم معنا ندارد، همین طور در سایر سیستم ها.
فایل exe در ویندوز شامل همه کدهای شما نیست، یعنی همه برنامه شما در داخل یک فایل exe به کد ماشین تبدیل نشده است، بخشی از آن در dll خود ویندوز هست که قبلا به زبان ماشین کامپایل شده است.

به زبان دیگر، بخشی از کد ماشین مورد نیاز برای اجرای برنامه نوشته شده شما (یا همان صفر و یک های مورد نیاز برای اجرا در CPU)، در dll های اصلی ویندوز هست و بخش دیگر در فایل exe .

شما می توانید خودتان یک سیستم عامل بنویسید که مثلا توسط کامپایلر آن فایل exe ویژه ای بنویسید که نیازمند کتابخانه های اصلی خود سیستم عامل نباشد، اما به نظر شما حجم این برنامه چقدر می شود؟ سرعت و کارآیی برنامه چطور می شود؟ آیا ارزش دارد بابت یک برنامه همه میلیون ها خط کد ماشین در یک فایل ریخته شود؟ آیا به این شکل ساختن هر یک برنامه exe، به معنی ساخت یک سیستم عامل نمی شود ؟

در حال حاضر سازنده سیستم عامل و نویسنده کتابخانه هست که این تصمیم را می گیرد و  به شما اجازه دهد که کتابخانه را به برنامه خود به شکل static لینک کنید با نه. 
به این شکل اگر کتابخانه static باشد و اگر مثلا کد بدون وابستگی به کتابخانه های درون سیستم عامل نوشته شده باشد، کدهای کتابخانه مستقیم در فایل exe شما قرار می گیرد.

ضمنا quote هست نه quoto. : )

----------


## Irejx64

ممنونم آقای نیما  جوابت برعکس سوال من خیلی واضح و روشن بود و کاملا مفهوم رو متوجه شدم.

----------

