Interpret (software)
Z Wikipedie, otevřené encyklopedie
Interpret je počítačový program, který vykonává instrukce zapsané v programovacím jazyce. Zpracováním zdrojového kódu programu tak dochází přímo k jeho vykonávání, což interpret odlišuje od překladače (kompilátoru), který zdrojový kód programu nejprve přeloží do strojového kódu cílového procesoru a teprve pak je možné program spustit a vykonat.
Rozdíl mezi interpretem a kompilátorem můžeme vztáhnout též na programovací jazyky, které dělíme na interpretované a kompilované. Vyšší programovací jazyky díky vyšší míře abstrakce mohou být jak interpretovány, tak kompilovány a nejsou tedy závislé na použití interpretu či kompilátoru.
Obsah |
[editovat] Typy interpretů
Interprety se mohou chovat 3 různými způsoby podle toho, jak zpracovává zdrojový kód programu:
- provádí 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[1], který je produktem části interpretu
Perl, Python nebo třeba MATLAB jsou příklady 2. typu. UCSD Pascal a Java jsou 3. typu, kde jsou zdrojové kódy kompilovány předem, uloženy ve strojově nezávislém tvaru, který je po spuštění linkován a interpretován (nebo kompilován v případě použití JIT). Některé programovací jazyky (například Smalltalk nebo Python) mohou kombinovat 2. a 3. typ.
[editovat] Efektivita
Hlavní nevýhodou interpretu je, že v případě kdy je program interpretován, zpravidla probíhá pomaleji než když je kompilován. Rozdíl v rychlosti může být menší či větší (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ž celkové doba potřebná ke kompilaci a spuštění. To je důležité zejména při prototypování a 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 pak provést požadovanou akci, vzhledem k 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 proměnné je také pomalejší, protože v interpretu musí být provedeno mapování identifikátorů na paměťová místa opakovaně za běhu (kompilovaný kód přistupuje k 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 rychlosti provedení programu při použití kompilátoru. Některé jazyky (např. LISP) umožňují interpretovaný a kompilovaný kód volat navzájem a sdílet proměnné. To znamená, že jednou je program testován a odladěn pod interpretem, lze jej kompilovat a tím využívat rychlejšího provedení programu, mezitím co 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é větší kompaktní vnitřní formy. Například některé interprety BASICu nahradí klíčová slova s jedno bytovým znakem, které lze použít k nalezení instrukce ve skoku v tabulce. Interpret, může používat stejný lexikální a syntaktický analyzátor jako kompilátor a pak interpretovat výsledný abstraktní syntaktický strom.
[editovat] Interpret Bytekódu
Existuje celé spektrum možností mezi interpretací a kompilací, v závislosti na výši analýzy provedené před spuštěním programu. Například Emacs Lisp je kompilován do bytekódu, který je vysoce komprimovaná a optimalizovaná reprezentace zdrojového kódu v Lispu, ale není to strojový kód (a tedy není vázán na žádný konkrétní hardware). Tento „kompilovaný“ kód je pak interpretován v bytekódu interpreta (sám napsán v jazyce C). Kompilovaný kód je v tomto případě strojový kód pro virtuální stroj, který není realizován pro hardware, ale jako bytekód interpret. Stejný přístup se používá ve Forth kódu používaném Open Firmware systémy: zdrojový jazyk je kompilován do „F kódu“ (bytekód), který je pak interpretován virtuálním strojem.
[editovat] Interpret abstraktního syntaktického stromu
Mimo možnosti interpretace a kompilace, lze využít i jiný přístup a to transformace zdrojového kódu do optimálního abstraktního syntaktického stromu (Abstract Syntax Tree - AST), a následné řízení výkonu programu podle této struktury. V tomto přístupu je třeba analyzovat každou větu pouze jednou. Hlavní výhodu oproti bytekód interpretaci je, že AST udržuje globální program, strukturu a vztahy mezi instrukcemi (která se ztratila v bytekód reprezentaci), a poskytuje více kompaktní 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 během běhu. Na Java interpretu 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 dispozici již v průběhu spuštění.
[editovat] Just-in-time kompilace
- Podrobnější informace naleznete v článku JIT.
Další možností, která využívá výhod interpretů, byte-kód interpretů a kompilací je just-in-time kompilace (nebo JIT = právě v čas), což je technika, ve které je meziprodukt reprezentace programu kompilován do nativního strojového kódu za běhu. To vyrovnává účinnost běhu nativního kódu, vzhledem k nárokům na čas spuštění a paměť, pokud je bytekód nebo AST nejprve kompilován. Adaptivní optimalizace je doplňkovou technikou, ve které interpret profiluje běžící program a sestavuje své nejčastěji kompilované části do nativního kódu. Obě techniky jsou několik desítek let staré, jsou uvedeny v jazyce, jako je Smalltalk (1980).
Just-in-time kompilaci získala větší pozornosti mezi implementátory jazyků v posledních letech, s jazyky Java, Python a .NET Framework nyní všechny obsahují JIT.
[editovat] Historie
Termín „interpret“ měl trochu jiný význam u elektromechanických výpočetních strojů, které se používaly před příchodem elektronických strojů po roce 1940. V té době se prováděly sofistikované výpočty nad velkým množstvím dat (například sčítání lidu v USA v roce 1890) s pomocí 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 děrných štítků do čitelné podoby zajišťovaly například stroje Numerický interpret IBM 550 (anglicky Numeric Interpreter, rok 1930) a Znakový interpret IBM 557 (anglicky Alphabetic Interpreter, rok 1954).
První elektronické počítače (tzv. mainframe) měly velmi malý výpočetní výkon, málo paměti a velmi jednoduché operační systémy s dávkovým zpracováním úloh, takže bylo nemožné mít v paměti počítače zároveň interpret a prováděný program a využívat multitasking. Proto se v té době používaly kompilátory a kompilované programovací jazyky, kdy bylo možné v prvním kroku nejprve ze zdrojového kódu vytvořit spustitelný program ve strojovém kódu a ten teprve pak samostatně spustit a vykonat. Přesto obsahovaly tyto první počítače interprety skriptovacích jazyků, které interpretovaly a řídily zpracování dávkových úloh (například Job Control Language, DIGITAL Command Language). Vzhledem k výkonu tehdejších počítačů ale byl zápis dávek poměrně obtížný a komplikovaný, protože se kladl důraz na snadnou a rychlou interpretaci zápisu počítačem a ne na pohodlí uživatele.
[editovat] Reference
- ↑ V tomto významu je procesor také interpretem strojových instrukcí

