Dsl in Lisp e Java

21
DSL in Lisp e Java DSL in Lisp e Java Alessio Stalla Alessio Stalla [email protected] [email protected]

description

Domain Specific Languages: implementazione in Lisp e integrazione con Java mediante API JSR-223.Presentazione tenuta il 20/01/2009 in occasione dell'incontro del JUG Genova.

Transcript of Dsl in Lisp e Java

Page 1: Dsl in Lisp e Java

DSL in Lisp e JavaDSL in Lisp e Java

Alessio StallaAlessio [email protected]@gmail.com

Page 2: Dsl in Lisp e Java

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

Page 3: Dsl in Lisp e Java

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

Page 4: Dsl in Lisp e Java

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)

Page 5: Dsl in Lisp e Java

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, ...

Page 6: Dsl in Lisp e Java

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, ...

Page 7: Dsl in Lisp e Java

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();}

Page 8: Dsl in Lisp e Java

EsempioEsempio

with_transaction { withdraw 100 € from a; withdraw 200 € from b; deposit 300 € on c;} on_failure { log(...);}

Page 9: Dsl in Lisp e Java

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

Page 10: Dsl in Lisp e Java

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

Page 11: Dsl in Lisp e Java

(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

Page 12: Dsl in Lisp e Java

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

Page 13: Dsl in Lisp e Java

Abstract Syntax TreeAbstract Syntax Tree

Page 14: Dsl in Lisp e Java

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)

Page 15: Dsl in Lisp e Java

Code-is-Data!Code-is-Data!

(defun fact (n) (if (= n 0) n (* n (fact (- n 1)))))

Page 16: Dsl in Lisp e Java

LispLisp

Sintassi ConcretaSintassi Concreta

Sintassi AstrattaSintassi Astratta

SemanticaSemantica

READ

EVALCOMPILE

Page 17: Dsl in Lisp e Java

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!

Page 18: Dsl in Lisp e Java

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, ...

Page 19: Dsl in Lisp e Java

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...

Page 20: Dsl in Lisp e Java

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

Page 21: Dsl in Lisp e Java

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!