¿Cuál es la diferencia entre "STL" y "Biblioteca estándar C++"?
Alguien me llamó la atención sobre este artículo que afirma (estoy parafraseando) que el término STL se usa incorrectamente para referirse a toda la biblioteca estándar de C++ en lugar de las partes que se tomaron de SGI STL.
(...) se refiere al "STL", a pesar de que muy poca gente todavía usa el STL (que fue diseñado en SGI).
Partes de la biblioteca estándar de C++ se basaron en partes del STL, y son estas partes a las que muchas personas (incluidos varios autores y cplusplus.com, notoriamente lleno de errores) todavía se refieren como "el STL". Sin embargo, esto es inexacto; de hecho, el estándar C++ nunca menciona "STL" y existen diferencias de contenido entre los dos.
(...) "STL" rara vez se utiliza para referirse a los bits de stdlib que se basan en SGI STL. La gente piensa que es toda la biblioteca estándar. Se incluye en los CV. Y es engañoso.
Apenas sé nada sobre la historia de C++, por lo que no puedo juzgar la exactitud del artículo. ¿Debo abstenerme de utilizar el término STL? ¿O es una opinión aislada?
El "STL" fue escrito por Alexander Stepanov mucho antes de que se estandarizara C++. C++ existió durante los años 80, pero lo que ahora llamamos " C++ " es el lenguaje estandarizado en ISO/IEC 14882:2014 (y versiones anteriores, como ISO/IEC 14882:2011).
STL ya se utilizaba ampliamente como biblioteca para C++, dando a los programadores acceso a contenedores, iteradores y algoritmos. Cuando se produjo la estandarización, el comité de lenguaje diseñó partes de la Biblioteca estándar de C++ (que es parte del estándar del lenguaje) para que se acerquen mucho al STL.
A lo largo de los años, muchas personas, incluidos destacados autores de libros y varios sitios web, han seguido refiriéndose a la Biblioteca estándar de C++ como "la STL", a pesar de que las dos entidades están separadas y existen algunas diferencias. Estas diferencias son aún más pronunciadas en el próximo nuevo estándar C++, que incluye varias características y altera significativamente algunas clases.
El STL original ahora a menudo se denomina "una implementación de la Biblioteca de plantillas estándar de C++" (¡más bien hacia atrás en la historia real!), de la misma manera que Microsoft Visual Studio o GCC incluye una implementación de la Biblioteca estándar de C++. Pero la "Biblioteca de plantillas estándar" y la "Biblioteca estándar" no son lo mismo.
La batalla es sobre si la Biblioteca Estándar actual debería llamarse "STL" en su totalidad o en parte, y/o si importa cómo se llame.
Para "STL"
Hay una escuela de pensamiento que dice que ahora todo el mundo sabe que "STL" significa la biblioteca estándar, del mismo modo que ahora todo el mundo sabe que "C++" es el lenguaje estandarizado ISO.
También incluye a aquellos que creen que en realidad no importa mientras todas las partes entiendan de qué se habla.
Es un término que se vuelve aún más frecuente debido a la naturaleza de la bestia, gran parte de la cual hace un uso intensivo de la característica de C++ conocida como "plantillas".
Para "Biblioteca estándar de C++" (o stdlib)
Sin embargo, hay otra escuela de pensamiento (a la que me suscribo) que dice que esto es confuso. Las personas que aprenden C++ por primera vez no conocen esta distinción y es posible que no noten pequeñas diferencias de lenguaje.
El autor de ese artículo se ha encontrado en numerosas ocasiones con personas que creen que toda la biblioteca estándar de C++ es STL, incluidas características que nunca formaron parte del propio STL. La mayoría de los defensores vocales del "STL", por el contrario, saben exactamente lo que quieren decir con él y se niegan a creer que no todos "lo entienden". Es evidente que el uso del término no es uniforme.
Además, existen algunas bibliotecas tipo STL que en realidad son implementaciones del STL original, no de la biblioteca estándar de C++. Hasta hace poco, STLPort era uno de ellos (e incluso allí, ¡ abunda la confusión !).
Además, el estándar C++ no contiene el texto "STL" en ninguna parte, y algunas personas emplean habitualmente frases como "el STL está incluido en la biblioteca estándar de C++", lo cual es completamente incorrecto.
Creo que seguir propagando el uso del término de esta manera sólo conducirá a que el malentendido dure para siempre. Desgraciadamente, puede resultar totalmente contraproducente intentar cambiar las cosas, incluso si se supone que es para mejor. Es posible que nos quedemos atrapados para siempre en dobles sentidos.
Conclusión
Aprecio que esta publicación haya sido un poco sesgada: escribí el artículo al que vinculaste. :) De todos modos, espero que esto ayude a explicar un poco mejor la batalla.
Actualización 13/04/2011
Aquí hay tres ejemplos perfectos de alguien que usa "STL" para referirse a toda la biblioteca estándar de C++. Me sigue desconcertando que tanta gente jure a ciegas que nadie hace esto, cuando es evidente casi a diario.
No hay una respuesta que sea realmente correcta. Alexander Stepanov desarrolló una biblioteca que llamó STL (trabajando para HP en ese momento). Luego se propuso incluir esa biblioteca en el estándar C++.
Ese desarrollo básicamente "bifurcado". El comité incluyó algunas partes, rechazó otras por completo y rediseñó algunas (con la participación de Alexander). El desarrollo de la biblioteca original se trasladó posteriormente a Silicon Graphics, pero continuó por separado de la biblioteca estándar de C++.
Después de que esas piezas se agregaron a la biblioteca estándar, algunas otras partes de la biblioteca estándar se modificaron para que encajaran mejor con lo que se agregó (por ejemplo, begin
, end
y rbegin
se rend
agregaron std::string
para que pudiera usarse como un contenedor). Casi al mismo tiempo, la mayor parte de la biblioteca (incluso piezas que no tenían ninguna relación) se convirtieron en plantillas para acomodar diferentes tipos (por ejemplo, flujos estándar).
Algunas personas también utilizan STL como una forma abreviada de "Biblioteca Estándar".
Eso significa que cuando alguien usa el término "STL", podría estar refiriéndose a media docena de cosas diferentes. Para bien o para mal, la mayoría de las personas que lo usan parecen ignorar la multiplicidad de significados y suponen que todos los demás reconocerán a qué se refieren. Esto lleva a muchos malentendidos y al menos a algunas guerras graves que hicieron que la mayoría de los participantes parecieran tontos porque simplemente hablaban de cosas completamente diferentes.
Desafortunadamente, es probable que la confusión continúe sin cesar. Es mucho más conveniente hacer referencia a "STL" que a algo como "los contenedores, iteradores y algoritmos de la biblioteca estándar de C++, pero sin incluirlos std::string
, aunque puede actuar como un contenedor". Aunque la "biblioteca estándar de C++" no es tan larga y torpe, "STL" sigue siendo mucho más corta y simple. Hasta que alguien invente términos que sean más precisos (cuando sea necesario) e igual de convenientes, se seguirá utilizando "STL" y seguirá surgiendo confusión.
El término "STL" o "Biblioteca de plantillas estándar" no aparece en ninguna parte del estándar ISO 14882 C++. Por lo tanto, referirse a la biblioteca estándar de C++ como STL es incorrecto. El término "Biblioteca estándar de C++" o "biblioteca estándar" es lo que utiliza oficialmente ISO 14882:
Estándar ISO 14882 C++:
17 - Introducción a la biblioteca [lib.library]:
- Esta cláusula describe el contenido de la biblioteca estándar de C++ , cómo un programa C++ bien formado hace uso de la biblioteca y cómo una implementación conforme puede proporcionar las entidades de la biblioteca.
...
STL es una biblioteca diseñada originalmente por Alexander Stepanov, independiente del estándar C++. Sin embargo, algunos componentes de la biblioteca estándar de C++ incluyen componentes STL como vector
y list
algoritmos como copy
y swap
.
Pero, por supuesto, el estándar C++ incluye muchas más cosas fuera del STL, por lo que el término "biblioteca estándar de C++" es más correcto (y es lo que realmente usan los documentos de estándares).
He expuesto el mismo argumento recientemente, pero creo que se puede permitir un poco de tolerancia. Si Scott Meyers comete el mismo error, estás en buena compañía.
De las preguntas frecuentes de la biblioteca GNU Standard C++ (libstdc++) :
La STL (Biblioteca de plantillas estándar) fue la inspiración para grandes partes de la Biblioteca estándar de C++, pero los términos no son intercambiables y no significan lo mismo. La biblioteca estándar de C++ incluye muchas cosas que no provienen del STL y algunas de ellas ni siquiera son plantillas, como std::locale
y std::thread
.
Libstdc++-v3 incorpora una gran cantidad de código de SGI STL (la fusión final fue de la versión 3.3 ). El código en libstdc++ contiene muchas correcciones y cambios en comparación con el código SGI original.
En particular, string
no es de SGI y no hace uso de su clase "cuerda" (aunque está incluida como una extensión opcional), ni lo es valarray
ni algunos otros. Las clases vector<>
eran de la SGI, pero se han modificado ampliamente.
Puede encontrar más información sobre la evolución de libstdc++ en la documentación de evolución de API y compatibilidad con versiones anteriores .
Aún se recomienda leer las preguntas frecuentes sobre STL de SGI.
Para su información, a partir de marzo de 2018, incluso el sitio web oficial de STL www.sgi.com/tech/stl/ desapareció.