Codice: Seleziona tutto
1 1 +
Codice: Seleziona tutto
/* Calcola il volume di una sfera. Si aspetta di trovare il raggio in cima allo stack, lascia il volume sulla cima dello stack
/* Esempio : 4 volumeSfera . produce la seguente stampa: 201.06 */
: volumeSfera ( raggio -- volume )
dup dup * * pi * ;
/
Ora segue il codice vero e proprio. La parola "dup" copia il valore sulla cima dello stack e ce lo spinge, quindi dopo le due "dup" sullo stack abbiamo [raggio, raggio, raggio] (non e' una lista Python!). La parola "*" moltiplica tra di loro i DUE valori sulla cima dello stack, per cui dopo l'esecuzione della prima "*" lo stack contiene [raggio*raggio, raggio), e dopo la seconda contiene [raggioAlCubo]. La parola "pi" (che spesso nelle implementazioni SENZA virgola mobile, perche' la virgola mobile era considerata come un lusso e i conti si facevano tutti in interi, nascondeva giochini di rapporti tra numeri interi tipo 355/113) lascia il valore di pi greco (o un rapporto tra numeri interi...) sullo stack, per cui avremo [piGreco, raggioAlCubo] sullo stack, e l'ultima "*" moltiplica il cubo del raggio per pi greco, lasciando il volume sulla cima dello stack.
Tanto per ruzzare, una possibile implementazione di pi poteva essere la seguente:
Codice: Seleziona tutto
: pi 355 113 */ ;
Ovviamente c'erano ulteriori istruzioni di manipolazione dello stack come "swap" (che scambia tra loro i due vaolri in cima allo stack) e "drop" (che butta via il valor in cima allo stack), e cosucce simpatiche tipo "." che stampa il vaolre in cima allo stack (e lo consuma, per cui se uno voleva una stampa senza perdere il valore doveva scrivere "dup .", ovviamente).
Ma chi ce lo faceva fare??? Era l'inizio degli anni 70, quando
- I "personal computer" non esistevano, o se esistevano erano cosucce ridicole con meno capacita' di un ATTINY85. Non scherzo. C'erano computer con BEN 256 BYTE di RAM. E che eseguivano 100,000 operazioni al secondo se andava bene. Piu' tardi, sistemi commerciali avevano 32 o 64 KILObyte di RAM ed erano considerati lussuosi
- I linguaggi macchina, e quindi i linguaggi assembler (distinguo i codici numerici interpretati internamente dalle CPU dai codici mnemonici che sono piu' facili da leggere per un umano - ma che richiedono l'utilizzo di un programma assemblatore per essere tradotti in qualcosa capito da una CPU) erano molto diversi tra una architattura di CPU e un'altra. Oggi abbiamo poche famiglie affermate di CPU, ma gli anni 70 hanno visto nascere, evolvere e scomparire famiglie intere di CPU, tutte con architetture e istruzioni diverse ovviamente.
- I computer dell'epoca caricavano i programmi da una pannellata di interruttori (non scherzo), cassette magnetiche (o nastroni magnetici), striscioline di carat perforate schede perforate, se andava bene flopponi da 8 pollici... Il mio primo disco rigido fu un Winchester da 5 MEGABYTE. Ed era lusso, rispetto ai floppy da 360 kbyte. Quindi, i linguaggi di programmazione, o andavano in ROM (BASIC, qualcuno si ricorda?) ed erano limitatissimi nella taglia, o caricavano da floppy e comunque erano limitati perche' dovevano convivere in memoria con il codice del programmatore...
Bene, abbiamo fatto una breve escursione nella storia della programmazione. E per restare in tema col Forum, sappiate che ci sono numerosi interpreti FORTH disponibili per Arduino.