Quelle est la différence entre "STL" et "C ++ Standard Library"?

446

Quelqu'un a attiré mon attention sur cet article qui prétend (je paraphrase) que le terme STL est utilisé à mauvais escient pour faire référence à l'ensemble de la bibliothèque standard C ++ au lieu des parties qui ont été extraites de SGI STL.

(...) il fait référence à la "STL", malgré le fait que très peu de gens utilisent encore la STL (qui a été conçue chez SGI).

Certaines parties de la bibliothèque standard C ++ étaient basées sur des parties de la STL, et ce sont ces parties que de nombreuses personnes (y compris plusieurs auteurs et le cplusplus.com connu pour ses erreurs) se réfèrent toujours à "la STL". Cependant, c'est inexact; en effet, le standard C ++ ne mentionne jamais "STL", et il existe des différences de contenu entre les deux.

(...) "STL" est rarement utilisé pour faire référence aux bits de la stdlib qui se trouvent être basés sur la SGI STL. Les gens pensent que c'est toute la bibliothèque standard. Il est mis sur les CV. Et c'est trompeur.

Je ne connais pratiquement rien de l'histoire de C ++, je ne peux donc pas juger de l'exactitude de l'article. Dois-je m'abstenir d'utiliser le terme STL? Ou s'agit-il d'une opinion isolée?

Pieter
la source
62
Les gens ont besoin de bons noms pour décrire les choses. Le génie de Stepanov a changé notre façon de programmer. Un nom comme «programmation de bibliothèque standard» est totalement inutile pour décrire cela. Appelez ça "programmation stl" et tout le monde sait ce que vous voulez dire. Argumenter à ce sujet manque tout simplement le point: nous avons besoin d'un bon nom.
Hans Passant
34
@Hans: Non, vous manquez le point: " tout le monde sait ce que vous voulez dire" n'est pas vrai .
Courses de légèreté en orbite
16
Je n'ai aucune idée de ce que tu veux dire.
Hans Passant
21
Voici un exemple parfait de quelqu'un qui utilise "la STL" pour se référer à l'ensemble de la bibliothèque standard C ++. Cela continue de me déconcerter que tant de gens jurent aveugles que personne ne le fasse jamais, alors qu'il est évident de le voir presque quotidiennement.
Courses de légèreté en orbite le
19
2 747 résultats pour "stl streams" sur Stack Overflow .
Courses de légèreté en orbite le

Réponses:

571

Le "STL" a été écrit par Alexander Stepanov dans les jours qui ont précédé la normalisation de C ++. Le C ++ a existé dans les années 80, mais ce que nous appelons maintenant « C ++ » est le langage normalisé dans ISO / IEC 14882: 2014 (et les versions antérieures, comme ISO / IEC 14882: 2011).

La STL était déjà largement utilisée comme bibliothèque pour C ++, donnant aux programmeurs l'accès aux conteneurs, aux itérateurs et aux algorithmes. Lorsque la normalisation a eu lieu, le comité de langue a conçu des parties de la bibliothèque standard C ++ (qui fait partie de la norme de langage) pour correspondre très étroitement à la STL.

Au fil des ans, de nombreuses personnes - y compris d'éminents auteurs de livres et divers sites Web - ont continué à appeler la bibliothèque standard C ++ "la STL", malgré le fait que les deux entités sont distinctes et qu'il existe des différences. Ces différences sont encore plus prononcées dans la nouvelle norme C ++ à venir, qui comprend diverses fonctionnalités et modifie considérablement certaines classes.

La STL d'origine est maintenant souvent appelée «une implémentation de la bibliothèque de modèles standard C ++» (plutôt en arrière dans l'historique réel!), De la même manière que votre Microsoft Visual Studio ou GCC fournit une implémentation de la bibliothèque standard C ++. Mais la "bibliothèque de modèles standard" et la "bibliothèque standard" ne sont pas la même chose.

La bataille est de savoir si la bibliothèque standard actuelle doit être appelée "la STL" en tout ou en partie, et / ou si elle importe comment elle s'appelle.

