TRAŽI

Prevoditelj je ... Vrste prevoditelja. Pretvori i prevodi program

Programi, poput ljudi, zahtijevaju da prevoditelj ili prevoditelj prevede s jednog jezika na drugi.

Osnovni pojmovi

Program je lingvističkiprikazivanje izračuna: i → P → P (i). Tumač je program koji se unosi u program P i neke ulazne podatke x. Izvodi P na x: I (P, x) = P (x). Činjenica da postoji samo jedan prevoditelj sposoban za obavljanje svih mogućih programa (koji mogu biti zastupljeni u formalnom sustavu) vrlo je duboko i značajno otkriće Turinga.

Procesor je programski tumačjezik stroja. Obično je preskupo napisati tumače za jezike na visokoj razini, pa su prevedeni u oblik koji je lakše tumačiti.

Neke vrste prevoditelja imaju vrlo čudna imena:

  • Assembler prevodi programe u montažeru na strojni jezik.
  • Kompilator prevodi od jezika visoke razine do jezika nižeg nivoa.

Prevoditelj je program koji prihvaćaKao input program na nekom jeziku S i daje program u jeziku T tako da oba imaju istu semantiku: P → X → Q. To je, ∀x. P (x) = Q (x).

prevoditelj je

Ako cijeli program emitiraš u neštotumači se, to se naziva kompilacija prije izvršenja, ili AOT-kompilacija. AOT-kompilatori se mogu koristiti sekvencijalno, od kojih je posljednja često sastavljač, na primjer:

Izvorni kod → Compiler (prevodilac) → Assembler code → Assembler (prevoditelj) → Šifra stroja → CPU (interpreter).

Operativna ili dinamička kompilacijapojavljuje se ako se dio programa prevodi kada se izvršavaju drugi sastavljeni dijelovi. JIT-prevoditelji se sjećaju onoga što su već učinili, kako ne bi ponavljali izvorni kod opet i ponovo. Oni čak mogu proizvesti prilagodljivu kompilaciju i rekompiliranje, na temelju ponašanja okruženja programa runtime.

Mnogi jezici omogućuju izvršavanje koda tijekom prijevoda i sastavljanje novog koda tijekom izvođenja programa.

Faze emitiranja

Prijevod se sastoji od faza analize i sinteze:

Izvorni kod → Analizator → Konceptualna prikaza → Generator (sintesajzer) → Ciljni kod.

To je zbog sljedećih razloga:

  • Na bilo koji drugi način nije prikladan. Doslovni prijevod jednostavno ne funkcionira.
  • Dobra inženjerska rješenja: ako trebate pisati prevoditelje za M izvornog jezika i N ciljnih jezika, trebate samo pisati M + N jednostavne programe (polu-sastavljače), a ne M × N kompleksne programe (potpune prevoditelje).

vrste prevoditelja

Međutim, u praksi, konceptualnireprezentacija je vrlo rijetko ekspresivna i dovoljno snažna da obuhvati sve zamislive izvore i ciljne jezike. Iako su se neki mogli približiti tome.

Stvarni prevoditelji prolaze kroz mnogefaze. Prilikom izrade vlastitog prevodioca ne morate ponoviti sav trud koji su ljudi već učinili prilikom izrade pregleda i generatora. Jezik možete emitirati izravno u JavaScript ili C i upotrebljavati postojeće JavaScript motore i kompajlere C za ostalo. Također možete koristiti postojeće međuprostore i virtualne strojeve.

Snimanje prevoditelja

Prevoditelj je program ili tehničkiznači u kojem su uključena tri jezika: izvor, cilj i osnovni. Može ih se napisati u T-obliku, stavljajući izvor na lijevu stranu, cilj s desne strane i donju bazu.

Postoje tri vrste sastavljača:

  • Prevoditelj je samokompleter ako njegov izvorni jezik odgovara osnovnom jeziku.
  • Kompilator čiji je ciljni jezik jednak osnovnoj razini zove se samozapošljavanje.
  • Prevoditelj je unakrsni prevodilac ako su ciljani i osnovni jezici različiti.

