Qual è la differenza tra linguaggio compilato e interpretato?


118

Dopo aver letto del materiale su questo argomento non sono ancora sicuro di quale sia la differenza tra un linguaggio compilato e un linguaggio interpretato. Mi è stato detto che questa è una delle differenze tra Java e JavaScript. Qualcuno potrebbe aiutarmi a capirlo?

Risposte:


165

Qual è la differenza tra linguaggio compilato e interpretato?

La differenza non è nella lingua; è nell'implementazione .

Dopo averlo tolto dal mio sistema, ecco una risposta:

  • In un'implementazione compilata, il programma originale viene tradotto in istruzioni macchina native, che vengono eseguite direttamente dall'hardware.

  • In un'implementazione interpretata, il programma originale viene tradotto in qualcos'altro. Un altro programma, chiamato "l'interprete", esamina quindi "qualcos'altro" ed esegue tutte le azioni richieste. A seconda della lingua e della sua implementazione, ci sono una varietà di forme di "qualcos'altro". Dal più popolare al meno popolare, potrebbe essere "qualcos'altro"

    • Istruzioni binarie per una macchina virtuale, spesso chiamate bytecode , come si fa in Lua, Python, Ruby, Smalltalk e molti altri sistemi (l'approccio è stato reso popolare negli anni '70 dal sistema UCSD P e UCSD Pascal)

    • Una rappresentazione ad albero del programma originale, come un albero di sintassi astratta, come viene fatto per molti prototipi o interpreti didattici

    • Una rappresentazione tokenizzata del programma sorgente, simile a Tcl

    • I caratteri del programma sorgente, come è stato fatto in MINT e TRAC

Una cosa che complica il problema è che è possibile tradurre (compilare) bytecode in istruzioni macchina native . Pertanto, un'implementazione interpretata con successo potrebbe eventualmente acquisire un compilatore. Se il compilatore viene eseguito dinamicamente, dietro le quinte, viene spesso chiamato compilatore just-in-time o compilatore JIT. I JIT sono stati sviluppati per Java, JavaScript, Lua e, oserei dire, molti altri linguaggi. A quel punto puoi avere un'implementazione ibrida in cui del codice viene interpretato e del codice compilato.


7
Signore, ho le seguenti domande 1. In che lingua è scritto "qualcos'altro"? 2. E nel contesto di JavaScript, questo "qualcos'altro" varia da browser a browser? 3. Ad esempio, il mio script è in esecuzione su Google Chrome e Internet Explorer, è interpretato allo stesso modo in entrambi i browser?
JavaHopper

@ Norman che è stata una spiegazione fantastica. Tuttavia, ecco un paio di confusioni che ho ancora. In un'implementazione compilata, il programma originale viene convertito in istruzioni macchina native. Come mai? Pensavo che C, ad esempio, dopo la compilazione avrebbe prodotto codice assembly, che comunque deve essere assemblato da un assemblatore nativo nel codice macchina della macchina sottostante. Allora in che modo è diverso da una VM (python o JVM ecc.) Che fa lo stesso nel caso di un linguaggio interpretato?
qre0ct

58

Java e JavaScript sono un pessimo esempio per dimostrare questa differenza , perché entrambi sono linguaggi interpretati . Java (interpretato) e C (o C ++) (compilato) avrebbero potuto essere un esempio migliore.

Perché il testo barrato? Come questa risposta sottolinea correttamente, interpretato / compilato riguarda un'implementazione concreta di un linguaggio, non il linguaggio in . Sebbene affermazioni come "C è un linguaggio compilato" siano generalmente vere, non c'è nulla che impedisca a qualcuno di scrivere un interprete del linguaggio C. In realtà, interpreti per C esistono .

Fondamentalmente, il codice compilato può essere eseguito direttamente dalla CPU del computer. Cioè, il codice eseguibile è specificato nel linguaggio "nativo" della CPU ( linguaggio assembly ).

Il codice delle lingue interpretate, tuttavia, deve essere tradotto in fase di esecuzione da qualsiasi formato alle istruzioni della macchina CPU. Questa traduzione viene eseguita da un interprete.

Un altro modo per dirlo è che le lingue interpretate sono il codice che viene tradotto in istruzioni della macchina passo dopo passo mentre il programma viene eseguito, mentre i linguaggi compilati hanno codice tradotto prima dell'esecuzione del programma.


8
Java è interpretato? Da wikipedia: "Le applicazioni Java sono generalmente compilate in bytecode (file di classe) che possono essere eseguite su qualsiasi Java Virtual Machine (JVM) indipendentemente dall'architettura del computer."
Personman

