Apakah ada manfaat untuk memutakhirkan kode kompilasi Java 7 ke Java 8?

127

Saya memiliki aplikasi lama yang ditulis menggunakan Java 7. Ini berjalan dengan baik di Java 8 JRE. Saya tidak berencana untuk menulis ulang salah satu kode untuk menggunakan fitur Java 8. Apakah ada manfaat teknis untuk memutakhirkan kode yang dikompilasi ke Java 8 JDK terbaru?

Supaya jelas, kode saat ini dikompilasi dengan Java 7 dan sudah berjalan dengan Java 8 JRE terbaru. Seharusnya sudah mendapat manfaat dari perbaikan runtime Java 8. Pertanyaan ini adalah apakah manfaat apa pun akan diperoleh dengan mengkompilasi dengan versi 8 dan menjalankannya dengan kode byte yang dikompilasi Java 8.


Juga, saya tidak peduli dengan manfaat non-teknis seperti produktivitas pengembang. Saya pikir itu penting tetapi bukan inti dari pertanyaan ini. Saya meminta demi kode produksi yang tidak memiliki tim pengembangan. Ini murni dalam mode pemeliharaan.

g8torPaul
sumber
2
Untuk lebih jelasnya. Kode sudah berjalan dengan JRE 1.8 terbaru dan karena itu memiliki semua perbaikan bug Java 8 terbaru dan peningkatan kinerja runtime (setahu saya).
g8torPaul
4
Ini adalah pertanyaan yang mungkin lebih banyak tentang bytecode yang dikeluarkan oleh kompiler. Mungkin membuatnya sedikit lebih jelas dalam pertanyaan Anda.
M Platvoet
2
Jadi peningkatan produktivitas pengembang tidak relevan di sini?
Mick Mnemonic
7
Bagaimana bisa "Saya tidak berencana menulis ulang salah satu kode" tidak jelas saya tidak percaya.
Eldo
3
Ini mungkin agak terkait: stackoverflow.com/questions/21732290/…
Arnaud

Jawaban:

82

Jika saya memahami pertanyaan dengan benar, Anda ingin tahu apakah bytecode yang dihasilkan oleh javacakan "lebih baik" di Java 8 daripada di Java 7.

Jawabannya mungkin tidak, mereka terus-menerus memperbaiki bug di kompiler dan yang kadang-kadang mengarah ke bytecode yang lebih efisien. Tapi Anda tidak akan melihat peningkatan signifikan dari perbaikan ini untuk Java 8 sejauh yang saya bisa lihat, changelog hanya mencantumkan 2 perubahan besar antara versi.

Situs web oracle sangat buruk dan sepertinya saya tidak bisa mendapatkan daftar perbaikan bug yang terkait dengan javacantar versi, tetapi di sini ada yang tidak lengkap dari OpenJDK . Mayoritas yang saya dapat temukan adalah memperbaiki kesalahan. Jadi dengan memperbarui ke Java 8, ada kemungkinan ia tidak dapat mengkompilasi lagi karena javaclebih tepatnya mengikuti JLS dan akan ada sangat sedikit atau tidak ada "perbaikan" pada bytecode.

Andrew
sumber
4
Terima kasih, saya telah meninjau beberapa daftar di OpenJDK dan tidak ada yang benar-benar menonjol kecuali bahwa tampaknya mereka telah meningkatkan kinerja javac. Saya setuju bahwa hampir tidak mungkin melakukan pencarian perbaikan / fitur yang wajar antara versi Java di situs web Oracles. Format catatan rilis untuk setiap versi bahkan tidak konsisten.
Naluri
1
@ g8torPaul kecuali Anda akan menggunakan fitur yang hanya tersedia di Java 8, misalnya lamdbas / stream
Peter Lawrey
21

Manfaat utama adalah bahwa Java 8 memiliki perbaikan bug terbaru sedangkan Java 7 tidak diperbarui secara publik.

Juga jika Anda akan menjalankan kode pada Java 8 JVM, Anda mungkin juga hanya memiliki satu versi Java yang diinstal.

Java 8 mungkin lebih cepat, dan memiliki dukungan yang lebih baik untuk fitur-fitur baru seperti G1. Namun, ini mungkin lebih lambat untuk kasus penggunaan Anda sehingga satu-satunya cara untuk mengetahuinya adalah dengan mengujinya.

Apakah ada manfaat teknis untuk memutakhirkan kode yang dikompilasi ke Java 8 JDK terbaru?

Jika Anda bertanya apakah ada manfaat dalam mengkompilasi ulang kode Java 7 di kompiler Java 8, jawabannya adalah; hampir tidak ada.

