Překladač

Ve vědě o počítačích , je kompilátor je program, který převádí zdrojový kód do objektového kódu . Obecně je zdrojový kód napsán v programovacím jazyce ( zdrojový jazyk ), má vysokou úroveň abstrakce a je snadno srozumitelný lidem. Objektový kód je obecně psán v jazyce nižší úrovně (nazývaném cílový jazyk ), například v assembleru nebo strojovém jazyce , aby bylo možné vytvořit program spustitelný strojem.

Obecná prezentace

Kompilátor provádí následující operace: lexikální analýza , předzpracování ( předzpracování ), syntaktická analýza ( analýza ), sémantická analýza a optimalizace generování kódu . Po kompilaci často následuje krok úpravy odkazu , který vygeneruje spustitelný soubor. Když je kompilovaný program (objektový kód) spuštěn v počítači, jehož procesor nebo operační systém se liší od procesoru nebo operačního systému kompilátoru, nazývá se to křížová kompilace .

Existují dvě možnosti kompilace:

Historický

Počáteční počítačový software byl napsán v montážním jazyce . Programovací jazyky nejvyšší úrovně (v abstrakce vrstvách ) nebyla vynalezena až výhody schopnosti opětovného využití softwaru na různých typů procesorů se staly mnohem důležitější než náklady na zápis do ‚překladače. Velmi omezená kapacita paměti raných počítačů také představovala několik technických problémů při vývoji překladačů.

Na konci 50. let se poprvé objevily programovací jazyky nezávislé na strojích. Následně je vyvinuto několik experimentálních překladačů. První překladač, systém A-0 (pro jazyk A-0), napsal Grace Hopper v roce 1952. Předpokládá se, že tým FORTRAN vedený Johnem Backusem z IBM vyvinul první úplný překladač v roce 1957. COBOL , vyvinutý v roce 1959 a je do značné míry založen na myšlenkách Grace Hopperové a je prvním jazykem, který má být sestaven na několika architekturách.

V několika aplikačních oblastech myšlenka používání jazyka s vyšší úrovní abstrakce rychle rozšířila. S nárůstem funkčnosti podporovaným novějšími programovacími jazyky a zvyšující se složitostí počítačové architektury se překladače stávají stále složitějšími.

V roce 1962  vytvořili Tim Lart a Mike Levin na Massachusetts Institute of Technology (MIT) pro Lisp první  kompilátor s vlastním hostitelem - schopný kompilace do objektového kódu, vlastního zdrojového kódu vyjádřeného v jazyce vysoké úrovně . Počínaje sedmdesátými léty bylo velmi běžné vyvíjet kompilátor v jazyce, který byl určen ke kompilaci, což z Pascal a C dělalo velmi populární vývojové jazyky.

Můžeme také použít jazyk nebo prostředí specializované na vývoj překladačů: mluvíme během metakompilačních nástrojů a používáme například překladač překladačů . Tato metoda je zvláště užitečná pro vytvoření prvního kompilátoru nového jazyka; používání přizpůsobeného a přísného jazyka pak usnadňuje vývoj a vývoj.

Struktura a provoz

Hlavním úkolem kompilátoru je vytvořit správný objektový kód, který bude spuštěn v počítači. Většina překladačů umožňuje optimalizovat kód, to znamená, že se bude snažit zlepšit rychlost provádění nebo snížit obsazení paměti programem.

Obecně je zdrojový jazyk „vyšší úrovně“ než cílový jazyk, to znamená, že představuje vyšší úroveň abstrakce. Kromě toho je zdrojový kód programu obvykle distribuován v několika souborech.

Kompilátor pracuje na základě analýzy a syntézy: namísto nahrazení každé konstrukce zdrojového jazyka ekvivalentní řadou konstrukcí cílového jazyka začíná analýzou zdrojového textu a vytvořením mezilehlé reprezentace , kterou následně převede do cílového jazyka. .

