Interpretovaný programovací jazyk je programovací jazyk, jehož zdrojový kód je prováděn interpretační metodou [1] . Třídění programovacích jazyků podle způsobu provádění [2] , skupina interpretovaných jazyků zahrnuje jazyky, ve kterých jsou programové příkazy jedna po druhé samostatně překládány a okamžitě prováděny (interpretovány) [3] pomocí speciálního interpretačního programu . (což je protiklad [1] ke kompilovaným jazykům , ve kterých jsou všechny příkazy programu předem přeloženy do objektového kódu [3] ). Takový jazyk může implementovat konstrukce, které umožňují dynamické změny za běhu (úpravy stávajících nebo vytváření nových podprogramů). Tyto konstrukce znesnadňují kompilaci a překlad do kompilovaného jazyka [1] .
Obecně lze sestavit a interpretovat jakýkoli jazyk. V limitujícím případě lze takový jazyk implementovat pouze s pomocí tlumočníků [4] . Existují také názvy interpretační jazyk („interpretační“) [4] , interpretovatelný jazyk („interpretovatelný“), interpretovaný jazyk („interpretovatelný“) [5] .
U mnoha jazyků však existuje rozdíl ve výkonu mezi zkompilovanými a interpretovanými implementacemi.
Velké množství jazyků, včetně BASIC , C , Lisp , Pascal a Python , má obě implementace. Java používá kompilaci JIT ke generování nativního kódu, i když je zpočátku přeložena do interpretované podoby. Jazyky Microsoft .NET Framework jsou kompilovány do Common Intermediate Language (CIL) , který je za běhu kompilován do nativního kódu. Většina implementací Lisp vám umožňuje kombinovat oba druhy kódu.
V počátcích programování byly jazyky silně ovlivněny způsobem, jakým byly provedeny. Kompilované jazyky například vyžadovaly, aby byl datový typ proměnné specifikován v době, kdy byla deklarována nebo poprvé použita. Zatímco tlumočené jazyky svou dynamickou povahou umožnily tento požadavek opustit, což poskytlo větší flexibilitu a urychlil vývoj.
Zpočátku byly interpretované jazyky převedeny na strojový kód řádek po řádku, to znamená, že každý logický řádek byl zkompilován těsně před spuštěním. Výsledkem je, že každá instrukce uzavřená v těle smyčky a provedená několikrát byla kompilátorem zpracována stejně mnohokrát. V současnosti jsou takové účinky vzácné. Většina interpretovaných jazyků je předem přeložena do střední reprezentace. Jedná se o bajtový kód nebo vláknový kód . Toto je sada instrukcí pro volání malých fragmentů kódu nižší úrovně, ekvivalentní několika instrukcím assembleru nebo instrukcím virtuálního stroje . Tento kód je již spuštěn interpretem nebo virtuálním strojem. Takové schéma používají například Java , Python a Ruby (používá reprezentaci kódu ve formě abstraktního stromu syntaxe ).
Mezilehlý kód lze vytvořit buď explicitním zkompilováním celého projektu (Java), nebo implicitním překladem pokaždé před spuštěním programu (Perl, Ruby) a při změně zdrojového kódu (Python).
Existuje řada funkcí, které je mnohem snazší implementovat v interpretu než v kompilátoru:
Principy a styl programování navíc často nevyžadují vytváření a popis speciálních konstrukcí, které program formují (manifesty, třídy, datové typy). To vám umožňuje vyvíjet a testovat kód postupně, což je užitečné jak pro psaní malých programů, tak pro vývoj izolovaných modulů pro složité systémy. Díky své všestrannosti je lze pohodlně používat jako skriptovací jazyky .
Eliminace kroku kompilace umožňuje rychlejší vývoj programů, proto se při psaní složitých jednorázových programů (například k provedení jednorázového výpočtu) používají interpretované jazyky.
Hlavní nevýhodou je pomalejší provádění programu [1] [6] [7] ve srovnání s prováděním programu předkompilovaného do strojového kódu . Například PHP a Python mohou být více než 100krát pomalejší než C++ [8] . Překlad do bajtkódu a kompilace JIT tento problém zcela nevyřeší. Další vrstva tlumočníka nebo virtuálního stroje zpomaluje provádění programu a může vyžadovat více prostředků. Za běhu musí být interpret vždy načten do paměti (což mohou být velké programy, jako je prohlížeč pro JS nebo Office pro VBA) [6] . Komentáře mohou snižovat výkon, a aby se tomu zabránilo, jsou vytvořeny dvě verze kódu – připravené k použití (s odstraněnými komentáři) a vyvinuté [9] .
Výsledkem je, že v průměru by měl být interpretovaný kód testován důkladněji než kompilovaný kód, přísnější dodržování konvencí kódování a měly by být použity další analyzátory kvality kódu. Poslední nevýhoda není příliš výrazná, protože seriózní vývoj v kompilovaných jazycích také vyžaduje použití těchto nástrojů.