Λογισμικό Υπολογιστών (Software) ΜΥΥ-106 Εισαγωγή Η/Υ και Πληροφορική
Αλγόριθμος Κάθε υπολογισμός αποτελείται από μια σειρά, καλά καθορισμένων, σχετικά απλών, βημάτων Η μέθοδος υπολογισμού ονομάζεται αλγόριθμος (algorithm) Από τον Πέρση μαθηματικό Muḥammad ibn Mūsā al-khwārizmī, ~750μΧ Ένας αλγόριθμος μπορεί να εκφραστεί σε μια γλώσσα φυσική γλώσσα, π.χ. Ελληνικά τεχνιτή γλώσσα, π.χ. Μαθηματικά Υπάρχουν συχνά πολλοί διαφορετικοί αλγόριθμοι για τον ίδιο υπολογισμό 2
Παράδειγμα αλγόριθμου Υπολογισμός διαγωνίου, ορθ. παραλληλόγραμμου Από Πυθαγόρειο θεώρημα a 2 + b 2 Η «γλώσσα» μας περιγράφει +,-,*,/ μόνο. Πώς υπολογίζουμε τη τετραγωνική ρίζα; Μέθοδος Βαβυλώνιων ή του Ήρων της Αλεξάνδριας: 1. Βρές αρχικό ακέραιο αριθμό x όσο πιο κοντά στη ρίζα. 2. Αντικατέστησε τον x με τον μέσο όρο του x με το y/x 3. Επανέλαβε βήμα 2 μέχρι η διαφορά να είναι όσο μικρή όσο χρειάζεται x = Παρατήρηση: Η λύση εξαρτάται πολύ από τη «γλώσσα» y (x + y / x)/2 3
Προγραμματισμός Για να λύσουμε ένα πρόβλημα χρησιμοποιώντας ΗΥ πρέπει να βρούμε/σχεδιάσουμε έναν αλγόριθμο να τον περιγράψουμε σε γλώσσα κατάλληλη για τον υπολογιστή Η περιγραφή του αλγορίθμου σε μια τέτοια γλώσσα λέγεται προγραμματισμός και η γλώσσα, γλώσσα προγραμματισμού Στην αργκό μας το πρόγραμμα λέγεται κώδικας 4
Γλώσσα μηχανής Το υλικό έχει ήδη μια γλώσσα Μπορεί να κάνει βασικές αριθμητικές πράξεις, συγκρίσεις,... π.χ. 00000010001100100100000000100000 για MIPS (RISC) σημαίνει πρόσθεσε τους αριθμούς στους καταχωρητες με τα ονόματα s1 s2 και γράψε το αποτέλεσμα στον καταχωρητή t1 Συμβολική γλώσσα (assembly) πιο εύκολη για ανθρώπους add $t1, $s1, $s2 Απαιτείται μετάφραση από το συμβολομεταφραστή (assembler) Ο προγραμματιστής πρέπει να διαχειριστεί πολλές λεπτομέρειες: σε ποια διεύθυνση στη μνήμη κρατάω το χ, σε ποιά βρίσκεται η εντολή που θέλω να επαναλάβω,... 5
Γλώσσες προγραμματισμού Όπως είδαμε στο παράδειγμα, πολύ απλές εντολές κάνουν δύσκολη την περιγραφή του αλγόριθμου Λύση: γλώσσες «υψηλού επιπέδου» και (αυτόματη) μετάφραση στη γλώσσα μηχανής Άλλο ένα παράδειγμα χρήσης αφαίρεσης στους υπολογιστές οι λεπτομέρειες τις γλώσσας μηχανής κρύβονται Το πρόγραμμα υψηλού επιπέδου ονομάζεται πηγαίο (source code) Το μεταγλωτισμένο πρόγραμμα ονομάζεται object code 6
Παραγωγικότητα Παραγωγικότητα προγραμματιστή (σωστές) γραμμές προγράμματος ανα μέρα Ο προγραμματιστής είναι πιο παραγωγικός όταν περιγράφει έναν αλγόριθμο χρησιμοποιώντας έννοιες κοντινές με αυτές που χρησιμοποιούνται στη περιγραφή του προβλήματος Συνήθως μεταβλητές, αριθμητικές πράξεις, διαδικασίες,... Γιατί όχι φυσική γλώσσα; 7
Είδη γλωσσών προγραμματισμού Υπάρχουν εκατοντάδες διαφορετικές γλώσσες Πολλοί τρόποι κατάταξης γλωσσών προγραμματισμού περιγραφή λύσης (προβλήματος) οργάνωση προγράμματος χρήση Πόσες πρέπει να μάθει κανείς; Ένας φοιτητής, 2-3 σε καλό βάθος Γνωρίζοντας 1-2 είναι εύκολο να μάθει κανείς άλλες 8
Είδη: περιγραφή Προστακτικές (imperative) Περιγράφουν τον αλγόριθμο ως μια ακολουθία εντολών C, C++, Java, Python int factorial(int n){ int c, result = 1; for( c = 1 ; c <= n ; c++ ) result = result*c; return(result); } Δηλωτικές (declarative) περιγράφουν τον αλγόριθμο δίνοντας λεπτομερή περιγραφή του ζητούμενου αποτελέσματος και των ιδιοτήτων του Haskell, Prolog factorial 0 = 1 factorial n = n * factorial (n - 1) 9
Είδη: Οργάνωση προγράμματος Διαδικαστικές γλώσσες (procedural) Το πρόγραμμα είναι οργανωμένο σε διαδικασίες C, Pascal Αντικειμενοστραφείς γλώσσες (object-oriented) Το πρόγραμμα είναι οργανωμένο σε αντικείμενα που αλληλεπιδρούν μεταξύ τους C++, Java, Python Συναρτησιακές γλώσσες (functional) Το πρόγραμμα είναι οργανωμένο σε μαθηματικές συναρτήσεις 10
Είδη: χρήση Γενικής χρήσης C, C++, Java Γλώσσες σεναρίου (scripting) Perl, Python, Unix shells Διαδικτυακές Javascript, PHP Ειδικές εφαρμογές postscript, Matlab Παράλληλες Erlang, 11
Βασικά στοιχεία γλωσσών Σε προστακτικές κυρίως γλώσσες Μεταβλητές Είσοδος-έξοδος Απλές αριθμητικές και άλλες πράξεις - εκφράσεις Εκτέλεση υπό συνθήκη Επανάληψη Υποπρογράμματα 12
Μεταβλητές Οι μεταβλητές αποθηκεύουν ενδιάμεσα αποτελέσματα Η αλλαγή της τιμής μιας μεταβλητής ονομάζεται εκχώριση ή ανάθεση τιμής Η χρησιμοποίηση της τιμής μιας μεταβλητής (σε μία αριθμητική έκφραση) λέγεται ανάκληση π.χ. a = c; Σε χαμηλό επίπεδο (γλώσσα μηχανής) οι μεταβλητές αντιστοιχούν σε θέσεις μνήμης 13
Είσοδος, έξοδος Εντολές εισόδου που διαβάζουν μια τιμή από κάποιο περιφερειακό (συνήθως το πληκτρολόγιο) και την εκχωρούν σε μια μεταβλητή π.χ. a = input() Εντολές εξόδου που στέλνουν τη τιμή μιας μεταβλητής σε ένα περιφερειακό (συνήθως την οθόνη) π.χ. print a 14
Εκφράσεις Μεταβλητές και σταθερές μπορούν να χρησιμοποιηθούν ως δεδομένα για αριθμητικές (και άλλες) πράξεις Τα δεδομένα ονομάζονται τελεσταίοι (operands) Τα σύμβολα των πράξεων λέγονται τελεστές (operators) Συνηθισμένες αριθμητικές πράξεις, συγκρίσεις, λογικές πράξεις (και, ή, όχι) Οι κατάλληλοι συνδυασμοί των παραπάνω λέγονται εκφράσεις (expressions) και μπορούν να εκχωρηθούν σε κάποια μεταβλητή π.χ. in_range = ((a+1 > 3) and (a+1 < 10)) 15
Εκτέλεση υπό συνθήκη Συχνά ένα πρόγραμμα εκτελεί διαφορετικές εντολές ανάλογα με την τιμή κάποιου αποτελέσματος Οι περισσότερες γλώσσες έχουν μια δομή επιλογής που μοιάζει με τη παρακάτω αν <συνθήκη επιλογής> τότε τμήμα εντολών 1 αλλιώς τμήμα εντολών 2 16
Επανάληψη Οι περισσότεροι αλγόριθμοι επαναλαμβάνουν κάποια βήματα και οι γλώσσες παρέχουν αυτή τη δυνατότητα όσο <συνθήκη> επανέλαβε τμήμα εντολών τέλος επανάληψης Προφανώς η επανάληψη πρέπει κάποτε να σταματάει αλλιώς δεν θα τελειώσει ο υπολογισμός συχνό προγραμματιστικό λάθος 17
Υποπρογράμματα Για να λύσουμε δύσκολα προβλήματα συχνά τα χωρίζουμε σε έναν αριθμό από απλούστερα πολύ χρήσιμη στρατηγική, «διαίρει και βασίλευε»! το ίδιο υπο-πρόβλημα εμφανίζεται πολλές φορές αφαίρεση! Αντί να ξαναγράφουμε τις εντολές που λύνουν το υποπρόβλημα πολλές φορές, χρησιμοποιούμε ένα υποπρόγραμμα με δικές του εισόδους και εξόδους (μεταβλητές) το καλούμε κάθε φορά με τις εισόδους που θέλουμε ονομάζεται: υπορουτίνα, διαδικασία, μέθοδος,... 18
Μετάφραση Γενικά ένα πρόγραμμα σε υψηλού επιπέδου γλώσσα μεταφράζεται ολόκληρο σε γλώσσα μηχανής και αποθηκευεται σε ένα εκτελέσιμο (executable) αρχείο ένα αρχείο με ένα «σημάδι» ότι περιέχει ένα πρόγραμμα Το λειτουργικό σύστημα, αντιγράφει το πρόγραμμα στη μνήμη (φορτώνει), το «ετοιμάζει» και το εκτελεί/τρέχει Αυτό συμβαίνει σε προγράμματα σε C, C++, Pascal, Το πρόγραμμα που κάνει τη μετάφραση ονομάζεται μεταγλωττιστής (compiler) 19
Μετάφραση (συν.) Η μετάφραση μπορεί να γίνει και ανά εντολή/γραμμή γλώσσας προγραμματισμού Το εκτελεί ένας εικονικός επεξεργαστής που έχει ως αρχιτεκτονικό σύνολο εντολών αυτό της γλώσσας προγραμματισμού στην ουσία ένα απλό πρόγραμμα Λέγεται διερμηνευτής (interpreter) Αυτό συμβαίνει σε προγράμματα Java, Python, Ενα μεταγλωτισμένο πρόγραμμα γενικά εκτελείται γρηγορότερα από ένα διερμηνευόμενο 20
Γλώσσες και μηχανές Μια γλώσσα αντιστοιχεί σε μια μηχανή και αντίστροφα Θα δείτε σε μάθημα θεωρίας υπολογισμού ότι τα δύο είναι ισοδύναμα! Μια γλώσσα ορίζει (περιγράφει) μια μηχανή και μια μηχανή ορίζει (εκτελεί) μια γλώσσα Μπορούμε (και γενικά το κάνουμε) να ορίσουμε μια σειρά από γλώσσες/μηχανές ώστε να πλησιάσουμε σε μία βολική, για τον άνθρωπο, γλώσσα/μηχανή Ενδιάμεσα στάδια χρειάζονται για διάφορους λόγους Στο κατώτατο επίπεδο υπάρχει μια πραγματική μηχανή (ο επεξεργαστής) Τα ενδιάμεσα επίπεδα ορίζουν υποθετικούς υπολογιστές ή εικονικές μηχανές 21
Μεταγλώτιση, διερμηνεία Μεταγλώτιση από L2 σε L1 μετάφραση ολόκληρου του προγράμματος από τη γλώσσα L2 στη γλώσσα L1 και αργότερα εκτέλεση του από τη μηχανή M1 Η μετάφραση μπορεί να γίνει «με το χέρι», αλλά είναι πολύ καλύτερο να αυτοματοποιηθεί... Προϋποθέτει την ύπαρξη ενός βοηθητικού προγράμματος, μεταγλωτιστή (compiler) που κάνει τη μετατροπή Διερμηνεία από L2 σε L1 μετάφραση κάθε εντολής της L2 και άμεση εκτέλεσή της Υπάρχει ένα πρόγραμμα (σε L1) που δέχεται (ως δεδομένα!) το πρόγραμμα γλώσσας L2 22
Παράδειγμα: προγραμματισμός ρομπότ οικιακής βοηθού Το πρόγραμμα σε γλώσσα L2 λέει: Κοσκίνισε 150γρ αλεύρι με 1 κουταλιά baking powder και μια πρέζα αλάτι Πρόσθεσε 30γρ ζάχαρη Χτύπα ένα αυγό με 150ml γάλα Βάλτα όλα μαζί και ανακάτεψε Ζέστανε το τηγάνι Βάλε κουταλιές από το μίγμα στο τηγάνι και ψήσε για 2-3 λεπτά από κάθε πλευρά 23
Διερμηνευτής Διαβάζω εντολή: Κοσκίνισε 150γρ αλεύρι με 1 κουταλιά baking powder και μια πρέζα αλάτι Εκτελώ: Άνοιξε ντουλάπι κάτω δεξιά Βρές χαρτοσακούλα που γράφει αλεύρι και φέρε στο τραπέζι Άνοιξε τελευταίο συρτάρι Βρές ζυγαριά και φέρε στο τραπέζι... Διαβάζω εντολή: Πρόσθεσε 30γρ ζάχαρη Εκτελώ: άνοιξε ντουλάπι... 24
Μεταγλωτιστής Διαβάζει όλο το πρόγραμμα σε L2 και το μεταφράζει σε L1 άνοιξε κάτω δεξιά ντουλάπι φέρε αλεύρι άνοιξε τελευταίο συρτάρι φέρε ζυγαριά... άνοιξε ψυγείο... Μετά το πρόγραμμα L1 μπορεί να εκτελεστεί από τη Μ1 γενικά ο μεταγλωτιστής κοιτάει και μήπως μπορεί να βελτιώσει το πρόγραμμα, π.χ. βγάλε όλα τα υλικά από τα ντουλάπια στο τραπέζι 25
Κατηγορίες λογισμικού Εφαρμογές ο λόγος ύπαρξης των υπολογιστών εφ. γραφείου, παιχνίδια,... Προγράμματα για ανάπτυξη λογισμικού μεταγλωτιστές, διερμηνείς,... Λειτουργικό σύστημα (Λ.Σ.) σύνολο προγραμμάτων διαχειριση περιφερειακών (λεπτομέρειες εισόδου-εξόδου), μέσων αποθήκευσης (π.χ. λεπτομέρειες δίσκων κρύβονται κάτω από σύστημα αρχείων/καταλόγων) βοηθητικά προγράμματα συντονισμός προγραμμάτων 26
Είδη Λ.Σ. Το Λ.Σ. δεν είχε προβλευτεί από τους εφευρέτες των υπολογιστών προέκειψε αργότερα ώστε να απλοποιήσει βασικές, διαδικαστικές, χρονοβόρες εργασίες Είδη Λ.Σ.: Πραγματικού χρόνου (real-time) γρήγορη και προβλέψιμη αντίδραση Αριθμός (ταυτόχρονων) χρηστών: ένας ή πολλοί πολλοί λογαριασμοί δε σημαίνει πολλοί ταυτόχρονοι χρήστες Αριθμός εργασιών (single/multi-tasking) 27
Πυρήνας Λ.Σ. Παρέχει τις βασικές λειτουργίες διαχείριση μνήμης επιλέγει πιο πρόγραμμα θα εκτελεστεί παρέχει πρόσβαση στα περιφερειακά (μέσω τον οδηγών device drivers) Τα κοινά προγράμματα χρηστών δεν έχουν άμεση πρόσβαση στον πυρήνα Παρέχει βοηθητικές λειτουργίες που λέγονται κλήσεις συστήματος (system calls) κάτι σαν υπορουτίνες 28
Μηχανή Λειτουργικού Συστήματος Η μηχανή Λ.Σ. είναι μια εικονική μηχανή που έχει ως γλώσσα τη γλώσσα μηχανής και τις κλήσεις συστήματος (application binary interface ABI) 29
Διεργασία (process, task) Η δραστηριότητα εκτέλεσης των εντολών του προγράμματος από την μηχανή Διαχειριζεται (ξεκινάει, διακόπτεται,...) από τον πυρήνα που κρατάει πληροφορίες σχετικά με την κατάσταση της διεργασίας π.χ. ποια εντολή πρόκειται να εκτελεστεί (διεύθυνση μνήμης) Το τμήμα του πυρήνα λέγεται χρονοδρομολογητής (scheduler) 30