ALGOL

Από τη Βικιπαίδεια, την ελεύθερη εγκυκλοπαίδεια

Η ALGOL (συντομογραφία των αγγλικών λέξεων ALGOrithmic Language)[1] είναι μια οικογένεια προστακτικών γλωσσών προγραμματισμού που αναπτύχθηκε στα μέσα της δεκαετίας του 1950 και άσκησε σημαντική επιρροή σε πολλές άλλες γλώσσες, ενώ έγινε ο ντε φάκτο τρόπος που περιγράφονταν οι αλγόριθμοι σε βιβλία και ακαδημαϊκά έργα για τα επόμενα 30 χρόνια.[2] Σχεδιάστηκε ώστε να διορθωθούν κάποια από τα προβλήματα της FORTRAN και οδήγησε σε πολλές γλώσσες, μεταξύ αυτών στη BCPL, τη B, την Pascal, τη Simula και τη C. Η ALGOL εισήγαγε τις ενότητες κώδικα (code blocks) και τα ζεύγη begin και end για την οριοθέτησή τους, ενώ ήταν η πρώτη γλώσσα που υλοποίησε εμφωλευμένους ορισμούς συναρτήσεων (nested function definitions) με λεκτική εμβέλεια. Συχνά χρησιμοποιούνται τμήματα σύνταξης που μοιάζουν με ALGOL σαν ψευδοκώδικας (περιγραφή αλγορίθμων που απευθύνεται σε αναγνώστες).

Σχέση μεταξύ της ALGOL, της FORTRAN και κάποιων από τις προστακτικές γλώσσες προγραμματισμού που ακολούθησαν.

Υπήρξαν τρεις σημαντικοί ορισμοί:

  • ALGOL 58 - αρχικά προτάθηκε η ονομασία IAL (International Algorithmic Language).
  • ALGOL 60 - αρχικά υλοποιήθηκε σαν X1 ALGOL 60 στα μέσα της δεκαετίας του 1960 - με αναθεώρηση το 1963[3][4]
  • ALGOL 68 - αναθεωρήθηκε το 1973[5] - εισήγαγε νέα στοιχεία όπως οι ευέλικτοι πίνακες (flexible arrays), τα slices, ο παραλληλισμός, η ταυτοποίηση τελεστών (operator identification) και διάφορες άλλες επεκτάσεις.

Ο Niklaus Wirth βάσισε τη δική του ALGOL W στην ALGOL 60 πριν αναπτύξει την Pascal. Η Algol-W επρόκειτο να ήταν η επόμενη γενιά της ALGOL αλλά η επιτροπή της ALGOL 68 αποφάσισε μια σχεδίαση που ήταν πολυπλοκότερη και πιο προχωρημένη από μια καθαρότερη και απλοποιημένη ALGOL 60. Οι επίσημες εκδόσεις της ALGOL ονομάζονται σύμφωνα με το χρόνο που δημοσιεύτηκαν αρχικά.

Η Algol 68 ήταν αρκετά διαφορετική από την Algol 60 αλλά δεν έτυχε καλής υποδοχής, με αποτέλεσμα ο όρος "Algol" γενικά να σημαίνει την Algol 60 και της διαλέκτους της.

Σημαντικές υλοποιήσεις[Επεξεργασία | επεξεργασία κώδικα]

Η International Algorithmic Language (IAL ή ALGOL 58) υπήρξε επιδραστική και γενικά θεωρείται ο πρόγονος πολλών σύγχρονων γλωσσών προγραμματισμού. Επιπλέον, στην επιστήμη υπολογιστών, ο αντικειμενικός κώδικας της ALGOL (ALGOL object code) ήταν ένας απλός και περιεκτικός τρόπος να περιγραφεί σε αρχιτεκτονική με στοίβες, που χρησιμοποιούνταν στη διδασκαλία κατασκευής μεταγλωττιστών και άλλων γλωσσών υψηλού επιπέδου (με την Algol να θεωρείται γενικά η πρώτη από αυτές).

Ιστορία[Επεξεργασία | επεξεργασία κώδικα]

Η ALGOL αναπτύχθηκε από μια επιτροπή Ευρωπαίων και Αμερικανών επιστημόνων της επιστήμης των υπολογιστών, σε μια συνάντηση στο ETH Ζυρίχης το 1958 (ALGOL 58). Ορίστηκαν τρεις διαφορετικοί τρόποι σύνταξης: μια σύνταξη αναφοράς (reference syntax), μια σύνταξη δημοσίευσης (publication syntax) και μια σύνταξη υλοποίησης (implementation syntax). Αυτοί οι τρεις διαφορετικοί τρόποι επέτρεπαν τη χρήση διαφορετικών ονομάτων λέξεων-κλειδιών και διαφορετικές συμβάσεις για τα δεκαδικά ψηφία (κόμμα ή περίοδος), για διαφορετικές γλώσσες.

