O texto digitado transpira para JS. Em seguida, há agitação de árvore, "menos" (opcional) e o que mais no processo de fazer uma implantação. Mas nada disso (afaik) tem algo a ver com "compilar". Tudo é agrupado e altamente otimizado, mas não é realmente compilado, certo?
Compilação significa transformar um programa escrito em uma linguagem A em um programa semanticamente equivalente escrito na linguagem B, de modo que avaliar o programa compilado de acordo com as regras da linguagem B (por exemplo, interpretá-lo com um intérprete para B ) produz o mesmo resultado e tem o mesmos efeitos colaterais que avaliar o programa original de acordo com as regras da linguagem A (por exemplo, interpretá-lo com um intérprete para A ).
Compilação simplesmente significa traduzir um programa de idioma A para a linguagem B . Isso é tudo que significa. (Observe também que é perfeitamente possível que A e B sejam o mesmo idioma.)
Em alguns casos, temos nomes mais especializados para certos tipos de compiladores, dependendo do que são A e B e do que o compilador faz:
- se A é percebido como linguagem assembly e B é percebido como linguagem de máquina, então o chamamos de assembler ,
- se A é percebido como linguagem de máquina e B é percebido como linguagem assembly, então o chamamos de desmontador ,
- se A é percebido como de nível inferior a B , então o chamamos de descompilador ,
- se A e B são a mesma linguagem, e o programa resultante é de alguma forma mais rápido ou mais leve, então o chamamos de otimizador ,
- se A e B são as mesmas linguagens e o programa resultante é menor, então o chamamos de minificador ,
- se A e B são as mesmas linguagens e o programa resultante é menos legível, então o chamamos de ofuscador ,
- se A e B são percebidos como estando aproximadamente no mesmo nível de abstração, então o chamamos de transpiler , e
- se A e B são percebidos como estando aproximadamente no mesmo nível de abstração e o programa resultante preserva a formatação, os comentários e a intenção do programador de forma que seja possível manter o programa resultante da mesma maneira que o programa original, então chamamos é uma ferramenta de reengenharia .
Além disso, observe que fontes mais antigas podem usar os termos "tradução" e "tradutor" em vez de "compilação" e "compilador". Por exemplo, C fala sobre "unidades de tradução".
Você também pode encontrar o termo "processador de linguagem". Isso pode significar um compilador, um interpretador ou ambos os compiladores e interpretadores, dependendo da definição.
O próprio Javascript ainda é interpretado, certo?
JavaScript é uma linguagem. Os idiomas são um conjunto de regras e restrições lógicas. As linguagens não são interpretadas ou compiladas. As línguas simplesmente são .
Compilação e interpretação são características de um compilador ou interpretador (duh!). Cada linguagem pode ser implementada com um compilador e cada linguagem pode ser implementada com um interpretador. Muitas linguagens possuem compiladores e interpretadores. Muitos mecanismos modernos de execução de alto desempenho têm pelo menos um compilador e pelo menos um interpretador.
Esses dois termos pertencem a diferentes camadas de abstração. Se o inglês fosse um idioma digitado, "idioma interpretado" seria um erro de tipo.
Observe também que algumas linguagens não têm intérprete nem compilador. Existem linguagens que não têm implementação nenhuma. Ainda assim, são linguagens e você pode escrever programas nelas. Você simplesmente não pode executá-los.
Além disso, observe que tudo é interpretado em algum momento : se você deseja executar algo, deve interpretá-lo. A compilação apenas traduz o código de um idioma para outro. Não o executa. Interpretação executa. (Às vezes, quando um interpretador é implementado em hardware, chamamos de "CPU", mas ainda é um interpretador.)
Caso em questão: cada implementação de JavaScript mainstream existente atualmente tem um compilador.
O V8 começou como um compilador puro: compilou JavaScript direto para código de máquina nativo moderadamente otimizado. Mais tarde, um segundo compilador foi adicionado. Agora, existem dois compiladores: um compilador leve que produz código moderadamente otimizado, mas o próprio compilador é muito rápido e usa pouca RAM. Este compilador também injeta código de criação de perfil no código compilado. O segundo compilador é um compilador mais pesado, mais lento e mais caro, que, no entanto, produz um código muito mais restrito e muito mais rápido. Ele também usa os resultados do código de criação de perfil injetado pelo primeiro compilador para tomar decisões de otimização dinâmica. Além disso, a decisão de qual código recompilar usando o segundo compilador é feita com base nessas informações de perfil. Observe que em nenhum momento há um intérprete envolvido. O V8 nunca interpreta, sempre compila. Não faz nem contém um intérprete. (Na verdade, acredito que hoje em dia sim, estou descrevendo as duas primeiras iterações.)
SpiderMonkey compila JavaScript para bytecode SpiderMonkey, que então interpreta. O interpretador também faz o perfil do código e, então, o código que é executado com mais freqüência é compilado por um compilador para o código de máquina nativo. Portanto, SpiderMonkey contém dois compiladores: um de JavaScript para o bytecode SpiderMonkey e outro de bytecode SpiderMonkey para o código de máquina nativo.
Quase todos os mecanismos de execução de JavaScript (com exceção do V8) seguem este modelo de um compilador AOT que compila JavaScript para bytecode e um mecanismo de modo misto que alterna entre interpretar e compilar esse bytecode.
Você escreveu em um comentário:
Eu realmente estava pensando que o código de máquina está envolvido em algum lugar.
O que significa "código de máquina"?
O que é a linguagem de máquina de um homem é a linguagem intermediária de outro homem e vice-versa? Por exemplo, existem CPUs que podem executar nativamente o bytecode JVM, em tal CPU, o bytecode JVM é o código de máquina nativo. E há interpretadores para o código de máquina x86, quando você executa o código de máquina x86 é interpretado por bytecode.
Existe um interpretador x86 chamado JPC escrito em Java. Se eu executar o código de máquina x86 em JPC rodando em uma CPU JVM nativa ... qual é o bytecode e qual é o código nativo? Se eu compilar o código de máquina x86 para JavaScript (sim, existem ferramentas que podem fazer isso) e executá-lo em um navegador no meu telefone (que tem uma CPU ARM), qual é o bytecode e qual é o código de máquina nativo? E se o programa que estou compilando for um emulador SPARC e eu o usar para executar o código SPARC?
Observe que toda linguagem induz uma máquina abstrata e é uma linguagem de máquina para essa máquina. Portanto, cada linguagem (incluindo linguagens de alto nível) é um código de máquina nativo. Além disso, você pode escrever um intérprete para cada idioma. Portanto, todas as linguagens (incluindo o código de máquina x86) não são nativas.