Clojure

programmeerimiskeele Lisp dialekt

Clojure on dünaamilise tüübisüsteemiga funktsionaalne Lispi programmeerimiskeele dialekt, mis töötab Java platvormil.[8][9] Sarnaselt teiste Lispi dialektidega järgib Clojure code-as-data filosoofiat ning kasutab makrosid.[10] Arendusprotsess on kogukonna poolt suunatud ning seda haldab Clojure'i looja Rich Hickey.[11]

Clojure
Faililaiend
  • .clj
  • .cljs
  • .cljc
  • .edn
Paradigma
Väljalaskeaeg 2007
Looja Rich Hickey
Viimane väljalase 1.11.1 (5.04.2022) Muuda Vikiandmetes
Tüüpimine
Mõjutatud keeltest
Mõjutanud keeli
Litsents Eclipse Public License
Veebileht clojure.org

Clojure soodustab muutumatute väärtuste ja andmestruktuuride kasutamist ning identiteedi ja oleku ilmutatud kujul haldamist.[12] Muutumatute väärtuste kasutamine ning konstruktsioonid, mis toovad väärtuste muutumise ajas ilmutatud kujul nähtavale, on mõeldud toetama töökindla, lihtsa ja kiire tarkvara, eriti mitmelõimelise tarkvara, arendamist.[13][14][15] Kuigi Clojure'i tüübisüsteem on täielikult dünaamiline, on hiljuti tehtud jõupingutusi, et lisada sõltuv tüübisüsteem.[16]

Ajalugu ja arendusprotsess muuda

Clojure'i väljatöötaja on Rich Hickey.[8] Enne Clojure'i loomist arendas ta dotLispi, mis oli Clojure'iga sarnane programmeerimiskeel, mis tugines .NET platvormile,[17] ning kolme varasemat katset ühildada Lispi Java platvormiga.[18][19][20] Hickey arendas Clojure'i umbes kaks ja pool aastat enne selle esmast avalikku väljalaset 2007. aasta oktoobris.[21]

Arendusprotsess on kogukonna poolt suunatud[22] ning seda hallatakse Clojure'i JIRA lehel.[23] Üldine arendusega seonduv arutelu toimub Clojure'i Google Groupi lehel[24] ning igaüks saab esitada parandusettepanekuid ja uusi ideid lehel ask.clojure.org.[25] JIRA pileteid haldab analüütikute meeskond ning kõik muudatused kiidab heaks Rich Hickey.[26]

Nimi Clojure on Hickey sõnul sõnamäng programmeerimisterminiga closure (sulund inglise keeles) ning tähtedega C, L ja J, mis tähistavad vastavalt C#-i, Lispi ning Javat – kolme keelt, mis mõjutasid suurel määral Clojure'i disaini.[27]

Disaini filosoofia muuda

Rich Hickey lõi Clojure'i, kuna ta tahtis tänapäevast Lispi, mis toetaks funktsionaalset programmeerimist, eksisteeriks sümbioosis olemasoleva Java ökosüsteemiga ja hõlbustaks konkurentset programmeerimist.[13][14][28][15]

Programmi oleku haldamiseks kasutab Clojure identiteete,[12] mis on olemid mis on seotud muutumatute olekute jadaga, kus millegi muutmiseks asendatakse vana olek uuega. Kuna olekud on muutumatud väärtused, saab suvaline arv erinevaid funktsioone samaaegselt sama väärtusega opereerida ning konkurrentsuse haldamine taandub ühest olekust teise üleminekute haldamisele. Selleks toetab Clojure mitmeid viittüüpe, millel on kõigil selgelt määratletud olekutevaheliste üleminekute semantika.[12]

Ülevaade muuda

Clojure jookseb Java platvormil ning selle tulemusena liidestub Javaga ja toetab Java koodi väljakutsumist Clojure'ist[29][15] ja Clojure'i koodi väljakutsumist Javast.[30] Projektihalduseks kasutatakse tööriista Leinigen, mis haldab projektide pakendamist ning vajaminevaid teeke. Seda seadistatakse Clojure'i süntaksiga.[31]

Sarnaselt teistele Lisp perekonna programmeerimiskeeltele koosneb Clojure'i süntaks sulgudega piiritletud järjenditest, mis teisendatakse enne kompileerimist lugeja poolt andmestruktuurideks, sealhulgas järjenditeks, massiivideks, sõnastikeks ja hulkadeks.[32][15] Clojure on Lisp-1 ning ei ole mõeldud süntaktiliselt ühilduma teiste Lispi dialektidega, kuna see kasutab andmestruktuure, mis ei ole ühildatavad teiste Lispi dialektidega.[10]

