Jaka jest różnica między językiem kompilowanym a interpretowanym?

118

Po przeczytaniu materiału na ten temat nadal nie jestem pewien, jaka jest różnica między językiem kompilowanym a językiem interpretowanym. Powiedziano mi, że jest to jedna z różnic między Javą a JavaScriptem. Czy ktoś mógłby mi pomóc w zrozumieniu tego?

SIr Codealot
źródło

Odpowiedzi:

165

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.

Norman Ramsey
źródło
7
Proszę pana, mam następujące pytania 1. W jakim języku jest napisane to „coś innego”? 2. A w kontekście JavaScript, czy to „coś innego” różni się w zależności od przeglądarki? 3. Powiedzmy, że mój skrypt działa w Google Chrome i Internet Explorerze, czy jest interpretowany tak samo w obu przeglądarkach?
JavaHopper
@Norman to było niesamowite wyjaśnienie. Jest jednak kilka niejasności, które nadal mam. W skompilowanej implementacji oryginalny program jest konwertowany na natywne instrukcje maszynowe. Dlaczego? Pomyślałem na przykład, że C po kompilacji wyprodukuje kod asemblera, który i tak musi zostać złożony przez natywny asembler do kodu maszynowego maszyny. Czym więc różni się to od maszyny wirtualnej (python lub JVM itp.), Która robi to samo w przypadku języka interpretowanego?
qre0ct
58

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.

Dlaczego tekst przekreślony? Jak ta odpowiedź słusznie wskazuje, interpretować / zestawiane jest o konkretnej implementacji języka, nie o języku per se . Chociaż stwierdzenia takie jak „C jest językiem kompilowanym” są generalnie prawdziwe, nic nie stoi na przeszkodzie, aby ktoś napisał do tłumacza języka C. W rzeczywistości tłumacze języka C istnieją .

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ęzykach interpretowanych kod jest tłumaczony na instrukcje maszynowe krok po kroku podczas wykonywania programu, podczas gdy w językach kompilowanych kod został przetłumaczony przed wykonaniem programu.

stakx - już nie wnoszący wkładu
źródło
8
Java jest interpretowana? Z Wikipedii: „Aplikacje Java są zwykle kompilowane do kodu bajtowego (pliku klasy), który można uruchomić na dowolnej wirtualnej maszynie języka Java (JVM) niezależnie od architektury komputera”.
Personman
6
@Personman, który jest nadal technicznie „interpretowany” jako JVM wykonuje kod, a nie sam system operacyjny. To już naprawdę różnica semantyczna, ponieważ można powiedzieć, że złożoność współczesnych systemów operacyjnych sprawia, że ​​różnica w zasadzie nie ma znaczenia w większości sytuacji. Mówisz o różnicy między systemem operacyjnym, na którym działa aplikacja, a systemem operacyjnym, na którym działa aplikacja, na której działa kod.
GrayWizardx
5
Przypuszczam, że masz na myśli, że same pliki klas są interpretowane przez maszynę wirtualną Java. To całkiem rozsądne, ale źródło java tak naprawdę jest skompilowane do kodu bajtowego maszyny wirtualnej Java. Można zbudować fizyczną maszynę Java, która nie wymagałaby, aby maszyna wirtualna zinterpretowała ją na kod maszynowy innej architektury. Dlatego dokładniejsze wydaje się stwierdzenie, że Java jest kompilowana. Jest to jednak dobry przykład sposobu, w jaki to rozróżnienie jest zagmatwane i w pewnym sensie arbitralne. W końcu skompilowane C jest interpretowane przez procesor, prawda?
Personman
13
Java jest dość złym przykładem języka skompilowanego lub interpretowanego, ponieważ zasadniczo jest jednym i drugim. Gdybym miał dokonać porównania, poszedłbym z C i Lispem, aby uniknąć nieporozumień.
Bill the Lizard
7
@stakx - w rzeczywistości kody bajtowe Javy są zwykle kompilowane do kodu natywnego również przez kompilator JIT. Jedynym sposobem uzyskania czystego zachowania interpretera jest jawne wyłączenie kompilatora JIT podczas uruchamiania maszyny JVM.
Stephen C
15

Oto podstawowa różnica między językiem kompilatora a językiem tłumacza.

Język kompilatora

  • Pobiera cały program jako pojedyncze wejście i konwertuje go na kod obiektowy, który jest przechowywany w pliku.
  • Generowany jest kod obiektu pośredniego
  • np .: C, C ++
  • Skompilowane programy działają szybciej, ponieważ kompilacja jest wykonywana przed wykonaniem.
  • Wymagania dotyczące pamięci są bardziej związane z tworzeniem kodu wynikowego.
  • Błędy są wyświetlane po skompilowaniu całego programu
  • Kod źródłowy --- Kompilator --- Kod maszynowy --- Wyjście

Język tłumacza:

  • Przyjmuje pojedynczą instrukcję jako pojedyncze wejście i wykonuje instrukcje.
  • Kod obiektu pośredniego NIE jest generowany
  • np .: Perl, Python, Matlab
  • Zinterpretowane programy działają wolniej, ponieważ kompilacja i wykonywanie odbywają się jednocześnie.
  • Wymagania pamięci są mniejsze.
  • Błędy są wyświetlane dla każdej instrukcji.
  • Kod źródłowy --- Interpreter --- Wyjście
PGOEL
źródło
5

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”.

Salil
źródło
3
Umm, nie jestem pewien, skąd masz coś takiego poza pierwszymi dwoma stwierdzeniami. Było to technicznie prawdziwe kilka pokoleń temu z wieloma interpretowanymi językami, ale w zależności od platformy i dbałości o szczegóły możliwe jest zinterpretowanie kodu, który działa blisko lub równie dobrze skompilowany kod dla niektórych działań.
GrayWizardx
Mając na uwadze, że języki takie jak Java, C # i JavaScript, które dziś niemal zalewają cały świat programowania, niesprawiedliwe będzie stwierdzenie, że „skompilowany kod jest lepszy w przypadku poważnych aplikacji”.
Sisir
2

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.

Personman
źródło
Podczas gdy Java najpierw tłumaczy się na kod bajtowy i dopiero podczas wykonywania JVM konwertuje go na kod maszynowy; czy słuszne jest twierdzenie, że jest on kompilowany, a nie interpretowany?
Sisir
1
Myślę, że można powiedzieć, że kod bajtowy Javy jest interpretowany, jasne, ale nikt nie pisze kodu bajtowego Javy. Sama Java jest zwykle kompilowana do kodu bajtowego.
Personman
2

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 ++.

Praveen Kishor
źródło
0

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.

MrIo
źródło