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  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  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  g  :  =  g  -  f  ;  OM  g  <  f  f  :=  f  -  g  SLUT  ;  z  :=  f  SLUT  ;  PROCEDUR  faktum  ;  BÖRJA  OM  n  >  1  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

externa länkar