Por que não existe um compilador python no código da máquina nativa?


25

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?


4
Não é . Haskell também pode se comportar como compilado ou interpretado através GHCI
toasted_flakes

C ++ também tem intérpretes . E provavelmente muitas outras línguas têm as duas implementações.
Claudio

2
Na verdade, escolhendo IronPythong ( ironpython.net ) e compilar o código IL produzido usando "ngen" ( msdn.microsoft.com/de-de/library/6t9t5wcf%28v=vs.110%29.aspx ) lá é uma maneira compilar Python para código de máquina nativo. Não que eu tivesse testado essa cadeia de ferramentas.
Doc Brown

10
Pode-se escrever compiladores Python para nativos. Eles simplesmente não são muito interessantes porque na verdade não melhoram o desempenho por nenhuma margem significativa, a menos que implementem uma linguagem que se pareça com o Python, mas seja muito mais restrita. Eu expliquei anteriormente em outro lugar o porquê.

Respostas:


29

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:

  1. Verifique se a estrutura dos dados é estática durante a execução do programa. Isso é problemático porque o Python possui avaliação e metaclasses. Ambos permitem alterar a estrutura do programa com base na entrada do programa. Essa é uma das coisas que dão ao Python esse poder expressivo.
  2. Inferir os tipos de todas as variáveis, estruturas e classes do próprio código fonte. Embora seja possível, até certo ponto, o sistema e o algoritmo do tipo estático seriam tão complexos que seria quase impossível implementar de uma maneira utilizável. Você poderia fazer isso para um subconjunto do idioma, mas definitivamente não para todo o conjunto de recursos do idioma.

6
Pena de notar que esta faz o problema difícil , mas não impossível. O sbcl compila o Common Lisp, que também é dinâmico, possui evale 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.
precisa

3
@jozefg eu disse efetivamente compilar. Não basta compilar. O Python também possui seu compilador Cython, que produz código nativo. O ponto é que esses compiladores não conseguem nem mesmo fração de otimizações que os compiladores para linguagens de tipo estaticamente podem. E quando você comparar o desempenho, compare-o ao C ++ compilado e não ao Python interpretado.
Euphoric

2
Bem, na verdade, você ficaria surpreso com o que o sbcl pode fazer. O jogo de benchmarks mostra que ele é executado tão rápido quanto Java, quase tão rápido quanto GHC e entre 1 e 10 vezes mais C. Não é lento para nenhum padrão. Sim, os tipos dinâmicos inibem a compilação até certo ponto, mas não tanto quanto você parece pensar.
precisa

3
Comparar a velocidade do python interpretado com o python compilado é interessante por si só. Pare de dizer "use C ++". Talvez você já tenha o código escrito em Python. Talvez o código seja mais fácil de escrever em python. Quem se importa. O que me importa é uma velocidade de 1,5x (seja o que for). Isso pode fazer uma enorme diferença.
Thomas Eding

3
Em outras palavras, se você deseja compilar, escolha outro idioma ajustado para isso, como C ++ ou Pascal.
Please_Dont_Bully_Me_SO_Lords

0

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.


-4

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.


5
O C # pode ir diretamente para o código da máquina: Linguagem intermediária comum: compilação antecipada - "Os ambientes de execução compatíveis com CLI também oferecem a opção de fazer uma compilação antecipada (AOT) de um assembly para torná-lo mais rápido, removendo o processo JIT em tempo de execução. No .NET Framework, existe uma ferramenta especial chamada NGEN (Native Image Generator) que executa a AOT. No Mono, também há uma opção para executar uma AOT. "
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.