<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Opal_%28Programmiersprache%29</id>
	<title>Opal (Programmiersprache) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Opal_%28Programmiersprache%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Opal_(Programmiersprache)&amp;action=history"/>
	<updated>2026-06-04T12:30:04Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Opal_(Programmiersprache)&amp;diff=449266&amp;oldid=prev</id>
		<title>imported&gt;TaxonBot: Bot: Auflösung doppelter toter Links nach https://de.wikipedia.org/w/index.php?title=Wikipedia:Bots/Anfragen&amp;oldid=266185123#Aufl%C3%B6sung_der_doppelten_Toten_Links</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Opal_(Programmiersprache)&amp;diff=449266&amp;oldid=prev"/>
		<updated>2026-04-17T11:07:29Z</updated>

		<summary type="html">&lt;p&gt;Bot: Auflösung doppelter toter Links nach https://de.wikipedia.org/w/index.php?title=Wikipedia:Bots/Anfragen&amp;amp;oldid=266185123#Aufl%C3%B6sung_der_doppelten_Toten_Links&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;OPAL&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;Optimized Applicative Language&amp;#039;&amp;#039;) ist eine [[funktionale Programmiersprache]], die [[1986]] an der [[Technische Universität Berlin|TU Berlin]] unter der Leitung von [[Peter Pepper]] 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:&lt;br /&gt;
* Prinzipien des [[Software-Engineering]]&lt;br /&gt;
* Integration [[Formale Spezifikation|formaler Spezifikation]]&lt;br /&gt;
* [[parallele Programmierung]]&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu anderen funktionalen Sprachen wie [[Haskell (Programmiersprache)|Haskell]] ist OPAL nicht standardisiert. Das erlaubt den Entwicklern, viel mit diversen Merkmalen, die sie für interessant erachten, zu experimentieren.&lt;br /&gt;
&lt;br /&gt;
== Der grobe Aufbau eines OPAL-Programms ==&lt;br /&gt;
&lt;br /&gt;
OPAL-Programme (Strukturen, siehe auch [[Algebraische Struktur]]) bestehen aus einem Signaturteil (Dateiendung &amp;lt;code&amp;gt;.sign&amp;lt;/code&amp;gt;) und einem Implementationsteil (Dateiendung &amp;lt;code&amp;gt;.impl&amp;lt;/code&amp;gt;). Im Signaturteil werden die Sorten sowie die Definitions- und Wertebereiche aller Funktionen beschrieben. Hierzu wird das Schlüsselwort &amp;lt;code&amp;gt;FUN&amp;lt;/code&amp;gt; gebraucht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
   FUN f: nat ** nat -&amp;gt; nat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
deklariert beispielsweise eine Funktion &amp;#039;&amp;#039;f&amp;#039;&amp;#039;, deren Definitionsbereich ein Tupel aus zwei Werten vom Typ &amp;lt;code&amp;gt;nat&amp;lt;/code&amp;gt; (für natürliche Zahlen) und deren Wertebereich ebenfalls die Sorte &amp;lt;code&amp;gt;nat&amp;lt;/code&amp;gt; darstellt. Das Schlüsselwort &amp;lt;code&amp;gt;FUN&amp;lt;/code&amp;gt; darf auch im Implementationsteil stehen, solche Funktionen können dann aber nur in der jeweiligen Struktur verwendet werden.&lt;br /&gt;
&lt;br /&gt;
Im Quellcode werden die Funktionen mit dem Schlüsselwort &amp;lt;code&amp;gt;DEF&amp;lt;/code&amp;gt; implementiert (siehe Beispiele). Ebenfalls in der Implementation wird mit dem Wort &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; ein selbstdefinierter Datentyp beschrieben, dessen Signatur in der &amp;lt;code&amp;gt;.sign&amp;lt;/code&amp;gt;-Datei mittels &amp;lt;code&amp;gt;TYPE&amp;lt;/code&amp;gt; auch global bekanntgegeben werden kann.&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
=== Fibonacci ===&lt;br /&gt;
Ein Beispiel für eine Implementierung der [[Fibonacci-Folge|Fibonaccifunktion]] unter Verwendung einer [[Lambda-Kalkül|Lambda-Abstraktion]]:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
    DEF fibo == \\n.&lt;br /&gt;
      IF n = 0 THEN 0&lt;br /&gt;
      IF n = 1 THEN 1&lt;br /&gt;
      IF n &amp;gt;= 2 THEN fibo(n-1)+fibo(n-2) FI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine effizientere Implementierung der obigen Folge unter Verwendung von [[Edsger W. Dijkstra|Dijkstra]]-IF sowie [[Überladen|Overloading]].&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
 FUN fib: nat -&amp;gt; nat&lt;br /&gt;
 DEF fib(x) ==&lt;br /&gt;
   IF x=0 THEN 0&lt;br /&gt;
   IF x=1 THEN 1&lt;br /&gt;
   IF x&amp;gt;1 THEN fib(2, 1, 1, x)&lt;br /&gt;
   FI&lt;br /&gt;
&lt;br /&gt;
 FUN fib: nat ** nat ** nat ** nat -&amp;gt; nat&lt;br /&gt;
 -- idx : momentaner Index&lt;br /&gt;
 -- p1 : fib(idx)&lt;br /&gt;
 -- p2 : fib(idx-1)&lt;br /&gt;
 -- max : der Index des zu berechnenden Folgengliedes&lt;br /&gt;
 -- Beispiel: fib(6) -&amp;gt; fib(2, 1, 1, 6) -&amp;gt; fib(3, 2, 1, 6) -&amp;gt; fib(4, 3, 2, 6) -&amp;gt;&lt;br /&gt;
 -- fib(5, 5, 3, 6) -&amp;gt; fib(6, 8, 5, 6) =&amp;gt; 8&lt;br /&gt;
 DEF fib(idx, p1, p2, max) ==&lt;br /&gt;
   IF idx&amp;lt;max THEN fib(idx+1, p1+p2, p1, max)&lt;br /&gt;
   IF idx=max THEN p1&lt;br /&gt;
   FI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Quicksort ===&lt;br /&gt;
Ein Beispiel für eine Implementierung des [[Quicksort]]algorithmus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
 FUN sort: seq[nat] -&amp;gt; seq[nat]&lt;br /&gt;
 DEF sort(&amp;lt;&amp;gt;) == &amp;lt;&amp;gt;&lt;br /&gt;
  -- Die leere Sequenz (geschrieben als &amp;lt;&amp;gt;) ist bereits sortiert&lt;br /&gt;
&lt;br /&gt;
 DEF sort(a :: R) ==&lt;br /&gt;
   LET&lt;br /&gt;
     Small == (_ &amp;lt; a) | R&lt;br /&gt;
       -- Sei Small die Sequenz R, gefiltert mit der Funktion &amp;quot;&amp;lt; a&amp;quot;. Small besteht damit aus allen Elementen in R, die kleiner sind als a&lt;br /&gt;
       -- Small entsteht aus der Applikation der Funktion &amp;quot;|&amp;quot; (Filter) auf die Argumente &amp;quot;(_ &amp;lt; a)&amp;quot;, einer Funktion nat -&amp;gt; bool, und der Sequenz &amp;quot;R&amp;quot;&lt;br /&gt;
       -- Opal erlaubt die Prefix-, Infix- und Postfix-Notation, sowie die Vergabe von Identifikatoren aus Sonderzeichen.&lt;br /&gt;
       --  Der o.a. Ausdruck ist identisch zu &amp;quot;| ( _ &amp;lt; a, R)&amp;quot;&lt;br /&gt;
     Medium == a :: (_ = a) | R&lt;br /&gt;
       -- Medium enthält das erste Element a und alle Elemente in R, die gleich a sind&lt;br /&gt;
     Large == (_ &amp;gt; a) | R&lt;br /&gt;
       -- Large ist dann die Sequenz, die alle Zahlen aus R enthält, die größer als a sind&lt;br /&gt;
   IN&lt;br /&gt;
     sort(Small)++Medium++sort(Large)&lt;br /&gt;
     -- Das Resultat ist die Konkatenation der ihrerseits sortierten Sequenz Small, Medium und der sortierten Sequenz Large.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Selectionsort ===&lt;br /&gt;
