[Tutorial] Come creare un linguaggio di programmazione, Breve tutorial in cui sono descritti i passaggi base per creare un linguaggio di programmazione

« Older   Newer »
  Share  
manvb.net
view post Posted on 20/11/2009, 18:20




Ogni programmatore, nel suo percorso di studio, prima o poi si pone questa domanda:

Come creo un linguggio di programmazione?

In questo articolo vi spiegherò quali sono i passaggi da seguire per crearne uno.

Per prima cosa dovete decidere che tipo di linguaggio volete creare: interpretato o compilato. La differenza sostanzialmente sta nel fatto che il primo tipo di linguaggio viene letto e interpretato da un programma chiamato intermprete, mentre un linguaggio compilato viene tradotto in linguaggio macchina ed eseguito direttamente dalla cpu(il programma che effettua la traduzione si chiama compilatore). C'è anche un altro tipo di linguaggi che è un ibrido tra i due,sto parlando dei linguaggi pseudocompilati, che sono tradotti in un linguaggio intermedio(bytecode), simile al linguaggio macchina, che viene interpretato ed eseguito non dalla cpu, bensì da un altro programma, un interprete.

Se scegliete un linguaggio compilato avete bisogno dei seguenti prerequisiti:

1) Conoscere approfonditamente l'architettura sulla quale il vostro linguaggio girerà. L 'architettura è l'insieme di hardware e software che consentono ai programmi di essere eseguiti. L'architettura ad oggi più diffusa è la 80x86 a 32/64 bit(hardware) accompagnata dal sistema operativo Windows(software).
2) Conoscere il linguaggio assembly destinato all'architettura scelta, nel nostro caso l'assembly 80x86.
3) Conoscere e saper utilizzare discretamente un linguaggio di programmazione qualsiasi. Molto importante è conoscere alla perfezione le funzioni di manipolazione delle stringhe di tale linguaggio e l'OOP.

Se scegliete un linguaggio interpretato avete invece avete bisogno di:

1) Conoscere e saper utilizzare discretamente un linguaggio di programmazione qualsiasi. Molto importante è conoscere alla perfezione le funzioni di manipolazione delle stringhe di tale linguaggio e l'OOP.
2) Conoscere il funzionamento di un elaboratore.
3) Avere una buona capacità nella creazione di algoritmi, puntando soprattutto ad ottimizzarne la velocità e l'utilizzo di memoria.

Se invece scegliete un linguaggio pseudocompilato, dovete saper:

1) Conoscere e saper utilizzare discretamente un linguaggio di programmazione qualsiasi. Molto importante è conoscere alla perfezione le funzioni di manipolazione delle stringhe di tale linguaggio e l'OOP.
2) Conoscere il funzionamento di un elaboratore e della struttura di un linguaggio macchina.
3) Avere una buona capacità nella creazione di algoritmi, puntando soprattutto ad ottimizzarne la velocità e l'utilizzo di memoria.
4) Saper creare un simulatore per un linguaggio macchina inventato, creando virtualmente componenti come la cpu e la ram.

Dopo aver scelto il tipo di linguaggio bisogna iniziare a definirne la sintassi.
E' possibile utilizzare, per questo compito, dei liguaggi descrittivi chiamati meta-linguaggi, il cui unico compito è descrivere la sintassi del linguaggio(uno di questi e il BNF). Essi però non sono essensiali, è possibile limitarsi a descrivere la sintassi utilizzando la lingua parlata(italiano o inglese) in un file txt, l'importante è essere precisi.
Una volta specificata la sintassi, si deve passare alla realizzazione pratica.

Nel caso di un linguaggio compilato:

Bisogna iniziare a scrivere il compilatore. Esso sarà diviso in 3 parti principali: lo scanner, il parser e il code generator.
Lo scanner ha il compito di leggere i vari token dal file di input(contenente le istruzioni scritte nel nostro nuovo linguaggio). Esso si basa su una semplice routine, che chiameremo Tokenize, che legge un carattere per volta dal file:

