% -*- TeX -*- -*- DE -*- \chapter{Optimierung} \section{Einführung} Die Architektur nach von Neumann hat sich als Grundlage für die Rechnerentwicklung bewährt. Das Prinzip des minimalen Hardware- und Speicher-Aufwands führt zu kostengünstigen Realisierungen. Mit der fortschreitenden Entwicklung der Halbleiter-Technologien wurde es allerdings möglich, von diesem Prinzip abzuweichen und die Architektur in Hinblick auf höhere Performanz zu erweitern. In diesem Kapitel werden die wichtigsten Ansätze vorgestellt. % Ausgangspunkt ist die in Kapitel \ref{c_neumann} beschriebene Grundstruktur. Wir hatten bei der Diskussion bereits die schwer wiegenden Defizite, die unmittelbar aus der Architektur resultieren, kennen gelernt. Die zwei wesentlichen Punkte sind: \begin{itemize} \item Der einheitliche Bus stellt einen Flaschenhals dar. \item Bei der Bearbeitung der Befehle wechseln sich Hol- und Ausführungsphasen ab. Dadurch sind in der meisten Zeit nur einige Komponenten aktiv. \end{itemize} In den folgenden Abschnitten werden verschiedene Ansätze zur Behebung dieser Schwachstellen vorgestellt. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Harvard-Architektur} \index{Harvard-Architektur} Eine prinzipielle Alternativ besteht in der Auftrennung des Bussystems. In der Harvard-Architektur werden getrennte Speicherbereiche für Daten und Programme eingeführt. Jeder Speicherbereich ist über ein eigenes Bussystem mit der CPU verbunden. Das Konzept wird vornehmlich bei Digitalen Signalprozessoren (DSP) realisiert. \index{Signalprozessoren} Diese auf hohe Geschwindigkeit optimierten Prozessoren werden zur Verarbeitung von Audio- oder Videodaten eingesetzt. Dabei wird durch die Harvard-Architektur ein schneller Datendurchsatz erzielt. Mit einer Instruktion kann dann der nächste Befehl und gleichzeitig Daten geladen werden. Ein Beispiel für den Motorola DSP56300 aus dem Manual\cite{dsp56300_fm} ist: \begin{verbatim} mac y0,x1,b x:(r4)-,x1 y:(r0)+,y0 ; Signed Multiply Accumulate b = b + y0 * x1 ; Lade aus Speicherbereich X, Adresse in Register R4 ; nach Register X1, anschließend noch R4 = R4 -1 ; Aus Bereich Y, Adresse in R0 nach Y0 ; R0 = R0 +1 \end{verbatim} Zeitgleich mit einer arithmetischen Operation werden neue Werte aus zwei verschiedenen Speicherbereichen geladen. Die Adressierung erfolgt indirekt über Register. Zusätzlich werden auch die Inhalte dieser Register aktualisiert. In der arithmetischen Operation werden noch die alten Werte in den Registern verwendet. Die neu geladenen Werte stehen dann für die nächste Instruktion bereit. Einen Schritt weiter ging die Firma Analog Devices. Bei dem 32-Bit Signalprozessoren SHARC\textregistered\ wurde das Konzept noch um einen zusätzlichen Bus für die Ein- und Ausgabe erweitert. Dafür wurde die Bezeichnung \emph{Super Harvard Architektur }eingeführt. % http://www.analog.com/processors/processors/sharc/overview.html % Super Harvard Architecture % is designed with an emphasis on balance between the computational core performance, % large internal dual-ported SRAM, and I/O throughput. % The architecture is referred to as "super" Harvard because % it advances the concept of separate data memory and program memory typical of Harvard % architecture microprocessors by adding an I/O processor and I/O bus. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{DMA} \index{DMA} In der ursprünglichen von Neumann Architektur werden alle Datentransfers über die CPU abgewickelt. Das Prinzip zeigt Bild \ref{f_ohne_dma} am Beispiel eines Transfers von einem Gerät in den Speicher. Um einen Wert zu kopieren ist folgender Ablauf notwendig: \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} \begin{enumerate} \item Wert von Quelle in CPU laden. \begin{enumerate} \item MOV-Befehl laden. \item Wert laden. \end{enumerate} \item Wert von CPU zu Ziel speichern. \begin{enumerate} \item MOV-Befehl laden. \item Wert speichern. \end{enumerate} \end{enumerate} Wenn man weiterhin bedenkt, dass auch der MOV-Befehl beispielsweise beim 8086 mehrere Bustransfers für Befehlscode und Adressen bedingt, wird klar wie aufwändig ein solcher Transfer wird. Andererseits kommen solche Transfers häufig vor. In vielen Fällen wird nicht nur ein einzelner Transfer benötigt, sondern ganze Blöcke sollen kopiert werden. \begin{figure}[btp] \begin{center} \input{ohne_dma.pic} \caption { \label{f_ohne_dma} Ablauf beim Datentransfer} \end{center} \end{figure} Eine wesentliche Verbesserung bietet in solchen Situationen der \emph{Direct Memory Access} (DMA). \index{Direct Memory Access} Die Grundidee ist, die Aufgabe des Datentransfers an eine eigene Einheit (DMA-Controller) zu delegieren. Die CPU muss sich dann nicht mehr selbst um den Transfer kümmern, sondern beauftragt den (oder einen von mehreren) DMA-Controller. Sie gibt Quelle, Ziel und Umfang der Daten vor. Der DMA-Controller führt dann den Transfer selbständig durch und informiert die CPU nach erfolgreichem Abschluss. Bild \ref{f_mit_dma} illustriert dieses Konzept. % \begin{figure}[btp] \begin{center} \input{mit_dma.pic} \caption { \label{f_mit_dma} Ablauf beim Datentransfer mit DMA} \end{center} \end{figure} % Während der DMA-Transfer erfolgt, kann die CPU andere Aufgaben erledigen. Dafür wird sie auch weiterhin selbst auf den Bus zugreifen. Durch eine entsprechende Steuerlogik wird dafür gesorgt, dass es dabei zu keinen Konflikten kommt. Die Kontrolle behält dabei die CPU. Sie gibt über ein spezielles Signal den Bus für den DMA frei. Dann wird entweder ein einzelner Wert oder ein ganzer Block (\emph{Block mode}) übertragen. Anschließend erhält die CPU die Kontrolle zurück. Dieser Vorgang wiederholt sich, bis alle angegebenen Daten transferiert sind. Die Zählung der Daten übernimmt der DMA-Controller. Nach Abschluss informiert er -- beispielsweise per Interrupt -- die CPU. Aus Sicht des Anwenders ist der DMA relativ einfach. Man muss nur durch entsprechende Befehle an den DMA-Controller den Vorgang starten. Alles andere läuft dann automatisch im Hintergrund ab. Man muss lediglich beachten, dass der Zustand des Zielspeichers während des DMA-Vorgangs nicht definiert ist. Würde man während dieser Zeit eine Zelle aus diesem Bereich lesen, könnte man entweder bereits den neuen oder noch den alten Wert erhalten, je nach dem ob der DMA diese Zelle bereits erreicht hat oder nicht. Das Resultat hängt von den Details im Timing ab. Daher sollte sinnvollerweise die Anwendung während eines laufenden DMA-Transfers den Zielspeicher nicht verwenden. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Pipelining} \index{Pipelining} In Kapitel \ref{c_Zentraleinheit} hatten wir gesehen, wie die Ausführung eines Befehls in mehreren Phasen abläuft. Dabei kann man unterscheiden zwischen Phasen mit und ohne Buszugriff. Nehmen wir als vereinfachtes Modell an, dass ein Befehl nur zwei Phasen umfasst: \begin{enumerate} \item Holen des Befehls aus dem Hauptspeicher. \item Ausführen der Operation innerhalb der CPU. \end{enumerate} Dann ergibt sich folgendes Bild für die Abfolge von drei Befehlen: \begin{center} \begin{tabular}{|*{7}{p{4em}|}} \hline 1& 2 & 3 & 4 & 5 & 6 & 7 \\ \hline Holen & Ausführen & Holen & \multicolumn{2}{c|}{Ausführen} & Holen & Ausführen \\ \hline \multicolumn{2}{p{8em}}{Befehl 1} & \multicolumn{3}{p{12em}}{Befehl 2} & \multicolumn{2}{p{8em}}{Befehl 3} \\ \end{tabular} \end{center} % Der Ablauf zeigt den Wechsel zwischen den beiden Phasen. In jeder Phase ist aber nur ein Teil des Systems aktiv, oder -- negativ formuliert -- der andere Teil ist untätig und wartet. Es bietet sich als Alternative an, die Befehle nicht streng sequentiell sondern überlappend zu bearbeiten. Man kann die Situation gut mit der Fertigung von z.\,B. Autos vergleichen. Die Arbeiten am nächsten Auto beginnen nicht erst, wenn ein Auto komplett fertig gestellt ist. Vielmehr wird der Fertigungsprozess in viele einzelne Schritte unterteilt. Sobald ein Schritt abgeschlossen ist, wird das entsprechende Auto einen Schritt weiter gegeben und das nächste rückt nach. Zu jedem Zeitpunkt befinden sich mehrere Autos in der Fertigungskette. Sie durchlaufen den Prozess in Form eines Fließbandes. Übertragen auf die Befehlsverarbeitung werden die Instruktionen ebenfalls durch ein Fließband oder einen Schlauch (engl. \emph{Pipeline}) geschoben. Aus dem obigen Beispiel wird dann folgender Ablauf: \begin{center} \begin{tabular}{|*{7}{p{4em}|}} \hline 1& 2 & 3 & 4 & 5 & 6 & 7 \\ \hline %\cline{1-2} Holen & Ausführen & \multicolumn{5}{c}{} \\ \cline{1-2} \multicolumn{2}{p{8em}}{Befehl 1} & \multicolumn{5}{c}{} \\ \cline{2-4} \multicolumn{1}{c|}{} & Holen & \multicolumn{2}{c|}{Ausführen} & \multicolumn{3}{c}{} \\ \cline{2-4} \multicolumn{1}{c}{} & \multicolumn{3}{p{12em}}{Befehl 2} & \multicolumn{3}{c}{} \\ \cline{3-5} \multicolumn{2}{c|}{} & Holen & \emph{Warten} & Ausführen & \multicolumn{2}{c}{} \\ \cline{3-5} \multicolumn{2}{c}{} & \multicolumn{5}{l}{Befehl 3} \\ \end{tabular} \end{center} Während der erste Befehl noch intern ausgeführt wird, kann bereits der zweite Befehl aus dem Speicher geholt werden. Bei dem zweiten Befehl dauert die Ausführung länger als das Holen des dritten Befehls. Der dritte Befehl kann dementsprechend erst nach einem Wartetakt weiter geschoben werden. Dieses Prinzip wird als \emph{Pipelining} oder Fließband-Prinzip bezeichnet. \index{Fließband-Prinzip} In dem Beispiel verkürzt sich die Verarbeitungszeit für drei Befehle um 2 Einheiten. Demgegenüber steht ein gewisser Mehraufwand, um die parallele Verarbeitung der einzelnen Stufen zu ermöglichen. Insbesondere werden zusätzliche Register benötigt, um die in den einzelnen Stufen benötigten Werte getrennt zu halten. Wie groß die Ersparnis tatsächlich wird, hängt von den einzelnen Verarbeitungszeiten und der Struktur der Befehle ab. Lassen sich mehr Verarbeitungsstufen separieren, ist ein größerer Gewinn durch die gleichzeitige Bearbeitung aufeinander folgender Befehle erzielen. Der größte Gewinn wird erzielt, wenn die Pipeline permanent gefüllt ist. Dann sind alle Einheiten gleichzeitig aktiv und der Durchsatz wird maximal. Am Ende jeder Pipeline-Phase ist ein Befehl fertig ausgeführt. Dieser optimale Betrieb lässt sich nicht mehr aufrecht erhalten, sobald Abhängigkeiten zwischen den Befehlen zu berücksichtigen sind. Besonders problematisch sind Sprünge. Von welcher Adresse der nächste Befehle zu holen ist, steht erst nach Analyse des Sprungbefehls fest. Daher kann die nächste Instruktion erst mit einer Verzögerung geladen werden. Ohne besondere Maßnahmen würden in der Zwischenzeit die nächsten Befehle in der linearen Folge geladen und mit ihrer Ausführung begonnen werden. Die Bearbeitung dieser "`falschen"' Befehle ist abzubrechen. Außerdem müssen gegebenenfalls bereits vorgenommene Veränderungen an Registern o.\,ä. zurück genommen werden. Um diesen Mehraufwand zu vermeiden, kann man nach jedem Sprungbefehl entsprechend viele Instruktionen einfügen, die keine weiteren Auswirkungen haben. Die meisten Assembler kennen für derartige Zwecke eine Instruktion NOP (\emph{No Operation}). Noch schwieriger ist die Situation bei bedingten Sprüngen. Hier dauert es oft noch länger bis entschieden ist, ob der Sprung ausgeführt werden soll oder nicht. Moderne Prozessoren verwenden ausgeklügelte Strategie für solche Fälle. Eine Möglichkeit ist, die Wahrscheinlichkeit für den Sprung abzuschätzen (\emph{Branch prediction}). \index{Branch prediction} Eine plausible Annahme ist, dass das gleiche Ergebnis wie bei dem letzten Durchgang eintrifft. Damit liegt man z.\,B. bei Zählschleifen immer außer beim letzten Durchgang richtig. In der Mehrzahl der Fälle kann daher die Ausführung nahtlos fortgesetzt werden. Wurde der falsche Pfad gewählt, müssen die angefangenen Operationen abgebrochen und eventuelle Veränderungen rückgängig gemacht werden. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \section{Cache-Speicher} \index{Cache-Speicher} \subsection{Funktionsweise} Mit zunehmender Geschwindigkeit moderner Prozessoren erweist sich immer mehr der Speicherzugriff als bestimmend für die erzielbare Leistungsfähigkeit. Sehr schnelle Speicherbausteine sind teuer. Gleichzeitig benötigen Betriebssystem und Anwendungen immer mehr Speicherkapazität. Preisgünstigere Speicherbausteine benötigen länger für einen Zugriff als die CPU für die Anforderung. Nach einer Leseanforderung muss die CPU eine gewisse Zeit auf das Ergebnis warten. Anstatt weiter zu arbeiten, fügt sie Wartezyklen (\emph{wait states}) ein. Einen Ausweg bietet die Einführung eines so genannten Cache-Speichers (Cache, engl. geheimes Lager). Ausgangspunkt ist die Beobachtung, dass in der Regel auf bestimmte Speicherzellen viel häufiger zugegriffen wird als auf andere. Ein typisches Beispiel sind Schleifen. In dem Programmfragment \begin{verbatim} for( i=0; i 11000 kW$ und im zweiten Fall $L_i < 9900 kW$ wobei $L_i$ die Leistung im Kraftwerk $i$ bezeichnet. \begin{center} \mbox{ 1. \begin{tabular}{*{3}{|p{2em}}||*{1}{p{2em}|}} \hline $L_1$ & $L_2$ & $L_3$ & Alarm \\ \hline \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline \end{tabular} } \mbox{ 2. \begin{tabular}{*{3}{|p{2em}}||*{1}{p{2em}|}} \hline $L_1$ & $L_2$ & $L_3$ & Alarm \\ \hline \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline & & & \\ \hline \end{tabular} } \end{center} \end{uebung} % -*- TeX -*- -*- DE -*- \chapter{Endliche Automaten und regul"are Grammatiken} \section{Regul"are Ausdr"ucke} Suchen und Ersetzen sind häufige Aufgaben. Entweder möchte man selbst im Editor oder in der Textverarbeitung ein Muster suchen oder durch ein anderes ersetzen oder Programme sollen diese Aufgabe automatisch ausführen. Ein weiteres Anwendungsfeld sind Plausibiltätsprüfungen. So kann man beispielsweise in eines Eingabemaske testen, ob die Werte bestimmten Vorgaben entsprechen. Beispielsweise soll das Feld für die Postleitzahl genau 5 Ziffern enthalten (sofern man nur Adressen innerhalb Deutschlands betrachtet). Häufig reicht es dabei nicht aus, einen festen Text zu verwenden. Vielmehr sollen kompliziertere Muster behandelt werden. Einige Beispiele sind: \begin{itemize} \item Suche nach allen Datumsangaben in einem Text \item Ersetzen des Dezimalpunktes durch ein Komma (oder umgekehrt) \item Prüfen, ob eine Zeile eine plausible Anschrift enthält (also Straße, Hausnummer, Postleitzahl, Stadt) \item Suchen nach allen C-Dateien, die im Namen den Begriff \emph{Euro} enthalten \end{itemize} Für solche Fälle unterstützen viele Programmiersprachen und Editoren reguläre Ausdrücke (regular expressions). Wir verwenden als Beispiel die Sprache Perl \cite{wall_perl}. Damit lässt sich folgendes Testprogramm zur Suche nach Mustern in Dateien schreiben: \begin{verbatim} # Programm fbgrep.pl # Kopiere erstes Argument in Variable $search $search = shift; # jetzt Schleife ueber alle angegebenen Dateien while (<>) { if( /$search/ ){ # Zeile gefunden, Muster steht jetzt in $& print "<$&>:: $_"; } } \end{verbatim} Das Programm erhält beim Aufruf als ersten Parameter das Suchmuster und anschließend eine Liste von Dateinamen. Mit dem Befehl \texttt{shift} wird das erste Element des Feldes mit Aufrufparametern in die Variable \verb!$search! kopiert. Die anschließende Schleife mit der Konstruktion \verb!<>! läuft dann über alle Zeilen aller angebenen Dateien. Bei einem Treffer wird das Muster (steht in der Variablen \verb!$&!) sowie die Zeile (Variable \verb!$_!) ausgegeben. \begin{beispiel} Einfache Suche\\ Der Befehl \begin{verbatim} fbgrep.pl "Neumann" skript.txt \end{verbatim} findet alle Zeile mit dem Text \emph{Neumann} in der Datei \texttt{skript.txt}. \end{beispiel} Wie das Beispiel zeigt, werden Buchstaben als normaler Suchtext behandelt. Das gleiche gilt für Ziffern und einen Teil der Sonderzeichen. Die anderen Sonderzeichen haben eine besondere Bedeutung. So steht der Punkt für irgendein Zeichen. Das Muster \texttt{a.b} deckt damit Folgen in der Art \emph{aAb}, \emph{axb}, \emph{a2b}, u. s. w. ab. Mehrere Punkte stehen für mehrere Zeichen. Mit \texttt{.....berg} findet man \emph{Friedberg}, aber auch \emph{Godesberg}, \emph{eidelberg} oder gar \emph{\_Goldberg} und \emph{p-n-Überg}. Mit den beiden Zeichen \verb!^! und \verb!$! kann man Zeilenanfang und Zeilenende angeben. So sucht \verb!^...$! nach allen Zeilen, die genau drei Zeichen enthalten. Mehrere Alternativen werden durch ein \verb!|!-Zeichen getrennt. So kann man mit \texttt{berg|stadt} gleichzeitig nach \texttt{berg} und \texttt{stadt} suchen. Kompliziertere Ausdrücke werden durch runde Klammern gegliedert. Beispielsweise bedeutet \texttt{(A|B)..(berg|stadt)} alle Muster mit: \begin{itemize} \item \texttt{A} oder \texttt{B} am Anfang \item dann zwei beliebige Zeichen \item \texttt{berg} oder \texttt{stadt} am Ende \item Beispiele: Arlberg, Bamberg \end{itemize} Anstelle von \texttt{(A|B)} kann man kürzer \texttt{[AB]} schreiben. Allgemein kann man mehrere alternative Zeichen als so genannte Zeichenklasse in eckigen Klammern angeben. Dann werden an dieser Stelle alle aufgeführten Zeichen akzeptiert. In diesem Fall haben die allermeisten Sonderzeichen keine besondere Bedeutung, sondern werden wie normale Zeichen behandelt. Ausnahmen sind das Minus- und das \verb!^!-Zeichen. Mit dem Minuszeichen werden Bereiche spezifiziert. Beispielsweise umfasst \verb![a-h]! alle Buchstaben von \texttt{a} bis \texttt{h}. Ein vorangestelltes \verb!^!-Zeichen kehrt die Bedeutung um. \begin{beispiel} Zeichenklassen\\ \begin{itemize} \item \verb![Ff]! groß oder klein F \item \verb![a-z]! irgendein Kleinbuchstabe \item \verb![A-Za-z]! ein Buchstabe \item \verb![0-9]! eine Ziffer (entspricht \verb![0123456789]!) \item \verb![^ijkxyz]! alles außer den aufgeführten Buchstaben \item \verb![^0-9]! keine Ziffer \item \verb+[^ .,;!?]+ kein Leerzeichen und kein Satzzeichen \end{itemize} \end{beispiel} Für häufig benutzte Klassen sind in Perl eigene Zeichen definiert. So bezeichnet beispielsweise \verb!\d! die Klasse aller Ziffern und \verb!\w! alle alphanumerischen Zeichen (Ziffern und Buchstaben). Die Umkehrung wird durch einen Großbuchstaben dargestellt: \verb!\D! sind alle Zeichen außer Ziffern und \verb!\W! umfasst alle Sonderzeichen. \begin{table} \centering \caption{Metazeichen}\label{t:metazeichen} \begin{tabular}{|l|l|} \hline \verb!.! & Irgendein Zeichen \\ \hline \verb!|! & Auswahl \\ \hline \verb![]! & Zeichenklasse \\ \hline \verb!^! & Zeilenanfang \\ \hline \verb!$! & Zeilenende \\ \hline \verb!()! & Gruppe \\ \hline \verb!\! & Danach wird das nächste Zeichen als normaler Text verwendet \\ \hline \end{tabular} \end{table} Häufig möchte man Wiederholungen von Teilen des Suchmusters spezifizieren. In Tabelle \ref{t:mehrfach} sind die verschiedenen Möglichkeiten dazu zusammen gestellt. Allgemein wird mit der Form \verb!{n,m}! angegeben, dass ein Muster mindestens n-mal und höchstens m-mal auftreten darf. Mit \verb!e{2,3}! sind zwei oder drei Wiederholungen des Buchstaben \texttt{e} beschrieben. Die Kombination \verb!.*! steht als Platzhalter für eine beliebige Folge von Zeichen einschließlich einer leeren Folge. \begin{table} \centering \caption{Wiederholungszeichen}\label{t:mehrfach} \begin{tabular}{|l|l|} \hline \verb!*! & beliebig oft oder gar nicht \\ \hline \verb!+! & mindestens 1-mal \\ \hline \verb!?! & 1-mal oder gar nicht \\ \hline \verb!{n}! & genau n-mal \\ \hline \verb!{n,}! & mindestens n-mal \\ \hline \verb!{n,m}! & mindestens n-mal, höchstens m-mal \\ \hline \end{tabular} \end{table} \begin{beispiel} Wiederholungen\\ \begin{itemize} \item \verb!^[0-9]+$! alle Zeilen, die nur Ziffern enthalten \item \verb![aeiou]{5}! alle Muster mit genau 5 aufeinander folgenden Vokalen (z. B. \emph{Treueeid}) \item \verb!a\w*b\w*c\w*d\w*! Wörter, die die Buchstaben a, b, c und d in dieser Reihenfolge enthalten % \item \verb!! \end{itemize} \end{beispiel} \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} \begin{uebung} Reguläre Ausdrücke\\ Welche Muster werden durch folgende reguläre Ausdrücke beschrieben: \begin{enumerate} \item \verb![a-zA-Z_][a-zA-Z_0-9]*! \item \verb![+-]?[0-9]+! \item \verb![a-zA-Z.]*\@[a-zA-Z.]*! \item \verb![a-h]{4}! \end{enumerate} \end{uebung} \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} \begin{uebung} Reguläre Ausdrücke\\ Geben Sie für folgende Suchaufgaben reguläre Ausdrücke an: \begin{enumerate} \item Folgen von zwei oder mehr Leerzeichen \item Wörter mit mehr als 25 Buchstaben % [A-Za-z][a-z]{25,} \item Alle achtstelligen Binärzahlen \item Integerkonstanten in der Sprache C in oktaler oder hexadezimaler Schreibweise \item Alle Jahreszahlen von 1980 bis 2099 % "19[89][0-9]|20[0-9][0-9]" \item Zeitangaben in der Form \emph{Stunden:Minuten} \item Zeilen, die mit \verb!! enden \end{enumerate} \end{uebung} \section{Endliche Automaten} Nach diesen Betrachtungen stellt sich die Frage, wie reguläre Ausdrücke effizient ausgewertet werden können? Mit anderen Worten: wie kann geprüft werden, ob eine gegebene Folge von Zeichen zu einen regulären Ausdruck gehört? Hier helfen endliche Automaten. Wir betrachten dazu den zu prüfenden Text als eine Folge von einzelnen Zeichen. Der Automat besteht aus einer endlichen Anzahl von Zuständen, die durch Übergänge untereinander verbunden sind. Zu Beginn der Verarbeitung befindet sich der Automat in dem Startzustand. Dann wird das erste Zeichen gelesen. In Abhängigkeit von diesem Zeichen geht der Automat in einen anderen Zustand über. Dieser Vorgang wird für jedes weitere eingegebene Zeichen wiederholt. Die Analyse wird abgebrochen, wenn ein Zeichen auftritt, für das im aktuellen Zustand kein weiterer Übergang vorgesehen ist. Ist das Ende der Eingabefolge erreicht, so wird noch geprüft, ob ein als mögliches Ende markierter Zustand erreicht wurde. In diesem Fall gilt die Folge als akzeptiert. \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} Der einfache Automat in Bild \ref{f:end_berg} prüft auf das Wort \texttt{berg}. Die Zustände sind als Kreise dargestellt. An den Übergangspfeilen steht jeweils, welches Zeichen dazu gehört. Endzustände werden durch einen doppelten Kreis hervorgehoben. \begin{figure} \begin{center} \parbox{0.7\textwidth}{ \entrymodifiers={++[o][F-]} \xymatrix @-1pc { *\txt{start} \ar[r] & S_0 \ar[r]^b & S_1 \ar[r]^e & S_2 \ar[r]^r & S_3 \ar[r]^g &*++[o][F=]{S_4} } } \end{center} \caption{Automat für Suche nach \texttt{berg}}\label{f:end_berg} \end{figure} Im Startzustand $S_0$ ist nur die Eingabe $b$ vorgesehen. Dann erfolgt der Übergang zu dem Zustand $S_1$. Ansonsten wird die Analyse bereits hier als gescheitert abgebrochen. Entsprechend wird in $S_1$ nur $e$ erkannt. Dieser Vorgang wird für 4 Eingabezeichen durchgeführt. Bei Übereinstimmung befindet sich der Automat dann im Zustand $S_3$ -- dem einzigen erlaubten Endzustand. \begin{uebung} Wie kann der Automat erweitert werden, so dass er auch \texttt{burg} akzeptiert? \end{uebung} \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} Ein etwas komplizierteres Beispiel ist der folgende Automat für die Darstellung von ganzen Zahlen mit optionalem Vorzeichen: \\ \begin{center} \parbox{0.7\textwidth}{ \entrymodifiers={++} \xymatrix @-1pc { & & *++[o][F-]{S_1} \ar[rrd]^{1-9} \\ *\txt{start} \ar[r] & *++[o][F-]{S_0} \ar[rrr]^{1-9} \ar[ru]^+ \ar[rd]_{-} & & & *++[o][F=]{S_3} \ar@(ul,ur)[]^{0-9} \\ & & *++[o][F-]{S_2} \ar[rru]_{1-9} } } \end{center} \noindent Bei der Analyse der Folge \texttt{+342} ergibt sich folgender Ablauf: \begin{center} \begin{tabular}{c|c} Zustand & Eingabe \\ \hline $S_0$ & + \\ $S_1$ & 3 \\ $S_3$ & 4 \\ $S_3$ & 2 \\ $S_3$ & \emph{Ende} \\ \end{tabular} \end{center} Der Automat befindet sich nach der Verarbeitung der Eingangsfolge in einem Enzustand. Damit ist die Eingabe akzeptiert. \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} Definition Automat:\\ \begin{center} \fbox{ \parbox{0.7\textwidth}{ Gegeben sei eine Eingabemenge $E$, eine Zustandsmenge $Z$, ein Anfangszustand $z_a \in Z$, eine Menge von Endzuständen $F \subseteq Z$ und eine Abbildung $f: E \times Z \to Z$. Dann bildet das 5-Tupel ($E$, $Z$, $z_a$, $f$, $F$) einen Automaten A. Für endliche $E$ und $Z$ ist $A$ ein endlicher Automat. } } \end{center} % Die Abbildung $f: E \times Z \to Z$, die für jede Kombination von Zustand und Eingangswert den Folgezustand festlegt, kann übersichtlich als Matrix geschrieben werden. \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} \begin{beispiel} Zahlen\\ \begin{itemize} \item $E = \{+, -, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9\}$ \item $Z = \{S_0, S_1, S_2, S_3\}$ \item $z_a = S_0$ \item $F= \{S_3\}$ \item Abbildung $f$: \[ \begin{array}{|c||c|c|c|c|} \hline & S_0 & S_1 & S_2 & S_3 \\ \hline \hline + & S_1 & & & \\ \hline - & S_2 & & & \\ \hline 0 & & & & S_3 \\ \hline 1-9 & S_3 & S_3 & S_3 & S_3 \\ \hline \end{array} \] \end{itemize} \end{beispiel} \begin{beispiel} Kaffeeautomat: \\ Der folgende Automat akzeptiert alle Zahlungen mit 10, 20 und 30 Cent Münzen, die zum Endbetrag von 60 Cent führen. \begin{center} \parbox{0.7\textwidth}{ \entrymodifiers={++} \xymatrix @-1pc { & & & & *++[o][F-]{20} \ar[rr]^{20} \ar[rd]^{10} & & *++[o][F-]{40} \ar@/^/[rrrd]^{20} \ar[rd]^{10} & \\ *\txt{start} \ar[r] & *++[o][F-]{0} \ar@/^/[rrru]^{20} \ar[rr]^{10} \ar@(dr,dl)[0,6]_{50} & & *++[o][F-]{10} \ar[ru]^{10} \ar[rr]^{20} \ar@(dr,dl)[0,6]_{50} & & *++[o][F-]{30} \ar[ru]^{10} \ar[rr]^{20} & & *++[o][F-]{50} \ar[rr]^{10} & & *++[o][F=]{60} } } \end{center} \end{beispiel} \begin{uebung} \label{ue:kaffee} Geben Sie für den Kaffeeautomaten die Abbildung $f$ in Matrixform an. \end{uebung} \begin{uebung} \label{ue:fsm_c} Implementieren Sie in C einen endlichen Automaten zur Erkennung von Zahlen. Lesen Sie jeweils die nächste Zahl mit \texttt{getch} ein. Verwenden Sie eine Variable zum Speichern des aktuellen Zustandes. Die verschiedenen Zustände sollen dann als case-Marken einer switch-Auswahl auf dieser Variablen realisiert werden. \end{uebung} \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} \begin{center} \fbox{ \parbox{0.7\textwidth}{ Reguläre Ausdrücke und endliche Automaten sind äquivalent. Zu jedem regulären Ausdruck existiert ein endlicher Automaten, der genau die beschriebenen Muster akzeptiert. Umgekehrt lässt sich für jeden endlichen Automaten ein gleichwertiger regulärer Ausdruck angeben. } } \end{center} % \subsection{$\varepsilon$-"Ubergänge} \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} In vielen Fällen sind Übergänge nützlich, bei denen kein Eingangssymbol gelesen wird. Man bezeichnet solche Übergänge als $\varepsilon$-Übergänge. Ein entsprechender Automat für die Darstellung von ganzen Zahlen mit optionalem Vorzeichen hat folgende Form: \\ \begin{center} \parbox{0.7\textwidth}{ \entrymodifiers={++} \xymatrix @-1pc { & & *++[o][F-]{1} \ar[rd]^{\varepsilon} \\ *\txt{start} \ar[r] & *++[o][F-]{0} \ar[rr]^{\varepsilon} \ar[ru]^+ \ar[rd]_{-} & & *++[o][F-]{3} \ar[rr]^{1-9} & & *++[o][F=]{4} \ar@(ul,ur)[]^{0-9} \\ & & *++[o][F-]{2} \ar[ru]_{\varepsilon} } } \end{center} Die $\varepsilon$-Übergänge vereinfachen den Aufbau der Automaten. Sie sind aber keine wirkliche Erweiterung der Möglichkeiten. Man kann zeigen, dass sich jeder Automat mit $\varepsilon$-Übergängen in einen gleichwertigen Automat ohne derartige Übergänge umformen lässt. \subsection{Endliche Maschinen} Fügt man zu einem Automaten eine Ausgabe hinzu, so erhält man eine Maschine. Man unterscheidet: \begin{itemize} \item Moore-Maschine: Ausgabe erfolgt im Zustand \item Mealy-Maschine: Ausgabe erfolgt bei Übergängen \end{itemize} % Wir betrachten als Beispiel eine Moore-Maschine zur Addition von Binärzahlen. \begin{itemize} \item Eingang: die Werte der beiden Zahlen an einer Stelle. $E = \{00, 01, 10, 11\}$ \item Ergebnis der jeweiligen Addition unter Berücksichtigung eines eventuellen Übertrags. \end{itemize} Beispiel: \[ \begin{array}{|c|c|c|c|c|c|c|c|c|} \hline & 0 & 1 & 1 & 0 & 1 & 1 & 0 & 1 \\ \hline & 1 & 0 & 0 & 0 & 1 & 1 & 0 & 1 \\ \hline \mbox{\"Ubertrag} & & & & 1 & 1 & & 1 & \\ \hline \hline & 1 & 1 & 1 & 1 & 1 & 0 & 1 & 0 \\ \hline \end{array} \] \begin{itemize} \item Eingangsfolge: $11, 00, 11, 11, 00, 10, 10, 01 $ \\ \item Ausgangsfolge: $0, 1, 0, 1, 1, 1, 1, 1$ \end{itemize} % Wir verwenden dabei folgende Notation: $S_n^x$ ist der Zustand $n$ mit der Ausgabe $x$. Dabei bezeichnet $S_n^{\varepsilon}$ einen Zustand ohne Ausgabe. \begin{center} \parbox{0.7\textwidth}{ \entrymodifiers={++} \xymatrix @-1pc { & *++[o][F-]{S_1^0} \ar@/_/[d]_{\varepsilon} & & & & & *++[o][F-]{S_5^1} \ar@/^/[ld]^{\varepsilon} \\ *\txt{start} \ar[r] & *++[o][F-]{S_0^{\varepsilon}} \ar@/_/[u]_{00} \ar@/^/[d]^{01,10} \ar[rr]^{11} & & *++[o][F-]{S_3^0} \ar[rr]^{\varepsilon} & & *++[o][F-]{S_4^{\varepsilon}} \ar@/^/[dllll]^{00} \ar@/^/[ru]^{11} \ar@/^/[rd]^{01,10} \\ & *++[o][F-]{S_2^1} \ar@/^/[u]^{\varepsilon} & & & & & *++[o][F-]{S_6^0} \ar@/^/[lu]^{\varepsilon} } } \end{center} Für das Beispiel ergibt sich folgende Zustandsfolge: \[ S_0, S_3, S_4, S_2, S_0, S_3, S_4, S_5, S_4, S_2, S_0, S_2, S_0, S_2, S_0, S_2, S_0 \] \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} \section{Grammatiken} Ausgangspunkt unserer Betrachtungen ist ein Vorrat von Buchstaben. Für die Menge der Buchstaben führen wir die Bezeichnung $\Sigma$ gemäß \begin{equation} \Sigma = \{a, b, c, \ldots, n\} \end{equation} ein. Aus diesen Buchstaben werden Wörter gebildet. Ein einfaches Beispiel ist die Menge mit nur zwei Elementen % \begin{equation} \Sigma_d = \{0, 1\} \end{equation} % Indem man die beiden Buchstaben aneinander reiht, lassen sich mit diesem Vokabular alle möglichen Binärzahlen darstellen: \begin{equation} \begin{array}{l} 0 \\ 1 \\ 01 \\ 10 \\ 001 \\ \ldots \\ \end{array} \end{equation} Alle diese Folgen oder Wörter zusammen bilden wiederum eine Menge, die als $\Sigma^+$ bezeichnet wird. Nimmt man noch die leere Folge $\varepsilon$ hinzu, so erhält man die Menge $\Sigma^*$ (Kleene-Stern-Produkt, benannt nach Stephen C.\ Kleene, 1909-1998). \index{Kleene, Stephen C.} Diese unendlich große Menge enthält alle möglichen Folgen. Jede Einschränkung der Abfolge wählt eine Teilmenge von $\Sigma^*$ aus. Ein Beispiel ist die Menge $B$ der Bytes, das heißt alle Folgen von 8 Symbolen aus unserer Menge $\Sigma_d$: % \begin{equation} \begin{array}{ccccc} B & = & \{ & 00000000 & \\ & & & 10000000 & \\ & & & \ldots & \} \\ \end{array} \end{equation} % Eine solche Menge von Wörtern definiert eine Sprache. Weitere Beispiele sind die Bytes mit gerader Parität oder die Sprache % \begin{equation} B_n = \{ 0^n \; 1^n \} \end{equation} % mit jeweils zwei gleich langen Blöcken von Nullen und Einsen. Die Schreibweise $a^n$ ist ein Abkürzung für $n$ aufeinander folgende Buchstaben $a$. In den allermeisten Fällen ist die vollständige Aufzählung aller Wörter einer Sprache nicht praktikabel. Gesucht sind daher andere Möglichkeiten, die Sprache zu beschreiben. Noam Chomsky \index{Chomsky, Noam}(amerikanischer Linguist, geb. 1928) entwickelte das Konzept der generativen Grammatiken. \index{generative Grammatik} Dabei beschreibt für eine Sprache ein Regelwerk, wie alle möglichen Wörter konstruiert werden können. Die verschiedenen Typen von Grammatiken wurden von ihm nach der Komplexität der Regeln klassifizieren. Eine Grammatik ist eine gut geeignete Darstellungsform, um Folgen zu generieren. Für die umgekehrte Fragestellung, ob eine gegebene Folge von der Grammatik abgedeckt ist, ist diese Darstellung weniger nutzbar. Eine solche Prüfung lässt sich sehr viel einfacher mit Automaten durchführen. Es erweist sich, dass für die von Chomsky eingeführte Hierarchie von Grammatiken eine Äquivalenz zu einer Hierarchie von Automaten besteht. Für jede Grammatik lässt sich ein entsprechender Automat konstruieren, der nur die von dieser Grammatik erzeugten Folgen akzeptiert. Welcher Typ von Automat dazu im Einzelfall notwendig ist, hängt von der Einordnung der Grammatik in die Hierarchie ab. \subsection{Produktionsregeln und Ableitungsbäume} Eine Grammatik enthält eine Reihe von Produktionsregeln. \index{Produktionsregel} Die Regeln haben die Form % \begin{equation} l \rightarrow r \end{equation} % mit der Bedeutung "`der Ausdruck $l$ auf der linken Seite wird durch $r$ ersetzt"'. Eine solche Regel ist % \[ negZahl \rightarrow - \; Betrag \] % d.h. eine negative Zahl wird durch das Vorzeichen $-$ und den Betrag gebildet. In diesem Fall ist $-$ ein Symbol aus der Eingangsmenge. Da bei einem solchen Symbol keine weitere Regel mehr anzuwenden ist, wird es als Terminalsymbol bezeichnet. \index{Terminalsymbol} Das Symbole \emph{Betrag} dagegen ist eine Kategorie, die durch Anwendung von Produktionsregeln weiter aufgelöst wird. Daher wird dieser Typ von Symbolen als Nichtterminalsymbolen oder einfach Nichtterminals bezeichnet. \index{Nichtterminalsymbol} Die Nichtterminals und die Regeln können wieder als Mengen betrachtet werden. Dann ist eine Grammatik $G$ bestimmt durch die drei Mengen $\Sigma$, $N$ und $P$ für die Terminals, Nichtterminals und Produktionsregeln. Zusätzlich benötigt man noch einen Startpunkt $S$ für die Anwendung der Regeln. Zusammenfassend gilt dann \begin{equation} \label{e_gramm} G = (\Sigma, N, P, S) \end{equation} Mit $L(G)$ bezeichnet man dann die durch die Grammatik definierte Sprache. Betrachten wir das einfache Beispiel in Tabelle \ref{t_eg}. Die Grammatik beschreibt, wie aus den Symbolen $\{+, -, 0, 1\}$ positive und negative ganze Binärzahlen gebildet werden. Ausgangspunkt für die Produktionsregeln ist das Nichtterminalsymbol $W$ (Wert). Darauf können zwei Regeln angewandt werden: \begin{table} \centering \caption{\label{t_eg}Einfache Grammatik} \begin{tabular}{|l|l|} \hline $\Sigma$ & $+$, $-$, $0$, $1$ \\ \hline $N$ & $W \; B \; Z \; V$ \\ \hline $P$ & $W \to B$ \\ & $W \to V \; B$ \\ & $B \to Z $\\ & $B \to Z \; B $\\ & $Z \to 0 $\\ & $Z \to 1 $\\ & $V \to - $\\ & $V \to + $\\ \hline $S$ & $W$ \\ \hline \end{tabular} \end{table} \[ W \to V B \] und \[ W \to B \] Der Wert besteht entweder aus Vorzeichen plus Betrag oder nur einem Betrag. Wählen wir die erste Alternative. Auch für $V$ stehen zwei Regeln zur Verfügung. Das Vorzeichen kann $+$ oder $-$ sein. Der Betrag wird als Folge von Ziffern gebildet. Durch wiederholte Anwendung der Regel $B \to Z \; B $ können beliebig lange Wörter erzeugt werden. Der Ableitungsprozess endet, wenn der Ausdruck nur noch Terminals enthält. Jedes so generierte Wort gehört zur Grammatik. Im allgemeinen ist nicht garantiert, dass jede Ableitung zu einem legalen Ergebnis führt. Es können bei der Ableitung Nichtterminals übrig bleiben, für die keine passenden Regeln spezifiziert sind. Der Ableitungsprozess lässt sich als Baum darstellen. Das Startsymbol bildet die Wurzel. Die Nichtterminals sind die Knoten und die Terminals schließlich sind die Blätter. Als Beispiel erhält man aus der Folge $+10$ folgenden Baum: \leaf{+} \branch{1}{V} \leaf{1} \branch{1}{Z} \leaf{0} \branch{1}{Z} \branch{1}{B} \branch{2}{B} \branch{2}{W} \branch{1}{S} \begin{center} \tree \end{center} Die Definition \ref{e_gramm} gilt für alle Grammatiken der Chomsky Hierarchie. Die einzelnen Typen unterscheiden sich in den Einschränkungen für die Produktionsregeln. \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} \begin{uebung} Anschrift-Grammatik\\ Wie sieht eine Grammatik aus, mit der man den Aufbau von Anschriften aus Name, Vorname, Straße, etc. beschreibt? \end{uebung} \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} \begin{uebung} Radio-Grammatik\\ \begin{enumerate} \item Geben Sie 3 Sätze an, die mit der folgenden regulären Grammatik generiert werden können. \item Zeichnen Sie für einen der Beispielssätze den Ableitungsbaum. \item Erweitern Sie die Grammatik so, dass optional Sätze auch mit dem Wort \emph{Bitte} eingeleitet werden können. \item Wie sieht der zugehörige endliche Automat aus? \end{enumerate} \end{uebung} \begin{center} \begin{tabular}{|l|l|} \hline $\Sigma$ & $Radio$, $CD$, $ein$, $aus$, \emph{nächstes}, $Lied$, \emph{Stück} \\ \hline N & BEFEHL, SCHALTEN, LIED, GERÄT \\ \hline P & BEFEHL $\to$ GERÄT \\ & BEFEHL $\to$ GERÄT SCHALTEN \\ & BEFEHL $\to$ \emph{nächstes} LIED \\ & GERÄT $\to$ $CD$ \\ & GERÄT $\to$ $Radio$ \\ & LIED $\to$ $Lied$ \\ & LIED $\to$ \emph{Stück} \\ & SCHALTEN $\to ein $\\ & SCHALTEN $\to aus $\\ \hline S & BEFEHL \\ \hline \end{tabular} \end{center} \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} \subsection{Einseitig lineare Grammatiken} \index{Einseitig lineare Grammatiken} Die einfachsten Grammatiken - Typ 3 - sind dadurch gekennzeichnet, dass die Ableitungen nur in eine Richtung erfolgen. Alle Regeln haben bei einer rechts-linearen Grammatik die Form \begin{eqnarray}\label{e_typ3} A &\to& w \\ A &\to& w B \nonumber \end{eqnarray} mit $A,B \in N$ und $w \in \Sigma^*$. In jeder Regel steht auf der linken Seite ein Nichtterminal und auf der rechten Seite entweder ein Ausdruck mit Terminals alleine oder ein solcher Ausdruck gefolgt von einem Nichtterminal. Zu jeder derartigen Grammatik existiert ein endlicher Automat, der die mit der Grammatik verträglichen Folgen akzeptiert. Die möglichen Folgen sind damit auch durch reguläre Ausdrücke beschrieben und man spricht daher auch von regulären Sprachen. \index{reguläre Sprachen} Äquivalent zu den rechts-linearen Grammatiken sind die links-linearen Grammatiken, bei denen die zweite Grundform der Regeln $A \to B w$ ist. \subsection{Möglichkeiten und Grenzen endlicher Automaten und regulärer Sprachen} Reale Rechner kann man als endliche Automaten interpretieren. Zu einem Zeitpunkt befindet sich der Rechner in einem bestimmten Zustand, charakterisiert durch die Inhalte in all seinen Speicherzellen und Registern. Indem der nächste Befehl ausgeführt wird, ändern sich einige Inhalte. Die neuen Inhalte bestimmen wiederum den Folgezustand. \begin{uebung} Betrachten Sie einen Rechner mit 256 MByte Speicher. Dieser Rechner soll als endlicher Automat modelliert werden. Wie viele Zustände werden dazu benötigt? \end{uebung} \ifthenelse{\equal{\meinmodus}{folien}}{\newpage}{} Von großer Bedeutung ist das Wortproblem: \index{Wortproblem} \begin{itemize} \item Kann man für eine gegebene Symbolfolge entscheiden, ob sie ein Wort der regulären Grammatik ist? Formal ausgedrückt: gilt für eine Folge $w \in \Sigma^*$ und eine Grammatik $G$ $w \in L(G)$ oder $w \not\in L(G)$? \end{itemize} Anwendungen dazu sind: \begin{itemize} \item Erfüllt ein Text die Suchabfrage? \item Ist ein Programm syntaktisch korrekt? \end{itemize} Diese Frage ist entscheidend für die praktische Verwendbarkeit. Eine Sprache, bei der nicht entscheidbar ist, ob eine Symbolfolge dazu gehört oder nicht, ist als Programmiersprache ungeeignet, da man keinen Compiler dazu konstruieren kann. Glücklicherweise ist bei regulären Grammatiken das Wortproblem entscheidbar. Es kann in der Tat für jede beliebige Symbolfolge entschieden werden, ob sie zu entsprechenden Sprache $L(G)$ gehört oder nicht. Darüber hinaus lässt sich auch eine Aussage über den dazu notwendigen Rechenaufwand treffen. Typische Aussagen über die Komplexität haben die Form $O( f(N) )$, wobei $N$ die Anzahl der zu verarbeitenden Werte bezeichnet. Der Ausdruck $O(f(N))$ besagt, dass die Komplexität proportional ist zu einer Funktion $f(N)$. Mit anderen Worten, es gibt zwei Konstanten $a$ und $b$, so dass für die Anzahl der Rechenschritte die Formel \begin{equation}\label{e_o} a \cdot f(N) + b \end{equation} gilt. Bei einem Algorithmus mit $O(N)$ etwa steigt der Aufwand proportional zu Anzahl der Daten. Demgegenüber würde bei einem Algorithmus mit $O(N^2)$ der Aufwand quadratisch ansteigen. Das Wortproblem bei regulären Grammatiken hat die Komplexität $O(N)$, wobei $N$ die Länge der Symbolfolge bezeichnet. Mit wachsender Länge nimmt der Aufwand proportional zu. Dies ist ein sehr erfreuliches Ergebnis. Probleme mit $O(N)$ sind gut lösbar. Selbst bei langen Eingangsfolgen -- beispielsweise ein Programm mit vielen tausend Zeilen -- ist der Compiler in überschaubarer Zeit fertig. Begrenzt wird die Darstellungsmöglichkeit der endlichen Automaten durch das fehlende Gedächtnis. Ein endlicher Automat verfügt über keinen expliziten Speicher. Die Information liegt lediglich im aktuellen Zustand. In Folge dieser Beschränkung sind Ausdrücke, die eine Information über die bisherige Folge verwenden, im allgemeinen nicht abgedeckt. Ein Musterbeispiel ist die Menge von Ausdrücken $\{a^nbc^n\}$, bei der die Symbole $a$ und $c$ genau gleich oft auftreten. Sofern es für $n$ keine Beschränkung gibt, kann man keinen endlichen Automaten konstruieren, der diese Bedingung prüft. Es gibt keine Möglichkeit, die Anzahl der gesehenen Zeichen $a$ zu speichern. In der Grammatik liegt die Beschränkung im einseitigen Wachstum der Regeln. Die eigentlich benötigt Regel in der Art $A \to a B c$ widerspricht dem Konstruktionsprinzip von einseitig linearen Grammatiken. Beispiele für derartige Fälle in Programmiersprachen sind Ausdrücke mit Klammern. Setzt man für $a$ $($ und für $c$ $)$, so hat erhält man die Form $\{(^nb)^n\}$. Es wird also verlangt, dass für jede öffnende Klammer wieder eine schließende Klammer gesetzt ist. Ohne Begrenzung von $n$ lässt sich eine solche Sprache nicht durch eine reguläre Grammatik beschreiben. \begin{uebung} \label{ue:bauer} Logische Knobelei \\ Man kann die Methoden der Aussagelogik auch zur Lösung von Knobelaufgaben einsetzen. Dazu zerlegt man die Aufgabe in einfache Aussagen. Die verschiedenen Kombinationen und ihre Bewertung werden in einer Wahrheitstabelle zusammen gestellt. Durch ein solches systematisches Vorgehen lässt sich ein kompliziertes Problem leichter lösen. Betrachten Sie als Beispiel folgende Aufgabe: In einem alten Rätsel kommt ein Bauer mit Gans, Hund und einem Sack Korn an einen Fluss. In dem Fährboot kann er jeweils nur einen Teil mitnehmen. Aber er darf niemals Gans und Hund oder Gans und Korn zusammen unbeaufsichtigt lassen (und schon gar nicht alle drei). Wie kann er das Problem lösen? \begin{itemize} \item Betrachten Sie die 4 Aussagen A1:\emph{Bauer am linken Ufer}, A2:\emph{Gans am linken Ufer}, A3:\emph{Hund am linken Ufer} und A4:\emph{Korn am linken Ufer}. A1 WAHR besagt dann, dass der Bauer am linken Ufer ist während er im Fall FALSCH sich auf der rechten Seite befindet. Die Anfangssituation ist WAHR WAHR WAHR WAHR oder kurz geschrieben 1111. \item Stellen Sie die Wahrheitstabelle für die erlaubten Kombinationen auf. \item Teilen Sie die legalen Kombinationen in zwei Gruppen gemäß der Position des Bauerns (linkes oder rechtes Ufer). \item Ein Überfahrt ist jetzt ein Übergang zwischen zwei Kombinationen in den beiden Gruppen. Dabei darf sich nur maximal eine Position ändern. \item Verfolgen Sie ausgehend von der Anfangssituation 1111 die möglichen Abfolgen bis zum Ziel 0000. \end{itemize} \end{uebung} This is e-TeX, Version 3.141592-2.1 (MiKTeX 2.4) (preloaded format=latex 2000.11.28) 4 SEP 2007 14:49 entering extended mode **skript.ltx (skript.ltx LaTeX2e <2001/06/01> Babel and hyphenation patterns for english, french, german, ngerman, du mylang, nohyphenation, loaded. (C:\texmf\tex\latex\base\book.cls Document Class: book 2001/04/21 v1.4e Standard LaTeX document class (C:\texmf\tex\latex\base\bk12.clo File: bk12.clo 2001/04/21 v1.4e Standard LaTeX file (size option) ) \c@part=\count79 \c@chapter=\count80 \c@section=\count81 \c@subsection=\count82 \c@subsubsection=\count83 \c@paragraph=\count84 \c@subparagraph=\count85 \c@figure=\count86 \c@table=\count87 \abovecaptionskip=\skip41 \belowcaptionskip=\skip42 \bibindent=\dimen102 ) (C:\texmf\tex\latex\german\german.sty v2.5e 1998-07-08 Package: german 1998/07/08 v2.5e Support for writing german texts (br) \grmnU@D=\dimen103 german -- \language number for Austrian undefined, default 2 used. ) (C:\texmf\tex\latex\germbib\bibgerm.sty Package: bibgerm 2000/08/18 v0.1 Support for mixed language bibliographies ** Macros for german `BibTeX'ing added to Style Option `german' 20 Apr 1993 ** ** idea and languages `german' and `USenglish' implemented by M. Wallmeier ** ** Modified for LaTeX 2e and german.sty 2.5b by A. Scherer 1 Nov 1995 ** ** Modified for ngerman.sty and babel.sty by H. Harders 21 August 2000 **) (C:\texmf\tex\latex\base\fontenc.sty Package: fontenc 2001/06/05 v1.94 Standard LaTeX package (C:\texmf\tex\latex\base\t1enc.def File: t1enc.def 2001/06/05 v1.94 Standard LaTeX file LaTeX Font Info: Redeclaring font encoding T1 on input line 38. )) (C:\texmf\tex\latex\base\inputenc.sty Package: inputenc 2001/07/10 v0.99a Input encoding file (C:\texmf\tex\latex\base\ansinew.def File: ansinew.def 2001/07/10 v0.99a Input encoding file )) (C:\texmf\tex\latex\eepic\epic.sty Enhancements to Picture Environment. Version 1.2 - Released June 1, 1986 \@@multicnt=\count88 \d@lta=\count89 \@delta=\dimen104 \@@delta=\dimen105 \@gridcnt=\count90 \@joinkind=\count91 \@dotgap=\dimen106 \@ddotgap=\dimen107 \@x@diff=\count92 \@y@diff=\count93 \x@diff=\dimen108 \y@diff=\dimen109 \@dotbox=\box26 \num@segments=\count94 \num@segmentsi=\count95 \@datafile=\read1 ) (C:\texmf\tex\latex\eepic\eepic.sty Extension to Epic and LaTeX. Version 1.1e - Released Dec 21, 1999 \@gphlinewidth=\count96 \@eepictcnt=\count97 \@tempdimc=\dimen110 \maxovaldiam=\dimen111 \@filltype=\box27 ) (C:\texmf\tex\latex\base\ifthen.sty Package: ifthen 2001/05/26 v1.1c Standard LaTeX ifthen package (DPC) ) (C:\texmf\tex\latex\graphics\epsfig.sty Package: epsfig 1999/02/16 v1.7a (e)psfig emulation (SPQR) (C:\texmf\tex\latex\graphics\graphicx.sty Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) (C:\texmf\tex\latex\graphics\keyval.sty Package: keyval 1999/03/16 v1.13 key=value parser (DPC) \KV@toks@=\toks14 ) (C:\texmf\tex\latex\graphics\graphics.sty Package: graphics 2001/07/07 v1.0n Standard LaTeX Graphics (DPC,SPQR) (C:\texmf\tex\latex\graphics\trig.sty Package: trig 1999/03/16 v1.09 sin cos tan (DPC) ) (C:\texmf\tex\latex\00miktex\graphics.cfg File: graphics.cfg 2003/03/12 v1.1 MiKTeX 'graphics' configuration ) Package graphics Info: Driver file: dvips.def on input line 80. (C:\texmf\tex\latex\graphics\dvips.def File: dvips.def 1999/02/16 v3.0i Driver-dependant file (DPC,SPQR) )) \Gin@req@height=\dimen112 \Gin@req@width=\dimen113 ) \epsfxsize=\dimen114 \epsfysize=\dimen115 ) (C:\texmf\tex\latex\base\makeidx.sty Package: makeidx 2000/03/29 v1.0m Standard LaTeX package ) (C:\texmf\tex\latex\ntgclass\a4.sty Package: a4 1999/03/03 v1.2f A4 based page layout ) (C:\texmf\tex\generic\xypic\xy.sty (C:\texmf\tex\generic\xypic\xy.tex Bootstrap'ing: catcodes, docmode, (C:\texmf\tex\generic\xypic\xyrecat.tex) (C:\texmf\tex\generic\xypic\xyidioms.tex) Xy-pic version 3.7 <1999/02/16> Copyright (c) 1991-1998 by Kristoffer H. Rose Xy-pic is free software: see the User's Guide for details. Loading kernel: messages; fonts; allocations: state, \X@c=\dimen116 \Y@c=\dimen117 \U@c=\dimen118 \D@c=\dimen119 \L@c=\dimen120 \R@c=\dimen121 \Edge@c=\toks15 \X@p=\dimen122 \Y@p=\dimen123 \U@p=\dimen124 \D@p=\dimen125 \L@p=\dimen126 \R@p=\dimen127 \Edge@p=\toks16 \X@origin=\dimen128 \Y@origin=\dimen129 \X@xbase=\dimen130 \Y@xbase=\dimen131 \X@ybase=\dimen132 \Y@ybase=\dimen133 \X@min=\dimen134 \Y@min=\dimen135 \X@max=\dimen136 \Y@max=\dimen137 \lastobjectbox@=\box28 \zerodotbox@=\box29 \almostz@=\dimen138 direction, \d@X=\dimen139 \d@Y=\dimen140 \K@=\count98 \KK@=\count99 \Direction=\count100 \K@dXdY=\dimen141 \K@dYdX=\dimen142 \xyread@=\read2 \xywrite@=\write3 \csp@=\count101 \quotPTK@=\dimen143 utility macros; pictures: \xy, positions, \swaptoks@@=\toks17 \connectobjectbox@@=\box30 objects, \styletoks@=\toks18 decorations; kernel objects: directionals, circles, text; options; algorithms: directions, edges, connections; Xy-pic loaded) Package: xy 1999/02/16 Xy-pic version 3.7 (C:\texmf\tex\generic\xypic\xycurve.tex Xy-pic option: Curve and Spline extension v.3.7 curve, \crv@cnt@=\count102 \crvpts@=\toks19 \splinebox@=\box31 \splineval@=\dimen144 \splinedepth@=\dimen145 \splinetol@=\dimen146 \splinelength@=\dimen147 circles, \L@=\dimen148 loaded)) (C:\texmf\tex\generic\xypic\xypic.sty (C:\texmf\tex\generic\xypic\xy.sty (C:\texmf\tex\generic\xypic\xy.tex not reloaded) LaTeX Warning: You have requested package `xypic', but the package provides `xy'. Package: xy 1999/02/16 Xy-pic version 3.7 ) (C:\texmf\tex\generic\xypic\xyv2.tex Xy-pic option: Version 2 Compatibility v.3.4 Xy-pic Warning: `\stop' redefined. (C:\texmf\tex\generic\xypic\xyframe.tex Xy-pic option: Frame and Bracket extension v.3.7 loaded) (C:\texmf\tex\generic\xypic\xymatrix.tex Xy-pic option: Matrix feature v.3.4 \Row=\count103 \Col=\count104 \queue@=\toks20 \queue@@=\toks21 \qcount@=\count105 \qcount@@=\count106 \matrixsize@=\count107 loaded) (C:\texmf\tex\generic\xypic\xyarrow.tex Xy-pic option: Arrow and Path feature v.3.5 path, \ar, loaded) loaded)) (C:\texmf\tex\latex\qobitree\QobiTree.tex \c@treecount=\count108 \c@branchcount=\count109 \parentbox=\box32 \treebox=\box33 \treeboxone=\box34 \treeboxtwo=\box35 \treeboxthree=\box36 \treeboxfour=\box37 \treeboxfive=\box38 \treeboxsix=\box39 \treeboxseven=\box40 \treeboxeight=\box41 \treeboxnine=\box42 \treeboxten=\box43 \treeboxeleven=\box44 \treeboxtwelve=\box45 \treeboxthirteen=\box46 \treeboxfourteen=\box47 \treeboxfifteen=\box48 \treeboxsixteen=\box49 \treeboxseventeen=\box50 \treeboxeighteen=\box51 \treeboxnineteen=\box52 \treeboxtwenty=\box53 \treeoffsetone=\skip43 \treeoffsettwo=\skip44 \treeoffsetthree=\skip45 \treeoffsetfour=\skip46 \treeoffsetfive=\skip47 \treeoffsetsix=\skip48 \treeoffsetseven=\skip49 \treeoffseteight=\skip50 \treeoffsetnine=\skip51 \treeoffsetten=\skip52 \treeoffseteleven=\skip53 \treeoffsettwelve=\skip54 \treeoffsetthirteen=\skip55 \treeoffsetfourteen=\skip56 \treeoffsetfifteen=\skip57 \treeoffsetsixteen=\skip58 \treeoffsetseventeen=\skip59 \treeoffseteighteen=\skip60 \treeoffsetnineteen=\skip61 \treeoffsettwenty=\skip62 \treeshiftone=\skip63 \treeshifttwo=\skip64 \treeshiftthree=\skip65 \treeshiftfour=\skip66 \treeshiftfive=\skip67 \treeshiftsix=\skip68 \treeshiftseven=\skip69 \treeshifteight=\skip70 \treeshiftnine=\skip71 \treeshiftten=\skip72 \treeshifteleven=\skip73 \treeshifttwelve=\skip74 \treeshiftthirteen=\skip75 \treeshiftfourteen=\skip76 \treeshiftfifteen=\skip77 \treeshiftsixteen=\skip78 \treeshiftseventeen=\skip79 \treeshifteighteen=\skip80 \treeshiftnineteen=\skip81 \treeshifttwenty=\skip82 \treewidthone=\skip83 \treewidthtwo=\skip84 \treewidththree=\skip85 \treewidthfour=\skip86 \treewidthfive=\skip87 \treewidthsix=\skip88 \treewidthseven=\skip89 \treewidtheight=\skip90 \treewidthnine=\skip91 \treewidthten=\skip92 \treewidtheleven=\skip93 \treewidthtwelve=\skip94 \treewidththirteen=\skip95 \treewidthfourteen=\skip96 \treewidthfifteen=\skip97 \treewidthsixteen=\skip98 \treewidthseventeen=\skip99 \treewidtheighteen=\skip100 \treewidthnineteen=\skip101 \treewidthtwenty=\skip102 \daughteroffsetone=\skip103 \daughteroffsettwo=\skip104 \daughteroffsetthree=\skip105 \daughteroffsetfour=\skip106 \branchwidthone=\skip107 \branchwidthtwo=\skip108 \branchwidththree=\skip109 \branchwidthfour=\skip110 \parentoffset=\skip111 \treeoffset=\skip112 \daughteroffset=\skip113 \branchwidth=\skip114 \parentwidth=\skip115 \treewidth=\skip116 ) \@indexfile=\write4 Writing index file skript.idx (skript.aux (gnuplot/log.aux) (gnuplot/h.aux) (trans.aux) (last.aux) (gnuplot/modulo.aux) LaTeX Warning: Label `ue_rtt' multiply defined. ) LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 23. LaTeX Font Info: ... okay on input line 23. bibgerm.sty: (n)german.sty 2.5b detected (kapitel.ltx LaTeX Font Info: External font `cmex10' loaded for size (Font) <14.4> on input line 15. LaTeX Font Info: External font `cmex10' loaded for size (Font) <7> on input line 15. [1 ] LaTeX Font Info: External font `cmex10' loaded for size (Font) <12> on input line 19. LaTeX Font Info: External font `cmex10' loaded for size (Font) <8> on input line 19. LaTeX Font Info: External font `cmex10' loaded for size (Font) <6> on input line 19. Underfull \vbox (badness 10000) has occurred while \output is active [] [2] \c@uebung=\count110 \c@beispiel=\count111 \c@definition=\count112 (vorwort.ltx) [3] [4 ] (skript.toc [5] [6] [7] [8] [9] [10]) \tf@toc=\write5 [11] [12 ] (geschichte.ltx Kapitel 1. [1 ] File: bilder/lochstreifen.eps Graphic file (type eps) File: bilder/lochkarte.eps Graphic file (type eps) [2] [3] Underfull \vbox (badness 6220) has occurred while \output is active [] [4] Overfull \hbox (1.15762pt too wide) in paragraph at lines 157--166 [][]\T1/cmr/m/n/12 Die 1945/46 fer-tig-ge-stell-te ENIAC (\T1/cmr/m/it/12 Elec- tro-nic Nu-me-ri-cal In-te-gra-tor And Com- [] LaTeX Font Info: External font `cmex10' loaded for size (Font) <5> on input line 179. [5] [6] LaTeX Font Info: Try loading font information for OMS+cmr on input line 223. (C:\texmf\tex\latex\base\omscmr.fd File: omscmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions ) LaTeX Font Info: Font shape `OMS/cmr/m/n' in size <12> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 223. Overfull \hbox (1.90173pt too wide) in paragraph at lines 244--254 \T1/cmr/m/n/12 Stan-dar-dan-wen-dun-gen (Text-ver-ar-bei-tung, Ta-bel-len-kal-k u-la-ti-on, Gra-phik, etc.) an- [] [7]) (physik.ltx [8] Kapitel 2. [9 ] [10] File: bilder/si.eps Graphic file (type eps) File: bilder/si-as.eps Graphic file (type eps) [11] File: bilder/pn.eps Graphic file (type eps) File: bilder/pn-sperr.eps Graphic file (type eps) [12] File: bilder/pn-durch.eps Graphic file (type eps) [13] File: bilder/transistor.eps Graphic file (type eps) [14] [15] (inverter.pic) (nand.pic) Underfull \vbox (badness 2318) has occurred while \output is active [] [16] (nor.pic) [17]) (vonneumann.ltx [18] Kapitel 3. [19 ] (neumann.pic) [20]) (boole.ltx [21] [22 ] Kapitel 4. Underfull \hbox (badness 10000) in paragraph at lines 41--50 [] [23] Underfull \hbox (badness 10000) in paragraph at lines 96--98 [] [24] Underfull \vbox (badness 2213) has occurred while \output is active [] [25] [26] [27] [28] Underfull \hbox (badness 10000) in paragraph at lines 334--335 [] [29] [30] [31] Overfull \hbox (32.7303pt too wide) in paragraph at lines 497--501 [][]\T1/cmr/m/n/12 Graphische Ver-fah-ren, zum Bei-spiel das Mi-ni-mie-rungs-ve r-fah-ren mit-tels Karnaugh- [] Overfull \hbox (24.01295pt too wide) in paragraph at lines 497--501 \T1/cmr/m/n/12 wur-de in der Stu-di-en-ar-beit [[]] ent-wickelt (http://tech-ww w.informatik.uni- [] Overfull \hbox (10.72594pt too wide) in paragraph at lines 501--502 [][]\T1/cmr/m/n/12 Tabellarische Ver-fah-ren, zum Bei-spiel das Mi-ni-mie-rungs -ver-fah-ren nach Quine- [] [32] LaTeX Font Info: Font shape `OMS/cmr/m/it' in size <12> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 546. Overfull \hbox (7.97026pt too wide) in paragraph at lines 582--582 []\T1/cmr/m/it/12 Alarm| [] Overfull \hbox (7.97026pt too wide) in paragraph at lines 596--596 []\T1/cmr/m/it/12 Alarm| [] [33]) (../../inf1_pt/skript/zahlen.ltx [34] Kapitel 5. [35 ] Overfull \hbox (4.72003pt too wide) in alignment at lines 80--85 [][][] [] [] [36] [37] [38] Overfull \hbox (0.21616pt too wide) in paragraph at lines 206--214 []\T1/cmr/m/n/12 Während man bei der Po-tenz-me-tho-de zu-nächst die höchst-wer -ti-ge Zif-fer be-stimmt, [] [39] [40] [41]) (zahlen_rechnen.ltx [42] Overfull \hbox (6.44235pt too wide) in paragraph at lines 67--74 [][]\T1/cmr/m/n/12 Bild 5.1[] zeigt einen Auf-bau zur Ad-di-ti-on 4-stelliger B i-n-är-zah-len. In der niedrieg- [] File: bilder/addierer.eps Graphic file (type eps) [43] [44] LaTeX Font Info: Try loading font information for T1+cmtt on input line 161. (C:\texmf\tex\latex\base\t1cmtt.fd File: t1cmtt.fd 1999/05/25 v2.5h Standard LaTeX font definitions ) (integer_kreis.pic) [45]) (float_zahlen.ltx [46] [47] [48] [49] Overfull \hbox (12.15903pt too wide) in paragraph at lines 208--215 \T1/cmr/m/n/12 chen Schal-tungs-auf-wand. Frü-her wur-den da-für spe-zi-el-le B au-stein als Co-Prozessoren [] [50] [51] [52] [53]) (zeichen.ltx [54] Kapitel 6. [55 ] [56] [57] LaTeX Warning: Reference `t:utf' on page 58 undefined on input line 146. ) (it.ltx [58] Kapitel 7. [59 ] [60] [61] [62] (gnuplot/log.tex \plotpoint=\box54 ) [63] [64 ] (gnuplot/h.tex) [65] [66 ] File: bilder/up.eps Graphic file (type eps) File: bilder/up.eps Graphic file (type eps) File: bilder/up.eps Graphic file (type eps) File: bilder/up.eps Graphic file (type eps) File: bilder/up.eps Graphic file (type eps) File: bilder/down.eps Graphic file (type eps) File: bilder/up.eps Graphic file (type eps) File: bilder/down.eps Graphic file (type eps) File: bilder/up.eps Graphic file (type eps) [67] [68] Overfull \hbox (19.01158pt too wide) in paragraph at lines 496--500 []\T1/cmr/m/n/12 In vie-len Fäl-len tre-ten die Zei-chen nicht ver-ein-zelt auf . So sind bei ei-nem Schwarzweiÿ- [] [69] File: bilder/springer.eps Graphic file (type eps) File: bilder/PICT0004.eps Graphic file (type eps) Underfull \hbox (badness 10000) in paragraph at lines 540--547 [] ) (cpu.ltx [70] Kapitel 8. [71 ] (alu.pic) (alu_3r.pic) [72] (alu_2r.pic) [73] [74] (alu_2r_zu.pic) [75] [76] [77] [78] [79]) (i8086.ltx [80] Kapitel 9. Overfull \hbox (7.65189pt too wide) in paragraph at lines 14--21 \T1/cmr/m/n/12 und Aus-füh-rung der Pro-gramm wird das Pro-gramm Emu8086 (www.e mu8086.com) [] [81 ] [82] [83] [84] Underfull \hbox (badness 10000) in paragraph at lines 241--242 [] [85] [86] Underfull \hbox (badness 10000) in paragraph at lines 297--298 [] [87] Underfull \hbox (badness 10000) in paragraph at lines 341--342 [] Underfull \hbox (badness 10000) in paragraph at lines 362--363 [] [88] [89] [90] Underfull \hbox (badness 10000) in paragraph at lines 498--499 [] Underfull \hbox (badness 10000) in paragraph at lines 510--511 [] Underfull \hbox (badness 10000) in paragraph at lines 528--529 [] [91] [92] Underfull \hbox (badness 10000) in paragraph at lines 609--610 [] [93] Underfull \hbox (badness 10000) in paragraph at lines 662--663 [] [94] Underfull \hbox (badness 10000) in paragraph at lines 715--716 [] Underfull \hbox (badness 10000) in paragraph at lines 748--749 [] [95] Underfull \hbox (badness 10000) in paragraph at lines 763--764 [] Overfull \hbox (26.3792pt too wide) in paragraph at lines 768--768 [] \T1/cmtt/m/n/12 mov al,x[di] ; Inhalt von (Adresse von x) + (Inhalt von DI) laden[] [] [96] Underfull \hbox (badness 4954) in paragraph at lines 820--820 [][]\T1/cmr/m/n/12 Hauptprogramm legt Rück-kehr-adres-se [] [97] Underfull \hbox (badness 10000) in paragraph at lines 873--874 [] Underfull \hbox (badness 10000) in paragraph at lines 898--899 [] [98] [99] Underfull \hbox (badness 10000) in paragraph at lines 965--966 [] Underfull \hbox (badness 10000) in paragraph at lines 979--980 [] Underfull \hbox (badness 10000) in paragraph at lines 990--991 [] Overfull \hbox (1.68523pt too wide) in paragraph at lines 1000--1000 [][]\T1/cmtt/m/n/12 ; Interrupt 15 / AH=86h ist eine Wartefunktion. In den komb inierten[] [] Overfull \hbox (14.03221pt too wide) in paragraph at lines 1000--1000 []\T1/cmtt/m/n/12 ; Registern CX und DX wird die Anzahl von Mikrosekunden spezi fiziert.[] [] [100] [101] [102] [103] Overfull \hbox (0.47295pt too wide) in paragraph at lines 1159--1164 [][]\T1/cmr/m/it/12 In man-chen Assembler-Programmen fin-det man die An-wei-sun g XOR [] ) (schichten.ltx [104] Kapitel 10. [105 ] [106] [107]) (optimierung.ltx [108] Kapitel 11. [109 ] (ohne_dma.pic) (mit_dma.pic) [110] [111] Overfull \hbox (5.93466pt too wide) in paragraph at lines 162--162 []\T1/cmr/m/n/12 Ausführen| [] Overfull \hbox (5.93466pt too wide) in paragraph at lines 162--162 []\T1/cmr/m/n/12 Ausführen| [] Overfull \hbox (0.98091pt too wide) in paragraph at lines 160--165 [][] [] [112] Overfull \hbox (5.93466pt too wide) in paragraph at lines 185--185 []\T1/cmr/m/n/12 Ausführen| [] Overfull \hbox (5.93466pt too wide) in paragraph at lines 189--189 []\T1/cmr/m/n/12 Ausführen| [] Overfull \hbox (0.98091pt too wide) in paragraph at lines 183--192 [][] [] [113] Overfull \hbox (1.07986pt too wide) in paragraph at lines 246--253 []\T1/cmr/m/n/12 Mit zu-neh-men-der Ge-schwin-dig-keit mo-der-ner Pro-zes-so-re n er-weist sich im-mer mehr [] (cache.pic) [114] [115] [116] [117] [118] [119]) (familien.ltx [120] Kapitel 12. Overfull \hbox (4.09554pt too wide) in paragraph at lines 18--21 [][]\T1/cmr/m/n/12 Arbeitsplatzrechner (Work-sta-ti-on): [][] an-spruchs-vol-le Ein-satz-ge-bie-te wie CAD, [] [121 ] Overfull \hbox (33.93427pt too wide) in paragraph at lines 58--62 [][]\T1/cmr/m/n/12 Pentium II: MMX-Befehlserweiterungen (\T1/cmr/m/it/12 Mul-ti Me-dia Ex-ten-si-on\T1/cmr/m/n/12 ) für Multimedia- [] Overfull \hbox (1.23949pt too wide) in paragraph at lines 58--62 \T1/cmr/m/n/12 Anwendungen: Gleich-zei-ti-ge Be-ar-bei-tung nach dem SIMD-Schem a von meh- [] [122] (trans.tex) Underfull \vbox (badness 1454) has occurred while \output is active [] [123 ]) (speicher.ltx [124] Kapitel 13. Underfull \hbox (badness 1275) in paragraph at lines 23--23 [][]\T1/cmr/m/n/12 Backup-Medien (Bän- [] Underfull \hbox (badness 10000) in paragraph at lines 24--24 [][]\T1/cmr/m/n/12 Wechselmedien (CD, [] Underfull \hbox (badness 5345) in paragraph at lines 24--24 \T1/cmr/m/n/12 Dis-ket-te, Flash-Card, [] [125 ] [126] [127] Overfull \hbox (4.90382pt too wide) in paragraph at lines 150--154 [][]\T1/cmr/m/n/12 Eine Wei-ter-ent-wick-lung mit noch hö-he-ren Über- [] (floppy.pic) [128] Underfull \vbox (badness 6252) has occurred while \output is active [] [129] [130] [131] [132]) (../../netzwerke/skript/grundlagen.ltx [133] [134 ] Kapitel 14. [135] (bits.pic) [136] [137] (roehre.pic) [138] [139] [140] [141] (topo_pp.pic) (topo_stern.pic) (topo_baum.pic) [142] (topo_ring.pic) (topo_bus.pic) [143] (herr_a.pic) [144] [145] [146] [147] [148] [149] Overfull \hbox (20.69994pt too wide) in paragraph at lines 731--734 []\T1/cmr/m/it/12 (Namen der Windows-Versionen). In-for-mie-ren Sie sich an Han d der Hilfe-Funktionen [] Overfull \hbox (48.95421pt too wide) in paragraph at lines 761--763 []\T1/cmr/m/it/12 Hinweis: Für einen bes-se-ren Ab-lauf soll-te der \T1/cmtt/m/ it/12 InputStream \T1/cmr/m/it/12 in einen \T1/cmtt/m/it/12 BufferedInputStream [] ) (../../netzwerke/skript/r2r.ltx \hoehevond=\skip117 [150] Kapitel 15. Overfull \hbox (0.51608pt too wide) in paragraph at lines 17--25 [][]\T1/cmr/m/n/12 Bei ei-ner elek-tri-schen Lei-tung wer-den die bei-den Zu-st än-de bei-spiels-wei-se durch [] (digitale_bits_01.pic) [151 ] (digitale_bits_allg.pic) Underfull \vbox (badness 6961) has occurred while \output is active [] [152] Overfull \hbox (12.77701pt too wide) in paragraph at lines 108--113 \T1/cmr/m/n/12 dann von Rah-men oder Fra-mes. Da-bei un-ter-schei-det man zwi-s chen Byte-orientierten [] [153] [154] Overfull \hbox (3.17517pt too wide) in paragraph at lines 225--230 \T1/cmr/m/n/12 zu ver-wech-seln-den In-for-ma-tio-nen wie Kon-to-num-mer, Kredi tkarten-Nummern oder [] [155] [156] [157] [158] Underfull \vbox (badness 7344) has occurred while \output is active [] [159] (arq_1.pic) (arq_2.pic) [160] (arq_3.pic) [161] (sliding_w.pic) [162] [163] Overfull \hbox (15.4249pt too wide) in paragraph at lines 683--693 [][]\T1/cmr/m/it/12 Das nach-fol-gen-de C-Programm si-mu-liert einen Ka-nal mit Bit-Fehlern. [] [164] [165] [166]) (../../netzwerke/skript/lan.ltx [167] [168 ] Kapitel 16. Overfull \hbox (17.82019pt too wide) in paragraph at lines 40--42 []\T1/cmr/m/n/12 gebildet. So be-zeich-net 10BA-SE5 ei-ne Va-ri-an-te mit 10Mbi t/s Basisband-Übertragung [] [169] Underfull \hbox (badness 10000) in paragraph at lines 45--54 [] [170] [171] \tlmaximale=\skip118 Underfull \hbox (badness 10000) in paragraph at lines 197--197 [][]\T1/cmr/m/n/12 Dickes Ko-axi-al-ka-bel [] Underfull \hbox (badness 10000) in paragraph at lines 198--198 [][]\T1/cmr/m/n/12 Dünnes Ko-axi-al-ka-bel [] Underfull \hbox (badness 10000) in paragraph at lines 199--199 []\T1/cmr/m/n/12 Punkt--zu--Punkt Ver-bin- [] Overfull \hbox (8.53691pt too wide) in paragraph at lines 194--202 [][][] [] [172] Underfull \vbox (badness 10000) has occurred while \output is active [] [173] (topo_ring.pic) [174] [175] (wlan.pic) [176] [177] [178] Overfull \hbox (16.42781pt too wide) in paragraph at lines 517--523 \T1/cmr/m/n/12 fi-gu-ra-tio-nen (z.B. Mono-Master, Multi-Master, Master-Slave). Ein Token- [] Overfull \hbox (1.1941pt too wide) in paragraph at lines 523--528 \T1/cmr/m/n/12 Viel-fach-zu-griffs-ver-fah-ren und Prio-ri-täts-re-geln. CAN wi rd auch zur Ver- [] Overfull \hbox (2.84097pt too wide) in paragraph at lines 540--543 [][]\T1/cmr/m/n/12 Local Ope-ra-ting Net-work LON: auch LONWORKS[] ge-nannt ist eben- [] [179]) (../../netzwerke/skript/ip.ltx [180] Kapitel 17. Overfull \hbox (6.99525pt too wide) in paragraph at lines 24--32 []\T1/cmr/m/n/12 Grundlage des In-ter-nets ist IP -- das In-ter-net Pro-to-koll . IP bein-hal-tet die Adressver- [] Overfull \hbox (24.42413pt too wide) in paragraph at lines 36--41 \T1/cmr/m/n/12 man die Adres-sen als 4 durch Punk-te ge-trenn-te De-zi-mal-zah- len, al-so z.B. 120.56.222.94, [] [181 ] [182] Overfull \hbox (34.34398pt too wide) in paragraph at lines 118--127 [][]\T1/cmr/m/n/12 Eine an-de-re Ver-fei-ne-rung des Adressraums er-reicht man durch Subnetz-Adressierung. [] Overfull \hbox (11.65497pt too wide) in paragraph at lines 138--142 [][]\T1/cmr/m/n/12 Der Netz-werk-teil ei-ner Adres-se lässt sich leicht durch b it-wei-se UND-Verknüpfung [] Underfull \hbox (badness 10000) in paragraph at lines 138--142 [] [183] Underfull \hbox (badness 10000) in paragraph at lines 143--151 [] Overfull \hbox (26.3792pt too wide) in paragraph at lines 188--188 [] \T1/cmtt/m/n/12 Beschreibung. . . . . . . . . . . : Accton EN2242 Series Mi niPCI Fast[] [] Overfull \hbox (20.2057pt too wide) in paragraph at lines 188--188 [] \T1/cmtt/m/n/12 Lease erhalten. . . . . . . . . . : Dienstag, 22. Juni 2004 14:21:28[] [] Overfull \hbox (20.2057pt too wide) in paragraph at lines 188--188 [] \T1/cmtt/m/n/12 Lease läuft ab. . . . . . . . . . : Dienstag, 22. Juni 2004 14:31:28[] [] Underfull \vbox (badness 10000) has occurred while \output is active [] [184] [185] [186] Overfull \hbox (0.1648pt too wide) in paragraph at lines 291--296 \T1/cmr/m/n/12 ei-ne Zu-ord-nungs-ta-bel-le mit IP-Adressen und Ethernet-Adress en, die ARP-Tabelle [] [187] Overfull \hbox (1.68523pt too wide) in paragraph at lines 370--370 [] \T1/cmtt/m/n/12 Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0 (0% Ver lust),[] [] [188] (netz_graph.pic) [189] Overfull \hbox (8.6266pt too wide) in paragraph at lines 438--447 \T1/cmr/m/n/12 und ex-ter-nem (in-ter-do-main) Rou-ting. Die Vor-ge-hens-wei-se bei Intradomain-Routing [] LaTeX Warning: `h' float specifier changed to `ht'. [190] LaTeX Warning: `h' float specifier changed to `ht'. LaTeX Warning: `h' float specifier changed to `ht'. [191] [192] Overfull \hbox (17.63689pt too wide) in paragraph at lines 602--609 \T1/cmr/m/n/12 ge-währ-lei-sten. Die An-sprü-che sind da-bei we-sent-lich ge-ri n-ger als bei dem Intradomain- [] [193] [194] Overfull \hbox (7.90596pt too wide) in paragraph at lines 691--709 [][]\T1/cmr/m/n/12 Technische The-men wer-den in spe-zi-el-len Grup-pen be-han- delt. All-ge-mei-ne grund- [] [195]) (../../netzwerke/skript/tcp.ltx [196] Kapitel 18. [197 ] LaTeX Warning: Reference `cha_rpc' on page 198 undefined on input line 46. Overfull \hbox (15.39038pt too wide) in paragraph at lines 44--47 \T1/cmr/m/n/12 über IP dar-stel-len. Im spä-te-ren Ka-pi-tel [] wird ein Bei-sp iel für ein Anfrage/Antwort- [] [198] [199] Overfull \hbox (22.3731pt too wide) in paragraph at lines 178--181 [][]\T1/cmr/m/n/12 Die An-wen-dung wünscht aus-drück-lich den so-for-ti-gen Ver -sand (Push-Operation). [] [200] [201] [202] [203] (last.tex) [204] [205 ]) (../../netzwerke/skript/anwendungen.ltx [206] Kapitel 19. [207 ] Overfull \hbox (2.006pt too wide) in paragraph at lines 72--76 \T1/cmr/m/n/12 spe-zi-fi-ziert. []Ein sol-cher URL ist []\T1/cmtt/m/n/12 http:/ /www.fh-friedberg.de/index.html\T1/cmr/m/n/12 . Der [] Overfull \hbox (9.371pt too wide) in paragraph at lines 77--78 [][]\T1/cmr/m/n/12 Der Cli-ent ex-tra-hiert aus dem URL den Kno-ten-na-men []\T 1/cmtt/m/n/12 www.fh-friedberg.de [] [208] [209] [210] Overfull \hbox (26.93198pt too wide) in paragraph at lines 184--190 [][]\T1/cmr/m/n/12 Der zwei-te Teil hat bei HTTP die all-ge-mei-ne Form \T1/cmr /m/it/12 //user:password@host:port/pfad\T1/cmr/m/n/12 . [] [211] [212] Overfull \hbox (2.16974pt too wide) in paragraph at lines 301--308 [][]\T1/cmr/m/n/12 Aus Si-cher-heits-grün-den kön-nen JavaScript-Programme und Ja-va Ap-p-lets nicht [] Underfull \vbox (badness 10000) has occurred while \output is active [] [213] [214] Overfull \hbox (14.03221pt too wide) in paragraph at lines 408--408 []\T1/cmtt/m/n/12 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)[] [] [215] Overfull \hbox (6.67274pt too wide) in paragraph at lines 458--460 [][]\T1/cmr/m/n/12 Definition von In-halt-s-ty-pen und -untertypen; Zwei Bei-sp ie-le sind: []\T1/cmtt/m/n/12 image/gif\T1/cmr/m/n/12 , [] [216] [217] Overfull \hbox (74.02722pt too wide) in paragraph at lines 563--573 []\T1/cmr/m/n/12 Newsgroups fin-det man über spe-zi-el-le Such-dien-ste wie z.B . fin-do-lin (http://www.findolin.com/). [] [218] [219] [220] [221] [222] [223] [224] LaTeX Warning: Reference `s_socket_ueb' on page 225 undefined on input line 901 . ) (../../netzwerke/skript/java.ltx [225] [226 ] Kapitel 20. [227] [228] Overfull \hbox (3.90143pt too wide) in paragraph at lines 131--136 []\T1/cmr/m/n/12 Der be-schrie-ben Client-Socket ver-wen-det ei-ne stro-m-ori-e n-tier-te Ver-bin-dung (TCP). [] [229] [230] [231] [232] [233] [234] [235] [236]) (../../netzwerke/skript/sicherheit.ltx [237] [238 ] Kapitel 21. (firewall.pic) [239] [240] [241] [242] [243] [244] [245] [246] (gnuplot/modulo.tex) [247 ] [248] [249] LaTeX Warning: Reference `c_rsa' on page 250 undefined on input line 560. LaTeX Warning: Reference `c_rsa' on page 250 undefined on input line 566. [250] [251]) (einheiten.ltx [252] Anhang A. ) (aufgaben.ltx [253 ] [254 ] Anhang B. [255] [256] [257] [258] [259]) (loesungen.ltx [260] Anhang C. Overfull \hbox (8.80617pt too wide) in paragraph at lines 51--51 []\T1/cmr/m/n/12 Alarm| [] Overfull \hbox (8.80617pt too wide) in paragraph at lines 65--65 []\T1/cmr/m/n/12 Alarm| [] Underfull \vbox (badness 1142) has occurred while \output is active [] [261 ] [262] [263] [264] Underfull \hbox (badness 10000) in paragraph at lines 206--209 [] Overfull \hbox (1.68523pt too wide) in paragraph at lines 221--221 [] \T1/cmtt/m/n/12 mov ax,0b800h ; zunaechst Segmentadresse fuer Daten setzen[] [] [265] Overfull \hbox (1.68523pt too wide) in paragraph at lines 293--293 [] \T1/cmtt/m/n/12 db 0ffh,0ffh,0ffh ; Markierung zur besseren Darst ellung[] [] Underfull \hbox (badness 10000) in paragraph at lines 296--298 [] [266]) (glossar.ltx [267] [268 ] Anhang D. [269] [270] [271] Overfull \hbox (23.47856pt too wide) in paragraph at lines 120--121 [][]\T1/cmr/m/n/12 Maximum Seg-ment Si-ze. Die ma-xi-ma-le Grö-ÿe ei-nes TCP-Se gments. [] [272] [273] [274] Overfull \hbox (1.40479pt too wide) in paragraph at lines 187--188 [][]\T1/cmr/m/n/12 Token Ro-ta-ti-on Ti-me. Die Um-lauf-zeit für den To-ken bei Token- [] Overfull \hbox (2.69327pt too wide) in paragraph at lines 201--202 [][]\T1/cmr/m/n/12 Virtual Chan-nel Iden-ti-fier. Ken-nung für vir-tu-el-len AT M-Kanal. [] [275]) (skript.bbl [276] Underfull \hbox (badness 10000) in paragraph at lines 66--70 [][]\T1/cmr/m/n/12 Daniel Kar-ren-berg, Ge-rard Ross, Paul Wil-son, and [] Underfull \hbox (badness 10000) in paragraph at lines 66--70 \T1/cmr/m/n/12 Les-lie No-bi-le. De-ve-lop-ment of the re-gio-nal in-ter- [] Underfull \hbox (badness 10000) in paragraph at lines 66--70 \T1/cmr/m/n/12 net re-gi-stry sy-stem. \T1/cmr/m/it/12 The In-ter-net Pro-to-c ol Jour-nal, [] Overfull \hbox (17.05637pt too wide) in paragraph at lines 66--70 []\T1/cmtt/m/n/12 www.cisco.com/warp/public/759/ipj_4-4/ipj_4-4_regional.html\T 1/cmr/m/n/12 , [] [277 ] [278])) (skript.ind [279] [280 ] Overfull \hbox (8.57834pt too wide) in paragraph at lines 163--164 [][]\T1/cmr/m/n/12 Internet Con-trol Mes-sa-ge Pro-to-col, 188 [] Overfull \hbox (3.51848pt too wide) in paragraph at lines 164--165 [][]\T1/cmr/m/n/12 Internet Cor-po-ra-ti-on for As-si-gned Na- [] [281] Overfull \hbox (0.61632pt too wide) in paragraph at lines 217--218 [][]\T1/cmr/m/n/12 Manufacturing Au-to-ma-ti-on Pro-to-col, [] Overfull \hbox (10.83185pt too wide) in paragraph at lines 230--231 [][]\T1/cmr/m/n/12 Monoalphabetisch Ver-schlüs-se-lung, 243 [] [282] Overfull \hbox (0.55106pt too wide) in paragraph at lines 292--293 [][]\T1/cmr/m/n/12 Reverse Ad-dress Re-so-lu-ti-on Pro-to-col, [] Overfull \hbox (9.26567pt too wide) in paragraph at lines 372--373 [][]\T1/cmr/m/n/12 Verzögerung--Bandbreite--Produkt, 139 [] [283] [284 ]) (skript.aux (gnuplot/log.aux) (gnuplot/h.aux) (trans.aux) (last.aux) (gnuplot/modulo.aux)) LaTeX Warning: There were undefined references. LaTeX Warning: There were multiply-defined labels. ) Here is how much of TeX's memory you used: 4636 strings out of 95933 48345 string characters out of 1195656 196330 words of memory out of 1136394 6863 multiletter control sequences out of 35000 21897 words of font info for 51 fonts, out of 500000 for 1000 14 hyphenation exceptions out of 607 32i,15n,22p,259b,332s stack positions out of 1500i,500n,5000p,200000b,32768s Output written on skript.dvi (296 pages, 1181208 bytes).