Mengapa Java dianggap lebih portabel daripada bahasa lain seperti C ++?

16

Apa yang berbeda antara "menulis JRE spesifik untuk setiap platform" untuk pengembang Java dan "menulis kompiler C ++ untuk setiap platform" untuk C ++?

pengguna967316
sumber

Jawaban:

33

Java dikompilasi sekali dijalankan di mana saja. C ++ ditulis sekali dikompilasi di mana saja.

Pubby
sumber
3
Yah Anda jelas tidak punya banyak pengalaman dengan pengembangan GUI. (Menunggu Qt ...)
27
Siapa pun yang mengklaim bahwa C ++ adalah "menulis sekali kompilasi di mana saja" tidak pernah harus mem-port program C ++ ...
BlueRaja - Danny Pflughoeft
7
Saya setuju dengan BlueRaja. Porting program C ++ jauh lebih berarti daripada porting kompiler. C ++ paling banyak hadir di lingkungan kritis di mana hal-hal seperti ukuran int atau implementasi sistem file dapat membuat perbedaan besar. Porting TIDAK hanya berarti kompilasi ulang.
rahmu
8
@ Pubby8 tidak, masalah portabilitas juga berasal dari kode standar cantik yang membuat asumsi yang tidak dapat dipercaya , seperti asumsi tentang endianness (yang Anda pikir, Anda juga dapat menderita di Jawa), penyelarasan, dan ukuran jenis dasar.
R. Martinho Fernandes
5
Tulis sekali, debug di mana-mana.
bhagyas
25

"menulis JRE spesifik untuk setiap platform" bukanlah sesuatu yang Anda lakukan setiap saat. Mengubah JRE ke platform baru adalah sesuatu yang hanya perlu Anda lakukan sekali. Tugas ini umumnya dilakukan oleh pengelola inti / pengembang program dan / atau platform. Banyak faktor yang berperan ketika menentukan siapa dan bagaimana JRE akan diangkut. Antara lain, itu tergantung pada lisensi yang diterbitkan di bawahnya (saya dengar Java adalah Open Source, jadi saya kira siapa pun bisa melakukannya). Anekdot lucu, Steve Jobs membuat masalah besar tentang tidak ingin mengurus porting Jawa di Mac , sekitar setahun yang lalu.

Intinya bukan bagaimana atau siapa port JRE, tetapi fakta bahwa setelah porting, setiap aplikasi Java sekarang secara teoritis harus berjalan dengan mudah pada mesin baru. Dalam pengertian itu, JRE membentuk lapisan abstraksi, menyembunyikan mesin sepenuhnya, memungkinkan porting mudah.

Namun, kenyataannya tidak selalu cantik seperti ini. Saya tidak akan menyebut portabilitas sebagai "mitos", tetapi memang benar itu tidak begitu sempurna. Sebagai contoh, Java memiliki paket yang disebut JNIyang memungkinkan pengiriman panggilan asli, melewati JRE, sehingga mencegah portabilitas mulus sempurna, apa yang penggemar Jawa suka menyebutnya "Menulis sekali dijalankan di mana-mana".

Seperti yang disebutkan dalam komentar, pendekatan C ++ terhadap portabilitas berbeda. Di satu sisi, ini adalah bahasa yang dikompilasi, dan binari-binari itu hampir selalu spesifik platform. Jadi c ++ executable tidak akan pernah portabel (tidak seperti Java). Di sisi lain, porting compiler terkadang cukup. Komunitas telah menemukan bahwa dengan porting compiler serta beberapa pustaka inti bahasa, kode sumber (dan bukan binari) bisa menjadi portabel.

Namun, C ++ banyak digunakan dalam sistem kritis seperti kompiler, kernel, sistem real-time, embedded system, ... Ada aspek "level rendah" dari C ++ yang tidak dapat diabaikan, ketika berbicara tentang portabilitas.

