Common Language Runtime (CLR) trong C#

Trong bài viết trước, chúng ta đã tìm hiểu về .NET Framework là gì? Kiến trúc và các thành phần của .NET Framework. Nếu bạn bỏ lỡ bài viết này thì bạn có thể xem ở đây:

Giới thiệu về .NET Framework
Cung cấp cho bạn một cái nhìn tổng quan về .NET Framework, để hiểu rõ các thành phần và kiến trúc của .NET Framework.

Trong bài viết này, chúng ta sẽ tìm hiểu về  Common Language Runtime (CLR) trong C#. Nhưng trước khi bắt đầu, chúng ta sẽ hiểu cách một ứng dụng .NET được biên dịch và chạy.

Ứng dụng .NET được biên dịch và chạy như thế nào?

Để hiểu chính xác một ứng dụng .NET được biên dịch và chạy như thế nào, hãy xem hình ảnh sau đây.

Ứng dụng .NET được biên dịch và chạy như thế nào?

Đầu tiên, nhà phát triển phải viết mã bằng bất kỳ ngôn ngữ lập trình hỗ trợ .NET như C#, VB, J#, v.v. Sau đó, trình biên dịch ngôn ngữ tương ứng sẽ biên dịch chương trình thành một thứ gọi là Common Intermediate Language (CIL - ngôn ngữ trung gian chung).

Ví dụ, nếu ngôn ngữ lập trình là C#, thì trình biên dịch là CSC và nếu ngôn ngữ lập trình là VB, thì trình biên dịch sẽ là VBC.

Ngôn ngữ trung gian chung (CIL) này là mã được biên dịch một nửa tức là mã được biên dịch một phần và không thể được thực thi trực tiếp bởi hệ điều hành.

Vì vậy, khi bạn muốn thực thi mã CIL này trên máy của mình, .NET Framework cung cấp một thứ gọi là Common Language Runtime (CLR - Trình thực thi ngôn ngữ chung) có trách nhiệm thực thi mã CIL của bạn.

CLR lấy mã CIL (Ngôn ngữ trung gian chung) và đưa nó cho một thứ gọi là Trình biên dịch JIT (Just-in-Time). Trình biên dịch JIT sẽ đọc mã CIL và chuyển đổi nó thành các lệnh dành riêng cho máy (tức là thành định dạng nhị phân) có thể được thực thi bởi hệ điều hành bên dưới.

Common Intermediate Language (CIL)

Common Intermediate Language (CIL - Ngôn ngữ trung gian chung) còn được gọi là Microsoft Intermediate Language (MSIL - Ngôn ngữ trung gian Microsoft) hay Intermediate Language (IL - Ngôn ngữ trung gian) là một tập hợp các hướng dẫn độc lập với nền tảng và được tạo bởi trình biên dịch dành riêng cho ngôn ngữ từ mã nguồn.

CIL độc lập với nền tảng và do đó, nó có thể được thực thi trên bất kỳ môi trường nào được hỗ trợ Cơ sở hạ tầng ngôn ngữ chung như Windows .NET runtime.

CIL được trình biên dịch JIT chuyển đổi thành mã máy cụ thể trong môi trường máy tính cụ thể. Điều này được thực hiện trước khi CIL có thể được thực thi. Ngoài ra, CIL được chuyển đổi thành mã máy trên cơ sở yêu cầu, tức là trình biên dịch JIT biên dịch CIL theo yêu cầu thay vì biên dịch toàn bộ nó.

Tại sao mã được biên dịch thành CIL?

Là một nhà phát triển, bạn có thể đang suy nghĩ về lý do tại sao mã được biên dịch thành CIL mà không biên dịch thành mã máy luôn.

Lý do rất đơn giản. Chúng ta không biết mã chương trình sẽ chạy trong môi trường nào (ví dụ: Windows XP, Windows 7, Windows 10, Windows Server, v.v.).

Nói cách khác, chúng ta không biết hệ điều hành nào sẽ chạy ứng dụng của chúng ta. Chúng ta cũng không biết loại CPU, cấu hình máy, cấu hình bảo mật, v.v. Vì vậy, mã ứng dụng được biên dịch một phần thành CIL và được trình biên dịch JIT biên dịch thành mã máy trong thời gian chạy.

Mã CIL này được biên dịch theo các hướng dẫn dành riêng cho máy sử dụng các thuộc tính môi trường như phiên bản hệ điều hành, loại CPU, cấu hình máy, v.v.

Common Language Runtime (CLR)

Common Language Runtime (CLR - Trình thực thi ngôn ngữ chung) là trung tâm của .NET Framework và nó  chứa các thành phần sau:

  1. Security Manager
  2. JIT Compiler
  3. Memory Manager
  4. Garbage Collector
  5. Exception Manager
  6. Common Language Specification (CLS)
  7. Common Type System (CTS)

Hãy để chúng tôi thảo luận chi tiết từng thành phần này làm gì.

Security Manager

Về cơ bản có hai thành phần để quản lý bảo mật. Chúng là:

  1. Code Access Security (CAS): Bảo mật truy cập mã.
  2. Code Verification (CV): Xác minh mã.

Hai thành phần này về cơ bản được sử dụng để kiểm tra các đặc quyền của người dùng hiện tại rằng người dùng có được phép truy cập vào assembly hay không.

