Ngôn ngữ trung gian chung hoặc Ngôn ngữ trung gian dùng chung (Common Intermediate Language - CLI), là ngôn ngữ lập trình có thể đọc được của con người ở mức thấp nhất được xác định bởi đặc tả Cơ sở chung hạ tầng ngôn ngữ (CLI) và được .NET Framework và Mono sử dụng. Ngôn ngữ nhắm mục tiêu một môi trường thời gian chạy tương thích với CLI biên dịch tới CIL, được lắp ráp thành một mã đối tượng có định dạng bytecode. CIL là một ngôn ngữ lắp ráp hướng đối tượng, và hoàn toàn dựa trên stack. Bytecode của nó được dịch sang mã gốc hoặc - thường được thực hiện bởi một máy ảo.
CIL ban đầu được gọi là Ngôn ngữ trung gian dùng chung của Microsoft (MSIL) trong phiên bản beta của các ngôn ngữ.NET. Do tiêu chuẩn hoá C # và cơ sở ngôn ngữ dùng chung, bytecode được chính thức gọi là CIL.
Thông tin tổng quan
Trong quá trình biên soạn ngôn ngữ lập trình CLI, mã nguồn được dịch sang mã CIL thay vì mã đối tượng trên nền tảng hoặc bộ xử lý cụ thể. CIL là một tập lệnh độc lập với nền tảng CPU và nền tảng có thể được thực hiện trong bất kỳ môi trường hỗ trợ Cơ sở ngôn ngữ dùng chung, chẳng hạn như .NET runtime trên Windows, hoặc nền tảng Mono. Về lý thuyết thì điều này giúp loại bỏ sự cần thiết của việc phân phối các tập tin thực thi khác nhau cho các nền tảng khác nhau và các loại CPU. Mã CIL được xác minh để đảm bảo an toàn trong suốt thời gian chạy, cung cấp sự bảo mật và độ tin cậy cao hơn so với các tệp thực thi truyền thống.
Quy trình thực hiện như sau:
Mã nguồn được chuyển sang CIL tức là Ngôn ngữ trung gian chung, là ngôn ngữ tương đương của CLI so với ngôn ngữ assembly của CPU.
CIL sau đó được biên soạn thành dạng bytecode, và phiên bản assembly CLI được tạo ra.
Khi thực hiện tổng hợp CLI, mã của nó được truyền qua trình biên dịch JIT của thời gian chạy để tạo ra mã nguồn gốc.
Bộ xử lý của máy tính thực thi mã nguồn được tạo ra.
Các tập lệnh
Bytecode CIL có các tập lệnh cho các nhóm tác vụ sau:
- Load và lưu
- Số học
- Chuyển đổi
- Tạo và quản lý đối tượng
- Quản lý việc xếp chồng toán hạng (push/pop)
- Kiểm soát việc chuyển nhánh
- Gọi phương thức và trả về
- Ném ngoại lệ
- Đồng bộ hóa
- Dữ liệu và chức năng con trỏ chức năng cần thiết cho C++/CLI và mã C# không an toàn.
Mô hình tính toán
Ngôn ngữ trung gian chung là hướng đối tượng và dựa trên ngăn xếp (stack). Điều đó có nghĩa là dữ liệu được đẩy vào ngăn xếp thay vì lấy từ thanh ghi (register) như trong hầu hết các kiến trúc CPU.
Trong x86 nó có thể trông như thế này:
add eax, edx
Khi đó, mã tương ứng ở CLI sẽ như thế này:
ldloc.0
ldloc.1
add
stloc.0 // a = a + b or a += b;
### Khái niệm hướng đối tượng
Điều này cũng mở rộng cho các khái niệm hướng đối tượng. Bạn có thể tạo các đối tượng, gọi phương thức, tương tác với các field...
CIL được thiết kế để định hướng cho đối tượng và mọi phương thức nếu cần (với một số ngoại lệ) vào trong một lớp. Phương thức static này cũng vậy:
.class public Foo
{
.method public static int32 Add(int32, int32) cil managed
{
.maxstack 2
ldarg.0 // tải số đầu tiên;
ldarg.1 // tải số thứ hai;
add // cộng hai số;
ret // trả kết quả về;
}
}
Phương thức này không yêu cầu bất kỳ instance nào của Foo được khai báo vì nó là static. Điều đó có nghĩa nó thuộc về lớp và sau đó nó có thể được sử dụng như thế này trong C #:
int r = Foo.Add(2, 3); // 5
Trong CIL:
ldc.i4.2
ldc.i4.3
call int32 Foo::Add(int32, int32)
stloc.0
Các lớp instance
Một lớp instance chứa ít nhất một constructor và một số thành viên instance. Lớp này có một tập hợp các phương thức đại diện cho hành động của đối tượng Car.
.class public Car
{
.method public specialname rtspecialname instance void.ctor(int32, int32) cil managed
{
/* Constructor */
}
.method public void Move(int32) cil managed
{
/ Bỏ qua việc hiện thực hóa /
}
.method public void TurnRight() cil managed
{
/ Bỏ qua việc hiện thực hóa /
}
.method public void TurnLeft() cil managed
{
/ Bỏ qua việc hiện thực hóa /
}
.method public void Brake() cil managed
{
/ Bỏ qua việc hiện thực hóa /
}
}
#### Tạo đối tượng
Trong C#, các instance được tạo ra như thế này:
Car myCar = new Car(1, 4);
Car yourCar = new Car(1, 3);
Trong CIL:
ldc.i4.1
ldc.i4.4
newobj instance void Car::.ctor(int, int)
stloc.0 // myCar = new Car(1, 4);
ldc.i4.1
ldc.i4.3
newobj instance void Car::.ctor(int, int)
stloc.1 // yourCar = new Car(1, 3);
#### Gọi phương thức của instance:
Các phương thức của instance được gọi như sau:
myCar.Move(3);
Trong CIL:
ldloc.0 // tải đối tượng "myCar" từ stack
ldc.i4.3
call instance void Car::Move(int32)
### Metadata
CLI ghi lại thông tin về các lớp được biên dịch dưới dạng metadata. Giống như thư viện kiểu trong Mô hình Đối tượng Thành phần, điều này cho phép các ứng dụng hỗ trợ và khám phá các interface, lớp, các kiểu dữ liệu, phương thức, và các trường trong assembly. Quá trình đọc siêu dữ liệu như vậy được gọi là sự phản chiếu.
Metadata có thể là dữ liệu ở dạng thuộc tính (attributes). Thuộc tính có thể được tạo ra thủ công bằng cách mở rộng lớp Attribute
. Đây là một tính năng rất mạnh, cho phép lập trình viên khi tạo các lớp có thể bổ sung các thông tin bổ sung mà người sử dụng lớp có thể sử dụng theo những cách khác nhau có tùy thuộc vào miền ứng dụng.
Ví dụ
Dưới đây là chương trình Hello, World được viết trong CIL:
.assembly Hello {}
.assembly extern mscorlib {}
.method static void Main()
{
.entrypoint
.maxstack 1
ldstr "Hello, world!"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
Chương trình sau sử dụng các dạng số phức tạp hơn của opcode
Đoạn mã này cũng có thể được so sánh với đoạn mã tương ứng trong bài viết về Java bytecode.
static void Main(string[] args)
{
for (int i = 2; i < 1000; i++)
{
for (int j = 2; j < i; j++)
{
if (i % j == 0)
goto outer;
}
Console.WriteLine(i);
outer:;
}
}
Trong CIL, chương trình trên trở thành:
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 2
.locals init (int32 V_0,
int32 V_1)
ldc.i4.2
stloc.0
br.s IL_001f
IL_0004: ldc.i4.2
stloc.1
br.s IL_0011
IL_0008: ldloc.0
ldloc.1
rem
brfalse.s IL_001b
ldloc.1
ldc.i4.1
add
stloc.1
IL_0011: ldloc.1
ldloc.0
blt.s IL_0008
ldloc.0
call void [mscorlib]System.Console::WriteLine(int32)
IL_001b: ldloc.0
ldc.i4.1
add
stloc.0
IL_001f: ldloc.0
ldc.i4 0x3e8
blt.s IL_0004
ret
}
Thực thi
Biên dịch kiểu just-in-time
Biên dịch kiểu just-in-time (JIT) liên quan đến việc biến mã byte thành các đoạn mã có thể được thực thi ngay lập tức bởi CPU. Việc chuyển đổi được thực hiện dần dần trong quá trình thực thi của chương trình. Biên dịch JIT hỗ trợ tối ưu hóa môi trường cụ thể, an toàn kiểu, và xác minh assembly. Để thực hiện điều này, trình biên dịch JIT kiểm tra metadata của assembly đối với bất kỳ lượt truy cập bất hợp pháp nào, và xử lý các hành vi vi phạm một cách thích hợp.
Biên dịch kiểu ahead-of-time
Các môi trường thực thi tương thích với CLI cũng đi kèm với tùy chọn biên dịch ahead-of-time (AOT) của một assembly để giúp nó chạy nhanh hơn bằng cách loại bỏ quá trình JIT khi chạy.
Trong .NET Framework có một công cụ đặc biệt được gọi là Native Image Generator (NGEN) thực hiện AOT. Trong Mono cũng có tùy chọn để thực hiện AOT.
Tập lệnh con trỏ - C++/CLI
Sự khác biệt rất lớn giữa CLI với bytecode của Java là CIL có các lệnh ldind, stind, ldloca, và nhiều lệnh khác để gọi và thao tác với con trỏ dữ liệu/chức năng.
class A {
public: virtual void __stdcall meth() {}
};
void test_pointer_operations(int param) {
int k = 0;
int * ptr = &k;
*ptr = 1;
ptr = ¶m;
*ptr = 2;
A a;
A * ptra = &a;
ptra->meth();
}
Mã tương ứng trong CLI là:
.method assembly static void modopt([mscorlib]System.Runtime.CompilerServices.CallConvCdecl)
test_pointer_operations(int32 param) cil managed
{
.vtentry 1: 1
// Code size 44 (0x2c)
.maxstack 2
.locals ([0] int32* ptr,
[1] valuetype A* V_1,
[2] valuetype A* a,
[3] int32 k)
// k = 0;
IL_0000: ldc.i4.0
IL_0001: stloc.3
// ptr = &k;
IL_0002: ldloca.s k // tải địa chỉ tập lệnh địa phương
IL_0004: stloc.0
// *ptr = 1;
IL_0005: ldloc.0
IL_0006: ldc.i4.1
IL_0007: stind.i4 // indirection instruction
// ptr = ¶m
IL_0008: ldarga.s param // tải tham số địa chỉ của tập lệnh
IL_000a: stloc.0
// *ptr = 2
IL_000b: ldloc.0
IL_000c: ldc.i4.2
IL_000d: stind.i4
// a = new A;
IL_000e: ldloca.s a
IL_0010: call valuetype A* modopt([mscorlib]System.Runtime.CompilerServices.CallConvThiscall) 'A.{ctor}'(valuetype A* modopt([mscorlib]System.Runtime.CompilerServices.IsConst) modopt([mscorlib]System.Runtime.CompilerServices.IsConst))
IL_0015: pop
// ptra = &a;
IL_0016: ldloca.s a
IL_0018: stloc.1
// ptra->meth();
IL_0019: ldloc.1
IL_001a: dup
IL_001b: ldind.i4 // đọc VMT cho việc gọi hàm virtual
IL_001c: ldind.i4
IL_001d: calli unmanaged stdcall void modopt([mscorlib]System.Runtime.CompilerServices.CallConvStdcall)(native int)
IL_0022: ret
} // kết thúc phương thức "Global Functions"::test_pointer_operations
👁️
0 | 🔗 | 💖 | ✨ | 🌍 | ⌚
**Ngôn ngữ trung gian chung **hoặc **Ngôn ngữ trung gian dùng chung** (**Common Intermediate Language - CLI**), là ngôn ngữ lập trình có thể đọc được của con người ở mức thấp nhất được xác
Một **ngôn ngữ phụ trợ quốc tế** (trong tiếng Anh đôi khi được viết tắt là **IAL** hoặc **auxlang**) hoặc **interl Language** là một ngôn ngữ có nghĩa là để giao tiếp giữa những người
**C** là một ngôn ngữ mệnh lệnh được phát triển từ đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, ngôn ngữ này đã lan rộng ra nhiều
phải|nhỏ|402x402px|[[Mã nguồn của một chương trình máy tính đơn giản được viết bằng ngôn ngữ lập trình C. Khi được biên dịch và chạy, nó sẽ cho kết quả "Hello, world!".]] **Ngôn ngữ lập trình**
**Cơ sở ngôn ngữ dùng chung** hoặc **Cơ sở hạ tầng ngôn ngữ dùng chung** (**Common Language Infrastructure - CLI**) là một tiêu chuẩn kỹ thuật được phát triển bởi Microsoft và được tiêu chuẩn
nhỏ|Giao tiếp phi ngôn ngữ giữa hai người tại [[Tây An, Trung Quốc.]] **Giao tiếp phi ngôn ngữ** giữa con người là sự giao tiếp bằng cách gửi và nhận những tín hiệu phi ngôn
**Ngôn ngữ** là một hệ thống giao tiếp có cấu trúc được sử dụng bởi con người. Cấu trúc của ngôn ngữ được gọi là ngữ pháp, còn các thành phần tự do của nó
**Ngôn ngữ LGBT** là môn nghiên cứu từ ngữ của cộng đồng LGBT. Các thuật ngữ liên quan hoặc đồng nghĩa phát triển bởi William Leap vào những năm 1990, bao gồm **ngôn ngữ màu
phải|Bản đồ ngôn ngữ của châu Âu (đơn giản hóa). **Ngôn ngữ học châu Âu** là ngành ngôn ngữ học khá mới mẻ, nghiên cứu về các ngôn ngữ tại châu Âu. Tuy nhiên, ở
**Pascal** là một ngôn ngữ lập trình cho máy tính thuộc dạng mệnh lệnh và thủ tục, được Niklaus Wirth phát triển vào năm 1970. Pascal là ngôn ngữ lập trình đặc biệt thích hợp
**Ngôn ngữ học** hay **ngữ lý học** là bộ môn nghiên cứu về ngôn ngữ. Người nghiên cứu bộ môn này được gọi là nhà ngôn ngữ học. Nói theo nghĩa rộng, nó bao gồm
nhỏ|Tấm biển tại [[Ung Hòa cung tại Bắc Kinh, Trung Quốc, từ phải sang trái viết bằng tiếng Mãn, tiếng Hán, tiếng Tạng, tiếng Mông Cổ.]] nhỏ|phải|Biểu trưng của chính quyền Liên bang [[Thụy Sĩ,
**Giao tiếp qua máy tính** **trung gian**, còn được gọi là CMC (viết tắt của Computer Mediated Communication) được định nghĩa là bất kỳ giao tiếp nào của con người xảy ra thông qua việc
**C#** (**C Sharp**, đọc là _"xi-sáp"_) là một ngôn ngữ lập trình hướng đối tượng đa năng, mạnh mẽ được phát triển bởi Microsoft, C# là phần khởi đầu cho kế hoạch .NET của họ.
thumb|Các ngôn ngữ ở Hồng Kông Luật Cơ bản của Hồng Kông quy định tiếng Anh và tiếng Trung là hai ngôn ngữ chính thức của Hồng Kông. Trong thời kỳ thuộc địa của Anh,
thumb|**[[Phép tính lambda** là một hệ thống hình thức để định nghĩa hàm, ứng dụng hàm và đệ quy được Alonzo Church đề xuất vào những năm 193x.]] **Lý thuyết ngôn ngữ lập trình** (thường
Trung Quốc có tới hàng trăm ngôn ngữ khác nhau. Ngôn ngữ chủ yếu là tiếng Hán tiêu chuẩn, dựa trên tiếng Quan Thoại là trung tâm, nhưng tiếng Trung Quốc có hàng trăm ngôn
[[Tập tin:Africa ethnic groups 1996.jpg|thumb|upright=1.5|Bản đồ cho thấy phân bố của các ngữ hệ truyền thống tại châu Phi: Niger-Congo: Nin-Sahara: ]] Có 1.250 tới 2.100 và theo một nguồn là có tới 3.000 ngôn
**N****gôn ngữ toán học** là hệ thống ngôn ngữ được sử dụng bởi các nhà toán học để truyền đạt ý tưởng toán học với nhau. Ngôn ngữ này bao gồm một nền tảng từ
**Ngôn ngữ học xã hộ**i (_Sociolinguistics_) là ngành học nghiên cứu ảnh hưởng của bất kỳ và tất cả các lĩnh vực xã hội, bao gồm các khái niệm văn hóa, kỳ vọng và ngữ
nhỏ|Mô hình ngôn ngữ máy được lập nên bởi nhà toán học, nhà thủy văn và lập trình viên Vladimir Mikhailovich Kazakov, nhân viên Máy tính của Viện Energosetproekt năm 1962-1972. **Ngôn ngữ máy** (còn
**Ngôn ngữ tách biệt** hay **ngôn ngữ cô lập**/**ngôn ngữ biệt lập** (_language isolate_), theo nghĩa tuyệt đối, là một ngôn ngữ tự nhiên không có mối quan hệ phả hệ (hoặc "di truyền") với
**Nhóm ngôn ngữ Gallo-Ý**, **Gallo-Itali**, **Gallo-Calupine** hoặc đơn giản là **Calupine** tạo thành phần lớn của nhóm ngôn ngữ Rôman tại miền bắc Italy. Chúng gồm những ngôn ngữ: Piemonte, Lombard, Emilia-Romagna và Liguria. Tiếng
thumb|right|Hai người phụ nữ nói chuyện với nhau. Chú ý người phụ nữ mặc áo xanh khép một cánh tay co sát cơ thể, trong khi người kia sử dụng tay mình để biểu thị,
**Nhóm ngôn ngữ Oïl** (Langues d'oïl) là một cụm phương ngữ bao gồm tiếng Pháp và các ngôn ngữ bản địa gần gũi được nói ở bắc Pháp, nam Bỉ và Quần đảo Eo Biển.
**Olympic Ngôn ngữ học Quốc tế** (tiếng Nga: **Международна олимпиада по лингвистика**, tiếng Anh: **International Linguistics Olympiad**, viết tắt: **IOL** (tên chính thức, chú ý không phải là _ILO_)) là một trong những kỳ thi
**Nhóm ngôn ngữ Semit Tây Bắc** là một bộ phận của các ngôn ngữ Semit bao gồm các ngôn ngữ bản địa Levant. Nó xuất phát từ ngôn ngữ Semit nguyên thủy trong thời kỳ
**Nguồn gốc ngôn ngữ** và quan hệ của ngôn ngữ đối với tiến hóa của loài người là chủ đề học thuật đã được bàn luận trong nhiều thế kỷ. Mặc dù vậy, ta vẫn
nhỏ|Cbmain Trong khoa học máy tính, một **ngôn ngữ lập trình bậc cao** (tiếng Anh: _high-level programming language_) là một ngôn ngữ lập trình có sự trừu tượng hóa mạnh mẽ khỏi các chi tiết
**Python** () là ngôn ngữ lập trình bậc cao đa năng. Triết lý thiết kế của nó nhấn mạnh khả năng đọc mã bằng cách sử dụng thụt lề đáng kể. Python có kiểu động
**Java** (phiên âm Tiếng Việt: "_Gia-va_") là một ngôn ngữ lập trình hướng đối tượng, dựa trên lớp được thiết kế để có càng ít phụ thuộc thực thi càng tốt. Nó là ngôn ngữ
**Cú pháp ngôn ngữ (lập trình) C** là tập hợp các quy tắc nhằm xác định cách thức để viết và dịch trong ngôn ngữ lập trình C. :Thí dụ:
// Dòng này sẽ
thumb|thumbtime=5|_Preservation of the Sign Language_ (1913) nhỏ|Juan Pablo Bonet, _Reducción de las letras y arte para enseñar a hablar a los mudos_ (Madrid, 1620). **Ngôn ngữ ký hiệu** hay **ngôn ngữ dấu hiệu**, **thủ ngữ**
**Xử lý ngôn ngữ tự nhiên** (_natural language processing_ - NLP) là một nhánh của trí tuệ nhân tạo tập trung vào các ứng dụng trên ngôn ngữ của con người. Trong trí tuệ nhân
**Loại hình ngôn ngữ** là một khái niệm của ngôn ngữ học dùng để chỉ tập hợp các ngôn ngữ có chung một hay nhiều đặc điểm hình thái nhất định. Loại hình học là
**Ngôn ngữ của cộng đồng Hoa** **kiều** ở nước ngoài ảnh hưởng bởi rất nhiều yếu tố, bao gồm tổ tiên, xuất xứ, sự đồng hóa qua nhiều thế hệ, và các chính sách chính
**Ngôn ngữ đơn âm tiết** (chữ Anh: _Monosyllabic language_) là loại ngôn ngữ mà từ đơn chủ yếu do một âm tiết duy nhất cấu thành. Một ví dụ về ngôn ngữ đơn âm tiết
**Ruby** là một ngôn ngữ lập trình hướng đối tượng, có khả năng phản ứng. Theo tác giả, Ruby chịu ảnh hưởng bởi Perl, Smalltalk, Eiffel, Ada và Lisp. Ruby cung cấp nhiều mẫu hình
**Ngữ hệ Mixe–Zoque** là một ngữ hệ gồm những thứ tiếng được nói ở trong và quanh eo đất Tehuantepec, México. Chính phủ México công nhận ba ngôn ngữ Mixe–Zoque: Mixe (_ayook_) với 188.000 người
**Nhóm ngôn ngữ Gbe** (phát âm ) là một tập hợp gồm khoảng 20 ngôn ngữ liên quan đến nhau hiện diện trên một khu vực kéo dài từ đông Ghana đến tây Nigeria. Số
**Nhóm ngôn ngữ Bantu** (), chính xác hơn là **nhóm ngôn ngữ Bantu Hẹp** (ngược lại với "Bantu Rộng", một nhóm phân loại lỏng lẻo bao gồm cả những ngôn ngữ Bantoid khác), là một
**Khung năng lực ngoại ngữ 6 bậc dùng cho Việt Nam** là một khung tham chiếu trình độ ngoại ngữ của giáo viên và người dùng ngoại ngữ Việt Nam theo Thông tư số 01/2014/TT-BGDĐT
**Nhóm ngôn ngữ Đông Iran** là một nhóm con của ngữ chi Iran nổi lên trong thời Iran Trung cổ (từ thế kỷ thứ 4 trước Công nguyên). Tiếng Avesta thường được phân loại là
**Nhóm ngôn ngữ Canaan** hay **nhóm phương ngữ Canaan**, là một trong ba nhóm con của nhóm ngôn ngữ Semit Tây Bắc, hai nhóm còn lại là Aram và Amorite. Chúng được nói bởi những
Dưới đây là danh sách các lệnh trong tập lệnh của bytecode ngôn ngữ trung gian dùng chung. * _Các lệnh cơ sở_ tạo thành một tập lệnh Turing-hoàn-chỉnh. * _Các lệnh mô hình đối
nhỏ|592x592px|Bản đồ các phương ngôn tiếng Hán tại Trung Quốc và Đài Loan. Tiếng Trung Quốc Tiêu chuẩn dựa phần lớn trên phương ngôn Bắc Kinh của tiếng [[Quan thoại.]] **Tiếng Trung Quốc tiêu chuẩn**,
**Ngữ hệ Maya** là một ngữ hệ được nói tại Trung Bộ châu Mỹ và miền bắc Trung Mỹ. Các ngôn ngữ Maya được nói bởi ít nhất 6 triệu người, thuộc các dân tộc
phải**Ngữ pháp tiếng Pháp (Grammaire française)** là những nghiên cứu về quy tắc sử dụng của ngôn ngữ này. Trước tiên cần phải phân biệt hai quan điểm: **_ngữ pháp miêu tả_** (_grammaire descriptive_) và
**Ngôn ngữ kịch bản** () là ngôn ngữ lập trình cho môi trường thời gian chạy đặc biệt tự động hóa thực thi các tác vụ; các tác vụ thay thế có thể
**Ngữ hệ Nam Đảo** () là một ngữ hệ lớn phân bổ rộng rãi tại các hải đảo Đông Nam Á và Thái Bình Dương, Madagascar và một phần nhỏ tại đại lục châu Á.