# Προγραμματισμός

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

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

## Ιστορία

 Η Άντα Λάβλεϊς, της οποίας οι σημειώσεις προστέθηκαν στο τέλος της εργασίας του Λουίτζι Μαναμπρέα περιελάμβαναν τον πρώτο αλγόριθμο που σχεδιάστηκε για επεξεργασία από μια Aναλυτική Mηχανή. Συχνά αναγνωρίζεται ως η πρώτη προγραμματίστρια υπολογιστών στην ιστορία.
Οι προγραμματιζόμενες συσκευές υπάρχουν εδώ και αιώνες. Ήδη από τον 9ο αιώνα, ένα προγραμματιζόμενο πρόγραμμα ακολουθίας μουσικής εφευρέθηκε από τους Πέρσες αδερφούς Banu Musa, οι οποίοι περιέγραψαν ένα αυτοματοποιημένο μηχανικό φλάουτο στο *Βιβλίο Έξυπνων Μηχανών (Book of Ingenious Devices)*. Το 1206, ο Άραβας μηχανικός Αλ-Τζαζάρι εφηύρε μια προγραμματιζόμενη μηχανή τυμπάνων στο οποίο ένα μουσικό μηχανικό αυτόματο ήταν φτιάγμενο να παίζει διάφορους ρυθμούς και μοτίβα τυμπάνων, μέσω καρφιών και εκκεντροφόρων. Το 1801, ο αργαλειός Ζακάρ μπορούσε να παράγει εντελώς διαφορετικές πλέξεις αλλάζοντας το "πρόγραμμα" - μια σειρά από χαρτόνια με διάτρητες τρύπες.

Οι αλγόριθμοι παραβίασης κώδικα υπάρχουν επίσης εδώ και αιώνες. Τον 9ο αιώνα, ο Άραβας μαθηματικός Αλ-Κίντι περιέγραψε έναν κρυπτογραφικό αλγόριθμο για την αποκρυπτογράφηση κρυπτογραφημένου κώδικα, στο *Ένα χειρόγραφο στην Αποκρυπτογράφηση Κρυπτογραφημένων Μηνυμάτων (A Manuscript on Deciphering Cryptographic Messages)*. Εκεί έδωσε την πρώτη περιγραφή της κρυπτανάλυσης με ανάλυση συχνότητας, τον παλαιότερο αλγόριθμο διάσπασης κώδικα.

Το 1843 θεωρείται ως η χρονολογία δημιουργίας του πρώτου προγράμματος υπολογιστή, όταν η μαθηματικός Άντα Λάβλεϊς δημοσίευσε έναν αλγόριθμο για τον υπολογισμό μιας ακολουθίας αριθμών Bernoulli, που προοριζόταν να εκτελεστεί από την Αναλυτική Μηχανή του Τσαρλς Μπάμπατζ.

Τα δεδομένα και οι οδηγίες αποθηκεύονταν κάποτε σε εξωτερικές διάτρητες κάρτες, οι οποίες διατηρούνταν σε τάξη και ταξινομούνταν σε πρόγραμμα τραπουλών.
Στη δεκαετία του 1880, ο Χέρμαν Χόλεριθ επινόησε την έννοια της αποθήκευσης *δεδομένων* σε μορφή αναγνώσιμη από μηχανές. Αργότερα, ένας πίνακας ελέγχου (πίνακας βύσματος) που προστέθηκε στον πίνακά του, τύπου 1906, του επέτρεψε τον προγραμματισμό του πίνακα για διαφορετικές εργασίες, και στα τέλη της δεκαετίας του 1940, ο εξοπλισμός εγγραφής μονάδων όπως το IBM 602 και το IBM 604 προγραμματίστηκαν από πίνακες ελέγχου με τρόπο παρόμοιο, όπως ήταν και οι πρώτοι ηλεκτρονικοί υπολογιστές. Ωστόσο, με την έννοια του υπολογιστή αποθηκευμένου προγράμματος που εισήχθη το 1949, τόσο τα προγράμματα όσο και τα δεδομένα αποθηκεύονταν και χειρίζονταν με τον ίδιο τρόπο στη μνήμη του υπολογιστή.

### Γλώσσα μηχανής (Machine Language)

Ο κώδικας μηχανής ήταν η γλώσσα των αρχικών προγραμμάτων, γραμμένος στο σύνολο εντολών της συγκεκριμένης μηχανής, συχνά σε δυαδικό συμβολισμό. Σύντομα αναπτύχθηκαν γλώσσες συναρμολόγησης (assembly language) που επέτρεπαν στον προγραμματιστή να καθορίσει οδηγίες σε μορφή κειμένου (π.χ. ADD X, TOTAL), με συντομογραφίες για κάθε κωδικό λειτουργίας και ουσιαστικά ονόματα για τον καθορισμό διευθύνσεων. Ωστόσο, επειδή μια γλώσσα συναρμολόγησης είναι κάτι περισσότερο από μια διαφορετικό συμβολισμό για μια γλώσσα μηχανής, δύο μηχανές με διαφορετικά σύνολα εντολών έχουν επίσης διαφορετικές γλώσσες συναρμολόγησης.

Ενσύρματος πίνακας ελέγχου για μια Λογιστική Μηχανή IBM 402 .
### Γλώσσες μεταγλωττιστή (Compiler languages)

Οι γλώσσες υψηλού επιπέδου έκαναν τη διαδικασία ανάπτυξης ενός προγράμματος απλούστερη, πιο κατανοητή και λιγότερο συνδεδεμένη με το υποκείμενο υλικό (hardware). Το πρώτο εργαλείο, σχετιζόμενο με τον μεταγλωττιστή, το σύστημα A-0, αναπτύχθηκε το 1952 από την Γκρέις Χόπερ, η οποία επίσης επινόησε τον όρο «μεταγλωττιστής». Η FORTRAN, η πρώτη ευρέως χρησιμοποιούμενη γλώσσα υψηλού επιπέδου που είχε λειτουργική εφαρμογή, κυκλοφόρησε το 1957, και πολλές άλλες γλώσσες ακολούθησαν - ιδιαίτερα, η COBOL που στόχευε στην εμπορική επεξεργασία δεδομένων και η Lisp για υπολογιστική έρευνα.

Αυτές οι μεταγλωττισμένες γλώσσες επιτρέπουν στον προγραμματιστή να γράφει προγράμματα με όρους που είναι συντακτικά πλουσιότεροι και πιο ικανοί να γενικεύουν τον κώδικα, καθιστώντας εύκολη τη εύρεση διαφορών συνόλων εντολών μηχανής μέσω δηλώσεων μεταγλώττισης και ευρετικών μηχανισμών. Οι μεταγλωττιστές εκμεταλλεύτηκαν τη δύναμη των υπολογιστών να κάνουν τον προγραμματισμό ευκολότερο επιτρέποντας στους προγραμματιστές να καθορίζουν υπολογισμούς εισάγοντας έναν τύπο χρησιμοποιώντας συμβολισμό ενθέματος (infix notation).

### Καταχώρηση πηγαίου κώδικα

Τα προγράμματα καταχωρούνταν κυρίως χρησιμοποιώντας διάτρητες κάρτες ή χαρτοταινία. Στα τέλη της δεκαετίας του 1960, οι συσκευές αποθήκευσης δεδομένων και τα τερματικά υπολογιστών έγιναν αρκετά φθηνά, ώστε να επιτρέψουν στα προγράμματα να δημιουργούνται πληκτρολογώντας απευθείας στους υπολογιστές. Προγράμματα επεξεργασίας κειμένου (text editor) αναπτύχθηκαν επίσης, τα οποία επέτρεπαν πιο εύκολες αλλαγές και διορθώσεις, σε σχέση με τις διάτρητες κάρτες.

## Σύγχρονος προγραμματισμός

### Απαιτήσεις ποιότητας

Ανεξάρτητα της προσέγγισης στην ανάπτυξη, το τελικό πρόγραμμα πρέπει να ικανοποιεί ορισμένες θεμελιώδεις ιδιότητες. Οι ακόλουθες ιδιότητες είναι από τις πιο σημαντικές:

