Jakie jest znaczenie zdania „chcieliśmy go skompilować, aby proces spalania nie działał niewłaściwie”.

10

Czytałem ten artykuł. Ma następujący akapit.

A czy Scala okazała się szybka? Jaka jest twoja definicja postu? Mniej więcej tak szybko jak Java. Nie musi być tak szybki jak C lub montaż. Python nie jest znacznie szybszy niż Ruby. Chcieliśmy zrobić więcej przy mniejszej liczbie maszyn, lepiej wykorzystując współbieżność; chcieliśmy go skompilować, żeby procesor nie spalał niewłaściwych rzeczy.

Szukam znaczenia ostatniego zdania. W jaki sposób interpretowany język sprawi, że procesor zrobi coś „złego”?

użytkownik2434
źródło
3
Wywoływanie wszystkiego, co kompiluje się do interpretowanego kodu bajtowego JVM, jest nieco liberalne przy użyciu.
Przypon

Odpowiedzi:

47

Jeśli kod mówi

A = A + 1

skompilowany kod to robi

add A, 1

interpretuje kod robi to (lub jakieś zmiany)

look up the location of A in the symbol table
find the value of A
see that 1 is a constant
get its value
add the value of A and the value of 1
look up the location of A in the symbol table
store the new value of A

masz pomysł?

Mike Dunlavey
źródło
3
Czasami uproszczeniem naprawdę robi aby obraz jaśniejszy ;-) (tuż za zakończoną: wielu znanych tłumaczy zoptymalizować niektóre z kroków dalej, więc są one w połowie drogi między dwoma próbka „implementacji” tutaj).
Joachim Sauer
3
@JachachSSauer: Masz oczywiście rację. Nadal trudno jest uruchomić interpreter z mniej niż 10-krotną karą za szybkość w porównaniu ze skompilowanym kodem. Jeśli językiem jest ten, który naprawdę spędza cały czas w podrzędnych kompilowanych funkcjach, które i tak trzeba wywoływać, takich jak biblioteki matematyczne lub operacje we / wy, koszt tłumaczenia nie stanowi problemu.
Mike Dunlavey
1
To niesamowity opis
Jamie Taylor,
13

chcieliśmy go skompilować, żeby procesor nie spalał niewłaściwych rzeczy.

Wygląda na to, że odnoszą się do skompilowanego vs. zinterpretowanego. Najprawdopodobniej cała historia przeniesienia zadań przetwarzania tła na Scalę na Twittera (skompilowana) po początkowym opracowaniu w Ruby On Rails (interpretowana).

Wyjaśnienie kodu skompilowanego vs zinterpretowanego tutaj .

W skompilowanym języku wprowadzany kod jest redukowany do zestawu instrukcji specyficznych dla maszyny, zanim zostanie zapisany jako plik wykonywalny. W przypadku języków interpretowanych kod jest zapisywany w tym samym formacie, który wprowadziłeś. Skompilowane programy zwykle działają szybciej niż interpretowane, ponieważ interpretowane programy muszą zostać zredukowane do instrukcji komputera w czasie wykonywania.

KrisG
źródło
Z przyjemnością dam ci swój pierwszy +1. Witamy w P.SE!
haylem
4
(Warto wspomnieć, że Scala - podobnie jak w JVM - jest technicznie skompilowana tylko bajtowo).
haylem
Nie wiedziałem, że Scala jest oparta na JVM. Oznacza to, że prawdopodobnie skompilowano JIT. W takim razie dlaczego Twitter nie przeniósł się z Ruby on Rails do JRuby? Można by pomyśleć, że byłaby to łatwiejsza migracja z korzyścią kompilacji.
KrisG
3
Szukali również lepszego modelu współbieżności i mieli problemy z odśmiecaniem pamięci Ruby. Artykuł szczegółowo to opisuje.
scrwtp
9

„Nieprawidłowe rzeczy” oznaczają tutaj narzut, jaki zajmuje interpreter podczas analizowania i przetwarzania kodu. Jest to związane z pojęciem języków interpretowanych a skompilowanych. Istnieje kilka modeli tłumaczenia kodu, które z grubsza należą do jednej z następujących kategorii:

  • Kompilacja natywna - kod źródłowy jest bezpośrednio kompilowany w kod maszynowy. Najlepsza wydajność kosztem przenośności. Powszechnie kojarzony z C i C ++,
  • Kompilacja pośrednia - kod źródłowy jest kompilowany do uproszczonego języka pośredniego (kod bajtowy), który jest później interpretowany lub kompilowany (kompilacja just-in-time) do kodu maszynowego podczas wykonywania. Lepsza przenośność niż natywny kod, lepsza wydajność niż czysta interpretacja przy jednoczesnym zachowaniu niektórych zalet interpretacji (takich jak późne wiązanie). Przykłady obejmują C #, Java i inne języki kierowane na JVM i .NET CLR,
  • Interpretacja - kod źródłowy nie jest bezpośrednio tłumaczony na kod maszynowy, lecz jest interpretowany i wykonywany przez dedykowany program tłumaczący. Tłumacze różnią się pod względem zaawansowania, w naiwnej implementacji, ale sprowadzają się do analizowania, analizowania i wykonywania kodu źródłowego wiersz po wierszu. Interpretacja zapewnia większą elastyczność niż kompilacja, dlatego języki interpretowane w szerszym zakresie wykorzystują na przykład dynamiczne pisanie lub refleksję. Języki interpretowane są często postrzegane jako zapewniające zwiększoną produktywność programistów, ponieważ wymagają mniej kodu źródłowego i dobrze nadają się do szybkiego prototypowania. Minusem jest zmniejszona wydajność. Powszechnie kojarzony z JavaScript, Ruby lub Python.

Stąd wybór między tłumaczonym a skompilowanym językiem sprowadza się do pytania, co cenimy bardziej, produktywność lub wydajność programisty? Migracja opisana w tym artykule wydaje się podążać w tym samym kierunku, z silnym językiem prototypowym Ruby zastąpionym przez Scala z JVM ze względu na wydajność.

scrwtp
źródło
-1 sposób sformułowania odpowiedzi wydaje się zbyt uproszczony. Całkowicie ignoruje takie rzeczy jak JIT ( kompilacja just-in-time ) - tak przy okazji, gdy Scala działa na JVM / CLR
gnat
Prawdziwe. Ponownie napisałem odpowiedź, ponieważ niewiele dodawała do tematu.
scrwtp
-3

W tym przypadku miałem the wrong stuffna myśli brak bezpieczeństwa typu w niekompilowanym kodzie.

W ten sposób nie tylko kod jest interpretowany wolniej, ale także bardziej błędny ...

Neil Twist
źródło
8
Zakładasz, że skompilowane języki są bezpieczne pod względem typu, a interpretowane nie. Istnieje wiele przeciwnych przykładów. Na przykład lisp można skompilować i nie jest on silnie typowany, podczas gdy Haskell można interpretować i jest BARDZO bezpieczny
Zachary K
1
Utożsamianie „nietypowego” z „większym błędem” jest FUD popierane przez ludzi z produktami do sprzedaży.
user16764
1
@ user16764: To nie jest FUD, jeśli to prawda. IME ludzie popychający bzdury na temat sprzedaży produktów to ci, którzy starają się nie doceniać związku między dynamicznym pisaniem a błędami. („To tylko jeden rodzaj błędu ” itp.)
Mason Wheeler,