6
@Personman che è ancora tecnicamente "interpretato" poiché la JVM sta eseguendo il codice, non il sistema operativo stesso. È davvero una differenza semantica più, poiché si potrebbe dire che la complessità dei sistemi operativi moderni rende la differenza sostanzialmente irrilevante per la maggior parte delle situazioni. Stai parlando della differenza tra il sistema operativo che esegue l'app e il sistema operativo che esegue un'app che esegue il codice.
GrayWizardx

5
Suppongo che tu voglia dire che i file di classe stessi vengono interpretati dalla Java VM. Questo è abbastanza ragionevole, ma il sorgente java è davvero compilato in bytecode Java VM. È possibile creare una Java Machine fisica che non richieda alla VM di interpretarla nel codice macchina di un'altra architettura. Quindi sembra più accurato dire che Java è compilato. Tuttavia, questo è un buon esempio del modo in cui la distinzione è confusa e in qualche modo arbitraria. Dopotutto, il C compilato viene interpretato dalla CPU, giusto?
Personman

13
Java è un pessimo esempio di linguaggio compilato o interpretato perché è essenzialmente entrambi. Se dovessi fare un confronto, sceglierei C e Lisp per evitare confusione.
Bill the Lizard

7
@stakx - in realtà i bytecode Java sono normalmente compilati in codice nativo anche da un compilatore JIT. L'unico modo per ottenere un comportamento da interprete puro è disattivare esplicitamente il compilatore JIT quando viene avviata la JVM.
Stephen C

15

Ecco la differenza fondamentale tra il linguaggio del compilatore e quello dell'interprete.

Linguaggio del compilatore

  • Accetta l'intero programma come singolo input e lo converte in codice oggetto che viene memorizzato nel file.
  • Viene generato il codice oggetto intermedio
  • ad esempio: C, C ++
  • I programmi compilati vengono eseguiti più velocemente perché la compilazione viene eseguita prima dell'esecuzione.
  • Il requisito di memoria è più dovuto alla creazione del codice oggetto.
  • Gli errori vengono visualizzati dopo che l'intero programma è stato compilato
  • Codice sorgente --- Compilatore --- Codice macchina --- Output

Lingua dell'interprete:

  • Accetta una singola istruzione come ingresso singolo ed esegue le istruzioni.
  • Il codice oggetto intermedio NON viene generato
  • ad esempio: Perl, Python, Matlab
  • I programmi interpretati vengono eseguiti più lentamente perché la compilazione e l'esecuzione avvengono simultaneamente.
  • Il requisito di memoria è inferiore.
  • Gli errori vengono visualizzati per ogni singola istruzione.
  • Codice sorgente --- Interprete --- Uscita

5

Un compilatore, in generale, legge il codice del computer di un linguaggio di livello superiore e lo converte in codice p o codice macchina nativo. Un interprete viene eseguito direttamente da p-code o da un codice interpretato come Basic o Lisp. In genere, il codice compilato viene eseguito molto più velocemente, è più compatto e ha già trovato tutti gli errori di sintassi e molti degli errori di riferimento illegali. Il codice interpretato trova tali errori solo dopo che l'applicazione ha tentato di interpretare il codice interessato. Il codice interpretato è spesso utile per applicazioni semplici che verranno utilizzate solo una volta o al massimo un paio di volte, o forse anche per la prototipazione. Il codice compilato è migliore per applicazioni serie. Un compilatore prima prende l'intero programma, controlla gli errori, lo compila e poi lo esegue. Considerando che, un interprete fa questa riga per riga, quindi prende una riga, la controlla per errori,

Se hai bisogno di maggiori informazioni, basta Google per "differenza tra compilatore e interprete".


3
Umm, non sono sicuro di dove hai preso un po 'di questo oltre le prime due dichiarazioni. Questo era tecnicamente vero diverse generazioni fa con molti linguaggi interpretati, ma a seconda della piattaforma e dell'attenzione ai dettagli è possibile avere codice interpretato che esegue vicino o così come codice compilato per determinate attività.
GrayWizardx

Tenendo presente che linguaggi come Java, C # e JavaScript che stanno quasi invadendo l'intero mondo della programmazione oggi, sarebbe ingiusto affermare che "Il codice compilato è migliore per applicazioni serie".
Sisir

2

È una distinzione molto oscura, e in effetti generalmente non è una proprietà di un linguaggio stesso, ma piuttosto del programma che stai usando per eseguire codice in quel linguaggio.

