Interpret (software): Porovnání verzí

Smazaný obsah Přidaný obsah
prohození pořadí odkazů
m typografické úpravy
Řádek 1:
'''Interpret''' je v  [[Informatika|informatice]] speciální [[počítačový program]], který umožňuje přímo vykonávat (interpretovat) zápis jiného programu v  jeho [[Zdrojový kód|zdrojovém kódu]] ve zvoleném [[Programovací jazyk|programovacím jazyce]]. Program proto není nutné převádět do [[Strojový kód|strojového kódu]] cílového [[procesor]]u, jako je tomu v  případě [[překladač]]e. Interpret tak umožňuje [[programování]] kódu, který je snadno přenositelný mezi různými [[Počítačová platforma|počítačovými platformami]]. Interpret je použit též pro [[Shell (programování)|shell]], který vytváří [[příkazový řádek]].
 
Rozdíl mezi interpretem a  kompilátorem můžeme vztáhnout též na programovací jazyky, které podle toho můžeme rozdělit na [[Interpretovaný jazyk|interpretované]] a  [[Kompilovaný jazyk|kompilované]]. Teoreticky je možné pro jakýkoliv programovací jazyk naprogramovat jak interpret, tak kompilátor, avšak interpretované jsou obvykle vyšší programovací jazyky.
 
== Typy interpretů ==
Řádek 8:
# provádějí přímo [[zdrojový kód]]
# přeloží zdrojový kód do efektivnějšího mezikódu, který následně spustí
# přímo spustí předem vytvořený předkompilovaný mezikód<ref>V &nbsp;tomto významu je [[procesor]] také interpretem [[Strojová instrukce|strojových instrukcí]]</ref>, který je produktem části interpretu
 
[[Perl]], [[Python]] nebo [[MATLAB]] jsou interprety 2. &nbsp;typu. [[UCSD Pascal]] a &nbsp;[[Java (programovací jazyk)|Java]] jsou 3. &nbsp;typu (zdrojové kódy jsou kompilovány předem, uloženy ve strojově nezávislém tvaru, který je po spuštění [[Linker|linkován]] a &nbsp;interpretován nebo kompilován v &nbsp;případě použití [[JIT]]). Některé programovací jazyky (například [[Smalltalk]] nebo [[Python]]) mohou kombinovat 2. &nbsp;a &nbsp;3. &nbsp;typ. Příkladem interpretů 1. &nbsp;typu je [[unixový shell]], [[COMMAND.COM]] nebo interprety jazyka [[BASIC]].
 
== Výhody interpretace ==
Interpretace kódu má proti překladu do strojového kódu a &nbsp;přímému spuštění některé výhody:
* ''Rychlost vývoje'' – zejména u &nbsp;větších projektů je při interpretaci rychlejší cyklus ''editace – spuštění – oprava chyb''.
* ''Laditelnost'' – stav interpretu je jednoznačně definován, jeho činnost přesně odpovídá zdrojovému kódu (nebývají použity [[Optimalizace (informatika)|optimalizace]], které mohou původní strukturu kódu zakrýt nebo pozměnit).
* ''Kompatibilita'' – stejný program může být bez problémů spuštěn na mnoha cílových architekturách, jazyk obvykle zakrývá rozdíly mezi různými operačními systémy.
* ''Správa paměti'' – při běhu interpretovaného programu nemusí být proměnné vázány na fyzickou adresu v &nbsp;operační paměti, proto je možné přemapování proměnných, což může zabránit fragmentaci paměti.
* ''Jednoduchost'' – obecně je mnohem snadnější vytvořit interpret jazyka, než kompilátor; interpretace značně zjednodušuje vytváření aplikačních nebo experimentálních jazyků, přičemž jednoduchost vytváření a &nbsp;modifikace interpretů na druhou stranu může vést k &nbsp;problémům s &nbsp;kompatibilitou.
 
