Mengapa C # memiliki lebih banyak fitur daripada Java? [Tutup]

14

Harap dicatat bahwa ini tidak dimaksudkan sebagai argumen Java vs C #. Saya seorang programmer Java tanpa pengalaman C #, bertanya hanya karena penasaran.

Saya melakukan beberapa pembacaan pada C #, dan tampaknya ia memiliki lebih banyak fitur daripada Java. Sejumlah contoh:

  • Ketikkan inferensi.
  • dynamic kata kunci.
  • Delegasi.
  • Parameter opsional.
  • Lambda dan LINQ (saya sebenarnya tidak tahu apa ini).
  • Properti.

Namun Java tidak benar-benar menampilkan apa pun yang tidak dimiliki C #.

Pertanyaan saya adalah: mengapa C # memiliki lebih banyak fitur asli daripada Java? Dan mengapa Java tidak menambahkan beberapa di antaranya selama bertahun-tahun, misalnya Properti atau jenis inferensi? Apakah perancang bahasa Jawa mengambil pendekatan yang lebih sederhana? Apa alasannya?

Aviv Cohn
sumber
2
@ Patrick - Apakah itu fitur - atau detail implementasi?
Pete
14
Bias jawaban: Karena tim desain C # tahu apa yang mereka lakukan. Jawaban yang lebih masuk akal: C # dirancang dengan sepengetahuan kegagalan Jawa dan tanpa dogmatis "hanya OO murni" (bahwa mereka bahkan tidak cukup memukul). Setengah dari fitur-fitur itu diimpor secara massal dari Lisp dan Haskell, dua bahasa Jawa tetap menolak untuk diilhami sampai java 8, dan yang lainnya adalah peningkatan kewarasan yang dibuat sangat menyolok jelas oleh kurangnya Jawa.
Phoshi
4
Karena C # datang kemudian dan pada awalnya merupakan rip-off yang terang-terangan dari Jawa, dan kemudian memiliki kesempatan untuk menambahkan semua yang ternyata bermanfaat di samping itu, sementara Java dihambat oleh tujuan kompatibilitas mundur yang sangat ketat.
Kilian Foth
2
@ Clockwork-Muse tetapi C # memiliki dua implementasi runtime - CLR dan Mono. Juga ada Xamarin. Saya belum pernah mendengar solusi tunggal untuk membangun lintas proyek iOS / Android / WinPhone menggunakan Java.
Den
4
@KilianFoth: Sebenarnya, C # pada awalnya adalah rip-off dari Delphi , ditulis ulang agar terlihat seperti Java. Microsoft bahkan merampas arsitek proyek Delphi dari Borland untuk membuatnya.
Mason Wheeler

Jawaban:

22

Beberapa alasan:

  1. C # datang lebih lambat dari Jawa; versi 1 adalah rip-off terang-terangan dari Java 1.4, sehingga cukup banyak memiliki semua yang dimiliki Java pada saat itu.
  2. Tapi kemudian C # berkembang jauh lebih cepat daripada Jawa, karena itu adalah platform baru yang menarik (dan memiliki driver yang sangat brilian di Anders Hejlsberg, ayah dari Turbo Pascal). Itu memungkinkan mereka untuk menghindari semua kesalahan di Jawa yang menjadi jelas, sambil menambahkan semua yang diinginkan oleh para praktisi Jawa.
  3. Sementara itu, Jawa terhambat oleh tujuan kompatibilitas yang sangat ketat dan dengan laju pembangunan yang agak lambat, sebagian karena berusaha mati-matian untuk mendapatkan reputasi sebagai solusi standar, tegas, andal, tidak mengejutkan bagi 95% non-genius. programmer. Mereka berhasil, mungkin agak terlalu baik.

Hasilnya adalah bahwa Java sekarang memiliki sedikit celah fitur. Memang ada rencana besar untuk masa depan, tetapi seperti biasa dengan hal semacam ini semuanya membutuhkan waktu sedikit lebih lama dari yang direncanakan.

