% !TeX spellcheck = de_DE \documentclass[11pt,a4paper,toc]{scrartcl} \usepackage[a4paper,left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm]{geometry} \usepackage[ngerman]{babel} \usepackage{amssymb} \usepackage{scrextend} \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage{enumitem} \usepackage{mathtools} \usepackage[load=named]{siunitx} \usepackage{csquotes} \usepackage[hidelinks]{hyperref} %\usepackage{listings} \usepackage{algorithmicx} \usepackage{algpseudocode} %\usepackage{pgfplots} \usepackage{tikz} %\usetikzlibrary{positioning} %\usetikzlibrary{arrows.meta} %\usetikzlibrary{quotes} %\usetikzlibrary{angles} %\usetikzlibrary{babel} %\usetikzlibrary{fit} %\usepackage{datetime} %\usepackage{xcolor} %\pdfminorversion=7 % Import-Unterstützung für PDFs bis Version 1.7 %\pgfplotsset{compat=1.16} % verhindern, dass pgfplots im Rückwärtskompatibilitätsmodus arbeitet \setlist[enumerate,1]{label={\arabic*.}} \setlist[enumerate,2]{label={\alph*)}} \title{Grundlagen des Übersetzerbaus: Verfahren} \author{Marco Ammon (my04mivo)} \date{\today} \begin{document} \maketitle \tableofcontents \clearpage \section{AST-Transformationen} \subsection{Innere Klassen} \begin{description} \item[innere Klasse:] in \texttt{Outer} enthaltene, nicht statische Klasse \texttt{Inner} \end{description} \begin{enumerate} \item flache Hierarchie durch Verschieben der inneren Klasse außerhalb der umgebenden Klasse(n): \texttt{Outer.Inner} $\rightarrow$ \texttt{Outer\$Inner} \item Konstruktor der inneren Klasse um Parameter ggf. erzeugen und um Parameter \texttt{Outer this\$i} ergänzen (mit $i$ als Schachtelungstiefe von \texttt{Outer}), zusätzlich gleichnamige Instanzvariable einfügen \item Zugriffen auf Instanzvariablen von \texttt{Outer} ein \texttt{this\$i.} voranstellen \item Hilfsmethoden für Zugriff auf private Instanzvariablen von \texttt{Outer} in \texttt{Outer} einfügen (mit aktueller Java-Version durch spezielles Attribut in Klassendatei nicht mehr notwendig) \item Alle Auftreten von \texttt{Inner} durch \texttt{Outer\$Inner} ersetzen \item Bei von \texttt{Inner} erbenden Klassen \texttt{(new Outer()).super();} im Konstruktor ergänzen, damit \text{Outer}-Instanz erzeugt wird \item Bei in Blöcken deklarierten inneren Klassen wird der Zugriff auf finale (oder \enquote{effectively-final}) Variablen durch Ergänzen des Konstruktors um diese Variablen ermöglicht \end{enumerate} \subsection{Generics} \begin{enumerate} \item \enquote{Ausradieren} der Typen (\enquote{type erasure}):\begin{itemize} \item \texttt{GenericClass} $\rightarrow$ \texttt{GenericClass} \item Typ \texttt{A} bleibt gleich \item Typparameter \texttt{A} $\rightarrow$ \texttt{Object} \end{itemize} \item Brückenmethoden einfügen, die \texttt{Object} zu \texttt{A} casten und dann eigentliche Implementierung aufrufen \item Wenn Typparameter \texttt{A} einer Methode nicht aus den Argumenten ableitbar ist, Verwendung des abgeleiteten Typs \texttt{*}, der Untertyp aller Typen ist \end{enumerate} \section{Transformation zu Zwischensprache} \begin{itemize} \item mehrdimensionale Arrays meistens zu eindimensionalen Array linearisiert \item Operatorenabbildung in \enquote{Post-Order}-Reihenfolge \item Kurzschlusssemantik: \begin{itemize} \item code(\texttt{a \&\& b}, $\texttt{L}_\texttt{true}$, $\texttt{L}_\texttt{false}$) $\rightarrow$ code(\texttt{a}, $\texttt{L1}$, $\texttt{L}_\texttt{false}$); \texttt{L1:} code(\texttt{b}, $\texttt{L}_\texttt{true}$, $\texttt{L}_\texttt{false}$) \item code(\texttt{a || b}, $\texttt{L}_\texttt{true}$, $\texttt{L}_\texttt{false}$) $\rightarrow$ code(\texttt{a}, $\texttt{L}_\texttt{true}$, $\texttt{L1}$); \texttt{L1:} code(\texttt{b}, $\texttt{L}_\texttt{true}$, $\texttt{L}_\texttt{false}$) \item code(\texttt{!a}, $\texttt{L}_\texttt{true}$, $\texttt{L}_\texttt{false}$) $\rightarrow$ code(\texttt{a}, $\texttt{L}_\texttt{false}$, $\texttt{L}_\texttt{true}$ \end{itemize} \item code(\texttt{while e do st od}) $\rightarrow$ $\texttt{jmp L}_\texttt{cond}$; $\texttt{L}_\texttt{true}$: code(\texttt{st}); $\texttt{L}_\texttt{cond}$: code(\texttt{e}, $\texttt{L}_\texttt{true}$, $\texttt{L}_\texttt{false}$); $\texttt{L}_\texttt{false}$: \item \texttt{switch-case}: \begin{itemize} \item \texttt{if}-Kaskade \item \texttt{lookupswitch}: Tabelle aus $(c_i, \texttt{L}_i)$-Tupel von Konstante $c_i$ und Sprungziel $\texttt{L}_i$ wird durchsucht \item \texttt{tableswitch}: Konstante wird als Index in Tabelle mit Sprungzielen (\enquote{jump table}) gewählt \end{itemize} \end{itemize} \section{Geschachtelte Funktionen} \subsection{ohne Display} \subsection{mit Display} \section{Objekt-orientierte Sprachen} \subsection{Methodenauswahl} \subsection{Einfachvererbung} \subsubsection{Dynamischer Methodenaufruf} \subsubsection{Casts/Typprüfung zur Laufzeit} \subsection{Interfaces} \subsubsection{Dynamischer Methodenaufruf} \subsubsection{Casts/Typprüfung zur Laufzeit} \subsection{Mehrfachvererbung} \subsubsection{Dynamischer Methodenaufruf} \subsubsection{Casts/Typprüfung zur Laufzeit} \section{Code-Selektion} \subsection{Mit Registerzuteilung} \subsubsection{Naiver Code-Generator} \subsubsection{getreg} \subsubsection{Sethi-Ullman-Algorithmus} \subsection{Ohne Registerzuteilung} \subsubsection{Baumtransformationen} \subsubsection{Verfahren von Graham/Glanville} \subsubsection{Dynamische Programmierung} \section{Registerzuteilung} %\printbibliography \end{document}