Erlang Clojure KuPOxyts

download Erlang Clojure KuPOxyts

of 120

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