Pour "STL"

Il y a une école de pensée qui dit que tout le monde sait maintenant que "STL" signifie la bibliothèque standard, tout comme tout le monde sait maintenant que "C ++" est le langage normalisé ISO.

Cela inclut également ceux qui pensent que cela n'a pas vraiment d'importance tant que toutes les parties comprennent ce dont on parle.

C'est un terme rendu encore plus répandu par la nature de la bête, dont une grande partie fait un usage intensif de la fonctionnalité C ++ connue sous le nom de "modèles".

Pour "Bibliothèque standard C ++" (ou stdlib)

Cependant, il existe une autre école de pensée - à laquelle je souscris - qui dit que cela prête à confusion. Les personnes qui apprennent le C ++ pour la première fois ne connaissent pas cette distinction et peuvent ne pas remarquer de petites différences de langage.

L'auteur de cet article a rencontré à plusieurs reprises des gens qui pensent que la bibliothèque standard C ++ entière est la STL, y compris des fonctionnalités qui n'ont jamais fait partie de la STL elle-même. La plupart des partisans vocaux de "la STL", en revanche, savent exactement ce qu'ils entendent par là et refusent de croire que tout le monde "ne comprend pas". De toute évidence, l'utilisation du terme n'est pas uniforme.

De plus, il existe des bibliothèques de type STL qui sont en fait des implémentations de la STL d'origine, pas la bibliothèque standard C ++. Jusqu'à récemment, STLPort était l'un d'entre eux (et même là, la confusion abonde!).

En outre, la norme C ++ ne contient le texte «STL» nulle part, et certaines personnes utilisent habituellement des expressions comme «la STL est incluse dans la bibliothèque standard C ++», ce qui est tout à fait incorrect.

Je suis convaincu que continuer à propager l'utilisation du terme de cette manière ne fera que conduire à l'incompréhension pour toujours. Hélas, il peut être totalement contre-productif d'essayer de changer les choses, même si c'est censé être pour le mieux. Nous pouvons juste être coincés avec des significations doubles pour toujours.

Conclusion

J'apprécie que ce post ait été un peu biaisé: j'ai écrit l'article auquel vous avez lié. :) Quoi qu'il en soit, j'espère que cela aidera à expliquer un peu mieux la bataille.

Mise à jour 13/04/2011

Voici trois exemples parfaits de quelqu'un qui utilise "la STL" pour faire référence à l'ensemble de la bibliothèque standard C ++. Cela continue de me dérouter que tant de gens jurent aveugles que personne ne le fasse jamais, alors qu'il est évident de le voir presque quotidiennement.

Courses de légèreté en orbite
la source
136
Le S tandard T Emplate L ibrary était non seulement créé par St epanov et L ee, mais ils travaillaient aussi au S oftware T echnique L aboratoire à l'époque.
Kragen Javier Sitaker
21
Quelqu'un a demandé aujourd'hui dans quelle en-tête il std::iotaétait, parce qu'il ne pouvait pas le faire fonctionner. C'est une extension SGI non standard , qu'ils appellent "standard" quand cela leur convient car c'est "la STL", et tout le monde sait que "la STL" fait partie de la bibliothèque standard C ++, non? Et il a été introduit en C ++ 0x, mais n'est pas disponible en C ++ 03. Grrr.
Courses de légèreté en orbite le
40
Et MS STL est maintenu par S tephan T . L avavej, alias STL.
Mihaela
26
Bjarne Stroustrup différencie spécifiquement la STL des autres parties de la bibliothèque standard dans le "canon", The C ++ Programming Language 4th Edition.
codenheim
84

Il n'y a pas une seule réponse qui soit vraiment correcte. Alexander Stepanov a développé une bibliothèque qu'il a appelée STL (travaillant pour HP à l'époque). Cette bibliothèque a ensuite été proposée pour inclusion dans la norme C ++.

Ce développement essentiellement "fourchu". Le comité comprenait certaines parties, en rejetait complètement d'autres et en remodelait quelques-unes (avec la participation d'Alexandre). Le développement de la bibliothèque d'origine a ensuite été déplacé vers Silicon Graphics, mais s'est poursuivi séparément de la bibliothèque standard C ++.

