Κοινή χρήση μέσω


Βασικές έννοιες

Αυτή η ενότητα περιγράφει βασικές έννοιες που εμφανίζονται σε όλες τις επόμενες ενότητες.

Τιμές

Ένα μοναδικό τμήμα δεδομένων ονομάζεται τιμή. Σε γενικές γραμμές, υπάρχουν δύο γενικές κατηγορίες τιμών: οι στοιχειώδεις τιμές, οι οποίες είναι ατομικές και οι δομημένες τιμές, οι οποίες κατασκευάζονται από στοιχειώδεις τιμές και άλλες δομημένες τιμές. Για παράδειγμα, οι τιμές

1 
true
3.14159 
"abc"

είναι στοιχειώδεις καθώς δεν αποτελούνται από άλλες τιμές. Από την άλλη, οι τιμές

{1, 2, 3} 
[ A = {1}, B = {2}, C = {3} ]

κατασκευάζονται χρησιμοποιώντας στοιχειώδεις τιμές και, στην περίπτωση της εγγραφής, άλλες δομημένες τιμές.

Παραστάσεις

Μια παράσταση είναι ένας τύπος που χρησιμοποιείται για την κατασκευή τιμών. Μια παράσταση μπορεί να σχηματιστεί χρησιμοποιώντας μια ποικιλία συντακτικών κατασκευαστών. Ακολουθούν ορισμένα παραδείγματα παραστάσεων. Κάθε γραμμή είναι μια ξεχωριστή παράσταση.

"Hello World"             // a text value 
123                       // a number 
1 + 2                     // sum of two numbers 
{1, 2, 3}                 // a list of three numbers 
[ x = 1, y = 2 + 3 ]      // a record containing two fields: 
                          //        x and y 
(x, y) => x + y           // a function that computes a sum 
if 2 > 1 then 2 else 1    // a conditional expression 
let x = 1 + 1  in x * 2   // a let expression 
error "A"                 // error with message "A"

Η απλούστερη μορφή παράστασης, όπως φαίνεται παραπάνω, είναι μια λεκτική σταθερά που αντιπροσωπεύει μια τιμή.

Πιο σύνθετες παραστάσεις δημιουργούνται από άλλες παραστάσεις, που ονομάζονται δευτερεύουσες παραστάσεις. Για παράδειγμα:

1 + 2

Η παραπάνω παράσταση αποτελείται στην πραγματικότητα από τρεις παραστάσεις. Οι 1 λεκτικές σταθερές και 2 είναι δευτερεύουσες παραστάσεις της γονικής παράστασης 1 + 2.

Η εκτέλεση του αλγόριθμου που ορίζεται από τις συντακτικές κατασκευές που χρησιμοποιούνται σε μια παράσταση ονομάζεται αξιολόγηση της παράστασης . Κάθε είδος παράστασης έχει κανόνες για τον τρόπο αξιολόγησής της. Για παράδειγμα, μια παράσταση λεκτικής σταθεράς όπως 1 η θα παράγει μια σταθερή τιμή, ενώ η παράσταση a + b θα λαμβάνει τις τιμές που προκύπτουν από την αξιολόγηση δύο άλλων παραστάσεων (a και ) και bθα τις προσθέτει σύμφωνα με ορισμένους κανόνες.

Περιβάλλοντα και μεταβλητές

Οι παραστάσεις αξιολογούνται μέσα σε ένα δεδομένο περιβάλλον. Ένα περιβάλλον είναι ένα σύνολο επώνυμων τιμών, που ονομάζονται μεταβλητές. Κάθε μεταβλητή σε ένα περιβάλλον έχει ένα μοναδικό όνομα μέσα στο περιβάλλον που ονομάζεται αναγνωριστικό.