Satu-satunya perbedaan halus adalah bahwa ada perbedaan kecil pada Java API, jadi mungkin ada perbedaan yang sangat halus yang mungkin ditemukan oleh kompiler Java 8 bahwa Java 7

Perbedaan kecil lainnya adalah angka ajaib pada awal file, mungkin urutan pool konstan. Kode byte pada dasarnya sama, bahkan dukungan invokedynamicyang ditambahkan untuk lambdas ada di Java 7 tetapi tidak digunakan seperti itu.

Peter Lawrey
sumber
8
Perbaiki saya jika saya salah, tetapi OP bertanya tentang mengkompilasi ulang kode dengan Java 8, sedangkan jawaban Anda adalah apakah akan menggunakan Java 8 untuk menjalankannya?
tobias_k
5
Saat ini saya sedang menjalankan Java JRE 1.8 terbaru. Semua perbaikan bug dan kode Java internal akan disediakan oleh JRE. Saya tidak berpikir ini menjawab pertanyaan saya.
g8torPaul
16
Ini sama sekali tidak menjawab pertanyaan. Jika "hampir tidak ada" tolong jelaskan apa perbedaannya. Kalau tidak, itu hanya berspekulasi
M Platvoet
1
@Peter Lawrey, Anda mengatakan bahwa ".. jawabannya adalah; hampir tidak ada". Apakah kita punya bukti untuk mendukungnya? BTW, saya cenderung setuju dengan Anda.
g8torPaul
2
@ g8torPaul Java 8 dirancang agar kompatibel dengan Java 7 dan jika Anda tidak menggunakan salah satu fitur Java 8, ia seharusnya menghasilkan kode byte yang hampir persis sama.
Peter Lawrey
21

Ini bisa membantu dengan menciptakan kesadaran .

Saat Anda beralih ke Java8, Anda mungkin menemukan peringatan tambahan yang dipancarkan oleh javac. Contoh: inferensi tipe telah sangat ditingkatkan dengan Java8. Dan itu bisa menghilangkan kebutuhan untuk penjelasan @SuppressWarnings di basis kode Anda saat ini (dan ketika penjelasan seperti itu tidak lagi diperlukan, kompiler memperingatkan tentang itu).

Jadi, bahkan ketika Anda tidak bermaksud untuk memodifikasi basis kode Anda hari ini, beralih ke Java8 dapat memberi tahu Anda tentang hal-hal seperti itu. Meningkatkan pengetahuan Anda dapat membantu dalam membuat keputusan yang tepat.

Di samping itu:

  • Saya melihat beberapa pertanyaan di sini tentang situasi (jarang) di mana Java8 menolak untuk mengkompilasi kode Java7. Jadi, beralih ke Java8 juga membawa risiko (minimal) untuk mengalami masalah semacam itu.
  • Dan: bahkan ketika Anda tidak bermaksud menyentuh basis kode Anda hari ini , ada kemungkinan Anda berubah pikiran nanti. Dan kemudian, ketika tidak memperhatikan, Anda mungkin mengeksploitasi fitur Java8. Yang bisa menyulitkan "pembaruan lapangan"; karena Anda sekarang memiliki dua versi kode sumber untuk dipelihara!
  • Lalu: jika Anda memiliki pelanggan yang menjalankan produk menggunakan java7 jre; Anda harus benar-benar berhati-hati tentang perbaikan biner yang Anda berikan kepada mereka. Kami memiliki pengaturan seperti itu; dan saya telah membuang-buang waktu lebih dari sekali karena saya tidak sengaja menempatkan satu kelas yang dikompilasi Java8 ke sistem tes yang digerakkan Java7. Itu tidak bisa terjadi ketika setup dev dan tes / pelanggan Anda semua adalah Java7.

Singkat cerita: ada beberapa keuntungan yang tidak kentara, dan risiko tertentu (di mana pentingnya risiko tersebut tergantung pada pengaturan keseluruhan Anda).

GhostCat
sumber
2
Salah satu contoh masalah "Java8 yang ditolak untuk mengkompilasi Java7" yang langka: stackoverflow.com/q/41590024/2513200 (masalah yang diketahui dari Oracle Compiler hanya memengaruhi Java 8, tetapi tidak pada 7 atau 9)
Hulk
8

Saya akan lakukan setidaknya untuk fakta-fakta ini.

1) HashMap internal (lebih cepat di bawah jdk-8)

