Thursday 14 August 2008

Αλλά τι είναι ένας υπολογιστής;

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

Η βασική αρχή της Αριστοτελικής λογικής είναι ότι μία πρόταση μπορεί να είναι αληθης ή ψευδής. Δε μπορεί να είναι και αληθής και ψευδής ταυτόχρονα, αλλά ούτε και να είναι τίποτε άλλο εκτός απο αληθης ή ψευδής. Φυσικά υπάρχουν και άλλες λογικες όπως η τρίτιμη λογική του Lukasiewiz, ή η ασαφής λογική (fuzzy) αλλα οι υπολογιστές δε λειτουργούν ακόμη με αυτές. Ίσως στο μέλλον. Aς υποθέσουμε τώρα ότι έχουμε δύο προτάσεις π1 και π2. Η κάθε πρόταση μπορεί να είναι αληθής ή ψευδής, αρα οι δυνατοί συνδυασμοί είναι 4.
π1 αληθής, π2 αληθής
π1 αληθής, π2 ψευδής
π1 ψευδής, π2 αληθής
π1 ψευδής, π2 ψευδής

Η ερώτηση που τίθεται τώρα είναι τι συμβαίνει με την πρόταση "π1 και π2". Το αποτέλεσμα μπορεί να βρεθεί με το λεγόμενο πίνακα αλήθειας.
(Πρέπει να βάλω τον πίνακα εδώ)

Αλλά ας δούμε ένα παράδειγμα. π1="Σήμερα βρέχει" και π2="Χθες είχε ήλιο". Ας υποθεσουμε ότι όντως σημερα βρέχει και ότι όντως χθες είχε ήλιο. Τότε η π1 αληθεύει και η π2 αληθεύει. Τότε η π3= π1 και π2 ="Σήμερα βρέχει αλλά χθες είχε ήλιο" επίσης αληθεύει. Αν όμως χθες δεν είχε ήλιο, αρα η π2 είναι ψευδης, τότε και η π3="Σήμερα βρέχει αλλά χθες είχε ήλιο" είναι επίσης ψευδής.

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

π1="Σήμερα θα βρέψει", π2="Σήμερα θα έχει ήλιο", π3=π1 ή π2="Σήμερα θα βρέξει ή θα έχει ήλιο" αληθεύει σε τρεις από τις τέσσερις περιπτώσεις, εκτός απο την περίπτωση δηλαδή που ούτε βρέξει ούτε έχει ήλιο (ίσως όταν έχει μόνο σύννεφα).

Υπάρχει βέβαια και το αποκλειστικό ή.
(Πρέπει να βάλω τον πίνακα εδώ)

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

Φυσικά όλα τα παραπάνω μπορούν να γραφούν με μαθηματικά ή ηλεκτρονικά σύμβολα και να διατυπωθούν σχέσεις μεταξύ τους. Ας υποθέσουμε προς στιγμή ότι οι παραπάνω πίνακες μπορούν να πραγματοποιηθούν ως πύλες (ηλεκτρονικα εξαρτηματα, θα αναφερθώ στη φυσική τους λειτουργία παρακάτω). Οι τιμές αληθής-ψευδής μπορούν να μεταφραστούν ως 0-1 ή υψηλή-χαμηλή τάση, όπως χρησιμοποιείται στην ηλεκτρονική. Έχουμε δηλαδή μια συσκευή που έχει δύο εισόδους (καλώδια, σωλήνες), τις π1 και π2, και μία έξοδο (καλώδιο, σωλήνας), την π3.
Αναλογα με το ποια συσκευη θα χρησιμοποιήσουμε μπορούμε να πραγματοποιήσουμε την αντίστοιχη πράξη. Οι είσοδοι αυτές δεν είναι τίποτε άλλο απο καλώδια με ρεύμα. Αν εχουν υψηλη ταση, αληθευουν. Με χαμηλή τάση ψεύδονται.

Οι παραπάνω πύλες μπορούν να συνδυαστούν είτε σε σειρά ή παράλληλα και να δώσουν άλλες πιο πολύπλοκες πύλες με περισσότερες εισόδους και εξόδους. Το αποτελεσμα μιας πύλης μπορεί να διοχευτεί σε ένα λαμπτήρα (παλιότερα χρησιμοποιούσαν λαμπτηρες πυρακτώσεως στους πρώτους υπολογιστές). Αν είναι υψηλή η τάση (1, αληθης) τότε θα ανάψει η λαμπα, αν είναι χαμηλή η τάση (0, ψευδής) δε θα αναψει η λάμπα. Ετσι έχουμε μια πρωτόγονη επικοινωνία με το χρήστη. Κατ'αναλογία μπορεί να φανταστεί κανείς τα pixel της οθόνης.

