Qual é a diferença entre bytecode, código nativo, código de máquina e código de montagem?
Bytecode é uma linguagem intermediária que é gerada pelo compilador e é posteriormente interpretada ou compilada just-in-time por um ambiente em tempo de execução. Não é tipicamente uma linguagem legível por humanos, e não representa a linguagem real da máquina diretamente executável em qualquer hardware de CPU existente. O termo bytecode é frequentemente atribuído à linguagem intermediária gerada por um compilador Java, mas às vezes é usado para se referir ao código intermediário de outras linguagens. Outros exemplos de linguagens intermediárias incluem CIL (gerado por C#, VB . NET e outras linguagens . NET) e p-Code (gerado por UCSD Pascal). O código de linguagem intermediária pode ser executado em qualquer combinação hardware/CA, desde que o ambiente de tempo de execução necessário esteja disponível para essa combinação hardware/CA.
Código nativo e código de máquina referem-se a instruções de linguagem de máquina que são diretamente executáveis em hardware de CPU existente. É gerado ou por um compilador (para código fonte em linguagem de alto nível) ou por um assembler (para código fonte em linguagem assembly). Não é tipicamente considerada uma linguagem legível por humanos. O código da máquina é específico para uma arquitetura de CPU. Ele não pode ser executado em uma CPU com uma arquitetura diferente.
Código fonte (texto) legível por humanos que representa instruções e dados da linguagem de máquina. É considerado uma linguagem de baixo nível. Ele é convertido (traduzido) da forma de texto legível por humanos em instruções e dados em linguagem binária de máquina usando um programa chamado assembler. O código da linguagem assembly é específico para uma arquitetura CPU. Cada arquitetura CPU tem um conjunto único de instruções de linguagem assembly, e algumas arquiteturas têm assemblers que usam diferentes dialetos para a mesma arquitetura.
Então, digamos que você tenha escrito um programa na linguagem de programação de alto nível Java. Você o compila e acaba com o bytecode. Quando você executa (executa) o programa, a JVM (Java Virtual Machine) ou interpreta as instruções do bytecode, ou as compila em código de máquina (código nativo) para o hardware em que você está rodando. Leve o arquivo executável para uma combinação de hardware/CA diferente, e ele será executado lá enquanto houver um JVM presente.
Agora, digamos que você tenha escrito um programa na linguagem de programação de alto nível C (sim, C é uma linguagem de alto nível). Você compila-o e liga-o e termina com código nativo (aka, código de máquina). Quando você executa (executa) o programa, as instruções da linguagem de máquina são executadas diretamente no hardware da CPU. Se você quer que o programa execute em uma arquitetura de CPU diferente, você precisa compilá-lo com um compilador diferente (ou o mesmo compilador com opções diferentes), para gerar o código da máquina para aquela nova CPU de destino.
Se você não tem um compilador de linguagem de alto nível para sua CPU de destino, mas você tem um assembler disponível, você pode escrever seu programa em linguagem assembly para aquela arquitetura de CPU, montá-lo e ligá-lo e terminar com as instruções de linguagem de máquina executadas diretamente no hardware da CPU. Se você quiser que o programa execute em uma arquitetura de CPU diferente, você precisa reescrever o programa na linguagem assembly que corresponda ao seu novo alvo de CPU, e então montar e vincular isso, para gerar o código da máquina para aquela nova CPU de destino.
Artigos semelhantes
- Quais são as diferenças entre bytecode e código de máquina? O bytecode é específico apenas para Java?
- Em termos leigos, o que é código de byte, código de montagem, código de máquina e código fonte?
- Qual é a diferença entre linguagem de máquina, linguagem de montagem e linguagem de alto nível em computadores?
- Quais são as diferenças entre Código de Máquina, Código de Byte, Código de Objeto e Código Fonte?