Přeskočit na obsah

Clojure: Porovnání verzí

Z Wikipedie, otevřené encyklopedie
Smazaný obsah Přidaný obsah
JAnDbot (diskuse | příspěvky)
m Robot: přidáno {{Autoritní data}}; kosmetické úpravy
aktualizace verze a odkazů + typografie
Řádek 1: Řádek 1:
{{Infobox - programovací jazyk
{{Infobox - programovací jazyk
| název = Clojure
| název = Clojure
| logo =
| logo =
| paradigma = [[Funkcionální programování|funkcionální]], multiparadigmový
| paradigma = [[Funkcionální programování|funkcionální]], multiparadigmový
| vznik = 2007
| vznik = 2007
| vývojář = Rich Hickey
| vývojář = Rich Hickey
| poslední verze = 1.3
| první vydání = 2007
| datum poslední verze = 2011-09-23
| poslední verze = 1.9.0
| datum poslední verze = [[8. prosinec|8. prosince]] [[2017]]<ref name="maven2" />
| typing = [[Dynamické typování|dynamické]], [[Strong typing|strong]]
| typování = [[Typový_systém#Dynamická_typová_kontrola|dynamické]], [[Typový_systém#Silné_a_slabé_typování|silné]]
| ovlivněno = [[Lisp]], [[ML (programovací jazyk)|ML]], [[Haskell (programovací jazyk)|Haskell]], [[Erlang (programovací jazyk)|Erlang]]<ref>{{Citace elektronické monografie | titul=Books that influenced Clojure | url=http://www.amazon.com/gp/richpub/listmania/fullview/R3LG3ZBZS4GCTH | datum=30 June 2009 | autor=Rich Hickey | datum přístupu=11 September 2009}}</ref>
| ovlivněno = [[Lisp]], [[ML (programovací jazyk)|ML]], [[Haskell (programovací jazyk)|Haskell]], [[Erlang (programovací jazyk)|Erlang]]<ref name="knihy" />
| ovlivnil =
| ovlivnil = [[Elixir (programovací jazyk)|Elixir]], [[Hy (programovací jazyk)|Hy]], [[Pixie (programovací jazyk)|Pixie]], Rhine
| operační systém = Multiplatformní
| operační systém = Multiplatformní
| licence = [[Eclipse Public License]]
| licence = [[Eclipse Public License]]
| web = http://clojure.org
| web = [http://clojure.org clojure.org]
}}
}}

'''Clojure''' je v [[Informatika|informatice]] moderní dialekt programovacího jazyka [[Lisp]]. Jedná se o univerzální jazyk podporující [[funkcionální programování]], který se zaměřuje na zjednodušení vývoje [[Vlákno (program)|vícevláknových]] aplikací. Clojure používá běhové prostředí [[Java Virtual Machine|JVM]] nebo [[Common Language Runtime|CLR]], přičemž zastává filozofii kódu, který se chová jako data a implementuje sofistikovaný Lispový [[Makro (software)|makrosystém]].
'''Clojure''' (výslovnost [ˈkloužəːr]) je v&nbsp;[[Informatika|informatice]] moderní dialekt programovacího jazyka [[Lisp]]. Jedná se o&nbsp;univerzální jazyk podporující [[funkcionální programování]], který se zaměřuje na zjednodušení vývoje [[Vlákno (informatika)|vícevláknových]] aplikací. Clojure používá běhové prostředí [[Java Virtual Machine|JVM]] nebo [[Common Language Runtime|CLR]], přičemž zastává filozofii kódu, který se chová jako data a implementuje sofistikovaný Lispový [[Makro (software)|makrosystém]].


== Filozofie ==
== Filozofie ==
Rich Hickey vyvinul Clojure, protože si přál moderní [[Lisp]] spolupracující s rozšířenou [[Java (platforma)|platformou Java]], který by byl navržen pro vývoj vícevláknových aplikací.<ref>{{Citace elektronické monografie | url=http://clojure.org/rationale| titul=Rationale | edice=Rich Hickey | vydavatel=clojure.org | datum přístupu=2008-10-17}}</ref><ref>[http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/ Expert to Expert: Rich Hickey and Brian Beckman – Inside Clojure &#124; Going Deep &#124; Channel 9]</ref>
Rich Hickey vyvinul Clojure, protože si přál moderní [[Lisp]] spolupracující s&nbsp;rozšířenou [[Java (platforma)|platformou Java]], který by byl navržen pro vývoj vícevláknových aplikací.<ref name="rationale" /><ref name="charlesovo" />


Clojure používá pro řízení souběžnosti koncept tzv. identit,<ref> {{Citace elektronické monografie | url=http://clojure.org/state| titul=On State and Identity | edice=Rich Hickey | vydavatel=clojure.org | datum přístupu=2010-03-01}}</ref> který si lze představit jako sérii v čase neměnitelných stavů. Jelikož tyto stavy mají neměnitelné hodnoty, může nad nimi paralelně operovat jakýkoliv počet vláken a řízení souběžnosti se stává otázkou spravování přechodů z jednoho stavu do dalšího. Pro tento účel Clojure poskytuje 4 měnitelné referenční typy, kde každý má jasně definovanou sémantiku pro přechod mezi stavy.
Clojure používá pro řízení souběžnosti koncept tzv. identit,<ref name="i&s" /> který si lze představit jako sérii v&nbsp;čase neměnitelných stavů. Jelikož tyto stavy mají neměnitelné hodnoty, může nad nimi paralelně operovat jakýkoliv počet vláken a řízení souběžnosti se stává otázkou spravování přechodů z&nbsp;jednoho stavu do dalšího. Pro tento účel Clojure poskytuje 4 měnitelné referenční typy, kde každý má jasně definovanou sémantiku pro přechod mezi stavy.


== Syntaxe ==
== Syntaxe ==
Jako každý Lisp, syntaxe jazyka Clojure je postavena na [[s-výraz]]ech, které jsou nejprve rozebrány do datových struktur před tím než jsou zkompilovány. Clojure podporuje literály pro struktury jako [[Lineární seznam|seznamy]], [[Hašovací tabulka|mapy]], množiny a [[Pole (datová struktura)|pole]], které jsou kompilátoru předány tak jak jsou. Clojure je [[Lisp-1]] a není zamýšleno, aby byl kompatibilní s ostatními dialekty Lispu.
Jako každý Lisp, syntaxe jazyka Clojure je postavena na [[s-výraz]]ech, které jsou nejprve rozebrány do datových struktur před tím než jsou zkompilovány. Clojure podporuje literály pro struktury jako [[Lineární seznam|seznamy]], [[Hašovací tabulka|mapy]], množiny a [[Pole (datová struktura)|pole]], které jsou kompilátoru předány tak jak jsou. Clojure je [[Lisp-1]] a není zamýšleno, aby byl kompatibilní s&nbsp;ostatními dialekty Lispu.


== Makra ==
== Makra ==
Makro je konstrukce, které v argumentech předáme S-výrazy, ze kterých je následně sestaven libovolný kód. Poté se tento kód vykoná.
Makro je konstrukce, které v&nbsp;argumentech předáme S-výrazy, ze kterých je následně sestaven libovolný kód. Poté se tento kód vykoná.
Systém maker v Clojuru je velice podobný kódu Common Lispu.
Systém maker v&nbsp;Clojuru je velice podobný kódu Common Lispu.


== Vlastnosti jazyka ==
== Vlastnosti jazyka ==
* dynamický vývoj pomocí [[Read-eval-print loop|REPL]]
* dynamický vývoj pomocí [[Read-eval-print loop|REPL]]
* funkce jsou [[first-class objekt]]y s důrazem na rekurzi namísto smyček vytvářejících postranní efekty
* funkce jsou [[first-class objekt]]y s&nbsp;důrazem na rekurzi namísto smyček vytvářejících postranní efekty
* líně vyhodnocované sekvence
* líně vyhodnocované sekvence
* poskytuje bohatou sadu neměnitelných datových struktur
* poskytuje bohatou sadu neměnitelných datových struktur
Řádek 36: Řádek 38:
* [[Multimetoda|multimetody]] poskytují dynamické spuštění metod, jejichž konkrétní implementace je vybrána na základě typu předaných parametrů
* [[Multimetoda|multimetody]] poskytují dynamické spuštění metod, jejichž konkrétní implementace je vybrána na základě typu předaných parametrů
* jazyk je kompilovaný do JVM bajtkódu
* jazyk je kompilovaný do JVM bajtkódu
* silná integrace s Javou: kód jazyka Clojure kompilovaný do JVM bajtkódu může být snadno nasazený do běžného prostředí [[Java Virtual Machine|JVM]] a aplikačních serverů bez dalších potíží; jazyk dále poskytuje makra, která usnadňují použití existujících Java API; jeho struktury implementují standardní rozhraní Javy, což umožňuje spouštět kód napsaný v Clojure z Javy
* silná integrace s&nbsp;Javou: kód jazyka Clojure kompilovaný do JVM bajtkódu může být snadno nasazený do běžného prostředí [[Java Virtual Machine|JVM]] a aplikačních serverů bez dalších potíží; jazyk dále poskytuje makra, která usnadňují použití existujících Java API; jeho struktury implementují standardní rozhraní Javy, což umožňuje spouštět kód napsaný v&nbsp;Clojure z&nbsp;Javy


== Příklady ==
== Příklady ==

=== Ahoj světe ===
=== Ahoj světe ===


Řádek 61: Řádek 64:
</source>
</source>


=== Anonymní podtřída java.io.Writer ===
=== Anonymní podtřída <tt>java.io.Writer</tt> ===
Tato třída nikam nezapisuje a obsahuje makro, které umlčí všechno vypisování.
Tato třída nikam nezapisuje a obsahuje makro, které umlčí všechno vypisování.


Řádek 82: Řádek 85:


=== Vlákna ===
=== Vlákna ===
Následující příklad ukazuje 10 vláken operujících nad společnou datovou strukturou, která se skládá ze 100 [[vektor]]ů, každý obsahující 10 (zpočátku po sobě jdoucích) unikátních čísel. Každé vlákno vybírá 2 náhodné pozice ve 2 náhodných vektorech a prohazuje je. Všechny změny ve vektorech probíhají v transakcích s použitím softwarové transakční paměti, a proto ani po 100 000 iteracích každého vlákna se neztratí žádné číslo.
Následující příklad ukazuje 10 vláken operujících nad společnou datovou strukturou, která se skládá ze 100 [[vektor]]ů, každý obsahující 10 (zpočátku po sobě jdoucích) unikátních čísel. Každé vlákno vybírá 2 náhodné pozice ve 2 náhodných vektorech a prohazuje je. Všechny změny ve vektorech probíhají v&nbsp;transakcích s&nbsp;použitím softwarové transakční paměti, a&nbsp;proto ani po 100&nbsp;000 iteracích každého vlákna se neztratí žádné číslo.


<source lang="lisp">
<source lang="lisp">
Řádek 109: Řádek 112:
==== Výstup ====
==== Výstup ====
<source lang="lisp">
<source lang="lisp">
([0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19] ...
([0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19]
[990 991 992 993 994 995 996 997 998 999])
[990 991 992 993 994 995 996 997 998 999])
Distinct: 1000
Distinct: 1000
([382 318 466 963 619 22 21 273 45 596] [808 639 804 471 394 904 952 75 289 778] ...
([382 318 466 963 619 22 21 273 45 596] [808 639 804 471 394 904 952 75 289 778]
[484 216 622 139 651 592 379 228 242 355])
[484 216 622 139 651 592 379 228 242 355])
Distinct: 1000
Distinct: 1000
Řádek 119: Řádek 122:


== Reference ==
== Reference ==
<references />
<references>
<ref name="maven2">{{Citace elektronické monografie
| titul = Central Repository: org/clojure/clojure/1.9.0
| url = http://central.maven.org/maven2/org/clojure/clojure/1.9.0
| datum aktualizace = 2017-12-08
| datum přístupu = 2018-02-23
| jazyk = en
}}</ref>
<ref name="knihy">{{Citace elektronické monografie | příjmení = Hickey | jméno = Rich | titul = Books that influenced Clojure | url = http://www.amazon.com/gp/richpub/listmania/fullview/R3LG3ZBZS4GCTH | datum vydání = 2009-06-30 | datum přístupu = 2018-02-23 | jazyk = en}}</ref>
<ref name="rationale">{{Citace elektronické monografie
| titul = Clojure - Rationale
| url = http://clojure.org/about/rationale
| vydavatel = Rich Hickey
| datum vydání = 2018-02-21
| datum přístupu = 2018-02-23
| jazyk = en
}}</ref>
<ref name="charlesovo">{{Citace elektronické monografie
| autor = Charles
| titul = Expert to Expert: Rich Hickey and Brian Beckman - Inside Clojure
| url = http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure
| vydavatel = Microsoft
| datum vydání = 2009-10-06
| datum přístupu = 2018-02-23
| edice = Channel 9
| subedice = Going Deep
| jazyk = en
}}</ref>
<ref name="i&s">{{Citace elektronické monografie | url = http://clojure.org/about/state | titul = Clojure - Values and Change: Clojure&lsquo;s approach to Identity and State | vydavatel = Rich Hickey | datum vydání = 2018-02-21 | datum přístupu = 2018-02-23 | jazyk = en}}</ref>
</references>


== Literatura ==
== Literatura ==
* {{Citace monografie
* {{Citace monografie
| jméno1 = Stuart
| jméno1 = Stuart
| příjmení1 = Halloway
| příjmení1 = Halloway
| datum vydání = May 28, 2009
| datum vydání = May 28, 2009
| titul = Programming Clojure
| titul = Programming Clojure
| vydavatel = Pragmatic Bookshelf
| vydavatel = Pragmatic Bookshelf
| vydání = 1st
| vydání = 1st
| strany = 304
| strany = 304
| isbn = 1934356336
| isbn = 1934356336
| url = http://pragprog.com/titles/shcloj/programming-clojure
| url = http://pragprog.com/titles/shcloj/programming-clojure
}}
}}
* {{Citace monografie
* {{Citace monografie
| jméno1 = Luke
| jméno = Luke
| příjmení1 = VanderHart
| příjmení = VanderHart
| datum vydání = December 31, 2009
| datum vydání = 31. prosince 2009
| titul = Practical Clojure
| titul = Practical Clojure
| vydavatel = Apress
| vydavatel = Apress
| vydání = 1st
| vydání = 1
| strany = 350
| strany = 350
| isbn = 1430272317
| isbn = 1430272317
| url = http://www.apress.com/book/view/9781430272311
| url = http://www.apress.com/gp/book/9781430272311
}}
}}
* {{Citace monografie
* {{Citace monografie
| jméno1 = Amit
| jméno = Amit
| příjmení1 = Rathore
| příjmení = Rathore
| datum vydání = December 2009
| datum vydání = prosinec 2009
| titul = Clojure in Action
| titul = Clojure in Action
| vydavatel = Manning
| vydavatel = Manning
| vydání = 1st
| vydání = 1
| strany = 475
| strany = 475
| isbn = 9781935182597
| isbn = 9781935182597
| url = http://www.manning.com/rathore/
| url = http://www.manning.com/books/clojure-in-action
}}
}}
* {{Citace monografie
* {{Citace monografie
| jméno1 = Michael
| jméno = Michael
| příjmení1 = Fogus
| příjmení = Fogus
| jméno2 = Chris
| jméno2 = Chris
| příjmení2 = Houser
| příjmení2 = Houser
| datum vydání = January 2010
| datum vydání = leden 2010
| titul = The Joy of Clojure
| titul = The Joy of Clojure
| vydavatel = Manning
| vydavatel = Manning
| vydání = 1st
| vydání = 1
| strany = 300
| strany = 300
| isbn = 9781935182641
| isbn = 9781935182641
| url = http://www.manning.com/fogus/
| url = http://www.manning.com/books/the-joy-of-clojure
}}
}}


== Externí odkazy ==
== Externí odkazy ==
* {{en}} [http://github.com/richhickey/clojure GitHub repozitář pro Clojure]
*
* {{en}} [http://objectcomputing.com/resources/publications/sett/march-2009-clojure-functional-programming-for-the-jvm Velká recenze Clojure]

* {{en}} [http://vimeo.com/channels/fulldisclojure Full Disclojure – Screencast]
* [http://clojure.org Clojure domovská stránka]
<!--* [http://clojure.blip.tv/posts?view=archive&nsfw=dc Clojure talks on Blip.tv]-->
* [http://github.com/richhickey/clojure/ GitHub repozitář pro Clojure]
* [http://java.ociweb.com/mark/clojure/article.html Velká recenze Clojure]
* [http://vimeo.com/channels/fulldisclojure Full Disclojure – Screencast]
* [http://clojure.blip.tv/posts?view=archive&nsfw=dc Clojure talks on Blip.tv]
{{Autoritní data}}
{{Autoritní data}}



Verze z 19. 3. 2018, 19:15

Clojure
Paradigmafunkcionální, multiparadigmový
Vznik2007
VývojářRich Hickey
První vydání2007
Poslední verze1.9.0 (8. prosince 2017[1])
Typová kontroladynamické, silné
Ovlivněn jazykyLisp, ML, Haskell, Erlang[2]
Ovlivnil jazykyElixir, Hy, Pixie, Rhine
OSMultiplatformní
LicenceEclipse Public License
Webclojure.org

Clojure (výslovnost [ˈkloužəːr]) je v informatice moderní dialekt programovacího jazyka Lisp. Jedná se o univerzální jazyk podporující funkcionální programování, který se zaměřuje na zjednodušení vývoje vícevláknových aplikací. Clojure používá běhové prostředí JVM nebo CLR, přičemž zastává filozofii kódu, který se chová jako data a implementuje sofistikovaný Lispový makrosystém.

Filozofie

Rich Hickey vyvinul Clojure, protože si přál moderní Lisp spolupracující s rozšířenou platformou Java, který by byl navržen pro vývoj vícevláknových aplikací.[3][4]

Clojure používá pro řízení souběžnosti koncept tzv. identit,[5] který si lze představit jako sérii v čase neměnitelných stavů. Jelikož tyto stavy mají neměnitelné hodnoty, může nad nimi paralelně operovat jakýkoliv počet vláken a řízení souběžnosti se stává otázkou spravování přechodů z jednoho stavu do dalšího. Pro tento účel Clojure poskytuje 4 měnitelné referenční typy, kde každý má jasně definovanou sémantiku pro přechod mezi stavy.

Syntaxe

Jako každý Lisp, syntaxe jazyka Clojure je postavena na s-výrazech, které jsou nejprve rozebrány do datových struktur před tím než jsou zkompilovány. Clojure podporuje literály pro struktury jako seznamy, mapy, množiny a pole, které jsou kompilátoru předány tak jak jsou. Clojure je Lisp-1 a není zamýšleno, aby byl kompatibilní s ostatními dialekty Lispu.

Makra

Makro je konstrukce, které v argumentech předáme S-výrazy, ze kterých je následně sestaven libovolný kód. Poté se tento kód vykoná. Systém maker v Clojuru je velice podobný kódu Common Lispu.

Vlastnosti jazyka

  • dynamický vývoj pomocí REPL
  • funkce jsou first-class objekty s důrazem na rekurzi namísto smyček vytvářejících postranní efekty
  • líně vyhodnocované sekvence
  • poskytuje bohatou sadu neměnitelných datových struktur
  • souběžné programování pomocí softwarové transakční paměti, agentový systém a dynamický typový systém
  • multimetody poskytují dynamické spuštění metod, jejichž konkrétní implementace je vybrána na základě typu předaných parametrů
  • jazyk je kompilovaný do JVM bajtkódu
  • silná integrace s Javou: kód jazyka Clojure kompilovaný do JVM bajtkódu může být snadno nasazený do běžného prostředí JVM a aplikačních serverů bez dalších potíží; jazyk dále poskytuje makra, která usnadňují použití existujících Java API; jeho struktury implementují standardní rozhraní Javy, což umožňuje spouštět kód napsaný v Clojure z Javy

Příklady

Ahoj světe

(println "Ahoj světe!")

GUI verze

(javax.swing.JOptionPane/showMessageDialog nil "Ahoj světe")

Vláknově bezpečný generátor unikátních sériových čísel

(let [i (atom 0)]
  (defn generate-unique-id
    "Vrací různá číselná ID pro každé volání."
    []
    (swap! i inc)))

Anonymní podtřída java.io.Writer

Tato třída nikam nezapisuje a obsahuje makro, které umlčí všechno vypisování.

(def bit-bucket-writer
  (proxy [java.io.Writer] []
    (write [buf] nil)
    (close []    nil)
    (flush []    nil)))

(defmacro noprint
  "Vykoná předané výrazy a umlčí všechna vypisování na *out* (standardní výstup)."
  [& forms]
  `(binding [*out* bit-bucket-writer]
     ~@forms))

(noprint
 (println "Zdravím nikoho!"))

Vlákna

Následující příklad ukazuje 10 vláken operujících nad společnou datovou strukturou, která se skládá ze 100 vektorů, každý obsahující 10 (zpočátku po sobě jdoucích) unikátních čísel. Každé vlákno vybírá 2 náhodné pozice ve 2 náhodných vektorech a prohazuje je. Všechny změny ve vektorech probíhají v transakcích s použitím softwarové transakční paměti, a proto ani po 100 000 iteracích každého vlákna se neztratí žádné číslo.

(defn run [nvecs nitems nthreads niters]
  (let [vec-refs (vec (map (comp ref vec)
                           (partition nitems (range (* nvecs nitems)))))
        swap #(let [v1 (rand-int nvecs)
                    v2 (rand-int nvecs)
                    i1 (rand-int nitems)
                    i2 (rand-int nitems)]
                (dosync
                 (let [temp (nth @(vec-refs v1) i1)]
                   (alter (vec-refs v1) assoc i1 (nth @(vec-refs v2) i2))
                   (alter (vec-refs v2) assoc i2 temp))))
        report #(do
                 (prn (map deref vec-refs))
                 (println "Distinct:"
                          (count (distinct (apply concat (map deref vec-refs))))))]
    (report)
    (dorun (apply pcalls (repeat nthreads #(dotimes [_ niters] (swap)))))
    (report)))

(run 100 10 10 100000)

Výstup

([0 1 2 3 4 5 6 7 8 9] [10 11 12 13 14 15 16 17 18 19] 
 [990 991 992 993 994 995 996 997 998 999])
Distinct: 1000
 
([382 318 466 963 619 22 21 273 45 596] [808 639 804 471 394 904 952 75 289 778] 
 [484 216 622 139 651 592 379 228 242 355])
Distinct: 1000

Reference

  1. Central Repository: org/clojure/clojure/1.9.0 [online]. Rev. 2017-12-08 [cit. 2018-02-23]. Dostupné online. (anglicky) 
  2. HICKEY, Rich. Books that influenced Clojure [online]. 2009-06-30 [cit. 2018-02-23]. Dostupné online. (anglicky) 
  3. Clojure - Rationale [online]. Rich Hickey, 2018-02-21 [cit. 2018-02-23]. Dostupné online. (anglicky) 
  4. Charles. Expert to Expert: Rich Hickey and Brian Beckman - Inside Clojure [online]. Microsoft, 2009-10-06 [cit. 2018-02-23]. (Channel 9. Going Deep). Dostupné online. (anglicky) 
  5. Clojure - Values and Change: Clojure‘s approach to Identity and State [online]. Rich Hickey, 2018-02-21 [cit. 2018-02-23]. Dostupné online. (anglicky) 

Literatura

Externí odkazy