2008-10-10 39 views
8

Chỉ cần tự hỏi liệu một ứng dụng .NET có thể được biên dịch xuống mã máy gốc trước thời hạn không? Tôi không có ý định làm như vậy ngay cả khi tôi có thể; Tôi chỉ tò mò thôi.Ứng dụng .NET có thể được biên dịch sang nguồn gốc không?

Cảm ơn

+1

@Cody Cảm ơn bạn đã sửa lỗi chính tả sẽ dạy tôi không đọc bằng chứng trước khi tôi nhấn enter. –

Trả lời

11

Bạn có thể sử dụng NGen để biên dịch trước, nhưng điều này vẫn phụ thuộc vào khung .NET. Remotesoft's Salamander (một ứng dụng thương mại) có thể tạo ra một ứng dụng không có khung công tác.

1

ngen có thể được sử dụng để 'tiền JIT' một hình ảnh, do đó, nó có sẵn trên đĩa ở dạng gốc để giảm thời gian khởi động ứng dụng.

+0

BTW: Các ứng dụng ngen-biên dịch có chạy chậm hơn so với chuẩn .net (mặc dù thời gian khởi động) không? Tôi nghĩ rằng trình biên dịch JIT có thể thực hiện rất nhiều tối ưu hóa khi chạy đặc biệt với các biểu thức lambda. – Dario

5

Bạn có thể biên dịch IL thành các tệp nhị phân gốc. Có những sản phẩm làm điều đó.

Câu hỏi lớn hơn là nên bạn ...

Nếu bạn muốn loại bỏ tất cả rải rác phụ thuộc ròng để chạy mà không dot net

Về cơ bản những gì các sản phẩm này đang làm được precompiling xuống mức máy (x86 thường) và sau đó tĩnh bao gồm tất cả các thư viện cần thiết trong exe của bạn. Điều đó thường dẫn đến một exe HUGE. Và, quan trọng hơn, bây giờ bạn không thực sự có thời gian chạy trên máy mục tiêu của bạn. Bạn có một phần của thời gian chạy mà trình biên dịch gốc đã chọn để kết hợp.

Nếu bạn muốn chỉ cần có được một thời gian JIT nhanh

Bạn cũng có thể sử dụng NGen để biên dịch nó vào một nhị phân tự nhiên, nhưng bạn vẫn có tất cả các phụ thuộc vào dot net. Máy mục tiêu vẫn cần khung, v.v.

Tuy nhiên, khi bạn ngen bạn TẢI khả năng ứng dụng tự động quảng cáo lên tới 64 bit. Nếu ứng dụng của bạn được biên dịch trước, bạn phải ép buộc một chế độ. Nếu người dùng đang chạy trên máy 64 bit, mã IL của bạn sẽ được quảng cáo (trừ khi bạn gắn cờ nó không).

Thời gian JIT không phải là nút cổ chai lớn nhất của bạn trong hầu hết các ứng dụng. Đó là tải các thư viện khung và các yêu cầu liên quan khác.

Nếu bạn thực sự cần nó, bạn có thể ngấm ngầm trong ứng dụng thiết lập để có được máy mục tiêu người dùng hiện tại.

Tôi cũng vừa mới biết rằng bạn không thể NGEN một ứng dụng và mong đợi nó tận dụng lợi thế của CPU như bạn có thể với JIT. Khi bạn chạy NGEN luôn luôn tối ưu hóa đầu ra cho một PentiumPro vì lý do nào đó, và sẽ không tận dụng được những thứ như SSE, SSE2, vv Vì vậy, tôi sẽ nói rằng loại bỏ NGEN như một trường hợp sử dụng hợp lý.

1

Mono có Thời gian trước (AOT) compiler có thể phát ra mã gốc.