Apakah mungkin untuk mengkompilasi Java ke dalam kode mesin? (Bukan bytecode)


32

Bisakah Anda memiliki Java dikompilasi langsung ke kode mesin?

Saya ingin melakukan ini sehingga saya memiliki kendali atas platform apa yang digunakannya, dan tidak tahu C, C ++ dll.

Jawaban:


36

Tampaknya Kompilator GNU untuk Java dapat mengubah kode sumber Java menjadi bytecode atau kode mesin Java. Itu juga dapat mengkonversi bytecode Java yang ada ke dalam kode mesin. Namun, berita terakhir adalah dari 2009, jadi saya tidak yakin bagaimana saat ini dan apakah itu dapat menangani fitur-fitur terbaru dari bahasa Jawa.


1
Jika bytecode Java tidak berubah sejak 2009, ini akan tetap bekerja tanpa pengembang melambaikan bendera "Hei! Aku masih di sini" pada perangkat lunak.
Robert Harvey

@ RobertTarvey Saya percaya Java 7 memperkenalkan beberapa konsep bahasa baru, jadi mungkin gagal mengubah file sumber menjadi kode mesin. Jika bytecode juga berubah dengan fitur-fitur baru ini, maka itu akan gagal juga
Thomas Owens

1
Excelsior JET tampaknya masih aktif (komersial). Ada Fujitsu TowerJ, tetapi itu tampaknya telah mati satu dekade yang lalu dan saat itu tidak ada gunanya.
Tom Hawtin - tackline

Saya menggunakan java 6 jadi java 7 tidak ada masalah dalam kasus saya
Russell

1
Situs web GCJ mengatakan tidak sepenuhnya mendukung Java 1.5. Lihat utas ini: stackoverflow.com/a/4040404/1257384
GregT

13

Tidak secara langsung menjawab OP, tapi mungkin yang menarik. Java dapat dijalankan dalam tiga mode:

  1. Campur (default) - Kombinasi dari kode yang ditafsirkan dan dikompilasi dengan mesin (mesin dikompilasi == dikompilasi oleh JIT saat runtime)
  2. Dengan -Xintflag - Diterjemahkan - Kode byte saja
  3. Dengan -Xcompflag - Dikompilasi - mesin dikompilasi

1
@ Martjin Apakah ini untuk HotSpot? Kebetulan Anda punya referensi untuk itu -Xcompkarena saya tidak dapat menemukan bahwa satu di dokumentasi JDK 7 atau dokumentasi opsi HotSpot dan tidak yakin jika Anda memiliki beberapa rahasia milis tersembunyi yang kami, manusia biasa, tidak tahu :-)
edalorzo

2
Ini adalah opsi yang sengaja disembunyikan ya :-). Ada berbagai milis openjdk (openjdk.java.net) Anda dapat memperoleh info semacam ini dari - atau membaca kode sumber :-)
Martijn Verburg

Harap dicatat bahwa menurut pengujian saya, -Xcomp dapat memiliki kinerja yang lebih buruk (dengan faktor dua) dalam beberapa kasus.
Daniel Lemire

Yah begitulah. Hanya dalam waktu optimasi sulit dilakukan ketika JIT bahkan tidak berjalan. Dapat memiliki! = Akan memiliki.
candied_orange

ummm jadi ini opsi untuk javac? saat menggunakan -Xcomp apakah secara default menghasilkan satu file biner?
Alexander Mills

7

Mungkin lebih baik untuk mendeteksi sistem operasi menggunakan System.getProperty ("os.name") . Itu memungkinkan Anda memilih untuk mendukung lebih dari satu OS, tetapi mengecualikan yang lain.


Apakah ada cara ini bisa dibodohi / gamed?
FrustratedWithFormsDesigner

@Frustasi, mungkin, tapi saya berasumsi maksudnya adalah untuk menjaga agar tidak secara resmi mendukung sistem operasi yang belum dia uji. Tidak masuk akal jika tidak secara khusus menonaktifkan portabilitas yang Anda dapatkan secara gratis.
Karl Bielefeldt

Mungkin juga ia ingin mengikat program ke perangkat keras tertentu dengan cara yang tidak tergantung OS.
FrustratedWithFormsDesigner

Anda bisa memaksa "os.name" properti sistem dengan menggunakan argumen khusus untuk JVM: java -Dos.name=MacOS.
SkyDan

2

Sekarang: GraalVM memungkinkan Anda mengkompilasi program Anda sebelumnya menjadi executable asli. Lihatlah fitur gambar asli :

Pertanyaan terkait: 'Bisakah saya mengkompilasi Java ke kode asli?' https://stackoverflow.com/questions/2991799/can-i-compile-java-to-native-code/50555050#50555050


PS GCJ tidak dipertahankan lagi.
Sumber: 'Penghapusan gcj' http://tromey.com/blog/?p=911

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.