Clojure toetab funktsioonide käsitlemist väärtustena, interaktiivset REPL keskkonda ja makrosid.[33] Clojure'i makrode süsteem on sarnane Common Lispi makrode süsteemiga. Clojure ei toeta kasutaja loodud lugejamakrosid, kuid toetab rangemalt piiratud lähenemisi keele süntaksi laiendamiseks.[34] Clojure toetab mitmikmeetodeid,[35] liideste määratlemiseks on kasutusel protokollid (ingl protocols)[36] ning andmetüüpide määratlemiseks kirjed (ingl records).[37]

Clojure toetab laisalt väärtustatud järjendeid ning soodustab muutmatute väärtuste ja andmestruktuuride kasutamist. Kuna Clojure on funktsionaalne programmeerimiskeel eelistatakse kõrvaltoimetega tsüklite asemel rekursiooni ning kõrgemat järku funktsioone. Automaatne sabarekursiooni optimeerimine pole toetatud, kuna Java virtuaalmasinad ei toeta seda.[38][39][40] Sabarekursiooni optimeerimise saab aktiveerida kasutades recur võtmesõna.[41]

Andmestruktuuridele rakendatavate teisenduste kombineerimiseks toetab keel muundureid (ingl transducers). Muundurid võimaldavad kõrgemat järku funktsioone, nagu näiteks map ja fold, üldistada nii, et need toimivad suvalist tüüpi andmestruktuuridel.[42][43][44]

edn muuda

edn[45] (ingliskeelne lühend sõnadest Extensible Data Notation – laiendatav andmenotatsioon) on Clojure'i süntaksi alamhulk, mis on mõeldud kasutamiseks andmevahetusvorminguna. Seda saab kasutada Clojure'i andmestruktuuride serialiseerimiseks ja deserialiseerimiseks ning Clojure kasutab ülemhulka edn-ist programmide lähtekoodi esitamiseks. edn-i kasutus sarnaneb JSON-i või XML-i kasutusele.

Lisaks sisseehitatud andmestruktuure ja lihttüüpe tähistavatele elementidele toetab edn kasutajate poolt loodud laiendusi kasutades silte (ingl tags), mis koosnevad sümbolist #, millele järgneb sildi tähis. Silti kohates annab lugeja järgneva elemendi varem registreeritud funktsioonile, mis sisaldab sildile vastavat loogikat andmete deserialiseerimiseks ja tagastab vastava deserialiseeritud väärtuse.

Alternatiivsed platvormid muuda

Clojure'i põhiliseks platvormiks on Java virtuaalmasin,[9][29] kuid Clojure'il on teostusi ka teistel platvormidel. Kõige tähelepanuväärsem neist on ClojureScript,[46] mis kompileerub ECMAScriptiks ja ClojureCLR, mis realiseerib Clojure'i .NET platvormil ning ühildub .NET platvormi ökosüsteemiga.

Clojure'i kogukonnas 2013. aastal läbi viidud 1060 vastajaga küsitlus leidis, et 47% vastanutest kasutab nii Clojure'i kui ka ClojureScripti.[47] 2014 aastaks oli see arv tõusnud 55%-ni[48] ning 2015. aastaks 66%-ni.[49] Populaarsete ClojureScripti projektide hulka kuuluvad Reacti teegi teostused, näiteks Reagent,[50] re-frame,[51] Rum,[52] ja Om.[53][54]

Populaarsus muuda

Tänu püsivale huvile funktsionaalse programmeerimise vastu on Clojure'i kasutajaskond Java platvormi kasutavate tarkvaraarendajate hulgas kasvanud. Programmeerimiskeelt on soovitanud muu hulgas tarkvaraarendajad Brian Goetz,[55][56][57] Eric Evans,[58][59] James Gosling,[60] Paul Graham,[61] ja Robert C. Martin.[62][63][64][65]

Küsitlus "JVM Ecosystem Report 2018", mis väidab end olevat suurim Java arendajate küsitlus maailmas, leidis, et Clojure on teine kõige kasutatum Java virtuaalmasinal jooksev keel kesksete rakenduste arendamiseks.[66] Clojure'i kasutavad mitmed suurfirmad, sealhulgas Apple,[67][68] Atlassian,[69] Funding Circle,[70] Netflix,[71] Nubank,[72] Puppets[73] ja Walmart,[74] ning samuti riiklikud asutused, sealhulgas NASA.[75] Samuti on seda kasutatud loominguliseks programmeerimiseks, sealhulgas visuaalse kunsti, muusika, mängude ja luule loomiseks.[76]

