اگر .NET کار هستید،باید بدانید.(قسمت اول)

مقدمهاز نظر من برنامه نویسان، بی شباهت با نوازندگان نیستند. ساز دستشون، تکنولوژی هست که باهاش کد میزنند، و هنرشون توانایی کد نویسی یا به عبارتی نوازندگی اون سازه. فقط و فقط یک تفاوت عمده بین یک برنامه نویس و یک نوازنده وجود داره و اون اینه که فرقی نمیکنه که شما به عنوان برنامه نویس، در یک تیم بزرگ مثل یک ارکستر سمفونی و در یک سالن اپرای عظیم ساز بزنید، یا نوازنده ای باشید که برای دل خودتون و تکی می نوازید. در نهایت در کل عالم و هستی،تنها یک شنونده دارید! و خواهید داشت!بهتر اینه که بگم، غیر از اون، هیچ کسی نیست که توانایی شنیدنه آهنگ شما رو داشته باشه!حتما مشتاق اید بدونید اون کیه؟...سیستم عامل!سیستم عامل رو در تخیل خودتون شبیه مردی میان سال و خوش پوش ببینید، که همیشه کفشهاش برق میزنه.اکثر اوقات لبخندی مبهم روی لبهاشه و کارهاش با هوش و آرامش خاصی توامه.همه باور دارند اون لایق مدیرعاملی کامپیوتر هاست...سلطان بدون منازع!ولی خب سیستم عامل وقته اینو نداره که بیاد خودش حضوری آهنگی بشنوه.تنها لطفش در حقتون اینه که حاضره فایل رکورد شده توسط دستیار اول(CLR) ، کمپانی سازنده سازتون(.NET فریم ورک) رو که با نت های 0 و 1 زده شده، تحویل بگیره.اون دستیار اول هم این فایل رو بر مبنای فایل اسمبلی(exe یا dll) ای که منشی(کامپایلر) در اختیارش گذاشته ایجاد کرده.دیدید؟!...پس فکر نکنید اگر ساز زدن بلد هستید، حتما آهنگساز خوبی هم هستید! چون این به هیچ عنوان کافی نیست.برای آهنگساز بودن و موزیسین شدن، باید اولا درک خوبی از نت ها و ملودی ها داشته باشید. و دوما از شنونده ی خودتون و سلایق و هوش موسیقیایی اون هم آگاه باشید. جوری که قریحه ی اش رو بنوازید تا اونم بتونه باز نوازی زیباتری از کارتون رو گوش بده.پس برنامه نویسان دات نت بدونند. فرقی نمیکنه با چه تکنولوژی(asp .NET,.NET Core,Windows Form) و با چه زبانی (++C یا سی شارپ یا اف شارپ و ...) دارید کد میزنید.زمانی موفق هستید که در باره دات نت عمیقا یاد بگیرید و بدونید دارید چی رو کد میزنید و این کد چه اثری بر روی سیستم عامل داره و چطوری میشه کدی نوشت که حافظه بهتر مصرف بشه و در نهایت سرعت بیشتر بشه و در نهایت کد شما بهینه تر و قابل توسعه تر بشه. دونستن اصول دات نت و فهم متقابل اثر کد شما روی خروجی که سیستم عامل از اجرا میاره مهمه. معماری .NETمعماری .NET در تصویر ذیل نشان داده شده است.این معماری بر روی سیستم عامل قرار میگیرد.لایه 1 پایین ترین سطح، و لایه 5 بالاترین سطح آن است و IDE دات نت، Visual Studio می باشد. ابزار قدرتمندی که با محیط گرافیکی خود، قابلیت کد نویسی به زبان های .NET را بسیار آسان کرده و برنامه نویسان را از قابلیت های این معماری بهره مند میکند.معماری .NETماشین مجازی .NET یا همون CLRبا نگاه کلی، .NET از دو بخش اساسی تشکیل شده است:کتابخانه دات نت یا همون Class library .NET ،که متشکل شده از یک سری کلاس های آماده و از پیش نوشته شده، با قابلیت استفاده مجدد، که در دسترس تمامی زبان های برنامه نویسی تحت دات هست و برنامه نویس ها میتونند از اون ها استفاده کنند.ماشین مجازی دات نت یا CLR که مخفف Common Language Runtime هست. که بدون شک اصلی ترین بخش .NET Framework محسوب میشه.بخش های مختلف CLRوظیفه CLR اجرا و مدیریت اجرای کد های نوشته شده تحت فریم ورک یا چهارچوب .NET است.تصویر زیر پروسه ی اجرا شدن کد های نوشته شده تحت فریم ورک دات نت، را نشان میدهد.اتفاقی که زمان Build و Run کردن کد، رخ میدهد.زمان کامپایل یا Buildزبان مشترک حین اجرا یا CLR، تنها یک کد را میفهمد، آن هم کدی به زبان IL یا MSIL است که مخفف Microsoft Intermediate Language می باشد. کامپایلرهای هر زبانی در دات نت، همگی خروجی یکسانی از نظر زبان برنامه نویسی ایجاد میکنند. IL یا MSIL یک زبان میان سطحی است.چیزی شبیه به زبان اسمبلی.کد IL در فایلی تحت عنوان Assembly فایل نگهداری می شود که میتواند یک فایل با پسوند اجرایی یا exe باشد یا فایلی از نوع dll.توی فایل اسمبلی غیر از کد IL اطلاعات مهم دیگه هم هست که خیلی از این اطلاعات در Reflection در دات نت، قابل استفاده مجدد در کد می شوند. که اگر عمری باشه حتما در مورد Reflection خواهم نوشت.فراداده ها یا MetaData هاکه توصیف تمامی Type های استفاده شده و سطح دسترسی ها و ... در کد شماست.مثلا اگر کلاسی داشته باشید به اسم X. و بعد از این کلاس اشیایی با تایپ X ایجاد کرده باشید. تمامی اطلاعات کلاس X به شکل متا دیتا قابل دستیابی هست که چه متغیرهایی داره.چه رفتارهایی داره.چه سطح دسترسی هایی داره و ...خود توصیفی یا Manifest که درباره خود اون فایل Assembly که نسخه اش چیه، از چه کامپایلری اومده و ... توضیحاتی داره.اطلاعات اجرایی یا PE که مخفف Portable Executable می باشد اگر بعد از کامپایل، یک فایل با قابلیت اجرایی ایجاد شد، اطلاعات اجرایی اون فایل رو در یک هدری تحت عنوان PE نگهداری میکنه.زمان اجرا یا RUNبا اجرای برنامه، CLR وارد میشه. سرویسی رو تحت عنوان Class Loader فراخوانی میکنه. این سرویس ، میاد اطلاعات اولیه مورد نیاز جهت اجرا کد، مثل قسمت آغاز شونده کد IL و متا دیتاها رو وارد حافظه میکنه و بارگذاریشون میکنه.بعد این کد بارگذاری شده توسط JIT به کد ماشین تبدیل میشه و در نهایت اجرا میشه.در تمام طول مدت اجرای اون در سطح سیستم عامل، مدیریت و کنترل مدیریت حافظه در زمان اجرا، اعمال Type Safety،کنترل امنیت در اجرای برنامه ها،مدیریت Exception ها، مدیریت نخ هاو ... در حال انجام است.