Μια παράσταση ανώτατου επιπέδου (ή ρίζας) αξιολογείται εντός του καθολικού περιβάλλοντος. Το καθολικό περιβάλλον παρέχεται από την αξιολόγηση της παράστασης αντί να προσδιορίζεται από τα περιεχόμενα της παράστασης που αξιολογείται. Τα περιεχόμενα του καθολικού περιβάλλοντος περιλαμβάνουν τους τυπικούς ορισμούς βιβλιοθήκης και μπορεί να επηρεαστούν από εξαγωγές από ενότητες από κάποιο σύνολο εγγράφων. (Για λόγους ευκολίας, τα παραδείγματα σε αυτήν την ενότητα υποθέτουν ένα κενό καθολικό περιβάλλον. Αυτό σημαίνει ότι θεωρείται ότι δεν υπάρχει τυπική βιβλιοθήκη και ότι δεν υπάρχουν άλλοι ορισμοί που βασίζονται σε ενότητες.)

Το περιβάλλον που χρησιμοποιείται για την αξιολόγηση μιας δευτερεύουσας παράστασης προσδιορίζεται από τη γονική παράσταση. Τα περισσότερα είδη γονικής παράστασης αξιολογούν μια δευτερεύουσα παράσταση μέσα στο ίδιο περιβάλλον στο οποίο αξιολογήθηκαν, αλλά ορισμένα χρησιμοποιούν διαφορετικό περιβάλλον. Το καθολικό περιβάλλον είναι το γονικό περιβάλλον μέσα στο οποίο αξιολογείται η καθολική παράσταση.

Για παράδειγμα, η παράσταση-προετοιμασίας-εγγραφής αξιολογεί τη δευτερεύουσα παράσταση για κάθε πεδίο με τροποποιημένο περιβάλλον. Το τροποποιημένο περιβάλλον περιλαμβάνει μια μεταβλητή για καθένα από τα πεδία της εγγραφής, εκτός από αυτό που προετοιμάζεται. Η συμπερίληψη των άλλων πεδίων της εγγραφής επιτρέπει στα πεδία να εξαρτώνται από τις τιμές των πεδίων. Για παράδειγμα:

[  
    x = 1,          // environment: y, z 
    y = 2,          // environment: x, z 
    z = x + y       // environment: x, y
] 

Παρομοίως, η παράσταση-let αξιολογεί τη δευτερεύουσα παράσταση για κάθε μεταβλητή σε ένα περιβάλλον που περιέχει καθεμία από τις μεταβλητές της παράστασης let, εκτός από αυτήν που προετοιμάζεται. Η παράσταση-let αξιολογεί την παράσταση μετά το in με ένα περιβάλλον που περιέχει όλες τις μεταβλητές:

let 

    x = 1,          // environment: y, z 
    y = 2,          // environment: x, z 
    z = x + y       // environment: x, y
in
    x + y + z       // environment: x, y, z

