کد مدیریتشده «Managed Code» و کد غیرمدیریتشده «Unmanaged Code» دو نوع از کدهای برنامهنویسی در NET. هستند که تفاوتهای اساسی در نحوه اجرا و مدیریت منابع دارند. کد مدیریتشده در محیطهای اجرایی خاصی مانند دات نت یا Java اجرا میشود و بسیاری از مسائل مربوط به مدیریت حافظه و امنیت بهطور خودکار توسط این محیطها کنترل میشود. در مقابل، کد غیرمدیریتشده بهطور مستقیم توسط سیستمعامل و پردازنده اجرا میشود و برنامهنویس مسئولیتهای بیشتری مانند تخصیص حافظه و مدیریت خطاها را بر عهده دارد. ما در این مقاله به بررسی مزایا و معایب هر دو نوع کد پرداخته و تفاوتهای میان آنها را بررسی خواهیم کرد.
کد مدیریتشده چیست؟
کدی که به منظور بهرهگیری از خدمات محیط اجرای مدیریتشده مانند CLR (Common Language Runtime) در NET. فریمورک نوشته میشود، به عنوان کد مدیریتشده شناخته میشود.
این کد بهجای اینکه مستقیماً توسط سیستمعامل اجرا شود، همیشه توسط محیط اجرایی مدیریتشده پیادهسازی و اجرا میشود.
محیط مدیریتشده خدمات مختلفی مانند جمعآوری زباله «garbage collection»، بررسی نوع «type checking»، مدیریت استثناها «exception handling»، بررسی محدوده «bounds checking» و غیره را بهطور خودکار و بدون دخالت برنامهنویس ارائه میدهد.
همچنین این محیط مدیریتشده، تخصیص حافظه، ایمنی نوع (Type Safety) و سایر ویژگیهای مشابه را برای کد فراهم میکند. برنامههایی که به زبانهایی مانند Java، C#، VB.Net و غیره نوشته میشوند، همیشه برای مدیریت اجرای خود به خدمات محیط اجرایی وابسته هستند و کد نوشتهشده در این زبانها به عنوان کد مدیریتشده شناخته میشود.
در NET. فریمورک، کامپایلر همیشه کد مدیریتشده را به زبان میانی (MSIL (Microsoft Intermediate Language کامپایل میکند و سپس یک فایل اجرایی ایجاد میکند. هنگامی که برنامهنویس فایل اجرایی را اجرا میکند، کامپایلر “همزمان” (Just-In-Time Compiler) در CLR، زبان میانی را به کد بومی که مختص معماری زیرین است تبدیل میکند. این فرآیند در محیط اجرای مدیریتشده صورت میگیرد، بنابراین این محیط مسئول عملکرد کد است. اجرای کد مدیریتشده به این صورت است که کد منبع در هر زبان NET. فریمورک نوشته میشود.
کد مدیریتشده همچنین استقلال از پلتفرم را فراهم میکند، زیرا هنگامی که کد مدیریتشده به زبان میانی کامپایل میشود، کامپایلر JIT این زبان میانی را به دستورالعملهای مختص معماری تبدیل میکند.
مزایای استفاده از کد مدیریتشده
- بهبود امنیت برنامه: با استفاده از محیط اجرای مدیریتشده، حافظه بهطور خودکار بررسی میشود تا از سرریز بافر (buffer overflow) جلوگیری شود.
- پیادهسازی خودکار جمعآوری زباله «Garbage Collection»: مدیریت حافظه بهصورت خودکار انجام میشود و نیازی به دخالت برنامهنویس نیست.
- ارائه بررسی نوع در زمان اجرا «Runtime Type Checking»: انواع دادهها بهصورت پویا در زمان اجرا بررسی میشوند تا از خطاهای نوع جلوگیری شود.
- بررسی مراجع «Reference Checking»: اطمینان حاصل میشود که مراجع به اشیای معتبر اشاره میکنند و مراجع تکراری وجود ندارند.
معایب کد مدیریتشده
- عدم امکان تخصیص مستقیم حافظه: در این کد، شما مجاز به تخصیص مستقیم حافظه نیستید.
- عدم دسترسی به سطح پایین معماری CPU: دسترسی به جزئیات سطح پایین سختافزار یا معماری CPU را محدود میکند.
کد غیرمدیریتشده چیست؟
کدی که بهطور مستقیم توسط سیستمعامل اجرا میشود، به عنوان کد غیرمدیریتشده شناخته میشود. این نوع کد همیشه برای معماری پردازنده هدفگذاری میشود و به معماری کامپیوتر وابسته است.
هنگامی که این کد کامپایل میشود، معمولاً برای یک معماری خاص کامپایل شده و فقط روی همان پلتفرم اجرا میشود. به عبارت دیگر، زمانی که بخواهید همان کد را برای معماریهای مختلف اجرا کنید، باید آن کد را دوباره بر اساس آن معماری کامپایل کنید. کد غیرمدیریتشده همیشه به کد بومی که مختص معماری است، کامپایل میشود.
در این نوع کد، تخصیص حافظه، ایمنی نوع، امنیت و غیره توسط توسعهدهنده مدیریت میشود. به همین دلیل، مشکلاتی مانند سرریز بافر، نشت حافظه، لغو اشارهگر و غیره ممکن است پیش آید. فایلهای اجرایی کد غیرمدیریتشده معمولاً به صورت تصاویر باینری یا کد x86 هستند که مستقیماً در حافظه بارگذاری میشوند. برنامههایی که به زبانهایی مانند VB 6.0، C، C++ و غیره نوشته میشوند، همیشه به کد غیرمدیریتشده تبدیل میشوند.
مزایای استفاده از کد غیرمدیریتشده
- دسترسی به سطح پایین برای برنامهنویس: امکان دسترسی به سطح پایین و جزئیات معماری سختافزار را برای برنامهنویس فراهم میکند.
- دسترسی مستقیم به سختافزار: این کد به برنامهنویس اجازه میدهد تا بهطور مستقیم با سختافزار ارتباط برقرار کند.
- عبور از برخی محدودیتها و پارامترهای کد مدیریتشده: برنامهنویس میتواند برخی از محدودیتها و پارامترهایی که توسط چارچوب کد مدیریتشده اعمال شدهاند را دور بزند.
معایب کد غیرمدیریتشده
- عدم ارائه امنیت به برنامه: امنیت برنامه را بهطور خودکار تأمین نمیکند و مسئولیت امنیت بر عهده برنامهنویس است.
- مشکلات مربوط به تخصیص حافظه: به دلیل دسترسی مستقیم به تخصیص حافظه، مشکلاتی مانند سرریز بافر و سایر مسائل حافظه رخ میدهند.
- مدیریت خطاها و استثناها بر عهده برنامهنویس: در کد غیرمدیریتشده، برنامهنویس باید خود خطاها و استثناها را مدیریت کند.
- عدم تمرکز بر جمعآوری زباله (Garbage Collection): این نوع کد بهطور خودکار جمعآوری زباله را انجام نمیدهد و برنامهنویس باید به مدیریت حافظه توجه کند.
نتیجهگیری
در نتیجه، کد مدیریتشده و غیرمدیریتشده هرکدام مزایا و معایب خاص خود را دارند. کدهای مدیریتشده از طریق ارائه خدمات خودکار مانند جمعآوری زباله و امنیت حافظه، به توسعهدهندگان کمک میکنند تا برنامههای پایدارتر و ایمنتری بنویسند. با این حال، کدهای غیرمدیریتشده به توسعهدهندگان کنترل بیشتری بر روی سختافزار و منابع سیستم میدهند و به آنها اجازه میدهند تا برنامههایی با کارایی بالا و بهینه ایجاد کنند، اما به دلیل نیاز به مدیریت دستی حافظه و خطاها، میتواند با مشکلاتی مانند نشت حافظه و امنیت کمتر همراه باشد. انتخاب بین این دو بستگی به نیازهای خاص پروژه و سطح کنترل و انعطافپذیری مورد نیاز دارد.