Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

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