CLR cũng xem mã này có những quyền gì hoặc loại quyền hạn nào và liệu nó có an toàn khi được thực thi bởi hệ điều hành hay không. Vì vậy, về cơ bản, các loại kiểm tra này được duy trì bởi Trình quản lý bảo mật.

JIT Compiler

Trình biên dịch JIT (Just-in-time) chịu trách nhiệm chuyển đổi mã CIL thành mã máy được thực thi bởi máy. Phần cứng hệ thống có thể hiểu và thực thi mã máy. JIT biên dịch mã ngay trước khi thực thi và sau đó lưu bản dịch này vào bộ nhớ.

Memory Manager

Thành phần trình quản lý bộ nhớ phân bổ bộ nhớ cần thiết cho các biến và đối tượng sẽ được ứng dụng sử dụng.

Garbage Collector

Khi một ứng dụng .NET chạy, rất nhiều đối tượng và biến được tạo ra. Tại một thời điểm nhất định, có thể chúng ta không cần những đối tượng này.

Khi đó, Garbage Collector sẽ cố gắng xác định những đối tượng nào hiện không được ứng dụng sử dụng nữa và thu hồi bộ nhớ của những đối tượng đó.

Exception Manager

Thành phần Trình quản lý ngoại lệ của CLR chuyển hướng bộ xử lý để thực thi các khối lệnh catch hoặc finally bất cứ khi nào có ngoại lệ xảy ra trong thời gian chạy.

Common Type System (CTS)

.NET Framework hỗ trợ nhiều ngôn ngữ lập trình như C#, VB.NET, J#, v.v. Mỗi ngôn ngữ lập trình đều có kiểu dữ liệu riêng. Một ngôn ngữ lập trình không thể hiểu các kiểu dữ liệu của ngôn ngữ lập trình khác.

Tuy nhiên, có thể có những tình huống khi bạn muốn viết mã bằng một ngôn ngữ được gọi bằng các ngôn ngữ khác. Để đảm bảo giao tiếp thông suốt giữa các ngôn ngữ này, điều quan trọng nhất là chúng phải có một hệ thống kiểu dữ liệu chung (CTS) đảm bảo rằng kiểu được xác định bằng hai ngôn ngữ khác nhau được biên dịch thành một kiểu dữ liệu chung.

CLR sẽ thực thi tất cả các kiểu dữ liệu của ngôn ngữ lập trình; điều này là có thể bởi vì CLR sẽ chứa các kiểu dữ liệu chung cho tất cả các ngôn ngữ lập trình.

Tại thời điểm biên dịch, tất cả các kiểu dữ liệu theo ngôn ngữ cụ thể được chuyển đổi thành kiểu dữ liệu của CLR. Hệ thống kiểu dữ liệu CLR này chung cho tất cả các ngôn ngữ lập trình của .NET được gọi là Hệ thống kiểu chung (CTS).

Common Language Specification (CLS)

Common Language Specification (CLS) là một phần của CLR. .NET hỗ trợ nhiều ngôn ngữ lập trình và mọi ngôn ngữ lập trình đều có các quy tắc cú pháp riêng để viết mã được gọi là đặc tả ngôn ngữ tức là mọi ngôn ngữ lập trình đều có đặc tả ngôn ngữ riêng.

Một ngôn ngữ lập trình không thể hiểu các quy tắc cú pháp của ngôn ngữ lập trình khác (đặc tả ngôn ngữ). Nhưng CLR sẽ thực thi tất cả mã ngôn ngữ lập trình. Điều này có thể xảy ra vì CLR không thể hiểu bất kỳ đặc tả ngôn ngữ lập trình nào thay vì CLR có đặc tả ngôn ngữ riêng (quy tắc cú pháp) cho CIL của nó.

Mọi trình biên dịch ngôn ngữ phải tuân theo đặc tả ngôn ngữ này của CLR tại thời điểm biên dịch và phải tạo CIL. Trình biên dịch JIT của CLR sẽ tạo mã máy từ CIL. Đặc tả ngôn ngữ này của CLR là chung cho tất cả các ngôn ngữ lập trình thực thi mã của .NET và được gọi là CLS.

Lập Trình C#.NET Framework
Bài Viết Liên Quan:
Garbage Collector (GC) trong C#
Trung Nguyen 29/03/2021
Garbage Collector (GC) trong C#

Bạn sẽ tìm hiểu về Garbage Collector (GC) của .NET quản lý việc cấp phát và giải phóng bộ nhớ cho ứng dụng của bạn.

Giới thiệu về .NET Framework
Trung Nguyen 29/03/2021
Giới thiệu về .NET Framework

Cung cấp cho bạn một cái nhìn tổng quan về .NET Framework, để hiểu rõ các thành phần và kiến trúc của .NET Framework.

int[] và int[,] trong C#: Ai nhanh hơn
Trung Nguyen 10/10/2020
int[] và int[,] trong C#: Ai nhanh hơn

Hiểu được sự khác biệt giữa các loại mảng trong C# sẽ giúp bạn chọn cấu trúc dữ liệu chính xác cho mọi trường hợp.

Struct và class trong C#: Ai nhanh hơn
Trung Nguyen 09/10/2020
Struct và class trong C#: Ai nhanh hơn

Trong bài viết này, tôi sẽ so sánh sự khác biệt về hiệu suất giữa struct và class trong C#: Ai nhanh hơn.