Download los lenguajes de programación son como un
Document related concepts
Transcript
1. QUE ES UN LENGUAJE DE PROGRAMACIÓN. Un lenguaje de programación es un lenguaje inventado para controlar una máquina, (normalmente, un ordenador). Hay muchísimos, de toda clase de tipos y características, inventados para facilitar el abordaje de distintos problemas, el mantenimiento del software, su reutilización, mejorar la productividad, etc. los lenguajes de programación son como un lenguaje cualquiera, pero simplificado y con ciertas normas, para poder transmitir nuestros deseos a la computadora. Para que un conjunto de circuitos desempeñen una tarea determinada y nos dé el resultado que nosotros esperamos, nuestro lenguaje deberá ser traducido en lenguaje binario cuyo alfabeto es el 0 y el 1, mediante las herramientas desarrolladas para llevar para llevar a cabo esta tarea, las cuales reciben el nombre de traductores. 2. CLASIFICACION DE LOS LENGUAJES DE PROGRAMACION Los lenguajes de programación se pueden clasificar según varios criterios. Se han encontrado doce en total: 1. Nivel de abstracción. 2. Propósito. 3. Evolución histórica. 4. Manera de ejecutarse. 5. Manera de abordar la tarea a realizar 6. Paradigma de programación. 7. Lugar de ejecución. 8. Concurrencia. 9. Interactividad. 10. Realización visual. 11. Determinismo y productividad. Hay que tener en cuenta también, que en la práctica, la mayoría de lenguajes no pueden ser puramente clasificados en una categoría, pues surgen incorporando ideas de otros lenguajes y de otras filosofías de programación, pero no importa al establecer las clasificaciones, pues el auténtico objetivo de las mismas es mostrar los rangos, las posibilidades y tipos de lenguajes que hay. 1. Nivel de abstracción. Según el nivel de abstracción, o sea, según el grado de cercanía a la máquina: LENGUAJES DE MAQUINA BAJO NIVEL NIVEL MEDIO ALTO NIVEL LENGUAJE MAQUINA: Es el único que entiende directamente la computadora, utiliza el alfabeto binario que consta de los dos únicos símbolos 0 y 1, denominados bits (abreviatura inglesa de dígitos binarios). Fue el primer lenguaje utilizado en la programación de computadoras, pero dejó de utilizarse por su dificultad y complicación, siendo sustituido por otros lenguajes más fáciles de aprender y utilizar, que además reducen la posibilidad de cometer errores. EJEMPLO 0000 1000 0011 0111 1110 0001 1001 1010 0100 1001 1010 1001 1001 0111 0010 0001 1010 1100 0000 0000 01 A1 89 9A 3A 9C 74 70 E9 20 LENGUAJES DE BAJO NIVEL: Los lenguajes de bajo nivel son mas fáciles de utilizar que los lenguajes máquina, pero, al igual que ellos, dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador. Las instrucciones en lenguaje ensamblador son instrucciones conocidas como nemotécnicos. Por ejemplo, nemotécnicos típicos de operaciones aritméticas son: en inglés, ADD, SUB, DIV, etc.; en español, SUM,RES,DIV,etc. Una instrucción típica de suma sería: ADD M, N, P Esta instrucción podría significar “sumar el número contenido en la posición de memoria M al número almacenado en la posición de memoria N y situar el resultado en la posición de memoria P”. Evidentemente es mucho más sencillo recordar la instrucción anterior con un nemotécnico que su equivalente en código máquina”. 0110 1001 1010 1011 Un programa escrito en lenguaje ensamblador no puede ser ejecutado directamente por la computadora en esto se diferencia esencialmente del lenguaje máquina, sino que requiere una fase de traducción al lenguaje máquina. El programa original escrito en lenguaje ensamblador se denomina programa fuente y el programa traducido en lenguaje máquina se conoce como programa objeto, ya directamente entendible por la computadora. El traductor de programas fuente a objeto es un programa llamado ensamblador, existente en casi todos los computadores. Programa fuente en Programa Ensamblador Programa objeto ensamblador (assembly) (assembler) código máquina. en No se debe confundir el programa ensamblador, encargado de efectuar la traducción del programa fuente escrito a lenguaje máquina, con el lenguaje ensamblador, lenguaje de programación con una estructura y gramática definidas. Ventajas del lenguaje ensamblador. Los lenguajes ensambladores presentan la ventaja frente a los lenguajes máquina de su mayor facilidad de codificación y, en general, su velocidad de cálculo. Desventajas del lenguaje ensamblador. Los inconvenientes más notables de los lenguajes ensambladores son: Dependencia total de la máquina lo que impide la transportabilidad de los programas. El lenguaje ensamblador del PC es distinto del lenguaje ensamblador del Apple Macintosh. La formación de los programadores es más compleja que la correspondiente a los programadores de alto nivel, ya que no sólo las técnicas de programación, sino también el conocimiento del interior de la máquina. Hoy día los lenguajes ensambladores tienen sus aplicaciones mas reducidas en la programación de aplicaciones y se centran en aplicaciones de tiempo real, control de procesos y de dispositivos electrónicos, etc. LENGUAJES DE NIVEL MEDIO: Un lenguaje de programación de medio nivel se los lenguajes de alto nivel y los lenguajes de bajo nivel. encuentra entre Suelen ser clasificados de alto nivel, pero permiten ciertos manejos de bajo nivel. Son precisos para ciertas aplicaciones como la creación de sistemas operativos, ya que permiten un manejo abstracto (independiente de la máquina, a diferencia del lenguaje ensamblador), pero sin perder mucho del poder y eficiencia que tienen los lenguajes de bajo nivel. Una característica distintiva, por ejemplo, que convierte al lenguaje de programación C en un lenguaje de medio nivel y al lenguaje de programación Pascal en un lenguaje de alto nivel, es que en el primero es posible manejar las letras como si fueran números (en Pascal no), por el contrario, en Pascal es posible concatenar las cadenas de caracteres con el operador suma y copiarlas con la asignación (en C es el usuario el responsable de llamar a las funciones correspondientes). Una de las características más peculiares del lenguaje de programación C es el uso de apuntadores, los cuales son muy útiles en la implementación de algoritmos como listas enlazadas, tablas hash y algoritmos de búsqueda y ordenamiento que para otros lenguajes de programación (como en el lenguaje de programación Java, por ejemplo) suelen ser un poco más complicados de implementar. Lenguajes de alto nivel: Un lenguaje de alto nivel permite al programador escribir las instrucciones de un programa utilizando palabras o expresiones sintácticas muy similares al inglés. Por ejemplo, en C se pueden usar palabras tales como: case, if, for, while, etc. para construir con ellas instrucciones como: if( numero > 0 ) printf( "El número es positivo" ) que traducido al castellano viene a decir que: si numero es mayor que cero, entonces, escribir por pantalla el mensaje: "El número es positivo". Ésta es la razón por la que a estos lenguajes se les considera de alto nivel, porque se pueden utilizar palabras de muy fácil comprensión para el programador. En contraposición, los lenguajes de bajo nivel son aquellos que están más cerca del "entendimiento" de la máquina. Otros lenguajes de alto nivel son: Ada, BASIC, COBOL, FORTRAN, Pascal, etc. Otra carácterística importante de los lenguajes de alto nivel es que, para la mayoría de las instrucciones de estos lenguajes, se necesitarían varias instrucciones en un lenguaje ensamblador para indicar lo mismo. De igual forma que, la mayoría de las instrucciones de un lenguaje ensamblador, también agrupa a varias instrucciones de un lenguaje máquina. 2 .Propósito. Según el propósito, es decir, el tipo de problemas a tratar con ellos: Lenguajes de propósito general: Aptos para todo tipo de tareas: Ejemplo: C. Lenguajes de propósito específico: Hechos para un objetivo muy concreto. Ejemplo: Csound (para crear ficheros de audio). Lenguajes de programación de sistemas: Diseñados para realizar sistemas operativos o drivers. Ejemplo: C. Lenguajes de script: Para realizar tareas varias de control y auxiliares. Antiguamente eran los llamados lenguajes de procesamiento por lotes (batch) o JCL (“Job Control Languages”). Se subdividen en varias clases (de shell, de GUI, de programación web, etc.). Ejemplos: bash (shell), mIRC script, JavaScript (programación web). 3 Evolución histórica. Con el paso del tiempo, se va incrementando el nivel de abstracción, pero en la práctica, los de una generación no terminan de sustituir a los de la anterior: Lenguajes de primera generación (1GL): Código máquina. Lenguajes de segunda generación (2GL): Lenguajes ensamblador. Lenguajes de tercera generación (3GL): La mayoría de los lenguajes modernos, diseñados para facilitar la programación a los humanos. Ejemplos: C, Java. Lenguajes de cuarta generación (4GL): Diseñados con un propósito concreto, o sea, para abordar un tipo concreto de problemas. Ejemplos:NATURAL, Mathematica. Lenguajes de quinta generación (5GL): La intención es que el programador establezca el qué problema ha de ser resuelto y las condiciones a reunir, y la máquina lo resuelve. Se usan en inteligencia artificial. Ejemplo: Prolog. 4. Manera de ejecutarse. Según la manera de ejecutarse: Lenguajes compilados: Un programa traductor traduce el código del programa (código fuente) en código máquina (código objeto). Otro programa, el enlazador, unirá los ficheros de código objeto del programa principal con los de las librerías para producir el programa ejecutable. Ejemplo: C. Lenguajes interpretados: Un programa (intérprete), ejecuta las instrucciones del programa de manera directa. Ejemplo: Lisp. También los hay mixtos, como Java, que primero pasan por una fase de compilación en la que el código fuente se transforma en “bytecode”, y este “bytecode” puede ser ejecutado luego (interpretado) en ordenadores con distintas arquitecturas (procesadores) que tengan todos instalados la misma“máquina virtual” Java. 5. Manera de abordar la tarea a realizar. Según la manera de abordar la tarea a realizar, pueden ser: Lenguajes imperativos: Indican cómo hay que hacer la tarea, es decir, expresan los pasos a realizar. Ejemplo: C. Lenguajes declarativos: Indican qué hay que hacer. Ejemplos: Lisp, Prolog. Otros ejemplos de lenguajes declarativos, pero que no son lenguajes de programación, son HTML (para describir páginas web) oSQL (para consultar bases de datos). 6. Paradigma de programación. El paradigma de programación es el estilo de programación empleado. Algunos lenguajes soportan varios paradigmas, y otros sólo uno. Se puede decir que históricamente han ido apareciendo para facilitar la tarea de programar según el tipo de problema a abordar, o para facilitar el mantenimiento del software, o por otra cuestión similar, por lo que todos corresponden a lenguajes de alto nivel (o nivel medio), estando los lenguajes ensambladores “atados” a la arquitectura de su procesador correspondiente. Los principales son: Lenguajes de programación procedural: Divide el problema en partes más pequeñas, que serán realizadas por subprogramas (subrutinas, funciones, procedimientos), que se llaman unas a otras para ser ejecutadas. Ejemplos: C, Pascal. Lenguajes de programación orientada a objetos: Crean un sistema de clases y objetos siguiendo el ejemplo del mundo real, en el que unos objetos realizan acciones y se comunican con otros objetos. Ejemplos:C++, Java. Lenguajes de programación funcional: La tarea se realiza evaluando funciones, (como en Matemáticas), de manera recursiva. Ejemplo: Lisp. Lenguajes de programación lógica: La tarea a realizar se expresa empleando lógica formal matemática. Expresa qué computar. Ejemplo: Prolog. Hay muchos paradigmas de programación: Programación programación reflexiva, programación orientada a procesos, etc. genérica, 7. Lugar de ejecución. En sistemas distribuidos, según dónde se ejecute: Lenguajes de servidor: Se ejecutan en el servidor. Ejemplo: PHP es el más utilizado en servidores web. Lenguajes de cliente: Se ejecutan en el cliente. Ejemplo: JavaScript en navegadores web. 8. Concurrencia. Según admitan o no concurrencia de procesos, esto es, la ejecución simultánea de varios procesos lanzados por el programa: Lenguajes concurrentes. Ejemplo: Ada. Lenguajes no concurrentes. Ejemplo: C 9. Interactividad. Según la interactividad del programa con el usuario u otros programas: Lenguajes orientados a sucesos: El flujo del programa es controlado por la interacción con el usuario o por mensajes de otros programas/sistema operativo, como editores de texto, interfaces gráficos de usuario (GUI) o kernels. Ejemplo: VisualBasic, lenguajes de programación declarativos. Lenguajes no orientados a sucesos: El flujo del programa no depende de sucesos exteriores, sino que se conoce de antemano, siendo los procesos batch el ejemplo más claro (actualizaciones de bases de datos, colas de impresión de documentos, etc.). Ejemplos: Lenguajes de programación imperativos. 10. Realización visual. Según la realización visual o no del programa: Lenguajes de programación visual: El programa se realiza moviendo bloques de construcción de programas (objetos visuales) en un interfaz adecuado para ello. No confundir con entornos de programación visual, como Microsoft Visual Studio y sus lenguajes de programación textuales (como Visual C#). Ejemplo: Mindscript. Lenguajes de programación textual: El código del programa se realiza escribiéndolo. Ejemplos: C, Java, Lisp. 11. Determinismo. Según se pueda predecir o no el siguiente estado del programa a partir del estado actual: Lenguajes deterministas. Ejemplos: Todos los anteriores. Lenguajes probabilísticos o no deterministas: Sirven para explorar grandes espacios de búsqueda, (como gramáticas), y en la investigación teórica de hipercomputación. Ejemplo: mutt (generador de texto aleatorio). 12. Productividad. Según se caractericen por tener virtudes útiles o productivas, u oscuras y enrevesadas: Lenguajes útiles o productivos: Sus virtudes en cuanto a eficiencia, sencillez, claridad, productividad, etc., motiva que sean utilizados en empresas, administraciones públicas y/o en la enseñanza. Ejemplos: Cualquier lenguaje de uso habitual (C, Java, C++, Lisp, Python, Ruby,). Lenguajes esotéricos o exóticos: Inventados con la intención de ser los más raros, oscuros, difíciles, simples y/o retorcidos de los lenguajes, para diversión y entretenimiento de frikis programadores. A veces exploran nuevas ideas en programación. Ejemplo: Brainfuck. 3. QUE ES EL LENGUAJE C + + C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido. Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que ya estaban admitidos (programación estructurada y la programación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programación multiparadigma. Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT. Una particularidad del C++ es la posibilidad de redefinir los operadores, y de poder crear nuevos tipos que se comporten como tipos fundamentales. El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C. 4. CARACTERÍSTICAS DEL LENGUAJE C++ Las principales características del Lenguaje C son: Tiene un conjunto completo de instrucciones de control Permite la agrupación de instrucciones. Incluye el concepto de puntero (variable que contiene la dirección de otra variable). Los argumentos de las funciones se transfieren por su valor. E/S no forma parte del lenguaje, sino que se proporciona a través de una biblioteca de funciones. Permite la separación de un programa en módulos que admiten compilación independiente. Originalmente el Lenguaje C estuvo muy ligado al sistema operativo UNIX como se había mencionado antes que, en su mayor parte, está escrito en C. Más adelante se comenzó a utilizar en otros sistemas operativos para programar editores, compiladores, etc. Aunque se le conoce como un lenguaje de programación de sistemas, no se adapta mal al resto de aplicaciones. De hecho, hoy en día un alto porcentaje de software para ordenadores personales está escrito en Lenguaje C. Por ejemplo, el sistema operativo MSDOS. Algunas de las características más importantes que definen el lenguaje y que han permitido que sea tan popular, como lenguaje de programación son: Tamaño pequeño. Uso extensivo de llamadas a funciones. Comandos breves (poco tecleo). Lenguaje estructurado. Programación de bajo nivel (nivel bit) Implementación de apuntadores uso extensivo de apuntadores para la memoria, arreglos, estructuras y funciones Las diversas razones por la cual se ha convertido en un lenguaje de uso profesional son: El uso de constructores de alto nivel El poder manejar actividades de bajo-nivel. El generar programas eficientes. La posibilidad de poder ser compilado en una variedad de computadoras, con pocos cambios (portabilidad). Un punto en contra es que tiene una detección pobre de errores, lo cual en ocasiones es problemático para los principiantes 5. TIPOS DE DATOS C++ tiene los siguientes tipos fundamentales: Caracteres: char (también es un entero), wchar_t Enteros: short, int, long, long long Números en coma flotante: float, double, long double Booleanos: bool Vacío: void El modificador unsigned se puede aplicar a enteros para obtener números sin signo (por omisión los enteros contienen signo), con lo que se consigue un rango mayor de números naturales. Tamaños asociados Tamaños de tipos primitivos bajo i386 (GCC) Tipo Número de Bits char 8 short 16 int 32 float 32 double 64 Según la máquina y el compilador que se utilice los tipos primitivos pueden ocupar un determinado tamaño en memoria. La siguiente lista ilustra el número de bits que ocupan los distintos tipos primitivos en la arquitectura x86. Otras arquitecturas pueden requerir distintos tamaños de tipos de datos primitivos. C++ no dice nada acerca de cuál es el número de bits en un byte, ni del tamaño de estos tipos; más bien, ofrece solamente las siguientes "garantías de tipos": Un tipo char tiene el tamaño mínimo en bytes asignable por la máquina, y todos los bits de este espacio deben ser "accesibles". El tamaño reconocido de char es de 1. Es decir, sizeof(char) siempre devuelve 1. Un tipo short tiene al menos el mismo tamaño que un tipo char. Un tipo long tiene al menos el doble tamaño en bytes que un tipo short. Un tipo int tiene un tamaño entre el de short y el de long, ambos inclusive, preferentemente el tamaño de un apuntador de memoria de la máquina. Un tipo unsigned tiene el mismo tamaño que su versión signed. Wchar_t Para la versión del estándar que se publicó en 1998, se decidió añadir el tipo de dato wchar_t, que permite el uso de caracteres UNICODE, a diferencia del tradicional char, que contempla simplemente al código de caracteres ASCII extendido. A su vez, se ha definido para la mayoría de las funciones y clases, tanto de C como de C++, una versión para trabajar con wchar_t, donde usualmente se prefija el carácter w al nombre de la función (en ocasiones el carácter es un infijo). Por ejemplo: strcpy - wstrcpy std::string - std::wstring std::cout - std::wcout Cabe resaltar que en C se define wchar_t como: typedef unsigned short wchar_t; Mientras que en C++ es en sí mismo un tipo de dato. La palabra reservada "void" La palabra reservada void define en C++ el concepto de no existencia o no atribución de un tipo en una variable o declaración. Como tal, puede ser usada para destacar que una función no recibe parámetros, como en: int funcion (void); Aunque la tendencia actual es la de no colocar la palabra "void". Además se utiliza para determinar que una función no retorna un valor, como en: void funcion (int parametro); Cabe destacar que void no es un tipo. Una función como la declarada anteriormente no puede retornar un valor por medio de return: la palabra clave va sola. No es posible una declaración del tipo: void t; //Está mal En este sentido, void se comporta de forma ligeramente diferente a como lo hace en C, especialmente en cuanto a su significado en declaraciones y prototipos de funciones. Sin embargo, la forma especial void * indica que el tipo de datos es un puntero. Por ejemplo: void *memoria; Indica que memoria es un puntero a alguna parte, donde se guarda información de algún tipo. El programador es responsable de definir estos "algún", eliminando toda ambigüedad. Una ventaja de la declaración "void *" es que puede representar a la vez varios tipos de datos, dependiendo de la operación de cast escogida. La memoria que hemos apuntado en alguna parte, en el ejemplo anterior, bien podría almacenar un entero, un flotante, una cadena de texto o un programa, o combinaciones de éstos. Es responsabilidad del programador recordar qué tipo de datos hay y garantizar el acceso adecuado. 6. ESTRUCTURA DE UN PROGRAMA EN C + +. Mediante el siguiente ejemplo de explicara la estructura base de cualquier programa en C++. /* Esta cabecera permite usar los objetos que encapsulan los descriptores stdout y stdin: cout(<<) y cin(>>)*/ #include <iostream> using namespace std; int main() { cout << " Hola Mundo " << endl; return 0; } Explicación: Cuando se escriben programas es muy útil agregar comentarios que ayuden a explicar lo que realiza un programa, en C++ se escribe de la siguiente manera /* Este es un comentario al estilo C */ Al usar la directiva #include estamos diciéndole al compilador que busque e interprete todos los elementos definidos en el archivo que acompaña la directiva (en este caso, iostream). Para evitar sobrescribir los elementos ya definidos al ponerles igual nombre, se crearon los espacios de nombres o namespace del singular en inglés. En este caso hay un espacio de nombres llamado std, que es donde se incluyen las definiciones de todas las funciones y clases que conforman la biblioteca estándar de C++. Al incluir la sentencia using namespace std le estamos diciendo al compilador que usaremos el espacio de nombres std por lo que no tendremos que incluirlo cuando usemos elementos de este espacio de nombres, como pueden ser los objetos cout y cin, que representan el flujo de salida estándar (típicamente la pantalla o una ventana de texto) y el flujo de entrada estándar (típicamente el teclado). La definición de funciones es igual que en C, salvo por la característica de que si main no va a recoger argumentos, no tenemos por qué ponérselos, a diferencia de C, donde había que ponerlos explícitamente, aunque no se fueran a usar. Queda solo comentar que el símbolo << se conoce como operador de inserción, y grosso modo está enviando a cout lo que queremos mostrar por pantalla para que lo pinte, en este caso la cadena "Hola mundo". El mismo operador << se puede usar varias veces en la misma sentencia, de forma que gracias a esta característica podremos concatenar el objeto endl al final, cuyo resultado será imprimir un retorno de línea. Despues de colocar main ( ) es decir nuestro indicador que comienza el programa, ya podemos comenzar con la programacion, ya que la programacion va en el cuerpo del programa, se debe indicar cual es el cuerpo, osea los limites. En un programa los limites son marcados por el simbolo “las llaves “, es decir { } { .... ....... } Por último tenemos las sentencias, es decir nuestra programación, lo que vayamos realizando en el cuerpo del programa, lo que va a hacer el programa al compilarlo y ejecutarlo. Todo eso va a ir en el cuerpo es decir DENTRO de los limites que establecimos ( las llaves principales del programa Variables y constantes DECLARACIÓN DE VARIABLES Y CONSTANTES Una variable, como su nombre lo indica, es un determinado objeto cuyo valor puede cambiar durante el proceso de una tarea específica. Contrario a una variable, una constante es un determinado objeto cuyo valor no puede ser alterado durante el proceso de una tarea específica. En C, C++ para declarar variables no existe una palabra especial, es decir, las variables se declarán escribiendo el tipo seguido de uno o más identificadores o nombres de variables. Por otro lado, para declarar constantes existe la palabra reservada const, así como la directiva #define. A continuación se muestran ejemplos de declaración de variables y constantes. Variables Constantes Constantes int a; const int a = 100; #define a 100 float b; const float b = 100; #define b 100 Nota: A diferencia de las constantes declaradas con la palabra const los símbolos definidos con #define no ocupan espacio en la memoria del código ejecutable resultante. El tipo de la variable o constante puede ser cualquiera de los listados en Tipos primitivos, o bien de un tipo definido por el usuario. Las constantes son usadas a menudo con un doble propósito, el primero es con el fin de hacer más legible el código del programa, es decir, si se tiene (por ejemplo) la constante numerica 3.1416 y esta representa al número pi, entonces podemos hacer declaraciones tales como: #define pi 3.1416 En este caso podremos usar la palabra pi en cualquier parte del programa y el compilador se encargará de cambiar dicho simbolo por 3.1416. o bien, const pi = 3.1416; En este otro caso podremos usar la palabra pi en cualquier parte del programa y el compilador se encargará de cambiar dicho símbolo por una referencia a la constante pi guardada en la memoria. 7. QUE ES UNA LIBRERÍA,CUALES ON LAS MASCOMUNES C++ no llega al nivel de simplicidad de su antecesor C, pero al igual que aquél, tampoco dispone de utilidades o funciones para entrada o salida implementadas en el propio lenguaje, de modo que estas y otras muchas, como manejo de cadenas de caracteres (strings), manejo de ficheros, funciones matemáticas Etc. son implementadas en forma de librerías externas. Una librería es un conjunto de recursos (algoritmos) prefabricados, que pueden ser utilizados por el programador para realizar determinadas operaciones. Las declaraciones de las funciones utilizadas en estas librerías, junto con algunas macros y constantes predefinidas que facilitan su utilización, se agrupan en ficheros de nombres conocidos que suelen encontrarse en sitios predefinidos. Por ejemplo, en los sistemas UNIX, en /usr/include. Estos ficheros se suelen llamar "de cabecera", porque es tradición utilizar las primeras líneas del programa para poner las directivas#include que los incluirá en el fuente durante la fase de preprocesado . Clases de librerías Los compiladores C++ incluyen un amplio repertorio de clases, funciones y macros que permiten realizar una amplia variedad de tareas, incluyendo entradas/salidas de bajo y alto nivel; manipulación de cadenas alfanuméricas y ficheros; control de procesos (incluyendo multiproceso); manejo de memoria; cálculos matemáticos y un largo etcétera. Este repertorio de recursos es denominado colectivamente como "Rutinas de librería"; "Librerías de ejecución" RTL ("Runtime Librarys") o simplemente "Librerías". Puede decirse que el lenguaje aislado (tal cual) no tiene prácticamente ninguna utilidad sin la concurrencia de estas utilidades. El Estándar C++ las clasifica según su utilidad: Soporte del lenguaje Diagnóstico Utilidades generales Cadenas alfanuméricas ("Strings") Localización Contenedores Iteradores Algoritmos Cálculo numérico Entrada/Salida Librería Estándar C++ Para poner un poco de orden, el Estándar C++ define la denominada Librería Estándar que debe acompañar a cada implementación del compilador que se adhiera al estándar. Es decir: la norma determina cuales son, como se llaman y como se utiliza este conjunto de algoritmos que deben acompañar (como mínimo) a cada implementación del compilador que quiera llamarse "Estándar". La última versión, ISO/IEC 14882 del año 1998, especifica que se compone de 32 ficheros de cabecera de nombres fijos y conocidos agrupados según la funcionalidad de los algoritmos. Son los siguientes: Ficheros <algorithm> <bitset> Funcionalidad/funciones Parte de la STL que describe los algoritmos. Parte de la STL relativa a contenedores tipo bitset . Set de valores booleanos. <complex> Parte de la librería numérica de la STL relativa a los complejos. <deque> Parte de la STL relativa a contenedores tipo deque; un tipo de colas: "Double-ended-queue". <exception> Parte de la librería de diagnóstico relativa al manejo de excepciones. <fstream> Flujos hacia/desde ficheros. <functional> Parte de la STL relativa a Objetos-función. <iomanip> Manipuladores. <ios> Supreclases para manejo de flujos de E/S. <iosfwd> Contiene declaraciones adelantadas de todas las plantillas de flujos y sus typedefs estándar. Por ejemplo ostream. <iostream> Parte del a STL que contiene los algoritmos estándar de E/S. <istream> Algoritmos estándar de flujos de entrada. <iterator> Parte de la STL relacionada con iteradores , un tipo de puntero que permite utilizar los algoritmos de la Librería con las estructuras de datos representadas por los contenedores. <limits> Descripción de propiedades dependientes de la implementación que afectan a los tipos fundamentales. <list> Parte de la STL relativa a contenedores tipo list ; listas doblemente enlazadas <locale> Parte de la STL relativa a la internacionalización. <map> Parte de la STL relativa a contenedores tipo map. <memory> Utilidades relativas a la gestión de memoria, incluyendo asignadores y punteros inteligentes. <new> Manejo de memoria dinámica <numeric> Parte de la librería numérica de la STL relativa a operaciones numéricas. <ostream> Algoritmos estándar para los flujos de salida. <queue> Parte de la STL relativa a contenedores tipo queue ; colas de objetos . <set> Parte de la STL relativa a contenedores tipo set. <sstream> Flujos hacia/desde cadenas alfanuméricas. <stack> Parte de la STL relativa a contenedores tipo stack ; pilas de objetos . <stdexcept> Parte de la STL relativa a las clases de las que derivan los objetos lanzados por las excepciones ocasionadas en los algoritmos de la propia STL y otras expresiones. Estas clases son utilizadas para reportar errores detectados durante runtime. Los usuarios también pueden utilizar excepciones para reportar errores en sus propios programas. <streambuf> Parte de la STL relativa al Almacenamiento de flujos de E/S ("Stream buffers"). Define los tipos que controlan la capa de transporte. <string> Parte de la STL relativa a contenedores tipo string ; una generalización de las cadenas alfanuméricas para albergar cadenas de objetos. <typeinfo> Mecanismo de identificación de tipos en tiempo de ejecución. <utility> Parte de la STL que contiene elementos auxiliares como operadores y pares (pairs). <valarray> Parte de la librería numérica de la STL relativa a manejo de matrices numéricas () <vector> Parte de la STL relativa a los contenedores tipo vector; una generalización de las matrices unidimensionales C/C++. Es digno de mención que aunque generalmente las librerías no aportan ninguna característica al lenguaje (se supone que son utilidades auxiliares que no forman parte del lenguaje propiamente dicho), una pequeña porción de la Librería Estándar C++ sí aporta características que se consideran pertenecientes a este, de forma que deben estar presentes los ficheros de cabecera correspondientes si se desea usarlas. En concreto se refieren a los siguientes elementos: Operadores new, new[], delete y delete. Clase type_info que corresponde al mecanismo RTTI de identificación de tipos en tiempo de ejecución representado por el operador typeid. Rutinas de inicio y terminación. Las excepciones estándar lanzadas por los algoritmos anteriores.