PCC - Portable C Compiler (UNX tema) av Andefs Thuli Allmnt om PCC PCC:n ir en C-kompilator skriven Sa att den skall vra s ekel som maligt att flytta mellan olika maskiner. De bygger pa iden att de flesta maskiner r registermaskiner och har en gorlunda ortogonal registeruppstting. PCC:n bestr av tre (tva) pass. Det fdrsta passet r en macoprocessor som hanterar alla macro-ader som fis i progrmmet. Eftersom detta pass inte bara r maskin- oberoende, utan ocks sprkoberoende, ir det inte ett riktigt pass. Det andra passet ir till allra starsta delen maskn- oberoende. Hir analyseras programmet, och e mellafil med en smula kod och mycket expressiontrid genereras. Detta pass r inte srskilt knepigt att portera eftesom expressio- traden r parameterberoende. Det som kan vara knepigt r att generera kod far iitieringar, switch-satse, o.a. som ite har ngot med expressionvalueringen att gara. Det tede passet producerar kod frn expessiont3den, och r den intressantaste och svaraste delen att anpassa. Den allra starsta dele av pass 3 hadlar om kodgeereing fran expressiontrden. Det sker till starsta delen genom att jmfara noder och deltrad med anvndardefiierade 'templates', som ocksa talar om vilken kodsnutt som skall genereras far det matchade tradet, och hur det skall reduceras efter genereringen. Denna 'treematching' farutsatter att malmaskien af 'trevlig' att geneera kod f6r - dvs. en registermaskin med en nagorlunda ortogonal instruktionsuppsatting . Vad har da hnt? Nar vi b8rade arbetet med att portera C-kompilatorn till D22 afbetade vi inte med Johnsons origial-PCC, uta e PCC anpassad efter den vilknda Harris /6. Denna eminenta maskin r mycket lik D22 till akitekture -- vi hoppades att det skulle bli en litt sak att ndra kodgenereringen till D22-kod. Efter ngra mnaders (realtid -- inte manmanader Jobb upptckte vi att Hais /6 vaf en bittre maskin at geeera kod far an D22. En av de mnga saker som var bttre var att att alla register i /6 ir 24 bitar breda. I D22 r bafa ackumulator- och multiplikator-registren 24 bitar; index- registren ir 18 bitar och pc iS bitar beda. Och PCC- litar pa att indexregister och liknande kan anvndas som temporr- egiste Inte tevligt! Det ffamstod timligen klart att det skulle bli tskilligt knepigt tt modifiera PCC/6 till PCC/22. Dirtill skulle vi modifiera en redan avsevirt modifierd PCC, vilket knappast skulle bidra till vr farstelse far PCC:ns funktion. lstillet bestimde vi oss f tt riva ut nistn hela pass 2 och skriva egna kodgenereringsutiner far D22. Det skulle bli om inte snabbare s atminstone mer begripligt. Suok! P den vgen ir det. Efte en snabb exkus ave julen till BCPL f6r tt fa en smula hum om hur att generera kod frn trd, har vi b8rjat attackera pass 3 ige. BCPL r ett typlast sprk ooh problemet tt addera en character med e long integer uppstar aldrig. Det gar det i C. Yup! You bet! PCC/22 har dock ftt upp nsan aver vattenytan. Vi kan kompilera assignments, och eklare aritmetiska operatorer, vilket inte r fy skam. Vi har ocksa b6rjat hitta buggr i PCC/6 -- flyttalshanteringen r ofullstdigt implemetefad. Vidare innehaller teckenhanteringen intressanta rutiner fr bytes som ligger pa udda adresser, vilket poblem D22 (DataSAAB vare tack!) inte lider av. Nu barjar istllet andra problem gara sig gllande. Som nimnts ovan har D22 en programrknare som bara r 15 bitar bred. Dvs. programmen ka inte vara starre n 32kord. Det verkar en smul tveksamt om vi ska kunna f a ner storleken pa pass 2 och 3 till bara 32k programarea. en, men ... det finns nog nagot lysatormissigt stt att lasa det ocksa. Fartvivla ej, du lilla hop! C you! Anders Thulin far UNIX22/C-SIG