Zum Inhalt springen

Seed7

aus Wikipedia, der freien Enzyklopädie
Seed7
[[Datei:Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)|150px]]
Basisdaten
Paradigmen: Multiparadigmen (erweiterbar, objektorientiert, imperativ, prozedural strukturiert, generisch, reflexiv)
Erscheinungsjahr: Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
Designer: Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value)
Entwickler: Thomas Mertes
Aktuelle Version Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value) (Lua-Fehler in Modul:Wikidata, Zeile 1703: attempt to index field 'wikibase' (a nil value))
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<ref name="Zingaro2007">Zingaro, Daniel, "Modern Extensible Languages", SQRL Report 47 McMaster University (October 2007), page 16.</ref>, 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.<ref name="Abrial2010">Abrial, Jean-Raymond and Glässer, Uwe, "Rigorous Methods for Software Construction and Analysis", ISBN 978-3-642-11446-5, Springer, 2010, page 166.</ref> 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.

Eigenschaften[Bearbeiten]

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 fest einkodiert. 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 oder UTF-8.

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.

Hallo Welt[Bearbeiten]

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;

Bibliotheken[Bearbeiten]

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<ref>Seed7-Bibliotheken</ref> beinhalten Abstraktionsschichten für Hardware und Betriebssystem. Dadurch sind praktisch keine Änderungen notwendig, wenn Seed7-Programme auf andere Rechnerarchitekturen oder Betriebssysteme portiert werden.

Geschichte[Bearbeiten]

Seed7 basiert auf MASTER, einer erweiterbaren Programmiersprache, die in der Diplomarbeit und der Dissertation von Thomas Mertes beschrieben wurde.<ref name="Mertes1984">Mertes, Thomas, „Entwurf einer erweiterbaren höheren Programmiersprache“, Diplomarbeit Technische Universität Wien (1984).</ref><ref name="Mertes1986">Mertes, Thomas, „Definition einer erweiterbaren höheren Programmiersprache“, Dissertation Technische Universität Wien (1986).</ref> 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 im ursprünglichen Projekt jedoch nicht realisiert wurde. 1989 begann die Entwicklung eines Interpreters für MASTER unter dem Namen HAL. Im Jahr 2005 wurde das MASTER- bzw. HAL-Projekt unter dem Namen Seed7 veröffentlicht (als Open-Source-Projekt). In der Version 2026-07-11 enthält das Projekt Seed7 mehr als 500.000 Programmzeilen und mehrere hundert Seiten an Dokumentation. Die Entwicklung begann zunächst auf SourceForge, hat sich aber inzwischen zunehmend nach GitHub verlagert.

Erweiterbarkeit[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.<ref name="Zingaro2007" />

Syntaxdefinition[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]

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]

Weblinks[Bearbeiten]

Einzelnachweise[Bearbeiten]

<references />