Vai al contenuto
Il server del mese è
Visita la nostra nuova lista server!

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

N1xx1

Forth

Recommended Posts

Forth

Il Forth è un linguaggio di programmazione Estendibile e Interattivo. Estendibile perché non c'è differenza tra quello che programmi tu e quello già programmato inserito di default nel sistema forth, e Interattivo perché interagisci con il pc tu stesso.

Nasce negli anni 60 per opera di Charles Moore. Il nome deriva dal fatto che il Forth sarebbe stato un linguaggio di quarta generazione, ma visto che il nome della macchina su cui era stato creato era limitato a 5 caratteri (IMB 1130) si è usato Forth invece di Fourth.

Forth come molti linguaggi di programmazione gira su una macchina virtuale, ma a differenza di questi la espone al programmatore.

Questo permette al programmatore di scrivere programmi che si integrano perfettamente con il Forth diventando parti di esso. E' la estendibilità.

Caratteristiche

I sistemi sui quali gira forth hanno 3 elementi fondamentali: la memoria RAM e 2 stack, stack dei dati e stack di ritorno.

La memoria contiene le informazioni di base, variabili, costanti, e il codice stesso.

Lo stack dei dati contiene tutti quei numeri che servono come argomenti di funzioni e operazioni.

Lo stack di ritorno invece contiene la serie di indirizzi di memoria. Sono utilizzati per passare da una parte all'altra del programma senza "perdersi".

Cosa è la memoria Ram?

La RAM è come un grande tabellone. In ogni casella del tabellone ci sta un valore, e in oltre ogni casella è associata a un numero detto indirizzo, che va in ordine crescende nel tabellone.

Cosa è uno stack?

Lo stack è come una grande pila di libri dove ogni libro è un valore. Possiamo accatastare i libri uno sull'altro e operare tra loro. Lo stack è, quasi sempre, parte della ram, ovvero degli indirizzi della ram sono dedicati agli stack.

1. Fondamentali

Un linguaggio che vive

Immagina di essere un manager di una azienda e hai appena assunto un dipendente. Il primo giorno insegni al nuovo dipendente il formato di scrittura di una lettera (il dipendente sa già scrivere). Tutto quello che gli devi dire a fine giornata è "Scrivila".

Il secondo giorno gli insegni il sistema di archiviazione. Prendi tutta la mattinata per spiegarglielo ma a fine giornata ti basta dire "Archiviala".

Alla fine della settimana potrai comunicare con una specie di stenografia dove "Invia questa lettera" vuol dire "Scrivila, fammela firmare, fotocopiala, archivia la copia, invia l'originale".

E' questa organizzazione che ti permette di scrivere un buon programma in forge: prima definisci un'insieme di parole e poi le raggruppi in un'altra come una frase che salverai come una parola.

Ora un esempio più pratico. Supponiamo di dover scrivere un programma che controlli una mini lavatrice in forth.

: LAVATRICE LAVA GIRA RISCIACQUA GIRA ;

I due punti significano l'inizio di definizione, la prima parola dopo la definizione è il nome della procedura, le altre parole comprendono la "definizione" della procedura, il punto e virgola, alla fine, indica la terminazione della procedura.

Ovviamente le parole LAVA, GIRA e RISCIACQUA non esistono, ma le possiamo creare allo stesso modo.

Interattività

Tutto quello che facciamo è interattivo! Ovvero dopo aver scritto una definizione e aver premuto invio possiamo eseguirla immediatamente e provarla. Basterà scrivere il nome della procedura e il sistema la eseguirà.

E' questa una delle novità di Forth che lo rendono un linguaggio di programmazione faigo.

Lo Stack

Come già anticipato prima il Forth utilizza uno stack dei dati. Praticamente ogni numero che scriviamo nella console / programma viene inserito in cima allo stack. Poi per ogni operazione vengono presi i valori degli stack e ne vengono ritornati altri.

Vi consiglio di leggere la mia guida alla Notazione Polacca Inversa.

Per inidicare come vengono manipolati i dati negli stack useremo la seguente dicitura:

( prima -- dopo )

Dove quelli dentro prima sono gli elementi dello stack in entrata e dopo quelli in uscita. Diamo per scontato che quelli in ingresso verranno "consumati".

Esempi

Mettiamo caso dobbiamo far eseguire al nostro programma una somma:

: SOMMA 26 24 + . ;

I due punti, come già sapete, sono l'inizio della definizione della nuova parola. SOMMA è il nome della nuova parola, tutto quello dopo fino al punto e virgola è il codice da eseguire. 26 aggiunge nello stack 26, 24 aiggiunge nello stack 24. Ora nello stack ci sono (dall'alto verso il basso) 24 e 26. + somma i primi due numeri dello stack. Ora lo stack è unicamente formato da 50. Il punto stama a schermo l'ultimo elemento dello stack.

Per eseguire la nuova parola basterà scriverla nel terminale.

Ora definiamo le parole usate:

