Seed7 es un lenguaje de programación extensible de propósito general diseñado por Thomas Mertes. Es sintácticamente similar a Pascal y Ada . Junto con muchas otras características, proporciona un mecanismo de extensión. [2] Seed7 admite la introducción de nuevos elementos de sintaxis y su semántica en el lenguaje, y permite que se definan y escriban nuevas construcciones de lenguaje en Seed7. [3] Por ejemplo, los programadores pueden introducir la sintaxis y la semántica de nuevas declaraciones y símbolos de operadores definidos por el usuario . La implementación de Seed7 difiere significativamente de la de los lenguajes con sintaxis y semántica codificadas de forma rígida .
Seed7 admite los paradigmas de programación : imperativo , orientado a objetos (OO) y genérico . También admite funciones como llamada por nombre , envío múltiple , sobrecarga de funciones , sobrecarga de operadores , manejo de excepciones y aritmética de precisión arbitraria .
Las características principales incluyen:
Se generalizan varios conceptos del lenguaje de programación:
El proyecto Seed7 incluye tanto un intérprete como un compilador . El intérprete inicia los programas muy rápidamente, lo que permite un desarrollo rápido de los mismos. El compilador utiliza las interfaces de análisis y reflexión de la biblioteca de tiempo de ejecución para generar un programa en C , que posteriormente se compila en código de máquina . Los programas Seed7 compilados pueden tener un rendimiento comparable al de los programas en C. [4]
Seed7 tiene muchas bibliotecas, que cubren áreas que incluyen contenedores , funciones numéricas, análisis léxico , manipulación de archivos, redes ( sockets , Transport Layer Security (TLS/SSL), Hypertext Transfer Protocol (HTTP), HTTP Secure ( HTTPS ), File Transfer Protocol (FTP), Simple Mail Transfer Protocol (SMTP), etc.), gráficos , fuentes de mapa de bits y vectoriales , API independiente de la base de datos, soporte para Common Gateway Interface (CGI), compresión de datos , archivos de almacenamiento ( tar , zip , cpio , ar , rpm ), codificación de caracteres , manejo de fecha y hora, procesamiento XML , resúmenes de mensajes y más. [5] Estas bibliotecas reducen la necesidad de usar directamente características del sistema operativo no portables y bibliotecas de terceros (que pueden no estar siempre presentes). Las bibliotecas de Seed7 contienen capas de abstracción para hardware , sistema operativo y bibliotecas de terceros, por ejemplo, bibliotecas gráficas y de bases de datos. En otras palabras, no se necesitan cambios para mover programas de Seed7 entre diferentes procesadores o sistemas operativos .
Seed7 tiene su propia implementación de Seguridad de la capa de transporte . [6] La biblioteca incluye AES y criptografía de curva elíptica .
Seed7 proporciona una biblioteca con una API independiente de la base de datos . [7] Los programas pueden conectarse a bases de datos MySQL , MariaDB , SQLite , PostgreSQL , Oracle , Open Database Connectivity (ODBC), Firebird , InterBase , IBM Db2 y SQL Server . Independientemente de la base de datos, se pueden crear sentencias preparadas, se pueden utilizar variables de enlace, se pueden ejecutar sentencias y se pueden obtener conjuntos de resultados.
Seed7 se basa en MASTER, un lenguaje de programación extensible descrito en las tesis de diploma y doctorado de Thomas Mertes. [8] [9] La mayoría de las ideas originales de MASTER, como las sentencias y operadores definidos por el usuario, se pueden encontrar en Seed7. En el proyecto original se propuso un precompilador para traducir MASTER a Pascal, pero no se implementó. En 1989, se comenzó a desarrollar un intérprete para MASTER, llamado HAL. En 2005, los proyectos MASTER y HAL se publicaron como código abierto bajo el nombre de proyecto Seed7. Desde entonces, se han publicado nuevas versiones cada dos o tres semanas. A la fecha de la versión 2021-04-25, el proyecto Seed7 contiene más de 500.000 líneas de código fuente y varios cientos de páginas de documentación.
Mertes ha dicho que el nombre Seed7 surgió del concepto de sus ideas de que el lenguaje se difundiera como semillas que crecerían a medida que otros lo usaran. La parte "7" se agregó porque era un número primo que le parecía que sonaba bien con "semilla". [10]
Una extensión incluye dos partes: una definición de sintaxis, que proporciona una plantilla para la nueva forma sintáctica, y una función Seed7 estándar, utilizada para definir la semántica. [2]
La definición de sintaxis utiliza la descripción de sintaxis estructurada Seed7 (S7SSD). Una declaración S7SSD como
$ sintaxis expr: .(). + .() es -> 7;
especifica la sintaxis del +
operador . La flecha derecha ->
describe la asociatividad : Enlace de operandos de izquierda a derecha. Con se define 7
la prioridad del operador. Se introduce el patrón de sintaxis y se delimita con puntos ( ). Sin puntos el patrón es . El símbolo es un símbolo no terminal y es un símbolo terminal. [11] El S7SSD no distingue entre diferentes símbolos no terminales . En cambio, solo conoce un símbolo no terminal: .+
.(). + .()
.
() + ()
()
+
()
La definición del +
operador para números complejos es simplemente una definición de función:
const func complex : ( en complejo : sumando1 ) + ( en complejo : suma2 ) es el resultado de func var complex : suma es complejo . valor ; comenzar suma . re := sumando1 . re + comando2 . re ; suma . soy := sumando1 . soy + sumando2 . soy ; función final ;