Εργαλεία και τεχνικές ανάπτυξης
Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr
Ταξινόμηση εργαλείων
Μπορούμε να διαχωρίσουμε τα εργαλεία λογισμικού στις παρακάτω κατηγορίες (Houghton 1983):
Διορθωτές
Ένας καλός διορθωτής (editor) προγραμμάτων υποστηρίζει
τις παρακάτω δυνατότητες:
- Εύρεση και αλλαγή με κανονικές εκφράσεις (regular expressions)
- Αυτόματη στοίχιση (indentation)
- Ταίριαγμα παρενθέσεων, αγκυλών, κ.λπ.
- Χρωματισμός σύμφωνα με τη σύνταξη της γλώσσας
- Αναίρεση πολλαπλών επιπέδων,
- Σύνδεση με πρόγραμμα βοήθειας
- Σύνδεση με περιβάλλον μεταγλώττισης
- Ταυτόχρονη διόρθωση σε πολλαπλά παράθυρα και αρχεία
- Ιεραρχική απόκρυψη περιοχών
- Αναγνώριση της σύνταξης της γλώσσας και αυτόματος σχηματισμός του προγράμματος
- Σελιδοδείκτες
- Συμπλήρωση ή επιλογή όρων της γλώσσας
Το περιβάλλον του διορθωτή vim
Διερμηνευτές και μεταγλωττιστές
Εκτός από τη συμβολή τους στην εκτέλεση του πηγαίου κώδικα
οι διερμηνευτές και μεταγλωττιστές παρέχουν συχνά και τις παρακάτω
ευκολίες:
- Εύρεση σημασιολογικών λαθών (semantic errors):
class Test {
int a;
public:
void setA(int v) { a == v; }
};
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
t.cpp
t.cpp(4) : warning C4553: '==' : operator has no effect; did you intend '='?
- Δημιουργία βάσης δεδομένων του προγράμματος
- Βελτιστοποίηση
- Προσθήκη δεδομένων και εντολών για αποσφαλμάτωση και ανάλυση κατανομής
- Μεταγλώττιση για άλλα περιβάλλοντα εκτέλεσης (cross compiling)
- Δημιουργία αναφοράς των εντολών του προγράμματος
Γεννήτριες κώδικα
Μια σειρά από εργαλεία και τεχνικές βασίζονται στην αυτόματη δημιουργία κώδικα.
Παραδείγματα:
Παραδείγματα wizard
Αποσφαλματωτές
Ο αποσφαλματωτής επιτρέπει:
- Την εκτέλεση του προγράμματος βήμα προς βήμα
- Την εκτέλεση ολόκληρης κλήσης συνάρτησης ή μεθόδου σε ένα βήμα
- Τον προσδιορισμό σημείων διακοπής (breakpoints) στην εκτέλεση του κώδικα
- Τον προσδιορισμό σημείων διακοπής δεδομένων (data breakpoints)
- Την εμφάνιση τιμών των μεταβλητών
- Την εκτέλεση μέχρι ένα σημείο
- Την εμφάνιση της αλληλουχίας κλήσεων των συναρτήσεων η μεθόδων
- Την εύρεση του σημείου του προγράμματος όπου σημειώθηκε κάποιο πρόβλημα
Αποσφαλμάτωση στο περιβάλλον Microsoft Visual Studio
Αναλυτές κατανομής
Ένας αναλυτής κατανομής εκτέλεσης (execution profiler)
επιτρέπει:
Φυλλομετρητές
Συνδεδεμένο με το διορθωτή είναι συχνά ένα εργαλείο που επιτρέπει τη
φυλλομέτρηση και την εμφάνιση της δομής του κώδικα και των κλάσεων
που τον απαρτίζουν.
Δυνατότητες του φυλλομετρητή μπορεί να είναι οι παρακάτω:
Σύστημα βοήθειας
Το σύστημα βοήθειας περιλαμβάνει συχνά σε ψηφιακή μορφή τεκμηρίωση για:
- τη γλώσσα προγραμματισμού,
- τη βιβλιοθήκη,
- το περιβάλλον ανάπτυξης και τα εργαλεία που το απαρτίζουν,
- τεκμηρίωση για τη διαδικασία ανάπτυξης εφαρμογών,
- οδηγίες συμβατότητας,
- απαντήσεις σε συχνές ερωτήσεις,
- διαπιστωμένα σφάλματα του περιβάλλοντος.
Το σύστημα βοήθειας είναι τις περισσότερες φορές παρουσιασμένο σε
μορφή υπερκειμένου με πίνακες περιεχομένων και συνδέσεις ανάμεσα σε
τμήματα, όπως φαίνεται στα παρακάτω σχήματα:
Ολοκληρωμένα περιβάλλοντα ανάπτυξης
- Η διαδικασία της κωδικοποίησης είναι περίπλοκη και χρονοβόρα.
- Για τη διευκόλυνσή της έχουν σχεδιαστεί και αναπτυχθεί
περιβάλλοντα υποστήριξης της κωδικοποίησης (programming support environments).
- Σε ένα περιβάλλον υποστήριξης της κωδικοποίησης όλος ο κύκλος της
κωδικοποίησης από την αρχική εισαγωγή του προγράμματος μέχρι την τελική
αποσφαλμάτωση υποστηρίζεται από ένα ολοκληρωμένο σύστημα.
Έτσι ένα περιβάλλον υποστήριξης της κωδικοποίησης μπορεί να περιέχει
σε ένα ολοκληρωμένο περιβάλλον:
- Υπερσύνολο του περιβάλλοντος υποστήριξης της κωδικοποίησης
αποτελεί το
περιβάλλον τεχνολογίας λογισμικού (software engineering environment)
το οποίο παρέχει υποστήριξη για όλον το κύκλο ζωής του λογισμικού
συμπεριλαμβάνοντας δηλαδή υποστήριξη για
- την ανάλυση των απαιτήσεων,
- το σχεδιασμό,
- την κωδικοποίηση,
- τη διοίκηση του έργου,
- τον έλεγχο των εκδόσεων και του σχηματισμού,
- τη διαχείριση εξαρτημάτων λογισμικού (software components),
- τη διασφάλιση ποιότητας και
- τη συντήρηση.
- Η τάση που εμφανίζεται είναι τα περιβάλλοντα υποστήριξης της κωδικοποίησης
τα περιέχουν όλο και περισσότερα στοιχεία από περιβάλλοντα τεχνολογίας λογισμικού
ενώ παράλληλα περιβάλλοντα τεχνολογίας λογισμικού να υποστηρίζουν όλο
και περισσότερο την κωδικοποίηση με τη χρήση γεννητριών κώδικα.
Περιβάλλοντα εργαλειοσυνόλων
Ένα περιβάλλον εργαλειοσυνόλων περιλαμβάνει σε ένα οργανωμένο
σύνολο μια σειρά από εργαλεία που συνεργάζονται αρμονικά μεταξύ τους.
Για παράδειγμα σύγχρονες εκδόσεις του λειτουργικού συστήματος
Unix παρέχουν τα παρακάτω:
- Διορθωτές (emacs, vi, sed, ex)
- Μεταγλωττιστές (C, C++, Fortran, Java)
- Εργαλεία διαχείρισης σχηματισμών (SCCS, RCS, CVS)
- Διερμηνευόμενες γλώσσες (sh, awk, Perl, Python, Ruby, Tcl/Tk)
- Εργαλεία μορφοποίησης προγραμμάτων (cb, indent)
- Αναλυτές κατανομής (prof, gprof, tcov)
- Αποσφαλματωτές (gdb, adb, dbx)
- Χρήσιμα αρχεία (λεξικά, χάρτες, πίνακες χαρακτήρων, πόλεων, τηλεφώνων)
- Μικρά εργαλεία επεξεργασίας αρχείων κειμένου:
- grep
- Εύρεση κανονικής έκφρασης
- egrep
- Εύρεση επαυξημένης κανονικής έκφρασης
- fgrep
- Εύρεση σταθερών συμβολοσειρών
- tr
- Μετάφραση χαρακτήρων
- fmt
- Συμπλήρωση λέξεων σε γραμμές
- wc
- Μέτρηση λέξεων, γραμμάτων, γραμμών
- rev
- Αντιστροφή των περιεχομένων κάθε γραμμής
- diff
- Εκτύπωση της διαφοράς δύο αρχείων
- Μικρά εργαλεία επεξεργασίας ταξινομημένων αρχείων και αρχείων με πεδία
- sort
- Ταξινόμηση
- uniq
- Αφαίρεση ή επιλογή επαναλαμβανόμενων γραμμών σε ένα ταξινομημένο αρχείο
- cut
- Επιλογή πεδίων
- join
- Σχεσιακή σύνδεση αρχείων
- Τρόπο σύνδεσης των παραπάνω με τη χρήση σωληνώσεων (pipes)
- Σύστημα βοήθειας που τεκμηριώνει όλο το περιβάλλον:
- Εντολές χρήστη
- Κλήσεις λειτουργικού συστήματος
- Βιβλιοθήκες
- Επικοινωνία με τις συσκευές
- Διάταξη αρχείων
- Εντολές διαχειριστή
Ολοκλήρωση της διαδικασίας μεταγλώττισης
Η διαδικασία της μεταγλώττισης περιλαμβάνει αρκετές ευκολίες σε ένα
ολοκληρωμένο περιβάλλον.
- Υπολογίζονται αυτόματα τα αρχεία που απαιτούν μεταγλώττιση ανάλογα
με τις αλλαγές που έγιναν σε αρχεία επικεφαλίδων.
- Η εμφάνιση ενός λάθους επιτρέπει την άμεση σύνδεσή του με τη γραμμή
του κώδικα που το δημιούργησε όπως φαίνεται στην παρακάτω οθόνη:
- Επιτρέπει την εμφάνιση τεκμηρίωσης σχετικά με τα λάθη που εμφανίζονται.
Ανάπτυξη με γλώσσες εξειδικευμένου πεδίου
Σύζευξη γνωστικού πεδίου - λογισμικού
- Απαιτήσεις γνώσης του πεδίου κατά:
- το σχεδιασμό
- την υλοποίηση
- την επαλήθευση
- Ελλείψεις ή προβλήματα επικοινωνίας οδηγούν σε αστοχίες
- Η γλώσσα εξειδικευμένου πεδίου:
- χρησιμοποιεί το φορμαλισμό του πεδίου
- γεφυρώνει την επικοινωνία μεταξύ του επαΐοντα και της ομάδας υλοποίησης
Απαιτήσεις διαλεκτικής επαΐοντα
- Αξιοποίηση γνωστικών δεξιοτήτων
- Υποστήριξη φορμαλισμών του γνωστικού πεδίου
- Δημοσίευση
- Διάχυση, εκπαίδευση, ανασκόπηση
- Ανασκόπηση από ομότιμους επαΐοντες
- Αρχειοθέτηση
- Σε μορφή κατάλληλη για ανιχνευσιμότητα
- Επιλεκτική επέμβαση
- Βελτίωση, συντήρηση, υποστήριξη
- Επαναχρησιμοποίηση
Προβλήματα των γλωσσών γενικής χρήσης
- Δύσκολες στην εκμάθηση
- C++ 1997 910 σ.
- Απαιτούν μεγάλες βιβλιοθήκες υποστήριξης
- Windows API 3433 συναρτήσεις
- Ακατάλληλες για συγκεκριμένες εφαρμογές
- Συστήματα πελάτη εξυπηρετητή
- Απόσταση από το φορμαλισμό του επαΐοντα
Γλώσσες εξειδικευμένου πεδίου (ΓΕΠ)
- Γλώσσες προγραμματισμού προσαρμοσμένες σε συγκεκριμένο πεδίο
- Παραδείγματα
- Lex/yacc
- HTML
- VHDL
- Γλώσσες τέταρτης γενιάς
- Ευσύνοπτη περιγραφή της λογικής της εφαρμογής
- Ελάττωση της σημασιολογικής απόστασης ανάμεσα στο πρόβλημα και το πρόγραμμα
Παράδειγμα ΓΕΠ στην υλοποίηση μεταγλωττιστών
- Lex - δημιουργεί κώδικα λεκτικής ανάλυσης
- Yacc - δημιουργεί κώδικα συντακτικής ανάλυσης
Παράδειγμα: κώδικας yacc:
unary_expression
: postfix_expression
| '+' cast_expression { $$ = $2; }
| '-' cast_expression { $$ = -$2; }
| '~' cast_expression { $$ = ~$2; }
| '!' cast_expression { $$ = !$2; }
;
cast_expression
: unary_expression
;
multiplicative_expression
: cast_expression
| multiplicative_expression '*' cast_expression { $$ = $1 * $3; }
| multiplicative_expression '/' cast_expression
{
if ($3 == 0) {
Error::error(E_ERR, "division by zero in #if expression");
$$ = 0;
} else
$$ = $1 / $3;
}
| multiplicative_expression '%' cast_expression
{
if ($3 == 0) {
Error::error(E_ERR, "modulo division by zero in #if expression");
$$ = $1;
} else
$$ = $1 / $3;
}
;
Βιβλιογραφία
- Εμμανουήλ Σκορδαλάκης.
Εισαγωγή στην Τεχνολογία Λογισμικού, σελίδες 241-298.
Εκδόσεις Συμμετρία, 1991.
- Jon Louis Bentley.
Programming Pearls.
Addison-Wesley, 1986.
- Jon Louis Bentley.
More
Programming Pearls: Confessions of a Coder.
Addison-Wesley, 1988.
- Jon Louis Bentley.
More
Programming Pearls: Confessions of a Coder, chapter Little
Languages, pages 83–100.
Addison-Wesley, 1988.
- R. C. Houghton.
Software development tools: a profile.
Computer, pages 63–70, May 1983.
- Roger S. Pressman.
Software Engineering: A Practitioner's Approach, pages 404–420.
McGraw-Hill, 1987.
- Roger S. Pressman.
Software Engineering: A Practitioner's Approach, pages 868–886.
McGraw-Hill, fifth edition, 2000.
European Adaptation. Adapted by Darrel Ince.
- J. Christopher Ramming, editor.
USENIX Conference on Domain-Specific Languages, Santa Monica, CA, USA,
October 1997. Usenix Association.
- Diomidis
Spinellis and V. Guruprasad.
Lightweight languages as software engineering tools ( http://www.spinellis.gr/pubs/conf/1997-DSL-Lightweight/html/paper.html).
In Ramming [Ramming, 1997], pages 67–76.
- Diomidis Spinellis.
Reliable software implementation using domain specific languages ( http://www.spinellis.gr/pubs/conf/1999-ESREL-SoftRel/html/dsl.html).
In G. I. Schuëller and P. Kafka, editors, Proceedings ESREL '99 —
The Tenth European Conference on Safety and Reliability, pages
627–631, Munich-Garching, Germany, September 1999. ESRA, VDI, TUM, A. A.
Balkema.
- Diomidis Spinellis.
Notable design patterns for domain specific languages ( http://www.spinellis.gr/pubs/jrnl/2000-JSS-DSLPatterns/html/dslpat.html).
Journal of Systems and Software, 56(1):91–99, February 2001.
Ασκήσεις
- Εξετάστε τα εργαλεία που χρησιμοποιείτε στην ανάπτυξη του λογισμικού
σας και χωρίστε τα σε κατηγορίες σύμφωνα με την ταξινόμηση που προτείναμε.
- Ερευνήστε ποια νέα εργαλεία θα αύξαναν την παραγωγικότητά σας και αρχίστε
να τα χρησιμοποιείτε.