2012-04-24 26 views
10

Tôi bị nhầm lẫn với MSILMã được quản lý có giống nhau hay khác nhau không? Tôi muốn nói, điều gì sẽ xảy ra khi chúng ta xây dựng mã C#?MSIL có giống như Mã được quản lý trong .NET không?

Cái nào là đúng

C# Code → C# compiler → Managed Code → MSIL

hoặc

C# Code → C# compiler → MSIL

Vui lòng cung cấp tài liệu tham khảo đáng tin cậy hoặc liên kết để hỗ trợ các câu trả lời của bạn.

Trả lời

9

Như đã lưu ý trong các nhận xét, MSIL đã được đổi tên thành CIL.

C# Code --> C# compiler --> CIL

CIL = Managed

Khi đặt trong bối cảnh của nó, đó cũng là

Native Code = Unmanaged

Lưu ý rằng Managed Code là thứ hoàn toàn khác, refers to the source code.


Nếu bạn muốn mở rộng nó, sau đó quá trình đầy đủ điều chỉnh là:

.NET Code --Compiler--> CIL (Managed) --JIT/NGEN--> Native Code (Unmanaged)


Tài liệu tham khảo:

  1. Introducing C# (What is the .NET Framework? -> CIL and JIT -> First two sencences)

  2. JIT/NGEN (Towards a Cost Model for Managed Code -> The Just-in-Time compiler -> The whole)

+0

