Wäre Python zu langsam für die clientseitige Verwendung in Browsern?

17

Ich habe die Aussage gehört, dass Python zu langsam wäre, um in Browsern von Nutzen zu sein.

Ich denke, Javascript ist in dieser Hinsicht nur überlegen, weil Unternehmen wie Google es schnell brauchen (und schnell gemacht haben), weil sie es brauchen, um zu überleben, aber ich könnte mich irren.

Gibt es Unterschiede in der Gestaltung von Python und Javascript, die sich auf die Leistung in Browsern auswirken (würden)?

Da es derzeit keine clientseitige Python-Implementierung gibt, kommt meine Frage von der Aussage, die jemand gemacht hat. Vielleicht hat es etwas mit den Sprachen selbst zu tun (obwohl ich das nicht glaube).

Profpatsch
quelle
2
Python im Browser? Wann ist das passiert?
Yannis
6
Das hat es nicht getan. Beachten Sie die would?
Profpatsch
16
Wenn es nicht passiert ist, verstehe ich nicht, worum es bei der Frage geht. Wenn wir über Performance sprechen, sprechen wir nicht über Sprachen, sondern über Implementierungen von Sprachen (und es gibt verschiedene Implementierungen für Python wie für Javascript). Wenn es keine clientseitige Python-Implementierung gibt, worüber soll dann gesprochen werden?
Yannis
1
Theoretische Wissenschaft! : D Meine Frage kommt von der Aussage, die jemand gemacht hat, also hat es vielleicht etwas mit den Sprachen selbst zu tun (obwohl ich das nicht glaube).
Profpatsch
1
Es gab einmal eine Python-Integrationsimplementierung für Internet Explorer über die COM-Schnittstelle, die auch eine VBScript-Option zum Skripten des DOM ermöglichte. Ich denke, MS hat die Option zur Verwendung der COM-Integration in Version 5 oder 6 eingestellt. Ich kann mich nicht erinnern.
Martijn Pieters

Antworten:

23

Zunächst müssen wir klar zwischen Sprachen und Implementierungen unterscheiden . Eine Sprache ist eine abstrakte Sache, die Implementierung ist eine konkrete Sache, deren Leistung gemessen werden kann. Zum Beispiel wurde Lisp einmal als viel zu ineffizient für den praktischen Gebrauch angesehen, aber die Compiler entwickelten sich weiter und schließlich wurde dedizierte Hardware dafür entwickelt. Zu einem Zeitpunkt in den 1980er Jahren war es die Entwicklungsplattform der Wahl für die Entwicklung von Hochleistungsarbeitsplätzen.

Die einfachste Antwort ist jedoch, dass eine schnelle JavaScript-Implementierung wie Googles V8 die Standardimplementierung von Python (CPython) aus dem Ruder läuft . V8 ist eine hochoptimierte virtuelle Maschine mit einem JITer, der erstaunlich schnell ist, während CPython im Vergleich dazu eine relativ einfache VM ist. Es gibt eine Implementierung von Python mit einer JIT, die aber immer noch 5-6x schneller ist.

Vor fünf Jahren wäre es eine andere Geschichte gewesen. Browser hatten vereinfachte Javascript-Implementierungen, da die Geschwindigkeit kein Problem darstellte, da niemand 'echte' Software damit erstellte und Python gleich wäre, wenn nicht schneller.

Sean McSomething
quelle
Dies ist die bisher aufschlussreichste Antwort. Es geht also nicht um Potenzial, sondern um Zeit und Geld.
Profpatsch
7
"Vor fünf Jahren wäre es eine andere Geschichte gewesen" ... und in fünf Jahren könnte es wieder anders werden.
Bryan Oakley
1
>> Eine Sprache ist eine abstrakte Sache, die Implementierung ist eine konkrete Sache, deren Leistung gemessen werden kann. << Ja, eine Implementierung einer Programmiersprache ist eine konkrete Sache. Nein, eine Programmiersprachenimplementierung weist keine messbare Eigenschaftsleistung auf. Die Leistung ist eine Eigenschaft bestimmter Programme, die in einem bestimmten Kontext eine Sprachimplementierung verwenden.
13.
2
@igouy Wenn ich also zwei funktional identische Programme schreiben würde, eines in C und eines in Python, würden Sie den Leistungsunterschied als eine Eigenschaft der Anwendung betrachten und nicht als die Sprachimplementierung?
ConditionRacer
1
@ConditionRacer: Es gibt viele verschiedene Möglichkeiten, ein und dasselbe Programm zu schreiben. Selbst wenn eine Python-Version des Programms andere Leistungsmerkmale als eine C-Version hätte, würde dies nicht beweisen, dass keine Python-Version der C-Version gleichwertig sein könnte. Sehen Sie Dinge wie asm.js ... in jeder Sprache. Sie können ein riesiges Array verwenden, um den gesamten Programmstatus zu speichern, und Sie können eine kleine, leicht optimierbare Teilmenge der primitiven Operationen der Sprache verwenden. (Wie sie sagen "Sie können C in jeder Sprache schreiben".)
Mankarse
5

