درود
موقعه که ویندوز نصب میکنیم اسمبلر تو ی خود ویندوز خود به خود نصب میشه؟
مثلا یک برنامه که ما اجرا میکنیم اسمبلر کد ها رو به 0 و 1 تبدیل میکنه ؟
درود
موقعه که ویندوز نصب میکنیم اسمبلر تو ی خود ویندوز خود به خود نصب میشه؟
مثلا یک برنامه که ما اجرا میکنیم اسمبلر کد ها رو به 0 و 1 تبدیل میکنه ؟
کامپایلر میتونه کد رو به صفر و یک تبدیل کنه ولی ساختارهایی مثل elf هم هستند که خود ساختار صفر یک ندارند ولی سیستم توان اجرای اونو داره ، که البته اون ها هم توسط خود سیستم دکد خواهند شد
حالا درون هر سیستم عامل برای اجرای کد های متفاوت کامپایلر های متفاوتی وجود دارند که اگر فایل ساختار باینری نداشته باشد انرا اجرا کنند مثلا برای اجرای فایل های جاوا در ویندوز شما باید java se runtime رو نصب کنید تا نرم افزار های جاوا اجرا بشن، با ویندوز هم برای اجرای کدهای مختلف کامپایلرهایی تعبیه شده اند تا بتوانند کد ها را اجرا کنند
مثلا توی خود ویندوز چندتا کامپایلر هست ؟
فرض کنید ما هیچ برنامه رو نصب نکردیم یه برنامه paint یا مدیا پلیر باز میکنیم
کدهاش چطوری به 0 و 1 تبدیل میشن؟
تو ی ویندوز چند نوع کامپایلر به کار رفته؟
مثلا وقتی که من برنامه مدیا پلیر یا paintدارم اجرا میکنم کامپایلر میاد این کداشو به 0 و 1 تبدیل میکنه ؟؟
خب به مستندات هر برنامه ای که میخواین بدونین با چی دکد میشه مراجعه کنین ببینین با چه زبانی اجرا میشه، خب ویندوز از زبان های زیادی پشتیبانی میکنه خانواده سی، اف ، بیسیک و ...
بگین میخواین چیکار کنین تا بدونیم چه جوابی به شما بدیم
من میخوام یه دیدی از تبدیل شدن به دست بیارم
مثلا طرز کامپایل شدنش
یا این کامپیلر پایین تر از لایه ی سیستم عامل هست چطوریه
طبق شکل Kernel-Access-Diagram.png
واقعا اینجوریه یا غیر از اینه؟
کدهاش از قبل به صفر و یک تبدیل شده اند! البته صفر و یک اصطلاح دقیقی نیست!
مثلا برنامه ی Paint از قبل کدش رو کامپایلر کامپایل کرده و وقتی اجراش می کنید ویندوز کد کامپایل شده و همه ی اجزای لازمش رو بارگذاری می کنه و به CPU اجازه می ده که کدی رو که می فهمه اجرا کنه... نه نیازی به کامپایلر دارید و نه اسمبلر... این ابزارها از قبل کار خودشون رو کردن و شما فقط از خروجیشون استفاده می کنید...
واسه بعضی نرم افزار ها که خودمون نصب میکنیم مثلا بابیلون یا nero
اینا با فریم ورک به 0 و 1 تبدیل میشن؟
ببین بستگی به نوع نرم افزار داره... تا جایی که من اطلاع دارم... خیلی ها از قبل کامپایل شده اند... به قول شما به صفر و یک تبدیل شده اند... (در واقع همه ی فایل ها صفر و یکی هستن!) یه سری دیگه موقع اجرا کامپایل می شن توسط یه ابزاری... (مثلا برنامه های NET.) یه سری دیگه هم کدشون رو CPU نمی فهمه و یه نرم افزار دیگه اون ها رو اجرا می کنه در یه ماشین مجازی... (مثلا ماشین مجازی جاوا) یه سری زبان های مفسری هستن که کدهایی که خودشون می فهمن رو (نه کدهایی که سخت افزار می فهمه...) از یه فایلی می خونن و اجرا می کنن... (مثلا Ruby)
اینجوری ب نظر میرسه نرم افزارهای که با زبان برنامه نویسی مثلا سی یا سی پلاس پلاس تولید شدن نیاز به کامپایلر دارن؟ توی ویندوز موقعه اجرا میتونند کرنل یا سیستم عامل راحت تعامل کنند و به زبان ماشین تبدیل بشن؟
بله چنین برنامه هایی نیاز به کامپایل دارن ولی این عملیات رو از قبل برنامه نویسش با کامپایلر C یا ++C انجام می ده و زمان اجرا نیازی به کامپایلر نیست... و بله با سیستم عامل هم تعامل دارن ولی از قبل کدهای لازم به زبان ماشین هست و نیازی به تبدیلات خاصی نیست... اگه بخوایم دقیقا این مسائل رو توضیح بدیم یه مقاله ی طولانی می شه! می تونید در مورد ساختار فایل های اجرایی در Windows تحقیق کنید... این مقاله از ویکی پدیا رو هم ببینید بد نیست: http://en.wikipedia.org/wiki/.exe
شما اگه تا حالا سعی کرده باشین که کرنلی ساده برای خودتون بسازین حتما از اسمبلر و کامپایلری مثل جی سیسی استفاده کردید ، من خودم با ساختار elf کار میکنم که صفر و یک نیستن، در کرنل شما یک تابع ایجاد میکنین مثل
int
exec(char *path, char **argv)
که این تابع ادرس یک فایل و پارامترهایی که به اون میفرسته رو میگیره و سی پی یو رو به اجرای اون وادار میکنه، این فایل ها از نوع باینری هستن مثلا ls که در لینوکس محتویات یک نود رو به شما نشون میده ، کامپایلر ها به صورت باینری با این تابع اجرا میشن
در ویندوز هم بسته به ساختار فایل شما یا از کامپایلر استفاده میشه یا نه ، بستگی داره کد شما باینری باشه یا نه
در لینوکس غیر از apiها تقریبا بقیه نرم افزار ها برای اجرا شدن نیاز به کامپایلر دارن چون اکثرا متن باز هستند و شما کد اونها رو میتونین ببینین بعضی هم نه مثل api ها یا ساختار باینری دارن یا elf که هر دو با سیستم قابل اجرا هستن
بله این اتفاق بالاخره باید بیافته ولی از قبل افتاده! حالا شما دارید از نتیجه اش استفاده می کنید...
منظورتون رو از این وسط به خوبی متوجه نمی شم... ببینید بالاخره برای نوشتن یه سیستم عامل یه سری از اسمبلر و کامپایلر استفاده کرده اند اما شما نیازی نیست که برای اجراش از این ها استفاده کنید...
تا جایی که من اطلاع دارم... هر چیزی که کامپایل بشه تبدیل به فایل های exe. ی Windows ـی نمی شه... Windows هم کامپایل شده... اما مثل فایل های exe. ی Windows ـی نیست... سیستم عامل ها وقتی کامپایل می شن تبدیل به کد هایی می شن که سخت افزار اون ها رو می فهمه... ولی وقتی یه برنامه ی Windows ـی معمولی مثلا با GCC C کامپایل می شه اون فایل exe. همش برای سخت افزار قابل فهم نیست... همراهش جزئیات دیگه ای هم هست... اون فایل بیش تر به درد سیستم عامل می خوره که برنامه ی شما رو برای اجرا آماده کنه... اگرچه داخل اون فایل exe. قسمت هایی هم کدهایی به زبان ماشین هست... اون فایل exe. وابسته به امکاناتی هست که سیستم عامل در اختیارش گذاشته... و از توابعی که در DLL های مختلف هست (مثلا توابع API خود Windows...) می تونه استفاده کنه... اما یه سیستم عامل فقط و فقط باید متکی به سخت افزار و کدهای خودش باشه نه چیز دیگه... و باید با سخت افزار صحبت کنه و خواسته اش رو بگه... نه این که از کسی (سیستم عامل) کمک بخواد... برعکس اون فایل exe. ...
ضمنا خدمتتون عرض کنم که متاسفانه صفر و یک برای من واژه ای گمراه کننده و مبهم هست! شاید بهتر باشه از واژه های Binary file (فایل باینری/دودویی) و Source Code (کد منبع) استفاده کنید که بیش تر به گوشم خورده... Binary file نشون می ده نمی تونیم از همه ی این صفر و یک ها برداشت متنی (Text) داشته باشیم و فقط در حد همون قالب دودویی هستن... ولی مثلا Text file نشون می ده که از این صفر و یک ها می تونیم برداشت متنی داشته باشیم و برداشتمون ازشون فقط در حد یه سری صفر و یک نیست!...
وقتی ما sql server رو نصب میکنیم توسط فریم ورک کدهای اس کیو ال به باینری تبدیل میشن ؟!
جمله ی بهتر: کدهای SQL توسط Binary تفسیر می شه و تصمیم گرفته می شه که چه کاری باید انجام بشه...
این جا دیگه نیازی به Compile کردن کدهای SQL و تولید برنامه ی جداگانه نیست...
اتفاقا خیلی از زبان ها هم مفسری هستن و در پیاده سازی اصلی ای که ازشون شده یه برنامه ای باید همیشه بالاسر کد باشه و اون رو تفسیر و اجرا کنه... در این موارد هم دیگه عملیات کامپایل کردن انجام نمی شه... مثلا: Ruby، Python، ... مفسر لازمه چون سخت افزار چیزی از کد اون زبان نمی فهمه...