📚 The CoCalc Library - books, templates and other resources
cocalc-examples / martinthoma-latex-examples / documents / Programmierparadigmen / Java-Bytecode.tex
132928 viewsLicense: OTHER
%!TEX root = Programmierparadigmen.tex1\chapter{Java Bytecode}2\index{Java Bytecode|(}3\begin{definition}[Bytecode]\xindex{Bytecode}%4Der Bytecode ist eine Sammlung von Befehlen für eine virtuelle Maschine.5\end{definition}67Bytecode ist unabhängig von realer Hardware.89\begin{definition}[Heap]\xindex{Heap}\xindex{Speicher!dynamischer}%10Der dynamische Speicher, auch Heap genannt, ist ein Speicherbereich, aus dem11zur Laufzeit eines Programms zusammenhängende Speicherabschnitte angefordert12und in beliebiger Reihenfolge wieder freigegeben werden können.13\end{definition}1415\textit{Activation Record} ist ein \textit{Stackframe}.\index{Activation Record|see{Stackframe}}16\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}}%17\begin{table}[h]18\begin{tabular}{p{6cm}|ll}19\textbf{Beschreibung} & \textbf{int} & \textbf{float} \\ \hline20Addition & iadd & fadd \\21Element aus Array auf Stack packen & iaload & faload \\22Element aus Stack in Array speichern & iastore & fastore \\23Konstante auf Stack legen & iconst\_<i> & fconst\_<f> \\24Divide second-from top by top & idiv & fdiv \\25Multipliziere die obersten beiden Zahlen des Stacks & imul & fmul \\26\end{tabular}27\end{table}2829Weitere:\xindex{iload\_0@\texttt{iload\_0}}%3031\begin{itemize}32\item \texttt{iload\_0}: Läd die lokale Variable 0 auf den Stack.33\item \texttt{iload\_1}: Läd die lokale Variable 1 auf den Stack.34\item \texttt{iload\_2}: Läd die lokale Variable 2 auf den Stack.35\item \texttt{iload\_3}: Läd die lokale Variable 3 auf den Stack.36\end{itemize}3738\subsection{if-Abfragen}\xindex{if\_icmp<comperator>@\texttt{if\_icmp<comperator>}}%39Im Java-Bytecode gibt es einige verschiedene if-Abfragen. Diese sind immer nach40dem Schema \texttt{<if> <label>} aufgebaut. Wenn also \texttt{<if>} wahr ist,41wird zu \texttt{<label>} gesprungen.4243Im Folgenden sei $a$ tiefer im Stack als $b$. Die Operation \texttt{push(a)} wurde also44vor \texttt{push(b)} durchgeführt.4546Eine Gruppe von if-Abfragen hat folgendes Schema:4748\begin{center}49\texttt{if\_icmp<comperator> <label>}50\end{center}5152Dabei steht das erste \texttt{i} für \enquote{integer} und \texttt{cmp} für53\enquote{compare}. \texttt{<comperator>} kann folgende Werte annehmen:5455\xindex{eq@\texttt{eq}}\xindex{ge@\texttt{ge}}\xindex{gt@\texttt{gt}}\xindex{le@\texttt{le}}56\xindex{lt@\texttt{lt}}\xindex{ne@\texttt{ne}}%57\begin{itemize}58\item \texttt{eq}: equal -- $a == b$59\item \texttt{ge}: greater equal -- $a \ge b$60\item \texttt{gt}: greater than -- $a > b$61\item \texttt{le}: less equal -- $a \le b$62\item \texttt{lt}: less than -- $a < b$63\item \texttt{ne}: not equal -- $a \neq b$64\end{itemize}6566Weitere if-Abfragen haben das Schema6768\begin{center}69\texttt{if<comperator>} -- $b \text{\texttt{<comperator>}} 0$70\end{center}7172\subsection{Konstanten}\xindex{iconst\_<i>@\texttt{iconst\_<i>}}\xindex{iconst\_m1@\texttt{iconst\_m1}}%73\begin{itemize}74\item \texttt{iconst\_m1}: Lade -1 auf den Stack75\item \texttt{iconst\_<i>}, wobei \texttt{<i>} die Werte 0, 1, 2, 3, 4, 576annehmen kann.77\end{itemize}787980\section{Weiteres}81\xindex{aload\_<i>@\texttt{aload\_<i>}}\xindex{invokevirtual@\texttt{invokevirtual}}82\begin{itemize}83\item \texttt{aload\_<i>} wobei \texttt{<i>} entweder 0, 1, 2 oder 3 ist: Lade eine84Referenz von einer lokalen Variable \texttt{<i>} auf den Stack.85\item \texttt{invokevirtual}: Rufe die Methode auf, die auf dem Stack liegt,86wobei die Objektreferenz direkt darunter auf dem Stack liegen muss.87\end{itemize}8889\section{Polnische Notation}90\begin{definition}[Schreibweise von Rechenoperationen]91Sei $f: A \times B \rightarrow C$ eine Funktion, $a \in A$ und $b \in B$.9293\begin{defenum}94\item Die Schreibweise $a\ f\ b$ heißt \textbf{Infix-Notation}\xindex{Infix-Notation}.95\item Die Schreibweise $f\ a\ b$ heißt \textbf{Präfixnotation}\xindex{Präfixnotation}96\item Die Schreibweise $a\ b\ f$ heißt \textbf{Postfixnotation}\xindex{Postfixnotation}.97\end{defenum}98\end{definition}99100\textit{Polnische Notation}\index{Notation!polnische|see{Präfixnotation}} ist ein Synonym für die Präfixnotation.101102\textit{Umgekehrte polnische Notation}\index{Notation!umgekehrte polnische|see{Postfixnotation}} ist ein Synonym für die Postfixnotation.103104\begin{beispiel}[Schreibweise von Rechenoperationen]105\begin{bspenum}106\item $1 + 2$ nutzt die Infix-Notation.107\item $f\ a\ b$ nutzt die polnische Notation.108\item Wir der Ausdruck $1 + 2 \cdot 3$ in Infix-Notation ohne Operatoren-Präzedenz109ausgewertet, so gilt:110\[1 + 2 \cdot 3 = 9\]111Wird er mit Operatoren-Präzendenz ausgewertet, so gilt:112\[1 + 2 \cdot 3 = 7\]113\item Der Ausdruck114\[1 + 2 \cdot 3 = 7\]115entspricht116\[+\ 1\ \cdot\ 2\ 3\]117in der polnischen Notation und118\[1\ 2\ 3\ \cdot\ +\]119in der umgekehrten polnischen Notation.120\end{bspenum}121\end{beispiel}122123\begin{bemerkung}[Eigenschaften der Prä- und Postfixnotation]124\begin{bemenum}125\item Die Reihenfolge der Operanden kann beibehalten und gleichzeitig126auf Klammern verzichtet werden, ohne dass sich das Ergebnis127verändert.128\item Die Infix-Notation kann in einer Worst-Case Laufzeit von $\mathcal{O}(n)$,129wobei $n$ die Anzahl der Tokens ist mittels des130\textit{Shunting-yard-Algorithmus}\xindex{Shunting-yard-Algorithmus} in131die umgekehrte Polnische Notation überführt werden.132\end{bemenum}133\end{bemerkung}134135\section{Weitere Informationen}136\begin{itemize}137\item \url{https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings}138\item \url{http://cs.au.dk/~mis/dOvs/jvmspec/ref-Java.html}139\item \href{http://scanftree.com/Data_Structure/prefix-postfix-infix-online-converter}{scanftree.com}:140Infix $\leftrightarrow$ Postfix Konverter141\end{itemize}142\index{Java Bytecode|)}143144