Antes de tudo, uma linguagem de programação pode ser tanto interpretada como compilada. Interpretação e compilação são apenas métodos de geração de código executável a partir do código fonte. Com um intérprete, o código-fonte está sendo lido e interpretado por um intérprete que, em seguida, executa o código como ele o interpreta. Um compilador, por outro lado, lê o código-fonte e gera um arquivo binário executável a partir do código-fonte - para que o programa possa ser executado como um processo separado independentemente.
Agora, antes que alguém se pergunte ... Sim, C / C ++ / C # / Java podem ser interpretados e sim, scripts JavaScript e Bash podem ser compilados. Se há intérpretes ou compiladores de trabalho para esses idiomas, é outra questão.
Agora, para realmente responder à pergunta, quando usaremos "linguagem interpretada" em vez de "linguagem compilada". A questão em si é um pouco confusa, mas presumo que isso significa quando preferir a interpretação à compilação. Uma das desvantagens da compilação é que ela gera alguma sobrecarga devido ao processo de compilação - o código-fonte precisa ser compilado no código de máquina executável, para que não seja adequado para tarefas que exigem um atraso mínimo ao invocar o código-fonte para executar um programa. Por outro lado, o código fonte compilado é quase sempre mais rápido que o código fonte interpretado equivalente devido à sobrecarga causada pela interpretação do código. Os intérpretes, por outro lado, podem invocar e executar o código fonte com muito pouca sobrecarga de invocação, mas à custa do desempenho em tempo de execução.
No final, é quase impossível mencionar casos de uso definidos quando preferir um após o outro, mas, por exemplo, um caso (para o meu significado muito irreal) seria quando o código-fonte do programa muda dinamicamente entre invocações de programas e a sobrecarga de compilação é muito alta. alto para que seja uma escolha viável. Nesse caso, provavelmente seria desejável interpretar o código fonte em vez de compilar.
No entanto, há algo que pode ser considerado um exemplo do mundo real: ocultar o código-fonte na implantação. Com nativamentecódigo compilado, o desenvolvedor implementa o código macine executável do programa e dos dados. Com o código interpretado, o próprio código-fonte precisa ser implantado, o que pode ser inspecionado e submetido a engenharia reversa com muito menos esforço do que o que é fazer engenharia reversa do código de máquina nativo. Uma exceção a isso são linguagens como C # e Java, que são compiladas no idioma / bytecode imediato (MSIL para C # e bytecode Java para Java), que são implementadas e compiladas "just in time" no tempo de execução, como um intérprete. No entanto, existem os chamados decompiladores para MSIL e Java Bytecode que podem reconstruir o código-fonte original com uma precisão relativamente boa e, como tal, esses produtos de engenharia reversa são muito mais triviais do que os produtos de engenharia reversa implementados no código de máquina nativo.