Η ALGOL χρησιμοποιήθηκε κυρίως από ερευνητές της επιστήμης υπολογιστών στις Ηνωμένες Πολιτείες και στην Ευρώπη. Υπήρξαν δυσχέρειες στη χρήση της σε εμπορικές εφαρμογές λόγω έλλειψης ενός πρότυπου συστήματος εισόδου/εξόδου και επίσης έλλειψης ενδιαφέροντος από τις μεγάλες εταιρείες του χώρου. Η ALGOL 60 όμως εδραιώθηκε όσον αφορά τη δημοσίευση αλγορίθμων και είχε πρωτοφανείς επιπτώσεις στην ανάπτυξη μελλοντικών γλωσσών προγραμματισμού.

Ο John Backus ανέπτυξε ειδικά για την ALGOL 58, την κανονική μορφή Μπάκους-Νάουρ (Backus–Naur Form), μια μέθοδο περιγραφής γλωσσών προγραμματισμού. Η μέθοδος αναθεωρήθηκε και επεκτάθηκε από τον Peter Naur για την ALGOL 60 και σύμφωνα με πρόταση του Ντόναλντ Κνουθ, μετονομάστηκε σε κανονική μορφή Μπάκους-Νάουρ.[6]

Σύμφωνα με τον Peter Naur:

"Σαν αρχισυντάκτης του ALGOL Bulletin συμμετείχα στις διεθνείς συνομιλίες σχετικά με τη γλώσσα και επιλέχθηκα σαν μέλος της Ευρωπαϊκής ομάδας σχεδίασης της γλώσσας το Νοέμβριο του 1959. Λόγω αυτού του ρόλου μου, ήμουν αρχισυντάκτης της αναφοράς για την ALGOL 60, η οποία προέκυψε από τη συνάντηση ALGOL 60 στο Παρίσι τον Ιανουάριο του 1960."[7][8]

Τη συνάντηση στο Παρίσι παρακολούθησαν οι εξής άνθρωποι (1-16 Ιανουαρίου):

  • Friedrich L. Bauer, Peter Naur, Heinz Rutishauser, Klaus Samelson, Bernard Vauquois, Adriaan van Wijngaarden και Michael Woodger (από την Ευρώπη)
  • John W. Backus, Julien Green, Charles Katz, Τζον Μακάρθι, Alan J. Perlis και Joseph Henry Wegstein (από τις ΗΠΑ).

Ο Alan Perlis περιέγραψε τη συνάντηση με εύγλωττο τρόπο: "Οι συναντήσεις ήταν εξαντλητικές, ατέρμονες και ευφορικές. Δείχναμε εκνευρισμό όταν καλές μας ιδέες απορρίπτονταν μαζί με κακές ιδέες άλλων. Παρόλα αυτά, υπήρξαμε επιμελείς σε όλη τη διάρκεια των συναντήσεων. Η χημεία των 13 ήταν εξαιρετική."[9]

Ο John Backus και ο Peter Naur υπήρξαν μέλη της επιτροπής που δημιούργησε την ALGOL 60, μαζί με το Wally Feurzeig, ο οποίος αργότερα θα δημιουργούσε τη Logo.

Η ALGOL 60 ενέπνευσε πολλές από τις επόμενες γλώσσες προγραμματισμού. Ο Τόνυ Χόαρ έχει δηλώσει: "Ορίστε μια γλώσσα τόσο μπροστά από την εποχή της που υπήρξε βελτίωση όχι μόνο σε σχέση με τους προκατόχους της αλλά σε σχέση και με σχεδόν όλους τους απογόνους της."[10] Η γλώσσα προγραμματισμού Scheme, η οποία είναι παρακλάδι της Lisp και πήρε τη δομή ενοτήτων (blocks) και τη λεκτική εμβέλεια της ALGOL, υιοθέτησε επίσης και τον τίτλο "Revised Report on the Algorithmic Language Scheme" για τα έγγραφα που περιγράφουν τα πρότυπά της, σαν φόρο τιμής στην ALGOL και στην αναθεωρημένη αναφορά της.[11]

Η Algol και η έρευνα στις γλώσσες προγραμματισμού[Επεξεργασία | επεξεργασία κώδικα]

