I linguaggi dinamici vengono sempre interpretati?


18

Osservando la maggior parte (se non tutti) i linguaggi dinamici (ad esempio Python, PHP, Perl e Ruby), vengono tutti interpretati. Correggimi se sbaglio. C'è qualche esempio di linguaggio dinamico che passa attraverso la fase di compilazione? Il linguaggio dinamico è identico al linguaggio interpretato?


4
Definisci un linguaggio dinamico, è digitato in modo dinamico?
BenjaminB,

3
Objective-C presenta molte proprietà "dinamiche".
Edward Strange,

4
@Job, si potrebbe fare con Lisp per decenni. Ed è sia compilato che tipizzato in modo dinamico. Quindi, non c'era mai stato un confine preciso tra compilazione e interpretazione.
SK-logic

2
@Darien Puoi anche compilarlo in fase di esecuzione ed eseguire il codice in seguito. A rigor di termini, non è interpretazione.
xmm0

3
@Darien Nothing impedisce a un compilatore di memorizzare le informazioni di una tabella dei simboli nel file binario compilato e di generare codice per accedervi in ​​fase di esecuzione. È vero che alcune lingue si prestano all'interpretazione più che alla compilazione, ma il punto è che è possibile avere un compilatore per quella lingua. Un'altra cosa importante da notare è che alcune persone presumono che un compilatore debba generare una sorta di codice macchina. In pratica, ci sono compilatori che eseguono semplicemente una trasformazione a livello di sorgente in due lingue (o anche nella stessa lingua, come alcuni minificatori Javascript).
xmm0

Risposte:


33

Osservando la maggior parte (se non tutti) i linguaggi dinamici [ovvero Python, PHP, Perl e Ruby], vengono tutti interpretati.

Non vero. È possibile compilare il sorgente Python. Questa è una prova esistenziale.

Esistono interpreti per linguaggi tipicamente statici e compilatori per linguaggi tipicamente dinamici. I due concetti sono ortogonali.

Nota a margine: in generale, una lingua è proprio questa: una lingua, con un insieme di costrutti sintattici per esprimere la semantica. Se scrivi Python su una lavagna, si chiama ancora Python! È l' implementazione che può essere un interprete o un compilatore. Essere tipizzati staticamente o dinamicamente (del tipo di un ibrido di entrambi) è una proprietà del linguaggio, mentre l'esecuzione di un programma interpretando o compilando è una proprietà dell'implementazione.


19
Con quale precisione i rientri devono corrispondere su una lavagna affinché Python sia sintatticamente valido? ;)
edA-qa mort-ora-y

1
Non è possibile compilare Python. PYC accelera solo il carico di un modulo. E py2exe semplicemente incorpora l'interprete nell'exe con il file sorgente.
BenjaminB,

8
@ Ubiquité: i .pycfile sono bytecode. Il codice sorgente di Python è stato analizzato, ottimizzato e compilato per crearli. Le istruzioni per bytecode sono relativamente di alto livello e l'implementazione più popolare è un semplice interprete (per contrasto, guarda PyPy che JIT compila bytecode in codice macchina molto intelligente in fase di runtime) ma Python non è meno compilato di Java o C #. Python è "non compilato" solo se la "compilazione" era limitata alla compilazione nativa anticipata , ma nessuno ha detto nulla al riguardo e in generale può fare riferimento a qualsiasi trasformazione da lingua a lingua.

4
@ Ubiquité: Sì, è corretto, ma ciò non ha alcuna relazione con la tua affermazione che "Non puoi compilare Python" o se è possibile compilare Python. Innanzitutto, state mescolando Pythone CPython, mentre il secondo è un'implementazione del primo, lo è anche PyPy.
phant0m

2
@ClemC TUTTE le proprietà di una lingua sono integrate in un compilatore o interprete, altrimenti l'interprete o il compilatore è qualcosa per un'altra lingua.
Pieter B,

15

Il Lisp comune è tipizzato in modo dinamico (e fortemente) e solitamente compilato .

Poiché questa dinamicità viene raggiunta in fase di esecuzione, ci sono alcune direttive che è possibile utilizzare nel codice sorgente per assicurare al compilatore che un simbolo manterrà solo un certo tipo di valore, in modo che il compilatore possa ottimizzare il codice generato e migliorare le prestazioni.


12

C # 4.0 supporta tipi dinamici (late-binding) ed è compilato.


4

node.js si basa sul motore javascript V8 di Google. V8 esegue la compilazione di runtime. V8 è incredibilmente veloce dato questo fatto. Dai un'occhiata a http://shootout.alioth.debian.org e confronta V8 con una qualsiasi delle lingue interpretate sopra.


3

No - è certamente possibile compilare linguaggi dinamici.

Ci sono anche alcuni linguaggi dinamici che sono sempre compilati in base alla progettazione (ad esempio Clojure).

La domanda tocca tuttavia un importante punto correlato: sebbene i linguaggi dinamici possano essere compilati, spesso accade che i linguaggi dinamici non possano essere compilati fino a un codice efficiente quanto un linguaggio tipizzato staticamente . Questo perché ci sono alcune caratteristiche intrinseche nei linguaggi dinamici che richiedono controlli di runtime che non sarebbero necessari in una lingua compilata staticamente.

