RačunalaProgramiranje

Emiter - je ... Vrste kompajlera. Pretvoriti i emituju programe

Programa, kao i ljudi za prevođenje sa jednog jezika na drugi treba tumač ili prevodilac.

osnovni pojmovi

Program je lingvistički predstavljanje proračuna: I → P → P (i). Prevodioca je program koji se isporučuje na ulazni program P i neki ulaz x. Ona nastupa na P x: I (P, x) = P (x). Činjenica da postoji samo jedan prevodilac je sposoban za sve moguće programe (koji se može predstaviti u formalnom sistemu) je vrlo duboka i značajna otkrića Turing.

Procesor je tumač programa na mašinski jezik. Obično preskupo pisati tumača za jezike visokog nivoa, tako da prevesti u oblik koji je lakše interpretirati.

Neke vrste prevodilaca imaju vrlo čudne nazive:

  • Asembler prevodi skupština programe jezika na mašinski jezik.
  • Kompajler prevodi jeziku visokog nivoa na niži jezik.

Emiter - je program koji uzima kao ulazni podatak program u nekom jeziku S i proizvodi T programa na takav način da oba imaju istu semantiku: P → X → P: To je, ∀x. P (x) = Q (x).

Ako emituju ceo program u nešto tumačiti, to se zove kompilacija prije izvršenja, ili AOT kompilacija. AOT kompajler može se koristiti u nizu, od kojih je potonji je često asembler, na primjer:

Izvorni kod kompajler → (prevodilac) → → okupljanja kod monter (kompajler) → → CPU mašinski kod (prevodilac).

Operativni ili dinamičke kompilacija dolazi ako se program emituje, kada je izvršen od strane drugih prethodno sastavio dio. JIT-kompajlera sjetiti onoga što su već uradili, kako ne bi iznova i iznova ponoviti izvornog koda. Oni mogu čak i proizvesti adaptivnim kompilacija i ponovno prevođenje na osnovu ponašanja okoline izvršavanja programa.

Mnogo jezika dozvoliti da izvrše kod vrijeme prevođenja i sastaviti novi kod za vrijeme izvođenja.

prijevod fazi

Broadcast se sastoji od koraka analize i sintezu:

Izvorni kod analizatora → → → konceptualni reprezentacije generator (sintisajzer) → Target koda.

To je zbog ovih razloga:

  • Bilo koji drugi način nije pogodan. Prijevod riječi jednostavno ne radi.
  • Dobrom inženjerskom rješenje: ako želite pisati prevodilaca za M i N izvor jezika na meti treba pisati samo M + N jednostavnih programa (polukompilyatorov), a ne M × N kompleks (ukupno prevodilaca).

Međutim, u praksi, konceptualni pogled vrlo rijetko dovoljno izražajna i dovoljno moćan da pokrije svaki mogući izvor i cilj jezika. Dok su neki bili u mogućnosti da se približi na ovo.

Real kompajlera prolaze kroz mnoge faze. Pri kreiranju vlastite kompajler ne treba da ponavlja sav trud da su ljudi uradili za stvaranje reprezentacije i generatora. Možete prevesti vaš jezik direktno u JavaScript ili C i iskoristiti postojeće JavaScript-motora i C kompajler učiniti ostalo. Također možete koristiti srednji predstavljanje postojećih i virtualnih strojeva.

rekord translator

Emiter - je program ili hardver, koji je uključivao tri jezika: izvor, odredište i bazu. Oni mogu biti napisani u obliku slova T, postavljanjem originalne lijevo, desno i ciljne baze ispod.

Postoje tri vrste kompajlera:

  • Emiter - je samokompilyator ako odgovara osnovni izvor jezika.
  • Kompajler koji ciljni jezik je osnovni, pod nazivom samorezidentnym.
  • Emiter - cross-kompajler, ako je na meti i osnovne različite jezike.

Zašto je to važno?

Čak i ako nikada napraviti pravu kompajler, dobro poznavanje tehnologije njegovog nastanka, jer je koncept koji se koristi za ovu svrhu su u širokoj upotrebi, na primjer:

  • formatiranje teksta;
  • jezik upite na baze podataka;
  • Advanced Computer arhitekture;
  • uopštene problemi optimizacije;
  • GUI;
  • skriptiranje jezika;
  • kontrolora;
  • virtuelne mašine;
  • Strojno prevođenje.

Osim toga, ako želite da pišete predprocesora, linkeri, utovarivači, debageri i profajleri, morate proći kroz iste korake kao kada se piše kompajler.

Također možete naučiti kako se pišu bolje programe, od stvaranja prevodioca za jezik znači bolje razumijevanje svojih zamršenost i nejasnoće. Studija opštih načela emitiranja vam omogućava da postane dobar dizajner jezik. Tako je to bitno kako strm jezik, ako se ne može efikasno implementirati?

sveobuhvatne tehnologije

kompajler tehnologija pokriva mnogo različitih područja informatike:

  • formalna teorija jezika: gramatika, rastavljanje, izračunljivost;
  • arhitektura računara:. skupa instrukcija, RISC ili CISC, protočne obrade takt jezgre ciklusa, itd;
  • koncepti programskih jezika, na primjer, obavljanje kontrole sekvence, uslovna izvršenje, iteracija, rekurzija, funkcionalnu dekompoziciju, modularnost, sinhronizacija, meta-programiranje, obim, stalno pod-vrste, predloške, tip izlaza, prototipovi, napomene, protok, monade, poštanski sandučići, nastaviti , džokera, regularni izraz, transakcijske memorije, nasljedstvo, polimorfizam, postavke režima, i tako dalje itd..;
  • apstraktne jezika i virtualnih strojeva;
  • algoritama i struktura podataka: regularnih izraza, raščlanjivanje algoritmi, grafike algoritmi, dinamičko programiranje, obuku;
  • programskih jezika: sintaksa, semantika (statička i dinamička), podrška paradigme (strukturni, OOP, funkcionalan, logično, stack, paralelizam, meta-programiranje);
  • softver stvaranje (kompajlera, obično velike i složene): lokalizacija, caching, componentize, API-interfejsa, ponovno korištenje, sinhronizacija.

