Apa yang berbeda antara "menulis JRE spesifik untuk setiap platform" untuk pengembang Java dan "menulis kompiler C ++ untuk setiap platform" untuk C ++?
Apa yang berbeda antara "menulis JRE spesifik untuk setiap platform" untuk pengembang Java dan "menulis kompiler C ++ untuk setiap platform" untuk C ++?
Jawaban:
Java dikompilasi sekali dijalankan di mana saja. C ++ ditulis sekali dikompilasi di mana saja.
"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 JNI
yang 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.
Bukan hanya bahasanya - tapi juga perpustakaan.
Java dan C ++ menyediakan pustaka lintas platform. Java menyediakan satu set yang lebih kaya.
Perbedaannya adalah bahwa Java akan berjalan pada platform apa pun tanpa kompilasi ulang. Memiliki kompiler C ++ untuk setiap platform sama sekali tidak sama.
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.
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.
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.
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 float
akan membutuhkan instruksi tambahan dibandingkan dengan hanya memuat langsung ke register presisi-diperpanjang).
(int)
untuk (x+1)
subekspresi contoh pertama pada contoh pertama, ke parameter float
contoh kedua x
, tapi jelas saya tidak merancang bahasa .
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.
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.
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.
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.