:: Enseignements :: Master :: M2 :: 2011-2012 :: Machine Virtuelle (et bazard autour ...) ::
[LOGO]

Quelques notes sur la sémantique du language Foo


Avant propos

Le language Foo n'est pas un vrai langage, mais à un language simple avec les élements communs avec les langages Python, Ruby ou Javascript et une syntax proche du C.
Il n'a donc aucune autre prétention que de calculer des valeurs de Fibonacci.

Les types

Le language foo a été construit en prenant les constructions syntaxique du C mais son système de type est plus proche du Javascript. Voici l'ensemble des type possible.
  • boolean avec deux valeurs possible true et false.
  • int pour les valeurs entière sur 32 bits.
  • double pour les valeurs réelles sur 64 bits (IEEE 754).
  • string pour les chaines de caractères au format Unicode 16 bits.
  • void pour les types de retour de fonctions qui ne retourne rien.
  • any qui représente n'importe quel type, ou dit autrement quelque chose non typé lors de la compilation et dans lequel on peut aussi stocker null.
Noter qu'il n'existe pas de type object ou structure comme en C++, Java ou C.

Les types boolean, int, double et string possède chacun une syntaxe spécifique pour indiquer une constante, par exemple, true et false sont des boolean, 12 est un int, 12.0 un double et "foo" une string. De plus, la constante null qui représente aucune valeur est de type any. A part any, null n'est pas accepté par les autres types et convertir une valeur typé any et contenant null en un autre type lévera toujours une exception NullPointerException.

Les opérateurs sur les expressions

Le language ne définie que des opérations binaires sur les expressions. Il n'y a donc pas de '-' unaire ou plus grave pas de negation booléean (le not '!'). De plus, il n'existe pas d'opérations sur les bits (comme >>>, >>, <<, |, &, ~).

Il existe 4 types opérateur binaires:
  • Les opérateurs booléens, && et ||, qui prenne deux booléens en paramètre et retourne un booléen. Comme en C, && et || sont paresseux, donc si le membre gauche de && est évalué à false, alors le membre droit ne sera pas évalué. De la même façon, si le membre gauche de || est évalué à true le membre droit ne sera pas évaluer.
  • Les opérateurs de test ==, != qui retourne true si les valeurs sont de même type et de même valeur. Par exemple, 2 == 2.0 a pour résultat faux car 2 est un int et 2.0 un double, les deux operandes n'ont donc pas le même type.
  • Les opérateurs de comparaison, <, <=, >, >=, qui prenne deux types numériques (int ou double) et renvoie une valeur du même type. Il y a une promotion des int vers les doubles si un des opérandes est un double.
  • Les opérateurs classique, +, -, *, /, %, qui prenne deux types numériques (int ou double) et renvoie une valeur du même type. Il y a une promotion des int vers les doubles si un des opérandes est un double. Il existe, de plus, une rêgle spécifique pour le '+', si un des deux types est une chaine de caractère alors le résultat est une chaine de caractère.