Projek Java Valhalla

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat Project Valhalla - sebab sejarahnya, keadaan perkembangan semasa dan apa yang dibawanya untuk pembangun Java sehari-hari setelah dilancarkan.

2. Motivasi dan Sebab untuk Projek Valhalla

Dalam salah satu ceramahnya, Brian Goetz, arkitek bahasa Jawa di Oracle, mengatakan salah satu motivasi utama untuk Projek Valhalla adalah keinginan untuk mengadaptasi bahasa Java dan runtime ke perkakasan moden . Ketika bahasa Jawa dikandung (kira-kira 25 tahun yang lalu pada waktu penulisan), biaya pengambilan memori dan operasi aritmetik kira-kira sama.

Pada masa ini, ini telah berubah, dengan operasi pengambilan memori 200 hingga 1,000 kali lebih mahal daripada operasi aritmetik. Dari segi reka bentuk bahasa, ini bermaksud bahawa petunjuk yang membawa kepada penunjuk pointer mempunyai kesan yang merugikan terhadap prestasi keseluruhan.

Oleh kerana kebanyakan struktur data Java dalam aplikasi adalah objek, kita dapat menganggap Java sebagai bahasa yang berat (walaupun biasanya kita tidak melihat atau memanipulasinya secara langsung). Pelaksanaan objek berdasarkan penunjuk ini digunakan untuk membolehkan identiti objek, yang dengan sendirinya dimanfaatkan untuk ciri bahasa seperti polimorfisme, kebolehubahan dan penguncian. Ciri-ciri tersebut secara lalai untuk setiap objek, tidak kira sama ada ia benar-benar diperlukan atau tidak.

Mengikuti rantaian identiti yang mengarah ke petunjuk dan petunjuk yang menuju ke arah tidak langsung, dengan petunjuk tidak mempunyai prestasi, kesimpulan yang logik adalah membuang struktur struktur data yang tidak memerlukannya. Di sinilah jenis nilai dimainkan.

3. Jenis Nilai

Idea jenis nilai adalah untuk mewakili agregat data murni . Ini hadir dengan menurunkan ciri objek biasa. Jadi, kami mempunyai data murni, tanpa identiti. Ini bermaksud, tentu saja, kita juga kehilangan ciri-ciri yang dapat kita laksanakan menggunakan identiti objek. Oleh itu, perbandingan persamaan hanya boleh berlaku berdasarkan keadaan. Oleh itu, kita tidak dapat menggunakan polimorfisme perwakilan, dan kita tidak dapat menggunakan objek yang tidak dapat diubah atau tidak dapat ditolak.

Oleh kerana kita tidak mempunyai identiti objek lagi, kita dapat menyerah pada petunjuk dan mengubah susunan memori umum jenis nilai, dibandingkan dengan objek. Mari kita lihat perbandingan susun atur memori antara Titik kelas dan titik nilai yang sesuai .

Kod dan susun atur memori yang sesuai dari kelas Point biasa adalah:

final class Point { final int x; final int y; }

Sebaliknya, kod dan susun atur memori yang sesuai dari nilai jenis Point adalah:

value class Point { int x; int y }

Ini membolehkan JVM meratakan jenis nilai menjadi tatasusunan dan objek, dan juga jenis nilai lain. Dalam rajah berikut, kami menunjukkan kesan negatif dari pengarahan ketika kami menggunakan kelas Titik dalam tatasusunan:

Sebaliknya, di sini kita melihat struktur memori sepadan dengan nilai jenis Titik [] :

Ia juga membolehkan JVM meneruskan jenis nilai pada timbunan daripada harus memperuntukkannya di timbunan. Pada akhirnya, ini bermaksud bahawa kita mendapatkan agregat data yang mempunyai tingkah laku runtime yang serupa dengan primitif Java, seperti int atau float .

Tetapi tidak seperti primitif, jenis nilai boleh mempunyai kaedah dan bidang. Kami juga boleh melaksanakan antara muka dan menggunakannya sebagai jenis generik. Oleh itu, kita dapat melihat jenis nilai dari dua sudut yang berbeza:

  • Objek yang lebih pantas
  • Primitif yang ditentukan pengguna

Sebagai lapisan gula tambahan pada kek, kita boleh menggunakan jenis nilai sebagai jenis generik tanpa tinju. Ini secara langsung membawa kita ke ciri Projek Valhalla besar yang lain: generik khusus.

4. Generik Khas

Semasa kami ingin menghasilkan lebih dari bahasa primitif, kami kini menggunakan jenis kotak, seperti Integer untuk int atau Float for float . Tinju ini mewujudkan lapisan tambahan yang tidak langsung, dengan itu mengalahkan tujuan penggunaan primitif untuk peningkatan prestasi sejak awal.

Oleh itu, kami melihat banyak pengkhususan khusus untuk jenis primitif dalam kerangka kerja dan perpustakaan yang ada, seperti IntStream atau ToIntFunction . Ini dilakukan untuk memastikan peningkatan prestasi penggunaan primitif.

Jadi, generik khusus adalah usaha untuk menghilangkan keperluan untuk "peretasan" tersebut. Sebaliknya, bahasa Java berusaha untuk membolehkan jenis generik untuk semua perkara: rujukan objek, primitif, jenis nilai, dan mungkin juga tidak sah .

5. Kesimpulan

Kami telah melihat sekilas perubahan yang akan dibawa oleh Project Valhalla ke bahasa Java. Dua tujuan utama adalah prestasi yang dipertingkatkan dan pengabstrakan yang kurang bocor.

Peningkatan prestasi ditangani dengan meratakan grafik objek dan membuang petunjuk. Ini membawa kepada susun atur memori yang lebih cekap dan lebih sedikit peruntukan dan pengumpulan sampah.

Pengambilan yang lebih baik dilengkapi dengan primitif dan objek yang mempunyai tingkah laku yang lebih serupa apabila digunakan sebagai jenis Generik.

Prototaip awal Project Valhalla, memperkenalkan jenis nilai ke dalam sistem jenis yang ada, mempunyai kod nama LW1.

Kami dapat mencari lebih banyak maklumat mengenai Project Valhalla di halaman projek dan JEP yang sesuai:

  • Projek Valhalla
  • JEP 169: Objek Nilai
  • JEP 218: Generik berbanding Jenis Primitif