Όπως παρατήρησε και ο Peter Landin, η Algol ήταν η πρώτη γλώσσα που συνδύασε επιτυχημένα τα προστακτικά εφέ (imperative effects) με το λ-λογισμό με κλήση κατ' όνομα (call-by-name). Ο John C. Reynolds ίσως έδωσε τον πιο κομψό τυπικό ορισμό της γλώσσας, με τρόπο που επιδεικνύει τη συντακτική και σημασιολογική της καθαρότητα. Η "ιδανική" Algol του Reynolds υπήρξε επίσης επιχείρημα υπέρ της σύγκρισης των τοπικών εφφέ ("local" effects) των γλωσσών με κλήση κατ' όνομα σε σχέση με τα καθολικά εφφέ ("global" effects) που χρησιμοποιούνται από τις γλώσσες με κλήση κατά τιμή (call-by-value), όπως η ML. Η θεωρητική ακεραιότητα της γλώσσας υπήρξε σημαντική για τη χρήση της στην έρευνα της σημασιολογίας, μαζί με την PCF και την ML.[12]

Οι υλοποιήσεις της IAL[Επεξεργασία | επεξεργασία κώδικα]

Έχουν υπάρξει τουλάχιστον 70 εμπλουτισμένες, εκτεταμένες ή παράγωγες εκδόσεις, καθώς και υπογλώσσες της Algol 60 μέχρι σήμερα.[13]

Όνομα Έτος Δημιουργός Τοποθεσία Περιγραφή Πλατφόρμα (επεξεργαστής)
υλοποίηση-ZMMD 1958 Friedrich L. Bauer, Heinz Rutishauser, Klaus Samelson, Hermann Bottenbruch Γερμανία υλοποίηση της ALGOL 58 Z22
(αργότερα η Z23 του Κόνραντ Τσούζε περιλάμβανε μεταγλωττιστή της Algol 60) [14]
X1 ALGOL 60 Καλοκαίρι 1960 Έντσγκερ Ντάικστρα και Jaap A. Zonneveld Ολλανδία Πρώτη υλοποίηση της ALGOL 60[15] Electrologica X1
Elliott ALGOL δεκαετία 1960 Τόνυ Χόαρ Ηνωμένο Βασίλειο Χρησιμοποιήθηκε στη διάσημη ομιλία για τη δοκιμή Τούρινγκ (Turing test) Elliott 803 & Elliott 503
JOVIAL 1960 Jules Schwarz ΗΠΑ Υπήρξε η βασική γλώσσα ανώτερου επιπέδου του Αμερικανικού Υπουργείου Άμυνας (DOD) πριν την Ada Διάφορες
Burroughs Algol
(πολλές παραλλαγές)
1961 Burroughs Corporation (με τη συμμετοχή των Χόαρ και Ντάικστρα, μεταξύ άλλων) ΗΠΑ Η βάση των υπολογιστών της Burroughs (και σήμερα των αντίστοιχων βασισμένων στο MCP μοντέλων της Unisys) Μεγάλα (και μεσαία) συστήματα
της Burroughs.
Case ALGOL 1961 ΗΠΑ Η Simula αρχικά είχε προδιαγραφεί σαν επέκταση της Case ALGOL με έμφαση στην προσομοίωση UNIVAC 1107
GOGOL 1961 Bill McKeeman ΗΠΑ Για το σύστημα καταμερισμού χρόνου ODIN PDP-1
X1 Algol 60 1961 Έντσγκερ Ντάικστρα και J.A. Zonneveld Ολλανδία Κέντρο Μαθηματικών, Άμστερνταμ Electrologica X1
RegneCentralen ALGOL 1961 Peter Naur, Jørn Jensen Δανία Πλήρης υλοποίηση της Algol 60 DASK (στο Regnecentralen)
Dartmouth ALGOL 30 1962 Thomas Eugene Kurtz και άλλοι ΗΠΑ LGP-30
USS 90 Algol 1962 L. Petrone Ιταλία
Algol Translator 1962 G. van der Mey και W.L. van der Poel Ολλανδία Staatsbedrijf der Posterijen, Telegrafie en Telefonie ZEBRA
Kidsgrove Algol 1963 F. G. Duncan Ηνωμένο Βασίλειο KDF9 της εταιρείας ηλεκτρισμού της Αγγλίας (English Electric Company)
VALGOL 1963 Val Schorre ΗΠΑ Μια δοκιμή για το μεταγλωττιστή μεταγλωττιστών META II
Whetstone 1964 Brian Randell και L J Russell Ηνωμένο Βασίλειο Το τμήμα ατομικής ενέργειας (Atomic Power Division) της εταιρείας ηλεκτρισμού της Αγγλίας (English Electric Company). KDF9
NU ALGOL 1965 Νορβηγία UNIVAC
ALGEK 1965 Σοβιετική Ένωση Minsk-22 АЛГЭК, με υποστήριξη ALGOL-60 και COBOL, για κάποιες εργασίες
MALGOL 1966 A. Viil, M Kotli & M. Rakhendi, Εσθονική Σοβιετική Σοσιαλιστική Δημοκρατία Minsk-22
ALGAMS 1967 ομάδα GAMS group (ГАМС, группа автоматизации программирования для машин среднего класса), Comecon Academies of Science Comecon Minsk-22, αργότερα ES EVM, BESM
ALGOL/ZAM 1967 Πολωνία Πολωνικός υπολογιστής ZAM
Simula 67 1967 Ole-Johan Dahl και Kristen Nygaard Νορβηγία Algol 60 με κλάσεις UNIVAC 1107
Chinese Algol 1972 Κίνα Κοινεζικοί χαρακτήρες, έκφραση μέσω του συστήματος συμβόλων
DG/L 1972 ΗΠΑ Οικογένεια υπολογιστών DG Eclipse
S-algol 1979 Ron Morrison Ηνωμένο Βασίλειο Ανεξάρτητη προσθήκη τύπων δεδομένων για εκπαιδευτική χρήση PDP-11 και αργότερα υλοποίηση στην εικονική μηχανή Java

