Pelo que entendi, a causa da diferença de velocidade entre linguagens compiladas e python é que o primeiro compila código até o código da máquina nativa, enquanto o python compila no bytecode python, para ser interpretado pelo PVM. Vejo que desta maneira os códigos python podem ser usados em vários sistemas operacionais (pelo menos na maioria dos casos), mas não entendo, por que não existe um compilador adicional (e opcional) para python, que compila da mesma maneira que os compiladores tradicionais . Isso deixaria para o programador escolher, o que é mais importante para eles; executabilidade multiplataforma ou desempenho na máquina nativa. Em geral; por que não existem idiomas que possam se comportar como compilados e interpretados?
python
compiler
interpreters
user2986898
fonte
fonte
Respostas:
Não. A razão pela qual existem diferenças de velocidade entre linguagens como Python e C ++ é porque linguagens estaticamente fornecem ao compilador toneladas de informações sobre a estrutura do programa e seus dados, o que permite otimizar tanto os cálculos quanto o acesso à memória. Como o C ++ sabe que a variável é do tipo int, ele pode determinar a maneira ideal de manipular essa variável mesmo antes da execução do programa. Em Python, por outro lado, o tempo de execução não sabe qual é o valor de uma variável até a linha ser alcançada pelo intérprete. Isso é extremamente importante para estruturas em que, em C ++, o compilador pode identificar facilmente o tamanho da estrutura e todos os locais de seus campos na memória durante a compilação. Isso fornece um enorme poder de previsão de como os dados podem ser usados e permite otimizar de acordo com essas previsões.
Para compilar linguagens como o Python, você precisa:
fonte
eval
e várias outras coisas para deixar tristes os escritores de compiladores. Não está no nível do gcc, mas certamente é mais rápido que o intérprete do CPython.Dois conceitos podem nos ajudar a entender melhor por que o Python compilado no código de máquina nativo "pode" não ser executado tão rápido quanto o C compilado ou outras linguagens comumente compiladas. Eles são chamados de ligação antecipada e ligação tardia.
Eu deveria começar dizendo que não sou especialista em Python e vim a este site por acidente. Mas eu gosto deste site.
Conforme mencionado em outra resposta aqui, o compilador C ++ pode saber muito sobre o programa e tomar decisões sobre quais operações usar para estruturas de dados específicas. Como exemplo, se duas variáveis inteiras precisarem ser adicionadas, o compilador sabe que são inteiros nativos, com 32 bits de largura, por exemplo, e pode adicioná-los juntamente com uma instrução "ADD". Por isso, compila a instrução ADD no código. Ele está bloqueado e não pode ser alterado enquanto o programa está sendo executado. Isso é obrigatório.
Por outro lado, em uma linguagem como Python, podemos esperar que o programa junte diferentes tipos de dados de maneiras complexas. Agora, o compilador não sabe se nossas 2 variáveis são números inteiros, flutuantes, strings ou listas. Portanto, ele precisa compilar o código que determina essas informações no tempo de execução e selecionar a operação correta enquanto o programa está sendo executado. Isso é uma ligação tardia e podemos entender que haverá um impacto no desempenho para realizar esse trabalho extra enquanto o programa estiver em execução. É o preço que você paga por manter essas opções abertas em uma linguagem como Python, mas fornece flexibilidade máxima em tempo de execução.
fonte
Eu acho que tem mais a ver com as especificidades do Python, pelo mesmo motivo que você não pode compilar C # para código de máquina. As especificidades de idioma realmente tornam seus programas com erros, mesmo que isso fosse possível devido à natureza do idioma. Por que não aprender apenas a linguagem C? É muito mais fácil que o C ++ e um pouco avançado que o Python, mas ainda acessível.
fonte