rahmu
sumber
4
Portabilitas bukanlah mitos. Portabilitas yang sempurna adalah.
Malcolm
"Di situlah Java sangat berbeda dari C ++, di mana setiap aplikasi" spesifik mesin ", dan tidak dapat diangkut tanpa memodifikasi kodenya." Itu tidak benar, itu tergantung pada ketergantungan. Jika Anda hanya menggunakan pustaka standar dan pustaka dengan sumber portabel untuk target Anda, Anda kode sekali dan kompilasi pada setiap target. Jika Anda memberi kode sesuatu yang dapat porting tanpa mengubah kode dalam C ++ maka satu-satunya hal yang perlu Anda modifikasi adalah skrip build. Itu bahkan tidak benar dalam semua kasus.
Klaim
Jangan lupa bahwa C ++ dapat digunakan sebagai bahasa level tinggi dan bahasa level rendah. Banyak kode C ++ digunakan dalam program di mana 32bit int sangat berbeda dari 64-bit int. Level tinggi akan selalu portabel, tentu saja. Tapi itu jauh dari generalisasi C ++
rahmu
Saya pikir Anda mungkin telah salah mengerti apa yang saya katakan: Anda dapat menulis C ++ yang benar dengan int atau jenis standar apa pun tanpa repot dengan hal-hal tingkat rendah. Lihat saja boost library, kebanyakan hanya kode tingkat tinggi, dan itu berlaku untuk banyak proyek open source C ++. Anda "bisa" turun level, dan jika Anda melakukannya, Anda juga dapat menghindari kode spesifik apa pun hingga Anda perlu menggunakan API khusus platform. Tetapi jika Anda tidak perlu, maka Anda dapat menulis C ++ yang bekerja di mana-mana. Ketergantungan pada platform dapat dihindari dan seringkali ada dalam kode perpustakaan.
Klaim
Hanya untuk memastikan saya jelas: Saya tidak mengatakan bahwa semua kode C ++ portabel, saya mengatakan bahwa, pernyataan Anda salah. Anda mungkin ingin memperbaikinya dengan sesuatu seperti: "Di sinilah Java sangat berbeda dari C ++, di mana setiap aplikasi" spesifik mesin ", dan tidak dapat diangkut tanpa mengubah kode atau, jika kode tersebut benar-benar portabel dan versi skrip mengelola target baru, tanpa setidaknya satu kompilasi. "
Klaim
14

Bukan hanya bahasanya - tapi juga perpustakaan.

Java dan C ++ menyediakan pustaka lintas platform. Java menyediakan satu set yang lebih kaya.

