زبان میانی مایکروسافت یا MSIL (Microsoft Intermediate Language) زبان برنامهنویسی سطح میانهای است و برای اجرای کدهای NET. در محیطهای مختلف مورد استفاده قرار میگیرد و تمام ویژگیهای نرمافزاری NET Framework. از آن استفاده میکنند. در این مقاله از سری مقالات آموزشی پی استور به بررسی نحوه تولید و اجرای MSIL و اینکه MSIL چیست؟ همراه با بررسی برخی دستورات آن، می پردازیم.
مقدمه
در دنیای برنامهنویسی، اجرای کدهای نرمافزاری بر روی پلتفرمهای مختلف یکی از موضوعات مهم است. به منظور رفع این مشکل و افزایش قابلیت حملپذیری نرمافزارها، مایکروسافت در NET. فریمورک از مفهوم زبان میانی (Intermediate Language) استفاده کرده است. MSIL، که توسط کامپایلرهای خاص زبان بهطور خودکار از کد منبع تولید میشود، بستری برای اجرای برنامههای داتنت بهطور مستقل از پلتفرم فراهم میآورد. در این فرآیند، کامپایلر JIT (Just In Time) مسئول تبدیل MSIL به کد ماشین خاص سیستم هدف است.
MSIL چیست؟
زبان میانی مایکروسافت «Microsoft Intermediate Language» بهاختصار «MSIL» که بهعنوان زبان میانی مشترک «Common Intermediate Language» یعنی «CIL» شناخته میشود، مجموعهای از دستورات است که مستقل از پلتفرم هستند و توسط کامپایلر مخصوص زبان از کد منبع تولید میشوند. MSIL به دلیل مستقل بودن از پلتفرم میتواند روی هر محیطی که از زیرساخت CLI پشتیبانی میکند، مانند زمان اجرای NET. ویندوز، اجرا شود.
MSIL توسط کامپایلر JIT (تفسیر همزمان) به کد ماشین خاص محیط کامپیوتر تبدیل میشود. این فرآیند قبل از اجرای MSIL انجام میگیرد. علاوه بر این، تبدیل MSIL به کد ماشین بر اساس نیاز صورت میگیرد؛ به این معنا که کامپایلر JIT تنها بخشهای موردنیاز از MSIL را کامپایل میکند، نه کل آن.
فرآیند اجرای کد در CLR
فرآیند اجرا که شامل ایجاد MSIL و تبدیل MSIL به کد ماشین توسط کامپایلر JIT میباشد، به شرح زیر است:
- کد منبع توسط کامپایلر مخصوص زبان در زمان کامپایل CLR به MSIL تبدیل میشود. همچنین، همراه با MSIL، متاداده نیز در زمان کامپایل تولید میشود. متاداده شامل اطلاعاتی مانند تعریف و امضای انواع در کد، اطلاعات مربوط به زمان اجرا و موارد دیگر است.
- با مونتاژ کردن MSIL، یک اسمبلی زیرساخت زبان مشترک (CLI) ایجاد میشود. این اسمبلی اساساً یک کتابخانه کد کامپایلشده است که برای امنیت، استقرار، نسخهبندی و غیره استفاده میشود و به دو نوع تقسیم میشود: اسمبلی پردازشی (EXE)، اسمبلی کتابخانهای (DLL)
- کامپایلر JIT سپس زبان میانی مایکروسافت (MSIL) را به کد ماشین خاص محیط رایانهای که در آن اجرا میشود، تبدیل میکند. MSIL به صورت موردنیاز به کد ماشین تبدیل میشود؛ به این معنا که کامپایلر JIT تنها بخشهای موردنیاز MSIL را کامپایل میکند، نه کل آن.
- کد ماشین تولیدشده با استفاده از کامپایلر JIT سپس توسط پردازنده کامپیوتر اجرا میشود.
مثال:
MSIL توسط کامپایلر مخصوص زبان از کد منبع زیر تولید میشود. برای درک بهتر MSIL، کد منبع سادهای از سیشارپ «#C» با کلاسی به نام Demo که عبارت “ProgramStore” را چاپ میکند، به شرح زیر آورده شده است:
using System; public class Demo { public static void Main() { Console.WriteLine("ProgramStore"); } }
زبان میانی مایکروسافت (MSIL) که توسط کامپایلر #C برای کد ارائهشده در بالا تولید میشود، به شرح زیر است:
// =============== CLASS MEMBERS DECLARATION =================== .class public auto ansi beforefieldinit Demo extends [mscorlib]System.Object { .method public hidebysig static void Main() cil managed { // .maxstack 8 IL_0000: nop IL_0001: ldstr "ProgramStore" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: ret } // end of method Demo::Main .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: ret } // end of method Demo::.ctor } // end of class Demo // =============================================================
در MSIL فوق، اپکدها دستورات یک یا دو بایتی هستند. تعریفهای کلاس پایه که همه کلاسهای دیگر از آنها ارثبری میکنند، در فایل mscorlib.dll قرار دارند.
در متد ()Main، دستور ldstr رشته ProgramStore را در پشته بارگذاری میکند. سپس تابع استاتیک System.Console.Writeline فراخوانی میشود و رشته از پشته حذف میشود. در نهایت، دستور ret پایان فراخوانی تابع را مشخص میکند.
دستور ()ctor نشاندهنده سازنده پیشفرض بدون پارامتر برای کلاس Demo است. این سازنده بهطور خودکار توسط کامپایلر برای کلاس غیراستاتیک Demo ایجاد میشود. دستور call سازنده شیء پایه را فراخوانی میکند و دستور ret پایان فراخوانی تابع را نشان میدهد.
نتیجهگیری
زبان میانی مایکروسافت (MSIL) نقشی کلیدی در فرآیند اجرای برنامههای داتنت دارد، زیرا امکان اجرای کدها را بهصورت مستقل از پلتفرم فراهم میکند. این زبان توسط کامپایلرهای مخصوص زبان از کد منبع تولید شده و سپس با استفاده از کامپایلر JIT به کد ماشین خاص سیستم هدف تبدیل میشود. این فرآیند موجب بهینهسازی عملکرد و قابلیت اجرا در محیطهای مختلف میشود.
مقاله به خوبی توضیح میدهد که msil چیست و چه نقشی در اجرای برنامههای داتنت دارد.