== Efektivita ==
Hlavní nevýhodou interpretu je, že v &nbsp;případě, kdy je program interpretován, zpravidla probíhá pomaleji, než když je kompilován. Rozdíl v &nbsp;rychlosti závisí na velikosti programu. Obvykle trvá déle spouštět program přes interpret než spouštět kompilovaný kód, ale může trvat kratší dobu, než je celková doba potřebná ke kompilaci a &nbsp;spuštění. To je důležité zejména při prototypování a &nbsp;testování kódu, při cyklu editace–interpretace–ladění může být často mnohem kratší, než je cyklus editace–kompilace–spuštění–ladění.
 
Interpretovaný kód je pomalejší než běh kompilovaného kódu, protože interpret musí analyzovat každý program při každém spuštění a &nbsp;pak provést požadovanou akci, vzhledem k &nbsp;tomu, že kompilovaný kód právě provádí akci ve stanovené souvislosti určené na základě kompilace. Tato ''run-time'' analýza je známá jako „interpretační režie“. Přístup k &nbsp;proměnné je také pomalejší, protože v &nbsp;interpretu musí být provedeno mapování identifikátorů na paměťová místa opakovaně za běhu (kompilovaný kód přistupuje k &nbsp;proměnným přímo na cílovou adresu bez nutnosti vyhledávání).
 
Existují různé kompromisy mezi rychlostí vývoje při použití interpretu a &nbsp;rychlostí provedení programu při použití kompilátoru. Některé jazyky (např. &nbsp;[[Lisp]]) umožňují interpretovaný a &nbsp;kompilovaný kód volat navzájem a &nbsp;sdílet proměnné. To znamená, že jednou je program testován a &nbsp;odladěn pod interpretem, lze jej kompilovat a &nbsp;tím využívat rychlejšího provedení programu, zatímco je program vyvíjen. Mnohé interprety nebudou vykonávat zdrojový kód tak, jak je napsán, ale převedou si jej do nějaké kompaktnější vnitřní formy. Například některé interprety [[BASIC]]u nahradí [[Klíčové slovo|klíčová slova]] jednobytovým znakem, který lze použít k &nbsp;nalezení instrukce ve skoku v &nbsp;tabulce. Interpret může používat stejný [[Lexikální analýza|lexikální]] a &nbsp;[[Syntaktická analýza|syntaktický]] analyzátor jako kompilátor a &nbsp;pak interpretovat výsledný abstraktní syntaktický strom.
 
== Interpret bytekódu ==
Existuje celé spektrum možností mezi interpretací a &nbsp;kompilací, v &nbsp;závislosti na úrovni analýzy provedené před spuštěním programu. Například [[Emacs]] [[Lisp]] je kompilován do [[bytecode|bytekódu]], který je vysoce komprimovaná a &nbsp;optimalizovaná reprezentace zdrojového kódu v &nbsp;Lispu, ale není to strojový kód (a &nbsp;tedy není vázán na žádný konkrétní hardware). Tento „kompilovaný“ kód je pak interpretován v &nbsp;bytekódu interpreta (sám je napsán v &nbsp;jazyce [[C (programovací jazyk)|C]]). Kompilovaný kód je v &nbsp;tomto případě strojový kód pro [[virtuální stroj]], který není realizován pro hardware, ale jako interpret bytekódu. Stejný přístup se používá ve [[Forth]] kódu používaném systémy Open Firmware: zdrojový jazyk je kompilován do „F &nbsp;kódu“ (bytekód), který je pak interpretován virtuálním strojem.
 
== Interpret abstraktního syntaktického stromu ==
Mimo možnosti interpretace a &nbsp;kompilace lze využít i &nbsp;jiný přístup, a &nbsp;to transformace zdrojového kódu do optimálního abstraktního syntaktického stromu (''abstract syntax tree'' – AST), a &nbsp;následné řízení výkonu programu podle této struktury. V &nbsp;tomto přístupu je třeba analyzovat každou větu pouze jednou. Hlavní výhodu oproti bytekódové interpretaci je, že AST udržuje globální program, strukturu a &nbsp;vztahy mezi instrukcemi (které se v &nbsp;bytekódové reprezentaci ztrácí) a &nbsp;poskytuje kompaktnější reprezentaci.
 
