\begin{slide}{Sprünge}

\begin{itemize}
\item
  bedingte, unbedingte (mit bekanntem Ziel)
  \begin{itemize}
  \item
    Maschinensprachen, Assembler, Java-Bytecode
  \item
    Fortran, Basic: if Bedingung then Zeilennummer
  \item
    Fortran: dreifach-Verzweigung (arithmetic-if)
  \end{itemize}
\item
  ``computed goto'' (Zeilennr. des Sprungziels ausrechnen)
\end{itemize}

\end{slide}

\begin{slide}{Sprünge und Schleifen}

\begin{itemize}
\item
  man kann jedes while-Programm in ein goto-Programm übersetzen
\item
  und jedes goto-Programm in ein while-Programm \dots
\item
  \dots das normalerweise besser zu verstehen ist.
\item
  strukturierte Programmierung $=$ jeder Programmbaustein
  hat genau einen Eingang und genau einen Ausgang
\item
  aber: vorzeitiges Verlassen von Schleifen
\item
  aber: Ausnahmen (Exceptions)
\end{itemize}

\end{slide}


\begin{slide}{Sprünge und Schleifen (Beweis)}

Satz: zu jedem goto-Programm gibt es ein äquivalentes while-Programm.

Beweis-Idee: \verb|1 : A1, 2 : A2; ..  5: goto 7; ..| $\Rightarrow$
\begin{verbatim}
while (true) {
  switch (pc) {
    case 1 : A1 ; pc++ ; break; ...
    case 5 : pc = 7 ; break; ... 
  }
}
\end{verbatim}

Das nützt aber softwaretechnisch wenig, das übersetzte Programm
ist genauso schwer zu warten wie das Original.

\end{slide}
