Su github ho trovato questo repository (ForthHub) che raccoglie progetti vecchi e nuovi legati al linguaggio creato da Charles Moore.
Archivi categoria: Forth
The Forth Language #3
Prima di entrare nel dettaglio su come é formata una word vediamo alcune dei costrutti principali del linguaggio. Come scritto nella prima parte Forth fa un utilizzo intensivo dello stack, cioè di una struttura dati LIFO. Possiamo aggiungere elementi allo stack oppure possiamo toglierli, sempre dallo stesso punto. Lo stack funziona come una pila di piatti, possiamo aggiungere piatti in cima alla pila oppure possiamo toglierli, nell’ordine inverso a quello con cui li abbiamo aggiunti. Forth è un linguaggio interpretato, quindi dopo avere lanciato l’interprete ci troviamo di fronte ad un prompt, quello che viene digitato seguito da invio è un comando.
Se digitiamo un numero, per esempio 123, questo viene posto in cima allo stack, se digitiamo un altro numero, per esempio 456, questo prende il posto di 123 in cima allo stack e 123 passa sotto.
—
123 —
456 123 —
il comando . (punto) estrai il valore in cima allo stack e lo visualizza, se usiamo questo comando dopo i comandi visti prima, la prima volta apparirà 456, la seconda volta apparirà 123, utilizzando il comando una terza volta comparirà un messaggio di errore che ci comunica che lo stack è vuoto!
A cosa serve lo stack? E’ semplicemente la memoria di transito utilizzata per fare i calcoli ma anche per gestire il passaggio di parametri alle funzioni e il ritorno dei valori dalle stesse, in pratica sostituisce i registri di un microprocessore.
Per esempio voglio sommare i valori 123 e 456,
123 [invio]
456 [invio]
+ [invio]
con questi 3 comandi ho inserito i due valori 123 e 456 sullo stack e poi con il comando + ho sommato i due valori più in alto sostituendoli con il risultato dell’operazione.
Per visualizzare il risultato possiamo usare il comando .
Il linguaggio Forth mette a disposizione svariati comandi aritmetici + – * / ed altri che vedremo. Il meccanismo dello stack consente di eseguire il calcolo di qualsiasi espressione senza utilizzare le parentesi, ogni operazione coinvolge uno o due valori presenti sullo stack, e l’ordine di valutazione è dato dalla “profondità” dello stack stesso.
Facciamo un esempio: se devo calcolare l’espressione (3 + 5) * 8 in Forth deve semplicemente scrivere
3 5 + 8 *
cioè l’operatore è sempre postfisso rispetto agli operandi. Questa modalità di esprimere i calcoli si chiama RPN (Reverse Polish Notation), in onore di Jan Łukasiewicz, l’inventore della notazione polacca (non di quella inversa, che fu introdotta dall’australiano Charles Hamblin)
Esistono poi dei comandi per manipolare il contenuto della catasta, i più usati sono DUP, DROP e SWAP.
Il comando DUP duplica l’elemento in cima alla catasta.
Il comando DROP elimina l’elemento in cima alla catasta.
Il comando SWAP scambia i due elementi in cima alla catasta.
Per esempio se devo calcolare il quadrato di 9 è sufficiente il comando
9 DUP *
in cui DUP duplica il valore 9 e * moltiplica i due valori in cima alla catasta, cioè calcola 9*9
… Segue ….
GNU Forth per Android
Qualcuno si è incuriosito leggendo i post sul linguaggio Forth?
Se volete provarlo sul vostro tablet (Android ovviamente) correte su Google Play e installate l’implementazione di GNU Forth per Android e …. buon divertimento!
The Forth Language #2
Il Forth è un linguaggio strano: è un linguaggio interpretato ma contemporaneamente è compilato, in pratica ogni volta che viene valutata una espressione Forth, il compilatore la trasforma in un insieme di chiamate a subroutine, in cui la chiamata stessa è sottintesa. L’interprete esegue in sequenza tutte le subroutine prodotte dal compilatore. Il vantaggio è che questo tipo di codifica produce del codice estremamente compatto, lo svantaggio è che l’esecuzione è leggermente rallentata, rispetto all’esecuzione di un codice equivalente scritto in Assembly.
Questa tecnica di compilazione è chiamata Threaded Code.
Consideriamo un semplice esempio:
: triplo 3 * ;
Questa riga di codice definisce una nuova word il cui nome è triplo che appunto triplica il valore in cima alla catasta.
Il linguaggio Forth mette a disposizione svariate decine di word, cioè di parole chiave che sono associate a varie funzioni.
Per esempio * è la word associata alla funzione di moltiplicazione dei due valori in cima alla catasta. Vi sono altre word di tipo aritmetico e vi sono word che manipolano la catasta, infine vi sono word che consentono di definire nuove word.
La word : inizia la definizione di una nuova word, il cui nome è la stringa che segue e la cui funzionalità è definita dalle words che seguono la stringa.
La word ; termina la definizione di una nuova word.
Si dice che con : si entra in stato compilazione e con ; si torna allo stato inteprete o esecuzione.
Che differenza c’è tra questi due stati: è semplice, ogni word ha due differenti comportamenti (uno in stato compilazione e uno in stato esecuzione), e quando viene letta dall’interprete agisce in un modo oppure nell’altro.
Per capire bene questo aspetto bisogna comprendere come è fatta una word e cos’è il dizionario.
Ma questo ve lo spiego nella prossima puntata……..
The FORTH Language
Il linguaggio FORTH fu inventato nel 1968 da Charles H. Moore.
Laureato in fisica all’MIT con una tesi sulla riduzione dei dati del satellite Explorer XI, passò a Stanford dove studiò matematica per 2 anni. Imparò il LISP dal creatore di questo linguaggio (John Mc Carthy) poi studiò il Fortran II con cui realizzò un programma per la predizione delle orbite dei satelliti artificiali (ricordate il programma MoonWatch?).
Nel 1962 realizzò un applicativo in ALGOL per la collimazione dei fasci di elettroni dello SLAC
Nel 1968 inventò il Forth. Secondo l’autore questo linguaggio doveva rappresentare la quarta generazione dei linguaggi di programmazione, ma poichè il sistema su cui venne inizialmente sviluppato consentiva di salvare files con un nome lungo al massimo 5 caratteri FOURTH divenne FORTH.
Il FORTH è un linguaggio imperativo basato sull’utilizzo dello stack, non solo come struttura per mantenere gli indirizzi di ritorno delle subroutine ma anche come memoria di calcolo, applicando la notazione polacca inversa per la definizione delle espressioni aritmetiche.
In tempi più recenti ne troviamo tracce nelle calcolatrici programmabili della HP e nell’Open Firmware di SUN, utilizzato anche da Apple nei Macintosh basati su PowerPC.
Ma la comunità di sviluppatori FORTH è attiva e numerosa, lo stesso Chuck Moore ha costituito una società, la GreenArrays Inc che produce e commercializza un chip che contiene al suo interno ben 144 core F18 (una FORTH machine che esegue un linguaggio macchina basato su questo linguaggio). Questo chip (G144A12) è inoltre uno dei rarissimi microprocessori asincroni (senza clock) che esegue le sue istruzioni in 1400 picosecondi consumando 7 picojoules per ognuna …..