DatorerProgrammering

Sändaren - är ... typer av kompilatorer. Konvertera och sända program

Program, liksom människor att översätta från ett språk till ett annat behöver en tolk eller översättare.

grundläggande begrepp

Programmet är en språklig representation av beräkningar: i → P → P (i). En tolk är ett program, som matas till ingångsprogrammet P och lite input x. Den presterar vid P x: I (P, x) = P (x). Det faktum att det bara finns en översättare kan utföra alla möjliga program (som kan representeras i det formella systemet) är en mycket djup och betydande upptäckt Turing.

Processorn är en tolk av program i maskinspråk. Generellt för dyrt att skriva tolkar för högnivåspråk, så att de översätter till en form som är lättare att tolka.

Vissa typer av översättare har mycket konstiga namn:

  • Assembler översätter program assembler till maskinspråk.
  • Kompilatorn översätter ett högnivåspråk till en lägre språk.

Sändaren - är ett program som tar som indata programmet i vissa språk S och producerar T-programmet på ett sådant sätt att de båda har samma semantik: P → X → Q. Det vill säga, ∀x. P (x) = Q (x).

Om sända hela programmet till något tolknings, kallas det en sammanställning före utförande eller AOT sammanställning. AOT kompilatorn kan användas i serie, är den senare som ofta assembler, till exempel:

Källkoden kompilatorn → (översättare) → → assemblerkod assembler (kompilator) → → CPU maskinkod (tolk).

Operativ eller dynamisk kompilering uppstår om programmet sänds, när de utförs av andra tidigare sammanställt en del. JIT-kompilatorer komma ihåg vad de redan har gjort för att inte upprepa källkoden och om igen. De kan även producera adaptiva sammanställning och omkompilering baserat på beteendet hos programkörning miljön.

Många språk gör det möjligt att köra kod vid kompileringen och kompilera den nya koden vid körning.

överföringssteg

Broadcast innefattar stegen att analysera och syntetisera:

Källkoden analysator → → → konceptuell representation generator (syntetisator) → Target-kod.

Detta är på grund av dessa orsaker:

  • Någon annan metod är inte lämplig. Ord översättning helt enkelt inte fungerar.
  • Bra teknisk lösning: Om du vill skriva översättare för M och N källspråk riktade behöver skriva endast M + N enkla program (polukompilyatorov) snarare än M * N komplex (totalt översättare).

Men i praktiken, en konceptuell bild av en mycket sällan uttrycks nog och kraftfull nog för att täcka alla tänkbara käll- och målspråk. Medan vissa kunde komma nära detta.

Real kompilatorer passerar många stadier. När du skapar din egen kompilator behöver inte upprepa allt det hårda arbete som folk har gjort för att skapa representationer och generatorer. Du kan översätta språk direkt i JavaScript eller C och dra nytta av befintliga JavaScript-motorn och C-kompilator för att göra resten. Du kan också använda den befintliga mellan representation och virtuella maskiner.

rekord översättare

Sändaren - är ett program eller hårdvara, vilket innebar tre språk: källan, destinationen och basen. De kan skrivas i en T-form, placera den ursprungliga vänster, höger och mål bas nedan.

Det finns tre typer av kompilatorer:

  • Sändaren - är samokompilyator om det överensstämmer med den grundläggande källspråket.
  • Kompilator som riktar språket är baslinjen, som kallas samorezidentnym.
  • Broadcaster - en cross-kompilator, om han riktade och grundläggande olika språk.

Varför är detta viktigt?

Även om du aldrig göra en verklig kompilator, en god kunskap om tekniken för dess tillkomst, eftersom begreppet används för detta ändamål används i stor utsträckning, till exempel:

  • formatera text;
  • språk frågor till databaser;
  • avancerad datorarkitektur;
  • generaliseoptimeringsproblem;
  • GUI;
  • skriptspråk;
  • regulatorer;
  • virtuella maskiner;
  • Maskinöversättning.

Dessutom, om du vill skriva preprocessorer, länkar, lastare, debuggers och profilerare, måste du gå igenom samma steg som när du skriver en kompilator.

Du kan också lära sig att skriva bättre program, eftersom skapandet av översättaren för språket innebär en bättre förståelse för dess krångligheter och oklarheter. Studien av de allmänna principerna för sändning kan du också bli en bra designer språk. Så spelar det någon roll hur brant språket om den inte kan genomföras på ett effektivt sätt?

omfattande teknik

kompilatorteknik omfattar många olika områden för datavetenskap:

  • formell teori om språk: grammatik, tolkning, beräkningsbarhet;
  • datorarkitektur:. instruktionsuppsättningar, RISC eller CISC, i serie kopplade bearbetning kärnklockcykler, etc;
  • begreppen programmeringsspråk, till exempel, att utföra en sekvensstyrning, villkorlig exekvering, upprepning, rekursion, funktionell nedbrytning, modularitet, synkronisering, meta-programmering, omfattning, konstanta undertyper, mallar, utgångstyp, prototyper, annoteringar, flöde, monaderna, brevlådor, fortsätter , jokertecken, reguljära uttryck, transaktionsminne, arv, polymorfi, lägesinställningar, och så vidare osv..;
  • abstrakta språk och virtuella maskiner;
  • algoritmer och datastrukturer: reguljära uttryck parsning algoritmer, grafik algoritmer, dynamisk programmering, utbildning,
  • programmeringsspråk: syntax, semantik (statiska och dynamiska), stöd paradigm (strukturella, OOP, funktionella, logiska, stack, parallellitet, meta-programmering);
  • programvara för att skapa (kompilatorer, vanligtvis stora och komplexa): lokalisering, caching, componentize, API-gränssnitt, återanvändning, synkronisering.

