ALGOL 68RS

ALGOL 68RS
Originalförfattare IF Currie, JD Morrison
Utvecklare Royal Signals and Radar Establishment
Initial release augusti 1977 ; 45 år sedan ( 1977-08 )
Stabil frisättning
algol68toc 1.14 / 25 augusti 2012 ; 10 år sedan ( 2012-08-25 )
Skrivet i ALGOL 68
Operativ system VMS
Plattform ICL 2900-serien , Multics , VAX
Tillgänglig i engelsk
Typ Kompilator , översättare
Licens Gratisprogram , allmän egendom (delar)
Hemsida algol68 .sourceforge .net

ALGOL 68RS är den andra ALGOL 68- kompilatorn skriven av IF Currie och JD Morrison, vid Royal Signals and Radar Establishment ( RSRE). Till skillnad från den tidigare ALGOL 68-R , designades den för att vara portabel och implementerade språket i den reviderade rapporten.

Versioner av ALGOL 68RS skrevs för ICL 2900-serien , Multics och VAX som kör VMS .

Därefter släpptes delar av denna kompilator till det offentliga området , som en översättare från ALGOL 68 till C , som en del av den offentliga utgåvan av hårdvarubeskrivningsspråket ELLA , också av RSRE.

Historia

Även om ALGOL 68-R- kompilatorn, skriven av IF Currie, JD Morrison och SG Bond , var en stor framgång, led den av två stora problem: den hade skrivits för den nästan föråldrade ICL 1900 -datorn, och den implementerade en out- aktuell version av språket som det släpptes innan den reviderade rapporten om ALGOL 68 var tillgänglig.

RSRE behövde en nyare kompilator för olika interna projekt, så teamet av Currie och Morrison skrev en ny kompilator designad för plattformsoberoende mjukvaruportabilitet mellan maskiner. Kompilatorn behandlade analysen av ALGOL 68 och producerade ett mellanspråk på hög nivå, känt som strömspråk, som sedan kompileras till maskinkod av en översättare . Kompilatorn behövde bara känna till storleken på de olika maskindatatyperna för objekt och den tillgängliga teckenkodningen (uppsättningen).

Kompilatorn skrevs i ALGOL 68, startades initialt med hjälp av ALGOL 68-R-kompilatorn.

Ett team av två programmerare vid Oxford University Computing Services skrev en kodgenerator för ICL 2900-serien. Martyn Thomas från South West Universities Regional Computer Center (SWURCC) ordnade att detta system sponsrades av International Computers Limited (ICL) och säljs som en officiell ICL-produkt.

Senare, Avon Universities Joint Computer Center , en stor användare av Multics bad SWURCC-teamet att producera en Multics-version av ALGOL 68RS. En version för Digital Equipment Corporation (DEC) VAX -dator skrevs också.

Så småningom bildade teamet på SWURCC ett företag, Praxis , som initialt stödde Multics-versionen av ALGOL 68RS.

RSRE använde också ALGOL 68RS-kompilatorn för interna projekt, inklusive Flex-maskinen och ELLA-hårdvarudesignspråket. När man beslutade att göra ELLA fritt tillgänglig fick Praxis i uppdrag att skriva en ALGOL 68 till C -översättare med namnet ctrans , baserad på ALGOL 68RS-kompilatorn.

Begränsningar i det sammanställda språket

Liksom den tidigare ALGOL 68-R-kompilatorn var ALGOL 68RS en kompilator med ett pass , vilket krävde vissa begränsningar för det kompilerade språket.

Deklaration före användning

ALGOL 68-programmet:

 PROC  jämn = (  INT  -tal)  BOOL  : (tal = 0 |  TRUE  | udda (  ABS  (nummer - 1)));  PROC  udda = (  INT  -tal)  BOOL  : (tal = 0 |  FALSK  | jämnt (  ABS  (nummer - 1))); 

skulle behöva skrivas om som:

 PROC  (  INT  )  BOOL  udda;  PROC  jämn = (  INT  -tal)  BOOL  : (tal = 0 |  TRUE  | udda (  ABS  (nummer - 1))); udda := (   INT  -tal)  BOOL  : ( tal = 0 |  FALSK  | jämn (  ABS  (nummer - 1))); 

