DatamaskinerProgrammering

Sender - er ... Typer kompilatorer. Konvertere og broadcast-programmer

Programmer, så vel som folk til å oversette fra ett språk til et annet trenger tolk eller oversetter.

grunnleggende begreper

Programmet er en språklig representasjon av beregninger: I → P → P (i). En tolk er et program som blir tilført til inngangen program P og noen inngang x. Den utfører ved P x: I (P, x) = P (x). Det faktum at det bare er en oversetter er i stand til å utføre alle mulige programmer (som kan representeres i den formelle systemet) er en meget dyp og betydelig funn Turing.

Prosessoren er en tolker av programmer i maskinspråk. Generelt for dyrt å skrive tolker for høyt nivå språk, slik at de slå ut i en form som er lettere å tolke.

Noen typer oversettere har svært merkelige navn:

  • Assembler oversmonteringsspråklige programmer til maskinspråk.
  • Kompilatoren oversetter en høynivå språk til en lavere språk.

Sender - er et program som tar som inngangsdata til programmet i noen språk S og frembringer T-program på en slik måte at de begge har samme semantikken: P → X → Q. Det vil si, ∀x. P (x) = Q (x).

Hvis kringkaste hele programmet til noe tolke, kalles det en samling før henrettelsen, eller AOT samling. AOT kompilatoren kan brukes i serie, er det sistnevnte som ofte assembler, for eksempel:

Kildekoden kompilatoren → (etter) → → assemblerkode assembler (kompilator) → → CPU maskinkode (tolk).

Operasjonell eller dynamisk kompilering oppstår hvis programmet sendes, når utført av andre tidligere utarbeidet en del. JIT-kompilatorer huske hva de allerede har gjort det for ikke å gjenta kildekoden igjen og igjen. De kan selv produsere adaptiv kompilering og recompilation basert på oppførselen til programmet execution environment.

Mange språk tillate å kjøre kode på kompilering og kompilere den nye koden under kjøring.

oversettelse scenen

Broadcast omfatter de trinn å analysere og å syntetisere:

Kildekoden analysator → → → begrepsmessig representasjon generator (synthesizer) → Target kode.

Dette er på grunn av disse grunner:

  • Enhver annen metode er ikke egnet. Ord oversettelse rett og slett ikke fungerer.
  • God teknikk løsning: Hvis du ønsker å skrive oversettere for M og N kilde språk målrettede må skrive bare M + N enkle programmer (polukompilyatorov) snarere enn M × N kompleks (totalt oversettere).

Men i praksis, en konseptuell visning av en svært sjelden uttrykks nok og kraftig nok til å dekke alle tenkelige kilden og målet språk. Mens noen var i stand til å komme nær dette.

Ekte kompilatorer passere gjennom mange faser. Når du oppretter din egen kompilatoren trenger ikke å gjenta alt det harde arbeidet som folk har gjort for å skape representasjoner og generatorer. Du kan oversette språket direkte i Javascript eller C og dra nytte av eksisterende Javascript-motoren og C-kompilator til å gjøre resten. Du kan også bruke den eksisterende mellom representasjon og virtuelle maskiner.

posten overs

Sender - er et program eller maskinvare, som involverte tre språk: kilden, mål- og basen. De kan være skrevet i en T-form, plassering av originalen venstre, høyre og mål basen under.

Det finnes tre typer kompilatorer:

  • Sender - er samokompilyator om det svarer til den grunnleggende kilde språk.
  • Kompilator som målrette språk er grunnlinjen, kalt samorezidentnym.
  • Sender - en cross-kompilator, hvis han målrettet og grunnleggende forskjellige språk.

Hvorfor er dette viktig?

Selv om du aldri gjør en reell kompilator, en god kjennskap til teknologien i sin skapelse, fordi begrepet brukes til dette formålet brukes mye, for eksempel:

  • formatering tekst;
  • språkspørringer til databaser;
  • avanserte datamaskinarkitektur;
  • generalisert optimeringsproblemer;
  • GUI;
  • skriptspråk;
  • regulerende midler;
  • virtuelle maskiner;
  • Maskinoversettelse.

I tillegg, hvis du ønsker å skrive preprocessors, linkerne, lastere, debuggere og profilerings, må du gå gjennom de samme trinnene som når du skriver en kompilator.

Du kan også lære å skrive bedre programmer, siden etableringen av oversetteren for språket betyr en bedre forståelse av dens detaljene og uklarheter. Studiet av de generelle prinsippene for kringkasting kan du også bli en god designer språk. Så betyr det noe hvor bratt språket hvis den ikke kan gjennomføres effektivt?

omfattende teknologi

kompilatoren teknologi dekker mange ulike områder av informatikk:

  • formell teori om språk: grammatikk, parsing, computability;
  • datamaskinarkitektur.: instruksjonssett, RISC eller CISC, pipeline-behandling kjerneklokkesykluser, etc;
  • begrepene programmeringsspråk, for eksempel å utføre en sekvenskontroll, betinget utførelse, iterasjon, rekursjon, funksjonell nedbryting, være modulbasert, synkronisering, meta-programmering, omfang, konstant undertyper, maler, utgangstypen, prototyper, merknader, strømning, monadene, postkasser, fortsetter , jokere, regulært uttrykk, transaksjonsminne, arv, polymorfisme, modusinnstillinger, og så videre osv..;
  • abstrakte språk og virtuelle maskiner;
  • Algoritmer og datastrukturer: regulære uttrykk, parsing algoritmer, grafikk algoritmer, dynamisk programmering, trening;
  • programmeringsspråk: syntaks, semantikk (statisk og dynamisk), støtte paradigmer (struktur-, OOP, funksjonell, logiske, stabel, parallellisme, meta-programmering);
  • etableringen programvare (kompilatorer, som regel store og komplekse): lokalisering, caching, componentize, API-grensesnitt, gjenbruk, synkronisering.