- Se è una lettera o un underscore(_), continua a leggere caratteri finchè sono lettere, underscore, o numeri e li accoda ad una stringa. Tale stringa viene poi aggiunta al risultato, che altro non è che una lista(o array) di stringhe che sarà passato al parser.
- Se è un numero, continua a leggere caratteri e se sono numeri li accoda ad una stringa, che alla fine viene aggiunta tra i risultati, come prima.
- Se è uno spazio, lo salta.
- Se è separatore di linea(ritorno a capo, ";", ecc...), aggiunge un tag, tipo "<eol>" tra i risultati, così da riconoscere la fine di una linea(o istruzione).
- Se è un " legge e accoda tutti i caratteri fino al prossimo ", e inserisce all'inizio di tale stringa, un tag <string>, per indicare appunto che si tratta di una stringa.
- Se è un simbolo, continua a leggere ed accoda ad una stringa finche i caratteri letti sono simboli, come prima, ma quì bisogna fare una distinzione: infatti è valido come simbolo "==", oppure "!=", ma non è valido ad esempio ",=", bisogna perciò effettuare un controllo sui simboli letti per capire se sono operatori o simboli di punteggiatura. il risultato viene aggiunto nell'array dei risultati, come prima.
- Tanti altri passaggi possono essere aggiunti a seconda della sintassi del linguaggio preso in considerazione...

Finito lo scanner, si deve creare il parser, che si occupa di analizzare l'array di stringhe creato dallo scanner e di produrre un albero di tokens.
L'albero di tokens è una struttura ad albero in grado di contenere informazioni sui token presenti nel file di input. Esso è una sequenza di strutture/classi(a seconda del linguaggio con cui si sta scrivendo il compilatore), una per ogni tipo di statement(istruzione), che conservano informazioni sulla sua struttura. Un esempio di parser e di struttura per un albero di token lo potete trovare qui(in C#): http://msdn.microsoft.com/it-it/magazine/cc136756.aspx

Una volta creato il parser, si deve procedere allla scrittura del code generator, che analizza l'albero di token prodotto dal parser e produce un output nel linguaggio assembly scelto, che verrà poi compilato da un assembler(ad esempio NASM).

Per avere la possibilità di gestire l'IO(scrittura a console, lettura da console, ecc...) si devono utilizzare le API del sistema operativo scelto.


Se si è scelto di creare un linguaggio interpretato, i passaggi sono gli stessi fino all'albero di token, che invece di essere passato al code generator, viene passato all'interpreter, una classe che legge l'albero di token e ne esegue le istruzioni in esso contenute, senza tradurre in nessun linguaggio assembly. In questo caso per l'IO si possono utilizzare le funzioni del linguaggio di programmazione utilizzato per scrivere l'interpreter.


Se si è scelto invece di creare un linguaggio pseudocompilato, si deve procedere esattamente come per il linguaggio compilato, solo che il code generator non creerà codice assembly ma codice bytecode, che sarà poi interpretato attraverso un altro programma, l'interprete di bytecode, o più spesso chiamato Virtual Machine, che è una specie di cpu virtuale.

Con questo articolo, che non vuole essere esaustivo, ho voluto presentare il processo di creazione di un linguaggio di programmazione. Invito chiunque voglia approfondire l'argomento a seguire i vari tutorial presenti sulla rete e a comprare un buon manuale sulla scrittura di parser, sull'architettura hardware e software e sui linguaggi assembly.



Manuel Furia(manvb.net)
 
Top
fedebrad01000010 01110010
view post Posted on 21/11/2009, 15:49




:blink: :blink: :blink: :blink: :blink: :blink: :blink: :blink: image image image image image image image image
 
Top
manvb.net
view post Posted on 21/11/2009, 16:43




CITAZIONE (fedebrad01000010 01110010 @ 21/11/2009, 15:49)
:blink: :blink: :blink: :blink: :blink: :blink: :blink: :blink: image image image image image image image image

Che commento profondo... :D
 
Top
fedebrad01000010 01110010
view post Posted on 21/11/2009, 19:09




:cry: :cry:
 
Top
LG_Power_Live
view post Posted on 29/11/2009, 21:36




woowwwwwwwwwwwwwwww. Pero come si è espresso fedebrad nella faccina non posso dargli torto. :cry: :cry: :cry: :D
 
Top
Emanuele11
view post Posted on 24/11/2013, 20:59




io sono un ragazzo di 16 anni e vorrei fare carriera nell informatica, mi piace usare il computer e vorrei creare un mio linguaggio di programmazione ma non so usare benissimo gli altri, come posso imparare ad usarli? :D
 
Top
leo37
view post Posted on 9/6/2014, 08:09




incomincia con visual basic , poi pass ai codici piu' difficili( c++ c# assebly.....) mentre alla fine ia e assebly
 
Top
MorpheusMX
view post Posted on 2/2/2017, 13:20




ciao manvb anche io sono un ragazzo di 15 (non 16 come EMANUELE) e vorrei diventare un informatico come te!! :ph34r: :ph34r:

Ho letto la tua guida su come creare un linguaggio di programmazione ed è WOOOWW è un bellissimo tutorial e descrivi ogni singolo passaggio in maniera ottima (anche se non ho capito molte parti) perchè anche io vorrei creare un mio linguaggio di programmazione come te ma io parto proprio dalle basi, sto a zero di programmazione e volevo chiederti aiuto! :blink: :blink: :woot: :woot:

Innanzi tutto voglio anzi esigo sapere quale linguaggio di programmazione sia il migliore e come posso fare per impararlo! Chiedo sempre a tutti gli informatici ma ognuno mi da una risposta diversa e non riesco a capire quale diamine sia il linguaggio migliore e quindi non posso iniziare a programmare! Se solo qualcuno (tu) mi potessi dire qualc'è il miglior linguaggio per iniziare io mi metterei subito a studiarlo e diventerei finalmente un informatico come te! :alienff: :alienff: :cry:

Ho cercato invano su google informazioni in merito ma non ho trovato nulla, solo dei siti dove vengono comparati i linguaggi e messi a confronto con dei consigli tipo hwupgrade.it e imparareaprogrammare.it ma nessuno di loro dice chiaramente quale sia il miglior linguaggio per programmare ed è una cosa che non sopporto!!! :) :rolleyes: :lol: :D :P
 
Top
Utonto
view post Posted on 19/7/2017, 11:22




Non esiste un linguaggio migliore di un altro. ogni linguaggio di programmazione ha il suo "perché" e impararne uno non fa di voi informatici. Se volete diventarlo dovete studiare tutte le cose fondamenti che riguardano l'informatica e non solo un singolo linguaggio di programmazione
 
Top
lollerinx
view post Posted on 3/1/2019, 20:19




ciao
 
Top
MammtChellaBucchin
view post Posted on 15/10/2019, 10:18




Ciao raga!!!
 
Top
view post Posted on 21/3/2020, 18:42

Noob

Group:
Member
Posts:
4

Status:


Come va con l'informatica?
CITAZIONE (Emanuele11 @ 24/11/2013, 20:59) 
io sono un ragazzo di 16 anni e vorrei fare carriera nell informatica, mi piace usare il computer e vorrei creare un mio linguaggio di programmazione ma non so usare benissimo gli altri, come posso imparare ad usarli? :D
 
Top
Luca Ravasio
icon1  view post Posted on 4/5/2020, 09:05




