برنامه نویسی managed & native

negin17h

مدیر تالارهای مهندسی کامپیوتر و رباتیکمتخصص #C
مدیر تالار
کدهای دات نت همه از نوع managed هستند تنها c++ هست که میتونه هر دو مدل باشه :smile: (تا جایی که البته سواد ناقص من قد بده) :gol:
 

Arash_Sn

عضو جدید
لفظ Managed در برنامه نویسی که در محیط مایکروسافت انجام میشود به چند شکل استفاده میشود که نباید با هم اشتباه شوند.

در روزگار اولیه ظهور NET. لفظ Managed به برنامه ای اطلاق میشد که حافظه در اختیار یک سیستم مدیریت کننده به نام Garbage Collector ( زباله جمع کن ) قرار داشت و این نوع برنامه به نام Managed شناخته میشد و نوع Unmanaged به نوعی که در آن حافظه Heap بدون نظارت Garbage Collector و مستقیماً در اختیار قرار میگیرد.
بعدها برنامه نویسان لفظ Managed را در مورد برنامه هائی استفاده کردند که در واقع کدهای ساخته شده توسط یک زبان میانی IL=intermediate language اداره شده و در واقع برنامه اجرائی که توسط کامپایلر #C تولید میشود مستقیماً به ماشین کد تبدیل نشده و چیزی شبیه Psudo Code بوده و برای اجرا به یک لایه میانی که یک Virtual Machine میباشد نیاز دارد. این Virtual Machine چیزی نیست جز همان NET Framework . ، با وجود تعاریف مختلف شرکت مایکروسافت بسرعت و برای جلوگیری از ایجاد سردرگمی به لفظ Managed حوزه تعریف را نیز اضافه کرد . یعنی برنامه ای که بر روی Virtual Machine اجرا میشود به Managed Code یا Managed Type نامیده میشود و برنامه ای که مستقیماً بر روی سخت افزار اجرا میشود و کامپایلر ماشین کد ایجاد کرده است به Native معروف شد و بخشهای Data که در اختیار Garbage Collector بود Managed Data نامیده شد و آن بخش که در اختیار Garbage Collector نیست به Unmanaged Data معروف است.

حالا یک سوال ، آیا میشود برنامه ای ازنوعی باشد که بر روی VM=Virtual Machine یا همان NET Framework اجرا شود و Unmanaged باشد ؟ ( اشتباه نکنید اینجا اصلاً بحثی از Native نیست . )

پاسخ بله میباشد ، یعنی وقتی شما برنامه ای را با ++Visual C و با سوئیچ clr کامپایل میکنید برنامه شما برای NET Framework نوشته شده است و برای اجرا به آن نیاز دارد ولی در مورد حافظه در دسترسی برنامه میتواند به Heap یا حافظه مدیریت شده و یا مدیریت نشده دسترسی داشته باشد و برای مشخص شدن آن باید از Keyword ی به نام gc__ استفاده کرد که مخفف همان Garbage Collector است و در صورت عدم استفاده از این Keyword حافظه مدیریت نشده در اختیار قرار میگیرد و پس از پایان استفاده باید حتماً با delete آزاد گردد. پس برای ایجاد یک شی جدید در صورت استفاده از new حافظه مدیریت نشده و در صورت استفاده از gcnew حافظه مدیریت شده در اختیار قرار میگیرد.

پس توجه به این مفاهیم برای کسانی که در چند پلتفرم برنامه مینویسند ضروری است و متاسفانه توضیحات موجود در مدارک مایکروسافت آنچنان واضح نیست.

امیدوارم مفید واقع شده باشد.
 

A.S.Roma

عضو جدید
کاربر ممتاز
ممنون از توضیحاتتون.

یک سوال :
در C# هم می توان کد در بلاک unsafe نوشت و با Pointer ها و همان حافظه Heap دسترسی داشت . آیا این هم همانند مثال شما در مورد C++.NEt CLR می باشد !؟
 

negin17h

مدیر تالارهای مهندسی کامپیوتر و رباتیکمتخصص #C
مدیر تالار
ممنون از توضیحاتتون.

یک سوال :
در C# هم می توان کد در بلاک unsafe نوشت و با Pointer ها و همان حافظه Heap دسترسی داشت . آیا این هم همانند مثال شما در مورد C++.NEt CLR می باشد !؟

زمانيکه شما allow unsafe mode رو فعال میکنید میتوانید به طرز مدیریت نشده از حافظه استفده کنید و البته عواقب آن بر عهده شماست و ممکن است در مواردی مشکلاتی را ببینید :gol:
 

general2010

عضو جدید
خب چند مواردی بود که برای یکی از دوستان گفته بودم. دیدم که چنین تاپیکی ایجاد شده بعد نیست اینجا هم بگم.