* Αξιοπιστία: πόσο συχνά τα αποτελέσματα ενός προγράμματος είναι σωστά. Αυτό εξαρτάται από την εννοιολογική ορθότητα των αλγορίθμων και την ελαχιστοποίηση των σφαλμάτων προγραμματισμού, όπως λάθη στη διαχείριση πόρων (π.χ. Υπερχείλιση προσωρινής μνήμης και συνθήκες αγώνα (race condition)) και λογικά σφάλματα (όπως η διαίρεση με μηδέν).
* Ισχυρότητα: πόσο καλά ένα πρόγραμμα προβλέπει προβλήματα που οφείλονται σε γενικά προγραμματιστικά σφάλματα / errors (και όχι σε σφάλματα που παρεκκλίνουν από το αποδεκτό αποτέλεσμα / bugs ). Αυτό περιλαμβάνει καταστάσεις όπως εσφαλμένα, ακατάλληλα ή κατεστραμμένα δεδομένα, μη διαθεσιμότητα των απαραίτητων πόρων όπως μνήμη, υπηρεσίες λειτουργικού συστήματος και συνδέσεις δικτύου, σφάλμα χρήστη και απρόοπτες διακοπές ρεύματος.
* Ευχρηστία: η εργονομία ενός προγράμματος: η ευκολία με την οποία ένα άτομο μπορεί να χρησιμοποιήσει το πρόγραμμα για τον συγκεκριμένο σκοπό που δημιουργήθηκε ή, σε ορισμένες περιπτώσεις, ακόμη και για απρόβλεπτους σκοπούς. H επιτυχία ενός προγράμματος εξαρτάται ιδιαίτερα από αυτά τα ζήτηματα, ανεξάρτητα ακόμα και από άλλα θέματα. Αυτό περιλαμβάνει ένα ευρύ φάσμα κειμενικών, γραφιστικών και μερικές φορές υλικών στοιχείων που βελτιώνουν τη σαφήνεια, τη εύκολη κατανόηση , τη συνοχή και την πληρότητα της διεπαφής χρήστη (user interface) ενός προγράμματος.
* Φορητότητα: το εύρος του υλικού υπολογιστών και των πλατφορμών του λειτουργικού συστήματος πάνω στις οποίες μπορεί να μεταγλωττιστεί / ερμηνευτεί και να εκτελεστεί ο πηγαίος κώδικας ενός προγράμματος. Εξαρτάται από τις διαφορές στις εγκαταστάσεις προγραμματισμού που παρέχονται από τις διάφορες πλατφόρμες, συμπεριλαμβανομένου του υλικού και των πόρων του λειτουργικού συστήματος, την αναμενόμενη συμπεριφορά του υλικού και του λειτουργικού συστήματος και τη διαθεσιμότητα μεταγλωττιστών της συγκεκριμένης πλατφόρμας (και μερικές φορές βιβλιοθηκών) για τη γλώσσα του πηγαίου κώδικα.
* Συντηρησιμότητα: η ευκολία με την οποία ένα πρόγραμμα μπορεί να τροποποιηθεί από τους σημερινούς ή μελλοντικούς προγραμματιστές του προκειμένου να γίνουν βελτιώσεις ώστε να εξατομικευτεί, να διορθωθούν σφάλματα και τρύπες ασφαλείας ή ώστε να προσαρμοστεί σε νέα περιβάλλοντα. Καλές πρακτικές κατά την διάρκεια της αρχικής ανάπτυξης κάνουν μεγάλη διαφορά σε αυτό το κομμάτι. Αυτή η ποιότητα μπορεί να μην είναι άμεσα εμφανής στον τελικό χρήστη, αλλά μπορεί να επηρεάσει σημαντικά ένα πρόγραμμα μακροπρόθεσμα.
* Αποδοτικότητα / απόδοση: Μέτρηση των πόρων συστήματος που καταναλώνει ένα πρόγραμμα (χρόνος επεξεργαστή, χώρος μνήμης, αργές συσκευές όπως δίσκοι, εύρος ζώνης δικτύου και σε κάποιο βαθμό ακόμη και την αλληλεπίδραση με τον χρήστη): όσο λιγότερο, τόσο το καλύτερο. Αυτό περιλαμβάνει επίσης προσεκτική διαχείριση των πόρων, όπως για παράδειγμα στον καθαρισμό προσωρινών αρχείων και στην εξάλειψη διαρροών μνήμης. Ακόμα και η γλώσσα προγραμματισμού επηρεάζει την απόδοση, ωστόσο ανάλογα με την χρήση τους, ακόμη και πιο αργές γλώσσες, όπως η Python, μπορούν να εκτελέσουν προγράμματα άμεσα από ανθρώπινη προοπτική. Η ταχύτητα, η χρήση πόρων και η απόδοση είναι σημαντικά για προγράμματα που "κολλάνε" (bottleneck) το σύστημα, αλλά η αποτελεσματική χρήση του χρόνου του προγραμματιστή είναι επίσης σημαντική και σχετίζεται με το κόστος: περισσότερο υλικό μπορεί να είναι φθηνότερο.

### Αναγνωσιμότητα του πηγαίου κώδικα

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

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

Το να ακολουθείτε ένα σταθερό στυλ προγραμματισμού συχνά βοηθά στην αναγνωσιμότητα. Ωστόσο, η αναγνωσιμότητα δεν είναι μόνο ένα απλό στυλ προγραμματισμού. Πολλοί παράγοντες συμβάλλουν στην αναγνωσιμότητα, που μπορεί να έχουν ελάχιστη ή και καθόλου σχέση με την ικανότητα του υπολογιστή να μεταγλωττίζει και να εκτελεί αποτελεσματικά τον κώδικα. Μερικοί από αυτούς τους παράγοντες περιλαμβάνουν:

* Διαφορετικά στυλ εσοχής (κενός χώρος)
* Σχόλια
* Αποσύνθεση
* Συμβάσεις ονομασίας για αντικείμενα (όπως μεταβλητές, κλάσεις, συναρτήσεις, διαδικασίες κ.λ.π. )

Το πως εμφανίζονται αυτά στον κώδικα (όπως εσοχές, αλλαγές γραμμής, επισήμανση χρώματος κ.λπ.) αντιμετωπίζονται συχνά από τον επεξεργαστή πηγαίου κώδικα, αλλά οι πτυχές περιεχομένου αντικατοπτρίζουν το ταλέντο και τις δεξιότητες του προγραμματιστή.

Διάφορες οπτικές γλώσσες προγραμματισμού έχουν επίσης αναπτυχθεί με σκοπό την επίλυση προβλημάτων αναγνωσιμότητας, υιοθετώντας μη παραδοσιακές προσεγγίσεις στη δομή και την εμφάνιση του κώδικα. Τα ολοκληρωμένα περιβάλλοντα ανάπτυξης (IDE) στοχεύουν στην ενσωμάτωση όλης αυτής της βοήθειας. Τεχνικές όπως η ανακατασκευή κώδικα μπορούν να βελτιώσουν την αναγνωσιμότητα.

### Αλγοριθμική πολυπλοκότητα

Το ακαδημαϊκό πεδίο και η πρακτική της μηχανικής του προγραμματισμού υπολογιστών ασχολούνται σε μεγάλο βαθμό με την ανακάλυψη και την εφαρμογή των πιο αποτελεσματικών αλγορίθμων για μια συγκεκριμένη κατηγορία προβλημάτων. Για το σκοπό αυτό, οι αλγόριθμοι ταξινομούνται σε *παραγγελίες* χρησιμοποιώντας τον λεγόμενo συμβολισμό Big O, ο οποίος εκφράζει τη χρήση πόρων, όπως ο χρόνος εκτέλεσης ή η κατανάλωση μνήμης, ως προς το μέγεθος μιας εισόδου. Οι έμπειροι προγραμματιστές είναι εξοικειωμένοι με μια ποικιλία καθιερωμένων αλγορίθμων και τις αντίστοιχες πολυπλοκότητές τους και χρησιμοποιούν αυτή τη γνώση για να επιλέξουν αλγόριθμους που ταιριάζουν καλύτερα ανάλογα τις περιστάσεις.

#### Αλγόριθμοι σκακιού ως παράδειγμα

Ο "Προγραμματισμός ενός υπολογιστή για να παίζει σκάκι" ήταν μια εργασία του 1950 που αξιολογούσε έναν αλγόριθμο "minimax" (ελάχιστο-μέγιστο) που αποτελεί μέρος της ιστορίας της αλγοριθμικής πολυπλοκότητας, ένα μάθημα για το Deep Blue της IBM (υπολογιστής σκακιού) είναι μέρος του προγράμματος σπουδών της επιστήμης των υπολογιστών στο Πανεπιστήμιο του Στάνφορντ

### Μεθοδολογίες

