Linguagem interpretada é a designação usada para descrever uma implementação de uma linguagem de programação na qual os programas são executados por um interpretador, que analisa e executa instruções do código-fonte ou de uma representação intermediária. A distinção entre interpretação e compilação não é absoluta: uma implementação pode interpretar código, compilá-lo antes da execução ou combinar essas técnicas. Por isso, a expressão «linguagem interpretada» descreve, em geral, uma estratégia de implementação, e não necessariamente o comportamento de todas as implementações possíveis de uma linguagem.
Um interpretador executa as instruções de um programa a partir do código-fonte ou de uma representação intermediária. Um compilador, por sua vez, traduz código de uma representação para outra. Na compilação antecipada, essa tradução ocorre antes da execução do programa; o resultado pode ser código de máquina ou uma representação intermediária, como o bytecode. Dependendo do ambiente, o código intermediário pode ser interpretado ou submetido a uma nova compilação.
Assim, a classificação de uma linguagem como interpretada ou compilada depende, em parte, da implementação considerada. Uma linguagem pode ter ambientes de execução diferentes, e um mesmo ambiente pode combinar um interpretador com um compilador.
O bytecode é uma representação intermediária composta por instruções destinadas a um ambiente de execução, frequentemente uma máquina virtual. Não é, por definição, uma linguagem interpretada: as instruções podem ser executadas por um interpretador ou compiladas para outra representação.
Na máquina virtual Java (JVM), por exemplo, uma instrução é composta por um código de operação (opcode), de um byte, seguido por zero ou mais operandos. Portanto, nem toda instrução ocupa apenas um byte.
O formato das instruções também varia entre implementações. Na implementação CPython da linguagem Python, por exemplo, a documentação descreve unidades de código de 16 bits, que contêm um código de operação e um argumento de oito bits cada.
Uma máquina virtual pode facilitar a portabilidade ao fornecer um ambiente compatível em diferentes sistemas operacionais. Isso, porém, não significa que qualquer programa será independente de plataforma: a disponibilidade da máquina virtual, das bibliotecas e de outros recursos necessários também importa.
A compilação just-in-time (JIT) é uma técnica em que o código é compilado durante a execução do programa, normalmente para código de máquina. Compiladores JIT podem identificar trechos executados frequentemente e compilá-los para melhorar o desempenho. O benefício depende do ganho obtido em relação ao custo adicional de compilação.
A compilação JIT pode coexistir com a interpretação: um ambiente pode interpretar inicialmente determinadas instruções e compilar trechos selecionados durante a execução. Por isso, JIT não é sinônimo de linguagem interpretada nem uma categoria que exclua a compilação.
Uma linguagem de script é associada ao uso de programas organizados em scripts, frequentemente empregados para automatizar tarefas ou coordenar operações em um ambiente computacional. Muitas linguagens de script são executadas por interpretadores, mas a designação está relacionada ao uso e ao contexto dos programas, não a uma exigência de que toda implementação utilize exclusivamente interpretação.
As consequências da interpretação dependem da linguagem, da implementação e do ambiente de execução. A estratégia utilizada pode influenciar o desempenho, o tempo de inicialização, a portabilidade e o processo de desenvolvimento, mas não determina, por si só, a tipagem da linguagem, o tamanho final do programa ou a facilidade de identificar erros.
A compilação JIT pode aumentar o desempenho de trechos executados repetidamente, embora envolva trabalho adicional durante a execução. De modo semelhante, executar código intermediário em uma máquina virtual pode favorecer a portabilidade, desde que exista um ambiente compatível na plataforma de destino.