Discussion sur le langage Forth
Modérateurs : Papy.G, fneck, Carl
- Carl
- Modérateur
- Messages : 13297
- Inscription : 08 avr. 2007 13:21
- Localisation : http://www.doledujura.fr
- Contact :
Re: Discussion sur le langage Forth
Oui, Claude, moi c'est une doc des utilisateurs
Carl
Carl
Re: Discussion sur le langage Forth
Voilà, la boucle stoppe immédiatement et 51 / 25 donne bien 2,04 à présent. Mission accomplie.
Ici j'affiche 2000 chiffres après la virgule en 20 secondes, mais vous pouvez en afficher autant que vous voulez.
Ici j'affiche 2000 chiffres après la virgule en 20 secondes, mais vous pouvez en afficher autant que vous voulez.
Code : Tout sélectionner
: DIV
2DUP /MOD . OVER SWAP
1001 1 DO DUP 0 > IF
100 * SWAP /MOD DUP 10 < IF 0 . ENDIF .
OVER SWAP ENDIF
LOOP
;
Re: Discussion sur le langage Forth
Bravo Xavier,
Très très bon programme, très clair et très 'FORTH' !!!
Pour bien le compléter, pourrais-tu rajouter la virgule avant les décimales ?
Très très bon programme, très clair et très 'FORTH' !!!
Pour bien le compléter, pourrais-tu rajouter la virgule avant les décimales ?
- claudounet
- Messages : 1074
- Inscription : 15 juil. 2009 21:21
- Localisation : Dublin 6 (IRL) - Vichy (03)
- Contact :
Re: Discussion sur le langage Forth
Pour ceux que ca interesse voici le scan du bouquin Forth Oric http://retrordinateurs.com/files/storyf ... _small.pdf
Le soft de scan (vuescan) a crashé avant que je puisse compresser le fichier, j'ai utilisé un freeware avec un watermark,
Ceux que ca interesse, j'ai la version non compressée en 97Mb. Lien en MP pour ne pas massacrer le serveur.
Le soft de scan (vuescan) a crashé avant que je puisse compresser le fichier, j'ai utilisé un freeware avec un watermark,
Ceux que ca interesse, j'ai la version non compressée en 97Mb. Lien en MP pour ne pas massacrer le serveur.
Re: Discussion sur le langage Forth
D'accord. Je rajoute un "44 EMIT" qui correspond à un PRINT CHR$(44) en BASIC, le code Ascii de la virgule.Dominique a écrit :Pour bien le compléter, pourrais-tu rajouter la virgule avant les décimales ?
44 le dépose sur la pile (Push) et EMIT l'affiche, ce qui le sort de la pile (Pop) et ainsi ne fausse pas mes calculs.
J'ai réécrit un peu le programme car il y avait un petit bug lors du calcul 25 / 17
Ne vous laissez pas impressionner par le côté ésotérique du code, c'est très simple dès qu'on connaît quelques mots FORTH de base.
Code : Tout sélectionner
: DIV
2DUP / . 2DUP MOD 44 EMIT
1001 1 DO DUP 0 > IF
100 * 2DUP SWAP / DUP 10 < IF 0 . ENDIF .
OVER MOD ENDIF
LOOP
;
Re: Discussion sur le langage Forth
Pour obtenir un nombre infini de chiffres après la virgule : (attention, j'ai un niveau en mathématiques de CM2 )
25 / 17 = 1,47058823529411764705...
25 mod 17 = 8 ; 8 * 100 = 800 ; 800 / 17 = 47
800 mod 17 = 1 ; 1 * 100 = 100 ; 100 / 17 = 05
100 mod 17 = 15 ; 15 * 100 = 1500 ; 1500 / 17 = 88
1500 mod 17 = 4 ; 4 * 100 = 400 ; 400 / 17 = 23
400 mod 17 = 9 ; 9 * 100 = 900 ; 900 / 17 = 52
900 mod 17 = 16 ; 16 * 100 = 1600 ; 1600 / 17 = 94
25 mod 17 = 8 ; 8 * 100 = 800 ; 800 / 17 = 47
etc. etc.
Suivons la pile :
25 17 DIV --> 25 17
2DUP --> 25 17 25 17
/ --> 25 17 1
. --> 25 17
2DUP --> 25 17 25 17
MOD --> 25 17 8
100 * --> 25 17 800
2DUP --> 25 17 800 17 800
SWAP / --> 25 17 800 47
. --> 25 17 800
OVER --> 25 17 800 17
MOD --> 25 17 1
on retourne à 100 *
Explication : comme quand on fait un calcul, les 2 nombres au sommet de la pile disparaissent remplacés par le résultat,
on les duplique donc avant (2DUP ou OVER) si on a besoin de s'en resservir encore.
Voilà, si ce petit tuto peut aider un autre débutant à se mettre au FORTH, it's my pleasure.
Si vous programmez en Assembleur, testez le Forth, ça va vous plaire (pile, flags, etc.)
Si vous programmez en BASIC, testez le Forth, ça va vous emmener plus loin.
(imaginez un langage où vous pouvez créer vos propres mots-clefs)
Je viens d'ailleurs de rajouter à mon CV : Programmation en langage FORTH : ça en jette je trouve !
25 / 17 = 1,47058823529411764705...
25 mod 17 = 8 ; 8 * 100 = 800 ; 800 / 17 = 47
800 mod 17 = 1 ; 1 * 100 = 100 ; 100 / 17 = 05
100 mod 17 = 15 ; 15 * 100 = 1500 ; 1500 / 17 = 88
1500 mod 17 = 4 ; 4 * 100 = 400 ; 400 / 17 = 23
400 mod 17 = 9 ; 9 * 100 = 900 ; 900 / 17 = 52
900 mod 17 = 16 ; 16 * 100 = 1600 ; 1600 / 17 = 94
25 mod 17 = 8 ; 8 * 100 = 800 ; 800 / 17 = 47
etc. etc.
Suivons la pile :
25 17 DIV --> 25 17
2DUP --> 25 17 25 17
/ --> 25 17 1
. --> 25 17
2DUP --> 25 17 25 17
MOD --> 25 17 8
100 * --> 25 17 800
2DUP --> 25 17 800 17 800
SWAP / --> 25 17 800 47
. --> 25 17 800
OVER --> 25 17 800 17
MOD --> 25 17 1
on retourne à 100 *
Explication : comme quand on fait un calcul, les 2 nombres au sommet de la pile disparaissent remplacés par le résultat,
on les duplique donc avant (2DUP ou OVER) si on a besoin de s'en resservir encore.
Voilà, si ce petit tuto peut aider un autre débutant à se mettre au FORTH, it's my pleasure.
Si vous programmez en Assembleur, testez le Forth, ça va vous plaire (pile, flags, etc.)
Si vous programmez en BASIC, testez le Forth, ça va vous emmener plus loin.
(imaginez un langage où vous pouvez créer vos propres mots-clefs)
Je viens d'ailleurs de rajouter à mon CV : Programmation en langage FORTH : ça en jette je trouve !
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Discussion sur le langage Forth
Forth sur ton CV? je sens que les gens vont lire 4th et se demander: Fourth quoi? C'est un langage de 4ème génération ?
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
- Carl
- Modérateur
- Messages : 13297
- Inscription : 08 avr. 2007 13:21
- Localisation : http://www.doledujura.fr
- Contact :
Re: Discussion sur le langage Forth
Bien vu Sam
Son nom est une contraction de l'anglais fourth, qui signifie « quatrième » : c'était à l'origine un langage pour les machines de quatrième génération1 machines dotées de lecteurs de disquettes ; mais, à l'époque, la machine IBM utilisée ne permettait que des noms de cinq lettres (ce qui suggère qu'il s'agissait d'un IBM 1130). Forth utilisait des concepts novateurs pour l'époque : multiprogrammation et cache-disque notamment.
Re: Discussion sur le langage Forth
D'ailleurs le langage Forth semble bien vivant que la société qui gère le site forth.com le distribue toujours,
propose des formations, etc.
Je ne pensais pas qu'une société commerciale puisse encore gagner de l'argent de nos jours
en vendant encore le langage Forth et des formations, mais apparemment, oui :
http://www.forth.com/corp/background.html
SwiftForth est disponible pour Windows, Mac et Linux : je vois qu'il est vendu 400 US Dollars :
http://www.forth.com/swiftforth/index.html
Etonnant non ?
propose des formations, etc.
Je ne pensais pas qu'une société commerciale puisse encore gagner de l'argent de nos jours
en vendant encore le langage Forth et des formations, mais apparemment, oui :
http://www.forth.com/corp/background.html
SwiftForth est disponible pour Windows, Mac et Linux : je vois qu'il est vendu 400 US Dollars :
http://www.forth.com/swiftforth/index.html
Etonnant non ?
Re: Discussion sur le langage Forth
Pour completer ce que dit très justement Xavier, le programmeur Assembleur peut exprimer son talent dans le Forth.
D'ailleurs l'interface est on ne peut plus facile.
Page 16 du Forth-mo5 on voit l'utilisation du mot CREATE (merci Daniel pour mettre toute cette littérature à notre disposition sur ton site)
Exemple - Dans le programme donné par Xavier, on a besoin du mot DDUP qui duplique le sommet et le 1° étage de la pile de donnée.
On peut créer la définition en utilisant des mots Forth déjà existants dans le vocabulaire:
On peut aussi utiliser le langage machine;
On fait un POP de la pile dans les registres D et X, puis deux PUSH des mêmes registres.
On aura bien dupliqué la pile.
Pour terminer, il suffira de retourner à la routine NEXT (adresse 45B6) qui passe la main au FORTH, sans oublier SMUDGE
Ce qui nous donne en Langage Machine
Comme les codes sont hexadécimaux, passons en HEX
10 20 2DUP <CR>
. 20
. 10
. 20
. 10
ok
D'ailleurs l'interface est on ne peut plus facile.
Page 16 du Forth-mo5 on voit l'utilisation du mot CREATE (merci Daniel pour mettre toute cette littérature à notre disposition sur ton site)
Exemple - Dans le programme donné par Xavier, on a besoin du mot DDUP qui duplique le sommet et le 1° étage de la pile de donnée.
On peut créer la définition en utilisant des mots Forth déjà existants dans le vocabulaire:
Code : Tout sélectionner
: DDUP OVER OVER ;
On fait un POP de la pile dans les registres D et X, puis deux PUSH des mêmes registres.
On aura bien dupliqué la pile.
Pour terminer, il suffira de retourner à la routine NEXT (adresse 45B6) qui passe la main au FORTH, sans oublier SMUDGE
Ce qui nous donne en Langage Machine
Code : Tout sélectionner
37 16 // PULU A,B,X
36 16 // PSHU X,B,A
36 16 // PSHU X,B,A
0E B6 // JMP, /$B6
Code : Tout sélectionner
HEX CREATE 2DUP 3716 , 3616 , 3616 , 0EB6 , SMUDGE DECIMAL <CR>
. 20
. 10
. 20
. 10
ok
Re: Discussion sur le langage Forth
Merci Carl et Claudounet pour vos scans !
C'est sympa de penser à nous, et on y apprend toujours qque chose.
C'est sympa de penser à nous, et on y apprend toujours qque chose.
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Discussion sur le langage Forth
C'est bien pratique ce mix ASM-Forth. J'ai lu dans le manuel sur C64 publié ici, que sur Forth+ il y avait des mots pour écrire de l'assembleur. Il me semble être déjà tombé la dessus pour 6809 à une époque.. ah oui voici ce que j'avais trouvé pour convertir de l'asm moto en asm forth 6809: C'est rigolo, on écrit l'ASM à l'envers comme le vrai forth. La doc complète: http://www.bradrodriguez.com/papers/6809asm.txt
Pour moi c'est sympa car en assembleur le nommage des labels pour les structures de contrôles type IF devient vite n'importe quoi sans macro-assembleyr "lbl1, lbl2, lbl3, xxx, yyy, zzz, xxx ah non zut déjà utilisé, yyy ah mince pareil, aaa, bbb". Or avec cette approche, on peut faire des if/else/endif sans aucun label:
Ah oui, le code source de cette extension forth est fourni. C'est tout petit, 240 lignes environ: http://www.bradrodriguez.com/papers/6809asmlisting.txt
Pas mal, non?
Code : Tout sélectionner
MOTOROLA FORTH MOTOROLA FORTH
EXG s,d s d EXG TFR s,d s d TFR
ANDCC #n n # ANDCC, PSHS regs n # PSHS,
CWAI #n n # CWAI, PSHU regs n # PSHU,
LEAS D,U U ,D LEAS, LEAX [,S++] S ,++ [] LEAX,
LEAU -5,Y Y -5 , LEAU, LEAY [1234] 1234 [] LEAY,
ADCA #20 20 # ADCA, LDA #20 20 # LDA,
ADCB <30 30 <> ADCB, LDB <30 30 <> LDB,
ADDA 2000 2000 ADDA, LDD 2000 2000 LDD,
ADDB [1030] 1030 [] ADDB, LDS [1030] 1030 [] LDS,
ADDD ,S S 0, ADDD, LDU ,X X 0, LDU,
ANDA 23,U U 23 , ANDA, LDX 23,Y Y 23 , LDX,
ANDB A,X X A, ANDB, LDY A,S S A, LDY,
ASL B,Y Y B, ASL, LSL B,U U B, LSL,
ASR D,X X D, ASR, LSR D,S S D, LSR,
BITA ,S+ S ,+ BITA, NEG ,X+ X ,+ NEG,
BITB ,X++ X ,++ BITB, ORA ,S++ S ,++ ORA,
CLR ,Y- Y ,- CLR, ORB ,U- U ,- ORB,
CMPA ,U-- U ,-- CMPA, ROL ,Y-- Y ,-- ROL,
CMPB -5,PCR -5 ,PCR CMPB, ROR 12,PCR 12 ,PCR ROR,
CMPD [,Y] Y 0, [] CMPD, SBCA [,U] U 0, [] SBCA,
CMPS [7,Y] Y 7 , [] CMPS, SBCB [7,U] U 7 , [] SBCB,
CMPU [A,S] S A, [] CMPU, STA [A,X] X A, [] STA,
CMPX [B,U] U B, [] CMPX, STB [B,Y] Y B, [] STB,
CMPY [D,X] X D, [] CMPY, STD [D,S] S D, [] STD,
EORA [,Y+] Y ,+ [] EORA, STS [,U+] U ,+ [] STS,
EORB [,U++] U ,++ [] EORB, STU [,Y++] Y ,++ [] STU,
COM [,S-] S ,- [] COM, STX [,S-] S ,- [] STX,
DEC [,X--] X ,-- [] DEC, STY [,X--] X ,-- [] STY,
INC [5,PCR] 5 ,PCR [] INC, SUBA [3,PCR] 3 ,PCR [] SUBA,
JMP [300] 300 [] JMP, SUBB [300] 300 [] SUBB,
JSR 1234 1234 JSR, SUBD 1234 1234 SUBD, BCC label adrs BCC, BLT label adrs BLT,
BCS label adrs BCS, BMI label adrs BMI,
BEQ label adrs BEQ, BNE label adrs BNE,
BGE label adrs BGE, BPL label adrs BPL,
BGT label adrs BGT, BRA label adrs BRA,
BHI label adrs BHI, BRN label adrs BRN,
BHS label adrs BHS, BSR label adrs BSR,
BLE label adrs BLE, BVC label adrs BVC,
BLO label adrs BLO, BVS label adrs BVS,
BLS label adrs BLS,
BCC label adrs BCC, BLT label adrs BLT,
BCS label adrs BCS, BMI label adrs BMI,
BEQ label adrs BEQ, BNE label adrs BNE,
BGE label adrs BGE, BPL label adrs BPL,
BGT label adrs BGT, BRA label adrs BRA,
BHI label adrs BHI, BRN label adrs BRN,
BHS label adrs BHS, BSR label adrs BSR,
BLE label adrs BLE, BVC label adrs BVC,
BLO label adrs BLO, BVS label adrs BVS,
BLS label adrs BLS,
Pour moi c'est sympa car en assembleur le nommage des labels pour les structures de contrôles type IF devient vite n'importe quoi sans macro-assembleyr "lbl1, lbl2, lbl3, xxx, yyy, zzz, xxx ah non zut déjà utilisé, yyy ah mince pareil, aaa, bbb". Or avec cette approche, on peut faire des if/else/endif sans aucun label:
Code : Tout sélectionner
cc IF, ... THEN,
do code if cc satisfied
cc IF, ..1.. ELSE, ..2.. THEN,
do code ..1.. if cc satisfied, else do
code ..2..
BEGIN, ... cc UNTIL,
loop through code until cc satisfied;
always executes at least once
BEGIN, ..1.. cc WHILE, ..2.. REPEAT,
loop through code until cc satisfied;
exit is evaluated and taken after code
..1.. is executed (always at least once)
Pas mal, non?
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: Discussion sur le langage Forth
C'est très intéressant de pouvoir inclure de l'assembleur ou du langage machine aussi facilement. Je vais m'y essayer au plus tôt.
Cette faculté de créer-compiler de nouveau mots Forth permet de faire plein de choses (un assembleur dans ton exemple).
En plus, la notation post-fixée devient très simple une fois qu'on en a pris l'habitude.
Cette faculté de créer-compiler de nouveau mots Forth permet de faire plein de choses (un assembleur dans ton exemple).
En plus, la notation post-fixée devient très simple une fois qu'on en a pris l'habitude.
Re: Discussion sur le langage Forth
@sam Très bien cet assembler !
Le problème c'est qu'il y a des redéfinitions de mots existants mais, comme tu l'as montré, le Forth du MO ne l'accepte pas.
EX
On pourrait modifier la seconde définition ( faire -HERE ) mais c'est rageant.....
On peut aussi biaiser malin :
puis retrouver l'adresse du mot créé par le mot LATEST auquel on rajoute 2. A l'adresse retrouvée on mettra 45 (ASCII de E)
On aura redéfini HERE
Le problème c'est qu'il y a des redéfinitions de mots existants mais, comme tu l'as montré, le Forth du MO ne l'accepte pas.
EX
Code : Tout sélectionner
: HERE HERE ALIGNED @ - ;
On peut aussi biaiser malin :
Code : Tout sélectionner
: HARE HERE ALIGNED @ - ;
Code : Tout sélectionner
LATEST 2 + 45 SWAP C!
-
- Messages : 7986
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: Discussion sur le langage Forth
Oula c'est de la sacrée grosse bidouille de modifier les dictionnaires de mots en mémoire. Du grand art! Sinon je pense qu'on peut même se passer de l'align, d'après la doc cela ne sert que pour un forth portable marchant sur des CPU n'acceptant pas la pile alignée sur une adresse impaire (68000). Sur 6809 on a heureusement pas ce problème.
Une chose est sure, si étant gamin, j'étais tombé sur le forth, je me serais encore plus amusé sur thomson avant d'aller faire du C sur amiga (plus rapide que mes routines ASM thomson de l'époque). Ainsi typiquement, je me serait fait un super beau projet de manipulation de grands décimaux avec calcul de 1/N!, exp(1), PI, sqrt(2), ln(2) . Tous ces nombres nécessitent uniquement des primitives d'additions de grand décimaux et de division d'un grand décimal par un petit entier. Ca m'aurait sans doute aussi bien aidé pour faire des fractales. L'itération de mandelbrot en forth fixed-point doit être un sacré amusement:(formule modifiée pour montrer l'importance d'une primitive mise au carré (**2).
Allez un cadeau trouvé dans openbios (un bios qui intègre un interpréteur forth)(ca me rappelle quelque chose ce 4666 hexa)
Une chose est sure, si étant gamin, j'étais tombé sur le forth, je me serais encore plus amusé sur thomson avant d'aller faire du C sur amiga (plus rapide que mes routines ASM thomson de l'époque). Ainsi typiquement, je me serait fait un super beau projet de manipulation de grands décimaux avec calcul de 1/N!, exp(1), PI, sqrt(2), ln(2) . Tous ces nombres nécessitent uniquement des primitives d'additions de grand décimaux et de division d'un grand décimal par un petit entier. Ca m'aurait sans doute aussi bien aidé pour faire des fractales. L'itération de mandelbrot en forth fixed-point doit être un sacré amusement:
Code : Tout sélectionner
X2 = X**2
Y2 = Y**2
X = X2-Y2+C
Y = (X+Y)**2 - X2 - Y2 + D
Allez un cadeau trouvé dans openbios (un bios qui intègre un interpréteur forth)
Code : Tout sélectionner
hex 4666 dup negate do i 4000 dup 2* negate do 2a 0 dup 2dup 1e 0 do
2swap * d >>a 4 pick + -rot - j + dup dup * e >>a rot dup dup * e >>a
rot swap 2dup + 10000 > if 3drop 2drop 20 0 dup 2dup leave then loop
2drop 2drop type 268 +loop cr drop 5de +loop
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos