ClojureJVM språket som er“multi-core ready”    Alf Kristian Støyle
Concurrency dreier som om å gjøre flere urelaterte oppgaver omtrent samtidigParallelism dreier seg om å dele en oppgave i m...
Clojure
Accidental complexity
Alf Kristian Støyle7 års erfaring som programmerer
Clojure• General purpose• Lisp (List Processing)• Funksjonelt• Kompilert• Dynamisk typet• Tett knyttet til JVM’en
1; => 1"Hello World"; => "Hello World"
1; => 1"Hello World"; => "Hello World"(class 1); => java.lang.Integer(class "Hello world"); => java.lang.String
(println "Hello " "world"); “Hello world”; => nil
Funksjonsnavn(println "Hello " "world"); “Hello world”; => nil
Funksjonsnavn   Parametere(println "Hello " "world"); “Hello world”; => nil
Funksjonsnavn   Parametere(println "Hello " "world")                 ,; “Hello world”; => nil
Prefiks notasjon Funksjonsnavn   Parametere(println "Hello " "world")                 ,; “Hello world”; => nil
Methods.callStatic();methods.callInstance();callStatic();callInstance();this.callInstance();methods.callStatic();Methods.t...
(println "Hello world"); Hello world; => nil
(println "Hello world"); Hello world; => nil(sum 1 2 3); => 6
(println "Hello world"); Hello world; => nil(sum 1 2 3); => 6(+ 1 2); => 3
(println "Hello world"); Hello world; => nil(sum 1 2 3); => 6(+ 1 2); => 3(+ 1 2 3); => 6
(println "Hello world"); Hello world; => nil(sum 1 2 3); => 6(+ 1 2); => 3(+ 1 2 3); => 6(+); => 0
1 + 2 * 3
1 + 2 * 31 + (2 * 3)
1 + 2 * 31 + (2 * 3)(+ 1 (* 2 3))
Funksjoner(fn [& nums]  (apply + nums))
Funksjoner(def sum  (fn [& nums]    (apply + nums)))
Funksjoner(def sum              )
Funksjoner(def sum  (fn [& nums]    (apply + nums)))
Funksjoner(def sum  (fn [& nums]    (apply + nums)))(defn sum  [& nums] (apply + nums))
Lister!(3 2 1); => (3 2 1)(+ 3 2 1); => 6
Lister!(3 2 1); => (3 2 1)(+ 3 2 1); => 6(defn iterate  [f x] (cons x (lazy-seq (iterate f (f x)))))
Makroer
Makroer(postfix (2 1 +)); => 3
Makroer(defmacro postfix [form]  (reverse form))(postfix (2 1 +)); => 3
Makroer(infix (1 + 2)); => 3
Makroer(defmacro infix [form]  `(~(second form) ~(first form) ~@(nnext form)))(infix (1 + 2)); => 3
Makroer(defmacro infix [form]  `(~(second form) ~(first form) ~@(nnext form)))(infix (1 + 2)); => 3(macroexpand (infix (1 ...
(+ Clojure Alf Kristian)
(+ Clojure Alf Kristian)           oooooo             oooooo         oooooooooo         oooooooooo       oooooooooooooo   ...
Immutable collections; List(3 2 1); Vector[1 2 3]; Set#{1 2 3}; Map{1 "one", 2 "two"‚ 3 "three"}
Persistent data        structures(def my-list (3 2 1)); => (3 2 1)
Persistent data        structures(def my-list (3 2 1)); => (3 2 1)
Persistent data        structures(def my-list (3 2 1)); => (3 2 1)(def my-other-list (cons 4 my-list)); => (4 3 2 1)
Persistent data        structures(def my-list (3 2 1)); => (3 2 1)(def my-other-list (cons 4 my-list)); => (4 3 2 1)
Immutable records(defrecord Person [fname lname]); => user.Person(Person. "Alf" "Støyle"); => #:user.Person{:fname "Alf", ...
Immutable objects are always thread-safe.
Ren funksjonellprogrammering  f(x) = x + 2
Clojures filosofiVerdier Immutable/uforanderlig, primitiv eller sammensatt
Clojures filosofiVerdier Immutable/uforanderlig, primitiv eller sammensattIdentitet  En observert entitet som vi assosierer ...
Clojures filosofiVerdier Immutable/uforanderlig, primitiv eller sammensattIdentitet  En observert entitet som vi assosierer ...
Clojures filosofiVerdier Immutable/uforanderlig, primitiv eller sammensattIdentitet  En observert entitet som vi assosierer ...
Perception
Perception
Perception
Perception
Perception
Perception
Fra Rich Hickeys“Are we there yet”
Reference types• Atoms - synkron og ukoordinert oppdatering• Agents - asynkron og ukoordinert oppdatering• Refs - synkron ...
Reference types• Atoms - synkron og ukoordinert oppdatering• Agents - asynkron og ukoordinert oppdatering• Refs - synkron ...
Atoms(def an-atom (atom 0)); => #user/an-atom
Atoms(def an-atom (atom 0)); => #user/an-atom(swap! an-atom inc); => 1
Atoms(def an-atom (atom 0)); => #user/an-atom(swap! an-atom inc); => 1(deref an-atom); => 1
Atoms(def an-atom (atom 0)); => #user/an-atom(swap! an-atom inc); => 1(deref an-atom); => 1@an-atom; => 1
Agents(def an-agent (agent 0)); => #user/an-atom
Agents(def an-agent (agent 0)); => #user/an-atom(send an-agent inc); => #<Agent@9b7c63f: 0>
Agents(def an-agent (agent 0)); => #user/an-atom(send an-agent inc); => #<Agent@9b7c63f: 0>@an-agent; => ???
Agents(def an-agent (agent 0)); => #user/an-atom(send an-agent inc); => #<Agent@9b7c63f: 0>@an-agent              (await a...
Refs(def ref-1 (ref 0)); => #user/ref-1(def ref-2 (ref 0)); => #user/ref-2
Refs(def ref-1 (ref 0)); => #user/ref-1(def ref-2 (ref 0)); => #user/ref-2(alter ref-1 inc)
Refs(def ref-1 (ref 0)); => #user/ref-1(def ref-2 (ref 0)); => #user/ref-2(alter ref-1 inc); java.lang.IllegalStateExcepti...
Refs(def ref-1 (ref 0)); => #user/ref-1(def ref-2 (ref 0)); => #user/ref-2(alter ref-1 inc); java.lang.IllegalStateExcepti...
Refs(dosync  (alter ref-1 inc)  (alter ref-2 dec)); => -1
Refs(dosync  (alter ref-1 inc)  (alter ref-2 dec)); => -1@ref-1; => 2@ref-2; => -1
Refs(dosync  (alter ref-1 inc)  (dosync    (alter ref-2 dec))); => -2@ref-1; => 3@ref-2; => -2
Software transactional      memory
Software transactional      memory
Software transactional      memory   Transactional memory is to  shared-memory concurrency               as     garbage co...
Software transactional      memory
Software transactional      memory    Atomic    Consistent    Isolated    Durable
(dosync; ...  (commute ref-3 inc)  (alter ref-2 + @ref-1)); => 1
Oppsummering• Skiller tilstand og identitet• Ingen mutable tilstand• Ingenting blokkerer• Clojure hjelper langt på vei med...
Oppsummering• Skiller tilstand og identitet• Ingen mutable tilstand• Ingenting blokkerer• Clojure hjelper langt på vei med...
clojure.org       slideshare.net/stoyle          aks@knowit.nomeetup.com/Oslo-Socially-Functional              Q &A
Clojure - JVM språket som er "multi-core ready"
Clojure - JVM språket som er "multi-core ready"
Clojure - JVM språket som er "multi-core ready"
Upcoming SlideShare
Loading in …5
×

Clojure - JVM språket som er "multi-core ready"

625 views

Published on

About how Clojure handles the multi-core problem. In Norwegian, but not too much text on slides.

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

No Downloads
Views
Total views
625
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • Korrekthet og ytelse\nPresisere at det vi skal snakke om er Concurrency.\n
  • \n
  • Startet mars i 2006.\nF&amp;#xF8;rste versjon 4 May 2009\nFikk veldig mye oppmerksomhet.\n
  • Alle problemer har en inherent complexity. Dette er det som uansett m&amp;#xE5; til for &amp;#xE5; l&amp;#xF8;se problemet.\n
  • V&amp;#xE6;rt programmerer i 7 &amp;#xE5;r, har hatt alle mulige roller som konsulent. De siste 4 &amp;#xE5;ra...\n
  • F&amp;#xF8;rst lisp i 1958 John McCarthy\nIkke objektorientert\nYtelse nesten som Java\n
  • \n
  • Cambridge polish notation\n
  • Cambridge polish notation\n
  • Cambridge polish notation\n
  • Cambridge polish notation\n
  • Cambridge polish notation\n
  • Cambridge polish notation\n
  • Cambridge polish notation\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Makroer brukes bl.a. for kontrollstrukturer.\nClojure er et lite spr&amp;#xE5;k - For comprehensions\n\nDersom du ikke skj&amp;#xF8;nte dette...\n
  • Makroer brukes bl.a. for kontrollstrukturer.\nClojure er et lite spr&amp;#xE5;k - For comprehensions\n\nDersom du ikke skj&amp;#xF8;nte dette...\n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Perception: You don&apos;t rub your brain on a value, there is a disconnect. Perception is massively parallel and requires no coordination. Uncoordinated.\n\n Med l&amp;#xE5;semodell, vil programmet g&amp;#xE5; tregere jo flere som oppfatter/perceives meg?\n
  • \n
  • \n
  • \n
  • Epokisk tidsmodell\n
  • \n
  • Gjenta egenskaper! N&amp;#xE5;r brukes dette!\n
  • Gjenta egenskaper! N&amp;#xE5;r brukes dette!\n
  • Gjenta egenskaper! N&amp;#xE5;r brukes dette!\n
  • Gjenta egenskaper. N&amp;#xE5;r brukes dette!\nActors vs agents:\nAc -&gt; Sende tilstand til oppf&amp;#xF8;rsel\nAg -&gt; Sende oppf&amp;#xF8;rsel til tilstand\nSynkron perception\n
  • Gjenta egenskaper. N&amp;#xE5;r brukes dette!\nActors vs agents:\nAc -&gt; Sende tilstand til oppf&amp;#xF8;rsel\nAg -&gt; Sende oppf&amp;#xF8;rsel til tilstand\nSynkron perception\n
  • Gjenta egenskaper. N&amp;#xE5;r brukes dette!\nActors vs agents:\nAc -&gt; Sende tilstand til oppf&amp;#xF8;rsel\nAg -&gt; Sende oppf&amp;#xF8;rsel til tilstand\nSynkron perception\n
  • Gjenta egenskaper, n&amp;#xE5;r brukes dette\n
  • Gjenta egenskaper, n&amp;#xE5;r brukes dette\n
  • Gjenta egenskaper, n&amp;#xE5;r brukes dette\n
  • \n
  • \n
  • STM var en av hoved&amp;#xE5;rsakene til at Clojure ble s&amp;#xE5;pass fort kjent.\nAnalogi\n
  • Snakke om .Net prosjektet\n
  • Atomic - rollback ved transactions ellers vil det committe\nConsistent - constraints i database, set-validator\nIsolated - Snapshot MVCC\nMen... kan gi rollback.\nEget eksempel 10 000 retries.\nEksempel tungt oppdaterer en ref som f&amp;#xE5; konkurrerer om. S&amp;#xE5; gj&amp;#xF8;r den en lett jobb som oppdaterer en ref som mange konkurrerer om.\n
  • Atomic - rollback ved transactions ellers vil det committe\nConsistent - constraints i database, set-validator\nIsolated - Snapshot MVCC\nMen... kan gi rollback.\nEget eksempel 10 000 retries.\nEksempel tungt oppdaterer en ref som f&amp;#xE5; konkurrerer om. S&amp;#xE5; gj&amp;#xF8;r den en lett jobb som oppdaterer en ref som mange konkurrerer om.\n
  • Atomic - rollback ved transactions ellers vil det committe\nConsistent - constraints i database, set-validator\nIsolated - Snapshot MVCC\nMen... kan gi rollback.\nEget eksempel 10 000 retries.\nEksempel tungt oppdaterer en ref som f&amp;#xE5; konkurrerer om. S&amp;#xE5; gj&amp;#xF8;r den en lett jobb som oppdaterer en ref som mange konkurrerer om.\n
  • \n
  • N&amp;#xE5;r man tenker seg om -&gt; fornuftig m&amp;#xE5;te &amp;#xE5; modellere tilstand p&amp;#xE5;. Bonusen er jo da at dette fungerer veldig bra i en concurrent setting.\n
  • N&amp;#xE5;r man tenker seg om -&gt; fornuftig m&amp;#xE5;te &amp;#xE5; modellere tilstand p&amp;#xE5;. Bonusen er jo da at dette fungerer veldig bra i en concurrent setting.\n
  • \n
  • Clojure - JVM språket som er "multi-core ready"

    1. 1. ClojureJVM språket som er“multi-core ready” Alf Kristian Støyle
    2. 2. Concurrency dreier som om å gjøre flere urelaterte oppgaver omtrent samtidigParallelism dreier seg om å dele en oppgave i mange deloppgaver som kan gjøres concurrent
    3. 3. Clojure
    4. 4. Accidental complexity
    5. 5. Alf Kristian Støyle7 års erfaring som programmerer
    6. 6. Clojure• General purpose• Lisp (List Processing)• Funksjonelt• Kompilert• Dynamisk typet• Tett knyttet til JVM’en
    7. 7. 1; => 1"Hello World"; => "Hello World"
    8. 8. 1; => 1"Hello World"; => "Hello World"(class 1); => java.lang.Integer(class "Hello world"); => java.lang.String
    9. 9. (println "Hello " "world"); “Hello world”; => nil
    10. 10. Funksjonsnavn(println "Hello " "world"); “Hello world”; => nil
    11. 11. Funksjonsnavn Parametere(println "Hello " "world"); “Hello world”; => nil
    12. 12. Funksjonsnavn Parametere(println "Hello " "world") ,; “Hello world”; => nil
    13. 13. Prefiks notasjon Funksjonsnavn Parametere(println "Hello " "world") ,; “Hello world”; => nil
    14. 14. Methods.callStatic();methods.callInstance();callStatic();callInstance();this.callInstance();methods.callStatic();Methods.this.callInstance();Methods.this.callStatic();
    15. 15. (println "Hello world"); Hello world; => nil
    16. 16. (println "Hello world"); Hello world; => nil(sum 1 2 3); => 6
    17. 17. (println "Hello world"); Hello world; => nil(sum 1 2 3); => 6(+ 1 2); => 3
    18. 18. (println "Hello world"); Hello world; => nil(sum 1 2 3); => 6(+ 1 2); => 3(+ 1 2 3); => 6
    19. 19. (println "Hello world"); Hello world; => nil(sum 1 2 3); => 6(+ 1 2); => 3(+ 1 2 3); => 6(+); => 0
    20. 20. 1 + 2 * 3
    21. 21. 1 + 2 * 31 + (2 * 3)
    22. 22. 1 + 2 * 31 + (2 * 3)(+ 1 (* 2 3))
    23. 23. Funksjoner(fn [& nums] (apply + nums))
    24. 24. Funksjoner(def sum (fn [& nums] (apply + nums)))
    25. 25. Funksjoner(def sum )
    26. 26. Funksjoner(def sum (fn [& nums] (apply + nums)))
    27. 27. Funksjoner(def sum (fn [& nums] (apply + nums)))(defn sum [& nums] (apply + nums))
    28. 28. Lister!(3 2 1); => (3 2 1)(+ 3 2 1); => 6
    29. 29. Lister!(3 2 1); => (3 2 1)(+ 3 2 1); => 6(defn iterate [f x] (cons x (lazy-seq (iterate f (f x)))))
    30. 30. Makroer
    31. 31. Makroer(postfix (2 1 +)); => 3
    32. 32. Makroer(defmacro postfix [form] (reverse form))(postfix (2 1 +)); => 3
    33. 33. Makroer(infix (1 + 2)); => 3
    34. 34. Makroer(defmacro infix [form] `(~(second form) ~(first form) ~@(nnext form)))(infix (1 + 2)); => 3
    35. 35. Makroer(defmacro infix [form] `(~(second form) ~(first form) ~@(nnext form)))(infix (1 + 2)); => 3(macroexpand (infix (1 + 2))); => (+ 1 2)
    36. 36. (+ Clojure Alf Kristian)
    37. 37. (+ Clojure Alf Kristian) oooooo oooooo oooooooooo oooooooooo oooooooooooooo oooooooooooooo ooooooooooooooooo ooooooooooooooooo ooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooooooo ooooooooooooooooooooooooooo ooooooooooooooooooooooo ooooooooooooooooooo ooooooooooooooo ooooooooooo ooooooo ooo o Clojure + Alf Kristian
    38. 38. Immutable collections; List(3 2 1); Vector[1 2 3]; Set#{1 2 3}; Map{1 "one", 2 "two"‚ 3 "three"}
    39. 39. Persistent data structures(def my-list (3 2 1)); => (3 2 1)
    40. 40. Persistent data structures(def my-list (3 2 1)); => (3 2 1)
    41. 41. Persistent data structures(def my-list (3 2 1)); => (3 2 1)(def my-other-list (cons 4 my-list)); => (4 3 2 1)
    42. 42. Persistent data structures(def my-list (3 2 1)); => (3 2 1)(def my-other-list (cons 4 my-list)); => (4 3 2 1)
    43. 43. Immutable records(defrecord Person [fname lname]); => user.Person(Person. "Alf" "Støyle"); => #:user.Person{:fname "Alf", :lname "Støyle"}
    44. 44. Immutable objects are always thread-safe.
    45. 45. Ren funksjonellprogrammering f(x) = x + 2
    46. 46. Clojures filosofiVerdier Immutable/uforanderlig, primitiv eller sammensatt
    47. 47. Clojures filosofiVerdier Immutable/uforanderlig, primitiv eller sammensattIdentitet En observert entitet som vi assosierer med en serie relaterte tilstander (verdier) over tid
    48. 48. Clojures filosofiVerdier Immutable/uforanderlig, primitiv eller sammensattIdentitet En observert entitet som vi assosierer med en serie relaterte tilstander (verdier) over tidTilstand Verdien til en identitet i på et gitt tidspunkt
    49. 49. Clojures filosofiVerdier Immutable/uforanderlig, primitiv eller sammensattIdentitet En observert entitet som vi assosierer med en serie relaterte tilstander (verdier) over tidTilstand Verdien til en identitet i på et gitt tidspunktTid Relativ før/etter endring av identitet
    50. 50. Perception
    51. 51. Perception
    52. 52. Perception
    53. 53. Perception
    54. 54. Perception
    55. 55. Perception
    56. 56. Fra Rich Hickeys“Are we there yet”
    57. 57. Reference types• Atoms - synkron og ukoordinert oppdatering• Agents - asynkron og ukoordinert oppdatering• Refs - synkron og koordinert oppdatering
    58. 58. Reference types• Atoms - synkron og ukoordinert oppdatering• Agents - asynkron og ukoordinert oppdatering• Refs - synkron og koordinert oppdatering• Synkron perception
    59. 59. Atoms(def an-atom (atom 0)); => #user/an-atom
    60. 60. Atoms(def an-atom (atom 0)); => #user/an-atom(swap! an-atom inc); => 1
    61. 61. Atoms(def an-atom (atom 0)); => #user/an-atom(swap! an-atom inc); => 1(deref an-atom); => 1
    62. 62. Atoms(def an-atom (atom 0)); => #user/an-atom(swap! an-atom inc); => 1(deref an-atom); => 1@an-atom; => 1
    63. 63. Agents(def an-agent (agent 0)); => #user/an-atom
    64. 64. Agents(def an-agent (agent 0)); => #user/an-atom(send an-agent inc); => #<Agent@9b7c63f: 0>
    65. 65. Agents(def an-agent (agent 0)); => #user/an-atom(send an-agent inc); => #<Agent@9b7c63f: 0>@an-agent; => ???
    66. 66. Agents(def an-agent (agent 0)); => #user/an-atom(send an-agent inc); => #<Agent@9b7c63f: 0>@an-agent (await an-agent); => ??? ; => nil @an-agent ; => 1
    67. 67. Refs(def ref-1 (ref 0)); => #user/ref-1(def ref-2 (ref 0)); => #user/ref-2
    68. 68. Refs(def ref-1 (ref 0)); => #user/ref-1(def ref-2 (ref 0)); => #user/ref-2(alter ref-1 inc)
    69. 69. Refs(def ref-1 (ref 0)); => #user/ref-1(def ref-2 (ref 0)); => #user/ref-2(alter ref-1 inc); java.lang.IllegalStateException:; No transaction running
    70. 70. Refs(def ref-1 (ref 0)); => #user/ref-1(def ref-2 (ref 0)); => #user/ref-2(alter ref-1 inc); java.lang.IllegalStateException:; No transaction running(dosync (alter ref-1 inc)); => 1
    71. 71. Refs(dosync (alter ref-1 inc) (alter ref-2 dec)); => -1
    72. 72. Refs(dosync (alter ref-1 inc) (alter ref-2 dec)); => -1@ref-1; => 2@ref-2; => -1
    73. 73. Refs(dosync (alter ref-1 inc) (dosync (alter ref-2 dec))); => -2@ref-1; => 3@ref-2; => -2
    74. 74. Software transactional memory
    75. 75. Software transactional memory
    76. 76. Software transactional memory Transactional memory is to shared-memory concurrency as garbage collection is to memory management
    77. 77. Software transactional memory
    78. 78. Software transactional memory Atomic Consistent Isolated Durable
    79. 79. (dosync; ... (commute ref-3 inc) (alter ref-2 + @ref-1)); => 1
    80. 80. Oppsummering• Skiller tilstand og identitet• Ingen mutable tilstand• Ingenting blokkerer• Clojure hjelper langt på vei med concurrency
    81. 81. Oppsummering• Skiller tilstand og identitet• Ingen mutable tilstand• Ingenting blokkerer• Clojure hjelper langt på vei med concurrency• Mindre “accidental complexity”
    82. 82. clojure.org slideshare.net/stoyle aks@knowit.nomeetup.com/Oslo-Socially-Functional Q &A

    ×