Nonostante siano disponibili maree di linguaggi per programmare ha senso realizzare un proprio linguaggio per risolvere specifici problemi o per utilizzarlo con determinati ambienti e tecnologie?
Partendo dall'analisi della realizzazione di un vero e proprio linguaggio interpretato con sintassi in dialetto C/PHP si cercherà di illustrare se le metodologie, gli scopi e il prodotto finale hanno un senso pratico e migliorativo oppure la realizzazione di tali ambienti non sia più necessari.
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Creare un proprio linguaggio di programmazione per il web e applicazioni desktop, by Gabriele Guizzardi
1. Creare un proprio linguaggio di programmazione
per il web e applicazioni desktop.
Gabriele Guizzardi
guizzardi@brainandbytes.com – Brain & Bytes
guizzardi@gmail.com - Guizzardi.net
2. La domanda
Ha senso realizzare un altro linguaggio di
programmazione vista la grande disponibilità di
linguaggi e dialetti di cui si dispone?
E' ancora possibile spendere decine di ore di
lavoro per creare un linguaggio nuovo e su
misura per se stessi?
Nome speaker 2
Mail speaker – company or community
3. Il progetto
Scopo: realizzare un linguaggio di programmazione
Target: risolvere specifici problemi con specifici comandi
Tipo: linguaggio interpretato funzionale
Struttura: scanner, lexer, parser, token
Linguaggio utilizzato: C
Utilizzo: scripting
Nome: SKIMPY :-)
Nome speaker 3
Mail speaker – company or community
4. Gli scopi
Creare un linguaggio formale
Utilizzo di istruzioni classiche di un linguaggio
Protocolli di comunicazione (seriale, parallelo, TCP,
ecc.)
Utilizzo di tecnologie hardware quali modem GSM,
lettori di token o badge
Gestione file di testo o strutturati (XML, CSV, ecc.)
Utilizzo batch (client/server) e web
Nome speaker 4
Mail speaker – company or community
6. Caratteristiche (difetti)
Istruzioni di base
Assenza di annidamento istruzioni
Assenza di annidamento file sorgenti
Sintassi essenziale
Nome speaker 6
Mail speaker – company or community
8. Linguaggio formale
insieme delle stringhe derivate da una grammatica
insieme delle stringhe fornite da una espressione
insieme delle stringhe accettate da un automa
controlli binari (true/false)
condizioni di controllo
Nome speaker 8
Mail speaker – company or community
9. Gli step realizzativi
sintassi del linguaggio in generale (formalismo)
sintassi di ogni singola istruzione
<istruzione> ::= <comando> <parametro/i> | <variabile> <valore>
<numero> ::= <cifra> | <numero> <cifra>
<cifra> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
consiglio: diagrammi di flusso
Nome speaker 9
Mail speaker – company or community
10. Le basi del linguaggio (analisi lessicale)
leggere il programma sorgente in elementi del lessico.
separare i relativi elementi del lessico (token).
eliminare sequenze inutili di caratteri come i commenti.
collezionare informazioni in array o tabelle (p.e. per le
variabili).
Nome speaker 10
Mail speaker – company or community
11. Le basi del linguaggio (analisi sintattica)
processo dei token del linguaggio
“IF a = 0” è formato da 4 token, cioè IF, a, = e 0
Data una grammatica non contestuale G e una stringa x di
caratteri terminali, analizzare sintatticamente x significa
determinare se x appartiene a L(G) e, in tale caso,
costruire l’albero sintattico di x.
Nome speaker 11
Mail speaker – company or community
12. L'interprete
lettura del file sorgente scartando ogni commento
ogni riga del file viene bufferizzata ed eseguita
controllo della sintassi del comando in modo che non sia
eseguito un comando errato
controllo della sintassi del comando in modo che non sia
eseguito un comando con un numero di parametri errati
discriminazione di un carattere da una variabile ($)
Nome speaker 12
Mail speaker – company or community
13. L'interprete
<variabile> | <variabile d’ambiente> | <costante> ::= $<lettera>
WRITE | <testo> | <testo> <var.> | <var.> | <var. d’ambiente>
WRITE “Ciao Mondo!”
LOAD <variabile> <valore>
LOAD a 100
Nome speaker 13
Mail speaker – company or community
14. Esempio di codice
/programma di esempio
write
write "Demo Funzioni Matematiche"
line 20
write mul c $a $b
write $a " ^ " $b " = " $c
load a 4 or c $a $b
load b 6 div c $a $b write $a " OR " $b " = " $c
write $a " / " $b " = " $c
add c $a $b xor c $a $b
write $a " + " $b " = " $c mod c $a $b write $a " XOR " $b " = " $c
write $a " / " $b " resta " $c
sub c $a $b md5 x f test.txt
write $a " - " $b " = " $c and c $a $b write "MD5 di prova.txt = " $x
write $a " AND " $b " = " $c
md5 x s password
write "MD5 di password = " $x
Nome speaker 14
Mail speaker – company or community
16. Esempio di codice per il web
#!c:/SKIMPY/skimpy.exe
webheader
write "<b><i>Demo Funzioni Matematiche<br></i></b>"
line 20
write "<br>" mod c $a $b
load a 4 write "Il resto di " $a " / " $b " è " $c "<br>"
load b 6 and c $a $b
add c $a $b write $a " AND " $b " = " $c "<br>"
write $a " + " $b " = " $c "<br>" or c $a $b
sub c $a $b write $a " OR " $b " = " $c "<br>"
write $a " - " $b " = " $c "<br>" xor c $a $b
mul c $a $b write $a " XOR " $b " = " $c "<br>"
write $a " ^ " $b " = " $c "<br>"
div c $a $b write "MD5 di prova.txt = " write "MD5 di password = "
write $a " / " $b " = " $c "<br>" md5 x f test.txt md5 x s password
write $x "<br>" write $x "<br>"
Nome speaker 16
Mail speaker – company or community
18. Utilizzo su web host
GET SKIMPY Prog.
Nome speaker 18
Mail speaker – company or community
19. Utilizzo su web host
Nome speaker 19
Mail speaker – company or community
20. Utilizzo su web host
Nome speaker 20
Mail speaker – company or community
21. Il codice relativo
#!c:/SKIMPY/skimpy.exe
webheader
write "<FORM METHOD=GET ACTION='demoweb.smy'>"
write "valore 1: <INPUT NAME='valore1'><BR>"
write "valore 2: <INPUT NAME='valore2'><BR>"
write "<INPUT TYPE=SUBMIT></FORM>"
goto esci
write $webgetenv "<br>" :accedi
write $webgetvalue1 "<br>" write "<p style='width:40%; color:#660099;
write $webgetvalue2 "<br>" text-align:left; background-color:#ffcc00;'
write "<br>" >Password Corretta!<br>"
md5 x s $webgetvalue2 extreturn
write "MD5 di " $webgetvalue2 " = " $x :esci
write "<br>Password Sbagliata!<br>"
if $x == "5f4dcc3b5aa765d61d8327deb882cf99" extreturn
goto accedi
Nome speaker 21
Mail speaker – company or community
22. Integrazione con altri linguaggi
write "<script type='text/javascript'>alert('Password Corretta!')</script>"
write "<p style='width:40%; color:#660099; text-align:left;
background-color:#ffcc00;' >Password Corretta!<br>"
Nome speaker 22
Mail speaker – company or community
23. Conclusioni
Quante ore uomo abbiamo impiegato?
Quanto tempo per scrivere la base del linguaggio?
Quanto tempo per scrivere nuove istruzioni?
Siamo “portabili” e “compatibili”?
Il ciclo di vita può essere compromesso a breve?
I costi sostenuti sono proporzionati al risultato?
Nome speaker 23
Mail speaker – company or community