Movatterモバイル変換


[0]ホーム

URL:


Μετάβαση στο περιεχόμενο
ΒικιπαίδειαΗ Ελεύθερη Εγκυκλοπαίδεια
Αναζήτηση

Clojure

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια

ΗClojure (προφέρεται όπως ο αγγλικός όρος "closure"[1]) είναι μια σύγχρονη διάλεκτος τηςγλώσσας προγραμματισμούLisp. Είναι γλώσσα γενικού σκοπού, υποστηρίζει τη διαδραστική ανάπτυξη, ενθαρρύνει τοστυλ συναρτησιακού προγραμματισμού και απλοποιεί τονπολυνηματικό προγραμματισμό. Η Clojure τρέχει στηνΕικονική μηχανή της Java (JVM) και στηνCommon Language Runtime (CLR). Η Clojure τηρεί τη φιλοσοφία "κώδικας-σαν-δεδομένα (code-as-data)" και έχει ένα εκτεταμένο σύστημαμακροεντολών.

Φιλοσοφία

[Επεξεργασία |επεξεργασία κώδικα]

Ο Rich Hickey ανέπτυξε την Clojure γιατί ήθελε μια σύγχρονη διάλεκτο τηςLisp γιασυναρτησιακό προγραμματισμό, που να συνεργάζεται με την καθιερωμένη πλατφόρμα τηςJava και να είναι σχεδιασμένη για ταυτοχρονισμό.[2][3]

Η προσέγγιση της Clojure στον ταυτοχρονισμό χαρακτηρίζεται από την έννοια των identities[4], τα οποία αναπαριστούν αμετάβλητες καταστάσεις στο χρόνο. Επειδή η κατάσταση αποτελείται από αμετάβλητες τιμές, οποιοσδήποτε αριθμός υποπρογραμμάτων-"εργατών" ("workers") μπορεί να τις χρησιμοποιεί παράλληλα, και ο ταυτοχρονισμός εξαρτάται από το πώς ελέγχονται οι αλλαγές από τη μια κατάσταση στην άλλη. Για αυτόν το λόγο, η Clojure παρέχει αρκετούς τύπους μεταβλητής αναφοράς (mutable reference types), ο καθένας από τους οποίους έχει ξεκάθαρη σημασιολογία όσον αφορά τη μετάβαση μεταξύ των καταστάσεων.

Σύνταξη

[Επεξεργασία |επεξεργασία κώδικα]

Όπως και όλες οι άλλες Lisp, ησύνταξη της Clojure βασίζεται σεσυμβολικές εκφράσεις (S-expressions) που αρχικά διαβάζονται σε ειδικές δομές δεδομένων από έναν αναγνώστη (reader) πριν τη μεταγλώττιση. Εκτός από λίστες, ο αναγνώστης της Clojure υποστηρίζει ρητή σύνταξη γιααντιστοιχίσεις, σύνολα καιδιανύσματα (vectors), και αυτά δίνονται στο μεταγλωττιστή όπως είναι. Με άλλα λόγια, ο μεταγλωττιστής της Clojure δε μεταγλωττίζει μόνο λίστες αλλά υποστηρίζει άμεσα όλους τους προαναφερθέντες τύπους.Η Clojure είναι μιαLisp-1, και δεν προορίζεται να είναι συμβατή σε επίπεδο κώδικα με άλλες διαλέκτους της Lisp.

Μακροεντολές

[Επεξεργασία |επεξεργασία κώδικα]

Τοσύστημα μακροεντολών της Clojure μοιάζει με αυτό τηςCommon Lisp με την εξαίρεση ότι η έκδοση της Clojure για τον τελεστή backquote (που καλείται "syntax quote") δίνει στα σύμβολα και το χώρο ονομάτων τους (namespace). Επειδή απαγορεύεται η δέσμευση ονομάτων που περιέχουν χώρο ονομάτων, αποφεύγονται καταστάσεις ακούσιας δέσμευσης ονομάτων. Μια επέκταση μακροεντολής μπορεί να δεσμεύει ονόματα, αλλά αυτό πρέπει να γίνει ρητά από τον προγραμματιστή.

Η Clojure επίσης απαγορεύει την επαναδέσμευση καθολικών ονομάτων σε άλλους χώρους ονομάτων που έχουν εισαχθεί (import) στον τρέχοντα χώρο ονομάτων.

Χαρακτηριστικά της γλώσσας

