Seed7

Intro e Hello, World

Linguaggio particolare, interessante, sconosciuto ai più. Comparso sulla scena nel 2005, si tratta, evidentemente, di uno strumento di nicchia che probabilmente mai vedrà uno sviluppo ed una adozione in grande stile. Come ho già detto non sempre le buone idee ricevono la giusta accoglienza e il marketing e la spinta di grossi attori nel settore prevalgono, a volte, sulla qualità. Tuttavia ne propongo le basi in quanto si tratta di un qualche cosa molto interessante, con un approccio un po' diverso. Tra l'altro, anticipando una delle carateristiche principali, questo linguaggio vuole essere completamente cross-platform e magari può venire utile quando si deve costruire qualche cosa che abbia quella caratteristica e non ci si vuole rompere la testa con i problemi di traduzione da un sistema operativo all'altro. Questo perchè il codice gira indifferentemente su Windows, Linux e vari sistemi Unix like. Insomma, tenetelo nel cassetto, una volta o l'altra potrebbe essere il caso ringraziare il suo autore, l'austriaco Thomas Mertes.

Il linguaggio fa la sua comparsa nel 2005, inizialmente il progetto, stando a quanto detto su Wikipedia, si chiamava Master.
Si presenta come un linguaggio general purpose, multipiattaforma. Seed7 è:
  • estensibile, ovvero supporta dei meccanismi per estendere la sintassi tramite la possibilità di far definire all'utente istruzioni e operatori personalizzati.
  • supporta il paradigma a oggetti con interfacce.
  • i tipi stessi sono oggetti di prima classe
  • Il compilatore effettua il type check statico e non permette il cast automatico, ovvero quelle pericolose conversioni di tipo che i linguaggi odierni cercano sempre di tenere sotto controllo
  • vengono gestite le eccezioni
  • Esiste un supporto nativo per i numeri a dimensione (teoricamente) infinita.
  • Presenta numerosi tipi predefiniti nativamente alcuni dei quali piuttosto non comunissimi, tra gli altri array, set, struct, ma anche color, duration, time ecc...
  • La libreria fornita è molto completa.
  • Questo linguaggio supporta il multiple dispatch in base al quale un metodo o una funzione possono essere condivisi tra più tipi.
Questa lista è parziale e forse non particolarmente originale, tolto il primo punto ma vedremo che il linguaggio invece merita attenzione. Così come merita attenzione la singolare lista delle features che il linguaggio "rifiuta": si tratta, secondo l'autore, di caratteristiche obsolete e sostanzialmente inutili, se poi siano effettivamente tali lo potrete giudicare da voi. Sul sito ufficiale ne sono elencate molte; qui ne indico alcune ad esempio:

- non esiste l'istruzione goto
- non è supportato neppure il return
- non sono previsti parametri di default
- non sono previste parole chiave come self e this
- non ci sono conversioni automatiche di tipo, bisogna ricorrere all'overload
- non ci sono parole riservate(!)
- non esiste distinzione concettuale tra operatori, funzioni, istruzioni e procedure
- il meccanismo di chiamate procedurali è piuttosto particolare e non si basa su messaggi. Lo vedremo, ovviamente.

Il linguaggio è principalmente usato tramite il suo interprete quindi non vengono prodotti eseguibili nativi per il sistema operativo sottostante. Tuttavia è presente anche un'opzione per generale eseguibili standard. Se vi è più comodo potete usarlo anche così.
Ci sono poi altre caratteristiche peculiari che vedremo man mano che le incontreremo. Si tratta certamente di un linguaggio per molti versi innovativo. La sua origine e la sua sintassi sono influenzate solo in parte dai soliti C/C++ ma anche e forse maggiormente da ADA, Pascal e Modula-2. Anche in questo sta la sua originalità.
Come detto si tratta di uno strumento di nicchia, per quanto ne so con un ecosistema intorno decisamente ridotto e, come tanti linguaggi, il suo sviluppo dipende principalmente, nei ritmi e nei contenuti, dall'entusiasmo e dalla "voglia" di una sola, per quanto geniale, persona. Tuttavia il progetto, mentre sto scrivendo (agosto 2012) è ben vivo e vegeto, l'autore ha idee ambiziose ed è decisamente imponente la mole di documentazione disponibile sul sito ufficiale. Insomma, come ho detto, merita almeno un'occhiata. La sua sintassi è particolarmente ricca, con un certo aspetto un po' retrò che riporta al Pascal e Ada (ma si, anche Delphi) e concettualmente tutto il linguaggio pare un po' fuori dagli schemi a guardarlo bene, forse sovrabbondante in alcune cose. Bisogna vedere se questi aspetti vi attirano o no...
Seed7 è distribuito con licenza GPL e LPGL (per quanto concerne il runtime).

Per ora ci salutiamo come al solito, ma non senza entrare subito nel merito del linguaggio:

  Esempio 1-1
1
2
3
4
5
$ include "seed7_05.s7i";
const proc: main is func
begin
writeln("hello world");
end func;

Riga 1 - abbiamo la chiamata alla libreria standard. Senza scendere per ora in dettaglio diciamo che è quasi sempre necessaria
Riga 2 - Eccoci ad una riga "densa" di informazioni. La funzione main è dichiarata costante, quindi immutabile nel corso del programma, di tipo proc (non preoccupatevi per ora di capire ogni cosa, comunque proc indica evidentemente una "procedura") e in particolare ad essa viene attribuito valore di ritorno, in questo caso tale valore viene espresso per mezzo di un costrutto che si chiama func che è strutturato formalmente da una sequenza che inizia con begin e termina con end, ovvero l'esatto corrispondente di { e } dei linguaggi C-like, quindi ecco spiegate le righe 3 e 5. Il costrutto func restituisce un tipo base che nel nostro esempio, nulla essendo specificato, è void.
La riga 4 invece introduce writeln, ovvero una const proc della libreria standard che espone in output una stringa, nel caso specifico il solito "hello world", che è delimitata da una coppia di doppi apici. Avete notato che le istruzioni devono essere chiuse dal ; (punto e virgola)?
Per concludere ancora meglio ecco un saluto con un minimo di interattività:

  Esempio 1-2
1
2
3
4
5
6
7
8
9
$ include "seed7_05.s7i";
const proc: main is func
local
var string: nome is "";
begin
write("Inserisci il tuo nome: ");
readln(nome);
writeln("Benvenuto, " & nome);
end func;

Aggiungo, di passaggio, che alla riga 6 presentiamo la funzione di scrittura che non forza un "a capo" (write invece di writeln). Invece alla riga 7 presentiamo la funzione di lettura, readln e l'operatore di concatenazione delle stringhe &. Di tutto, ovviamente, riparleremo. Infine, se volete commentare i vostri programmi abbiamo due modalità:

# il "cancelletto" introduce i commenti che teminano con il carattere EOLN, la fine della riga corrente insomma
(*...*) all'interno della doppia coppia composta dalla tonda aperta + * e da * + tonda chiusa possiamo mettere commenti più ampi formattati anche su più righe.