Java ma JVM, co ma C?

15

Wiem, że C ma kompilator, ale co decyduje o wydajności wykonania?

Na przykład w bloku if else, co jeśli kod miałby tylko wszystkie ifs zamiast if Elses, co decyduje o tym, że wszystkie ifs zostaną uruchomione? W Javie byłby to JVM, ale w C o czym jest kompilator wykonywania?

scerrecrow
źródło
16
Przydatnym niuansem do nauczenia jest to, że języki to tylko języki. Możesz stworzyć kompilator, który pobiera kod C i uruchamia go na przykład w JVM.
Telastyn
10
+1. To jest bardzo dobre pytanie. Nie pochwaliłbym tego za jego ignorancję - to dziwne, że więcej studentów Java nie pyta o to.
djechlin
Możesz także skompilować Javę do kodu maszynowego i unikać JVM ...
AK_
2
Także: Język programowania! = Framework! = Biblioteka wykonawcza! = Kompilator! = Kompilator w
samą porę

Odpowiedzi:

17

W Javie maszyna wirtualna wykonuje kod, ale kompilatory C generują kod wykonywany przez maszynę rzeczywistą . Mówiąc ściślej, w obu przypadkach program kończy się konwersją na prawdziwy kod maszynowy, ale w przypadku Javy jest to środkowy etap kompilacji do kodu bajtowego JVM.

Tak więc programy Java są konwertowane na JVM przez program JVM na rzeczywiste instrukcje, podczas gdy programy C są już konwertowane przez kompilator na rzeczywiste instrukcje przed ich uruchomieniem.

vrostu
źródło
20
Istnieją kompilatory, które pobierają Javę i wytwarzają kod maszynowy. Na przykład Excelsior Jet . Istnieją również interpetery dla C ( picoc ), które nigdy nie generują kodu wykonywanego przez prawdziwą maszynę. Języki to języki. Implementacje są implementacjami. Mylące dwa mogą być mylące dla ludzi.
6

Poza kodem maszynowym nie istnieje język programowania, który działa bezpośrednio na sprzęcie, w tym sensie, że nie można go podać dosłownego tekstu źródłowego. Wszystkie rzeczywiste implementacje muszą tłumaczyć program źródłowy na język „maszyny”.

W przypadku niektórych implementacji jest on tłumaczony statycznie. Zwykle nazywamy te implementacje „skompilowanymi”. W innych przypadkach jest on tłumaczony na formę pośrednią, która jest następnie dynamicznie tłumaczona podczas uruchamiania programu. Zwykle nazywamy te implementacje „interpretowanymi”. Istnieje ciąg możliwości między nimi, a nawet wiele współczesnych procesorów wykonuje dynamiczne tłumaczenie jako część rdzenia wykonawczego.

Nawet jeśli Twój program jest kompilowany statycznie na długo przed uruchomieniem, chyba że piszesz oprogramowanie układowe, rzadko kiedy skompilowany kod działa bezpośrednio na goły sposób i nic go nie obsługuje. System operacyjny zapewnia maszynę wirtualną dla programów przestrzeni użytkownika, często zapewniając takie funkcje, jak złudzenie, że masz cały procesor dla siebie. Złudzenie płaskiej przestrzeni pamięci, która może być większa niż fizyczna pamięć RAM podłączona do maszyny, nazywana jest nawet „pamięcią wirtualną”.

Co więcej, nawet podczas programowania w C, istnieje maszyna wirtualna w języku C! Jest to tradycyjnie nazywane „środowiskiem uruchomieniowym C” lub w skrócie CRT.

Ponieważ C jest w większości tłumaczone bezpośrednio na kod asemblera / kodu maszynowego z dużym wyprzedzeniem (na niektórych platformach może być także kod wątkowy , który można uznać za część maszyny wirtualnej), maszyna wirtualna zazwyczaj musi tylko obsługiwać uruchamianie i zamknąć.

Uruchomienie zwykle obejmuje ustawienie stosu i sterty; system operacyjny rzadko je udostępnia, a zadaniem programisty jest dostarczenie ich programistom. Na niektórych platformach może wystąpić pewna inicjalizacja obsługi sygnałów, konfiguracja wątku „głównego” w środowisku wielowątkowym, uruchamianie globalnych konstruktorów, gdy istnieje szansa, że ​​program został powiązany z kodem C ++, obsługa dynamicznie połączonych bibliotek lub tam może być konieczne przetwarzanie w celu skonfigurowania argc / argv i envp. Na koniec CRT przenosi kontrolę na główny.

Jeśli chodzi o zamykanie, wiele systemów operacyjnych może zabić proces w nieczysty sposób, więc zamykanie nie musi zbyt wiele robić. Najważniejsze jest przetworzenie wywołań atexit () w przypadku, gdy program kończy działanie w sposób czysty.

Pseudonim
źródło
2
Środowisko wykonawcze C i JVM to zupełnie inne bestie. CRT to tylko biblioteka.
DeadMG
Zredagowałem odpowiedź, aby wszystko było bardziej jasne. Nawiasem mówiąc, JVM i VirtualBox są również zupełnie innymi zwierzętami.
pseudonim
@Pseudonim: niezupełnie. Cóż, ok, VirtualBox jest wirtualizatorem, podczas gdy typowa JVM jest emulatorem, ale jeśli w zdaniu zastąpisz np. VirtualBox QEmu, to w rzeczywistości oba są takie same.
Jörg W Mittag