För att tillåta rekursiva deklarationer av lägen (typer ) användes en speciell stubblägesdeklaration för att informera kompilatorn om att en kommande symbol var ett läge snarare än en operatör:

    MODE  B  ,  A  =  STRUKT  (  REF  Bb  ),  B  = [1:10]  REF  A  ; 

Parallell bearbetning

uteslöts operatörernas PAR- klausul och SEMA -läget med dess associerade UP , DOWN och LEVEL .

Tillägg till ALGOL 68

Uträtning

Ett stort fel i ALGOL 68 är att det är omöjligt att skriva standardtransput ( inmatning /utdata ) procedurer i ren ALGOL 68. Utskriftsproceduren tar till exempel en uppsättning artiklar att skriva ut av vilket läge som helst och, genom en process som heter uträtning , omvandlar dem till enkla värden som kan skrivas ut. Till exempel:

 STRUKT  (  INT  a,  REAL  b) c := ...; print(c);  { magiskt omvandlas till tryck ((a   OF  c, b  OF  c)); }  

Författarna av ALGOL 68RS beslutade att göra uträtning tillgänglig som en del av språket. Ett STRAIGHT- läge liknar en array men har den speciella egenskapen att objekt kan tvingas till ett STRAIGHT- läge om deras komponenter kan tvingas till läget. Till exempel:

  STRUKT  (  INT  a,  REAL  b) c;  RAK  UNION  (  INT  ,  REAL  ) z = c; 

Båda fälten i C kan tvingas till UNION ( INT , REAL ) så fältet "a OF c" kan nås som z[1] och "b OF c" är z[2].

Standardutskriftsproceduren kan nu deklareras som :

   MODE  PRINTMODE  =  UNION  (  INT  ,  REAL  , ...  STRAIGHT  PRINTMODE  );  PROC  print = ([]  PRINTMODE  argument )  VOID  : ...; 

Effektiv arrayhantering

