| کانال توسعه‌دهندگان سی‌شارپ |
1.03K subscribers
19 photos
3 videos
21 links
⭕️ کانال توسعه‌دهندگان سی‌شارپ دولوپیکس

💠 دولوپیکس | جامعه توسعه‌دهندگان ایرانی

💎 @Developix
🚀 Developix.ir

📌 پشتیبانی و تبلیغات:
@DevelopixSupport
Download Telegram
معرفی و نحوه کارکرد دات‌نت

به طور خلاصه، دات‌نت یک پلتفرم برای توسعه اپلیکشن‌های دسکتاپ، موبایل، سرور، وب و 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
👍81🔥1
بررسی CLR - قسمت اول

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
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

هر زبان برنامه‌نویسی با تکنیک‌ها و استراتژی‌های مختلفی با 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
معرفی کلمه‌کلیدی 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
- معرفی BCL

BCL: Base Class Library

قبلا اشاره کردیم که یکی از بخش های اکوسیستم دات‌نت، کتابخانه های اون هستش.

پکیج هایی که از nuget نصب میکنید، همگی بخشی از این کتابخانه ها هستن، مثلا newtonSoft ، automapper ، dapper و...

اما خود دات‌نت به طور مستقل یک کتابخانه مشترک و عمومی در اختیار توسعه دهنده قرار میده که اصطلاحا بهش BCL یا CL میگن؛ BCL بخشی از FCL هست که به طور مشترک در بین تمامی نسخه های دات‌نت وجود داره،
مواردی مثل data type ها مثل string, int, bool و List, Dictionary و تمام موارد این چنینی بخشی از BCL هستن،

درواقع BCL ، اولین خطی هست که توی برنامتون مینویسید(معمولا):
using System;

تمام type ها ، utility ها و بیشتر چیزهایی که از این namespace میاد، بخشی از BCL هست، مثلا:

System.Collections
System.Linq
System.Net
یا کلاس های HttpClient یا Stream

و خیلی مواردی که تا الان بهشون برخوردید همگی بخشی از این کتابخانه مشترک هستن، یکی از موارد مهمی که باید بهش توجه کنید، FCL و تفاوت این دو هست.

- معرفی FCL

FCL : Framework Class Library

مورد قبلی که بهش اشاره کردیم، Base بود ولی الان که کلمه framework رو دیدید احتمالا حدس میزنید که چه فرقی دارن، کاملا اشتباه حدس زدید، FCL مخصوص نسخه های .net framework نیست ، در واقع هیچ ربطی به اسمش نداره (باز هم نامگذاری های مایکروسافت).

‏FCL به تمام کد ها و کتابخانه های ارائه شده توسط دات‌نت گفته میشه، هر کدی که توسط مایکروسافت نوشته شده، توی این دسته قرار میگیره، مثلا asp.net ، wpf, winform و همچنین خود BCL همگی بخشی از FCL هستن؛

پس FCL یک مجموعه کلی از کتابخانه ها و ابزار های مایکروسافت هست که BCL فقط بخشی از اون هست.

اما چه فرقی میکنن ؟ چرا همشون یکجا توی BCL نیستن ؟
همونطور که بالاتر گفتم، BCL توی تمامی نسخه های دات‌نت وجود داره، فرقی نمیکنه سیستم عامل هدف چیه، cpu چی هست یا کدتون اصلا روی یخچال خونه میخواد اجرا بشه یا جای دیگه، هرجا که دات‌نت هست، تمامی کتابخانه های BCL وجود دارن؛
اما FCL محدود به محیط هست، شما طبیعتا روی یک یخچال نمیتونید WPF یا Winform اجرا کنید، اگر دات‌نت ورژن بخصوصی برای یخچال داشته باشه، قطعا شامل System.Windows نمیشه.
خب پس تمام مواردی که بین نسخه های مختلف دات‌نت مشترک هستند، بخشی از BCL هستند؛ و تمام مواردی که مشترک نیستند بخشی از FCL.

#CLR

👤 QWxp

💎 Channel: @DevelopixCSharp
👍9🔥1