Por que não existem outras linguagens de programação que são compiladas no bytecode do Python?

51

Em Java, existem várias linguagens que são compiladas no bytecode Java e podem ser executadas na JVM - Clojure, Groovy e Scala, sendo as principais que me lembro de cabeça.

No entanto, o Python também se transforma em bytecode (arquivos .pyc) antes de ser executado pelo interpretador Python. Eu posso apenas ser ignorante, mas por que não existem outras linguagens de programação que sejam compiladas no bytecode python?

É apenas porque ninguém se incomodou ou existe algum tipo de restrição ou barreira inerente que dificulta a execução?

Michael0x2a
fonte
30
... porque eles não querem lidar com o GIL? ;)
Mason Wheeler
4
Os instintos me diziam que tem muito a ver com a maturidade da JVM, bem especificada, e a JVM está em praticamente todas as plataformas ou é estúpida e fácil de adquirir.
Rig
4
Eu suspeito também que a maioria das JVMs é muito mais rápida que os intérpretes de python.
Peter Smith
19
Ao direcionar o bytecode Java, você obtém todos os recursos de uma JVM (segurança, desempenho, portabilidade, escalabilidade etc.). A segmentação por bytecode do Python não o ajuda muito.
David Schwartz
3
O bytecode do Python não é reconhecido pelas versões posteriores do interpretador Python. Como alguém pode implementar uma linguagem de programação compilada no bytecode do Python?
Gus

Respostas:

77

Simples - da última vez que verifiquei, o Python não tinha especificação formal, incluindo seu bytecode. CPython é a especificação e a portabilidade de bytecode é IIRC não necessária. Portanto, é um alvo em movimento e não documentado, projetado para um idioma específico.

p_l
fonte
22
De fato, os detalhes do formato do bytecode geralmente mudam entre versões secundárias, e mesmo o PyPy com 99% de compatibilidade nem tenta (na verdade, eles adicionam suas próprias instruções de bytecode).
Nota: Python - a linguagem-- tem uma especificação formal (consulte o "PEPs"). A 'Máquina Virtual Python' não tem. Isto é realmente diferente de Java (por exemplo), onde ambos são especificados.
Albert
56

Existem várias linguagens JVM, porque havia pessoas talentosas que queriam escrever código que funcionasse com o código Java existente, mas não queriam escrever Java .

Aparentemente, não há programadores que queiram trabalhar com o código Python existente, mas odeiam o Python o suficiente para portar outra linguagem para o interpretador de bytecode do Python.

Você pode ver isso de duas maneiras: existem linguagens alternativas para a JVM porque o Java é muito difundido ou não há linguagens alternativas para o interpretador de bytecode do Python porque o Python não é uma droga.

Kevin Cline
fonte
7
Espero que você não está dando a entender que Java é uma porcaria ou Java suga mais do que Python :-)
Giorgio
8
@Giorgio: Estou sugerindo que os criadores de Groovy, Scala, Clojure, etc. pensaram que havia espaço considerável para melhorias. Você está sugerindo que o Python é uma merda?
Kevin cline
8
Depois de trabalhar com python, eu diria que "baixo fator de sucção" seria impreciso. Ele ganha muito material comumente aceito e toda essa coisa de 'eu' é extremamente contraproducente. Na verdade idiota. Como um método de classe não sabe onde pertence?
Rig
6
@ Rig Pessoalmente, acho que a abordagem do Python é mais elegante. O OO segue organicamente da sintaxe, em vez de exigir uma palavra-chave especial que se parece com uma variável. Por que os métodos de classe não sabem onde estão, é porque as definições de classe Python são apenas código, e esse código não é privilegiado porque, por acaso, está localizado dentro de uma definição de classe. Você pode definir métodos em qualquer lugar e adicioná-los a uma classe em tempo de execução. De fato, você pode pegar a mesma função e usá-la como método em várias classes, algo que realmente não funcionaria com o thisparadigma.
Antimony 06/06
6
Eu acho que é uma questão de VMs, não de idiomas. A JVM é uma VM de alto desempenho com um coletor de lixo geracional, JIT, etc. Enquanto o CPython usa contagem de referência e é um intérprete. É o CPython que é péssimo como uma plataforma. Entre hyhy existe.
precisa saber é o seguinte
26

Existem deficiências técnicas como o GIL no CPython, mas poucas deficiências de linguagem percebidas , portanto, o tempo de execução não é o ponto de venda da comunidade Python. Exatamente o oposto, há mais opções de tempo de execução de back-end devido à insatisfação com a implementação do GIL / CPython.