ALGOL 68-arraylägena är mycket kraftfulla, inklusive flera dimensioner, definierade övre och nedre gränser, trimning (gör en ny array genom att ta en sammanhängande delmängd av en array), slicing (gör en ny array genom att ta bort en dimension från en array), och rodd (gör en ny array genom att lägga till en dimension till en befintlig array.

Till exempel:

 [5:23, -7:7]  INT  a; { en tvådimensionell array }   REF  [,]  INT  b = a [ 6:21, 0:3 ] { en bit av a }  REF  []  INT  c = a [5] { bara en rad av a } 

Medan kompilatorn gjorde alla ansträngningar för att generera optimal kod för alla fall, ansågs det att lägga till några enklare faciliteter skulle tillåta bättre kod i vissa fall. För detta ändamål inkluderade ALGOL 68RS indexerbara strukturer (i-structs), vektorer och FORALL -satsen.

Indexerbara strukturer

ALGOL 68 inkluderade redan strukturer med fast längd för att effektivt hantera tecken och bitdata på ordbaserade maskiner, BYTES- och BITS -lägena. En BYTES- variabel höll ett maskinord med tecken, en BITS -variabel höll bitarna i ett maskinord.

ALGOL 68RS generaliserade dessa idéer. En STRUCT 4 CHAR -variabel innehöll exakt 4 tecken. Storleken var en del av typen. På de flesta ALGOL 68RS-system var läget BYTES ekvivalent med STRUCT 4 CHAR .

   MODE  BYTES  =  STRUCT  4  CHAR  ;  OP  ELEM  = (  INT  index,  BYTES  val)  CHAR  : val[index]; ...   BYTES  b = "abcd"; ... skriv ut (2   ELEM  b); 

ALGOL 68RS kompilatorn skulle kompilera vilken strängkonstant som helst till en lämplig STRUCT n CHAR .

I sammanhang där en VECTOR eller array önskades kunde en i-struct utökas till lämplig VECTOR eller arraytyp.

Vektorer

En VECTOR är en förenklad array, med endast en dimension och en nedre gräns fixerad till 1.

 VEKTOR  [4]  INT  a; { liknande [1:4]   INT  a; }  

I alla sammanhang där en array krävdes kunde en VECTOR konverteras till en array.

FORALL uttalande

FORALL - satsen tillåter effektiv stegning genom elementen i en array.

 [12]  INT  a := ...;  FORALL  xa  IN  a  DO  xa := xa * 2  OD 

xa kommer att vara en referens till varje element i a i sin tur. FORALL kan gå igenom flera arrayer parallellt och kontrolleras av en WHILE -sats:

 [12]  INT  a, b; ...   FORALL  xa  IN  a, xb  IN  b  MEDAN  xa > xb  DO  f(xa, xb)  OD 

Separat kompilering

ALGOL 68RS tillhandahöll en mekanism för att bygga bibliotek som liknar de separata kompileringsfaciliteterna i ALGOL 68-R och en mekanism för att bygga program på ett top-down sätt liknande de i ALGOL 68C .

Deklarationsmoduler

Bibliotek i ALGOL 68RS skrivs med hjälp av deklarationsmoduler som består av en sekvens av MODE , variabel, operator och procedurdeklarationer följt av en keep list som definierar vilka deklarationer som är synliga för andra segment.

Biblioteksanvändaren lägger sedan till ett USE -huvud som talar om för kompilatorn att göra symbolerna för ett eller flera deklarationsbibliotek tillgängliga för programmet.

Till exempel kan ett grafikbibliotek skrivas som:

     DECS  graphlib  ANVÄND  något annat bibliotek  MODE  GRAPHDATA  =  STRUCT  ( ... );  MODE  GRAPH  =  REF  GRAPHDATA  ;  PROC  ny graf = ( ... )  GRAPH  : ...;  PROC  rita graf = (  GRAPH  g)  VOID  : ...; ...   HÅLL  GRAPH  , ny graf, rita graf  FINISH 

Och ett användarprogram för att använda det här biblioteket skulle se ut så här:

    
 PROGRAM  myprog  ANVÄND  graphlib  BEGIN  GRAPH  g = ny graf (...); ... rita graf (g);  ...   SLUT  AVSLUTNING 

Kapslade moduler

För att stödja en programmeringsstil uppifrån och ned, tillhandahöll ALGOL 68RS funktionerna HERE och CONTEXT .

Ett program kan skrivas med delar som ska fyllas i senare markerade med en HERE -tagg följt av en keeplist över deklarationer som ska göras tillgängliga.

   
 PROGRAM  (pass1, pass2) kompilator  BEGIN  STRING  källa := ...;  TRÄD  parseträd; ...   HÄR  pass1 (källa, parseträd); ...   INSTRUKTIONER  insts;  HÄR  pass2 (parseträd, insts); ...   SLUT  AVSLUTNING 

Koden som ska köras i sammanhanget med HERE- taggarna skulle skrivas som:

 PROGRAM  pass1 implementering  CONTEXT  pass1  IN  kompilatorn  BEGIN  ... { kod som använder "source" och "parsetree" }  END  FINISH 

HERE liknar ALGOL 68C ENVIRON och CONTEXT är likvärdig med ALGOL 68C USING .

Kod och utomjordisk tillgång

ALGOL 68RS var tänkt att vara användbar för systemprogrammering på låg nivå . För att möjliggöra detta inkluderades faciliteter för tillgång till maskinkod och icke-ALGOL 68RS-objekt.

Koden infogades med CODE- konstruktionen:

  SOMEMODE  KOD  (  objekt1  ,  objekt2  , ...) "...  kod  ..." 

Där objekten är ALGOL 68RS-värden som ska göras tillgängliga för kodinsättningen och SOMEMODE är läget som returneras. Läget kan utelämnas om koden inte returnerar något värde.

Åtkomst till icke-ALGOL68-objekt var tillgänglig med ALIEN- insättningen:

  SOMEMODE  namn  =  ALIEN  "  externt namn  " 

Vilket enkelt ALGOL 68RS-objekt som helst kan gjutas till en VECTOR av tecken med hjälp av SPELL -operatorn:

 STRUKT  (  INT  a,  REAL  b) c = ...; print ("intern repr = ",   STAVNING  c, nyrad)); 

Ett enkelt objekt är ett som inte innehåller några arrayer eller VECTOR s.

Tillgänglighet

ALGOL 68 till C-översättaren skriven av Praxis för ELLA-systemet innehåller det mesta av ALGOL 68RS-kompilatorn. Det anmärkningsvärda undantaget är koden för hantering av FORMAT s.

Från och med september 2020 är ALGOL 68RS tillgänglig från SourceForge .