Perché C ++ scrivere un compilatore?

15

Mi chiedevo perché C ++ fosse una buona scelta per scrivere un compilatore. Ovviamente C è utile anche per questo scopo, perché molti compilatori sono scritti in C o C ++ ma questa volta sono più interessato al C ++. Qualche buona ragione? Lo stavo cercando su Internet, ma non trovo nessun buon motivo.

    
posta Kobra 26.05.2012 - 05:14
fonte

6 risposte

21

C ++ ha due lati. Ha un lato di sviluppo di basso livello che lo fa sembrare un linguaggio naturale per fare cose di basso livello come la generazione di codice. Ha anche un lato di alto livello (che C non lo fa) che ti permette di strutturare un'applicazione complessa (come un compilatore) in modo logico, orientato agli oggetti, mantenendo comunque le prestazioni. Poiché presenta sia aspetti di livello basso che di alto livello, è una buona scelta per applicazioni di grandi dimensioni che richiedono funzionalità o prestazioni di basso livello.

    
risposta data 26.05.2012 - 07:27
fonte
10

La mia esperienza non è d'accordo con la tua premessa qui. In effetti, per i linguaggi di alto livello di carattere generale, è una pratica molto comune scrivere il compilatore nella stessa lingua della lingua di origine (il linguaggio che viene compilato). Ad esempio:

  • Il compilatore Java di Sun è scritto in Java
  • Il compilatore Scala è scritto in Scala
  • Il compilatore C # di Mono è scritto in C #
  • Il compilatore Smalltalk di Squick è scritto in Smalltalk
  • ... e molti altri

Un'eccezione è costituita dai front-end del compilatore scritti per framework di compilatori esistenti, come GCC, LLVM o Polyglot, che vengono poi scritti nel linguaggio del framework o compilatori che si basano su generatori di parser esistenti come Yacc. Poiché GCC, LLVM e Yacc sono strumenti comuni e consolidati scritti in C e C ++, dà un incentivo agli scrittori di compilatori per usarli, il che potrebbe portare a C e C ++ a ottenere una grande quota nella distribuzione del linguaggio di implementazione del compilatore.

    
risposta data 26.05.2012 - 12:09
fonte
5

Per compilare cosa a cosa? Un compilatore trasforma un codice sorgente da una lingua (lingua di origine) con un'altra (lingua di destinazione), che non indica nulla riguardo al basso livello della lingua di destinazione.

  • CoffeeScript viene compilato su JavaScript, il compilatore viene scritto in CoffeeScript.
  • Script # compila C # in JavaScript, il compilatore viene scritto in, se ricordo bene, C #.
  • ecc.

La lingua scelta per scrivere un compilatore dipende dal contesto. Ad esempio, lavorando su un progetto che compila un linguaggio derivato da PHP a un codice PHP nativo, ho usato un mix di PHP e C # per scrivere il compilatore, perché ha più senso per me dato le mie capacità. Un'altra persona sceglierebbe Python, o Java e PHP o C ++ con un po 'di JavaScript, o qualsiasi cosa.

C o C ++ è una scelta popolare grazie al supporto degli strumenti relativi al compilatore (vedi la risposta di Telastyn), e perché queste due lingue ti permettono di diventare davvero nativo. Ma non c'è nulla di sbagliato nella scelta di un'altra lingua.

Nota che per essere più geek , puoi scegliere la lingua di partenza per scrivere il compilatore stesso. È quello che è successo per il compilatore CoffeeScript e molti altri compilatori. È anche popolare con gli IDE: uno dei primi Visual Studio è stato creato utilizzando lo stesso Visual Studio.

    
risposta data 26.05.2012 - 07:26
fonte
5

Tendo a mettere in discussione le premesse di base qui. Mentre C e C ++ funzionano perfettamente per la scrittura di compilatori, alcuni altri linguaggi sembrano funzionare perfettamente anche per l'attività.

Un po 'dipende dalla lingua che stai compilando. Per linguaggi piccoli e semplici, C e Pascal funzionano molto bene. Se stai per compilare qualcosa di grande e complesso, anche il tuo compilatore diventa grande e complesso - nel qual caso, le funzionalità extra di C ++ per organizzare e lavorare con programmi più grandi sono ovviamente utili. Tuttavia, non è molto specifico per la compilazione, solo funzioni utili per programmi più grandi in generale.

Penso che valga la pena di menzionare un altro punto. I principianti (sembrano) pensano ai compilatori come a fare la manipolazione del testo, quindi pensano che qualcosa come Perl sarà di grande aiuto nella scrittura di compilatori. In realtà, la maggior parte delle parti interessanti della compilazione non si avviano realmente fino a quando non hai creato il tuo AST. Mentre sono certo che Perl può fare il lavoro perfettamente bene, la sua capacità di manipolazione del testo non gli dà un vantaggio enorme (la manipolazione del testo è principalmente nel lexer e generatori di lexer per cose come C che supportano comunque i RE).

    
risposta data 26.05.2012 - 08:01
fonte
4

I compilatori possono essere implementati in qualsiasi lingua moderna. Tuttavia, uno dei requisiti più importanti da un compilatore deve essere veloce.

C ++ ha un chiaro vantaggio qui. L'ottimizzazione in C ++ non è economica. Tuttavia, a causa della natura di basso livello di questa lingua, è possibile ottimizzare manualmente il codice C ++ più che in qualsiasi altra lingua (eccetto Assembly che non è portatile).

    
risposta data 26.05.2012 - 07:25
fonte
1

Ho il sospetto che la motivazione principale per il loro uso sia che l'output di Lex / Yacc / Bison è (principalmente) in C. Dato che è stato lo standard per così tanto tempo, ha un certo slancio.

Non che queste siano particolarmente buone ragioni ...

    
risposta data 26.05.2012 - 06:25
fonte

Leggi altre domande sui tag