Après ces morceaux ont été ajoutés à la bibliothèque standard, d'autres parties de la bibliothèque standard ont été modifiés pour s'adapter mieux avec ce qui a été ajouté (par exemple begin, end, rbeginet rendont été ajoutées à std::stringafin qu'il puisse être utilisé comme un récipient). Vers la même époque, la plupart de la bibliothèque (même des pièces qui n'étaient absolument pas liées) ont été transformées en modèles pour s'adapter à différents types (par exemple, les flux standard).

Certaines personnes utilisent également STL comme une simple forme abrégée de "bibliothèque standard".

Cela signifie que lorsque quelqu'un utilise le terme "STL", il peut faire référence à environ une demi-douzaine de choses différentes. Pour le meilleur ou pour le pire, la plupart des gens qui l'utilisent semblent ignorer la multiplicité des significations et supposent que tout le monde reconnaîtra à quoi ils se réfèrent. Cela conduit à de nombreux malentendus, et au moins à quelques guerres de flammes graves qui ont rendu la plupart des participants stupides parce qu'ils parlaient simplement de choses entièrement différentes.

Malheureusement, la confusion devrait se poursuivre sans relâche. Il est beaucoup plus pratique de faire référence à "STL" qu'à quelque chose comme "les conteneurs, les itérateurs et les algorithmes dans la bibliothèque standard C ++, mais sans les inclure std::string, même s'il peut agir comme un conteneur". Même si la "bibliothèque standard C ++" n'est pas aussi longue et maladroite que cela, "STL" est toujours beaucoup plus courte et plus simple. Jusqu'à ou à moins que quelqu'un n'invente des termes plus précis (si nécessaire) et tout aussi pratiques, "STL" continuera à être utilisé et la confusion continuera à en résulter.

Jerry Coffin
la source
5
@Jerry: l'ancien; c'est ce que "std" signifie. :)
Courses de légèreté en orbite
6
@Jerry: Je ne sais pas où les espaces de noms entrent en jeu. Les implémentations conformes n'ajoutent rien à l'espace de noms std. Je parlais du "std" dans "stdlib", qui signifie "standard". Je pense que c'est assez clair ce que cela signifie!
Courses de légèreté en orbite
3
@Jerry: Je ne pense vraiment pas que ce soit exagéré de s'attendre à ce que quelqu'un lise l'adjectif "standard" car "c'est dans la norme". Pendant ce temps, 17.4.3.1/1 est tout à fait clair que l'ajout de choses à l'espace de noms stdest UB sauf dans certains cas spécifiques nommés: ces cas d'addition sont nommés dans la norme, et sont donc toujours parfaitement conformes; «standard» continuerait de s'appliquer.
Courses de légèreté en orbite
1
L'histoire de SGI et HP ici est à l'envers. Stepanov était chez HP avant d'être chez SGI.
Kragen Javier Sitaker
2
Je viens de relire les commentaires ici et j'ai pensé qu'il valait la peine d'ajouter un point (certes mineur): je pense que c'est un peu exagéré de s'attendre à ce que "standard" signifie toujours "c'est dans la norme". En particulier, de nombreux programmeurs C ++ ont utilisé l'expression « bibliothèque standard » bien avant qu'il y avait une norme. De peur de penser qu'ils faisaient référence à la bibliothèque dans la norme C, je ferai remarquer que la même chose était vraie pour les programmeurs C bien avant qu'il y ait (même une ébauche de) une norme C.
Jerry Coffin
52

Le terme «STL» ou «bibliothèque de modèles standard» n'apparaît nulle part dans la norme ISO 14882 C ++. Donc, faire référence à la bibliothèque standard C ++ comme STL est faux. Le terme «bibliothèque standard C ++» ou «bibliothèque standard» est ce qui est officiellement utilisé par ISO 14882:

Norme ISO 14882 C ++:

