Az értelmezett programozási nyelv olyan programozási nyelv , amelynek forráskódja az értelmezési módszerrel fut le [1] . A programozási nyelveket a végrehajtás módja szerint osztályozva [2] az értelmezett nyelvek csoportjába tartoznak azok a nyelvek, amelyeken a programutasítások egymás után külön-külön lefordítva és azonnal végrehajtva (értelmezve) [3] speciális tolmácsprogrammal (ami ellentétes [1] a lefordított nyelvekkel , amelyekben minden programutasítás előzetesen tárgykódba van lefordítva [3] ). Egy ilyen nyelv olyan konstrukciókat valósíthat meg, amelyek lehetővé teszik a futás közbeni dinamikus változtatásokat (a meglévők módosítását vagy új szubrutinok létrehozását). Ezek a konstrukciók megnehezítik a fordítást és a lefordított nyelvre való fordítást [1] .
Általában bármilyen nyelv összeállítható és értelmezhető. Korlátozó esetben egy ilyen nyelv csak tolmácsok segítségével valósítható meg [4] . Léteznek még értelmező nyelv ("interpretative") [4] , értelmezhető nyelv ("interpretable"), értelmezett nyelv ("interpretable") elnevezések [5] .
Számos nyelv esetében azonban teljesítménybeli különbség van a lefordított és az értelmezett megvalósítások között.
Számos nyelv, köztük a BASIC , C , Lisp , Pascal és Python mindkét implementációval rendelkezik. A Java JIT fordítást használ a natív kód generálására, bár kezdetben értelmezett formára fordítják. A Microsoft .NET-keretrendszer nyelvei Common Intermediate Language (CIL) nyelvre vannak fordítva , amely futás közben natív kódra van fordítva. A Lisp legtöbb megvalósítása lehetővé teszi a kétféle kód keverését.
A programozás korai napjaiban a nyelveket nagymértékben befolyásolta a végrehajtás módja. Például a lefordított nyelvek megkövetelték, hogy egy változó adattípusát a deklaráláskor vagy az első használatkor meg kell adni. Míg az értelmezett nyelvek dinamikus jellegüknél fogva lehetővé tették ennek a követelménynek a feladását, ami nagyobb rugalmasságot és felgyorsult fejlődést eredményezett.
Kezdetben az értelmezett nyelveket soronként konvertálták gépi kódokká, vagyis minden logikai sort közvetlenül a végrehajtás előtt fordítottak le. Ennek eredményeként a ciklustörzsbe zárt és többször végrehajtott utasításokat ugyanannyiszor dolgozta fel a fordító. Jelenleg az ilyen hatások ritkák. A legtöbb tolmácsolt nyelvet előre lefordítják köztes reprezentációvá. Ez egy bájtkód vagy szálas kód . Ez az alacsonyabb szintű kód kis töredékeinek meghívására szolgáló utasításkészlet, amely több assembler utasítással vagy virtuális gép utasítással egyenértékű . Ezt a kódot már végrehajtja egy tolmács vagy egy virtuális gép. Például egy ilyen sémát a Java , a Python és a Ruby használ ( absztrakt szintaxisfa formájában kódreprezentációt használ ).
A köztes kód létrehozható a teljes projekt explicit fordításával (Java), vagy implicit fordítással minden alkalommal, amikor a program elindul (Perl, Ruby), és amikor a forráskód megváltozik (Python).
Számos olyan szolgáltatás létezik, amelyeket sokkal könnyebb megvalósítani egy tolmácsban, mint egy fordítóprogramban:
Ráadásul a programozás elvei és stílusa gyakran nem igényli a programot alakító speciális konstrukciók (manifestek, osztályok, adattípusok) létrehozását és leírását. Ez lehetővé teszi a kód növekményes fejlesztését és tesztelését, ami hasznos mind a kis programok írásához, mind az összetett rendszerek elszigetelt moduljainak fejlesztéséhez. Sokoldalúságuk miatt kényelmesen használhatók szkriptnyelvként .
A fordítási lépés kiiktatása lehetővé teszi a programok gyorsabb fejlesztését, így összetett egyszeri programok írásakor (például egyszeri számítás elvégzéséhez) értelmezett nyelveket használnak.
A fő hátrány a [1] [6] [7] program lassabb végrehajtása a gépi kódra előre lefordított program végrehajtásához képest . Például a PHP és a Python több mint 100-szor lassabb lehet, mint a C++ [8] . A bájtkódra fordítás és a JIT fordítás nem oldja meg teljesen ezt a problémát. Egy további értelmező vagy virtuális gép réteg lelassítja a program végrehajtását, és több erőforrást igényelhet. Futás közben az interpretert mindig be kell tölteni a memóriába (amelyek lehetnek nagy programok is, például böngésző JS-hez vagy Office for VBA) [6] . A megjegyzések csökkenthetik a teljesítményt, és ennek megkerülésére a kód két verziója készül – használatra készen (a megjegyzések eltávolításával) és fejlesztésre kerül [9] .
Ennek eredményeként átlagosan az értelmezett kódot alaposabban kell tesztelni, mint a lefordított kódot, szigorúbban kell betartani a kódolási konvenciókat, és további kódminőség-elemzőket kell használni. Az utolsó hátrány nem túl hangsúlyos, mivel a lefordított nyelvek komoly fejlesztéséhez ezeknek az eszközöknek a használata is szükséges.