Tworzenie książki (wyłącz)
 Dodaj tę stronę do książki Pokaż książkę (0 stron) Proponowane strony

Kod bajtowy Javy

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, szukaj

Kod bajtowy Javy – lista instrukcji do wykonania przez wirtualną maszynę Javy (JVM). Każdy kod operacji kodu bajtowego ma jeden bajt długości, chociaż niektóre kody operacji wymagają parametrów, co sprawia, że mamy dużo wielobajtowych instrukcji. Nigdy nie użyto wszystkich możliwych 256 kodów operacyjnych.

Spis treści

[edytuj] Związek z językiem Java

Programista języka Java w rzeczywistości nie musi wiedzieć, jak działa kod bajtowy Javy. Jednak w piśmie IBM developerWorks zasugerowano: „Znajomość kodu bajtowego Javy pomaga programiście tak, jak znajomość asemblera pomaga programistom języków C i C++[1].

[edytuj] Instrukcje

Każdy bajt może mieć 256 różnych wartości. Spośród nich w 0x00 przez 0xca, 0xfe, i 0xff są przypisane wartości. 0xba jest nieużywany z powodów historycznych. 0xca jest zarezerwowany jako instrukcja przerwania dla debuggerów i nie jest używany w języku. Podobnie 0xfe i 0xff nie są używane, gdyż zarezerwowane są do wewnętrznego użytku maszyny wirtualnej.

Instrukcje można podzielić na następujące grupy:

Jest też kilka instrukcji służących do bardziej wyspecjalizowanych czynności, np. zwracanie wyjątków, synchronizacja itd.

Duża część instrukcji ma też prefiksy lub sufiksy związane z typami zmiennych, na których pracują. Oto ich lista:

Prefiks/Sufiks Typ zmiennej
i integer
l long
s short
b byte
c character
f float
d double
a reference

Na przykład, ladd dodaje do siebie dwie zmienne typu long, a sadd dwie zmienne typu short. Instrukcje „const”, „load” i „store” mogą ponadto posiadać sufiks wyglądający tak: „_n”, z tym, że w miejscu n podstawiamy liczbę od 0-3 dla instrukcji „load” i „store”. Największe możliwe n dla instrukcji „const” zależne jest od typu, na którym pracuje.

[edytuj] Model obliczeń

Dla przykładu, kod asemblera dla procesora x86 mógłby wyglądać tak:

 add eax, edx
 mov ecx, eax

Ten kod dodaje dwie liczby do siebie, a następnie przenosi je w inne miejsce. Robiący to samo kod bajtowy Javy wyglądałby następująco:

0 iload_1
1 iload_2
2 iadd
3 istore_3

W tym kodzie, dwie wartości które zostaną do siebie dodane umieszczane są na stosie, gdzie są pobierane przez instrukcję która je dodaje i wynik umieszcza na stosie. Instrukcja przechowywania następnie przenosi je do najwyższej wartości na obszarze stosu w lokacji zmiennej. Liczby przed instrukcjami to po prostu przesunięcie każdej instrukcji od początku metody. Metoda nazwana np. „pobierzNazwe()” mogłaby wyglądać tak:

Method java.lang.String pobierzNazwe()
0 aload_0       // Obiekt „this” jest zapisywany w lokacji 0 tabeli zmiennych
1 getfield #5 <Field java.lang.String nazwa>
                // Instrukcja ta pobiera obiekt z wierzchu stosu, zwraca wybrane
                // pole z niego i umieszcza je na stosie.
                // W tym przykładzie, pole o nazwie „nazwa” jest piątym polem klasy
4 areturn       // Zwraca obiekt na szczycie stosu z metody.

[edytuj] Przykład

Przykład kodu w Javie, źródło:

  outer:
  for (int i = 2; i < 1000; i++) {
      for (int j = 2; j < i; j++) {
          if (i % j == 0)
              continue outer;
}
      System.out.println (i);
}

