Tôi có thể biên dịch Java sang mã gốc không?


81

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


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

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

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

1
Tôi đã tìm thấy một sự phát triển thú vị của Oracle cho cơ sở dữ liệu Oracle có tên là JServer Accelerator. Nó cũng được thiết kế để trở thành nền tảng Phụ thuộc theo một cách nào đó bằng cách biên dịch không phải mã byte mà sang mã C. docs.oracle.com/cd/A87860_01/doc/java.817/a83727/jtools5.htm
siêu tân tinh

6
Tôi không hiểu tại sao câu hỏi này lại bị đóng bởi những người kiểm duyệt. Nó dường như hoàn toàn rõ ràng đối với tôi. Nếu họ không hiểu thì có lẽ vấn đề là ở họ.
isapir

Câu trả lời:


40

Đã từng có một công cụ gọi là GCJ là một phần của GCC, nhưng nó đã bị loại bỏ . Bây giờ, tất cả các liên kết trong trang GCC lại chuyển hướng đến các liên kết không phải GCJ của chúng.

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


2
Yeah, gcj là cái được biết đến nhiều nhất. @ isola009: Hãy nhớ rằng khi biên dịch sang mã gốc, bạn có thể sẽ làm việc với một tập hợp con (có thể là một tập hợp con rất nhỏ) của các thư viện mà Java thường có theo mặc định. Gnu's là khá tốt, theo tất cả các tài khoản, nhưng kém hơn JDK hiện tại.
TJ Crowder

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

Excelsior JET bao gồm việc triển khai được cấp phép của thư viện tiêu chuẩn Java SE 6 và đã vượt qua các bài kiểm tra tuân thủ chính thức (JCK). Hiện tại nó đang ở mức 6u18, phiên bản tiếp theo dự kiến ​​sẽ hỗ trợ 6u20.
Dmitry Leskov

27

Đúng!

Oracle đã và đang làm việc trên GraalVm, hỗ trợ Hình ảnh gốc. Kiểm tra tại đây: https://www.graalvm.org/

Hình ảnh gốc Tính năng hình ảnh gốc với GraalVM SDK giúp cải thiện thời gian khởi động của các ứng dụng Java và mang lại cho chúng một dấu ấn nhỏ hơn. Một cách hiệu quả, nó chuyển đổi mã bytecode chạy trên JVM (trên bất kỳ nền tảng nào) sang mã gốc cho một hệ điều hành / nền tảng cụ thể - đó là nguồn gốc của hiệu suất. Nó sử dụng các tính năng tối ưu hóa trước thời gian (AOT) tích cực để đạt được hiệu suất tốt.

Xem thêm:


Đáng buồn thay, ngay cả khi dự án này không ổn định để sản xuất và việc sử dụng API Swing vẫn không được hỗ trợ / buggy: github.com/oracle/graal/issues/1327
BullyWiiPlaza

"Bản phát hành GraalVM 19.0:" GraalVM cuối cùng đã trưởng thành và sẵn sàng để sử dụng trong sản xuất ". Tất nhiên sẽ có lỗi và một số chức năng chưa hoàn thiện. Nhưng twitter sử dụng nó cho hệ thống sản xuất của họ, vì vậy tôi không đồng ý với yêu cầu bồi thường.
RobAu

Kinh nghiệm cá nhân của tôi là Windowschỉ có các chương trình đồ chơi hoạt động nhưng bất kỳ thứ gì cao cấp hơn và / hoặc khi sử dụng GUIvẫn chưa hoàn thiện. Twittercó thể sử dụng Linuxmà không có bất kỳ GUInhưng có lẽ họ cũng sử dụng phiên bản thương mại trong khi tôi chỉ dùng thử một phiên bản cộng đồng. Nó có thể hoạt động đối với một số trường hợp sử dụng nhưng các Windowsứng dụng máy tính để bàn Java không phải là một trong số chúng, điều này vẫn khiến dự án hơi thất vọng. Excelsior JETcó thể làm điều này một cách đáng tin cậy nhưng nó đã ngừng hoạt động.
BullyWiiPlaza


11

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

Trên thực tế, nó có thể tạo ra mã nhanh hơn so với việc 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 trong thời gian chạy.

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


18
Đúng, bạn nói đúng rằng JIT làm được và làm rất tốt. Nó không có một thực thi độc lập, nhưng sau đó các OP đã không hỏi về điều đó ....
Bill K

2
Bạn dường như cho 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ể thực hiện bất cứ khi nào bạn đang vận chuyển bytecode. ART biên dịch mã bytecode thành mã gốc khi cài đặt và nó không phải là JIT. Peter, bạn có nhận xét gì về điều này?
Janus Troelsen

2
OP đề cập đến, độc lập, chỉ vượt trội bất kỳ loại JIT nào: Trong khi JIT tạo ra mã gốc ngay lập tức, nó không bao giờ là độc lập.
StormByte

1
@KurtFitzner Tôi nghĩ bạn có một ý tưởng rất khác về những gì Trình biên dịch JIT thực hiện, nó biên dịch sang mã gốc nơi không liên quan đến việc diễn giải.
Peter Lawrey

2
Tôi không tin rằng một trình biên dịch JIT có thể cung cấp nhiều khả năng tối ưu hóa sâu sắc như các trình biên dịch / trình liên kết AOT gốc làm được: biên dịch và liên kết với tối ưu hóa hoàn toàn sẽ khiến bất kỳ máy tính nào phải bó tay; nếu không, thì trình biên dịch đang không cố gắng tối ưu hóa.
Johan Boulé

0

Một khả năng khác sẽ là RoboVM. Tuy nhiên, nó dường như chỉ hoạt động Linux, iOSMac OS X.

Cho đến ngày hôm nay, dự án vẫn còn tồn tại phần nào trái ngược với một số bài đăng trên mạng cho rằng dự án đã chết .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.