Ein Beispiel für eine Implementierung des [[Selectionsort]]algorithmus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
 FUN ssort: seq[nat] -&amp;gt; seq[nat]&lt;br /&gt;
 DEF ssort(&amp;lt;&amp;gt;) == &amp;lt;&amp;gt;&lt;br /&gt;
 DEF ssort(liste) ==&lt;br /&gt;
   LET&lt;br /&gt;
     minimum == min(liste)&lt;br /&gt;
     restliste == cut(minimum,liste)&lt;br /&gt;
   IN&lt;br /&gt;
     minimum :: ssort(restliste)&lt;br /&gt;
 FUN cut: nat ** seq[nat] -&amp;gt; seq[nat]&lt;br /&gt;
 DEF cut(x,a::A) ==&lt;br /&gt;
   IF a = x THEN A&lt;br /&gt;
   ELSE a :: cut(x,A) FI&lt;br /&gt;
 FUN min: seq[nat] -&amp;gt; nat&lt;br /&gt;
 DEF min(a::A) == minHelp(a,A)&lt;br /&gt;
 FUN minHelp: nat ** seq[nat] -&amp;gt; nat&lt;br /&gt;
 DEF minHelp(a,&amp;lt;&amp;gt;) == a&lt;br /&gt;
 DEF minHelp(a,A) ==&lt;br /&gt;
   IF a &amp;lt; ft(A) THEN minHelp(a,rt(A))&lt;br /&gt;
   ELSE minHelp(ft(A),rt(A)) FI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Insertionsort ===&lt;br /&gt;
Ein Beispiel für eine Implementierung des [[Insertionsort]]algorithmus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
 FUN isort: seq[nat] -&amp;gt; seq[nat]&lt;br /&gt;
 DEF isort(&amp;lt;&amp;gt;) == &amp;lt;&amp;gt;&lt;br /&gt;
 DEF isort(a::A) == a insert isort (A)&lt;br /&gt;
 FUN insert: nat ** seq[nat] -&amp;gt; seq[nat]&lt;br /&gt;
 DEF x insert &amp;lt;&amp;gt; == x :: &amp;lt;&amp;gt;&lt;br /&gt;
 DEF x insert (a::A) ==&lt;br /&gt;
   IF x &amp;lt;= a THEN x::(a::A)&lt;br /&gt;
   ELSE a::(x insert A)&lt;br /&gt;
   FI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mergesort ===&lt;br /&gt;
Ein Beispiel für eine Implementierung des [[Mergesort]]algorithmus:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
 FUN msort: seq[nat] -&amp;gt; seq[nat]&lt;br /&gt;
 DEF msort(&amp;lt;&amp;gt;) == &amp;lt;&amp;gt;&lt;br /&gt;
 DEF msort(a:: &amp;lt;&amp;gt;) == a:: &amp;lt;&amp;gt;&lt;br /&gt;
 DEF msort(liste) ==&lt;br /&gt;
   LET&lt;br /&gt;
     i == #(liste)/2&lt;br /&gt;
     (links, rechts) == split(i,liste)&lt;br /&gt;
   IN&lt;br /&gt;
     msort(links) merge msort(rechts)&lt;br /&gt;
 FUN merge: seq[nat] ** seq[nat] -&amp;gt; seq[nat]&lt;br /&gt;
 DEF &amp;lt;&amp;gt; merge &amp;lt;&amp;gt; == &amp;lt;&amp;gt;&lt;br /&gt;
 DEF a merge &amp;lt;&amp;gt; == a&lt;br /&gt;
 DEF &amp;lt;&amp;gt; merge a == a&lt;br /&gt;
 DEF (a::A) merge (b::B) ==&lt;br /&gt;
   IF a &amp;lt;= b THEN a::( A merge (b::B) )&lt;br /&gt;
   ELSE b::( B merge (a::A) )&lt;br /&gt;
   FI&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiele für Datentypen ==&lt;br /&gt;
