Python serait-il trop lent pour une utilisation côté client dans les navigateurs?

17

J'ai entendu la déclaration que Python serait trop lent pour être utile aux navigateurs.

Je pense que Javascript n'est supérieur que dans cet aspect, car des entreprises comme Google en ont besoin rapidement (et l'ont fait rapidement) parce qu'elles en ont besoin pour survivre, mais je peux me tromper.

Existe-t-il des différences dans la conception de Python et Javascript qui ont un impact sur leur performance (dans le cas) dans les navigateurs?

Comme il n'y a pour l'instant pas d'implémentation Python côté client, ma question vient de la déclaration de quelqu'un, alors peut-être que cela a quelque chose à voir avec les langages eux-mêmes (bien que je ne le crois pas).

Profpatsch
la source
2
Python dans le navigateur? Quand est-ce arrivé?
yannis
6
Ce ne fut pas le cas. Remarquez le would?
Profpatsch
16
Eh bien, si cela ne s'est pas produit, je ne vois pas de quoi il s'agit. Lorsque nous parlons de performances, nous ne parlons pas de langages, mais d'implémentations de langages (et plusieurs implémentations existent pour Python comme pour Javascript). S'il n'y a pas d'implémentation Python côté client, de quoi parler?
yannis
1
Science théorique! : D Ma question vient de la déclaration de quelqu'un, alors peut-être que cela a quelque chose à voir avec les langues elles-mêmes (bien que je ne le crois pas).
Profpatsch
1
Il y avait une fois une implémentation d'intégration Python pour Internet Explorer, via l'interface COM qui permettait également une option VBScript pour scripter le DOM. Je pense que MS a abandonné l'option d'utiliser l'intégration COM dans la version 5 ou 6, je ne m'en souviens pas.
Martijn Pieters

Réponses:

23

Pour commencer, nous devons faire une distinction claire entre les langages et les implémentations . Un langage est une chose abstraite, l'implémentation est une chose concrète qui peut avoir des performances mesurées. Par exemple, Lisp était autrefois considéré comme beaucoup trop inefficace pour une utilisation pratique, mais les compilateurs ont continué à mûrir et, finalement, du matériel dédié a été développé pour lui; à un moment donné dans les années 80, elle était la plate-forme de développement de choix pour le développement de postes de travail hautes performances.

Cela dit, la réponse la plus simple est qu'une implémentation Javascript rapide comme le V8 de Google fait sauter l'implémentation standard de Python (CPython) hors de l'eau . V8 est une machine virtuelle hautement optimisée avec un JITer incroyablement rapide tandis que CPython est une machine virtuelle assez simple en comparaison. Il existe une implémentation de Python avec un JIT mais qui n'est toujours que 5 à 6 fois plus rapide.

Il y a cinq ans, cela aurait été une autre histoire. Les navigateurs avaient des implémentations Javascript simplistes car la vitesse n'était pas un problème car personne n'avait construit de «vrais» logiciels avec et Python aurait été égal, sinon plus rapide.

Sean McSomething
la source
C'est la réponse la plus perspicace à ce jour. Ce n'est donc pas du potentiel, mais plutôt du temps et de l'argent.
Profpatsch
7
"Il y a cinq ans, cela aurait été une histoire différente" ... et dans cinq ans, ce pourrait être différent à nouveau.
Bryan Oakley
1
>> Un langage est une chose abstraite, l'implémentation est une chose concrète dont les performances peuvent être mesurées. << Oui, une implémentation d'un langage de programmation est une chose concrète. Non, une implémentation de langage de programmation n'a pas de performances de propriétés mesurables. La performance est une propriété de programmes particuliers qui utilisent une implémentation de langage, dans un contexte particulier.
igouy
2
@igouy Donc, si j'écrivais deux programmes fonctionnellement identiques, un en C et un en Python, vous considéreriez la différence de performances comme une propriété de l'application et non de l'implémentation du langage?
ConditionRacer
1
@ConditionRacer: Il existe de nombreuses façons différentes d'écrire le même programme, donc même si une version python du programme avait des caractéristiques de performance différentes d'une version C, cela ne prouverait pas qu'aucune version python ne pourrait être équivalente à la version C. Voir des choses comme asm.js ... dans n'importe quelle langue, vous pouvez utiliser un tableau géant pour stocker tous les états de votre programme, et pouvez utiliser un petit sous-ensemble facilement optimisable des opérations primitives du langage. (Comme on dit "vous pouvez écrire C dans n'importe quelle langue".)
Mankarse
5

Dans les temps anciens du Web, lorsque les applets java, où la seule forme principale de contenu interactif côté client, les gens se rendaient compte qu'il devait y avoir un moyen d'obtenir des formulaires sur une page Web pour pouvoir interagir avec les applets sur la page Web.

De là, un langage de script pour lier l'applet Java à la page Web a été créé avec le nom ... javascript.

On peut voir les vestiges de cet héritage avec des questions SO telles que [ 1 ], [ 2 ], [ 3 ] - et les deux documents officiels: invocation de code JavaScript à partir d'une applet et invocation de méthodes d'applet à partir de code JavaScript

Avec un tel langage disponible, les navigateurs de l'époque (Netscape étant le prédominant) ont rendu le javascript disponible comme avantage concurrentiel (javascript conçu chez Netscape - Netscape a été le premier javascript côté serveur avec son serveur en 1994 - près de deux décennies avant le nœud .js). D'autres navigateurs ont emboîté le pas. Les gens écrivaient des pages qui utilisaient javascript, d'autres tentatives de script côté client signifieraient des pages complètement incompatibles entre les choses qui fonctionnent et celles qui ne fonctionnent pas - ou la duplication de code (voici le bloc {insérer la langue ici} qui fait cela pour non-javascript navigateurs et voici le bloc javascript pour tout le monde).

Comme Netscape était le navigateur dominant pendant une période, le javascript s'est installé. Alors que l'héritage de Netscape est perdu dans les notes de bas de page des fichiers source de Mozilla, le javascript continue de vivre et rien n'a pu renverser sa place.

Le problème persiste pour tout autre langage de script de diapositives client. Javascript est pris en charge sur tous les navigateurs. Si l'on devait créer un navigateur prenant en charge python (par exemple) plutôt que javascript, il ne serait pas en mesure d'utiliser la grande majorité des sites Web. De plus, à moins que ce navigateur n'ait pu obtenir une part importante du trafic du navigateur, les concepteurs Web ne veulent pas créer deux ensembles de pages avec des langages de script différents pour la même page.

On pourrait essayer de créer un plugin de script python pour un navigateur qui a activé un script python sur la page ... semblable au fonctionnement de vrml aujourd'hui. Mais à moins que vous n'ayez entendu et vu une page Web qui utilise vrml, il est tout aussi probable que vous trouviez une autre page Web pour un autre langage de script.

