Jaka jest różnica między językiem kompilowanym a interpretowanym?
Różnica nie dotyczy języka; jest w trakcie realizacji .
Po usunięciu tego z mojego systemu, oto odpowiedź:
W skompilowanej implementacji oryginalny program jest tłumaczony na natywne instrukcje maszynowe, które są wykonywane bezpośrednio przez sprzęt.
W interpretowanej implementacji oryginalny program jest tłumaczony na coś innego. Inny program, zwany „tłumaczem”, sprawdza następnie „coś innego” i wykonuje wszelkie czynności, o które są proszone. W zależności od języka i jego implementacji istnieje wiele form „czegoś innego”. Od bardziej popularnych do mniej popularnych, może być „coś innego”
Instrukcje binarne dla maszyny wirtualnej, często nazywane kodem bajtowym , jak ma to miejsce w systemach Lua, Python, Ruby, Smalltalk i wielu innych (podejście to zostało spopularyzowane w latach siedemdziesiątych przez UCSD P-system i UCSD Pascal)
Drzewiaste przedstawienie oryginalnego programu, takie jak abstrakcyjne drzewo składni, tak jak ma to miejsce w przypadku wielu interpretatorów prototypów lub edukacyjnych
Tokenizowana reprezentacja programu źródłowego, podobna do Tcl
Znaki programu źródłowego, tak jak zostało to zrobione w MINT i TRAC
Jedyną rzeczą, która komplikuje sprawę, jest możliwość przetłumaczenia (kompilacji) kodu bajtowego na natywne instrukcje maszynowe . Zatem pomyślna zinterpretowana implementacja może ostatecznie otrzymać kompilator. Jeśli kompilator działa dynamicznie, w tle, jest często nazywany kompilatorem just-in-time lub kompilatorem JIT. JIT zostały opracowane dla Java, JavaScript, Lua i śmiem twierdzić, że wiele innych języków. W tym momencie możesz mieć implementację hybrydową, w której część kodu jest interpretowana, a część jest kompilowana.
Java i JavaScript są dość złym przykładem pokazującym tę różnicę
, ponieważ oba są językami interpretowanymi. Java(interpretowana)i C (lub C ++)(skompilowana)mogłaby być lepszym przykładem.Zasadniczo skompilowany kod może być wykonywany bezpośrednio przez procesor komputera. Oznacza to, że kod wykonywalny jest określony w „rodzimym” języku procesora ( język asemblera ).
Jednak kod języków interpretowanych musi być tłumaczony w czasie wykonywania z dowolnego formatu na instrukcje maszynowe procesora. To tłumaczenie jest wykonywane przez tłumacza.
Inaczej mówiąc, w
językachinterpretowanych kod jest tłumaczony na instrukcje maszynowe krok po kroku podczas wykonywania programu, podczas gdy wjęzykachkompilowanych kod został przetłumaczony przed wykonaniem programu.źródło
Oto podstawowa różnica między językiem kompilatora a językiem tłumacza.
Język kompilatora
Język tłumacza:
źródło
Generalnie kompilator czyta kod komputerowy języka wyższego poziomu i konwertuje go na kod p lub natywny kod maszynowy. Interpreter działa bezpośrednio z kodu p lub zinterpretowanego kodu, takiego jak Basic lub Lisp. Zazwyczaj skompilowany kod działa znacznie szybciej, jest bardziej zwarty i zawiera już wszystkie błędy składniowe i wiele niedozwolonych błędów odwołań. Zinterpretowany kod znajduje takie błędy dopiero po podjęciu przez aplikację próby zinterpretowania kodu, którego dotyczy luka. Kod interpretowany jest często dobry dla prostych aplikacji, które będą używane tylko raz lub najwyżej kilka razy, a może nawet do prototypowania. Skompilowany kod jest lepszy w przypadku poważnych aplikacji. Kompilator najpierw pobiera cały program, szuka błędów, kompiluje go, a następnie wykonuje. Natomiast interpreter robi to wiersz po wierszu, więc zajmuje jeden wiersz, sprawdza go pod kątem błędów,
Jeśli potrzebujesz więcej informacji, po prostu wyszukaj w Google „różnicę między kompilatorem a interpreterem”.
źródło
Jest to bardzo niejasne rozróżnienie i zasadniczo nie jest to właściwość samego języka, ale raczej programu, którego używasz do wykonywania kodu w tym języku.
Jednak większość języków jest używana głównie w takiej lub innej formie i tak, Java jest zasadniczo zawsze kompilowana, podczas gdy javascript jest zasadniczo zawsze interpretowana.
Skompilowanie kodu źródłowego oznacza uruchomienie na nim programu, który generuje binarny plik wykonywalny, który po uruchomieniu ma zachowanie zdefiniowane przez źródło. Na przykład javac kompiluje pliki .java w formacie czytelnym dla człowieka do plików .class do odczytu maszynowego.
Aby zinterpretować kod źródłowy, należy uruchomić na nim program, który od razu generuje określone zachowanie, bez generowania pliku pośredniczącego. Na przykład, gdy twoja przeglądarka internetowa ładuje stackoverflow.com, interpretuje kilka skryptów javascript (na które możesz spojrzeć, przeglądając źródło strony) i daje wiele fajnych efektów, jakie mają te strony - na przykład upvoting lub mały powiadamiacz paski na górze.
źródło
Język interpretowany jest wykonywany w czasie wykonywania zgodnie z instrukcjami, takimi jak w skryptach powłoki, a język kompilowany to taki, który jest kompilowany (zmieniany na język asemblera, który CPU może zrozumieć), a następnie wykonywany jak w c ++.
źródło
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:
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.
źródło