Tuttavia, la maggior parte delle lingue viene utilizzata principalmente in una forma o nell'altra, e sì, Java è essenzialmente sempre compilato, mentre javascript è essenzialmente sempre interpretato.

Compilare il codice sorgente significa eseguire un programma su di esso che genera un file binario eseguibile che, quando viene eseguito, ha il comportamento definito dal sorgente. Ad esempio, javac compila file .java leggibili dall'uomo in file .class leggibili dalla macchina.

Per interpretare il codice sorgente viene eseguito un programma su di esso che produce subito il comportamento definito, senza generare un file intermedio. Ad esempio, quando il tuo browser web carica stackoverflow.com, interpreta un mucchio di javascript (che puoi guardare visualizzando il sorgente della pagina) e produce molti dei bei effetti che queste pagine hanno, ad esempio, upvoting o il piccolo notificatore barre nella parte superiore.


Mentre Java prima si traduce in bytecode e solo durante l'esecuzione la JVM lo converte in codice macchina; è corretto dire che è compilato e non interpretato?
Sisir

1
Immagino che tu possa dire che il bytecode Java è interpretato, certo, ma nessuno scrive bytecode Java. Java stesso è solitamente compilato in bytecode.
Personman

2

Il linguaggio interpretato viene eseguito in fase di esecuzione secondo le istruzioni come nello scripting di shell e il linguaggio compilato è quello che viene compilato (modificato in linguaggio Assembly, che la CPU può comprendere) e quindi eseguito come in c ++.


0

Come altri hanno detto, compilati e interpretati sono specifici per un'implementazione di un linguaggio di programmazione; essi sono non inerenti alla lingua. Ad esempio, ci sono interpreti C.

Tuttavia, possiamo (e in pratica lo facciamo) classificare i linguaggi di programmazione in base alla sua implementazione più comune (a volte canonica). Ad esempio, diciamo che C è compilato.

Innanzitutto, dobbiamo definire senza ambiguità interpreti e compilatori:

Un interprete per la lingua X è un programma (o una macchina, o solo qualche tipo di meccanismo in generale) che esegue qualsiasi programma p scritto in linguaggio X tale che esegue gli effetti e valuta i risultati come prescritto dalle specifiche di X .

Un compilatore da X a Y è un programma (o una macchina, o solo un qualche tipo di meccanismo in generale) che traduce qualsiasi programma p da un linguaggio X in un programma semanticamente equivalente p ' in un linguaggio Y in modo tale che interpretando p ' con un interprete per Y produrrà gli stessi risultati e hanno gli stessi effetti come interpretare p con un interprete per X .

Si noti che dal punto di vista del programmatore, le CPU sono interpreti macchina per il rispettivo linguaggio macchina nativo.

Ora, possiamo fare una classificazione provvisoria dei linguaggi di programmazione in 3 categorie a seconda della sua implementazione più comune:

  • Linguaggi hard compilati: quando i programmi sono compilati interamente in linguaggio macchina. L'unico interprete utilizzato è una CPU. Esempio: di solito, per eseguire un programma in C, il codice sorgente viene compilato in linguaggio macchina, che viene quindi eseguito da una CPU.
  • Linguaggi interpretati: quando non vi è alcuna compilazione di alcuna parte del programma originale in linguaggio macchina. In altre parole, non viene generato alcun nuovo codice macchina; viene eseguito solo il codice macchina esistente. Deve essere utilizzato anche un interprete diverso dalla CPU (di solito un programma) Esempio: nell'implementazione canonica di Python, il codice sorgente viene compilato prima in bytecode Python e poi quel bytecode viene eseguito da CPython, un programma interprete per bytecode Python .
  • Linguaggi Soft Compiled: quando viene utilizzato un interprete diverso dalla CPU, ma anche parti del programma originale possono essere compilate in linguaggio macchina. Questo è il caso di Java, dove il codice sorgente viene compilato prima in bytecode e poi, il bytecode può essere interpretato da Java Interpreter e / o ulteriormente compilato dal compilatore JIT.

A volte, i linguaggi compilati in modo soft e hard vengono indicati semplicemente compilati, quindi si dice che C #, Java, C, C ++ siano compilati.

All'interno di questa categorizzazione, JavaScript era un linguaggio interpretato, ma è stato molti anni fa. Al giorno d'oggi, è compilato JIT nel linguaggio macchina nativo nella maggior parte delle principali implementazioni JavaScript, quindi direi che rientra nei linguaggi compilati soft.

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.