Jak powiedzieli inni, skompilowane i zinterpretowane są specyficzne dla implementacji języka programowania; są nie właściwe dla danego języka. Na przykład są tłumacze języka C.
Możemy jednak (iw praktyce to robimy) klasyfikować języki programowania na podstawie ich najbardziej powszechnej (czasem kanonicznej) implementacji. Na przykład mówimy, że C jest kompilowane.
Najpierw musimy zdefiniować bez niejasności interpretatorów i kompilatorów:
Interpreter dla języka X to program (lub maszyną, lub po prostu jakiś rodzaj mechanizmu w ogóle), który uruchamia dowolny program p napisany w języku X takie, że spełnia ona efekty i ocenia wyniki, jak zapisano w specyfikacji X .
Kompilator od X do Y to program (lub maszyną, lub po prostu jakiś rodzaj mechanizmu w ogóle), który przekłada dowolny program p od jakiegoś języka X do semantycznie równoważne programu p” w jakimś języku Y w taki sposób, że tłumaczenia p ' tłumacza dla Y, dadzą takie same wyniki i mają te same efekty jak interpretacji p tłumacza dla X .
Zauważ, że z punktu widzenia programisty, procesory są maszynowymi interpreterami dla ich rodzimego języka maszynowego.
Teraz możemy dokonać wstępnej klasyfikacji języków programowania na 3 kategorie w zależności od ich najpopularniejszej implementacji:
- Języki skompilowane: gdy programy są kompilowane w całości do języka maszynowego. Jedynym używanym interpreterem jest procesor. Przykład: Zwykle, aby uruchomić program w C, kod źródłowy jest kompilowany do języka maszynowego, który jest następnie wykonywany przez procesor.
- Języki interpretowane: gdy nie ma kompilacji żadnej części oryginalnego programu do języka maszynowego. Innymi słowy, nie jest generowany żaden nowy kod maszynowy; wykonywany jest tylko istniejący kod maszynowy. Należy również użyć interpretera innego niż CPU (zwykle jest to program) .Przykład: W kanonicznej implementacji Pythona kod źródłowy jest najpierw kompilowany do kodu bajtowego Pythona, a następnie ten kod bajtowy jest wykonywany przez CPython, program interpretujący kod bajtowy Pythona .
- Miękkie języki kompilowane: Kiedy używany jest interpreter inny niż CPU, ale także części oryginalnego programu mogą być skompilowane do języka maszynowego. Tak jest w przypadku Javy, gdzie kod źródłowy jest najpierw kompilowany do kodu bajtowego, a następnie kod bajtowy może być zinterpretowany przez interpreter języka Java i / lub dalej skompilowany przez kompilator JIT.
Czasami miękkie i twarde języki kompilowane są nazywane po prostu kompilowanymi, dlatego mówi się, że C #, Java, C, C ++ są kompilowane.
W ramach tej kategoryzacji JavaScript był językiem interpretowanym, ale było to wiele lat temu. Obecnie jest kompilowany w języku JIT do natywnego języka maszynowego w większości głównych implementacji JavaScript, więc powiedziałbym, że mieści się w miękkich językach kompilowanych.