Graine7 - Seed7

Graine7
Paradigme multi-paradigme : extensible , orienté objet , impératif , structuré , générique , réflexif
Conçu par Thomas Mertès
Première apparition 2005 ; il y a 16 ans ( 2005 )
Version stable
2021-08-07 / il y a 69 jours
Discipline de frappe statique , fort , sûr , nominatif , manifeste
Système d'exploitation Multiplateforme : BSD , Linux , OS X , Unix , Windows
Licence GPL , LGPL (pour la bibliothèque d'exécution)
Extensions de nom de fichier .sd7, .s7i
Site Internet seed7 .sourceforge .net
Les principales mises en œuvre
implémentation de référence open source
Influencé par
Pascal , Modula-2 , Ada , ALGOL 68 , C , C++ , Java

Seed7 est un langage de programmation polyvalent extensible conçu par Thomas Mertes. Il est syntaxiquement similaire à Pascal et Ada . Avec de nombreuses autres fonctionnalités, il fournit un mécanisme d'extension. Seed7 prend en charge l'introduction de nouveaux éléments de syntaxe et de leur sémantique dans le langage, et permet de définir et d'écrire de nouvelles constructions de langage dans Seed7. Par exemple, les programmeurs peuvent introduire la syntaxe et la sémantique de nouvelles instructions et des symboles d' opérateur définis par l'utilisateur . L'implémentation de Seed7 diffère considérablement de celle des langages avec une syntaxe et une sémantique codées en dur .

Caractéristiques

Seed7 prend en charge les paradigmes de programmation : impératif , orienté objet (OO) et générique . Il dispose également des supports tels que l' appel par le nom , l' envoi multiple , la surcharge de fonctions , la surcharge de l' opérateur , la gestion des exceptions et l' arithmétique de précision arbitraire .

Les principales caractéristiques comprennent :

Plusieurs concepts de langage de programmation sont généralisés :

Le projet Seed7 comprend à la fois un interpréteur et un compilateur . L'interprète démarre les programmes très rapidement, ce qui permet un développement rapide des programmes. Le compilateur utilise les interfaces d' analyseur et de réflexion de la bibliothèque d'exécution pour générer un programme C , qui est ensuite compilé en code machine . Les programmes Seed7 compilés peuvent avoir des performances comparables aux programmes C.

Bibliothèques

Seed7 possède de nombreuses bibliothèques, couvrant des domaines tels que les conteneurs , les fonctions numériques, l'analyse lexicale , la manipulation de fichiers, la mise en réseau ( sockets , Transport Layer Security (TLS/SSL), Hypertext Transfer Protocol (HTTP), HTTP Secure ( HTTPS ), File Transfer Protocol (FTP) ), Simple Mail Transfer Protocol (SMTP), etc.), graphiques , polices pixmap et vectorielles , API indépendante de la base de données , prise en charge de Common Gateway Interface (CGI), compression de données , fichiers d'archive ( tar , zip , cpio , ar , rpm ), codage de caractères , gestion de l'heure et de la date, traitement XML , résumés de messages et plus encore. Ces bibliothèques réduisent le besoin d'utiliser directement les fonctionnalités du système d'exploitation non portables et les bibliothèques tierces (qui peuvent ne pas toujours être présentes). Les bibliothèques Seed7 contiennent des couches d'abstraction pour le matériel , le système d'exploitation et les bibliothèques tierces, par exemple les bibliothèques graphiques et de base de données. En d'autres termes, aucune modification n'est nécessaire pour déplacer les programmes Seed7 entre différents processeurs ou systèmes d'exploitation .

bibliothèque TLS

Seed7 a sa propre implémentation de Transport Layer Security . La bibliothèque comprend AES et la cryptographie à courbe elliptique .

API d'abstraction de base de données

Seed7 fournit une bibliothèque avec une API indépendante de la base de données . Les programmes peuvent se connecter aux bases de données MySQL , MariaDB , SQLite , PostgreSQL , Oracle , Open Database Connectivity (ODBC), Firebird , InterBase , Db2 et SQL Server . Indépendamment de la base de données, des instructions préparées peuvent être créées, des variables de liaison peuvent être utilisées, les instructions peuvent être exécutées et des ensembles de résultats peuvent être récupérés.

Histoire

Seed7 est basé sur MASTER, un langage de programmation extensible décrit dans les thèses de diplôme et de doctorat de Thomas Mertes. La plupart des idées originales de MASTER, telles que les instructions et les opérateurs définis par l'utilisateur, peuvent être trouvées dans Seed7. Un précompilateur , pour traduire MASTER en Pascal, a été proposé, mais non implémenté, dans le projet original. En 1989, le développement a commencé sur un interprète pour MASTER, nommé HAL. En 2005, les projets MASTER et HAL ont été publiés en open source sous le nom de projet Seed7. Depuis lors, de nouvelles versions sont publiées toutes les deux ou trois semaines. Depuis la version 2021-04-25, le projet Seed7 contient plus de 500 000 lignes de code source et plusieurs centaines de pages de documentation.

Mécanisme d'extension

Une extension comprend deux parties : une définition de syntaxe, donnant un modèle pour la nouvelle forme syntaxique, et une fonction standard Seed7, utilisée pour définir la sémantique.

Définition de la syntaxe

La définition de la syntaxe utilise la description de syntaxe structurée Seed7 (S7SSD). Une déclaration S7SSD comme

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

spécifie la syntaxe de l' + opérateur . La flèche droite ->décrit l' associativité : Liaison des opérandes de gauche à droite. Avec 7la priorité de l' +opérateur est défini. Le modèle de syntaxe .(). + .()est introduit et délimité par des points ( .). Sans points, le motif est () + (). Le symbole ()est un symbole non terminal et +est un symbole terminal. Le S7SSD ne fait pas de distinction entre les différents symboles non terminaux . Au lieu de cela, il ne connaît qu'un seul symbole non terminal : ().

Extension sémantique

La définition de l' +opérateur pour les nombres complexes est juste une définition de fonction :

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;

Les références

Liens externes