From Wikipedia, the free encyclopedia
Προγραμματισμός υπολογιστών είναι η διαδικασία εκτέλεσης ενός συγκεκριμένου υπολογισμού (ή γενικότερα, η επίτευξη ενός συγκεκριμένου υπολογιστικού αποτελέσματος), συνήθως με το σχεδιασμό/κατασκευή ενός εκτελέσιμου προγράμματος υπολογιστή . Ο προγραμματισμός περιλαμβάνει εργασίες όπως ανάλυση, δημιουργία αλγορίθμων, δημιουργία προφίλ για την ακρίβεια και κατανάλωση πόρων των αλγορίθμων και την υλοποίηση αλγορίθμων (συνήθως σε μια επιλεγμένη γλώσσα προγραμματισμού, κοινώς λεγόμενη ως κωδικοποίηση ).[1][2] Ο πηγαίος κώδικας ενός προγράμματος είναι γραμμένος σε μία ή περισσότερες γλώσσες που είναι κατανοητές από τους προγραμματιστές, και όχι σε κώδικα μηχανής, ο οποίος εκτελείται απευθείας από την κεντρική μονάδα επεξεργασίας . Ο σκοπός του προγραμματισμού είναι να βρει μια ακολουθία εντολών που θα αυτοματοποιήσει την εκτέλεση μιας εργασίας (η οποία μπορεί να είναι τόσο περίπλοκη όσο ένα λειτουργικό σύστημα ) σε έναν υπολογιστή, συχνά με σκοπό την επίλυση ενός δεδομένου προβλήματος. Επομένως, ο ικανός προγραμματισμός απαιτεί συνήθως εξειδίκευση σε πολλά διαφορετικά θέματα, συμπεριλαμβανομένου της γνώσης στον τομέα εφαρμογής, εξειδικευμένων αλγορίθμων και τυπικής λογικής .
Οι εργασίες που συνοδεύουν και σχετίζονται με τον προγραμματισμό περιλαμβάνουν ελέγχους,εντοπισμό σφαλμάτων, τη συντήρηση του πηγαίου κώδικα, την υλοποίηση συστημάτων κατασκευής και τη διαχείριση παραγόμενων τεχνουργημάτων, όπως ο κώδικας μηχανής προγραμμάτων υπολογιστών. Αυτά συνήθως θεωρούνται τμήμα της διαδικασίας προγραμματισμού, αλλά συχνά ο όρος ανάπτυξη λογισμικού χρησιμοποιείται για αυτή τη μεγαλύτερη διαδικασία, ενώ οι όροι προγραμματισμός, υλοποίηση ή κωδικοποίηση να προορίζονται για την πραγματική εγγραφή κώδικα. Η μηχανική λογισμικού συνδυάζει τεχνικές μηχανικής με πρακτικές ανάπτυξης λογισμικού . Η αντίστροφη μηχανική είναι μια σχετική διαδικασία που χρησιμοποιείται για την κατανόηση και την εκ νέου δημιουργία/εφαρμογή από σχεδιαστές, αναλυτές και προγραμματιστές.[3]
Οι προγραμματιζόμενες συσκευές υπάρχουν εδώ και αιώνες. Ήδη από τον 9ο αιώνα, ένα προγραμματιζόμενο πρόγραμμα ακολουθίας μουσικής εφευρέθηκε από τους Πέρσες αδερφούς Banu Musa, οι οποίοι περιέγραψαν ένα αυτοματοποιημένο μηχανικό φλάουτο στο Βιβλίο Έξυπνων Μηχανών (Book of Ingenious Devices) .[4][5] Το 1206, ο Άραβας μηχανικός Αλ-Τζαζάρι εφηύρε μια προγραμματιζόμενη μηχανή τυμπάνων στο οποίο ένα μουσικό μηχανικό αυτόματο ήταν φτιάγμενο να παίζει διάφορους ρυθμούς και μοτίβα τυμπάνων, μέσω καρφιών και εκκεντροφόρων .[6][7] Το 1801, ο αργαλειός Ζακάρ μπορούσε να παράγει εντελώς διαφορετικές πλέξεις αλλάζοντας το "πρόγραμμα" - μια σειρά από χαρτόνια με διάτρητες τρύπες.
Οι αλγόριθμοι παραβίασης κώδικα υπάρχουν επίσης εδώ και αιώνες. Τον 9ο αιώνα, ο Άραβας μαθηματικός Αλ-Κίντι περιέγραψε έναν κρυπτογραφικό αλγόριθμο για την αποκρυπτογράφηση κρυπτογραφημένου κώδικα, στο Ένα χειρόγραφο στην Αποκρυπτογράφηση Κρυπτογραφημένων Μηνυμάτων (A Manuscript on Deciphering Cryptographic Messages) . Εκεί έδωσε την πρώτη περιγραφή της κρυπτανάλυσης με ανάλυση συχνότητας, τον παλαιότερο αλγόριθμο διάσπασης κώδικα.[8]
Το 1843 θεωρείται ως η χρονολογία δημιουργίας του πρώτου προγράμματος υπολογιστή, όταν η μαθηματικός Άντα Λάβλεϊς δημοσίευσε έναν αλγόριθμο για τον υπολογισμό μιας ακολουθίας αριθμών Bernoulli, που προοριζόταν να εκτελεστεί από την Αναλυτική Μηχανή του Τσαρλς Μπάμπατζ .[9]
Στη δεκαετία του 1880, ο Χέρμαν Χόλεριθ επινόησε την έννοια της αποθήκευσης δεδομένων σε μορφή αναγνώσιμη από μηχανές.[10] Αργότερα, ένας πίνακας ελέγχου (πίνακας βύσματος) που προστέθηκε στον πίνακά του, τύπου 1906, του επέτρεψε τον προγραμματισμό του πίνακα για διαφορετικές εργασίες, και στα τέλη της δεκαετίας του 1940, ο εξοπλισμός εγγραφής μονάδων όπως το IBM 602 και το IBM 604 προγραμματίστηκαν από πίνακες ελέγχου με τρόπο παρόμοιο, όπως ήταν και οι πρώτοι ηλεκτρονικοί υπολογιστές . Ωστόσο, με την έννοια του υπολογιστή αποθηκευμένου προγράμματος που εισήχθη το 1949, τόσο τα προγράμματα όσο και τα δεδομένα αποθηκεύονταν και χειρίζονταν με τον ίδιο τρόπο στη μνήμη του υπολογιστή .[11]
Ο κώδικας μηχανής ήταν η γλώσσα των αρχικών προγραμμάτων, γραμμένος στο σύνολο εντολών της συγκεκριμένης μηχανής, συχνά σε δυαδικό συμβολισμό. Σύντομα αναπτύχθηκαν γλώσσες συναρμολόγησης (assembly language) που επέτρεπαν στον προγραμματιστή να καθορίσει οδηγίες σε μορφή κειμένου (π.χ. ADD X, TOTAL), με συντομογραφίες για κάθε κωδικό λειτουργίας και ουσιαστικά ονόματα για τον καθορισμό διευθύνσεων. Ωστόσο, επειδή μια γλώσσα συναρμολόγησης είναι κάτι περισσότερο από μια διαφορετικό συμβολισμό για μια γλώσσα μηχανής, δύο μηχανές με διαφορετικά σύνολα εντολών έχουν επίσης διαφορετικές γλώσσες συναρμολόγησης.
Οι γλώσσες υψηλού επιπέδου έκαναν τη διαδικασία ανάπτυξης ενός προγράμματος απλούστερη, πιο κατανοητή και λιγότερο συνδεδεμένη με το υποκείμενο υλικό (hardware). Το πρώτο εργαλείο, σχετιζόμενο με τον μεταγλωττιστή, το σύστημα A-0, αναπτύχθηκε το 1952 [12] από την Γκρέις Χόπερ, η οποία επίσης επινόησε τον όρο «μεταγλωττιστής».[13] Η FORTRAN, η πρώτη ευρέως χρησιμοποιούμενη γλώσσα υψηλού επιπέδου που είχε λειτουργική εφαρμογή, κυκλοφόρησε το 1957,[14] και πολλές άλλες γλώσσες ακολούθησαν - ιδιαίτερα, η COBOL που στόχευε στην εμπορική επεξεργασία δεδομένων και η Lisp για υπολογιστική έρευνα.
Αυτές οι μεταγλωττισμένες γλώσσες επιτρέπουν στον προγραμματιστή να γράφει προγράμματα με όρους που είναι συντακτικά πλουσιότεροι και πιο ικανοί να γενικεύουν τον κώδικα, καθιστώντας εύκολη τη εύρεση διαφορών συνόλων εντολών μηχανής μέσω δηλώσεων μεταγλώττισης και ευρετικών μηχανισμών. Οι μεταγλωττιστές εκμεταλλεύτηκαν τη δύναμη των υπολογιστών να κάνουν τον προγραμματισμό ευκολότερο [14] επιτρέποντας στους προγραμματιστές να καθορίζουν υπολογισμούς εισάγοντας έναν τύπο χρησιμοποιώντας συμβολισμό ενθέματος (infix notation) .
Τα προγράμματα καταχωρούνταν κυρίως χρησιμοποιώντας διάτρητες κάρτες ή χαρτοταινία . Στα τέλη της δεκαετίας του 1960, οι συσκευές αποθήκευσης δεδομένων και τα τερματικά υπολογιστών έγιναν αρκετά φθηνά, ώστε να επιτρέψουν στα προγράμματα να δημιουργούνται πληκτρολογώντας απευθείας στους υπολογιστές. Προγράμματα επεξεργασίας κειμένου (text editor) αναπτύχθηκαν επίσης, τα οποία επέτρεπαν πιο εύκολες αλλαγές και διορθώσεις, σε σχέση με τις διάτρητες κάρτες.
Ανεξάρτητα της προσέγγισης στην ανάπτυξη, το τελικό πρόγραμμα πρέπει να ικανοποιεί ορισμένες θεμελιώδεις ιδιότητες. Οι ακόλουθες ιδιότητες είναι από τις πιο σημαντικές:[15]
Στον προγραμματισμό υπολογιστών, ως αναγνωσιμότητα θεωρούμε την ευκολία με την οποία ένας ανθρώπινος αναγνώστης μπορεί να κατανοήσει τον σκοπό, τον έλεγχο της ροής και τη λειτουργία του πηγαίου κώδικα. Επηρεάζει τις πτυχές της ποιότητας που είδαμε από πάνω, συμπεριλαμβανομένης της φορητότητας, της χρηστικότητας και κυρίως της συντηρησιμότητας.
Η αναγνωσιμότητα είναι σημαντική επειδή οι προγραμματιστές ξοδεύουν το μεγαλύτερο μέρος του χρόνου τους διαβάζοντας και προσπαθώντας να κατανοήσουν και να τροποποιήσουν τον υπάρχοντα πηγαίο κώδικα, αντί να γράφουν νέο πηγαίο κώδικα. Ο μη αναγνώσιμος κώδικας οδηγεί συχνά σε σφάλματα, αναποτελεσματικότητα και διπλότυπο κώδικα . Μια μελέτη διαπίστωσε ότι μερικοί απλοί μετασχηματισμοί αναγνωσιμότητας έκαναν τον κώδικα πιο σύντομο και μείωσαν δραστικά τον χρόνο κατανόησής του.[17]
Το να ακολουθείτε ένα σταθερό στυλ προγραμματισμού συχνά βοηθά στην αναγνωσιμότητα. Ωστόσο, η αναγνωσιμότητα δεν είναι μόνο ένα απλό στυλ προγραμματισμού. Πολλοί παράγοντες συμβάλλουν στην αναγνωσιμότητα, που μπορεί να έχουν ελάχιστη ή και καθόλου σχέση με την ικανότητα του υπολογιστή να μεταγλωττίζει και να εκτελεί αποτελεσματικά τον κώδικα.[18] Μερικοί από αυτούς τους παράγοντες περιλαμβάνουν:
Το πως εμφανίζονται αυτά στον κώδικα (όπως εσοχές, αλλαγές γραμμής, επισήμανση χρώματος κ.λπ.) αντιμετωπίζονται συχνά από τον επεξεργαστή πηγαίου κώδικα, αλλά οι πτυχές περιεχομένου αντικατοπτρίζουν το ταλέντο και τις δεξιότητες του προγραμματιστή.
Διάφορες οπτικές γλώσσες προγραμματισμού έχουν επίσης αναπτυχθεί με σκοπό την επίλυση προβλημάτων αναγνωσιμότητας, υιοθετώντας μη παραδοσιακές προσεγγίσεις στη δομή και την εμφάνιση του κώδικα. Τα ολοκληρωμένα περιβάλλοντα ανάπτυξης (IDE) στοχεύουν στην ενσωμάτωση όλης αυτής της βοήθειας. Τεχνικές όπως η ανακατασκευή κώδικα μπορούν να βελτιώσουν την αναγνωσιμότητα.
Το ακαδημαϊκό πεδίο και η πρακτική της μηχανικής του προγραμματισμού υπολογιστών ασχολούνται σε μεγάλο βαθμό με την ανακάλυψη και την εφαρμογή των πιο αποτελεσματικών αλγορίθμων για μια συγκεκριμένη κατηγορία προβλημάτων. Για το σκοπό αυτό, οι αλγόριθμοι ταξινομούνται σε παραγγελίες χρησιμοποιώντας τον λεγόμενo συμβολισμό Big O, ο οποίος εκφράζει τη χρήση πόρων, όπως ο χρόνος εκτέλεσης ή η κατανάλωση μνήμης, ως προς το μέγεθος μιας εισόδου. Οι έμπειροι προγραμματιστές είναι εξοικειωμένοι με μια ποικιλία καθιερωμένων αλγορίθμων και τις αντίστοιχες πολυπλοκότητές τους και χρησιμοποιούν αυτή τη γνώση για να επιλέξουν αλγόριθμους που ταιριάζουν καλύτερα ανάλογα τις περιστάσεις.
Ο "Προγραμματισμός ενός υπολογιστή για να παίζει σκακι" ήταν μια εργασία του 1950 που αξιολογούσε έναν αλγόριθμο "minimax" (ελάχιστο-μέγιστο) που αποτελεί μέρος της ιστορίας της αλγοριθμικής πολυπλοκότητας, ένα μάθημα για το Deep Blue της IBM (υπολογιστής σκακιού) είναι μέρος του προγράμματος σπουδών της επιστήμης των υπολογιστών στο Πανεπιστήμιο του Στάνφορντ .[19]
Το πρώτο βήμα στις περισσότερες τυπικές διαδικασίες ανάπτυξης λογισμικού είναι η ανάλυση απαιτήσεων, ακολουθούμενη από δοκιμές για τον προσδιορισμό της μοντελοποίησης αξίας, την υλοποίηση και την εξάλειψη αποτυχίας (debugging). Υπάρχουν πολλές διαφορετικές προσεγγίσεις για καθεμία από αυτές τις εργασίες. Μια δημοφιλής προσέγγιση για την ανάλυση απαιτήσεων είναι η ανάλυση περιπτώσεων χρήσης (Use Case) . Πολλοί προγραμματιστές χρησιμοποιούν μορφές ανάπτυξης λογισμικού Agile, όπου τα διάφορα στάδια της τυπικής ανάπτυξης λογισμικού είναι ενσωματωμένα σε σύντομους κύκλους που διαρκούν μερικές εβδομάδες αντί για χρόνια. Υπάρχουν πολλές προσεγγίσεις στη διαδικασία ανάπτυξης λογισμικού.
Οι δημοφιλείς τεχνικές μοντελοποίησης περιλαμβάνουν την Αντικειμενοστραφή Ανάλυση και Σχεδίαση ( OOAD ) και την Αρχιτεκτονική βάσει Μοντέλων ( MDA ). Η Ενοποιημένη Γλώσσα Μοντελοποίησης ( UML ) είναι ένας συμβολισμός που χρησιμοποιείται τόσο για το OOAD όσο και για το MDA.
Μια παρόμοια τεχνική που χρησιμοποιείται για το σχεδιασμό βάσεων δεδομένων είναι η Μοντελοποίηση Σχέσεων οντοτήτων ( ER Modeling ).
Οι τεχνικές υλοποίησης περιλαμβάνουν επιτακτικές γλώσσες ( αντικειμενοστρεφείς ή διαδικαστικές ), λειτουργικές γλώσσες και λογικές γλώσσες.
Είναι πολύ δύσκολο να προσδιορίσουμε ποιες είναι οι πιο δημοφιλείς σύγχρονες γλώσσες προγραμματισμού. Οι μέθοδοι μέτρησης της δημοτικότητας μιας γλώσσας προγραμματισμού περιλαμβάνουν: την καταμέτρηση του αριθμού των αγγελιών θέσεων εργασίας που αναφέρουν τη συγκεκριμένη γλώσσα,[20] τον αριθμό των βιβλίων που πωλήθηκαν και τα μαθήματα που διδάσκουν τη γλώσσα (αυτό υπερεκτιμά τη σημασία των νεότερων γλωσσών) και εκτιμήσεις του αριθμού των υπάρχουσων γραμμών κώδικα γραμμένων στη γλώσσα (αυτό υποτιμά τον αριθμό των χρηστών στις επαγγελματικές γλωσσές όπως η COBOL).
Ορισμένες γλώσσες είναι πολύ δημοφιλείς για συγκεκριμένα είδη εφαρμογών, ενώ ορισμένες γλώσσες χρησιμοποιούνται συχνά για τη σύνταξη πολλών διαφορετικών ειδών εφαρμογών. Για παράδειγμα, η COBOL εξακολουθεί να είναι ισχυρή σε εταιρικά κέντρα δεδομένων [21] συχνά σε μεγάλους κεντρικoύς (mainframe) υπολογιστές, η Fortran σε εφαρμογές μηχανικής, γλώσσες δέσμης ενεργειών (scripting languages) στην ανάπτυξη Ιστού και η C σε ενσωματωμένο λογισμικό (embedded software) . Πολλές εφαρμογές χρησιμοποιούν έναν συνδυασμό πολλών γλωσσών στην κατασκευή και τη χρήση τους. Οι νέες γλώσσες σχεδιάζονται γενικά γύρω από τη σύνταξη μιας προηγούμενης γλώσσας με επιπρόσθετη νέα λειτουργικότητα, (για παράδειγμα η C++ προσθέτει αντικειμενοστραφή λειτουργία στην C και η Java προσθέτει διαχείριση μνήμης και bytecode στη C++, αλλά ως αποτέλεσμα χάνει την αποδοτικότητα και την ικανότητα χειραγώγησης σε χαμηλό επίπεδο).
Ο εντοπισμός σφαλμάτων (debugging) είναι μια πολύ σημαντική εργασία στη διαδικασία ανάπτυξης λογισμικού, καθώς η ύπαρξη ελαττωμάτων σε ένα πρόγραμμα μπορεί να έχουν σημαντικές συνέπειες για τους χρήστες του. Ορισμένες γλώσσες είναι πιο επιρρεπείς σε ορισμένα είδη σφαλμάτων, επειδή οι προδιαγραφές τους δεν απαιτούν τόσους ελέγχους από τους μεταγλωττιστές όσο άλλες γλώσσες. Η χρήση ενός εργαλείου ανάλυσης στατικού κώδικα μπορεί να βοηθήσει στον εντοπισμό ορισμένων πιθανών προβλημάτων. Κανονικά, το πρώτο βήμα για τον εντοπισμό σφαλμάτων είναι η προσπάθεια αναπαραγωγής του προβλήματος. Αυτό μπορεί όμως να μην είναι μια απλή εργασία, για παράδειγμα, με παράλληλες διεργασίες ή ορισμένα ασυνήθιστα σφάλματα λογισμικού. Επίσης, συγκεκριμένα περιβάλλοντα χρηστών και ιστορικά χρήσεων μπορεί να δυσχεράνουν την αναπαραγωγή του προβλήματος.
Μετά την αναπαραγωγή του σφάλματος, η εισαγωγή του προγράμματος μπορεί να χρειαστεί να απλοποιηθεί για να διευκολυνθεί ο εντοπισμός σφαλμάτων. Για παράδειγμα, όταν ένα σφάλμα σε έναν μεταγλωττιστή προκαλεί διακοπή κατά την ανάλυση κάποιου μεγάλου αρχείου προέλευσης, μια απλοποίηση της δοκιμαστικής περίπτωσης που έχει λίγες μόνο γραμμές σε σχέση με το αρχικό αρχείο προέλευσης μπορεί να είναι αρκετή για την αναπαραγωγή του ίδιου σφάλματος. Απαιτείται διαδικασία δοκιμής και σφάλματος και διαδικασία διαίρει και βασίλευε: ο προγραμματιστής θα προσπαθήσει να αφαιρέσει ορισμένα μέρη της αρχικής περίπτωσης δοκιμής και να ελέγξει αν το πρόβλημα εξακολουθεί να υπάρχει. Κατά τον εντοπισμό σφαλμάτων του προβλήματος σε μία γραφική διεπαφή χρήστη (GUI), ο προγραμματιστής μπορεί να προσπαθήσει να παραλείψει κάποια αλληλεπίδραση χρήστη από την αρχική περιγραφή του προβλήματος και να ελέγξει εάν οι υπόλοιπες ενέργειες επαρκούν για την εμφάνιση σφαλμάτων. Οι ενέργειες δεσμης (scripting) και η εύρεση σημείων καμπής (breakpointing) είναι επίσης μέρος αυτής της διαδικασίας.
Ο εντοπισμός σφαλμάτων γίνεται συχνά με ολοκληρωμένα περιβάλλοντα ανάπτυξης (IDE) . Χρησιμοποιούνται επίσης αυτόνομα προγράμματα εντοπισμού σφαλμάτων, όπως ο αποσφαλματωτής GNU (GDB), τα οποία συχνά παρέχουν λιγότερο οπτικό περιβάλλον, όπως γραμμή εντολών . Ορισμένοι επεξεργαστές κειμένου όπως το Emacs επιτρέπουν την επίκληση του GDB μέσω αυτών, για να παρέχουν ένα οπτικό περιβάλλον.
Διαφορετικές γλώσσες προγραμματισμού υποστηρίζουν διαφορετικά στυλ προγραμματισμού (που ονομάζονται παραδείγματα προγραμματισμού ). Η επιλογή της γλώσσας που χρησιμοποιείται υπόκειται υπό μελέτη σε τομείς όπως η πολιτική της εταιρείας, η καταλληλότητα για εργασία, η διαθεσιμότητα πακέτων τρίτων ή η ατομική προτίμηση. Ιδανικά, θα επιλεγεί η γλώσσα προγραμματισμού που ταιριάζει καλύτερα στην εργασία. Τα συμβιβασμός από αυτό το ιδανικό περιλαμβάνουν την εύρεση αρκετών προγραμματιστών που γνωρίζουν τη γλώσσα για να δημιουργήσουν μια ομάδα, τη διαθεσιμότητα μεταγλωττιστών για αυτήν τη γλώσσα και την αποτελεσματικότητα με την οποία εκτελούνται τα προγράμματα γραμμένα σε μια δεδομένη γλώσσα. Οι γλώσσες σχηματίζουν ένα κατά προσέγγιση φάσμα από "χαμηλό επίπεδο" έως "υψηλό επίπεδου". Οι γλώσσες "χαμηλού επιπέδου" είναι συνήθως πιο προσανατολισμένες στη μηχανή και πιο γρήγορες στην εκτέλεση, ενώ οι γλώσσες "υψηλού επιπέδου" είναι πιο αφηρημένες και πιο εύχρηστες, αλλά εκτελούνται λιγότερο γρήγορα. Συνήθως είναι πιο εύκολο να κωδικοποιήσετε σε γλώσσες "υψηλού επιπέδου" παρά σε "χαμηλού επιπέδου".
Ο Άλεν Ντάουνι, στο βιβλίο του Πως Να Σκέφτεσαι Σαν Επιστήμονας Υπολογιστών, γράφει:
Πολλές γλώσσες υπολογιστών παρέχουν έναν μηχανισμό για την κλήση συναρτήσεων που παρέχονται από κοινόχρηστες βιβλιοθήκες . Εφόσον οι συναρτήσεις σε μια βιβλιοθήκη ακολουθούν τις κατάλληλες συμβάσεις χρόνου εκτέλεσης (π.χ. μέθοδος μετάδοσης ορισμάτων ), τότε αυτές οι συναρτήσεις μπορούν να γραφτούν σε οποιαδήποτε άλλη γλώσσα.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.