Come sono progettati i linguaggi di programmazione? [chiuso]

5

Dopo aver fatto un po 'di programmazione, sono diventato piuttosto curioso sulla progettazione del linguaggio stesso. Sono ancora un novizio (lo sto facendo da circa un anno), quindi la maggior parte del mio codice riguarda solo due campi (progettazione GUI in Python e algoritmi di base in C / C ++). Sono rimasto incuriosito da come sono scritte le stesse lingue stesse. Intendo questo in entrambi i sensi. Ad esempio come è stato scritto letteralmente (cioè, in quale lingua è stata scritta la lingua). Oltre a varie funzionalità come la spaziatura bianca (Python) o l'orientamento degli oggetti (C ++ e Python).

Dove inizieresti a imparare come scrivere una lingua? Quali sono alcuni dei fondamenti del design del linguaggio, cose che lo renderebbero un linguaggio "completo"?

    
posta RectangleTangle 01.03.2011 - 11:07
fonte

6 risposte

4

Ci sono molti modi per capire come sono costruiti i compilatori. Nella più semplice definizione i compilatori sono programmi che prendono il codice sorgente e lo convertono in un modulo valido eseguibile in una forma o in un'altra (linguaggio VM o macchina).

Quindi per convertirli, deve prima capirli. È come il programma di compilazione che scrivi deve comprendere con successo milioni di possibili combinazioni di programmi validi che possono essere scritti nella lingua. Ecco perché per capirli deve ...

a. Analizzali : questo passaggio è composto da molti passaggi. Dal momento che il programma può contenere dati e altre cose. Deve prima riconoscere i token lessicali validi (quelli che chiami parole chiave). Per fare ciò è necessario leggere i caratteri uno per uno e quindi confrontarli con un modello. È così, come riconosci che una frase è una dichiarazione inglese valida? Prendi le regole della grammatica inglese e applica al vocabolario in questione.

Una cosa simile accade all'interno dei compilatori. C'è qualcosa chiamato come grammatica della lingua! Che definisce fondamentalmente ciò che è sintatticamente legale. Ora scrivere un parser per ogni grammatica che viene giù è laborioso manualmente e non pratico. Quindi ci sono generatori di parser. Funzionano, prendendo una grammatica e generando un parser per questo. Come appare il parser? Ci sono molti modi per farlo, partendo dall'uso delle espressioni regolari alla lettura di ciascun personaggio uno per uno e facendo corrispondenze fino a quando si incontra un token lessicale valido.

b. Dai un senso a ciò che è stato letto : puoi formulare una frase grammaticalmente valida, ma non ha senso. La stessa cosa deve essere controllata anche in un compilatore. Cosa significa la notazione della sintassi ... Questo non è altro che semantica.

c. Ora cosa significa, ora vuoi dire lo stesso in altre lingue : qual è l'equivalente di ciò che ho appena analizzato in Assembly. È come se tu ora analizzassi e riconoscessi perfettamente diciamo un'istruzione if. Ora lo prendi convertendolo in equivalente di quello in assembly.

d. Nel frattempo ottimizza, cosa puoi ottimizzare : se sono disponibili ottimizzazioni di codice ragionevoli, fallo.

Questa è una breve panoramica dei compilatori che lavorano in linguaggio comune. Naturalmente c'è molto da fare. Puoi scrivere dei volumi (e ci sono dei volumi, già scritti).

Che cosa dovresti fare:

  1. Leggi alcune buone teorie sui compilatori. Raccomandato il libro del drago.
  2. Scarica un compilatore opensource. Abbondanza disponibile.
  3. Prova a mappare ciò che hai letto dal libro al codice.
  4. Rompa qualcosa e vedi come funziona.
  5. Aggiungi qualcosa e osserva come funziona.

Quindi:

  1. Scrivi qualcosa da solo.
  2. Cerca problemi interessanti da risolvere e risolverli.
  3. Sfoglia gli elenchi di bug in quei progetti open source, prova a inviare loro le patch.

Ricorda che puoi leggere molto, ma testerai solo quando scrivi il codice. Quindi scrivi il codice. Fallire spesso, imparare da esso. Usa il feedback ... Ripeti il ciclo di nuovo.

    
risposta data 01.03.2011 - 12:22
fonte
3

Come con la programmazione "normale", LOGO è probabilmente la lingua con cui dovresti iniziare.

Se hai molto tempo, puoi iniziare a scrivere un ingenuo interprete LOGO per primo (probabilmente incontrerai degli ostacoli e commetti alcuni errori comuni, ma questo è il punto centrale di questo esercizio).

Il prossimo passo è vedere come funziona l'analisi senza contesto, i parser LL (k) / LR (k) / Earley, gli AST e così via.

Ovviamente questo è solo il primo passo per elaborare il codice sorgente, ma una volta ottenuto, puoi passare alle tabelle dei simboli e probabilmente scrivere un compilatore LOGO-to-C (potresti ovviamente compilare direttamente il codice macchina, ma a questo punto non aggiungerebbe molto alla "sensazione" mentre si effettua il debug di un incubo).

Potrai facilmente trovare la tua strada da lì. :)

    
risposta data 01.03.2011 - 11:52
fonte
3

Se vuoi farlo nel modo giusto, ti consiglio di iniziare leggendo i seguenti libri:

link

link

E per favore, non iniziare con il libro di Dragon. È obsoleto e incentrato sull'analisi. Dovresti leggerlo in qualsiasi modo, ma non ora.

    
risposta data 01.03.2011 - 12:08
fonte
2

Puoi iniziare con l'implementazione di Python se lo desideri, è solo C. Se vuoi qualcosa di più semplice dai un'occhiata a SIOD (Schema in one Defun) è un'implementazione di schema di ingombro molto ridotto. Poiché Scheme ha una sintassi così semplice, è molto facile capirlo.

In realtà ora che ci penso Struttura e interpretazione dei programmi per computer include un'implementazione completa dello schema. Quindi potrebbe essere un buon punto di partenza. E ti insegnerà molto.

    
risposta data 01.03.2011 - 11:48
fonte
0

Pochissime delle lingue popolari odierne sono il prodotto di un design completo e all'avanguardia. Invece, c'è stata un'implementazione iniziale da parte di una o due persone che erano frustrate in qualche modo con le lingue disponibili. Poi alcune altre persone lo hanno provato e apprezzato, e nel tempo sono state aggiunte funzionalità. Alla fine alcune funzionalità desiderabili non possono essere aggiunte senza rompere i programmi esistenti. Quindi qualcuno crea una nuova lingua.

La completezza è parzialmente una questione di opinione, ma non totalmente. Paul Graham ha scritto un bel articolo sul potere relativo dei linguaggi di programmazione, introducendo un'idea ampiamente conosciuta come Blub Paradox .

    
risposta data 01.03.2011 - 14:34
fonte
0

Suoni snob, ma se devi chiedere, non dovresti proprio.

Come in arte concettuale , è necessario imparare tutto ciò che è stato fatto nel campo sin dall'inizio di java (e io Ho detto sin dalla nascita, un paio di anni fa) per ottenere un linguaggio decente giusto.

E rischi ancora di emettere un inutile colosso che non può essere applicato con successo ad alcun dominio interessante.

... o un altro dialetto lisp o un altro coffeescript . (vedi, quelli hanno applicazioni pratiche e di solito sono concettualmente validi, ma poi di nuovo, messi in prospettiva, di solito capita di sollevare più problemi di quello che risolvono, e peggiorare i problemi non è un buon motivo per scrivere una nuova lingua )

    
risposta data 12.01.2012 - 03:20
fonte

Leggi altre domande sui tag