View Full Version : come si crea un linguaggio di programmazione
Digital_Style
10-02-2007, 00:13
Molto spesso mi chiedo come si è passati dai primi computer che erano solo delle lampadine che si accendevano e spegnevano fino ad oggi.se erano solo lampadine i primi computer come hanno scritto il software?e come si scrive un linguaggio di programmazione?ad esempio il C in che linguaggio è scritto?
Molto spesso mi chiedo come si è passati dai primi computer che erano solo delle lampadine che si accendevano e spegnevano fino ad oggi.se erano solo lampadine i primi computer come hanno scritto il software?e come si scrive un linguaggio di programmazione?ad esempio il C in che linguaggio è scritto?
è scritto in c e assembly
Da quello che conosco, si è partiti da una programmazione interamente a codice binario (sequenze senza fine di "0" e "1"). Successivamente si è arrivati alla nascita dei vari linguaggi assembly, che non sono altro che un'insieme di "etichette" che vengono tradotte nel corrispettivo codice binario (per farci capire il concetto, il nostro prof di sistemi in 3° o 4° superiore ci ha spiegato come funzionava la codifica dell'istruzione MOV dell'ASM x86 :eek: ). In pratica un linguaggio assembly ha una corrispondenza 1:1 con il linguaggio macchina (ogni singola istruzione assembly viene tradotta in un singolo codice in linguaggio macchina). A partire dall'assembly poi si sono scritti i primi linguaggi ad alto livello (es. Fortran), che hanno una corrispondenza 1:n con il linguaggio macchina/assembly (la singola istruzione in linguaggio high-level viene tradotta con più istruzioni asm/binarie). I moderni linguaggi sono quindi scritti o direttamente in ASM, oppure tramite uno o più linguaggi intermedi.
Se ho detto qualche cavolata linciatemi pure :D
repne scasb
10-02-2007, 10:32
Sembrera' strano ma C e' scritto in C. A grandi linee, si supponga di creare un nuovo linguaggio il D:
1) Il primo passo e' di creare un interprete del linguaggio D scritto in assembly o in un altro linguaggio preesistente.
2) Il secondo passo sara' quello di scrivere il compilatore D in linguaggio D (sorgente).
3) Il terzo passo sara' quello di eseguire il compilatore D con l'interprete appena creato nel punto 1).
4) Il quarto passo sara' quello di compilare il compilatore D, con il compilatore D interpretato dall'interprete del punto 1).
5) L'eseguibile ottenuto dal punto 4) e' il compilatore D scritto in D (autocompilazione).
Digital_Style
10-02-2007, 13:25
scusa, ma non ho capito molto bene!
Prima scrivi il compilatore/interprete in un altro linguaggio, poi lo riscrivi nel linguaggio stesso. Nel caso del C, se non ricordo male, la cosa e' stata fatta a passi (prima un compilatore per un sottoinsieme del linguaggio, per poi aggiungere man mano features).
Digital_Style
10-02-2007, 15:44
e per scrivere un compilatore/interprete in un altro linguagio cosa si dovrebbe fare?scrivere la sintassi del nuovo linguaggio che si vuole creare o altro?
Digital_Style
11-02-2007, 09:51
up
D4rkAng3l
11-02-2007, 12:14
oddio non è così banale la cosa...ti dovresti leggere bene qualcosa sull'architettura degli elaboratori...
Digital_Style
11-02-2007, 13:15
qualche link?
D4rkAng3l
11-02-2007, 17:17
mmmm purtroppo il mio professore (cioè purtroppo per te ma bene per me perchè era Dio) odiava libri, dispense...parlava spiegava...e gli appunti erano la bibbia...mmm mi informo in facoltà se qualcuno conosce qualche link fatto benino e te lo passo
Comincia da qua:
http://en.wikipedia.org/wiki/Formal_grammar
oddio non è così banale la cosa...ti dovresti leggere bene qualcosa sull'architettura degli elaboratori...
Quoto....dovresti quindi vedere qualcosa che riguarda le macchine virtuali ed i linguaggi connessi...capirai subito, inizialmente a grandi linee, come si "costruisce" un linguaggio....logica digitale, microprogrammazione, ecc....
Digital_Style
14-02-2007, 15:28
ok capisco.
@lovaz:non hai un link in italiano?
Sembrera' strano ma C e' scritto in C. A grandi linee, si supponga di creare un nuovo linguaggio il D:
1) Il primo passo e' di creare un interprete del linguaggio D scritto in assembly o in un altro linguaggio preesistente.
2) Il secondo passo sara' quello di scrivere il compilatore D in linguaggio D (sorgente).
3) Il terzo passo sara' quello di eseguire il compilatore D con l'interprete appena creato nel punto 1).
4) Il quarto passo sara' quello di compilare il compilatore D, con il compilatore D interpretato dall'interprete del punto 1).
5) L'eseguibile ottenuto dal punto 4) e' il compilatore D scritto in D (autocompilazione). quoto, infatti il compilatore GCC è scritto in C :read:
e molto probabilmente anche il CL di Microsoft :O
[...] (per farci capire il concetto, il nostro prof di sistemi in 3° o 4° superiore ci ha spiegato come funzionava la codifica dell'istruzione MOV dell'ASM x86 :eek: ). In pratica un linguaggio assembly ha una corrispondenza 1:1 con il linguaggio macchina (ogni singola istruzione assembly viene tradotta in un singolo codice in linguaggio macchina). ehm... :fagiano:
il fatto della corrispondenza 1:1 mi sembra una generalizzazione veramente eccessiva, mi sa che il vostro prof di assembly x86 non ne sapeva più o meno all'incirca un cazz :D :D
scaricati se vuoi i manuali gratuiti (dal sito della Intel, in PDF) dei processori x86, e vedi giustappunto la codifica delle varie versioni di MOV: certe hanno proprio opcodes diversi, non è possibile dire che la corrispondenza sia 1:1.
I moderni linguaggi sono quindi scritti o direttamente in ASM, oppure tramite uno o più linguaggi intermedi. ehm... no :p
leggi la spiegazione di repne scasb, è chiarissima; e fai caso anche al fatto che il GCC è scritto in C :)
Mi sapete dire perchè si è soliti scrivere un compilatore con lo stesso linguaggio che andrà a compilare?
http://it.wikipedia.org/wiki/Grammatica_formale
http://it.wikipedia.org/wiki/Linguaggio_di_programmazione
http://it.wikipedia.org/wiki/Compilatore
eccetera...
Mi sapete dire perchè si è soliti scrivere un compilatore con lo stesso linguaggio che andrà a compilare?
Non sempre, javac non è scritto in java...
Motivi prestazionali, penso...
Mi sapete dire perchè si è soliti scrivere un compilatore con lo stesso linguaggio che andrà a compilare?
Scrivere un compilatore del linguaggio A nel linguaggio B vuol dire dover conoscere a fondo entrambi i linguaggi, e' piu' facile trovare una persona che conosca molto bene uno solo dei due.
Inoltre tipicamente se si progetta un nuovo linguaggio si vuole ottenere un linguaggio "migliore" (dal punto di vista dell'autore) dei precedenti, per cui se chi lo progetta e' anche chi ne scrive il compilatore, tendera' a preferirlo in quanto considerato piu' adatto.
La cosa non e' una regola ovviamente. Ci sono persone bravissime e fluenti in piu' linguaggi, e non e' detto che un linguaggio vada bene anche per scrivere compilatori, soprattutto i linguaggi di scripting per settori abbastanza particolari.
Digital_Style
14-02-2007, 19:45
scusate, ma se io vorrei inventare il linguaggio G come faccio a scrivere il compilatore in G se nemmeno l'ho inventato?!
scusate, ma se io vorrei inventare il linguaggio G come faccio a scrivere il compilatore in G se nemmeno l'ho inventato?!
Prima tu devi inventare la sintassi del linguaggio, poi basandoti sulla sintassi che hai creato crei il compilatore.
Digital_Style
15-02-2007, 00:45
e il punto è proprio questo!se ad esempio io volessi creare un linguaggio che per stampare la scritta "Hello world!!" sullo schermo debba avere questa sintassi:
STAMP "Hello world!!!" quale sarebbe il procedimento da seguire?
e il punto è proprio questo!se ad esempio io volessi creare un linguaggio che per stampare la scritta "Hello world!!" sullo schermo debba avere questa sintassi:
STAMP "Hello world!!!" quale sarebbe il procedimento da seguire? inventare un algoritmo che nelle stringhe sostituisca tre punti esclamativi consecutivi con due punti esclamativi? :D
e il punto è proprio questo!se ad esempio io volessi creare un linguaggio che per stampare la scritta "Hello world!!" sullo schermo debba avere questa sintassi:
STAMP "Hello world!!!" quale sarebbe il procedimento da seguire?
inizia a leggere questo per chiarirti le idee:
http://www.geocities.com/SiliconValley/Mouse/9411/basic1.htm
come fare per fare un linguaggio interprete... tanto per iniziare a capirci qualcosa.
Una persona che invece può dirti qualcosa in + è rep che ha contribuito allo sviluppo del compilatore borland 3.1 se non ricordo male...
ciao
jumpermax
15-02-2007, 12:27
scusate, ma se io vorrei inventare il linguaggio G come faccio a scrivere il compilatore in G se nemmeno l'ho inventato?!
E' più facile capire il legame che intercorre tra grammatica di un linguaggio e automa riconoscitore. Essenzialmente c'è una corrispondenza tra il tipo di grammatica che si usa e potenza dell'automa in grado di riconoscerla (si veda la gerarchia di Chomsky (http://it.wikipedia.org/wiki/Gerarchia_di_Chomsky) un compilatore altro non è che un automa in grado non solo di riconoscere la grammatica ma di tradurla in un altra. Un compilatore C crea (solitamente) codice eseguibile, un compilatore java del bytecode e via dicendo.
Per il corso di linguaggi personalmente avevo creato un compilatore di grammatiche in grado di compilare una grammatica regolare nel corrispettivo automa a stati finiti. Dato che la grammatica del mio linguaggio era regolare il compilatore era in grado di generare da una descrizione della propria grammatica un riconoscitore della grammatica stessa. Attenzione però, questo non vuol dire che il compilatore sia in grado di autogenerarsi, per poter fare una cosa del genere non basta avere una descrizione formale della grammatica ma una vera e propria descrizione formale della traduzione (Ok il discorso ha preso un po' la tangente :D ) Cmq essenzialmente è irrilevante il linguaggio in cui viene scritto il compilatore o l'interprete, la scrittura di un linguaggio parte sempre dall'esigenza di descrivere qualcosa e non è assolutamente detto che questo comprenda anche il compilatore. Per dire posso creare un interprete prolog scritto in C ma non credo avrei alcun vantaggio pratico a riscriverlo in prolog.
Digital_Style
15-02-2007, 17:16
jumpermax non ho capito bene!
71104:non mi riferisco ai punti esclamativi ma semplicemente alla sintassi del programma.ad esempio in python per stampare una cosa su schermo si scrive print "ciao" e stampa la parola ciao.se io vorrei inventare un linguaggio che invece del comando print usi quello stamp come dovrei fare?(ricordatevi che è solo un semplice esempio!!)
E comunque il linguaggio G già c'è ed è una gran cosa(a me piace parecchio e mi ci divertivo molto! :D), vedi LabView :p
71104:non mi riferisco ai punti esclamativi ma semplicemente alla sintassi del programma. ............... :fagiano: :fagiano: :fagiano:
jumpermax non ho capito bene!
71104:non mi riferisco ai punti esclamativi ma semplicemente alla sintassi del programma.ad esempio in python per stampare una cosa su schermo si scrive print "ciao" e stampa la parola ciao.se io vorrei inventare un linguaggio che invece del comando print usi quello stamp come dovrei fare?(ricordatevi che è solo un semplice esempio!!)
Questo e' un caso un po' particolare in quanto si tratta di output e la cosa dipende non solo dal linguaggio, ma anche dalla macchina su cui gira. Alla fin fine il compilatore usa quello che il sistema operativo gli mette a disposizione, ovvero dei canali su cui sparare i caratteri da visualizzare e poco piu'. E' poi lavoro del kernel implementare il codice che prende quei caratteri che arrivano e visualizzarli in output in qualche modo dipendente dalla periferica (ad esempio copiando i dati nella memoria della scheda video se si tratta di monitor, o spedendoli direttamente sulla porta se si tratta di una seriale etc.)
Digital_Style
16-02-2007, 14:20
scusate, ma non mi è molto chiaro!
Ho letto risposte un po' fuorvianti e superficiali.
Suddividiamo il problema. Creazione di un linguaggio di programmazione
- definizione sintassi
- creazione macchina virtuale
La definizione della sintassi dev'essere effettuata con strumenti formali. Comunque, è un problema piuttosto complicato, che coinvolge grammatiche, vincoli semantici e altro.
Creazione di una macchina virtuale. Ma.. cos'è una macchina virtuale? Si può definire una macchina virtuale del linguaggio L come un insieme di strutture dati e algoritmi atte alla memorizzazione e all'esecuzione di programmi scritti in L.
Quindi le operazioni che una MV deve svolgere sono fondamentalmente: memorizzazione, interpretazione (esecuzione).
L'implementazione può essere "implementativa pura" (interprete di L scritto in un altro linguaggio), "compilativa pura" (traduzione di L in un altro linguaggio", anche se in realtà sarà ibrida.
Perchè questo "altro linguaggio" deve essere assembly, C, C++ ? L'unico vincolo è che esso sia sufficientemente espressivo rispetto al linguaggio da tradurre.
Si possono creare gerarchie di macchine virtuali, quindi non si è "vincolati" al linguaggio macchina.
Invito la lettura di "Linguaggi di programmazione - Principi e paradigmi" per informazioni circa questi argomenti (cui praticamente vi ho accennato ora).
scusate, ma non mi è molto chiaro!
Ovvio, non sono cose facilissime.
scusate, ma non mi è molto chiaro!
ti metto questo link raggiungibile da quello messo sopra:
http://www.geocities.com/SiliconValley/Mouse/9411/newcomp3.htm
il link te l'ho postato... ma l'hai letto?... è molto chiaro a mio parere!
Il difficile è progettare il tutto ma capire come è strutturato è molto chiaro a grandi linee.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.