Vintage teletype och kopplingspanel som symboliserar PDP-1-datorns tidiga programmering
Historia

Hur PDP-1 gjorde Lisp interaktiv och förändrade programmeringen

Runt 1960 gjorde Peter Deutsch något som förändrade hur programmerare arbetar än idag. Han implementerade en kompakt version av Lisp på DEC:s PDP-1 och i den maskinen uppstod det mönster vi nu kallar REPL: läs ett uttryck, evaluera det, skriv ut svaret, vänta på nästa. Programmeraren fick för första gången föra ett samtal med datorn i stället för att lämna in en batch och gå hem. Varje gång du öppnar en Python- eller Node.js-konsol använder du samma grundidé.

Peter Deutsch fick ett forskningsspråk att svara direkt

John McCarthy utvecklade Lisp vid MIT omkring 1958. Tanken var symbolisk databearbetning för AI-forskning, alltså att manipulera listor och uttryck i stället för bara siffror. Men Lisp var från början tänkt som ett batch-orienterat språk. Du skrev ett program, matade in det och fick ett resultat en stund senare. Ingen dialog, ingen omedelbar återkoppling.

Det var här PDP-1 kom in. Peter Deutsch skrev en Lisp-implementation för maskinen ungefär två år efter att språket definierats och han var ung nog att fortfarande gå i skolan när han gjorde det. Den avgörande skillnaden mot tidigare versioner var inte tekniska finesser i språket, utan arbetssättet. Deutsch byggde en slinga som läste ett Lisp-uttryck, evaluerade det, skrev ut resultatet och sedan väntade på nästa. Read, eval, print, loop.

Skillnaden märks direkt om du någon gång skrivit kod i en interaktiv konsol. Du testar en rad, ser vad som händer, justerar och kör igen. Ingen kompilering av hela programmet, ingen väntan. Det är precis det som händer i en modern REPL och det är samma modell som Deutsch fick att fungera på en maskin med resurser som knappt räcker till en dörrklocka idag.

Att just Lisp passade för detta var ingen slump. Lisp behandlar kod och data på samma sätt, allt är listor. Det gör det enkelt att skriva en evaluator som tar ett uttryck, räknar ut vad det betyder och lämnar tillbaka svaret. En sådan evaluator, `eval`, är själva hjärtat i en REPL. Lisp hade den inbyggd i sin natur och på PDP-1 blev den plötsligt något du kunde prata med. John Allen, som senare skrev standardverket om hur Lisp faktiskt fungerar under huven, hörde till dem som dokumenterade de tidiga implementationernas idéer och begränsningar.

Begränsningarna var det som gjorde bedriften imponerande. PDP-1 hade ont om minne. I moderna rekonstruktioner av maskinens Lisp används adress 7750 som takgräns för lagringen och 400 som maxlängd för den så kallade push-down-listan, alltså anropsstacken. Det är minimalt. Deutsch fick alltså inte bara språket att köra interaktivt, han fick det att göra det inom ett utrymme som tvingade fram varje möjlig optimering. Att detta över huvud taget rymdes säger något om hur elegant Lisps grundmodell är.

Att programmera PDP-1 var ett fysiskt hantverk

Maskinen såg inte ut som något du sätter i knät. PDP-1 var en fysisk installation med frontpanel och att få igång ett program krävde handpåläggning i bokstavlig mening. Du ställde in strömbrytare för hand, läste in kod från papperstejp via en teletype och matade maskinen med oktala kommandon. Att starta Lisp var alltså inte att klicka på en ikon, utan en procedur med brytare och remsor.

Mot den bakgrunden blir REPL:en ännu mer av ett genombrott. När du väl fått igång systemet kunde du sitta och testa uttryck i realtid och maskinen svarade. Kontrasten mellan den mödosamma uppstarten och den snabba dialogen efteråt är precis det som gjorde interaktiv programmering till en aha-upplevelse för dem som var med.

Python, Ruby och Node.js bär REPL-arvet vidare i varje konsol

Det Deutsch byggde 1960 är inte ett museiföremål, utan en modell du använder varje vecka. Python, Ruby och Node.js har alla en interaktiv tolk som gör exakt samma sak: läser din inmatning, evaluerar den, skriver ut resultatet, väntar. Databasshell fungerar likadant. Öppna en terminal och skriv `python`, så sitter du i en direkt ättling till PDP-1-slingan.

Chattboten Eliza kördes på PDP-1 Lisp under 1960-talet. Den ursprungliga implementationen är förlorad men själva idén går att återuppleva. Kör `M-x doctor` i Emacs så får du en version av Eliza på skärmen och den interaktiva känslan är densamma som den var på originalmaskinen.

Vill du ta det ett steg längre finns PiDP-1, en simulator på GitHub som emulerar hela PDP-1 och kan köras på Linux, inklusive en Raspberry Pi. Där kan du experimentera med Deutschs Lisp i något som liknar originalmiljön, brytare och oktala kommandon inkluderat. Det är ett ovanligt konkret sätt att förstå varför den interaktiva loopen kändes revolutionerande för sextio år sedan. Grundprincipen du möter där är densamma som ligger under all modern webbutveckling: skriv, kör, se resultat, upprepa. Vill du se hur samma logik dyker upp i dagens verktyg är autonoma AI-agenter och AI-agenter som körs i webbläsaren exempel på hur långt idén om en maskin som svarar direkt har kommit.

FAQ

Vad är en REPL?

REPL står för read-eval-print loop. Det är en interaktiv slinga där du matar in ett uttryck, datorn räknar ut vad det betyder, skriver ut svaret och sedan väntar på nästa inmatning. Du hittar den i Python, Node.js, Ruby och de flesta databasshell. Modellen uppstod på PDP-1 med Peter Deutschs Lisp-implementation omkring 1960.

Vem uppfann Lisp?

John McCarthy utvecklade Lisp vid MIT omkring 1958 för symbolisk databearbetning och AI-forskning.

Kan man köra original-Lisp från 1960-talet idag?

Ja. Simulatorn PiDP-1 finns på GitHub och emulerar PDP-1 på Linux-maskiner, inklusive Raspberry Pi. Där kan du köra den tidiga Lisp-versionen i en miljö som liknar originalet, med samma begränsningar och samma interaktiva loop som programmerarna hade tillgång till för sextio år sedan.

Källor

  • de tidiga implementationernas idéer och begränsningar mcjones.org

Kommentera artikeln

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *