Perché non ci sono altri linguaggi di programmazione che vengono compilati in bytecode Python?


51

In Java, ci sono più lingue che vengono compilate in bytecode Java e possono essere eseguite su JVM: Clojure, Groovy e Scala sono le principali che riesco a ricordare dalla cima della mia testa.

Tuttavia, Python si trasforma anche in bytecode (file .pyc) prima di essere eseguito dall'interprete Python. Potrei essere semplicemente ignorante, ma perché non ci sono altri linguaggi di programmazione che si compilano in bytecode python?

È solo perché nessuno si è preoccupato di farlo, o c'è una sorta di restrizione intrinseca o barriera in atto che rende così difficile?


30
... perché non vogliono avere a che fare con il GIL? ;)
Mason Wheeler

4
Gli istinti mi direbbero che ha molto a che fare con quanto è matura la JVM, ben specificata, e la JVM è praticamente su tutte le piattaforme o stupida facile da acquisire.
Rig

4
Sospetto anche che la maggior parte delle JVM siano molto più veloci degli interpreti di Python.
Peter Smith,

19
Mirando al bytecode Java, si ottengono tutte le funzionalità di una JVM (sicurezza, prestazioni, portabilità, scalabilità e così via). Targeting per codice byte Python non ti dà molto.
David Schwartz,

3
Il bytecode Python non è riconosciuto dalle versioni successive dell'interprete Python. Come si può implementare un linguaggio di programmazione che compila il bytecode Python?
Gus,

Risposte:


77

Semplice: l'ultima volta che ho controllato, Python non aveva specifiche formali, incluso il suo bytecode. CPython è la specifica e la portabilità bytecode non è richiesta IIRC. Pertanto, si tratta di un obiettivo mobile e senza documenti progettato per una lingua specifica.


22
In effetti, i dettagli del formato del bytecode cambiano spesso tra le versioni secondarie e persino il PyPy compatibile al 99% non ci prova nemmeno (in effetti, aggiungono le loro istruzioni per bytecode).

Nota: Python - il linguaggio - ha una specifica formale (vedi "PEPs"). La "Macchina virtuale Python" no. Questo è effettivamente diverso (ad esempio) da Java, dove entrambi sono specificati.
Albert,

56

Esistono più lingue JVM perché c'erano persone di talento che volevano scrivere codice che funzionasse con il codice Java esistente, ma non volevano scrivere Java .

Apparentemente non ci sono programmatori che vogliono lavorare con il codice Python esistente, ma odiano Python abbastanza da portare un'altra lingua all'interprete bytecode Python.

Puoi vederlo in due modi: ci sono linguaggi alternativi per JVM perché Java è così diffuso, o non ci sono linguaggi alternativi per l'interprete bytecode Python perché Python non fa schifo.


7
Spero che tu non stia insinuando che Java fa schifo o Java fa schifo più di Python :-)
Giorgio

8
@Giorgio: sto insinuando che i creatori di Groovy, Scala, Clojure, ecc. Pensavano che ci fosse un notevole margine di miglioramento. Stai insinuando che Python fa schifo?
Kevin Cline,

8
Dopo aver lavorato con Python direi che il "fattore di succhiare basso" sarebbe inaccurato. Contrasta troppe cose comunemente accettate e l'intera cosa del "sé" è estremamente controproducente. In effetti stupido. In che modo un metodo di classe non sa dove appartiene?
Rig

6
@Rig Personalmente, penso che l'approccio di Python sia più elegante. L'OO segue organicamente dalla sintassi anziché richiedere una parola chiave speciale che assomigli a una variabile. Il motivo per cui i metodi di classe non sanno dove si trovano, è perché le definizioni di classe Python sono solo codice, e questo codice non è privilegiato perché si trova all'interno di una definizione di classe. È possibile definire metodi ovunque e aggiungerli a una classe in fase di esecuzione. In effetti, puoi prendere la stessa funzione e usarla come metodo in più classi, qualcosa che non funzionerebbe davvero con il thisparadigma.
Antimonio

6
Penso che si tratti di macchine virtuali non di lingue. JVM è una macchina virtuale performante con un garbage collector generazionale, JIT, ecc. Mentre CPython utilizza il conteggio dei riferimenti ed è un interprete. È CPython che fa schifo come piattaforma. A proposito esiste.
PuercoPop,

26

Ci sono carenze tecniche come GIL in CPython, ma poche carenze linguistiche percepite , quindi il runtime non è il punto di forza della comunità Python. Esattamente il contrario, ci sono più opzioni di runtime backend a causa dell'insoddisfazione per l'implementazione di GIL / CPython.

