La lingua dinamica è sempre interpretata?

17

Guardando tutti i linguaggi dinamici (se non tutti) [i.e Python, PHP, Perl e Ruby], sono 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?

    
posta Joshua Partogi 01.07.2011 - 03:04
fonte

11 risposte

31

Looking at most (if not all) dynamic languages [i.e Python, PHP, Perl and Ruby], they are all interpreted.

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

Esistono interpreti per linguaggi tipizzati in modo statico e compilatori per lingue con tipi dinamici. I due concetti sono ortogonali.

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

    
risposta data 01.07.2011 - 03:30
fonte
15

Il Common Lisp è dinamicamente (e strongmente) tipizzato e solitamente compilato .

Poiché questa dinamica è raggiunta in fase di runtime, ci sono alcune direttive che puoi usare 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 aumentare prestazioni.

    
risposta data 01.07.2011 - 07:02
fonte
11

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

    
risposta data 01.07.2011 - 03:53
fonte
4

node.js è basato sul motore javascript di Google V8. V8 esegue la compilazione runtime. V8 è incredibilmente veloce dato questo fatto. Consulta il link e confronta V8 rispetto a qualsiasi delle lingue interpretate sopra.

    
risposta data 01.07.2011 - 05:14
fonte
2

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

(Questo era ai tempi dei dischi floppy da 100K, quando i dinosauri continuavano a vagare per la terra e mangiavano ignari sviluppatori di software per la colazione.)

    
risposta data 01.07.2011 - 03:13
fonte
2

Diverse implementazioni Smalltalk gestiscono diversamente, ma molti di essi vengono compilati con bytecode eseguiti su una VM ad alte prestazioni.

    
risposta data 01.07.2011 - 05:47
fonte
2

In effetti la maggior parte delle cosiddette lingue "interpretate" passano attraverso / consentono una compilazione just-in-time per farla girare più velocemente. E alcuni di questi devono essere compilati in byte code prima di poterli eseguire.

In effetti, dinamiche e interpretate sono totalmente 2 idee diverse, sebbene esista una correlazione. Il motivo per cui chi sente la digitazione dinamica semplifica e velocizza il proprio lavoro, non si preoccuperebbero che il codice venga eseguito un po 'più lento ma portatile.

    
risposta data 01.07.2011 - 09:37
fonte
2

No - è certamente possibile compilare linguaggi dinamici.

Ci sono persino alcuni linguaggi dinamici che sono sempre compilati per disegno (ad esempio Clojure).

La domanda tuttavia riguarda un importante punto correlato: sebbene i linguaggi dinamici possano essere compilati, è spesso il caso che langauges dinamici non possano essere compilati in codice che sia efficiente come un linguaggio tipizzato staticamente . Questo perché ci sono alcune caratteristiche intrinseche in linguaggi dinamici che richiedono verifiche di runtime che non sarebbero necessarie in una langauge compilata staticamente.

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

Ciò aggiunge un sovraccarico significativo rispetto a una chiamata di metodo in una lingua 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ù che altro che si traduce in linguaggi dinamici con prestazioni più lente in media rispetto alle loro controparti compilate staticamente. Come puoi vedere dai benchmarks imperfetti , sono le lingue tipizzate staticamente (C, Java, Fortran ecc.) Che tendono ad essere più veloci con i linguaggi dinamici (Perl, Python, Ruby, PHP ecc.) Nella parte inferiore della classifica.

    
risposta data 17.02.2012 - 12:16
fonte
1

Chrome, IE9 e Firefox 3.1+ compattano tutti i JavaScript nei binari nativi e JavaScript viene digitato in modo dinamico.

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

Anche le prestazioni non sono (non lo erano) una preoccupazione per i tipi di programmi che sono stati scritti in queste lingue, quindi, ancora una volta, il sovraccarico di digitazione e interpretazione dinamiche non era un problema così grande come sarebbe essere in lingue che valutano le prestazioni.

    
risposta data 01.07.2011 - 05:16
fonte
1

Python è, in genere, compilato. Ammesso al codice byte che viene poi interpretato.

Perl funziona in modo simile.

Il Lisp comune, in genere, viene compilato con 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).

    
risposta data 01.07.2011 - 12:29
fonte
-5

Sì. Tutte le lingue dinamiche sono linguaggio interpretato (ma un linguaggio interpretato potrebbe essere non dinamico).

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

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

    
risposta data 29.08.2017 - 13:36
fonte

Leggi altre domande sui tag