Pourquoi l'utilisation des bibliothèques C ++ est-elle si compliquée?


14

Tout d'abord, je tiens à noter que j'aime le C ++ et je suis de ceux qui pensent qu'il est plus facile de coder en C ++ qu'en Java. Sauf pour une toute petite chose: les bibliothèques.

En Java, vous pouvez simplement ajouter un pot au chemin de génération et vous avez terminé.

En C ++, vous devez généralement définir plusieurs chemins pour les fichiers d'en-tête et la bibliothèque elle-même. Dans certains cas, vous devez même utiliser des drapeaux de construction spéciaux. J'ai principalement utilisé Visual Studio, des blocs de code et aucun IDE du tout. Les 3 options ne diffèrent pas beaucoup lorsque l'on parle d'utiliser des bibliothèques externes.

Je me demande pourquoi n'y a-t-il pas eu d'alternative plus simple à cela? Comme avoir un fichier .zip spécial qui contient tout ce dont vous avez besoin en un seul endroit pour que l'EDI puisse faire tout le travail pour vous en configurant les drapeaux de construction. Y a-t-il un obstacle technique à cela?

Réponses:


15

C ++ a été conçu pour améliorer le langage C en rendant un langage plus simple et plus automatisé avec prise en charge de la programmation orientée objet. Mais cela n'a rien fait pour changer ou améliorer la façon dont C gère les bibliothèques externes et les fichiers d'en-tête. C ++ n'a pas de système de modules comme les langages plus modernes - il utilise toujours le préprocesseur C et le système de l'éditeur de liens. Étant donné que l'un des objectifs déclarés de C ++ était la rétrocompatibilité avec le code C, ce n'est pas vraiment surprenant. Tout système de module C ++ devrait fonctionner aux côtés de l'ancien système de fichier d'en-tête / éditeur de liens C. Le comité des normes C ++ n'a tout simplement pas réussi à concevoir un système de modules plus moderne. (Bien qu'ils y travaillent, voir le commentaire de Klaim ci-dessous.)


8
La dernière ligne n'est pas totalement correcte: le système de modules fonctionne depuis 2004 (premier document) mais impliquait tellement de travail qu'il ne pouvait même pas vraiment être envisagé pour la dernière norme car il y aurait eu un manque d'implémentation pour soutenir la proposition. Cette implémentation a été dans Wortk (avec d'autres versions) pour cibler la prochaine norme C ++. Ce n'est pas que ce n'est pas une priorité des concepteurs C ++, c'est juste l'une de ces fonctionnalités que vous ne pouvez pas vous tromper, devez garder la rétro-commpatibilité (avec la plupart du code C et C ++ 11) et il est incroyablement difficile de bien faire les choses. Cela prend donc beaucoup de temps.
Klaim

Impressionnant. Merci, Klaim, pour l'info. Je vais certainement le vérifier. C'est très excitant :)
Pijusn

La plupart des langues restent en dehors du travail de normalisation des liens car le mécanisme peut varier selon les systèmes d'exploitation. La nature run-Anywhere de Java nécessite de rendre obligatoire un format de bibliothèque et de liaison particulier. Il n'y a rien de mal à cela, mais cela entraîne des frais généraux qui peuvent ne pas être souhaitables dans tous les cas.
Blrfl

Franchement, j'ai assez peur de lire que le comité des normes C ++ travaille sur un système de modules pour le langage lui-même. Le C ++ est déjà un langage énorme et complexe et essayer d'y ajouter une fonctionnalité aussi sensible peut être très risqué. Comme indiqué par Karl Bielefeldt ci-dessous, ce problème a déjà trouvé une bonne solution au niveau de la plate - forme (système de package Linux) et pourrait probablement être très bien résolu par la plupart des IDE avec peu d'effort. Jetez un œil à la façon dont la bibliothèque Qt et Qt Creator gèrent ce problème, par exemple.
AlexBottoni

1
@AlexBottoni, je doute vraiment qu'ils trouveront un système de modules standardisé à tout moment de ce siècle. Ils n'ont même pas inclus de concepts en C ++ 11 car ils ne pouvaient pas s'entendre sur l'implémentation précise. Un système de modules qui fonctionne parallèlement au système d'en-tête / éditeur de liens est encore plus délicat, et nous ne le verrons probablement pas très longtemps.
Charles Salvia

2

Ce n'est pas un obstacle technique. Sous Linux, votre "fichier zip spécial" est un package bibliothèque-dev que vous installez avec un gestionnaire de packages, et la configuration des drapeaux d'inclusion et de liaison est aussi simple que l'ajout de quelques lignes à votre configure.acqui utilise pkg-config pour configurer les choses.

Pkg-config est également disponible pour Windows, mais les barrières culturelles ont empêché son adoption généralisée. Unix a une longue histoire d'activation de la portabilité en distribuant du code source, ils incluent donc les outils de développement gratuitement. Windows a une longue histoire d'encourager uniquement les développeurs de distribution binaire et de facturation pour les outils. Lorsque vous gagnez de l'argent en vendant des bibliothèques, il n'est pas logique de faciliter la fourniture par des tiers.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.