Οι διάλεκτοι της Burroughs περιλάμβαναν ειδικές διαλέκτους για την εκκίνηση του συστήματος (Bootstrapping), όπως η ESPOL και η NEWP.

Χαρακτηριστικά[Επεξεργασία | επεξεργασία κώδικα]

Όπως ορίστηκε επίσημα, η ALGOL 60 δεν είχε δυνατότητες εισόδου/εξόδου - κάθε υλοποίηση όριζε το δικό της τρόπο με αποτέλεσμα συνήθως να υπάρχει θέμα συμβατότητας μεταξύ διαφορετικών υλοποιήσεων. Αντίθετα, η ALGOL 68 προσέφερε μια εκτενή βιβλιοθήκη από δυνατότητες transput (όρος της ALGOL 68 για την είσοδο και την έξοδο).

Η ALGOL 60 επέτρεπε δύο ειδών στρατηγικές αποτίμησης για το πέρασμα παραμέτρων: τη συνηθισμένη κλήση κατά τιμή (call-by-value), και την κλήση κατ' όνομα (call-by-name). Η κλήση κατ' όνομα είχε κάποιους περιορισμούς σε σχέση με την κλήση κατ' αναφορά (call-by-reference), με αποτέλεσμα να έχει κάποιες ανεπιθύμητες ιδιότητες όσον αφορά τη σχεδίαση προστακτικών γλωσσών. Για παράδειγμα, είναι αδύνατο στην ALGOL 60 να γραφεί μια διαδικασία που να ανταλλάσσει τις τιμές δύο παραμέτρων, αν αυτές είναι μια παράμετρος τύπου ακεραίου και ένας πίνακας που δεικτοδοτείται από την ίδια μεταβλητή ακεραίου.[16] Έστω ότι περνιέται ένας δείκτης στη swap(i, A[i]) σε μια συνάρτηση. Τότε, κάθε φορά που γίνεται αναφορά στη swap(), αυτή αποτιμάται πάλι. Έστω ότι i := 1 και A[i] := 2, ώστε κάθε φορά που γίνεται αναφορά στη swap(), αυτή θα επιστρέψει τον άλλο συνδυασμό των τιμών ([1,2], [2,1], [1,2], και ομοίως). Άλλη προβληματική περίπτωση είναι το πέρασμα μιας συνάρτησης random() που να επιστρέφει τυχαίες τιμές.

Όμως, η κλήση κατ' όνομα εξακολουθούσε να αποτελεί αγαπημένο θέμα όσων υλοποιούσαν την ALGOL λόγω του ενδιαφέροντος που είχε ο μηχανισμός των "thunks" που χρησιμοποιήθηκε για να την υλοποιήσει. Ο Ντόναλντ Κνουθ εφηύρε το τεστ "άντρας ή αγόρι" ("man or boy test"), για να ξεχωρίσει μεταξύ των μεταγλωττιστών που υλοποιούσαν σωστά την αναδρομή και τις μη-τοπικές αναφορές. Το τεστ αυτό περιλαμβάνει ένα παράδειγμα της κλήσης κατ' όνομα.

