Java tem a JVM, o que C tem?

15

Eu sei que C tem um compilador, mas o que determina o desempenho da execução?

Por exemplo, em um bloco if else, e se o código tiver apenas ifs em vez de if elses, o que determina que todos os ifs serão executados? Em Java seria a JVM, mas em C qual é a coisa do compilador de execução?

espantalho
fonte
16
Uma nuance útil para aprender é que os idiomas são apenas idiomas. Você pode criar um compilador que pega o código C e o executa na JVM, por exemplo.
Telastyn
10
+1. Esta é uma pergunta muito boa. Eu não descartaria isso por sua ignorância - é uma maravilha que mais estudantes de Java não perguntem isso.
djechlin
Você também pode compilar Java para código de máquina e evitar a JVM ...
AK_
2
Também: Linguagem de Programação! = Framework! = Biblioteca de Tempo de Execução! = Compilador! = Compilador Just in Time! = Interpertor
AK_

Respostas:

17

Em Java, a máquina virtual executa seu código, mas os compiladores C geram código que a máquina real executa. Para ser preciso, em ambos os casos, seu programa acaba sendo convertido em código de máquina real, mas no caso de Java, há uma etapa intermediária da compilação no bytecode da JVM.

Portanto, os programas Java são convertidos em instruções reais pela JVM quando você os carrega, enquanto os programas C já são convertidos em instruções reais pelo compilador antes de serem executados.

vrostu
fonte
20
Existem compiladores que usam Java e produzem código de máquina. Por exemplo, Excelsior Jet . Também existem interpeters para C ( picoc ) que nunca geram código que uma máquina real executa. Idiomas são idiomas. Implementações são implementações. Confundir os dois pode ser confuso para as pessoas.
6

Além do código da máquina, não existe uma linguagem de programação que seja executada diretamente no hardware, no sentido de que você não pode alimentá-lo com o texto fonte literal. Todas as implementações reais devem traduzir o programa de origem no idioma da "máquina".

Para algumas implementações, é traduzido estaticamente. Geralmente chamamos essas implementações de "compiladas". Para outros, é traduzido para alguma forma intermediária, que é traduzida dinamicamente à medida que o programa é executado. Geralmente chamamos essas implementações de "interpretadas". Há um continuum de possibilidades entre elas, e até muitas CPUs modernas fazem a tradução dinâmica como parte de seu núcleo de execução.

Mesmo quando seu programa é estaticamente compilado muito antes da execução, a menos que você esteja escrevendo firmware, é raro que o código compilado seja executado diretamente no bare metal sem nada que o suporte. O sistema operacional fornece uma máquina virtual para programas de espaço do usuário, geralmente fornecendo recursos como a ilusão de que você tem uma CPU só para si. A ilusão de um espaço de memória plano que pode ser maior que a RAM física conectada à máquina é chamada de "memória virtual".

Além disso, mesmo quando você está programando em C, há uma máquina virtual em C! É tradicionalmente chamado de "o tempo de execução C", ou CRT, para abreviar.

Como C é traduzido principalmente diretamente para código de montagem / máquina com bastante antecedência (em algumas plataformas, também pode haver algum código encadeado e que pode ser considerado parte da máquina virtual), a máquina virtual geralmente só precisa lidar com inicialização e desligar.

A inicialização normalmente envolve a configuração da pilha e da pilha; o sistema operacional raramente os fornece e é tarefa da linguagem de programação fornecê-los ao programador. Em algumas plataformas, pode haver alguma inicialização do tratamento de sinais, configurando o encadeamento "principal" em um ambiente com vários encadeamentos, executando construtores globais com a possibilidade de o programa ter sido vinculado ao código C ++, manipulando bibliotecas vinculadas dinamicamente ou existindo pode haver algum processamento necessário para configurar argc / argv e envp. Finalmente, o CRT transfere o controle para o main.

Quanto ao desligamento, muitos sistemas operacionais podem matar um processo de maneira impura, portanto o desligamento não precisa fazer muito. O principal é processar chamadas atexit () para o caso em que o programa sai corretamente.

Pseudônimo
fonte
2
O tempo de execução C e a JVM são bestas completamente diferentes. O CRT é apenas uma biblioteca.
DeadMG
Editei a resposta para deixar as coisas um pouco mais claras. Aliás, a JVM e o VirtualBox também são bestas completamente diferentes.
Pseudônimo
@ Pseudônimo: na verdade não. Bem, tudo bem, o VirtualBox é um virtualizador, enquanto a JVM típica é um emulador, mas se você substituir, por exemplo, o VirtualBox pelo QEmu em sua frase, os dois são de fato os mesmos.
Jörg W Mittag