سلام
پس در سی شارپ .net چی؟ اون هم مگه کد ترجمه نمیشه به زبان میانی که خود ماکروسافت هم تولیدش کرده؟
اینجا چی باعث میشه که تو هر پلت فرمی اجرا نشه؟
بله دقیقاً درست است.
اتفاقاً از بسیاری از لحاظ و حتی دستورات و حتی namespace ها هم شباهت های خیلی جالبی بیت #C و Java وجود دارد.
کد #C به MSIL کامپایل اولیه و در نهایت توسط JIT کامپایل نهایی و در فضای CLR اجرا میشود.
کد Java هم به bytecode کامپایل اولیه و در نهایت توسط JIT کامپایل نهایی و در فضای JVM اجرا میشود.
درست به همین دلیل مستقل از پلتفرم است که میتوانیم در #C برنامه AnyCPU بنویسم که در x86 کاملاً 32 بیتی اجرا میشود و در x64 کاملاً 64 بیتی.
این امکان در زبانی مانند ++VC وجود ندارد و باید زمان کامپیل دقیق مشخص کنید چه خروجی لازم دارید.
ولی مشکل کجاست که Java بیش از #C مستقل از پلتفرم است؟؟؟
مشکل آنجاست که شرکت مایکروسافت مالک سیستم عامل ویندوز است.
مشکل آنجاست که شرکت مایکروسافت بیشترین سود مستقیم و غیر مستقیم را از گسترش و همه گیر شدن سیستم عامل ویندوز میبرد.
مایکروسافت تمایلی ندارد Framework و JIT و CLR ای برای سایر سیستم عامل ها عرضه کند.
مایکروسافت تمایلی ندارد کاربران را برای کارکردن در سایر سیستم عامل ها تشویق کند و این راه را آسفالت و آسان کند!
مایکروسافت تمایلی ندارد از پشت به سیستم عامل خودش خنجر بزند و به تشویق و توصعه رقبای ویندوز کمک کند.
(احتمالاً من هم جای رئیس و مالکین مایکروسافت بودم همین کار را میکردم!)
در سایت قدیم sun و فعلی oracle خیلی راحت میتوانید jdk را برای سیستم عامل های مختلف دانلود کنید
ولی در سایت مایکروسافت فقط لینک دانلود دات نت را برای ویندوز پیدا خواهید کرد.
یعنی مایکروسافت فقط دات نت را مستقل از پلتفرم سخت افزاری می خواهد (x86,x64,arm,xbox,mobile) نه مستقل از سیستم عامل ویندوز!!! و نه مشوق استفاده از سایر سیستم عامل ها!!!
درواقع #C هم مستقل از پلتفرم است (یا حداقل میتوانست باشد) ولی به شرطی که در سایت مایکروسافت دنبال آن نباشید!
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
(در صورت مشکل از ف-ی-ل-ت-ر ش-ک-ن استفاده کنید)
پس چرا مفسر وابسته به پلتفرم نیست اما کامپایلر هست؟
دقت کنید، بحرحال سخت افزار و سیستم عامل ها متفاوت هستند و یک کد یکسان تکی وجود ندارد که روی همه کار کند (صبر کنید!) اگر هر کدی هر طوری بخواهد روی سخت افزار ی سیستم عامل متفاوتی کارکند، یک نفر یک کدی یک چیزی یک جایی باید با تفاوت خود هزینه این تفاوت را بدهد.
شما میتوانید کدی در ++VC نوشته و برای windows x86 کامپایل کنید.
این کد مخصوص قرارداد ها و زبان ماشین x86 و توابع سیستم عامل windows کامپایل میشود.
در عوض این کد برای اجرا در یک ماشین windows x86 به هیچ چیزی اضافه ای نیاز ندارد.
بدون نصب هیچ پیش نیازی و پس از پایان نصب ویندوز میتواند با یک دبل کلیک اجرا شود.
کامپایر ++VC (میتواند) کامل این exe را برای اجرا در windows x86 آماده کند.
ولی در مقابل وقتی شما کدی به زبان php (مفسری) یا java (دو کامپایلی) مینویسید درست است که کد شما میتواند هم در ویندوز و هم لینوکس و... و هم در x86 و هم در x64 و... کار کند و ائل باید مفسر یا کامپایلری مخصوص آن سیستم باید برایش نصب شود.
یعنی فوراً بعد نصب ویندوز کد php یا java قابل اجرا نیست چون به زبان ماشین کامپایل نشده و نه توسط سیستم عامل و نه توسط cpu قابل شناسایی و فهم نیست.
اگر windows x64 دارید باید اول jre-7u45-windows-x64.exe را نصب کنید.
اگر windows x86 دارید باید اول jre-7u45-windows-i586.exe را نصب کنید.
اگر Linux x86 دارید باید اول jre-7u45-linux-i586.rpm را نصب کنید.
اگر linux x64 دارید باید اول jre-7u45-linux-x64.rpm را نصب کنید.
و...
(گفتم یک نفر یک جایی باید هزینه این تفاوت سخت افزار و سیستم عامل را بدهد و این هزینه همین تفاوت فایل مخصوص هر سخت و سیستم عامل برای مفسر یا کامپایلر دوم یا کتابخانه دوم است، یعنی طبق مثال فوق یک فایل مشترک نصب java برای همه سیستم عامل و سخت افزارها وجود ندارد، اینجاست که نصب java متفاوت و مخصوص هر سخت افزار و نرم افزار بطور مجزا دارد هزینه این تفاوت را میدهد)
جواب شما:
با کمی دقت، میتوان گفت، مفسرها مستقل از پلتفرم نیستند ولی زبان های مفسری مستقل از پلتفرم هستند چون برای اجرایشان باید مفسر مخصوص آن سخت افزار و سیستم عامل اول در رایانه مقصد نصب شود.
در واقع این کدها مستقل از پلتفرم هستند، چون مفسرهای غیر مستقلشان در کنارشان باید به رایانه مقصد منتقل شود.
(یک فایل php نهایی همان کدی است که برنامه نویس در notepad نوشته و هیچ کاری قبل انتشار روی آن انجام نمیشود همه کارها در ماشین مقصد انجام میشد)
ولی کدهای کامپایل شوند مستقل از پلتفرم نیستند چون برای اجرا در یک شرایط خاص سخت افزار و سیستم عامل تهیه شده اند و دیگر برای اجرا در آن شرایط کمکی ندارد و کامپایلرشان در کنارشان حمل نمیشود، خودشان باید تک و تنها در پیلتفرم مقصد کار کنند.
اینکه میگیم هر سخت افزار زبان ماشین خودش رو داره و برای اجرا یک برنامه باید کامپایلر باشه.پس چطور هست یک برنامه مینویسم به زبان سی شارپ فایل exe اون در کامپویتر ها مختلف اجرا میشه؟
بله ولی استانداردهای جهانی در سخت افزار وجود دارد.
اگر هرشرکت سخت افزاری به میل خود یک وسیله را میساخت که سنگ روی سنگ بند نمیشد!
این استاندارد در هاردها میشود IDE,SATA,SCSI و...
این استاندارد در پردازنده میشود x86,x64,ia64,Arm و...
همانطور که شما میدانید مادربورد شما SATA II را پشتیبانی میکند و دنبال هارد SATA II میگردید و نگرانی از شرکت سازنده اش ندارید.
در برنامه هم اگر یک برنامه x64 داشته باشید کافیست CPU (و OS) شما هم x64 باشد دیگر شرکت intel یا amd آن فرقی ندارد.
در این بین استانداری مانند x64 در دل خود قوانین و شرایط x86 را هم شامل میشود یا رعایت و شبیه سازی میکند.
نتیجه آن میشود که برنامه های x86 شما روی x86 و x64 کار خواهد کرد ولی برعکس آن صادق نیست.
(((
ولی برنامه x86 شما صددرصد روی ARM کار نمیکند یا برنامه x64 که نوشته اید روی x86 کار نمیکند.
همانطور که هارد IDE را نمیتوانید به مادر بورد SATA متصل کنید
برای این موارد غیر هماهنگ همواره یک پورت یا مبدل یا شبیه ساز و... لازم است
)))
الان صفات HTML دارن تفسیر میشن به وسیله مرورگر درسته؟ و زبان ماشین تولید نمیکنن. پس یعنی مفسر ها اصلا زبان ماشین تولید نمیکنند؟ برای همین هست که این صفحات در هر سیستم عامل و سخت افزاری صفحات یکسان html رو بهمون میدهند؟
بله ولی مثال خیلی خوبی نزدید چون html یک زبن نشانه گذاری است و نمی توان خیلی آن را با زبان برنامه نویسی مقایسه کرد.
گرچه بحث روی html هم مشکلی ندارد ولی اگر مثال شما را به javascript تغییر دهیم بهتر است و قابل فهم تر است؟!
اول اجازه دهید ببینیم زبان ماشین یا زبان cpu چیست؟
زبان cpu یک سری آپ کدهای صرفاً ععدی است که برای cpu یک فرمان انجام یک دستور ساده را تداعی میکند.
مثلاً عدد 03 یکی از اپ کدهای جمع در cpu های x86 و x64 است.
کد ساده ای مانند این را در نظر بگیرید:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اینها متن هستند و برای cpu بی معنی هستند، یک نفر یک جایی باید زحمت تبدیل این متن به رشته عددی زیر را بکشد:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این دقیقاً کد معادل زبان ماشین برای یک cpu خانواده x64 است، رشته عددی فوق چیزی است که cpu-x64 میفهمد و اجرا میکند.
این رشته عددی کاملاً با چیزی که یک پردازنده ARM میفهمد فرق دارد، مانند زبان گفتاری ما انسان ها می ماند.
یک کامپایلر x64 به جای دستوراتی که نوشتم کدی شبیه این را درون فایل exe میگذارد تا در رایانه مقصد اجرا شود.
در نتیجه exe تولیدی کامپایلر بدون هیچ کمکی و با بیشترین سرعت به، راحتی به زبان x64 خواسته های خود را گفته و اجرا میشود.
از قضا این رشته عددی همان چیزی هم است که یک مفسر x64 برای کد خود تولید میکند!
تنها تفاوتش آن است که این کد درون فایل اجرایی یک زبان مفسری وجود ندارد.
مفسر x64 مخصوصی که نصب شده همان لحظه این کد را تولید و به خورد cpu میدهد.
از نظر انسانی:
در واقع کامپایل مانند ان است که به کسی اسپانیولی یاد بدهید و سپس او را برای کار به اسپانیا بفرستید.
و مفسر مانند ان است که یک مترجم (دونفری) مخصوص کشور مقصد همراه کارمندتان بفرستید تا حرف های او را مدام در لحظه ترجمه کند.
طبیعتاً نفر اول اگر به چین برود نمیتواند ارتباط برقرار کند و کاری انجام دهد
ولی کارمند دوم را (با تغییر مترجم مخصوص چینی) میتوان برای کار به چین هم فرستاد!!!
(چه مثالی شد! )
ازنظر رایانه ای:
مفسر، کامپایلری است که باید در رایانه مقصد/مشتری باشد و آنجا کد را خط به خط کامپایل میکند.
حالا جواب شما با فرض سوال در مورد javascript :
کد javascript به صورت کدخام متنی به مرورگر ارسال میشود و توسط مرورگر تفسیر و اجرا میشود.
ولی در نهایت نهایت ram,hdd,cdrom و... نیستند که میتوانند دو عدد را جمع کنند! چیزی را با چیزی مقایسه کنند! و...
فقط cpu توان این کار را دارد و یک چیزی که زبان cpu (و OS) را میفهمد و میتواند به زبان آنها صحبت کند باید خواسته خود (دستور خود) را به cpu بدهد تا اجرا شود.
در نهایت کسی باید با زبان ماشین و آپکدهای مخصوص cpu به cpu فرامین را بدهد تا اجرا شوند.
==============
(((
بخش اضافه!:
کد MSIL دستور فوق نیز چنین است:
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در واقع وقتی دررایانه تان کد #C را کامپایل و exe می سازید، رشته عددی فوق در فایل exe قرار میگرد.
بعداً در رایانه مقصد و توسط کامپایلر دوم JIT (اگر cpu-x64 باشد) آن رشته کد بزرگ قبلی که کد زبان ماشین بود به یکباره تولید و برنامه اجرا میشود.
یعنی زبان هایی مثل java و #C دو بار کامپایل میشوند یکبار در رایانه برنامه نویس تمام پردازش ها و اشکال یابی ها و... انجام میشود و به یک زبان میانه کامپایل میشوند و یکبار هم قبل از اجرا در رایانه کاربر کامپایل نهایی میشوند که این کامپایل بسیار بسیار کار کمتری دارد و خیلی سریع کارش را انجام میدهد.
بدین ترتیب تلاش میککند هم سرعت را داشته باشند و هم عدم وابستگی به پلتفرم.
)))
امیدوارم به جواب تان رسیده باشید.