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