Ce didacticiel est destiné aux nouveaux utilisateurs de la Simple Virtual Machine.
Dans ce didacticiel, vous allez manipuler un concept important lié aux extensions.
Le temps de lecture de ce didacticiel est estimé à 15 minutes si l'utilisation des instructions, types et interruptions extensions a été abordée.
Pour commencer, créez le canevas de l'application dans le fichier exécutable points_entree_extension.svm en utilisant ce code :
#!/usr/bin/env svm
DESCRIPTION
Plugin entry points example
END
LOG
DEBUG "Plugin entry points" STYLE "default"
PLUGIN "svmcom.so"
PLUGIN "svmrun.so"
PLUGIN "svmreal.so"
PLUGIN "svmstr.so"
PROCESS "application"
CODE "main" INLINE
:debug BREAK
END
END
Modifiez le code pour obtenir :
#!/usr/bin/env svm
DESCRIPTION
Plugin entry points example
END
LOG
DEBUG "Plugin entry points" STYLE "default"
PLUGIN "svmcom.so"
PLUGIN "svmrun.so"
PLUGIN "svmreal.so"
PLUGIN "svmstr.so"
PROCESS "application"
CODE "main" INLINE
:debug BREAK
:memory com.device/stdin, real.number/r, STR/s, real.number/i
CONST real.number "0" -> &r
:com.open com.terminal STDIN -> &stdin
:interruption !com.interrupted retry
:label input_loop
:com.read @&stdin com.line -> &s
:goto input_end :unless &s INITIALISED
:str.replace @&s 1 CONST str.pattern "\n" => ""
:real.parse @&s -> &i
:real.add @&r @&i -> &r
:goto input_loop
:label input_end
:real.mul @&r CONST real.number "3.14159" -> &r
:com.message "Result: " @&r
:shutdown
:label retry
:run.retry
END
END
Vous pouvez lancer l'application, et constater sa relative utilité :
cat << EOM | ./points_entree_extension.svm
1.4
2.5
3.6
EOM
Result: 23.561925
Ce qui nous intéresse plus sur cette application, c'est son code. Dans ce code se trouvent plusieurs fois la construction identifiant.identifiant
.
Placez ces constructions en différentes catégories selon leur usage : types, instructions, interruptions, ou autres.
Vous devez obtenir :
Types | Instructions | Interruptions | Autres |
---|---|---|---|
|
|
|
|
Dans le tableau que vous venez d'obtenir, la majorité de ces constructions sont dans une catégorie évidente. Il en reste seulement deux ici qui ont une utilisation non décrite jusqu'ici.
De par leur placement dans le code, ces valeurs semblent être des arguments pour les instructions où elles se trouvent !
La construction identifiant.identifiant
est une valeur spécifique de la machine virtuelle, représentant un point d'entrée d'une extension. La catégorie de l'objet est déduite de l'endroit où se trouve cette construction dans le code.
Elle est dédiée à l'utilisation des extensions.
Modifiez le code, pour ajouter un tableau de points d'entrée d'extension et les utiliser par lecture en mémoire partout où cela est possible :
#!/usr/bin/env svm
DESCRIPTION
Plugin entry points example
END
LOG
DEBUG "Plugin entry points" STYLE "default"
PLUGIN "svmcom.so"
PLUGIN "svmrun.so"
PLUGIN "svmreal.so"
PLUGIN "svmstr.so"
PROCESS "application"
CODE "main" INLINE
:memory PEP*12/pep
[ com.device , real.number , com.open , com.terminal , com.read , com.line , str.replace , real.parse , real.add , real.mul , com.message , run.retry ] -> pep
:debug BREAK
:memory @(pep/0)/stdin, @(pep/1)/r, STR/s, @(pep/1)/i
CONST real.number "0" -> &r
:@(pep/2) @(pep/3) STDIN -> &stdin
:interruption !com.interrupted retry
:label input_loop
:@(pep/4) @&stdin @(pep/5) -> &s
:goto input_end :unless &s INITIALISED
:@(pep/6) @&s 1 CONST str.pattern "\n" => ""
:@(pep/7) @&s -> &i
:@(pep/8) @&r @&i -> &r
:goto input_loop
:label input_end
:@(pep/9) @&r CONST real.number "3.14159" -> &r
:@(pep/10) "Result: " @&r
:shutdown
:label retry
:@(pep/11)
END
END
Relancez l'application pour constater que le comportement est exactement le même :
cat << EOM | ./points_entree_extension.svm
1.4
2.5
3.6
EOM
Result: 23.561925
Déja, le point est accordé, le code est beaucoup moins lisible ainsi ! En règle générale, l'utilisation d'un point d'entrée d'extension lue depuis la mémoire est plutôt limitée, même si en certaines circonstances cela peut être très utile.
PEP
(pour "plugin entry point" en anglais) lorsqu'elle est écrite en mémoire.!
et CONST
.Vous venez de voir comment utiliser les points d'entrée d'extension depuis le code et la mémoire de la machine virtuelle.
Les extensions sont une capacité majeure de la machine virtuelle pour l'écriture d'applications. Les points d'entrée d'extension sont un concept permettant au code de manipuler les objets définis dans les extensions. Ils sont donc vitaux lorsque l'application devient conséquente.