Kompilátor je rozdělen na alespoň dvě části: přední (nebo přední) část, někdy nazývanou „stub“, která čte zdrojový text a vytváří mezilehlou reprezentaci; a zadní (nebo koncová) část, která prochází touto reprezentací a vytváří cílový text. V ideálním kompilátoru je přední část nezávislá na cílovém jazyce, zatímco zadní část je nezávislá na zdrojovém jazyce. Někteří kompilátoři provádějí podstatné zpracování na prostřední části a stávají se samostatnou centrální částí, nezávisle na zdrojovém jazyce i cílovém stroji. Můžeme tedy psát překladače pro celou řadu jazyků a architektur sdílením centrální části, ke které připojujeme přední část pro každý jazyk a zadní část pro každou architekturu.

Fáze kompilace zahrnují:

Fáze předzpracování obvykle nastává před analýzou nebo sémantikou; například v případě C preprocesor zpracovává spíše lexikální symboly než syntaktické tvary.Každý token je jedinečnou atomovou jednotkou jazyka (lexikální jednotky nebo lexémy), například klíčové slovo, identifikátor nebo symbol. Syntaxe tokenu je obecně běžný jazyk , a proto je rozpoznatelný strojem s konečným stavem. Tato fáze se také nazývá skenování nebo lexing  ; software, který provádí lexikální analýzu, se nazývá lexikální analyzátor nebo skener. Lexikální analyzátor pro regulární jazyk lze vygenerovat počítačovým programem z popisu jazyka regulárními výrazy. Dva klasické generátory jsou lex a flex . Tato fáze je obecně založena na konstrukci analytického stromu; lineární sekvence tokenů je nahrazena stromovou strukturou vytvořenou podle formální gramatiky, která definuje syntaxi jazyka. Například za podmínkou vždy následuje logický test (rovnost, srovnání atd.). Strom analýzy se během kompilace často upravuje a vylepšuje. Yacc a GNU Bison jsou nejpoužívanější analyzátory.Tato fáze kontroluje typ (kontrola chyb typu) nebo objekt vazby (přiřazení proměnných a odkazů na funkce k jejich definicím) nebo definovaný úkol (před použitím musí být inicializovány všechny místní proměnné), může vydávat varování nebo odmítat nesprávné programy . Sémantická analýza obvykle vyžaduje kompletní strom analýzy, což znamená, že tato fáze následuje po fázi analýzy a logicky předchází fázi generování kódu; ale je možné tyto fáze složit v jednom průchodu.

Přední část tvoří lexikální, syntaktická a sémantická analýza, přechod prostředním jazykem a optimalizace. Generování kódu a propojení je poslední část.

Tyto různé kroky znamenají, že kompilátoři jsou stále předmětem výzkumu.

Spojení s tlumočníky

Implementace (realizace beton) programovacího jazyka může být interpretován nebo kompilován. Tato realizace je kompilátor nebo tlumočník a programovací jazyk může mít jednu implementaci kompilovanou a jinou interpretovanou.

Mluvíme o kompilaci, pokud je překlad proveden před provedením (princip smyčky je poté přeložen jednou), a o interpretaci, pokud je překlad dokončen krok za krokem, během provádění (prvky smyčky jsou poté zkoumány pro každé použití) .

Interpretace je užitečná pro ladění nebo pokud jsou zdroje omezené. V provozu je vhodnější kompilace.

Problém naplnění ( bootstrap )

První překladače byly psány přímo v assembleru , což je elementární symbolický jazyk odpovídající instrukcím cílového procesoru a některé mírně vyvinutější řídicí struktury. Tento symbolický jazyk musí být sestaven (nekompilován) a propojen, aby se získala spustitelná verze. Díky své jednoduchosti stačí k převodu na strojové instrukce jednoduchý program.

Aktuální překladače jsou obvykle psány v jazyce, který mají být kompilovány; například kompilátor C je napsán v C, SmallTalk v SmallTalk, Lisp v Lisp  atd. Při realizaci kompilátoru je učiněn rozhodující krok, když je kompilátor pro jazyk X dostatečně kompletní, aby se sám kompiloval: pak již nezávisí na jiném jazyce (dokonce ani na assembleru), který má být vytvořen.

