\documentclass[12pt,a4paper,titlepage,oneside]{article} \usepackage[utf8]{inputenc} \usepackage{oop_prot} \usepackage{url} \usepackage{pdfpages} \usepackage{booktabs} \title{Beispiel 3} \author{ Günther Neuwirth, \matrnr 0626638\\ {\small e0626638@student.tuwien.ac.at}\\ Manuel Mausz, \matrnr 0728348\\ {\small manuel-tu@mausz.at}\\ } \begin{document} % create titlepage \maketitle \tableofcontents \newpage %------------------------------------------------------------------ %------------------------------------------------------------------ \section{Aufgabenstellung - Beispiel 3} \includegraphics[width=\textwidth,page=1]{../angabe.pdf} \includegraphics[width=\textwidth,page=2]{../angabe.pdf} \includegraphics[width=\textwidth,page=3]{../angabe.pdf} %------------------------------------------------------------------ %------------------------------------------------------------------ \section{Beispiel 3} \subsection{Design}\label{Design} Abbildung~\ref{fig:classdiagram1} zeigt das Klassendiagramm der Aufgabe. Als Datentyp für Register und Hauptspeicher der CPU wurde ein allgemeines Template implementiert, welche andere Datentypen oder Klasse umhüllen kann. Zudem wurden die gängigsten Operatoren definiert, die man sich von einem Datentyp erwarten kann. Gemäß der Aufgabenstellung wurde der Datentyp CDat als umhüllter Integer-Wert definiert. Der Hauptspeicher der CPU wurde als abgeleitetes Template \mbox{CVectorMem} des Templates \mbox{std::vector} implementiert, damit dieses um die Methode \mbox{initialize} und \mbox{dump} erweitert werden konnten. Erstere dient zur Initialisierung des Hauptspeichers bzw. Füllung des Vectors, zweiteres zur Debugausgabe. Der Datentyp CMem wurde via typedef als \mbox{CVectorMem} mit dem Templateargument CDat definiert. Somit enthält der Hauptspeicher nur Elemente des Typs CDat. Die geforderten zwei Display-Klassen \mbox{CDisplayWDEZ} und \mbox{CDisplayWHEX} wurden von der abstrakten Klasse CDisplay abgeleitet, welche selbst als Template CDisplayT mit dem Templateargument CDat definiert ist. Der Programmspeicher \mbox{CProgram} wurde vom Template \mbox{std::vector} abgeleitet. Somit ist diese Klasse, ähnlich wie CMem, selbst ein Vector. Zudem wurden weitere Methoden hinzugefügt. Die Methode \mbox{compile} dient zum Kompilieren bzw. Umwandeln des Syntax der Programmdatei in Instanzen der Klasse CInstruction, die später von der CPU ausgeführt werden. Zur Umwandlung werden bei der Instantiierung von \mbox{CProgram} sämtliche erlaubten Instruktionen (also Instanzen von \mbox{CInstruction}) in ein \mbox{std::set} eingefügt. Im Zuge der Methode \mbox{compile} wird durch Iterieren die jeweilige Instruktion gesucht und durch Anwendung des Designpattern \textit{Factory method pattern} die Instruktion dupliziert und in \mbox{CProgram} gespeichert. Labels werden zwecks Effizienz in einer \mbox{std::map} festgehalten. Die jeweiligen unterstützen Instruktionen wurden wie gefordert von der Klasse \mbox{CInstruction} abgeleitet. \mbox{CInstruction} fordert die Implementierung einer Methode \mbox{compile}, die während des parsens der Programmdatei von \mbox{CProgram} aufgerufen werden, als auch eine Methode \mbox{execute}, die im Zuge der Ausführung des Programms von CCPU aufgerufen werden. Die eigentliche CPU wird durch die Klasse \mbox{CCPU} implementiert. Diese dient hauptsächlich als Container für die einzelnen, notwendigen Teile (Hauptspeicher, Programmspeicher, Displays, ...) und besitzt daher entsprechend viele get- und set-Funktionen. Die Methode \mbox{run} dient zur Ausführung des Programms und ist eine Schleife, die über die Instruktionen iteriert und die Methode \mbox{execute} aufruft. %================================================================== \begin{center} \begin{figure}[htb] \epsfxsize=1.6\textwidth\epsfbox{mycpu.png} \caption{Klassendiagramm 1} \label{fig:classdiagram1} \end{figure} \end{center} %================================================================== \subsection{Verwaltung der Ressourcen} Alle Objekte, die im Konstruktor alloziert werden, werden im Destruktor wieder freigegeben. Die Objekte, die über die \textit{Factory method pattern} alloziert werden, werden im Zuge des Destruktor des Vectors bzw. von \mbox{CProgram} wieder freigegeben. \subsection{Fehlerbehandlung} Es wurden keine eigenen Exceptions eingeführt. Statt dessen werden Exceptions meist in Exceptions des Typs \mbox{std::runtime\_error} umgewandelt. Da die Hierarchie nicht sehr tief ist, fängt lediglich \mbox{CPropram::compile} Exceptions des Typs \mbox{std::runtime\_error}, um zusätzliche Information an den ursprünglichen Aufrufer der Methode weiterzugeben. Dies geschieht ebenfalls per Exception des Typs \mbox{std::runtime\_error}. \subsection{Implementierung} Siehe Punkt~\ref{Design} und Abbildung~\ref{fig:classdiagram1} sowie Punkt~\ref{Listings}.\\ Es wurde viel mit Templates gearbeitet. \section{Projektverlauf} \subsection{Probleme und Fallstricke} Abgesehen von den mittlerweile üblichen Schwierigkeiten die Angabe bzw. die Gedanken dessen Verfassers verstehen zu wollen, arbeitete das erste Design noch vermehrt mit Text. Unter anderem hatte die Methode \mbox{CInstruction::execute} einen Parameter des Typs \mbox{std::string}, was dazu führte, das die Instruktion bei jeder Aufführung (zum Beispiel durch Jumps) erneut geparsed werden musste. \subsection{Arbeitsaufwand} \begin{tabular}{ll} \toprule Entwicklungsschritt / Meilenstein & Arbeitsaufwand\\ \midrule Erstes Design & 3 Stunden\\ \hline Implementierung & 3 Tage\\ \hline Anpassung des Designs und der Implementierung & 4 Stunden\\ \hline Dokumentation (Doxygen) und Überprüfung aller\\ Anforderungen gemäß der Programmierrichtlinien & 4 Stunden\\ \hline Erstellung des Protokolls & 3 Stunden\\ \bottomrule \end{tabular} %------------------------------------------------------------------ %------------------------------------------------------------------ \newpage \section{Listings}\label{Listings} \subsection{mycpu.cpp} \lstinputlisting{../mycpu/mycpu.cpp} \newpage \subsection{cdat.h} \lstinputlisting{../mycpu/cdat.h} \newpage \subsection{cmem.h} \lstinputlisting{../mycpu/cmem.h} \newpage \subsection{cinstruction.h} \lstinputlisting{../mycpu/cinstruction.h} \newpage \subsection{cinstruction.cpp} \lstinputlisting{../mycpu/cinstruction.cpp} \newpage \subsection{instructions.h} \lstinputlisting{../mycpu/instructions.h} \newpage \subsection{instructions.cpp} \lstinputlisting{../mycpu/instructions.cpp} \newpage \subsection{cdisplay.h} \lstinputlisting{../mycpu/cdisplay.h} \newpage \subsection{displays.h} \lstinputlisting{../mycpu/displays.h} \newpage \subsection{cprogram.h} \lstinputlisting{../mycpu/cprogram.h} \newpage \subsection{cprogram.cpp} \lstinputlisting{../mycpu/cprogram.cpp} \newpage \subsection{ccpu.h} \lstinputlisting{../mycpu/ccpu.h} \newpage \subsection{ccpu.cpp} \lstinputlisting{../mycpu/ccpu.cpp} \end{document}