Java-Bytecode.tex 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. %!TEX root = Programmierparadigmen.tex
  2. \chapter{Java Bytecode}
  3. \index{Java Bytecode|(}
  4. \begin{definition}[Bytecode]\xindex{Bytecode}%
  5. Der Bytecode ist eine Sammlung von Befehlen für eine virtuelle Maschine.
  6. \end{definition}
  7. Bytecode ist unabhängig von realer Hardware.
  8. \begin{definition}[Heap]\xindex{Heap}\xindex{Speicher!dynamischer}%
  9. Der dynamische Speicher, auch Heap genannt, ist ein Speicherbereich, aus dem
  10. zur Laufzeit eines Programms zusammenhängende Speicherabschnitte angefordert
  11. und in beliebiger Reihenfolge wieder freigegeben werden können.
  12. \end{definition}
  13. \textit{Activation Record} ist ein \textit{Stackframe}.\index{Activation Record|see{Stackframe}}
  14. \section{Instruktionen}\xindex{imul@\texttt{imul}}\xindex{iadd@\texttt{iadd}}\xindex{fadd@\texttt{fadd}}\xindex{iaload@\texttt{iaload}}\xindex{faload@\texttt{faload}}\xindex{iastore@\texttt{iastore}}\xindex{fastore@\texttt{fastore}}\xindex{iconst\_<i>@\texttt{iconst\_<i>}}\xindex{fconst\_<f>@\texttt{fconst\_<f>}}\xindex{idiv@\texttt{idiv}}\xindex{fdiv@\texttt{fdiv}}\xindex{imul@\texttt{imul}}%
  15. \begin{table}[h]
  16. \begin{tabular}{p{6cm}|ll}
  17. \textbf{Beschreibung} & \textbf{int} & \textbf{float} \\ \hline
  18. Addition & iadd & fadd \\
  19. Element aus Array auf Stack packen & iaload & faload \\
  20. Element aus Stack in Array speichern & iastore & fastore \\
  21. Konstante auf Stack legen & iconst\_<i> & fconst\_<f> \\
  22. Divide second-from top by top & idiv & fdiv \\
  23. Multipliziere die obersten beiden Zahlen des Stacks & imul & fmul \\
  24. \end{tabular}
  25. \end{table}
  26. Weitere:\xindex{iload\_0@\texttt{iload\_0}}%
  27. \begin{itemize}
  28. \item \texttt{iload\_0}: Läd die lokale Variable 0 auf den Stack.
  29. \item \texttt{iload\_1}: Läd die lokale Variable 1 auf den Stack.
  30. \item \texttt{iload\_2}: Läd die lokale Variable 2 auf den Stack.
  31. \item \texttt{iload\_3}: Läd die lokale Variable 3 auf den Stack.
  32. \end{itemize}
  33. \subsection{if-Abfragen}\xindex{if\_icmp<comperator>@\texttt{if\_icmp<comperator>}}%
  34. Im Java-Bytecode gibt es einige verschiedene if-Abfragen. Diese sind immer nach
  35. dem Schema \texttt{<if> <label>} aufgebaut. Wenn also \texttt{<if>} wahr ist,
  36. wird zu \texttt{<label>} gesprungen.
  37. Im Folgenden sei $a$ tiefer im Stack als $b$. Die Operation \texttt{push(a)} wurde also
  38. vor \texttt{push(b)} durchgeführt.
  39. Eine Gruppe von if-Abfragen hat folgendes Schema:
  40. \begin{center}
  41. \texttt{if\_icmp<comperator> <label>}
  42. \end{center}
  43. Dabei steht das erste \texttt{i} für \enquote{integer} und \texttt{cmp} für
  44. \enquote{compare}. \texttt{<comperator>} kann folgende Werte annehmen:
  45. \xindex{eq@\texttt{eq}}\xindex{ge@\texttt{ge}}\xindex{gt@\texttt{gt}}\xindex{le@\texttt{le}}
  46. \xindex{lt@\texttt{lt}}\xindex{ne@\texttt{ne}}%
  47. \begin{itemize}
  48. \item \texttt{eq}: equal -- $a == b$
  49. \item \texttt{ge}: greater equal -- $a \ge b$
  50. \item \texttt{gt}: greater than -- $a > b$
  51. \item \texttt{le}: less equal -- $a \le b$
  52. \item \texttt{lt}: less than -- $a < b$
  53. \item \texttt{ne}: not equal -- $a \neq b$
  54. \end{itemize}
  55. Weitere if-Abfragen haben das Schema
  56. \begin{center}
  57. \texttt{if<comperator>} -- $b \text{\texttt{<comperator>}} 0$
  58. \end{center}
  59. \subsection{Konstanten}\xindex{iconst\_<i>@\texttt{iconst\_<i>}}\xindex{iconst\_m1@\texttt{iconst\_m1}}%
  60. \begin{itemize}
  61. \item \texttt{iconst\_m1}: Lade -1 auf den Stack
  62. \item \texttt{iconst\_<i>}, wobei \texttt{<i>} die Werte 0, 1, 2, 3, 4, 5
  63. annehmen kann.
  64. \end{itemize}
  65. \xindex{aload\_<i>@\texttt{aload\_<i>}}
  66. \begin{itemize}
  67. \item \texttt{aload\_<i>} wobei \texttt{<i>} entweder 0, 1, 2 oder 3 ist: Lade eine
  68. Referenz von einer lokalen Variable \texttt{<i>} auf den Stack.
  69. \end{itemize}
  70. \section{Polnische Notation}
  71. \begin{definition}[Schreibweise von Rechenoperationen]
  72. Sei $f: A \times B \rightarrow C$ eine Funktion, $a \in A$ und $b \in B$.
  73. \begin{defenum}
  74. \item Die Schreibweise $a\ f\ b$ heißt \textbf{Infix-Notation}\xindex{Infix-Notation}.
  75. \item Die Schreibweise $f\ a\ b$ heißt \textbf{Präfixnotation}\xindex{Präfixnotation}
  76. \item Die Schreibweise $a\ b\ f$ heißt \textbf{Postfixnotation}\xindex{Postfixnotation}.
  77. \end{defenum}
  78. \end{definition}
  79. \textit{Polnische Notation}\index{Notation!polnische|see{Präfixnotation}} ist ein Synonym für die Präfixnotation.
  80. \textit{Umgekehrte polnische Notation}\index{Notation!umgekehrte polnische|see{Postfixnotation}} ist ein Synonym für die Postfixnotation.
  81. \begin{beispiel}[Schreibweise von Rechenoperationen]
  82. \begin{bspenum}
  83. \item $1 + 2$ nutzt die Infix-Notation.
  84. \item $f\ a\ b$ nutzt die polnische Notation.
  85. \item Wir der Ausdruck $1 + 2 \cdot 3$ in Infix-Notation ohne Operatoren-Präzedenz
  86. ausgewertet, so gilt:
  87. \[1 + 2 \cdot 3 = 9\]
  88. Wird er mit Operatoren-Präzendenz ausgewertet, so gilt:
  89. \[1 + 2 \cdot 3 = 7\]
  90. \item Der Ausdruck
  91. \[1 + 2 \cdot 3 = 7\]
  92. entspricht
  93. \[+\ 1\ \cdot\ 2\ 3\]
  94. in der polnischen Notation und
  95. \[1\ 2\ 3\ \cdot\ +\]
  96. in der umgekehrten polnischen Notation.
  97. \end{bspenum}
  98. \end{beispiel}
  99. \begin{bemerkung}[Eigenschaften der Prä- und Postfixnotation]
  100. \begin{bemenum}
  101. \item Die Reihenfolge der Operanden kann beibehalten und gleichzeitig
  102. auf Klammern verzichtet werden, ohne dass sich das Ergebnis
  103. verändert.
  104. \item Die Infix-Notation kann in einer Worst-Case Laufzeit von $\mathcal{O}(n)$,
  105. wobei $n$ die Anzahl der Tokens ist mittels des
  106. \textit{Shunting-yard-Algorithmus}\xindex{Shunting-yard-Algorithmus} in
  107. die umgekehrte Polnische Notation überführt werden.
  108. \end{bemenum}
  109. \end{bemerkung}
  110. \section{Weitere Informationen}
  111. \begin{itemize}
  112. \item \url{https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings}
  113. \item \url{http://cs.au.dk/~mis/dOvs/jvmspec/ref-Java.html}
  114. \item \href{http://scanftree.com/Data_Structure/prefix-postfix-infix-online-converter}{scanftree.com}:
  115. Infix $\leftrightarrow$ Postfix Konverter
  116. \end{itemize}
  117. \index{Java Bytecode|)}