+ ( n1 n2 -- n3 )

Somma i primi due numeri dello stack. n3 = n1 + n2.

. ( n -- )

Stampa a video il primo numero dello stack.

Altre operazioni sono -, *, /, MOD.

-, * e / sono facilmente comprensibili, invece MOD ritorna il resto tra la divisione tra due numeri. (se pensi che il resto sia da scuola elementare dovrai ricrederti)

Proviamo un'altro esempio: vogliamo creare una funzione che ritorni sia il quoziente che il resto di una divisione. In molti sistemi è già integrata di default con il nome di /MOD, ma la scriviamo lo stesso per prova.

: restoequoziente

OVER OVER /

ROT ROT MOD

;

Ok, spiegazione. OVER serve per copiare il penultimo elemento dello stack aggiungendolo in cima allo stack. ROT ruota tre elementi dello stack. Definizioni:

OVER ( x1 x2 -- x1 x2 x1 )

ROT ( x1 x2 x3 -- x2 x3 x1 )

Possiamo però usare meno parole:

: restoequoziente

2DUP /

-ROT MOD

;

Definizioni:

2DUP ( x1 x2 -- x1 x2 x1 x2 )

Duplica gli ultimi due elementi dello stack e li aggiunge in cima allo stack.

-ROT( x1 x2 x3 -- x3 x1 x2 )

Stesso di ROT ma al contrario.

In realtà, secondo quello che ho scritto prima possiamo anche provare a definire -ROT e 2DUP (anche se sono quasi sempre implementati).

: -ROT

ROT ROT

;

: 2DUP

OVER OVER

;

Questi ROT, OVER, 2DUP, sono parole usate per la manipolazione dello stack dei dati. Ecco una lista (compresi quelli già descritti).

DUP ( x -- x x )

Duplica l'ultimo elemento dello stack e lo aggiunge in cima allo stack.

?DUP ( x -- 0 | x x )

Duplica l'ultimo elemento solo se è diverso da zero e lo aggiunge in cima allo stack.

DROP ( x -- )

Elimina l'ultimo elemento dello stack.

SWAP ( x1 x2 -- x2 x1 )

Scambia gli ultimi due elementi dello stack tra loro.

OVER ( x1 x2 -- x1 x2 x1 )

Duplica il penultimo elemento dello stack e lo aggiunge in cima allo stack.

NIP ( x1 x2 -- x2 )

Elimina il secondo elemento dello stack.

TUCK ( x1 x2 -- x2 x1 x2 )

Inserisce una copia degli ultimi due elementi dello stack sopra il secondo. Equivale a SWAP OVER.

ROT ( x1 x2 x3 -- x2 x3 x1 )

Ruota gli ultimi 3 elementi dello stack.

-ROT ( x1 x2 x3 -- x3 x1 x2 )

Reciproco di ROT, non è specificato dall'ANS, ma è disponibile spesso.

PICK ( xn .. x0 n -- xn .. x0 xn )

Copia l' n-esimo elemento dello stack e lo aggiunge in cima allo stack. 0 PICK corrisponde a DUP, 1 PICK corrisponde a OVER e così via.

2DUP ( x1 x2 -- x1 x2 x1 x2 )

Copia l'ultima coppia di valori dello stack e li aggiunge in cima allo stack.

2DROP ( x1 x2 -- )

Elimina gli ultimi due elementi dello stack.

2SWAP ( x1 x2 x3 x4 -- x3 x4 x1 x2 )

Inverte l'ordine delle ultime due coppie di elementi dello stack.

2OVER ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )

Copia la penultima coppia di elementi dello stack e l'aggiunge in cima allo stack.

[Work in Progress]

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Grande, hai spiegato alcune cose che non mi erano ben chiare. Adesso ho realizzato che lo stack non sostituisce la RAM :asd:

P.S. Primo :P

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Saresti il mio dio se tu facessi qualcosa sul Ruby... Non trovo nulla da nessuna parte! Nè in libreria ne un misero PDF, mi piacerebbe imparare quel linguaggio... Mi ha affascinato particolarmente.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ruby cacca.

:(

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ogni tanto aggiorno l' OP quindi se siete interessati fateci un salto qualche volta.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Ogni tanto aggiorno l' OP quindi se siete interessati fateci un salto qualche volta.

Io ci salto ogni tanto ma i comandi base non appaiono XD

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Non continui più?

Certo che continuo. Devo solo trovare il tempo di riorganizzare la guida.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

Figo :sisi:

Non conoscevo l'over :sisi:

L'over è tipo una delle più importanti parole di manipolazione dello stack e non lo conosci? :asd:

Comunque ho completato la lista di tutte le operazioni sullo stack dei dati. Aggiungerò le manipolazioni dello stack di ritorno e le operazioni aritmetiche entro oggi.

Condividi questo messaggio


Link di questo messaggio
Condividi su altri siti

×
×
  • Crea Nuovo...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.