Il linguaggio Java è molto più diffamato rispetto alla JVM (anche nella comunità Java).

Il JVM è abbastanza ben considerato nella maggior parte dei circoli; quindi il desiderio di front-end linguistici diversi / migliori con i vantaggi del JVM back-end altamente ottimizzato.


10

Dico che Mason Wheeler ha ragione. È principalmente un problema con il Global Interpreter Lock che rende la concorrenza un problema molto spinoso. Dal momento che ci sono altre macchine virtuali che fanno concorrenza davvero molto bene relativamente ha senso sviluppare linguaggi per quelli. Anche Python ha avuto recentemente un importante cambio di lingua e molte delle librerie non hanno raggiunto la resa rendendo la compatibilità un lieve incubo a volte. Ad esempio, poiché utilizzo PIL per il lavoro visivo, devo programmare in Python 2.7 o versioni precedenti. Questo non è il caso delle configurazioni JVM o CLI che in particolare nel caso di quest'ultimo sono state progettate tenendo presente l'interoperabilità del linguaggio.

Ho fatto qualche ricerca in più e apparentemente ci sono in realtà due GIL non solo quello. L'altro controlla le importazioni .


1
"GIL free" è uno dei motivi tecnici menzionati in "Ragioni per cui i programmatori CPython potrebbero essere interessati a IronPython" nel wiki di Python .
yannis,

1
@YannisRizos: sicuramente l'accesso al framework .NET non è del tutto irrilevante. Naturalmente, è possibile che gli utenti di CPython non siano completamente interessati a questo.
Robert Harvey,

@RobertHarvey Ninja l'ha modificato. Anche se non penso che "l'accesso a nuovi fantasiosi giocattoli" sia una ragione tecnica (non che i giocattoli non siano fantastici), la wiki menziona anche che IronPython è più facile da estendere.
yannis,

8

Le altre risposte hanno molto senso, ma ora ci sono lingue che si compilano in Python. Dove c'è una volontà ...

Non so nulla di questi linguaggi, ma sembrano funzionare trasferendo il loro codice sorgente in AST Python e lasciando che Python compili gli alberi in bytecode, evitando i problemi menzionati in altre risposte.

Sulla base dei commenti, attualmente conosciamo tre lingue alternative che utilizzano la VM Python (sentitevi liberi di aggiungerne altre qui):

  • Mochi si descrive come un linguaggio di programmazione tipizzato in modo dinamico per la programmazione funzionale e la programmazione in stile attore .
  • Hy : Descrive se stesso come un dialetto di Lisp incorporato in Python .
  • dg : si descrive come un linguaggio (tecnicamente) semplice che viene compilato in bytecode CPython .

2
Vale anche la pena menzionare HyLang
ideasman42

1
E dg .
Hakatashi,

6

Un altro motivo è che la JVM è un ecosistema altamente ottimizzato, ben evoluto ed estremamente completo. Da solo, compete molto bene con qualsiasi altra lingua compilata. (Non dirò che è la migliore macchina virtuale per uso generale, ma ho sicuramente puntato la mia carriera su questo.) Quindi ottenere l'accesso a JVM, a meno di scrivere bytecode, è desiderabile in sé.

Tuttavia, la VM Python è buona, ma (nulla contro Python) presenta alcune gravi carenze. L'ambiente runtime di Python si adatta bene alla natura dinamica del linguaggio, ma può davvero sorprenderti quando acquisisci familiarità con l'utilizzo della memoria, il blocco globale o il modello di threading.

Nei confronti testa a testa, la JVM è in genere due volte più veloce della VM Python. La JVM (sorprendentemente) compete anche bene con il codice compilato in modo nativo, basato sulle ottimizzazioni "a caldo" che esegue. E questo non conta nemmeno la gestione dei thread più sofisticata, ecc.

Adoro Python, lo faccio davvero, e odio dirlo, ma a volte la performance mi dà dei calci nei denti - altrimenti, perché le librerie Python critiche come numpy o scipy dovrebbero ricadere nel codice C?

In altre parole, le persone che gravitano su Python lo fanno perché a loro piace la lingua . Ma se vuoi scrivere un linguaggio nuovo di zecca per soddisfare le tue preferenze, stai molto meglio compilando la JVM, perché il tuo nuovo linguaggio idiosincratico inizierà in uno degli ambienti operativi migliori (soggettivamente, forse il migliore) disponibili.

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.