…:::Akcja Rekrutacja:::… Machine Code vs Byte Code

Wstęp

Kluczowym w procesie pisania programów w Javie jest zrozumienie pojęć stojących za takimi hasłami jak kompilacja, interpretowanie kodu, czy Just-In-Time compiler (JIT) albo Wirtualna Maszyna Javy(JVM). Dlaczego to ważne? No np. dlatego, że rzadko kiedy piszemy w Javie nie używając absolutnie żadnych frameworków. Nie chcę tutaj rozpętywać żadnej wojny i mówić co o tym myślę, bo chociaż osobiście nie jestem fanem Springa, SpringBoota, czy innych pochodnych frameworków, to jednak bądźmy szczerzy… Jeżeli mamy mało czasu, a potrzebny jest prosty restowy crudzik do opierdzielenia, to niech pierwszy rzuci kamieniem ten kto nie sięgnie po SpringBoota i nie napisze tego kodu w xmlu zaciągając odpowiednie zależności… No więc te frameworki potrafią modyfikować kod bajtowy na podstawie własnych instrukcji umieszczonych w samym frameworku. Właśnie dzięki temu użycie jednej magicznej adnotacji potrafi wygenerować cały zestaw klas, które w innym przypadku musielibyśmy sami napisać. Dzisiaj na tapet weźmiemy kod bajtowy oraz maszynowy. Dlatego warto zapamiętać, że:

Rezultatem kompilowania kodu w Javie jest kod bajtowy (byte code).

Rezultatem interpretowania kodu bajtowego jest kod maszynowy (machine code).

Najprościej te różnice wyjaśnić na podstawie poniższego diagramu:

Difference between Byte Code and Machine Code

źródło: https://www.geeksforgeeks.org/difference-between-byte-code-and-machine-code/

Warto również tutaj podkreślić, że samo używanie kodu bajtowego wynika z podejścia twórców języka do tworzenia aplikacji w Javie w taki sposób, żeby były wieloplatformowe. Kod bajtowy jest językiem uniwersalnym. Weźmy np. język C++, gdzie tego typu podejście nie jest stosowane. Tam proces kompilacji sprowadza się do:

Program w C++  — [Kompilacja] —> Kod Maszynowy

Byte Code

Kod bajtowy (intermediate-level code) [*.class] to niezależny od platformy zestaw instrukcji wygenerowanych w procesie kompilacji z kodu źródłowego [np. *.java] języków jvmowych, czyli niekoniecznie musi być to Java, dla Wirtualnej Maszyny Java. To zestaw makro instrukcji w formacie hexadecymalnym, które nie będą w bezpośredni sposób zrozumiałe dla CPU. Klientem końcowym dla kodu bajtowego musi być JVM.

Machine Code

Kod maszynowy (low-level code) to zestaw instrukcji w formacie binarnym procesowanych przez CPU (nie JVM) zależny od platformy.

Co dalej?

Jeżeli ciekawi Was bardziej jak wygląda zawartość pliku .class (wynik kompilacji) to odsyłam do świetnego materiału przygotowanego przez Tobiasza:

Linki:

  • https://www.geeksforgeeks.org/difference-between-byte-code-and-machine-code/
  • Specyfikacja JVM
  • https://ichi.pro/pl/wprowadzenie-do-kodu-bajtowego-java-ktorego-nie-znasz-37818474908344

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *