Jakie są zalety kodu bajtowego nad kodem natywnym? [zamknięte]

Wydaje się, że wszystko, co można zrobić z bytecode, można zrobić równie łatwo i znacznie szybciej w kodzie natywnym. Teoretycznie można nawet zachować niezależność od platformy i języka poprzez dystrybucję programów i bibliotek w bajtowym kodzie, a następnie kompilację do kodu natywnego podczas instalacji, zamiast Jitowania go.

Więc ogólnie, kiedy chcesz wykonać bytecode zamiast natywnego?

Author: Jay Conrod, 2008-09-07

8 answers

Hank Shiffman z SGI powiedział (dawno temu, ale to prawda):

Istnieją trzy zalety Javy używanie kodu bajtowego zamiast przechodzenia do kod macierzysty systemu:

  1. Przenośność : każdy rodzaj komputera ma swoją unikalną instrukcję gotowi. Podczas gdy niektóre procesory obejmują instrukcje dla swoich poprzedników, generalnie prawdą jest, że program który działa na jednym komputerze nie będzie działać na innych. Dodaj do usługi dostarczone przez działającego system, który każdy system opisuje w swój własny, niepowtarzalny sposób, a Ty masz problem z kompatybilnością. Ogólnie rzecz biorąc, ty nie można napisać i skompilować programu dla jeden rodzaj systemu i uruchomić go na dowolnym inne bez dużo pracy. Java dostaje wokół tego ograniczenia poprzez wstawienie jego maszyna wirtualna między zastosowanie i realne środowisko (komputer + system operacyjny). Jeśli aplikacja jest kompilowana do Java byte kod i że kod bajtowy jest interpretowany tak samo w każdym środowisku wtedy można napisać JEDEN program, który będzie działać na wszystkich różnych platformy, na których wspierana jest Java. (W każdym razie taka jest teoria. W praktyka jest zawsze mała / align = "left" / programista.)

  2. Bezpieczeństwo : jedną z zalet Javy jest jej integracja z Internetem. Załaduj strona, która używa Javy do twojego przeglądarka i Kod Java jest automatycznie pobierane i wykonywane. Ale co jeśli kod niszczy pliki, czy przez złośliwość czy niechlujstwo ze strony programisty? Java zapobiega wykonywaniu pobranych apletów wszystko destrukcyjne przez zabranianie potencjalnie niebezpieczne operacje. Zanim pozwoli na uruchomienie kodu bada go pod kątem prób obejścia Ochrona. Sprawdza, czy dane są używany konsekwentnie: kod, który manipuluje pozycją danych jako liczbą całkowitą na pewnym etapie, a następnie stara się z niego korzystać jako wskaźnik później zostanie złapany i uniemożliwia wykonuję. (Java język nie pozwala na wskaźnik arytmetyka, więc nie można pisać Javy kod do zrobienia tego, co właśnie opisaliśmy. Jednak nie ma nic do zapobieżenia ktoś od pisania destrukcyjnych bajtów kodowanie za pomocą kodu szesnastkowego edytor, a nawet budowanie bajtów Javy asembler kodu.) Generalnie nie jest możliwość analizy programu kod maszynowy przed wykonaniem i ustal, czy robi cokolwiek źle. Sztuczki jak pisanie samododtwarzający się kod oznacza, że zło operacje mogą nawet nie istnieć, dopóki później. Ale kod bajtowy Javy został zaprojektowany dla tego rodzaju walidacji: to nie ma Instrukcji a złośliwy programista użyłby do ukrycia ich napaść.

  3. Rozmiar: w świecie mikroprocesorów RISC jest na ogół preferowany nad CISC. Lepiej mieć małe zestaw instrukcji i użyj wielu szybko instrukcje wykonywania pracy niż mieć wiele złożonych operacji realizowanych jako pojedyncze instrukcje. Projekty RISC wymagaj mniejszej liczby bramek na chipie, aby wdrożyć ich instrukcje, umożliwiając więcej miejsca na rurociągi i inne techniki wykonania każdej instrukcji szybciej. W Tłumaczu, jednak, to nie ma znaczenia. Jeśli chcesz wdrożenie jednej instrukcji dla polecenie switch ze zmienną długość w zależności od liczby walizek klauzule, nie ma powodu, aby nie robić więc. W rzeczywistości złożony zestaw instrukcji jest zaletą dla sieci język: oznacza to, że ten sam program będzie mniejszy (mniej instrukcje o większej złożoności), co oznacza mniej czasu na przeniesienie w naszej sieci o ograniczonej prędkości.

Biorąc pod uwagę kod bajtowy i natywny, zastanów się, jakie kompromisy chcesz osiągnąć między przenośnością, bezpieczeństwem, rozmiarem i szybkością wykonania. Jeśli prędkość jest jedynym ważnym czynnikiem, przejdź natywny. Jeśli któraś z pozostałych jest ważniejsza, należy użyć kodu bajtowego.

Dodam jeszcze, że utrzymanie serii OS i Kompilacje kierowane na architekturę tego samego kodu dla każdego wydania mogą stać się bardzo żmudne. To ogromna wygrana, aby używać tego samego bajtowego kodu Javy na wielu platformach i mieć go " po prostu działa."

 31
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 04:46:27

