Executando verificação de segurança...
8

Que bom que falou em modo de execução porque isso é muito mais relevante.

Hoje em dia é complicado definir o que é um compilador e um interpretador.

O interpretador puro praticamente não existe mais em qualquer produto real.

O interpretador de verdade é um software que vai lendo um texto e vai entendendo o que ele está determinando e vai criando execuções de acordo com isso. É extremamente ineficiente, mas simples de fazer e funciona bem em situações de baixo recurso para lidar com códigos. Ele vai executando conforme vai encontrando código. Em um laço, por exemplo, ele interpreta o mesmo código diversas vezes.

O que existe hoje que chamam de interpretador na verdade é um compilador sob demanda. Nenhuma linguagem das mais conhecidas possui uma implementação que use um interpretador real, mas algumas se dizem interpretadas porque há um código fonte disponível para um compilador sob demanda processar e depois estabelecer uma forma de execução geral. Quase sempre ele gera um código intermediário que será processado por uma máquina virtual. Em casos mais raros, mas cada vez menos raros, ele gera um código nativo que é executado pelo processador.

Ele difere do compilador tradicional que pega um código fonte, gera um código intermediário, chamado de bytecode, ou gera um código nativo, em geral encapsula em um arquivo binário com possibilidade de execução, muitas vezes que o sistema operacional entende de forma especial.

Ou seja, a compilação é feita antes da execução em passos completamente distintos. Em alguns casos o código intermediário pode passar por um processo de nova geração de código nativo, isso é chamado de compilação JIT.

Em qualquer casos o normal dessa compilação tradicional, embora possa acontecer diferente, é que o código fonte não precisa ser enviado para a execução.

O que ainda chamam de interpretação, mesmo sem ser, é o fato de você enviar o código fonte para que a compilação seja feita na hora, mas em bloco de forma mais eficiente que a interpretação tradicional.

Na verdade tem situações híbridas, então pode ser mais complicado pensar nisso.

Pegando o exemplo do JavaScript ele costuma entregar o código fonte, por isso as pessoas dizem que ele é interpretado, mas a execução de todos engines mais conhecidos da linguagem usa JITting, e a execução é feita como código nativo. Ou seja, há uma compilação do código fonte recebido e gera um código nativo do processador que está rodando (mesmo que tenha um processo intermediário antes). Tudo isso acontece junto no momento que é solicitado executar algo. É quase impossível ser mais compilado que isso, mas chama de interpretado.

Por isso se torna confuso. As pessoas usam termos do mecanismo básico para definir o que é o processo final. Não tem como não ser confuso. Eu já estou fazendo simplificações aqui, é ainda mais complicado quando você vê todas possibilidades.

As vantagens e desvantagens dependem mais da forma de implementação do que de algo geral. Depende da linguagem. Algumas pessoas podem tentar fazer uma lista, mas elas nem sempre serão verdade em todas as tecnologias, e muitas vezes só será verdade em coisas antigas, não mais no que usamos de verdade.

Em geral, o que se chama compilado pode entregar algo já verificado antes e pode começar executar de forma imediata. Além disso, em certas condições pode dar um desempenho geral muito melhor e ocupar menos memória e fazer algumas otimizações pesadas, mas não é obrigatório. Em geral o compilado antes pode fazer o processo de desenvolvimento ser um pouco mais lento e mais difícil de atualizar, mas nada muito diferente, é questão de saber fazer ajustes. E claro, tende proteger a propriedade intelectual.

O que se costuma chamar de interpretação tem como vantagens e desvantagens o oposto disso porque precisa de um processo em cada execução, precisa de uma máquina virtual, tem vários desperdícios e precisa entregar o código fonte.

É possível ter um processo mais híbrido e desenvolver de forma mais próxima do interpretado e depois entregar um executável compilado otimizado.

Quero reforçar que ser compilado não é o mesmo de entregar nativo, de ter tipagem estática, de ter gerenciamento manual de memória, de ser menos flexível, de ser mais seguro, se ser menos produtivo, ou qualquer característica que pode acontecer em alguma tecnologia, mas não é inerente ao processo de compilação.

Em alguns casos chama-se de interpretação quando o código é compilado para um código intermediário e depois uma máquina virtual "interpreta" esse bytecode gerado pelo compilador. Há controvérsias o quanto isso é uma interpretação, porque até o processador tem que fazer algo muito parecido, não à toa que a máquina virtual simula uma real.

É mais um assunto que se você souber pela metade não entenderá bem o funcionamento, porque tem muito detalhe que pode fazer entender de forma equivocada. E o povo sempre subverte o jeito de fazer e são criativos para deixar tudo híbrido.

Eu poderia falar mais, mas tem links com muito mais.

Muitas vezes quando há dúvidas, ajudaria mais passar o que entendeu e fazer perguntas específicas, porque eu e outras pessoas podemos estar falando o que já sabemos. Ou que já não tinha entendido.

O assunto é interessante e abre muitas pontas. Adoraria perguntas novas mais específicas.

Para ajudar ou dificultar mais:

Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

Processo de compilação e interpretação

Carregando publicação patrocinada...
2

Maniero, suas considerações foram muito enriquecedoras para me ajudar a compreender esse assunto. É bastante conteudo, vou digerir ele melhor e volto com as minhas considerações sobre o que ainda está nebuloso pra mim. Mas gostaria de agredecer logo, pois sei que gastou um tempo precioso para me ajudar com isso. Obrigado.

1

Maniero como sempre arrebentou! o cara nao so respondeu como foi la, complementou, adicionou referencias. Eu acompanho o tabnews pq so aqui encontramos uns caras raros como esse!
vlw demais maniero!

2

Eu tenho tentado evitar comenatr sem necessodade produzir algo que receba likes porque agora é punido quando não tem likes, mas f0d@-se, vou comentar quanto eu quiser, e ficarei sem votos mesmo. Não vou ser mal educado de não te responder e agradecer porque o sistema pune um comentário sem valor concreto. Vou pagar o preço de quase não poder votar mais nas coisas. Eu faço pra quem aprecia isso mesmo, valeu pelo apoio.

1