Η ALGOL 68 ορίστηκε χρησιμοποιώντας ένα φορμαλισμό γραμματικής δύο επιπέδων που εφευρέθηκε από τον Adriaan van Wijngaarden και από τότε έχει το όνομά του. Οι γραμματικές van Wijngaarden χρησιμοποιούν μια γραμματική χωρίς συμφραζόμενα (context-free grammar) για να παράγουν ένα άπειρο σύνολο από παραγωγές που αναγνωρίζουν ένα συγκεκριμένο πρόγραμμα ALGOL 68 - ειδικότερα, μπορούν να εκφράσουν τις απαιτήσεις αυτές που σε άλλα πρότυπα γλωσσών προγραμματισμού αποκαλούνται "σημασιολογία" και πρέπει να εκφραστούν σε (μη ακριβή) φυσική γλώσσα, σαν κείμενο, και στη συνέχεια να υλοποιηθούν στο μεταγλωττιστή σαν ad hoc κώδικας που συνδέεται με το συντακτικό αναλυτή της γλώσσας.

Παραδείγματα και ζητήματα μεταφερσιμότητας[Επεξεργασία | επεξεργασία κώδικα]

Συγκρίσεις δειγμάτων κώδικα[Επεξεργασία | επεξεργασία κώδικα]

ALGOL 60[Επεξεργασία | επεξεργασία κώδικα]

(Ο τρόπος που γράφεται το κείμενο με έντονα γράμματα, εξαρτάται από την υλοποίηση, για παράδειγμα μπορεί να είναι 'INTEGER' (μαζί με τα εισαγωγικά) ή integer (αυτό ονομάζεται stropping).

procedure Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k);
    value n, m; array a; integer n, m, i, k; real y;
comment Το απόλυτα μεγαλύτερο στοιχείο του πίνακα a, μεγέθους n επί m,
μεταφέρεται στην y και οι δείκτες αυτού του στοιχείου είναι i και k;
begin integer p, q;
    y := 0; i := k := 1;
    for p:=1 step 1 until n do
    for q:=1 step 1 until m do
        if abs(a[p, q]) > y then
            begin y := abs(a[p, q]);
            i := p; k := q
            end
end Absmax

Ακολουθεί ένα παράδειγμα παραγωγής ενός πίνακα στην Elliott 803 ALGOL.[17]

 FLOATING POINT ALGOL TEST'
 BEGIN REAL A,B,C,D'
 READ D'
 FOR A:= 0.0 STEP D UNTIL 6.3 DO
 BEGIN
   PRINT PUNCH(3),££L??'
   B := SIN(A)'
   C := COS(A)'
   PRINT PUNCH(3),SAMELINE,ALIGNED(1,6),A,B,C'
 END'
 END'

η PUNCH(3) στέλνει την έξοδο στον εκτυπωτή (teleprinter) αντί για το διατρητή ταινίας (tape punch).
η SAMELINE αποκρύπτει την αλλαγή γραμμής που τυπώνεται κανονικά ανάμεσα σε δύο παραμέτρους.
η ALIGNED(1,6) θέτει τη μορφή της εξόδου σαν 1 ψηφίο πριν και 6 ψηφία μετά από την υποδιαστολή.

ALGOL 68[Επεξεργασία | επεξεργασία κώδικα]

Ο ακόλουθος κώδικας είναι ο αντίστοιχος σε ALGOL 68 του πρηγούμενου κώδικα σε ALGOL 60.

Η ALGOL 68 κάνει χρήση του stropping της ALGOL 60. Στην ALGOL 68, οι λέξεις με έντονα γράμματα είναι δεσμευμένες λέξεις, τύποι (modes) ή τελεστές.

proc abs max = ([,]real a, ref real y, ref int i, k)real:
comment Το απόλυτα μεγαλύτερο στοιχείο του πίνακα a, μεγέθους ⌈a επί 2⌈a
μεταφέρεται στην y και οι δείκτες του στοιχείου είναι i και k; comment
begin
   real y := 0; i := ⌊a; k := 2⌊a;
   for p from ⌊a to ⌈a do
     for q from 2⌊a to 2⌈a do
       if abs a[p, q] > y then
           y := abs a[p, q];
           i := p; k := q
       fi
     od
   od;
   y
end # abs max #

Σημείωση: τα κατώτερα (⌊) και ανώτερα (⌈) όρια ενός πίνακα, και οι "φέτες" πίνακα (array slicing), είναι διαθέσιμα στον προγραμματιστή.

δοκιμή με αριθμούς κινητής υποδιαστολής (floating point) σε algol68:
(
  real a,b,c,d;
  printf(($pg$,"Εισάγετε d:"));
  read(d);
  for step from 0 while a:=step*d; a <= 2*pi do
    printf($l$);
    b := sin(a);
    c := cos(a);
    printf(($z-d.6d$,a,b,c))
  od
)

printf - στέλνει την έξοδο στο αρχείο πρότυπη έξοδος (stand out).
printf($p$); - επιλέγει μια νέα σελίδα (new page).
printf($l$); - επιλέγει μια νέα γραμμή (new line).
printf(($z-d.6d$,a,b,c)) - μορφοποιεί την έξοδο με 1 ψηφίο πριν και 6 ψηφία μετά την υποδιαστολή.

