Emacs

Ιστορία

Η ανάπτυξη του Emacs άρχισε στο MIT AI Lab τη δεκαετία του 1970. Πριν εμφανιστεί ο Emacs, το Incompatible Timesharing System (ITS), το οποίο ήταν το λειτουργικό σύστημα των υπολογιστών PDP-6 και PDP-10 του εργαστηρίου είχε έναν δικό του διορθωτή γραμμής (line editor), τον Tape Editor and Corrector (TECO) (αργότερα γνωστό και ως Text Editor and Corrector, όπου ‘tape' σήμαινε την χάρτινη ταινία που χρησιμοποιούσαν οι χρήστες τότε). Σε αντίθεση με τους σύγχρονους διορθωτές κειμένου, ο TECO είχε διαφορετικές καταστάσεις εισόδου, ανάλογα με το αν ο χρήστης ήθελε να προσθέσει κείμενο, να αλλάξει υπάρχον κείμενο, ή να εμφανίσει το έγγραφο στο οποίο εργαζόταν. Όταν ο χρήστης πληκτρολογούσε κάποιον χαρακτήρα στον TECO, αυτός ο χαρακτήρας δεν γινόταν μέρος του εγγράφου αλλά ο χρήστης έπρεπε να γράψει εντολές στη γλώσσα του TECO ώστε να εισαχθούν οι απαιτούμενοι χαρακτήρες ενώ μέχρι τότε το αλλαγμένο κείμενο δεν εμφανιζόταν στην οθόνη. Η συμπεριφορά αυτή του διορθωτή μοιάζει με τη συμπεριφορά του προγράμματος ed.
Ο Ρίτσαρντ Στόλμαν επισκέφτηκε το Stanford AI Lab το 1972 ή το 1974 και είδε τον διορθωτή "E" του εργαστηρίου, ο οποίος είχε γραφτεί από τον Φρεντ Ράιτ. Εντυπωσιάστηκε από τη συμπεριφορά WYSIWYG (What You See Is What You Get - «Ό,τι βλέπεις, παίρνεις»), η οποία αποτελεί τον κανόνα στους σύγχρονους διορθωτές κειμένου. Γύρισε στο MIT, όπου ο Καρλ Μίκελσον, ένας προγραμματιστής του AI Lab, είχε προσθέσει μια συνδυασμένη κατάσταση εμφάνισης-διόρθωσης στον TECO με το όνομα "Control-R", η οποία επέτρεπε στην οθόνη να ανανεώνεται κάθε φορά που ο χρήστης πατούσε κάποιο πλήκτρο. Ο Στόλμαν υλοποίησε πάλι αυτήν τη λειτουργία, πιο αποδοτικά, και στη συνέχεια πρόσθεσε μακροεντολές στην κατάσταση εμφάνισης-διόρθωσης του TECO, επιτρέποντας στον χρήστη να χρησιμοποιεί οποιονδήποτε συνδυασμό πλήκτρων ήθελε για να τρέξει εντολές του TECO.
Ο διορθωτής E είχε ένα χαρακτηριστικό που έλειπε από τον TECO: διόρθωση σε οποιαδήποτε (τυχαία) θέση. Επειδή η αρχική υλοποίηση του TECO προοριζόταν για διόρθωση με χρήση χάρτινης ταινίας στον PDP-1, ο διορθωτής ήταν ακολουθιακός. Διορθώσεις μπορούσαν να γίνουν μόνο σε μια σελίδα κάθε φορά, ακολουθώντας τη σειρά των σελίδων στο αρχείο. Για να έχει διόρθωση σε οποιαδήποτε θέση και ο Emacs, ο Στόλμαν αποφάσισε να μην υιοθετήσει τον τρόπο που ο E κρατούσε το αρχείο για τυχαία πρόσβαση στον δίσκο, αλλά έκανε μετατροπές στον TECO ώστε να μπορεί να χειρίζεται μεγάλα κείμενα στη μνήμη πιο αποδοτικά, και στη συνέχεια άλλαξε τη μέθοδο με την οποία ο διορθωτής χειριζόταν τα αρχεία ώστε να διαβάζει, διορθώνει και γράφει ολόκληρο το αρχείο σαν έναν χώρο μνήμης (buffer). Αυτή η προσέγγιση ακολουθείται από σχεδόν όλους τους σύγχρονους διορθωτές κειμένου.
Η νέα έκδοση του TECO γρήγορα έγινε δημοφιλής στο AI Lab και σύντομα μαζεύτηκαν πολλές νέες μακροεντολές, των οποίων τα ονόματα συχνά έληγαν σε "MAC" ή "MACS" (από τη λέξη "macro"). Δύο χρόνια αργότερα, ο Γκάι Στιλ ανέλαβε να συγκεντρώσει όλες αυτές τις διαφορετικές μακροεντολές σε ένα σύνολο. Ο Στιλ και ο Στόλμαν συνεργάστηκαν και ο δεύτερος τελείωσε την υλοποίηση, η οποία υποστήριζε την επέκταση και την τεκμηρίωση αυτού του νέου συνόλου μακροεντολών. Το σύστημα που προέκυψε ονομάστηκε EMACS, από τη φράση "Editing MACroS" («μακροεντολές διόρθωσης»). Μια άλλη άποψη είναι ότι EMACS σήμαινε "E with MACroS" («E με μακροεντολές»). Ο Στόλμαν έχει πει ότι επέλεξε το όνομα Emacs γιατί εκείνη την περίοδο το <E> δεν χρησιμοποιούνταν ως συντομογραφία στο ITS.
Σύμφωνα με τον Στόλμαν, το πρώτο λειτουργικό σύστημα EMACS εμφανίστηκε στο τέλος του 1976.
Σύμφωνα με τον Στόλμαν, ο EMACS έπρεπε να είναι διαθέσιμος με βάση την κοινότητα και όλες οι βελτιώσεις του διορθωτή έπρεπε να στέλνονται στον Στόλμαν για προσθήκη στην επόμενη έκδοση που θα κυκλοφορούσε.
Ο αρχικός Emacs, όπως και ο TECO, έτρεχε μόνο στη σειρά υπολογιστών PDP. Είχες τόσες διαφορές σε σχέση με τον TECO που θεωρούνταν ξεχωριστός διορθωτής. Σύντομα έγινε το βασικό πρόγραμμα διόρθωσης κειμένου στο ITS. Η υλοποίησή του μεταφέρθηκε επίσης από τον Μάικλ Μακμάον, από το ITS στα λειτουργικά συστήματα Tenex και TOPS-20, αλλά τον πρώτο καιρό όχι στο Unix. Άλλα άτομα που συνεισέφεραν στις πρώτες εκδόσεις του Emacs ήταν ο Kent Pitman, ο Earl Killian και ο Eugene Ciccarelli. Μέχρι το 1979 ο Emacs ήταν ο πιο δημοφιλής διορθωτής στα εργαστήρια τεχνητής νοημοσύνης και επιστήμης υπολογιστών του MIT.

Άλλες πρώιμες υλοποιήσεις

Κάποιοι προγραμματιστές έγραψαν διορθωτές που έμοιαζαν στον Emacs τα χρόνια που ακολούθησαν, για άλλα υπολογιστικά συστήματα, για παράδειγμα ο EINE ("EINE Is Not EMACS") και ο ZWEI ("ZWEI Was EINE Initially") γράφτηκαν από τον Μάικλ Μακμάχον και τον Ντάνιελ Βάινραϊμπ για τη μηχανή Lisp (Lisp machine). Ο EINE του Βάινραϊμπ ήταν ο πρώτος Emacs που γράφτηκε σε Lisp. Ο Sine ("Sine Is Not Eine") γράφτηκε από τον Όουεν Θίοντορ Άντερσον. Το 1978, ο Μπέρναρντ Γκρίνμπεργκ έγραψε τον Multics Emacs σχεδόν εξολοκλήρου σε Multics Lisp στο Cambridge Information Systems Lab της Honeywell, ενώ ο Ρίτσαρντ Σόλι με τον Μπάρι Μάργκολιν ανέλαβαν στη συνέχεια τη συντήρηση του κώδικα (ο πρώτος ανέπτυξε και τον διορθωτή NILE που έμοιαζε με τον Emacs, για το NIL Project). Πολλές εκδόσεις του Emacs, όπως ο GNU Emacs, στη συνέχεια υιοθέτησαν τη Lisp σαν γλώσσα επέκτασης.
Ο Τζέιμς Γκόσλινγκ (ο οποίος αργότερα εφηύρε το NeWS και τη γλώσσα προγραμματισμού Java) έγραψε τον πρώτο διορθωτή τύπου Emacs που έτρεχε στο Unix, τον Gosling Emacs, το 1981. Τον έγραψε σε C και για γλώσσα επέκτασης χρησιμοποίησε μια γλώσσα της οποίας η σύνταξη έμοιαζε με Lisp, την Mocklisp. Ο διορθωτής ήταν ιδιόκτητο λογισμικό το 1984.

GNU Emacs

Το 1984 ο Στόλμαν άρχισε να δουλεύει πάνω στον GNU Emacs ώστε να δημιουργήσει ένα ισοδύναμο ελεύθερο λογισμικό του Gosling Emacs. Αρχικά βασίστηκε στον Gosling Emacs, αλλά αντικατέστησε τον διερμηνέα της Mocklisp με έναν διερμηνέα για κανονική Lisp, κάτι που οδήγησε σε αλλαγή σχεδόν ολόκληρου του πηγαίου κώδικα. Το αποτέλεσμα ήταν το πρώτο πρόγραμμα του νέου τότε Εγχειρήματος GNU. Ο GNU Emacs είναι γραμμένος σε C και παρέχει την Emacs Lisp (που είναι υλοποιημένη σε C) σαν γλώσσα επέκτασης. Η έκδοση 13, η πρώτη έκδοση για το κοινό, κυκλοφόρησε στις 20 Μαρτίου του 1985. Η πρώτη έκδοση ευρείας κυκλοφορίας του GNU Emacs ήταν η 15.34, η οποία εμφανίστηκε προς το τέλος του 1985. Εκδόσεις με αριθμούς από 2 έως 12 δεν υπήρξαν ποτέ. Οι προηγούμενες εκδόσεις του GNU Emacs είχαν αρίθμηση της μορφής "1.x.x", αλλά κάποια στιγμή μετά την έκδοση 1.12 πάρθηκε η απόφαση να παραλείπεται το "1", επειδή θεωρούνταν ότι ο κύριος αριθμός έκδοσης δε θα άλλαζε ποτέ.
Ο GNU Emacs αργότερα μεταφέρθηκε στο Unix. Επειδή είχε περισσότερα χαρακτηριστικά σε σχέση με τον Gosling Emacs, και ειδικότερα μια πλήρη έκδοση της Lisp σαν γλώσσα επέκτασης, γρήγορα αντικατέστησε τον Gosling Emacs και έγινε ο ντε φάκτο διορθωτής τύπου Emacs στο Unix. Μια τρύπα ασφάλειας στο υποσύστημα ηλεκτρονικού ταχυδρομείου του GNU Emacs χρησιμοποιήθηκε από τον Μάρκους Ες στις ηλεκτρονικές επιθέσεις του το 1986 για να αποκτήσει πρόσβαση υπερχρήστη σε υπολογιστικά συστήματα που έτρεχαν Unix.
Μέχρι το 1999, η ανάπτυξη του GNU Emacs ακολουθούσε ένα σχετικά κλειστό μοντέλο, σε σημείο που να θεωρείται παράδειγμα του στυλ ανάπτυξης «καθεδρικός» στο βιβλίο Ο Καθεδρικός και το Παζάρι (The Cathedral and the Bazaar). Το εγχείρημα αργότερα απέκτησε μια δημόσια λίστα ηλεκτρονικού ταχυδρομείου για θέματα ανάπτυξης και ανώνυμη πρόσβαση CVS. Η ανάπτυξη γινόταν σε έναν μόνο χώρο (trunk) του CVS μέχρι το 2008, ενώ σήμερα χρησιμποιείται το κατανεμημένο σύστημα ελέγχου εκδόσεων Bazaar.
Ο Ρίτσαρντ Στόλμαν παρέμεινε συντηρητής του GNU Emacs στο μεγαλύτερο διάστημα της ανάπτυξης του προγράμματος, αλλά με αρκετά διαλείμματα. Το τελευταίο άρχισε το 2008 και διαρκεί μέχρι σήμερα, με τη συντήρηση να έχει ανατεθεί στον Στέφαν Μονιέ και τον Τσονγκ Γιντόνγκ.

XEmacs

Από το 1991, ο Τζέιμι Ζοΐνσκι και άλλοι προγραμματιστές στην Lucid Inc. ανέπτυξαν τον Lucid Emacs, με βάση μια παλιά έκδοση άλφα της έκδοσης 19 του GNU Emacs. Οι δύο πηγαίοι κώδικες σύντομα απέκλιναν και οι δύο ξεχωριστές ομάδες ανάπτυξης σταμάτησαν να προσπαθούν να τις ενώσουν σε ένα πρόγραμμα. Αυτή ήταν μια από τις πιο γνωστές πρώτες διακλαδώσεις (fork) ενός προγράμματος ελεύθερου λογισμικού. Ο Lucid Emacs στη συνέχεια μετονομάστηκε σε XEmacs και παραμένει η δεύτερη πιο δημοφιλής έκδοση του Emacs, μετά τον GNU Emacs.

Άλλες εκδόσεις και κλώνοι

Έχουν κυκλοφορήσει αρκετές παραλλαγές του GNU Emacs, όπως η Ιαπωνική έκδοση για MS Windows (Meadow), η έκδοση του XEmacs από τον Steve Youngs (SXEmacs), και μια έκδοση που ενσωματώνεται στη διεπαφή χρήστη του Apple Macintosh (Aquamacs).
Υπάρχουν πολλοί κλώνοι του Emacs, οι οποίοι δεν βασίζονται σε κώδικα του GNU Emacs. Πολλοί κλώνοι δημιουργήθηκαν επειδή ο GNU Emacs αρχικά απαιτούσε χώρο διευθύνσεων 32-bit και τουλάχιστον 1 MiB μνήμης RAM. Αυτό σήμαινε ότι υπήρχε χώρος για μικρότερες υλοποιήσεις, σε μια εποχή που οι υπολογιστές με αυτά τα χαρακτηριστικά ήταν ακριβοί. Κάποιοι από τους πιο γνωστούς κλώνους είναι ο MicroEMACS, ο mg (αρχικά MicroGNUEmacs και αργότερα mg2a), ο οποίος σήμερα εγκαθίσταται εξορισμού στο OpenBSD, ο NotGNU, ο JOVE (Jonathan's Own Version of Emacs), ο Perfect Writer για το CP/M, ο Freemacs για το DOS, ο MINCE (MINCE Is Not Complete Emacs) για CP/M και DOS, ο Zile (Zile Is Lossy Emacs), ο Climacs (βασισμένος σε Common Lisp),ο QEmacs,, ο Epsilon , (εκδόσεις για DOS, Windows, GNU/Linux, FreeBSD, Mac OS X και O/S 2), ο EmACT και ο PceEmacs, ο διορθωτής της SWI-Prolog.
Διορθωτές που έχουν υποστήριξη για κατάσταση Emacs είναι ο Yi (βασισμένος σε Haskell), ο Joe's Own Editor και ο JED.