παραλληλισμού, τα οποία επιδεικνύουν υψηλή ανοχή σε σφάλματα. Έκτοτε η χρήση της έχει διαδωθεί και σε βιομηχανίες
παραλληλισμού, τα οποία επιδεικνύουν υψηλή ανοχή σε σφάλματα. Έκτοτε η χρήση της έχει διαδωθεί και σε βιομηχανίες
που μοιράζονται τις ίδιες λειτουργικές απαιτήσεις, όπως η τραπεζική, οι επικοινωνίες πραγματικού χρόνου (WhatsApp), κα.
που μοιράζονται τις ίδιες λειτουργικές απαιτήσεις, όπως η τραπεζική, οι επικοινωνίες πραγματικού χρόνου (WhatsApp), κα.
To OTP είναι μια συλλογή εργαλείων, βιβλιοθηκών, middleware και αρχών σχεδιασμού για προγράμμτα Erlang. Είναι
To Open Telecom Platform (OTP) είναι μια συλλογή εργαλείων, βιβλιοθηκών, middleware και αρχών σχεδιασμού για προγράμμτα Erlang. Είναι
αναπόσπαστο κομμάτι της διανομής ελεύθερου κώδικα της Erlang. Μερικά από τα περιεχόμενά του είναι:
αναπόσπαστο κομμάτι της διανομής ελεύθερου κώδικα της Erlang. Μερικά από τα περιεχόμενά του είναι:
\begin{itemize}
\begin{itemize}
\item Ένα σύστημα χρόνου εκτέλεσης (εικονική μηχανή), ο BEAM
\item Ένα σύστημα χρόνου εκτέλεσης (εικονική μηχανή), ο BEAM
...
@@ -233,35 +247,34 @@ O μεταγλωττιστής δε μεταφράζει απευθείας το
...
@@ -233,35 +247,34 @@ O μεταγλωττιστής δε μεταφράζει απευθείας το
Το κύριο κίνητρο πίσω από το σχεδιασμό της Core Erlang ήταν το να αναπτυχθεί μια αναπαράσταση προγραμμάτων Erlang που να
Το κύριο κίνητρο πίσω από το σχεδιασμό της Core Erlang ήταν το να αναπτυχθεί μια αναπαράσταση προγραμμάτων Erlang που να
καθιστά εύκολη την ανάπτυξη εργαλείων που πρέπει να διατρέξουν και να επεξεργαστούν προγράμματα Erlang, όπως
καθιστά εύκολη την ανάπτυξη εργαλείων που πρέπει να διατρέξουν και να επεξεργαστούν προγράμματα Erlang, όπως
αποσφαλματωτές, εργαλεία στατικής ανάλυσης κτλ. Κάτι τέτοιο δεν ήταν εφικτό απευθείας σε πηγαίο κώδικα Erlang, λόγω της
αποσφαλματωτές, εργαλεία στατικής ανάλυσης, κτλ. Κάτι τέτοιο δεν ήταν εφικτό απευθείας σε πηγαίο κώδικα Erlang, λόγω της
συντακτικής πολυπλοκότητάς της, και οι προσπάθειες απλούστευσης της γλώσσας οδηγήθηκαν σε αδιέξοδο.
συντακτικής πολυπλοκότητάς της, και οι προσπάθειες απλούστευσης της γλώσσας οδηγήθηκαν σε αδιέξοδο.
Το OTP παρέχει τη δυνατότητα σε οποιοδήποτε πρόγραμμα Erlang να διαβάσει την Core Erlang αναπαράσταση ενός οποιουδήποτε
Το OTP παρέχει τη δυνατότητα σε οποιοδήποτε πρόγραμμα Erlang να διαβάσει την Core Erlang αναπαράσταση ενός οποιουδήποτε
Erlang module. Σε αυτό το χαρακτηριστικό βασίζεται το σύστημά μας για την ανάλυση των προγραμμάτων που του δίνονται ως είσοδος.
Erlang module. Σε αυτό το χαρακτηριστικό βασίζεται το σύστημά μας για την ανάλυση των προγραμμάτων που του δίνονται ως είσοδος.
Φορτώνει τα modules στο σύστημα χρόνου εκτέλεσης, και αποσπά το Core Erlang Αφηρημένο Δένδρο Σύνταξης αυτού σε μορφή
Φορτώνει τα modules στο σύστημα χρόνου εκτέλεσης, και αποσπά το Core Erlang Αφηρημένο Δένδρο Σύνταξης αυτού σε μορφή
ενός συνόλου από εγγραφές (records, εγγενής τύπος δεδομένων της Erlang), όπως αυτά ορίζονται στο
ενός συνόλου από εγγραφές (records, εγγενής τύπος δεδομένων της Erlang), όπως αυτά ορίζονται στο
$otp/lib/compiler/src/core\_parse.hrl$.
\texttt{otp/lib/compiler/src/core\_parse.hrl}.
\section{Το "σύστημα τύπων" της Erlang}
\section{Οι τύποι δεδομένων της Erlang}
Η Erlang είναι μια γλώσσα με δυναμικό συστήμα τύπων. Αυτό σημαίνει ότι ο μεταγλωττιστής της γλώσσας δεν πραγματοποιεί έλεγχο τύπων κατά τη μεταγλώττιση ενός
Η Erlang είναι μια γλώσσα ασφαλής ως προς τους τύπους (type safe), αλλά με δυναμικό συστήμα τύπων. Αυτό σημαίνει ότι ο μεταγλωττιστής της γλώσσας δεν πραγματοποιεί έλεγχο τύπων κατά τη μεταγλώττιση ενός
προγράμματος. Το σύστημα χρόνου εκτέλεσης είναι υπεύθυνο για να εγγυηθεί την ασφάλεια τύπων, με το να ελέγχει την πληροφορία τύπων που είναι συσχετισμένη με κάθε
προγράμματος. Το σύστημα χρόνου εκτέλεσης είναι υπεύθυνο για να εγγυηθεί την ασφάλεια τύπων, με το να ελέγχει την πληροφορία τύπων που είναι συσχετισμένη με κάθε
κομμάτι δεδομένων ενός προγράμματος κατα τη διάρκεια της εκτέλεσης.
κομμάτι δεδομένων ενός προγράμματος κατα τη διάρκεια της εκτέλεσης.
Ένα κομμάτι δεδομένων σε Erlang ονομάζεται όρος ($term$). Ο τύπος ενός όρου μπορεί να είναι είτε κάποιος από τους ενσωματωμένους τύπους της Erlang, είτε ένας τύπος που
Ένα κομμάτι δεδομένων σε Erlang ονομάζεται όρος ($term$). Ο τύπος ενός όρου μπορεί να είναι είτε κάποιος από τους ενσωματωμένους τύπους της Erlang, είτε ένας τύπος που
έχει προσδιορίσει ο χρήστης. Οι ενσωματωμένοι τύποι της Erlang είναι:
έχει προσδιορίσει ο χρήστης. Οι ενσωματωμένοι τύποι της Erlang είναι:
\begin{itemize}
\begin{itemize}
\item Pid
\item Pid: τύπος διακριτικών διεργασιών
\item Port
\item Port: τύπος διακριτικών μιας θύρας Erlang
\item Reference
\item Reference: τύπος όρων που είναι μοναδικοί στο σύστημα χρόνου εκτέλεσης
\item Atom
\item Atom: τύπος κυριολεκτικών όρων, σταθερών
\item Bitstring
\item Bitstring: τύπος μια περιοχή μνήμης, τα περιεχόμενα της οποίας δεν έχουν κάποιον συγκεκριμένο τύπο
\item Float
\item Float: τύπος αριθμών κινητής υποδιαστολής
\item Fun
\item Fun: τύπος συναρτήσεων
\item Integer
\item Integer: τύπος ακεραίων αριθμών
\item List
\item List: τύπος μιας αθροιστικής δομής δεδομένων, με μεταβλητό πλήθος στοιχείων
\item Map
\item Map: τύπος μιας αθροιστικής δομής δεδομένων, με μεταβλητό πλήθος αντιστοιχίσεων κλειδιού-τιμής
\item Tuple
\item Tuple: τύπος μιας αθροιστικής δομής δεδομένων, με σταθερό πλήθος στοιχείων
\item Union
\end{itemize}
\end{itemize}
Οποιοσδήποτε όρος της Erlang μπορεί να αποτελέσει το περιεχόμενο των μηνυμάτων που ανταλλάσσουν διεργασίες μεταξύ τους
Οποιοσδήποτε όρος της Erlang μπορεί να αποτελέσει το περιεχόμενο των μηνυμάτων που ανταλλάσσουν διεργασίες μεταξύ τους
σε επίπεδο λειτουργικού συστήματος, ούτε όμως και νήματα, αλλά αποτελούν οντότητες τις οποίες διαχειρίζεται
σε επίπεδο λειτουργικού συστήματος, ούτε όμως και νήματα, αλλά αποτελούν οντότητες τις οποίες διαχειρίζεται
η εικονική μηχανή εκτέλεσης της Erlang, ο BEAM.
η εικονική μηχανή εκτέλεσης της Erlang, ο BEAM.
Οι διεργασίες σε Erlang δε μοιράζονται αποθηκευτικό χώρο. Ο μοναδικός μηχανισμός που παρέχεται στον προγραμματιστή για
Ο μηχανισμός που παρέχεται στον προγραμματιστή για
την υλοποίηση της επικοινωνίας και της ανταλλαγής πληροφοριών μεταξύ αυτών των διεργασιών
την υλοποίηση της επικοινωνίας και της ανταλλαγής πληροφοριών μεταξύ των διεργασιών του προγράμματός του
είναι η ασύγχρονη ανταλλαγή μηνυμάτων. Κάθε διεργασία διαθέτει ένα "κουτί εισερχομένων", μια ουρά από μηνύματα που έχει λάβει από άλλες διεργασίες. Για να καταναλώσει
είναι η ασύγχρονη ανταλλαγή μηνυμάτων. Κάθε διεργασία διαθέτει ένα "κουτί εισερχομένων", μια ουρά από μηνύματα που έχει λάβει από άλλες διεργασίες. Για να καταναλώσει
ένα μήνυμα από αυτήν την ουρά, ο προγραμματιστής χρησιμοποιεί την έκφραση $receive$, με την οποία παίρνει ένα μήνυμα από
ένα μήνυμα από αυτήν την ουρά, ο προγραμματιστής χρησιμοποιεί την έκφραση $receive$, με την οποία παίρνει ένα μήνυμα από
την κεφαλή της ουράς, και το συγκρίνει με μια σειρά από
την κεφαλή της ουράς, και το συγκρίνει με μια σειρά από
Στο listing 2.2 φαίνεται ένα παράδειγμα μιας συνάρτησης που περιμένει να διαβάσει από το κουτί εισερχομένων της:
Στο listing 2.2 φαίνεται ένα παράδειγμα μιας συνάρτησης που περιμένει να διαβάσει από το κουτί εισερχομένων της:
\begin{itemize}
\begin{itemize}
\item Μια πλειάδα τιμών (tuple) που αποτελείται από ένα atom, ένα pid κι έναν αριθμό
\item Μια τριάδα τιμών (tuple μεγέθους 3) που αποτελείται από το atom $num$, ένα pid κι έναν αριθμό.
\item Μια πλειάδα τιμών που αποτελείται από ένα atom, ένα pid κι ένα atom
\item Μια τριάδα τιμών που αποτελείται από το atom $atom$, ένα pid κι ένα ακόμη στοιχείο.
\itemΈναν απλό αριθμό
\itemΤον ακέραιο $42$.
\end{itemize}
\end{itemize}
Αν μια διεργασία που επικοινωνεί με αυτήν της αποστείλει ένα μήνυμα της μορφής $\{num, 42\}$, τότε η $foo/1$ δε θα το "καταναλώσει"
Αν μια διεργασία που επικοινωνεί με αυτήν της αποστείλει ένα μήνυμα της μορφής $\{num, 42\}$, τότε η $foo/1$ δε θα το ``καταναλώσει``
ποτέ. Αντίστοιχα, αν καμία διεργασία δεν αποστείλει στη διεργασία που εκτελεί τον κώδικα του listing 2.2 κάποιο μήνυμα
ποτέ. Αυτό δεν αποτελεί πρόβλημα από μόνο του, αλλά η αποστολή πολλών μηνυμάτων σε μια διεργασία, τα οποία αυτή δεν καταναλώνει, μπορεί να αποτελέσει πρόβλημα δυνητικά,
που να αντιστοιχεί σε ένα από τα μοτίβα της εντολής $receive$, η εκτέλεση θα "κρεμάσει" επ' αόριστον.
καθώς ενδέχεται να οδηγήσει σε εξάντληση της μνήμης του συστήματος χρόνου εκτέλεσης της Erlang, και κατά συνέπεια στον τερματισμό της εκτέλεσης ενός κόμβου του συστήματος.
Αντίστοιχα, αν καμία διεργασία δεν αποστείλει στη διεργασία που εκτελεί τον κώδικα του listing 2.2 κάποιο μήνυμα
που να αντιστοιχεί σε ένα από τα μοτίβα της εντολής $receive$, η εκτέλεση θα ``κρεμάσει`` επ' αόριστον.
Σε αυτήν την περίπτωση θα είχαμε ένα προβληματικό σενάριο, που
Σε αυτήν την περίπτωση θα είχαμε ένα προβληματικό σενάριο, που
προκύπτει από τη μη-συμμόρφωση τουλάχιστον ενός εκ των δύο μερών της επικοινωνίας στο αναμενόμενο πρωτόκολλο.
προκύπτει από τη μη-συμμόρφωση τουλάχιστον ενός εκ των δύο μερών της επικοινωνίας στο αναμενόμενο πρωτόκολλο.
%% Type and effect systems
%% Type and effect systems
\chapter{Συστήματα τύπων και επιδράσεων}
\chapter{Συστήματα τύπων και επιδράσεων}
Πολλές γλώσσες προγραμματισμού υλοποιούν ένα στατικό σύστημα τύπων, προκειμένου να εγγυηθούν ότι τελεστές εφαρμόζονται μόνο σε
Πολλές γλώσσες προγραμματισμού ενσωματώνουν ένα στατικό σύστημα τύπων, προκειμένου να εγγυηθούν ότι τελεστές εφαρμόζονται μόνο σε
τελεσταίους της κατάλληλης μορφής, δηλαδή του κατάλληλου είδους \cite{types-and-prog-langs, advanced-types-and-prog-langs}. Για παράδειγμα, ένα κλασσικό σύστημα τύπων θα απέρριπτε
τελεσταίους της κατάλληλης μορφής, δηλαδή του κατάλληλου είδους \cite{types-and-prog-langs, advanced-types-and-prog-langs}. Για παράδειγμα, ένα κλασσικό σύστημα τύπων θα απέρριπτε
το πρόγραμμα 3.1 (γραμμένο σε μια υποθετική γλώσσα), καθώς η πράξη της αφαίρεσης ($-$), δεν έχει νόημα όταν εφαρμόζεται
το πρόγραμμα 3.1 (γραμμένο σε μια υποθετική γλώσσα), καθώς η πράξη της αφαίρεσης ($-$), δεν έχει νόημα όταν εφαρμόζεται
σε μια συμβολοσειρά και έναν αριθμό (υποθέτουμε ότι η γλώσσα δεν παρέχει τη δυνατότητα υπερφόρτωσης τελεστών, με την
σε μια συμβολοσειρά και έναν αριθμό (υποθέτουμε ότι η γλώσσα δεν παρέχει τη δυνατότητα υπερφόρτωσης τελεστών, με την