سلام
عضویت تان را در این سایت تبریک عرض میکنم ...
==============
اول اجازه دهید به تفاوت کامپایل های #C و ++VC برسیم :
کامپایل ++VC تک مرحله ای است و پس از کامپایل x86 یا x64 و... کد native ای میسازد که مستقیم به زبان آن CPU و سیستم عامل است و فقط هم برای همان CPU و OS قابل اجراست.
(این یعنی native ، زبانی مختص یک خانواده خاص از CPU ها که لزوماً برای خانواده ای دیگر قابل فهم نیست)
کامپایل #C دو مرحله ای است، اول کدهای #C به زبان میانه ای به نام IL کامپایل میشوند.
این IL خیلی شبیه native است و شاید بتوان آن را نوعی کد native حساب کرد که مختص زبان هیچ یک از خانواده های x86 و x64 و ARM و... نیست! ولی بسیار شبیه قالب و قوانین و اصول زبان های native آنها است.
خروجی این کامپایل همان dll و exe ای میشود که شما خواهید داشت و منتشر میکنید.
(یعنی شما با هر زبان دات نتی که کد بنویسید پس از این کامپایل فقط IL یکسان و یکدست باقی می ماند ودیگر فرقی بین #C و VB.Net و... نیست)
کامپایلر دوم به نام JIT معروف است و برای همه زبان های دات نتی یکسان است.
این کامپایلر همراه نصب dotNetFramework در سیستم عامل مقصد نصب میشود.
وقتی برنامه شما در ماشین مقصد دبل کلیک میشود، JIT در همان لحظه IL را به native تبدیل میکند و native مختص آن CPU و OS تولید و اجرا میشود.
(ابزار کمکی ngen.exe در dotNetFramework میتواند کد native تولید شده را کش(GAC) کند تا برای اجراهای متعدد نیازی به فراخوانی مجدد JIT نباشد ولی به علت شباهت ساختاری زیاد بین IL و native ها کار برای کامپایلر JIT ساده و سریع است و معمولاً نیازی به استفاده از ngen.exe نیست)
==============
و اما تفاوت کامپایل x86 و x64 و AnyCPU در #C :
جواب کوتاه آن است که تفاوتی وجود ندارد!
بر خلاف ++VC که برای هر یک از موارد x86 و x64 کد native مختص آن خانواده را تولید میکند، چون خروجی کامپایل #C کدهای مستقل IL هستند (من ترجیح میدهم بگویم native IL !) پس تفاوتی بین x86 و x64 و AnyCPU وجود ندارد و همه ذاتاً AnyCPU هستند!
پس تفاوت کجاست؟
تفاوت تولید فقط منحصر به چند فلاگ (1 یا 0 تکی) در بخشی از اسمبلی های دات نت (exe,dll) به نام COR-FLAGS است.
و کل اسمبلی(exe,dll) شما و کامپایل و کدها و... برابر هستند.
تفاوت فایل های تولیدی به همین جا ختم میشود ولی تفاوت اجرا وجود دارد ...
در زمان اجرا exe این چند فلاگ خوانده شده و رفتار متفاوتی را باعث میشود.
مثال:
کامپایل AnyCPU و اجرا در OSx86 درنتیجه اجرای 32 بیتی
کامپایل AnyCPU و اجرا در OSx64 درنتیجه اجرای 64 بیتی
کامپایل X86 و اجرا در OSx86 درنتیجه اجرای 32 بیتی
کامپایل X86 و اجرا در OSx64 درنتیجه اجرای 32 بیتی
کامپایل X64 و اجرا در OSx86 درنتیجه خطا=غیر قابل اجرا
کامپایل X64 و اجرا در OSx64 درنتیجه اجرای 64 بیتی
==============
تفاوت اجرای 32 بیتی و 64 بیتی:
- تفاوت در اندازه اشاره گر ها
- تفاوت در فراخانی های توابع API غیر دات نتی استفاده شده (معروف به pinvoke)
- اتصال به نسخه های معادل 32 یا 64 بیتی کامپونت های COM و ActiveX ها...
- و...
برای یک کدی که عین بچه مثبت ها فقط در محدوده دات نت باقی مانده و از اجزای غیر دات نتی مانند pinvoke,comm,activex و...استفاده نکرده فرق زیادی نخواهد کرد، شاید کمی تفاوت سرعت نامحسوس!
ولی برای برنامه هایی که خیلی بچه مثبت نبودند این میتواند معنی اجرا شدن و عدم اجرا شدن و بروز خطاهای مهلک را بدهد.
مثال اول:
این طرز تعریف توابع API شامل ضرب المثل یک بار جستی ملخک دوبار... میشود!
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مثال دوم:
کامپونت معروف و قدیمی OLEDB4 جهت اتصال به فایل های mdb فقط نسخه x86 دارد.
در نتیجه اگر یک برنامه نویس بی دقت برنامه اش را AnyCPU کامپایل کند و از طریق OLEDB به Access متصل شود، در رایانه 32 بیتی خودش همه چیز به خوبی کار میکند و همه خوشحال خواهند بود! ولی به محض اجرا در یک سیستم 64 بیتی خطای قطعی دریافت خواهد کرد.
==============
موفق باشید و شب خوش.