Tài liệu Assembly part 3 pdf

5 405 5
Tài liệu Assembly part 3 pdf

Đang tải... (xem toàn văn)

Thông tin tài liệu

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ữ chung Common Language Specification (CLS) nên được sử dụng. Với CLS, Trình biên dịch có thể kiểm tra sự hợp lệ đoạn code trong đặc tả của CLS . Nhiều ngôn ngữ hỗ trợ .NET không chỉ hạn chế các tập con tính năng chung, nó được định nghĩa với CLS; thậm chí với .NET nó vẫn có khả năng tạ o các thành phần mà không thể sử dụng từ các ngôn ngữ khác. .NET Framework đã được thiết kế với mục tiêu hỗ trợ đa ngôn ngữ. Trong suốt giai đoạn thiết kế .NET, Microsoft đã mời nhiều nhà sản xuất trình biên dịch để xây dựng .NET languages cho chính họ. Chính Microsoft phân phối Visual Basic .NET, Managed C++, C#, J#, và JScript.NET. Thêm vào đó hơn hai mươi ngôn ngữ từ các nhà sản xuất khác nhau như COBOL, Smalltalk, Perl, và Eiffel. Mỗi loại đều có những thuận lợi riêng biệt và nhiều tính n ăng khác nhau. Các trình biên dịch của những ngôn ngữ này đều được mở rộng để hỗ trợ .NET. Quan trọng CLS là đặc tả những yêu cầu tối thiểu mà một ngôn ngữ phải hỗ trợ. Có nghĩa là nếu chúng ta giới hạn các phương thức công cộng (public methods) của chúng ta cho CLS, thì tất cả các ngôn ngữ đang hỗ trợ .NET có thể sử dụng các lớp của chúng ta ! Common Type System (CTS) Common Type System ( còn gọi là Common Type Specification, đặc tả kiểu dữ liệu thông dụng), có nghĩa là ngôn ngữ trung gian IL (Intermediate Language) xuất hiện với một lô kiểu dữ liệu bẩm sinh (predefined, hoặc built-in) được định nghĩa rõ ràng. Trong thực tế, những kiểu dữ liệu này được tổ chức theo một đẳng cấp kiểu (type hierachy), điển hình trong môi trường thiên đối tượng. Lý do CTS rất quan trọng là, nếu một lớp được dẫn xuất từ mộ t lớp nào đó hoặc chứa 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 để CLR có thể chấp nhận làm việc. Ngoài ra, CTS cũng định nghĩa một số cấu trúc cú pháp (chẳng hạn nạp chồng các tác từ - overloading operrator) mà một số ngôn ngữ "ăn ý với .NET" (.NET aware language) có thể chấp nhận hỗ trợ hoặc không. Khi bạn muốn xây dựng những đoạn mã có thể đem sử dụng bởi tất cả các ngôn ngữ .NET aware, bạn cần tuân thủ các quy tắc của CLS ( ta sẽ xem sau trong chốc lát) khi trưng ra những kiểu dữ liệu. Common Language Specification ( CLS, đặc tả ngôn ngữ thông dụng) Làm việc "ăn ý" với CTS để bảo đảm suôn sẻ việc hợp tác liên ngôn ngữ. CLS đề ra một số chuẩn mực mà tấ t cả các trình biên dịch nhắm vào .NET Framework phải chấp nhận hổ trợ. Có thể có một người viết trình biên dịch muốn hạn chế khả năng của một trình biên dịch nào đó bằng cách chỉ hổ trợ một phần nhỏ những tiện nghi mà IL và CTS cung cấp. Việc này không hề gì miễn là trình biên dịch hổ trợ mọi thứ đã được định nghĩa trong CLS. Để lấy một thí dụ , CTS định nghĩa một kiểu dữ liệu số nguyên có dấu 32-bit, int32 và không dấu, uint32. C# nhận biết hai kiểu dữ liệu này là int và uint. Nhưng VB.NET thì chỉ công nhận độc nhất int32, mang từ chốt integer mà thôi. Ngoài ra, CLS hoạt động theo hai cách. Trước tiên, có nghĩa là những trình biên dịch riêng rẽ không nhất thiết phải mạnh, chịu hổ trợ tất cả các chức năng của .NET Framework, đây là một cách khuyến khích việc phát triển những trình biên dịch đối với ngững ngôn ngữ khác sử dụng sàn diễn .NET. Thứ đấy, CLS đưa ra một bảo đảm nếu bạn chỉ giới hạn các lớp của bạn vào việc tr ưng ra những chức năng chiều ý CLS (CLS- compliant), thì CLS bảo đảm là đoạn mã viết theo các ngôn ngữ khác có thể sử dụng các lớp của bạn. Thí dụ, nếu bạn muốn đoạn mã của bạn là CLS-compliant, bạn sẽ không có bất cứ phương thức nào trả về uint32, vì kiểu dữ liệu này không phải là thành phần của CLS. Nếu bạn muốn, bạn cũng có thể trả về một Uint32, những lúc ấy không bảo đảm đ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 định nghĩa những yêu cầu để tạo thành phần CLS- compliant, với khả năng này nó được sử dụng với các ngôn ngữ .NET khác nhau. Với COM chúng ta phải chú ý đến yêu cầu đặc tả ngôn ngữ khi thiết kế một thành phần. JScript có yêu cầu khác với VB6, và điều kiện của VJ++ cũng khác. Trong trường hợp không phải .NET. khi thiết kế một thành phần nên sử dụng những ngôn ngữ khác nhau chúng ta chỉ phải tạo CLS cho nó, hoặc CLS_compliant; Nó đảm bảo rằng thành phần này có thể sử dụng từ tất cả ngôn ngữ .NET, nếu bạn đánh dấu một lớp như CLS, compliant, trình biên dịch có thể báo trước chúng ta về phương thức non-compliant. Common Language Runtime (CLR) T ừ ngữ runtime ( vào lúc chạy) ám chỉ một tập hợp những dịch vụ cần thiết để cho thi hành một đoạn mã nào đó. Mỗi ngôn ngữ đều có riêng cho mình một runtime library hoặc runtime module. Thí dụ, MFC ( Microsoft Foundation Class) hoạt động cùng với Visua C++ cần kết nối với MFC runtime library (mfc42.dll), Visua Basic 6.0 thì lại gắn chặt với một hoặc hai runtime module (msvbvm60.dll), còn Java Virtual Machinee (JVM) như là module runtime. Với sàn diễn .NET, bộ phận runtime được gọi là Comon Language Runtime (CLR) có hơi khác với nh ững runtime kể trên: CLR cung cấp một tầng lớp (layer) runtime duy nhất được định nghĩa rõ ràng và được chia sẻ sử dụng bởi tất cả các ngôn ngữ .NET aware ("ăn ý" với .NET). CLR gồm hai bộ phận chủ chốt : Phần thứ nhất, là "cỗ máy" thi hành vào lúc chạy (runtime execution engine), mang tên mscoree.dll ( tắt chữ Microsoft Core Execution Engine). Khi một assembly được gọi vào thi hành, thì mscoree.dll được tự động nạp vào, và đến phiên nó nạp assembly cần thiết vào ký ức. Runtime Execution Engine chị u trách nhiệm thực hiện một số công tác. Trước tiên, nó phải lo việc giải quyết "vị trí đóng quân" của assembly và tìm ra kiểu dữ liệu yêu cầu ( nghĩa là lớp, giao diện, cấu trúc, v.v .) thông qua metadata trong assembly. Execution Engine biên dịch IL được gắn liền dựa theo chỉ thị cụ thể sàn diễn, 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.   . thí dụ , CTS định nghĩa một kiểu dữ liệu số nguyên có dấu 32 -bit, int32 và không dấu, uint32. C# nhận biết hai kiểu dữ liệu này là int và uint. Nhưng VB.NET. 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ư

Ngày đăng: 15/12/2013, 02:15

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan