Σύγχρονες γλώσσες προγραμματισμού με δυνατότητες εκτέλ σης σε $ενϊρύη% περιβάλλον



Σχετικά έγγραφα
PERL. Δήμος Παύλου Δημήτρης Κουζαπάς

Υλοποίηση ενός προγραμματιστικού κελύφους εργασίας

Προβλήματα, αλγόριθμοι, ψευδοκώδικας

Εισαγωγή στα Λειτουργικά Συστήματα

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

Λειτουργικά Συστήματα

Ψευδοκώδικας. November 7, 2011

Μέρος 3 ο : Βασικές Έννοιες για δυναμικές ιστοσελίδες

FORTRAN και Αντικειμενοστραφής Προγραμματισμός

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 1 Εισαγωγή στη C. Σοφία Μπαλτζή s.mpaltzi@di.uoa.gr

ΕΞΕΤΑΖΟΜΕΝΟ ΜΑΘΗΜΑ : ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΤΑΞΗ : Γ ΛΥΚΕΙΟΥ ΣΠΟΥΔΕΣ ΟΙΚΟΝΟΜΙΑΣ & ΠΛΗΡΟΦΟΡΙΚΗΣ ΔΙΑΓΩΝΙΣΜΑ ΠΕΡΙΟΔΟΥ : ΜΑΪΟΥ

[11] Υπολογιστικά συστήματα: Στρώματα. Περιεχόμενα. Εισαγωγή. επικοινωνία εφαρμογές λειτουργικό σύστημα προγράμματα υλικό

Περιεχόμενα. Κεφάλαιο 1 Εισαγωγή στην Access...9. Κεφάλαιο 2 Χειρισμός πινάκων... 25

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Συντάχθηκε απο τον/την Administrator Δευτέρα, 22 Φεβρουάριος :11 - Τελευταία Ενημέρωση Παρασκευή, 26 Φεβρουάριος :52

Τεχνικές σχεδίασης προγραμμάτων, Προγραμματιστικά Περιβάλλοντα

ΕΠΛ 003: ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΠΛΗΡΟΦΟΡΙΑΚΑ ΣΥΣΤΗΜΑΤΑ. Εισαγωγή στο Unix

Κεφάλαιο 7 : Είδη, Τεχνικές, και Περιβάλλοντα Προγραµµατισµού

Μαλούτα Θεανώ Σελίδα 1

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Σχεδιάζοντας Εφαρμογές για το Διαδίκτυο

Δομές Ακολουθίας- Επιλογής - Επανάληψης. Δομημένος Προγραμματισμός

Λειτουργικά Συστήματα

ΕΠΛ 003: ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΗΣ ΠΛΗΡΟΦΟΡΙΚΗΣ

Λειτουργικά. Τεχνολογικό Εκπαιδευτικό Ίδρυμα Δυτικής Μακεδονίας Σιώζιος Κων/νος - Πληροφορική Ι

2 ΟΥ και 7 ΟΥ ΚΕΦΑΛΑΙΟΥ

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Μερικές άλλες χρήσιμες εντολές

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΜΑΡΙΑ Σ. ΖΙΩΓΑ ΚΑΘΗΓΗΤΡΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

ΕΙΔΗ,ΤΕΧΝΙΚΕΣ ΚΑΙ ΠΕΡΙΒΑΛΛΟΝΤΑ ΠΡΟΓΡΑΜΜΑΤΙ- ΣΜΟΥ

Σχολικό Βιβλίο - Κεφάλαιο 7 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ PASCAL ΠΑΡΟΥΣΙΑΣΗ 13

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

8 FORTRAN 77/90/95/2003

A. Να γράψετε τον αριθμό της κάθε μιας από τις παρακάτω προτάσεις και δίπλα. το γράμμα Σ, εάν είναι σωστή, ή το γράμμα Λ, εάν είναι λανθασμένη.

Κανονικές εκφράσεις ή παραστάσεις (Regular Expressions) 3 ο Εργαστήριο ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ - ΕΡΓΑΣΤΗΡΙΟ

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

ΚΕΦΑΛΑΙΟ 5. Κύκλος Ζωής Εφαρμογών ΕΝΟΤΗΤΑ 2. Εφαρμογές Πληροφορικής. Διδακτικές ενότητες 5.1 Πρόβλημα και υπολογιστής 5.2 Ανάπτυξη εφαρμογών

