web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas d'autres langages de programmation qui se compilent en Python bytecode?

En Java, il existe plusieurs langages qui se compilent en Java bytecode et peuvent fonctionner sur la JVM - Clojure, Groovy et Scala étant les principaux que je peux) rappelez-vous du haut de ma tête.

Cependant, Python se transforme également en bytecode (fichiers .pyc) avant d'être exécuté par l'interpréteur Python. Je suis peut-être juste ignorant, mais pourquoi n'y a-t-il pas tout autre langage de programmation qui se compile en python bytecode?

Est-ce simplement parce que personne ne s'en est soucié, ou y a-t-il une sorte de restriction ou de barrière inhérente en place qui rend la tâche si difficile?

51
Michael0x2a

Simple - la dernière fois que j'ai vérifié, Python n'avait pas de spécification formelle, y compris son bytecode. CPython est la spécification, et la portabilité du bytecode n'est pas requise par IIRC. Il s'agit donc d'une cible mobile et non documentée conçue pour un langue spécifique.

78
p_l

Il existe plusieurs langages JVM car il y avait des gens talentueux qui voulaient écrire du code qui fonctionnerait avec le code Java existant, mais ils ne voulaient pas écrire Java.

Apparemment, aucun programmeur ne souhaite travailler avec le code Python existant, mais déteste Python suffisamment pour porter une autre langue vers l'interpréteur de bytecode Python.

Vous pouvez considérer cela de deux manières: il existe des langages alternatifs pour la JVM parce que Java est très répandu, ou il n'y a pas de langages alternatifs pour l'interpréteur de bytecode Python parce que Python ne craint pas.

55
kevin cline

Il y a des déficiences techniques telles que GIL dans CPython, mais peu de déficiences perçues langue, donc le runtime n'est pas le point de vente de la communauté Python. Exactement le contraire , il existe davantage d'options d'exécution backend en raison de l'insatisfaction à l'égard de l'implémentation de GIL/CPython.

Le langage Java est beaucoup plus décrié que la JVM (même dans la communauté Java)).

La JVM est assez bien considérée dans la plupart des cercles; d'où le souhait de langages frontaux différents/meilleurs avec les avantages de la JVM back end hautement optimisée.

26
user7519

Je dis que Mason Wheeler a raison. C'est principalement un problème avec le verrou d'interprète global qui rend la concurrence un problème très épineux. Puisqu'il existe d'autres machines virtuelles qui fonctionnent vraiment très bien en comparaison, il est logique de développer des langages pour celles-ci. En outre, Python a récemment subi un important changement de langue et de nombreuses bibliothèques n'ont pas rattrapé le temps, ce qui fait de la compatibilité un cauchemar léger. Par exemple, parce que j'utilise PIL pour le travail de vision, je dois coder Python 2.7 ou inférieur. Ce n'est pas le cas avec les configurations JVM ou CLI qui, en particulier dans ce dernier cas, ont été conçues avec l'interopérabilité du langage à l'esprit.

A fait quelques recherches supplémentaires et apparemment il y a en fait deux GIL et pas seulement un. Les autres contrôles Importations .

10
World Engineer

Les autres réponses ont beaucoup de sens, mais il existe actuellement des langages qui se compilent en Python. Où il y a une volonté...

Je ne sais rien de ces langages, mais ils semblent fonctionner en transpilant leur code source en Python ASTs et en laissant Python compiler les arbres pour bytecode, éviter les problèmes mentionnés dans d'autres réponses.

Sur la base des commentaires, nous connaissons actuellement trois langages alternatifs qui utilisent le Python VM (n'hésitez pas à en ajouter d'autres ici)):

  • Mochi Se décrit comme un langage de programmation typé dynamiquement pour la programmation fonctionnelle et la programmation de style acteur .
  • Hy : se décrit comme un dialecte de LISP intégré à Python .
  • dg : se décrit comme un langage (techniquement) simple qui se compile en bytecode CPython .
8
Carl Smith

Une autre raison est que la JVM est un écosystème hautement optimisé, bien évolué et extrêmement complet. À lui seul, il rivalise extrêmement bien avec les autres langages compilés. (Je ne dirai pas que c'est le meilleur usage général VM là-bas, mais j'ai certainement misé sur ma carrière là-dessus.) Donc, avoir accès à la JVM , à moins d'écrire le bytecode, est souhaitable en soi.

Cependant, l'environnement Python VM est bon, mais (rien contre Python) présente de graves lacunes. L'environnement d'exécution Python convient bien à la nature dynamique de la langue, mais peut vraiment vous surprendre lorsque vous vous familiarisez avec son utilisation de la mémoire, son verrouillage global ou son modèle de thread.

Dans les comparaisons directes, la machine virtuelle Java est généralement deux fois plus rapide que la machine virtuelle Python. La machine virtuelle Java (étonnamment) rivalise même bien avec le code compilé en mode natif, basé sur les optimisations "à chaud" qu'il Et cela ne prend même pas en compte la gestion des threads plus sophistiquée, etc.

J'adore Python, j'aime vraiment, et je déteste le dire, mais parfois la performance me donne un coup de pied dans les dents - sinon, pourquoi les bibliothèques critiques Python comme numpy ou scipy doivent-elles se replier) en code C?

En d'autres termes, les gens qui gravitent vers Python le font parce qu'ils aiment la langue. Mais si vous voulez écrire une toute nouvelle langue en fonction de vos préférences, vous ' Il est préférable de compiler sur la JVM, car votre nouveau langage idiosyncrasique commencera dans l'un des meilleurs (subjectivement, peut-être les meilleurs) environnements d'exploitation disponibles.

6
Rob