Communauté
la source
1
Ceci est un très bon aperçu de "comment cela s'est passé ..." et autant que je voudrais le marquer comme réponse correcte, il répond à la question "Pourquoi Javascript est-il le langage côté client utilisé aujourd'hui?", Pas " Y a-t-il un problème de conception qui rendrait Python trop lent pour une utilisation côté client? »
Profpatsch
VRML ... wow ça me ramène!
FrustratedWithFormsDesigner
1
@Profpatsch il n'y a pas de problème de conception technique avec javascript qui le rend inapproprié pour être un langage côté client - à part que rien ne l'utilise et à moins qu'il n'offre un avantage significatif (y compris probablement l'interactivité avec les applets java), rien ne le sera jamais. Les problèmes ne sont pas techniques et à moins que l'on comprenne l'historique de "pourquoi javascript" on ne peut pas répondre "pourquoi pas python".
2
@MichaelT: Vous avez écrit "il n'y a pas de problème de conception technique avec javascript qui le rend inapproprié pour être un langage côté client". Tu veux dire Python pas JS ??
Carl Smith
@CarlSmith Ahh oui. Mon erreur ... et je ne peux pas modifier les commentaires au-delà d'un certain temps. Merci pour la correction.
4

Je ne pense pas que Python serait trop lent du tout. Il n'y a rien dans le langage qui l'empêche de fonctionner assez rapidement pour correspondre au moins à JavaScript. Il peut être compilé en JavaScript, donc, si rien d'autre, vous pouvez inclure un compilateur dans le navigateur et augmenter uniquement les temps de chargement des pages.

MISE À JOUR: Veuillez voir les commentaires ci-dessous expliquant pourquoi la compilation de Python en JS serait considérablement plus coûteuse qu'impliquée ici.

Le problème essaie de convaincre les fournisseurs de navigateurs et le W3C de choisir d'abord Python, plutôt que Ruby ou tout autre langage de script agréable, puis de définir un sous-ensemble normalisé, car ils ne peuvent pas autoriser les appels système, etc., puis l'implémenter correctement, tout en supportant toujours JavaScript. Cela ne se produira pas, mais si c'était le cas, je doute que la vitesse se révèle être un problème grave.

Carl Smith
la source
7
Votre premier point ne suit pas. Tout peut être compilé pour presque tout (y compris le code machine), mais cela ne signifie pas qu'un programme écrit dans une langue L et compilé dans une langue C est aussi rapide qu'un programme équivalent écrit en langage C.
1
Eh bien, CoffeeScript est essentiellement une syntaxe différente pour les mêmes concepts de base que JavaScript, et C est essentiellement un langage d'assemblage portable. Python et Javascript, en revanche, diffèrent beaucoup. Pour implémenter Python correctement, vous devez prendre en charge (parmi des milliards d'autres choses) le modèle de classe, la surcharge des opérateurs, les métaclasses, etc. et la plupart de ces éléments ne sont pas mappés en JavaScript facilement et efficacement. Même problème avec la compilation de l'un d'eux en C ou en code machine. Un JIT spécialisé peut être votre seul espoir, mais les compilateurs JIT ciblant JS n'ont pas encore fait leurs preuves.
3
Un problème va être le fait que vous ne pouvez pas compresser Python comme vous pouvez le faire avec JS - éliminez tous ces espaces et nouvelles lignes et votre portée sera là! Vous allez donc vous retrouver avec des temps de chargement plus longs pour tous les morceaux importants de Python.
TMN
1
@TMN point intéressant, bien que l'on espère que l'expressivité de Python irait un long chemin pour atténuer cela (et oui, cela compte les lignes, pas les caractères, mais quand même, Python est un langage assez expressif).
Daniel B
2
@TMN Ce que Daniel B a dit, ainsi que gzip devraient réduire la différence. Oh, et Python n'a pas besoin de la plupart de ces nouvelles lignes et espaces. De nombreuses lignes (mais pas toutes) peuvent être jointes très bien en Python, par exemple a = something(); frobincate(a); return quuxet if condition: react()sont une seule ligne chacune. Et n niveaux d'indentation n'ont besoin que de n espaces, pas de n * 4 espaces.
2

Je pense que Python a sa propre machine virtuelle. Je n'ai pas beaucoup d'expérience avec Python, mais je ne vois aucune raison pour laquelle il ne fonctionnerait pas aussi bien qu'un moteur JavaScript non optimisé.

Quelques pensées aléatoires:

(1) Vous pourriez probablement exécuter Python localement via une applet Java à l'aide de Jython. La partie difficile que je vois ici est que les applets sont très restrictives, vous devrez donc peut-être modifier Jython pour s'adapter aux restrictions d'accès. Par exemple, s'il écrit dans un fichier journal, vous devrez peut-être supprimer le code de journalisation. Une applet n'a pas besoin d'être visiblement visible.

(2) Quelqu'un pourrait construire un "compilateur" / convertisseur Python vers JavaScript. Ce serait beaucoup de travail.

Aaron S
la source
5
Someone could build a Python-to-JavaScript "compiler"/converterEh bien, quelqu'un l'a déjà fait .
yannis
Brython aussi
World Engineer
Je n'ai jamais eu à le faire moi-même, mais je connais des gens qui ont écrit des applets Java en utilisant Jython. Ce n'est pas la même chose que de remplacer Javascript dans le navigateur par Python.
Martijn Pieters
Brythonfonctionne très rapidement, du moins pour les parties plutôt isolées des pages (faible interaction avec le DOM tree).
Profpatsch
@Profpatsch De l'état de la dernière fois que j'ai regardé, il n'implémente même pas de très grandes parties du langage Python. Idéalement, parmi les fonctionnalités non implémentées, il y a celles qui sont difficiles à implémenter bien au-dessus de JavaScript. Pour paraphraser l'un des auteurs de PyPy: Il est facile de créer rapidement un sous-ensemble non trivial de Python, où Python complet devient difficile.
1