A linguagem Java é muito mais difamada que a JVM (mesmo na comunidade Java).

A JVM é muito bem vista na maioria dos círculos; portanto, o desejo de diferentes / melhores idiomas para front-ends com os benefícios da JVM de back-end altamente otimizada.


fonte
10

Eu digo que Mason Wheeler está certo. É principalmente um problema com o Global Interpreter Lock, que torna a concorrência um problema muito complicado. Como existem outras VMs que fazem simultaneidade muito bem comparativamente, faz sentido desenvolver linguagens para elas. Além disso, o Python teve uma grande mudança de idioma recentemente e muitas das bibliotecas não conseguiram tornar a compatibilidade um pesadelo moderado às vezes. Por exemplo, porque eu uso o PIL para o trabalho de visão, tenho que codificar no Python 2.7 ou inferior. Este não é o caso das configurações da JVM ou da CLI que, particularmente no caso desta, foram projetadas com a interoperabilidade de idioma em mente.

Fiz mais algumas pesquisas e, aparentemente, existem dois GILs, não apenas esse. O outro controla importações .

Engenheiro Mundial
fonte
11
"GIL free" é um dos motivos técnicos mencionados em "Motivos pelos quais os programadores do CPython podem se interessar pelo IronPython" no wiki do Python .
Yannis 17/05/12
11
@YannisRizos: Certamente o acesso ao .NET framework não é totalmente irrelevante. Obviamente, é possível que os usuários do CPython estejam completamente desinteressados ​​nisso.
Robert Harvey
O @RobertHarvey Ninja editou isso. Embora eu não pense no "acesso a brinquedos novos e sofisticados" como uma razão técnica (não que os brinquedos não sejam ótimos), o wiki também menciona que o IronPython é mais fácil de estender.
Yannis 17/05/12
8

As outras respostas fazem muito sentido, mas atualmente existem linguagens que compilam no Python. Onde há uma vontade...

Não sei nada sobre essas linguagens, mas elas parecem funcionar ao transpilar seu código-fonte para ASTs do Python e permitir que o Python compile as árvores no bytecode, evitando os problemas mencionados em outras respostas.

Com base nos comentários, atualmente conhecemos três linguagens alternativas que usam a VM Python (fique à vontade para adicionar outras aqui):

  • Mochi descreve-se como uma linguagem de programação de tipo dinâmico para programação funcional e programação no estilo de ator .
  • Hy : descreve-se como um dialeto do Lisp incorporado no Python .
  • dg : descreve-se como uma linguagem simples (tecnicamente) que é compilada no bytecode do CPython .
Carl Smith
fonte
2
Também vale a pena mencionar HyLang
ideasman42
11
E dg .
hakatashi
6

Outro motivo é que a JVM é um ecossistema altamente otimizado, bem evoluído e extremamente completo. Por si só, ele compete extremamente bem com qualquer um dos outros idiomas compilados. (Não vou dizer que é a melhor VM de uso geral disponível no mercado, mas certamente apostou em minha carreira nisso.) Portanto, o acesso à JVM, com exceção de escrever o código de código, é desejável por si só.

No entanto, a VM do Python é boa, mas (nada contra o Python) tem algumas falhas sérias. O ambiente de tempo de execução do Python se adapta bem à natureza dinâmica da linguagem, mas pode realmente surpreendê-lo quando você se familiarizar com o uso de memória, bloqueio global ou modelo de encadeamento.

Nas comparações frente a frente, a JVM geralmente é duas vezes mais rápida que a VM Python. A JVM (surpreendentemente) ainda concorre bem com o código compilado nativamente, com base nas otimizações "quentes" que realiza. E isso nem conta o manuseio de threads mais sofisticado etc.

Eu amo Python, eu realmente amo, e odeio dizer isso, mas às vezes o desempenho me choca nos dentes - caso contrário, por que as bibliotecas críticas do Python, como numpy ou scipy, teriam que voltar ao código C?

Em outras palavras, as pessoas que gravitam no Python o fazem porque gostam da linguagem . Mas se você deseja escrever um idioma totalmente novo para atender às suas preferências, é muito melhor compilar na JVM, porque seu novo idioma idiossincrático começará em um dos melhores ambientes operacionais (subjetivamente, talvez o melhor) disponíveis.

Roubar
fonte