N1xx1 610 Inviato Maggio 27, 2012 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
Macer31 147 Inviato Maggio 28, 2012 Grande, hai spiegato alcune cose che non mi erano ben chiare. Adesso ho realizzato che lo stack non sostituisce la RAM P.S. Primo :P Condividi questo messaggio Link di questo messaggio Condividi su altri siti
xMarto96 726 Inviato Maggio 28, 2012 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
N1xx1 610 Inviato Maggio 28, 2012 Ruby cacca. Condividi questo messaggio Link di questo messaggio Condividi su altri siti
xMarto96 726 Inviato Maggio 28, 2012 Ruby cacca. :( Condividi questo messaggio Link di questo messaggio Condividi su altri siti
N1xx1 610 Inviato Maggio 28, 2012 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
Carb© 876 Inviato Maggio 29, 2012 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
Macer31 147 Inviato Giugno 2, 2012 Non continui più? Condividi questo messaggio Link di questo messaggio Condividi su altri siti
N1xx1 610 Inviato Giugno 3, 2012 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
N1xx1 610 Inviato Settembre 26, 2012 Let's bump this. Condividi questo messaggio Link di questo messaggio Condividi su altri siti
Pava 830 Inviato Settembre 27, 2012 Figo Non conoscevo l'over Condividi questo messaggio Link di questo messaggio Condividi su altri siti
N1xx1 610 Inviato Settembre 27, 2012 Figo Non conoscevo l'over L'over è tipo una delle più importanti parole di manipolazione dello stack e non lo conosci? 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