Andy Thomas
sumber
2
Java menyediakan set yang lebih kaya secara default. Pustaka yang sama dapat ditemukan untuk C ++ mereka bukan bagian dari pustaka standar dan Anda hanya harus memutuskan mana yang akan digunakan (yang tidak sepele terutama jika mereka tidak diinstal).
Martin York
Membandingkan pustaka standar Java dengan semesta pustaka untuk C ++ sebenarnya bukan perbandingan yang valid. Java menyediakan satu set yang lebih kaya, apakah Anda membandingkan perpustakaan standar masing-masing, atau Anda membandingkan semesta perpustakaan masing-masing.
Andy Thomas
3
Jelas tidak setuju dengan itu. Apa pun di perpustakaan Java yang tersedia sudah tersedia untuk digunakan oleh C ++ di beberapa perpustakaan. Saya suka fakta bahwa Jawa memiliki semuanya di satu tempat tetapi untuk mengatakan itu lebih kaya itu tidak benar. Mungkin kata sifat yang Anda cari adalah `lebih terintegrasi '
Martin York
1
+1 akan dihapus lagi. Saya pikir perpustakaan adalah faktor terbesar dalam portabilitas. Jika Anda bekerja di C / C ++ dan melakukan apa pun selain perhitungan murni, akan ada pustaka (khususnya, bagian dari pustaka sistem) yang secara radikal berbeda antara Windows dan Unix, dan sedikit berbeda antara rasa yang berbeda dari Unix. Itu membuat porting sulit. Java pada dasarnya tidak memiliki masalah itu.
Tom Anderson
1
@Andy Thomas-Cramer: Saya tidak membandingkan apa pun (Anda tampaknya). Saya mengatakan pernyataan Anda tidak akurat. Salah satu kelebihan yang dimiliki Java (dan kita semua menyukainya) adalah semua perpustakaan standar di satu tempat. Mengatakan mereka lebih kaya tidak akurat.
Martin York
7

Perbedaannya adalah bahwa Java akan berjalan pada platform apa pun tanpa kompilasi ulang. Memiliki kompiler C ++ untuk setiap platform sama sekali tidak sama.

Tanda Dataran Tinggi
sumber
6

Semua jawaban yang dimulai dengan "Perbedaannya adalah ...", atau sesuatu yang sangat mirip, pada dasarnya salah (maaf, tetapi begitulah hidup). Sebenarnya ada dua perbedaan yang terpisah di antara keduanya.

Satu (yang telah banyak disebutkan) adalah bahwa program Java yang dikompilasi dapat (atau paling tidak seharusnya) berjalan pada implementasi Java yang sesuai, jadi bahkan setelah dikompilasi, Anda masih dapat memindahkan program Java dari satu platform ke platform lain tanpa mengkompilasi ulang . C ++ (setidaknya secara normal) membutuhkan kompilasi ulang untuk setiap platform target.

Yang lain adalah bahwa Java (setidaknya upaya untuk) memastikan bahwa semua Java yang ditulis dengan benar akan portabel. Setidaknya secara teori, Anda seharusnya tidak dapat menulis kode apa pun yang tidak portabel.

C ++ memungkinkan Anda melakukan beberapa hal yang tidak portabel. Standar C ++ berisi "peringatan" tentang banyak hal yang tidak mudah dibawa-bawa (mis., Memberi tahu Anda bahwa Anda akan mendapatkan perilaku implementasi yang didefinisikan atau perilaku tidak terdefinisi), tetapi itu tidak selalu mencoba untuk menghentikan Anda dari melakukan hal itu sama sekali . Sebagai contoh, jika Anda ingin menulis sistem operasi untuk perangkat keras yang menggunakan bus PCI, Anda mungkin perlu membaca / menulis memori konfigurasi PCI. Ini jelas tidak akan portabel untuk sistem tanpa bus PCI, tetapi jika Anda menulis sistem operasi untuk perangkat keras dengan bus PCI, itu cukup diperlukan. C ++ memungkinkannya meskipun itu jelas tidak akan portabel.

Jerry Coffin
sumber
C ++ tidak tahu apa-apa tentang bus PCI atau perangkat keras.
Nikko
tentu saja tidak, itu adalah hal-hal khusus platform yang harus dimasukkan dalam perpustakaan platform spesifik. Sama seperti Java dapat memiliki pustaka spesifik platform jika diperlukan.
jwenting
1
@ Nikko: Ia tidak tahu apa-apa tentang itu, tetapi memungkinkan Anda untuk menggunakan apa yang Anda ketahui tentang itu.
Jerry Coffin
@jwenting: Perbedaannya adalah Anda dapat menulis pustaka khusus platform di C ++, tetapi Anda umumnya tidak dapat menulisnya di Jawa.
Jerry Coffin
6

Anda telah salah paham tentang tempat ini. Program Java sangat portabel, karena JVM menyediakan perilaku standar yang dijamin sama. Program-program C ++ memiliki lingkungan yang kurang terstandarisasi yang lebih dekat dengan perangkat keras yang sebenarnya, sehingga program harus mampu menangani berbagai perincian spesifik platform - seperti ukuran int, penyelarasan kata, dll. Dll.

JVM itu sendiri tidak terlalu portabel. Merupakan tugas yang sangat penting untuk port JVM berkinerja tinggi ke platform lain atau arsitektur CPU.


sumber
+1 untuk kalimat terakhir itu!
rahmu
2

Perbedaannya adalah bahwa program Java (bukan akronim) dapat didistribusikan dalam bentuk yang dapat dijalankan pada komputer mana pun dengan JVM yang diinstal, tetapi C ++ biasanya didistribusikan sebagai kode sumber, yang sangat tidak ramah pengguna, atau sebagai banyak binari berbeda untuk platform berbeda.

Colin
sumber
Hah? Ada kompiler C ++ yang menargetkan JVM dan ada kompiler Java yang menargetkan kode asli. Bisakah Anda mengutip bagian spesifik dari spesifikasi bahasa C ++ yang mengatakan bahwa program C ++ harus didistribusikan sebagai kode sumber atau binari khusus platform?
Jörg W Mittag
Di sana, saya mengedit jawaban saya untuk menggunakan bahasa yang kurang definitif
Colin
2

Salah satu alasan Java dianggap portabel adalah bahwa ia memiliki aturan khusus tentang bagaimana ekspresi aritmatika harus dinilai dan melarang implementasi untuk mengevaluasinya dengan cara lain, bahkan ketika mengevaluasinya dengan cara yang diamanatkan akan memerlukan kode yang lebih lambat daripada mengevaluasinya secara lebih akurat. mode.

Misalnya diberikan

long thing1(int x) {
  return (x+1)-1L;
}
double thing2(int x, float y) {
  return x/y;
}

Nilai thing1(2147483647)dan thing2(1123456700,11234567.0f)masing-masing harus -2147483649L dan 99,9999923706054688, meskipun nilai yang benar secara aritmatika adalah 2147483647L dan 100.0, dan meskipun pada beberapa platform kode untuk menghasilkan hasil numerik-salah akan lebih lambat daripada kode untuk menghasilkan yang benar hasil (pada beberapa platform 64-bit, memaksa perilaku pembungkus setelah (x +1) akan memerlukan instruksi tambahan, dan pada platform 8x87, memaksa nilai 1123456700 untuk dibulatkan ke floatakan membutuhkan instruksi tambahan dibandingkan dengan hanya memuat langsung ke register presisi-diperpanjang).

supercat
sumber
1
Untuk sekali jawaban baru pada pertanyaan lama yang benar-benar menambahkan sesuatu yang bernilai: Java memiliki persyaratan aritmatika yang sangat tepat, dan tentu saja tipe data primitif memiliki ukuran dan semantik spesifik dibandingkan dengan C ++. Tidak ada jawaban lain pada tanggal ini yang menyebutkan ini.
@Snowman: Bagaimana Anda menyukai contoh-contoh tertentu yang dipilih? Secara pribadi jika saya mendesain bahasa saya tidak akan membuat contoh mengembalikan nilai Java tanpa menggunakan penyempitan gips ke (int)untuk (x+1)subekspresi contoh pertama pada contoh pertama, ke parameter floatcontoh kedua x, tapi jelas saya tidak merancang bahasa .
supercat
Saya pikir itu masuk akal. Yang penting untuk setiap bahasa adalah memiliki semantik yang terdefinisi dengan baik. Terlepas dari apakah seseorang setuju dengan keputusan desain bahasa yang diberikan, yang penting adalah bisa melihat kode dan tahu cara kerjanya. Java umumnya melakukan itu, dengan beberapa kasus perilaku yang tidak terdefinisi.
1

Jumlah pekerjaan untuk alat-alat pendukung memang sama, perbedaannya terletak di tempat lain. Setelah program C ++ dikompilasi untuk suatu platform, Anda harus mengkompilasinya lagi jika Anda ingin menggunakannya pada platform yang berbeda. Namun, ketika program java telah dikompilasi, Anda dapat memindahkannya ke platform lain dengan lingkungan runtime tanpa harus mengkompilasi ulang.


sumber
1

Menjawab judul "Apakah portabilitas mitos?", Bukan "Portabilitas mana yang lebih baik, Java atau C ++", saya akan mengatakan bahwa portabilitas parsial dimungkinkan, tetapi portabilitas penuh itu adalah mitos.

Sesuatu yang saya bersikeras untuk menulis, dan itu berlaku untuk pertanyaan ini, adalah bahwa pengembang tidak lagi bekerja hanya dengan bahasa pemrograman, tetapi, dengan kerangka kerja pemrograman penuh.

Dan kerangka itu, termasuk perpustakaan, basis data, antarmuka grafis.

Bahasa pemrograman mana, atau kerangka kerja pemrograman mana yang lebih portabel?

Yah, itu tergantung, pada apa aplikasi Anda. sedang berusaha untuk mencapai.

umlcat
sumber
1

Masalahnya adalah "Anda" tidak menulis JRE Anda menulis kode Java yang berjalan pada JRE apa pun . "Anda" menulis kode C ++ yang dapat meminta perubahan sebelum Anda mengkompilasi di platform lain.

James Anderson
sumber
0

Banyak orang lupa atau tidak memperhitungkan kenyataan Jawa ketika mereka mengatakan bahwa "ini 100% portabel" atau frasa seperti itu.

Hampir semua perusahaan besar Korporasi / Perangkat Lunak memiliki setidaknya 1 implementasi Java buatan sendiri dengan JRE terkait di masa lalu dan beberapa masih mempertahankannya, Microsoft, IBM dan Apple misalnya semua memiliki versi Java sendiri yang mencerminkan versi mereka. ide dan pemikiran sendiri tentang ke mana industri dan bahasa tersebut harus pergi.

Bagaimana itu untuk "portabel"? JRE di mana pun Anda berpaling.

Dan ini tanpa mempertimbangkan apa yang Sun / Oracle lakukan.

Contoh mengapa kode Java tidak jauh dari C dan C ++ dalam hal portabilitas adalah GUI dan server grafis, Apple memiliki implementasi kerangka GUI yang tidak standar untuk JRE-nya sendiri, sebagai konsekuensinya ada banyak sakit kepala dan pekerjaan ganda bagi siapa saja yang ingin membuat / port GUI menggunakan Java untuk mesin Apple dan mereka pada dasarnya dipaksa untuk berurusan dengan Quartz (bagaimana itu dalam hal "leverage" dan bahasa tingkat tinggi?).

Kadang-kadang bahkan kata-kata yang paling umum digunakan tidak benar-benar mencerminkan arti yang biasanya diberikan orang kepada saya, bagi saya istilah "portabilitas" di dunia Jawa lebih seperti "pandangan" dalam akal sehat; dalam hal komersial dan finansial ada pandangan yang lebih baik untuk Anda jika Anda mengadopsi Java daripada bahasa lain (setidaknya pada saat Java lahir) karena Anda memiliki banyak pekerjaan yang sudah dilakukan di satu sisi (Anda mendapatkan JRE pada apa pun yang dapat dianggap sebagai "komputer") dan basis kode Anda cenderung portabel karena itu, Anda memerlukan lebih sedikit sumber daya untuk port program Anda, hanya itu, apakah sumber daya tersebut adalah uang, waktu atau tenaga kerja tidak masalah, itu lebih rendah ambang batas dibandingkan dengan teknologi lain dan itulah gunanya Java, ia menurunkan ambang itu.

Tentu saja ini benar jika Anda menerima lokasi Java, yang berarti mesin virtual dengan pengumpulan sampah, yang berarti ia menghabiskan lebih banyak sumber daya jika dibandingkan dengan bahasa asli, jika Anda benar-benar ingin memeras maksimal dari CPU atau server pertanian saya. jangan berpikir bahwa Anda dapat mengadopsi Java kecuali jika Anda benar-benar kekurangan sumber daya atau perusahaan Anda benar-benar kecil.

Saya masih harus menemukan satu aplikasi Java non-sepele yang hanya berisi 1 versi untuk setiap baris kode atau fungsionalitas (alias tanpa platform spesifik apa pun) dan 100% portabel di antara semua JRE utama.

pengguna2485710
sumber