Python sarebbe troppo lento per l'uso sul lato client nei browser?


17

Ho sentito l'affermazione che Python sarebbe troppo lento per essere di qualche utilità nei browser.

Penso che Javascript sia superiore solo in questo aspetto a causa di aziende come Google che ne hanno bisogno in fretta (e lo hanno reso veloce) perché ne hanno bisogno per sopravvivere, ma potrei sbagliarmi.

Ci sono differenze nel modo in cui Python e Javascript sono progettati che hanno un impatto sul modo in cui (dovrebbero) funzionare nei browser?

Dal momento che non esiste un'implementazione Python lato client, la mia domanda viene dall'affermazione che qualcuno ha fatto, quindi forse ha qualcosa a che fare con le lingue stesse (anche se non ci credo).


2
Python nel browser? Quando è successo?
yannis,

6
No Notare il would?
Profpatsch,

16
Bene, se non è successo, non vedo di che si tratti. Quando parliamo di prestazioni, non parliamo di lingue, ma di implementazioni di linguaggi (e esistono diverse implementazioni per Python come per Javascript). Se non esiste un'implementazione Python lato client, di cosa c'è da parlare?
yannis,

1
Scienza teorica! : D La mia domanda viene dalla dichiarazione fatta da qualcuno, quindi forse ha qualcosa a che fare con le lingue stesse (anche se non ci credo).
Profpatsch,

1
C'era una volta un'implementazione di integrazione Python per Internet Explorer, tramite l'interfaccia COM che abilitava anche un'opzione VBScript per lo scripting del DOM. Penso che MS abbia interrotto l'opzione di utilizzare l'integrazione COM nella versione 5 o 6, non ricordo.
Martijn Pieters,

Risposte:


23

Per cominciare, dobbiamo fare una chiara distinzione tra lingue e implementazioni . Un linguaggio è una cosa astratta, l'implementazione è una cosa concreta che può misurare le prestazioni. Ad esempio, una volta Lisp era considerato troppo inefficiente per l'uso pratico, ma i compilatori continuavano a maturare e, alla fine, fu sviluppato un hardware dedicato per esso; a un certo punto negli anni '80 era la piattaforma di sviluppo preferita per lo sviluppo di workstation ad alte prestazioni.

Detto questo, la risposta più semplice è che un'implementazione Javascript veloce come il V8 di Google spazza via l'implementazione standard di Python (CPython) . V8 è una macchina virtuale altamente ottimizzata con un JITer che è incredibilmente veloce mentre CPython è una VM abbastanza semplice in confronto. C'è un'implementazione di Python con un JIT ma è ancora circa 5-6 volte più veloce.

Cinque anni fa sarebbe stata una storia diversa. I browser avevano implementazioni JavaScript semplicistiche perché la velocità non era un problema poiché nessuno aveva creato un software "reale" con esso e Python sarebbe stato uguale, se non più veloce.


Questa è la risposta più perspicace ancora. Quindi non è potenziale, piuttosto tempo e denaro.
Profpatsch,

7
"Cinque anni fa sarebbe stata una storia diversa" ... e tra cinque anni potrebbe essere di nuovo diversa.
Bryan Oakley,

1
>> Un linguaggio è una cosa astratta, l'implementazione è una cosa concreta che può misurare le prestazioni. << Sì, un'implementazione del linguaggio di programmazione è una cosa concreta. No, un'implementazione del linguaggio di programmazione non ha prestazioni di proprietà misurabili. Le prestazioni sono proprietà di programmi particolari che utilizzano un'implementazione del linguaggio, in un contesto particolare.
igouy,

2
@igouy Quindi, se dovessi scrivere due programmi funzionalmente identici, uno in C e uno in Python, considereresti la differenza di prestazioni come una proprietà dell'applicazione e non l'implementazione del linguaggio?
ConditionRacer