kompilatoren utforming

Noen av problemene i utviklingen av den virkelige etter:

  • Problemer med kildespråket. Er det lett å kompilere den? Er det en preprosessor? Hvor er de typene? Er det et bibliotek?
  • Gruppering kompilatoren passerer: singel eller multi-way?
  • Graden av optimaliseringen er ønskelig. Rask og urent kringkastingsprogrammer med lite eller ingen optimalisering kan være normal. Over-optimalisering kompilatoren vil avta, men bedre koden under kjøring kan være verdt det.
  • Den nødvendige grad av feildeteksjon. Kan en overs bare stoppe på den første feilen? Når det skal slutte? Enten å stole kompilatoren feilretting?
  • Tilgjengeligheten av verktøyene. Dersom originalspråket ikke er svært liten, er skanneren og generator analysatorer nødvendig. Det er også generatorer, kodegeneratorer, men de er ikke så vanlig.
  • Typen mål kode som skal genereres. Velges fra ren supplert eller virtuelle maskinkode. Eller bare skrive et inngangsområde som skaper en populær mellomrepresentasjon som LLVM, RTL, eller JVM. Eller lage en oversettelse av den opprinnelige i kildekoden i C eller Javascript.
  • Formatet målet kode. Du kan velge en forsamling språk, en bærbar maskin kode, maskinkode minnebildet.
  • Retargeting. Når settet av generatorer er god å ha en felles innløpsparti. Av denne grunn er det best å ha en generator for innspill fra mange deler.

kompilatoren Arkitektur: komponenter

Disse er de viktigste funksjonelle komponentene i en kompilator som genererer egen kode (hvis det ferdige programmet er et program i C eller en virtuell maskin, trenger du ikke så mange etapper):

  • Inngangs program (strømningsmerker) mates inn i skanneren (leksikalske analysator), som konverterer den til en strøm av symboler.
  • Parser (parser) å konstruere en abstrakt syntaks treet.
  • Semantisk analysator dekomponerer semantisk informasjon og kontrollerer tre noder for feil. Som et resultat, inne semantisk graf - abstrakt syntaks tre med flere egenskaper og de etablerte forbindelser.
  • Mellomkodegenerator bygger en flytgraf (tuppeler er gruppert i hovedblokker).
  • Maskinuavhengig kode optimizer utfører både lokalt (innenfor baseenhet) og global (til alle blokkene) optimalisering utgangspunktet igjen i rutiner. Reduserer overflødig kode og forenkler beregningene. Resultatet er en modifisert flytgraf.
  • Generator binder mål-kodegrunnleggende blokker i en rettlinjet transmisjonskontrollkode, og skaper en objektfilen assembler virtuelle registre (muligens ineffektiv).
  • Maskin-avhengige optimizer, tildeler linker minne mellom registre og gjør planlegging team. Det utfører konvertering program i assembly på denne forsamlingen med en god bruk av pipelining.

I tillegg vil bruk av feildeteksjon delsystem leder og symbol tabeller.

Leksikalsk analyse (scanning)

Skanneren konverterer strøm kildetegn inn i en strøm av symboler, å fjerne mellomrom, kommentarer og ekspanderende makroer.

Skannere ofte støter på problemer, for eksempel om ikke å ta hensyn til saken, marginer, linjeskift og innebygde kommentarer.

Feil som kan oppstå under skanning, kalt leksikalske og inkluderer:

  • tegn som ikke er i alfabetet,
  • overskudd av det antall tegn i et ord eller en linje;
  • ikke en lukket tegn eller et strenglitteral;
  • slutt på fil i kommentar.

Parsing (parsing)

Spalteren omdanner sekvensen av symboler i en abstrakt syntaks treet. Hver node i treet blir lagret som et objekt med navngitte felt, hvorav mange er selv de tre noder. På dette stadiet er det ingen sykluser. Når du oppretter en parser er nødvendig å ta hensyn til nivået av kompleksiteten i grammatikk (LL eller LR) og finne ut om det er noen regler disambiguering. Noen språk krever semantisk analyse.

Feil funnet på dette stadiet kalles syntaks. For eksempel:

  • k = 5 * (7 - y;
  • j = / 5;
  • 56 = x * 4.

semantisk analyse

Under semantisk analyse for å kontrollere tillatelsen av regler og knytte deler av parsetreet (tillater referanse navn innsetting av drift for implisitte Konverteringer, og D. osv.) For å danne det semantiske grafen.

Selvfølgelig, det sett av vidt reglene i ulike språk forskjellige. Hvis du kompilere Java-lignende språk, kan kompilatorer finne:

  • multippel variabel melding innenfor dens ramme;
  • en referanse til en variabel før dens erklæring;
  • referanser til navnet på svart;
  • krenkelse av patentrettigheter;
  • overdreven eller utilstrekkelig antall argumenter i en metode samtale;
  • typen mismatch.

generasjon

Mellomkodegenerering frembringer flytgraf sammensatt av tuppeler, gruppert i grunnleggende blokker.

kodegenerering gir en reell maskinkode. I tradisjonelle kompilatorer for RISC-maskiner på det første trinnet oppretter du en assembler med et uendelig antall virtuelle registre. For CISC-maskiner sannsynligvis ikke vil skje.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 no.delachieve.com. Theme powered by WordPress.