ComputereProgrammering

Broadcaster - er ... Typer af compilere. Konverter og udsendelser

Programmer, samt folk til at oversætte fra et sprog til et andet brug for en tolk eller oversætter.

grundlæggende begreber

Programmet er en sproglig repræsentation af beregninger: I → P → P (i). En tolk er et program, som tilføres til indgangen program P og nogle indgang x. Den udfører på Px: I (P, x) = P (x). Det faktum, at der kun er én oversætter er i stand til at udføre alle mulige programmer (som kan være repræsenteret i det formelle system) er en meget dyb og betydelig opdagelse Turing.

Processoren er en fortolker af programmer i maskinsprog. Generelt for dyrt at skrive tolke til højt niveau sprog, så de omsættes til en form, der er lettere at fortolke.

Nogle former for oversættere har meget mærkelige navne:

  • Den assembler oversætter montage sprogprogrammer til maskinsprog.
  • Compileren oversætter et højt niveau sprog til et lavere sprog.

Broadcaster - er et program, der tager som input data programmet i nogle sprog S og producerer T-programmet på en sådan måde, at de begge har de samme semantik: P → X → Q. Det vil sige, ∀x. P (x) = Q (x).

Hvis udsendes hele programmet til noget fortolkelige, kaldes det en samling før udførelse eller AOT kompilering. AOT compiler kan anvendes i serie, hvoraf sidstnævnte er ofte assembler, for eksempel:

Kildekoden compiler → (oversætter) → → forsamling kode assembler (compiler) → → CPU maskinkode (tolk).

Operationel eller dynamisk kompilering opstår, hvis programmet sendes, når de udføres af andre tidligere kompileret del. JIT-compilere huske, hvad de allerede har gjort for ikke at gentage kildekoden igen og igen. De kan endda producere adaptiv kompilering og genkompilering baseret på opførslen af programmet udførelse miljø.

Mange sprog gør det muligt at udføre kode påkompileringstidspunktet og kompilere den nye kode ved runtime.

oversættelse etape

Broadcast omfatter trin til at analysere og syntetisere:

Kildekoden analysator → → → konceptuelle repræsentation generator (synthesizer) → Target kode.

Dette er på grund af disse grunde:

  • Enhver anden metode er ikke egnet. Word oversættelse simpelthen ikke virker.
  • God teknisk løsning: hvis du ønsker at skrive oversættere til M og N kildesprog målrettede behøver skrive kun M + N simple programmer (polukompilyatorov) snarere end M × N kompleks (i alt oversættere).

Men i praksis, en konceptuel billede af en meget sjældent udtryksfuld nok og stærk nok til at dække alle tænkelige kilde- og målsprog. Mens nogle var i stand til at komme tæt på dette.

Rigtige compilere passere gennem mange faser. Når du opretter din egen compiler behøver ikke at gentage alt det hårde arbejde, som folk har gjort for at skabe repræsentationer og generatorer. Du kan oversætte dit sprog direkte i JavaScript eller C, og drage fordel af eksisterende JavaScript-motor og C-compiler til at gøre resten. Du kan også bruge den eksisterende mellemliggende repræsentation og virtuelle maskiner.

rekord oversætter

Broadcaster - er et program eller hardware, der er involveret tre sprog: kilden, destination og basen. De kan skrives i en T-form, hvilket placerer den oprindelige venstre, højre og mål basen nedenfor.

Der er tre typer af compilere:

  • Broadcaster - er samokompilyator hvis det svarer til den grundlæggende kilde sprog.
  • Compiler som målsprog er grundlinjen, kaldet samorezidentnym.
  • Broadcaster - en cross-compiler, hvis han målrettet og grundlæggende forskellige sprog.

Hvorfor er dette vigtigt?

Selv hvis du aldrig gøre en reel compiler, et godt kendskab til den teknologi med sin skabelse, fordi konceptet anvendes til dette formål anvendes bredt, for eksempel:

  • formatering af tekst;
  • sprog forespørgsler til databaser;
  • avancerede computer-arkitektur;
  • generaliserede optimeringsproblemer;
  • GUI;
  • scriptsprog;
  • controllere;
  • virtuelle maskiner;
  • Maskinoversættelse.

Desuden, hvis du ønsker at skrive præprocessorer, indeksobligationer, læssemaskiner, debuggere og profilers, skal du gå igennem de samme trin, som når du skriver en compiler.

Du kan også lære at skrive bedre programmer, siden oprettelsen af den oversætter til sprog betyder en bedre forståelse af dens snørklede og tvetydigheder. Studiet af de generelle principper for transmission giver dig også mulighed for at blive en god designer sprog. Så er det ligegyldigt, hvor stejl sproget, hvis det ikke kan gennemføres effektivt?

omfattende teknologi

compiler teknologi dækker mange forskellige områder af datalogi:

  • formelle teori om sprog: grammatik, parsing, beregnelighed;
  • computer arkitektur:. instruktionssæt, RISC eller CISC, pipelined forarbejdning core klokcykler, etc;
  • begreberne programmeringssprog, fx at udføre en sekvens kontrol, betinget udførelse, iteration, rekursion, funktionel nedbrydning, modularitet, synkronisering, meta-programmering, omfang, konstante undertyper, skabeloner, output typen, prototyper, anmærkninger, flow, monader, postkasser, fortsætte , jokertegn, regulære udtryk, transaktionsbeslutning hukommelse, arv, polymorfi, funktionsindstillinger, og så videre osv..;
  • abstrakte sprog og virtuelle maskiner;
  • algoritmer og datastrukturer: regulære udtryk, parsing algoritmer, grafik algoritmer, dynamisk programmering, uddannelse;
  • programmeringssprog: syntaks, semantik (statiske og dynamiske), støtte paradigmer (strukturelle, OOP, funktionel, logisk, stak, parallelitet, meta-programmering);
  • oprettelsen software (compilere, som regel store og komplekse): lokalisering, caching, componentize, API-grænseflader, genbrug, synkronisering.

compiler design

Nogle af de problemer i forbindelse med udviklingen af den virkelige oversætter:

  • Problemer med kildesproget. Er det nemt at kompilere det? Er der en præprocessor? Hvordan er de typer? Er der et bibliotek?
  • Gruppering compiler passerer: single eller multi-way?
  • Graden af optimering ønskes. Hurtige og urene udsendelser med lidt eller ingen optimering kan være normal. Over-optimering compiler vil aftage, men bedre kode på runtime kan være det værd.
  • Den krævede grad af fejldetektering. Kan en oversætter bare stopper ved den første fejl? Når det skal stoppe? Uanset om at have tillid til den compiler fejlkorrektion?
  • Tilgængeligheden af værktøj. Hvis originalsproget ikke er meget lille, er scanneren og generator analysatorer påkrævet. Der er også generatorer, kode generatorer, men de er ikke så almindeligt.
  • Type af mål kode, der skal genereres. Vælges fra ren suppleres eller virtuel maskine kode. Eller bare skrive en post del, der skaber en populær mellemliggende repræsentation såsom LLVM, RTL, eller JVM. Eller lave en oversættelse af den originale i kildekoden i C eller JavaScript.
  • Formatet af målet koden. Du kan vælge en samling sprog, en bærbar maskine kode, maskinkode hukommelse billedet.
  • Retargeting. Når sættet af generatorer er godt at have et fælles indløb del. Af denne grund er det bedst at have en generator til input af mange dele.

compiler Arkitektur: komponenter

Det er de vigtigste funktionelle komponenter i en compiler, der genererer native kode (hvis output er et program i C eller en virtuel maskine, du har brug for ikke så mange faser):

  • Input-programmet (flow varemærker) tilføres i scanneren (leksikale analysator), som konverterer det til en strøm af tokens.
  • Parser (parser) konstruere en abstrakt syntaks træ.
  • Semantisk analysator nedbryder den semantiske information og kontrollerer træet knudepunkter for fejl. Som et resultat, der er bygget semantisk graf - abstrakt syntaks træ med yderligere egenskaber og de etablerede forbindelser.
  • Mellemliggende kodegenerator bygger en rutediagram (tupler er grupperet i blokke).
  • Machine-uafhængig kode Optimizer udfører både lokale (inden baseenheden) og global (til alle blokke) optimering dybest set forbliver inden rutiner. Reducerer overflødig kode og forenkler beregningerne. Resultatet er en modificeret rutediagram.
  • Generator binder target kode basisblokke i en retlinet transmission kontrolkode, skaber et objekt fil assembler virtuelle registre (eventuelt ineffektive).
  • Machine-afhængige optimizer, linker allokerer hukommelse mellem registrene og gør planlægning hold. Det udfører konverteringen programmet i assembler på denne samling med en god brug af pipelining.

Hertil kommer, at brugen af fejlfinding delsystem manager og symboltabeller.

Leksikalsk analyse (scanning)

Scanneren konverterer strøm kilde karakterer i en strøm af poletter, fjerne mellemrum, kommentarer og ekspanderende makroer.

Scannere ofte støder på problemer, såsom om der skal tages hensyn til den sag, margener, linjeskift og indlejrede kommentarer.

Fejl, der kan opstå under scanningen, kaldet leksikalsk og omfatter:

  • tegn, der ikke i alfabetet;
  • overstiger antallet af tegn i et ord eller linje;
  • ikke en lukket skilt eller en streng bogstavelig;
  • slutningen af filen i kommentar.

Parsing (parsing)

Parseren konverterer sekvensen af tokens til et abstrakt syntaks træ. Hver knude i træet er lagret som et objekt med navngivne felter, hvoraf mange er selv træet noder. På dette tidspunkt er der ingen cykler. Når du opretter en parser er nødvendigt at være opmærksom på det niveau af kompleksitet grammatik (LL eller LR) og finde ud af, om der er nogen regler flertydig. Nogle sprog kræver semantisk analyse.

Fejl fundet i denne fase kaldes syntaks. For eksempel:

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

semantisk analyse

Under den semantisk analyse til at kontrollere tilladeligheden af regler og associerede dele af parsetræ (tillader referencenavne indsætte operation for implicitte typekonverteringer, og så videre. D.) Til dannelse den semantiske graf.

Det er klart, det sæt af antagelse af reglerne på forskellige sprog forskellige. Hvis du kompilere de Java-lignende sprog, kan compilere finde:

  • multipel variabelerklæring inden for sit omfang;
  • en reference til en variabel før sin erklæring;
  • henvisninger til navnet på den sort;
  • krænkelse af patentrettigheder;
  • stor eller for lille antal argumenter i en fremgangsmåde opkald;
  • typen mismatch.

generation

Mellemliggende kode generation producerer flow graf sammensat af tupler, grupperet i basisblokke.

kodegenerering producerer en reel maskinkode. I traditionelle compilere til RISC-maskiner på det første skridt, du opretter en assembler med et uendeligt antal virtuelle registre. For CISC-maskiner sandsynligvis ikke vil ske.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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