Wydajność praktycznie każdego programu poprawi się, jeśli zostanie skompilowany, wykonany z profilowaniem, a wyniki zostaną przekazane z powrotem do kompilatora na drugi przebieg. Ścieżki kodu, które są faktycznie używane, będą bardziej agresywnie zoptymalizowane, pętle rozwijane dokładnie w odpowiednim stopniu, a ścieżki instrukcji ułożone tak, aby zmaksymalizować i$ hits.

Wszystkie dobre rzeczy, ale prawie nigdy nie są robione, ponieważ denerwujące jest przechodzenie przez tak wiele kroków, aby zbudować plik binarny.

To jest zaletą uruchomienia bajtowego kodu przez jakiś czas przed kompilacją go do kodu natywnego: informacje o profilowaniu są automatycznie dostępne. Wynikiem kompilacji Just-In-Time jest wysoce zoptymalizowany kod natywny dla konkretnych danych przetwarzanych przez program.

Możliwość uruchomienia kodu bajtowego umożliwia również bardziej agresywną natywną optymalizację niż statyczny kompilator mógłby bezpiecznie używać. Na przykład, jeśli jeden z argumentów funkcji jest zawsze NULL, cała obsługa tego argumentu może być po prostu pominięty w kodzie natywnym. W prologu funkcji zostanie przeprowadzone krótkie sprawdzenie poprawności argumentów, jeśli ten argument nie jest NULL, maszyna wirtualna przerywa powrót do kodu bajtowego i ponownie rozpocznie profilowanie.

 15
Author: DGentry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 04:56:01

Bytecode tworzy dodatkowy poziom indrection.

Zalety tego dodatkowego poziomu indrection to:

  • niezależność Platformy
  • może utworzyć dowolną liczbę języków programowania (składnię) i zlecić ich kompilację do tego samego bajtowego kodu.
  • może łatwo tworzyć Konwertery cross language
  • x86, x64 i IA64 nie muszą już być kompilowane jako oddzielne pliki binarne. Należy zainstalować tylko odpowiednią maszynę wirtualną.
  • Każdy OS po prostu potrzebuje aby utworzyć Maszynę wirtualną i będzie ona miała wsparcie dla tego samego programu.
  • Just In time compilation pozwala na aktualizację programu poprzez zastąpienie jednego, poprawionego pliku źródłowego. (Bardzo korzystne dla stron internetowych)

Niektóre wady:

  • Wydajność
  • łatwiej dekompilować
 9
Author: Brian R. Bondy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 04:51:28

Wszystkie dobre odpowiedzi, ale mój hot-button został trafiony-wydajność.

Jeśli uruchamiany kod spędza cały swój czas na wywoływaniu procedur bibliotecznych/systemowych - operacje na plikach, operacje na bazach danych, wysyłanie wiadomości windows, To nie ma większego znaczenia, czy jest JITted, ponieważ większość czasu zegara spędza czekając na zakończenie tych operacji niższego poziomu.

Jednakże Jeśli kod zawiera rzeczy, które zwykle nazywamy "algorytmami", które muszą być szybkie i nie wydawać zbyt wiele funkcje wywołujące czas, i jeśli są one używane na tyle często, że stanowią problem z wydajnością, to JIT jest bardzo ważne.

 3
Author: Mike Dunlavey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-06 21:22:27

Myślę, że właśnie odpowiedziałeś na swoje pytanie: niezależność platformy. Niezależny od platformy bajt jest produkowany i dystrybuowany na docelową platformę. Po wykonaniu jest szybko kompilowany do kodu natywnego przed rozpoczęciem wykonywania lub jednocześnie ( Just In Time ). Java JVM i prawdopodobnie środowiska uruchomieniowe. NET działają na tej zasadzie.

 2
Author: Kyle Cronin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 04:38:45

Tutaj: http://slashdot.org/developers/02/01/31/013247.shtml

Idź zobaczyć, co maniacy Slashdot mają do powiedzenia na ten temat! Trochę przestarzałe, ale bardzo dobre komentarze!

 2
Author: Marcio Aguiar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 04:56:24

Najlepiej byłoby mieć Portable bytecode, który kompiluje się w sam raz do kodu natywnego. Myślę, że powodem istnienia interpreterów bytecode bez JIT jest przede wszystkim praktyczny fakt, że kompilacja kodu natywnego zwiększa złożoność maszyny wirtualnej. Zbudowanie, debugowanie i utrzymanie tego dodatkowego komponentu wymaga czasu. Nie każdy ma na to czas i środki.

Drugim czynnikiem jest bezpieczeństwo. O wiele łatwiej jest zweryfikować, że Tłumacz nie ulegnie awarii, niż gwarantujemy to samo dla kodu natywnego.

Trzecia to wydajność. Często generowanie kodu maszynowego może zająć więcej czasu niż interpretowanie kodu bajtowego dla małych fragmentów kodu, które działają tylko raz.

 1
Author: Josh Segall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 04:50:06

Przenośność i niezależność od platformy są prawdopodobnie najbardziej zauważalnymi zaletami kodu bajtowego nad kodem natywnym.

 0
Author: Fiery Phoenix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-24 19:32:01