Dsl in Lisp e Java
-
Upload
alessiostalla -
Category
Technology
-
view
1.014 -
download
0
description
Transcript of Dsl in Lisp e Java
DSL in Lisp e JavaDSL in Lisp e Java
Alessio StallaAlessio [email protected]@gmail.com
DSL in Lisp e JavaDSL in Lisp e Java
DDomain omain SSpecific pecific LLanguageanguage
Linguaggio specializzatoLinguaggio specializzatoin un certo dominio applicativoin un certo dominio applicativo
Esempi di DSLEsempi di DSL
SQLSQLRegexRegexJSP/JSF ELJSP/JSF ELAnt tasksAnt tasksecc. ecc.ecc. ecc.
JavaFX ScriptJavaFX ScriptShell ScriptingShell ScriptingXUL (Mozilla)XUL (Mozilla)Spring WebFlowSpring WebFlow
DSL e programmazione Bottom-UpDSL e programmazione Bottom-Up
Language Oriented ProgrammingLanguage Oriented Programming (M. Fowler) (M. Fowler) o o Bottom-Up ProgrammingBottom-Up Programming (P. Graham) (P. Graham)
Avvicinare il Linguaggio al Problema (Bottom-Up)Avvicinare il Linguaggio al Problema (Bottom-Up)invece diinvece di
avvicinare il problema al linguaggio (Top-Down)avvicinare il problema al linguaggio (Top-Down)
DSL – Pro e ControDSL – Pro e Contro
ProPro• Linguaggio vicino al problema: alto livello di astrazione, concisione, Linguaggio vicino al problema: alto livello di astrazione, concisione, semplicità, programmazione dichiarativa semplicità, programmazione dichiarativa• Ciclo di sviluppo più snello, rapid prototypingCiclo di sviluppo più snello, rapid prototyping• DSL sono linguaggi di programmazione: possiamo usare le DSL sono linguaggi di programmazione: possiamo usare le
tecniche che conosciamo – variabili, funzioni, classi, ...tecniche che conosciamo – variabili, funzioni, classi, ...
DSL – Pro e ControDSL – Pro e Contro
ControContro• Babele di linguaggi: curva di apprendimento, scarso supporto dai Babele di linguaggi: curva di apprendimento, scarso supporto dai tool di sviluppo tool di sviluppo• InefficienzaInefficienza• DSL sono linguaggi di programmazione: necessario progettare e DSL sono linguaggi di programmazione: necessario progettare e
implementare parser, compilatore/interprete, ambiente di implementare parser, compilatore/interprete, ambiente di esecuzione, ...esecuzione, ...
EsempioEsempio
Transaction t = tm.beginTransaction();try { accounts.getAccount("a").withdraw(t, 100, "€"); accounts.getAccount("b").withdraw(t, 200, "€"); accounts.getAccount("c").deposit(t, 300, "€"); t.commit();} catch(TransactionException e) { log.error(...); t.rollback();}
EsempioEsempio
with_transaction { withdraw 100 € from a; withdraw 200 € from b; deposit 300 € on c;} on_failure { log(...);}
LispLisp
Famiglia di linguaggi con origini molto antiche Famiglia di linguaggi con origini molto antiche (John McCarthy, 1958)(John McCarthy, 1958)
Nasce come linguaggio funzionale per la Nasce come linguaggio funzionale per la manipolazione di dati simbolicimanipolazione di dati simbolici
Tradizionalmente associato all'IA, ma con Tradizionalmente associato all'IA, ma con applicazioni in tutti i campiapplicazioni in tutti i campi
LispLisp
Vari dialetti, i più usati oggi:Vari dialetti, i più usati oggi:
Common Lisp (ANSI standard, 1991)Common Lisp (ANSI standard, 1991) SchemeScheme Emacs LispEmacs Lisp AutolispAutolisp
(Common) Lisp(Common) Lisp
Linguaggio Multiparadigma:Linguaggio Multiparadigma:Imperativo, Funzionale, OO, ...Imperativo, Funzionale, OO, ...
Interpretato e/o compilatoInterpretato e/o compilatoAltamente interattivoAltamente interattivo
Molte feature uniche ed interessanti,Molte feature uniche ed interessanti,ma soprattutto...ma soprattutto...
Ottimo per scrivere DSLOttimo per scrivere DSL
Un po' di teoria...Un po' di teoria...
SintassiSintassi
for(...) { ... }for(...) { ... }
void method(args) {void method(args) { ......}}
SemanticaSemantica
““The basic for statement executes The basic for statement executes some initialization code, then some initialization code, then executes an Expression, a executes an Expression, a Statement, and some update Statement, and some update code repeatedly until the value of code repeatedly until the value of the Expression is false.”the Expression is false.”The Java Language SpecificationThe Java Language Specification
Abstract Syntax TreeAbstract Syntax Tree
In Lisp...In Lisp...
Sintassi Sintassi ConcretaConcreta(Caratteri)(Caratteri)
Sintassi Astratta – ASTSintassi Astratta – AST(Oggetti in memoria)(Oggetti in memoria)
Semantica – valoriSemantica – valori(Oggetti in memoria)(Oggetti in memoria)
123 123 (0x007a) 123 (0x007a)
"abc" "abc" (abc\0) "abc" (abc\0)
pippoPIPPO
(SYMBOL { name = "PIPPO", value = ..., function = ... })
Valore della variabile PIPPO
(+ 1 2) [ ]->[ ]->[ ]->NIL | | | + 1 2
3(Funzione + applicata a 1 e 2)
Code-is-Data!Code-is-Data!
(defun fact (n) (if (= n 0) n (* n (fact (- n 1)))))
LispLisp
Sintassi ConcretaSintassi Concreta
Sintassi AstrattaSintassi Astratta
SemanticaSemantica
READ
EVALCOMPILE
MacroMacro
Funzioni eseguite prima della compilazioneFunzioni eseguite prima della compilazione Operano su Oggetti in memoria e non su testoOperano su Oggetti in memoria e non su testo Sono scritte in LispSono scritte in Lisp Permettono di estendere il linguaggio Permettono di estendere il linguaggio
aggiungendo nuovi costruttiaggiungendo nuovi costrutti Il tool perfetto per scrivere DSL!Il tool perfetto per scrivere DSL!
Ricordate i Contro?Ricordate i Contro?
• Babele di linguaggi: curva di apprendimento, scarso supporto dai Babele di linguaggi: curva di apprendimento, scarso supporto dai tool di sviluppo tool di sviluppo Sintassi Uniforme (parser integrato) Sintassi Uniforme (parser integrato)• InefficienzaInefficienza Compilatore integrato e trasparente (macro)Compilatore integrato e trasparente (macro)• DSL sono linguaggi di programmazione: necessario progettare e DSL sono linguaggi di programmazione: necessario progettare e
implementare parser, compilatore/interprete, ambiente di implementare parser, compilatore/interprete, ambiente di esecuzione...esecuzione... Riutilizzo massimo del linguaggio preesistente: Riutilizzo massimo del linguaggio preesistente: parser, interprete, compilatore, IDE, ...parser, interprete, compilatore, IDE, ...
E Java?E Java?
Common Lisp è uno standardCommon Lisp è uno standardNe esistono numerose implementazioni, Ne esistono numerose implementazioni, commerciali e open sourcecommerciali e open sourceABCL (Armed Bear Common Lisp) gira sulla JVMABCL (Armed Bear Common Lisp) gira sulla JVMIl compilatore produce bytecode JavaIl compilatore produce bytecode JavaABCL è nato per portare Java a Lisp, non ABCL è nato per portare Java a Lisp, non viceversa: API molto poco Java-like...viceversa: API molto poco Java-like...
ABCL e JSR-223ABCL e JSR-223
ABCL supporterà a breve la Java Scripting API:ABCL supporterà a breve la Java Scripting API: esecuzione di script da file/streamesecuzione di script da file/stream chiamate dirette a funzioni Lispchiamate dirette a funzioni Lisp compilazionecompilazione implementazione di interfacce Java in Lispimplementazione di interfacce Java in Lisp
ABCL e JSR-223ABCL e JSR-223
In Lisp, un DSL è un'estensione del linguaggio In Lisp, un DSL è un'estensione del linguaggio tramite macro...tramite macro......ciò significa che anche il vostro DSL ABCL-...ciò significa che anche il vostro DSL ABCL-based è integrato con la Java Scripting API!based è integrato con la Java Scripting API!Morale: se stai pensando a XML... valuta invece Morale: se stai pensando a XML... valuta invece Lisp e DSL!Lisp e DSL!