2011-08-02 38 views
26

Có cách nào để thực hiện một kết xuất lắp ráp của mã gốc được tạo bởi trình biên dịch Java trong thời gian không?Tháo rời Java JIT biên dịch bytecode bản địa

Và một câu hỏi liên quan: Có cách nào để sử dụng trình biên dịch JIT mà không cần chạy JVM để biên dịch mã của tôi thành mã máy gốc không?

+0

Heresy! Không, chỉ đùa thôi. Câu hỏi thú vị! +1 –

+0

Làm cách nào để bạn có quyền truy cập vào mã được biên dịch "chỉ trong thời gian" này? Bởi vì nó được thực hiện trên bay lúc chạy, tôi tự hỏi làm thế nào bạn có thể truy cập nó để làm một bãi chứa lắp ráp trên nó ... –

+3

Câu hỏi đầu tiên của bạn là lạ nhưng thứ hai gợi ý rằng bạn nên làm một số đọc về chủ đề này. Việc biên dịch JIT theo định nghĩa dựa trên thông tin chỉ có sẵn trong thời gian chạy, vì vậy nó giống như bạn đang hỏi liệu có cách nào để sử dụng bộ mã hóa MP3 để mã hóa một bài hát mà không phải ghi lại nó trước hay không. – entonio

Trả lời

16

Có, there is a way để in mã gốc được tạo (yêu cầu OpenJDK 7).

Không, không có cách nào để biên dịch mã Java bytecode của bạn thành mã gốc bằng JIT của JDK và lưu nó dưới dạng tệp thực thi tự nhiên.

Thậm chí nếu điều này là có thể, nó có thể sẽ không hữu ích như bạn nghĩ. JVM thực hiện một số tối ưu hóa rất tinh vi và thậm chí nó có thể khử mã tối ưu khi cần thiết. Nói cách khác, nó không đơn giản như JIT biên dịch mã của bạn thành ngôn ngữ máy bản địa, và sau đó ngôn ngữ máy bản địa đó sẽ không thay đổi trong khi chương trình đang chạy. Ngoài ra, điều này sẽ không cho phép bạn tạo một tệp thực thi tự nhiên độc lập với thư viện JVM và thời gian chạy.

2

Bạn không thể sử dụng JIT để tạo một tệp thực thi độc lập, bạn cần một số hệ thống khác như GCJ. Theo như thấy mã JIT được tạo ra, hãy kiểm tra nguồn OpenJDK để tìm các tùy chọn gỡ lỗi. Bạn có thể xây dựng bản sao của riêng bạn với những người được kích hoạt và xem những gì JIT đang làm, hoặc thêm các cải tiến của riêng bạn để sản xuất bất cứ điều gì bạn thích.

3

Nếu Amigable Clark Kant nghĩ câu hỏi của bạn là dị giáo, anh ấy sẽ thực sự lật ngược câu trả lời này. Gửi tệp này trong "điều có thể" không nhất thiết trong "Justin đề xuất". :-)

Một tùy chọn là sử dụng IKVM.NET để xử lý mã Java của bạn bằng cách sử dụng Mono. IKVM.NET cho phép bạn chạy mã Java trên đầu trang của .NET or the Mono CLR. Một số có thể nói rằng bạn đang bỏ qua JVM theo cách này mặc dù nó sẽ chính xác hơn khi nói rằng IKVM.NET thực sự là một cài đặt của JVM chạy trên CLR.

Ở bất kỳ mức nào, nếu bạn làm điều này, bây giờ bạn có tùy chọn làm Ahead-of-time (AOT) biên dịch mã của bạn bằng Mono. Tức là, bạn có thể biên dịch mã của bạn xuống tận gốc máy, nghĩa là bạn không cần CLR hoặc JVM khi chạy.

Không giống như những gì Jesper đã nói ở trên, việc sử dụng trình biên dịch AOT thực sự có thể dẫn đến hiệu suất tốt hơn. Mặc dù đúng là JVM (và CLR) thực hiện một số tối ưu hóa trong thời gian chạy mà không thể thực hiện tại thời gian biên dịch, ngược lại cũng đúng. Ngoài ra, một trong các tùy chọn là sử dụng LLVM để tạo mã thường mang lại hiệu suất tốt hơn.

Dưới đây là các đường ống dẫn trong một nutshell:

Mã của bạn -> IKVM.NET -> Mono -> LLVM -> Native thực thi

Hoặc, chỉ cần sử dụng một trình biên dịch Java được thiết kế để tạo ra AOT bản thực thi gốc từ đầu (như GCJ hoặc Excelsior Jet).

Một nơi mà tùy chọn Mono/IKVM.NET có thể hữu ích là nếu bạn muốn sử dụng thư viện Java như một phần của ứng dụng iPhone (sử dụng MonoTouch). App Store chỉ cho phép các tệp nhị phân gốc.

EDIT: Bạn cũng có thể sử dụng LLVM VMKit để AOT biên dịch mã Java thành mã máy.Đây là khái niệm tương tự như quá trình tôi mô tả với Mono nhưng giữ những thứ khó chịu CIL ra khỏi hình ảnh.

1

Khám phá Oracle Solaris Studio Performance Analyzer. Tôi thấy Charlie Hunt giới thiệu nó tại một hội nghị, và nó thật đơn giản. Nó cho phép bạn thực hiện gỡ lỗi và tháo gỡ các ứng dụng Java trong thời gian chạy, tức là xem hướng dẫn của máy bằng các điểm nóng thực sự được đánh dấu. Xem thêm cuốn sách này trích đoạn: http://charliehunt.ulitzer.com/node/2067673

Nhiều tài liệu: Oracle Solaris Studio 12.2: Performance Analyzer

1

Yea Tôi cũng đã suy nghĩ nó sẽ rất khó để có được JIT xuất thuần nhưng giấy kẻ này tiếp tục thể hiện mã gốc nhưng không nói như thế nào ông có đầu ra. Tôi có thể hiểu nếu đầu ra từ trình biên dịch JIT sẽ không nhất quán vì nó sẽ thay đổi theo thời gian hoặc bị xóa khỏi bộ đệm mã chỉ để được tái tạo sau này, nhưng làm thế nào để bạn có được một bản chụp nhanh của một số assembly cho một số khối mã. : |

http://www.google.com/url?sa=t&rct=j&q=Java+annotation+for+optimization&source=web&cd=15&ved=0CKEBEBYwDg&url=http%3A%2F%2Floome.cs.uiuc.edu%2Fpubs%2Fjones-kamin.pdf&ei=8vj-UN63C-bQ2QX-9IDoDQ&usg=AFQjCNEegMNXLwKyUTTJ5ljgnP7X9rPXHg&bvm=bv.41248874,d.b2I

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