This is an old revision of the document!


TP 12 - WebAssembly

Syntax - forme text

Avant de commencer le TP, lisez le tutoriel suivant: Mozilla Web Assembly Tutorial.

Pour plus d'informations, la documentation de Web Assembly est disponible ici: WebAssembly Semantics

Utilisation de Web Assembly

Pour tester les exemples présentés dans ce TP, on va utiliser la page destiné a Web Assembly : wat2wasm

Web Assembly peut etre utilisé en Javascript de la maniere suivante:

const wasmInstance =
      new WebAssembly.Instance(wasmModule, {
         io:{
           print: console.log
         }
      });

Un exemple de web assembly est:

(module
  (import "io" "print" (func $print (param $s i32)))
  (func $start
    	i32.const 120
    	call $print
    )
  (start $start)
 )

Le programme ci-dessus va afficher sur l'écran la valeur 120.

Translation de code en Web Assembly

Program Principal

int main ()
{
  return 0;
}
(module
  (func $start 
    )
  (start $start)
)

Fonction

int sum (int a, int b)
{
}
(module
  (func $sum (param $a i32) (param $b i32) (result i32)
    get_local $a
    get_local $b
    i32.add
    return
    )
)

Attribution de variable local

int name ()
{
  int a;
  a = 0;
  return a;
}
(module
  (func $name (local $a i32) (result i32)
    i32.const 0;
    set_local $a
    get_local $a
    return
    )
)

Import function

(module
  (import "io" "print" (func $print (param $n i32))
  ;; use the print function
  i32.const 120
  call $print 
)

if

if (a>b)
{
   print (a);
}
else
{
   print (b);
}
;; import the print function
get_local $a
get_local $b
i32.gt
if 
   get_local $a
   call $print
else
   get_local $b
   call $print
end

while

a=1;
while (a<120)
{
   print (a);
   a=a+1
}
;; import the print function
i32.const 1
set_local $a
block $endwhile
  loop $while
    get_local $a
    i32.const 120
    i32.gt
    br_if $endwhile
    get_local $a
    call $print 
    get_local $a
    i32.const 1
    i32.add
    set_local $a
    br $while
  end $while
end $endwhile

for

for (i=1; i<120; i++)
{
   print (a);
}
;; import the print function
i32.const 1
set_local $i
block $endfor
  loop $for
    get_local $i
    i32.const 120
    i32.gt
    br_if $endfor
    get_local $i
    call $print 
    get_local $i
    i32.const 1
    i32.add
    set_local $i
    br $for
  end $for
end $endfor

do-while

a=1;
do 
{
   print (a);
   a=a+1
} while (a<=120);
;; import the print function
i32.const 1
set_local $a
loop $dowhile
  get_local $a
  call $print 
  get_local $a
  i32.const 1
  i32.add
  set_local $a
  get_local $a
  i32.const 120
  i32.le
  br_if $dowhile
end $dowhile

Exercises

Pour les exercices suivants, vous pouvez écrire et envoyer le code source dans des fichiers texte. Vous devez ajouter aussi le code WAT, que le code JavaScript. Pour tester la validité de vos programmes, vous devez utiliser wat2wasm.

  1. Ecrivez dans un fichier ex1.txt le code WebAssembly pour le calcul de l'expression 3*(5+6)/7-5.(2p)
  2. Ecrivez un programme qui a une fonction de démarrage start et affiche sur l'écran le mois actuel (numéro). (1p)
  3. Ecrivez un programme qui initialise 3 variables locales avec les valeurs 5, 6 et 3 dans la fonction start et calcule le résultat de l'expression a+b/c. (1p)
  4. Ecrivez un programme avec qui inclut la déclaration d'une fonction qui calcule et affiche le rapport entre 2 numéros donnés comme parametres. Appelez la fonction de division dans la fonction start. (1p)
  5. Ecrivez une fonction qui vérifie si un numéro est divisible par 3. La fonction va afficher sur l'écran le reste de la division x/3. Dans la fonction start, appelez la fonction is_divisible avec le parametre 6. (1p)
  6. Ecrivez une fonction qui affiche sur l'ecran le carré de chaque nombre de l'intervalle [10, 20]. (1p)
  7. Ecrivez une fonction sq_sum qui calcule la somme des racines carrées des nombres d'un intervalle donné. La fonction reçoit deux paramètres qui représentent les limites de l'intervalle et affiche sur l'écran le résultat. Dans la fonction start, appelez la fonction sq_sum avec les parametres 1 et 4. (2p)
  8. Ecrivez une fonction qui vérifie si un nombre est premier et affichez 1 si le nombre est premier et 0 dans le cas contraire. (1p)
alf/laboratoare/11.1588013990.txt.gz · Last modified: 2020/04/27 21:59 by alexandru.radovici
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0