Το πρώτο βήμα στις περισσότερες τυπικές διαδικασίες ανάπτυξης λογισμικού είναι η ανάλυση απαιτήσεων, ακολουθούμενη από δοκιμές για τον προσδιορισμό της μοντελοποίησης αξίας, την υλοποίηση και την εξάλειψη αποτυχίας (debugging). Υπάρχουν πολλές διαφορετικές προσεγγίσεις για καθεμία από αυτές τις εργασίες. Μια δημοφιλής προσέγγιση για την ανάλυση απαιτήσεων είναι η ανάλυση περιπτώσεων χρήσης (Use Case). Πολλοί προγραμματιστές χρησιμοποιούν μορφές ανάπτυξης λογισμικού Agile, όπου τα διάφορα στάδια της τυπικής ανάπτυξης λογισμικού είναι ενσωματωμένα σε σύντομους κύκλους που διαρκούν μερικές εβδομάδες αντί για χρόνια. Υπάρχουν πολλές προσεγγίσεις στη διαδικασία ανάπτυξης λογισμικού.

Οι δημοφιλείς τεχνικές μοντελοποίησης περιλαμβάνουν την Αντικειμενοστραφή Ανάλυση και Σχεδίαση (OOAD) και την Αρχιτεκτονική βάσει Μοντέλων (MDA). Η Ενοποιημένη Γλώσσα Μοντελοποίησης (UML) είναι ένας συμβολισμός που χρησιμοποιείται τόσο για το OOAD όσο και για το MDA.

Μια παρόμοια τεχνική που χρησιμοποιείται για το σχεδιασμό βάσεων δεδομένων είναι η Μοντελοποίηση Σχέσεων οντοτήτων (ER Modeling).

Οι τεχνικές υλοποίησης περιλαμβάνουν επιτακτικές γλώσσες (αντικειμενοστρεφείς ή διαδικαστικές), λειτουργικές γλώσσες και λογικές γλώσσες.

### Μέτρηση της χρήσης γλώσσας

Είναι πολύ δύσκολο να προσδιορίσουμε ποιες είναι οι πιο δημοφιλείς σύγχρονες γλώσσες προγραμματισμού. Οι μέθοδοι μέτρησης της δημοτικότητας μιας γλώσσας προγραμματισμού περιλαμβάνουν: την καταμέτρηση του αριθμού των αγγελιών θέσεων εργασίας που αναφέρουν τη συγκεκριμένη γλώσσα, τον αριθμό των βιβλίων που πωλήθηκαν και τα μαθήματα που διδάσκουν τη γλώσσα (αυτό υπερεκτιμά τη σημασία των νεότερων γλωσσών) και εκτιμήσεις του αριθμού των υπάρχουσων γραμμών κώδικα γραμμένων στη γλώσσα (αυτό υποτιμά τον αριθμό των χρηστών στις επαγγελματικές γλώσσες όπως η COBOL).

Ορισμένες γλώσσες είναι πολύ δημοφιλείς για συγκεκριμένα είδη εφαρμογών, ενώ ορισμένες γλώσσες χρησιμοποιούνται συχνά για τη σύνταξη πολλών διαφορετικών ειδών εφαρμογών. Για παράδειγμα, η COBOL εξακολουθεί να είναι ισχυρή σε εταιρικά κέντρα δεδομένων συχνά σε μεγάλους κεντρικoύς (mainframe) υπολογιστές, η Fortran σε εφαρμογές μηχανικής, γλώσσες δέσμης ενεργειών (scripting languages) στην ανάπτυξη Ιστού και η C σε ενσωματωμένο λογισμικό (embedded software) . Πολλές εφαρμογές χρησιμοποιούν έναν συνδυασμό πολλών γλωσσών στην κατασκευή και τη χρήση τους. Οι νέες γλώσσες σχεδιάζονται γενικά γύρω από τη σύνταξη μιας προηγούμενης γλώσσας με επιπρόσθετη νέα λειτουργικότητα, (για παράδειγμα η C++ προσθέτει αντικειμενοστραφή λειτουργία στην C και η Java προσθέτει διαχείριση μνήμης και bytecode στη C++, αλλά ως αποτέλεσμα χάνει την αποδοτικότητα και την ικανότητα χειραγώγησης σε χαμηλό επίπεδο).

### Εντοπισμός σφαλμάτων

Το πρώτο γνωστό πραγματικό σφάλμα που προκάλεσε πρόβλημα σε έναν υπολογιστή ήταν ένας σκόρος, o οποίος παγιδεύτηκε μέσα σε έναν κεντρικό υπολογιστή του Χάρβαρντ, και καταγράφηκε σε μια καταχώρηση στο ημερολόγιο με ημερομηνία 9 Σεπτεμβρίου 1947. Το "Bug" ήταν ήδη ένας κοινός όρος για περιγραφη ενος ελάττωματος λογισμικού όταν εντοπίστηκε αυτό το σφάλμα.
Ο εντοπισμός σφαλμάτων (debugging) είναι μια πολύ σημαντική εργασία στη διαδικασία ανάπτυξης λογισμικού, καθώς η ύπαρξη ελαττωμάτων σε ένα πρόγραμμα μπορεί να έχουν σημαντικές συνέπειες για τους χρήστες του. Ορισμένες γλώσσες είναι πιο επιρρεπείς σε ορισμένα είδη σφαλμάτων, επειδή οι προδιαγραφές τους δεν απαιτούν τόσους ελέγχους από τους μεταγλωττιστές όσο άλλες γλώσσες. Η χρήση ενός εργαλείου ανάλυσης στατικού κώδικα μπορεί να βοηθήσει στον εντοπισμό ορισμένων πιθανών προβλημάτων. Κανονικά, το πρώτο βήμα για τον εντοπισμό σφαλμάτων είναι η προσπάθεια αναπαραγωγής του προβλήματος. Αυτό μπορεί όμως να μην είναι μια απλή εργασία, για παράδειγμα, με παράλληλες διεργασίες ή ορισμένα ασυνήθιστα σφάλματα λογισμικού. Επίσης, συγκεκριμένα περιβάλλοντα χρηστών και ιστορικά χρήσεων μπορεί να δυσχεράνουν την αναπαραγωγή του προβλήματος.

Μετά την αναπαραγωγή του σφάλματος, η εισαγωγή του προγράμματος μπορεί να χρειαστεί να απλοποιηθεί για να διευκολυνθεί ο εντοπισμός σφαλμάτων. Για παράδειγμα, όταν ένα σφάλμα σε έναν μεταγλωττιστή προκαλεί διακοπή κατά την ανάλυση κάποιου μεγάλου αρχείου προέλευσης, μια απλοποίηση της δοκιμαστικής περίπτωσης που έχει λίγες μόνο γραμμές σε σχέση με το αρχικό αρχείο προέλευσης μπορεί να είναι αρκετή για την αναπαραγωγή του ίδιου σφάλματος. Απαιτείται διαδικασία δοκιμής και σφάλματος και διαδικασία διαίρει και βασίλευε: ο προγραμματιστής θα προσπαθήσει να αφαιρέσει ορισμένα μέρη της αρχικής περίπτωσης δοκιμής και να ελέγξει αν το πρόβλημα εξακολουθεί να υπάρχει. Κατά τον εντοπισμό σφαλμάτων του προβλήματος σε μία γραφική διεπαφή χρήστη (GUI), ο προγραμματιστής μπορεί να προσπαθήσει να παραλείψει κάποια αλληλεπίδραση χρήστη από την αρχική περιγραφή του προβλήματος και να ελέγξει εάν οι υπόλοιπες ενέργειες επαρκούν για την εμφάνιση σφαλμάτων. Οι ενέργειες δεσμης (scripting) και η εύρεση σημείων καμπής (breakpointing) είναι επίσης μέρος αυτής της διαδικασίας.

Ο εντοπισμός σφαλμάτων γίνεται συχνά με ολοκληρωμένα περιβάλλοντα ανάπτυξης (IDE) . Χρησιμοποιούνται επίσης αυτόνομα προγράμματα εντοπισμού σφαλμάτων, όπως ο αποσφαλματωτής GNU (GDB), τα οποία συχνά παρέχουν λιγότερο οπτικό περιβάλλον, όπως γραμμή εντολών . Ορισμένοι επεξεργαστές κειμένου όπως το Emacs επιτρέπουν την επίκληση του GDB μέσω αυτών, για να παρέχουν ένα οπτικό περιβάλλον.

## Γλώσσες προγραμματισμού