Viited muuda

  1. "Functional Programming". Clojure.org. Vaadatud 9. detsembril 2022.
  2. Fogus, Michael (2011). "Rich Hickey Q&A". CodeQuarterly.com. Originaali arhiivikoopia seisuga 11. jaanuar 2017.
  3. Bonnaire-Sergeant, Ambrose; Davies, Rowan; Tobin-Hochstadt, Sam. "Practical Optional Types for Clojure". arXiv. DOI:10.48550/ARXIV.1812.03571. Vaadatud 10. detsembril 2022. {{cite journal}}: viitemall journal nõuab parameetrit |journal= (juhend)
  4. "Clojure Programming" (PDF). OReilly.com. Vaadatud 9. detsembril 2022.
  5. Hickey, Rich. "Clojure Bookshelf". Amazon.com. Originaali arhiivikoopia seisuga 3. oktoober 2017.
  6. Baldridge, Timothy. "Pixie". PixieLang.org. Originaali arhiivikoopia seisuga 6. juuli 2019. Vaadatud 9. detsembril 2022.
  7. Ramachandra, Ramkumar. "Rhine". GitHub.org. Vaadatud 9. detsembril 2022.
  8. 8,0 8,1 Krill, Paul (22. märts 2012). "Clojure inventor Hickey now aims for Android". InfoWorld.com.
  9. 9,0 9,1 "Clojure". Clojure.org. Vaadatud 9. detsembril 2022.
  10. 10,0 10,1 "Differences with other Lisps". Clojure.org. Vaadatud 9. detsembril 2022.
  11. Hickey, Rich (26. november 2018). "Open Source is Not About You". GitHub.com.
  12. 12,0 12,1 12,2 "Values and Change: Clojure's approach to Identity and State". Clojure.org. Vaadatud 9. detsembril 2022.
  13. 13,0 13,1 Hickey, Rich. "Rationale". Clojure.org. Vaadatud 9. detsembril 2022.
  14. 14,0 14,1 Torre, Charles (6. oktoober 2009). "Expert to Expert: Rich Hickey and Brian Beckman – Inside Clojure". MSDN.com.
  15. 15,0 15,1 15,2 15,3 Edwards, Kathryn (10. august 2009). "The A-Z of Programming Languages: Clojure". Computerworld.com.au. Originaali arhiivikoopia seisuga 26. august 2019.
  16. "clojure/spec.alpha". GitHub. 26. aprill 2017.
  17. Hickey, Rich (16. oktoober 2002). "[ANN] dotLisp – a Lisp dialect for .Net". Google.com.
  18. Hickey, Rich (15. aprill 2013). "jfli". SourceForge.net.
  19. Hickey, Rich (3. aprill 2013). "foil - Foreign Object Interface for Lisp". SourceForge.net.
  20. Hickey, Rich (7. märts 2013). "Lisplets". SourceForge.net.
  21. Hickey, Rich (12. juuni 2020). "A history of Clojure". Proceedings of the ACM on Programming Languages. 4 (HOPL): 1–46. DOI:10.1145/3386321.
  22. "Development". Clojure.org. Vaadatud 9. detsembril 2022.
  23. "Clojure". Atlassian.net. Vaadatud 9. detsembril 2022.
  24. "Clojure". Google.com. Vaadatud 9. detsembril 2022.
  25. "Clojure Forum". clojure.org. Vaadatud 9. detsembril 2022.
  26. "Workflow". Clojure.org. Vaadatud 10. detsembril 2022.
  27. Hickey, Rich (5. jaanuar 2009). "meaning and pronunciation of Clojure". Google.com.
  28. Elmendorf, Dirk (1. aprill 2010). "Economy Size Geek – Interview with Rich Hickey, Creator of Clojure". LinuxJournal.com.
  29. 29,0 29,1 "Hosted on the JVM". Clojure.org. Vaadatud 9. detsembril 2022.
  30. "Java Interop". Clojure.org. Vaadatud 9. detsembril 2022.
  31. Hagelberg, Phil. "Leiningen". Leiningen.org. Vaadatud 9. detsembril 2022.
  32. "The Reader". Clojure.org. Vaadatud 9. detsembril 2022.
  33. "Macros". Clojure.org. Vaadatud 9. detsembril 2022.
  34. Hickey, Rich. "edn". GitHub.com. Vaadatud 9. detsembril 2022.
  35. "Multimethods and Hierarchies". Clojure.org. Vaadatud 9. detsembril 2022.
  36. "Protocols". Clojure.org. Vaadatud 9. detsembril 2022.
  37. "Datatypes: deftype, defrecord and reify". Clojure.org. Vaadatud 9. detsembril 2022.
  38. Goetz, Brian (20. november 2014). "Stewardship: the Sobering Parts". YouTube.com.
  39. Rose, John (12. juuli 2007). "tail calls in the VM". Oracle.com.
  40. Rose, John (11. veebruar 2009). "Some languages need to be able to perform tail calls". Java.net.
  41. "Special Forms". Clojure.org. Vaadatud 9. detsembril 2022.
  42. Hickey, Rich (17. september 2014). "Transducers". YouTube.com.
  43. Hickey, Rich (6. august 2014). "Transducers are Coming". Cognitect.com.
  44. Hickey, Rich (20. november 2014). "Inside Transducers". YouTube.com.
  45. "Official EDN Spec". edn-format.org. 27. aprill 2022.
  46. "ClojureScript". ClojureScript.org. Vaadatud 9. detsembril 2022.
  47. Emerick, Chas (18. november 2013). "Results of the 2013 State of Clojure & ClojureScript survey". CEmerick.com. Originaali arhiivikoopia seisuga 29. oktoober 2018.
  48. "State of Clojure 2014 Survey Results". WuFoo.com. Vaadatud 10. detsembril 2022.
  49. Gehtland, Justin (28. jaanuar 2016). "State of Clojure 2015 Survey Results". Cognitect.com.
  50. "Reagent". GitHub.io. Vaadatud 9. detsembril 2022.
  51. "re-frame". GitHub.com. Vaadatud 9. detsembril 2022.
  52. Prokopov, Nikita. "Rum". GitHub.com. Vaadatud 9. detsembril 2022.
  53. Nolen, David. "Om". GitHub.com. Vaadatud 9. detsembril 2022.
  54. Coupland, Tom (17. jaanuar 2014). "Om: Enhancing Facebook's React with Immutability". InfoQ.com.
  55. Goetz, Brian (24. mai 2020). "Brian Goetz' favorite non-Java JVM language (Part 1 of 3)". Twitch.tv.
  56. Goetz, Brian (24. mai 2020). "Brian Goetz' favorite non-Java JVM language (Part 2 of 3)". Twitch.tv.
  57. Goetz, Brian (24. mai 2020). "Brian Goetz' favorite non-Java JVM language (Part 3 of 3)". Twitch.tv.
  58. Evans, Eric (14. august 2018). "Modelling Time - Eric Evans - Domain-Driven Design Europe 2018". YouTube.com.
  59. Evans, Eric (21. november 2014). "Eric Evans on Twitter". Twitter.com.
  60. "James Gostling meetup with London Java Community". YouTube.com. 11. oktoober 2016.
  61. Graham, Paul (6. mai 2016). "Paul Graham on Twitter". Twitter.com.
  62. Martin, Robert (22. august 2019). "Why Clojure?". CleanCoder.com.
  63. Martin, Robert (29. november 2018). "Unble Bob Martin on Twitter". Twitter.com.
  64. Martin, Robert (1. august 2018). "Introduction To Functional Programming". CleanCoders.com.
  65. Martin, Robert (11. juuli 2017). "Pragmatic Functional Programming". CleanCoder.com.
  66. Maple, Simon; Binstock, Andrew (17. oktoober 2018). "JVM Ecosystem Report 2018". Snyk.io.
  67. Liutikov, Roman (17. detsember 2017). "Roman Liutikov on Twitter". Twitter.com.
  68. "Jobs at Apple". Apple.com. Vaadatud 9. detsembril 2022.
  69. Borges, Leonardo (7. juuli 2015). "Realtime Collaboration with Clojure". YouTube.com.
  70. Pither, Jon (4. oktoober 2016). "Clojure in London: Funding Circle – Lending some Clojure". JUXT.pro.
  71. Williams, Alex (3. august 2014). "The New Stack Makers: Adrian Cockcroft on Sun, Netflix, Clojure, Go, Docker and More". TheNewStack.io.
  72. "Nubank adquire empresa norte-americana de tecnologia Cognitect".
  73. Price, Chris (11. aprill 2014). "A New Era of Application Services at Puppet Labs". Puppet.com. Originaali arhiivikoopia seisuga 9. detsember 2022.
  74. Phillips, Marc (14. juuli 2015). "Walmart Runs Clojure at Scale". Cognitect.com.
  75. "Common-Metadata-Repository". GitHub.com. Vaadatud 9. detsembril 2022.
  76. Meier, Carin (6. mai 2015). "Creative computing with Clojure". OReilly.com.