Grazie; è stato molto utile; io ho provato ha fare un linguaggio interpretato. Sostanzialmente si limita a tradurre il mio nuovo linguaggio (l' ho chiamato python ++ perchè è quasi identico a python) in linguaggio python. Poi basta usare l' interprete di python ed è fatta. Ecco il codice sorgente in python in formato :


from tkinter import *
from tkinter import filedialog
from tkinter import messagebox
rigacompleta = ""
do = 1
testox = ""
gamma = 0
rigacompletafin = ""
def open_file_Ppp(*args):
filename = filedialog.askopenfilename(title = "Quale file vorresti aprire ('_')",defaultextension=".P++",filetypes=[("File P++","*.P++")])

if filename:
testo2.delete(1.0,END)
testo.delete(1.0,END)
with open(filename,"r")as f:
testo.insert(1.0,f.read())
def open_file_py(*args):
filename = filedialog.askopenfilename(title = "Quale file vorresti aprire ('_')",defaultextension=".py",filetypes=[("File python","*.py")])
if filename:
testo2.delete(1.0,END)
testo.delete(1.0,END)
with open(filename,"r")as f:
testo0.insert(1.0,f.read())
def save_as(*args):
global testox
contenuto2 = testo2.get(0.0,END)
contenuto1 = testo.get(0.0,END)
new_file = filedialog.asksaveasfilename(title = "Come vorresti salvare il tuo file? ('_') ",defaultextension=".P++",filetypes=[("File P++","*.P++")])
new_file2 = filedialog.asksaveasfilename(title = "Come vorresti salvare il tuo file? ('_') ",defaultextension=".py",filetypes=[("File python","*.py")])
with open(new_file,"w") as f:
f.write(contenuto1)
with open(new_file2,"w") as f:
f.write("from something import *n" + testox)
def new_file(*args):
global testox
testo2.delete(1.0,END)
testo.delete(1.0,END)
testox = ""
filename = None

def enter( event=None ):
global rigacompleta
global testox
testox = ""
istruzione = ""
rigacompleta = ""
testo2 = Text( W2, font = ( "courier",15 ) )
testo2.grid( row=0,column=0,sticky="WENS" )
testo2.configure( bg="lightyellow" )
codice = str(testo.get(1.0,END))
riga = codice.split( " " )
for linea in riga:
global gamma
gamma = 0
global rigacompletafin
for carattere in linea:
istruzione = str(istruzione) + str(carattere)
aperta = 0
if carattere == "'" and aperta == 0:
aperta = 1
elif carattere == "'" and aperta == 1:
aperta = 0
if carattere == '"' and aperta == 0:
aperta = 1
elif carattere == '"' and aperta == 1:
aperta = 0
if istruzione == "println" and aperta == 0:
rigacompleta = rigacompleta + "print('n')nprint"
istruzione = ""
if istruzione == "inputln" and aperta == 0:
rigacompleta = rigacompleta + "inputln"
istruzione = ""
if istruzione == "repart_i" and aperta == 0:
rigacompleta = rigacompleta + "for i in range"
istruzione = ""
if istruzione == "repart_j" and aperta == 0:
rigacompleta = rigacompleta + "for j in range"
istruzione = ""
if istruzione == "repart_k" and aperta == 0:
rigacompleta = rigacompleta + "for k in range"
istruzione = ""
if istruzione == "repart_l" and aperta == 0:
rigacompleta = rigacompleta + "for l in range"
istruzione = ""
if istruzione == "repart_m" and aperta == 0:
rigacompleta = rigacompleta + "for m in range"
istruzione = ""
if carattere == "n":
rigacompleta = rigacompleta + istruzione
istruzione = ""
if carattere == "=":
rigacompleta = rigacompleta + istruzione
istruzione = ""
if carattere == " ":
rigacompleta = rigacompleta + istruzione
istruzione = ""
if aperta == 0:
istruzione = istruzione.replace("<-","=")
if istruzione == "t":
rigacompleta = rigacompleta + istruzione
istruzione=""
rigacompleta = rigacompleta + istruzione
testo2.insert( END ,"from something import *n")
testo2.insert( END ,rigacompleta)
testox = testox + rigacompleta
istruzione = ""
rigacompleta = ""
W1 = Tk()
W1.configure(bg = "white")
W1.title( "P++" )
W1.geometry("750x450+750+0")
W2 = Tk()
W2.configure(bg = "white")
W2.title( "P_kode" )
W2.geometry("750x450+0+0")
testo = Text(W1,font=("courier",15))
testo.pack( expand = 1 , fill=Y )
testo.configure(bg="lightblue")
testo2 = Text(W2,font=("courier",15))
testo2.pack( expand = 1 , fill=Y )
testo2.configure(bg="lightyellow")
W1.bind("<return>",enter)
menux = Menu(W1,font = ("Segoe print",9))
W1.config(menu= menux)
file_dropdown = Menu(menux,font = ("Segoe print",9),tearoff=0)
file_dropdown.add_command(label="Salva con Nome",command=save_as)
file_dropdown.add_command(label="Nuovo",command=new_file)
file_dropdown.add_command(label="Apri file P++",command=open_file_Ppp)
menux.add_cascade(label="File",menu = file_dropdown,font = ("Segoe print",9))

menuy = Menu(W2,font = ("Segoe print",9))
W2.config( menu = menuy )
file_dropdownn = Menu(menuy,font = ("Segoe print",9),tearoff=0)
file_dropdownn.add_command(label="Salva con Nome",command=save_as)
file_dropdownn.add_command(label="Nuovo",command=new_file)
file_dropdownn.add_command(label="Apri file P++",command=open_file_Ppp)
menuy.add_cascade(label="File",menu = file_dropdownn,font = ("Segoe print",9))
W1.mainloop() and W2.mainloop()

 
Top
12 replies since 20/11/2009, 18:20   19529 views
  Share