2) Banyak bug diperbaiki yang mungkin transparan bagi Anda (optimasi runtime) yang akan membuat kode Anda lebih cepat dan lebih baik tanpa Anda benar-benar melakukan apa pun.

3) Pengumpul Sampah G1

EDIT

Dari sudut pandang teknis, ini kedengarannya lebih mirip dengan Kompilasi Ahead of Time atau sesuatu yang mungkin ditingkatkan oleh kompiler dengan menganalisis kode lebih banyak. Sejauh yang saya tahu hal-hal seperti itu tidak dilakukan dalam kompiler java 8.

Dari sudut pandang pengembang - ada banyak. Peningkatan produktivitas adalah yang paling penting bagi saya.

EDIT 2

Saya hanya tahu dua poin yang cocok dengan permintaan kedua Anda:

–Parameter

untuk mempertahankan nama parameter metode.

-Profil

Disebut Pilihan Profil Ringkas untuk jejak yang lebih kecil.

Eugene
sumber
26
Bukankah menjalankan di bawah Java 8 sudah memberikan manfaat ini? Pertanyaan sebenarnya tampaknya adalah, "bisakah saya menulis sesuatu di Java 8 yang bekerja lebih baik daripada Java 7 yang setara".
Jorn Vernee
8
Saat ini saya sedang menjalankan Java JRE 1.8 terbaru. Semua perbaikan bug dan kode Java internal akan disediakan oleh JRE. Pengumpul sampah juga merupakan bagian dari JRE. Saya tidak berpikir ini menjawab pertanyaan saya.
g8torPaul
8
@JornVernee OPs secara eksplisit mengatakan bahwa dia tidak ingin menulis ulang apa pun, jadi pertanyaannya, seperti yang saya mengerti, lebih seperti "dapatkah kompiler Java 8 melakukan trik yang tidak dapat dilakukan oleh kompiler Java 7"
tobias_k
2
@JornVernee Pertanyaannya adalah, jika kode yang ditulis dalam Java 7 dan dikompilasi di Java 8 mengeksekusi lebih baik maka kode dikompilasi di Java 7
EarlGrey
6
Tidak menjawab pertanyaan dan hanya berspekulasi itu belum membaik.
M Platvoet
-1

Jika Anda tidak memiliki alasan lain untuk mengkompilasi ulang aplikasi Anda, maka itu mungkin tidak membuat banyak perbedaan, sebagaimana dinyatakan dalam jawaban yang diterima.

Namun, jika Anda harus mengkompilasi ulang hanya sekali saja, pertimbangkan ini:

  • Kode sumber aplikasi Anda kompatibel dengan Java 7, dan kemungkinan besar 8 juga;
  • Dalam kemungkinan kode tidak dikompilasi dengan Java 8, mungkin tidak akan dikompilasi dengan kompiler Java 8 dalam mode kompatibilitas sumber Java 7 ( -source 7dengan javac);
  • Pengembang dan CI Anda harus menjalankan pengujian unit dan integrasi terhadap runtime Java 8 agar sedekat mungkin dengan lingkungan produksi. Pengembang juga perlu menjalankan aplikasi pada runtime Java 8 yang sama saat menjalankannya secara lokal;
  • Lebih sulit untuk dikompilasi dengan JDK 7 dan dijalankan dengan JRE 8 (dalam proses build yang sama, atau dalam IDE yang sama) daripada melakukan semuanya dengan versi yang sama;
  • Tidak ada manfaat menggunakan -source 7daripada -source 8jika Anda mengkompilasi dengan JDK 8 dan runtime target Anda adalah Java 8;
  • Menggunakan -source 8jaminan bahwa pengembang menggunakan Java 8 (atau lebih baru) untuk kompilasi dan runtime (saat diberlakukan -target 8).

Kesimpulannya, jangan kompilasi ulang jika Anda tidak perlu. Namun, pada kesempatan pertama Anda harus mengkompilasi ulang (karena perubahan kode), beralih ke Java 8. Jangan mengambil risiko memiliki bug karena ketidakcocokan lingkungan, dan jangan membatasi pengembang tanpa alasan yang baik.

Didier L
sumber
Poin kedua tidak benar. Posting Anda saling bertentangan di beberapa titik.
Marquis of Lorne
@ EJP Poin kedua adalah lebih dari pengalaman saya, tetapi apakah Anda memiliki contoh yang mengkompilasi di JDK 8 dengan -source 7tetapi tidak mengkompilasi dengan -source 8? Juga, dapatkah Anda menunjukkan kontradiksi karena komentar Anda tidak terlalu konstruktif seperti itu ...
Didier L