Χρονοδιάγραμμα: Hello world[Επεξεργασία | επεξεργασία κώδικα]

Οι διαφορές και η έλλειψη φορητότητας των προγραμμάτων μεταξύ των υλοποιήσεων φαίνεται από το κλασικό πρόγραμμα που εκτυπώνει τη φράση "hello world".

ALGOL 58 (IAL)[Επεξεργασία | επεξεργασία κώδικα]

Η ALGOL 58 δεν είχε δυνατότητες εισόδου/εξόδου.

Οικογένεια της ALGOL 60[Επεξεργασία | επεξεργασία κώδικα]

Η ALGOL 60 δεν είχε δυνατότητες εισόδου/εξόδου, επομένως δεν υπάρχει μεταφέρσιμη έκδοση του προγράμματος στην ALGOL. Το πρόγραμμα που ακολουθεί θα μπορούσε να μεταγλωττιστεί και να εκτελεστεί σε μια υλοποίηση της ALGOL για έναν υπολογιστή Unisys A-Series mainframe, και αποτελεί μια απευθείας απλοποιημένη έκδοση του κώδικα από το The Language Guide του Dearborn Computer and Information Science Department του Πανεπιστημίου του Μίσιγκαν.[18]

BEGIN
  FILE F(KIND=REMOTE);
  EBCDIC ARRAY E[0:11];
  REPLACE E BY "HELLO WORLD!";
  WRITE(F, *, E);
END.

Ένα απλό πρόγραμμα που χρησιμοποιεί απευθείας μορφή:

BEGIN
  FILE F(KIND=REMOTE);
  WRITE(F, <"HELLO WORLD!">);
END.

Ένα ακόμα πιο απλό πρόγραμμα που χρησιμοποιεί την εντολή Display:

BEGIN DISPLAY("HELLO WORLD!") END.

Ακολουθεί ένα εναλλακτικό παράδειγμα, που χρησιμοποιεί την είσοδο/έξοδο της Elliott Algol. Η Elliott Algol χρησιμοποιούσε διαφορετικούς χαρακτήρες για τα δεξιά εισαγωγικά και τα αριστερά εισαγωγικά, τους ‘ και ’.

 program HiFolks;
 begin
    print ‘Hello world’;
 end;

Ακολουθεί μια έκδοση για την Elliott 803 Algol (A104). Το Elliott 803 κλασικά χρησιμοποιούσε χαρτοταινία με 5 τρύπες και είχε μόνο κεφαλαία γράμματα. Ο κώδικας δεν είχε χαρακτήρες εισαγωγικών και χρησιμοποιούνταν το £ (σύμβολο της λίρας του Ηνωμένου Βασιλείου) για το αριστερό εισαγωγικό και το ? (αγγλικό ερωτηματικό) για το δεξιό εισαγωγικό. Οι ειδικές ακολουθίες τοποθετούνταν σε διπλά εισαγωγικά (π.χ. η ££L?? παρήγαγε μια νέα γραμμή στον εκτυπωτή).

  HIFOLKS'
  BEGIN
     PRINT £HELLO WORLD£L??'
  END'

Η ICT 1900 Algol επέτρεπε είσοδο από χαρτοταινία ή διάτρητη κάρτα. Σε κατάσταση χαρτοταινίας, επέτρεπε πεζά γράμματα. Η έξοδος εμφανιζόταν σε έναν εκτυπωτή γραμμής (line printer).

  'BEGIN'
     'WRITE TEXT'("HELLO WORLD");
  'END'

ALGOL 68[Επεξεργασία | επεξεργασία κώδικα]

Ο κώδικας σε ALGOL 68 εμφανιζόταν με τις δεσμευμένες λέξεις σε πεζά γράμματα αλλά με έντονη γραφή ή υπογράμμιση.

begin
  printf(($gl$,"Hello, world!"))
end

Οι δυνατότητες εισόδου/εξόδου στην αναφορά της γλώσσας ("Algol 68 Report") αποκαλούνταν "Transput".

Χρονοδιάγραμμα των ειδικών χαρακτήρων της ALGOL[Επεξεργασία | επεξεργασία κώδικα]

Αυτό το λήμμα περιλαμβάνει χαρακτήρες Unicode 5.2 (βλ. "Miscellaneous Technical"). Αν δεν έχετε ειδική υποστήριξη για την εμφάνισή τους, μπορεί να δείτε ερωτηματικά, μικρά κουτιά ή άλλα σύμβολααντί για κάτι όπως το "10" (Decimal Exponent Symbol U+23E8).

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

