Java'nın JVM'si var, C'nin ne var?


15

C'nin bir derleyicisi olduğunu biliyorum ama yürütme performansını ne belirler?

Örneğin, bir if bloğunda, eğer kod başkaları yerine tüm ifs'lara sahipse, tüm ifs'ın çalıştırılacağını ne belirler? Java'da JVM olurdu, ancak C'de yürütme derleyici şey nedir?


16
Öğrenmek için yararlı bir nüans, dillerin sadece diller olduğudur. C kodunu alan ve örneğin JVM'de çalıştıran bir derleyici yapabilirsiniz.
Telastyn

10
+1. Bu çok iyi bir soru. Cehaleti için onu küçümsemem - daha fazla Java öğrencisinin bunu sormaması şaşırtıcı .
djechlin

Ayrıca Java'yı makine koduna derleyebilir ve
JVM'den

2
Ayrıca: Programlama Dili! = Çerçeve! = Çalışma Zamanı Kütüphanesi! = Derleyici! = Tam Zamanında Derleyici! =
Tercüman

Yanıtlar:


17

Java'da sanal makine kodunuzu yürütür, ancak C derleyicileri gerçek makinenin yürüttüğü kodu üretir . Kesin olmak gerekirse, her iki durumda da programınız gerçek makine koduna dönüştürülür, ancak Java durumunda JVM bayt koduna derlemenin orta bir adımı vardır.

Böylece Java programları, yüklediğinizde JVM tarafından gerçek talimatlara dönüştürülürken, C programları çalıştırılmadan önce derleyici tarafından gerçek talimatlara dönüştürülür.


20
Java alan ve makine kodu üreten derleyiciler vardır. Örneğin Excelsior Jet . Ayrıca C ( picoc ) için gerçek bir makinenin yürüttüğü kodu asla oluşturmayan kesiciler de vardır . Diller dildir. Uygulamalar, uygulamalardır. İkisini karıştırmak insanlara kafa karıştırıcı olabilir.

6

Makine kodunun yanı sıra, kelimenin tam anlamıyla kaynak metni besleyememeniz açısından, doğrudan donanım üzerinde çalışan bir programlama dili yoktur. Tüm gerçek uygulamalar , kaynak programı "makine" diline çevirmelidir .

Bazı uygulamalar için statik olarak çevrilmiştir. Biz genellikle bu uygulamaları "derlenmiş" olarak adlandırırız. Diğerleri için, bazı ara formlara çevrilir ve daha sonra program çalıştırılırken dinamik olarak çevrilir. Bu uygulamalara genellikle "yorumlanmış" diyoruz. Bunlar arasında bir olasılık sürekliliği vardır ve birçok modern CPU bile yürütme çekirdeğinin bir parçası olarak dinamik çeviri yapar.

Programınız yürütmeden çok önce statik olarak derlendiğinde bile, ürün yazılımı yazmıyorsanız, derlenmiş kodun doğrudan çıplak metal üzerinde çalışmasını desteklemez. İşletim sistemi, kullanıcı alanı programları için sanal bir makine sağlar ve genellikle kendinize bir CPU'nuz olduğu yanılsaması gibi özellikler sağlar. Makineye bağlı fiziksel RAM'den daha büyük olabilecek düz bir bellek alanının yanılsamasına "sanal bellek" denir.

Üstelik, C dilinde programlama yaparken bile, bir C sanal makinesi var! Geleneksel olarak "C çalışma zamanı" veya kısaca CRT olarak adlandırılır.

C çoğunlukla doğrudan önceden montaj / makine koduna çevrildiğinden (bazı platformlarda, bazı dişli kodlar da olabilir ve bu sanal makinenin bir parçası olarak düşünülebilir), sanal makine genellikle yalnızca başlatma ve kapat.

Başlatma genellikle yığının ve yığının ayarlanmasını içerir; işletim sistemi bunları nadiren sizin için sağlar ve bunları programcıya sağlamak programlama dilinin görevidir. Bazı platformlarda, sinyal işlemenin başlatılması, çok iş parçacıklı bir ortamda "ana" iş parçacığının kurulması, programın C ++ koduna bağlı olması, dinamik olarak bağlanmış kütüphanelerin işlenmesi veya argc / argv ve envp'yi ayarlamak için bazı işlemler gerekli olabilir. Son olarak, CRT kontrolü ana sisteme aktarır.

Kapatma gelince, birçok işletim sistemi bir işlemi kirli bir şekilde öldürebilir, bu nedenle kapatma işleminin çok fazla yapılması gerekmez. Ana şey, programın temiz bir şekilde çıktığı durum için atexit () çağrılarını işlemektir.


2
C çalışma zamanı ve JVM, tamamen farklı hayvanlardır. CRT sadece bir kütüphanedir.
DeadMG

Cevabı bazı şeyleri daha açık hale getirmek için düzenledim. Bu arada, JVM ve VirtualBox da tamamen farklı hayvanlardır.
Takma ad

@Pseudonym: pek değil. Tamam, VirtualBox bir sanallaştırıcıdır, oysa tipik JVM bir emülatördür, ancak cümlenizde örneğin VirtualBox'ı QEmu ile değiştirirseniz, ikisi aslında aynıdır.
Jörg W Mittag
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.