Základní pojmy
Principem kompilace je věda a technologie překladu programovacích jazyků na vysoké úrovni. Všichni víme, že počítačové programy jsou psány v programovacích jazycích. V počátcích se počítačové programovací jazyky vyvíjely relativně pomalu, protože data uložená počítačem a program prováděný počítačem se skládají z kódů 0 a 1, takže v počátcích, kdy programátoři píší počítačové programy, musí znát základní instrukční kód počítače dobře kombinováním a uspořádáním těchto instrukcí mikroprogramu k dokončení Program se specifickou funkcí klade na programátora velmi vysoké nároky. Lidé studovali, jak efektivně vyvíjet počítačové programy, aby snížili práh programování.
Kompilátor
Překladač jazyka C je druh moderního zařízení, které potřebuje pomoc počítačového kompilátoru. Návrh kompilátoru jazyka C je poměrně profesionální práce. Návrháři musí vzít v úvahu těžkopádný proces navrhování počítačových programů a také potřeby uživatelů počítačů. Typů počítačů neustále přibývá, proto při návrhu kompilátoru jazyka C musíme zvýšit jeho použitelnost. Jazyk C má silný výpočetní výkon, je to strukturovaný jazyk a používá se spíše při údržbě počítačových systémů. Jazyk C má výhodu ve vysoké efektivitě a používá se spíše na různých typech počítačů.
Návrh front-endu kompilátoru jazyka C
Proces kompilace je obecně implementován v počítačovém systému, což je proces převodu zdrojového kódu do obecného jazyka počítače. Kompilátor obsahuje adresu, název a strojový kód vstupního bodu. Kompilátor je nástroj, který je široce používán v počítačových programech. Při navrhování front-endu kompilátoru musí být plně zohledněny ovlivňující faktory, stejně jako lexikální, gramatická a sémantická analýza.
1 Lexikální analýza
Lexikální analýza je základní fází návrhu front-endu kompilátoru. V této fázi překladač označí zdrojový program podle nastavených gramatických pravidel. V procesu označování každá značka představuje typ slova. V procesu značení se jedná především o identifikátory, klíčová slova, speciální symboly a další typy. Kompilátor obsahuje lexikální analyzátor, vstupní zdrojový program a rozpoznávání výstupu. Marker, použijte tyto funkce k převodu velikosti písma na známá slova.
2 Analýza syntaxe
Analýza syntaxe se týká použití nastavených gramatických pravidel k identifikaci struktury v tokenu, která zahrnuje věty, fráze atd., v procesu identifikace. Lze vytvořit speciální strom syntaxe struktury. Syntaktická analýza má důležitý vliv na funkci překladače. Během procesu návrhu musí být zaručena přesnost loga.
3 Sémantická analýza
Sémantická analýza také vyžaduje použití gramatických pravidel. Při kontrole statické sémantiky gramatických jednotek je nutné zajistit správnost gramatických pravidel. Při transformaci lexikální nebo gramatické musíme zajistit legitimitu nastavení gramatické struktury. Při kontrole gramatiky a morfologie, pokud je gramatická struktura nastavena nepřiměřeně, nastane problém s chybou překladu. Front-end design vyžaduje lepší přesnost a návrháři mohou provádět korektury, které ovlivní přesnost kompilace. Pokud jsou v návrhu front-endu chyby, ovlivní to účinek kompilace jazyka C.
Celkový návrh kompilátoru jazyka C
Překladač jazyka C je pokročilé zařízení, které dokáže převést zdlouhavé a složité programy do strojového jazyka a má za úkol zjednodušit složitý proces dělení kompilátoru jazyka C, je nutné porozumět principům skládání gramatiky, konstruktér potřebuje flexibilně uchopit znalosti jazykové gramatiky a také aplikovat metodu konverze kódu jazyka C. Když se provádí celkový návrh kompilátoru jazyka C, je nutné začít od Start s následujícími aspekty.
1 Lexikální analýza
Programy v jazyce C mají určitou složitost. Gramatická analýza je primární fází kompilace. Tento proces je hlavně pro skenování lexikální, takže fáze lexikální analýzy, kompilace Skener se také používá jako skener. Jeho hlavním úkolem je propojit znaky ve zdrojovém programu a rozpoznat slova v něm a převést slovní zásobu, převést ji na interní kód a analyzovat její gramatiku pomocí značky. V procesu kompilace jsou slovní symboly obecně převedeny do binární formy. Kategorie slov zahrnují především binární, oddělovací, slovo atd. Když počítač pracuje normálně, skener automaticky dokončí práci lexikálního skenování a tento proces také automaticky odstraní komentáře, automaticky rozpozná slova ve zdrojovém programu a převede je na interní kódy. Z hlediska pracovních metod patří proces kompilace a gramatika ke dvěma metodám rozhraní. Z funkčního hlediska spočívá proces lexikální analýzy kompilátoru hlavně v převedení odpovídajícího programu se zdrojovým kódem do podoby slovního řetězce.
2 Sémantická analýza
Po převedení zkompilovaného programu na interní reprezentaci nazýváme tuto interní reprezentaci zprostředkujícím jazykem nebo mezikódem, což má jasný význam. Struktura je jednoduchá a patří do systému značení. Například některé kompilátory v zásadě nemají žádný mezikód, ale pro zajištění nezávislého provozu stroje v praktických aplikacích a pro usnadnění optimalizace cílového kódu je v mnoha kompilátorech nastaven mezijazyk. Tento mezijazyk je mezi strojovým jazykem a zdrojovým programovacím jazykem a program je poměrně složitý, ale překladač jazyka C do značné míry změnil výše uvedený stav. Jeho sémantická analýza a syntaktická analýza jsou relativně vyspělé a teorie a algoritmus jsou relativně úplné. Problém je v tom, že neexistuje žádný uznávaný formální systém a přechodný kód se stále blíží formální metodě.
3 Analýza syntaxe
Analýza syntaxe je založena hlavně na zdrojovém programu ve formě řetězců slov jako analytických a vstupních objektů. Jejím nejzásadnějším cílem a úkolem je použití gramatických pravidel návrhového jazyka jako Standardů, konkrétní rozbor gramatické struktury zdrojového programu, podle gramatických pravidel designového jazyka, rozbor gramatických složek těchto zdrojových programů, analýza gramatických prvků návrhového jazyka, analýza gramatických prvků a programování. jako jsou funkce, proměnné dolního indexu, různé programové příkazy, různé výrazy atd. A aby prošla správnost kontroly gramatiky, je mezikód zpracováván po etapách. Jedna věc, kterou je třeba poznamenat, je, že proces redukce se provádí podle potřeb a musí existovat odpovídající gramatické chyby. Poté můžete odstranit všechny vstupní symboly, změnit výše uvedený vzor, provést analýzu posunu a zmenšení a na tomto základě pokračovat Hledejte odpovídající strategii pro vytvoření efektivní metody gramatické analýzy.
Kurz principů kompilace
Jako důležitý odborný kurz pro obory počítačů je „Základy kompilace“ základem pro hloubkové studium znalostí z oboru v budoucnosti. Jako profesionální kurz informatiky a techniky tento kurz kombinuje znalosti z více oborů, jako je diskrétní matematika, struktura dat, operační systém a principy počítačové kompozice. Jedná se o komplexní a teoretický kurz. Vzhledem k obsahu principu sestavování S výše uvedenými charakteristikami se v experimentální výuce stále vyskytují určité problémy. Pokud chcete navrhnout a vyrobit kompletní kompilátor v experimentální části principu kompilace, doba experimentu je dlouhá, je zde zapojeno mnoho modulů a spojení mezi moduly je složitější a není snadné vidět celkový účinku okamžitě.
Kurz Problémy ve výuce tradičních principů kompilace
Prvním jazykovým kurzem pro vysokoškoláky se zaměřením na informatiku je jazyk C. Jazyk C je náchylný k některým nepolapitelným chybám kvůli jeho typové nejistotě, což studentům ztěžuje lokalizaci a řešení problémů. Pokud studenti dokážou přesně lokalizovat typ a umístění chyb v programu podle rychlých informací poskytnutých kompilátorem, a aplikovat to, co se naučili v principech kompilace, na skutečné potřeby programování v jazyce C, nejenže to dokončí výuku. Obsah kurzu, ale také zlepšit schopnosti studentů programování softwaru a systémové analýzy.
Počínaje skutečnou výukou principů kompilace na běžných vysokých školách a univerzitách je rozsah pokrytí osnov obecně omezen na přední část kompilátoru, tj. lexikální analýzu, gramatickou analýzu a gramatický překlad. To zahrnuje velké množství abstraktních a logicky složitých teoretických znalostí, jako je teorie formálního jazyka, formální formy, konečné automaty, bezkontextová gramatika, gramatika atributů a překlad řízený gramatikou. Tradiční vyučovací metoda klade důraz na vštěpování znalostních bodů, což umožňuje studentům vyřešit jediný izolovaný problém, postrádající spojení mezi znalostními body. Tato výuková metoda „vidět pouze stromy, nikoli les“ velmi oslabí nadšení žáků pro učení, což vede k celkově špatným výsledkům.
Prakticky orientovaná výuka principů sestavování vzájemné pomoci
(1) Propojení teorie a praxe
Zdroj teoretických znalostí má obecně určité problémy Pozadí. Není užitečné zlepšit praktickou schopnost studentů vést teoretickou výuku izolovaně od praktických problémů. Velké množství teoretických znalostí v kurzu Principy překladače má soudržný a progresivní vztah. Úvod a rozšíření každého znalostního bodu je reprodukcí cesty řešení problémů, se kterými se ve skutečnosti setkáváme. Proto celý proces výuky reprodukuje vývoj tohoto řešení. Klíčem k dosažení tohoto cíle je, že se nyní učitel změnil ze „stání před pódiem“ na „sezení mezi studenty“. Tato změna není jen pouhé ponechání všech otázek na studentech, od „výuky“ po „odpovídání na otázky“, ale také zvýšení požadavků na učitele ze všech aspektů navrhování problémů, myšlení a osvěty, diskuse a vedení k řízení procesů. Zejména vývoj moderních jazyků na vysoké úrovni se každým dnem mění a v nekonečném proudu se objevují různé nové otázky. Když čelíme otevřeným a neznámým problémům, jak dát studentům způsob, jak problém vyřešit ze systematického a celkového pohledu, namísto konkrétních odpovědí na každou otázku, je to nový test schopností učitelů.
(2) Návrh a plán implementace kompilátoru
V ideální situaci výuky principů kompilace by studenti měli být schopni samostatně dokončit konstrukci malého kompilačního systému. Ve skutečné výuce musí studenti pouze porozumět klíčovým principům znalostí, jako je determinace NFA, konstrukce FIRST a FOLLOW množin v gramatice LL (1) a identifikace struktury živé předpony DFA v gramatice LR (1). . Splňte požadavky zkoušky kurzu. Samotné teoretické učení však k implementaci základního kompilátoru zdaleka nestačí. Ve srovnání s akceptováním teoretických znalostí studenty je ještě zřetelnější nedostatečná schopnost studentů dokončit kompilační systém z vlastní iniciativy. Jak čelit všem studentům a vypracovat sadu použitelných praktických programů je klíčem ke skutečné efektivitě kurzu.
Vývoj technologie kompilace
V počátcích von Neumannova počítače (40. léta 20. století) byly programy psány ve strojovém jazyce a strojový jazyk byl ve skutečnosti uložen 01 kód, psaný Postup je velmi nudný. Později jazyk symbolických instrukcí nahradil strojový jazyk symbolickou formou provozních pokynů a kódování adres. Jazyk symbolických instrukcí má však stále mnoho nedostatků. Je těžké to přečíst a pochopit a musí to záviset na konkrétním stroji. Pokud chcete, aby napsaný program běžel na jiném počítači, musíte jej přepsat. V 50. letech vedl John Backus z IBM výzkumný tým, který vyvinul jazyk FORTRAN na vysoké úrovni a jeho kompilátor. Nástroje pro automatické generování pro kompilátory se začínají formovat a nyní je široce používáno mnoho nástrojů pro automatické generování, jako je nástroj pro analýzu syntaxe LEX, program pro analýzu jazyků YACC a tak dále. V 60. letech 20. století lidé nadále používali technologii samokompilace ke konstrukci kompilátorů, to znamená, že k implementaci kompilátoru jazyka byl použit samotný kompilovaný jazyk, ale jeho základní principy a struktura byly zhruba stejné. Po neustálém vývoji se moderní technologie kompilace stala vyspělejší a rychlý vývoj mnoha jazyků na vysoké úrovni je neoddělitelný od pokroku technologie kompilace.
Základní proces kompilace
Kompilaci lze rozdělit do pěti základních kroků: lexikální analýza, syntaktická analýza, sémantická analýza a střední generování kódu, optimalizace a generování cílového kódu. Toto jsou základní kroky a procesy, které musí každý kompilátor vkládat zdrojové programy jazyka na vysoké úrovni z kódů zdrojového a výstupního cílového jazyka.
1 Lexikální analýza
Lexikální analyzátor prohledává řetězec tvořící zdrojový program zleva doprava pomocí programu lexikální analýzy, čte znak po znaku a rozpoznává každý slovní symbol typ symbolu a hodnotu symbolu. Lexikální analyzátory obecně existují ve formě funkcí, které může analyzátor volat. Samozřejmě může existovat i nezávislý program lexikálního analyzátoru. Program, který dokončuje úlohu lexikální analýzy, se nazývá program lexikální analýzy nebo lexikální analyzátor nebo skener.
2 Analýza syntaxe
Syntaktická analýza je druhou fází procesu kompilace. Úkolem této fáze je zkombinovat rozpoznanou posloupnost slovních symbolů do různých gramatických frází na základě lexikální analýzy, jako je „věta“, „výraz“ atd. Hlavním krokem programu gramatické analýzy je zjistit, zda věta zdrojového programu odpovídá definici Gramatická pravidla gramatiky jsou v gramatické struktuře správná. A gramatické pravidlo se také nazývá gramatika. Chomsky rozděluje gramatiku na gramatiku typu 0, typu 1, typu 2 a typu 3 na základě různých omezení. Gramatika typu 0 se také nazývá frázová gramatika a typ 1 se nazývá kontextová gramatika. , typ 2 se nazývá bezkontextová gramatika a gramatika typu 3 se nazývá běžná gramatika a omezující podmínky se postupně zvyšují.
3 Sémantická analýza
Lexikální analýza se zaměřuje na to, zda je každé slovo legální a do které části jazyka slovo patří. Bezkontextová gramatika gramatické analýzy se zaměřuje na to, zda vstupní věta může odpovídat produkci podle gramatiky. Potom sémantická analýza má pochopit, zda je vztah mezi každou gramatickou jednotkou legální. Ve skutečné aplikaci je to provádět kontextově citlivé přezkoumání povahy a přezkoumání typu zdrojových programů, které jsou strukturálně správné.
4 Průběžné generování a optimalizace kódu
Po fázích syntaktické a sémantické analýzy některé kompilátory přemění zdrojový program na interní reprezentaci. Vnitřní reprezentace se nazývá zprostředkující jazyk nebo zprostředkující reprezentace nebo zprostředkující kód. Takzvaný „mezikód“ je systém symbolů s jednoduchou strukturou a jasným významem. Složitost tohoto symbolového systému leží mezi zdrojovým programovacím jazykem a strojovým jazykem a je snadné jej převést do objektového kódu. Kromě toho lze optimalizaci nezávislou na stroji provádět také na úrovni mezilehlého kódu.
5 Generování cílového kódu
Podle optimalizovaného přechodného kódu lze vygenerovat efektivní cílový kód. Kompilátor jej obvykle přeloží do kódu sestavení a v tuto chvíli musí assembler sestavit kód sestavení do strojového jazyka cílového stroje.
6 Zpracování chyb
V každé fázi kompilace mohou být nalezeny chyby ve zdrojovém kódu, zejména během fáze syntaktické analýzy může být nalezeno velké množství chyb, takže kompilátor musí provést ošetření chyb. Hlásit informace, jako je typ chyby a umístění chyby.
Přehled procesu kompilace
Probíhající struktura v paměti, když je spuštěn zdrojový program v jazyce C a odpovídající spustitelný program, nejdůležitějším procesem pro realizaci této konverze je kompilace.
Zdrojový program je pro lidi k vidění. Je to v podstatě textový soubor. Lze jej otevřít a zapsat pomocí programu pro úpravu textu, jako je vi v Linuxu nebo Poznámkový blok ve Windows, ale počítač nemůže přímo spustit zdrojový program. , Zdrojový program je nutné zkompilovat do počítačem spustitelného programu prostřednictvím speciálního programu a tento speciální program je překladačem. Proces kompilace se dělí hlavně na lexikální analýzu, analýzu syntaxe, střední generování kódu a generování cílového kódu (ignorování předzpracování, sémantické analýzy, optimalizace atd.). Níže stručně vysvětlíme hlavní proces kompilace postupně.
Lexikální analýza
Zdrojový kód viděný v lidských očích je tento:
int fun(int a,int b); int m=10 ;Int main(){int int i=4;int j=5;m=fun(i,j);return 0;int a,int buchta(int a,int c=0;c =a+b;return c;_}
A jeho uložená podoba v počítači je znázorněna na obrázku 1-36.

Obrázek 1-36 Hexadecimální forma případového programu
Neexistují žádná klíčová slova, operátory, identifikátory ani to, které znaky patří ke stejnému symbolu. První fází kompilace je lexikální analýza, jejímž účelem je identifikovat symboly jeden po druhém v po sobě jdoucích znacích a co nejvíce identifikovat atributy symbolů.
Když se lidé podívají na zdrojový program jazyka C, mohou pomocí mezer a závorek na první pohled vidět identifikátory a klíčová slova. Ve srovnání s lidmi je inteligence počítačů v dnešní době stále poměrně nízká. Neumí číst více znaků současně jako lidé. Dokáže rozpoznat znaky pouze jeden po druhém na základě velmi mechanické "elektronické verze" tvarosloví. Morfologie "elektronické verze" je ztělesněna integrací myšlenek stavového přechodového diagramu do kódu lexikálního analyzátoru. Lexikální analyzátor rozpozná tokeny z řetězce zdrojového programu a uloží je v pořadí.
Výsledek lexikální analýzy je znázorněn na obrázku 1-37.

Obrázek 1-37 Výsledky lexikální analýzy
Ve fázi lexikální analýzy lze rozpoznat význam některých symbolů, včetně klíčových slov, čísel a znaků Řetězec, oddělovač, význam těchto symbolů lze určit bez pomoci jiných symbolů. Například „int“ musí představovat celočíselný typ. Nemůže to být název proměnné nebo operátor.
Ostatní symboly musí před a po předat další symboly, aby bylo možné určit přesný význam. Například "m" může být posuzováno jako identifikátor pouze v lexikální fázi, ale pokud věta není analyzována, není možné zjistit, zda identifikátor představuje proměnnou nebo funkci. Podrobnější informace lze získat pouze rozborem větného vzoru, ve kterém se symbol nachází. Tato část práce je provedena gramatickou analýzou.
Analýza syntaxe
Pokud je funkcí lexikální analýzy identifikovat identifikátory, klíčová slova, čísla a operátory z po sobě jdoucích znaků a uložit je jako proud tokenů, gramatika Funkcí analýzy je identifikovat věty které odpovídají gramatice jazyka C z toku symbolů identifikovaného lexikální analýzou.
Protože se počítač nemůže dívat na více identifikátorů, klíčových slov, čísel a operátorů současně jako člověk, nemůže na první pohled vidět, že se jedná o deklaraci funkce, je to příkaz if a může být pouze velmi neobratně identifikovat jeden symbol po symbolu. Podobně jako lexikální analyzátor je i gramatický analyzátor založen na gramatice reprezentované počítačem, který rozpoznává věty odpovídající gramatice jazyka C jeden symbol po symbolu. Počítačová reprezentace gramatiky je výroba. V syntaktickém analyzátoru je gramatika jazyka C generovaná produkcí mapována do sady šablon a tato sada šablon je integrována do programu syntaktického analyzátoru. Funkcí analyzátoru gramatiky je porovnat tokeny rozpoznané lexikálním analyzátorem s touto sadou šablon jeden po druhém. Pokud se určitá gramatika v této sadě šablon shoduje, lze identifikovat a určit celou větu. Syntaxe věty.
Vezmeme deklaraci funkce "int fun(int a, int b);" v případě jako příklad k popisu tohoto procesu. Scénář shody se šablonou výpisu je znázorněn na obrázku 1-38.

Obrázek 1-38 Výsledek porovnání příkazu deklarace fun funkce se šablonou
Tento proud tokenů se nakonec shoduje se šablonou deklarace funkce a shoda je úspěšná Později počítač považuje tento příkaz za příkaz deklarace funkce a zaznamená jej do paměti ve formě stromu syntaxe, jak je znázorněno na obrázku 1-39 .

Obrázek 1-39 Syntaktický strom generovaný příkazem deklarace fun funkce
Je velmi důmyslné a prozíravé zaznamenat analyzovaný výrok do stromové struktury , Volba celkové úvahy. Na jedné straně si stromová struktura může „pamatovat“ veškerý „význam“ zdrojového programu. Na druhou stranu stromová struktura snáze odpovídá struktuře runtime.
Od stromu syntaxe přes přechodný kód k cílovému kódu
Dosud přenášel strom syntaxe všechny informace zdrojového programu a následná konverze nemá se zdrojovým kódem nic společného. program.
Chcete-li převést ze stromu syntaxe na cílový kód v jednom kroku, je to proveditelné jak teoreticky, tak i v praxi. Počítače však mají více hardwarových platforem CPU. Vzhledem k přenositelnosti programů mezi různými CPU jsou tyto programy nejprve převedeny na obecnou a abstraktní "instrukci CPU". Toto je původní návrhová myšlenka přechodného kódu. Potom podle konkrétního vybraného CPU je mezikód implementován do cílového kódu konkrétního CPU.
Strom syntaxe je dvourozměrná struktura. Mezikód je kvazijednorozměrná struktura. Proces převodu ze syntaktického stromu do mezikódu je v podstatě procesem převodu dvourozměrné struktury na kvazijednorozměrnou strukturu. Mezikód, zejména RTL, již může odpovídat runtime struktuře jedna ku jedné. Jak je znázorněno na obrázku 1-40.

Obrázek 1-40 ukazuje scénář, kde přechodný kód odpovídá cílovému kódu
Runtime struktura je také jednorozměrná, jak je znázorněno v levé části Obr. 1-40 Výsledek převodu se bude blížit runtime struktuře.
Po výběru konkrétního CPU a operačního systému lze přechodný kód převést na kód cílového sestavení kódu (konfigurujeme sestavení AT&T), v tuto chvíli je dopad operačního systému relativně malý. Potom assembler převede soubor .s na konkrétní objektový soubor podle formátu objektového souboru zvoleného operačního systému, což je soubor .o pro Linux a soubor .obj pro Windows. Strojové instrukce zvoleného CPU jsou již v cílovém souboru.
Nakonec linker propojí jeden nebo více objektových souborů (soubory knihoven jsou ve své podstatě také objektové soubory) do spustitelných souborů, které odpovídají zadanému formátu vybraného operačního systému.
Prostřednictvím operačního systému lze spustitelné programy načítat do paměti za účelem provedení a vytvořit tak běhovou strukturu, kterou jsme viděli v předchozích dvou částech.
Následný obsah této knihy podrobně vysvětlí hlavní proces kompilace: lexikální analýzu, analýzu syntaxe, přechodný kód k cílovému kódu, poté sestavení a propojení a nakonec vysvětlí předběžné zpracování.