2009-01-17 47 views

Trả lời

1

Khi bạn biên dịch một chương trình NET nó được biên dịch thành IL (Intermediate Language). IL rất giống với ngôn ngữ lắp ráp. Rằng IL sau đó được chuyển đổi thành mã gốc vào thời gian chạy thông qua trình biên dịch JIT (Just In Time).

Vì vậy, để trả lời câu hỏi của bạn, có và không. Trình biên dịch không phát ra mã gốc mà là IL được chuyển thành mã gốc khi ứng dụng được chạy.

26

Ứng dụng .NET phải chạy trên Common Language Runtime (CLR).

CLR là việc Microsoft triển khai tiêu chuẩn CLI. (Và có các triển khai khác của CLR bên cạnh Khuôn khổ .NET của Microsoft, ví dụ: Mono, Portable.NET).

CLR thực hiện một loại bytecode được gọi là Ngôn ngữ trung gian chung (CIL).

CIL

+0

tôi luôn luôn nghe MSIL như trái ngược với Cil. Được gọi là MSIL trên outs? –

+0

@PhoenixRedeemer: Ban đầu được gọi là MSIL, trong bản phát hành beta của ngôn ngữ .NET, nhưng do tiêu chuẩn hóa (Ecma-335 http://is.gd/gchW) hiện được chính thức gọi là CIL ... – CMS

0

Vâng, ít nhất là với mono Tôi biết rằng bạn có thể tạo mã gốc thay vì hội đồng quản lý. Tôi nghĩ rằng có những công cụ OpenSource cho Windows có thể làm điều này, quá.

0

Tôi nghĩ bạn phải cẩn thận về việc hỏi liệu nó có được "biên dịch" hay không và giả định rằng điều này có nghĩa là kết quả được phát ra phải là "mã gốc". Đây không phải là những gì "được biên dịch" nghĩa là:

"Chúng tôi thường nói rằng một ngôn ngữ được 'diễn giải' khi người phiên dịch ban đầu đơn giản. Nếu người dịch phức tạp, chúng tôi nói rằng ngôn ngữ đó được" biên dịch ". sự phân biệt có thể gây nhầm lẫn vì "đơn giản" và "phức tạp" là các thuật ngữ chủ quan, và bởi vì nó có thể cho trình biên dịch tạo mã mà sau đó được thực thi bởi một máy ảo phức tạp (trình thông dịch) ... Hai đặc điểm này - phân tích kỹ lưỡng và không cần thiết chuyển đổi - là điểm nổi bật của việc biên dịch. "

Từ "Ngôn ngữ lập trình ngôn ngữ" bởi Michael L. Scott. Thật kỳ lạ, đây là một cuốn sách giáo khoa về lý thuyết ngôn ngữ lập trình mà tôi vừa mới đọc được vào chiều nay với trang mở cho câu nói đó.

Vì vậy, có, C# và các ngôn ngữ .NET khác chạy trên CLR chúng được biên dịch.

7

Sắp xếp. Trình biên dịch .NET biên dịch mã nguồn của bạn thành IL (một ngôn ngữ trung gian) và đóng gói nó trong một assembly (thường là một tệp .DLL hoặc .EXE) mà bạn triển khai.Tại thời gian chạy, nó được lưu trữ bởi một CLR (thời gian chạy ngôn ngữ chung) chịu trách nhiệm thực thi mã, thực thi các quy tắc bảo mật, v.v. CLR trên máy tính để bàn chính cho Windows (có những người khác như Mono và Silverlight) không giải thích IL, nhưng thay vì "JIT" (chỉ trong thời gian biên dịch) mã IL thành mã gốc trước khi thực hiện các phương thức (hàm).

Lưu ý rằng thực sự có một số lợi thế về hiệu suất cho just in-time compilation. Ví dụ, CLR có thể tối ưu hóa mã nguồn gốc mà nó tạo ra dựa trên đặc tính hiệu năng của máy mà nó đang chạy trên loại CPU, kích thước bộ nhớ cache CPU, số CPU, kích thước RAM, vv. không biết mã máy mà họ tạo ra cuối cùng sẽ được thực hiện vào ngày nào.

Ngoài ra, các hội đồng có thể được "tiền JITted" sử dụng công cụ có tên là ngen. Trong quá trình này, mã gốc được biên dịch từ IL trước khi assembly được thực hiện và được lưu trữ trên đĩa. Bằng cách đó, không có chi phí JITting nào phát sinh trong thời gian chạy.

+0

không nhiều mọi người biết về ngen – chakrit

0

C++ là ngôn ngữ .Net không cần phải được biên dịch sang IL, nhưng bạn không thể có bất kỳ tham chiếu .NET nào hoặc mã từ .Net nếu bạn chọn tùy chọn này.

Điều quan trọng khác cần xem xét là những gì con rồng c chỉ ra - ngen.exe có thể có một số cải tiến đáng kể đối với nhiều ứng dụng dựa trên nền tảng Windows/console.

0

tại thời điểm thực hiện, biên dịch tạo ra một mã IL đó là mã ngôn ngữ trung gian sau đó mã được chuyển thành mã gốc bởi trình biên dịch JIT

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