Có thể biên dịch Java thành mã máy không? (Không phải mã byte)


32

Bạn có thể biên dịch Java thẳng vào mã máy không?

Tôi muốn làm điều này để tôi có quyền kiểm soát những nền tảng được sử dụng trên đó và không biết C, C ++, v.v.

Câu trả lời:


36

Dường như Trình biên dịch GNU cho Java có thể chuyển đổi mã nguồn Java thành mã byte Java hoặc mã máy. Nó cũng có thể chuyển đổi mã byte Java hiện có thành mã máy. Tuy nhiên, tin tức mới nhất là từ năm 2009, vì vậy tôi không chắc nó hiện tại như thế nào và liệu nó có thể xử lý các tính năng mới nhất của ngôn ngữ Java hay không.


1
Nếu mã byte Java không thay đổi kể từ năm 2009, thì mã này vẫn hoạt động mà không có nhà phát triển vẫy cờ "Này! Tôi vẫn ở đây" trên phần mềm.
Robert Harvey

@RobertHarvey Tôi tin rằng Java 7 đã giới thiệu một số khái niệm ngôn ngữ mới, vì vậy nó có thể thất bại trong việc chuyển đổi các tệp nguồn thành mã máy. Nếu mã byte cũng đã thay đổi với các tính năng mới này, thì điều đó cũng sẽ thất bại
Thomas Owens

1
Excelsior JET dường như vẫn còn hoạt động (thương mại). Có Fujitsu TowerJ, nhưng điều đó dường như đã chết cách đây một thập kỷ và hồi đó khá vô nghĩa.
Tom Hawtin - tackline

Tôi đang sử dụng java 6 vì vậy java 7 không có vấn đề gì trong trường hợp của tôi
Russell

1
Trang web của GCJ cho biết họ đã không hỗ trợ đầy đủ ngay cả Java 1.5. Xem chủ đề này: stackoverflow.com/a/4040404/1257384
GregT

13

Không hoàn toàn trực tiếp trả lời OP, nhưng có lẽ là một điều thú vị sang một bên. Java có thể được chạy trong ba chế độ:

  1. Hỗn hợp (mặc định) - Một sự kết hợp của mã được biên dịch và máy được biên dịch (máy được biên dịch == được biên dịch bởi JIT khi chạy)
  2. Với -Xintcờ - Giải thích - Chỉ mã byte
  3. Với -Xcompcờ - Biên dịch - máy biên dịch

1
@Martjin Đây có phải là HotSpot không? Tình cờ bạn có tài liệu tham khảo -Xcompvì tôi không thể tìm thấy tài liệu đó trong tài liệu JDK 7 hoặc tài liệu tùy chọn HotSpot và không chắc chắn nếu bạn có một số bí mật danh sách gửi thư ẩn mà chúng tôi, những người bình thường, không biết :-)
edalorzo

2
Đây là một tùy chọn ẩn có chủ ý có :-). Có nhiều danh sách gửi thư openjdk (openjdk.java.net) mà bạn có thể lượm lặt được loại thông tin này từ - hoặc đọc mã nguồn :-)
Martijn Verburg

Xin lưu ý rằng theo các thử nghiệm của tôi, -Xcomp có thể có hiệu suất kém hơn (theo hệ số hai) trong một số trường hợp.
Daniel Lemire

À vâng. Việc tối ưu hóa đúng lúc rất khó thực hiện khi JIT thậm chí không chạy. Có thể có! = Sẽ có.
candied_orange

ummm vậy đây là những lựa chọn để javac? Khi sử dụng -Xcomp, mặc định nó có xuất ra một tệp nhị phân không?
Alexander Mills

7

Có thể tốt hơn để phát hiện hệ điều hành bằng System.getProperty (INTERN os.name tựa) . Điều đó sẽ cho phép bạn chọn hỗ trợ nhiều hơn một HĐH, nhưng loại trừ các HĐH khác.


Có cách nào để điều này có thể bị đánh lừa / chơi game không?
Thất vọngWithFormsDesigner

@Frustrated, có lẽ, nhưng tôi đã cho rằng ý định của anh ta là tránh xa các hệ điều hành hỗ trợ chính thức mà anh ta chưa thử nghiệm. Nó không có ý nghĩa khác để vô hiệu hóa tính di động mà bạn nhận được về cơ bản là miễn phí.
Karl Bielefeldt

Cũng có thể là anh ta muốn buộc chương trình vào phần cứng cụ thể theo cách độc lập với hệ điều hành.
Thất vọngWithFormsDesigner

Bạn có thể buộc thuộc tính hệ thống "os.name" bằng cách sử dụng các đối số đặc biệt cho JVM : java -Dos.name=MacOS.
SkyDan

2

Bây giờ: GraalVM cho phép bạn biên dịch các chương trình của mình trước thời hạn thành một tệp thực thi riêng. Hãy xem tính năng hình ảnh gốc :

Câu hỏi liên quan: 'Tôi có thể biên dịch Java thành mã gốc không?' https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ không được duy trì nữa.
Nguồn: 'Việc xóa gcj' http://tromey.com/blog/?p=911

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.