Während in der Theorie zwischen verschiedenen Formen von [[Datentyp]]en unterschieden wird, hat OPAL nur ein Konstrukt, um eigene Typen zu definieren.&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel für eine Implementierung eines Produkttyps&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
 DATA point3D == point3D(x:real, y:real, z:real)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
… eines [[Verbund (Datentyp)|Summentyps]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
 DATA object3D == cube(width: real, height: real, length: real, location: point3D)&lt;br /&gt;
                 cylinder(height: real, radius: real, location: point3D)&lt;br /&gt;
                 sphere(radius: real, location: point3D)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
… eines [[Aufzählungstyp]]s&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
 DATA traffic_light == red&lt;br /&gt;
                    yellow&lt;br /&gt;
                    green&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Deklaration (Programmierung)|Datentypdeklarationen]] (TYPE) ersetzt der OPAL-[[Compiler]] intern durch die sogenannte „induzierte Signatur“. Das Schlüsselwort &amp;lt;code&amp;gt;DATA&amp;lt;/code&amp;gt; fügt auch Implementierungen der Funktionen hinzu, die dem Programmierer dann die Möglichkeit geben, Werte der selbstdefinierten Sorte zu erzeugen, auf die einzelnen Elemente der Datenstruktur zuzugreifen und zwischen Varianten zu unterscheiden:&lt;br /&gt;
&lt;br /&gt;
Z.&amp;amp;nbsp;B. die induzierte Signatur für den Summentyp&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;erlang&amp;quot;&amp;gt;&lt;br /&gt;
 -- Sorte&lt;br /&gt;
  SORT object3D&lt;br /&gt;
 -- Konstruktorfunktionen&lt;br /&gt;
  FUN cube: real ** real ** real ** point3D -&amp;gt; object3D&lt;br /&gt;
  FUN cylinder: real ** real ** point3D -&amp;gt; object3D&lt;br /&gt;
  FUN sphere: real ** point3D -&amp;gt; object3D&lt;br /&gt;
 -- Selektorfunktionen&lt;br /&gt;
  FUN width height length radius: object3D -&amp;gt; real&lt;br /&gt;
  FUN location: object3D -&amp;gt; point3D&lt;br /&gt;
 -- Diskriminatorfunktionen&lt;br /&gt;
  FUN cube?: object3D -&amp;gt; bool&lt;br /&gt;
  FUN cylinder?: object3D -&amp;gt; bool&lt;br /&gt;
  FUN sphere?: object3D -&amp;gt; bool&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
* Peter Pepper: &amp;#039;&amp;#039;Funktionale Programmierung in OPAL, ML, HASKELL und GOFER&amp;#039;&amp;#039;. Springer-Verlag, 1999, ISBN 3-540-64541-1&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
*{{Toter Link |datum=2021-04 |url=https://projects.uebb.tu-berlin.de/opal/trac/ |text=Webseite des OPAL-Projektes}}&lt;br /&gt;
* [https://projects.uebb.tu-berlin.de/opal/dosfop/2.4/bibopalicaman/ Bibliotheca Opalica] Dokumentation der OPAL-API{{Toter Link |url=https://projects.uebb.tu-berlin.de/opal/dosfop/2.4/bibopalicaman/ |date=2021-04}}&lt;br /&gt;
*[https://github.com/TU-Berlin/opal Quelltextarchiv des OPAL-Projekts] auf dem GitHub der TU Berlin&lt;br /&gt;
* [http://wiki.freitagsrunde.org/%C3%9Cbersicht_Opal Übersicht OPAL] im Wiki von Freitagsrunde.org – Dort findet sich u.&amp;amp;nbsp;a. die Opalix Live-CD&lt;br /&gt;
* {{Toter Link |datum=2021-04 |url=http://opal.gehaxelt.in/ |text=Opal-Programme online schreiben und ausführen}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Funktionale Programmiersprache]]&lt;/div&gt;</summary>
		<author><name>imported&gt;TaxonBot</name></author>
	</entry>
</feed>