1960: IFIP - Η γλώσσα Algol 60 και η αναφορά για αυτήν περιλάμβαναν διάφορα μαθηματικά σύμβολα που είναι διαθέσιμα στους σύγχρονους υπολογιστές και λειτουργικά συστήματα αλλά δεν υποστηρίζονταν στους περισσότερους υπολογιστές της εποχής. Για παράδειγμα: ×, ÷, ≤, ≥, ≠, ¬, ∨, ∧, ⊂, ≡, ␣ και ⏨.

1961, Σεπτέμβριος: ASCII - Το σύνολο χαρακτήρων ASCII, τότε σε αρχικό στάδιο ανάπτυξης, απέκτησε το χαρακτήρα \ (Κάθετος ή Back slash) ώστε να υποστηρίξει τους τελεστές αλήθειας της ALGOL /\ και \/.[19]

1962: ALCOR - Αυτό το σύνολο χαρακτήρων περιλάμβανε τον ασυνήθιστο χαρακτήρα "᛭" (iron/runic cross) και το σύμβολο "⏨" (Decimal Exponent Symbol) για το συμβολισμός κινητής υποδιαστολής. [20]

1964: GOST - Το Ρωσικό πρότυπο GOST 10859 του 1964 επέτρεπε την κωδικοποίηση χαρακτήρων 4-bit, 5-bit, 6-bit και 7-bit characters στην ALGOL.[21]

1968: Η αναφορά ("Algol 68 Report") - έκανε χρήση των ήδη υπαρχόντων χαρακτήρων της ALGOL, και αργότερα υιοθέτησε τους χαρακτήρες →, ↓, ↑, □, ⌊, ⌈, ⎩, ⎧, ○, ⊥ και ¢ του πληκτρολογίου IBM 2741 με τις κεφαλές εκτύπωσης τύπου "golf-ball" (όπως και στην APL), που ήταν διαθέσιμοι στα μέσα της δεκαετίας του 1960, όσο προδιαγραφόταν η ALGOL 68. Η αναφορά μεταφράστηκε στα Ρώσικα, τα Γερμανικά, τα Γαλλικά και τα Βουλγάρικα, και επέτρεπε τον προγραμματισμό σε γλώσσες με μεγαλύτερα σύνολα χαρακτήρων, όπως το Κυριλλικό αλφάβητο του Ρωσικού BESM-4. Όλοι οι χαρακτήρες της ALGOL είναι επίσης μέρος του προτύπου unicode και οι περισσότεροι από αυτούς είναι διαθέσιμοι σε πολλές από τις γνωστές γραμματοσειρές.

2009, Οκτώβριος: Unicode - Το "⏨" (Decimal Exponent Symbol) του συμβολισμού αριθμών κινητής υποδιαστολής προστέθηκε στο Unicode 5.2 για συμβατότητα με ιστορικό λογισμικό σε ALGOL για το διαστημόπλοιο Μπουράν.

Δείτε επίσης[Επεξεργασία | επεξεργασία κώδικα]

