Cosa significa che "la lingua A è scritta nella lingua B"?


31

Sento spesso il termine che la lingua A è scritta nella lingua B. Ad esempio, PHP è stato scritto C , C # è scritto in C ++ .

Qualcuno può spiegare cosa significa e se è anche corretto? Ha qualcosa a che fare con il compilatore di interprete usato dalla lingua?

Inoltre, quali sono i fattori su cui si basa la scelta del linguaggio di attuazione?


19
A rigor di termini, "PHP è stato scritto in C" è sbagliato. Una lingua è di per sé una definizione formale, quindi non è scritta in un'altra lingua del programmatore (ma piuttosto in inglese); solo il compilatore, l'interprete e / o la libreria possono essere scritti in C, C ++ o altro. In pratica, per molte lingue esiste un compilatore o un interprete dominante e la distinzione tra definizione della lingua e implementazione non viene fatta.
user281377

È interessante notare che BCPL è stato per lo più scritto in BCPL
OldCurmudgeon il

7
PHP "di per sé", non è una definizione formale. È un programma C.
Kaz,

8
s/written/implemented/ed è molto più chiaro.
TMN,

2
@ugoren C'erano molti compilatori C scritti in assemblea. Non tanto in questo secolo, però.
Ross Patterson,

Risposte:


30

La maggior parte dei linguaggi di programmazione rientrano in due categorie: linguaggi interpretati e compilati.

Un linguaggio compilato viene tradotto da un compilatore in codice macchina , il linguaggio che la CPU esegue direttamente passo dopo passo. Una lingua interpretata, d'altra parte, utilizza un intermediario, un interprete , per eseguire il codice della lingua. L'interprete è esso stesso un altro programma, solitamente compilato a sua volta in codice macchina.

PHP è un linguaggio interpretato. È necessario un programma separato per eseguire il codice PHP, il computer non esegue direttamente il programma. Quel programma separato, l'interprete PHP, è esso stesso scritto in C.

C # è un linguaggio compilato, ma non è compilato per il codice macchina. Invece, viene compilato in un linguaggio specialistico, codice byte, per essere eseguito su una macchina virtuale. Java è un altro esempio di tale configurazione. Potresti vederlo come un ibrido tra compilazione e interpretazione, in cui la macchina virtuale è un interprete. La macchina virtuale per C # (CLI o Common Language Infrastructure ) è scritta in C ++.

Altri esempi sono:

  • Python: l'interprete Python compila il codice Python in bytecode Python, quindi interpreta il bytecode. L'interprete stesso è scritto in C. Da allora sono state aggiunte nuove implementazioni, tra cui una che compila python per essere eseguita sulla stessa CLI utilizzata per C #, chiamata IronPython , e una che gira sulla macchina virtuale Java, Jython . Per completare il cerchio, esiste una versione di Python scritta in (un sottoinsieme di) Python, PyPy .
  • Ruby: Ruby è nato come un linguaggio interpretato puro, ma la versione più recente è passata all'utilizzo del bytecode. Anche per Ruby esiste un progetto che si compila alla CLI, chiamato IronRuby , e uno per Java VM, JRuby .

Mi dispiace, in che modo una macchina virtuale è diversa da un interprete? Non vedo come l'utilizzo di uno sia un punto a metà della compilazione. Stai dicendo che il bytecode è metà compilato?
Filippo,

1
@Philip: il codice byte non è un codice macchina; quindi invece di fornire alla CPU istruzioni dirette è ancora necessario un interprete per prendere il codice byte e interpretarlo, tradurlo in istruzioni macchina. Il vantaggio è che la macchina virtuale è più semplice da trasferire ad altre architetture e puoi applicare trucchi come la compilazione JIT .
Martijn Pieters,

Qualcuno ritiene che il termine "compilato" sia stato diluito a fini di marketing?
Filippo,

2
Whoa! Me lo riprendo. Stavo percorrendo la strada sbagliata lì per un po '. Ho presunto che "compilato" significava trasformarsi in codice macchina e solo codice macchina, il che non è in realtà vero. È solo un termine per tradurre il codice in altro codice. Sia quel codice macchina, bytecode o qualunque lingua tu voglia. Inoltre, risulta che ci sono compilatori PHP là fuori, quindi puoi solo dire che è "tipicamente" interpretato.
Filippo,

Anche una buona fonte: youtube.com/watch?v=e4ax90XmUBc
Adam

34

Hai fondamentalmente ragione. Se si dice che Ruby è scritto in C, ciò significa che l'interprete linguistico e parti della libreria principale sono scritti in C.

Quindi l'interprete Ruby è un programma C che accetta un file di testo come input, lo elabora e quindi chiama le funzioni che si trovano in un altro file di testo (se scritto in Ruby) o che sono compilate in codice C, come gran parte delle funzionalità di base che richiedono per accedere direttamente alle risorse di sistema come memoria, file system e altro. E alcune funzioni che richiedono prestazioni molto elevate.

