TECO

TECO, originariamente un acronimo per Tape Editor and COrrector (editor di nastri e correttore), poi successivamente inteso come Text Editor and COrrector (editor di testo e correttore), era un editor di testo sviluppato al MIT e modificato ivi praticamente da chiunque. Con tutti i dialetti inclusi, TECO era stato l'editor più utilizzato prima di Emacs di cui può essere considerato l'antenato.

TECO, notevole per la sua complicata e impronunciabile sintassi, può essere considerato un linguaggio di programmazione interpretato, mirato alla manipolazione del testo. Praticamente ogni carattere è un comando (una sequenza di uno o due caratteri rimpiazza le usuali parole chiave di linguaggi più verbosi) e quindi ogni stringa di caratteri è un programma TECO, anche se non necessariamente un programma utile.

L'Emacs originale di Richard Stallman fu implementato in TECO. Versioni successive di Emacs, prima Multics Emacs e poi GNU Emacs, furono invece implementate in Lisp.

TECO fu sviluppato inizialmente al MIT per essere usato sui due elaboratori PDP-1, appartenenti a dipartimenti differenti, entrambi situati nell'edificio 26. In queste macchine, il normale processo di sviluppo prevedeva l'uso di una Friden Flexowriter per preparare il codice sorgente senza l'uso dell'elaboratore su una striscia continua di nastro di carta perforato. I programmatori dei grandi elaboratori IBM perforavano da soli il loro codice sorgente sulle schede, usando delle perforatrici che stampavano caratteri a matrice di punti leggibili anche da un uomo lungo la cima di ogni scheda allo stesso tempo in cui punzonavano ogni carattere leggibile dalla macchina. Quindi i programmatori IBM potevano leggere, inserire, cancellare e muovere linee di codice manipolando fisicamente le schede usate. I nastri perforati non offrivano tutte queste possibilità, la necessità fu la causa scatenante per la nascita di un editor online.

Il primo di questi editor per il PDP-1 fu (ufficialmente!) chiamato "Expensive Typewriter" (Typewriter costoso). Era il più rudimentale editor orientato alla linea immaginabile, mancando anche di capacità per operazioni di ricerca e sostituzione. Il suo nome rifletteva il disgusto per la spesa e l'apparente inefficienza di un programmatore che monopolizzava un elaboratore costoso per il solo scopo di modificare del testo.

Lo scopo originale dichiarato di TECO fu di rendere più efficiente l'uso del PDP-1. Come indicato dal manuale, invece che eseguire le modifiche "costosamente" sedendosi al terminale, il programmatore avrebbe semplicemente analizzato il testo errato e avrebbe preparato un "nastro correttivo" che descriveva le operazioni di modifica da eseguire sul testo. Si sarebbe quindi fornito il nastro con il sorgente e il nastro di correzione al PDP-1 tramite il suo lettore ad alta velocità (200 caratteri al secondo). Eseguendo TECO, si sarebbe immediatamente perforata una scheda modificata con il perforatore ad alta velocità (60 caratteri al secondo). Si sarebbe quindi potuto procedere immediatamente a caricare ed eseguire l'assembler, senza tempo perso in modifiche al terminale.

Le successivamente introdotte funzioni di ricerca furono motivate dal fatto che le stampate della Flexowriter non avevano una numerazione per le linee; quindi le posizioni di modifica andavano specificate dal contesto invece che da un numero di linea. I vari costrutti di ciclo e condizione (che resero TECO Turing-completo) furono inclusi per permettere sufficiente potere descrittivo per il nastro correttivo. La sintassi concisa riduceva il numero di tasti da premere necessari per preparare il nastro correttivo.

Tutto questo non aveva però molto senso, perché il nastro correttivo era in effetti un programma e richiedeva la correzione degli errori (debugging) come ogni altro programma. I pericoli anche di una semplice operazione di ricerca e sostituzione globale divennero presto evidenti. In pratica, le modifiche venivano eseguite al terminale esattamente com'era con l'Expensive Typewriter.

TECO fu disponibile per molti sistemi operativi, incluso l'ITS sui PDP-6 e PDP-10, oltre che su TOPS-20 nei PDP-10.
Un discendente della versione DEC distribuita per il PDP-10 è ancora disponibile su Internet, insieme a svariate implementazioni parziali per l'ambiente MS-DOS/Windows.
Una versione di TECO veniva fornita insieme a tutti i sistemi operativi DEC; Compaq fornisce ancora TECO con OpenVMS.

Esempio di codice TECO 
 ER file $ - apre un file per accesso in lettura
 [q ... ]q - fa il push ... pop del registro Q (può contenere numeri, testo o codice)
 < code > - iterazione; questi sono codici per le operazioni next, break, continue, ecc.
 n"X codice-then | codice-else '' - if-then-else (X è un tipo per il test)

 Esempio di programma TECO 

Questo è un semplice ordinamento per il buffer di testo corrente, basato sul primo carattere di ogni linea, preso dalla guida utente TECO del PDP-11. Due versioni con operazioni "goto" e operazioni "strutturate" sono mostrate. Da notare che TECO ignora se il testo è maiuscolo o meno e gli spazi (eccetto i tab, che è considerato un comando di inserimento).Esempio 1  !START! j 0aua               ! salta all'inizio, carica il primo carattere nel registro A !

  !CONT! l 0aub                ! carica il primo carattere della linea seguente nel registro B !

  qa-qb"g xa k -l ga 1uz '     ! se A>B, scambia le linee e imposta un flag nel registro Z !

  qbua                         ! carica B in A !
  l z-."g -l @o/CONT/ '        ! ritorna all'inizio se si presenta un'altra linea nel buffer !

  qz"g 0uz @o/START/ '         ! ripeti se si sono fatti scambi nell'ultimo passaggio !Esempio 2'''

  0uz                             ! Cancella il flag di ripetizione !
  <j 0aua l                       ! carica il primo carattere nel registro A !

  <0aub                           ! carica il primo carattere della linea seguente nel registro B !

  qa-qb"g xa k -l ga -1uz '       ! se A>B, scambia le linee e imposta un flag'' !

  qbua                            ! carica B in A !
  l .-z;>                         ! ritorna all'inizio se si presenta un'altra linea nel buffer !

  qz;>                            ! ripeti se si sono fatti scambi nell'ultimo passaggio !

Collegamenti esterni 

 

Linguaggi di programmazione