# 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, 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. 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

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.

## 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 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. 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.

### Syntaxdefinition

Eine Syntaxdefinition benutzt die Seed7 Structured Syntax Description (S7SSD). Eine S7SSD-Anweisung wie
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:

## 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.