Je těžké odhalit chybu kompilátoru. Například pokud má kompilátor C chybu, programátoři C budou mít přirozeně tendenci zpochybňovat svůj vlastní zdrojový kód, nikoli kompilátor. Horší je, že pokud tento buggy kompilátor (verze V1) kompiluje nebuggy kompilátor (verze V2), mohl by být bugován kompilovaný spustitelný soubor (podle V1) kompilátoru V2. Přesto je jeho zdrojový kód dobrý. Bootstrap proto vyžaduje kompilátory programátorům, aby se vyhnula chybám stávajících překladačů.

Jednoprůchodový a víceprůchodový překladač

Klasifikace překladačů podle počtu průchodů je způsobena nedostatkem hardwarových prostředků počítačů. Kompilace je nákladný proces a dřívější počítače neměly dostatek paměti k uložení programu, který musel tuto práci dělat. Překladače tak byly rozděleny do podprogramů, které každý přečetl ze zdroje, aby dokončil různé fáze lexikální analýzy , syntaktické analýzy a sémantické analýzy .

Schopnost kombinovat vše do jednoho průchodu byla považována za výhodu, protože zjednodušuje psaní kompilátoru, který obecně běží rychleji než kompilátor s více průchody. Vzhledem k omezeným zdrojům časných systémů bylo mnoho jazyků speciálně navrženo tak, aby je bylo možné kompilovat v jednom průchodu (např. Jazyk Pascal ).

Nelineární struktura programu

V některých případech vyžaduje určitá vlastnost jazyka, aby jeho překladač provedl více než jeden průchod. Zvažte například prohlášení na řádku 20 zdroje, které ovlivňuje překlad příkazu na řádku 10 . V tomto případě by měl první průchod shromažďovat informace o deklaracích, zatímco skutečný překlad probíhá pouze během následujícího průchodu.

Optimalizace

Rozdělení kompilátoru na malé programy je technika používaná výzkumníky, kteří se zajímají o výrobu efektivních překladačů. Je to proto, že nevýhodou kompilace s jedním průchodem je, že neumožňuje provedení většiny sofistikovaných optimalizací potřebných k vygenerování vysoce kvalitního kódu. Potom bude obtížné přesně spočítat počet průchodů, které provádí optimalizační kompilátor.

Rozdělení demonstrace opravy

Demonstrace správnosti řady malých programů často vyžaduje menší úsilí než prokázání správnosti ekvivalentního většího jediného programu.

Překladač překladač

Kompilátor kompilátoru je program, který může generovat některou nebo všechny jeho části. Můžete například zkompilovat základy jazyka a zbytek použít pomocí základů jazyka.

Kvalitní

V závislosti na použití a stroji, který bude program spouštět, možná budete chtít optimalizovat rychlost provádění, obsazení paměti, spotřebu energie, přenositelnost do jiných architektur nebo čas kompilace.

Řetězec kompilace

Křížová kompilace

Křížová kompilace označuje řetězce kompilace schopné překládat zdrojový kód do objektového kódu, jehož architektura procesoru se liší od architektury, kde se kompilace provádí. Tyto řetězce se používají hlavně v průmyslových IT a ve vestavěných systémech .

Jiné kompilace

Bajtový kód nebo bajtový kód

Někteří překladači překládají zdrojový jazyk do jazyka virtuálního stroje (známého jako mezilehlý jazyk), to znamená do kódu (obecně binárního) prováděného virtuálním strojem  : program emulující hlavní funkce počítače. O těchto jazycích se říká, že jsou částečně kompilované. Portování programu tedy vyžaduje pouze portování virtuálního stroje, kterým bude ve skutečnosti buď tlumočník, nebo druhý překladač (u překladačů s více cíli). Překladače tedy překládají Pascal do P-kódu, Modula 2 do M-kódu, Simula do S-kódu nebo nověji Java kód do Java bytecode (objektový kód).