(Αποδεικνύεται ότι τόσο η παράσταση-προετοιμασίας-εγγραφής όσο και η παράσταση-let στην πραγματικότητα ορίζουν δύο περιβάλλοντα, ένα από τα οποία περιλαμβάνει τη μεταβλητή που προετοιμάζεται. Αυτό είναι χρήσιμο για σύνθετους επαναλαμβανόμενους ορισμούς και καλύπτεται στις αναφορές αναγνωριστικού .

Για τη διαμόρφωση των περιβαλλόντων για τις δευτερεύουσες παραστάσεις, οι νέες μεταβλητές είναι "συγχωνευμένες" με τις μεταβλητές στο γονικό περιβάλλον. Το παρακάτω παράδειγμα εμφανίζει τα περιβάλλοντα για ένθετες εγγραφές:

[
    a = 
    [ 

        x = 1,      // environment: b, y, z 
        y = 2,      // environment: b, x, z 
        z = x + y   // environment: b, x, y 
    ], 
    b = 3           // environment: a
]  

Το παρακάτω παράδειγμα εμφανίζει τα περιβάλλοντα για μια εγγραφή που είναι ένθετης σε ένα let:

Let
    a =
    [
        x = 1,       // environment: b, y, z 
        y = 2,       // environment: b, x, z 
        z = x + y    // environment: b, x, y 
    ], 
    b = 3            // environment: a 
in 
    a[z] + b         // environment: a, b

Η συγχώνευση μεταβλητών με ένα περιβάλλον μπορεί να εισαγάγει μια διένεξη μεταξύ μεταβλητών (καθώς κάθε μεταβλητή σε ένα περιβάλλον πρέπει να έχει μοναδικό όνομα). Η διένεξη επιλύεται ως εξής: εάν το όνομα μιας νέας μεταβλητής που συγχωνεύεται είναι το ίδιο με μια υπάρχουσα μεταβλητή στο γονικό περιβάλλον, τότε η νέα μεταβλητή θα έχει προτεραιότητα στο νέο περιβάλλον. Στο παρακάτω παράδειγμα, η εσωτερική μεταβλητή x (ένθετης σε μεγαλύτερο βάθος) θα έχει προτεραιότητα έναντι της εξωτερικής μεταβλητής x.

[
    a =
    [ 
        x = 1,       // environment: b, x (outer), y, z 
        y = 2,       // environment: b, x (inner), z 
        z = x + y    // environment: b, x (inner), y 
    ], 
    b = 3,           // environment: a, x (outer) 
    x = 4            // environment: a, b
]  

Αναφορές αναγνωριστικού

Μια αναφορά-αναγνωριστικού χρησιμοποιείται για αναφορά σε μια μεταβλητή μέσα σε ένα περιβάλλον.

παράσταση-αναγνωριστικού:
      αναφορά-αναγνωριστικού
αναφορά-αναγνωριστικού:
      αναφορά-αποκλειστικού-αναγνωριστικού
      αναφορά-περιεκτικού-αναγνωριστικού

Η απλούστερη μορφή αναφοράς αναγνωριστικού είναι μια αναφορά-αποκλειστικού-αναγνωριστικού:

αναφορά-αποκλειστικού-αναγνωριστικού:
      αναγνωριστικό

Είναι σφάλμα μια αναφορά-αποκλειστικού-αναγνωριστικού να αναφέρεται σε μια μεταβλητή που δεν αποτελεί μέρος του περιβάλλοντος της παράστασης στην οποία εμφανίζεται το αναγνωριστικό.

Είναι σφάλμα μια αναφορά-αποκλειστικού-αναγνωριστικού να αναφέρεται σε ένα αναγνωριστικό που προετοιμάζεται αυτήν τη στιγμή εάν το αναγνωριστικό στο οποίο γίνεται αναφορά έχει οριστεί μέσα σε μια παράσταση-προετοιμασίας-εγγραφής ή παράσταση-let. Αντί για αυτό, μια αναφορά-συγκεντρωτικού-αναγνωριστικού μπορεί να χρησιμοποιηθεί για να αποκτήσετε πρόσβαση στο περιβάλλον που περιλαμβάνει το αναγνωριστικό που προετοιμάζεται. Εάν μια αναφορά-περιεκτικού-αναγνωριστικού χρησιμοποιείται σε οποιαδήποτε άλλη κατάσταση, τότε ισοδυναμεί με αναφορά-αποκλειστικού-αναγνωριστικού.

αναφορά-περιεκτικού-αναγνωριστικού:
      @ αναγνωριστικό

Αυτό είναι χρήσιμο όταν ορίζετε επαναλαμβανόμενες συναρτήσεις, επειδή το όνομα της συνάρτησης κανονικά δεν θα ήταν εντός εμβέλειας.

[ 
    Factorial = (n) =>
        if n <= 1 then
            1
        else
            n * @Factorial(n - 1),  // @ is scoping operator

    x = Factorial(5) 
]

Όπως και με μια παράσταση-προετοιμασίας-εγγραφής, μια αναφορά-συγκεντρωτικού-αναγνωριστικού μπορεί να χρησιμοποιηθεί μέσα σε μια παράσταση-let για πρόσβαση στο περιβάλλον που περιλαμβάνει το αναγνωριστικό που προετοιμάζεται.

Σειρά αξιολόγησης

Εξετάστε την παρακάτω παράσταση που προετοιμάζει μια εγγραφή:

[ 
    C = A + B, 
    A = 1 + 1, 
    B = 2 + 2 
]

Κατά την αξιολόγησή της, αυτή η παράσταση παράγει την ακόλουθη τιμή εγγραφής:

[ 
    C = 6, 
    A = 2, 
    B = 4 
]

Η παράσταση αναφέρει ότι για την εκτέλεση του υπολογισμού για το A + B πεδίο C, πρέπει να είναι γνωστές οι τιμές αμφότερων των πεδίων A και των δύο πεδίων B . Αυτό είναι ένα παράδειγμα μιας σειράς εξαρτήσεων υπολογισμών που παρέχεται από μια παράσταση. Η αξιολόγηση M συμμορφώνεται με τη σειρά εξαρτήσεων που παρέχεται από τις παραστάσεις, αλλά είναι ελεύθερη να εκτελέσει τους υπόλοιπους υπολογισμούς με οποιαδήποτε σειρά επιλέξει. Για παράδειγμα, η σειρά υπολογισμού θα μπορούσε να είναι:

A = 1 + 1 
B = 2 + 2 
C = A + B

Ή θα μπορούσε να είναι:

B = 2 + 2 
A = 1 + 1 
C = A + B

Ή, δεδομένου ότι A το και B το δεν εξαρτώνται το ένα από το άλλο, μπορούν να υπολογιστούν ταυτόχρονα:

    B = 2 + 2 ταυτόχρονα με A = 1 + 1
    C = A + B

Παρενέργειες

Το να επιτρέπεται σε μια αξιολόγηση παράστασης να υπολογίζει αυτόματα τη σειρά των υπολογισμών για περιπτώσεις όπου δεν υπάρχουν ρητές εξαρτήσεις που δηλώνονται από την παράσταση είναι ένα απλό και ισχυρό μοντέλο υπολογισμού.

Ωστόσο, βασίζεται στη δυνατότητα αναδιάταξης των υπολογισμών. Δεδομένου ότι οι παραστάσεις μπορούν να καλούν συναρτήσεις και αυτές οι συναρτήσεις μπορούν να παρατηρούν την εξωτερική κατάσταση στην παράσταση εκδίδοντας εξωτερικά ερωτήματα, είναι δυνατή η δημιουργία ενός σεναρίου όπου η σειρά υπολογισμού έχει σημασία, αλλά δεν καταγράφεται στη μερική σειρά της παράστασης. Για παράδειγμα, μια συνάρτηση μπορεί να διαβάσει τα περιεχόμενα ενός αρχείου. Εάν αυτή η συνάρτηση καλείται επανειλημμένα, τότε μπορούν να παρατηρηθούν εξωτερικές αλλαγές σε αυτό το αρχείο και, επομένως, η αναδιάταξη μπορεί να προκαλέσει παρατηρήσιμες διαφορές στη συμπεριφορά του προγράμματος. Ανάλογα με την παρατηρούμενη σειρά αξιολόγησης για την ορθότητα μιας παράστασης M, προκαλείται μια εξάρτηση από συγκεκριμένες επιλογές υλοποίησης που μπορεί να διαφέρουν από τη μία αξιολόγηση στην άλλη ή μπορεί ακόμη και να διαφέρουν στην ίδια αξιολόγηση σε διαφορετικές περιπτώσεις.

Δυνατότητα απόδοσης

Μόλις υπολογιστεί μια τιμή, είναι αμετάβλητη, το οποίο σημαίνει ότι δεν μπορεί πλέον να αλλάξει. Αυτό απλοποιεί το μοντέλο για την αξιολόγηση μιας παράστασης και διευκολύνει την αιτιολόγηση σχετικά με το αποτέλεσμα, καθώς δεν είναι δυνατή η αλλαγή μιας τιμής αφού χρησιμοποιηθεί για την αξιολόγηση ενός επόμενου τμήματος της παράστασης. Για παράδειγμα, ένα πεδίο εγγραφής υπολογίζεται μόνο όταν απαιτείται. Ωστόσο, μόλις υπολογιστεί, παραμένει σταθερό για όλη τη διάρκεια της εγγραφής. Ακόμα και αν η προσπάθεια υπολογισμού του πεδίου προκάλεσε σφάλμα, το ίδιο σφάλμα θα εμφανίζεται ξανά σε κάθε προσπάθεια πρόσβασης σε αυτό το πεδίο εγγραφής.

Μια σημαντική εξαίρεση στον κανόνα αμετάβλητου-αφού-υπολογιστεί ισχύει για τις τιμές λίστας, πίνακα και δυαδικών τιμών, οι οποίες έχουν σημασιολογία ροής. Η σημασιολογία ροής επιτρέπει στην M να μετασχηματίζει σύνολα δεδομένων που δεν χωρούν στη μνήμη ταυτόχρονα. Με τη ροή, οι τιμές που επιστρέφονται κατά την απαρίθμηση ενός συγκεκριμένου πίνακα, λίστας ή δυαδικής τιμής παράγονται κατ' απαίτηση κάθε φορά που ζητούνται. Δεδομένου ότι οι παραστάσεις που ορίζουν τις απαριθμημένες τιμές αξιολογούνται κάθε φορά που απαριθμούνται, η έξοδος που παράγουν μπορεί να διαφέρει σε πολλές απαριθμήσεις. Αυτό δεν σημαίνει ότι πολλές απαριθμήσεις έχουν πάντα ως αποτέλεσμα διαφορετικές τιμές, απλώς ότι μπορεί να διαφέρουν εάν η προέλευση δεδομένων ή η λογική M που χρησιμοποιείται είναι μη αιτιοκρατικές.

Σημειώστε επίσης ότι η εφαρμογή συνάρτησης δεν είναι το ίδιο με την κατασκευή τιμών. Οι συναρτήσεις βιβλιοθήκης μπορεί να εκθέσουν εξωτερικές κατάσταση (όπως την τρέχουσα ώρα ή τα αποτελέσματα ενός ερωτήματος σε μια βάση δεδομένων που εξελίσσεται με την πάροδο του χρόνου), καθιστώντας τις μη αιτιοκρατικές. Παρόλο που οι συναρτήσεις που ορίζονται στην M δεν θα εκθέσουν οποιαδήποτε τέτοια μη αιτιοκρατική συμπεριφορά, μπορούν, εάν έχουν οριστεί, να καλούν άλλες συναρτήσεις που είναι μη αιτιοκρατικές.

Μια τελική πηγή μη αιτιοκρατίας στην M είναι τα σφάλματα. Τα σφάλματα διακόπτουν τις αξιολογήσεις όταν προκύπτουν (έως το επίπεδο στο οποίο αντιμετωπίζονται από μια παράσταση try). Δεν είναι συνήθως παρατηρήσιμο κατά πόσον a + b προκάλεσε την αξιολόγηση του πριν b από το ή b του a πριν a από το (παραβλέποντας εδώ τον ταυτόχρονο έλεγχο για λόγους απλότητας). Ωστόσο, εάν η δευτερεύουσα παράσταση που αξιολογήθηκε πρώτα εμφανίσει σφάλμα, τότε μπορεί να προσδιοριστεί ποια από τις δύο παραστάσεις αξιολογήθηκε πρώτη.