Un esempio di questo: i linguaggi che consentono l'applicazione di patch runtime su oggetti (ad es. Ruby) richiedono spesso che l'oggetto venga ispezionato (con una ricerca hashtable o simile) ogni volta che invochi un metodo sull'oggetto. Anche se questo è compilato, il compilatore dovrà generare codice per eseguire la ricerca del metodo in fase di esecuzione. In una certa misura questa ricerca del metodo non è dissimile da ciò che un interprete dovrebbe fare.

Ciò aggiunge un notevole sovraccarico rispetto a una chiamata di metodo in un linguaggio come Java, in cui il metodo corretto può essere determinato staticamente dal compilatore dalla definizione della classe e ridotto a una semplice chiamata di funzione nel codice nativo.

Credo che questo effetto sia più di ogni altra cosa che porta a linguaggi dinamici con prestazioni più lente in media rispetto alle loro controparti compilate staticamente. Come puoi vedere dai benchmark errati , sono i linguaggi tipizzati staticamente (C, Java, Fortran ecc.) Che tendono ad essere più veloci con i linguaggi dinamici (Perl, Python, Ruby, PHP ecc.) In fondo alla classifica.


2

C'era una volta, BASIC era interpretato. E alcune varianti di BASIC avevano una digitazione dinamica. E potresti ottenere compilatori anche per loro.

(Questo era ai tempi dei floppy drive da 100K, quando i dinosauri vagavano ancora per la terra e mangiavano ignari sviluppatori s / w per colazione.)


... ma solo quando hanno usato GOTO. (Che era, ovviamente, abbastanza comune se si stavano sviluppando in BASIC. AHA! Questo lo spiega!)
Mason Wheeler,

BASIC ai suoi tempi di progettazione era un linguaggio compilato.
Approgrammatore

2

Diverse implementazioni di Smalltalk gestiscono ciò in modo diverso, ma molte di esse vengono compilate in bytecode eseguiti su una macchina virtuale ad alte prestazioni.


2

In effetti la maggior parte delle lingue cosiddette "interpretate" passano / consentono a una compilazione just-in-time di farla funzionare più velocemente. E alcuni di essi devono essere compilati in codice byte prima di poterli eseguire.

In realtà dinamico e interpretato sono totalmente 2 idee diverse, anche se esiste una correlazione. Il motivo è che chi ha mai sentito la digitazione dinamica rende il proprio lavoro più facile e veloce, non gli dispiacerebbe che il codice fosse eseguito un po 'più lentamente ma portatile.


1

Chrome, IE9 e Firefox 3.1+ compilano tutti JavaScript in file binari nativi e JavaScript viene digitato in modo dinamico.

Penso che la ragione per cui i linguaggi dinamici tendono storicamente ad essere interpretati è perché la tipizzazione e l'interpretazione dinamiche (o più specificamente, la mancanza di compilazione) tendono entrambi ad essere caratteristiche utili ai linguaggi di scripting e alle attività di scripting in generale.

Inoltre, le prestazioni non sono (non erano) così preoccupanti per i tipi di programmi scritti in queste lingue, quindi, di nuovo, l'overhead della digitazione dinamica e dell'interpretazione non era un grosso problema come lo sarebbe nelle lingue quel valore delle prestazioni.


1

Python è, in genere, compilato. Certamente compilato per il codice byte che viene quindi interpretato.

Perl funziona in modo simile.

Lisp comune, in genere, verrà compilato in uno di codice nativo o byte. Ciò differisce tra le implementazioni (e, in una certa misura, all'interno di un'implementazione, a seconda delle varie impostazioni di ottimizzazione).


-5

Sì. Tutte le lingue dinamiche sono lingue interpretate (ma una lingua interpretata potrebbe non essere dinamica).

Il motivo è semplice: se è dinamico, ha bisogno di un interprete per eseguire il dinamismo a livello della compilazione binaria.

ex. : quando inseriamo un dato in una variabile PHP, poi un altro di tipo diverso, il nostro programma non può essere compilato in codice binario poiché ogni tipo ha il suo formato di rappresentazione binaria; l'interprete gestisce i turni a livello binario in modo dinamico


2
Sbagliato. I linguaggi dinamici possono essere compilati (e talvolta in modo molto efficiente, ad esempio utilizzando JIT e tecniche di compilazione adattativa)
Basile Starynkevitch

"In parole povere, la compilazione JIT combina la velocità del codice compilato con la flessibilità dell'interpretazione, con l'overhead di un interprete ..." en.wikipedia.org/wiki/Just-in-time_compilation il tuo programma non viene compilato: è compilato da l'interprete per te
ClearMind

Leggi i documenti relativi a SELF
Basile Starynkevitch il

Sicuro. Il tuo link menziona: "Una caratteristica di Sé è che si basa sullo stesso tipo di sistema di macchina virtuale utilizzato in precedenza dai sistemi Smalltalk. Cioè, i programmi non sono entità autonome come in linguaggi come C, ma hanno bisogno del loro intero ambiente di memoria per poter funzionare ". non autonomo = non compilato binario, la macchina virtuale è necessaria per eseguire la compilazione binaria
ClearMind

1
La tua definizione di compilatore è troppo restrittiva. Non tutti i compilatori producono un file eseguibile binario. Per un recente controesempio, studiare l'implementazione di SBCL . Leggi l'ultimo libro del drago e Lisp in piccoli pezzi
Basile Starynkevitch,
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.