Apa fokus utama Java? Mengapa butuh waktu lama untuk mendapatkan fitur baru?

10

Saya telah menjelajahi fitur-fitur baru di JDK8, seperti ekspresi lambda, metode ekstensi, dan API aliran baru.

Jelas tidak ada fitur-fitur ini yang baru di dunia pemrograman dan yang membuat heran mengapa mendapatkan semua ini di Jawa sampai sekarang.

Kami memiliki ekspresi lambda di Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) dan 55 tahun setelah Lisp dan praktis semua orang, di Jawa (2013).

Dan saya telah membaca tentang stream di SIC (1996).

Saya bertanya-tanya mengapa sekarang? Bukti menunjukkan bahwa bersaing dengan bahasa lain bukanlah motivasi.

Tampaknya semua fitur baru yang keren dalam rilis Java ini hanyalah produk sampingan dari penerapan paralelisme. Kami memiliki lambdas karena mereka membuat penulisan algoritma paralel lebih sederhana, dan kami memiliki metode ekstensi karena kami membutuhkannya untuk memberikan dukungan terhadap perubahan yang diperlukan ekspresi lambda, dll., Dll.

Jadi, pertanyaan saya adalah: dapatkah kita memastikan bahwa topik utama dalam rilis Jawa yang akan datang ini adalah paralelisme? Atau dapatkah kita menjustifikasi alasan lain untuk kemunculan trik tertua dalam buku sampai sekarang di Jawa?

edalorzo
sumber
4
Semua ini dapat berubah menjadi flamewar tentang ketertinggalan Jawa.
Michael K
5
The evidence suggests- tolong bagikan penelitian Anda.
2
Tidak ada fitur di Jawa atau di JVM atau di JRE yang baru. Dan bahkan kombinasi fitur bukanlah hal baru, Eiffel memiliki semua itu pada tahun 1985 (GC, OO, tipe-safety, bahkan Generics yang tidak diperoleh Java sampai tahun 2003). Faktanya, ini telah menjadi tujuan nyata para desainer Java untuk tidak memperkenalkan sesuatu yang baru.
Jörg W Mittag
2
@MichaelK - Saya setuju ini bisa berubah menjadi perang api. Itu juga bisa berubah menjadi jawaban yang sahih tentang sejarah Sun yang menantang; Oracle mengakuisisi Sun dan Java; dan bagaimana pengelola Java saat ini mencoba menggerakkan bahasa. Harapan saya adalah bahwa jawaban akan fokus pada aspek-aspek konstruktif dari pertanyaan ini.
@MichaelT: Saya harap itu tidak akan berubah menjadi perang api dan beberapa ide menarik bisa muncul. Sebagai contoh, sering kita mengasumsikan bahwa bahasa yang tidak terus-menerus berkembang ada di belakang zaman. IMO ini tidak benar karena mengasumsikan bahwa evolusi bahasa adalah linear (bahwa semua fitur baru yang menjadi populer adalah baik dan harus diadopsi oleh semua bahasa modern). Tetapi pengelola bahasa dapat memutuskan bahwa fitur baru tidak cocok dengan bagian bahasa lainnya. Juga, pertimbangkan bahwa ada bahasa yang distandarisasi dan stabil yang pasti tidak ketinggalan zaman (misalnya Common Lisp).
Giorgio

Jawaban:

12

Ketika Java pertama kali dirancang, dianggap tepat untuk mengabaikan fungsi anonim. Saya dapat memikirkan dua alasan (tetapi mereka mungkin berbeda dari yang resmi):

  1. Java dirancang sebagai bahasa berorientasi objek tanpa fungsi, jadi tidak wajar jika memiliki fungsi anonim dalam bahasa tanpa fungsi. Atau setidaknya, ini akan banyak mempengaruhi desain bahasa.
  2. Fungsi anonim tidak populer di komunitas programmer yang dimaksudkan untuk menarik Java (C, C ++, Pascal?). Bahkan sekarang, banyak programmer Java tampaknya menganggap fitur-fitur ini cukup eksotis (tetapi ini mungkin akan berubah sangat cepat dengan Java 8).

Pada tahun-tahun berikutnya, seperti yang dijelaskan Robert Harvey, kebijakan Sun adalah selalu menjaga Jawa tetap kompatibel dan sangat stabil.

Di sisi lain, bahasa lain yang bersaing telah muncul (yang paling penting adalah C #, yang lahir sebagai klon Jawa dan kemudian mengambil arah pengembangannya sendiri).

Bahasa yang bersaing telah menempatkan Jawa di bawah tekanan karena dua alasan:

Kekuatan ekspresif

Fitur-fitur baru dapat membuat idiom pemrograman tertentu lebih mudah untuk ditulis, membuat bahasa lebih menarik bagi programmer. Biasanya set fitur yang disediakan oleh bahasa adalah kompromi antara kekuatan ekspresif, kompleksitas bahasa, koherensi desain: menambahkan lebih banyak fitur membuat bahasa lebih ekspresif tetapi juga lebih kompleks dan sulit untuk dikuasai.

Bagaimanapun, dalam beberapa tahun terakhir pesaing Java menambahkan banyak fitur baru yang tidak dimiliki Java, dan ini dapat dianggap sebagai keuntungan.

Hype

Ya, sayangnya ini adalah faktor dalam pilihan teknologi, setidaknya dari apa yang dapat saya lihat dalam pengalaman sehari-hari saya sebagai seorang programmer: alat harus memiliki fitur tertentu, bahkan jika sebagian besar anggota tim tidak tahu cara menggunakannya dan mereka yang dapat menggunakannya tidak sering membutuhkannya.

Hype dapat menjadi lebih penting bagi orang-orang non teknis seperti manajer, yang mungkin menjadi orang yang menentukan platform untuk proyek tertentu. Manajer terkadang hanya mengingat beberapa kata kunci seperti lambda, paralelisme, multicore, pemrograman fungsional, komputasi awan, ... Jika teknologi pilihan kami memiliki tanda hijau pada setiap item dalam daftar, maka kami terkini.

Jadi IMO untuk beberapa waktu Java telah terjebak di antara

  • kebijakan asli stabilitas bahasa dan kesederhanaan desain, basis kode besar dan komunitas pengembang di satu sisi, dan
  • tekanan bahasa yang bersaing yang dapat menarik programmer Java, C # pada awalnya, dan kemudian Scala, Clojure, F # (Saya beri nama yang saya tahu, mungkin ada yang lain).

Akhirnya Oracle memutuskan untuk memutakhirkan Java agar lebih kompetitif. Menurut pendapat saya, fitur-fitur baru membahas terutama programmer Java yang mungkin tergoda untuk beralih ke C # dan yang melihat bahasa lain seperti Scala dan Clojure terlalu berbeda dari Jawa. Di sisi lain, pengembang yang memiliki pengalaman dengan pemrograman fungsional dan masih ingin menggunakan JVM mungkin sudah beralih ke Scala, Clojure, atau bahasa lain.

Jadi fitur Java 8 yang baru akan membuat Java lebih kuat sebagai bahasa dan fokus yang dinyatakan adalah pemrograman bersamaan dan paralel, tetapi upgrade tersebut tampaknya juga mencakup aspek pemasaran (Mark Reinhold, kepala arsitek Java di Oracle, mengatakan: "Beberapa orang akan mengatakan menambahkan ekspresi Lambda hanya untuk bersaing dengan anak-anak keren, dan ada beberapa kebenaran di dalamnya, tetapi alasan sebenarnya adalah prosesor multicore; cara terbaik untuk menanganinya adalah dengan Lambda ", lihat artikel ini ).

Jadi, ya, banyak (semua) fitur Java 8 sudah terkenal, tetapi mengapa dan kapan fitur ditambahkan ke bahasa tergantung pada banyak faktor: audiens target, komunitas yang ada, basis kode yang ada, pesaing, pemasaran, dll.

EDIT

Catatan singkat tentang "... Saya telah membaca tentang stream di SIC (1996).": Apakah Anda bermaksud bahwa Anda memerlukan Java 8 lambdas untuk mengimplementasikan stream? Sebenarnya Anda bisa menerapkannya menggunakan kelas dalam anonim.

Giorgio
sumber
+1 Dan saya berharap saya bisa memberi Anda lebih banyak poin karena ini adalah jawaban terbaik sejauh ini untuk pertanyaan itu.
edalorzo
Berdasarkan jawaban Anda, saya menyelidiki lebih banyak tentang apa yang dikatakan Mark Reinhold bahwa saya telah menemukan artikel yang menarik. Saya akan memposting di sini dengan jawaban Anda untuk referensi di masa mendatang: Penutupan untuk Jawa oleh Mark Reinhold .
edalorzo
Dan artikel itu sebenarnya merujuk pada satu lagi Closures for Java .
edalorzo
1
Dari tautan yang Anda kirim, saya menemukan ini ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0 , mengatakan bahwa Java dapat menggunakan kelas dalam anonim, tetapi ini terlalu bertele-tele. Namun, penutupan Java 8 bukan hanya gula sintaksis untuk kelas batin anonim. Jadi sekarang Java akan memiliki DUA (semantik) berbagai jenis penutupan: kelas batin anonim dan ekspresi lambda.
Giorgio
11

Java telah mengubah fokus dengan waktu. Pada awalnya itu dirancang sebagai bahasa yang kuat sederhana, sebagai reaksi terhadap "powerful complex" C ++. Beberapa fitur yang ada di C ++ sengaja ditinggalkan, seperti overloading operator, templat, enum, yang dianggap terlalu rumit atau peninggalan era C, dan OOP berada di puncak popularitasnya, semuanya dijadikan Object dalam satu pandangan dunia paradigma. Lambdas saat ini dianggap "tidak diperlukan" sejak diperkenalkannya kelas anonim / batin di Jawa 1.1. Fakta bahwa sintaksisnya jauh lebih verbose hampir dianggap sebagai fitur .

Java telah menemukan publiknya, tidak ada insentif untuk berubah hingga Microsoft memperkenalkan C #, yang belajar dari pelajaran kesalahan desain Java, dan meluncurkan serangkaian fitur bahasa baru. Mereka tidak dibatasi oleh kompatiblitas mundur. Saya pikir bahwa para konsepsi Java menyadari bahaya kompetisi C # dan merilis Java 5 dengan generik, enum, dll.

Dimasukkannya lambdas di Jawa dibahas sejak saat itu dan itu hanya diperburuk oleh tren saat ini untuk pemrograman fungsional. Tetapi hal-hal seperti ini lambat untuk diperbaiki, dan itu harus benar pertama kali. Menurut pendapat saya Java gagal generik dengan tipe erasure karena kompatibilitas ke belakang dianggap sebagai alasan untuk menerapkannya tidak lebih dari gula sintaksis. Penutupan telah dipikirkan lebih teliti, tampaknya, dan itu akan lebih dari sekadar gula sintaksis.

Kesimpulannya, apa topik utama Java 8? Saya rasa versi bahasa tidak memiliki topik. Sebagai C ++ 11, raison d'etre Java 8 adalah untuk mengikuti kompetisi dengan memperkenalkan dalam bahasa hal-hal yang semakin banyak diterima oleh programmer. Lisp mungkin memiliki lambda sejak tahun 1958, popularitasnya telah meningkat selama beberapa dekade sekarang dan hanya pemrograman fungsional baru-baru ini dianggap serius untuk pemrograman "arus utama" (karena tidak ada kata yang lebih baik).

Cyrille Ka
sumber
"Lisp mungkin memiliki lambda sejak 1958, popularitasnya telah meningkat selama beberapa dekade sekarang dan hanya pemrograman fungsional yang baru-baru ini dipertimbangkan secara serius untuk pemrograman" arus utama ": Popularitas suatu bahasa tampaknya bukan indikator yang baik untuk efektivitasnya. Pemrograman fungsional telah diadvokasi selama bertahun-tahun, tetapi kebanyakan orang di industri menganggapnya jenis hal yang disukai para peneliti untuk bermain untuk menulis tesis PhD mereka. Sekarang tiba-tiba industri ini bangun dan memberikannya kesempatan, mungkin karena sekarang OOP menjadi arus utama mereka mencari hal besar berikutnya.
Giorgio
1
Alasan mengapa penutupan awalnya tidak termasuk dalam Jawa menurut: Memahami Debat Penutupan . Di sana James Gossling mengatakan: "Penutupan yang ditinggalkan dari Jawa pada awalnya lebih karena tekanan waktu daripada yang lain. Pada hari-hari awal Jawa kurangnya penutupan cukup menyakitkan, dan lahirlah kelas batin: kompromi tidak nyaman yang berusaha untuk menghindari sejumlah masalah sulit. Tapi seperti biasa dalam banyak masalah desain, penyederhanaan tidak benar-benar menyelesaikan masalah, mereka hanya memindahkannya. "
edalorzo
"Dimasukkannya lambda di Jawa dibahas sejak saat itu dan itu hanya diperburuk oleh tren saat ini untuk pemrograman fungsional.": Saya merasa menarik bahwa di beberapa komunitas (C ++, Jawa, ...) "menggunakan lambdas" sering berarti " melakukan pemrograman fungsional ".
Giorgio
8

Jelas tidak ada fitur-fitur ini yang baru di dunia pemrograman dan yang membuat heran mengapa mendapatkan semua ini di Jawa sampai sekarang.

Karena Java harus melalui proses persetujuan yang melibatkan beberapa pemangku kepentingan dengan visibilitas tinggi dalam proses yang mirip dengan "desain oleh komite", dan proses itu membutuhkan waktu, itu saja.

Bandingkan dengan bahasa lain dan Anda akan menemukan diktator yang baik hati, atau komite kecil perancang bahasa yang bekerja sama secara erat dan tidak terikat dengan kepentingan perusahaan.

Kombinasikan itu dengan basis kode yang sudah ada dari jutaan baris kode Java yang harus tetap kompatibel, dan Anda memiliki semua bahan untuk perubahan dengan kecepatan glasial.

Robert Harvey
sumber
1
OTOH, Anda juga memiliki bahan untuk standar yang benar-benar kuat dan diterima secara luas. Kontras misalnya JPA dengan situasi untuk PHP, di mana setiap kerangka kerja web memiliki ORM setengah-setengah sendiri.
Michael Borgwardt
Saya mungkin salah, tetapi pemahaman saya adalah bahwa Haskell juga merupakan bahasa "desain oleh komite", dan itu adalah bahasa yang mutakhir. Jadi mungkin bukan itu yang menghambat Java?
Andres F.
@AndresF. Ya, tetapi saya membayangkan Anda tidak memiliki perusahaan monolitik besar yang duduk di komite Haskell. Lihat juga percakapan di komentar di sini .
Robert Harvey
1

Saya akan mengatakan bahwa tujuan paling penting dari bahasa pemrograman adalah untuk digunakan; Saat ini C dan Java tidak memiliki ekspresi lambda dan mereka adalah bahasa yang paling banyak digunakan (menurut TIOBE misalnya).

Dan untuk menjawab pertanyaan saya percaya bahwa Java ditujukan kepada perusahaan; dalam domain ini segala sesuatu harus sangat stabil dan dapat diandalkan; misalnya Java 7 telah muncul selama hampir 2 tahun namun saya tidak tahu secara langsung proyek apa pun di Java 7. Juga hal penting lainnya adalah kompatibilitas ke belakang yang sangat penting bagi perusahaan.

m3th0dman
sumber
Saya setuju dengan Anda (+1): Saya sangat menghargai Java (sebagai bahasa dan ekosistemnya yang besar), tetapi saya akan merasa lebih tepat untuk membekukan bahasa di Jawa 6. Saya tidak akan berusaha untuk belajar Java 7 atau 8 kecuali saya terpaksa (beberapa proyek yang sangat menarik di mana Java 7 atau 8 adalah suatu keharusan), saya lebih suka menghabiskan waktu saya belajar Scala dan Clojure.
Giorgio