Seed7

Seed7
Paradigmen: Multiparadigmen (erweiterbar, objektorientiert, imperativ, prozedural strukturiert, generisch, reflexiv)
Erscheinungsjahr: 2005
Entwickler: Thomas Mertes
Aktuelle Version 2023-01-30[1] (30. Januar 2023)
Typisierung: statisch, stark, typsicher
Wichtige Implementierungen: Open-Source-Referenzimplementierung
Beeinflusst von: Pascal, Modula-2, Ada, Algol 68, C, C++, Java
Betriebssystem: plattformunabhängig (Linux, Windows, Mac OS, BSD, Unix)
Lizenz: GPL, LGPL (für die Laufzeitbibliothek)
seed7.sourceforge.net

Seed7 ist eine erweiterbare Programmiersprache, die von Thomas Mertes erfunden wurde. Syntaktisch ist sie Pascal und Ada ähnlich. Zusätzlich zu vielen anderen Eigenschaften gibt es einen Erweiterungsmechanismus[2], der es erlaubt, die Sprache mit neuer Syntax und der dazugehörigen Semantik zu erweitern und es außerdem ermöglicht, neue Sprachkonstrukte in Seed7 selbst zu definieren.[3] So können sowohl Syntax als auch Semantik für neue Anweisungen definiert werden als auch benutzerdefinierte Operatorsymbole eingeführt werden. Die Implementierung von Seed7 unterscheidet sich daher deutlich von der Implementierung anderer Sprachen mit hartkodierter Syntax und Semantik.

Seed7 unterstützt neben dem imperativen, objektorientierten und generischem Paradigma auch Technologien wie Namensparameter (call by name), Multimethoden (multiple dispatch), Funktionsüberladung, Operatorüberladung, Ausnahmebehandlung und Langzahlarithmetik. Zu den wesentlichen Eigenschaften gehören:

Etliche Programmiersprachkonzepte wurden generalisiert:

  • Typdeklarationen (sie versehen einen Typ mit einem Namen) und Funktionsdefinitionen haben die Form von Konstantendefinitionen.
  • Ausdrücke die zur Übersetzungszeit ausgewertet werden, können auch benutzerdefinierte Funktionen aufrufen.
  • Überladen und Objektorientierung (mit Multimethoden) haben ein gemeinsames Konzept. Sie finden nur zu unterschiedlichen Zeitpunkten (Übersetzungszeit beziehungsweise Laufzeit) statt.
  • Typnamen und Typbeschreibungen können als Parameter und Funktionsergebnis verwendet werden.
  • Funktionen, die zur Übersetzungszeit ausgeführt werden, können benutzt werden, um Objekte zu deklarieren.
  • Templates werden als Übersetzungszeitfunktionen mit Typen als Parameter realisiert.
  • Arrays, Hashtabellen und Structs sind nicht hartkodiert. Stattdessen sind sie als abstrakter Datentyp in Programmbibliotheken definiert.
  • Parser und Interpreter sind Teil der Laufzeitbibliothek.
  • Die Unicode Unterstützung basiert auf UTF-32. Das vermeidet Probleme einer Kodierung mit variabler Länge wie etwa bei UTF-16.

Das Seed7-Projekt enthält sowohl einen Compiler als auch einen Interpreter, wodurch schnelle Programmentwicklung unterstützt wird. Der Seed7-Compiler nützt den Parser und eine Reflexionsschnittstelle aus der Laufzeitbibliothek, um ein C-Programm zu erzeugen, das anschließend in Maschinensprache kompiliert wird. Kompilierte Seed7-Programme haben eine ähnliche Laufzeit wie C-Programme.

Folgender Seed7-Quellcode gibt bei Ausführung Hallo Welt! aus.

$ include "seed7_05.s7i";

const proc: main is func
  begin
    writeln("Hallo Welt!");
  end func;

Seed7 hat viele Bibliotheken, die verschiedenste Bereiche abdecken:

Dadurch ist der Bedarf an direkten Betriebssystemaufrufen und externen Bibliotheken verhältnismäßig gering, und Seed7-Bibliotheken[4] beinhalten Abstraktionsschichten für Hardware und Betriebssystem. Dadurch sind praktisch keine Änderungen notwendig, wenn Seed7-Programme auf andere Rechnerarchitekturen oder Betriebssysteme portiert werden.

Seed7 basiert auf MASTER, einer erweiterbaren Programmiersprache, die in der Diplomarbeit und der Dissertation von Thomas Mertes beschrieben wurde.[5][6] Die meisten der ursprünglichen Ideen von MASTER wie z. B. die benutzerdefinierbaren Anweisungen und Operatoren, kann man in Seed7 finden. Es war geplant, einen Präprozessor für MASTER zu erstellen, der wurde aber letztendlich im ursprünglichen Projekt nicht realisiert. 1989 begann die Entwicklung eines Interpreters für MASTER unter dem Namen HAL. 2005 wurde das MASTER- bzw. HAL-Projekt unter dem Namen Seed7 veröffentlicht ("open source"). In der Version 2013-09-08 enthält das Projekt Seed7 mehr als 300.000 Programmzeilen und mehrere hundert Seiten an Dokumentation.

Erweiterbarkeit

[Bearbeiten | Quelltext bearbeiten]

Die Erweiterbarkeit beruht auf zwei Teilen: Eine Syntaxdefinition, die ein Muster für eine neue Syntax vorgibt, und eine normale Funktionsdefinition, die benutzt wird, um die Semantik zu definieren.[2]

Syntaxdefinition

[Bearbeiten | Quelltext bearbeiten]

Eine Syntaxdefinition benutzt die Seed7 Structured Syntax Description (S7SSD). Eine S7SSD-Anweisung wie

$ syntax expr: .(). + .() is -> 7;

definiert die Syntax des + Operators. Der Pfeil nach rechts -> beschreibt die Assoziativität: Das + ist ein linksassoziativer Operator, der von links nach rechts ausgewertet wird. Mit 7 wird die Priorität des + Operators definiert. Das Syntaxmuster .(). + .() beginnt mit einem Punkt (.) und ist durch Punkte strukturiert. Ohne Punkte ist das Syntaxmuster () + () Das Symbol () ist ein Nichtterminalsymbol und + ist ein Terminalsymbol. In der S7SSD wird nicht zwischen verschiedenen Nichtterminalsymbolen unterschieden. Stattdessen gibt es nur ein Nichtterminalsymbol: ().

Semantische Erweiterung

[Bearbeiten | Quelltext bearbeiten]

Die Definition des + Operators für komplexe Zahlen ist eine normale Funktionsdefinition:

const func complex: (in complex: summand1) + (in complex: summand2) is func
  result
    var complex: sum is complex.value;
  begin
    sum.re := summand1.re + summand2.re;
    sum.im := summand1.im + summand2.im;
  end func;

Weiterführende Literatur

[Bearbeiten | Quelltext bearbeiten]
  • Jean-Raymond Abrial, Uwe Glässer: Rigorous Methods for Software Construction and Analysis. 1. Auflage. Springer Berlin Heidelberg, 2010, ISBN 978-3-642-11446-5.

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. sourceforge.net.
  2. a b Zingaro, Daniel, "Modern Extensible Languages", SQRL Report 47 McMaster University (October 2007), page 16.
  3. Abrial, Jean-Raymond and Glässer, Uwe, "Rigorous Methods for Software Construction and Analysis", ISBN 978-3-642-11446-5, Springer, 2010, page 166.
  4. Seed7-Bibliotheken
  5. Mertes, Thomas, "Entwurf einer erweiterbaren höheren Programmiersprache", Diplomarbeit Technische Universität Wien (1984).
  6. Mertes, Thomas, "Definition einer erweiterbaren höheren Programmiersprache", Dissertation Technische Universität Wien (1986).