In den älteren Zeiten der Bahn, wenn Java - Applets , wo die Haupt einzige Form der Client - Seite interaktive Inhalte Menschen erkannt , dass es benötigte eine Art und Weise zu erhalten Formulare auf einer Webseite sein , um mit dem Applets auf der Webseite zu interagieren.

Daraus wurde eine Skriptsprache mit dem Namen ... Javascript erstellt, um das Java-Applet mit der Webseite zu verknüpfen.

Man kann die Spuren dieses Erbes mit SO-Fragen wie [ 1 ], [ 2 ], [ 3 ] und den beiden offiziellen Dokumenten sehen: Aufrufen von JavaScript-Code aus einem Applet und Aufrufen von Applet-Methoden aus JavaScript-Code

Mit einer solchen Sprache zur Verfügung die Browser der Zeit (Netscape die vorherrschende ist) gemacht Javascript verfügbar als Wettbewerbsvorteil (Javascript entwickelt bei Netscape - Netscape war der erste Server - Seite Javascript mit seinem Server zurück in '94 - fast zwei Jahrzehnte , bevor der Knoten .js). Andere Browser folgten. Die Leute schrieben Seiten, die Javascript verwendeten. Andere Versuche, clientseitig Skripte zu erstellen, würden völlig inkompatible Seiten zwischen Dingen bedeuten, die funktionieren, und Dingen, die nicht funktionieren - oder die Vervielfältigung von Code (hier ist der Block {Sprache hier einfügen}, der dies für Nicht-Javascript tut Browser und hier ist der Javascript-Block für alle anderen).

Da Netscape eine Zeit lang der dominierende Browser war, setzte sich Javascript durch. Während das Erbe von Netscape in den Fußnoten der Quelldateien von Mozilla verloren geht, lebt Javascript weiter und nichts war in der Lage, seinen Platz zu überschreiten.

Das Problem bleibt für alle anderen Client-Folien-Skriptsprachen bestehen. Javascript wird in jedem Browser unterstützt. Wenn man einen Browser machen würde, der Python (zum Beispiel) anstelle von Javascript unterstützt, wäre es nicht möglich, die überwiegende Mehrheit der Websites zu verwenden. Darüber hinaus möchten Webdesigner nicht zwei Sätze von Seiten mit unterschiedlichen Skriptsprachen für dieselbe Seite erstellen, es sei denn, dieser Browser konnte einen erheblichen Anteil des Browserverkehrs abrufen.

Man könnte versuchen, ein Python-Skript-Plugin für einen Browser zu erstellen, der ein Python-Skript auf der Seite aktiviert hat ... ähnlich wie vrml heute funktioniert. Aber es sei denn, Sie haben von einer Webseite gehört und gesehen, die vrml verwendet, findet eine genauso wahrscheinlich Verwendung für eine andere Webseite für eine andere Skriptsprache.

Gemeinschaft
quelle
1
Dies ist eine sehr gute Übersicht über „wie es dazu kam…“ und so sehr ich es auch als richtige Antwort markieren möchte, sie beantwortet die Frage „Warum wird heute Javascript als clientseitige Sprache verwendet?“ Und nicht „ Gibt es ein Designproblem, das Python für die clientseitige Verwendung zu langsam machen würde? ”
Profpatsch
VRML ... wow, das bringt mich zurück!
FrustratedWithFormsDesigner
1
@Profpatsch Es gibt kein technisches Designproblem mit Javascript, das es als clientseitige Sprache unangemessen macht. Abgesehen davon, dass es von nichts verwendet wird und es keinen signifikanten Vorteil bietet (wahrscheinlich einschließlich der Interaktivität mit Java-Applets), wird es niemals passieren. Die Probleme sind nicht technisch und wenn man die Geschichte von "warum Javascript" nicht versteht, kann man nicht antworten "warum nicht Python".
2
@MichaelT: Sie haben geschrieben, "es gibt kein technisches Designproblem mit Javascript, das es als clientseitige Sprache ungeeignet macht". Du meinst Python nicht JS ??
Carl Smith
@ CarlSmith Ahh ja. Mein Fehler ... und ich kann Kommentare erst nach einer bestimmten Zeit bearbeiten. Danke für die Verbesserung.
4

Ich glaube nicht, dass Python zu langsam wäre. Es gibt nichts an der Sprache, was verhindert, dass sie schnell genug ausgeführt wird, um mindestens JavaScript zu entsprechen. Es kann mit JavaScript kompiliert werden. Sie können also, wenn nichts anderes angegeben ist, einen Compiler in den Browser aufnehmen und die Ladezeiten von Seiten möglicherweise erhöhen.

UPDATE: In den Kommentaren unten wird erläutert, warum das Kompilieren von Python in JS erheblich teurer ist als hier angenommen.

Das Problem besteht darin, die Browser-Hersteller und W3C zu überzeugen, zuerst Python anstelle von Ruby oder einer anderen netten Skriptsprache auszuwählen, dann eine standardisierte Teilmenge zu definieren, da sie keine Systemaufrufe usw. zulassen und diese dann währenddessen gut implementieren können unterstützt immer noch JavaScript. Das wird nicht passieren, aber ich bezweifle, dass sich die Geschwindigkeit als ernstes Problem herausstellen würde.

Carl Smith
quelle
7
Dein erster Punkt folgt nicht. Alles kann zu fast allem kompiliert werden (einschließlich Maschinencode), aber das bedeutet nicht, dass ein Programm, das in einer Sprache L geschrieben und in einer Sprache C kompiliert wurde, so schnell ist wie ein gleichwertiges Programm, das in Sprache C geschrieben wurde.
1
Nun, CoffeeScript ist im Wesentlichen eine andere Syntax für die gleichen Kernkonzepte wie JavaScript, und C ist im Wesentlichen eine portable Assemblersprache. Python und Javascript hingegen unterscheiden sich ziemlich stark. Um Python korrekt zu implementieren, müssen Sie (unter anderem Milliarden von Dingen) das Klassenmodell, das Überladen von Operatoren, Metaklassen usw. unterstützen, und die meisten davon lassen sich nicht einfach und effizient auf JavaScript abbilden. Dasselbe Problem beim Kompilieren einer der beiden in C oder Maschinencode. Eine spezialisierte JIT mag Ihre einzige Hoffnung sein, aber JIT-Compiler, die auf JS abzielen, müssen sich noch als praktisch erweisen.
3
Ein Problem wird die Tatsache sein, dass Sie Python nicht wie JS komprimieren können - entfernen Sie all diese Leerzeichen und Zeilenumbrüche, und schon können Sie loslegen! Sie werden also längere Ladezeiten für alle wichtigen Python-Teile haben.
TMN
1
@TMN interessanter Punkt, obwohl man hoffen würde, dass die Ausdruckskraft von Python einen großen Beitrag dazu leistet (und ja, das sind Zeilen, keine Zeichen, aber dennoch ist Python eine ziemlich ausdrucksstarke Sprache).
Daniel B
2
@TMN Was Daniel B gesagt hat, und auch gzip sollten den Unterschied verringern. Oh, und Python benötigt die meisten dieser neuen Zeilen und Leerzeichen nicht. Viele (wenn auch nicht alle) Zeilen können in Python problemlos zusammengefügt werden, z. B. a = something(); frobincate(a); return quuxund if condition: react()sind jeweils einzelne Zeilen. Und n Einrückungsstufen benötigen nur n Leerzeichen, nicht n * 4 Leerzeichen.
2

Ich denke, Python hat eine eigene virtuelle Maschine. Ich habe nicht viel Erfahrung mit Python, aber ich sehe keinen Grund, warum es nicht so gut funktioniert wie eine nicht optimierte JavaScript-Engine.

Einige zufällige Gedanken:

(1) Möglicherweise können Sie Python mithilfe von Jython lokal über ein Java-Applet ausführen. Der schwierige Teil, den ich hier sehe, ist, dass Applets sehr restriktiv sind, so dass Sie möglicherweise Jython so ändern müssen, dass es den Zugriffsbeschränkungen entspricht. Wenn beispielsweise in eine Protokolldatei geschrieben wird, müssen Sie möglicherweise den Protokollierungscode entfernen. Ein Applet muss nicht sichtbar sein.

(2) Jemand könnte einen Python-zu-JavaScript "Compiler" / Konverter erstellen. Das wäre viel Arbeit.

Aaron S
quelle
5
Someone could build a Python-to-JavaScript "compiler"/converterNun, jemand hat es bereits getan .
Yannis
Brython auch
World Engineer
Ich musste das nie selbst tun, aber mir ist bekannt, dass Leute Java-Applets mit Jython geschrieben haben. Dies ist jedoch nicht das Gleiche wie das Ersetzen von Javascript im Browser durch Python.
Martijn Pieters
Brythonfunktioniert interessanterweise schnell, zumindest bei eher isolierten Teilen auf Seiten (geringe Interaktion mit dem DOM tree).
Profpatsch
@Profpatsch Nach meinem letzten Blick implementiert es nicht einmal sehr große Teile der Python-Sprache. Praktischerweise gehören zu den nicht implementierten Funktionen diejenigen, die auf JavaScript nur schwer zu implementieren sind. Um einen der PyPy-Autoren zu paraphrasieren: Es ist einfach, eine nicht-triviale Teilmenge von Python schnell zu machen, bei vollem Python wird es schwierig.
1

Dies hängt von der Implementierung der Sprache ab und nicht unbedingt von der Sprache selbst. Die meisten JavaScript-Interpreter sind viel schneller als fast alle Implementierungen von Python.

Dies bedeutet nicht, dass die Python-Sprache nicht mit annähernd der gleichen Geschwindigkeit wie JavaScript verwendet werden kann. Opal implementiert fast die gesamte Ruby-Sprache und die Standardbibliothek im Browser, indem Ruby-Code in JavaScript-Code kompiliert wird, der in Closures eingeschlossen ist. Abgesehen von dem Aufwand für das Einbeziehen der Opal-Bibliothek ist ihre Geschwindigkeit der von direktem JavaScript weitaus näher als die anderer mir bekannter Ruby-Interpreter.

Ich weiß nicht, ob es ein Python-Äquivalent zu Opal gibt, aber ein solches Projekt würde wahrscheinlich bedeuten, dass die Antwort auf Ihre Frage "nein" lautet. Angesichts der zunehmenden Verwendung von JavaScript als "Assemblersprache für das Web" würde es mich nicht überraschen, wenn es immer mehr als Plattform für andere Sprachen verwendet wird, insbesondere wenn die mobile Rechenleistung zunimmt und der Aufwand für eine Sprache zunimmt in JavaScript implementiert wird zunehmend nachlässig.

BEARBEITEN: Hier ist eine Liste von Python-Implementierungen für den Browser, die mit JavaScript kompiliert / ausgeführt werden.

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

Und wenn Sie interessiert sind, können Sie sich Opal ansehen, was mir sehr gut gefällt.

http://opalrb.org/

Da ich bezweifle, dass Browser jemals separate Interpreter unterstützen werden, sind solche Compiler wahrscheinlich der Weg der Zukunft, wenn es darum geht, andere Sprachen als JavaScript zu verwenden. Selbst jetzt werden Sie in den meisten Bereichen eine vergleichbare Leistung erzielen. Dies ist jedoch meine Meinung, denken Sie daran.

Ravenstine
quelle
0

Selbst als Sie diese Frage stellten, gab es bereits eine Reihe von Python-Implementierungen in Javascript, die heute auf Webseiten verwendet werden können.

Schauen Sie sich für den Anfang http://www.skulpt.org/ oder http://www.brython.info/ an.

Die Leistung scheint nicht schlecht zu sein, aber Sie sollten sie selbst testen und herausfinden.

fabspro
quelle
-4

Python ist eine "Konsolensprache", die auf dem Server ausgeführt wird

Javascript ist eine "Browser" -Sprache, die auf dem Client ausgeführt wird

Als solche konkurrieren sie nicht direkt

... natürlich gibt es node.js und wahrscheinlich Python-Browser-Plugins, aber dann ist es eher eine Frage der Leistung einer bestimmten Implementierung.

Darüber hinaus funktioniert Python für die meisten Anwendungen einwandfrei, es sei denn, Sie müssen umfangreiche Berechnungen durchführen und die CPU-Zyklen herausdrücken.

Zum Schluss haben Python und Javascript viele Gemeinsamkeiten. Aufgrund ihrer Dynamik müssen beide zur Laufzeit interpretiert werden und können nicht so stark kompiliert werden wie statische typisierte Sprachen. Als solches gehe ich davon aus, dass ihre erreichbare Leistung ähnlich wäre.

dagnelies
quelle
2
Server-seitiges Javascript gab es in '94. jscErmöglicht das Arbeiten mit Javascript als Konsole, ähnlich wie bei der Eingabe pythonan einer Konsole.
@MichaelT: Ok, ich habe meine Antwort entsprechend bearbeitet
dagnelies
2
Sie können auch Desktop-Apps in Python schreiben. Ich sehe keinen wirklichen Grund für die Unterscheidung, die Sie treffen.
Chris Travers
Darüber hinaus verwendet das 3D-Modellierungswerkzeug Blender Python für alle Bereiche von der Benutzeroberfläche bis zur Netzgenerierung. Wenn das nicht gerade wettbewerbsfähig ist, was ist das dann?
Andrew Gray
@ Chris: Der Unterschied besteht darin, dass Javascript in erster Linie eine Browsertechnologie ist, während Python hauptsächlich eine Desktop- / Konsolentechnologie ist. Mein Punkt war, dass der Vergleich von beiden wenig Sinn macht, weil sie ganz unterschiedlichen Zwecken dienen.
Dagnelies