(3) Une instruction
abort(arg)
d’opcode0x60
1 est ajoutée. Elle permet d’interrompre le programme avant terme en renvoyant une information succincte sur le motif de l’erreur. Dans cette première version, un seul code d’erreur est reconnu,0x0000 → Motif d’erreur inconnu
.(4) Un programme qui s’interrompt renvoie :
- la valeur au sommet de la pile s’il est arrivé à terme ;
- le code d’erreur et un moyen d’accéder à l’état interne du programme (par exemple, un pointeur) si l’instruction
abort
a été utilisée.
Je ne suis pas sûr de comprendre : un programme qui exécute abort(0)
renvoie 0 ? C'est un détail, mais c'est étrange.
Il est à noter que si le 4e point est adopté, il devra l’être de manière définitive dans toutes les versions ultérieures du bytecode, afin que l’API principale ne change pas.
C'est encore un peu tôt pour parler de ce genre de choses, mais soyez souples : vous n'avez pas d'utilisateur (non, zlang ça compte pas :p), ne vous laissez pas enfermer dans un choix juste pour préserver une compatibilité qui n'est pas vraiment indispensable
À noter également que le fait de permettre l’accès à l’état interne du programme est une idée un peu folle que l’on peut laisser tomber : je sais que c’est faisable en C, C++ ou Rust sans changer l’API principale si le fonctionnement de l’état interne vient à changer, mais si c’est trop compliqué à mettre en place dans d’autres langages, on peut laisser tomber, et attendre une prochaine version du bytecode pour fournir une instruction comme
dump
qui permettrait de faire ça sans toucher à l’API principale.
Je ne suis pas sûr que ce soit très compliqué, et c'est probablement utile pour débuguer. L'avantage d'une VM, c'est que l'état est simple : il suffit de dumper la pile, les environnements et le code pointer dans un format quelconque et voilà.
Globalement, je ne suis pas un expert du sujet, mais j'aime bien ce qui se dit ici
-
Je suggère de réserver la série des
0x50
aux futures instructions de saut, et d’utiliser les0x60
pour la communication avec l’extérieur du programme. On y trouvera dans des versions ultérieures les appels système, la FFI, etc. ↩