2013-04-12 14 views
5

Ho letto più volte che i primi compilatori C++ hanno tradotto il primo codice C++ in plain C prima di compilarlo (o forse aveva bisogno di un compilatore C di terze parti).C++ implementato in chiaro C

Giocando a me stesso con i campi di grammatica/lingua/compilazione, sono curioso di vedere come C++ è stato implementato in plain C, specialmente quello che può essere un modo per implementare l'ereditarietà della classe e il metodo [virtuale] di chiamata.

Potrebbe indicarmi un compilatore di questo tipo che sarebbe ancora disponibile al giorno d'oggi?

so che il codice OO può essere simulato/emulato in C puro con le strutture e le funzioni di puntatori, ma mi piacerebbe vedere una vera e propria implementazione del linguaggio C++ in C.

+1

Ricorda che anche se lo trovi, non sarà C++ come lo conosciamo, ma qualcosa di più semplice. Sospetto che abbia fatto cose come mettere un argomento in più su tutte le funzioni, che era il puntatore del frame. O mantenuto una variabile globale per quella roba. –

+3

http: // stackoverflow.it/questions/737257/code-convert-from-c-to-c – zch

+1

Giusto per essere chiari, con * un'implementazione reale del linguaggio C++ in C *, si intende un compilatore C++ scritto in C, non uno strumento che può traduci C++ in C, giusto? – NPE

risposta

5

Si può provare cfront. È possibile scaricare le vecchie versioni here. Ma supporta solo un sottoinsieme C++ molto limitato. Alcune funzioni come le eccezioni non possono essere implementate in questo modo.

Aggiornamento: Come Maxim Yegorushkin notato eccezioni potrebbero essere attuate con setjmp/longjmp. Ma se ricordo che le eccezioni non possono essere implementate come una libreria in C++. Devono essere parte del linguaggio principale.

+0

_Le eccezioni non possono essere implementate_ non è vero. Le implementazioni precedenti usavano 'setjmp' /' longjmp' per implementare le eccezioni. Questo metodo si svolge lo stack mentre sta cercando un gestore di eccezioni. I moderni compilatori cercano prima il gestore delle eccezioni e se ne viene trovato uno solo si rilassano. Questo è il motivo per cui lo standard C++ dice che dipende dall'implementazione se lo stack viene svolto su un'eccezione non gestita. Ovviamente, il nuovo comportamento è più conveniente per l'utente poiché gli oggetti non sono stati distrutti quando si esamina il core dump. –

1

Il primo compilatore Microsoft C++ era esattamente come lo descrivete, lo so perché ricordo di averlo usato. Dalla mia memoria, I penso era la versione 7 del loro compilatore C. Questo sarebbe stato intorno al 1992 (più/meno 2 anni).

Update: vedi http://en.wikipedia.org/wiki/Visual_C%2B%2B, quello che mi riferisco al è stato infatti rilasciato nel 1992 e chiamato "C/C++ 7.0"

2

se si desidera solo per vedere come C++ può essere tradotta in C poi si deve diverse opzioni disponibili e le domande frequenti su C++ ha una sezione che copre questo here. Copre tutte le principali opzioni che abbia mai visto suggerito e dovrebbe essere aggiornato quando sono disponibili nuove opzioni.

2

Comeau compiler funziona in questo modo. Nel suo periodo di massimo splendore tutti hanno elogiato la conformità standard e hanno utilizzato Comeau online per testare frammenti di codice, ma pochi lo utilizzavano per creare codici di produzione.

EDGE frontend funziona anche in questo modo. Ho sentito che è usato sia dal compilatore Intel C++ sia da Comeau.

0

Ecco come ha funzionato l'implementazione originale di C++, denominata cfront. Era un front end per un compilatore C. Non è così comune in questi giorni, anche se il front-end C++ di EDG può essere configurato con un backend C in modo che generi codice C. Questo è utile quando stai facendo girare un nuovo compilatore, ma in un compilatore di produzione è un passo sprecato, quindi i compilatori commerciali di solito vanno direttamente alla forma preferita della piattaforma di destinazione. E tu davvero non vuoi dover eseguire il debug del tuo programma leggendo il codice C generato. Non l'ho fatto per C++, ma quando ho lavorato in Dinkumware abbiamo implementato le librerie di base Java in combinazione con lo sviluppo di Java sviluppato da EDG. Il codice C è strutturato logicamente, ma assomiglia molto a LISP: un sacco di parentesi infernali stupide.