Quindi hai parti diverse di una lingua che possono o devono essere scritte in altre lingue. Nulla ti impedirebbe di scrivere l'interprete in C e le librerie in C ++ (anche se forse rendere alcune cose più difficili). Potresti anche avere più passaggi e utilizzare un linguaggio molto efficace nell'elaborazione del testo per generare alcuni dati intermedi che vengono quindi elaborati da un codice C.

I fattori per la decisione possono essere gli stessi di altre applicazioni complesse. Le prestazioni sono una. La possibilità di scrivere codice in grado di accedere direttamente alle risorse di sistema un altro. Quindi nella maggior parte dei casi deve essere un linguaggio compilato (anche se in teoria potresti scrivere un interprete Ruby in Python). La disponibilità su sistemi diversi è importante se si desidera che la propria lingua venga eseguita su Linux, Win, OS X e altri.


Qualcuno sa perché vedo tre voti per la mia risposta nel momento in cui l'ho pubblicata?
Thorsten Müller,

1
Ne vedo quattro ora, ma non sono proprio sicuro di cosa tu stia chiedendo? I voti sono apparsi troppo in fretta? In tal caso, beh, molti occhi sulla domanda (tre risposte quasi simultanee) e la tua risposta è buona.
yannis,

Si Forse l'avevo salvato e poi modificato, salvato di nuovo e dimenticato il primo salvataggio (sto invecchiando). Per me è sembrato come se avessi ricevuto i primi tre voti nel momento in cui ho pubblicato.
Thorsten Müller,

@ thorstenmüller +1 per "Nulla ti impedirebbe di scrivere l'interprete in C e le librerie in C ++" Stavo per chiederti di questo. Esistono implementazioni famose per questo in cui l'interprete / compilatore è in una lingua mentre le librerie principali sono in un'altra lingua?
Songo,

@ thorstenmüller L'ho fatto accadere occasionalmente alcune volte. Se alcuni utenti stessero visualizzando la domanda quando hai pubblicato, ci sarebbe un piccolo messaggio che dice "Una nuova risposta è stata pubblicata" entro un secondo o due da te che hai inviato, quindi avrebbero potuto scremare l'intera risposta e votare entro 10 secondi del tuo post. Inoltre, le modifiche apportate entro 5 minuti dalla pubblicazione della risposta non vengono visualizzate nella cronologia delle modifiche, il che potrebbe aver causato ulteriore confusione da parte tua.
Izkata,

10

Significa semplicemente che la maggior parte del nucleo della lingua A è scritta nella lingua B. Quale "nucleo della lingua A" potrebbe differire da una lingua all'altra, ma in termini generali indovina, significa che è un compilatore o un interprete. Il fattore decisivo nella scelta di una lingua in cui scrivere un'altra lingua è, come in quasi tutti i progetti, quali lingue conoscono maggiormente gli sviluppatori.

Detto questo, "la lingua A è scritta nella lingua B" è una semplificazione eccessiva per la maggior parte delle lingue moderne. Se prendiamo Python come esempio, mentre l'implementazione di riferimento, CPython , è stata effettivamente scritta in C, ci sono implementazioni scritte in altre lingue, come Jython (scritto in Java), IronPython (scritto in C #), PyPy (scritto in Python), CLPython (scritto in Common Lisp), Stackless Python (scritto in C e Python) e Unladen Swallow (scritto in C ++).

Un linguaggio di programmazione è una definizione e, come mostra l'esempio di Python, in realtà non ci sono restrizioni sui linguaggi in cui il suo compilatore, interprete e librerie possono essere scritti. E naturalmente è anche possibile che un linguaggio sia scritto in se stesso, attraverso un processo chiamato bootstrap .


2
Non definirei Psyco un'altra implementazione, poiché funziona come estensione di CPython.
Martijn Pieters,

@MartijnPieters È anche un progetto morto, secondo il suo sito. Rimosso.
yannis,

@YannisRizos Anche Unladen Swallow non è morto ?
Andres F.

1
@Songo: A parte questo string.lower(s)è una funzione Python che lo delega a return s.lower(), che è corretta. Le operazioni di stringhe di stringhe CPython 3.3 sono implementate in C.
Martijn Pieters il


3

Dal punto di vista dell'uso di un linguaggio di programmazione, un linguaggio di programmazione è solo un programma. Potrebbe essere un compilatore, o potrebbe essere un interprete, oppure potrebbe essere una sorta di macchina virtuale. Tutte queste cose sono solo programmi per computer e quindi possono essere scritte in qualsiasi lingua.

