Monday, July 23, 2012

How Emacs changed my life

Yukihiro "Matz" Matzumoto spiega How Emacs Changed my Life.

La cambiò anche a me nel 1978, quando imparai ad usarlo all'AI Lab del MIT, lavorando a fianco sulla stessa tastiera della Lisp Machine con Richard Stallman.

Emacs era l'editore che si usava su qualunque terminale del laboratorio, molti dei quali erano collegati con un peculiare meccanismo di video switch al DEC-10 su cui girava il sistema operativo ITS (Incompatible Time Sharing), le cui prerogative di sicurezza erano descritte dal motto "Security by obscurity".

Il video switch era tale che chiunque poteva switchare una delle uscite sul proprio display, e in questo modo poteva vedere quello che qualcun altro stava facendo.

Il principio era quello che in un laboratorio universitario nulla doveva essere segreto.
Naturalmente era buona educazione non usare questo meccanismo per fini malevoli.
Uno degli scopi utili era quello di fare mentoring. Una persona più esperta, per esempio, poteva "osservare da dietro le spalle" quello che faceva un giovane, e suggerirgli modi di migliorare il suo lavoro.

Io lavoravo nel gruppo dell'Actor Model di Carl Hewitt ed ero un convinto fautore della programmazione a oggetti. Poche persone del gruppo si occupavano di implementare qualcosa di utilizzabile con quella metafora di programmazione e al MIT il linguaggio preferito era il Mac Lisp, che non aveva meccanismi di programmazione a oggetti.

Per dimostrare l'utilità della programmazione a oggetti decisi di implementare un sistema grafico a finestre sulla Lisp Machine, che aveva uno dei primi schermi a bitmap ad alta risoluzione.

Con Gianfranco Prini e Carlo Montangero, avevamo fatto una proposta per un linguaggio intermedio per supportare linguaggi ad oggetti, che avevamo chiamato SMOM (Structured Memory Oriented Machine).
Sostituite "Structured Memory Oriented" con "Object Oriented" e capite di cosa si trattava: il termine "object" non era ancora diventato di uso comune.

