Γλώσσες και εργαλεία προγραμματισμού
Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr
Ιστορική ανασκόπηση
- Προγραμματισμός με διακόπτες
- Γλώσσα μηχανής
- Συμβολική γλώσσα
- Fortran
- Lisp, Simula, Prolog
Χαρακτηριστικές αλγοριθμικές γλώσσες
Σε μια αλγοριθμική (imperative)
(ή προστακτική ή επιτακτική ή
διαδικαστική (procedural)) γλώσσα
το πρόγραμμα εκφράζει άμεσα τα βήματα που επιθυμούμε να
εκτελέσει ο υπολογιστής.
- Fortran, Fortran 9X
- Cobol
- Algol-60
- Basic
- PL/I
- Pascal, Modula-2, Oberon
- C
- Ada
- Smalltalk
- C++
- Awk, Perl, Tcl/Tk, Python
- Java
- C#
Χαρακτηριστικές δηλωτικές γλώσσες
Σε μια δηλωτική (declarative)
ή εφαρμοστική (applicative)
γλώσσα
το πρόγραμμα εκφράζει τη δομή του προβλήματος που θέλουμε
να επιλύσουμε.
Η γλώσσα προγραμματισμού παρέχει τον κατάλληλο μηχανισμό ελέγχου
ο οποίος χρησιμοποιόντας τη δομή που έχουμε ορίσει καταλήγει
στο επιθυμητό αποτέλεσμα.
Γλώσσες βασισμένες στη λογική
Γλώσσες βασισμένες σε συναρτήσεις
Τυπική περιγραφή γλωσσών
- Σύνταξη (Syntax)
- Ο τρόπος με τον οποίο τοποθετούνται στη σειρά τα συστατικά
στοιχεία της γλώσσας για να αποτελέσουν ένα πρόγραμμα.
- Σημασιολογία (Semantics)
- Η σημασία που αποδίδεται στα συστατικά στοιχεία ενός
προγράμματος κατά τη μετάφραση και την εκτέλεσή του.
Παράδειγμα γραμματικής BNF
Μια αριθμητική έκφραση μπορεί να αποτελείται από:
- 'Αθροισμα ή Διαφορά (ΑΔ)
- Πηλίκο ή Γινόμενο (ΠΓ)
- Βασικό στοιχείο (Β)
Ο τρόπος που αυτά συνδυάζονται μεταξύ τους εκφράζεται σε BFN ως εξής:
ΑΔ ::= ΑΔ + ΠΓ | ΑΔ - ΠΓ | ΠΓ
ΠΓ ::= ΠΓ * Β | ΠΓ / Β | Β
Β ::= αριθμός | (ΑΔ)
Βασικά γλωσσικά εργαλεία
- Προετοιμαστής/Διορθωτής (Editor)
- Επιτρέπει τη συγγραφή και την αλλαγή του προγράμματος.
- Προεπεξεργαστής (Preprocessor)
- Επεξεργάζεται το πρόγραμμα εκτελώντας απλούς
συμβολικούς μετασχηματισμούς και παράγει ένα αντίστοιχο πρόγραμμα.
Χρησιμοποιείται σε συμβολικές γλώσσες, τη Fortran (Ratfor), τη C, και τη C++.
- Συμβολομεταφραστής (Assembler)
- Μετατρέπει τη συμβολική γλώσσα του επεξεργαστή σε γλώσσα
μηχανής.
- Μεταγλωττιστής (Compiler)
- Μεταφράζει μια γλώσσα υψηλού επιπέδου σε γλώσσα επιπέδου μηχανής.
- Διερμηνευτής (Interpreter)
- Εκτελεί άμεσα ένα πρόγραμμα σε γλώσσα υψηλού επιπέδου.
- Συνδέτης (Linker)
- Συρράφει τμήματα ενός προγράμματος που έχουν μεταγλωττιστεί ξεχωριστά
σε ένα συνεχές πρόγραμμα.
- Φορτωτής (Loader)
- Φορτώνει το πρόγραμμα στη μνήμη του επεξεργαστή διορθώνοντας αναφορές
σε σχετικές θέσεις μνήμης.
Συνήθως τμήμα του λειτουργικού συστήματος.
- Αποσφαλματωτής (Debuger)
- Επιτρέπει την εκτέλεση του προγράμματος βήμα-βήμα, την
εξέταση και αλλαγή μεταβλητών του
και γενικά ενέργειες που αποσκοπούν στην ανίχνευση
λαθών που μπορεί να περιέχει το πρόγραμμα.
Δομή του μεταγλωττιστή
- Λεκτική ανάλυση (Lexical analysis)
- Αναγνώριση βασικών λεκτικών τμημάτων του προγράμματος όπως
αριθμών, ονόματα μεταβλητών και λέξεων-κλειδιών της γλώσσας.
- Συντακτική ανάλυση (Parsing)
- Η δημιουργία από τα λεξικά τμήματα του συντακτικού δέντρου του
προγράμματος.
- Πίνακας συμβόλων (Symbol table)
- Χώρος αποθήκευσης των χαρακτηριστικών όλων των ονομάτων που
χρησιμοποιούνται στο πρόγραμμα.
- Έλεγχος τύπων (Type checking)
- Έλεγχος του τύπου των μεταβλητών, των συναρτήσεων και των
εκφράσεων.
- Βελτιστοποίηση (Optimization)
- Αλλαγές στη δομή του κώδικα που αυξάνουν την ταχύτητα με την
οποία θα εκτελεστεί, χωρίς όμως να επηρεάζουν το αποτέλεσμα.
- Παραγωγή κώδικα (Code generation)
- Παραγωγή συμβολικής γλώσσας ή γλώσσας μηχανής.
Η διεργασία του προγραμματισμού
- Σχεδιασμός
- Συγγραφή σε ψευδοκώδικα
- Συγγραφή στη γλώσσα προγραμματισμού
- Μεταγλώττιση
- Εκτέλεση
- Αποσφαλμάτωση
Βιβλιογραφία
- Α. Λυπιτάκης
Ο σύγχρονος κόσμος των υπολογιστών. Κεφάλαιο 4
1997.
- Μ. Μπεκάκος
Εισαγωγή στην πληροφορική. σ. 114-119
Οικονομικό Πανεπιστήμιο Αθηνών 1998.
- Ε. Παπαθανασίου
Στοιχεία υπολογιστικών συστημάτων. Ενότητες 6.3-6.11.
Εκδόσεις Μπένου 1998.
- Les Goldschlager και Andrew Lister
Εισαγωγή στη σύγχρονη επιστήμη των υπολογιστών. Ενότητες 5.1-5.4.
Εκδόσεις Δίαυλος 1994.
- Peter Rechenberg.
Εισαγωγή στην Πληροφορική. σ. 138-150
Κλειδάριθμος, 1992.
- Alfred V. Aho, Ravi Sethi,
and Jeffrey D. Ullman.
Compilers, Principles, Techniques, and Tools.
Addison-Wesley, 1985.
- Alfred V. Aho, Brian W.
Kernighan, and Peter J. Weinberger.
The
AWK Programming Language.
Addison-Wesley, 1988.
- Ken Arnold and James
Gosling.
The
Java Programming Languge.
Addison-Wesley, 1996.
- J.W. Backus, F.L.
Bauer, J.Green, C.Katz, J.McCarthy, P. Naur, A.J.Perlis, H. Rutishauser,
K. Samuelson, B. Vauquois, J.H. Wegstein, A. van Vinjgaarden, and M. Woodger.
Revised report on the algorthmic language ALGOL 60.
IFIP, 1960.
- J. Glenn Brookshear.
Computer Science, pages 225–284.
Addison-Wesley, sixth edition, 2000.
- Jean D. Ichbiah et al.
Reference Manual for the Ada Programming Language, ANSI/MIL-STD-1815
A-1983.
Castle House Publication Ltd., 1983.
- Kathleen Jensen and
Niklaus Wirth.
PASCAL User Manual and Report.
Springer Verlag, second edition, 1975.
- Brian W. Kernighan
and Dennis M. Ritchie.
The C
Programming Language.
Prentice-Hall, second edition, 1988.
- Brian W. Kernighan.
Why Pascal is not my favorite programming language.
Technical Report 100, Bell Laboratories, Murray Hill, New Jersey 07974, July
1981.
- K. N. King.
Java
Programming: from the Beginning.
W. W. Norton & Company, New York, NY, USA, 2000.
- Günther Lamprecht.
Introduction to SIMULA-67.
Friedr. Vieweg & Sohn, Braunschweig, Wiesbaden, Germany, 1981.
- Martin
Richards and Colin Whitby-Strevens.
BCPL — The Language and its Compiler.
Cambridge University Press, 1979.
- Peter H. Salus, editor.
Handbook of Programming Languages, volume I: Object-Oriented Programming
Languages.
Macmillan Technical Publishing, 1998.
- Peter H. Salus, editor.
Handbook of Programming Languages, volume II: Imperative Programming
Languages.
Macmillan Technical Publishing, 1998.
- Peter H. Salus, editor.
Handbook of Programming Languages, volume III: Little Languages and
Tools.
Macmillan Technical Publishing, 1998.
- Peter H. Salus, editor.
Handbook of Programming Languages, volume IV: Functional and Logic
Programming Languages.
Macmillan Technical Publishing, 1998.
- Ravi Sethi.
Programming Languages: Concepts and Constructs.
Addison-Wesley, 1989.
- Diomidis
Spinellis and Rob Kolstad.
A conversation about Perl and the shell: Choosing the implementation
vehicle.
;login:, 22(3):25–31, June 1997.
- Bjarne Stroustrup.
The
C++ Programming Language.
Addison-Wesley, third edition, 1997.
- R. D. Tennent.
Princliples of Programming Languages.
Prentice Hall, 1981.
- Larry Wall and
Randal L. Schwartz.
Programming Perl.
O'Reilly and Associates, Sebastopol, CA, USA, 1990.
- Richard L. Wexelblat.
Maxims for malfeasant designers, or how to design languages to make programming
as difficult as possible.
In Proceedings of the 2nd International Conference on Software
Engineering, pages 331–336, San Fransisco, CA, USA, October 1976.
IEEE Computer Society Press.
Ασκήσεις