Java sering dipuji karena portabilitasnya yang luar biasa, yang saya anggap karena JVM. Pertanyaan saya adalah apa yang menghentikan C dari dikompilasi / ditafsirkan / JIT'ed .., jika demikian, C juga dapat ditulis sekali dan membuatnya bekerja pada perangkat apa pun yang Anda miliki. tapi ini bukan mekanisme populer untuk memproses program C.
Apa kerugian dari pemrosesan C dengan cara ini, juga apa kelebihan dari pemrosesan Java dengan cara ini dan tidak dikompilasi ke kode mesin, selain dari portabilitas tentu saja?
Jawaban:
C adalah apa yang saya sebut bahasa tingkat menengah. Tujuannya adalah untuk berfungsi sebagai "assembler tingkat sangat tinggi," itulah sebabnya ia bekerja dengan sangat baik sebagai target kompiler, dan mengapa ia merangkul portabilitas dengan baik.
Secara historis, penerjemah biasanya digunakan dengan bahasa tingkat tinggi, dalam konteks pemanggilan metode. Dalam bentuknya yang paling sederhana, seorang juru bahasa hanya mem-parsing setiap kata kunci dalam bahasa sumber bersama dengan token yang terkait, dan mengonversinya menjadi panggilan metode dan parameter. Dalam praktiknya, apa yang dilakukan sebagian besar penafsir adalah mengubah bahasa sumber menjadi representasi perantara, dan representasi itulah yang ditafsirkan.
Apa yang menghentikan C dari ditafsirkan atau Dipasangkan? Tidak ada. Tapi itu bukan raison d'être C.
sumber
Pertama-tama, perlu dicatat bahwa Sun's JVM ditulis dalam bahasa C. C adalah bahasa yang sangat populer ketika portabilitas diperlukan.
C bahasa adalah portable meskipun banyak C program yang tidak. Ini karena C tidak menempatkan banyak pembatasan pada programmer atau membuat banyak asumsi. Jika seorang programmer C ingin program-programnya menjadi portabel, ia harus menempatkan batasan-batasan itu pada dirinya sendiri.
Dalam praktiknya, itu sebenarnya tidak jauh lebih sulit daripada hidup dengan pembatasan yang memaksa Java pada Anda. Ini sebagian besar masalah menjadi sadar akan endianness Anda dan ukuran primitif, dan menggunakan perpustakaan portabel seperti GTK + bukan perpustakaan platform-spesifik.
Anda dapat membuat target GTK + dan kompiler C yang mendukung mesin virtual, bahkan mungkin JVM, dan mendapatkan kode yang ada untuk bekerja dengan sedikit perubahan. Bahkan, tanpa pengumpulan sampah, mesin virtual C mungkin akan jauh lebih sederhana. Namun, mengapa Anda mau?
Sebaliknya, kompilasi Java ke kode asli, juga bisa dilakukan. Pada dasarnya itulah yang dilakukan JIT. Namun, mengapa Anda mau? Saya yakin ada proyek kesayangan untuk melakukannya "hanya karena," tetapi tidak digunakan dengan serius.
sumber
Kamu berkata:
Dan di sana, dalam kalimat pertama, Anda salah. Java tidak portabel karena JVM. Java adalah portable, karena bahasa Java didefinisikan dengan cara yang tidak meninggalkan implementor kelonggaran dalam bagaimana suatu program dapat berperilaku.
Sebagai contoh, Java memiliki dua jenis "int" (menandatangani integer 32 bit) dan "panjang" (menandatangani integer 64 bit). C dan C ++ memiliki "int" (masuk setidaknya 16 bit), "panjang" (masuk setidaknya 32 bit) dan "panjang panjang" (masuk setidaknya 64 bit). Itu karena C seharusnya dijalankan pada banyak prosesor yang berbeda, dan memungkinkan mereka untuk berperilaku berbeda.
C dapat menentukan ukuran tetap untuk tipe ini. Jika sudah, maka prosesor 36 bit tidak bisa mengimplementasikan bahasa C. Dan mereka memang tidak bisa mengimplementasikan Java! Jadi C mengizinkan bahasa untuk bekerja dengan berbagai komputer yang berbeda. Tidak dapat dihindari bahwa ini memungkinkan pembuatan kode yang tidak portabel. Ini masalah bahasa.
sumber
Java sangat portabel terutama karena bahasa tersebut menargetkan Java Virtual Machine, yang, seperti namanya, bukan mesin nyata . Karena Anda dapat menerapkan Mesin Virtual pada arsitektur berbagai jenis mesin nyata, program berbasis JVM sangat portabel.
C, di sisi lain, secara khusus dirancang untuk dijalankan terhadap perangkat keras yang nyata, karena ia dibuat untuk tujuan spesifik menerapkan sistem operasi, yang membutuhkan akses perangkat keras penuh. Ini berarti bahwa kode C tidak terlalu portabel dengan desain , dan ketika porting program C dari satu platform ke yang lain, berbagai bagian yang khusus untuk arsitektur target perlu ditulis ulang ke satu derajat atau yang lain.
sumber
Sebenarnya ada versi C yang ditafsirkan , tetapi mereka sebagian besar dimaksudkan untuk digunakan untuk eksperimen cepat daripada sistem produksi.
Mereka tidak biasa, karena bagaimanapun, mengapa Anda menderita semua keistimewaan C jika tidak mendapatkan eksekusi kecil, cepat dan statis?
sumber
Secara teoritis C dan Java dapat dikompilasi ke kode asli, ditafsirkan, atau dikompilasi ke mesin virtual.
Alasan teknis bahwa C tidak dikompilasi ke mesin virtual, adalah bahwa tidak ada mesin virtual C standar .
Dan sepertinya tidak ada yang ingin mendefinisikan mesin C virtual, atau bahkan mengkompilasi ke mesin virtual Java (yang sangat mungkin). Mungkin karena tidak ada yang menggunakan C ingin kehilangan kecepatannya yang tak tertandingi. Mungkin juga karena C paling kuat dalam komunitas open source yang dapat dengan mudah melakukan portabilitas dengan mengkompilasi (mendistribusikan dan mengkompilasi ulang sumber dan mengeksekusi), sehingga mereka tidak merasa perlu untuk portabilitas eksekusi (mendistribusikan dan mengeksekusi biner) sebagai tertutup pengembang sumber lakukan.
sumber
Sebenarnya ini sudah selesai. Ada kompiler utama yang mendukung kompilasi ke LLVM (saya tahu dentang melakukannya, dan saya percaya gcc juga melakukannya). LLVM itu bisa JIT sama seperti kode Java dikompilasi ke bytecode yang JIT.
Namun, apa yang membuat java "cross platform" dibandingkan dengan C adalah bahwa Java memiliki pustaka runtime besar yang telah porting ke banyak platform. C secara eksplisit tidak mengikuti paradigma ini.
sumber
Ada beberapa perbedaan utama antara Java dan C. Java diisolasi dari sistem operasi melalui mesin virtual java (JVM). JVM memisahkan sistem operasi dari program. Aplikasi java mungkin meminta JVM untuk sepotong memori, dan JVM kemudian meminta OS untuk memori itu. Ada banyak JVM untuk platform / sistem operasi yang berbeda. JVM adalah yang memungkinkan program java yang sama dijalankan pada platform yang berbeda.
Dengan C, tidak ada isolasi OS. Program C (biasanya) berjalan langsung di atas OS, membuat panggilan OS langsung. Ini membuat ikatan program C dengan platform / sistem operasi tertentu. Program non-sepele akan melakukan panggilan ke sistem operasi. Selain itu, program C dikompilasi menjadi kode mesin, yang khusus untuk perangkat keras. Program C yang dikompilasi untuk x86 tidak dapat langsung dijalankan pada prosesor ARM.
sumber