Erlang Clojure KuPOxyts
-
Upload
dom-desicilia -
Category
Documents
-
view
219 -
download
0
Transcript of Erlang Clojure KuPOxyts
-
8/12/2019 Erlang Clojure KuPOxyts
1/120
Gernot Starke & Stefan Tilkow | innoQ
Erlang, Clojure & Co.:
Was der Mainstream von
Alternativen lernen kann
-
8/12/2019 Erlang Clojure KuPOxyts
2/120
Erlang & Clojure
Was Sie aus Prolog,
Gernot Starke, Stefan Tilkov
fr den Mainstream lernen knnen
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
3/120
Wir ber uns...
Stefan Tilkov Gernot Starke
http://www.innoq.com
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
4/120
Prolog Clojure Erlang Node.js
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
5/120
Kernkonzepte
Prolog Clojure Erlang Node.js
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
6/120
Kernkonzepte
Praxistauglichkeit
Prolog Clojure Erlang Node.js
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
7/120
-
8/12/2019 Erlang Clojure KuPOxyts
8/120
Kernkonzepte
Praxistauglichkeit
Java-Bibliotheken
Java-Idiome
Prolog Clojure Erlang Node.js
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
9/120
Prolog
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
10/120
Anforderungen...Hinweise:
Der Brite lebt im roten Haus.
Der Schwede hlt einen Hund.
Der Dne trinkt gern Tee.
Das grne Haus steht direkt links neben dem weien
Haus.
Der Besitzer des grnen Hauses trinkt Kaffee.
Die Person, die Pall Mall raucht, hlt einen Vogel.
Der Mann, der im mittleren Haus wohnt, trinkt Milch. Der Besitzer des gelben Hauses raucht Dunhill.
Der Norweger wohnt im ersten Haus.
Der Marlboro-Raucher wohnt neben dem, der eine
Katze hlt.
Der Mann, der ein Pferd hlt, wohnt neben dem, der
Dunhill raucht.
Der Winfield-Raucher trinkt gern Bier.
Der Norweger wohnt neben dem blauen Haus.
Der Deutsche raucht Rothmans.
Der Marlboro-Raucher hat einen Nachbarn, der
Wasser trinkt.
1. Es gibt fnf Huser mit je einer anderenFarbe.
2. In jedem Haus wohnt eine Person anderer
Nationalitt.
3. Jeder Hausbewohner bevorzugt ein
bestimmtes Getrnk, raucht eine bestimmte
Zigarettenmarke und hlt ein bestimmtes
Haustier.
4. Keine der fnf Personen trinkt das gleiche
Getrnk, raucht die gleichen Zigaretten oder
hlt das gleiche Tier wie seine Nachbarn.
Angeblich nach Einstein, hier aus Wikipedia
Frage: Wem gehrt der Fisch?
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
11/120
Lsung in Prolog
run :- X =[_,_,_,_,_],/* Es gibt (nebeneinander) 5 Huser */ member([rot,brite,_,_,_],X),/* Der Brite lebt im roten Haus */ member([_,schwede,_,_,hund],X),/* Der Schwede hlt einen Hund */ member([_,daene,tee,_,_],X),/* Der Dne trinkt gern Tee */ links([gruen,_,_,_,_],[weiss,_,_,_,_],X),/* Das grne Haus steht links vom weien Haus */ member([gruen,_,kaffee,_,_],X),/* Der Besitzer des grnen Hauses trinkt Kaffee */
member([_,_,_,pallmall,vogel],X),/* Die Person, die Pall Mall raucht, hlt einen Vogel */
mittleres([_,_,milch,_,_],X),/* Der Mann, der im mittleren Haus wohnt, trinkt Milch */ member([gelb,_,_,dunhill,_],X),/* Der Besitzer des gelben Hauses raucht Dunhill */ erstes([_,norweger,_,_,_],X),/* Der Norweger wohnt im 1. Haus */ neben([_,_,_,marlboro,_],[_,_,_,_,katze],X),/* Der Marlboro-Raucher wohnt neben Katzenbesitzer */ neben([_,_,_,_,pferd],[_,_,_,dunhill,_],X),/* Der Pferdehalter wohnt neben dem Dunhillraucher */ member([_,_,bier,winfield,_],X),/* Der Winfield-Raucher trinkt gern Bier */ neben([_,norweger,_,_,_],[blau,_,_,_,_],X),/* Der Norweger wohnt neben dem blauen Haus */ member([_,deutsche,_,rothmans,_],X),/* Der Deutsche raucht Rothmans */ neben([_,_,_,marlboro,_],[_,_,wasser,_,_],X),/* Der Nachbar des Marlboro-Rauchers trinkt Wasser */
member([_,N,_,_,fisch],X),/* Der mit der Nationalitt N hat einen Fisch */
write(X),nl,/* Ausgabe aller Huser */ write('Der '),write(N),write(' hat einen Fisch als Haustier.'),nl.
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
12/120
Lsung in Prolog
run :- X =[_,_,_,_,_],/* Es gibt (nebeneinander) 5 Huser */ member([rot,brite,_,_,_],X),
/* Der Brite lebt im roten Haus */ member([_,schwede,_,_,hund],X),
/* Der Schwede hlt einen Hund */
member([_,daene,tee,_,_],X),/* Der Dne trinkt gern Tee */
links([gruen,_,_,_,_],[weiss,_,_,_,_],X),
/* Das grne Haus steht links vom weien Haus */ %.....
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
13/120
Lsung in Prolog
erstes(E,[E|_]).
mittleres(M,[_,_,M,_,_]).links(A,B,[A,B|_]).links(A,B,[_|R]):- links(A,B,R).neben(A,B,L):- links(A,B,L);links(B,A,L).
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
14/120
Prolog
Basis: Unifi
kation von Termen(Mustererkennung)
Vorgabe von Fakten und Regeln
(mit freien Variablen)
Prolog versucht, Wahrheit zu beweisen
Beispiel: neben(A, b, [a,c,b,d]) ->
A = c
A = d
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
15/120
Prolog...
Backtracking
=systematischesAusprobieren
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
16/120
Prolog: Kernkonzepte
RegelorientierungBacktracking
Deklarativer Ansatz
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
17/120
Prolog: Praxistauglichkeit
Schwierig (riskant): Integration in Java-Mainstream
tu-Prolog als Eclipse-Plugin,
experimentell + fragil
Gut geeignet fr Planungsprobleme
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
18/120
Prolog: Java-Bibliotheken
Regelsysteme heute gesch
s- undintegrationsfhig:
kommerzielle Regel-Engines
freie Regel-Engine(s), etwa JBoss-Drools
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
19/120
JBoss Drools
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
20/120
Clojure
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
21/120
Clojure: Datenstrukturen
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
22/120
Clojure: Datenstrukturen
Numbers2 3 4 0.234
3/5 -2398989892820093093090292321
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
23/120
Clojure: Datenstrukturen
Numbers2 3 4 0.234
3/5 -2398989892820093093090292321
Strings "Hello""World"
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
24/120
Clojure: Datenstrukturen
Numbers2 3 4 0.234
3/5 -2398989892820093093090292321
Strings "Hello""World"
Characters \a \b \c
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
25/120
-
8/12/2019 Erlang Clojure KuPOxyts
26/120
Clojure: Datenstrukturen
Numbers2 3 4 0.234
3/5 -2398989892820093093090292321
Strings "Hello""World"
Characters \a \b \c
Keywords :first:last
Symbols a b c
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
27/120
Clojure: Datenstrukturen
Numbers2 3 4 0.234
3/5 -2398989892820093093090292321
Strings "Hello""World"
Characters \a \b \c
Keywords :first:last
Symbols a b c
Regexps #"Ch.*se"
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
28/120
Clojure: Datenstrukturen
Numbers2 3 4 0.234
3/5 -2398989892820093093090292321
Strings "Hello""World"
Characters \a \b \c
Keywords :first:last
Symbols a b c
Regexps #"Ch.*se"
Lists(a b c)
((:first :last "Str" 3) (a b))
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
29/120
Clojure: Datenstrukturen
Numbers2 3 4 0.234
3/5 -2398989892820093093090292321
Strings "Hello""World"
Characters \a \b \c
Keywords :first:last
Symbols a b c
Regexps #"Ch.*se"
Lists(a b c)
((:first :last "Str" 3) (a b))
Vectors [2 4 6 9 23][2 4 6 [8 9] [10 11] 9 23]
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
30/120
Clojure: Datenstrukturen
Numbers2 3 4 0.234
3/5 -2398989892820093093090292321
Strings "Hello""World"
Characters \a \b \c
Keywords :first:last
Symbols a b c
Regexps #"Ch.*se"
Lists(a b c)
((:first :last "Str" 3) (a b))
Vectors [2 4 6 9 23][2 4 6 [8 9] [10 11] 9 23]
Maps {:de"Deutschland", :fr"France"}
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
31/120
Clojure: Datenstrukturen
Numbers2 3 4 0.234
3/5 -2398989892820093093090292321
Strings "Hello""World"
Characters \a \b \c
Keywords :first:last
Symbols a b c
Regexps #"Ch.*se"
Lists(a b c)
((:first :last "Str" 3) (a b))
Vectors [2 4 6 9 23][2 4 6 [8 9] [10 11] 9 23]
Maps {:de"Deutschland", :fr"France"}
Sets #{"Bread" "Cheese" "Wine"}
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
32/120
Syntax
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
33/120
Youve just seen it Rich Hickey
Thursday, April 19, 12
Cl j B i i l
-
8/12/2019 Erlang Clojure KuPOxyts
34/120
Clojure: Beispie;l(nssample.grep
"A simple complete Clojure program." (:use[clojure.contrib.io :only[read-lines]]) (:gen-class))(defnnumbered-lines[lines]
(mapvector (iterateinc 0) lines))
(defngrep-in-file[pattern file]
{file (filter#(re-findpattern (second %)) (numbered-lines (read-lines file)))})
(defngrep-in-files[pattern files] (applymerge (map#(grep-in-file pattern %) files)))(defnprint-matches[matches]
(doseq[[fname submatches] matches, [line-no, match] submatches] (println (strfname ":"line-no ":"match))))(defn-main[pattern & files]
(if(or(nil?pattern) (empty?files)) (println "Usage: grep ") (do
(println (format"grep started with pattern %s and file(s) %s"
pattern (applystr (interpose", "files)))) (print-matches (grep-in-files (re-pattern pattern) files)) (println "Done."))))
Thursday, April 19, 12
Cl j B i i l
-
8/12/2019 Erlang Clojure KuPOxyts
35/120
Clojure: Beispie;l(nssample.grep
"A simple complete Clojure program." (:use[clojure.contrib.io :only[read-lines]]) (:gen-class))(defnnumbered-lines[lines]
(mapvector (iterateinc 0) lines))
(defngrep-in-file[pattern file]
{file (filter#(re-findpattern (second %)) (numbered-lines (read-lines file)))})
(defngrep-in-files[pattern files] (applymerge (map#(grep-in-file pattern %) files)))(defnprint-matches[matches]
(doseq[[fname submatches] matches, [line-no, match] submatches] (println (strfname ":"line-no ":"match))))(defn-main[pattern & files]
(if(or(nil?pattern) (empty?files)) (println "Usage: grep ") (do
(println (format"grep started with pattern %s and file(s) %s"
pattern (applystr (interpose", "files)))) (print-matches (grep-in-files (re-pattern pattern) files)) (println "Done."))))
Thursday, April 19, 12
Cl j B i i l
-
8/12/2019 Erlang Clojure KuPOxyts
36/120
Clojure: Beispie;l(nssample.grep
"A simple complete Clojure program." (:use[clojure.contrib.io :only[read-lines]]) (:gen-class))(defnnumbered-lines[lines]
(mapvector (iterateinc 0) lines))
(defngrep-in-file[pattern file]
{file (filter#(re-findpattern (second %)) (numbered-lines (read-lines file)))})
(defngrep-in-files[pattern files] (applymerge (map#(grep-in-file pattern %) files)))(defnprint-matches[matches]
(doseq[[fname submatches] matches, [line-no, match] submatches] (println (strfname ":"line-no ":"match))))(defn-main[pattern & files]
(if(or(nil?pattern) (empty?files)) (println "Usage: grep ") (do
(println (format"grep started with pattern %s and file(s) %s"
pattern (applystr (interpose", "files)))) (print-matches (grep-in-files (re-pattern pattern) files)) (println "Done."))))
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
37/120
Cl j B i i l
-
8/12/2019 Erlang Clojure KuPOxyts
38/120
Clojure: Beispie;l(nssample.grep
"A simple complete Clojure program." (:use[clojure.contrib.io :only[read-lines]]) (:gen-class))(defnnumbered-lines[lines]
(mapvector (iterateinc 0) lines))
(defngrep-in-file[pattern file]
{file (filter#(re-findpattern (second %)) (numbered-lines (read-lines file)))})
(defngrep-in-files[pattern files] (applymerge (map#(grep-in-file pattern %) files)))(defnprint-matches[matches]
(doseq[[fname submatches] matches, [line-no, match] submatches] (println (strfname ":"line-no ":"match))))(defn-main[pattern & files]
(if(or(nil?pattern) (empty?files)) (println "Usage: grep ") (do
(println (format"grep started with pattern %s and file(s) %s"
pattern (applystr (interpose", "files)))) (print-matches (grep-in-files (re-pattern pattern) files)) (println "Done."))))
Thursday, April 19, 12
Clojure Beispie l
-
8/12/2019 Erlang Clojure KuPOxyts
39/120
Clojure: Beispie;l(nssample.grep
"A simple complete Clojure program." (:use[clojure.contrib.io :only[read-lines]]) (:gen-class))(defnnumbered-lines[lines]
(mapvector (iterateinc 0) lines))
(defngrep-in-file[pattern file]
{file (filter#(re-findpattern (second %)) (numbered-lines (read-lines file)))})
(defngrep-in-files[pattern files] (applymerge (map#(grep-in-file pattern %) files)))(defnprint-matches[matches]
(doseq[[fname submatches] matches, [line-no, match] submatches] (println (strfname ":"line-no ":"match))))(defn-main[pattern & files]
(if(or(nil?pattern) (empty?files)) (println "Usage: grep ") (do
(println (format"grep started with pattern %s and file(s) %s"
pattern (applystr (interpose", "files)))) (print-matches (grep-in-files (re-pattern pattern) files)) (println "Done."))))
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
40/120
Clojure: Features
Persistent data structures
Support for concurrent programmingSequences
Destructuring
List comprehensionsMetadata
Optiional type information
Multimethods
Pre & Post Conditions
Records/Protocols
Extensive core and contrib libraries
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
41/120
Clojure: Features
Persistent data structures
Support for concurrent programmingSequences
Destructuring
List comprehensionsMetadata
Optiional type information
Multimethods
Pre & Post Conditions
Records/Protocols
Extensive core and contrib libraries
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
42/120
4711: Personfirst: John
last: Smith
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
43/120
4711: Personfirst: John
last: Smith
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
44/120
4711: Personfirst: John
last: Smith
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
45/120
4711: Personfirst: John
last: Smith
0815: Person
first: Jane
last: Doe
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
46/120
4711: Personfirst: John
last: Smith
0815: Person
first: Jane
last: Doe
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
47/120
4711: Personfirst: John
last: Smith
0815: Person
first: Jane
last: Doe
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
48/120
4711: Personfirst: John
last: Smith
0815: Person
first: Jane
last: Doe
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
49/120
4711: Personfirst: John
last: Smith
0815: Person
first: Jane
last: Doe
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
50/120
4711: Personfirst: John
last: Smith
0815: Person
first: Jane
last: Doe
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
51/120
-
8/12/2019 Erlang Clojure KuPOxyts
52/120
I t bilit
-
8/12/2019 Erlang Clojure KuPOxyts
53/120
Immutability
user> (defv(vec (range10)))
Thursday, April 19, 12
I t bilit
-
8/12/2019 Erlang Clojure KuPOxyts
54/120
Immutability
user> (defv(vec (range10)))
#'user/v
Thursday, April 19, 12
I t bilit
-
8/12/2019 Erlang Clojure KuPOxyts
55/120
Immutability
user> (defv(vec (range10)))
user> v
#'user/v
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
56/120
I t bilit
-
8/12/2019 Erlang Clojure KuPOxyts
57/120
Immutability
user> (defv(vec (range10)))
user> (assocv 1 99)
[0 1 2 3 4 5 6 7 8 9]
user> v
#'user/v
Thursday, April 19, 12
I t bilit
-
8/12/2019 Erlang Clojure KuPOxyts
58/120
Immutability
user> (defv(vec (range10)))
user> (assocv 1 99)
[0 1 2 3 4 5 6 7 8 9]
user> v
#'user/v
[0 99 2 3 4 5 6 7 8 9]
Thursday, April 19, 12
Immutability
-
8/12/2019 Erlang Clojure KuPOxyts
59/120
Immutability
user> (defv(vec (range10)))
user> (assocv 1 99)
[0 1 2 3 4 5 6 7 8 9]
user> v
#'user/v
[0 99 2 3 4 5 6 7 8 9]user> v
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
60/120
Immutability
-
8/12/2019 Erlang Clojure KuPOxyts
61/120
Immutability
user> (defv(vec (range10)))
user> (assocv 1 99)
[0 1 2 3 4 5 6 7 8 9]
user> v
#'user/v
[0 99 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
user> v
user> (defv2 (assocv 1 99))
Thursday, April 19, 12
Immutability
-
8/12/2019 Erlang Clojure KuPOxyts
62/120
Immutability
user> (defv(vec (range10)))
user> (assocv 1 99)
[0 1 2 3 4 5 6 7 8 9]
user> v
#'user/v
[0 99 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
user> v
user> (defv2 (assocv 1 99))
#'user/v2
Thursday, April 19, 12
Immutability
-
8/12/2019 Erlang Clojure KuPOxyts
63/120
Immutability
user> (defv(vec (range10)))
user> (assocv 1 99)
[0 1 2 3 4 5 6 7 8 9]
user> v
#'user/v
[0 99 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
user> v
user> (defv2 (assocv 1 99))
user> v2
#'user/v2
Thursday, April 19, 12
Immutability
-
8/12/2019 Erlang Clojure KuPOxyts
64/120
Immutability
user> (defv(vec (range10)))
user> (assocv 1 99)
[0 1 2 3 4 5 6 7 8 9]
user> v
#'user/v
[0 99 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
user> v
user> (defv2 (assocv 1 99))
user> v2
#'user/v2
[0 99 2 3 4 5 6 7 8 9]
Thursday, April 19, 12
user> (defv(vec (range10)))
-
8/12/2019 Erlang Clojure KuPOxyts
65/120
9
4
7
0 1 6 83 5
2
v
Thursday, April 19, 12
user> (defv(vec (range10)))
-
8/12/2019 Erlang Clojure KuPOxyts
66/120
user> (defv2 (assocv 1 99))
9
4
7
0 1 6 83 5
2
v
Thursday, April 19, 12
user> (defv(vec (range10)))
-
8/12/2019 Erlang Clojure KuPOxyts
67/120
user> (defv2 (assocv 1 99))
9
4
7
0 1 6 83 5
2
v
99
Thursday, April 19, 12
user> (defv(vec (range10)))
-
8/12/2019 Erlang Clojure KuPOxyts
68/120
user> (defv2 (assocv 1 99))
9
4
7
0 1 6 83 5
2
v
99
Thursday, April 19, 12
user> (defv(vec (range10)))
-
8/12/2019 Erlang Clojure KuPOxyts
69/120
user> (defv2 (assocv 1 99))
9
4
7
0 1 6 83 5
2
v
99
Thursday, April 19, 12
user> (defv(vec (range10)))
-
8/12/2019 Erlang Clojure KuPOxyts
70/120
user> (defv2 (assocv 1 99))
9
4
7
0 1 6 83 5
2
v
99
v2
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
71/120
Performance Guarantees
-
8/12/2019 Erlang Clojure KuPOxyts
72/120
Performance Guaranteeshash-map sorted-map hash-set sorted-set vector queue list lazy seq
conj near-constant
logarithmic
near-constant
logarithmic
constant(tail)
constant(tail)
constant(head)
constant(head)
assoc near-
constant
logarith
mic
- - near-
constant
- - -
dissoc near-
constant
logarith
mic
- - - - - -
disj - - near-
constant
logarith
mic
- - - -
nth - - - - near-
constant
linear linear linear
get near-
constant
logarith
mic
near-
constant
logarith
mic
near-
constant
- - -
pop - - - - constant
(tail)
constant
(head)
constant
(head)
constant
(head)
peek - - - - constant
(tail)
constant
(head)
constant
(head)
constant
(head)
count constant constant constant constant constant constant constant linear
Thursday, April 19, 12
Clojure: Soware Transactional Memory (1)
-
8/12/2019 Erlang Clojure KuPOxyts
73/120
Clojure: Soware Transactional Memory (1)
(defnmake-account
[balance owner] {:balancebalance, :ownerowner})
Thursday, April 19, 12
Clojure: Soware Transactional Memory (1)
-
8/12/2019 Erlang Clojure KuPOxyts
74/120
Clojure: Soware Transactional Memory (1)
(defnmake-account
[balance owner] {:balancebalance, :ownerowner})
(defnwithdraw[account amount]
(assocaccount :balance(- (account :balance) amount)))
Thursday, April 19, 12
Clojure: Soware Transactional Memory (1)
-
8/12/2019 Erlang Clojure KuPOxyts
75/120
Clojure: Soware Transactional Memory (1)
(defnmake-account
[balance owner] {:balancebalance, :ownerowner})
(defnwithdraw[account amount]
(assocaccount :balance(- (account :balance) amount)))
(defndeposit[account amount] (assocaccount :balance(+ (account :balance) amount)))
Thursday, April 19, 12
Clojure: Soware Transactional Memory (2)
-
8/12/2019 Erlang Clojure KuPOxyts
76/120
Clojure: Soware Transactional Memory (2)
(defninit-accounts[] (defacc1(ref (make-account 1000 "alice"))) (defacc2(ref (make-account 1000 "bob"))) (defacc3(ref (make-account 1000 "charles"))))
(defntransfer [from to amount] (dosync (alterfrom withdraw amount) (alterto deposit amount)))
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
77/120
-
8/12/2019 Erlang Clojure KuPOxyts
78/120
-
8/12/2019 Erlang Clojure KuPOxyts
79/120
Clojure: Praxistauglichkeit
-
8/12/2019 Erlang Clojure KuPOxyts
80/120
Clojure: Praxistauglichkeit
Technisch: Einsatzfhig und praxistauglich
Politisch:
Schwer durchsetzbar (?)
Chance und Risiko
Nische: Concurrent andCorrect
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
81/120
Clojure: Java-Idiome
-
8/12/2019 Erlang Clojure KuPOxyts
82/120
Clojure: Java Idiome
Immutability
Anonymous Inner Classes
Daten statt spezifische Klassen
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
83/120
Erlang
Thursday, April 19, 12
Von Prolog zu Erlang
-
8/12/2019 Erlang Clojure KuPOxyts
84/120
Von Prolog zuErlang
Ericsson-Experimente zur
Hchstverfgbarkeit (>> 99.999%)
Implementierung von Telekom-Services
in verschiedenen Sprachen
Anforderungen: Zuverlssigkeit,
Parallelitt
Konventionelle Sprachen (u.a. C, C++)
schnitten schlecht ab... (aber Prolog fhltesich gut an)
Thursday, April 19, 12
Erlang Beispiel
-
8/12/2019 Erlang Clojure KuPOxyts
85/120
Erlang Beispiel
Aus: Cesarini & Thompson: Erlang Programming (OReilly, 2009)
Thursday, April 19, 12
Erlang - Theorie
-
8/12/2019 Erlang Clojure KuPOxyts
86/120
Erlang Theorie
Compiler (erlc) bersetzt in beam Format(Bogumil Erlang Abstract Machine)
Virtuelle Maschine fhrt beam-Code aus
Write-Once, Run-Anywhere(verhlt sich berall identisch - wenns lu, dann richtig)
Thursday, April 19, 12
Erlang - Theorie
-
8/12/2019 Erlang Clojure KuPOxyts
87/120
Erlang Theorie
Verteilung auf Knoten
(Erlang-Nodes)
Viele Knoten pro
physischer Hardware
(SEHR) viele Erlang-
Prozesse
pro Knoten
ErlangNode
PhysicalNode
callfunctions
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
88/120
-
8/12/2019 Erlang Clojure KuPOxyts
89/120
Erlang IDE in Eclipse 3.7
Thursday, April 19, 12
Erlang - Theorie
-
8/12/2019 Erlang Clojure KuPOxyts
90/120
g
Zahlen, Atome
Tupel
Listen
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
91/120
Erlang - Theorie
-
8/12/2019 Erlang Clojure KuPOxyts
92/120
g
Funktionen
Thursday, April 19, 12
Erlang - TheorieProzesse
-
8/12/2019 Erlang Clojure KuPOxyts
93/120
Prozesse
Bestandteil der Sprache
Ausgefhrt innerhalb der Erlang-VM
PIDA
PIDB
foo
Thursday, April 19, 12
Erlang - process spawning
-
8/12/2019 Erlang Clojure KuPOxyts
94/120
Test (von Joe Armstrong)
Messe spawn-Zeit von ErlangProzessen
Vereinfachung: Innerhalb EINER VM
Thursday, April 19, 12
erlang process timer
-
8/12/2019 Erlang Clojure KuPOxyts
95/120
g p
>> 100.000 Prozesse pro Sekunde
limitiert primr durch RAM der Erlang-VM
2 sec (CPU-Zeit)
3.2 sec (Realzeit)
Thursday, April 19, 12
Erlang: Kernkonzepte
-
8/12/2019 Erlang Clojure KuPOxyts
96/120
g p
Funktionale Programmierung
Aktormodell
Leichtgewichtige Prozesse
Hot Swapping
Thursday, April 19, 12
Erlang: Praxistauglichkeit
-
8/12/2019 Erlang Clojure KuPOxyts
97/120
g g
Erprobt
Server mit vielen parallelen Zugriffen
(Protokollserver, Datenbanken, )
Systeme mit hchsten Verfgbarkeits-
Anforderungen
Thursday, April 19, 12
Erlang: Beispiele
-
8/12/2019 Erlang Clojure KuPOxyts
98/120
g p
CouchDB
Facebook-Chat
RIAK
Scalaris(transaktionale, hoch
skalierbare in-memory DB)
ejabberd
Disco(MapReduce von Nokia)
Membase Cluster Manager
Wahrscheinlich:
Amazon SimpleDB
Thursday, April 19, 12
Erlang: Java-Bibliotheken
-
8/12/2019 Erlang Clojure KuPOxyts
99/120
Akka (http://akka.io/)
Kilim (http://www.malhar.net/sriram/
kilim/)
Thursday, April 19, 12
Erlang: Java-Idiome
-
8/12/2019 Erlang Clojure KuPOxyts
100/120
Immutability, Anonymous Inner Classes
Active Objects
Message Queues
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
101/120
Node.js
Thursday, April 19, 12
Node.js-Architektur
-
8/12/2019 Erlang Clojure KuPOxyts
102/120
libev libeiov8 http_parser c_ares
Network/Platform layer (C)
API (JavaScript)
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
103/120
High-performance networkruntime, using JavaScript as
a high-level DSL
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
104/120
-
8/12/2019 Erlang Clojure KuPOxyts
105/120
echo-upcase.js
varnet= require('net');
varserver= net.createServer(function(socket) {
socket.write("Echo server\r\n"); socket.setEncoding('ascii'); socket.on('data', function(data) { socket.write(data.toUpperCase()); });});
server.listen(8124, "127.0.0.1");
Thursday, April 19, 12
varsys = require("sys"), http = require("http"), url = require("url"), path = require("path"), fs = require("fs");
-
8/12/2019 Erlang Clojure KuPOxyts
106/120
vardir= process.argv[2] || './public';varport= parseFloat(process.argv[3]) || 8080;sys.log('Serving files from '+ dir + ', port is '+ port);
http.createServer(function(request, response) { varuri= url.parse(request.url).pathname; varfilename= path.join(process.cwd(), dir, uri); path.exists(filename, function(exists) { if(exists) { fs.readFile(filename, function(err, data) {
response.writeHead(200); response.end(data); }); } else{ sys.log('File not found: '+ filename); response.writeHead(404); response.end();
} });}).listen(port);
file-server.js
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
107/120
http.createServer(function(request, response) { varuri= url.parse(request.url).pathname; varfilename= path.join(process.cwd(), dir, uri);
path exists(filename function(exists) {
-
8/12/2019 Erlang Clojure KuPOxyts
108/120
stream-file-server.js
path.exists(filename, function(exists) { if(exists) { f = fs.createReadStream(filename); f.on('open', function() {
response.writeHead(200); });
f.on('data', function(chunk) { response.write(chunk); });
f.on('error', function(err) {
// ... });
f.on('end', function() {response.end();
});} else{
response.writeHead(404);
- response.end(); } });}).listen(port);
Thursday, April 19, 12
varoptions= function(request) { // ...}
-
8/12/2019 Erlang Clojure KuPOxyts
109/120
proxy.js
}
http.createServer(function(request, response) { sys.log("--> "+ request.url); varremoteRequest= http.request(options(request), function(remoteResponse) { response.writeHead(remoteResponse.statusCode, remoteResponse.headers); remoteResponse.on('data', function(chunk) { response.write(chunk); }); remoteResponse.on('end', function() { sys.log(" "+ request.url); varremoteRequest= http.request(options(request), function(remoteResponse) {
-
8/12/2019 Erlang Clojure KuPOxyts
110/120
proxy-pump.js
q p q ( p ( q ) ( p ) { response.writeHead(remoteResponse.statusCode, remoteResponse.headers); remoteResponse.on('end', function() { sys.log("
-
8/12/2019 Erlang Clojure KuPOxyts
111/120
Thursday, April 19, 12
Node.js: Kernkonzepte
-
8/12/2019 Erlang Clojure KuPOxyts
112/120
Async I/O
Events & Callbacks
Single Process Model
Thursday, April 19, 12
Node.js: Praxistauglichkeit
-
8/12/2019 Erlang Clojure KuPOxyts
113/120
Sehr jung, aber sehr aktiv
Web 2.0-Umfeld
Hufig: Vereinfachung
Thursday, April 19, 12
Node.js: Java-Bibliotheken
-
8/12/2019 Erlang Clojure KuPOxyts
114/120
java.nio
java.nio2
Netty (http://www.jboss.org/netty)
Grizzly (http://grizzly.java.net/)
Vert.x (https://github.com/purplefox/vert.x)
Project Nashorn
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
115/120
-
8/12/2019 Erlang Clojure KuPOxyts
116/120
1.Es gibt ein Leben jenseits
von Java
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
117/120
2.Alternativen knnen in der
Praxis sinnvoll sein
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
118/120
3.Die Beschigung lohnt
auch 100%-Java-Entwickler
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
119/120
Q&A
Thursday, April 19, 12
-
8/12/2019 Erlang Clojure KuPOxyts
120/120