emitiranje programa

Zašto je to važno?

Čak i ako nikada niste pravi prevodilac, dobro je znati o tehnologiji njegova stvaranja, jer se pojmovi koji se koriste za tu svrhu univerzalno primjenjuju, na primjer, u:

  • oblikovanje teksta;
  • jezici upita baze podataka;
  • proširene arhitekture računala;
  • generalizirani problemi optimizacije;
  • grafička sučelja;
  • skriptni jezici;
  • kontroleri;
  • virtualni strojevi;
  • strojni prijevodi.

Osim toga, ako trebate napisati predprocesore, montažere, utovarivače, ispravljače ili profilere, morate proći kroz iste korake kao kod pisanja prevoditelja.

Također možete naučiti kako napisati bolje programe.budući da stvaranje prevoditelja za jezik znači bolje razumijevanje svojih suptilnosti i dvosmislenosti. Proučavanje općih načela prevođenja također vam omogućuje da postanete dobar dizajnerski jezik. Je li važno koliko je cool jezik ako se ne može učinkovito provesti?

Sveobuhvatna tehnologija

Tehnologija prevodioca obuhvaća mnoga različita područja računalne znanosti:

  • formalna jezična teorija: gramatika, raščlanjivanje, računanje;
  • računalna arhitektura: instrukcijski setovi, RISC ili CISC, cjevovod, jezgre, satni ciklusi itd.;
  • programski jezični pojmovi: na primjer, kontrola izvršavanja sekvenci, uvjetno izvršavanje, iteracija, rekurzija, funkcionalna razgradnja, modularnost, sinkronizacija, metaprogramiranje, opseg, konstante, podtipovi, uzorci, izlazni tipovi, prototipovi, regularni izrazi, transakcijska memorija, nasljedstvo, polimorfizam, modovi parametara i tako dalje;
  • apstraktni jezici i virtualni strojevi;
  • algoritmi i strukture podataka: regularni izrazi, analitički algoritmi, grafički algoritmi, dinamičko programiranje, trening;
  • programski jezici: sintaksa, semantika (statička i dinamička), podrška paradigmama (strukturna, OOP, funkcionalna, logička, stog, paralelizam, metaprogramiranje);
  • stvaranje softvera (sastavljači, u pravilu, veliki i složeni): lokalizacija, predmemoriranje, specifikacija komponenata, API sučelja, ponovno korištenje, sinkronizacija.

program pretvorbe

Projektiranje prevodilaca

Neki problemi koji nastaju pri razvoju pravog prevoditelja:

  • Izvorni jezični problemi. Je li lako sastaviti? Postoji li preprocesor? Kako se vrste obrađuju? Postoje li knjižnice dostupne?
  • Grupiranje prevodilaca prolazi: single ili multi-pass?
  • Željeni stupanj optimizacije. Brzo i nečisto emitiranje programa s malo ili nimalo optimizacije može biti normalno. Pretjerana optimizacija usporit će prevodilac, ali najbolji kôd pri izvođenju vremena može biti isplativ.
  • Potrebna stopa otkrivanja pogrešaka. Može li se prevoditelj zaustaviti na prvoj pogrešci? Kada bi trebao zaustaviti? Da li prevodilac povjerava ispravljanje pogrešaka?
  • Dostupnost alata. Ako izvorni jezik nije vrlo mali, potreban je skener i generator analizatora. Postoje i generatori generatora kodova, ali nisu tako česti.
  • Vrsta ciljnog koda za generiranje. Trebao bi biti odabran iz čistog, povećanog ili virtualnog stroja. Ili jednostavno napišite unos koji stvara popularne prikaze medija, kao što su LLVM, RTL ili JVM. Ili napraviti prijevod s izvornog koda u C ili JavaScript.
  • Oblik ciljnog koda. Možete odabrati jezik montaže, prijenosni strojni kôd, memoriju slici za strojni kod.
  • Preusmjeravanja. Kod mnogih generatora, dobro je imati zajednički ulaz. Iz istog razloga, bolje je imati jedan generator za mnoge ulazne dijelove.

