… devido as suas particularidades, confesso que fiquei um pouco confuso! Em geral, as linguagens de programação interpretadas utilizam de um componente intermediário chamado interpretador (daí, o nome), para executar as instruções do código-fonte. Embora esta abordagem traga algumas vantagens interessantes como a praticidade (não requer a compilação do código para a execução do programa) e a conveniência (não é necessário contar com uma versão do programa para rodar em diferentes plataforma), na prática elas não entregam a mesma performance, se comparadas com as linguagens de programação compiladas…
Por isto, algumas linguagens de programação como Java, Python, C#, PHP e Scala, promovem a utilização de bytecodes, que por sua vez é uma espécie de compilação designada para rodar em um ambiente especial: a máquina virtual (VM)! No caso de Python, o que acontece na prática quando “executamos” um código escrito nesta linguagem? Ao invés de ler o código-fonte linha por linha e executar as suas instruções de forma direta, sem a necessidade de compilação prévia para código de máquina, o interpretador do Python compila o código-fonte para um conjunto de instruções designadas especialmente para rodar dentro de uma VM especial (a Python VM), que por sua vez era criada e fornecida pelo próprio interpretador.
Já tinha visto esta abordagem pela primeira vez nos meus tempos de faculdade, nas matérias em que o Java era a linguagem usada para promover os fundamentos de programação orientada a objetos (numa época em que ainda me interessava por desenvolvimento de softwares). Naqueles tempos, ela se tornou bastante popular por esta particularidade, pois embora fosse classificada como uma linguagem de programação compilada (gerava os bytecodes através de um compilador e o executava em máquinas virtuais JVM), outras literaturas não a viam desta forma, já que tais binários resultantes só poderiam ser executados dentro de sua JVM.
Então, esta mesma lógica também se aplicaria ao Python? Embora elas utilizem a mesma abordagem em relação aos bytecodes, na prática elas apresentam diferenças marcantes em relação a sua utilização: os bytecodes gerados pelo Python são executados de forma linear pelas suas VMs, ao passo que os bytecodes gerados pelo Java fazem o uso de uma compilação mais otimizada (Just-In-Time ou JIT), que por sua vez entrega uma performance superior, se comparada ao Python. Por fim, podemos rodar qualquer programa “compilado” em Java em qualquer plataforma (“Write Once, Run Anywhere”); já o mesmo, não se pode dizer em relação ao Python.
Seja como for, acredito que deveríamos ser feita uma nova classificação para as linguagens de programação que adotam esta abordagem, além de redefinir todos conceitos relacionados ao uso de bytecodes. Vou mais além: estabelecer padrões que definam como estas abordagens deverão ser feitas, já que muitas linguagens de programação também possuem implementações que se distinguem da linguagem original. No caso do próprio Python, temos o Jython, o Cython e o IronPython, as quais redefinem a forma com que os códigos são compilados, além de designarem ambientes de execução especiais para atenderem a determinados propósitos.
Em tempo: agradecimentos ao ChatGPT, por tirar algumas dúvidas! &;-D