IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[debat] utilisation des libs/dll/a/so dans une grosse application


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut [debat] utilisation des libs/dll/a/so dans une grosse application
    Bonjour,

    lorsqu'on part sur la conception d'un grosse application, il y a tout un tas de choix à faire. Notemment celui de la modularité: il faut découper notre programme en modules le plus indépendants possibles afin de faciliter le développement, les tests et la maintenance.

    En c++ (et dans la plupart des langages il me semble), pour faire cela on va découper notre programme en bibliothèques, statiques ou dynamiques, qui seront autant de sous-projets.

    Pour poursuivre la discussion et l'illustrer, prenons un exemple (presque) concret. Un programme BigProject, qui contiendra:
    . une interface graphique relativement complexe (plusieurs écrans, toute sortes de contrôles, etc.)
    . des accès à une grosse base de données (lecture et écriture)
    . plusieurs thread permettant d'effectuer plusieurs tâches en parrallèle et faire des choses sans bloquer l'IHM
    . plusieurs types de traitements de données très différents. Par exemple, un module qui traite des images, un autre qui fait des calculs sur des séries contenues en base de donnée, etc.
    . une interface réseau qui permet d'échanger des données avec des serveurs (webservices avec SOAP par exemple) externes.
    . un moteur de règles, qui s'applique à chaque résultat avant qu'il ne soit affiché

    Première étape, appliquons un MVC "bourrin" => on obtiens 3 gros modules:
    1. la gestion des données (base de données, modules réseau, traitements) [Model]
    2. l'IHM [View]
    3. la gestion des threads, l'organisation des tâches et des règles [Controller]

    Si l'on en reste là, on va obtenir 2 grosses bibliothèques (Model et Controller) et un gros exécutable (View).

    Maintenant la question est: doit-on continuer à découper chacun de ces trois modules en sous-modules sous formes de petites bibliothèques?

    Plus précisément, les questions qui se posent sont:
    1. la rapidité d'exécution: si on a décidé de séparer un module (une bibliothèque) en 2, mais qu'une des bibliothèque fait 1000 appels par seconde à une fonction de l'autre bibliothèque, ne va-t-on pas perdre en rapidité d'exécution?
    2. maintenance: est-ce que ça ne devient pas trop compliqué au bout d'un moment, d'avoir 50 dlls/libs différentes, avec des dizaines de versions pour chacune?
    3. gestion des dépendances: est-ce que les inter-dépendances entre les différentes libs peuvent finir par poser de gros problèmes? (dépendances circulaires par exemple)
    4. statique vs dynamique: dans quel(s) cas est-il préférable d'utiliser des bibliothèques statiques ou dynamiques?
    5. existe-t-il des "best practices" concernant ce découpage en modules?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Ben euh.. ça dépend de l'appli non?

    tu n'as pas forcément besoin de bibliothèques différentes, peut être juste une séparation en modules ( avec l'aide de namespaces ) suffit largement.

    Après si tu veux un système de plug-in, une grande modularité qui te permet de changer de framework graphisme à la volée, là il faudra faire des biblio dynamiques.

    Bon je suis pas spécialiste là dessus donc je voudrais pas dire de bêtise mais le linkage statique est pratique si tu veux pas avoir trop de dépendances à des libs, que tu ais tout direct dans ton appli avec la version que tu as choisi. Mais il sera plus gros et plus long à compiler.

    Et idem si tu as plusieurs appli qui partagent des modules, là une librairie commune fera aussi l'affaire.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Citation Envoyé par r0d Voir le message
    1. la rapidité d'exécution: si on a décidé de séparer un module (une bibliothèque) en 2, mais qu'une des bibliothèque fait 1000 appels par seconde à une fonction de l'autre bibliothèque, ne va-t-on pas perdre en rapidité d'exécution?
    Pourquoi perdrait-on en rapidité ? A part au lancement, lorsque la bibliothèque est chargée, ensuite le code est en mémoire comme le code de l'exe. Pourquoi ça impacterait les perfs ? (sauf si il y avait un inlining dans la première version).

    Citation Envoyé par r0d Voir le message
    2. maintenance: est-ce que ça ne devient pas trop compliqué au bout d'un moment, d'avoir 50 dlls/libs différentes, avec des dizaines de versions pour chacune?
    Probablement. Surtout en gestion de conf et en intégration.

    Citation Envoyé par r0d Voir le message
    3. gestion des dépendances: est-ce que les inter-dépendances entre les différentes libs peuvent finir par poser de gros problèmes? (dépendances circulaires par exemple)
    Ca, c'est un problème de design.

    Citation Envoyé par r0d Voir le message
    4. statique vs dynamique: dans quel(s) cas est-il préférable d'utiliser des bibliothèques statiques ou dynamiques?
    Citation Envoyé par r0d Voir le message
    5. existe-t-il des "best practices" concernant ce découpage en modules?
    Réponse 3 : ne sait pas

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je donnerais des réponses plus détaillées à l'occasion, si j'en ai le temps.
    Citation Envoyé par r0d Voir le message
    1. la rapidité d'exécution: si on a décidé de séparer un module (une bibliothèque) en 2, mais qu'une des bibliothèque fait 1000 appels par seconde à une fonction de l'autre bibliothèque, ne va-t-on pas perdre en rapidité d'exécution?
    Avec un bon compilo et une lib statique : Non. Avec une lib dynamique, peut-être (j'ai déjà eu un écart de 10% de perfs).
    Citation Envoyé par r0d Voir le message
    2. maintenance: est-ce que ça ne devient pas trop compliqué au bout d'un moment, d'avoir 50 dlls/libs différentes, avec des dizaines de versions pour chacune?
    Oui, et non... En général, une GrosseAppli ne vit pas toute seule, isolée. Elle collabore avec GrosseAppliVersionFree et GrosseAppliSurUnDomaineProche. Dans ce cas, des bibliothèques sont utiles.
    Citation Envoyé par r0d Voir le message
    3. gestion des dépendances: est-ce que les inter-dépendances entre les différentes libs peuvent finir par poser de gros problèmes? (dépendances circulaires par exemple)
    S'il y a dépendance circulaire, c'est généralement qu'il y a mauvais découpage. Il existe des outils pour mieux visualiser les dependances entre bibliothèques, mais je n'n ai pas de véritable expérience.
    Citation Envoyé par r0d Voir le message

    4. statique vs dynamique: dans quel(s) cas est-il préférable d'utiliser des bibliothèques statiques ou dynamiques?
    Pour moi : Statique : Option par défaut. Dynamique : Si on a besoin du dynamisme (plug-in...)
    Citation Envoyé par r0d Voir le message
    5. existe-t-il des "best practices" concernant ce découpage en modules?
    Le seul livre que je connaisse sur le sujet est "Large scale C++ software design", mais je le trouve un peu gros et lourd à lire par rapport au contenu (intéressant néanmoins).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Je donnerais des réponses plus détaillées à l'occasion, si j'en ai le temps.
    Avec un bon compilo et une lib statique : Non. Avec une lib dynamique, peut-être (j'ai déjà eu un écart de 10% de perfs).
    J'imagine que c'est lié aux optimisations que peut faire le compilo/linker avec une lib statique. Parce que sinon, je ne vois pas quelle différence il peut y avoir ?

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'imagine que c'est lié aux optimisations que peut faire le compilo/linker avec une lib statique. Parce que sinon, je ne vois pas quelle différence il peut y avoir ?
    Le probleme est qu'on associe generalement (au moins sous Unix), lib dynamique et PIC (Position Independant Code). Quand on compile vers du PIC, il y a un overhead (sauf si l'archi a ete concue pour ca, X86-64 par exemple a un mode d'adressage concu pour diminuer l'overhead). Mais on peut faire une lib dynamique sans compiler en PIC (on paie autrement, par un cout plus important au demarrage et par des difficultes a partager la lib entre processus).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    screetch
    Invité(e)
    Par défaut
    l'avantage des DLL (sous windows) c'est de vérifier que le code n'a pas de double dépendance (ce qui est possible avec des libs statiques).
    On ne peut pas avoir a.dll qui dépend de b.dll qui dépend de a.dll
    alors qu'on peut avoir a.lib et b.lib qui dépendent l'un de l'autre

    du coup cela permet de vérifier qu'on a pas d'appel "en amont", c'est a dire un code qui dépend d'une implémentation qu'on ne devrait pas connaitre.

    Pour ma part, je me suis cassé la nenette a grand coups de macros et d'outil de build jusqu'a pouvoir activer un simple switch qui me permet de passer d'un système a 15 dll indépendantes, a une seule DLL et un executable et des plugins, voire même un build complètement statique ou les plugins sont "intégrés" a l'executable. Je peux ainsi vérifier les dépendances de projets, mais pour le build final il n'y a qu'une DLL et des plugins, et sur des systèmes exotiques sans chargement dynamique un seul executable. (vive les macros)

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par r0d Voir le message
    2. maintenance: est-ce que ça ne devient pas trop
    compliqué au bout d'un moment, d'avoir 50 dlls/libs différentes, avec des
    dizaines de versions pour chacune?
    Oui, il y a un moment ou la decoupe est trop fine. Mais pour un gros
    projet, 50 en est loin (pour l'appli principale sur laquelle je travaille,
    on a 2 objets et 430 librairies -- dont une soixantaine sont plusieurs fois
    dans la ligne de link)

    3. gestion des dépendances: est-ce que les inter-dépendances entre
    les différentes libs peuvent finir par poser de gros problèmes?
    (dépendances circulaires par exemple)
    C'est des problemes chiants mais pas bloquant. Mais elles denotent des
    interdependances entre equipes qui sont plus penibles. Au final, on arrive
    toujours a un organigramme fonctionnel et une archi logicielle qui tendent
    l'une vers l'autre, et quand c'est l'organigramme fonctionnel qui commande
    (pour des raisons plus ou moins bonnes, dans les bonnes il y a la
    localisation geographique), on se retrouve avec des dependances
    artificielles.

    En prime, il ne faut pas sous-estimer le cout des techniques de
    decouplages. Elles ne suppriment pas les interactions, elles les masquent.
    Et dans une grosse appli, tu te retrouvent facilement a interferer avec des
    interactions dont tu n'as pas connaissance et qui ne sont pas visibles dans
    le code (deux observeurs sur un module qui interagissent a travers un
    quatrieme et donc doivent etre enregistres dans un ordre donne par exemple).

    4. statique vs dynamique: dans quel(s) cas est-il préférable
    d'utiliser des bibliothèques statiques ou dynamiques?
    Statique quand on peut, dynamique quand on doit. Les bibliotheques
    dynamiques imposent une gestion des versions jusqu'a l'utilisation et
    posent donc des problemes de validations impossibles si on n'est pas tres
    rigoureux et la rigueur en la matiere est couteuse -- surtout si par manque
    d'experience on ne sait pas a quoi il faut faire attention.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut !

    Citation Envoyé par r0d Voir le message
    1. la rapidité d'exécution: si on a décidé de séparer un module (une bibliothèque) en 2, mais qu'une des bibliothèque fait 1000 appels par seconde à une fonction de l'autre bibliothèque, ne va-t-on pas perdre en rapidité d'exécution?
    L'explication avec l'overhead de M. Bourquet semble complète. Pourtant, je tiens à signaler un aspect utilisé sur le projet sur lequel je bosse, qui contient des milliers de dlls (et pas des petites). Un utilisateur donné ne va pas nécessairement charger toutes les dlls. Il va se concentrer par exemple sur une partie du programme, et par conséquent, seules les dlls qu'il va effectivement utiliser seront chargées, ce qui représente une économie en mémoire et en temps de chargement non négligeable. Peut être qu'il y a un travail à effectuer côté code pour que ce soit géré finement, mais en tout cas ça se fait.

    Aussi, rien n'empêche une équipe de livrer une version dynamique et une version statique de sa librairie, en laissant à l'intégrateur industriel le choix final pour l'application.

    Astuce hors sujet : si vous attachez le débugueur Visual à un processus qui a chargé plus de 500 dlls, il plante.


    Citation Envoyé par r0d Voir le message
    2. maintenance: est-ce que ça ne devient pas trop compliqué au bout d'un moment, d'avoir 50 dlls/libs différentes, avec des dizaines de versions pour chacune?
    C'est l'éternel problème du juste équilibre, et comme dit plus haut, c'est beaucoup lié à l'organisation humaine. La granularité du programme sera aussi celle des équipes de développement, je ne pense pas qu'il y ai de formule magique. Au niveau des versions, si l'architecture de gestion du code source et le calendrier des livraisons sont bien conçus, ça ne devrait pas poser de souci.

    Citation Envoyé par r0d Voir le message
    3. gestion des dépendances: est-ce que les inter-dépendances entre les différentes libs peuvent finir par poser de gros problèmes? (dépendances circulaires par exemple)
    Pour moi, la réponse est oui. Chez nous, des outils de gestion des droits peuvent empêcher des équipes de tirer sur du code dont ils ne sont pas censés dépendre. Les auteurs d'une librairie doivent donner explicitement le droit à d'autres de pouvoir les utiliser. Le problème est que c'est complexe à mettre en oeuvre sur la chaîne de compilation, et qu'une gestion juste "humaine" peut peut être suffire. En tout cas, c'est un problème qui requiert de l'attention, et un outil de visualisation et de surveillance des dépendances est indispensable, à défaut de pouvoir imposer des contraintes.

    Citation Envoyé par r0d Voir le message
    4. statique vs dynamique: dans quel(s) cas est-il préférable d'utiliser des bibliothèques statiques ou dynamiques?
    5. existe-t-il des "best practices" concernant ce découpage en modules
    Comme 3D archi, réponse 3, ne sait pas.
    Find me on github

Discussions similaires

  1. [OL-2013] Utiliser des blocs de type QuickPart dans une réponse
    Par lodan dans le forum Outlook
    Réponses: 2
    Dernier message: 07/11/2014, 15h42
  2. [XL-2010] Utilisation des "Styles de Cellules" intégrés dans une macro
    Par Pico----- dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/10/2014, 15h41
  3. Réponses: 0
    Dernier message: 22/05/2014, 17h24
  4. Comment utiliser des méthodes d'un jar dans une JSP ?
    Par utopman dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 26/06/2012, 22h01
  5. Réponses: 1
    Dernier message: 22/11/2007, 22h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo