View Full Version : [CURIOSITA'] Come si scrive un linguaggio?
>|HaRRyFocKer|
16-11-2005, 16:21
Sto seguendo all'università il corso di elementi di Informatica in cui sto studiando il c(++).
Ora che so che per scrivere un "programma" c'è bisogno di un linguaggio di programmazione, mi ponevo la suddetta domanda. Come si scrive? Si usa un linguaggio precedente? Se si, il primo linguagigo come è stato scritto?
Tutto questo su rieduchescional sciannel! :sofico:
Grazie a chi mi risponderà...
franksisca
16-11-2005, 17:01
guarda, non mi reputo in grado di spiegartelo, ma ti consiglio di trovare "linguaggi e Traduttori"
Si usa un linguaggio per il quale esista un interprete. Per implementare il primo compilatore C (non conosco di preciso la storia, ma posso tirare ad indovinare), avranno usato un assembler, per il C++ il C e così via. Chiaro che puoi usare qualcunque linguaggio esistente per implementare il nuovissimo linguaggio ultra-figo X. Anzi, puoi usare anche il linguaggio stesso, una volta che hai pronto il "core".
La teoria dei compilatori è una branca piuttosto esoterica, ma molto affascinante. Se vuoi farti del male gratuitamente, studiala pure :)
Comincia con lo scrive un programma che dica se un espressione del tipo (3 * (9 + 15)) / 2 è corretta (come in questo caso) oppure no...scoprirai che non è tanto banale :)
EDIT: ho parlato di 'interprete', ma non fa molta differenza (a questo livello di discussione) con i linguaggi compilati.
DarkRevenge
16-11-2005, 20:30
Si usa un linguaggio per il quale esista un interprete. Per implementare il primo compilatore C (non conosco di preciso la storia, ma posso tirare ad indovinare), avranno usato un assembler, per il C++ il C e così via. Chiaro che puoi usare qualcunque linguaggio esistente per implementare il nuovissimo linguaggio ultra-figo X. Anzi, puoi usare anche il linguaggio stesso, una volta che hai pronto il "core".
La teoria dei compilatori è una branca piuttosto esoterica, ma molto affascinante. Se vuoi farti del male gratuitamente, studiala pure :)
Comincia con lo scrive un programma che dica se un espressione del tipo (3 * (9 + 15)) / 2 è corretta (come in questo caso) oppure no...scoprirai che non è tanto banale :)
EDIT: ho parlato di 'interprete', ma non fa molta differenza (a questo livello di discussione) con i linguaggi compilati.
Quoto shinya e aggiungo questo link [click] (http://it.wikipedia.org/wiki/Linguaggio_di_programmazione#Storia) che chiarisce forse un po' di più i vari "rami di discendenze" dei linguaggi di programmazione.
Come giustamente ha detto shinya, il C è nato dall'assembly, nel momento in cui si è deciso di creare un linguaggio molto più semplice (ma allo stesso tempo a basso livello come l'assembly) per riscrivere una primissima versione del codice di Unix scritta interamente in assembly. Tutto questo se la memoria non mi inganna ;)
jappilas
16-11-2005, 21:11
il C è nato dall'assembly,
1) non tanto il C, quanto il suo compilatore: progettare un linguaggio implica definirne sintassi e semantica, costruendo una grammatica e le relative mappature, realizzare un compilatore equivale a codificare l' algoritmo che prendendo un testo lo analizza secondo la grammatica di cui sopra e lo trasforma in codice oggetto, per far questo si userà un altro linguaggio tra quelli esistenti
2) non tanto "dall", quanto "in": mancando altri compilatori si dovette usare direttamente il codice macchina , ma non si ha "parentela" tra assembly e C
The3DProgrammer
16-11-2005, 23:50
1) non tanto il C, quanto il suo compilatore: progettare un linguaggio implica definirne sintassi e semantica, costruendo una grammatica e le relative mappature, realizzare un compilatore equivale a codificare l' algoritmo che prendendo un testo lo analizza secondo la grammatica di cui sopra e lo trasforma in codice oggetto, per far questo si userà un altro linguaggio tra quelli esistenti
Esattamente, il primo passo per la nascita di un linguaggio è la definizione di una grammatica che lo descriva. Ti faccio un esempio:
<espressione> -> <termine>{<operatore><termine>}*
<termine> -> 0-1-2-3-4-5-6-7-8-9
<operatore> -> + - / *
una grammatica del genere dovrebbe (a meno di lapsus, data l'ora;) ) riconoscere espressioni aritmetiche semplici del tipo
5+9-6 o 6+8 o anche un solo numero, ad es 5 (il carattere * indica che il contenuto tra parentesi graffe può essere ripetuto 0, 1 o n volte). Se non ricordo male (è passato un annetto dal corso di linguaggi) tale grammatica è detta EBNF. La grammatica va poi analizzata (va costruita la tabella dei simboli, va fatta l'analisi FIRST/FOLLOWS etc) per giungere alla realizzazione di un parser. Ad esempio un generico e poco dettagliato parser per la grammatica che ho scritto prima potrebbe essere:
void espressione(){
Termine();
AltraEspressione();
}
void AltraEspressione(){
Operatore();
Termine();
if(è finito il file di cui si sta facendo il parsing)
return;
AltraEspressione();
}
void Operatore(){
...
}
void Termine(){
...
}
A questo punto un parser siffatto è in grado di dire se un file è sintatticamente corretto, ma non è in grado di verificarne la semantica (ad es una espressione tipo 10/0 per il parser è corretta, ma non ha significato). Quindi il passo successivo è quello di realizzare un modulo di controllo semantico, poi uno di interpretazione (se ad es si vuole sapere il valore di un'espressione) e così via.
Ora, considera che un linguaggio di alto livello può essere composto da centinaia se non migliaia di regole sintattiche che compongono la grammatica, e inoltre l'analisi semantica è estremamente complicata (basti pensare ad es al solo type checking) e bisogna fare la conversione in codice macchina. I ragionamenti che ho esposto tra l'altro valgono solo x alcuni tipi di grammatiche (dette LL(1), in quanto è possibile distinguere tra le varie entità sintattiche guardando il solo primo carattere di un token, cioè una unità di testo) e possono essere estesi alle grammatiche LL(k), ma ci sono altre grammatiche a cui si approccia in modo radicalmente differente (se nn ricordo male ne avevo viste alcune tipo SLR(1), ma potrebbe essere una castroneria). Quindi, se vuoi interessarti seriamente all'argomento, pensa che tutto quello ke ho scritto va moltiplicato x 10^32 ;)
ciauz
The3DProgrammer
17-11-2005, 00:25
ah, tra l'altro mi accorgo che sto pseudo parser che ho scritto è riferito ad una grammatica di forma + semplice (ho fatto il casting automatico ;) ) chiamata BNF.
franksisca
17-11-2005, 08:35
3dprog, a parte i complimenti per la spiegazione davvero esaurinte, una picola sottolineatura...
la firma tre righi ;) (i mod sono pignoli, non famoli inc......)
io mi sono cimentato in questo è ho lasciato il progetto per cose + alla mia portata.
vorrei tanto che intervenisse repscasb su questo 3d la quale a collaborato al compilatoreTc 3.1 della borland.....
http://baioccoxnedved.blog.excite.it/img/marmotta-cioccolata.gif
x fek: non l'ho mica capita...
x altri: se vi interessa il parsing c'è un libro aggratis molto esaustivo a questo indirizzo: http://www.cs.vu.nl/~dick/PTAPG.html
Così vi viene il vomito :)
A proposito di compilatori e interpreti...facciamo una gara? :)
Vediamo chi riesce a risolvere per primo questo problema http://spoj.sphere.pl/problems/FOOL/
Chi ce la fa posti il sorgente! (In realtà è una scusa, perchè io ci ho provato a mettermici lì una sera e non ci sono riuscito...ma forse dovrei mettermici più d'impegno! :P)
jappilas
17-11-2005, 11:52
non l'ho mica capita...
< immagine postata da fek > ->(op di sostituzione)
"sì e poi c' era la marmotta che confezionava la cioccolata" :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.