nisfarm.ru

Překladatel je ... Typy překladatelů. Převést a přeložit program

Programy, stejně jako lidé, vyžadují, aby překladatel nebo překladatel přeložili z jednoho jazyka do druhého.

Základní pojmy

Program je jazykovou reprezentací výpočtů: i → P → P (i). Tlumočník je program, který je napojen na program P a některé vstupní data x. Vykonává P na x: I (P, x) = P (x). Skutečnost, že existuje pouze jeden překladatel schopný provádět všechny možné programy (které mohou být zastoupeny ve formálním systému) je velmi hluboký a významný objev Turingu.

Procesor je tlumočník programů v jazyce stroje. Obvykle je příliš nákladné psát tlumočníky pro jazyky vysoké úrovně, takže jsou překládány do formy, která je jednodušší interpretovat.

Některé typy překladatelů mají velmi podivné názvy:

  • Assembler překládá programy do assembleru do jazyka počítače.
  • Kompilátor převádí z jazyka na vyšší úrovni do jazyka nižší úrovně.

Vysílající - je program, který bere jako vstup programu v některých jazykových S a produkuje T programu takovým způsobem, že oba mají stejné sémantiku: P → X? Q. To znamená, forall-x. P (x) = Q (x).

překladatel je

Převedete-li celý program na něco, co je interpretováno, pak se toto nazývá kompilace před spuštěním nebo kompilací AOT. Kompilátory AOT mohou být použity postupně, poslední z nich je často assembler, například:

Zdrojový kód → Kompilátor (překladač) → Kód assembleru → Assembler (překladatel) → Kód stroje → CPU (tlumočník).

Online nebo dynamická kompilace nastane, pokud je část programu přeložena, když jsou provedeny jiné kompilované součásti. Překladatelé JIT si pamatují, co již udělali, aby znovu a znovu nezopakovali zdrojový kód. Mohou dokonce produkovat adaptivní kompilaci a recompilaci na základě chování prostředí programu runtime.

Mnoho jazyků umožňuje provádět kód během překladu a kompilovat nový kód za běhu.

Etapy překladu




Překlad se skládá ze stadií analýzy a syntézy:

Zdrojový kód → Analyzátor → Koncepční pohled → Generátor (syntetizátor) → Cílový kód.

To je způsobeno následujícími důvody:

  • Jakákoli jiná metoda není vhodná. Jednoduchý překlad jednoduše nefunguje.
  • Dobrý technické řešení: chcete-li psát překladatele pro M a N původních jazyků cílených stačí napsat jenom M + N jednoduchých programů (polukompilyatorov) spíše než M x N komplexu (celkem překladatelů).

typy překladatelů

Nicméně v praxi je koncepční reprezentace velmi zřídka dostatečně expresivní a silná, aby pokrývala všechny myslitelné zdroje a cílové jazyky. Přestože se někteří z nich mohou přiblížit.

Skutečné překladače procházejí mnoha etapami. Při vytváření vlastního kompilátoru nepotřebujete opakovat veškerou tvrdou práci, kterou lidé učinili při vytváření pohledu a generátorů. Můžete přeložit svůj jazyk přímo do jazyka jаvascript nebo C a používat ostatní existující jаvascriptové a kompilátory C, abys to udělal. Můžete také použít existující přechodové zobrazení a virtuálních strojů.

Záznam překladatele

Překladatel je program nebo technický nástroj, ve kterém jsou zapojeny tři jazyky: zdroj, cíl a základní. Mohou být zapsány ve tvaru T, umístěním zdroje nalevo, cíle vpravo a podstavce níže.

Existují tři typy kompilátorů:

  • Překladatel je překladač, pokud jeho zdrojový jazyk odpovídá základnímu jazyku.
  • Kompilátor, jehož cílový jazyk se rovná základnímu jazyku, se nazývá osoba s trvalým pobytem.
  • Překladatel je křížový překladač, pokud má jiný cíl a základní jazyk.

vysílání

Proč je to důležité?