17 - Introduction à la bibliothèque [lib.library]:

  1. Ces clauses décrivent le contenu de la bibliothèque standard C ++ , comment un programme C ++ bien formé utilise la bibliothèque et comment une implémentation conforme peut fournir les entités de la bibliothèque.

...

STL est une bibliothèque conçue à l'origine par Alexander Stepanov, indépendante du standard C ++. Cependant, certains composants de la bibliothèque standard C ++ incluent des composants STL comme vector, listet des algorithmes comme copyet swap.

Mais bien sûr, la norme C ++ comprend beaucoup plus de choses en dehors de la STL, donc le terme "bibliothèque standard C ++" est plus correct (et c'est ce qui est réellement utilisé par les documents de normes).

In silico
la source
5
+1. Bien que, dans la STL, il n'y avait pas d' stdespace de noms (IIRC).
Courses de légèreté en orbite
1
À l'époque, la plupart des compilateurs C ++ n'implémentaient pas d'espaces de noms. En fait, je ne sais pas s'ils étaient même dans la norme.
Kragen Javier Sitaker
3
@ Kragen: Eh bien, il n'y avait pas de norme.
Courses de légèreté en orbite le
3
Oh. Eh bien, il y avait des livres de Stroustrup, mais je suppose que ce n'est pas tout à fait la même chose, n'est-ce pas?
Kragen Javier Sitaker
23

J'ai fait ce même argument récemment, mais je crois qu'un peu de tolérance peut être autorisée. Si Scott Meyers fait la même erreur, vous êtes en bonne compagnie.

Mark Ransom
la source
@Tomalak & @Mark: En fait, Scott ne le fait pas, -1de moi. Le livre traite en effet de la STL au sens de "les parties de la lib std issues de la bibliothèque de Stepanov". Prenez le temps de parcourir les livres TOC. La seule chose en dehors de la STL d'origine que j'ai pu trouver était std::string, et qui avait été équipée pour être un conteneur STL à part entière.
sbi
@sbi: Vous avez manifestement mal interprété ma position. Je n'utiliserais pas "STL" comme Scott le fait. Veuillez lire ma réponse.
Courses de légèreté en orbite
6
@Tomalak, je n'utiliserais pas "STL" de cette manière non plus, même si j'en ai probablement été coupable par le passé. Je ne pense pas que ça vaille la peine de battre les gens.
Mark Ransom
1
Que je peux respecter. J'obtiens surtout des gens qui refusent de reconnaître l'ambiguïté potentielle. :)
Courses de légèreté en orbite
11
Vous seriez également en compagnie de Bjarne Stroustrup - réf. par exemple. stroustrup.com/DnE2005.pdf : "la STL (la" bibliothèque de modèles standard "; c'est-à-dire les conteneurs et le cadre algorithmique de la bibliothèque standard ISO C ++)"
Sander De Dycker
7

De la FAQ GNU Standard C ++ Library (libstdc ++) :


La STL (Standard Template Library) a été l'inspiration pour de gros morceaux de la bibliothèque standard C ++, mais les termes ne sont pas interchangeables et ne signifient pas la même chose. La bibliothèque standard C ++ comprend de nombreuses choses qui ne proviennent pas de la STL, et certaines d'entre elles ne sont même pas des modèles, comme std::localeetstd::thread .

Libstdc ++ - v3 incorpore beaucoup de code de la SGI STL (la fusion finale était de la version 3.3 ). Le code de libstdc ++ contient de nombreux correctifs et modifications par rapport au code SGI d'origine.

En particulier, string n'est pas de SGI et ne fait pas usage de leur classe "corde" (bien que cela soit inclus comme une extension facultative), ni l'un valarrayni l'autre. Des cours commevector<> de SGI, mais ont été profondément modifiées.

Pour plus d'informations sur l'évolution de libstdc ++, consultez le évolution de API et la compatibilité descendante .

le FAQ pour la STL de SGI est toujours recommandée.


Pour info, depuis mars 2018, même le site Web officiel de la STL www.sgi.com/tech/stl/ a disparu .

vstepaniuk
la source