معرفی و نحوه کارکرد داتنت
به طور خلاصه، داتنت یک پلتفرم برای توسعه اپلیکشنهای دسکتاپ، موبایل، سرور، وب و
این پلتفرم به طور کلی شامل سه قسمت اصلی هست:
این نسخه برخلاف نسخههای قبلی،
نحوه کارکرد
زمانی که یک کد سیشارپ (یا
وقتی کدتون رو
بعد از تبدیل کدهای شما به
----
به زبان ساده، کدهای شما در زمان
توی قسمتهای بعدی جزئیات این فرایند و
#CLR
👤 QWxp
💎 Channel: @DevelopixCSharp
به طور خلاصه، داتنت یک پلتفرم برای توسعه اپلیکشنهای دسکتاپ، موبایل، سرور، وب و
IOT و بازی هست.این پلتفرم به طور کلی شامل سه قسمت اصلی هست:
1.Languages: C#, F#, Vb, Q# ...etc
2.Runtimes: CLR
3.Libraries: BCL, packages ...etc
اولین نسخه در سال 2002~ تحت عنوان dotnet framework 1.0 منتشر شد که مخصوص توسعه اپلیکیشنهای ویندوز بود؛ تا حدود سال 2016، یک successor با عنوان dotnet core 1.0 معرفی شد. (توسعه نسخه framework همچنان ادامه داره و اخرین نسخه، 4.8.1 حوالی سال 2022 منتشر شده)این نسخه برخلاف نسخههای قبلی،
open-source و cross-platform بود که تحول نسبتاً بزرگی به حساب میومد.نحوه کارکرد
زمانی که یک کد سیشارپ (یا
F# ,vb و بقیه زبانهای داتنت) مینویسید، کد شما برعکس زبانهایی مثل C/CPP و Rust و ... به زبان ماشین تبدیل نمیشن.وقتی کدتون رو
compile میکنید، کدهای شما توسط CLR (در ادامه راجبش صحبت میکنیم) به یک زبان میانی به اسم MSIL یا همون CIL تبدیل میشن.MS-IL: Microsoft Intermediate Language.
CIL : Common Intermediate Lanauge.
(هردو یکی هستن که به طور خلاصه بهشون IL میگیم، نامگذاریهای مایکروسافته دیگه)بعد از تبدیل کدهای شما به
IL، در زمان اجرا تمامی این کدها توسط یک compiler دیگه به اسم JIT به کدهای native یا کدهای قابل فهم machine تبدیل میشن.----
به زبان ساده، کدهای شما در زمان
compile به یک زبان دیگه تبدیل و وقتی برنامتون رو اجرا میکنید، در لحظه اجرا، اون کدها به زبان ماشین تبدیل و اجرا میشن.توی قسمتهای بعدی جزئیات این فرایند و
CLR رو بررسی میکنیم.#CLR
👤 QWxp
💎 Channel: @DevelopixCSharp
👍8❤1🔥1
بررسی CLR - قسمت اول
مهمترین اونها:
که البته سعی میکنم راجب همشون صحبت کنم ولی قبلش باید دقیقا متوجه بشیم که چه اتفاقی برای کد های ما میوفته؛ بعد از تبدیل کد های ما به
زمانی که شما یک کد
اما برای زبان های داتنتی و به طور کلی زبان هایی که روی
به طور خلاصه،
1. نقش JIT
در مرحله اول، کد های
توجه داشته باشید که
2. وظیفه CL
#CLR #JIT
👤 QWxp
💎 Channel: @DevelopixCSharp
CLR: Common Language Runtime
(JVM in Java)
کدهای سیشارپ مثل جاوا، روی یک virtual machine اجرا میشن، یک محیط ایزوله و managed شده که وظیفه کنترل و مانیتور کد هارو به عهده داره. CLR از اجزای مختلفی تشکیل شده،مهمترین اونها:
JIT, CL, CTS, CLS, Memory Manager, GC, Security Manager, Thread Manager, Exception Manager
هستن.که البته سعی میکنم راجب همشون صحبت کنم ولی قبلش باید دقیقا متوجه بشیم که چه اتفاقی برای کد های ما میوفته؛ بعد از تبدیل کد های ما به
IL ، چالش اصلی، محیطی هست که کد های ما قراره داخلش اجرا بشن، یکی از دلایل وجود CLR و JIT هم همینه؛ کد های IL ای که برای ما تولید شدن، مربوط به هیچ سیستم عامل بهخصوصی نیستن، درواقع IL ساخته شده قابلیت اینو داره که روی تمام سیستم ها اجرا بشه ، چیزی که توی زبان های native طبیعتا امکان پذیر نیست.زمانی که شما یک کد
C/CPP رو Compile میکنید، کد های شما مخصوص یک محیط، یک CPU و معماری هستن، کد های تولید شده امکان اجرا روی محیط های دیگه رو ندارن، اگه برای ویندوز کد نوشتید، کد شما روی لینوکس اجرا نمیشه و برعکس ... اما برای زبان های داتنتی و به طور کلی زبان هایی که روی
VM اجرا میشن اینطور نیست.به طور خلاصه،
CLR به ما کمک میکنه که کدهامون رو توی محیط های مختلف اجرا کنیم1. نقش JIT
JIT: Just-In-Time Compiler
با درنظر گرفتن تمام این موارد، چطور کد های IL روی سیستم های مختلف قابل اجرا هستن؟ در مرحله اول، کد های
IL شما به وسیله JIT، به کد های native تبدیل میشن، اگر برنامه شما روی لینوکس اجرا میشه ، JIT کد های IL رو برای لینوکس compile میکنه، و اگر روی ویندوز اجرا بشه ، برای ویندوز؛ به این فرایند اصطلاحا JIT'ing گفته میشه.توجه داشته باشید که
JIT فقط کد هایی رو تبدیل به native میکنه که CL اونهارو Load کرده باشه.2. وظیفه CL
CL: Class Loader
احتمالا خودتون میتونید حدس بزنید که نقش CL چیه، وظیفه مدیریت و load کردن کلاس ها به عهده CL هست، زمانی که یک کلاس رو توی کد استفاده میکنید، تا زمانی که برنامه به اون قسمت از کد نرسه، کلاس رو Load نمیکنه، به محض نیاز، کلاس توسط CL توی حافظه load میشه و بعد از استفاده هم طبیعتا از بین میره.#CLR #JIT
👤 QWxp
💎 Channel: @DevelopixCSharp
👍5🔥2
بررسی CLR - قسمت دوم
3.وظیفه CTS
تمامی زبان های داتنت درنهایت از یک
نقش
برای درک بهتر، یک
این سه
پس متوجه شدیم که وظیفه
4.بررسی CLS
هر زبان، تحت قوانین مشترکی نوشته و پیاده سازی میشه که درنتیجه، باعث میشه تمام زبان ها یک ساختار رو داشته باشن ولی با شکل و شمایل مختلف.
به عنوان مثال ، در هر سه زبان
تمام این قوانین توسط
به زبان ساده،
#CLR #CTS #CLS
👤 QWxp
💎 Channel: @DevelopixCSharp
3.وظیفه CTS
CTS: Common Type System
هر زبان برنامه نویسی، یک type system داره که مختص همون زبان هست. مشخصا type های زبان Go توسط زبان Rust قابل درک نیست و ... ؛ اما برای داتنت اینطور نیست.تمامی زبان های داتنت درنهایت از یک
type system واحد استفاده میکنن که در واقع همون CTS هست.نقش
CTS، کنترل و مدیریت type ها در managed code هست. برای درک بهتر، یک
value type مثل INT رو درنظر بگیرید، این type در تمام زبان ها وجود داره، توی سیشارپ و افشارپ به عنوان int میشناسیمش، توی vb به عنوان integer.این سه
type ، همشون درنهایت باید به type قابل درک برای IL تبدیل بشن، که توی این مثال int32 هست.پس متوجه شدیم که وظیفه
CTS ، تبدیل تایپ type های ما به type های قابل درک CLR و مدیریت اون ها هست.4.بررسی CLS
CLS : Common Language Specification
زبان های داتنتی قابلیت این رو دارن که باهم ترکیب بشن، به عنوان مثال ، شما میتونید از یک کتابخانه ای که به زبان C# نوشته شده ، توی F# یا VB استفاده کنید، با برعکس ، این قابلیت به لطفا قوانین مشترک زبان های داتنت وجود داره .هر زبان، تحت قوانین مشترکی نوشته و پیاده سازی میشه که درنتیجه، باعث میشه تمام زبان ها یک ساختار رو داشته باشن ولی با شکل و شمایل مختلف.
به عنوان مثال ، در هر سه زبان
c#, f# ,vb فانکشن ها دارای اسم، ورودی، خروجی و .. هستن، شاید چیدمان یا نحوه تعیین کردنشون متفاوت باشه ، اما درنهایت برای IL ، هر سه زبان یکی هستن.تمام این قوانین توسط
CLS کنترل و مدیریت میشن.به زبان ساده،
CLS قابلیت همکاری یا Interoperability رو به زبان های داتنتی میده. زبان هایی که تحت قوانین CLS پیاده سازی میشن، به اصطلاح CLS complaint هستن.#CLR #CTS #CLS
👤 QWxp
💎 Channel: @DevelopixCSharp
👍4🔥1
بررسی CLR - قسمت سوم
5. وظیفه Memory Manager
هر زبان برنامهنویسی با تکنیکها و استراتژیهای مختلفی با
نقش
6. وظیفه GC
7.وظیفه Security Manager
قبل از اجرای کدهای شما،
8.وظیفه Thread Manager
ساخت
9.وظیفه Exception Manager
وقتی یک
#CLR #GC
👤 QWxp
💎 Channel: @DevelopixCSharp
5. وظیفه Memory Manager
هر زبان برنامهنویسی با تکنیکها و استراتژیهای مختلفی با
memory ارتباط برقرار میکنه؛ در زبانهایی مثل C/CPP این کار به صورت کاملا دستی و توسط برنامهنویس انجام میشه، زبانهایی مثل سیشارپ و جاوا، به طور خودکار این موضوع رو مدیریت میکنن و برنامهنویس نیازی به انجام این کار نداره.نقش
Memory Manager مدیریت رم به طور خودکار هست، زمانی که یک متغیر تعریف میکنید، یک متغیر رو صدا میزنید و یا تغییرش میدید، تمام مسائل مربوط به رم توسط Memory Manager کنترل میشه.6. وظیفه GC
GC: Garbage Collector
توی قسمت قبل گفتیم که وظیفه ساخت متغیر و ... به عهده memory manager هست، اما وظیفه حذف و جابجایی و ... به عهده کیه؟GC مسئول کنترل و حذف دیتای استفاده نشده داخل مموری هست.7.وظیفه Security Manager
قبل از اجرای کدهای شما،
CLR ملزم به چک کردن Permission های مورد نیاز برنامه، بررسی سالم بودن و الوده نشدن کدها توسط عوامل خارجی و ... هست. تمام این کارها توسط Security Manager انجام میشه.8.وظیفه Thread Manager
ساخت
Thread اصلی برنامه یا Main Thread، قابلیت ایجاد و دسترسی به sub-thread ها و کنترل ThreadPool به عهده این سرویس هست.9.وظیفه Exception Manager
وقتی یک
Exception رخ میده، تمام اطلاعاتی که همراهش ایجاد میشه مثل stack trace، اجرای Catch Block، دنبال کردن سلسله مراتب break و return ها، تماماً توسط Exception manager کنترل میشه.#CLR #GC
👤 QWxp
💎 Channel: @DevelopixCSharp
👍5🔥1
معرفی کلمهکلیدی
هر کدی که در
کد امن کدی هست که مستقیم به
درنتیجه کدهایی که به صورت
به دو صورت میتونید از
1.modifier:
2.scopped (block):
نکته: کلمه
#unsafe
👤 QWxp
💎 Channel: @DevelopixCSharp
unsafe
کاری که این keyword انجام میده اینه که context رو از حالت امن خارج میکنه.هر کدی که در
unsafe context نوشته بشه تضمینی از سمت compiler و CLR برای امن بودنش وجود نداره.کد امن کدی هست که مستقیم به
memory دسترسی نداره، از pointer استفاده نمیکنه، توسط GC مدیریت میشه و کاربر نقشی توی کار با مموری ایفا نمیکنه.درنتیجه کدهایی که به صورت
unsafe نوشته میشه، میتونن دقیقا مثل زبان های C/CPP برنامه نویس رو با مشگلات memory مواجه کنند.به دو صورت میتونید از
unsafe استفاده کنید:1.modifier:
unsafe void MyFunc(){}
هرچیزی که اینجا تعریف بشه کلا unsafe هست؛2.scopped (block):
void MyFunc(){
//safe
unsafe{
//unsafe
}
}
اینجا هرکدی که داخل unsafe block باشه ، طبیعتا unsafe هست و بیرون از این block کد ها safe هستن.نکته: کلمه
unsafe به خودی خود تاثیری روی IL یا JIT به طور مستقیم نداره، میشه گفت نوشتن این کلمه، صرفا یک مجوز برای کامپایل هست، نه بیشتر.#unsafe
👤 QWxp
💎 Channel: @DevelopixCSharp
👍7