Dokonce i kdybyste nikdy nevytvořili skutečný kompilátor, je dobré vědět o technologii jeho tvorby, protože pojmy použité pro toto jsou použity všude, například v:

  • formátování textů;
  • dotazovací jazyky do databází;
  • rozšířené počítačové architektury;
  • generalizované problémy s optimalizací;
  • grafické rozhraní;
  • skriptovací jazyky;
  • regulátory;
  • virtuální stroje;
  • strojní překlady.

Navíc, pokud chcete psát preprocesory, stavitele, nakladače, debuggery nebo profilry, musíte projít stejnými kroky jako při psaní kompilátoru.

Můžete se také naučit psát programy lépe, protože vytvoření překladače pro jazyk znamená lepší pochopení jeho jemností a nejednoznačností. Učení se o obecných zásadách překladu také umožňuje stát se dobrým jazykovým výtvarníkem. Je to tak důležité, jak výrazný je jazyk, pokud nemůže být účinně realizován?

Komplexní technologie

Technologie kompilátorů pokrývá mnoho různých oblastí počítačové vědy:

  • teorie formálního jazyka: gramatika, analýza, výpočetní schopnost;
  • počítačová architektura: sady instrukcí, RISC nebo CISC, potrubí, jádra, cykly hodin atd.;
  • koncepty programovacích jazyků, například provádění kontrolní sekvence, podmíněný spuštění, iterace, rekurze, funkční rozkladu, modularitu, synchronizace, meta-programování, rozsah, ve stálých podtypy, šablony, výstup typu, prototypy, anotace, průtoku, Monads, poštovních schránek, pokračovat , zástupné znaky, regulární výrazy, transakční paměť, dědičnost, polymorfismus, parametrické režimy atd.;
  • abstraktní jazyky a virtuální stroje;
  • algoritmy a datové struktury: Pravidelné výrazy, parsovací algoritmy, grafické algoritmy, dynamické programování, školení;
  • programovací jazyky: syntax, sémantika (statické a dynamické), podpora paradigmata (strukturální, OOP, funkční, logické, zásobník, paralelismus, meta-programování);
  • tvorba softwaru (kompilátory, zpravidla velké a složité): lokalizace, ukládání do mezipaměti, komponenty, rozhraní API, opakované použití, synchronizace.

konverze programu

Navrhování kompilátoru

Některé problémy, které vznikají při vývoji skutečného překladatele:

  • Problémy se zdrojovým jazykem. Je snadné jej sestavit? Existuje preprocesor? Jak se zpracovávají typy? Existují knihovny?
  • Seskupování kompilátoru projde: jedno- nebo vícestupňové?
  • Stupeň požadované optimalizace. Rychlý a nečistý překlad programu s malou nebo žádnou optimalizací může být normální. Nadměrná optimalizace zpomalí překladač, ale nejlepší kód za běhu může stát za to.
  • Požadovaná míra zjišťování chyb. Může se překladatel zastavit na první chybě? Kdy má přestat? Věřím kompilátoru, aby opravil chyby?
  • Dostupnost nástrojů. Pokud zdrojový jazyk není příliš malý, generátor skeneru a analyzátoru je povinný. Tam jsou také generátory generátorů kódu, ale nejsou tak běžné.
  • Typ cílového kódu pro generování. Měli byste si vybrat z čistého, rozšířeného nebo virtuálního stroje. Nebo stačí napsat vstup, který vytvoří oblíbené přehledu, jako je LLVM, RTL nebo JVM. Nebo překládejte ze zdroje na zdrojový kód v jazycích C nebo jаvascript.
  • Formát cílového kódu. Můžete si vybrat jazyk assembleru, přenosný strojový kód, strojový kód obrazu paměti.
  • Perenatselivanie. S mnoha generátory je dobré mít společnou vstupní část. Ze stejného důvodu je lepší mít jeden generátor pro mnoho vstupních částí.

dynamická kompilace

Kompilátorová architektura: Komponenty

