1
resposta

Linguagens compiladas e interpretadas

Nesta aula, aprendi que podem existir dois tipos de linguagem: compiladas, interpretadas e as linguagens que tanto compilam quanto interpretam.

Em uma linguagem compilada, o tradutor busca traduzir o código fonte inteiro para o código de máquina, o que pode tornar o tempo de execução um pouco mais demorado porém é capaz de identificar erros para serem corrigidos antes de sua execução. Uma linguagem compilada também serve para programas robustos, grandes, e normalmente só podem ser executados em um tipo de máquina ou uma classe de máquinas específica. Exemplos de linguagem compilada são: C, C++, Go, Swift, Delphi e Rust.

Em uma linguagem interpretada, o tradutor traduz o código fonte para o código de máquina em tempo real, na hora da execução, o que pode tornar o tempo de execução mais ágil porém os erros só serão identificados na hora da execução. Uma linguagem interpretada também serve para programas que rodarão em múltiplos tipos de máquinas diferentes. Exemplos de linguagem interpretada são: Js, Phyton, Matlab, PHP, Ruby, Pearl e List.

Há também o caso das linguagens que tanto compilam quanto interpretam, juntando os dois mundos, como o caso do Java por exemplo, onde o código fonte primeiramente é compilado em um arquivo .class (byte code) e em seguida interpretado pela máquina a partir de um interpretador chamado JVM (Máquina Virtual Java). Isso é muito útil, pois permite que tipos de máquinas diferentes possam ler o mesmo programa, basta que essas máquinas tenham suporte ao Java, assim nós eliminamos a limitação das linguagens que apenas compilam, onde elas são apenas capazes de rodar em um tipo ou classe específica de máquinas. Outros exemplos desse tipo de linguagem são JavaScript e Phyton.

1 resposta

Sobre linguagens interpretadas e compiladas, nenhuma linguagem é 100% um ou outro. Python, por exemplo, compila pra bytecode igual a Java (os arquivos .pyc são compilados de bytecode) e interpretados pela PVM (CPython).

Existem varias outras formas de interpretação, como a JIT, que compila primeiro pra bytecode e depois pra código de máquina igual uma compilada. Por exemplo, se você rodar Java numa implementação do JVM chamado HotSpot, ele vai "assistir" e analizar seu código para ver quais as partes que mais executam e compilar essas partes direto pra código de máquina, então sua aplicação pode ser lenta no início e ter uma maior performance conforme o os "hotspots" forem identificados.

Além desses dois métodos de interpretação de programas, existem vários outros, como o AST que analisa a Árvore Sintática Abstrata diretamente ao invés de compilar pra bytecode ou machine code, isso faz com que o parsing e a análise de tokens seja mais fácil, já que esse tipo de interpretação consegue conservar a estrutura e relação do código. Muitas linguagens usam um passo de AST antes do bytecode, como Python.

E, pra exercicio mental, se existisse um processador capaz de ler as instruções do bytecode do Python diretamente sem precisar de VM, isso faria Python ser compilada ou interpretada?