Cela dépend de l'implémentation de la langue et pas nécessairement de la langue elle-même. La plupart des interprètes JavaScript sont beaucoup plus rapides que presque toutes les implémentations de Python.

Cela ne signifie pas que le langage Python ne peut pas être utilisé à presque les mêmes vitesses que JavaScript. Opal implémente presque le langage Ruby complet et la bibliothèque standard dans le navigateur en compilant le code Ruby en code JavaScript enveloppé dans des fermetures. Mis à part les frais généraux liés à l'inclusion de la bibliothèque Opal, sa vitesse est beaucoup plus proche de celle de JavaScript direct que tout autre interprète Ruby que je connaisse.

Je ne sais pas s'il existe un équivalent Python d'Opale, mais un tel projet signifierait probablement que la réponse à votre question est "non". Avec l'utilisation croissante de JavaScript en tant que «langage d'assemblage pour le Web», je ne serais pas surpris qu'il soit de plus en plus utilisé comme plate-forme pour d'autres langages, en particulier à mesure que la puissance de calcul mobile augmente et que le surcoût d'avoir un langage implémenté en JavaScript devient de plus en plus négligent.

EDIT: Voici une liste des implémentations Python pour le navigateur qui se compilent / s'exécutent sur JavaScript.

https://github.com/jashkenas/coffeescript/wiki/list-of-languages-that-compile-to-js#python

Et si vous êtes intéressé, vous pouvez consulter Opal, que j'aime beaucoup.

http://opalrb.org/

Étant donné que je doute que les navigateurs soient compatibles avec des interprètes distincts, ces compilateurs sont probablement la voie de l'avenir en termes d'utilisation de langues autres que JavaScript. Même maintenant, vous obtiendrez des performances comparables dans la plupart des domaines. C'est mon avis, cependant, gardez cela à l'esprit.

Ravenstine
la source
0

Même lorsque vous avez posé cette question, il y avait déjà un certain nombre d'implémentations python disponibles en javascript qui peuvent être utilisées sur les pages Web aujourd'hui.

Jetez un œil à http://www.skulpt.org/ ou http://www.brython.info/ pour commencer.

Les performances ne semblent pas trop mauvaises, mais vous devriez les tester vous-même et le découvrir.

fabspro
la source
-4

Python est un langage "console", fonctionnant sur le serveur

Javascript est un langage "navigateur", fonctionnant sur le client

En tant que tels, ils ne concurrencent pas directement

... bien sûr, il y a node.js et probablement des plugins de navigateur python, mais alors c'est plus une question sur les performances d'une implémentation particulière.

De plus, pour la plupart des applications, python fonctionnera très bien, sauf si vous devez effectuer une sorte de calculs étendus et évincer les cycles de CPU.

Enfin, python et javascript partagent de nombreuses similitudes. En raison de leur nature dynamique, les deux doivent être interprétés au moment de l'exécution et ne peuvent pas être compilés aussi fortement que les langages typés statiques. En tant que tel, je suppose que leurs performances réalisables seraient similaires.

dagnelies
la source
2
Le javascript côté serveur existait en '94. jscvous permet de travailler avec javascript en tant que console, de la même manière que l'on obtiendrait s'ils tapaient pythonsur une console.
@MichaelT: Ok, j'édité ma réponse en conséquence
dagnelies
2
Vous pouvez également écrire des applications de bureau en Python .... Je ne vois aucune raison réelle de la distinction que vous faites.
Chris Travers
De plus, l'outil de modélisation 3D Blender utilise Python pour tout, de l'interface utilisateur à la génération de maillage. Si ce n'est pas performant, qu'est-ce que c'est?
Andrew Gray
@Chris: la distinction est que javascript est principalement une technologie de navigateur, tandis que python est principalement une technologie de bureau / console. Mon point était que comparer les deux n'a pas de sens car ils servent des objectifs entièrement différents.
dagnelies