Hỗ trợ ngôn ngữ xuyên xuốt (Cross-Language Support)
Trước tiên chúng ta biết Common Type System (CTS) là gì ? .NET định nghĩa thế
nào các kiểu giá trị và các kiểu tham chiếu. Bố trí bộ nhớ của các kiểu dữ liệu. Nhưng
CTS không đảm bảo kiểu mà nó định nghĩa từ bất kì ngôn ngữ nào, được sử dụng từ bất
kì ngôn ngữ khác. Đây là vai trò của Common Language Specification (CLS). CLS
xác định yêu cầu tố
i thiểu của các kiểu dữ liệu mà chúng được hỗ trợ bởi .NET
language.
Chúng ta đề cập một cách ngắn gọn về CTS và CLS Trong chương này chúng ta sẽ được
học:
•
Common Type System (CTS) và Common Language Specification (CLS)
•
Ngôn ngữ độc lập trong hành động (Language independence in action) tạo
bởi C++, Visual Basic .NET và C# . Chúng ta quan sát mã MSIL để biết chúng
được sinh ra từ trình biên dịch của chúng.
•
Những yêu cầu của đặc tả ngôn ngữ chung (Common Language Specification.). CTS và CLS
Tất cả các kiểu dữ liệu được khai báo dưới sự chỉ đạo của Common Type
System (CTS). CTS định nghĩa một bộ quy tắc mà trình biên địch phải tuân thủ, tham
chiếu, sử dụng, và lưu trữ cả hai kiểu tham khảo và kiểu giá trị. Do đó CTS, các đối
tượng được viết bằng các ngôn ngữ khác nhau có thể được tương tác lẫn nhau.
Tuy nhiên, Không phải tất cả các kiểu đều sử dụng trong tất c
ả ngôn ngữ lập trình. Để
xây dựng các thành phần có thể truy cập từ tất cả ngôn ngữ .NET , Đặc tả ngôn ngữ
những thể hiện (instance) của những lớp khác, nó cần biết kiểu dữ liệu mà các lớp khác
sử dụng đến. Trong quá khứ, chính việc thiếu một cơ chế khai báo loại thông tin này là
một cản trở cho việc kế thừa xuyên ngôn ngữ. Loại thông tin này đơn giản không có
trong tập tin .EXE chuẩn hoặc DLL.
Một phần nào đó, vấn đề lấy thông tin về kiểu dữ
liệu đã được giải quyết thông tin qua
metadate trong assembly. Thí dụ, giả sử bạn đang viết một lớp theo C#, và bạn muốn lớp
này được dẫn xuất từ một lớp được viết theo VB.NET. Muốn làm được điều này, bạn sẽ
yêu cầu trình biên dịch qui chiếu về assembly mà lớp VB.NET đã được khai báo. Lúc
này, trình biên dịch sẽ dùng metadata trên assembly này để lần ra tất cả các phương thức,
thuộc tính và vùng mục tin (field), v.v... liên quan đến lớp VB.NET. Rõ ràng là trình biên
dịch cần đến thông tin này để có thể biên dịch đoạn mã của bạn.
Tuy nhiên, trình biện dịch lại cần đế
n nhiều thông tin hơn những gì metadata cung cấp.
thí dụ, giả sử một trong những phương thức trên lớp VB.NET được định nghĩa trả về một
Integer - là một trong những kiểu dữ liệu bẩm sinh trên VB.NET. Tuy nhiên, C# lại
không có kiểu dữ liệu mang tên Integer này. Rõ là chúng ta chỉ có thể dẫn xuất từ lớp và
sử dụng phương thức này và sử dung kiểu dữ liệu trả về từ đoạn mã C# nếu trình biên
dịch biết làm thế nào ánh xạ (map) kiểu dữ liệu Integer của VB.NET lên một kiểu dữ liệu
nào đó được định nghĩa trên C#.
Điều này có thể thực hiện được vì CTS đã định nghĩa những kiểu dữ liệu bẩm sinh có
sẵn trên Intermediate Language (IL), như vậy tất cả các ngôn ngữ tuân thủ .NET
Framework sẽ kết sinh ra đoạn mã dựa cuối cùng vào những kiểu dữ liệu này. Thí dụ, ta
thử xét lại Integer của VB.NET, hiện là một số nguyên có dấu 32-bit, được ánh xạ lên
kiểu dữ liệu Int32 của IL. Như vậy đây sẽ là kiểu dữ liệu được khai báo trong đoạn cấp
mã nguồn, C# dùng từ chốt int để ám chỉ int32, do đó trình biên dịch sẽ cư xử với
phương thức VB.NET xem như hàm sẽ trả về một int.
Nhìn chung, CTS là một
đặc tả hình thức có nhiệm vụ mô tả một kiểu dữ liệu nào đó
(lớp, cấu trúc, giao diện, kiểu dữ liệu bẩm sinh, v.v...) phải được định nghĩa thế nào để
đoạn mã của bạn hoạt động xuyên ngôn ngữ. Nói cách khác, hoàn toàn chấp nhận khi bạn
viết một đoạn mã không CLS-compliant. Nhưng nếu bạn làm thế, thì không chắc gì đoạn
mã biên dich IL của bạn hoàn toàn độc lập về mặt ngôn ngữ (language independent).
CLS là một tập hợp những quy tắc hướng dẫn mô tả một cách chi tiết sống động những
tính nă
ng (feature) tối thiểu và trọn vẹn mà một trình biên dịch .NET aware nào đó phải
chấp nhận hổ trợ để có thể tạo ra đoạn mã chiều ý CLS, và đồng thời có thể được sử dụng
theo một cách đồng nhất giữa các ngôn ngữ theo đuôi sàn diễn .NET. Trong chừng mực
nào đó, CLS có thể được xem như một tập hợp con (subset) của chức năng chọn vẹn
được định nghĩa bở
i CTS.
CLS bao gồm một tập hợp những qui tắc mà các nhà tạo công cụ phải tuân thủ nếu
muốn sản phẩm của mình làm ra có thể hoạt động không trục trặc trong thế giới .NET.
Mỗi qui tắc sẽ mang một tên (chẳng hạn "CLS rule 6"), và mô tả qui tắc này sẽ ảnh
hưởng thế nào đối với người thiết kế công cụ cũng như đối với người tương tác với công
cụ
.
Ngoài ra, CLS còn định nghĩa vô số qui tắc khác; chẳng hạn CLS mô tả một ngôn ngữ
nào đó phải biểu diễn thế nào các chuỗi chữ, liệt kê kiểu enumeration phải được biểu diễn
thế nào về mặt nội tại, v.v... Nếu bạn muốn biết chi tiết về CLS, thì mời tham khảo
MSDN trên máy của bạn.
Những yêu cầu của CLS
Chúng ta chỉ thấy hoạt động CLS khi chúng ta đã khoá kế thừa cross-language gi
ữa
MC++, VB.NET, và C#. Cho đến bây giờ chúng ta không cần chú ý đến yêu cầu của CLS
khi xây dựng project. Chúng ta may mắn phương thức chúng ta định nghĩa trong các lớp
cơ bản đã có thể gọi từ các lớp dẫn xuất. Nếu phươnghtức của chúng ta có kiểu dữ liệu
System.UInt32 như là thông số của nó chúng ta không thể sử dụng nó từ VB.NET. Kiểu
dữ liệu không tên không có CLS-compliant; nó không cần thiết hỗ trợ kiểu dữ liệu này.
Common Language Specification chính xác
tiến hành một số kiểm tra an toàn cũng như một số công việc liên hệ.
Phần thứ hai của CLR là thư viện lớp cơ
bản, mang tên mscorlib.dll ( tắt chữ
Microsoft Core Library), chứa vô số công tác lập trình thông dụng. Khi bạn xây dựng
.NET Solutions ( giải pháp .NET) bạn sẽ cần đến nhiều phần thư viện này.