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:
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.
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]
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: ()
.
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;