Quindi, se si desidera creare la propria versione di PHP, è possibile iniziare con qualsiasi lingua in cui si è più fluenti. Si dovrebbe quindi scrivere un programma in grado di leggere il codice in formato PHP e fare qualunque cosa le specifiche PHP dicono che il programma dovrebbe fare . Stai quindi creando il linguaggio PHP nel linguaggio X.


Punto interessante Quindi fondamentalmente se ho una funzione integrata in PHP explodeche accetta un Stringe restituisce un Array, la sua implementazione (cioè il codice che opererà sulla stringa per produrre l'array) è scritta in C , giusto?
Songo,

@Songo: corretto. Ancora una volta, PHP è solo un programma, non diverso da Word o Apache o Notepad o vi o emacs. Legge i dati e li analizza secondo una specifica della lingua, quindi fa qualunque cosa la specifica della lingua dice che dovrebbe fare.
Bryan Oakley,

Questa risposta mescola male il linguaggio con l'implementazione.
Russell Borogove,

Penso che questa sia la risposta più semplice e diretta e non vedo come si confonde qualcosa. Suggerisce persino che potrebbe esserci più di un'implementazione di PHP. Ce ne sono infatti diversi, il PHP originale e il cosy di Facebook, e potrebbero essercene altri.
Warren P,

@RussellBorogove: non pensi che "dal punto di vista dell'uso di un linguaggio di programmazione" aiuti a chiarire la risposta? Ricorda, abbiamo a che fare con un principiante assoluto con questa domanda, quindi sacrificare un po 'di precisione per illustrare il punto è giusto, IMO.
Bryan Oakley,

3

Una frase molto simile con un significato completamente diverso è "scrivere la lingua A nella lingua B", ad esempio "scrivere C in Java".

Questo descrive un codice sintatticamente corretto in una lingua, ma utilizza strutture, modi di dire e convenzioni di un'altra lingua. Nell'esempio "scrivere C in Java", i segni di ciò significherebbero dichiarare tutte le variabili locali in cima a ciascun metodo, usando costanti intere invece di enum, usando identifiers_with_underscores, ecc.

In genere questo accade quando qualcuno ha lavorato con una lingua per molto tempo (specialmente quando ha lavorato solo con quella lingua) ed è molto nuovo nella lingua corrente (o non è interessato a scrivere codice pulito).


"CPython è scritto in C" sicuramente non significa "questo utente scrive in Python come se fosse C". Significa che CPython (Python.exe su Windows, / usr / bin / python su Unix) è scritto in C.
Warren P

@ Warren P: certo, ma le frasi sono molto simili, quindi le persone che non hanno familiarità con nessuno dei due potrebbero facilmente finire qui alla ricerca di una spiegazione.
Michael Borgwardt,

3

La tecnologia è un processo intrinsecamente iterativo. Iniziamo con strumenti semplici e quindi li usiamo per crearne di migliori. Le prime lingue di assemblaggio erano praticamente traduzioni 1: 1 dei codici standardizzati di istruzioni per il chip; l'architettura 8086 e il suo assemblatore sono diventati dominanti su altre architetture come Z80, RISC, ecc., e così abbiamo iniziato a sviluppare linguaggi che potrebbero essere digeriti in assembly 8086, come FORTRAN, COBOL, Pascal e C. Il programma che interpreta il codice sorgente di queste lingue devono essere scritte in qualcosa di più primitivo, altrimenti si finisce in una discussione a base di gallina e uovo; se il codice sorgente per il primo compilatore C è stato scritto in C, che cosa ha compilato quel codice sorgente C e che, per definizione, non sarebbe il primo compilatore C?

Fondamentalmente, "C # è scritto in C ++" dovrebbe essere inteso nel senso che il primo e / o più popolare compilatore e librerie di runtime / core che obbediscono alle specifiche del linguaggio C # (che sono Microsoft .NET Framework e il compilatore da riga di comando programma CSC.exe) sono scritti in C ++.


0

"La lingua A è scritta nella lingua B" significa che l'unica implementazione della lingua A (o l'unica ampiamente utilizzata) è quella che è in realtà un progetto sviluppato nella lingua B e l'unica completa, aggiornata la specifica di A è il codice sorgente B che lo implementa in modo tale che se la documentazione e il programma B non sono d'accordo, il programma B viene generalmente considerato corretto.


Non esiste un'implementazione autorevole di C ++. Nel caso di C ++, la specifica è corretta e il comportamento indefinito nella specifica può fare qualsiasi cosa nella tua implementazione. Quindi no, questo non è corretto.
Warren P,

Non vedo cosa ha a che fare il commento precedente con la mia risposta. Non ho fatto alcuna dichiarazione universalmente quantificata su tutte le lingue, quindi il controesempio C ++ non è applicabile. Una dichiarazione del formato "A è scritta in B", dove A è "C ++", non ha senso, tranne quando B è "inglese".
Kaz,
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.