Array ( [0] => 15482122 [id] => 15482122 [1] => cswiki [site] => cswiki [2] => Překladač [uri] => Překladač [3] => [img] => [4] => [day_avg] => [5] => [day_diff] => [6] => [day_last] => [7] => [day_prev_last] => [8] => Překladač je zařízení nebo software, který slouží k překladu textů z jednoho jazyka do druhého. Překladači se používají v různých oblastech, jako je literatura, technologie, právo nebo medicína, ať už pro překlad knih, článků, návodů, smluv nebo lékařských zpráv. Existuje mnoho typů překladačů, včetně elektronických slovníků, webových stránek, mobilních aplikací nebo specializovaných softwarů. Překladači využívají různé techniky a algoritmy, jako je statistický překlad, neuronové sítě nebo strojové učení, k dosažení co nejpřesnějšího výsledku. Překladači mají však také své omezení a často se dopouští chyb, zejména při překladu složitějších textů. Přesto překladače stále hrají důležitou roli v globálním světě a umožňují komunikaci mezi lidmi, kteří hovoří různými jazyky. [oai] => Překladač je zařízení nebo software, který slouží k překladu textů z jednoho jazyka do druhého. Překladači se používají v různých oblastech, jako je literatura, technologie, právo nebo medicína, ať už pro překlad knih, článků, návodů, smluv nebo lékařských zpráv. Existuje mnoho typů překladačů, včetně elektronických slovníků, webových stránek, mobilních aplikací nebo specializovaných softwarů. Překladači využívají různé techniky a algoritmy, jako je statistický překlad, neuronové sítě nebo strojové učení, k dosažení co nejpřesnějšího výsledku. Překladači mají však také své omezení a často se dopouští chyb, zejména při překladu složitějších textů. Přesto překladače stále hrají důležitou roli v globálním světě a umožňují komunikaci mezi lidmi, kteří hovoří různými jazyky. [9] => [is_good] => [10] => [object_type] => [11] => 0 [has_content] => 0 [12] => [oai_cs_optimisticky] => ) Array ( [0] => {{Neověřeno}} [1] => {{Různé významy|tento=překladačích programového kódu|druhý=překladačích mezi přirozenými jazyky|stránka=Strojový překlad}} [2] => {{různé významy|stránka=Kompilátor}} [3] => [[Soubor:Compiler-cs.svg|náhled|Příklad struktury překladače podporujícího dva vstupní jazyky i dvě cílové architektury]] [4] => '''Překladač''' (též '''kompilátor''', {{Vjazyce2|en|''translator''}} nebo také ''{{cizojazyčně|en|compiler}}'' z ''{{cizojazyčně|en|to compile}}'' – ''sestavit'', ''zpracovat'') je v nejčastějším smyslu slova softwarový [[nástroj]] používaný [[programování|programátory]] pro vývoj [[Software|softwaru]]. Kompilátor slouží pro překlad [[algoritmus|algoritmů]] zapsaných ve vyšším [[programovací jazyk|programovacím jazyce]] do jazyka nižšího, nejčastěji strojového, či spíše do [[strojový kód|strojového kódu]]. Z širšího obecného hlediska je kompilátor [[stroj]], respektive [[počítačový program|program]], provádějící překlad z nějakého vstupního [[jazyk (lingvistika)|jazyka]] do jazyka výstupního. Z matematického hlediska je kompilátor [[Funkce (matematika)|funkce]], která mapuje jeden nebo více [[zdrojový kód|zdrojových kódů]] podle překladových parametrů na kód ve výstupním jazyce. [5] => [6] => == Historie == [7] => {{Viz též|Historie překladačů}}Prvním programem, který by bylo možno označit jako překladač, byl [[A-0 System]], který v roce 1952 vytvořila [[Grace Hopperová]] pro počítač [[UNIVAC I]]. Vývoj překladačů pak pokračoval prvním „kompletním“ překladačem pro jazyk [[Fortran]] v roce 1957, prvním tzv. self-hosting překladačem pro [[LISP]] v roce 1962, až po překladače psané ve vyšších programovacích jazycích po roce 1970. [8] => [9] => == Vztah jazyk – program – překladač == [10] => Číslicový [[počítač]] je z technického hlediska stroj, interpretující strojový kód uložený v paměti. Strojový kód tvořící počítačový program si u běžných číslicových počítačů založených na binární logice můžeme představit jako dlouhou posloupnost nul a jedniček. V pionýrských dobách výpočetní techniky bylo třeba nejprve vytvořit algoritmus, poté jej přepsat do symbolicky zapsaného strojového kódu a tento ručně přepsat do strojového kódu. Tato činnost je časově velmi náročná, přičemž v každé fázi tohoto procesu lze udělat mnoho chyb. Prvním zjednodušením byl [[assembler]], který umožňoval převod symbolicky zapsaného strojového kódu do jeho číselného vyjádření. Assembler (ve smyslu překladač assembleru) nebývá řazen mezi kompilátory, přestože by z formálního hlediska mohl být za kompilátor považován. Funkce assembleru je ve srovnání s kompilátorem velmi jednoduchá, zdrojový kód assembleru se považuje pouze za čitelnější formu zápisu strojového kódu, kde jsou adresy proměnných a návěstí označeny symbolickými názvy. [11] => [12] => Algoritmy byly v počátcích výpočetní techniky zapisovány formou [[vývojový diagram|vývojových diagramů]]. Vývojové diagramy jsou vhodné pro formální popis algoritmů, avšak jejich tvorba je zdlouhavá a jejich počítačové zpracování je obtížné. Naproti tomu [[vyšší programovací jazyk]]y umožňují efektivní a jednoznačně definovaný zápis algoritmů. Klasický postup, kdy je algoritmus nejprve zapsán v programovacím jazyce a poté přeložen pomocí kompilátoru do strojového kódu se z velké části používá dodnes, protože takto vytvořené programy využívají velice efektivně [[strojový čas]] počítače. Typickým příkladem kompilovaného jazyka je [[C (programovací jazyk)|programovací jazyk C]]. [13] => [14] => Když strojový čas počítačů zlevnil (a čas programátorů relativně podražil), začaly se objevovat jazyky, které nejsou zaměřené na vytvoření maximálně efektivního kódu, ale které si kladou za primární cíl přehlednější a pohodlnější zápis algoritmů a zmenšení problémů při přenosu programů mezi různými architekturami počítačů. Díky tomu vznikly interpretované jazyky, které nejsou (a bez zásahu do struktury jazyka nemohou být) kompilovány. Zdrojový kód není překládán přímo do strojového kódu, ale je přímo interpretován pomocí speciálního programu – [[Interpret (software)|interpretu]]. Typickým příkladem interpretovaného jazyka může být např. [[Smalltalk]]. [15] => [16] => === Fáze překladu programu === [17] => I když by bylo možné, aby kompilátor překládal zdrojový kód přímo do spustitelného tvaru, obvyklý postup překladu bývá odlišný. Zdrojový kód programu bývá obvykle rozdělen do více jednotek, u velkých programů se může jednat o tisíce souborů se zdrojovými texty. Důvodů pro takovou fragmentaci zdrojového kódu programu je mnoho, např. snadnější údržba zdrojových kódů, možnost znovu-využívání jednotek, nižší nároky na kompilátor atp. [18] => [19] => Proto kompilátor překládá jednotky zdrojového kódu do tzv. [[objektový kód|objektového kódu]]. Objektový kód jednotky je v podstatě již strojovým kódem cílové architektury, obsahuje však dodatečné informace umožňující přemístění návěstí a proměnných přeložené jednotky a informace o vazbách na externí proměnné a na externí kód. Z jednotlivě přeložených objektových kódů a z funkcí obsažených v [[knihovna (programování)|knihovnách]] pak [[linker]] sestaví výsledný spustitelný kód. [20] => [21] => Příklad možného postupu překladu programu psaného v jazyce C: [22] => [23] => {| class="wikitable" [24] => !Zdrojový kód → cílový kód [25] => !Překladový nástroj [26] => !Poznámka [27] => |- [28] => |jednotka1.c → jednotka1.asm,
jednotka2.c → jednotka2.asm, … [29] => |kompilátor jazyka C [30] => |klasické kompilátory překládaly zdrojový kód do jazyka symbolických adres; mnohé kompilátory tuto možnost nabízejí i dnes pro případ, že vyvstane potřeba zkontrolovat funkci kompilátoru [31] => |- [32] => |jednotka1.asm → jednotka1.obj,
jednotka2.asm → jednotka2.obj, … [33] => |assembler [34] => |vytvoření objektového kódu [35] => |- [36] => |jednotka1.obj + jednotka2.obj + … + knihovna1.lib + knihovna2.lib + … → output [37] => |linker [38] => |spojení objektových kódů a kódu z knihoven do spustitelného kódu [39] => |} [40] => [41] => Překladové nástroje zpravidla na požádání generují dodatečné informace (například mapy proměnných, kód s rozvojem maker, informace o vyhodnocení konstant atp.). Tyto informace mohou sloužit pro kontrolu průběhu překladu, nebo jako vstupy pro ladící nástroje. [42] => [43] => == Struktura překladače == [44] => Překladač lze navrhnout mnoha způsoby, často bývá rozdělen na dvě části. První je závislá na [[vstupní jazyk|vstupním jazyce]] (tzv. ''front-end'') a druhá závisí na [[cílová architektura|cílové architektuře]] (tzv. ''back-end''). Překlad nemusí probíhat přímo, může využívat tzv. [[mezikód]] (bytekód, resp. mezilehlý kód), tzn. že kód je nejprve překládán do mezikódu a v druhém kroku z mezikódu do strojového jazyka. Tím se rozdělí jeden kompilátor na dva jednodušší kompilátory, přičemž překlad ze zdrojového jazyka do mezikódu může být společný pro více architektur. Rovněž je výhodné, že pokud je potřeba vyrobit překladač pro další jazyk, stačí vytvořit pouze část pro překlad do mezikódu. [45] => [46] => O překladači se mluví i v případě, že překládá do vyššího programovacího jazyka. Tímto způsobem se používá [[C (programovací jazyk)|C]] jako tzv. ''přenositelný assembler'', dále běžně na jedné straně [[assembler]] a extrémisté na druhé straně [[Scheme]]. Z pohledu uživatele tyto fáze nemusí být odděleny ''a všecko je na jeden [[knoflík]], odborně [[tlačítko]]''. Uživatel vidí přítulné [[Grafické uživatelské rozhraní|GUI]]. [47] => [48] => Překlad z mezikódu, např. v integrovaném prostředí, může být odložen, z různých důvodů, a vykonáván dále po částech podle potřeby. Pro to se používá termín [[Just-in-time kompilace|JIT]], ''just-in-time'' kompilace. [49] => Důvody jsou… [50] => Tento přístup se od interpretace liší v tom, že se do mezikódu zpracuje celý zdroják, tudíž kompilační chyby jsou nalezeny a opraveny před spuštěním. Mezikód může být i interpretován, např. abstraktním neboli virtuálním strojem. [51] => [52] => Vlastní běh překladače označujeme jako [[čas překladu]] (''compile time''); spuštění přeloženého programu pak jako [[čas běhu]] (''run time''). Jednoslovným termínem ''runtime'' se označují části kódu, které se připojují (přilinkují) k přeloženému kódu a obsahují podpůrné funkce, jako implementaci vestavěných operací, V/V, … [53] => [54] => Překladač může dostat kromě zdrojáku i příkazy pro svou činnost prostřednictvím [[options]], například o požadované míře optimalizace nebo o povolených rozšířeních syntaxe, použitých v konkrétním zdrojáku. Taktéž zdroják může obsahovat příkazy nebo informace pro kompilátor, známé jako [[pragma|pragmy]]. A výstupem nemusí být jen strojový kód, ale i dodatečné informace pro debugger apod. [55] => [56] => == Části překladače == [57] => Z formálního hlediska je možné rozdělit překladač na následující části, ve skutečnosti však nemusí být tyto jednotky vždy striktně oddělené (např. lexikální a syntaktická analýza může splynout): [58] => [59] => * lexikální analyzátor [60] => * syntaktická analýza [61] => * sémantický analyzátor [62] => * [[Optimalizace (informatika)|optimalizace kódu]] [63] => * generování cílového kódu [64] => [65] => === Lexikální analyzátor === [66] => [[Lexikální analýza|Lexikální analyzátor]] je první jednotka překladače, která má za úkol relativně jednoduchým způsobem získat ze vstupního [[Zdrojový kód|zdrojového textu]] tzv. lexémy (některý základní prvek příslušného jazyka, např. klíčové slovo „if“) a tu pak zasílá syntaktickému analyzátoru. [67] => [68] => Všechny možné lexémy jsou ve vstupním jazyce popsány pomocí [[regulární výraz|regulárních výrazů]]. V kompilátoru se pro jejich rozpoznávání používá [[konečný automat]]. Kromě samotného lexému se do syntaktického analyzátoru posílají další související údaje, např. jakého druhu je daný lexém (operátor, klíčové slovo, identifikátor, …), u identifikátorů odkaz do tabulky identifikátorů (pro urychlení překladu, překladač poté nemusí pracovat s textem, ale pouze s číselným označením) apod. Celý soubor údajů předávaný z lexikálního do syntaktického analyzátoru se označuje anglickým termínem ''token'' (''známka'', ''odznak''). [69] => [70] => === Syntaktický analyzátor === [71] => [[Syntaktický analyzátor]] (v angličtině označovaný jako ''parser'', z ''to parse'' – ''rozebrat'', ''oddělovat'', ''udělat větný rozbor'') se dá považovat za mozek překladače, protože provádí samotnou analýzu vstupního jazyka. Úkolem syntaktického analyzátoru je rozpoznat, zda je program zapsán správným způsobem, např. zda na úvodní „begin“ bude navazovat někde koncové „end“, ale také určuje, v jakém pořadí se budou provádět jednotlivé části příkazů, např. u „x + y*z“ rozpozná a určí, že nejdříve se bude násobit a pak až sčítat, nebo u vnořených příkazů zajistí, že nejdříve se vyhodnotí parametr funkce a teprve pak se daná funkce zavolá. [72] => [73] => Úloha syntaktického analyzátoru je o něco složitější než úloha lexikálního analyzátoru, neboť na rozdíl od [[regulární jazyk|regulárního jazyka]] lexémů musí syntaktický analyzátor rozpoznávat složitější [[bezkontextový jazyk]] (typicky LL(1) či LR(1)). Syntaktický analyzátor k tomu musí vyhodnocovat vstup v delším záběru. [74] => [75] => Výsledkem práce syntaktického analyzátoru je tzv. ''syntaktický strom'' (anglicky „parse tree“), který popisuje strukturu vstupního programu. [76] => [77] => Jedním z nejjednodušších způsobů konstrukce syntaktického analyzátoru je tzv. ''[[Analýza rekurzivním sestupem|metoda rekurzivního sestupu]]''. V této metodě se pomocí [[rekurze|rekurzivních]] volání konstruuje syntaktický strom, přičemž struktura implementace překladače odráží strukturu příslušné [[Formální gramatika|gramatiky]]. Pokud je v gramatice na daném místě neterminální symbol, v překladači mu odpovídá (rekurzivní) volání funkce reprezentující příslušný neterminál. Tato rekurzivní volání končí u terminálních symbolů (lexémů jazyka), které jsou přečteny a uloženy do syntaktického stromu. [78] => K syntaktické analýze se využívá zásobníkového automatu. [79] => [80] => === Sémantický analyzátor === [81] => [[Sémantická analýza|Sémantický analyzátor]] zpracovává syntaktický strom a provádí analýzu významu jednotlivých operací. Na rozdíl od syntaktického analyzátoru, který provádí kontrolu správnosti struktury programu čili zápis programového kódu, sémantický analyzátor provádí kontrolu správnosti operací. V tomto mechanismu se odehrává veškerá [[typová kontrola]] a různé konverze. Prací sémantického analyzátoru je např. analýza typů výrazů na levé a pravé straně přiřazovacího příkazu, přičemž musí zabránit např. přiřazení hodnoty s plovoucí řádovou čárkou do proměnné s pevnou řádovou čárkou. [82] => [83] => Vstupem sémantického analyzátoru je syntaktický strom, který vygeneroval syntaktický analyzátor, výstupem je opět syntaktický strom, ale s doplněnými dodatečnými informacemi a s provedenými konverzemi. [84] => [85] => === Překladač do mezikódu === [86] => V této fázi se ze syntaktického stromu generuje kód, tzn. strukturovaný syntaktický strom se transformuje do lineární posloupnosti instrukcí. Obvykle se však negeneruje přímo kód cílového jazyka, ale kód v nějakém pomocném jazyce, tzv. ''mezikód''. Cílem tohoto kroku je ulehčit následující operace, které by v cílovém jazyce mohly být komplikované. Tohoto přístupu se s výhodou používá pro tvorbu optimalizátorů efektivity kódu. Existují však i překladače bez fáze překladu do mezikódu, překládající přímo do cílového jazyka. [87] => [88] => Jednou z možností návrhu mezikódu je tzv. ''tříadresný kód''. Instrukce tříadresného kódu mají jednotnou strukturu, pracují nad adresami dvou vstupních operandů a jednoho výsledkového operandu, např. Id1 = Id2 * 5. Nejtypičtější formou mezikódu však je kód nějakého [[zásobníkový počítač|zásobníkového počítače]]. [89] => [90] => Překladem do mezikódu končí část závislá na zdrojovém programovacím jazyku (''front-end''), zbytek překladače (''back-end'') může být dokonce shodný pro překladače různých jazyků (tak je navržen např. překladač [[GCC]]). [91] => [92] => Jako mezikód se používá i [[jazyk symbolických adres]], někdy též nepřesně nazývaný assembler (ovšem s omezením na cílovou architekturu). [93] => [94] => === Optimalizátor === [95] => Optimalizátor provádí [[Optimalizace (informatika)|optimalizace]] pomocí různých transformací mezikódu, jejichž cílem je zlepšení vlastností výsledného kódu (zrychlení běhu, zmenšení velikosti kódu a podobně). [96] => [97] => Příkladem optimalizace může být například odstranění cyklického přiřazení: [98] => [99] => Id1 = 5 + Id2 [100] => Id3 = Id1 [101] => [102] => takovýto kód optimalizátor přepíše na: [103] => [104] => Id3 = 5 + Id2 [105] => [106] => Také se může vyskytovat tzv. ''mrtvý kód'', tedy kód, který se nikdy nevykoná, například: [107] => [108] => [109] => while (false) { [110] => … [111] => } [112] => [113] => [114] => takový kód optimalizátor zcela zahodí. Na výstupu optimalizátoru je stále mezikód. [115] => [116] => === Generátor kódu === [117] => V poslední fázi se z mezikódu generuje výstupní kód, program v cílovém jazyce. Cílovým jazykem nejčastěji bývá přímo [[strojový kód]], často též [[bajtkód]] a v poslední době též rozšíření [[JavaScript]]u [[asm.js]] (prohlížeče [[Mozilla Firefox]], [[Google Chrome]], [[Opera (webový prohlížeč)|Opera]]http://www.favbrowser.com/chrome-and-opera-optimize-for-asm-js/ Chrome And Opera Optimize For Asm.js [118] => a [[Safari (webový prohlížeč)|Safari]]http://www.macrumors.com/2014/05/12/safari-javascript-ftljit/ Apple Looking to Boost Safari JavaScript Performance with New Accelerator Upgrades). [119] => [120] => == Typy překladačů == [121] => Překladače můžeme rozdělit na: [122] => [123] => * klasický překladač [124] => * konverzační překladač, který se dále dělí na: [125] => ** konverzační interpretační překladač [126] => ** konverzační kompilační překladač [127] => [128] => === Klasický překladač === [129] => Klasický překladač je nejběžnějším typem překladače. Programátor sestaví celý [[počítačový program|program]] ve zdrojovém tvaru, což bývá text či struktura, a pak jej pošle na vstup překladače. Během překladu obvykle není možné zasahovat do činnosti překladače. Překlad probíhá v jednom nebo několika průchodech (viz níže). Postupně probíhá [[Lexikální analýza|lexikální]], [[Syntaktická analýza|syntaktická]] a [[sémantická analýza]], [[Optimalizace (informatika)|optimalizace]] (obvykle ve více průchodech) a generování cílového kódu (podrobněji viz výše). [130] => [131] => === Konverzační překladač === [132] => Konverzační (interaktivní) překladač s uživatelem během překladu komunikuje. Uživatel postupně zapisuje řádky [[zdrojový kód|zdrojového kódu]], které jsou ihned po dokončení jednotlivě posílány konverzačnímu překladači. Konverzační překladač obvykle obsahuje [[příkaz]]y [[metajazyk]]a, které jsou určeny jen překladači (výpis proměnné, ovlivnění chodu překladače, ukončení práce). Konverzační překladače s uživatelským rozhraním mohou mít vlastní menu s metapříkazy, což zjednodušuje analýzu vstupu, protože se překladač nemusí zabývat rozlišením vstupního jazyka a metajazyka. Výhodou tohoto překladače je rozšíření možností ladění. Další výhodou je, že pokud nastane chyba, je to zpravidla u posledního vstupu, což je zpravidla jen jeden řádek. [133] => [134] => === Konverzační interpretační překladač === [135] => Konverzační interpretační překladač postupně přijímá určité příkazy, kontroluje jejich správnost, ukládá a příkaz interpretuje. Je vhodný pro implementaci jednoduchých grafických programů či výukových programů ([[Logo (programovací jazyk)|Logo]], [[Karel (programovací jazyk)|Karel]]). [136] => [137] => === Konverzační kompilační překladač === [138] => Konverzační kompilační překladač postupně načítá určité příkazy, ukládá si je ve zdrojovém kódu, a pak je zpracovává. Tento překladač postupně generuje cílový kód nebo [[intermediální kód]] (asi častěji nazývaný [[bajtkód]]). Velkou nevýhodou je, že je přístupný pouze příkaz, který se zrovna zpracovává, což způsobuje komplikace při zpracovávání kontextových závislostí. Proto se dá použít jen pro nejjednodušší jazyky. [139] => [140] => == Průchody překladače == [141] => Průchodem překladače se rozumí kompletní načtení celého zdrojového kódu. Průchodem vzniká mezikód pro vnitřní potřebu překladače. Mezikód je vstupem další části nebo dalšího průchodu překladače. Podle počtu průchodů dělíme překladače na: [142] => [143] => * [[Jednoprůchodový překladač|jednoprůchodové]] – jsou jednodušší v oblasti překladače a jazyka; mají nižší režii, protože nevzniká mezikód ''(spochybněno. Hm, to bude složitejší)'' [144] => * [[Víceprůchodový překladač|víceprůchodové]] – jsou složitější, ale je jednodušší vznik a údržba překladače, jelikož se skládá ze samostatných částí, které spolu nemusí souviset; požaduje nižší nároky na [[hardware]] při překladu, protože části překladače zodpovědné za jednotlivé průchody mohou být menší a zpracování může proběhnout postupně [145] => [146] => ''Dneska je relativně dost operační paměti, málokdo píše gigabajtové nebo terabajtové zdrojáky (nebo si je nechá generovat), disky mají taky pohyblivé hlavičky a tudíž dokážou číst kde-co, fai(j)lové systémy se jim přizpůsobily a čtou náhodně, občas i bez chyb, málokdo používá klasickou (sekvenční) děrnou pásku nebo (taky sekvenční) magnetickou pásku, proto počítání průchodu a dělení na jednoprůchodové s jejich virtuálními výhodami je mimo mísu.'' [147] => A to jsem vynechal skriptovací jazyky a děrné štítky. [148] => [149] => Některé části překladače, např. statická analýza a s ní související optimalizace, fungují dobře až nejlépe, pokud mají v nějaké formě k dispozici celý program. [150] => [151] => == Příklad překladače == [152] => {{Přesunout na Wikiknihy|část}} [153] => Následující program implementuje jednoduchý [[Jednoprůchodové překladače|jednoprůchodový překladač]] napsaný v jazyce [[C (programovací jazyk)|C]]. Tento překladač kompiluje výrazy definované v infixovém zápisu do [[postfixová notace|postfixové notace]] (reverzní polská notace, zkráceně RNP) a taktéž do [[Jazyk symbolických adres|jazyka symbolických adres]]. Tento překladač používá pro vyhodnocování výrazů [[Rekurzivní funkce (programování)|rekurzivní]] volání funkcí. [154] => [155] => [156] => # include [157] => # include [158] => # include [159] => [160] => # define MODE_POSTFIX 0 [161] => # define MODE_ASSEMBLY 1 [162] => [163] => char lookahead; [164] => int pos; [165] => int compile_mode; [166] => char expression[20+1]; [167] => [168] => void error() { [169] => printf("Syntax error!\n"); [170] => } [171] => [172] => void match( char t ) { [173] => if( lookahead == t ) { [174] => pos++; [175] => lookahead = expression[pos]; [176] => } [177] => else [178] => error(); [179] => } [180] => [181] => void digit() { [182] => switch( lookahead ) { [183] => case '0': [184] => case '1': [185] => case '2': [186] => case '3': [187] => case '4': [188] => case '5': [189] => case '6': [190] => case '7': [191] => case '8': [192] => case '9': [193] => if( compile_mode == MODE_POSTFIX ) [194] => printf("%c", lookahead); [195] => else [196] => printf("\tPUSH %c\n", lookahead); [197] => match( lookahead ); [198] => break; [199] => default: [200] => error(); [201] => break; [202] => } [203] => } [204] => [205] => void term() { [206] => digit(); [207] => while(1) { [208] => switch( lookahead ) { [209] => case '*': [210] => match('*'); [211] => digit(); [212] => printf( "%s", compile_mode == MODE_POSTFIX ? "*" [213] => : "\tPOP B\n\tPOP A\n\tMUL A, B\n\tPUSH A\n"); [214] => break; [215] => case '/': [216] => match('/'); [217] => digit(); [218] => printf( "%s", compile_mode == MODE_POSTFIX ? "/" [219] => : "\tPOP B\n\tPOP A\n\tDIV A, B\n\tPUSH A\n"); [220] => break; [221] => default: [222] => return; [223] => } [224] => } [225] => } [226] => [227] => void expr() { [228] => term(); [229] => while(1) { [230] => switch( lookahead ) { [231] => case '+': [232] => match('+'); [233] => term(); [234] => printf( "%s", compile_mode == MODE_POSTFIX ? "+" [235] => : "\tPOP B\n\tPOP A\n\tADD A, B\n\tPUSH A\n"); [236] => break; [237] => case '-': [238] => match('-'); [239] => term(); [240] => printf( "%s", compile_mode == MODE_POSTFIX ? "-" [241] => : "\tPOP B\n\tPOP A\n\tSUB A, B\n\tPUSH A\n"); [242] => break; [243] => default: [244] => return; [245] => } [246] => } [247] => } [248] => [249] => int main ( int argc, char** argv ) [250] => { [251] => printf("Please enter an infix-notated expression with single digits:\n\n\t"); [252] => scanf("%20s", expression); [253] => printf("\nCompiling to postfix-notated expression:\n\n\t"); [254] => compile_mode = MODE_POSTFIX; [255] => pos = 0; [256] => lookahead = *expression; [257] => expr(); [258] => printf("\n\nCompiling to assembly-notated machine code:\n\n"); [259] => compile_mode = MODE_ASSEMBLY; [260] => pos = 0; [261] => lookahead = *expression; [262] => expr(); [263] => return 0; [264] => } [265] => [266] => [267] => == Nejznámější překladače == [268] => * [[GCC]] (GNU Compiler Collection) [269] => * [[Clang]] [270] => * [[Intel C++ Compiler]] (ICC) [271] => * [[Microsoft Visual Studio]] (přesněji v něm obsažené překladače C++, C♯, Visual Basic atd.) [272] => * [[Glasgow Haskell Compiler]] (GHC) [273] => * [[Turbo Pascal]], následně [[Delphi]] [274] => * [[Borland C++]], následně [[C++Builder]] [275] => * [[Free Pascal]] [276] => * [[Watcom|Watcom C/C++]] [277] => [278] => == Odkazy == [279] => [280] => === Reference === [281] => {{Překlad|jazyk=de|článek=Compiler|revize=42959423|jazyk2=pl|článek2=Kompilator|revize2=14580165}} [282] => [283] => [284] => === Související články === [285] => * [[Interpret (software)]] [286] => * [[Syntaktická analýza]] [287] => * [[Sémantická analýza]] [288] => * [[Typová kontrola]] [289] => * [[Linker]] [290] => * [[Generativní gramatika]] [291] => * [[Generování kódu]] [292] => [293] => === Externí odkazy === [294] => * {{Commonscat}} [295] => * {{Wikislovník|heslo=překladač}} [296] => * [https://web.archive.org/web/20071225165627/http://www.kiv.zcu.cz/~lobaz/fjp/index.html Formální jazyky a překladače] – materiály z cvičení Katedry informatiky a výpočetní techniky Fakulty aplikovaných věd [[Západočeská univerzita v Plzni|Západočeské univerzity v Plzni]] [297] => * [http://www.abclinuxu.cz/clanky/programovani/jazyky-a-prekladace-1-uvod Jazyky a překladače] (seriál na ABCLinuxu) [298] => [299] => {{Proces vývoje softwaru}} [300] => {{Autoritní data}} [301] => [302] => [[Kategorie:Překladače]] [] => )
good wiki

Překladač

More about us

About

Expert Team

Vivamus eget neque lacus. Pellentesque egauris ex.

Award winning agency

Lorem ipsum, dolor sit amet consectetur elitorceat .

10 Year Exp.

Pellen tesque eget, mauris lorem iupsum neque lacus.

You might be interested in

,'C (programovací jazyk)','Optimalizace (informatika)','Syntaktická analýza','Interpret (software)','počítačový program','Sémantická analýza','bajtkód','strojový kód','Lexikální analýza','assembler','GCC','zdrojový kód'