Αναφορές[Επεξεργασία | επεξεργασία κώδικα]

  1. Το όνομα των γλωσσών που ανήκουν σε αυτήν την οικογένεια συχνά δίνεται είτε σε συνδυασμό κεφαλαίων και πεζών (Algol 60), είτε μόνο σε κεφαλαία (ALGOL 68 Αρχειοθετήθηκε 2010-01-18 στο Wayback Machine.). Το άρθρο αυτό χρησιμοποιεί τον όρο ALGOL για απλότητα.
  2. βλ. Ψευδοκώδικας
  3. Backus, J. W.· Bauer, F. L.· Green, J.· Katz, C.· McCarthy, J.· Perlis, A. J.· Rutishauser, H.· Samelson, K.· Vauquois, B.· Wegstein, J. H.· van Wijngaarden, A.· Woodger, M. (1960). Naur, Peter, επιμ. Report on the Algorithmic Language ALGOL 60. Copenhagen. doi:10.1145/367236.367262. ISSN 0001-0782. 
  4. «Revised Report on the Algorithmic Language Algol 60». 1963. Ανακτήθηκε στις 8 Ιουνίου 2007. 
  5. «Revised Report on the Algorithmic Language ALGOL 68» (PDF). 1973. Ανακτήθηκε στις 25 Αυγούστου 2010. [νεκρός σύνδεσμος]
  6. Knuth, Donald E. (1964) Backus Normal Form vs Backus Naur Form. Communications of the ACM 7(12):735-736
  7. "As editor of the ALGOL Bulletin I was drawn into the international discussions of the language and was selected to be member of the European language design group in November 1959. In this capacity I was the editor of the ALGOL 60 report, produced as the result of the ALGOL 60 meeting in Paris in January 1960."
  8. ACM Award Citation / Peter Naur, 2005
  9. "The meetings were exhausting, interminable, and exhilarating. One became aggravated when one's good ideas were discarded along with the bad ones of others. Nevertheless, diligence persisted during the entire period. The chemistry of the 13 was excellent."
  10. "Here is a language so far ahead of its time that it was not only an improvement on its predecessors but also on nearly all its successors." "Hints on Programming Language Design" Αρχειοθετήθηκε 2009-09-15 στο Wayback Machine., C.A.R. Hoare, December 1973. Page 27. (Συχνά η πρόταση αυτή αποδίδεται λανθασμένα στον Έντσγκερ Ντάικστρα, ο οποίος επίσης εργάστηκε στην υλοποίηση του πρώτου μεταγλωττιστή της ALGOL 60.)
  11. H. Abelson· R. K. Dybvig· C. T. Haynes· G. J. Rozas· N. I. Adams IV· D. P. Friedman· E. Kohlbecker· G. J. Sussman· D. H. Bartley· R. Halstead· D. Oxley· M. Wand· G. Brooks· C. Hanson· K. M. Pitman. Jonathan Rees· William Clinger, επιμ. «Revised(3) Report on the Algorithmic Language Scheme, (Dedicated to the Memory of ALGOL 60)». Ανακτήθηκε στις 20 Οκτωβρίου 2009. 
  12. Peter O'Hearn and Robert D. Tennent. 1996. Algol-Like Languages. Birkhauser Boston Inc., Cambridge, MA, USA.
  13. «The Encyclopedia of Computer Languages». Αρχειοθετήθηκε από το πρωτότυπο στις 27 Σεπτεμβρίου 2011. Ανακτήθηκε στις 10 Απριλίου 2011. 
  14. Computer Museum History, Historical Zuse-Computer Z23, restored by the Konrad Zuse Schule in Hünfeld, for the Computer Museum History Center in Mountain View (California) USA
  15. Kruseman Aretz, F.E.J. (30 Ιουνίου 2003). «The Dijkstra-Zonneveld ALGOL 60 compiler for the Electrologica X1». Software Engineering (PDF). History of Computer Science. Kruislaan 413, 1098 SJ Amsterdam: Centrum Wiskunde & Informatica. [νεκρός σύνδεσμος]
  16. Aho, Alfred V.· Ravi Sethi· Jeffrey D. Ullman (1986). Compilers: Principles, Techniques, and Tools (1η έκδοση). Addison-Wesley. ISBN 0-201-10194-7. , Τμήμα 7.5, και οι εκεί αναφορές
  17. "803 ALGOL", το εγχειρίδιο της Elliott 803 ALGOL
  18. «Hello world! ALGOL Example Program page». Αρχειοθετήθηκε από το πρωτότυπο στις 4 Φεβρουαρίου 2010. Ανακτήθηκε στις 13 Απριλίου 2011. 
  19. How ASCII Got Its Backslash Αρχειοθετήθηκε 2012-11-14 στο Wayback Machine., Bob Bemer
  20. Baumann, R. (1962). «ALGOL Manual of the ALCOR Group, Pts. 1, 2 & 3 [ALGOL Manual of the ALCOR Group]» (στα German). Elektronische Rechenanlagen (Oct. 1961), 206-212; No. 6 (Dec. 1961), 259-265; No. 2 (Apr. 1962). 
  21. «GOST 10859 standard». Αρχειοθετήθηκε από το πρωτότυπο στις 16 Ιουνίου 2007. Ανακτήθηκε στις 5 Ιουνίου 2007. 

Περαιτέρω διάβασμα[Επεξεργασία | επεξεργασία κώδικα]

  • F.L. Bauer, R. Baumann, M. Feliciano, K. Samelson, Introduction to Algol. Prentice Hall, 1964, ISBN 0-134-77828-6
  • B. Randell and L.J. Russell, ALGOL 60 Implementation: The Translation and Use of ALGOL 60 Programs on a Computer. Academic Press, 1964. The design of the Whetstone Compiler. Μια από τις πρώτες δημοσιεύσεις για την υλοποίηση μεταγλωττιστή για τη γλώσσα. Δείτε σχετικά: Whetstone Algol Revisited, and The Whetstone KDF9 Algol Translator, B. Randell
  • E. W, Dijkstra, Algol 60 translation: an algol 60 translator for the x1 and making a translator for algol 60, report MR 35/61. Mathematisch Centrum, Amsterdam, 1961. [1]

Εξωτερικοί σύνδεσμοι[Επεξεργασία | επεξεργασία κώδικα]