Como já foi dito, compilado e interpretado são específicos para uma implementação de uma linguagem de programação; eles não são inerentes ao idioma. Por exemplo, existem interpretadores C.
No entanto, podemos (e na prática fazemos) classificar as linguagens de programação com base em sua implementação mais comum (às vezes canônica). Por exemplo, dizemos que C é compilado.
Primeiro, devemos definir intérpretes e compiladores sem ambigüidade:
Um intérprete de linguagem X é um programa (ou uma máquina, ou algum tipo de mecanismo de um modo geral), que executa qualquer programa p escrito em linguagem X de tal forma que ele executa os efeitos e avalia os resultados como prescrito pela especificação de X .
Um compilador de X para Y é um programa (ou uma máquina, ou apenas algum tipo de mecanismo em geral) que traduz qualquer programa p de alguma linguagem X em um programa semanticamente equivalente p ' em alguma linguagem Y de tal forma que interpretar p ' com um intérprete para Y irá produzir os mesmos resultados e têm os mesmos efeitos que a interpretação de p com um intérprete para X .
Observe que, do ponto de vista do programador, as CPUs são intérpretes de máquina para sua respectiva linguagem de máquina nativa.
Agora, podemos fazer uma classificação provisória das linguagens de programação em 3 categorias, dependendo de sua implementação mais comum:
- Linguagens Hard Compiled: Quando os programas são compilados inteiramente para linguagem de máquina. O único intérprete usado é uma CPU. Exemplo: Normalmente, para rodar um programa em C, o código fonte é compilado em linguagem de máquina, que é então executado por uma CPU.
- Linguagens interpretadas: quando não há compilação de nenhuma parte do programa original para linguagem de máquina. Em outras palavras, nenhum novo código de máquina é gerado; apenas o código de máquina existente é executado. Um interpretador diferente da CPU também deve ser usado (normalmente um programa) .Exemplo: Na implementação canônica do Python, o código-fonte é compilado primeiro para o bytecode Python e então esse bytecode é executado pelo CPython, um programa interpretador para o bytecode Python .
- Linguagens compiladas de software: Quando um interpretador diferente da CPU é usado, mas também partes do programa original podem ser compiladas para linguagem de máquina. Este é o caso de Java, onde o código-fonte é compilado para bytecode primeiro e, em seguida, o bytecode pode ser interpretado pelo interpretador Java e / ou compilado posteriormente pelo compilador JIT.
Às vezes, as linguagens compiladas soft e hard são referenciadas como simplesmente compiladas, portanto, C #, Java, C, C ++ são chamados de compilados.
Dentro dessa categorização, o JavaScript costumava ser uma linguagem interpretada, mas isso foi há muitos anos. Hoje em dia, ele é compilado por JIT para linguagem de máquina nativa na maioria das principais implementações de JavaScript, então eu diria que ele cai em linguagens compiladas de software.