Kilian Foth
sumber
7
Saya tidak yakin saya setuju dengan ini. Maksud saya itu semua benar, tetapi saya curiga bahwa alasannya lebih berkaitan dengan politik sekitar keruntuhan Matahari. Java pada dasarnya memiliki lebih dari 5 tahun atau lebih di mana tidak ada organisasi / kepemimpinan - jadi tidak ada fitur baru.
Telastyn
7
C # 1 memiliki tipe nilai. Sesuatu yang tidak akan pernah dimiliki Java. Jadi bukan hanya "rip-off terang-terangan".
Den
1
@ Telastyn - Saya pikir itu adalah satu-satunya alasan terpenting di sini. Terutama ketika Anda menambahkan "dan kemudian Anda diperoleh dengan oracle" ke akhir runtuhnya Matahari.
Wyatt Barnett
7
Setuju dengan @Den. Saya pikir alasan terbesar untuk C # berkembang lebih cepat (dan ke arah yang benar) adalah kepemimpinan Anders Hejlsberg. Dia dan timnya telah menambahkan fitur terbaik dari bahasa lain, dan berhasil mengintegrasikannya ke dalam C #. Hasilnya adalah bahwa C # memiliki fitur bahasa yang sangat rapi tanpa merasa berantakan atau berantakan.
David Kirkland
1
@WesleyWiser - ditingkatkan ke "mungkin ada di masa depan".
Den
4

Saya akan menambahkan jawaban Kilian bahwa satu perbedaan besar antara Java dan C # adalah bahwa desainer C # tidak hanya mengendalikan bahasa, tetapi juga IDE standar.

Menambahkan sesuatu seperti metode ekstensi dan kelas parsial bisa menjadi mimpi buruk dalam pengembangan / kontrol versi jika IDE tidak akan mendukungnya.

Karena Anda diharapkan dapat mengkompilasi Java dengan platform pilihan Anda (Eclipse, Netbeans, vi + Ant), menambahkan fitur yang memecahkan kode (dan menggunakannya untuk mengembangkan ekstensi tambahan seperti LINQ) jauh lebih rumit daripada sekadar mengatakan " karena IntelliSense akan menangani kasus-kasus ini, kita tidak perlu khawatir ".

Selain itu, kadang-kadang perlu diperhatikan nilai fitur daripada jumlahnya. Sebagai contoh, properti otomatis bagus dan saya tentu berharap Java mendukung ini, tetapi pada akhirnya itu hanya berarti bahwa Anda harus menulis beberapa baris kode lagi di Jawa. Demikian pula, saya menemukan bahwa memanggil "Acara" fitur agak keliru, karena mereka sedikit lebih dari delegasi berlabel khusus, dan hanya salinan yang disempurnakan dari pola Pengamat yang telah digunakan oleh Jawa (sekali lagi, di Jawa perlu lebih eksplisit coding)

Jangan salah paham, saya pikir C # telah memperkenalkan beberapa inovasi yang patut dicatat, dan saya berharap suatu hari bos besar Oracle akan bangun dan meluncurkan "Java 2" yang benar untuk memasukkan beberapa di antaranya, tetapi jaraknya tidak sejelas Anda poin pertanyaan.

SJuan76
sumber
2
Sembilan baris yang diperlukan untuk definisi properti sederhana (deklarasi + get / set + spasi putih) bertambah dengan cepat menjadi lebih dari "beberapa".
kevin cline
@kevincline dan saya juga mendokumentasikan benar baik setter dan getter. Tetapi pada akhirnya, bahkan jika saya tidak menggunakan pembuatan kode otomatis IDE saya untuk accessor, saya tidak menggunakan jumlah waktu yang terlihat dengan ini, ketika Anda memperhitungkan waktu yang dihabiskan dalam logika bisnis, pengujian, desain kode (pada kenyataannya Saya sebagian besar memikirkan ini bahkan ketika mengetik accessors). Jadi, walaupun menyenangkan, itu bukan sesuatu yang membuat perbedaan besar pada akhirnya ...
SJuan76
3
Ini bukan waktunya untuk menulisnya. Inilah saatnya untuk membaca dan mengabaikannya, berulang-ulang kali, sementara Anda menuju bagian yang menarik.
kevin cline
@ kevincline Saya setuju, ini mudah dibaca dan kodenya bersih. Inilah sebabnya mengapa saya menghargai hal-hal seperti Acara, yang hanya merupakan pola Pengamat yang terintegrasi, tetapi membuat segalanya jauh lebih bersih jika Anda harus menulisnya sendiri
Aviv Cohn
@ AVVCohn Masalahnya adalah, "built-in" adalah bagian kunci. Anda dapat memiliki dispatch dinamis dalam perakitan, Anda dapat memiliki fungsi yang lebih tinggi di C, setiap fitur bahasa tunggal Anda dapat memiliki adalah mungkin dalam perakitan - jelas, karena di beberapa titik, masih berjalan pada CPU x86 Anda. Anda jarang perlu menerapkan pola Perintah di C #, karena Anda memiliki delegasi. Sama dengan Pengamat dan acara, dan banyak lainnya. Java memiliki metode anonim untuk beberapa waktu, tetapi Anda harus membuat tipe anonim secara keseluruhan . Semua hal itu kecil, tetapi bertambah.
Luaan