Và được chính thức gọi là CIL, Ngôn ngữ trung gian chung, theo [ECMA] (http://www.ecma-international.org/publications/standards/Ecma-335.htm) – Bob

+0

NGEN thường ** không ** được sử dụng khi biên dịch thành mã gốc, trình biên dịch JIT được sử dụng thay thế. Và “[mã byte] (http://en.wikipedia.org/wiki/Bytecode)” là ** không ** tên khác cho mã gốc, đó là một tên khác cho mã được quản lý. – svick

+0

Thật vậy, đã đề cập đến JIT ngay bây giờ và quyết định sử dụng 'bản địa' để tránh nhầm lẫn. –

3

Mã được viết để chạy độc quyền dưới sự kiểm soát của CLR được gọi là mã số quản lý. (Source). Vì vậy,

Mã C# → Trình biên dịch C# → CIL (trước đây gọi là MSIL)

là chính xác.

+0

Cảm ơn bạn đã tham khảo. Bạn có thể ghim đoạn văn bản trong tài liệu mà làm rõ điều này? –

+0

@ user129967 Phần đầu tiên, "Vai trò của CLR", đoạn thứ ba. Bạn cũng có thể nhấn Ctrl + F và tìm kiếm bài viết cho "mã được quản lý". – Indrek

12

Bạn đang bối rối những điều khác nhau. Managed code là mã được viết bằng ngôn ngữ được quản lý (C#, VB.NET, F # và nhiều thứ khác) được biên dịch thành CIL (Ngôn ngữ chung trung gian, trước đây là Microsoft Intermediate Language hoặc MSIL) và chạy trong môi trường được quản lý của CLR.

Mã không được quản lý, mặt khác được biên dịch trực tiếp thành mã gốc (còn được gọi là assembly), nó không chạy trên CLR.

Khi bạn xây dựng mã C#, nó được biên dịch thành CIL. Đây là lý do tại sao bạn có thể sử dụng các công cụ như ildasm hoặc Reflector để kiểm tra mã đã biên dịch. Chính xác những gì xảy ra khi bạn thực thi mã CIL phụ thuộc vào hoàn cảnh. Có thể là

  1. được biên dịch thành mã gốc "chỉ trong thời gian" bằng trình biên dịch JIT (tùy chọn phổ biến nhất).
  2. được thực thi bằng mã gốc được biên dịch trước (bạn có thể sử dụng NGEN để nhận được điều đó).
  3. được diễn giải trực tiếp; Tôi nghĩ rằng một số phiên bản của. Net cho Windows CE, hoặc tương tự nào đó.
+1

+1 để vượt ra ngoài câu hỏi. OP cũng nên đọc thêm một số bài viết "Tổng quan về .NET" giới thiệu để hiểu được quản lý và không được quản lý kỹ lưỡng hơn. Đây là một: http://www.codeproject.com/Articles/7333/Understanding-NET-Framework-at-a-glance –

+0

C# chỉ được "quản lý" nếu bạn KHÔNG sử dụng từ khóa "không an toàn". –

+0

Vậy C# và CIL có được quản lý hay chỉ một trong số đó không? –

2

Khi bạn viết chương trình cho Windows, bạn có thể viết một trong hai loại mã: được quản lý và gốc. Mã gốc được biên dịch trực tiếp vào một máy thực thi hoặc .dll, trong khi mã được quản lý là mã nhắm vào thời gian chạy .NET (nói cách khác là dạng được biên dịch của nó, được gọi là một assembly, là một tệp chứa các lệnh CIL). Khi chạy, CIL được chuyển đổi thành mã máy bằng trình biên dịch JIT và được thi hành. Sự khác biệt giữa quản lý và bản địa phải làm với những gì ngôn ngữ (và trình biên dịch của nó) mục tiêu. Mã gốc nhắm vào chính máy tính vì nó được biên dịch thành một tập hợp các lệnh máy trực tiếp. Mặt khác, các trình biên dịch C# biên dịch mã của bạn thành CIL vì trình biên dịch ngôn ngữ C# nhắm vào thời gian chạy .NET. C# sau đó có thể được gọi là "ngôn ngữ được quản lý" và mọi mã được viết bằng "mã được quản lý". Ví dụ:

C src -> gcc.exe -> .exe containing a machine binary ->   processor 
C# src -> csc.exe -> .exe assembly containing CIL  -> CLR/JIT -> processor 

Tôi nghĩ lý do thuật ngữ "quản lý" được sử dụng là bởi vì các hướng dẫn hình thành mã của bạn được cuối cùng xử lý bởi bộ thực thi .NET thay vì được thực hiện trực tiếp bởi bộ xử lý. Bước bổ sung để biên dịch mã nguồn thành CIL không nằm trong và chính nó điều gì làm cho mã của bạn được quản lý: thay vào đó, thực tế là chương trình của bạn không bao giờ được trình xử lý trực tiếp thực thi. CIL chỉ là những gì cho phép nhiều ngôn ngữ được quản lý khác nhau nhắm mục tiêu cùng một thời gian chạy.

Tôi biết điều này phức tạp hơn nhiều so với chỉ nói "ngôn ngữ được quản lý được biên dịch thành CIL", nhưng đó là bởi vì tôi thực sự không nghĩ đó là mô tả hoàn toàn chính xác về điều làm cho mã được quản lý. Java bytecode tương tự như CIL, nhưng thực tế "các bộ xử lý Java" tồn tại có thể thực thi bytecode một cách tự nhiên. Một bộ xử lý như vậy cũng có thể hiểu được cho .NET CIL, có nghĩa là mã được biên dịch thành CIL và chạy trên một máy như vậy sau đó sẽ trở thành bản địa. Thực tế là mã của bạn phải được xử lý thông qua CLR là những gì làm cho nó được quản lý. CIL chỉ xảy ra là định dạng mà mã phải được chuyển đổi thành vì thời gian chạy có thể thực thi nó.

+0

Điều này rất gần, nhưng điều gì làm cho nó được quản lý hay không là lớp bảo mật thu gom rác và ngăn chặn tràn bộ đệm thời gian chạy và những gì không. Vì vậy, tại sao các thuật ngữ "không an toàn" được áp dụng khi bạn thực thi mã gốc từ mã được quản lý. Nó không phải là về "không trực tiếp thực hiện bởi bộ xử lý", bởi vì nó được thực hiện trực tiếp, nó chỉ là mã được xác minh và được bao bọc trong các lớp bảo mật thời gian chạy. –

2

Tôi sẽ không đi sâu vào chi tiết ở đây, bởi vì những người khác đã bao quát rất nhiều, nhưng tôi muốn làm rõ một số điểm mà các câu trả lời khác chưa thực sự giải thích rõ ràng hoặc chính xác. Điều này phần lớn là giả tạo, và với 99.99999% các trường hợp bạn có thể chỉ nghĩ về "C# và CIL/MSIL là mã được quản lý", nhưng có một số sự tinh tế cho điều này.

Đầu tiên, CIL/MSIL được gọi là "ngôn ngữ trung gian", có nghĩa là ngôn ngữ máy tính được sử dụng làm bước trung gian giữa mã nguồn và mã máy gốc cuối cùng. Tuy nhiên, điều này không nhất thiết phải là trường hợp. Tôi đã nghe nói về các dự án thử nghiệm, nơi họ đã tạo ra một CPU thực hiện CIL (hoặc java tương đương được gọi là Java Byte Code) trực tiếp mà không cần chuyển đổi nó thành một dạng nguyên bản (về cơ bản, CIL là biểu mẫu gốc).

Mã được quản lý đề cập đến mã được "quản lý" theo thời gian chạy được quản lý của một số loại. Điều này thường có nghĩa là mã được thu thập rác và có một số loại lớp bảo mật ngăn chặn những thứ như tràn bộ đệm và các loại sự cố khác có thể xảy ra trong mã gốc. Trong .net này được gọi là Ngôn ngữ chung Thời gian chạy (CLR)

Trong những ngày cũ, điều này thường được gọi là "máy ảo" và tại sao môi trường java được gọi là JVM, mặc dù thuật ngữ đó hiện nay phần lớn một sự nhầm lẫn. Ngày nay, với các trình biên dịch JIT (chỉ trong thời gian), không có "máy ảo" thực sự, nhưng nó thay vào đó là một lớp mã "kết thúc" mã được biên dịch gốc để đảm bảo bạn không phá vỡ các quy tắc và làm sạch sau ma cua ban. Nó cũng tóm tắt một số điều nền tảng cụ thể để CIL không phải lo lắng về chúng.

Vì vậy, mã được quản lý đề cập đến khái niệm mã đang chạy trong thời gian chạy được quản lý. CIL được coi là mã được quản lý khi nó đang chạy trong một thời gian chạy như môi trường chạy .NET.

C# và VB.NET thường được coi là "Ngôn ngữ được quản lý" vì chúng thường được biên dịch thành CIL và chạy trong thời gian chạy được quản lý. Tuy nhiên, điều này không nhất thiết phải là trường hợp (mặc dù nếu tuân theo thư của đặc điểm kỹ thuật, nó có thể không phải là trường hợp). Ví dụ, có các trình biên dịch sẽ biên dịch C# trực tiếp sang mã gốc mà không có trình độ trung gian, và có các trình thông dịch thời gian chạy cho C# mà không biên dịch mã, mà đúng hơn là "diễn giải" nó khi chạy.

Vì vậy, ý chính là Mã được quản lý và CIL là hai thứ khác nhau, nhưng chúng có liên quan.

Các vấn đề liên quan