Compiler vs. interpreter
Před časem se mi dostal do rukou zcela nový výkladový slovník výpočetní techniky, navíc původní tuzemské (přesněji moravské) provenience. Pln toužebného očekávání jsem jím začal listovat, ale již poměrně záhy jsem nestačil vycházet z údivu. Místy jsem dokonce začal pochybovat o tom, zda sním či bdím, a zda jsem ztratil soudnost já, nebo autoři.
Například pod heslem interpreter (česky interpret) jsem se dočetl, že jde o „program, který překládá a spouští programy v interpretovaných jazycích". Naproti tomu pod heslem compiler (česky kompilátor, překladač) jsem se dozvěděl, že "Programovací jazyky jako C++, Pascal, Modula a další jsou navrženy jako kompilátory .....", a pod heslem compile (česky překlad, kompilace) jsem narazil na skutečnou perlu: „Zatímco kompilované příkazy jsou uživatelem zadávány obvykle v textové formě, výsledkem kompilace je soubor obsahující strojové instrukce v nečitelné podobě". Ještě že to autoři alespoň dodatečně trochu zaretušovali tvrzením, že „těmto instrukcím však již rozumí počítač, tedy zkompilovaný soubor lze spustit jako samostatný program".
Nakonec jsem ale přeci jen pochopil, v čem je zakopán pes. V tom, jak autoři chápou proces interpretace zdrojového jazyka - ve výkladu jiného hesla (interpreted language, tj. interpretovaný jazyk) totiž uvádí, že jde o takový jazyk, „jehož zdrojový kód je při každém svém provádění příkaz po příkazu překládán do spustitelného kódu". Při takovémto pohledu na věc se pak nelze divit, co jim vyšlo pod heslem interpreter. Skutečná podstata interpretace je ovšem založena na tom, že tomu tak není.
Pro správné pochopení rozdílu mezi překladem (kompilací) na jedné straně, a interpretací na straně druhé je vhodné začít u otřelého konstatování, že každý počítač je schopen vykonávat právě a pouze své strojové instrukce. Tedy takové strojové instrukce, které tvoří jeho instrukční soubor, navíc specifický nikoli pro počítač jako takový, ale pro použitý procesor (resp. mikroprocesor). Představa, že určitý počítač je schopen vykonávat programy, napsané například v Pascalu, v C, C++ či v jiném programovacím jazyku je pak iluzí, kterou lze vytvořit v zásadě dvěma způsoby: · první spočívá v tom, že zdrojový text ve vyšším programovacím jazyku se jednorázově převede na program, složený výhradně ze strojových instrukcí daného počítače. Takovýto program pak již „žije samostatným životem", je nezávislý na svém zdrojovém tvaru, a může být samostatně spouštěn (a to i opakovaně). Když je pak potřeba vykonat činnosti, kvůli kterým byl původní program ve vyšším programovacím jazyku napsán, je místo něj spuštěn příslušný přeložený program. Tato varianta odpovídá překladu (kompilaci). · druhá varianta spočívá v tom, že zdrojový text se nebude překládat do žádného jiného tvaru, a tudíž ani do takového tvaru, který by bylo možné spustit. Místo toho se počítá s existencí jiného programu (ve spustitelném tvaru, tj. složeného výhradně ze strojových instrukcí), tzv. intrepretu. Když je pak potřeba vykonat činnosti, kvůli kterým byl původní program ve vyšším programovacím jazyku napsán, je ve skutečnosti spuštěn zmíněný interpret - jako vstupní data se mu přitom „předhodí" zdrojový text dotyčného programu ve vyšším programovacím jazyku. Interpret postupně načítá jeho jednotlivé části (příkazy), a okamžitě zajišťuje provedení takových akcí, jaké tyto příkazy reprezentují. Tato varianta odpovídá interpretaci.
Pro ještě názornější vymezení rozdílu mezi interpretací a kompilací by bylo možné použít analogii s jizdou taxíkem. Když do něj nastoupíte, můžete řidiče požádat, aby vás nejprve odvezl např. na Václavské náměstí, pak na Staroměstské náměstí, pak na Vyšehrad apod. Nebo mu můžete postupně říkat, že má jet rovně, pak že má zahnout doleva, pak zase doprava atd. První případ odpovídá svojí logikou interpretaci programu ve vyšším programovacím jazyku, zatímco druhý případ naopak odpovídá kompilaci - v prvním případě specifikujete pouze čeho chcete dosáhnout, a ponecháváte na někom jiném (na interpretu), aby vámi požadované akce realizoval takovým způsobem, jaký považuje za nejvhodnější. Druhý případ pak odpovídá tomu, že si svůj záměr (projet se kolem příslušných pamětihodností) někde předem rozpracujete (přeložíte) do konkrétního itineráře, a pak postupně navigujete vozidlo taxislužby konkrétními ulicemi, uličkami atd.
V případě interpretace tedy nedochází k žádnému překladu, převodu či jiné transformaci, a interpret (interpretující program) ani nepřekládá, ani nespouští programy v interpretovaných jazycích. Místo toho jednotlivé příkazy vyššího programovacího jazyka interpretuje, neboli „vykládá si jejich význam", a podle toho pak zajišťuje provedení toho, co tyto příkazy znamenají. Výhodou je skutečnost, že takovýto postup může být rychlejší, než skutečná transformace (překlad) zdrojového programu do tvaru spustitelného programu. Na druhé straně vytvoření spustitelného programu překladem zdrojového programu je výhodnější v případě, kdy lze očekávat opakované spouštění přeloženého programu - režie na překlad je totiž jednorázová, zatímco režie spojená s interpretací se uplatňuje průběžně, při každém běhu interpretovaného programu.
Zdaleka ne vždy je ale možné vybírat mezi interpretací a kompilací - mít k dispozici obě možnosti je naopak dosti singulární případ, který připadá v úvahu jen u některých specifických programovacích jazyků typu Basicu apod. Většina ostatních jazyků předpokládá a připouští buďto jen kompilaci, nebo naopak jen interpretaci. V tomto smyslu je pak třeba opravit další nešťastný výrok, citovaný v úvodu - o tom, že jazyky Pascal, C++ a Modula jsou navrženy jako kompilátory.