Sau rất nhiều Googling và nghiên cứu, tôi phát hiện ra rằng sự hiểu biết cơ bản về trình biên dịch của tôi là sai.
Trình biên dịch là chương trình chuyển đổi chương trình bằng ngôn ngữ X thành chương trình bằng ngôn ngữ Y. Ngôn ngữ Y có thể là bất kỳ thứ gì (mã máy gốc, mã trung gian/bytecode, một số ngôn ngữ Z khác hoặc chính ngôn ngữ đó).
Trình biên dịch không nhất thiết là chương trình chuyển đổi chương trình bằng ngôn ngữ X thành mã m.
Ví dụ: quá trình biên dịch diễn ra từ C# mã cao đến CIL bằng trình biên dịch csc.exe. (Làm thế nào tôi có thể bỏ lỡ? Duh!)
Ngoài ra, thời gian trong Ahead-Of-Time và Just-In-Time trình biên dịch đề cập đến runtime. Vì vậy, trong trình biên dịch Ahead-Of-Time, việc biên dịch xảy ra trước khi chương trình được chạy, thường được thêm vào như là một bước xây dựng. Trong khi trong trình biên dịch Just-In-Time, việc biên dịch vẫn diễn ra trong khi chương trình đang được chạy.
Để đặt nó trong C# .NET quan điểm và trả lời câu hỏi của tôi, CIL được tạo ra bởi MSBuild sử dụng csc.exe mà không xem xét liệu các CLR sử dụng JIT hoặc AOT biên dịch. Đó là tại thời điểm chạy chương trình mà JIT hoặc trình biên dịch AOT đi vào hoạt động. AOT biên dịch biên dịch toàn bộ lắp ráp (trong CIL, hoặc ngôn ngữ X) thành mã máy có nguồn gốc (ngôn ngữ Y) trước khi chương trình được chạy. trình biên dịch JIT biên dịch phương pháp cá nhân và các lớp (trong CIL, hoặc ngôn ngữ X) thành mã máy có nguồn gốc (ngôn ngữ Y) khi phương pháp này được gọi là.
CLR cung cấp trình biên dịch JIT theo mặc định nhưng nó cũng hỗ trợ biên dịch AOT bằng cách sử dụng Native Image Generator(Ngen.exe).
"Toà nhà" là khi việc biên dịch AOT diễn ra giống như các ứng dụng C, C++, mã C# sẽ được biên dịch trực tiếp sang mã máy cho nền tảng cụ thể được chỉ định trong quá trình "xây dựng". – shashi
Vâng, nền tảng/khung làm việc quan trọng. AOT thuần túy hoàn toàn duy nhất trong .NET xảy ra vài tuần trước khi người dùng điển hình chạy chương trình. Trên một máy chủ lưu trữ ở Redmond, sử dụng .NET Native. Không có bất cứ điều gì để làm với một ứng dụng web, bạn chỉ có thể sử dụng Ngen. Mã phản chiếu và một số generics vẫn còn bị jitted. –