2015-09-18 51 views
5

Tôi đang sử dụng C# .NET cho một ứng dụng web. Tôi đã đọc rằng biên dịch JIT xảy ra tại thời gian chạy, có nghĩa là (sửa tôi nếu tôi sai) rằng việc biên dịch sẽ xảy ra khi yêu cầu truy cập IIS.Khi nào thì việc biên dịch trước thời gian (AOT) xảy ra?

Một quá trình biên dịch khác xảy ra khi sử dụng csc.exe trong giai đoạn xây dựng của giải pháp sử dụng MSBuild để chuyển đổi mã cấp cao thành CIL.

Nếu không có JIT và chúng tôi muốn sử dụng AOT, AOT sẽ phù hợp với tất cả điều này ở đâu?

Câu hỏi của tôi là ở điểm nào trong toàn bộ giai đoạn từ mã xây dựng đến yêu cầu đầu tiên, việc biên dịch AOT xảy ra? (Nền tảng/khung công tác không quan trọng)

+1

"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

+2

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. –

Trả lời

10

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-TimeJust-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).

+0

Nghiên cứu tốt. Lưu ý rằng thuật ngữ AOT thường được sử dụng khi biên dịch diễn ra vào lúc cài đặt. Một ví dụ điển hình là Android Runtime mới (ART) trong Android 5.0+, sẽ biên dịch ứng dụng khi chúng được cài đặt thay vì JITing. @shashi đã nhận xét về bài đăng gốc của bạn về các ứng dụng Windows Store. MS đã được AOT biên dịch các ứng dụng .NET Windows Phone, nhưng thay vì biên dịch trên điện thoại vào lúc cài đặt, nó trên máy chủ Windows Store trước khi nó được tải xuống và cài đặt bởi người dùng. Apple làm điều tương tự với ứng dụng Apple Watch. – LearningFast

+0

Khi chính xác xảy ra điều này: * Trình biên dịch AOT biên dịch toàn bộ các cụm (trong CIL hoặc ngôn ngữ X) thành mã máy gốc (ngôn ngữ Y) trước khi chương trình được chạy * – kravemir

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