Kompilator-

En del av de problem som uppstått i utvecklingen av den reala översättare:

  • Problem med källspråket. Är det lätt att sammanställa det? Finns det en preprocessor? Hur är de typer? Finns det ett bibliotek?
  • Gruppering kompilatorn passerar: enkel eller flervägs?
  • Graden av optimering önskas. Snabba och orena sända program med liten eller ingen optimering kan vara normal. Över optimering kompilatorn kommer att bromsa, men bättre kod vid körning kan vara värt det.
  • Den erforderliga graden av feldetektering. Kan en översättare bara stannar vid det första felet? När det ska sluta? Vare sig att lita på kompilatorn felkorrigering?
  • Tillgängligheten av verktyg. Om originalspråket inte är mycket små, skannern och generator analysatorer krävs. Det finns också generatorer, kodgeneratorer, men de är inte så vanligt.
  • Typ av mål kod som ska genereras. Väljas från ren kompletteras eller virtuell maskin kod. Eller bara skriva en post del som skapar en populär mellan representation som LLVM, RTL, eller JVM. Eller gör en översättning av originalet i källkoden i C eller JavaScript.
  • Formatet av målet koden. Du kan välja en assembler, en bärbar maskinkod, maskinkod minnesbild.
  • Retargeting. När den inställda av generatorer är bra att ha ett gemensamt inlopp portion. Av denna anledning är det bäst att ha en generator för inmatning av många delar.

kompilator Architecture: komponenter

Dessa är de viktigaste funktionella komponenterna i en kompilator som genererar inbyggd kod (om utgångs programmet är ett program i C eller en virtuell maskin, du behöver inte så många steg):

  • Inmatningsprogrammet (flytmärken) matas in i skannern (lexikal analysator), som omvandlar den till en ström av polletter.
  • Parser (parser) konstruktion ett abstrakt syntaxträd.
  • Semantisk analysator bryts den semantiska informationen och kontrollerar trädnoder för fel. Som ett resultat, byggd semantisk graf - abstrakt syntaxträd med ytterligare egenskaper och de etablerade länkar.
  • Mellanliggande kodgenerator bygger en flödesgraf (tupler är grupperade i huvudblock).
  • Maskinoberoende kod Optimizer bedriver både lokala (inom basenheten) och global (till alla block) optimering princip kvar inom rutiner. Minskar redundant kod och förenklar beräkningarna. Resultatet är en modifierad flödesgraf.
  • Generator binder mål-kod basblock i en rätlinjig överförings styrkod, vilket skapar en objektfil assembler virtuella register (eventuellt ineffektiva).
  • Maskinberoende Optimizer, allokerar länkminne mellan register och gör planerar lag. Den utför omställningsprogrammet i assembler på denna enhet med en bra användning av pipelining.

Dessutom användning av feldetektering delsystem manager och symboltabeller.

Lexikalisk analys (avsökning)

Skannern omvandlar ström källtecken i en ström av symboler, ta bort blank, kommentarer och expanderande makron.

Skannrar har ofta problem, till exempel om eller inte ta hänsyn till fallet marginaler radbrytningar och inbäddade kommentarer.

Fel som kan uppstå under skanning, kallad lexikal och inkluderar:

  • tecken som inte ingår i alfabetet,
  • överskott av antalet tecken i ett ord eller linje;
  • inte en stängd tecken eller en stränglitteral;
  • filslut i kommentar.

Parsning (parsning)

Tolken omvandlar sekvensen av polletter i en abstrakt syntaxträd. Varje nod i trädet lagras som ett objekt med namngivna fält, av vilka många själva trädet noder. I detta skede finns det inga cykler. När du skapar en parser är nödvändigt att uppmärksamma graden av komplexitet grammatik (LL eller LR) och ta reda på om det finns några regler disambiguation. Vissa språk kräver semantisk analys.

Felaktigheter som upptäckts i detta skede kallas syntax. Till exempel:

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

semantisk analys

Under semantisk analys för att kontrollera tillåtligheten av regler och associerade delar av parseträd (tillåta referensnamn införing operation för implicit typkonvertering, och så vidare. D.) För att bilda den semantiska grafen.

Självklart, den uppsättning av tillåtligheten av regler på olika språk olika. Om du kompilera Java-liknande språk, kan kompilatorer finns:

  • multipel variabel förklaring inom dess omfång;
  • en referens till en variabel innan sin förklaring;
  • hänvisningar till namnet på den svarta;
  • åsidosättande av patenträttigheter;
  • överdriven eller otillräcklig antal argument i ett metodanrop;
  • typ felparning.

generationen

Mellanliggande kodgenerering producerar flödeskurvan sammansatt av tupler, grupperade i basblock.

kodgenerering producerar en riktig maskin kod. I traditionella kompilatorer för RISC-maskiner på det första steget skapar du en montör med ett oändligt antal virtuella register. För CISC-maskiner förmodligen inte kommer att hända.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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