Kompilator Javy generuje następujący kod bajtowy:

  0:   iconst_2
  1:   istore_1
  2:   iload_1
  3:   sipush  1000
  6:   if_icmpge       44
  9:   iconst_2
  10:  istore_2
  11:  iload_2
  12:  iload_1
  13:  if_icmpge       31
  16:  iload_1
  17:  iload_2
  18:  irem
  19:  ifne    25
  22:  goto    38
  25:  iinc    2, 1
  28:  goto    11
  31:  getstatic       #84; //Field java/lang/System.out:Ljava/io/PrintStream;
  34:  iload_1
  35:  invokevirtual   #85; //Method java/io/PrintStream.println:(I)V
  38:  iinc    1, 1
  41:  goto    2
  44:  return

[edytuj] Generowanie kodu

Najczęściej spotykanym językiem tworzący kod bajtowy Javy jest Java. Jest jeden oficjalny kompilator Javy, javac firmy Sun Microsystems, który kompiluje kod źródłowy Javy do kodu bajtowego Javy. Jednakże specyfikacja kodu bajtowego Javy jest ogólnodostępna, co sprawiło, że powstały kompilatory przystosowane do innych języków programowania.

[edytuj] Uruchamianie kodu

Kod bajtowy Javy zaprojektowany został, aby go uruchamiać na wirtualnej maszynie Javy.

Jeżeli przez programistę pożądane jest, aby wygenerować kod maszynowy może użyć aplikacji GCJ z pakietu GNU Compiler Collection.

Information icon.svg Zobacz też: Wirtualna maszyna Javy.

[edytuj] Obsługa języków dynamicznych

JVM obecnie nie ma wbudowanej obsługi języków o dynamicznym systemie typów. Ponieważ istniejący zestaw instrukcji dla JVM jest w statycznym systemie typów, co oznacza, że wywołania metod mają przypisane sygnatury typów sprawdzane podczas kompilacji, bez mechanizmu odraczania sprawdzania do czasu uruchomienia kodu lub wybrania metody wysyłki przez alternatywny typ[2].

JSR 292 Supporting Dynamically Typed Languages on the JavaTM Platform (z ang. Obsługa języków o dynamicznym systemie typów na platformie JavaTM)[3] dodaje nową instrukcję invokedynamic, która umożliwia wywołanie metody opierając się na dynamicznym sprawdzaniu typów (zamiast istniejącej funkcji invokevirtual, która opiera się na statycznym sprawdzaniu typów).

[edytuj] Lista języków kompilowanych do kodu bajtowego Javy

[edytuj] Implementacje istniejących języków

Język Implementacje
Ada JGNAT
AdaMagic
AWK Jawk[4]
C NestedVM, Cibyl, LLJVM, AMPC[5]
Cobol Micro Focus JVM Visual COBOL[6]
Veryant isCobol[7]
ColdFusion Adobe ColdFusion
Railo
Open BlueDragon
Common Lisp Armed Bear Common Lisp[8]
CLforJava
Jatha
Component Pascal Gardens Point Component Pascal
Erlang Erjang[9]
Forth myForth[10]
JavaScript Rhino
LOGO jLogo[11]
XLogo[12]
Lua Kahlua[13]
Luaj[14]
Jill[15]
Oberon-2 Canterbury Oberon-2 for JVM
OCaml OCaml-Java[16]
Pascal Canterbury Pascal for JVM
PHP IBM WebSphere sMash PHP (P8)[17]

Caucho Quercus[18]

Python Jython
Perl6 Perl6
Rexx IBM NetRexx
Ruby JRuby
Scheme Bigloo
Kawa
SISC
JScheme
Tcl Jacl
JTcl[19]

[edytuj] Języki zaprojektowane dla kompilacji do kodu bajtowego Javy


Przypisy

[edytuj] Bibliografia

Źródło „http://pl.wikipedia.org/w/index.php?title=Kod_bajtowy_Javy&oldid=28269171
Osobiste
Przestrzenie nazw

Warianty
Działania
Nawigacja
Dla czytelników
Dla wikipedystów
Narzędzia
Drukuj lub eksportuj
W innych językach

Polecamy: Pozycjonowanie, wózki dziecięce, Kino domowe, Viagra, Kredyty