Discussion sur le langage Forth

Cette catégorie traite de développements récents destinés à nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
Carl
Modérateur
Messages : 13297
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: Discussion sur le langage Forth

Message par Carl »

Oui, Claude, moi c'est une doc des utilisateurs :wink:

Carl
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: Discussion sur le langage Forth

Message par Xavier31 »

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.

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
;
Avatar de l’utilisateur
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Discussion sur le langage Forth

Message par Dominique »

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 ?
Avatar de l’utilisateur
claudounet
Messages : 1074
Inscription : 15 juil. 2009 21:21
Localisation : Dublin 6 (IRL) - Vichy (03)
Contact :

Re: Discussion sur le langage Forth

Message par claudounet »

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.
Claude

Retro'rdinateurs http://www.retrordinateurs.com/
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: Discussion sur le langage Forth

Message par Xavier31 »

Dominique a écrit :Pour bien le compléter, pourrais-tu rajouter la virgule avant les décimales ?
D'accord. Je rajoute un "44 EMIT" qui correspond à un PRINT CHR$(44) en BASIC, le code Ascii de la virgule.
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
;
Merci Claude pour le bouquin! :wink:
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: Discussion sur le langage Forth

Message par Xavier31 »

Pour obtenir un nombre infini de chiffres après la virgule : (attention, j'ai un niveau en mathématiques de CM2 :mrgreen: )

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 ! :D
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Discussion sur le langage Forth

Message par __sam__ »

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 ? :wink:
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
Avatar de l’utilisateur
Carl
Modérateur
Messages : 13297
Inscription : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: Discussion sur le langage Forth

Message par Carl »

Bien vu Sam :wink:
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.
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: Discussion sur le langage Forth

Message par Xavier31 »

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 ?
Avatar de l’utilisateur
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Discussion sur le langage Forth

Message par Dominique »

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:

Code : Tout sélectionner

: DDUP OVER OVER ;
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

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
Comme les codes sont hexadécimaux, passons en HEX

Code : Tout sélectionner

HEX CREATE 2DUP 3716 , 3616 , 3616 , 0EB6 , SMUDGE  DECIMAL <CR>
10 20 2DUP <CR>
. 20
. 10
. 20
. 10

ok
Avatar de l’utilisateur
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Discussion sur le langage Forth

Message par Dominique »

Merci Carl et Claudounet pour vos scans !

C'est sympa de penser à nous, et on y apprend toujours qque chose.
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Discussion sur le langage Forth

Message par __sam__ »

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:

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,
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:

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)
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?
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
Xavier31
Messages : 63
Inscription : 11 mars 2013 15:29

Re: Discussion sur le langage Forth

Message par Xavier31 »

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. :D
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.
Avatar de l’utilisateur
Dominique
Messages : 831
Inscription : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: Discussion sur le langage Forth

Message par Dominique »

@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

Code : Tout sélectionner

: HERE     HERE ALIGNED @ - ;
On pourrait modifier la seconde définition ( faire -HERE ) mais c'est rageant.....

On peut aussi biaiser malin :D :

Code : Tout sélectionner

: HARE HERE ALIGNED @ - ;
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)

Code : Tout sélectionner

LATEST 2 + 45 SWAP C! 
On aura redéfini HERE
__sam__
Messages : 7986
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Discussion sur le langage Forth

Message par __sam__ »

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:

Code : Tout sélectionner

X2 = X**2
Y2 = Y**2
X = X2-Y2+C
Y = (X+Y)**2 - X2 - Y2 + D
(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)

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
(ca me rappelle quelque chose ce 4666 hexa)
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
Répondre