\documentclass[a4paper,oneside,titlepage,12pt]{article}
\usepackage{fontspec}
\setromanfont{Arial}
\setsansfont{Arial}
\setmonofont{Arial}
\usepackage{graphicx}
\makeatletter
\def\maxwidth{%
\ifdim\Gin@nat@width>\linewidth
\linewidth
\else
\Gin@nat@width
\fi
}
\makeatother
\title{Άσκηση 3: Συστήματα Τύπων - Sexy Types}
\author{Σπύρος Χατζηχριστοδούλου 03104617}
\date{}
\begin{document}
\maketitle
Πρώτα θα εξετάσουμε την γλώσσα C. Τα διάφορα στοιχεία της γλώσσας που ζητείται να εξετάσουμε είναι:
\newline
1. \textbf {Αναφορές (references) ή δείκτες ή μεταβλητές που επιδέχονται ανάθεση}:
\newline
Η C ως καθαρή γλώσσα που υλοποιεί το μοντέλο προστακτικού προγραμματισμού, έχει κατ'αρχάς μεταβλητές που επιδέχονται ανάθεση. Για παράδειγμα, μπορούμε να γράψουμε κάτι σαν
\begin{quote}
{int a = 5;}
\end{quote}
το οποίο σημαίνει ότι δημιουργούμε μια μεταβλητή τύπου "int" και της αναθέτουμε την τιμή 5. Επίσης, στην C υπάρχουν αναφορές με τη μορφή των δεικτών, δηλαδή μπορούμε να δημιουργήσουμε δείκτες σε μεταβλητές, σε δομές (structs - unions), ακόμα και σε συναρτήσεις. Για παράδειγμα, μπορούμε να γράψουμε κάτι σαν
\begin{quote}
{int * a;}
\end{quote}
για να ορίσουμε ένα δείκτη σε ακέραιο, ή κάτι σαν
\begin{quote}
{int * compare(int a, int b)}
\end{quote}
για να ορίσουμε ένα δείκτη σε συνάρτηση.
\newline
2. \textbf{Εξαιρέσεις (exceptions)}:
\newline
Η {C} δεν υποστηρίζει το χειρισμό εξαιρέσεων. Όταν μια εξαίρεση συμβή (π.χ. διαίρεση με το 0), ο μεταγλωττιστής βγάζει ένα {warning} ότι γίνεται διαίρεση με το 0, και τρέχοντας το πρόγραμμα βγάζει μήνυμα "{floating point exception}".
\newline
3. Υποτύποι ({subtyping}):
\newline
Η {C} δεν υποστηρίζει υποτύπους. Δηλαδή, όταν μια συνάρτηση περιμένει σαν ορίσματα παραμέτρους τύπου \textbf{α} και της περάσουμε παράμετρους τύπου \textbf{α'}, ακόμα και αν ο \textbf{α'} είναι υποτύπος του \textbf{α} (δηλαδή ένα περιορισμένο σύνολο του \textbf{α}), η συνάρτηση θα βγάλει σφάλμα ότι ο τύπος της παραμέτρου που προσπαθούμε να περάσουμε δεν είναι ο αναμενόμενος.
\newline
\newline
4. Αναδρομικοί τύποι ({recursive types}):
\newline
Η {C} δεν υποστηρίζει ούτε αναδρομικούς τύπους. Μπορεί να υλοποιήσει κάποιους όμως, χρησιμοποιώντας κατάλληλες δομές δεδομένων. Για παράδειγμα, μια λίστα από φυσικούς αριθμούς δεν μπορεί να υλοποιηθεί με αναδρομικό ορισμό (μια κενή λίστα είναι λίστα - προσθέτοντας στοιχεία σε μια λίστα παραμένει λίστα), αλλά με χρήση κατάλληλης δομής, που αποτελείται απόένα πεδίο στο οποίο βρίσκεται ο αριθμός και ένα πεδίο το οποίο περιέχει ένα δείκτη στον επόμενο αριθμό. Φυσικά έτσι χάνεται τελείως ο αναδρομικός χαρακτήρας της λίστας (που θέσαμε εδώ για παράδειγμα), αλλά είναι σίγουρα καλύτερο από το τίποτα.
\newline
5. Πολυμορφισμός 2ης τάξης({\begin{math}F_2\end{math}})
\newline
Η {C} δεν υποστηρίζει καθόλου πολυμορφισμό συναρτήσεων. Δηλαδή, δε μπορούμε να γράψουμε μια "ταυτοτική" συνάρτηση η οποία να δουλεύει για ορίσματα κάθε τύπου.
\newline
\newline
6. Πολυμορφισμός ω τάξης($F_{ω}$ {polymorphism}) ή/και κατασκευαστές τύπων:
\newline
Ισχύει ό,τι και παραπάνω για τον πολυμορφισμό. Όσον αφορά τους κατασκευαστές τύπων, στην {C} μπορούμε να ορίσουμε enumerations τα οποία αντιστοιχούν (συνήθως) μια ακέραια τιμή σε ένα "όνομα" που περιέχεται μέσα στο enumeration, unions και structs τα οποία περιέχουν πολλά πεδία διαφορετικών (ίσως) τύπων, με τα οποία μπορούμε να προσπαθήσουμε να προσομοιώσουμε την κατασκευή σύνθετων τύπων ξεκινώντας από τους primitive τύπους της C.
\end{document}