Comunque, per fare in fretta, partii da una bozza di linguaggio a oggetti su cui Richard Greenblatt stava lavorando, che forniva i costrutti defclass e defmethod, scritti usando il meccanismo di macro del MacLisp. Imparai così costrutti strani come il backquote (`), il comma (,) che annulla il backquote, e il comma-ampersand (,@) per fare list splicing, concetti di meta-programmazione che ancora oggi pochi linguaggi suportano,  il cui utilizzo è mind-boggling, specie se i costrutti si annidano uno dentro l'altro.
Con queste primitive a oggetti scrissi un primo prototipo di sistema a finestre, con una sua gerarchia di classi derivate dalla classe Window, con specializzazioni per Menu, PopupMenu, Scroller, etc.
Per convincere la gente ad usarlo, mancava una killer application.
Siccome tutti usavano Emacs, decisi che avrei datto una versione di Emacs, che lavorasse su finestre e potesse usare il mouse per selezionare, fare apparire menu, spostare pezzi di testo, ecc.

Incominciai a lavorarci e quando fui a buon punto, chiamai Richard Stallman per completare il lavoro.
Ci mettemmo a fianco alla stessa tastiera (anticipando il pair-programming della metodologia di Extreme Programming).
Io scrivevo e lui osservava, ogni tanto dandomi dei consigli.
Per esempio, notava che spesso dovevo cancellare tutti gli spazi per spostare un testo a sinista e lui mi suggerì il comando Emacs apposta per questo: M-\.

Arrivammo al punto in cui bisognava entrare all'interno del codice di Emacs.
Quello sulla Lisp Machine era una versione interamente scritta in Lisp, diversamente da quella usata sugli altri terminali che era scritta in TECO, emulando E, l'editore di Stanford, da cui il nome E-macs, o E macros.
Quindi ci scambiammo di posto e lui cominciò a manipolare il codice di Emacs, usando ovviamente Emacs.
Ogni tanto decideva: "questo codice non deve star qui" e prendeva intere pagine di codice e le spostava da un file all'altro.
Usava Emacs a una velocità impressionante, dato che in pratica la sua mente e Emacs erano un tutt'uno e ciò che lui pensava si trasformava direttamente in emissione di comandi attraverso le sue dita.
Per chi conosce Emacs, questo non sorprende, perché si possono gestire più buffer e spostarsi da uno all'altro con semplice C-x-b.
Poi con C-M-x poteva compilare ed eseguire immediatmente i pezzi di codice che aveva modificato e questi entravano immediatamente in funzione.

Attenzione, le modifiche che effettuava diventavo immediatemante esecutive, per cui cambiava il funzionamento dello stesso editore che stava usando per fare le modifiche.
Capite bene che se avesse commesso un errore, sarebbe stato un disastro, perché avrebbe reso inutilizzabile lo strumento per programmare.

Richard non fece errori e in meno di un paio d'ore Emacs a finestre era in funzione e disponibile per tutti.
Tutti si fa per dire: a quel tempo c'erano solo due Lisp Machine in tutto e la gente se le contendeva.
Spesso bisognava aspettare fino a tarda notte, e infatti questo episodio si svolse di notte, credo ben oltre la mezzanotte.

Questo non era insolito, infatti molti degli hacker del MIT lavoravano fino alle ore piccole, e di frequente verso le 3 qualcuno faceva il giro a chiedere (foodp), e si partiva tutti per andare a China Town a Boston a mangiare cibo cinese in uno dei ristoranti cinesi favoriti. Qualcuno infatti decretò che "You can't get a degree from MIT if you don't learn how to eat with chopsticks".

Pur avendomi aiutato a metter in funzione Emacs a finestre, Richard disse che non lo riteneva molto importante, e che si poteva fare tutto con la tastiera senza bisogno del mouse.
Ne nacque una discussione in cui sostenevo che l'uso del mouse era molto più intuitivo, e si evitava di dover ricordare tutti i comandi, facendo uso del mouse e svolgendo certe operazioni direttamente con il mouse.

Richard decise quindi di sfidarmi. Avremmo dovuto svolgere a turno delle funzioni per verificare chi faceva prima.
Cominciò lui a suggerire di spostare un certo testo da un posto all'altro. Lui lo fece con pochi comandi da tastiera, facendo una search incrementale per andare al posto giusto e poi tornando indietro con C-x-C-x.
Io mi spostai col mouse, arrivando rapidamente nella zona da selezionare, ma poi dovendo rallentare per sceglire il punto preciso di inizio. Poi feci apparire il pop-up con i comandi di Cut/Paste/Copy, mi spostai al punto di arrivo e feci di nuovo riapparire il menu.
1-0 per lui. Poi toccò a me suggerire dei task. Su qualcuno riusci a batterlo, ma in generale vinse lui.

Comunque io rimasi convinto che la strada delle interfacce grafiche sarebbe stata determinante per rendere le macchine più adatte al vasto pubblico dei non informatici.

Poco dopo proseguii, con Maria Simi, a sviluppare un sistema di Form attive, ossia finestre suddivise per tabelle di campi, tra i quali erano indicate delle relazioni, espresse nel linguaggio di descrizione Omega.
Come esempio facemmo vedere come si poteva compilare una fattura, in cui si inserivano le cifre nei campi e venivano calcolati automaticamente i totali.
La soluzione piacque moltissimo, e ricordo che la facemmo vedere a molti rappresentanti di aziende che passavano dal MIT a vedere le ultime novità tecnologiche.
A quei tempi si parlava di Office Automation, come insieme di tecniche e strumenti che avrebbero potuto migliorare lo svolgimento dei compiti di un ufficio.

Per mostrare la nostra realizzazione, decidemmo di fare un video, che mostrasse varie funzioni di Office Automation che si potevano svolgere con la Lisp Machine, tra cui l'editing di testi e la stampa laser ad alta risoluzione, un editore di immagini chiamato Picturesque (fatto da me con un undergrauate), la posta elettronica con Bolio, un'estensione di Emacs il cui nome derivava dalla gelateria Emac&Bolio, che si trovava in Massachusetts Avenue. E poi c'erano le grafiche accattivanti dei clover colorati e animati di Bill Gosper.

Il filmato era a colori e con una colonna sonora fatta con brani di Mozart e con commenti a voce su ciò che si vedeva.
Era il primo video multimediale del tempo (i rari video a quei tempi al massimo erano muti) ed ebbe molto successo, per cui venni chiamato a farlo vedere in varie università, tra cui il Rensselaer Polytechnic.
Mi vennero richieste copie da entrambe le aziende nate per commercializzare la Lisp Machine (Symbolics e LM Inc., che oggi si chiamerebbero startup) che lo presentarono in occasione di vari congressi, come il AAAI a Stanford nel 1980.

Anche il sistema di Active Form si rivelò un precursore. Pochi mesi dopo, Dan Bricklin e Bob Frankston, due studenti di Harvard, a poca distanza da noi, annuciarono lo sviluppo di Visicalc, uno strumento per PC che consentiva di gestire quelli che oggi si chiamano fogli elettronici.
Visicalc aprì la rivoluzione del personal computing, lanciando l'Apple II da giocattolo per hobbyisti a strumento per uso aziendale.

Per chiudere il cerchio, qualche anno dopo feci fare al mio studente Luigi Madella, un clone di Visicalc dentro Emacs, programmato completamente in elisp, il Lisp di Emacs.

L'architettura del sistema a finestre della Lisp Machine non era secondo me molto elegante.
Si basava sull'uso di processi, e in ogni finestra risiedeva un processo distinto.
Uno dei processi si occupava di gestire il mouse, ed operava indipendentemente dagli altri.
L'interazione con il mouse era alquanto complicata: per potere ottenere informazioni dal mouse, occorreva impossessarsene. C'era una funzione per fare eseguire codice all'interno del mouse (process-mouse-run) e una il cui nome era all'incirca seize-mouse, che consentiva di impossessarsi del mouse, per esempio se uno doveva fare un drag&drop.
Il tutto rendeva la programmazione molto complicata, per esempio nella process-mouse-run non si poteva acccedere ai dati dell'applicazione, in quanto girava in un altro processo, e quindi per comunicare col mouse si doveva usare interprocess-communication, in pratica leggere e scrivere da uno stream.
Tutto era poi molto fragile, perché se un'applicazione non rilasciava il mouse rapidamente, il mouse sarebbe rimasto congelato, e nemmeno il tracking dei movimenti avrebbe proseguito.

Pertanto decisi di proporre un'architettura software diversa.
Siccome ero nel gruppo del Message Passing Semantics, l'idea fu semplicemente di fare diventare il mouse un Actor con cui si comunicava attraverso message passing.
Chi voleva leggere la posizione del mouse, poteva inviargli una richiesta.
Il problema era che in molti casi, l'applicazione deve reagire a operazioni dell'utente col mouse, piuttosto che viceversa.
Pertanto proposi che il mouse gestisse una lista di notifiche, in modo da segnalare alle applicazioni quando un evento di loro interesse si era verificato e fosse il mouse a invocare l'applicazione.
Provai a parlare a Carl Hewitt di questa mia idea e ci fu un confronto serratissimo, con lui nettamente contrario. Io ero sbalordito, perché mi pareva che la soluzione fosse proprio l'ideale per una visione ad Actor, e il fatto che lo stesso fautore degli Actor la bocciasse mi pareva un tradimento.
Fu una esperienza molto triste per me e uscii dalla discussione letteralmente in lacrime.

Avevo in pratica inventato il modello a eventi con callback, che divenne popolare qualche tempo dopo con X Window System, sviluppato da Bob Scheifler, un collega del MIT 4 piani più sotto.

PS.
Grazie ai commentatori che hanno segnalato alcune sviste.

3 comments:

The Polite Polar Bear said...

Ancora oggi io uso Emacs day-by-day da orami più di 27 anni a questa parte. Devo dire che però il primo Emcas che usai per molti anni non fu quello di Stalmann bensì quello di Gosling. Nei primi anni lo estendevo usando il suo interprete Lisp, mentre adesso oramai lo uso ASIS.

P.S. Correggi il secondo link del tuo posto che è scorretto.

Anonymous said...

Storie divertenti, e anch'io usavo ITS (remotamente dall'Italia via X.25 via un sistema intermedio).

Ma c'e` un piccolo errore nella tua storie, EMACS è stato sviluppato su TECO, no E (anche se ispirato da E). TECO, le cui macro qualcuno disse essere ll'unico linguaggio con "entry"/"exit" "hooks" nativi e generali.

Poi sono in disaccordo che l'Actor Programming e Object Oriented siano molto in relazione, in particolare sono contrarissimo a considerare Message Passing e Object Oriented come anche solo remotamente collegati.

Ma quella e` una storia lunga (bisogna considerare la parte terza di "Structured Programming" e in generale il Simula I e il Simula 67...).

Hewitt mi ha stupito perchè scrissi diverse parti della pagina "Actor Model" di Wikipedia, citando estensivamente da MIT AI TRs, a cui lui fece grandi obiezioni perchè sembrava convinto che Actor Model fosse solo una disciplina formale e non un modello di computazione o stile di programmazione.

Ho anche nelle mie scatole una stampa del sorgente di MicroPlanner, che tengo per ragioni sentimentali (non l'ho mai usato...).

Beppe said...

C'è una diretta linea genealogica tra il Simula 67 e il Message Passing di Hewitt, che passa attraverso lo SmallTalk di Alan Kay. Kay si ispirò al Simula e introdusse la metafora degli oggetti che si scambiano messaggi. Hewitt intese generalizzare l'idea facendone un modello astratto di computazione.
Hewitt non produsse dei linguaggi o delle implementazioni, perché non era un gran programmatore: mi confessò di aver introdotto il MicroPlanner perché doveva laurearsi e non sapeva come realizzare il Planner. Neppure seppe attirare molti hacker, al contrario di Gerry Sussman, che sosteneva che lui doveva implementare le cose per capirle. Fu così che insieme con Guy Steele implementarono Scheme, per capire i concetti di cui parlava Hewitt.
E aveva ragione: lo sforzo di rendere i concetti eseguibili, li portò a fare grande chiarezza, riportando tutto ai principi del lambda calcolo, introducendo nel Lisp le lexical closure e le continuation.