ALGOL 68RS
Originalförfattare | IF Currie, JD Morrison |
---|---|
Utvecklare | Royal Signals and Radar Establishment |
Initial release | augusti 1977 |
Stabil frisättning | algol68toc 1.14 / 25 augusti 2012
|
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 |
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 .