2013-08-08 15 views
35

È vero che il primo compilatore C è stato scritto in C? Quindi, come è stato eseguito e compilato? Oppure, questo compilatore è stato scritto in linguaggio assembly?Come è stato scritto il primo compilatore C?

+5

Quale c-compilatore? – nic

+14

[bootstrap] (http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29) –

+0

Vuoi dire bootstrap del primo compilatore C? O di compilatori C in generale? –

risposta

11

Il primo compilatore C non è stato scritto in C, in genere quando si scrive un compilatore si utilizza il linguaggio assembly o un altro linguaggio di programmazione ed è normale che dopo la prima compilazione il compilatore venga riscritto nella propria lingua nativa.

C'è un sacco di linguaggi di programmazione che sono stati scritti in C poi riscritto nella loro lingua madre: Java per esempio, Ada ...

+3

In realtà non conosco l'ultima volta che un compilatore è stato scritto in assembly. Credo che presto alla fine degli anni '60 sia passato di moda. Mentre almeno alcuni dei compilatori degli anni '50 erano scritti in assembly (il famoso primo compilatore di Hopper per la lingua A-0 nel 1952 e il FORTRAN IBM (Backus et team) nel 1957. Entro il 1960 almeno un compilatore, ovvero il compilatore COBOL per UNIVAC-II è stato scritto in FLOW-MATE Src: [Storia della compilazione del compilatore] (https://en.wikipedia.org/wiki/History_of_compiler_construction) Da allora la maggior parte è stata avviata da linguaggi di alto livello esistenti. – mctylr

+0

Ciao, in il compilatore c legacy: https://github.com/mortdeus/legacy-cc possiamo vedere che il punto di ingresso è una macro scritta di assembly e la base di codice è il 17% assembly. –

+0

Ho sfiorato il legacy-cc come beh, credo che la parte di assemblaggio sia necessaria perché deve produrre un assembly a un certo punto: penso che l'assembly in legacy-cc sia principalmente il template che verrà generato dal compilatore, ma vorrei anche sottolineare che assembly non è necessariamente per essere evitato come un parassita, Chris Sawyer è sai d aver sviluppato Roller Coaster Tycoon in assemblea! Se padroneggi la lingua, può anche essere produttiva. –

61

E 'descritto molto bene nel Dennis Ritchie's writeup della storia linguaggio C.

Dare solo un riassunto di ciò che ha scritto lì, utilizzare il suo articolo per i dettagli più fini. C è iniziato con il linguaggio BCPL, Ken Thomson ha avuto accesso a un compilatore per esso che ha funzionato sul frame principale General Electrics 635. Insoddisfatto del linguaggio, Thomson ha utilizzato BCPL per scrivere un compilatore per il linguaggio B, un passo evolutivo oltre BCPL che ha rimosso alcuni dei problemi tecnici in BCPL.

hanno usato B per creare programmi sul loro PDP-7 minicomputer, sebbene la maggior parte di loro erano piccoli capacità hardware più di programmi di giocattoli, la macchina era molto limitate. Un importante passo compiuto da Thomson è stato quello di riscrivere il compilatore B in B stesso. Un passo di avvio automatico comune.

Questo compilatore è stato poi a poco a poco ottimizzato, attraverso un passaggio intermedio di breve durata chiamato NB (New B) per avviare assomigliante C. Il minicomputer PDP-11 è stato fondamentale per questo passo, dando loro spazio sufficiente per migliorare la lingua e compilatore . Nota del

+18

Qualcuno ha messo una delle prime versioni di PDP-11 di Dennis Ritchie su github per i posteri: https://github.com/mortdeus/legacy-cc [source] (http://thechangelog.com/explore-a-piece-of- unix-history-dennis-ritchies-earliest-c-compilers /) – sehe

+2

Ugh, ora ho bisogno di scoprire cosa ha fatto la funzione waste() ... –

+0

Wow. Sembra un trucco interessante :) _ (Per un momento ho pensato che fosse un segno di garbage collection nel compilatore C effimero: <) _ – sehe

4

Reading Dennis Ritchie su primevalC indica che, un po 'come l'uovo e la gallina, C si è evoluto da un linguaggio precursore insieme con il proprio compilatore via bootstrap. I tempi di speciazione erano più veloci di quelli di Gallus gallus domesticus.

si può anche vedere il codice sorgente del compilatore catturato nel mezzo delle turbolenze evolutiva. La nota collega a due istantanee di esso ripristinate da backup su nastro. Questo codice ha anche been placed on github. Queste istantanee costituiscono fossili intermedi, anni prima della sintassi K & R. Descrizione Dennis' di uno dei nastri dimostra che è un fermo immagine di struct essere bootstrap:

'prestruct-c' è una copia del compilatore poco prima ho iniziato a cambiare in modo da utilizzare si struttura.

In altre parole il compilatore era stata aumentata a supporto le strutture, ma non aveva ancora uso loro. Un buon momento per fare un backup su nastro ...

Problemi correlati