Perché non esiste un compilatore Python per il codice macchina nativo?

25

Come ho capito, la causa della differenza di velocità tra i linguaggi compilati e python è che il primo codice di compilazione è tutto nel codice della macchina nativa, mentre python compila in bytecode python, per essere interpretato dal PVM. Vedo che in questo modo i codici Python possono essere usati su più sistemi operativi (almeno nella maggior parte dei casi), tuttavia non capisco, perché non c'è un compilatore aggiuntivo (e facoltativo) per python, che compila allo stesso modo dei compilatori tradizionali . Ciò lascerebbe al programmatore scegliere, che è più importante per loro; eseguibilità o prestazioni multipiattaforma su macchina nativa. In generale; perché non ci sono linguaggi che potrebbero essere considerati compilati e interpretati?

    
posta user2986898 07.06.2014 - 10:51
fonte

3 risposte

29

No. Il motivo per cui esistono differenze di velocità tra linguaggi come Python e C ++ è dovuto al fatto che i linguaggi tipizzati staticamente forniscono al compilatore tonnellate di informazioni sulla struttura del programma e dei suoi dati che gli consentono di ottimizzare sia i calcoli che l'accesso alla memoria. Poiché C ++ sa che la variabile è di tipo int, può determinare il modo ottimale per manipolare quella variabile anche prima dell'esecuzione del programma. D'altra parte, in Python, il runtime non sa quale valore si trova in una variabile finché non viene raggiunta la linea dall'interprete. Questo è estremamente importante per le strutture, dove in C ++, il compilatore può facilmente raccontare la dimensione della struttura e ogni posizione dei suoi campi nella memoria durante la compilazione. Ciò gli conferisce un enorme potere nel prevedere come i dati potrebbero essere utilizzati e consente di ottimizzarli in base a tali previsioni. Nessuna cosa è possibile per linguaggi come Python.

Per compilare in modo efficace linguaggi come Python dovresti:

  1. Assicurarsi che la struttura dei dati sia statica durante l'esecuzione del programma. Questo è problematico perché Python ha eval e metaclassi. Entrambi i quali consentono di modificare la struttura del programma in base all'input del programma. Questa è una delle cose che danno a Python un tale potere espressivo.
  2. Dedica i tipi di tutte le variabili, strutture e classi dal codice sorgente stesso. Mentre è possibile in una certa misura, il sistema di tipo statico e l'algoritmo sarebbero così complessi da essere quasi impossibili da implementare in modo utilizzabile. Potresti farlo per un sottoinsieme della lingua, ma sicuramente non per l'intero set di funzionalità linguistiche.
risposta data 07.06.2014 - 13:03
fonte
0

Due concetti potrebbero aiutarci a comprendere meglio il motivo per cui Python compilato con codice macchina nativo "potrebbe" non essere eseguito velocemente come C compilato o altri linguaggi comunemente compilati. Sono chiamati associazione anticipata e associazione tardiva.

Dovrei iniziare dicendo che non sono un esperto di Python e sono venuto in questo sito per sbaglio. Ma mi piace questo sito.

Come accennato in un'altra risposta qui, il compilatore C ++ può sapere molto sul programma e prendere decisioni su quali operazioni utilizzare per specifiche strutture di dati. Ad esempio, se è necessario aggiungere due variabili intere, il compilatore sa che sono numeri interi nativi, ad esempio 32 bit di larghezza e può aggiungerli insieme con un'istruzione "ADD". Quindi compila le istruzioni ADD nel codice. È bloccato e non può essere modificato mentre il programma è in esecuzione. Questo è un legame precoce.

D'altra parte in un linguaggio come Python possiamo aspettarci che il programma lanci diversi tipi di dati insieme in modi complessi. Ora il compilatore non sa se le nostre 2 variabili sono numeri interi, float, stringhe o liste. Quindi deve compilare il codice che determina quell'informazione in fase di esecuzione e selezionare l'operazione corretta mentre il programma è in esecuzione. Questa è un'associazione tardiva e possiamo capire che ci sarà un colpo di prestazioni per fare quel lavoro extra mentre il programma è in esecuzione. È il prezzo che paghi per tenere aperte queste opzioni in una lingua come Python ma offre la massima flessibilità di run-time.

    
risposta data 06.02.2016 - 14:49
fonte
-4

Penso che abbia più a che fare con le specifiche Python stesso, la stessa ragione per cui non è possibile compilare C # su codice macchina. Le specifiche della lingua renderebbero i buggy dei tuoi programmi anche se fosse possibile a causa della natura della lingua. Perché non imparare solo il linguaggio C? È molto più semplice di C ++ e leggermente avanzato rispetto a Python ma è comunque accessibile.

    
risposta data 11.11.2015 - 21:18
fonte

Leggi altre domande sui tag