Διαφορετικές γλώσσες προγραμματισμού υποστηρίζουν διαφορετικά στυλ προγραμματισμού (που ονομάζονται *παραδείγματα προγραμματισμού* ). Η επιλογή της γλώσσας που χρησιμοποιείται υπόκειται υπό μελέτη σε τομείς όπως η πολιτική της εταιρείας, η καταλληλότητα για εργασία, η διαθεσιμότητα πακέτων τρίτων ή η ατομική προτίμηση. Για παράδειγμα, μερικές γλώσσες προγραμματισμού είναι το **scratch**, η **python**, η **java** κτλ. Ιδανικά, θα επιλεγεί η γλώσσα προγραμματισμού που ταιριάζει καλύτερα στην εργασία. Τα συμβιβασμός από αυτό το ιδανικό περιλαμβάνουν την εύρεση αρκετών προγραμματιστών που γνωρίζουν τη γλώσσα για να δημιουργήσουν μια ομάδα, τη διαθεσιμότητα μεταγλωττιστών για αυτήν τη γλώσσα και την αποτελεσματικότητα με την οποία εκτελούνται τα προγράμματα γραμμένα σε μια δεδομένη γλώσσα. Οι γλώσσες σχηματίζουν ένα κατά προσέγγιση φάσμα από "χαμηλό επίπεδο" έως "υψηλό επίπεδου". Οι γλώσσες "χαμηλού επιπέδου" είναι συνήθως πιο προσανατολισμένες στη μηχανή και πιο γρήγορες στην εκτέλεση, ενώ οι γλώσσες "υψηλού επιπέδου" είναι πιο αφηρημένες και πιο εύχρηστες, αλλά εκτελούνται λιγότερο γρήγορα. Συνήθως είναι πιο εύκολο να κωδικοποιήσετε σε γλώσσες "υψηλού επιπέδου" παρά σε "χαμηλού επιπέδου".

Ο Άλεν Ντάουνι, στο βιβλίο του Πως Να Σκέφτεσαι Σαν Επιστήμονας Υπολογιστών, γράφει:

Οι λεπτομέρειες φαίνονται διαφορετικές σε διαφορετικές γλώσσες, αλλά μερικές βασικές οδηγίες εμφανίζονται σε κάθε σχεδόν γλώσσα:
* Εισαγωγή: Συλλέξτε δεδομένα από το πληκτρολόγιο, ένα αρχείο ή κάποια άλλη συσκευή.
* Έξοδος: Εμφάνιση δεδομένων στην οθόνη ή αποστολή δεδομένων σε αρχείο ή άλλη συσκευή.
* Αριθμητική: Εκτελέστε βασικές αριθμητικές πράξεις όπως πρόσθεση και πολλαπλασιασμός.
* Εκτέλεση υπό όρους: Ελέγξτε για ορισμένες συνθήκες και εκτελέστε την κατάλληλη ακολουθία εντολών.
* Επανάληψη: Εκτελέστε κάποια ενέργεια επανειλημμένα, συνήθως με κάποια παραλλαγή.

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

## Δείτε επίσης

* ACCU
* Ένωση Υπολογιστικών Μηχανημάτων
* Δικτύωση υπολογιστών
* Πρόγραμμα Hello world
* Ίδρυμα Αναλυτών και Προγραμματιστών
* Εθνική Εβδομάδα Κωδικοποίησης
* Ιεραρχία αντικειμένων
* Προγραμματισμός συστήματος
* Προγραμματισμός ηλεκτρονικών υπολογιστών στην εποχή των διάτρητων καρτών
* *Η Τέχνη του Προγραμματισμού Υπολογιστών*
* Οι γυναίκες στην πληροφορική
* Χρονοδιάγραμμα των γυναικών στην πληροφορική

## Παραπομπές

## Πηγές

* Ceruzzi, Paul E. (1998). *History of Computing*. Cambridge, Massachusetts: MIT Press. ISBN 9780262032551 – μέσω EBSCOhost.
* Evans, Claire L. (2018). *Broad Band: The Untold Story of the Women Who Made the Internet*. New York: Portfolio/Penguin. ISBN 9780735211759.
* Gürer, Denise (1995). «Pioneering Women in Computer Science». *Communications of the ACM* **38** (1): 45–54. doi:10.1145/204865.204875.
* Smith, Erika E. (2013). «Recognizing a Collective Inheritance through the History of Women in Computing». *CLCWeb: Comparative Literature & Culture: A WWWeb Journal* **15** (1): 1–9.

## Εξωτερικοί σύνδεσμοι

* Πολυμέσα σχετικά με το θέμα  Προγραμματισμός στο Wikimedia Commons
* Λεξιλογικός ορισμός του προγραμματισμός  στο Βικιλεξικό