„Opal (Programmiersprache)“ – Versionsunterschied
[ungesichtete Version] | [ungesichtete Version] |
→Weblinks: opalix | Wizzar (Diskussion | Beiträge) K typo | ||
Zeile 1: | Zeile 1: | ||
'''Opal''' ist eine [[funktionale Programmiersprache]], die [[1986]] an der [[Technische Universität Berlin|TU Berlin]] entwickelt wurde. Die Sprache diente dort vor allem als Testumgebung. Anfangs ging es zunächst darum, die Sprache effizient zu | '''Opal''' ist eine [[funktionale Programmiersprache]], die [[1986]] an der [[Technische Universität Berlin|TU Berlin]] entwickelt wurde. Die Sprache diente dort vor allem als Testumgebung. Anfangs ging es zunächst darum, die Sprache effizient zu implementieren. Später wurde das komplette Feld funktionaler Konzepte mit einbezogen. Dazu gehören insbesondere: | ||
*Prinzipien des Software-Engineering | *Prinzipien des Software-Engineering | ||
*Integration formaler Spezifikation | *Integration formaler Spezifikation |
Version vom 19. Dezember 2005, 04:51 Uhr
Opal ist eine funktionale Programmiersprache, die 1986 an der TU Berlin entwickelt wurde. Die Sprache diente dort vor allem als Testumgebung. Anfangs ging es zunächst darum, die Sprache effizient zu implementieren. Später wurde das komplette Feld funktionaler Konzepte mit einbezogen. Dazu gehören insbesondere:
- Prinzipien des Software-Engineering
- Integration formaler Spezifikation
- parallele Programmierung
Im Gegensatz zu anderen funktionalen Sprachen wie Haskell ist Opal nicht standardisiert. Das erlaubt den Entwicklern, viel mit diversen Merkmalen, die sie für interessant erachten, zu experimentieren
Der grobe Aufbau eines OPAL-Programms
OPAL-Programme (Strukturen, siehe auch Algebraische Struktur) bestehen aus einem Signaturteil (Dateiendung .sign) und einem Implementationsteil (Dateiendung .impl). Im Signaturteil werden die Sorten sowie die Definitions- und Wertebereiche aller Funktionen beschrieben. Hierzu wird das Schlüsselwort "FUN" gebraucht:
"FUN f: nat ** nat -> nat" deklariert beispielsweise eine Funktion "f", deren Definitionsbereich ein Tupel aus zwei Werten vom Typ "nat" (für natürliche Zahlen) und deren Wertebereich ebenfalls die Sorte "nat" darstellt. Das Schlüsselwort "FUN" darf auch im Implementationsteil stehen, solche Funktionen können dann aber nur in der jeweiligen Struktur verwendet werden.
In der Implementation werden die Funktionen mit dem Schlüsselwort "DEF" implementiert (siehe Beispiele). Ebenfalls in der Implementation wird mit dem Wort "DATA" ein selbstdefinierter Datentyp beschrieben, dessen Signatur in der .sign-Datei mittels "TYPE" auch global bekanntgegeben werden kann.
Beispiele
Fibonacci
Ein Beispiel für eine Implementierung der Fibonaccifunktion unter Verwendung einer Lambda-Abstraktion:
DEF fibo == \\n. IF n = 0 THEN 0 IF n = 1 THEN 1 IF n >= 2 THEN fibo(n-1)+fibo(n-2) FI
Quicksort
Ein Beispiel für eine Implementierung des Quicksortalgorithmus:
DEF sort(<>) == <> DEF sort(a :: R) == LET Small == (_ < a) | R Medium == a :: (_ = a) | R Large == (_ > a) | R IN sort(Small)++Medium++sort(Large)
Beispiele für Datentypen
Während in der Theorie zwischen verschiedenen Formen von Datentypen unterschieden wird, hat OPAL nur ein Konstrukt, um eigene Typen zu definieren.
Ein Beispiel für eine Implementierung eines Produkttypen
DATA point3D == point3D(x:real, y:real, z:real)
... eines Summentypen
DATA object3D == cube(widht: real, height: real, length: real, location: point3D) cylinder(height: real, radius: real, location: point3D) sphere(radius: real, location: point3D)
... eines Aufzählungstypen
DATA traffic_light == red yellow green
Datentypdeklarationen (TYPE) ersetzt der OPAL-Compiler intern durch die sogenannte "induzierte Signatur". Das Schlüsselwort "DATA" fügt auch Implementierungen der Funktionen hinzu, die dem Programmierer dann die Möglichkeit geben, Werte der selbstdefinierten Sorte zu ergzeugen, auf die einzelnen Elemente der Datenstruktur zuzugreifen und zwischen Varianten zu unterscheiden:
Z.B. die induzierte Signatur für den Summentyp
-- Sorte SORT object3D -- Konstruktorfunktionen FUN cube: real ** real ** real ** point3D -> object3D FUN cylinder: real ** real ** point3D -> object3D FUN sphere: real ** point3D -> object3D -- Selektorfunktionen FUN width hight length radius: object3D -> real FUN location: object3D -> real -- Diskrimitatorfunktionen FUN cube?: object3D -> bool FUN cylinder?: object3D -> bool FUN sphere?: object3D -> bool
Literatur
- Pepper, Peter: Funktionale Programmierung in Opal, ML, Haskell und Gofer, 1999, Springer-Verlag, ISBN 3-540-64541-1
Weblinks
- Webseite des Opalprojektes
- OPAL-Report Komplexe Beschreibung der Syntax und Semantik von OPAL
- Bibliotheca Opalica Dokumentation der OPAL-API
- Übersicht Opal im Wiki von Freitagsrunde.org Dort findet sich u.a. die Opalix Live-CD
- Unauthorized Tutorial for OPAL