Μεχρι στιγμής είδαμε ότι μπορούμε να αναπαραστήσουμε μόνο 0-1, ψευδές-αληθες, και τίποτε παραπάνω. Θα αποδείξουμε τώρα ότι αυτή την αναπαρασταση μπορούμε να τη χρησιμοποιήσουμε για οτιδήποτε. Ας πάρουμε τους φυσικούς αριθμούς 1, 2, 3, 4, ... Το 1 είναι εύκολο. Το 2 γράφεται 1*2, το 3=1*2+1, 4=1*2*2, 5=1*2*2+1, 6=1*2*2+1*2, 7=1*2*2+1*2+1 κτλ. Όπως φαίνεται όλοι οι αριθμοί μπορούν να γραφούν ως γινομενο και άθροισμα του 1 και του 2. Ας θεωρήσουμε τώρα ότι έχουμε 8 λάμπες. Σβηστή είπαμε είναι 0, ανοιχτή 1. Τις βάζουμε σε σειρά. Το ένα αναπαρισταται απο αυτές τις λάμπες ώς εξης: οι 7 αριστερά ειναι σβηστες και η ογδοη ειναι ανοιχτη (00000001). Το δύο: οι 6 αριστερά ειναι σβηστες και η εβδομη ειναι ανοιχτη και η ογδοη σβηστη (00000010). Το τρία: οι 6 αριστερά ειναι σβηστες και η εβδομη ειναι ανοιχτη (00000011)και η ογδοη ανοιχτή. Το τέσσερα (00000100). Το πέντε (00000101). Και πάει λέγοντας.

Γιατί όμως ξεκινάμε από δεξία; Οι άραβες θα ξεκινούσαν από αριστερα; Το ίδιο ακριβώς πρόβλημα υπάρχει και στην αρχιτεκτονική επεξεργαστών. Ο τρόπος που παρουσιάσαμε παραπάνω ακολουθεί το συνηθισμένο τρόπο γραφής αριθμών και καλείται big endian. Αντίθετα, ο τρόπος που γράφουμε την ημερομηνία (27.06.2008) από τα μικρότερα ψηφία στα μεγαλύτερα λέγεται little endian. Aρχιτεκτονική big endian έχουν οι επεξεργαστές powerpc, sparc, ενώ little endian οι intel, amd και άλλοι.

Αν θελήσουμε να αναπαραστήσουμε και αρνητικούς αριθμούς τότε χρειαζόμαστε και μία ακομη λαμπα (bit) για το πρόσημο. Αν η πρώτη πρώτη λαμπα απο αριστερα είναι αναμένη τότε έχουμε αρνητικό αριθμό. (Για αυτούς που ξέρουν C αυτό αντιστοιχεί σε integer, ενώ η προηγούμενη αναπαρασταση σε unsigned)

Επειδή όμως έχουμε πεπερασμένο αριθμό από λάμπες δε μπορουμε να αναπαραστήσουμε όλους τους αριθμούς. Γι'αυτό και υπαρχει σε όλες τις γλώσσες προγραμματισμού ένα εύρος απο -12345678 μέχρι 12345678 (για παραδειγμα) που μπορεί να αναπαρασταθεί. Η αναπαράσταση πραγματικών αριθμών γίνεται με τη χρήση επιπλέον λαμπτήρων (bits) που αποθηκεύουν τη θέση της υποδιαστολής και τον εκθέτη του 10, αλλά δε θα ήθελα να μπώ εδώ σε τέτοιες λεπτομέρειες.

Έπειτα έρχεται η ερώτηση ναι αλλά εγώ δε θέλω μόνο αριθμούς θέλω και γράμματα, μικρά και κεφαλαία. Η απάντηση ήρθε με το αλφάβητο ASCII. Κάθε σύμβολο που χρησιμοποιείται έχει την αναπαράστησή του στο δεκαεξαδικό σύστημα (αντι να έχουμε λάμπες ανοιχτες-σβηστες, δυαδικό σύστημα δηλαδή, εχουμε λάμπες σβηστες+15 χρώματα δεκαεξαδικό δηλαδή). Ετσι μπορούμε να χρησιμοποιούμε λατινικούς χαρακτήρες, μικρά κεφαλαια, και άλλα σύμβολα. Μετά φυσικά ήρθαν και άλλες κωδικοποιήσεις για τις οποίες δεν έχω ιδέα