Jedná se o hlavní funkční komponenty kompilátoru, který generuje strojový kód (pokud je výstupním programem program C nebo virtuální stroj, pak se nevyžaduje mnoho kroků):

  • Vstupní program (proud signálů) vstupuje do skeneru (lexikální analyzátor), který jej převádí do toku tokenů.
  • Analyzátor (syntaktický analyzátor) z nich vytváří abstraktní syntaktický strom.
  • Sémantický analyzátor rozkládá sémantické informace a kontroluje uzly stromu kvůli chybám. Výsledkem je sémantický graf - strom abstraktní syntaxe s dalšími vlastnostmi a nainstalovanými odkazy.
  • Generátor mezilehlého kódu vytváří graf proudění (nopky jsou seskupeny do hlavních bloků).
  • Optimalizátor kódů nezávislý na stroji provádí optimalizaci lokálních (v rámci základního bloku) a globální (pro všechny bloky), která v podstatě zůstává v rámci podprogramů. Snižuje redundantní kód a zjednodušuje výpočty. Výsledkem je upravený graf toku.
  • Generátor cílových kódů spojuje základní bloky s přímým kódem s přenosem řídicího systému a vytváří soubor objektů v assembleru s virtuálními registry (možná neúčinnými).
  • Optimalizátor odkazovačů nezávislý na stroji přiděluje paměť mezi registry a rozvrhovacími příkazy. Převede program do assembleru na reálného assembleru s dobrým použitím pipeline.

Navíc se používají subsystémy detekce chyb a správce tabulky symbolů.

objektový soubor

Lexikální analýza (skenování)

Skener převádí proud znaků zdrojového kódu do tokenů, odstraňuje mezery, komentuje a rozšiřuje makra.

Skenery se často setkávají s takovými problémy, jako je přijetí nebo neber v úvahu rejstřík, odrážky, řádkové zdroje a vnořené komentáře.

Chyby, které se mohou vyskytnout během skenování, se nazývají lexikální a zahrnují:

  • znaky, které nejsou v abecedě;
  • překročení počtu znaků ve slově nebo řetězci;
  • ne uzavřený znak nebo řetězec literál;
  • konec souboru v komentáři.

Analýza syntaxe (parsování)

Analyzátor konvertuje posloupnost žetonů do stromu abstraktní syntaxe. Každý stromový uzel je uložen jako objekt s pojmenovanými poli, z nichž mnohé jsou uzly stromu. V této fázi nejsou žádné cykly. Při vytváření analyzátoru byste měli věnovat pozornost úrovni složitosti gramatiky (LL nebo LR) a zjistit, zda existují nějaká pravidla pro odstranění nejednoznačnosti. Některé jazyky vyžadují sémantickou analýzu.

Chyby zjištěné v této fázi se nazývají chyby syntaxe. Například:

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

Sémantická analýza

Během sémantická analýza je třeba zkontrolovat pravidla přípustnosti a vázat části stromu syntaxe (umožňující odkazy na názvy, vkládání operací pro implicitní casting typů apod.) a vytvořit sémantický graf.

Je zřejmé, že soubor pravidel o přípustnosti pro různé jazyky je jiný. Jsou-li kompilovány jazyky podobné jazykům Java, překladatelé najdou:

  • více prohlášení o proměnné v jeho rozsahu;
  • odkaz na proměnnou před jejím vyhlášením;
  • odkazy na nenahlášené jméno;
  • porušování pravidel přístupnosti;
  • příliš velký nebo nedostatečný počet argumentů při volání metody;
  • Neshoda typu.

vstupní program

Generování

Generování mezilehlého kódu vytváří graf toku složený z n-tic skupin seskupených do základních bloků.

Generování kódu vytváří skutečný kód stroje. V tradičních překladače pro RISC strojů na prvním kroku vytvoříte assembler s nekonečným počtem virtuálních registrů. U strojů CISC se to pravděpodobně nestane.

Sdílet na sociálních sítích:

Podobné
© 2021 nisfarm.ru