PL/0
PL/0 är ett programmeringsspråk , avsett som ett pedagogiskt programmeringsspråk , som liknar men mycket enklare än Pascal , ett allmänt programmeringsspråk . Det fungerar som ett exempel på hur man konstruerar en kompilator . Det introducerades ursprungligen i boken, Algorithms + Data Structures = Programs , av Niklaus Wirth 1976. Den har ganska begränsade språkkonstruktioner: det finns inga reella tal, väldigt få grundläggande aritmetiska operationer och inga andra kontrollflödeskonstruktioner än "om" och "medan" block. Även om dessa begränsningar gör det opraktiskt att skriva riktiga applikationer på detta språk, hjälper det kompilatorn att förbli kompakt och enkel.
Funktioner
Alla konstanter och variabler som används måste deklareras explicit.
De enda datatyperna är heltal . De enda operatorerna är aritmetiska och jämförelseoperatorer. Det finns en udda
funktion som testar om argumentet är udda.
I den ursprungliga implementeringen som presenterades av Wirth finns det inga in- och utmatningsrutiner . Det nya värdet för varje variabel skrivs ut kompilatorutskrifter när det ändras. Så programmet:
0 0
var i , s ; börja i := ; s := ; medan i < 5 börjar i : = i + 1 ; s : = s + i * i slutslut .
ger utdata:
0 0 1 1 2 5 3 14 4 30 5 55
De flesta implementeringar har dock rutiner för enkel ingång och enkel utmatning.
Flödeskontrollstrukturer är om-då
och medan-gör-
konstruktioner och användardefinierade procedurer . Procedurer kan inte acceptera parametrar.
Grammatik
Följande är syntaxreglerna för modellspråket som definieras i EBNF :
program = block "." ; block = [ "const" ident "=" nummer { "," ident "=" nummer } ";" ] [ "var" ident { "," ident } ";" ] { "procedure" ident ";" blockera ";" } uttalande ; statement = [ ident ":=" uttryck | "ringa" ident | "?" ident | "!" uttryck | "begynn" -sats { ";" uttalande } "slut" | "om" -villkor "då" -sats | "while" -villkor "do" -sats ]; condition = "udda" uttryck | uttryck ( "=" | "#" | " <" | " <= " | ">" | ">=" ) uttryck ; expression = [ "+" | "-" ] term { ( "+" | "-" ) term }; term = faktor {( "*" | "/" ) faktor }; faktor = ident | nummer | "(" uttryck ")" ;
Det är ganska lätt för studenter att skriva en rekursiv härkomsttolkare för en så enkel syntax. Därför används PL/0-kompilatorn fortfarande i stor utsträckning i kurser om kompilatorkonstruktion över hela världen. På grund av bristen på funktioner i den ursprungliga specifikationen spenderar eleverna vanligtvis större delen av sin tid med att utöka språket och sin kompilator. De börjar vanligtvis med att introducera REPEAT .. TILL
och fortsätter med mer avancerade funktioner som parameteröverföring till procedurer eller datastrukturer som arrayer, strängar eller flyttal.
Använd i utbildning
Huvudartikeln om kompilatorer hedrar PL/0 [ citat behövs ] för att ha introducerat flera inflytelserika begrepp (stegvis förfining, rekursiv descent parsing, EBNF, P-kod, T-diagram) till fältet genom att utbilda eleverna att använda dessa begrepp. Under de senaste 3 decennierna har de flesta universitetskurser om kompilatorkonstruktion som använde PL/0 följt Wirth strikt när det gäller att använda dessa tekniker (se referenser nedan). För några år sedan avvek universitetskurser från den kurs som Wirth satte med ersättningen av den klassiska rekursiva härkomstanalystekniken med en (likväl klassisk) Unix-liknande metod att använda lex och yacc . Först nyligen har en implementering ( PL/0 Language Tools ) längs denna väg också kombinerat moderna koncept som objektorientering och designmönster med ett modernt skriptspråk ( Python ), vilket gör att eleverna kan konsumera källtexten för implementeringen i en modern programmeringsstil .
Kompilatorkonstruktion
I december 1976 skrev Wirth ett litet häfte om kompilatorkonstruktion, innehållande den fullständiga källkoden för PL/0-kompilatorn. Syntaxreglerna ovan togs från denna första upplaga av Wirths bok Compilerbau . I senare upplagor av denna bok (under inflytande av hans pågående forskning) ändrade Wirth syntaxen för PL/0. Han ändrade stavningen av nyckelord som const
och procedure
till versaler. Denna förändring gjorde att PL/0 liknade Modula-2 närmare. Samtidigt arbetade Wirths vän och samarbetspartner CAR Hoare på sitt inflytelserika koncept för kommunikationssekventiella processer, som använde utropstecknet ! och frågetecknet ? för att beteckna kommunikationsprimitiver. Wirth lade till båda symbolerna till PL/0-språket, men han nämnde inte deras semantik i boken.
Exempel
Följande exempel är hämtat från ett sådant utökat språk som kallas PL/0E. Detta program matar ut kvadraterna av siffror från 1 till 10. De flesta kurser i kompilatorkonstruktion idag har ersatt utropstecken med WriteLn
-proceduren.
VAR x , squ ; PROCEDUR kvadrat ; BEGIN squ := x * x END ; BÖRJA x := 1 ; WHILE x < = 10 BÖRJA CALL square ; ! squ ; x := x + 1 SLUT SLUT .
Det här följande programmet skriver ut primtalen från 1 till 100. Skrivsatsen motsvarar '!' uttalande i EBNF-syntaxen ovan.
0
const max = 100 ; var arg , ret ; procedur isprime ; var i ; börja ret := 1 ; i := 2 ; medan i < arg börjar om arg / i * i = arg börjar sedan ret : = ; i := arg slut ; i : = i + 1 ändände ; procedur primtal ; börja arg := 2 ; medan arg < max börjar anropa isprime ; _ om ret = 1 skriv arg ; _ arg : = arg + 1 slutände ; ringa primtal .
Följande exempel är hämtat från den andra upplagan av Wirths bok Compilerbau, som kom ut 1986 i Tyskland.
0
0
0
VAR x , y , z , q , r , n , f ; PROCEDUR multiplicera ; VAR a , b ; BÖRJA a := x ; b := y ; z := ; MEDAN b > BÖRJAR OM UDDA b SÅ Z : = z + a ; a := 2 * a ; b := b / 2 END END ; PROCEDUR dividera ; VAR w ; BÖRJA r := x ; q := ; w := y ; WHILE w <= r DO w := 2 * w ; MEDAN w > y BÖRJAR q : = 2 * q ; w := w / 2 ; OM w <= r SÅ BÖRJA r := r - w ; q := q + 1 END END END ; PROCEDUR gcd ; VAR f , g ; BÖRJA f := x ; g := y ; MEDAN f # g BÖRJA OM f < g DÅ g : = g - f ; OM g < f DÅ f := f - g SLUT ; z := f SLUT ; PROCEDUR faktum ; BÖRJA OM n > 1 SÅ BÖRJA f := n * f ; n := n - 1 ; CALL fakta END END ; BÖRJA ? x ; ? y ; CALL multiplicera ; ! z ; ? x ; ? y ; CALL divide ; ! q ; ! r ; ? x ; ? y ; RING gcd ; ! z ; ? n ; f := 1 ; CALL fakta ; ! f SLUT .
Oberon-0
I den tredje och sista upplagan av sin bok om kompilatorkonstruktion ersatte Wirth PL/0 med Oberon-0. Språket Oberon-0 är mycket mer komplext än PL/0. Till exempel erbjuder Oberon-0 arrayer, poster, typdeklarationer och procedurparametrar. Utgivaren av Wirths böcker (Addison-Wesley) har beslutat att fasa ut alla hans böcker, men Wirth har publicerat reviderade upplagor av sin bok med början 2004. Från och med augusti 2017 är den senaste versionen som finns tillgänglig från maj 2017.
Se även
Anteckningar
- Liffick, Blaise W., Ed (1979), The Byte Book of Pascal , ISBN 0-07-037823-1
- Wirth, Niklaus (1975), Algoritmer + datastrukturer = program , ISBN 0-13-022418-9
- Wirth, Niklaus (1986), Compilerbau , BG Teubner, Stuttgart ISBN 3-519-32338-9
externa länkar
- Kompilatorn (.pas-fil) från den första utgåvan av Compilerbau -boken, skriven i Pascal
- Ytterligare en kopia av kompilatorn på Pascals webbplats för små maskiner
- Tolken från boken "Algorithms + Data Structures = Programs", skriven i Pascal
- Utveckling av en kompilator i PL/0-stil baserad på 'Compiler-konstruktion' skriven i Mocka (Modula-2 för Linux)
- En artikel som förklarar användningen av PL/0 vid University of Rochester
- Hemsidan för PL/0-referensboken "Algorithms + Data Structures = Programs" [ 1]
- http://sourceforge.net/projects/pl0-compiler (skriven i C/C++, använder QT-ramverket)
- https://modernc.org/pl0 (skriven i Go, körs i terminal, plattformsoberoende)
- https://github.com/dodobyte/plzero (en mycket liten kompilator producerar körbara Windows-filer)
- https://github.com/MarcRochkind/pl0compiler (kompilator för IBM 701 skriven i C; genererar 701 assembler)
- Kategori:PL/0 Uppgifter implementerade i PL/0 på rosettacode.org