Dsl in Lisp e Java

1,229 views

Published on

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.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,229
On SlideShare
0
From Embeds
0
Number of Embeds
158
Actions
Shares
0
Downloads
10
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Dsl in Lisp e Java

  1. 1. DSL in Lisp e Java Alessio Stalla alessiostalla@gmail.com
  2. 2. DSL in Lisp e Java Domain Specific Language Linguaggio specializzato in un certo dominio applicativo
  3. 3. Esempi di DSL SQL JavaFX Script Regex Shell Scripting JSP/JSF EL XUL (Mozilla) Ant tasks Spring WebFlow ecc. ecc.
  4. 4. DSL e programmazione Bottom-Up Language Oriented Programming (M. Fowler) o Bottom-Up Programming (P. Graham) Avvicinare il Linguaggio al Problema (Bottom-Up) invece di avvicinare il problema al linguaggio (Top-Down)
  5. 5. DSL – Pro e Contro Pro • Linguaggio vicino al problema: alto livello di astrazione, concisione, semplicità, programmazione dichiarativa • Ciclo di sviluppo più snello, rapid prototyping • DSL sono linguaggi di programmazione: possiamo usare le tecniche che conosciamo – variabili, funzioni, classi, ...
  6. 6. DSL – Pro e Contro Contro • Babele di linguaggi: curva di apprendimento, scarso supporto dai tool di sviluppo • Inefficienza • DSL sono linguaggi di programmazione: necessario progettare e implementare parser, compilatore/interprete, ambiente di esecuzione, ...
  7. 7. Esempio Transaction t = tm.beginTransaction(); try { accounts.getAccount(quot;aquot;).withdraw(t, 100, quot;€quot;); accounts.getAccount(quot;bquot;).withdraw(t, 200, quot;€quot;); accounts.getAccount(quot;cquot;).deposit(t, 300, quot;€quot;); t.commit(); } catch(TransactionException e) { log.error(...); t.rollback(); }
  8. 8. Esempio with_transaction { withdraw 100 € from a; withdraw 200 € from b; deposit 300 € on c; } on_failure { log(...); }
  9. 9. Lisp Famiglia di linguaggi con origini molto antiche (John McCarthy, 1958) Nasce come linguaggio funzionale per la manipolazione di dati simbolici Tradizionalmente associato all'IA, ma con applicazioni in tutti i campi
  10. 10. Lisp Vari dialetti, i più usati oggi:  Common Lisp (ANSI standard, 1991)  Scheme  Emacs Lisp  Autolisp
  11. 11. (Common) Lisp Linguaggio Multiparadigma: Imperativo, Funzionale, OO, ... Interpretato e/o compilato Altamente interattivo Molte feature uniche ed interessanti, ma soprattutto... Ottimo per scrivere DSL
  12. 12. Un po' di teoria... Sintassi Semantica for(...) { ... } “The basic for statement executes some initialization code, then void method(args) { executes an Expression, a Statement, and some update ... code repeatedly until the value of } the Expression is false.” The Java Language Specification
  13. 13. Abstract Syntax Tree
  14. 14. In Lisp... Sintassi Sintassi Astratta – AST Semantica – valori Concreta (Oggetti in memoria) (Oggetti in memoria) (Caratteri) 123 123 (0x007a) 123 (0x007a) quot;abcquot; quot;abcquot; (abc0) quot;abcquot; (abc0) PIPPO pippo (SYMBOL { name = quot;PIPPOquot;, Valore della variabile PIPPO value = ..., function = ... }) (+ 1 2) [ ]->[ ]->[ ]->NIL 3 | | | (Funzione + applicata a 1 e 2) + 1 2
  15. 15. Code-is-Data! (defun fact (n) (if (= n 0) n (* n (fact (- n 1)))))
  16. 16. Lisp Sintassi Concreta READ Sintassi Astratta EVAL COMPILE Semantica
  17. 17. Macro  Funzioni eseguite prima della compilazione  Operano su Oggetti in memoria e non su testo  Sono scritte in Lisp  Permettono di estendere il linguaggio aggiungendo nuovi costrutti  Il tool perfetto per scrivere DSL!
  18. 18. Ricordate i Contro? • Babele di linguaggi: curva di apprendimento, scarso supporto dai tool di sviluppo Sintassi Uniforme (parser integrato) • Inefficienza Compilatore integrato e trasparente (macro) • DSL sono linguaggi di programmazione: necessario progettare e implementare parser, compilatore/interprete, ambiente di esecuzione... Riutilizzo massimo del linguaggio preesistente: parser, interprete, compilatore, IDE, ...
  19. 19. E Java? Common Lisp è uno standard Ne esistono numerose implementazioni, commerciali e open source ABCL (Armed Bear Common Lisp) gira sulla JVM Il compilatore produce bytecode Java ABCL è nato per portare Java a Lisp, non viceversa: API molto poco Java-like...
  20. 20. ABCL e JSR-223 ABCL supporterà a breve la Java Scripting API:  esecuzione di script da file/stream  chiamate dirette a funzioni Lisp  compilazione  implementazione di interfacce Java in Lisp
  21. 21. ABCL e JSR-223 In Lisp, un DSL è un'estensione del linguaggio tramite macro... ...ciò significa che anche il vostro DSL ABCL- based è integrato con la Java Scripting API! Morale: se stai pensando a XML... valuta invece Lisp e DSL!

×