ببینید شما باید دید خود را نسبت به برنامه نویس شدن بدانید! شما می خواهید برای کجاها برنامه نویسی کنید؟ یعنی فقط قصد دارید برای محیط کامپیوتر برنامه بنویسید!؟ یه چیز جالب: احتمالا اکثرا خبر دارن که جدیدا تمام رشته سعی می کنند برنامه های خودشان را از طریق مهندسین آشنا به زبان برنامه نویس خودشان بنویسند!! (البته نه هر برنامه ای) یعنی دیگر زمان آن گذشته که یک برنامه نویس فقط برای نوشتن برنامه های کتابخانه / دفترچه تلفن / فروشگاه / طراحی سایت و... برنامه نویس شود اگر چنین دیدی دارید یا آن را عوض کنید یا برید سراغ حرفه ی دیگه تا هم بتونید موفق بشید و هم پول خوبی بدست بیارید!!!!

زبان هایی که فریم ورکی هستن برای اجرا باید بدانید که امکان نصب سخت افزار شبیه سازی شده زبان بر روی سیستم میزبان (مشتری) وجود داره که این در خیلی از اوقات یعنی یک محدودیت بزرگ!!
اگر بخواهید برای یک لباس شویی برنامه بنویسید از سی شارپ استفاده می کنید!!!!!!!!!!!!!؟ قطعا این کار امکان پذیر نیست.
حال فرض کنید اگر سرعت برنامه برای شما خیلی مهم باشد چه می کنید؟ انگاه مجبورید به سراغ زبان های native بروید چون زبان های فریم ورکی در خیلی از اوقات جواب گوی شما نیستد!
زبان های فریم ورکی بخصوص زبان های دات نت خیلی وقتی است که وارد عرصه شدند ولی به این دقت کردید که چرا خیلی از برنامه هایی که هم اکنون بر روی سیستم شما هستند با چنین برنامه هایی نوشته نشده اند!!! شاید حدود 99% از برنامه های سیستم شما!

به قول یک دوست: زبان های برنامه نویسی فریم ورکی (بخصوص دات نت) برای ما پیر مردها ساخته شده (خودش را می گه!) چون راحت طلب هستند و ما که دیگه امکان یاد گیری زبان های خیلی پیچیده را نداریم بهتره سراغ آنها برویم! شاید گفته این دوست زیاد جالب و جدی نباشه ولی بنظر من واقعا در بعضی مواقع اینطوریه!!!

من خودم حدود سه - چهار سالی است سی شارپ کار می کنم ولی اگر دانشگاه من را سمت آن نمی کشاند! قطعا سی++ (زبان native) را بیشتر کار می کردم.

با خوندن این مطلب به هیچ وجه فکر نکنید زبان های فریم ورکی قدرتمند نیستند یا به درد نمی خورند بلکه برعکس! ولی باید ما مهندسین کامپیوتر هستیم (من هنوز نشدم:redface:) از یاد گرفتن زبان های native ای قافل نشویم چون به نظر من دنیای اصلی برنامه نویسی آنجاست (نظر خودمه / اعتراض نکنید!!)
 

Arash_Sn

عضو جدید
ممنون از توضیحاتتون.

یک سوال :
در C# هم می توان کد در بلاک unsafe نوشت و با Pointer ها و همان حافظه Heap دسترسی داشت . آیا این هم همانند مثال شما در مورد C++.NEt CLR می باشد !؟

این سوال شما سوال هوشمندانه ای بود !

تا حدی به هم شبیه هستند اما با هم تفاوتهائی نیز دارند . وقتیکه شما در #C در بلاک unsafe کد مینویسید و از Pointer استفاده میکنید مکان حافظه ای که در اختیار شما قرار میگیرد در همان بخشی است که Garbage Collector در اختیار شما قرار داده است ولی برروی آن کنترل ندارد ولی در هنگام جابجا کردن حافظه که دائماً در حال انجام است ممکن است که Object شما نیز جابجا گردد که این باعث بروز فاجعه خواهد شد و شما حتماً هنگام استفاده از کدهای unsafe باید Object مورد نظرتان را در حافظه ثابت fixed کنید در غیر اینصورت Pointer شما به Object دیگری اشاره خواهد کرد. به همین دلیل در زمان کامپایل برنامه با کامپایلر #C با اخطار روبرو خواهید شد.در واقع #C فقط با حافظه مدیریت شده ارتباط دارد ( Garbage Collector ) اما هنگامیکه با کامپایلر ++C برنامه خود را کامپایل میکنید و از Pointer استفاده میکنید حافظه ای که در اختیار شما قرار میگیرد درون محدوده Garbage Collector نیست و شما از این بابت نگرانی ندارید در واقع کامپایلر ++C به هر دو نوع از حافظه دسترسی دارد ( حافظه مدیریت شده Garbage Collector و حافظه مدیریت نشده ) . در نتیجه هنگام کامپایل با ++C شما اخطاری نمیگیرید.

توجه به این مسائل هنگام استفاده از چند پلتفرم بسیار ضروری است.
امیدوارم مفید بوده باشد!
 

mr.sajjad

عضو جدید
 

Similar threads

بالا