b"\n_START_ARTICLE_\nPrinciples of Compiler Design\n_START_SECTION_\nKapittel 1. Introduksjon til kompilatorer\n_START_PARAGRAPH_\nKapittel 1, \xc2\xabintroduksjon til kompilatorer\xc2\xbb (Introduction to Compilers), er en generell innf\xc3\xb8ring i kompilatorer. Kapittelet begynner med \xc3\xa5 dr\xc3\xb8fte kompilatorer og oversettere, og \xc3\xa5rsaken til at vi trenger oversettere. Deretter gjennomg\xc3\xa5s strukturen til en kompilator. Kapittelet fortsetter med \xc3\xa5 dr\xc3\xb8fte leksikalsk analyse, syntaktisk analyse og mellomkodegenerering. Deretter f\xc3\xb8lger en kort gjennomgang av optimaliserende kompilatorer, f\xc3\xb8r kapittelet g\xc3\xa5r over til \xc3\xa5 behandle kodegenerering. Kapittelet fortsetter med \xc3\xa5 behandle bokf\xc3\xb8ring, feilh\xc3\xa5ndtering og verkt\xc3\xb8y for \xc3\xa5 lage kompilatorer. Til slutt forklares det hvordan man kommer i gang med et kompilatorprosjekt.\n_START_SECTION_\nKapittel 2. Programmeringsspr\xc3\xa5k\n_START_PARAGRAPH_\nKapittel 2, \xc2\xabProgrammeringsspr\xc3\xa5k\xc2\xbb (Programming Languages), omhandler programmeringsspr\xc3\xa5k. Kapittelet begynner med \xc3\xa5 dr\xc3\xb8fte h\xc3\xb8yniv\xc3\xa5spr\xc3\xa5k, og fortsetter med definisjoner av programmeringsspr\xc3\xa5k. Deretter behandles den leksikalske og syntaktiske struktur til et programmeringsspr\xc3\xa5k, dataelementer, datastrukturer, operatorer, tildelinger, programvareenheter datamilj\xc3\xb8er og parameteroverf\xc3\xb8ringer. Til slutt behandles lagringsh\xc3\xa5ndtering.\n_START_SECTION_\nKapittel 3. Endelige tilstandsmaskiner og leksikalsk analyse\n_START_PARAGRAPH_\nKapittel 3, \xc2\xabEndelige tilstandsmaskiner og leksikalsk analyse\xc2\xbb (Finite Automata and Lexical Analysis), omhandler leksikalsk analyse av et programmeringsspr\xc3\xa5k. Kapittelet innleder med \xc3\xa5 dr\xc3\xb8fte rollen til den leksikalske analysator innenfor kompilatoren. Deretter f\xc3\xb8lger en enkel tiln\xc3\xa6rmelse for konstruksjon av leksikalske analysatorer, etterfulgt av beskrivelse av regul\xc3\xa6re uttrykk. Kapittelet fortsetter med beskrivelsen av en Finite Automata eller en endelig tilstandsmaskin, og beskriver deretter hvordan regul\xc3\xa6re uttrykk kan omdannes til en endelig tilstandsmaskin. Deretter beskrives det hvordan man minimaliserer antall tilstander i en deterministisk endelig tilstandsmaskin (DFA), som er konstruert ut fra en ikke-deterministisk endelig tilstandsmaskin (NFA). Kapittelet fortsetter med \xc3\xa5 dr\xc3\xb8fte et spr\xc3\xa5k for spesifikasjon av leksikalske analysatorer, og forklarer implementasjonen av leksikalske analysatorer. Deretter forklares det hvordan en scannergenerator kan fungere som det som metaforisk kalles en \xc2\xabsveitsisk lommekniv\xc2\xbb (Swiss Army Knife).\n_START_SECTION_\nKapittel 4. Den syntaktiske spesifikasjon av programmeringsspr\xc3\xa5k\n_START_PARAGRAPH_\nKapittel 4, \xc2\xabden syntaktiske spesifikasjon av programmeringsspr\xc3\xa5k\xc2\xbb (The Syntactic Specification of Programming Languages), behandler m\xc3\xa5ter \xc3\xa5 spesifisere syntaksen i et programmeringsspr\xc3\xa5k. Kapittelet behandler kontekstfri grammatikk, derivasjoner og parsertr\xc3\xa6r og til slutt kapabilitetene til kontekstfri grammatikk.\n_START_SECTION_\nKapittel 5. Grunnleggende parsingteknikker\n_START_PARAGRAPH_\nKapittel 5, \xc2\xabgrunnleggende parsingteknikker\xc2\xbb (Basic Parsing Techniques), beskriver ulike former for parsing. Kapittelet innledes med \xc3\xa5 dr\xc3\xb8fte parsere generelt. Deretter omtales skift-reduser-parsere, operator-presedens-parsere, ovenfra-ned-parsere, og til slutt prediktive parsere.\n_START_SECTION_\nKapittel 6. Automatisk konstruksjon av effektive parsere\n_START_PARAGRAPH_\nKapittel 6, \xc2\xabautomatisk konstruksjon av effektive parsere\xc2\xbb (Automatic Construction of Efficient Parsers), dreier seg blant annet om parsergeneratorer. Kapittelet begynner med \xc3\xa5 beskrive LR-parsere og den kanoniske samling av LR(0)-elementer. Deretter fortsetter det med \xc3\xa5 beskrive konstruksjon av SLR-parsingtabeller, konstruksjon av kanonisk LR-parsertabeller og konstruksjon av LALR-parsertabeller. Deretter behandles bruken av tvetydig grammatikk og en automatisk parsergenerator, i dette tilfellet Yacc. Til slutt behandles implementasjon av LR-parsingtabeller og konstruksjon av et LALR elementsett.\n_START_SECTION_\nKapittel 7. Syntaksrettet oversettelse\n_START_PARAGRAPH_\nKapittel 7, \xc2\xabsyntaksrettet oversettelse\xc2\xbb (Syntax-Directed Translation), dreier seg om syntaksrettet oversettelse. Kapittelet dr\xc3\xb8fter ulike former for sp\xc3\xb8rsm\xc3\xa5l ved mellomkodegenerering relatert til semantiske aksjoner og oversettelser av parsertreet, Deretter behandles forskjellige implementasjoner av syntaksrettede oversettelser,, etterfulgt av en dr\xc3\xb8fting av mellomliggende representasjon, omvendt polsk notasjon, parsertr\xc3\xa6r og syntakstr\xc3\xa6r, tre-adresse-koder, nibbler (4 biter) og tupler, oversettelser av tildelingstr\xc3\xa6r, boolske uttrykk, setninger som stanser flytkontrollen oversettelse av omvendte polske notasjoner og oversettelse med en ovenfra-ned parser.\n_START_SECTION_\nKapittel 8. Mer om oversettelse\n_START_PARAGRAPH_\nKapittel 8, \xc2\xabmer om oversettelse\xc2\xbb (More About Translation), fortsetter dr\xc3\xb8ftelsen av oversettelser. Kapitlet begynner med \xc3\xa5 gjennomg\xc3\xa5 tabellreferanser i aritmetiske uttrykk, og fortsetter med \xc3\xa5 behandle prosedyrekall, deklarasjoner, case-setninger og record-datastrukturer. Avslutningsvis omtales datastrukturene i PL/I-lignende programmeringsspr\xc3\xa5k.\n_START_SECTION_\nKapittel 9. Symboltabeller\n_START_PARAGRAPH_\nKapittel 9, \xc2\xabsymboltabeller\xc2\xbb (Symbol Tables), behandler symboltabeller. Kapitlet begynner med \xc3\xa5 dr\xc3\xb8fte innholdet i en symboltabell, og dr\xc3\xb8fter deretter datastrukturer for symboltabeller, f\xc3\xb8r det til slutt dr\xc3\xb8fter informasjonens gyldighetsomr\xc3\xa5der.\n_START_SECTION_\nKapittel 10. Administrasjon av lagringsmedia under kj\xc3\xb8ring\n_START_PARAGRAPH_\nKapittel 10, \xc2\xabadministrasjon av lagringsmedia under kj\xc3\xb8ring\xc2\xbb (Run-time Storage Administration), omhandler behandling av lagringsmedia. F\xc3\xb8rst beskrives en implementasjon av en enkel stakkallokering. Deretter beskrives en implementasjon av blokkstrukturerte programmeringsspr\xc3\xa5k. Deretter beskrives lagringsallokering i Fortran, og til slutt lagringsallokering i blokkstrukturerte spr\xc3\xa5k.\n_START_SECTION_\nKapittel 11. Deteksjon og retting av feil\n_START_PARAGRAPH_\nKapittel 11, \xc2\xabdeteksjon og retting av feil\xc2\xbb (Error Dedection and Recovery), omhandler feilbehandling. Kapittelet innledes med \xc3\xa5 beskrive feilrapportering og ulike typer feil, leksikalske, syntaktiske og semantiske. Deretter behandles feil som kan oppdages under den leksikalske analysen og den syntaktiske analysen, og til slutt behandles semantiske feil.\n_START_SECTION_\nKapittel 12. Introduksjon til kodeoptimalisering\n_START_PARAGRAPH_\nKapittel 12, \xc2\xabintroduksjon til kodeoptimalisering\xc2\xbb (Introduction to Code Optimization), innleder dr\xc3\xb8ftingen av programvareoptimalisering. Innledningsvis gis en oppsummering av ulike former for optimalisering. Deretter behandles l\xc3\xb8kkeoptimalisering. I neste omgang beskrives rettede asykliske grafer som en presentasjon av grunnleggende blokker. Kapittelet beskriver verditall og algebraiske lover, f\xc3\xb8r det avsluttes med en global dataflytanalyse.\n_START_SECTION_\nKapittel 13. Mer om l\xc3\xb8kkeoptimalisering\n_START_PARAGRAPH_\nKapittel 13, \xc2\xabmer om l\xc3\xb8kkeoptimalisering\xc2\xbb (More About Loop Optimization), utdyper dr\xc3\xb8ftelsen av l\xc3\xb8kkeoptimalisering. Kapittelet starter med \xc3\xa5 behandle dominatorer, en kontrollflytgraf hvor node d dominerer en node n. Deretter fortsetter det med \xc3\xa5 behandle reduserbare flytgrafer og beregninger av l\xc3\xb8kkeinvarianter. Deretter behandles eliminasjon av induksjonsvariabler. Avslutningsvis behandles en del andre l\xc3\xb8kkeoptimaliseringer.\n_START_SECTION_\nKapittel 14. Mer om dataflytanalyse\n_START_PARAGRAPH_\nKapittel 14, \xc2\xabmer om dataflytanalyse\xc2\xbb (More About Data-Flow Analysis), fortsetter dr\xc3\xb8ftelsen av dataflytanalyser. Etter \xc3\xa5 ha gjort en del grunnleggende definisjoner, beskrives constant folding som en m\xc3\xa5te \xc3\xa5 gjenkjenne og evaluere konstanter i uttrykk under kompilering i stedet for at de beregnes under kj\xc3\xb8ring. Deretter beskrives tilgjengelige uttrykk, som er en analysealgoritme for \xc3\xa5 bestemme mengden med uttrykk som ikke beh\xc3\xb8ves \xc3\xa5 beregnes p\xc3\xa5 nytt. Videre beskrives behandlingen av copy propagation. Etter \xc3\xa5 ha behandlet en baklengs analyse av dataflyten, kommer boken inn p\xc3\xa5 \xc2\xabsv\xc3\xa6rt opptatte uttrykk\xc2\xbb og kodeheising. Deretter beskrives fire former for dataflytanalyser: To som f\xc3\xb8lger dataflyten fremover, og to som f\xc3\xb8lger dataflyten bakover. Avslutningsvis beskrives dataflytanalyser mellom prosedyrer.\n_START_SECTION_\nKapittel 15. Kodegenerering\n_START_PARAGRAPH_\nKapittel 15, \xc2\xabkodegenerering\xc2\xbb (Code Generation), diskuterer generering av kode. Det dr\xc3\xb8ftes ulike alternativer, som generering av absolutt maskinkode, relokaliserbar maskinkode (objektfiler), assemblerkode eller et annet programmeringsspr\xc3\xa5k. ALTRAN og Ratfor brukes som eksempler p\xc3\xa5 det siste, i forbindelse med Fortran. Deretter dr\xc3\xb8ftes kodegeneratorens milj\xc3\xb8, adresseomr\xc3\xa5dene til navn under utf\xc3\xb8relse, problemer forbundet med kodegenerering, valg av instruksjoner som skal genereres, i hvilken rekkef\xc3\xb8lge beregninger skal utf\xc3\xb8res, og hvilke prosessorregistere som skal brukes. Deretter beskrives en abstrakt modell for en datamaskin, og pseudokoden for en kodegenerator.\n_START_SECTION_\nAppendiks A. En kikk p\xc3\xa5 enkelte kompilatorer\n_START_PARAGRAPH_\nAppendiks A, \xc2\xaben kikk p\xc3\xa5 enkelte kompilatorer\xc2\xbb (A Look at Some Compilers), diskuterer strukturen til kompilatorer for C, Fortran og BLISS. Tre ulike C-kompilatorer diskuteres: Dennis Ritchie's (1941\xe2\x80\x932011) kompilator for minidatamaskinen PDP-11 og Stephen Curtis Johnson's Portable C Compiler for stormaskinene Honeywell 6070 og IBM System/370. Den f\xc3\xb8rstnevnte benyttet en rekursiv descendant parser, mens de to sistnevnte var implementert ved hjelp av en LALR-parser. Alle disse kompilatorene hadde to pass, og PDP-11 kompilatoren manglet et tredje pass for kodeoptimaliseringer. Deretter f\xc3\xb8lger en kort gjennomgang for kompilatoren FORTRAN-H for IBM System/370, og fire av dens 25 faser av kompilering. Til slutt gjennomg\xc3\xa5s BLISS-kompilatoren for PDP-11, og dens fem faser av kompilering.\n_START_SECTION_\nAppendiks B. Et programmeringsprosjekt\n_START_PARAGRAPH_\nAppendiks B, \xc2\xabet programmeringsprosjekt\xc2\xbb (A Programming Project), presenterer en samling anbefalte \xc3\xb8velser for kompilatorkonstruksjon. Forfatterne presenterer en delmengde av grammatikken til Pascal, og forklarer dette spr\xc3\xa5kets programstruktur og leksikalske konvensjoner. Deretter foresl\xc3\xa5s det, som \xc3\xb8velser, \xc3\xa5 lage en symboltabell, en kommandotolk for kvadrupler (nibler), en leksikalsk analysator, rutiner for semantikk for \xc3\xa5 generere kvadrupler, en parser, rutiner for feilh\xc3\xa5ndtering og evaluering av kompilatoren ved hjelp av en profiler. Til slutt foresl\xc3\xa5s det enkelte utvidelser av spr\xc3\xa5ket."