Příklady

Když je kompilace založena na bajtovém kódu, mluvíme o kompilaci za běhu . Potom používáme virtuální stroje, jako je virtuální stroj Java, se kterým můžeme pozoruhodně kompilovat Scalu . V některých jazycích je možné použít knihovnu umožňující on-the-fly kompilaci kódu zadaného uživatelem, například v C s libtcc.

Ostatní překladači překládají kód z jednoho programovacího jazyka do druhého. Říká se jim transcompilers , nebo dokonce anglicismus, transportéry nebo transpilátory. Například software LaTeX umožňuje ze zdrojového kódu v LaTeXu získat soubor ve formátu PDF (například příkazem pdflatex pod Ubuntu ) nebo HTML . Dalším příkladem je knihovna LLVM, která pomáhá vytvářet kompilátory a společnost AMD ji také používá k vývoji „HIP“, překladače kódu CUDA (specifický jazyk NVIDIA a široce používaný) za účelem jeho spuštění na grafických procesorech AMD.

Někteří překladači překládají zdrojový program (zadaný uživatelem), inkrementálně nebo interaktivně, do strojového kódu. Jako příklad můžeme uvést některé implementace Common Lisp (například SBCL  (en) ).

Dodatky

Bibliografie

Také se nazývá Dračí kniha

Související články

externí odkazy

Poznámky a odkazy

  1. Kompilátor také jmenuje autora, který sestavuje výňatky z různých spisů, aby vytvořil dílo; naleznete na význam 1 slovního kompilátor v Wiktionary .
  2. Jacques Menu, překladače s C ++ , Addison-Wesley,1994, str. 30
  3. Například na EDSAC , jak jej popsal Alan Turing ve své přednášce na zahájení, (in) AM Turing, „Checking a Large Rutine“ ve zprávě o konferenci o vysokorychlostních automatických počítacích strojích , Univ. Matematika. Laboratoř. , Cambridge, str.  67-69 (1949), Morris, FL a CB Jones, „  Časný programový důkaz Alana Turinga  “, Ann. Hist. Comp. , sv.  6, n O  2Duben 1984, str.  139-143 ( číst online ).
  4. Srov. Jérôme Feldman a Marcel Berger ( eds. ), The progress of mathematic , Paris, Belin editions, coll.  "Pro vědu",devatenáct osmdesát jedna, 167  s. ( ISBN  2-902918-14-3 ) , „Programovací jazyky“, s.  102-113.
  5. (in) Susan Ware ( eds. ), Stacy Braukman et al. , Pozoruhodné americké ženy: Biografický slovník: Dokončení dvacátého století , sv.  5, Harvard University Press,2005, 729  str. ( ISBN  978-0-674-01488-6 , online prezentace ) , s.  309-311.
  6. Vicki Porter Adams , „  Kapitánka Grace M. Hopper: Matka COBOLU,  “ InfoWorld , sv.  3, n o  20,5. října 1981, str.  33 ( ISSN  0199-6649 , číst online ).
  7. Mitch Betts , „  Grace Hopper, matka Cobola, zemře,  “ Computerworld , roč.  26, n o  1,6. ledna 1992, str.  14 ( ISSN  0010-4841 , číst online ).
  8. „  Podívejte se na kurz„ Kompilace za běhu s libtcc “na @OpenClassroom  “ v OpenClassroom (přístup 21. listopadu 2016 ) .
  9. „  tranpiler  “ , na wiktionary.org ,16. listopadu 2017(zpřístupněno 24. dubna 2018 )
  10. (in) „  LaTeX - Systém přípravy dokumentů  “ na www.latex-project.org (přístup k 21. listopadu 2016 ) .
  11. (in) „  Uživatelská příručka SBCL  “ na www.sbcl.org (přístup k 21. listopadu 2016 ) .