On a marché avec la lune
Dans le cadre d’un projet réalisé pour l’un de ses clients, Systerel a dû trouver et mettre en œuvre une solution permettant d’intégrer au sein d’une application Ada2012 un mécanisme permettant de modifier simplement et à la volée le comportement de cette dernière sans avoir à modifier et donc à recompiler le code Ada2012 mis en œuvre.
Contraintes¶
La contrainte principale était que les personnes susceptibles de faire ces modifications n’avaient pas a priori de bagage informatique. La solution devait donc être accessible à des « non informaticiens ».
Naturellement, nous nous sommes orientés vers une solution scriptée dans laquelle l’application Ada2012 viendrait évaluer des scripts mis à disposition.
Même si le bestiaire des langages de scripts est conséquent, le plus simple à mettre en œuvre était pour nous LUA.
LUA¶
LUA (lune en portugais) est un langage de script développé au Brésil (Rio de Janeiro) à partir des années quatre-vingt-dix dont un des attraits est de pouvoir être facilement embarqué au sein d’autres langages.
Cette capacité est liée principalement à :
Son API C riche et très bien documentée,
L’efficacité de son implémentation.
Il faut compter une journée pour se familiariser avec le langage dont les fonctionnalités les plus intéressantes étaient pour nous le fait d’avoir :
La capacité de créer des namespaces et de gérer facilement le scope des données.
Un « semblant » de passage par nom des paramètres (~comme en Ada)
Une syntaxe simple et familière car proche du C.
Un grand nombre de modules disponibles nativement : os.xxx, math.xxx, file.xxx, string.xxx, table.xxx etc…
La notion de table qui est une extension de la notion de tableau propre à LUA permettant de faire entre autres des structures hétérogènes.
Une capacité à détecter un certain nombre de problèmes à l’exécution permettant ainsi d’avoir des traceback exploitables. De plus, la possibilité d’avoir des assertions a permis de robustifier les scripts.
Ci-dessous un exemple de code LUA que les utilisateurs finaux « non informaticiens » sont amenés à développer ou à amender :
function fonctionnel_1.evaluer () local result = false local pression = materiel_1.pression local temperature = materiel_1.temperature local expression_1 = pression <= 10.0 -- pascals local expression_2 = temperature <= 90.0 -- degrés result = expression_1 and expression_2 return result end -- fonctionnel_1.evaluer
Thick binding Ada/LUA¶
Même si des bindings d’excellente facture existent, il a été décidé d’en réécrire un, afin de s’affranchir entre autres des problèmes de contamination de licence.
L’écriture d’un tel binding a été particulièrement simple en Ada du fait des qualités intrinsèques du langage en terme d’interfaçage avec les foreign language (ici C). Nous avons profité de cette réécriture pour mettre en place un mécanisme permettant d’utiliser facilement les fonctions d’arité indéfinie disponibles en LUA à partir d’Ada.
function push (...) local args = (...)
Conclusion¶
Même si, au travers de notre blog, nous promouvons les qualités du langage Ada, celui-ci peut ne pas être toujours bien adapté à un problème donné. C’est pour cela, qu’il ne faut pas hésiter à l’utiliser de concert avec d’autres technologies ou langages afin de plus facilement décrocher la lune !
Référence¶
[1] : https://www.lua.org/
Comments