2010-06-07 62 views
49

Có cách nào để biên dịch từ Java sang mã máy độc lập (hoặc thư viện) mà không yêu cầu JVM không?Tôi có thể biên dịch Java thành mã gốc không?

+2

"biên dịch" là từ bạn đang tìm kiếm (thay vì "biên dịch"). –

+4

Nếu bạn quan tâm đến tốc độ, đừng bận tâm trừ khi bạn đang xem một nền tảng mà HotSpot (JVM của Sun) không hỗ trợ. HotSpot biên dịch bytecode thành mã gốc trên bay bất cứ nơi nào một "hotspot" của đường dẫn thực thi (một thứ gì đó chạy rất nhiều) xuất hiện, và nó rất tốt ở đó. Nhưng nếu bạn đang tìm kiếm để tránh yêu cầu một JVM, có, nhìn vào gcj James chỉ cho bạn. –

+1

Tuy nhiên, một lý do khác là bảo vệ chống lại trình giải mã Java. Đối với HotSpot so với trình biên dịch gốc (so với JRockit vs IBM vs GCC so với Visual C++ so với hiệu năng viết tay-CPU-hướng dẫn-in-hex), nó phụ thuộc vào ứng dụng, vì vậy YMMV. –

Trả lời

33

Đã từng là một công cụ gọi là GCJ là một phần của GCC, nhưng nó là been removed. Bây giờ, tất cả các liên kết trong trang GCC sẽ chuyển hướng trực tiếp đến các tài liệu không tương đương GCJ của chúng.

NB: tất cả nhận xét được đề cập đến câu trả lời ban đầu của tôi cho biết bạn có thể biên dịch Java thành mã gốc với GCJ.

+2

+1, tuyệt, tôi không biết về điều đó! – FrustratedWithFormsDesigner

+2

Vâng, gcj là cái nổi tiếng nhất. @ isola009: Hãy nhớ rằng khi biên dịch thành mã gốc, có thể bạn sẽ làm việc với một tập hợp con (có thể là một tập con nhỏ đáng kể) của các thư viện * mà Java thường có theo mặc định. Gnu là khá tốt, bởi tất cả các tài khoản, nhưng cũng đằng sau JDK hiện tại. –

+0

Nó là tốt đằng sau * tất cả * JDKS bắt đầu với 1,2. Tôi đã gặp phải nhiều vấn đề hỗ trợ với những người vô tình chạy GNU classpath thay vì Java, và họ đã được tất cả mà không có ngoại lệ chữa khỏi bằng cách gỡ bỏ cài đặt nó và sử dụng một Sun JDK. – EJP

6

Có, JIT trong JVM thực hiện chính xác điều đó cho bạn.

Thực tế nó có thể tạo mã nhanh hơn so với biên dịch mã trước vì nó có thể tạo mã được tối ưu hóa cho nền tảng cụ thể dựa trên cách mã được sử dụng khi chạy.

JVM luôn tham gia ngay cả khi tỷ lệ phần trăm rất cao được biên dịch thành mã gốc khi bạn có thể tải và chạy mã byte động.

+10

Có, bạn chính xác là JIT thực hiện nó và thực hiện rất tốt. Nó không thực hiện một thực thi độc lập, nhưng sau đó OP không hỏi về điều đó .... –

+2

Bạn dường như gợi ý rằng chỉ có JIT mới có thể thực hiện tối ưu hóa nền tảng cụ thể. Tôi nghĩ rằng nó có thể bất cứ khi nào bạn đang vận chuyển bytecode. ART biên dịch bytecode thành mã gốc khi cài đặt, và nó không phải là JIT. Peter, anh có ý kiến ​​gì về điều này không? –

+0

@JanusTroelsen Bạn có liên kết đến trình biên dịch này không? Nó được sử dụng rộng rãi? Nó đã được thêm vào trong 5 năm qua? Nếu không có JIT, bạn không thể thực hiện biên dịch động mà có thể quan trọng hơn. –

14

Excelsior JET là một Java thương mại cho trình biên dịch mã gốc.

+3

Chỉ trong trường hợp, có giấy phép miễn phí cho các dự án phi thương mại. –

+1

so sánh với RoboVM như thế nào? –

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