[Επεξεργασία |επεξεργασία κώδικα]
  • Δυναμική ανάπτυξη με βρόχο read-eval-print
  • Οι συναρτήσεις είναιαντικείμενα πρώτης τάξης με έμφαση στηναναδρομή αντί για την επανάληψη μεπαρενέργειες
  • Οκνηρές ακολουθίες (lazy sequences)
  • Πλούσιο σύνολο από αμετάβλητες διαρκείς δομές δεδομένων (immutable persistent data structures)
  • Ταυτοχρονισμός μέσω μνήμης συναλλαγών σε λογισμικό (software transactional memory), συστήματος με agents, και συστήματος δυναμικών μεταβλητών
  • Οι πολυμέθοδοι (multimethods) επιτρέπουνδυναμική αποστολή (dynamic dispatch) στους τύπους και τις τιμές οποιουδήποτε συνόλου από ορίσματα (πρβ. ο κλασικός αντικειμενοστρεφής πολυμορφισμός χρησιμοποιεί τον τύπο αυτού που είναι πρακτικά το πρώτο όρισμα μιας μεθόδου)
  • Η Clojure είναιμεταγλωττιζόμενη γλώσσα που παράγεικώδικα byte για την JVM
  • Πλήρης ενσωμάτωση με τηJava: Μεταγλωττιζόμενες σε κώδικα για την JVM, οι εφαρμογές σε Clojure μπορούν εύκολα να πακεταριστούν, να εγκατασταθούν και να εκτελεστούν σε υλοποιήσεις JVM και σε εξυπηρετητές εφαρμογών χωρίς πολυπλοκότητα. Η γλώσσα παρέχει επίσης μακροεντολές που απλοποιούν τη χρήση των υπαρχόντων Java API. Όλες οι δομές δεδομένων της Clojure υλοποιούν βασικα interfaces της Java, διευκολύνοντας την εκτέλεση κώδικα της Clojure από τη Java.

Παραδείγματα

[Επεξεργασία |επεξεργασία κώδικα]

"Γεια σου, κόσμε!":

(println"Γεια σου, κόσμε!")

"Γεια σου, κόσμε!" (GUI):

(javax.swing.JOptionPane/showMessageDialognil"Γεια σου, κόσμε!")

Μια γεννήτρια μοναδικών σειριακών αριθμών ασφαλής για πολυνηματική εκτέλεση (thread-safe):

(let[i(atom0)](defngenerate-unique-id"Επιστρέφει ένα μοναδικό αριθμητικό ID για κάθε κλήση."[](swap!iinc)))

Μια ανώνυμη υποκλάση τηςjava.io.Writer που δεν γράφει πουθενά, και μια μακροεντολή που τη χρησιμοποιεί για να κρύψει όλες τις εντολές εξόδου (print) σε αυτή:

(defbit-bucket-writer(proxy[java.io.Writer][](write[buf]nil)(close[]nil)(flush[]nil)))(defmacronoprint"Αποτιμά όλες τις εκφράσεις που δίνονται, αποσιωπώντας την έξοδο *out*."[&forms]`(binding[*out*bit-bucket-writer]~@forms))(noprint(println"Hello, nobody!"))

10νήματα που χειρίζονται μια κοινή δομή δεδομένων, η οποία αποτελείται από 100 διανύσματα, το καθένα από τα οποία περιέχει 10 (αρχικά διαδοχικούς) αριθμούς. Κάθε νήμα τότε επαναλαμβανόμενα επιλέγει δύο τυχαίες θέσεις σε δύο τυχαία διανύσματα και τα αντιμεταθέτει:

Όλες οι αλλαγές στα διανύσματα συμβαίνουν μέσα σε συναλλαγές χρησιμοποιώντας το σύστημα μνήμης συναλλαγών σε λογισμικό της Clojure. Με αυτόν τον τρόπο, ακόμα και μετά από 100.000 επαναλήψεις κάθε νήματος δε χάνεται κανένας αριθμός.

(defnrun[nvecsnitemsnthreadsniters](let[vec-refs(vec(map(comprefvec)(partitionnitems(range(*nvecsnitems)))))swap#(let[v1(rand-intnvecs)v2(rand-intnvecs)i1(rand-intnitems)i2(rand-intnitems)](dosync(let[temp(nth@(vec-refsv1)i1)](alter(vec-refsv1)associ1(nth@(vec-refsv2)i2))(alter(vec-refsv2)associ2temp))))report#(do(prn(mapderefvec-refs))(println"Distinct:"(count(distinct(applyconcat(mapderefvec-refs))))))](report)(dorun(applypcalls(repeatnthreads#(dotimes[_niters](swap)))))(report)))(run1001010100000)

Έξοδος του προηγούμενου παραδείγματος:

([0123456789][10111213141516171819]...[990991992993994995996997998999])Distinct:1000([382318466963619222127345596][80863980447139490495275289778]...[484216622139651592379228242355])Distinct:1000

Δείτε επίσης

[Επεξεργασία |επεξεργασία κώδικα]

Παραπομπές

[Επεξεργασία |επεξεργασία κώδικα]
  1. http://groups.google.com/group/clojure/msg/766b75baa7987850?
  2. «Rationale».Rich Hickey. clojure.org. Ανακτήθηκε στις 17 Οκτωβρίου 2008. 
  3. http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Rich-Hickey-and-Brian-Beckman-Inside-Clojure/
  4. «On State and Identity».Rich Hickey. clojure.org. Ανακτήθηκε στις 1 Μαρτίου 2010. 

Βιβλιογραφία

[Επεξεργασία |επεξεργασία κώδικα]

Εξωτερικοί σύνδεσμοι

[Επεξεργασία |επεξεργασία κώδικα]
Commons logo
Commons logo
ΤαWikimedia Commons έχουν πολυμέσα σχετικά με το θέμα
   Clojure


Καθιερωμένοι όροι
Ανακτήθηκε από "https://el.wikipedia.org/w/index.php?title=Clojure&oldid=10076234"
Κατηγορίες:
Κρυμμένες κατηγορίες:

[8]ページ先頭

©2009-2026 Movatter.jp