POP-2
POP-2 (även kallat POP2 ) är ett programmeringsspråk som utvecklats omkring 1970 från det tidigare språket POP-1 (utvecklat av Robin Popplestone 1968, ursprungligen kallat COWSEL ) av Robin Popplestone och Rod Burstall vid University of Edinburgh . Det drog rötter från många källor: språken LISP och ALGOL 60 , och teoretiska idéer från Peter J. Landin . Den använde en inkrementell kompilator , vilket gav den en del av flexibiliteten hos ett tolkat språk , inklusive att tillåta nya funktionsdefinitioner vid körning och modifiering av funktionsdefinitioner medan ett program kördes (som båda är funktioner för dynamisk kompilering ), utan overhead av ett tolkat språk.
Beskrivning
Stack
POP-2:s syntax var Algol-liknande, förutom att uppgifterna var tvärtom: istället för att skriva
a:= 3;
skrev en
3 -> a;
Anledningen till detta var att språket hade en uttrycklig föreställning om en operandstack ; sålunda kan den föregående uppgiften skrivas som två separata påståenden:
3;
som utvärderade värdet 3 och lämnade det på stacken, och
-> a;
som lyfte det högsta värdet från stacken och tilldelade det till variabeln 'a'. På samma sätt funktionsanropet
f(x, y, z);
skulle kunna skrivas som
x, y, z; f();
(komma och semikolon är till stor del utbytbara) eller till och med
x, y, zf;
eller
(x, y, z).f;
På grund av det stackbaserade paradigmet fanns det inget behov av att skilja mellan påståenden och uttryck ; alltså de två konstruktionerna
om a > b då c -> e annat d -> e nära;
och
om a > b då c annars d stäng -> e;
var likvärdiga (observera användningen av close
, eftersom endif
inte hade blivit en vanlig end-of-if-sats-notation ännu).
Arrayer och dubblettfunktioner
Det fanns inga speciella språkkonstruktioner för att skapa arrayer eller poststrukturer som de vanligtvis förstås: i stället skapades dessa med hjälp av speciella inbyggda funktioner, t.ex. newarray (för arrayer som kunde innehålla vilken typ av objekt som helst) och newanyarray för att skapa begränsade typer av föremål.
Således var arrayelement- och postfältaccessorer helt enkelt specialfall av en dubblettfunktion : detta var en funktion som hade en annan funktion kopplad som dess uppdaterare , som anropades på den mottagande sidan av en tilldelning. Således, om variabeln a
innehöll en array, då
3 -> a(4);
motsvarade
uppdaterare(a)(3, 4);
den inbyggda funktionsuppdateringen returnerar
uppdateringsprogrammet för dubbletten. Självklart updater
i sig en dubblett och kunde användas för att ändra uppdateringskomponenten i en dubblett.
Funktioner
Variabler kunde innehålla värden av vilken typ som helst, inklusive funktioner, som var förstklassiga objekt. Följande konstruktioner
funktion max xy; om x > y då x annars y nära slutet;
och
vars max; lambda xy; om x > y då x annars y slutände -> max;
var likvärdiga.
En intressant operation på funktioner var partiell tillämpning (ibland kallad " currying "). I partiell tillämpning frystes ett antal av de argument längst till höger i funktionen (som skulle vara de sista som placerades på stacken innan funktionen är involverad) till givna värden, för att producera en ny funktion med färre argument, vilket är en stängning av ursprungliga funktion. Tänk till exempel på en funktion för att beräkna allmänna andragradspolynom:
funktion poly2 xabc; a * x * x + b * x + c slut;
Detta kan bindas, till exempel som
vars less1squared; poly2(% 1, -2, 1%) -> mindre1kvadrat;
sådan att uttrycket
mindre1kvadrat(3)
tillämpar stängningen av poly2 med tre argument frysta, på argumentet 3, och returnerar kvadraten på (3 - 1), vilket är 4. Tillämpningen av den delvis tillämpade funktionen orsakar de frysta värdena (i detta fall 1, -2, 1 ) för att läggas till det som redan finns på stacken (i detta fall 3), varefter den ursprungliga funktionen poly2 anropas. Den använder sedan de fyra översta föremålen på stapeln, vilket ger samma resultat som
poly2(3, 1, -2, 1)
dvs
1*3*3 + (-2)*3 + 1
Operatörsdefinition
I POP-2 var det möjligt att definiera nya operationer (operatörer i moderna termer).
vars operation 3 +*; lambda xy; x * x + y * y end -> nonop +*
Den första raden deklarerar en ny operation +* med prioritet (prioritet) 3. Den andra raden skapar en funktion f(x,y)=x*x+y*y, och tilldelar den till den nyligen deklarerade operationen +*.
Historia
Den ursprungliga versionen av POP-2 implementerades på en Elliott 4130- dator vid University of Edinburgh (med endast 64KB RAM, fördubblades till 128KB 1972).
POP-2 portades till ICT 1900-serien på en 1909 vid Lancaster University av John Scott 1968.
I mitten av 1970-talet portades POP-2 till BESM-6 (POPLAN System).
Senare versioner implementerades för CTL Modular One, PDP-10 , ICL 1900-serien (som kör operativsystemet George). Julian Davies, i Edinburgh, implementerade en utökad version av POP-2, som han kallade POP-10 på PDP-10-datorn som kör TOPS-10 . Detta var den första dialekten av POP-2 som behandlade skiftläge som signifikant i identifierarnamn, använde gemener för de flesta systemidentifierare och stödde långa identifierare med mer än 8 tecken.
Kort efter det implementerades en ny implementering känd som WPOP (för WonderPop) av Robert Rae och Allan Ramsay i Edinburgh, på ett forskningsrådsfinansierat projekt. Den versionen introducerade burade adressutrymmen, en del syntaktisk typning under kompilering (t.ex. för heltal och reella tal) samt vissa mönstermatchningskonstruktioner för användning med en mängd olika datastrukturer.
Parallellt med det implementerade Steve Hardy vid Sussex University en delmängd av POP-2, som han kallade POP-11 som kördes på en DEC PDP-11/40-dator. Det designades ursprungligen för att köras på DEC-operativsystemet RSX-11D, i tidsdelat läge för undervisning, men det orsakade så många problem att en tidig version av Unix installerades och användes istället. Den versionen av Pop-11 skrevs i Unix assembler, och koden kompilerades stegvis till en mellanbytekod som tolkades. Den hamnen stod klar omkring 1976 och som ett resultat användes Pop-11 på flera ställen för undervisning. För att stödja dess undervisningsfunktion modifierades många av de syntaktiska egenskaperna hos POP-2, t.ex. ersatte funktion ... sluta med definiera ... enddefine och lägga till ett större antal looping-konstruktioner med slutande parenteser för att matcha deras öppningsparenteser istället för användningen av close för alla loopar i POP-2. Pop-11 introducerade också en mönstermatchare för liststrukturer, vilket gör det mycket lättare att lära ut AI-programmering.
Runt 1980 portades Pop-11 till en VAX-11/780- dator av Steve Hardy och John Gibson, och strax efter det ersattes den av en fullständig inkrementell kompilator (som producerar maskinkod istället för en tolkad mellankod). Förekomsten av kompilatorn och alla dess subrutiner under körning gjorde det möjligt att stödja mycket rikare språktillägg än vad som var möjligt med makron, och som ett resultat användes Pop-11 (av Steve Hardy, Chris Mellish och John Gibson) för att producera en implementering av Prolog , med hjälp av standardsyntaxen för Prolog, och det kombinerade systemet blev känt som Poplog , till vilket Common Lisp och Standard ML senare lades till. Denna version portades senare till en mängd olika maskiner och operativsystem och som ett resultat blev Pop-11 den dominerande dialekten av POP-2, fortfarande tillgänglig i Poplog-systemet.
Runt 1986 samarbetade ett nytt AI-företag Cognitive Applications Ltd. med medlemmar från Sussex universitet för att producera en variant av Pop-11 kallad AlphaPop som körs på Apple Mac-datorer, med integrerad grafik. Detta användes för ett antal kommersiella projekt, samt användes för undervisning i AI-programmering vid flera universitet. Det faktum att det implementerades i en tidig dialekt av C, med hjälp av en idiosynkratisk kompilator gjorde det mycket svårt att underhålla och uppgradera till nya versioner av Mac-operativsystemet. Utöver detta var AlphaPop inte "32-bitars ren" på grund av användningen av höga adressbitar som "tagbitar" för att beteckna typen av objekt, vilket var oförenligt med användningen av minne över 8 Mb på senare Macintosh-datorer.
Se även
- Allmän
- Burstall, R.; Collins, J.; Popplestone, R. (1968). Programmering i Pop-2 . Edinburgh: Edinburgh University Press.
- Davies, DJM (1976). "POP-10 användarmanual". Datavetenskaplig rapport (25).
- Smith, R.; Sloman, A.; Gibson, J. (1992). "POPLOGs virtuella maskinstöd på två nivåer för interaktiva språk". I D. Sleeman och N. Bernsen (red.). Forskningsanvisningar i kognitionsvetenskap . Vol. 5: Artificiell intelligens. Lawrence Erlbaum Associates. s. 203–231.
- POP-referenser
- I kö