kompajler dizajn

Neki od problemi u razvoju realne prevodilac:

  • Problemi sa izvornom jeziku. Da li je lako da ga sastaviti? Postoji li pretprocesora? Kako su vrste? Ima li knjižnica?
  • Grupiranje kompajler prolaza: jedan ili više puta?
  • Stupanj optimizacije želji. Brzo i nečisti emituju programe s malo ili bez optimizacije može biti normalan. Over-optimizaciju će usporiti, ali bolje kod za vrijeme izvođenja može biti vrijedno.
  • Potreban stepen detekcije grešaka. Može li prevodilac samo zaustaviti na prvom greška? Kada bi trebalo prestati? Da li vjerovati korekciju kompajler greška?
  • Dostupnost alata. Ako na izvornom jeziku nije baš mala, skener i generatora analizatora su obavezna. Tu su i generatora, kod generatora, ali oni nisu tako česte.
  • Tip ciljnih koda biti generiran. Biti izabran od čistog dopunama ili virtualne kod mašine. Ili samo napisati unos dio koji stvara popularne srednji reprezentacije kao što su LLVM, RTL, ili JVM. Ili napravi prevod originalnog u izvornom kodu u C ili JavaScript.
  • Format ciljnog koda. Možete odabrati jezik za skupštinu, prenosni mašinski kod, mašinski kod memorije slike.
  • Retargeting. Kada je skup generatora je dobro da imaju zajednički dovod dio. Iz tog razloga je najbolje imati jedan generator za unos mnogim dijelovima.

kompajler Arhitektura: komponente

To su glavne funkcionalne komponente kompajler koji generira izvorni kod (ako je izlaz je program u C ili virtualni stroj, potrebno je da nije toliko faze):

  • Program ulaz (oznake protoka) se ubacuje u skener (leksički analizator), što ga pretvara u potok žetona.
  • Analizator (parser) izgradnju jedne apstraktne sintakse stablo.
  • Semantički analizator razlaže semantičkih informacija i provjerava čvorovi za greške. Kao rezultat toga, izgrađen semantički grafikon - apstraktne sintakse stablo sa dodatnim svojstvima i uspostavljene veze.
  • generator međukod gradi grafikon toka (torke su grupirani u glavna bloka).
  • Mašina-nezavisni kod optimizator provodi i lokalne (u okviru baze) i globalne (za sve blokove) optimizacija u osnovi ostaje unutar rutine. Smanjuje suvišne kod i pojednostavljuje proračune. Rezultat je modifikovana grafikon toka.
  • Generator veže osnovnih blokova meta kod u pravolinijski kontrole prenosa kod, stvarajući objekt datoteku monter virtualne registara (eventualno neefikasna).
  • Mašina-zavisne optimizer, linker alocira memoriju između registara i čini timove za planiranje. Obavlja program za konverziju u asembleru na ovoj skupštini uz dobro iskoristiti protočnost.

Osim toga, upotreba detekcije grešaka podsistema menadžer i simbol stolova.

Leksička analiza (skeniranje)

Skener pretvara potoka izvor likove u potok tokena, uklanjanje razmak, komentare i širi makroa.

Skeneri često nailaze na probleme, kao što su da li ili ne uzeti u obzir slučaj, margine, linije pauze i ugrađeni komentare.

Greške koje se mogu javiti u toku skeniranja, pod nazivom leksičke i uključuju:

  • znakove koji nisu u abecedi;
  • višak broja znakova u riječi ili linija;
  • nije zatvorena znak ili literalni string;
  • kraj datoteke u komentaru.

Raščlanjivanje (parsiranje)

Analizator pretvara slijed tokena u apstraktnu sintaksu stabla. Svaki čvor u stablu se čuva kao objekt s nazivom polja, od kojih su mnogi i sami čvorovi. U ovoj fazi nema ciklusa. Kada kreirate parser potrebno je obratiti pozornost na stupanj složenosti gramatike (LL ili LR) i saznati da li postoje neka pravila razvrstavanje. Neki jezici zahtijevaju semantička analiza.

Greške naći na ovoj fazi nazivaju sintaksa. Na primjer:

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

semantička analiza

Tokom semantička analiza za provjeru dopuštenosti pravila i saradnika dijelovima drvo parsiranja (dopuštajući referentna imena ubacivanje rada za vrstu implicitne konverzije, i tako dalje. D.) Za formiranje semantičkom grafikona.

Očigledno je skup prihvatljivosti pravila na različitim jezicima drugačije. Ako sastaviti jezika Java-poput, kompajlera naći

  • više deklaraciji varijable u okviru svog djelokruga;
  • referencu na varijablu prije proglašenja;
  • reference na ime neprijavljenog;
  • kršenje patentnih prava;
  • prekomjerne ili nedovoljne broj argumenata u metodu poziv;
  • tip neusklađenost.

generacija

Srednji generacija kod stvara protok graf se sastoji od n-torke, grupisanih u osnovne blokove.

kod generacija stvara pravi mašinski kod. U tradicionalnom kompajlera za RISC-mašine na prvi korak, kreirate monter sa beskonačnim brojem virtualnih registara. Za CISC-mašine vjerojatno neće dogoditi.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

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