Seed7
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 | |
---|---|
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 |
Eigenschaften
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:
- benutzerdefinierte Anweisungen und Operatoren
- abstrakte Datentypen
- Templates ohne spezielle Syntax
- OO mit Interfaces und multiple dispatch
- Statische Typisierung
- Kann interpretiert oder kompiliert werden
- Quellcode-Portabilität
- Läuft unter Linux, Windows, Mac OS, BSD, Unix
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.
Hallo Welt
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
Seed7 hat viele Bibliotheken, die verschiedenste Bereiche abdecken:
- Container,
- numerische Funktionen,
- lexikalische Scanner,
- Dateimanipulationen,
- Netzwerke (Sockets, TLS/SSL, HTTP, HTTPS, FTP, SMTP etc.),
- Graphik,
- bitmap und vektor Schrift,
- Datenbankzugriff (MySQL, MariaDB, SQLite, PostgreSQL, Oracle, ODBC, Firebird, InterBase),
- CGI Unterstützung,
- Datenkompression,
- Zeichenkodierung,
- Verarbeiten von Datum und Uhrzeit,
- XML Verarbeitung,
- Kryptologische Hashfunktionen.
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.
Geschichte
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
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
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
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
- 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.
Weblinks
- Seed7 Homepage – Enthält FAQ, Handbuch, Screenshots, Beispiele, Bibliotheken und eine Sammlung von Algorithmen (englisch)
- Seed7 auf GitHub
- Seed7 von Sourceforge herunterladen
- Seed7 auf Rosetta Code – Enthält viele Seed7 Beispiele (englisch)
- Zusammenfassung der Diplomarbeit von Thomas Mertes
- Zusammenfassung der Dissertation von Thomas Mertes
- Dissertation von Thomas Mertes
- Artikel von Daniel Zingaro, McMaster University, Hamilton, Ontario, Canada über "Modern Extensible Languages". (alternativer Link) (Absatz über Seed7 auf Seite 16) (englisch)
- Buch von Abrial, Jean-Raymond und Glässer, Uwe: Rigorous Methods for Software Construction and Analysis (siehe Seite 166) (englisch)
- The Quest for the Ultimate Cycle (Memento vom 25. Oktober 2013 im Internet Archive) erforscht die 3n+C Erweiterung des Collatz-Problems mit Seed7 Programmen (englisch)
- Blog von Remo Laubacher: Statically linked Linux executables with GCJ, Seed7 and haXe (englisch)
- Blog von David Gudeman The Seed7 Programming Language (englisch)
- Ein FreeBSD port / siehe auch hier, betreut von Pietro Cerutti
- Ein OpenBSD port, betreut von Brian Callahan
- Ein Seed7 Paket für openSUSE/Fedora
Einzelnachweise
- sourceforge.net.
- Zingaro, Daniel, "Modern Extensible Languages", SQRL Report 47 McMaster University (October 2007), page 16.
- Abrial, Jean-Raymond and Glässer, Uwe, "Rigorous Methods for Software Construction and Analysis", ISBN 978-3-642-11446-5, Springer, 2010, page 166.
- Seed7-Bibliotheken
- Mertes, Thomas, "Entwurf einer erweiterbaren höheren Programmiersprache", Diplomarbeit Technische Universität Wien (1984).
- Mertes, Thomas, "Definition einer erweiterbaren höheren Programmiersprache", Dissertation Technische Universität Wien (1986).