dinamička kompilacija

Arhitektura prevoditelja: komponente

To su glavne funkcionalne komponente prevoditelja koji generira strojni kod (ako je izlazni program C program ili virtualni stroj, tada nisu potrebni mnogi koraci):

  • Ulazni program (tok znakova) ulazi u skener (leksički analizator), koji ga pretvara u tok tokena.
  • Parser (parser) gradi abstrakti sintaktički stablo od njih.
  • Semantički analizator raspadasemantičke informacije i provjerava čvorove stabla za pogreške. Kao rezultat toga, izrađen je semantički grafikon - apstraktno sintaktičko stablo s dodatnim svojstvima i uspostavljenim vezama.
  • Generator srednjeg koda stvara grafički dijagram (tuple su grupirane u glavne blokove).
  • Alat za optimizaciju koda neovisan o stroju provodi obojelokalno (unutar osnovne jedinice) i globalno (za sve blokove) optimizacije, uglavnom preostale unutar podprogramima. Smanjuje redundancijski kod i pojednostavljuje izračune. Rezultat je izmijenjeni grafički dijagram toka.
  • Generator ciljnog koda povezuje osnovne blokove u pravocrtnom kodu s prijenosom kontrole, stvarajući objektnu datoteku u asembleru s virtualnim registrima (eventualno neučinkovit).
  • Alat za optimizaciju poveznika strojaalocira memoriju između registara i izvršava raspoređivanje naredbi. Izvršava pretvorbu sklopnog programa u pravi sastavljač s dobrom upotrebom cjevovoda.

Osim toga, koriste se podsustavi za otkrivanje pogrešaka i upravitelj tablice simbola.

datoteka objekta

Leksička analiza (skeniranje)

Skener pretvara stream znakova izvornog koda u tok tokena, uklanja razmake, komentare i proširuje makronaredbe.

Skeneri se često susreću s problemima kao što su prihvatiti ili ne uzeti u obzir slučaj, uvlake, retka i ugniježđene komentare.

Pogreške koje se mogu pojaviti tijekom skeniranja nazivaju se leksičkim i uključuju:

  • znakovi koji nedostaju u abecedi;
  • višak broja znakova u jednoj riječi ili retku;
  • a ne zatvoreni znak ili niz znakova;
  • kraj datoteke u komentarima.

Analize (raščlanjivanja)

Parser pretvara niz tokena usažetak sintaksa. Svaki čvor u stablu se pohranjuju kao objekt s nazivom polja, od kojih su mnogi i sami su stabla čvorovi. U ovoj fazi nema ciklusa. Prilikom izrade parser je potrebno obratiti pozornost na razinu složenosti gramatike (LL ili LR) i saznati postoje li pravila razdvojbena. Neki jezici zahtijevaju semantičku analizu.

Pogreške s kojima se susreću u ovoj fazi nazivaju se sintaktički. Na primjer:

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

Semantička analiza

Tijekom semantičke analizepotrebno je provjeriti pravila dopuštenosti i povezati dijelove sintaktičkog stabla (dopuštajući reference o imenu, umetanjem operacija za implicitne pretvorbe tipova itd.) kako bi se stvorio semantički grafikon.

Očito, skup pravila o dopuštenosti za različite jezike različit je. Ako se jezici slični Java sastavljaju, prevoditelji mogu pronaći:

  • višestruke varijabilne izjave u okviru svog djelokruga;
  • reference na varijablu prije njezine izjave;
  • veze na neprijavljeni naziv;
  • kršenje pristupačnosti;
  • prevelik ili nedovoljan broj argumenata pri nazivanju metode;
  • tip neusklađenosti.

ulazni program

generacija

Generiranje međumrežne oznake stvara grafikon strujanja sastavljen od tuplica grupiranih u osnovne blokove.

Generiranje koda stvara pravi strojni kod. U tradicionalnim kompajlatorima za RISC strojeve u prvoj fazi stvara se asembler s beskonačnim brojem virtualnih registara. Za CISC strojeve, vjerojatno se to neće dogoditi.

  • Ocjenjivanje: