Programowanie funkcjonalnefunkcyjnie z Clojure praktycznie      O budowaniu współbieżnej aplikacji graficznej              ...
Ja...cek Laskowski•   Entuzjasta Java EE, OSGi, SCA oraz programowania funkcyjnego (Clojure)•   Założyciel i lider Warszaw...
konferencja społeczności javowej w Polsce     Confitura 2011            http://confitura.pl            11 czerwiec          ...
Źródła inspiracji•   Programming Concurrency on the JVM: Mastering    Synchronization, STM, and Actors    http://www.jacek...
$ java -versionjava version "1.6.0_24"Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-10M3326)Java HotSpot(TM) 64-...
user=> ; przestrzeń nazewnicza (ang. namespace) w Clojureuser=> ; mapa symboli na ich odpowiedniki pełne - odnośniki i kla...
gui=> (import (javax.swing JFrame JButton JTextField JOptionPane))javax.swing.JOptionPanegui=> (import (java.awt GridLayou...
gui=> (JFrame. nazwa-konferencji)#<JFrame javax.swing.JFrame[frame1,0,22,0x0,invalid,hidden,layout=java.awt.BorderLayout,t...
gui=> (def f (JFrame. nazwa-konferencji))#gui/fgui=> (doto f         .pack         .show)#<JFrame javax.swing.JFrame[frame...
gui=> (.setSize f 600 300)nil
gui=> (def word-input-field (JTextField. 30))#gui/word-input-fieldgui=> (defn create-enter-handler [input-field] (fn enter-ha...
gui=> (add-action-listener word-input-field (create-enter-handlerword-input-field))#<Object$ActionListener$46793e3a clojure....
Programming Concurrency on the JVM, page 18
Programming Concurrency on the JVM, page 22
Model pamięci Java Memory barrier
•   Clojure jest językiem funkcyjnym•   Clojure hołduje funkcjom czystym (ang. pure functions)•   Tożsamość (ang. identity...
Współbieżność      vswielowątkowość
http://twitpic.com/4wdy02
Sztandarowy program współbieżny           w Clojure            ants.clj    http://paste.lisp.org/display/81878/raw
$ wc ants.clj   319 1323      9727 ants.clj$ grep Thread ants.clj   (. Thread (sleep ant-sleep-ms)) (. Thread (sleep anima...
$ cljClojure 1.3.0-alpha6user=> (load-file "ants.clj")nil
user=> (def ants (setup))#user/antsuser=> (send-off animator animation)#<Agent@12dfbabd: nil>
user=> (dorun (map #(send-off % behave) ants))nil
Clojure a stan•       4 rodzaje referencji (odwołań do pamięci) w Clojure    •     Vars - dynamiczna referencja do zmienne...
STAN
STAN
$ grep agent ants.clj  "create an ant at the location, returning an ant agent on the location"       (agent loc))))  "plac...
$ grep ref ants.clj;world is a 2d vector of refs to cells              (apply vector (map (fn [_] (ref (struct cell 0 0)))...
$ grep atom ants.clj
user=> (doc future)-------------------------clojure.core/future([& body])Macro Takes a body of expressions and yields a fu...
user=> (source future-cancel)(defn future-cancel "Cancels the future, if possible." {:added "1.1"  :static true} [^java.ut...
user=> (doc pmap)-------------------------clojure.core/pmap([f coll] [f coll & colls])  Like map, except f is applied in p...
clojure.lang.Agentuser=> (source agent)(defn agent...   ([state & options]     (let [a (new clojure.lang.Agent state)     ...
$ javap -classpath clojure.jar clojure.lang.AgentCompiled from "Agent.java"public class clojure.lang.Agent extends clojure...
clojure.lang.Atomuser=> (source atom)(defn atom...   ([x] (new clojure.lang.Atom x))   ([x & options] (setup-reference (at...
clojure.lang.Refuser=> (source ref)(defn ref...   ([x] (new clojure.lang.Ref x))   ([x & options]    (let [r ^clojure.lang...
Programowanie funkcjonalnefunkcyjnie z Clojure praktycznie      O budowaniu współbieżnej aplikacji graficznej              ...
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Clojure Praktycznie
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Clojure Praktycznie
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Clojure Praktycznie
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Clojure Praktycznie
infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Clojure Praktycznie
Upcoming SlideShare
Loading in …5
×

infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Clojure Praktycznie

1,418 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,418
On SlideShare
0
From Embeds
0
Number of Embeds
344
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

infoShare 2011 - Jacek Laskowski - Programowanie Funkcjonalne Funkcyjnie z Clojure Praktycznie

  1. 1. Programowanie funkcjonalnefunkcyjnie z Clojure praktycznie O budowaniu współbieżnej aplikacji graficznej Jacek Laskowski jacek@japila.pl http://www.JacekLaskowski.pl wersja 1.0, 12.05.2011
  2. 2. Ja...cek Laskowski• Entuzjasta Java EE, OSGi, SCA oraz programowania funkcyjnego (Clojure)• Założyciel i lider Warszawa JUG• Organizator Confitura 2011• Członek zespołu NetBeans DreamTeam• Blogger na http://JacekLaskowski.pl• Blogger na http://blog.japila.pl• Twittuje jako @jaceklaskowski• Członek zespołów Apache Geronimo i Apache OpenEJB• Specjalista produktów IBM WebSphere w IBM Polska
  3. 3. konferencja społeczności javowej w Polsce Confitura 2011 http://confitura.pl 11 czerwiec Warszawa (poprzednio Javarsovia)
  4. 4. Źródła inspiracji• Programming Concurrency on the JVM: Mastering Synchronization, STM, and Actors http://www.jaceklaskowski.pl/wiki/ Book_review:_Programming_Concurrency_on_the_JVM• Java Concurrency in Practice http://jcip.net
  5. 5. $ java -versionjava version "1.6.0_24"Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-10M3326)Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)$ cljuser=> (clojure-version)"1.3.0-alpha6"
  6. 6. user=> ; przestrzeń nazewnicza (ang. namespace) w Clojureuser=> ; mapa symboli na ich odpowiedniki pełne - odnośniki i klasyuser=> (ns gui)nilgui=>gui=> (def nazwa-konferencji "InfoShare")#gui/nazwa-konferencjigui=> (import javax.swing.JFrame)javax.swing.JFramegui=> (use clojure.contrib.swing-utils)nilgui=> (ns-interns gui){nazwa-konferencji #gui/nazwa-konferencji}
  7. 7. gui=> (import (javax.swing JFrame JButton JTextField JOptionPane))javax.swing.JOptionPanegui=> (import (java.awt GridLayout))java.awt.GridLayoutgui=> (use [clojure.contrib.swing-utils :only (add-action-listener)])nil
  8. 8. gui=> (JFrame. nazwa-konferencji)#<JFrame javax.swing.JFrame[frame1,0,22,0x0,invalid,hidden,layout=java.awt.BorderLayout,title=InfoShare,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]>
  9. 9. gui=> (def f (JFrame. nazwa-konferencji))#gui/fgui=> (doto f .pack .show)#<JFrame javax.swing.JFrame[frame2,0,22,128x37,layout=java.awt.BorderLayout,title=InfoShare,resizable,normal,defaultCloseOperation=HIDE_ON_CLOSE,rootPane=javax.swing.JRootPane[,0,22,128x15,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]>
  10. 10. gui=> (.setSize f 600 300)nil
  11. 11. gui=> (def word-input-field (JTextField. 30))#gui/word-input-fieldgui=> (defn create-enter-handler [input-field] (fn enter-handler [event] (let [w (.. input-field getText) msg (format "<html>Input: <b>%s</b></html>" w)] (do (JOptionPane/showMessageDialog nil msg "Information"JOptionPane/INFORMATION_MESSAGE) (.. input-field (requestFocusInWindow)) (.. input-field (selectAll))))))#gui/create-enter-handler
  12. 12. gui=> (add-action-listener word-input-field (create-enter-handlerword-input-field))#<Object$ActionListener$46793e3a clojure.contrib.swing_utils.proxy$java.lang.Object$ActionListener$46793e3a@50152643>gui=> (.add f word-input-field)#<JTextField javax.swing.JTextField[...]>gui=> (.pack f)nil
  13. 13. Programming Concurrency on the JVM, page 18
  14. 14. Programming Concurrency on the JVM, page 22
  15. 15. Model pamięci Java Memory barrier
  16. 16. • Clojure jest językiem funkcyjnym• Clojure hołduje funkcjom czystym (ang. pure functions)• Tożsamość (ang. identity) = logiczny byt, symbol• Stan (ang. state) = wartość• Czas (ang. time) = migawka• Clojure oddziela tożsamość od stanu = upraszcza współbieżność
  17. 17. Współbieżność vswielowątkowość
  18. 18. http://twitpic.com/4wdy02
  19. 19. Sztandarowy program współbieżny w Clojure ants.clj http://paste.lisp.org/display/81878/raw
  20. 20. $ wc ants.clj 319 1323 9727 ants.clj$ grep Thread ants.clj (. Thread (sleep ant-sleep-ms)) (. Thread (sleep animation-sleep-ms)) (. Thread (sleep evap-sleep-ms))
  21. 21. $ cljClojure 1.3.0-alpha6user=> (load-file "ants.clj")nil
  22. 22. user=> (def ants (setup))#user/antsuser=> (send-off animator animation)#<Agent@12dfbabd: nil>
  23. 23. user=> (dorun (map #(send-off % behave) ants))nil
  24. 24. Clojure a stan• 4 rodzaje referencji (odwołań do pamięci) w Clojure • Vars - dynamiczna referencja do zmiennej wartości (per wątek) • Refs - transakcyjny Var dla wielu wątków • Agents - asynchroniczny i niezależny • Atoms - synchroniczny i niezależny stan
  25. 25. STAN
  26. 26. STAN
  27. 27. $ grep agent ants.clj "create an ant at the location, returning an ant agent on the location" (agent loc)))) "places initial food and ants, returns seq of ant agents";ant agent functions;an ant agent tracks the location of an ant, and controls the behavior of "the main function for the ant agent" (send-off *agent* #behave))(def animator (agent nil)) (send-off *agent* #animation))(def evaporator (agent nil)) (send-off *agent* #evaporation))
  28. 28. $ grep ref ants.clj;world is a 2d vector of refs to cells (apply vector (map (fn [_] (ref (struct cell 0 0))) (rank-by (comp #(if (:home %) 1 0) deref) places) (rank-by (comp :pher deref) places))] (rank-by (comp :food deref) places) (rank-by (comp :pher deref) places))] (.setPreferredSize (new Dimension
  29. 29. $ grep atom ants.clj
  30. 30. user=> (doc future)-------------------------clojure.core/future([& body])Macro Takes a body of expressions and yields a future object that will invoke the body in another thread, and will cache the result and return it on all subsequent calls to deref/@. If the computation has not yet finished, calls to deref/@ will block.
  31. 31. user=> (source future-cancel)(defn future-cancel "Cancels the future, if possible." {:added "1.1" :static true} [^java.util.concurrent.Future f] (.cancel f true))
  32. 32. user=> (doc pmap)-------------------------clojure.core/pmap([f coll] [f coll & colls]) Like map, except f is applied in parallel. Semi-lazy in that the parallel computation stays ahead of the consumption, but doesnt realize the entire result unless required. Only useful for computationally intensive functions where the time of f dominates the coordination overhead.user=> (doc pcalls)-------------------------clojure.core/pcalls([& fns]) Executes the no-arg fns in parallel, returning a lazy sequence of their values
  33. 33. clojure.lang.Agentuser=> (source agent)(defn agent... ([state & options] (let [a (new clojure.lang.Agent state) opts (apply hash-map options)] (setup-reference a options) (when (:error-handler opts) (.setErrorHandler a (:error-handler opts))) (.setErrorMode a (or (:error-mode opts) (if (:error-handler opts) :continue :fail))) a)))
  34. 34. $ javap -classpath clojure.jar clojure.lang.AgentCompiled from "Agent.java"public class clojure.lang.Agent extends clojure.lang.ARef{ java.util.concurrent.atomic.AtomicReference aq; public static final java.util.concurrent.ExecutorServicepooledExecutor; public static final java.util.concurrent.ExecutorService soloExecutor; public java.lang.Object dispatch(clojure.lang.IFn, clojure.lang.ISeq,boolean); static void dispatchAction(clojure.lang.Agent$Action); void enqueue(clojure.lang.Agent$Action); public int getQueueCount(); public static int releasePendingSends(); ...
  35. 35. clojure.lang.Atomuser=> (source atom)(defn atom... ([x] (new clojure.lang.Atom x)) ([x & options] (setup-reference (atom x) options)))
  36. 36. clojure.lang.Refuser=> (source ref)(defn ref... ([x] (new clojure.lang.Ref x)) ([x & options] (let [r ^clojure.lang.Ref (setup-reference (ref x) options) opts (apply hash-map options)] (when (:max-history opts) (.setMaxHistory r (:max-history opts))) (when (:min-history opts) (.setMinHistory r (:min-history opts))) r)))
  37. 37. Programowanie funkcjonalnefunkcyjnie z Clojure praktycznie O budowaniu współbieżnej aplikacji graficznej Jacek Laskowski jacek@japila.pl http://www.JacekLaskowski.pl wersja 1.0, 12.05.2011

×