[I2 logo] [RWTH logo] MOVES: Software Modeling and Verification
(Informatik 2)
Computer Science / RWTH / I2 / Teaching / Praktikum / SWP
Printer-friendly

Softwarepraktikum

Funktionales Programmieren in Haskell

[logo]

Inhaltsverzeichnis

Das Praktikum beginnt mit dem Intensivkurs in der Woche vor Vorlesungsbeginn!

Der Lehrstuhl für Informatik II bietet regelmäßig im Sommersemester ein Softwarepraktikum in funktionaler Programmierung in der Sprache Haskell an.

Was ist Haskell?

Haskell ist eine moderne funktionale Programmiersprache. Gegenüber älteren funktionalen Programmiersprachen wie Lisp zeichnet sich Haskell insbesondere durch eine lesbarere und komfortablere Syntax, ein sehr ausdrucksstarkes Typsystem (mit objekt-orientierten Konstrukten) und vollständige Seiteneffektfreiheit (referenzielle Transparenz) aus.

Für einen Eindruck hier einige kurze Beispiele:

factorial n = product [1..n]

ggt x y
  | x == 0    = y
  | y == 0    = x
  | x >= y    = ggt (x `mod` y) y
  | otherwise = ggt x (y `mod` x) 


-- Man beachte den Typ von Quicksort:
-- Sortiert werden können alle Listen 
-- auf deren Elementen eine Ordnung definiert ist

quicksort :: Ord a => [a] -> [a]

quicksort []     = []
quicksort (x:xs) =    quicksort [y | y <- xs, y < x]
                   ++ [x]
                   ++ quicksort [y | y <- xs, y >= x]



-- Datentyp Binärbaum mit Suchfunktion

data Tree a 
  = EmptyTree | Node (Tree a) a (Tree a)


elementOfTree :: Eq a => a -> Tree a -> Bool

elementOfTree element EmptyTree = False

elementOfTree element (Node left entry right) 
  =    (element == entry) 
    || elementOfTree element left 
    || elementOfTree element right


-- Ein/Ausgabe:

main :: IO ()

main = do
          putStr "Text eingeben: "
          text <- getLine
          putStr "Text in Grossbuchstaben: " 
          putStr (map toUpper text)
  

Wir werden mit dem Haskell-Interpreter Hugs arbeiten, der auch für den eigenen PC frei verfügbar ist.

Praktikumsaufgabe

Im Praktikum wird eine Laufzeitumgebung für die einfache imperative Programmiersprache PSA programmiert:

  • ein Compiler zur Übersetzung in Code für eine Stackmaschine
  • ein Interpreter für diesen Code
  • ein Backend zur Generierung von ausführbarem Java Bytecode

Es werden einfache Methoden des Compilerbaus eingesetzt. Hierfür sind keine Vorkenntnisse erforderlich.

Beispiel für PSA+ (mit Ein-/Ausgabe)

  • Ein PSA-Programm:
    var n f c h n1 n2;
    n1 := 1
    n2 := 1
    c  := 2
    write "Zahl eingeben:"
    read n
    while c <= n do
        c  := (c+1)
        h  := n2
        n2 := n1
        n1 := (n1+h)
      end
    f := n1
    write "Das Ergebnis ist"
    write f.
    		
  • Der daraus entstehende Stackcode:
    Lit 1
    Sto 5
    Lit 1
    Sto 6
    Lit 2
    Sto 3
    Text "Zahl eingeben:"
    Get
    Sto 1
    Lod 3
    Lod 1
    Le
    Jmc 26
    Lod 3
    Lit 1
    Ad
    Sto 3
    Lod 6
    Sto 4
    Lod 5
    Sto 6
    Lod 5
    Lod 4
    Ad
    Sto 5
    Jmp 9
    Lod 5
    Sto 2
    Text "Das Ergebnis ist"
    Lod 2
    Put
    Halt
    		

Ablauf des Praktikums

Da das Praktikum keine Kenntnisse in Haskell voraussetzt, beginnt es mit einem einwöchigen Kurs, der in der Woche vor Vorlesungsbeginn von Dienstag bis Freitag jeweils von 9:30 Uhr bis 16:30 Uhr stattfindet. Nach jeder Unterrichtsstunde wird das Gelernte am Rechner praktisch geübt. Bitte beachten Sie unsere Webseiten für kurzfristige Raumänderungen!

Während des Semesters erstellen jeweils zwei Teilnehmer zusammen das oben genannte PSA-Laufzeitsystem. Dieses besteht aus 7 Teilen, die jeweils bis zu einem festen Termin abgeschlossen werden müssen. Die Arbeit erfolgt auf Workstations unter Unix. Grundkenntnisse im Arbeiten mit einer Unix-Workstation werden vorausgesetzt. Im Blauen Raum des CIP-Pools erfolgt zu festen Zeiten sowohl Beratung als auch Testatabnahme.

Vorkenntnisse in Haskell oder Compilerbau werden nicht benötigt.

Weitere Informationen

Ich beantworte gerne weitere Fragen zum Praktikum persönlich oder per E-Mail.
Valid HTML 4.01 Strict! Valid CSS!