1
@ConditionRacer: Esistono molti modi diversi di scrivere lo stesso programma, quindi anche se una versione Python del programma avesse caratteristiche prestazionali diverse da una versione C, non proverebbe che nessuna versione Python potrebbe essere equivalente alla versione C. Guarda cose come asm.js ... in qualsiasi lingua puoi usare un array gigante per memorizzare tutto lo stato del tuo programma e puoi usare un piccolo sottoinsieme facilmente ottimizzabile delle operazioni primitive del linguaggio. (Come si
suol

5

Nei tempi più anziani del web, quando le applet Java, dove la principale unica forma di lato client di contenuto interattivo la gente ha capito che ci doveva essere un modo per ottenere le forme in una pagina web per essere in grado di interagire con le applet sulla pagina web.

Da questo, è stato creato un linguaggio di scripting per collegare l'applet Java alla pagina Web con il nome ... javascript.

Si possono vedere le vestigia di questo retaggio con domande SO come [ 1 ], [ 2 ], [ 3 ] - e i due documenti ufficiali: invocare il codice JavaScript da un'applet e invocare metodi dell'applet da un codice JavaScript

Con una tale lingua disponibile, i browser del tempo (Netscape era quello predominante) rendevano javascript disponibile come vantaggio competitivo (javascript progettato su Netscape - Netscape era il primo javascript lato server con il suo server nel '94 - quasi due decenni prima del nodo js). Altri browser hanno seguito l'esempio. Le persone scrivevano pagine che utilizzavano JavaScript, altri tentativi di scripting lato client avrebbero significato pagine completamente incompatibili tra cose che funzionano e cose che non funzionano - o duplicazione di codice (ecco il blocco {inserire la lingua qui} che fa questo per non-javascript browser e qui è il blocco javascript per tutti gli altri).

Dato che Netscape era il browser dominante per un certo periodo, javascript ha preso piede. Mentre l'eredità di Netscape viene persa nelle note a piè di pagina dei file sorgente di Mozilla, javascript sopravvive e nulla è stato in grado di rovesciare il suo posto.

Il problema rimane per qualsiasi altro linguaggio di scripting delle diapositive client. Javascript è supportato su tutti i browser. Se si dovesse creare un browser che supportasse Python (ad esempio) anziché javascript, non sarebbe in grado di utilizzare la stragrande maggioranza dei siti Web. Inoltre, a meno che quel browser non sia stato in grado di ottenere una quota significativa del traffico del browser, i web designer non vogliono creare due serie di pagine con linguaggi di script diversi per la stessa pagina.

Si potrebbe provare a creare un plug-in di script Python per alcuni browser che ha abilitato uno script Python sulla pagina ... simile a come funziona vrml oggi. Ma a meno che tu non abbia sentito e visto una pagina Web che utilizza vrml, è altrettanto probabile trovare un uso per un'altra pagina Web per un altro linguaggio di scripting.


1
Questa è un'ottima panoramica di "come è successo ..." e per quanto mi piacerebbe contrassegnarlo come risposta corretta, risponde alla domanda "Perché JavaScript è il linguaggio lato client utilizzato oggi?", Non " C'è un problema di progettazione che renderebbe Python troppo lento per l'uso sul lato client? ”
Profpatsch

VRML ... wow che mi riporta indietro!
FrustratedWithFormsDesigner

1
@Profpatsch non esiste alcun problema di progettazione tecnica con javascript che lo rende inappropriato per essere un linguaggio lato client - a parte il fatto che nulla lo utilizza e, a meno che non offra un vantaggio significativo (probabilmente includendo l'interattività con le applet Java), nulla lo farà mai. I problemi non sono tecnici e se non si comprende la storia del "perché javascript" non si può rispondere "perché non python".

2
@MichaelT: Hai scritto "non esiste alcun problema di progettazione tecnica con javascript che lo rende inappropriato per essere una lingua lato client". Intendi Python non JS ??
Carl Smith,

@CarlSmith Ahh sì. Il mio errore ... e non posso modificare i commenti oltre un certo tempo. Grazie per la correzione.

4

Non penso che Python sarebbe troppo lento. Non c'è nulla nella lingua che gli impedisce di correre abbastanza velocemente da corrispondere almeno a JavaScript. Può essere compilato in JavaScript, quindi, se non altro, è possibile includere un compilatore nel browser e aumentare potenzialmente solo i tempi di caricamento della pagina.

AGGIORNAMENTO: Si prega di vedere i commenti qui sotto per discutere del perché compilare Python in JS sarebbe notevolmente più costoso di quanto implicito qui.

Il problema sta cercando di convincere i fornitori di browser e W3C a scegliere prima Python, su Ruby o qualsiasi altro linguaggio di scripting, quindi definire un sottoinsieme standardizzato, in quanto non possono consentire chiamate di sistema e così via, e quindi implementarlo bene, tutto mentre supporto JavaScript ancora. Non succederà, ma se lo facesse, dubito che la velocità si rivelerebbe un problema serio.


7
Il tuo primo punto non segue. Tutto può essere compilato in quasi tutto (incluso il codice macchina), ma ciò non significa che un programma scritto in una lingua L e compilato in una lingua C sia veloce come un programma equivalente scritto in lingua C.

1
Bene, CoffeeScript è essenzialmente una sintassi diversa per gli stessi concetti chiave di JavaScript e C è essenzialmente un linguaggio assembly portatile. Python e Javascript, d'altra parte, differiscono molto. Per implementare correttamente Python, è necessario supportare (tra miliardi di altre cose) il modello di classe, il sovraccarico dell'operatore, le metaclasse, ecc. E la maggior parte di ciò non è mappata su JavaScript facilmente ed efficientemente. Stesso problema con la compilazione di uno di essi in C o codice macchina. Una JIT specializzata può essere la tua unica speranza, ma i compilatori JIT destinati a JS devono ancora essere dimostrati pratici.

3
Un problema sarà il fatto che non puoi comprimere Python come puoi JS: elimina tutti quegli spazi e nuove linee e il tuo ambito va avanti! Quindi finirai con tempi di caricamento più lunghi per qualsiasi pezzo significativo di Python.
TMN,

1
@TMN punto interessante, anche se si spera che l'espressività di Python farebbe molta strada per mitigarlo (e sì, questo è contare le linee, non i caratteri, ma comunque, Python è un linguaggio abbastanza espressivo).
Daniel B,

2
@TMN Cosa ha detto Daniel B e anche gzip dovrebbe ridurre la differenza. Oh, e Python non ha bisogno della maggior parte di quelle nuove linee e spazi. Molte (anche se non tutte) le linee possono essere unite bene in Python, ad esempio a = something(); frobincate(a); return quuxe if condition: react()sono singole. E n livelli di rientro richiedono solo n spazi, non n * 4 spazi.

2

Penso che Python abbia la sua macchina virtuale. Non ho molta esperienza con Python, ma non vedo alcun motivo per cui non funzioni così come un motore JavaScript non ottimizzato.

Alcuni pensieri casuali:

(1) Probabilmente potresti eseguire Python localmente attraverso un'applet Java usando Jython. La parte difficile che vedo qui è che le applet sono molto restrittive, quindi potrebbe essere necessario modificare Jython per adattarlo alle restrizioni di accesso. Ad esempio, se scrive in un file di registro, potrebbe essere necessario rimuovere il codice di registrazione. Un'applet non deve essere visibilmente visibile.

(2) Qualcuno potrebbe costruire un "compilatore" / convertitore da Python a JavaScript. Questo sarebbe molto lavoro.


5
Someone could build a Python-to-JavaScript "compiler"/converterBene, qualcuno l'ha già fatto .
yannis,


Non ho mai dovuto farlo da solo, ma sono a conoscenza di persone che hanno scritto applet Java usando Jython. Questa non è la stessa cosa che sostituire JavaScript nel browser con Python.
Martijn Pieters,

Brythonfunziona in modo interessante veloce, almeno per parti piuttosto isolate su pagine (bassa interazione con DOM tree).
Profpatsch,

@Profpatsch Dall'ultima volta che l'ho visto, non implementa nemmeno parti molto grandi del linguaggio Python. Convenientemente, tra le funzionalità non implementate ci sono quelle che sono difficili da implementare bene in cima a JavaScript. Per parafrasare uno degli autori di PyPy: è facile creare velocemente un sottoinsieme non banale di Python, dove Python completo diventa difficile.

1

Dipende dall'implementazione della lingua e non necessariamente dalla lingua stessa. La maggior parte degli interpreti JavaScript sono molto più veloci di quasi tutte le implementazioni di Python.

Ciò non significa che il linguaggio Python non possa essere usato quasi alla stessa velocità di JavaScript. Opal implementa quasi l'intero linguaggio Ruby e la libreria standard nel browser compilando il codice Ruby in codice JavaScript racchiuso in chiusure. Mettendo da parte il sovraccarico di includere la libreria Opal, la sua velocità è molto più vicina a quella del semplice JavaScript di qualsiasi altro interprete di Ruby che io conosca.

Non so se esiste un equivalente Python di Opal, ma un progetto del genere significherebbe probabilmente che la risposta alla tua domanda è "no". Con il crescente utilizzo di JavaScript come "linguaggio assembly per il Web", non mi sorprenderebbe se verrà utilizzato sempre più come piattaforma per altre lingue, in particolare con l'aumento della potenza di elaborazione mobile e il sovraccarico di avere una lingua implementato in JavaScript diventa sempre più negligente.

EDIT: ecco un elenco di implementazioni Python per il browser che vengono compilate / eseguite su JavaScript.

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

E se sei interessato, puoi dare un'occhiata a Opal, che mi piace molto.

http://opalrb.org/

Dal momento che dubito che i browser avranno mai il supporto per interpreti separati, tali compilatori sono probabilmente la via del futuro in termini di utilizzo di lingue diverse da JavaScript. Anche ora, otterrai prestazioni comparabili nella maggior parte delle aree. Questa è la mia opinione, tuttavia, tienilo a mente.


0

Anche quando hai posto questa domanda, c'erano già diverse implementazioni di Python disponibili in JavaScript che possono essere utilizzate oggi sulle pagine web.

Dai un'occhiata a http://www.skulpt.org/ o http://www.brython.info/ per i principianti.

Le prestazioni non sembrano essere così male, ma dovresti testarle tu stesso e scoprirlo.


-4

Python è un linguaggio "console", in esecuzione sul server

Javascript è una lingua "browser", in esecuzione sul client

Pertanto, non competono direttamente

... ovviamente ci sono node.js e probabilmente i plug-in del browser Python, ma poi è più una domanda sulle prestazioni di una particolare implementazione.

Inoltre, per la maggior parte delle applicazioni python andrà benissimo, tranne se si deve fare qualche tipo di calcolo esteso e comprimere i cicli della CPU.

Come ultima nota, python e javascript condividono molte somiglianze. A causa della loro natura dinamica, entrambi devono essere interpretati in fase di esecuzione e non possono essere compilati con la stessa forza dei linguaggi tipizzati statici. In quanto tale, presumo che le loro prestazioni ottenibili sarebbero simili.


2
JavaScript lato server era in circolazione nel '94. jscti permette di lavorare con javascript come console, più o meno come si farebbe se digitassero pythonsu una console.

@MichaelT: Ok, ho modificato la mia risposta di conseguenza
dagnelies il

2
Inoltre puoi scrivere app desktop in Python .... Non vedo alcun motivo reale per la distinzione che stai facendo.
Chris Travers,

Inoltre, lo strumento di modellazione 3D Blender utilizza Python per qualsiasi cosa, dall'interfaccia utente alla generazione di mesh. Se questo non è performantemente competitivo, che cos'è?
Andrew Gray,

@Chris: la distinzione è che javascript è principalmente una tecnologia browser, mentre python è principalmente una tecnologia desktop / console. Il mio punto era che il confronto di entrambi ha poco senso perché servono a scopi completamente diversi.
Dagnelies,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.