HTML5 - CSS 2.x/3
PHP / MySQL
FORTH ...

Analyse de l'opération 48/2(9+3)

Voici notre opération telle qu'elle a été soumise comme défi sur Facebook:

l'opération telle qu'elle est soumise sur Facebook

Et voici le résultat de cette opération tel que l'a calculé le moteur de recherche Yahoo:

résultat de l'opération calculé par Yahoo

Voici le résultat de cette même opération calculé par le moteur de recherche Google:

résultat de l'opération calculée par Google

Il est intéressant de voir comment Google a résolu l'opération. Celle-ci a été réécrite ainsi:

      (48 / 2) * (9 + 3)

Le résultat calculé par Google, après réécriture de la formule est exact. Mais il est erronné.

Priorité des opérateurs

Vous connaissez quatre opérations:

Pour faire un calcul qui mélange ces opérations, il faut d'abord calculer les multiplications et les divisions! Ces opérations sont prioritaires: elles doivent être faites en premier.

Une fois toutes les multiplications et divisions faites, on peut calculer les additions et soustractions.

Reprenons ces règles sur cette opération:

    48 / 2 ( 9 + 3 )
1:  9 + 3 = 12
2:  12 * 2 = 24
3:  48 / 24 = 2

En rajoutant des parenthèses, nous levons l'ambiguïté du choix entre la priorité de la multiplication et la division:

    48 / (2 ( 9 + 3 ))

Si vous soumettez cette formule à Google, le résultat sera 2

Calcul avec FORTH

FORTH est un langage qui exploite simultanément un interpréteur et un compilateur.

En mode interpréteur, FORTH utilise une pile de données. Pour faire une simple addition, il faut au préalable empiler les données à additionner:

 9 3 + 

C'est un peu comme faire une pizza. On prépare tous les ingrédients avant de passer la pizza à la cuisson.

En bon français: soit 2 et 3 à ADDITIONNER

Le résultat de la somme supprime les valeurs à additionner et conserve le résultat au sommet de la pile. On va refaire le calcul en FORTH en rajoutant la multiplicatiion:

 9 3 + 2 *

En enfin, finissons le calcul en rajoutant la division:

 9 3 + 2 * 48 SWAP / .

affiche 2

L'utilisation du mot swap est nécessaire pour remettre dans le bon ordre le numérateur 48 et le diviseur calculé précédemment.

Voici une manière plus élégante et plus compacte pour réaliser la succession des opérations en FORTH:

 48 2 9 3 + * / .

affiche 2

La notation RPN

La notation RPN (pour Reverse Polish Notation) est une manière originale et très cohérente de présenter les opérations. Elle a été imaginée par le mathématicien polonais Jan Łukasiewicz.

La notation RPN supprime toutes les parenthèses. Les opérations sont exécutées dans l'ordre d'apparition.

Exemples:

  7 * 3 + 9   
 7 3 * 9 +  \ résultat 30
  ( 21 - 9 ) / ( 2 + 4 )
 21 9 - 2 4 + /  \ résultat 2
  10 + ( 4 * ( 3 + 9 )) * 8
 10 3 9 + 4 * 8 * +  \ résultat 394

Perturbant, mais très logique

FORTH traite les valeurs comme le ferait un processeur. On remplit les registres avant d'exécuter l'opération. Au lieu de registres, FORTH exploite une pile LIFO (Last In, First Out / dernier entré, premier sorti.

Imaginez une pile d'assiettes. En reprennat le dernier exemple:

  10 + ( 4 * ( 3 + 9 )) * 8

Voici la succession des opérations. A gauche, l'opération, à droite la pile après opération:

    10  |  10
     3  |  10 3
     9  |  10 3 9
     +  |  10 12
     4  |  10 12 4
     *  |  10 48
     8  |  10 48 8
     *  |  10 384
     +  |  394

Conclusion

FORTH est l'un des très rare langage de programmation à utiliser une pile de données. Cette pile permet d'effectuer de nombreuses opérations sans nécessiter l'emploi de variables intermédiaires.

Cette pile permet une programmation plus efficace, certes au détriment d'une certaine lisibilité, mais avec une efficacité extraordinaire en terme de temps d'exécution des programmes, ce qui fait du langage FORTH l'un des plus rapides après le code machine pur!

La notation RPN utilisée par FORTH est exploitée dans les programmes des vols spatiaux, car présentant un gain de temps non négligeable, ainsi qu'un risque moindre d'erreur. Il n'y a pas de risque de parenthèse manquante ou décalée.