Proto byl navržen AST jako lepší průběžný formát pro ''just-in-time'' kompilátory než bytekód. Rovněž umožňuje provádět lepší analýzu za běhu. Na interpretu [[Java (programovací jazyk)|Javy]] založeném na AST bylo dokázáno, že je rychlejší než obdobné interprety bytekódu, díky této silnější optimalizaci dovoluje mít kompletní strukturu programu, která je k &nbsp;dispozici již v &nbsp;průběhu spuštění.
 
== Kompilace ''just-in-time'' ==
{{Viz též|JIT}}
Další možností, která využívá výhod interpretů, bytekódových interpretů a &nbsp;kompilací, je kompilace [[JIT|''just-in-time'']] (JIT, anglicky ''právě včas''), což je technika, ve které je meziprodukt reprezentace programu kompilován do nativního [[Strojový kód|strojového kódu]] za běhu. To vyrovnává účinnost běhu nativního kódu, vzhledem k &nbsp;nárokům na čas spuštění a &nbsp;paměť, pokud je bytekód nebo AST nejprve kompilován. Adaptivní optimalizace je doplňkovou technikou, ve které interpret profiluje běžící program a &nbsp;sestavuje své nejčastěji kompilované části do nativního kódu. Obě techniky jsou několik desítek let staré, byly uvedeny již v &nbsp;jazyce [[Smalltalk]] (1980).
 
Kompilace ''just-in-time'' získala větší pozornost mezi implementátory jazyků v &nbsp;posledních letech. Například jazyky [[Platforma Java|Java]], [[Python]] a &nbsp;[[.NET|.NET Framework]] nyní všechny obsahují [[JIT]].
 
== Historie ==
Termín „interpret“ měl trochu jiný význam u &nbsp;elektromechanických výpočetních strojů, které se používaly před příchodem elektronických strojů po roce [[1940]]. V &nbsp;té době se prováděly sofistikované výpočty nad velkým množstvím dat (například sčítání lidu v &nbsp;[[Spojené státy americké|USA]] v &nbsp;roce [[1890]]) s &nbsp;pomocí [[Děrný štítek|děrných štítků]], které se ručně předávaly podle naplánovaného procesu mezi různými specializovanými stroji. Převod z &nbsp;děrných štítků do čitelné podoby zajišťovaly například stroje Numerický interpret [[IBM 550]] ({{Vjazyce|en}} {{Cizojazyčně|en|Numeric Interpreter}}, rok [[1930]]) a &nbsp;Znakový interpret [[IBM 557]] ({{Vjazyce|en}} {{Cizojazyčně|en|Alphabetic Interpreter}}, rok [[1954]]).
 
První elektronické počítače (tzv. &nbsp;[[mainframe]]) měly velmi malý výpočetní výkon, málo paměti a &nbsp;velmi jednoduché [[Operační systém|operační systémy]] s &nbsp;[[Dávkové zpracování|dávkovým zpracováním]] úloh, takže bylo nemožné mít v &nbsp;paměti počítače zároveň interpret a &nbsp;prováděný program a &nbsp;využívat [[multitasking]]. Proto se v &nbsp;té době používaly [[Překladač|kompilátory]] a &nbsp;kompilované programovací jazyky, kdy bylo možné v &nbsp;prvním kroku nejprve ze zdrojového kódu vytvořit spustitelný program ve [[Strojový kód|strojovém kódu]] a &nbsp;ten teprve pak samostatně spustit a &nbsp;vykonat. Přesto obsahovaly tyto první počítače interprety [[Skript (program)|skriptovacích]] jazyků, které interpretovaly a &nbsp;řídily zpracování dávkových úloh (například [[Job Control Language]], [[DIGITAL Command Language]]). Vzhledem k &nbsp;výkonu tehdejších počítačů ale byl zápis dávek poměrně obtížný a &nbsp;komplikovaný, protože se kladl důraz na snadnou a &nbsp;rychlou interpretaci zápisu počítačem a &nbsp;ne na pohodlí uživatele.
 
== Reference ==