Perché Python è trattato come un linguaggio interpretato quando ha una fase di compilazione? [chiuso]

4

Perché quel python viene trattato come solo un linguaggio interpretato quando in effetti c'è uno stadio di compilazione in cui il codice che scriviamo viene convertito in codice byte (.pyc), che viene poi interpretato dal PVM. È sbagliato dire che Python è solo un linguaggio interpretato?

    
posta Lakmal Caldera 28.11.2014 - 03:11
fonte

6 risposte

13

Is Python interpreted (like Javascript or PHP)? is worth a read for more information and it says:

...different implementations of languages may do different things. These days you can find both C interpreters and Javascript compilers.

Compilati e interpretati sono descrizioni di un'implementazione, non di una lingua; Il loro utilizzo in relazione alle lingue è un ritorno ai tempi in cui ogni lingua aveva poche implementazioni e strumenti simili (semplici) rispetto ai tipi di funzioni che si potrebbero trovare in un IDE oggi.

Ci sono livelli di interpretazione / compilazione ...

  • Interpretazione pura
  • Tokenizzazione + interpretazione
  • Compilazione del codice byte che richiede una macchina virtuale per ospitare
  • Bytecode + compilazione "just in time" su Codice macchina
  • Compilazione di codice macchina nativo

Diversi ambienti Python usano diverse opzioni, cpython fa solo una compilazione bytecode, dove Psyco usa un approccio bytecode + JIT.

Nuovi linguaggi e implementazioni utilizzano spesso l'approccio Bytecode + JIT in quanto è il modo migliore per renderli portatili e consente all'applicazione di utilizzare più funzionalità di un ambiente host sconosciuto.

In termini del linguaggio stesso, le descrizioni sono usate come una scorciatoia per il livello di astrazione. Con linguaggi di alto livello come Python, dove la considerazione e l'ottimizzazione delle prestazioni sono lontane dai remoti dei programmatori spesso descritti come interpretati, laddove quelli di basso livello come C, in cui tali considerazioni sono strettamente legate, sono considerati compilati.

Per rispondere alla tua domanda - Python come la maggior parte delle persone lo usa è PARZIALMENTE COMPILATO e sarebbe giusto considerarlo ENTRAMBI compilato e interpretato.

    
risposta data 28.11.2014 - 10:15
fonte
8

Questa è una semplificazione, ma ci sono tre passaggi principali nella compilazione del codice:

  1. Analizza il codice sorgente in un albero di sintassi
  2. Compilare l'albero della sintassi in un codice byte indipendente dalla macchina
  3. Traduci codice byte per codice macchina

Un compilatore C fa tutti e tre, ed è senza dubbio un compilatore. Un compilatore Java fa 1 e 2, producendo file .class, e il runtime fa 3. Il "compilatore" Python fa solo il punto 1 quando produce file .pyc, mentre il runtime fa 2 e 3.

Quindi, come dice Bart, la differenza tra "compilato" e "interpretato" è in qualche modo soggettiva. Ma il passo 2 è un passo molto significativo, ed è il più difficile da fare in senso inverso, cioè decompilare. Ecco perché Java viene solitamente chiamato compilato e Python di solito chiamato interpretato.

Quanto sopra è il mio post originale. Da quando ho postato ho maggiori informazioni sui file .pyc e ho bisogno di correggerlo. Il compilatore Python esegue effettivamente il passaggio 2; il contenuto dei file pyc è un linguaggio intermedio basato sullo stack, abbastanza simile ai file di classe Java.

Mi chiedo se la ragione per cui Python è considerato "interpretato" sia perché c'è un singolo binario da compilare ed eseguire.

    
risposta data 28.11.2014 - 10:08
fonte
5

Diversamente da .NET e Java, non esiste uno standard ben definito per il codice byte Python e talvolta lo cambiano da versione a versione. Vedi anche questa domanda .

Questo implica che non puoi realmente distribuire la versione compilata del tuo codice, il che a sua volta significa che non puoi davvero considerarlo un linguaggio compilato.

    
risposta data 28.11.2014 - 10:58
fonte
2

Con python , puoi inserire una riga di codice in python e aspettarti che venga interpretata ed eseguita immediatamente.

I linguaggi compilati come c , java , ecc. richiedono una fase di compilazione che renda un oggetto che può essere eseguibile. Potrebbero essere necessari ulteriori passaggi per rendere eseguibile il codice.

A differenza di un linguaggio compilato, una lingua interpretata può eseguire un comando come:

print "Hello"
    
risposta data 29.11.2014 - 00:24
fonte
1

Non c'è più una chiara distinzione tra le lingue compilate e quelle interpretate, poiché ci sono pochissime lingue che sono puramente interpretate.

Sembra che il termine "linguaggio interpretato" sia effettivamente utilizzato per i linguaggi di scripting, in cui è possibile lavorare in un ciclo "modifica - esegui" stretto senza una fase di compilazione esplicita nel flusso di lavoro.

    
risposta data 28.11.2014 - 09:07
fonte
1

Puoi dirlo quando parliamo di Python nel suo insieme; incluso il compilatore che crea codice byte e una macchina virtuale che interpreta il codice byte. Python come lingua non dice nulla se si tratta di un linguaggio di programmazione compilato o interpretato, solo l'implementazione di esso. Spesso con problemi semantici, ci sono linguaggi di programmazione in cui l'utente può scegliere di compilare il codice in codice byte per essere interpretato in fase di esecuzione o compilarlo direttamente in codice macchina.

    
risposta data 28.11.2014 - 14:33
fonte

Leggi altre domande sui tag