Quels algorithmes peuvent analyser les dépendances d'appels pour la fission bibliothèque?

StackOverflow https://stackoverflow.com/questions/8327785

  •  26-10-2019
  •  | 
  •  

Question

Supposons que j'ai une bibliothèque qui contient un tas de fonctions interdépendantes, cette bibliothèque est trop grand et je veux qu'il séparer. Quels algorithmes sont là pour trouver des partitions appropriées?

Exemple simple, il y a quatre fonctions en elle: alpha, bêta, gamma et delta .

  • bêta et gamma delta appel à la fois.
  • module1 appelle alpha et bêta.
  • module2 appelle gamma.
  • module3 appelle alpha, bêta et gamma.

La sortie de l'algorithme pourrait être:

  • LibA contient (alpha, beta)
  • libb contient (gamma)
  • LibC contient (delta)
  • module1 dépend LibA
  • module2 dépend Libb
  • module3 dépend de LibA et Libb
  • LibA dépend libc
  • Libb dépend libc

i.e.. il trouve la Lib plus finement grainée * partition avec la propriété suivante

Pour tout x, si LibX est partitionnée par une méthode quelconque dans liby et libz alors tous les modules / bibliothèques qui dépendent de liby dépendent également de libz et vice-versa.

Y at-il une solution standard pour cela?

Était-ce utile?

La solution

(Ceci est le même genre de problème que les gens ont avec les fichiers d'en-tête dans les programmes C et C, aussi.)

Il est non seulement « appels » qui créent des dépendances; il est any type de référence, à une variable membre, une variable statique ou même une définition constante.

En fait ce que vous devez faire est de découvrir toutes les belles dépendances de grains (ce qui nécessite généralement un compilateur comme outil d'analyse qui lit le code et découvre ces dépendances, entre les éléments linguistiques déclarés (déclarations, champs, méthodes, classes, forfaits si vous êtes java-centrique, etc.) et d'autres éléments de langage. utilisant la sémantique de la langue dans laquelle les bibliothèques sont écrites. (un tel analyis est probablement conservateur). Ceci est l'essence vous donne un graphique géant, avec des noeuds étant la langue les éléments et les arcs étant "utilisations".

Le problème d'emballage bibliothèque dans l'abstrait se brise ce graphique à part en morceaux, ce qui minimise les arcs de dépendance croisée chunk. Cela peut vous donner un très grand nombre de petites bibliothèques.

Le problème pratique est regroupement des morceaux qui ne dépendent pas réelle sur l'autre, mais sont couramment utilisés ensemble. Par exemple, un ensemble de procédures d'accès mémoire tampon ne peut pas avoir une dépendance explicite sur une définition de buffersize par défaut, mais vous voulez probablement une bibliothèque contenant à la fois, plutôt que deux bibliothèques avec un contenant juste la déclaration buffersize par défaut. Cette notion de utilisée-ensemble est vraiment un artefact de domaine problème, et est nulle part visible dans le code sauf peut-être une cooccurrence statistique des utilisations.

La difficulté de ce problème est de découvrir les dépendances sémantiques à grains fins. Vous pouvez approcher cette main, mais s'il y a une échelle au problème, vous n'aurez pas l'appétit pour le faire. (Les gens ne se réorganisent pas les fichiers en-tête pour la même raison). Quasiment vous avez besoin d'outils linguistiques pour faire l'analyse, grande gestion graphique pour proposer des morceaux, l'analyse statistique pour obtenir un regroupement hueristic, et probablement une interface utilisateur pour permettre à un expert de domaine à l'édition du regroupement pour produire les bibliothèques révisées.

Ensuite vous avez besoin d'un outil pour revenir au code qui utilise les bibliothèques existantes, et les modifier à utiliser les bibliothèques révisées. La Bibliothèque refactoring et la révision de base de code nécessite une analyse de code massive et le changement, qui a besoin de l'automatisation.

DMS Software Reengineering Toolkit avec ses nombreux

scroll top