Partage
  • Partager sur Facebook
  • Partager sur Twitter

Unit_lite : une alternative a boost::units

Vérification à la compilation de la chohérence des unités

    14 septembre 2015 à 17:15:05

    Bonjour.

    Pour ceux qui sont intéressés par le projet, je vous invite à lire directement la section "Objectifs" de ce post. Tous les objectifs listés dans cette section sont accomplis. Le reste n'est que du blabla destiné à respecter le plan des projets afin que mon post ne soit pas supprimé.

    Les anglophones peuvent directement lire la partie Unit_lite ici :
    https://tentacule.be/fossil/cpp-msmodels/index

    Moi ma vie mon œuvre

    Depuis que je suis tout petit comme ça (-----) je veux être une licorne, mais comme mes mains pleines de doigts ne se sont jamais transformées en sabots, j'ai utilisé ses derniers pour faire de la programmation avec un peu tout et n'importe quoi de la carte perforée au visual basic, en passant par quelques micro contrôleurs archaïques et autres trucs. Un jour je me suis dit que c'était drôlement mieux de faire une thèse que de boire des bières et draguer des filles et depuis je suis chercheur en bio-informatique et je fais tout plein de C++. Jadis je travaillais en analyse large échelle sur le métabolisme et maintenant je travaille sur les vaches, comme quoi la programmation ça mène à n'importe quoi sauf au licornes. Bref tout ça pour dire que j'y connais vachement plus en bébêtes qu'en informatique mais que j'en ai quand même une assez grosse pour écrire deux trois lignes de codes et faire une bibliothèque.

    Généralités pas si générales et avancement

    Question généralités savez vous que 2+2 égale 4 et que l'eau ça mouille.

    Le projet a avancé de 18cm, ce qui est assez pour qu'il soit fonctionnel. Il permet de faire tout ce qui est décrit dans la partie ci dessous, que je ne vais pas répéter ici car la répétition de choses répétitives est agaçante, surtout lorsque cette répétition de choses répétitives se répète lors de répétitives répétitions.

    Objectifs

    Une partie de mon travail consiste à agréger des modèles hétérogènes, et à faire des calculs d'équations différentielles. Même avec du café de l'aspirine, un papier un crayon et beaucoup de cervelle, c'est très vite le bordel et c'est assez facile de faire une erreur parce qu'on a ajouté des kg de lait avec des kg de vache ou des bananes avec des années lumières. Je me suis donc tourné vers une bibliothèque qui me permet de vérifier à la compilation la cohérence des unités impliquées dans les calculs. Comme les calculs consomment beaucoup de temps de CPU, il faut que cette bibliothèque n'aie aucun surcoût à l'exécution.

    Les limites de boost::units

    C'est ce que fait boost::units. Cette lib est bien plus polyvalente que la mienne mais elle a quelques limitations:
    - La documentation est incompréhensible (doc )
    - L'utilisation est vraiment tordue et assez peu extensible. Il faut notamment centraliser dans un même endroit toutes les unités qui sont utilisés et leur donner (à la compilation) un numéro d'identification unique. C'est assez pénible quand on a besoin de code extensible ou de mixer des modules différents.
    - Ca ne marche que sur des petits exemple. Dès que vous faites des calculs pour de vrai, vous allez consommer toute votre RAM, perdre 20 minutes puis gcc va planter avant de terminer la compilation.
    - Les messages d'erreurs font des kilomètres (généralement assez pour crasher le terminal d'eclipse) et vous n'y comprendrez rien.

    Ces limitations sont dues au fait que boost utilise boost fusion. Un ensemble de bidouilles avec les templates pour émuler les tuples en C++98. C'est super pour les dinosaures, mais depuis ce C++11, on peut faire mieux, plus vite et plus simple.

    Ce que fait ma lib

    J'ai donc eu une approche plus modeste, qui n'a pas toutes les fonctionnalités de boost::units mais qui a l’avantage d'être utilisable en pratique. Les objectifs (maintenant accomplis) étaient d'avoir :

    - une vérification à la compilation de la cohérence entre les unités
        - On ne doit pas ajouter des km avec des bananes.
        - Le type des unités est calculé automatiquement : si on fait auto x=b/(k*k), avec b en bananes et k en km, x est automatiquement en bananes/km²
        - Pas de coût à l'exécution : les calculs sont aussi rapides qu'on vérifie la cohérence des unités ou qu'on ne le fasse pas.

    - une gestion des multiples des unités
        - Si on définit qu'un m vaut 100 cm, et un cm vaut 10 mm, le programme se débrouille automatiquement pour savoir qu'un m vaut 1000 mm.

    - une manière simple d'afficher les unités
        - l'unité est automatiquement affichée à la suite des nombres, y compris pour les multiples ou les unitées composées.

    - une bibliothèque utilisable en pratique
        - de la doc (ici, section Unit_lite)
        - des erreurs bien plus claires que dans boost, la doc explique comment les lire.
        - une interface simple
        - la possibilité de définir les unités là où on a envie
        - des temps de compilation raisonnables sans consommer des tonnes de RAM

    Le projet et son originalité

    Ce projet est vachement original, puisqu'il fait moins mais mieux que boost::units, et que je n'ai trouvé aucune alternative. Il est particulièrement utile pour la physique et la modélisation puisqu’il permet d'éviter les erreurs de calculs au prix d'une compilation un tout petit peu plus longue.

    Vous pouvez contribuer à ce projet en proposant du code, en demandant des fonctionnalités,  en me rapportant les bugs et en publiant un lien vers la lib si vous la trouvez chouette (ou si vous la trouvez horrible, au quel cas, n'hésitez pas à expliquer pourquoi et à faire une flame war, j'adore manger du troll et je reçoit positivement les critiques constructives).

    Sur internet ce projet se place dans le monde du libre, mais du libre cool parce que c'est LGPL3, alors même si vous voulez l'utiliser dans votre coin pour gagner du pognon avec votre sale code propriétaire sans même m'offrir de bières, vous pouvez. Bon faut quand même respecter la licence, mais elle est  assez permissive. Et mon projet est vachement plus cool que boost parce que... ben parce que ca marche en pratique et que y'a même de la doc (en mauvais anglais tout de même).

    Liens

    - la dernière version stable : https://github.com/pierreblavy2/unit_lite
    - la version de développement et la doc : https://tentacule.be/fossil/cpp-msmodels/

    -
    Edité par ledemonboiteux 13 mai 2016 à 17:25:40

    • Partager sur Facebook
    • Partager sur Twitter

    Unit_lite : une alternative a boost::units

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown