Ngôn ngữ C# - CLR

Các thành phần cơ bản của .Net framework

Về cơ bản .Net Framework được chia làm 2 phần là:

  • Common Language Runtime (CLR) : Bộ thực thi ngôn ngữ chung.
  • .Net Framework Class Library

Bộ biên dịch CLR : là 1 thành phần trung tâm của .Net framework với nhiệm vụ thực hiện biên dịch các chương trình. cái nào khủng hay nhanh hay không là đều dựa vào cái trình biên dịch của nó này — cái này bên Java là JVM ( Java Vitual Machine) nhé.

hqdefault.jpg

+ Các dịch vụ mà CLR cung cấp cho ta như sau:

– Nạp và thực thi chương trình
– Phân chia vùng nhớ của ứng dụng
– Xác minh tính an toàn của kiểu dữ liệu
– Dịch mã IL thành mà máy thực thi được
– Cung cấp metadata
– Quản lý bộ nhớ tự động (automatic garbage collection)
– Thực thi bảo mật
– Quản lý lỗi và ngoại lệ
– Hỗ trợ các công việc như debug hoặc profile ứng dụng
– Liên kết với các hệ thống khác

.NET Assemblies

classLib2.png

Sau khi Project .NET được biên dịch, cho dù bạn dùng ngôn ngữ nào thì ngôn ngữ đó đều được đưa về ngôn ngữ CIL. CIL nằm trong khối Assembly, khối này bao gồm các thành phần sau:

  • A Windows file header
  • A CLR file header
  • CIL code
  • Type metadata
  • An assembly manifest
  • Optional embedded resources

Khái niệm thì phức tạp, để đơn giản có thể hiểu một ứng dụng .NET có thể có nhiều assembly và assembly có thể là  *.DLL hoặc *.EXE. Assembly có hai kiểu:

  • Private Assembly: DLL và EXE  chỉ được thực thi bởi một ứng dụng
  • Public/Shared Assembly: DLL có thể được sử dụng bởi nhiều ứng dụng cùng lúc. Loại này thường được lưu trữ tại “C:\Windows\Assembly”
  • Satellite Assembly: Chứa các đối tượng tĩnh và không thể thực thi  ví dụ như ảnh.

 

+ Cách hoạt động của bộ biên dịch: CLR cung cấp môi trường Run-Time, bạn có thể hiểu đó là một môi trường cung cấp các dịch vụ có sẵn để giúp chương trình .NET chạy được và dễ dàng.
Các đoạn mã được viết bằng .Net sẽ được biên dịch thành ra mã trung gian MSIL (Microsoft Intermediate Language). Khi thực thi chương trình 1 lần nữa CLR sẽ biên dịch các mã trung gian MSIL này thành mã máy để thực thi.

Nói một cách khác nó biên dịch assembly thành mã máy. 

 

Quá trình biên dịch và chạy chương trình trên nền .NET

crl execution.png

quatrinhbiendichvachay2.jpg

 

msil.jpg

 

clr2.jpg

 

CLR là gần giống như 1 assemply nhưng không phải là assemply *

=> Vậy vấn đề là tại sao lại cần phải dịch qua ngôn ngữ trung gian: Như ta đã biến thì .Net framework là 1 nền tảng và nó cho phép các ứng dụng họ nhà .Net phát triển các ứng dụng trên nó… Điều này sẽ là mất tri chi phí nếu như 1 chức năng được xây dựng trên ngôn ngữ này khi sang ngôn ngữ khác cũng thuộc họ .Net lại phải phát triển lại… Chẳng hạn viết 1 bộ thư viện xử lý chuỗi trên Visual Basic sang C# lại phải viết lại => .Net framework cung cấp 1 giải pháp biên dịch qua mã trung gian MSIL và Các bộ mã này biên dịch các các mã trung gian này thành các thư viện liên kết động Dynamic Language Linked (DLL) để hỗ trợ cho việc tái sử dụng ..
VD: xây dựng 1 bộ xử lý chuỗi trên C# có thể sử dụng lại trên Visual Basic hay J#, F#, các họ ngôn ngữ nhà .Net mà ko cần xây dựng lại.

Common Type System (CTS)

.NET framework hỗ trợ nhiều ngôn ngữ và đều dùng một thành phần gọi là hệ thống kiểu chung CTS trong CLR. CTS hỗ trợ một loạt kiểu và toán tử có thể thấy trong hầu hết các ngôn ngữ lập trình nên gọi một ngôn ngữ từ một ngôn ngữ khác sẽ không yêu cầu chuyển kiểu. Dẫn đến chúng ta có thể xây dựng các ứng dụng .NET sử dụng cả ngôn ngữ VB.NET lẫn C#, C++…





Tư vấn lộ trình CNTT 🤖