Αναφορά (1/2) Μπορούμε να ορίσουμε μια άλλη, ισοδύναμη αλλά ίσως πιο σύντομη, ονομασία για ποσότητα (μεταβλητή, σταθερή, συνάρτηση, κλπ.

Visual Flowchart Γενικά

ΕΡΓΑΣΤΗΡΙΟ 3: Προγραμματιστικά Περιβάλλοντα και το Πρώτο Πρόγραμμα C

Λειτουργικά Συστήματα (Λ/Σ)

ΤΕΙ ΙΟΝΙΩΝ ΝΗΣΩΝ ΣΧΟΛΗ ΔΙΟΙΚΗΣΗΣ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ ΔΙΟΙΚΗΣΗΣ ΕΠΙΧΕΙΡΗΣΕΩΝ - ΕΙΣ

Διαγραφή Επιλέγετε Διαγραφή για να διαγράψετε μία ήδη υπάρχουσα διαδικασία εισαγωγής ASCII

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ Python. 1η Ομάδα Ασκήσεων

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Περιεχόμενα. Λίγα λόγια από το συγγραφέα... 7

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

Τι χρειάζεται ένας φοιτητής για τη σωστή παρακολούθηση και συμμετοχή στο μαθημα;

Τμήμα Οικιακής Οικονομίας και Οικολογίας. Οργάνωση Υπολογιστών

(Regular Expressions) ΤΕΙΘ-ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ: ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ ΙΙ/ ΧΕΙΜ

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 8 & 9 18/10/07

Εκφώνηση άσκησης. Η Κρεμάλα σαν παιχνίδι. Ανάλυση. Μέρος Α Αναφoρά, ανάλυση τακτικής. Υλοποίηση του παιχνιδιού «Κρεμάλα»

Η πρώτη παράμετρος είναι ένα αλφαριθμητικό μορφοποίησης

10. Με πόσους και ποιους τρόπους μπορεί να αναπαρασταθεί ένα πρόβλημα; 11. Περιγράψτε τα τρία στάδια αντιμετώπισης ενός προβλήματος.

ΕΡΓΑΣΤΗΡΙΟ 1: 1 Εισαγωγή, Χρήσιμες Εφαρμογές

ΜΕΡΙΚΑ ΣΤΟΙΧΕΙΑ ΓΙΑ ΤΙΣ ΓΛΩΣΣEΣ ΠPOΓPAMMATIΣMOY

Μικροεπεξεργαστές. Σημειώσεις Μαθήματος Υπεύθυνος: Δρ Άρης Παπακώστας,

Διαχείριση Βάσης Δεδομένων (dbadmin)

Πώς μπορούμε να δημιουργούμε γεωμετρικά σχέδια με τη Logo;

Kεφάλαιο 11 Λίστες και Ανάλυση Δεδομένων Kεφάλαιο 12 Εργαλεία ανάλυσης πιθανοτήτων Kεφάλαιο 13 Ανάλυση δεδομένων...

Βιωματικό εργαστήριο ηλεκτρονικών υπολογιστών. Οργάνωση εκπαιδευτικού υλικού με Η/Υ από δραστηριότητες στο Δημοτικό και στο Νηπιαγωγείο.

Άνοιγμα (και κλείσιμο) της εφαρμογής Εγγράφου Κειμένου

Διαδικτυακό Περιβάλλον Διαχείρισης Ασκήσεων Προγραμματισμού

Μεταβλητές τύπου χαρακτήρα

Κεφάλαιο 6 Υλοποίηση Γλωσσών Προγραμματισμού

TEC610 Δυναμικές Εφαρμογές Διαδικτύου (ΣΤ εξάμηνο)

ΚΕΦΑΛΑΙΟ 6. Περιβάλλοντα Ανάπτυξης Εφαρμογών. ΚΕΦΑΛΑΙΟ 6 Περιβάλλοντα Ανάπτυξης Εφαρμογών. Α Γενικού Λυκείου

UTECO ABEE ΒΙΟΜΗΧΑΝΙΚΟΣ & ΝΑΥΤΙΛΙΑΚΟΣ ΑΥΤΟΜΑΤΙΣΜΟΣ

Θεωρία Προγραμματισμού

Γ ΓΥΜΝΑΣΙΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ ΤΗ ΓΛΩΣΣΑ MicroWorlds Pro

- Εισαγωγή - Επίπεδα μνήμης - Ολοκληρωμένα κυκλώματα μνήμης - Συσκευασίες μνήμης προσωπικών υπολογιστών

ΕΡΓΑΣΤΗΡΙΟ 1: Εισαγωγή, Χρήσιμες Εφαρμογές

ΑΕΠΠ Ερωτήσεις θεωρίας

Λειτουργικά Συστήµατα

Εισαγωγή στην Αριθμητική Ανάλυση

Πρόλογος... xiii ΜΕΡΟΣ 1 1 Εισαγωγή στο Excel Βασικές λειτουργίες του Excel... 21

Στο εργαστήριο θα μελετηθούν: Διδάσκων: Γιώργος Χατζηπολλάς. Εργαστήριο 2: Εργαλεία Συστήματος UNIX. Ομάδες για παρουσίαση

Σχεδιάζοντας Εφαρμογές για το Διαδίκτυο

Microsoft Excel Κεφάλαιο 1. Εισαγωγή. Βιβλίο εργασίας

ΜΑΘΗΜΑ: ΕΙΑΓΩΓΗ ΣΑ ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ (UNIX) ΕΡΓΑΣΤΗΡΙΟ. 9o ΕΡΓΑΣΤΗΡΙΟ

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Η γλώσσα προγραμματισμού C

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

ΕΙΣΑΓΩΓΗ ΣΤΟΥΣ ΑΛΓΟΡΙΘΜΟΥΣ ΚΑΙ ΣΤΟΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

ΛΕΙΤΟΥΡΓΙΚΑ ΣΥΣΤΗΜΑΤΑ. Επισκόπηση Λ.Σ. Εργαστηριακές Ασκήσεις

Εγκατάσταση του Lazarus

Σκοπός. Εργαστήριο 6 Εντολές Επανάληψης

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ - ΓΛΩΣΣΑ

Χρησιμοποιείται για να αποφασίσει το πρόγραμμα αν θα κάνει κάτι σε ένα σημείο της εκτέλεσής του, εξετάζοντας αν ισχύει ή όχι μια συνθήκη.

Προγραμματισμός Διαχείρισης Συστημάτων Ι

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ. Στέφανος Ουγιάρογλου

Εισαγωγή. Διαλέξεις στο μάθημα: Μεταφραστές Γιώργος Μανής

ΗΥ101: Εισαγωγή στην Πληροφορική

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Άσκηση 1 (ανακοινώθηκε στις 20 Μαρτίου 2017, προθεσμία παράδοσης: 24 Απριλίου 2017, 12 τα μεσάνυχτα).

Transcript:

Τ.Ε.Ι ΚΑΒΑΛΑΣ ΣΧΟΛΗ: ΔΙΟΙΚΗΣΗ ΚΑΙ ΟΙΚΟΝΟΜΙΑΣ ΤΜΗΜΑ: ΔΙΑΧΕΙΡΙΣΗ ΠΛΗΡΟΦΟΡΙΩΝ ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ Σύγχρονες γλώσσες προγραμματισμού με δυνατότητες εκτέλ σης σε $ενϊρύη% περιβάλλον Εισηγητής: κοςστ. Παπαδημητρίου Σπουδαστής: Βασίλειος Μπακάλης Α.Ε.Μ.: 1429 ΚΑΒΑΛΑ 2010

/ / -τ r λ r r ^ r Σύγχρονες γλώσσες προγραμματισμού με δυνατότητες εκτέλεσης σε Scripting περιβάλλον - ι -

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

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ ΚΕΦΑΛΑΙΟ 1ο 1.1 Τι είναι μια γλώσσα προγραμματισμού;... 6 1.1.1 Κοινά χαρακτηριστηκά... 8 ΚΕΦΑΛΑΙΟ 2 ο 1.2 Περιοχές προβλήματος...11 1.2.1 Γλώσσες κελύφους (Εντολή)... 11 1.2.2 Επεξεργασία κειμένων και αποτελέσματα εκθέσεων...20 1.2.3 Μαθηματικά και στατιστικές... 25 1.2.4 Γλώσσες κόλλας και προγραμματισμός γενικού σκοπού...26 1.2.5 Γλώσσες επέκτασης... 34 ΚΕΦΑΛΑΙΟ 3 ο 1.3 Προγραμματισμός World Wide Web...38 1.3.1 Προγράμματα της CGI...39 1.3.2 Ενσωματωμένα από πλευράς προγράμματα... 40 1.3.3 Προγράμματα πλευράς πελάτη... 45 1.3.4 Java Applets... 46 1.3.5 XML και XMHTML...50 ΚΕΦΑΛΑΙΟ 4 ο 1.4 Καινοτόμα χαρακτηριστικά γνωρίσματα...60 1.4.1 Ονόματα και πεδία... 61 1.4.2 Χειρισμός συνόλου και σκεδίων...66 1.4.3 Αριθμιτικοί τύποι... 76 1.4.4 Προσανατολισμός Αντικειμένου...81 ΚΕΦΑΛΑΙΟ 5 ο 1.5 Συνοπτικές και τελικές παρατηρήσεις... 88 ΒΙΒΛΙΟΓΡΑΦΙΑ... 97-3 -

ΠΡΟΛΟΓΟΣ Οι παραδοσιακές γλώσσες προγραμματισμού προορίζονται πρώτιστα για την κατασκευή των ανεξάρτητων εφαρμογών: προγράμματα που δέχονται κάποιο είδος της εισαγωγής, τα χειρίζονται με κάποιο καλά κατανοητό τρόπο, και παράγουν το κατάλληλο αποτέλεσμα. Αλλά οι περισσότερες πραγματικές χρήσεις των υπολογιστών απαιτούν το συντονισμό πολλαπλών προγραμμάτων. Ένα μεγάλο θεσμικό σύστημα μισθοδοτικών καταστάσεων, παραδείγματος χάριν, πρέπει να επεξεργαστεί τα στοιχεία χρονικής υποβολής εκθέσεων από τους αναγνώστες καρτών, τα ανιχνευμένα έντυπα, και τη χειρωνακτική είσοδο (πληκτρολογίων), εκτελούν χιλιάδες ερωτήσεις βάσεων δεδομένων, επιβάλει τις εκατοντάδες των νομικών και θεσμικών κανόνων, δημιουργεί ένα εκτενές ίχνος χαρτιού για την τήρηση αρχείων, ελέγχει, προετοιμασία φορολογικών, τύπωση επιταγών πληρωμής και επικοινωνία με τους κεντρικούς υπολογιστές γύρω στον κόσμο για τη σε απευθείας σύνδεση άμεσης κατάθεσης, φορολογική παρακράτηση, συσσώρευση συντάξιμων, ιατρική ασφάλεια, και ούτω καθεξής. Αυτοί οι στόχοι είναι πιθανό να περιλάβουν τις δεκάδες ή τις εκατοντάδες των χωριστά εκτελέσιμων προγραμμάτων. Ο συντονισμός μεταξύ αυτών των προγραμμάτων θα απαιτήσει δοκιμές και παραδοχές, τους βρόχους, τις μεταβλητές και τους τύπους, τις υπορουτίνες και τα αυτοαφαιρούμενα είδη των λογικών εργαλείων που μια συμβατική γλώσσα παρέχει μέσα σε μια εφαρμογή. Σε μια πολύ μικρότερη κλίμακα, ένας γραφίστας ή ένας φωτορεπόρτερ μπορεί συνήθως να μεταφορτώσει τις εικόνες από μια ψηφιακή κάμερα να τις μετατρέψει σε μια αγαπημένη μορφή, να περιστρέψει τις εικόνες που γυρίστηκαν στον κάθετο προσανατολισμό, κάτω δείγματα αυτών να δημιουργήσουν εικονίδια αναζητήσημης έκδοσης, να τους συντάξει σε ευρετήριο κατά ημερομηνία, θέμα και ιστόγραμμο χρώματος, να τα κρατήσει εφεδρεία σε απόμακρο αρχείο και έπειτα να επανεκκινήσει την μνήμη της κάμερας. Η εκτέλεση αυτών των βημάτων με το χέρι είναι πιθανό να είναι και κουραστική και επιρρεπής σε λάθη. Σε παρόμοιο πνεύμα, η δημιουργία, μιας δυναμικής ιστοσελίδας μπορεί να απαιτήσει την επικύρωση και την έγκριση, τη συμβούλευση βάσεων δεδομένων, το χειρισμό εικόνας, τη απόμακρη επικοινωνία, και την ανάγνωση και το γράψιμο του κειμένου HTML. Όλα αυτά τα σενάρια προτείνουν μια ανάγκη για προγράμματα που συντονίζουν άλλα προγράμματα. Είναι φυσικά δυνατό να γραφτεί ο κώδικας συντονισμού στην Java, το C, ή κάποια άλλη συμβατική γλώσσα, αλλά είναι όχι πάντα εύκολο. Οι συμβατικές γλώσσες τείνουν να τονίσουν την αποδοτικότητα, τη συντηρησιμότητα, τη φορητότητα, και τη στατική ανίχνευση των λαθών. Τα συστήματα τύπων τους τείνουν να χτιστούν γύρω από τέτοιου επιπέδου hardware έννοιες όπως τους σταθερού μεγέθους ακέραιους αριθμούς, αιωρούμενου σημείου αριθμούς, χαρακτήρες, και σειρές. Σε αντίθεση οι γλώσσες προγραμματισμού τείνουν να τονίσουν την ευελιξία, τη γρήγορη ανάπτυξη, την τοπική προσαρμογή, και το δυναμικό (χρόνος εκτέλεσης) έλεγχο. Τα συστήματα τύπων τους, επιπλέον, τείνουν να αγκαλιάσουν τέτοιες υψηλού επιπέδου έννοιες όπως πίνακες, σχέδια, καταλόγους, και αρχεία. Οι γλώσσες προγραμματισμού γενικού σκοπού όπως το Perl και το Python καλούνται μερικές φορές γλώσσες κόλλας, επειδή είχαν ως αρχικό σκοπό να κολλήσουν τα υπάρχοντα προγράμματα να χτιστεί μαζί ένα μεγαλύτερο σύστημα. Με την αύξηση του World Wide Web, οι γλώσσες προγραμματισμού έχουν κερδίσει νέα διάκριση στην δημιουργία του δυναμικού περιεχομένου. Επίσης χρησιμοποιούνται ευρέως ως γλώσσες επέκτασης, οι οποίες επιτρέπουν στο χρήστη να προσαρμόσει ή να επεκτείνει τη λειτουργία των προγραμματιζόμενων εργαλείων. Εξετάζουμε την ιστορία και τη φύση του προγραμματισμού λεπτομερέστερα στην παράγραφο 1.1. - 4 -

Γυρίζουμε έπειτα στην παράγραφο 1.2 σε μερικές από τις περιοχές προβλήματος στις οποίες ο προγραμματισμός χρησιμοποιείται ευρέως. Αυτές περιλαμβάνουν την ερμηνεία εντολής (κέλυφος), την επεξεργασία κειμένων και την παραγωγή εκθέσεων, τα μαθηματικά και τις στατιστικές, το συντονισμό προγράμματος γενικού σκοπού, και διαμόρφωση και επέκταση. Στην παράγραφο 1.3 θεωρούμε διάφορες μορφές προγραμματισμού που χρησιμοποιούνται στο World Wide Web, συμπεριλαμβανομένων των προγραμμάτων της CGI, της επεξεργασίας από πλευρά παροχέα και την πλευρά του πελάτη των προγραμμάτων που ενσωματώνονται σε ιστοσελίδες, τα applets της Java, και XSLT. Τέλος, στην παράγραφο 1.4, εξετάζουμε μερικά από πιό ενδιαφέροντα γλωσσικά γνώρισμα, κοινά για πολλές γλώσσες προγραμματισμού, τα οποία τα διακρίνουν από τους παραδοσιακότερους επικρατόντες ξαδέρφους τους. Εξετάζουμε μερικώς την ονομασία, και τη δακτυλογράφηση τον χειρισμό σειράς και σχεδίων και υψηλού επιπέδου δομημένα στοιχεία. Δεν θα παράσχουμε μια λεπτομερή εισαγωγή σε οποιαδήποτε γλώσσα προγραμματισμού, αν και θα εξετάσουμε τα συγκεκριμένα παραδείγματα αρκετά.. Στο μεγαλύτερο μέρος αυτής της εργασίας, η έμφαση θα δοθεί από τις παρακάτω έννοιες. - 5 -

ΚΕΦΑΛΑΙΟ 1 1.1 Τι είναι μια γλώσσα προγραμματισμού; Οι σύγχρονες γλώσσες προγραμματισμού έχουν δύο κύρια σύνολα προγόνων. Σε ένα σύνολο είναι οι διερμηνείς ή τα κέλυφος εντολής της παραδοσιακής batch και του τερματικού (γραμμής εντολών) υπολογισμού. Στο άλλο σύνολο είναι διάφορα εργαλεία για την επεξεργασία κειμένων και το αποτέλεσμα εκθέσεων. Τα παραδείγματα στο πρώτο σύνολο περιλαμβάνουν το JCL της IBM, το διερμηνέα εντολής MS-DOS, και τη Unix sh και csh τις οικογένειες κελύφους. Τα παραδείγματα στο δεύτερο σύνολο περιλαμβάνουν RPG της IBM, και της Unix sed και awk. Από αυτούς εξελιγμένο Rexx, αναδομημένος εκτεταμένος εκτελεστής της IBM, που χρονολογεί από το 1979, και Perl, που επινοήθηκε αρχικά από τον Larry Wall προς το τέλος της δεκαετίας του '80 και τώρα της ευρύτατα χρησιμοποιημένης γλώσσας προγραμματισμού γενικού σκοπού. Άλλες γλώσσες γενικού προγραμματισμού περιλαμβάνουν Tcl ( γαργάλημα ), Python, το Ruby, VBScript (για τα παράθυρα) και AppleScript (για τη Mac). Με την αύξηση του World Wide Web στα τέλη της δεκαετίας του '90,το Perl υιοθετήθηκε ευρέως για τη δευτερεύουσα προγραμματισμού Ιστού κεντρικών υπολογιστών, στην οποία ένας κεντρικός υπολογιστής δικτύου εκτελεί ένα πρόγραμμα (στη μηχανή του κεντρικού υπολογιστή) να παραχθεί το περιεχόμενο μιας σελίδας. Ένας πρώτος ενθουσιώδης του προγραμματισμού Ιστού ήταν ο Rasmus Lerdorf, ο οποίος δημιούργησε μια συλλογή προγραμμάτων για την πρόσβαση διαδρομής στην προσωπική αρχική σελίδα του. Αρχικά γραπτά σε Perl αλλά σύντομα ξανασχεδιασμένα ως ολοκληρωμένη και ανεξάρτητη γλώσσα, αυτά τα προγράμματα εξελίχθηκαν στα PHP, τώρα η δημοφιλέστερη πλατφόρμα για τον υπολογιστής-δευτερεύουσα προγραμματισμού Ιστού. Οι ανταγωνιστές της PHP περιλαμβάνουν JSP (σελίδες κεντρικών υπολογιστών της Java) και, στις πλατφόρμες της Microsoft, VBScript. Για τον προγραμματισμό στον υπολογιστή πελατών, όλες οι σημαντικές μηχανές αναζήτησης εφαρμόζουν JavaScript, μια γλώσσα που αναπτύχθηκε από την εταιρία Netscape στα μέσα της δεκαετία του '90 και που τυποποιήθηκε από το ECMA (το ευρωπαϊκό σώμα προτύπων) το 1999 [ECM99]. Στο κλασικό έγγραφό του για το προγραμματισμός [Ous98], ο John Ousterhout, ο δημιουργός του Tcl, σημειώνει ότι οι γλώσσες προγραμματισμού υποθέτουν ότι μια συλλογή των χρήσιμων συστατικών υπάρχει ήδη σε άλλες γλώσσες. Προορίζονται όχι για το γράψιμο των εφαρμογών από την αρχή αλλά μάλλον για το συνδυασμό των συστατικών. - 6 -

ΣΧΕΔΙΑΣΜΟΣ & ΕΦΑΡΜΟΓΗ Προγραμματισμού στις πλατφόρμες της Microsoft Όπως σε διάφορες άλλες πτυχές του υπολογισμού, η Microsoft τείνει να στηριχθεί στην εσωτερικά αναπτυγμένη τεχνολογία στον τομέα των γλωσσών προγραμματισμού. Οι περισσότερες από τις αιτήσεις προγραμματισμού της είναι βασισμένες σε VBScript, μια διάλεκτος Visual Basic. Συγχρόνως, η Microsoft έχει αναπτύξει μια πολύ γενική διεπαφή προγραμματισμού ( πρόγραμμα παραθύρων) που εφαρμόζεται ομοιόμορφα από το λειτουργικό σύστημα (οικοδεσπότης προγραμμάτων παραθύρων [WSH]), τον κεντρικό υπολογιστή δικτύου (ενεργές σελίδες κεντρικών υπολογιστών [ASP]), και τη μηχανή αναζήτησης του Internet Explorer. Μια εφαρμογή προγραμμάτων παραθύρων JScript, η έκδοση της επιχείρησης JavaScript, έρχεται στις μηχανές παραθύρων, αλλά οι γλώσσες όπως Perl και Python μπορούν να εγκατασταθούν επίσης και να χρησιμοποιηθούν να οδηγήσουν την ίδια διεπαφή. Πολλές άλλες εφαρμογές της Microsoft, συμπεριλαμβανομένου του ολόκληρου πακέτου προγραμμάτων Office, χρησιμοποιούν VBScript ως γλώσσα επέκτασης, αλλά για αυτές το πλαίσιο εφαρμογής (Visual Basic για τις εφαρμογές [VBA]) δεν τις καθιστά εύχρηστες προς άλλες γλώσσες αντ' αυτού. Λαμβάνοντας υπόψη το μερίδιο της Microsoft στην αγορά υπολογισμού υπολογιστών γραφείου, το VBScript είναι μια από τις ευρύτατα χρησιμοποιημένες γλώσσες προγραμματισμού. Δεν χρησιμοποιείται σχεδόν ποτέ σε άλλες πλατφόρμες, εντούτοις, ενώ οι Perl, Tcl, Python, και PHP, και άλλα βλέπουν σημαντική χρήση στα Windows. Για tov προγραμματισμό από πλευράς παροχέα, το PHP υπερισχύει αυτήν την περίοδο: από το Φεβρουάριο του 2005, περίπου 69% των ιστοχώρων 59 εκατομμυρίων δικτυακών τόπων που ερευνήθηκαν από την Netcraft LTD έτρεχαν τον ανοικτής πηγής κεντρικό υπολογιστή δικτύου Apache, και οι περισσότεροι από αυτούς, με ενεργό περιεχόμενο, χρησιμοποιούσαν το PHP. Ο κεντρικός υπολογιστής πληροφοριών Διαδικτύου της Microsoft (IIS) ήταν δεύτερος μετά το Apache, με 21% των περιοχών, και πολλές από εκείνες εγκατέστησαν το PHP επίσης από πλευράς πελατειακού προγραμματισμού, όπου το Internet Explorer ελέγχει περίπου 70% της αγοράς μηχανών αναζήτησης, οι περισσότεροι διαχειριστές ιστοχώρου χρειάζονται το περιεχόμενό τους να είναι ορατό στο άλλο 30%. Ο Explorer υποστηρίζει JavaScript (JScript), αλλά άλλες μηχανές αναζήτησης δεν υποστηρίζουν VBScript. Ο Ousterhout προβλέπει το μέλλον στο οποίο οι προγραμματιστές στηρίζονται όλο και περισσότερο στις γλώσσες προγραμματισμού για την κορυφαία δομή των συστημάτων τους, όπου η σαφήνεια, η ικανότητα επαναχρησιμοποίησης, και η ευκολία της ανάπτυξης είναι κρίσιμες. Οι παραδοσιακές γλώσσες συστημάτων όπως C, C++, ή Java, υποστηρίζει, θα χρησιμοποιηθούν για τα ανεξάρτητα, επαναχρησιμοποιήσιμα τμήματα συστημάτων, τα οποία υπογραμμίζουν τους σύνθε υς αλγορίθμους ή την ταχύτητα εκτέλεσης. Κατά γενικό κανόνα του αντίχειρα, προτείνει ότι ο κώδικας μπορεί να αναπτυχθεί 5 έως 10 φορές γρηγορότερα σε μια γλώσσα προγραμματισμού αλλά θα τρέξει 10 έως 20 χρόνους γρηγορότερα σε μια παραδοσιακή γλώσσα συστημάτων. Μερικοί συντάκτες διατηρούν τον όρο προγραμματισμού για τις γλώσσες κόλλας που χρησιμοποιούνται να συντονίσουν τα πολλαπλάσια προγράμματα. Στην κοινή χρήση, εντούτοις, ο προγραμματισμός είναι μια ευρύτερη και ασαφέστερη έννοια. Περιλαμβάνει σαφώς τον προγραμματισμό Ιστού. Για τους περισσότερους συντάκτες περιλαμβάνει επίσης τις γλώσσες επέκτασης. - 7 -

Πολλοί αναγνώστες θα εξοικειωθούν με τις Visual Basic μακροεντολές του Microsoft Office και των σχετικών εφαρμογών. Άλλοι μπορούν να εξοικειωθούν με την ψευδοβασισμένη γλώσσα επέκτασης του συντάκτη κειμένων emacs. Διάφορες γλώσσες, συμπεριλαμβανομένων των Tcl, Rexx, Python, και των διαλέκτων Guile και Elc του Scheme, σχεδιάζουν τις εφαρμογές κατά τέτοιο τρόπο ώστε μπορούν να ενσωματωθούν σε ένα μεγαλύτερο πρόγραμμα και να χρησιμοποιηθούν να επεκτείνουν τα χαρακτηριστικά γνωρίσματά τους. Η επέκταση ήταν στην πραγματικότητα ο αρχικός σκοπός του Tcl. Σε παρόμοιο πνεύμα, διάφορες ευρέως χρησιμοποιημένες εμπορικές εφαρμογές παρέχουν τις ιδιόκτητες γλώσσες επέκτασής τους. Για τον γραφικό προγραμματισμό (GUI) ενδιάμεσων με τον χρήστη, το κουτί εργαλείων Tk, που σχεδιάζεται αρχικά για τη χρήση με Tcl, έχει ενσωματωθεί σε διάφορες γλώσσες προγραμματισμού, συμπεριλαμβανομένου Perl, Python, και του Ruby. Κάποιος μπορεί να δει επίσης το XSLT (εκτατοί γλωσσικοί μετασχηματισμοί stylesheet) ως γλώσσα προγραμματισμού, αν και κάπως διαφορετική από τις άλλες που εξετάζονται σε αυτό το κεφάλαιο. Το XSLT είναι μέλος της αυξανόμενης οικογένειας (γλώσσα επεκτάσιμης σήμανσης) των εργαλείων XML. Το εξετάζουμε περαιτέρω στην παράγραφο της 1.3.5. 1.1.1 Κοινά χαρακτηριστικά Ενώ είναι δύσκολο να καθοριστούν ακριβώς οι γλώσσες προγραμματισμού, υπάρχουν διάφορα χαρακτηριστικά που τείνουν να έχουν από κοινού. Και ειδική και διαλογική χρήση. Μερικές γλώσσες προγραμματισμού (ειδικότερα το Perl) χρησιμοποιούν έναν επιτόπιο μεταγλωττιστή που επιμένει στην ανάγνωση ολόκληρου του προγράμματος πηγής προτού παραγάγει το οποιοδήποτε αποτέλεσμα. Οι περισσότερες άλλες γλώσσες, εντούτοις, είναι πρόθυμες να συντάξουν ή να ερμηνεύσουν την εισαγωγή τους, γραμμή προς γραμμή. Τα Rexx, Python, Tcl, Guile, το Ruby και (με ένα βραχύ πρόγραμμα αρωγών) θα δεχτούν όλες τις εντολές από το πληκτρολόγιο. Οικονομία της έκφρασης. Να υποστηρίξουν τη γρήγορη ανάπτυξη και τη διαλογική χρήση, οι γλώσσες προγραμματισμού τείνουν να απαιτήσουν ένα ελάχιστο boilerplate. Μερικοί κάνουν τη βαριά χρήση της στίξης και των πολύ κοντών προσδιοριστικών (το Perl είναι πασίγνωστο για αυτό), ενώ άλλοι (π.χ., Rexx, Tcl, και AppleScript) τείνουν να είναι περισσότερο όπως οι Άγγλοι, με πολλά μέρη τους σαν λέξεις και όχι πολλά σημεία στίξης. Όλη η προσπάθεια γίνεται να αποφευχθούν οι εκτενείς δηλώσεις και η κορυφαία δομή κοινή για τις συμβατικές γλώσσες. Όπου ένα τετριμμένο πρόγραμμα μοιάζει με αυτό στην Java: ΠΑΡΑΔΕΙΓΜΑ 1.1. Τετριμμένα προγράμματα στις συμβατικές και γλώσσες προγραμματισμού. class Hello { public static void main(string[] args) { System.out.println("Hello, world!"); } } και σαν αυτό στην Ada: - 8 -

with ada.text_io; use ada.text_io; procedure hello is begin put_line("hello, world!"); end hello; στις Perl, Python, η Ruby είναι απλό: print "Hello, world!\n" ΣΧΕΔΑΣΜΟΣ & ΕΦΑΡΜΟΓΗ Σύνταξη των ερμηνευμένων γλωσσών Αρκετές φορές σε αυτό το κεφάλαιο θα κάνουμε να παραπεμφθεί στον μεταγλωττιστή για μια γλώσσα προγραμματισμού. Όπως ότι είδαμε στα παραδείγματα 1.6 και 1.7, οι διερμηνείς δεν εργάζονται σχεδόν ποτέ με τον κωδικό πηγής, ένας προηγούμενος μεταφραστής αντικαθιστά αρχικά εκείνη την πηγή με κάποιο είδος ενδιάμεσης μορφής. Για τις περισσότερες εφαρμογές οι περισσότερες από τις γλώσσες που περιγράφονται σε αυτό το κεφάλαιο, είναι αρκετά σύνθετες στο μπροστινό τους μέρος να αξίζουν το όνομα μεταγλωττιστής. Οι ενδιάμεσες μορφές είναι χαρακτηριστικές αντιπροσωπεύσεις του κώδικα ψηφιολέξεων ενθυμίζουσες εκείνες της Java. ΣΧΕΔΑΣΜΟΣ & ΕΦΑΡΜΟΓΗ Κανονικές εφαρμογές Επειδή εφαρμόζονται με τους διερμηνείς, οι γλώσσες προγραμματισμού, τείνουν να είναι εύκολες στη μεταφορά από το ένα μηχάνημα στο άλλο, ουσιαστικά ευκολότερο από τους μεταγλωττιστές για τους οποίους κάποιος πρέπει να γράψει μια νέα γεννήτρια κώδικα. Λαμβάνοντας υπόψη έναν εγγενή μεταγλωττιστή για τη γλώσσα στην οποία ο διερμηνέας γράφεται, το μόνο δύσκολο μέρος (και μπορεί πράγματι να είναι δύσκολο) είναι να εφαρμοστούν οποιεσδήποτε απαραίτητες τροποποιήσεις στο μέρος του διερμηνέα που παρέχει τη διεπαφή στο λειτουργικό σύστημα. Συγχρόνως, η ευκολία μεταφοράς ενός διερμηνέα σημαίνει ότι διάφορες γλώσσες προγραμματισμού, συμπεριλαμβανομένων των Perl, Python, Tcl, και του Ruby, έχουν μια ενιαία ευρέως χρησιμοποιημένη εφαρμογή, η οποία χρησιμεύει ως ο de facto γλωσσικός καθορισμός. Διαβάζοντας ένα βιβλίο σε Perl, είναι δύσκολο να ειπωθεί πώς ένα λεπτό πρόγραμμα θα συμπεριφερθεί. Σε περίπτωση αμφιβολίας, κάποιος μπορεί να πρέπει να το δοκιμάσει. Το Rexx και JavaScript εμφανίζονται να είναι τα μοναδικά μεταξύ των ευρέως χρησιμοποιημένων γλωσσών προγραμματισμού που έχουν έναν επίσημο καθορισμό που κωδικοποιείται από ένα σώμα διεθνών προτύπων και έναν ανεξάρτητο από οποιαδήποτε εφαρμογή. (Τα sed, awk, και sh έχουν τυποποιηθεί επίσης από POSIX [Int03b], αλλά κανένας από αυτούς δεν έχει την πολυπλοκότητα των Perl, Python, Tcl, ή του Ruby.) - 9 -

Έλλειψη δηλώσεων απλοί κανόνες πεδίου. Οι περισσότερες γλώσσες προγραμματισμού διανέμουν με τις δηλώσεις, και παρέχουν απλούς κανόνες να κυβερνηθεί το πεδίο των ονομάτων. Σε μερικές γλώσσες (π.χ., Perl) όλα είναι σφαιρικά εξ ορισμού, οι προαιρετικές δηλώσεις μπορούν να χρησιμοποιηθούν να περιορίσουν μια μεταβλητή σε ένα τοποθετημένο πεδίο. Σε άλλες γλώσσες (π.χ., PHP και Tcl), όλα είναι τοπικά εξ ορισμού σφαιρικά πρέπει να εισαχθούν ρητά. Το Python υιοθετεί τον ενδιαφέροντα κανόνα ότι κάθε μεταβλητή που ορίζει μια αξία είναι τοπική στο φραγμό στον οποίο η ανάθεση εμφανίζεται. Η ειδική σύνταξη απαιτείται να ορίσει μια μεταβλητή σε ένα περιβάλλον πεδίο. Εύκαμπτη δυναμική δακτυλογράφηση. Για την τήρηση των ελλείψεων δηλώσεων, οι περισσότερες γλώσσες προγραμματισμού δακτυλογραφούνται δυναμικά. Σε μερικές (π.χ., PHP, Python, Ruby, και σχέδιο), ο τύπος μιας μεταβλητής ελέγχεται αμέσως πριν από τη χρήση. Σε άλλες (π.χ. Rexx, Perl, και Tcl ), μια μεταβλητή θα ερμηνευθεί διαφορετικά στα διαφορετικά πλαίσια. Παραδείγματος χάριν στο Perl $a = "4"; print $a. 3. "\n"; print $a + 3. "\n"; #. is concatenation # + is addition θα εκτυπώσει 43 7 ΠΑΡΑΔΕΙΓΜΑ 1.2. Εξαναγκασμός προγράμματος σε Perl Αυτή η βασισμένη στα συμφραζόμενα ερμηνεία είναι παρόμοια με τον εξαναγκασμό, εκτός από το ότι δεν υπάρχει απαραιτήτως μια έννοια του φυσικού τύπου από τον οποίο ένα objectmust μετατρέπεται οι διάφορες πιθανές ερμηνείες μπορούν όλες να είναι εξίσου φυσικές. Θα έχουμε περισσότερους που λένε για το πλαίσιο σε Perl στην παράγραφο της 1.4.3. Εύκολη πρόσβαση σε άλλα προγράμματα. Οι περισσότερες γλώσσες προγραμματισμού παρέχουν έναν τρόπο να ζητηθεί από το ελλοχεύον λειτουργικό σύστημα να τρέξει ένα άλλο πρόγραμμα, ή να εκτελέσει κάποια λειτουργία άμεσα. Στις γλώσσες προγραμματισμού, εντούτοις, αυτά τα αιτήματα είναι πιο θεμελιώδη, και έχουν αμεσότερη υποστήριξη. Το Perl, είναι ένα, παρέχει καλά πάνω από 100 ενσωματωμένες εντολές που έχουν πρόσβαση στις λειτουργίες λειτουργικών συστημάτων για την εισαγωγή και το αποτέλεσμα, το χειρισμό αρχείων και καταλόγου, τη διαχείριση διαδικασιών, την πρόσβαση βάσεων δεδομένων, τις υποδοχές, την επικοινωνία εσωτερικής διεργασίας και το συγχρονισμό, την προστασία και την έγκριση, το ρολόι χρόνοημέρας, και την επικοινωνία δικτύων. Αυτές οι ενσωματωμένες εντολές είναι γενικά κομμάτι ευκολότερο να χρησιμοποιηθούν από τις αντίστοιχες κλήσεις βιβλιοθηκών στις γλώσσες όπως το C. Περίπλοκος χειρισμός ταιριάσματος σχεδίων και σειράς. Συνεχίζοντας με το κληροδότημα επεξεργασίας κειμένου και παραγωγής αναφορών και να διευκολύνουν το χειρισμό της κειμενικών εισαγωγής και του αποτελέσματος για τα εξωτερικά προγράμματα, οι γλώσσες προγραμματισμού τείνουν να έχουν εξαιρετικά πλούσιες λειτουργίες για το ταίριασμα σχεδίων, την αναζήτηση, και το χειρισμό σειράς. Χαρακτηριστικά αυτές είναι βασισμένες στις εκτεταμένες κανονικές εκφράσεις. Συζητάμε αυτές περαιτέρω στην παράγραφο της 1.4.2. - 10 -

Υψηλού επιπέδου τύποι στοιχείων. Οι υψηλού επιπέδου τύποι στοιχείων όπως τα σύνολα, τις τσάντες, τα λεξικά, τους καταλόγους και tuples είναι όλο και περισσότερο κοινοί στις τυποποιημένες συσκευασίες βιβλιοθηκών των συμβατικών γλωσσών προγραμματισμού. Μερικές γλώσσες (ειδικότερα C++) επιτρέπουν στους χρήστες να επαναπροσδιορίσουν τους τυποποιημένους χειριστές επενθημάτων να καταστήσουν αυτούς τους τύπους τόσο εύχρηστους όσο οι πιο πρωτόγονοι, υλικοκεντρικοί τύποι. Οι γλώσσες προγραμματισμού πηγαίνουν ένα βήμα περαιτέρω με την οικοδόμηση των υψηλού επιπέδου τύπων, στη σύνταξη και τη σημασιολογία της ίδιας της γλώσσας. Στις περισσότερες γλώσσες προγραμματισμού, παραδείγματος χάριν, είναι κοινό να υπάρχει μια σειρά που συντάσσεται από τις σειρές χαρακτήρα, με μια ελλοχεύουσα εφαρμογή βασισμένη σε πίνακες hash. Η αποθήκευση είναι αμετάβλητα απορρίμματα συλλεχθέντα. Ένα μεγάλο μέρος της ραγδαίας αλλαγής στις γλώσσες προγραμματισμού σήμερα εμφανίζεται στις γλώσσες προγραμματισμού. Αυτό μπορεί να αποδοθεί σε διάφορες αιτίες, συμπεριλαμβανομένης της συνεχούς αύξησης του Ιστού, του δυναμισμού της κοινότητας ανοικτής πηγής, και της συγκριτικά χαμηλής επένδυσης που απαιτείται να δημιουργήσει μια νέα γλώσσα προγραμματισμού. Όπου μια συνταγμένη, βιομηχανική ποιοτική γλώσσα όπως την Java ή C# απαιτεί μια πολυετή επένδυση από μια πολύ μεγάλης ομάδας προγραμματισμού, ένας μόνο ταλαντούχος σχεδιαστής, που εργάζεται μόνος, μπορεί να δημιουργήσει μια χρησιμοποιήσιμη εφαρμογή μιας νέας γλώσσας προγραμματισμού μόνο σε ένα ή δύο έτη. Οφειλόμενες εν μέρει σε αυτήν την γρήγορη αλλαγή, οι νεότερες γλώσσες προγραμματισμού ήταν σε θέση να ενσωματώσουν μερικές από τις πιο καινοτόμες έννοιες στο γλωσσικό σχέδιο. Το Ruby, παραδείγματος χάριν, έχει ένα ομοιόμορφο πρότυπο αντικειμένου (σαν Smalltalk), τα αληθινά iterators (όπως Clu), τις φέτες σειράς (όπως το FORTRAN 90), το δομημένο χειρισμό εξαίρεσης, τη πολλαπλή ανάθεση, και την αντανάκλαση. Το Python παρέχει επίσης αρκετά από αυτά τα χαρακτηριστικά γνωρίσματα, μαζί με τις ανώνυμες πρώτης τάξεως λειτουργίες, όπως τις κατανοήσεις καταλόγων Haskell. 1.2 Περιοχές προβλήματος ΚΕΦΑΛΑΙΟ 2 Μερικές γλώσσες γενικού σκοπού -Scheme και Visual Basic ιδιαιτέρως- χρησιμοποιούνται ευρέως για τον προγραμματισμό. Αντιθέτως, μερικές γλώσσες προγραμματισμού, συμπεριλαμβανομένου των Perl, Python, και του Ruby, προορίζονται από τους σχεδιαστές τους για χρήση γενικού σκοπού, με χαρακτηριστικά γνωρίσματα που προορίζονται να υποστηρίξουν ευρύτερο προγραμματισμό : ενότητες, χωριστή σύνταξη, αντανάκλαση, περιβάλλοντα ανάπτυξης προγράμματος, και ούτω καθεξής. Ως επί το πλείστον, οι γλώσσες προγραμματισμού τείνουν να δουν την κύρια χρήση τους στις καθορισμένες με σαφήνεια περιοχές προβλήματος. Εξετάζουμε μερικές από αυτούς στις ακόλουθες υποενότητες. 1.2.1 Γλώσσες Κελύφους (Εντολή) Στις ημέρες της διάτρητης κάρτας υπολογισμού, οι απλές γλώσσες εντολής επέτρεπαν στο χρήστη να πρόγραμματίσει την επεξεργασία μιας στίβας καρτών. Μια κάρτα ελέγχου στην αρχή της στίβας, παραδείγματος χάριν, έδειχνε ότι οι επερχόμενες κάρτες αντιπροσώπευσαν ένα πρόγραμμα που συντάσσεται, ή ίσως μια συμβολική γλώσσα (Assembly) για τον ίδιο τον μεταγλωττιστή, ή εισαγωγή - 11 -

για ένα πρόγραμμα που συντάχθηκε ήδη, αποθηκεύτηκε στον δίσκο. Μια κάρτα ελέγχου που ενσωματώθηκε αργότερα στη στίβα, να εξετάσει τη θέση εξόδων του πρόσφατα εκτελεσμένου προγράμματος και να επιλέξει τι να κάνει έπειτα, βάσιζεται στο εάν εκείνο το πρόγραμμα ολοκληρώθηκε επιτυχώς. Λαμβάνοντας υπόψη τη γραμμική φύση μιας στίβας καρτών, εντούτοις (κάποιος δεν μπορεί σε γενική εφεδρία), οι γλώσσες εντολής για την επεξεργασία κατά δεσμίδες τείνουν να μην είναι πολύ περίπλοκες. Το JCL, παραδείγματος χάριν, δεν έχει καμία δομή επανάληψης Με την ανάπτυξη της διαλογικής κατανομής χρόνου στη δεκαετία του '60 αρχές της δεκαετίας του '70, οι γλώσσες εντολής έγιναν περιπλοκότερες. Ο Louis Pouzin έγραψε έναν απλό διερμηνέα εντολής για CTSS, το Συμβατό Σύστημα Κατανομής Χρόνου στο MIT, το 1963 και το 1964. Όταν η εργασία άρχισε στο εφαλτήριο σύστημα Multics το 1964,ο Pouzin σκιαγράφησε το σχέδιο μιας εκτεταμένης γλώσσας εντολής, με την αναφορά και την των μηχανισμών προσπέλασης δηλώσεων, για τους οποίους έπλασε τον όρο κέλυφος. Η επόμενη εφαρμογή που χρησιμεύει ως η έμπνευση για τον Ken Thompson στο σχέδιο του αρχικού κελύφους της Unix το 1973. Στα μέσα της δεκαετίας του '70 ο Stephen Bourne και ο John Mashey επέκτειναν ξεχωριστά το κέλυφος Thompson με τη ροή ελέγχου και τις μεταβλητές. Το σχέδιο του Bourne υιοθετήθηκε ως πρότυπο της Unix, που παίρνουν τη θέση (και το όνομα) του κελύφους Thompson, sh. Προς το τέλος της δεκαετίας του '70 ο Bill Joy ανέπτυξε το αποκαλούμενο κέλυφος C (csh), εμπνευσμένος τουλάχιστον εν μέρει με τη σύνταξη Mashey και την εισαγωγή των σημαντικών αυξήσεων για τη διαλογική χρήση, συμπεριλαμβανομένης της ιστορίας, τα ψευδώνυμα, και τον έλεγχο εργασίας. Η έκδοση tcsh του csh προσθέτει συντάκτη γραμμών εντολών και την ολοκλήρωση εντολής. Ο David Korn ενσωμάτωσε αυτούς τους μηχανισμούς σε έναν άμεσο απόγονο του κελύφους Bourne, ksh, το οποίο είναι πολύ παρόμοιο με το τυποποιημένο κέλυφος POSIX [Int03b]. Το δημοφιλές πάλι κέλυφος Bourne, bash, είναι μια ανοικτή έκδοση πηγής ksh. Ενώ το tcsh είναι ακόμα δημοφιλές σε μερικά τέταρτα, τα ksh/bash/posix SH είναι ουσιαστικά καλύτερα για το γράψιμο των προγραμμάτων κελύφους και συγκρίσιμα για τη διαλογική χρήση. Εκτός από τα χαρακτηριστικά γνωρίσματα που σχεδιάζονται για τη διαλογική χρήση, που δεν θα εξετάσουμε περαιτέρω εδώ, οι γλώσσες κελύφους παρέχουν έναν πλούτο μηχανισμών για τον χειρισμό, τα ονόματα αρχείων, τα επιχειρήματα, και τις εντολές, και να κολλήσουν μαζί με άλλα προγράμματα. Τα περισσότερα από αυτά τα χαρακτηριστικά γνωρίσματα διατηρούνται από τις γενικότερες γλώσσες προγραμματισμού. Εξετάζουμε μερικές από αύτες εδώ, χρησιμοποιώντας τη σύνταξη bash. Η συζήτηση αναγκαστικά απλοποιεί βαρέως τα πλήρη στοιχεία που μπορούν να βρεθούν στη σελίδα bash man, ή στις διάφορες απευθείας οδηγίες σύνδεσης. Όνομα αρχείου και μεταβλητή επέκταση Οι περισσότεροι χρήστες ενός κελύφους της Unix εξοικειώνονται με την επέκταση μπαλαντέρ των ονομάτων αρχείων. Η ακόλουθη εντολή θα απαριθμήσει όλα τα αρχεία στον τρέχοντα κατάλογο των οποίων τα ονόματα τελειώνουν σε.pdf. ΠΑΡΑΔΕΙΓΜΑ 1.3. Μπαλαντέρ και globbing ls *.pdf - 12 -

Το κέλυφος επεκτείνει το σχέδιο *.pdf σε έναν κατάλογο όλων των ονομάτων που ταιριάζουν. Εάν υπάρχουν τρεις από τους (πείτε fig1.pdf, fig2.pdf, και fig3.pdf), το αποτέλεσμα είναι ισοδύναμο με ls fig1.pdf fig2.pdf fig3.pdf Η επέκταση ονομάτων αρχείου καλείται μερικές φορές globbing, μετά από την αρχική εντολή glob που την εφάρμοσε η Unix. Εκτός από τους μπαλαντέρ *, κάποιος μπορεί συνήθως να διευκρινίσει ότι αδιαφορώ ή εναλλακτικά χαρακτήρες ή υποσειρές. Το σχέδιο fig?.pdf θα ταιριάξει με (επεκταθεί σε) οποιοδήποτε αρχείο με έναν μονό χαρακτήρα μεταξύ τουg και της τελείας. Το σχέδιο fig?.pdf [0 9] θα απαιτήσει εκείνο τον χαρακτήρα ναείναι ένα ψηφίο. Το σχέδιο fig3. {eps, pdf} θα ταιριάξει και με fig3.eps και fig3.pdf. Η επέκταση ονομάτων αρχείου είναι ιδιαίτερα χρήσιμη στους βρόχους. Τέτοιοι βρόχοι μπορούν να δακτυλογραφηθούν άμεσα από το πληκτρολόγιο, ή να ενσωματωθούν στα προγράμματα προοριζόμενα για την πιό πρόσφατη εκτέλεση. Υποθέστε, παραδείγματος χάριν, ότι επιθυμούμε να δημιουργήσουμε τις εκδόσεις PDF όλων των EPS αριθμών μας: ΠΑΡΑΔΕΙΓΜΑ 1.4. Για τους βρόχους στο κέλυφος for fig in *.eps do ps2pdf $fig done Η δομή for κανονίζει για την μεταβλητή του κελύφους fig να αναλάβει τα ονόματα στην επέκταση *.eps, ένα κάθε φορά, στις διαδοχικές επαναλήψεις του βρόχου. Το σημάδι δολαρίων στη γραμμή 3 αναγκάζει την αξία του fig να επεκταθεί στην εντολή ps2pdf προτού να εκτελεσθεί. (Κατά τρόπο ενδιαφέροντα, ps2pdf είναι το ίδιο ένα πρόγραμμα κελύφους που καλεί το διερμηνέα PostScript gs.) Τα προαιρετικά στηρίγματα μπορούν να χρησιμοποιηθούν να χωρίσουν ένα μεταβλητό όνομα από την ακολουθία των χαρακτήρων, όπως σε $ CP $foo {foo} _backup. Οι πολλαπλάσιες εντολές μπορούν να εισαχθούν σε μια ενιαία γραμμή εάν χωρίζονται από τις άνω τελείες. Ο ακόλουθος, παραδείγματος χάριν, είναι ισοδύναμος με το βρόχο στο προηγούμενο παράδειγμα. ΠΑΡΑΔΕΙΓΜΑ 1.5. Ολόκληρος ένας βρόχος σε μια γραμμή for fig in *.eps; do ps2pdf $fig; done Δοκιμές, ερωτήσεις, και όροι Ο βρόχος του προηγούμενου παραδείγματος θα εκτελέσει ps2pdf για κάθε EPS αρχείο στον τρέχοντα κατάλογο. Υποθέστε, εντούτοις, ότι έχουμε ήδη μερικά αρχεία PDF, και μόνο θέλουμε να δημιουργήσουμε αυτα που λείπουν. for fig in *.eps do target=${fig%.eps}.pdf if [ $fig -nt $target ] then - 13 -

ps2pdf $fig fi done ΠΑΡΑΔΕΙΓΜΑ 1.6. Υπό όρους δοκιμές στο κέλυφος Η τρίτη γραμμή αυτού του προγράμματος είναι μια μεταβλητή ανάθεση. Η έκφραση ${fig%.eps} μέσα στη δεξιά πλευρά επεκτείνει την αξία του fig με οποιοδήποτε ακολουθούμενο.eps να αφαιρείται. Οι παρόμοιες ειδικές επεκτάσεις μπορούν να χρησιμοποιηθούν να εξετάσουν ή να τροποποιήσουν την αξία μιάς μεταβλητής σε πολλούς διαφορετικούς τρόπους. Τις τετράγωνες αγκύλες στη γραμμή τέσσερα οριοθετούν μια υπό όρους δοκιμή. O χειριστής - nt ελέγχει να δει εάν το αρχείο που ονομάζεται από τον αριστερό τελεστή του είναι νεώτερο από το αρχείο που ονομάζεται από το δεξιό τελεστή του (ή εάν ο αριστερός τελεστής υπάρχει αλλά ο δεξιός όχι). Οι παρόμοιοι χειριστές ερώτησης αρχείων μπορούν να χρησιμοποιηθούν να ελέγξουν πολλές άλλες ιδιότητες των αρχείων. Οι πρόσθετοι χειριστές μπορούν να χρησιμοποιηθούν για τις συγκρίσεις αριθμητικής ή σειράς. 4 Το PostScript είναι μια γλώσσα προγραμματισμού που αναπτύχθηκε από την Adobe Systems, ΙΝΟ.για την περιγραφή των εικόνων και των εγγράφων (την εξετάζουμε πάλι στην πλαϊνή μπάρα ). Τοποθετημένο σε κάψα PostScript (EPS) είναι μια περιορισμένη μορφή PostScript προοριζόμενη για τους αριθμούς που πρόκειται να ενσωματωθούν σε άλλα έγγραφα. Η φορητή μορφή εγγράφου (PDF, επίσης από την Adobe) είναι μια ανεξάρτητη μορφή αρχείου που συνδυάζει ένα υποσύνολο PostScript με τους μηχανισμούς ενσωμάτωσης και συμπίεσης γραμματοσειρών. Είναι αυστηρά λιγότερο ισχυρό από το PostScript από μια υπολογιστική προοπτική, αλλά πιό φορητό, και γρηγορότερο και ευκολότερο να αποδώσει. Δίαυλοι και επαναπροσανατολισμός ΠΑΡΑΔΕΙΓΜΑ 1.7. Μια από τις κύριες καινοτομίες της Unix ήταν η δυνατότητα να αλυσοδεθούν οι εντολές μαζί, διοχετεύοντας με σωλήνες το αποτέλεσμα της μιας στην εισαγωγή των επόμενων. Όπως τα περισσότερα κελύφη, bash χρησιμοποιεί τον κάθετο ςχαρακτήρα φραγμών (I) ναδείξει έναν δίαυλο. Ναμετρήσουμε τον αριθμό αριθμών σωλήνων στον κατάλογό μας, χωρίς διάκριση μεταξύ των εκδόσεων EPS και PDF, θα δακτυλογραφήσουμε for fig in *; do echo ${fig%.*}; done Isort -u Iwc -l Εδώ η πρώτη εντολή, βρόχου for, τυπώνει τα ονόματα όλων των αρχείων με τις επεκτάσεις (σημειοεπιθηματικές ) να έχουν αφαιρεθεί. Η εντολή echo μέσα στο βρόχο τυπώνει απλά τα επιχειρήματά της. Η εντολή sort-u μετά από το βρόχο αφαιρεί τα αντίγραφα, και η εντολή wc -l μετρά τις γραμμές. Όπως τα περισσότερα κελύφη, η bash επίσης επιτρέπει στο αποτέλεσμα να κατευθυνθεί σε ένα αρχείο, ή την εισαγωγή που διαβάζεται από ένα αρχείο. Να δημιουργήσουμε έναν κατάλογο αριθμών, θα δακτυλογραφήσουμε for fig in *; do echo ${fig%.*}; done Isort -u > all_figs ΠΑΡΑΔΕΙΓΜΑ 1.8. Επαναπροσανατολισμός αποτέλεσματος - 14 -

ΣΧΕΔΑΣΜΟΣ & ΕΦΑΡΜΟΓΗ Ενσωματωμένες εντολές στο κέλυφος Οι εντολές στο κέλυφος λαμβάνουν γενικά τη μορφή μιας ακολουθίας λέξεων, η πρώτη της οποίας είναι το όνομα της εντολής. Οι περισσότερες εντολές είναι εκτελέσιμα προγράμματα, που βρίσκονται στους καταλόγους για την πορεία αναζήτησης του κελύφους. Ένας μεγάλος αριθμός, εντούτοις (περίπου 50 στο bash) είναι εντολές ενσωματωμένες, που το κέλυφος αναγνωρίζει και εκτελεί το ίδιο, παρά την έναρξη ενός εξωτερικού προγράμματος. Κατά τρόπο ενδιαφέροντα, διάφορες εντολές που είναι διαθέσιμες ως χωριστά προγράμματα αναπαράγονται ως ενσωματωμένες, είτε χάριν της αποδοτικότητας είτε να παρέχουν την πρόσθετη σημασιολογία. Οι υπό όρους δοκιμές, παραδείγματος χάριν, υποστηρίχθηκαν αρχικά από την εξωτερική εντολή δοκιμής (για την οποία οι τετράγωνες αγκύλες είναι συντακτική ζάχαρη), αλλά αυτές εμφανίζονται αρκετά συχνά στα προγράμματα που η ταχύτητα εκτέλεσης βελτιώθηκε σημαντικά όταν προστέθηκε μια ενσωματωμένη έκδοση. Σε αντίθεση, η εντολή kill δεν χρησιμοποιείται πολύ συχνά, η ενσωματωμένη έκδοση επιτρέπει στην διαδικασία να προσδιοριστεί από τον μικρό ακέραιο αριθμό ή τα συμβολικά ονόματα από το μηχανισμό ελέγχου εργασίας του κελύφους. Η εξωτερική έκδοση υποστηρίζει μόνο τα μακρύτερα και συγκριτικά ασήμαντα προσδιοριστικά διαδικασίας που παρέχονται από το λειτουργικό σύστημα. Το σημάδι μεγαλύτερο από δείχνει τον επαναπροσανατολισμό αποτέλεσματος. Εάν διπλασιαστεί (είδος - u >> all_figs) αναγκάζει το αποτέλεσμαναεπισυναφθεί στο διευκρινισμένο αρχείο, παρά την επικάλυψη του προηγούμενου περιεχομένου. Σε παρόμοιο πνεύμα, το σημάδι λιγότερο από δείχνει επαναπροσανατολισμό εισαγωγής. Υποθέστε ότι θέλουμε να τυπώσουμε τον κατάλογο όλων των αριθμών μας σε μια γραμμή, που χωρίζονται από τα διαστήματα, αντί σε πολλαπλές γραμμές. Σε ένα σύστημα της Unix μπορούμε να δακτυλογραφήσουμε: tr \n < all_figs Αυτή η επίκληση της τυποποιημένης εντολής tr μετατρέπει όλους τους χαρακτήρες αλλαγών γραμμής σε διαστήματα. Επειδή το tr γράφτηκε ως απλό φίλτρο, δεν δέχεται έναν κατάλογο αρχείων στη γραμμή εντολής διαβάζει μόνο την τυποποιημένη εισαγωγή. Για οποιοδήποτε πρόγραμμα εκτέλεσης Unix, το λειτουργικό σύστημα παρακολουθεί έναν καταλόγο ανοικτών αρχείων. Από τη σύμβαση, η τυποποιημένη εισαγωγή και το τυποποιημένο αποτέλεσμα (stdin και stdout) είναι αριθμοί αρχείων 0 και 1. Το αρχείο αριθμόυ 2 είναι εκ παραδοχής τυποποιημένο λάθος (stderr), στο οποίο τα προγράμματα είναι υποτιθέμενα να τυπώσουν τα διαγνωστικά μηνύματα λάθους. Ένα από τα πλεονεκτήματα της οικογένειας των κελύφων sh πέρα από την οικογένεια csh είναι η δυνατότητα να επαναπροσανατολίσει stderr και άλλος ανοικτά ανεξάρτητα αρχεία του stdin και stdout. Εξετάστε, παραδείγματος χάριν, το πρόγραμμα ps2pdf. Κάτω από - 15 -

κανονικές περιστάσεις αυτό το πρόγραμμα λειτουργεί σιωπηλά. Εάν αντιμετωπίσει ένα λάθος, εντούτοις, τυπώνει ένα μήνυμα στο stdout και εγκαταλείπει. Αυτή η παραβίαση της σύμβασης (το μήνυμα πρέπει να πάει στο stderr) είναι αβλαβής όταν επικαλείται η εντολή από το πληκτρολόγιο. Εάν ενσωματώνεται σε ένα πρόγραμμα, εντούτοις και το αποτέλεσμα του προγράμματος κατευθύνεται σε ένα αρχείο, το μήνυμα λάθους μπορεί να καταλήξει στο αρχείο αντί στην οθόνη, και να περάσει απαρατήρητο από το χρήστη. Με το bash μπορούμε να δακτυλογραφήσουμε: ps2pdf my_fig.eps 1>&2 ΠΑΡΑΔΕΙΓΜΑ 1.9. Επαναπροσανατολισμός του stderr και stdout Εδώ 1>&2 σημαίνουν κάνε το ps2pdf να στείλει το αρχείο 1 (stdout) στο ίδιο μέρος όπου το περιβάλλον πλαίσιο θα έστελνε κανονικά το αρχείο 2 (stderr). Τέλος, όπως τα περισσότερα κελύφη, bash επιτρέπουν στο χρήστη να παρέχει την εισαγωγή σε μια ευθύγραμμη εντολή: tr \n <<END list of input lines END ΠΑΡΑΔΕΙΓΜΑ 1.10 Heredocs (ευθύγραμμη εισαγωγή) Το <<END δείχνει ότι οι επόμενες γραμμές εισαγωγής, μέχρι μια γραμμή που περιέχει μόνο το END, πρόκειται να παρασχεθούν ως εισαγωγή στο tr. Τέτοια ευθύγραμμη εισαγωγή (παραδοσιακά αποκαλούμενη εδώ έγγραφο ) σπάνια χρησιμοποιείται αμφίδρομα, αλλά είναι ιδιαίτερα χρήσιμη στα προγράμματα κελύφους. Αναφορά και επέκταση Τα κελύφη παρέχουν χαρακτηριστικά αρκετών αναφέρομενων μηχανισμών στις ομάδες λέξεις μαζί στις σειρές. Τα μονά (προς τα εμπρός) αποσπάσματα εμποδίζουν το όνομα αρχείου και τη μεταβλητή επέκταση στο αναφερμένο κείμενο, και την αναγκάζουν να αντιμετωπιστούν ως μεμονωμένη λέξη, ακόμα κι αν περιέχει το άσπρο διάστημα. Τα διπλά αποσπάσματα αναγκάζουν επίσης το περιεχόμενο να αντιμετωπιστεί ως μεμονωμένη λέξη, αλλά δεν εμποδίζει την επέκταση. Κατά συνέπεια foo=bar single= $foo double="$foo" echo $single $double θα τυπώσει $foo bar. ΠΑΡΑΔΕΙΓΜΑ 1.11. Ενιαία και διπλά αποσπάσματα - 16 -

Διάφορες άλλες δομές αγκυλών στο bash ομαδοποιούν το μέσα κείμενο, για διάφορους λόγους. Οι κατάλογοι εντολής εσωκλειόμενοι σε παρένθεση περνούν σε ένα subshell για αξιολόγηση. Εάν η παρένθεση ανοίγματος προηγείται από ένα σημάδι δολαρίων, το αποτέλεσμα του τοποθετημένου καταλόγου εντολής επεκτείνεται στο περιβάλλον πλαίσιο for fig in $(cat my_figs); do ps2pdf ${fig}.eps; done ΠΑΡΑΔΕΙΓΜΑ 1.12. Subshells Εδώ η cat είναι η τυποποιημένη εντολή τύπωσης του περιεχόμενου ενός αρχείου. Τα περισσότερα κελύφη χρησιμοποιούν προς τα πίσω τα ενιαία αποσπάσματα για τον ίδιο σκοπό (' cat my_figs '). Η bash υποστηρίζει αυτήν την σύνταξη επίσης, για οπίσθια συμβατότητα. Οι κατάλογοι εντολής που εσωκλείονται στις αγκύλες αντιμετωπίζονται από το bash ως ενιαία μονάδα. Μπορούν να χρησιμοποιηθούν, παραδείγματος χάριν, για να επαναπροσανατολίσουν το αποτέλεσμα μιας ακολουθίας εντολών: { date; ls; } >> file_list ΠΑΡΑΔΕΙΓΜΑ 1.13. Αναφερόμενα στις αγκύλες πλαίσια μεσα στο κέλυφος Αντίθετα από τους κατάλογους, οι εντολές που εσωκλείονται στις αγκύλες εκτελούνται από το τρέχον κέλυφος. Από μια προοπτική γλωσσών προγραμματισμού, οι παρενθέσεις και οι αγκύλες συμπεριφέρονται ανάποδα από τον τρόπο που κάνουν στο C: οι παρενθέσεις εισάγουν ένα τοποθετημένο δυναμικό πεδίο στο bash, ενώ οι αγκύλες είναι καθαρά για την ομαδοποίηση. Εν μέρη, οι μεταβλητές που ορίζονται, οι νέες τιμές μέσα στο a, ο κατάλογος εντολής θα επανέλθουν στις προηγούμενες τιμές τους μόλις ολοκληρώσει ο κατάλογος την εκτέλεση. ΠΑΡΑΔΕΙΓΜΑ 1.14. Όταν δεν περιβάλλονται από το άσπρο διάστημα, οι αγκύλες εκτελούν τον βασιζόμενο στο σχέδιο καταλόγο αποτελεσμάτων, κατά τρόπο παρόμοιο με την επέκταση ονομάτων αρχείου αλλά χωρίς τη σύνδεση στο σύστημα αρχείων. Παραδείγματος χάριν, τυπωμένες οι echo abc12xyz abc34xyz abc56xyz abc {12.34.56} xyz. Επίσης, δεδομένου ότι έχουμε δει, οι αγκύλες χρησιμεύουν για να οριοθετήσουν τα μεταβλητά ονόματα όταν προηγείται η αγκύλη ανοίγματος από ένα σημάδι δολαρίων. Στο παράδειγμα 1.6 χρησιμοποιήσαμε τις τετράγωνες αγκύλες για να εσωκλείσουμε μια υπό όρους έκφραση.οι διπλές τετράγωνες αγκύλες εξυπηρετούν έναν παρόμοιο σκοπό, αλλά με περισσότερη, όπως στην C, σύνταξη έκφρασης, και χωρίς επέκταση ονομάτων αρχείου. Οι διπλές παρενθέσεις χρησιμοποιούνται για να εσωκλείσουν τους αριθμητικούς υπολογισμούς, πάλι με, όπως στην C, σύνταξη. Η παρεμβολή των εντολών στο $ () ή τα ανάποδα εισαγωγικά, τα σχέδια μέσα σε {}, και οι αριθμητικές εκφράσεις μέσα σε (()) είναι όλες οι εξεταζόμενες μορφές επέκτασης, ανάλογως με την επέκταση των ονομάτων αρχείου και τη μεταβλητή επέκταση. Ο διαχωρισμός των σειρών στις λέξεις θεωρείται επίσης μορφή επέκτασης, όπως είναι η αντικατάσταση, σε ορισμένα πλαίσια, των χαρακτήρων tilde (~) με το όνομα του εγχώριου καταλόγου του χρήστη. Όλοι που λέγονται, μας δίνουν επτά διαφορετικά είδη επέκτασης στο bash. Όλες οι διάφορες δομές αγκυλών έχουν κανόνες μέσα σ υς οποίους τα είδη επέκτασης εκτελούνται. Οι - 17 -

κανόνες προορίζονται να είναι όσο το δυνατόν πιό διαισθητικοί, αλλά δεν είναι ομοιόμορφοι στα κατασκευάσματα. Η επέκταση ονομάτων αρχείου, παραδείγματος χάριν, δεν εμφανίζεται μέσα [[]] - βαλμένη σε παρένθεση όροι. Ομοίως, ένας διπλός χαρακτήρας αποσπάσματος μπορεί να εμφανιστεί μέσα σε μια διπλός-αναφερμένη σειρά εάν δραπετεύσει με μια αντίστροφη κάθετο, αλλά ένας ενιαίος χαρακτήρας αποσπάσματος μπορεί να μην εμφανιστεί μέσα σε μια ενιαία-αναφερμένη σειρά. Λειτουργίες Οι χρήστες μπορούν να καθορίσουν τις λειτουργίες στο bash εκείνο το έπειτα εργάζονται όπως τις ενσωματωμένες εντολές. Πολλοί χρήστες, παραδείγματος χάριν, καθορίζουν ll ως συντομότερος δρόμος για το LS - λ, το οποίο απαριθμεί τα αρχεία στον τρέχοντα κατάλογο με το μακροχρόνιο σχήμα: : function ll () { ls -l "$@" } ΠΑΡΑΔΕΙΓΜΑ 1.15. Καθορισμένες από το χρήστη λειτουργίες κελύφους Μέσα στη λειτουργία, $1 αντιπροσωπεύουν την πρώτη παράμετρο, $2 αντιπροσωπεύουν τη δεύτερη, και ούτω καθεξής. Στον καθορισμό του ll, $@ αντιπροσωπεύει τον ολόκληρο κατάλογο παραμέτρου. Οι λειτουργίες μπορούν να είναι αυθαίρετα σύνθετες. In particular^ bash υποστηρίζει και τις τοπικές μεταβλητές και επαναδρομολογήσεις. Τα κελύφη στην οικογένεια csh παρέχουν έναν πιό πρωτόγονο ς μηχανισμό ψευδωνύμων που λειτουργεί μέσω της μακροεπέκτασης. Συνθήκη #! Όπως σημειώνεται ανωτέρω, οι εντολές κελύφους μπορούν να διαβαστούν από ένα αρχείο προγραμμάτων. Για να τους εκτελέσει στο τρέχον κέλυφος, κάποιος χρησιμοποιεί την εντολή τελεία :. my_script ΠΑΡΑΔΕΙΓΜΑ 1.16 Συνθήκη #! στα αρχεία προγραμμάτων. όπου my_script είναι το όνομα του αρχείου. Πολλά λειτουργικά συστήματα, συμπεριλαμβανομένων των περισσότερων εκδόσεων της Unix, επιτρέπουν σε κάποιον να κάνει ένα πρόγραμμα να λειτουργήσει ως εκτελέσιμο πρόγραμμα, έτσι ώστε οι χρήστες μπορούν απλά να δακτυλογραφήσουν ΣΧΕΔΑΣΜΟΣ & ΕΦΑΡΜΟΓΗ Μαγικοί αριθμοί - 18 -

Όταν ο πυρήνας της Unix καλείται να εκτελέσει ένα αρχείο (μέσω της κλήσης συστημάτων execve), ελέγχει τις πρώτες πρώτες ψηφιολέξεις του αρχείου για έναν μαγικό αριθμό που δείχνει τον τύπο του αρχείου. Μερικές τιμές αντιστοιχούν στις άμεσα εκτελέσιμες μορφές αρχείου αντικειμένου. Κάτω από τα Linux, παραδείγματος χάριν, οι πρώτες τέσσερις ψηφιολέξεις ενός αρχείου αντικειμένου είναι 0x7f45_4c46 (delelf στο ASCII). Κάτω από το Mac OS Χ είναι 0xfeed_face. Εάν οι πρώτες δύο ψηφιολέξεις είναι 0x2321 (#! στο ASCII), ο πυρήνας υποθέτει ότι το αρχείο είναι ένα πρόγραμμα, και διαβάζει τους επόμενους χαρακτήρες για να βρεί το όνομα του διερμηνέα.. Η σύμβαση #! στη Unix είναι ο κύριος λόγος που η περισσότερη γλωσσική χρήση προγραμματισμού # ως οριοθετεί σχόλιο ανοίγματος. Οι πρόωρες εκδόσεις του sh χρησιμοποίησαν την εντολή κανένας-op (:) ως τρόπο να εισαγάγουν τα σχόλια. Το κέλυφος C του Joy εισήγαγε το #, όπου τροποποιήθηκαν μερικές εκδόσεις του sh για να προωθήσουν το csh, όταν ζητούμένο να εκτελέσει ένα πρόγραμμα που εμφανίστηκε να αρχίζει με ενα σχόλιο κελύφους C. Αυτός ο μηχανισμός εξελίχθηκε στο γενικότερο μηχανισμό που χρησιμοποιήθηκε σε πολλές (εν τούτοις όχι όλοι)τις σήμερινες παραλλαγές της Unix. Δύο βήματα απαιτούνται. Κατ' αρχάς, το αρχείο πρέπει να χαρακτηριστεί εκτελέσιμο στα μάτια του λειτουργικού συστήματος. Στη Unix κάποιος δακτυλογραφεί chmod +x my_script. Δεύτερον, το αρχείο πρέπει να είναι μονοπεριγραφικό με τέτοιο τρόπο ώστε να επιτρέπει στο λειτουργικό σύστημα να πει ποιο κέλυφος (ή άλλος διερμηνέας) θα καταλάβει το περιεχόμενο. Κάτω από τη Unix, το αρχείο πρέπει να αρχίσει με τους χαρακτήρες #!, ακολουθούμενος από το όνομα του κελύφους. Το χαρακτηριστικό πρόγραμμα bash αρχίζει έτσι με #!/bin/bash Η διευκρίνιση του πλήρους ονόματος πορειών είναι ένα χαρακτηριστικό γνώρισμα ασφάλειας: προσδοκά τη δυνατότητα ότι ο χρήστης μπορεί να έχει μια πορεία αναζήτησης, για τις εντολές στις οποίες κάποιο άλλο πρόγραμμα που ονομάζεται bash,εμφανίζεται πριν από το κέλυφος. (Δυστυχώς, η απαίτηση για τα πλήρη ονόματα πορειών κάνει τις γραμμές#! μη φορητές, δεδομένου ότι τα κέλυφος και άλλοι διερμηνείς μπορούν να εγκατασταθούν σε διαφορετικές θέσεις σε διαφορετικές μηχανές.) ΕΛΕΓΞΑΤΕ ΤΗΝ ΚΑΤΑΝΟΗΣΗ ΣΑΣ 1. Δώστε έναν εύλογο καθορισμό μιας πρότασης της γλώσσας προγραμματισμού. 2. Απαριθμήστε τους κύριους τρόπους με τους οποίους οι γλώσσες προγραμματισμού διαφέρουν από τις συμβατικές γλώσσες συστημάτων. 3. Από ποια δύο κύρια σύνολα προγόνων κατάγονται οι σύγχρονες γλώσσες προγραμματισμού ; 4. Ποια δημιουργία της ΙΒΜ θεωρείται γενικά ως πρώτη γλώσσα προγραμματισμού γενικού σκοπού; 5. Ποια είναι η δημοφιλέστερη γλώσσα για την από πλευρά παροχέα προγραμματισμού Ιστού; 6. Πώς η έννοια του πλαισίου σε Ρογ! διαφέρει από τον εξαναγκασμό; - 19 -

7. Τι είναι σφαιροποίηση; Τι είναι ένας μπαλαντέρ; 8. Τι είναι ένας δίαυλος στη Unix; Τι είναι επαναπροσανατολισμός; 9. Περιγράψτε τα τρείς τυποποιημένες I/O ροές που παρέχονται σε κάθε διαδικασία της Unix. 10. Εξηγήστε τη σημασία της σύμβασης #! στα προγράμματα κελύφους της Unix. 1.2.2 Επεξεργασία κειμένων και αποτέλεσμα εκθέσεων Οι γλώσσες της Shell τείνουν να προσανατολιστούν βαριά στις σειρές. Οι εντολές είναι σειρές, που αναλύονται στους καταλόγους λέξεων. Οι μεταβλητές εκτιμούνται ανά σειρά. Οι μεταβλητοί μηχανισμοί επέκτασης επιτρέπουν στο χρήστη να εξαγάγουν τα προθέματα, τα επιθήματα, ή τις αυθαίρετες υποσειρές. Η αλληλουχία υποδεικνύεται από την απλή αντιπαράθεση. Υπάρχει επιμερισμός αναφερόμενος στις συμβάσεις. Λίγες συμβατικότερες γλώσσες έχουν παρόμοια υποστήριξη για τις σειρές. # label ( target for branch ): :top /<[hh] [ 123]>.*\[hH] [ 123]>/ { h sa(<v[hh] [123] >\) /\1/ s/ Λ.*\ (<[hh] [123] >\) Λ1/ p g s/<v[hh] [123] > // } b top ;# match whole heading ;# save copy of pattern space ;# delete text after closing tag ;# delete text before closing tag ;# print what remains ;# retrieve saved pattern space ;# delete closing tag ;# and branch to top of script /<[hh] [123]>/ { N b top } d ;# match opening tag (only) ;# extend search to next line ;# and branch to top of script ;# if no match at all, delete Σχήμα 1.1 Πρόγραμμα σε sed για να εξαγάγει τις επιγραφές από ένα αρχείο HTML. Το πρόγραμμα υποθέτει ότι οι ανοιγόμενες και κλείνουσες ετικέττες αντιστοιχούνται καταλλήλως και ότι οι επιγραφές δεν τοποθετούνται. Συγχρόνως, οι γλώσσες κελύφους δεν προορίζονται σαφώς για το είδος του χειρισμού κειμένων που εκτελείται συνήθως στους συντάκτες όπως ο emacs ή vi. Η αναζήτηση και η αντικατάσταση ιδιαίτερα, λείπει και πολλοί άλλοι στόχοι που οι συντάκτες ολοκληρώνουν με μια ενιαία πληκτρολόγηση - εισαγωγή, διαγραφή, αντικατάσταση, υποστήριγμα-που ταιριάζουν με, προς τα εμπρός και οπίσθια κίνηση - θα ήταν αδέξιοι να εφαρμόσουν, ή δεν έχουν απλά κανένα νόημα, στα πλαίσια του κελύφους. Για τον επαναλαμβανόμενο χειρισμό κειμένων είναι φυσικό να θελήσει να αυτοματοποιήσει τη διαδικασία έκδοσης. Τα εργαλεία για να ολοκληρώσουν αυτόν τον στόχο αποτελούν τη δεύτερη κύρια κατηγορία προγόνων για τις σύγχρονες γλώσσες προγραμματισμού. - 20 -

Sed Σαν ενα απλό παράδειγμα επεξεργασίας κειμένων, εξετάστε το πρόβλημα για όλες τις επιγραφές από μια ιστοσελίδαχ (ένα αρχείο HTML). Αυτές είναι σειρές που οριοθετούνται από <H1>... </H1>, <H2>... </H2>, και < H 3>. ετικέττες </H3>. ΠΑΡΑΔΕΙΓΜΑ 1.17. Εξαγωγή των επιγραφών HTML με το sed Ολοκληρώνοντας αυτόν τον στόχο σε έναν συντάκτη όπως το emacs, vil, ή ακόμα και το Microsoft Word είναι απλό αλλά κουραστικό : κάποιος πρέπει να ψάξει για μια ετικέττα ανοίγματος, να διαγράψει το προηγούμενο κείμενο, να αναζητήσει μια κλεισίματος, να χαρακτηρίσει την τρέχουσα θέση (ως αφετηρία για την επόμενη διαγραφή), και να επαναλάβει. Ένα πρόγραμμα που θα εκτελέσει αυτούς τους στόχους σε sed, ο συντάκτης ρευμάτων της Unix, εμφανίζεται στο σχήμα 1. Ο κώδικας αποτελείται από μια κεφαλίδα και τρεις εντολές, από τις οποίες οι δύο είναι σύνθετες. Η πρώτη σύνθετη εντολή τυπώνει την πρώτη επιγραφή που βρίσκεται, ενδεχομένως, στη μερίδα της εισαγωγής που εξετάζεται αυτήν την περίοδο (το sed το καλεί διάστημα σχεδίων). Η δεύτερη σύνθετη εντολή επισυνάπτει μια καινούργια γραμμή στο διάστημα σχεδίων οπότε περιέχει ήδη μια ετικέττα επιγραφής ανοίγματος. Οι δύο σύνθετες εντολές και αρκετές από τις υποεντολές, χρησιμοποιούν τα κανονικά σχέδια έκφρασης, που οριοθετούνται από τις καθέτους. Θα συζητήσουμε για αυτά τα σχέδια περαιτέρω στην παράγραφο της 1.4.2. Η τρίτη εντολή (το απομονωμένο d) απλά διαγράφει την τρέχουσα γραμμή. Επειδή κάθε σύνθετη εντολή τελειώνει με έναν κλάδο πίσω στην κορυφή του προγράμματος, ο δεύτερος θα εκτελέσει μόνο εάν ο πρώτος δεν εκτελεστεί, και η διαγραφή θα εκτελέσει μόνο εάν καμία σύνθετη δεν εκτελεστεί. Η κληρονομιά συντακτών του sed είναι σαφής σε αυτό το παράδειγμα. Οι εντολές είναι γενικά ένας χαρακτήρας μακροχρόνιος, και δεν υπάρχει καμία μεταβλητή - καμία κατάσταση οποιουδήποτε είδους πέρα από το μετρητή και το κείμενο προγράμματος που εκδίδεται. Αυτοί οι περιορισμοί κάνουν το sed καταλληλότερο στα προγράμματα μιας γραμμής, χαρακτηριστικά εισαγμένα κατά λέξη από το πληκτρολόγιο με διακόπτη γραμμής εντολών -e. Ο ακόλουθος, παραδείγματος χάριν, θα διαβάσει από την τυποποιημένη εισαγωγή, θα διαγράψει τις κενές γραμμές, και (σιωπηρά) θα τυπώσει τις γραμμές nonblank στο τυποποιημένο αποτέλεσμα. sed -e /A[[:space:]]*$/d ΠΑΡΑΔΕΙΓΜΑ 1.18. Προγράμματα ένας-γραμμών στο sed Εδώ το Λαντιπροσωπεύει την αρχή της γραμμής και το $ αντιπροσωπεύει το τέλος. Η έκφραση [[: space:]] ταιριάζει με οποιοδήποτε χαρακτήρα άσπρου διαστήματος στον τοπικό χαρακτήρα - set, για να επαναληφθεί σε έναν αυθαίρετο αριθμό χρόνων, όπως υποδεικνύεται από το αστέρι Kleene (*). Το d δείχνει τη διαγραφή. Οι μη διαγραμμένες γραμμές είναι τυπωμένες εξ ορισμού. Awk Σε μία προσπάθεια να εξεταστούν οι περιορισμοί του sed, ο Alfred Aho, ο Peter Weinberger, και ο Brian Kernighan σχεδίασαν το awk το 1977 (το όνομα είναι βασισμένο στα αρχικά γράμματα των επωνύμων τους). Το Awk είναι υπό κάποια έννοια ένας εξελικτικός σύνδεσμος μεταξύ των συντακτών ρευμάτων όπως το sed και των ολοκληρωμένων γλωσσών προγραμματισμού. Διατηρεί γραμμή sed στο - 21 -

πρότυπο φίλτρων του υπολογισμού, αλλά επιτρέπει στο χρήστη να δραπετεύσει αυτό το πρότυπο όταν επιδιώκεται και αντικαθιστά τις εντολές έκδοσης ενιαίου χαρακτήρα με τη σύνταξη ενθυμίζουσα την C. Το Awk παρέχει (τις χωρίς τύπο) μεταβλητές και ποικίλα δομών ροής ελέγχου, συμπεριλαμβανομένων των υπορουτινών. Ένα πρόγραμμα awk αποτελείται από μια ακολουθία σχεδίων, κάθε μια από τις οποίες έχει μια σχετική δράση. Για κάθε γραμμή εισαγωγής, ο διερμηνέας εκτελεί σε σειρά τις ενέργειες, των οποίων τα σχέδια αξιολογούν αληθινά. Ένα παράδειγμα με ένα ενιαίο ζευγάρι σχέδιου δράσης εμφανίζεται στο σχήμα 2. ΠΑΡΑΔΕΙΓΜΑ 1.19 που εξάγει τις επιγραφές HTML με το awk Εκτελεί ουσιαστικά τον ίδιο στόχο με το πρόγραμμα sed του σχήματος 1. Οι γραμμές που δεν περιέχουν καμία ετικέττα ανοίγματος αγνοούνται. Σε μια γραμμή με μια ετικέττα ανοίγματος, διαγράφουμε οποιοδήποτε κείμενο προηγείται της επιγραφής. Τυπώνουμε έπειτα τις γραμμές έως ότου βρίσκουμε την κλείνουσα ετικέττα και επαναλαμβάνουμε εάν υπάρχει μια άλλη ετικέττα ανοίγματος στην ίδια γραμμή. Πέφτουμε πίσω στον κύριο βρόχο του διερμηνέα όταν είμαστε καθαροί από οποιαδήποτε επιγραφή. Διάφορες συμβάσεις μπορούν να είναι φανερές σε αυτό το παράδειγμα. Η τρέχουσα γραμμή εισαγωγής είναι διαθέσιμη στην ψευδομεταβλητή $0. Η λειτουργία getline διαβάζει σε αυτήν την μεταβλητή εξ ορισμού. Η λειτουργία substr (s, α, β) εξάγει τη μερίδα της σειράς s που αρχίζει στη θέση a και με το μήκος b. Εάν το b παραλείπεται, τα αποσπασματικά τρεξίματα μερίδας στο τέλος των όρων του s., Οι συνθήκες, όπως τα σχέδια, μπορούν να χρησιμοποιήσουν τις κανονικές εκφράσεις. Μπορούμε να δούμε ένα παράδειγμα στον βρόχο do... while. Εξ ορισμού, οι κανονικές εκφράσεις ταιριάζουν έναντι του $0. Ίσως οι δύο σημαντικότερες καινοτομίες του awk είναι τομείς και συνειρμικές σειρές, καμία από τις οποες δεν εμφανίζεται στο σχήμα 1.2. Όπως στο κέλυφος,το awk αναλύει κάθε γραμμή εισαγωγής σε μια σειρά λέξεων (τομείς). Εξ ορισμού αυτοί οριοθετούνται από το άσπρο διάστημα, αν και ο χρήστης μπορεί να αλλάξει αυτήν την συμπεριφορά δυναμικά κοντά ορίζει ing μια κανονική έκφραση στο ενσωματωμένο μεταβλητό FS (διαχωριστής τομέων). /[hh] [123] >/ { # execute this block in line contains an opening tag Do { open_tag = match ($0, /<[hh] [123]>/) $0 = substr ($0, open tag) #delete texte before opening tag # $0 is the current input line While )!/<\/[hh] [123]>/) { # print interior lines print # in their entirety } close_tag = match ($0, /<\/[hh] [123]>/) +4 print substr ($0, 0, close_tag) #print through closing tag $0 = substr ($0, close_tag +1) #delete through closing tag } while (/<[hh] [123] >/) # repeat if more opening tags } - 22 -