Java memiliki JVM, apa yang dimiliki C?

15

Saya tahu bahwa C memiliki kompiler tetapi apa yang menentukan kinerja eksekusi?

Sebagai contoh di blok if else, bagaimana jika kode hanya memiliki semua ifs bukannya if elses, apa yang menentukan bahwa semua ifs akan dijalankan? Di Jawa itu akan menjadi JVM, tetapi dalam C apa hal kompiler eksekusi?

scerrecrow
sumber
16
Nuansa yang berguna untuk dipelajari adalah bahwa bahasa hanyalah bahasa. Anda bisa membuat kompiler yang mengambil kode C dan membuatnya berjalan di JVM misalnya.
Telastyn
10
+1. Ini pertanyaan yang sangat bagus. Saya tidak akan mengundurkan diri karena ketidaktahuan - ini adalah keajaiban lebih banyak siswa Jawa tidak menanyakan hal ini.
djechlin
Anda juga dapat mengkompilasi Java ke kode mesin dan menghindari JVM ...
AK_
2
Juga: Bahasa Pemrograman! = Kerangka Kerja! = Perpustakaan Runtime! = Compiler! = Just in Time Compiler! = Interperter
AK_

Jawaban:

17

Di Jawa mesin virtual mengeksekusi kode Anda, tetapi kompiler C menghasilkan kode yang dieksekusi mesin nyata . Lebih tepatnya, dalam kedua kasus program Anda akhirnya dikonversi menjadi kode mesin nyata, tetapi dalam kasus Jawa ada langkah tengah kompilasi ke bytecode JVM.

Jadi program Java dikonversi menjadi instruksi nyata oleh JVM saat Anda memuatnya, sedangkan program C sudah dikonversi menjadi instruksi nyata oleh kompiler sebelum dijalankan.

vrostu
sumber
20
Ada kompiler yang mengambil Java dan menghasilkan kode mesin. Misalnya Excelsior Jet . Ada juga interpeters untuk C ( picoc ) yang tidak pernah menghasilkan kode yang dijalankan mesin nyata. Bahasa adalah bahasa. Implementasi adalah implementasi. Membingungkan keduanya bisa membingungkan orang.
6

Selain kode mesin, tidak ada bahasa pemrograman yang mengeksekusi langsung pada perangkat keras, dalam arti bahwa Anda tidak dapat memberi makan teks sumber literal. Semua implementasi nyata harus menerjemahkan program sumber ke dalam bahasa "mesin".

Untuk beberapa implementasi, itu diterjemahkan secara statis. Kami biasanya menyebut implementasi ini "dikompilasi". Bagi yang lain, ini diterjemahkan ke dalam beberapa bentuk peralihan, yang kemudian diterjemahkan secara dinamis saat program dijalankan. Kami biasanya menyebut implementasi ini "ditafsirkan". Ada kontinum kemungkinan di antara ini, dan bahkan banyak CPU modern melakukan terjemahan dinamis sebagai bagian dari inti pelaksanaannya.

Bahkan ketika program Anda dikompilasi secara statis jauh sebelum eksekusi, kecuali jika Anda sedang menulis firmware, sangat jarang kode yang dikompilasi berjalan langsung pada bare metal tanpa ada yang mendukungnya. Sistem operasi menyediakan mesin virtual untuk program ruang-pengguna, seringkali menyediakan fitur seperti ilusi bahwa Anda memiliki CPU untuk diri sendiri. Ilusi ruang memori datar yang bisa lebih besar dari RAM fisik yang terpasang pada mesin bahkan disebut "memori virtual".

Di atas semua itu, bahkan ketika Anda sedang pemrograman di C, ada mesin virtual C! Secara tradisional disebut sebagai "runtime C", atau singkatnya CRT.

Karena C sebagian besar diterjemahkan langsung ke kode assembly / mesin jauh sebelumnya (pada beberapa platform, mungkin juga ada beberapa kode berulir , dan yang dapat dianggap sebagai bagian dari mesin virtual), mesin virtual biasanya hanya harus menangani startup dan menutup.

Startup biasanya melibatkan pengaturan stack dan heap; sistem operasi jarang menyediakan ini untuk Anda, dan merupakan tugas bahasa pemrograman untuk menyediakannya kepada programmer. Pada beberapa platform mungkin ada beberapa inisialisasi penanganan sinyal, pengaturan utas "utama" di lingkungan multi-utas, menjalankan konstruktor global jika program telah ditautkan ke kode C ++, menangani pustaka yang terhubung secara dinamis, atau ada mungkin diperlukan beberapa pemrosesan untuk mengatur argc / argv dan envp. Akhirnya, CRT mentransfer kontrol ke main.

Sedangkan untuk shutdown, banyak sistem operasi dapat mematikan proses secara tidak bersih, jadi shutdown tidak perlu melakukan banyak hal. Hal utama adalah untuk memproses panggilan atexit () untuk kasus di mana program keluar dengan bersih.

Nama samaran
sumber
2
C runtime, dan JVM, adalah binatang yang sama sekali berbeda. CRT hanyalah sebuah perpustakaan.
DeadMG
Saya telah mengedit jawaban untuk memperjelas beberapa hal. Kebetulan, JVM dan VirtualBox juga binatang yang sama sekali berbeda.
Nama samaran
@ Nama samaran: tidak juga. Baiklah, oke, VirtualBox adalah virtualizer, sedangkan JVM tipikal adalah emulator, tetapi jika Anda mengganti misalnya VirtualBox dengan QEmu dalam kalimat Anda, maka keduanya sebenarnya sama.
Jörg W Mittag