Historia del lenguaje C. §1 Información general sobre la lengua. Etapas del diseño del programa. Modelos de ciclo de vida de aplicaciones ¿Quién inventó el lenguaje de programación C?

lenguaje de programación c++

Última actualización: 28/08/2017

El lenguaje de programación C++ es un lenguaje de programación de tipo estático, compilado, de alto nivel y de propósito general que es adecuado para crear una amplia variedad de aplicaciones. Hoy en día, C++ es uno de los lenguajes más populares y extendidos.

Tiene sus raíces en el lenguaje C, que fue desarrollado entre 1969 y 1973 en los Laboratorios Bell por el programador Dennis Ritchie. A principios de la década de 1980, el programador danés Bjarne Stroustrup, que entonces trabajaba en Bell Labs, desarrolló C++ como una extensión del lenguaje C. De hecho, al principio, C++ simplemente complementaba el lenguaje C con algunas capacidades de programación orientada a objetos. Y es por eso que el propio Stroustrup inicialmente lo llamó "C con clases".

Después nuevo idioma comenzó a ganar popularidad. Se le agregaron nuevas características que lo convirtieron no solo en una adición a C, sino en un lenguaje de programación completamente nuevo. Como resultado, "C con clases" pasó a llamarse C++. Y a partir de entonces, ambas lenguas comenzaron a desarrollarse de forma independiente una de otra.

C++ es un lenguaje poderoso que hereda ricas capacidades de memoria de C. Por lo tanto, C++ a menudo se utiliza en la programación de sistemas, en particular, al crear sistemas operativos, controladores, diversas utilidades, antivirus, etc. Por cierto, el sistema operativo Windows está escrito principalmente en C++. Pero sólo la aplicación de programación del sistema. de este idioma no limitado. C++ se puede utilizar en programas de cualquier nivel donde la velocidad y el rendimiento son importantes. A menudo se utiliza para crear aplicaciones graficas, varios programas de aplicación. También se utiliza especialmente para crear juegos con una visualización rica y rica. Además, en Últimamente La dirección móvil está ganando impulso, donde C++ también ha encontrado su aplicación. E incluso en el desarrollo web, también puede utilizar C++ para crear aplicaciones web o algunos servicios de soporte que sirvan para aplicaciones web. En general, C++ es un lenguaje muy utilizado en el que puedes crear casi cualquier tipo de programa.

C++ es un lenguaje compilado, lo que significa que el compilador traduce el código fuente de C++ a Archivo ejecutable, que contiene un conjunto de instrucciones de la máquina. Pero las diferentes plataformas tienen sus propias características, por lo que los programas compilados no pueden simplemente transferirse de una plataforma a otra y ejecutarse allí. Sin embargo, a nivel de código fuente, los programas C++ son en gran medida portátiles a menos que se utilicen algunas funciones específicas del sistema operativo. Y la disponibilidad de compiladores, bibliotecas y herramientas de desarrollo para casi todas las plataformas comunes le permite compilar el mismo código fuente C++ en aplicaciones para estas plataformas.

A diferencia de C, el lenguaje C++ permite escribir aplicaciones en un estilo orientado a objetos, representando un programa como una colección de clases y objetos que interactúan entre sí. Lo que simplifica la creación de grandes aplicaciones.

Principales etapas de desarrollo.

En 1979-80, Bjarne Stroustrup desarrolló una extensión del lenguaje C: "C con clases". En 1983, el lenguaje pasó a llamarse C++.

En 1985 se lanzó la primera versión comercial del lenguaje C++, así como la primera edición del libro "El lenguaje de programación C++", que representó la primera descripción de este lenguaje en ausencia de un estándar oficial.

En 1989, se lanzó una nueva versión del lenguaje C++ 2.0, que incluía una serie de características nuevas. Después de esto, el lenguaje se desarrolló relativamente lentamente hasta 2011. Pero al mismo tiempo, en 1998, la organización ISO (Organización Internacional de Normalización) hizo el primer intento de estandarizar el idioma. El primer estándar se llamó ISO/IEC 14882:1998, o C++98 para abreviar. Posteriormente, en 2003, se publicó una nueva versión del estándar C++03.

En 2011 se publicó el nuevo estándar C++ 11, que contenía muchas adiciones y enriquecía el lenguaje C++ con una gran cantidad de nuevas funciones. Después de esto, en 2014 se lanzó una pequeña adición al estándar, también conocida como C++14. Y está previsto otro lanzamiento clave del lenguaje para 2017.

Compiladores y entornos de desarrollo.

Para desarrollar programas en C++, necesita un compilador: traduce el código fuente en C++ a un archivo ejecutable, que luego puede ejecutar. Pero por el momento existen muchos compiladores diferentes. Pueden diferir en varios aspectos, en particular en la implementación de normas. Puede encontrar una lista básica de compiladores para C++ en Wikipedia. Se recomienda para el desarrollo elegir aquellos compiladores que estén desarrollando e implementando los últimos estándares. Por lo tanto, a lo largo de este tutorial utilizaremos principalmente el compilador g++ disponible gratuitamente desarrollado por el proyecto GNU.

También puede utilizar IDE como Visual Studio, Netbeans, Eclipse, Qt, etc. para crear programas.

¿Cuál es el motivo de este estado del lenguaje C? Históricamente, este lenguaje es inseparable del sistema operativo Unix, que ahora está renaciendo. Los años 60 fueron la era de la formación de sistemas operativos y lenguajes de programación. nivel alto. En aquella época, los sistemas operativos y los compiladores se desarrollaban de forma independiente para cada tipo de ordenador y, a menudo, incluso sus propios lenguajes de programación (recordemos, por ejemplo, PL/I). Al mismo tiempo, los problemas comunes que surgen en este caso ya se han hecho evidentes. La respuesta a la conciencia de estos puntos en común fue un intento de crear un teléfono móvil universal. Sistema operativo, y para ello necesitábamos un lenguaje de programación igualmente universal y móvil. C se convirtió en uno de esos lenguajes y Unix se convirtió en el primer sistema operativo escrito casi en su totalidad en un lenguaje de alto nivel.

La estrecha conexión con Unix le dio al lenguaje C un campo de pruebas que ningún otro lenguaje tenía en ese momento. Los problemas de programación de sistemas se consideraban, con razón, los más difíciles de la industria en ese momento. En su mayor parte, dependían tanto de la máquina que a muchos ni siquiera se les ocurrió resolverlos de otra manera que en ensamblador. Los lenguajes de alto nivel estaban destinados a la programación de aplicaciones e implementaban solo funciones muy limitadas necesarias para el funcionamiento del sistema y, a menudo, solo para cierto tipo carros

Desde el principio se creó el lenguaje C para poder escribir en él tareas del sistema. Los creadores de C no desarrollaron un modelo abstracto del ejecutor del lenguaje, sino que simplemente implementaron en él aquellas capacidades que eran más necesarias en la práctica de la programación de sistemas. Se trataba principalmente de medios de trabajo directo con la memoria, estructuras de control estructurales y organización modular del programa. Y esencialmente no se incluyó nada más en el idioma. Todo lo demás se puso en la biblioteca de tiempo de ejecución. Por lo tanto, los detractores a veces se refieren al lenguaje C como un ensamblador estructural. Pero no importa lo que dijeran, el enfoque resultó ser muy exitoso. Gracias a él, se alcanzó un nuevo nivel en términos de simplicidad y capacidades lingüísticas.

Sin embargo, hay un factor más que determinó el éxito del idioma. Los creadores separaron muy hábilmente las propiedades independientes y dependientes de la máquina. Gracias a esto, la mayoría de los programas se pueden escribir de forma universal: su rendimiento no depende de la arquitectura del procesador ni de la memoria. Algunas partes del código que dependen del hardware se pueden localizar en módulos separados. Y usando el preprocesador, puedes crear módulos que, cuando se compilan en diferentes plataformas generará el código correspondiente dependiente de la máquina.

La sintaxis del lenguaje C ha causado mucha controversia. Las técnicas de acortamiento utilizadas en él, si se usan en exceso, pueden hacer que el programa sea completamente ilegible. Pero, como dijo Dijkstra, los medios no tienen la culpa de que se utilicen de forma analfabeta. De hecho, las abreviaturas de sintaxis propuestas en C corresponden a las situaciones estereotipadas más comunes en la práctica. Si consideramos las abreviaturas como modismos para la presentación expresiva y compacta de tales situaciones, entonces sus beneficios se vuelven incondicionales y obvios.

Entonces, C surgió como un lenguaje de programación de sistemas universal. Pero él no se mantuvo dentro de estos límites. A finales de los años 80, el lenguaje C, que desplazó a Fortran de su posición de liderazgo, ganó gran popularidad entre los programadores de todo el mundo y comenzó a utilizarse en una amplia variedad de tareas aplicadas. Un papel importante lo jugó la difusión de Unix (y por tanto de C) en el entorno universitario, donde se formó una nueva generación de programadores.

Como todos los lenguajes, C se ha mejorado gradualmente, pero la mayoría de las mejoras no han sido radicales. El más significativo de ellos, quizás, debería considerarse la introducción de una especificación estricta de los tipos de funciones, que aumentó significativamente la confiabilidad de la comunicación entre módulos en C. Todas estas mejoras fueron consagradas en 1989 en el estándar ANSI, que aún define el lenguaje C.

Pero si todo es tan color de rosa, ¿por qué se siguen utilizando todos los demás idiomas que sustentan su existencia? El talón de Aquiles del lenguaje C fue que resultó ser de un nivel demasiado bajo para las tareas que se pusieron en la agenda en los años 90. Además, este problema tiene dos aspectos. Por un lado, se incorporaron al lenguaje herramientas de nivel demasiado bajo, principalmente gestión de memoria y aritmética de direcciones. No en vano, cambiar la capacidad de bits de los procesadores tiene un efecto muy doloroso en muchos programas C. Por otro lado, C carece de características de alto nivel: tipos de datos y objetos abstractos, polimorfismo, manejo de excepciones. Como resultado, en los programas C, la técnica de implementación de una tarea a menudo domina su contenido.

Los primeros intentos de corregir estas deficiencias comenzaron a realizarse a principios de los años 80. Ya entonces, Bjarne Stroustrup de AT&T Bell Labs comenzó a desarrollar una extensión del lenguaje C con el nombre en clave. El estilo de desarrollo fue bastante consistente con el espíritu con el que se creó el lenguaje C: se introdujeron ciertas características para hacer más trabajo conveniente personas y grupos específicos. El primer traductor comercial del nuevo lenguaje, llamado C++, apareció en 1983. Fue un preprocesador el que tradujo el programa al código C. Sin embargo, el nacimiento real del lenguaje puede considerarse la publicación del libro de Stroustrup en 1985. Fue a partir de este momento que C++ comenzó a ganar popularidad a nivel mundial.

La principal innovación de C++ es el mecanismo de clases, que permite definir y utilizar nuevos tipos de datos. El programador describe la representación interna de un objeto de clase y un conjunto de métodos de función para acceder a esta representación. Uno de los objetivos más preciados al crear C++ fue el deseo de aumentar el porcentaje de reutilización del código ya escrito. El concepto de clases ofrecía un mecanismo de herencia para ello. La herencia le permite crear nuevas clases (derivadas) con representación extendida y métodos modificados, sin afectar el código compilado de las clases originales (base). Al mismo tiempo, la herencia proporciona uno de los mecanismos para implementar el polimorfismo: el concepto básico de la programación orientada a objetos, según el cual, para realizar el mismo tipo de procesamiento diferentes tipos datos se puede utilizar el mismo código. En realidad, el polimorfismo es también uno de los métodos para garantizar la reutilización del código.

La introducción de clases no agota todas las innovaciones del lenguaje C++. Implementa un mecanismo de manejo de excepciones estructurado y completo, cuya ausencia en C hacía mucho más difícil escribir programas confiables, un mecanismo de plantilla, un sofisticado mecanismo de generación de macros profundamente integrado en el lenguaje, que abre otro camino hacia la reutilización del código. y mucho más.

Por lo tanto, la línea general de desarrollo del lenguaje tenía como objetivo expandir sus capacidades mediante la introducción de nuevas construcciones de alto nivel manteniendo la mayor compatibilidad posible con ANSI C. Por supuesto, la lucha por aumentar el nivel del lenguaje también continuó. el segundo frente: las mismas clases permiten, con un enfoque competente, ocultar las operaciones de bajo nivel, de modo que el programador deja de trabajar directamente con la memoria y las entidades dependientes del sistema. Sin embargo, el lenguaje no contiene mecanismos que obliguen al desarrollador a estructurar el programa correctamente y los autores no han emitido recomendaciones sistemáticas para el uso de sus construcciones bastante sofisticadas. Tampoco se preocuparon de crear oportunamente una biblioteca de clases estándar que implemente las estructuras de datos más frecuentes.

Todo esto llevó al hecho de que muchos desarrolladores se vieron obligados a explorar ellos mismos los laberintos de la semántica lingüística y encontrar de forma independiente modismos que funcionaran con éxito. Por ejemplo, en la primera etapa del desarrollo del lenguaje, muchos creadores de bibliotecas de clases buscaron construir una única jerarquía de clases con una clase base común Objeto. Esta idea fue tomada de Smalltalk, uno de los lenguajes orientados a objetos más famosos. Sin embargo, resultó ser completamente inviable en C++: las jerarquías de bibliotecas de clases cuidadosamente diseñadas resultaron ser inflexibles y el trabajo de las clases no era obvio. Para que las bibliotecas de clases fueran utilizables, debían proporcionarse en el código fuente.

La aparición de clases modelo refutó por completo esta dirección de desarrollo. La herencia comenzó a usarse solo en los casos en que era necesario generar una versión especializada de una clase existente. Las bibliotecas comenzaron a estar compuestas por clases separadas y pequeñas jerarquías no relacionadas. Sin embargo, en este camino, la reutilización de código comenzó a declinar, ya que en C++ el uso polimórfico de clases de jerarquías independientes es imposible. El uso generalizado de plantillas conduce a un aumento inaceptable en el volumen de código compilado; no olvidemos que las plantillas se implementan mediante métodos de macrogeneración.

Una de las deficiencias más graves de C++, que heredó de la sintaxis de C, es la capacidad del compilador para describir la estructura interna de todas las clases utilizadas. Como consecuencia, cambiar la estructura interna de la representación de una clase de biblioteca lleva a la necesidad de recompilar todos los programas donde se utiliza esta biblioteca. Esto limita enormemente a los desarrolladores de bibliotecas en términos de su modernización, porque al lanzar nueva versión, deben seguir siendo binarios compatibles con el anterior. Es este problema el que hace que muchos expertos crean que C++ no es adecuado para ejecutar proyectos grandes y muy grandes.

Y, sin embargo, a pesar de las deficiencias enumeradas e incluso de la falta de disponibilidad del lenguaje estándar (¡esto después de más de quince años de uso!), C++ sigue siendo uno de los lenguajes de programación más populares. Su punto fuerte reside principalmente en su casi total compatibilidad con el lenguaje C. Gracias a esto, los programadores de C++ tienen acceso a todos los desarrollos realizados en C. Al mismo tiempo, C++, incluso sin el uso de clases, aporta una serie de importantes. características y comodidades adicionales a C que muchos lo usan simplemente como un C mejorado.

En cuanto al modelo de objetos de C++, siempre que su programa no sea muy grande (cientos de miles de líneas), es bastante utilizable. La reciente tendencia de transición a la tecnología basada en componentes software sólo fortalece la posición de C++. Al desarrollar componentes individuales, las deficiencias de C++ aún no aparecen y la vinculación de componentes en un sistema en funcionamiento ya no se realiza a nivel del lenguaje, sino a nivel del sistema operativo.

A la luz de todo lo dicho, las perspectivas para C++ no parecen sombrías. Aunque no tendrá el monopolio del mercado de lenguajes de programación. Quizás lo único que podemos decir con certeza es que este lenguaje no sobrevivirá a otra modernización-expansión. No en vano, cuando apareció Java, recibió tanta atención. El lenguaje, que tiene una sintaxis similar a C++ y, por lo tanto, resulta familiar para muchos programadores, se ha librado de las deficiencias más evidentes de C++, heredado de los años 70. Sin embargo, Java no parece estar a la altura del papel que algunas personas le han asignado.

El papel especial de los lenguajes C/C++ en la programación moderna hace que prácticamente no tenga sentido proporcionar direcciones específicas en Internet donde se pueda encontrar material sobre ellos. Simplemente hay demasiados lugares como este. Sin embargo, si está interesado en aprender más sobre la evolución de C++, comience con este breve artículo. http://citforum.syzran.ru/programming/prg96/76.shtml.

Alejandro Serguéiev, [correo electrónico protegido]
Artículo de la revista BYTE/Rusia, marzo de 2000.

Para demostrar claramente el uso de los lenguajes descritos en la práctica, elegimos una tarea en la que era necesario ingresar una serie de números enteros desde la entrada estándar o desde un archivo, y luego generar solo los impares, en orden inverso. . Este es uno de los problemas más simples que esencialmente requiere trabajar con matrices, bucles, ramificaciones y E/S para resolverlo, y también le permite demostrar llamadas a subrutinas. Al mismo tiempo, es visible y fácilmente percibido.

Listado 1.C

1 #incluir /* Conectar funciones de E/S */ 2 3 void main(void) 4 ( 5 int M; /* Matriz de 10 enteros, contando desde 0 */ 6 int N; 7 for (N=0; N<10; ++N) /* Вводим не более 10 чисел */ 8 if (EOF == scanf ("%d, M+N)) 9 break; /* Если конец файла, прерываем цикл */ 10 11 for (-N; N>=0; --N) /* Recorremos el array al revés */ 12 if (M[N]%2) /* ordenamos e imprimimos los impares */ 13 printf("%d\n", M[N]); 14 )

  • Línea 3. En C/C++, la ejecución del programa siempre comienza con la función principal.
  • Líneas 7 y 11. En el encabezado del bucle, se indican la configuración inicial, la condición de continuación y la regla para recalcular el parámetro del bucle, separados por punto y coma. Operaciones ++ Y -/- - las abreviaturas más famosas del lenguaje C, que significan incrementar y disminuir una variable, es decir, aumentar y disminuir su valor en uno.
  • Línea 8. Función escanear ingresa, según el formato especificado por el primer parámetro, los valores de las variables cuyas direcciones están especificadas por los parámetros restantes. Aquí, la dirección donde se ingresa el valor se calcula usando aritmética de direcciones para la dirección de la ubicación de la matriz. METRO el desplazamiento se suma por norte elementos. El mismo efecto se puede lograr escribiendo &MINNESOTA].
  • Línea 12. Operación % Calcula el resto de una división. Condición del operador si se considera ejecutada si el valor numérico de la expresión es distinto de cero.
  • Línea 13. Función imprimirf- la impresión por formato funciona de la misma manera escanear, pero en lugar de direcciones se pasan valores para generar.
1 #incluir 2 3 plantilla clase Array 4 ( 5 público: Array (T Tamaño = 1): M (nuevo T), N (Tamaño), n (0) () 6 Array (void) (eliminar M;) 7 T Count (void) const ( return n; ) 8 T operador (int i) const ( return M[i]; ) 9 void Agregar (T Datos); 11 T* M; // Dirección de memoria distribuida 12 int N, n - distribuido; 13); 14 15 plantilla matriz vacía ::Add(T Data) 16 ( if (N-n) // Si se usan todos los 17 asignados ( int* P = new T; // espacio, distribuye más 18 for (int i=0; i A; // Matriz de enteros de tamaño variable 28 while (1) // Bucle infinito 29 ( int N; 30 cin >> N; // cin - flujo de entrada estándar 31 if (cin.eof()) break; // Salir del bucle al final del archivo 32 A.Add(N); // Agrega el número ingresado a la matriz 33 ) 34 for (int N=A.Count()-1; N>=0; --N) // Recorrido la matriz 35 si (A[N]%2) 36 cout<y liberar memoria
  • Líneas 3-13. La clase de plantilla está declarada. Formación con parámetro t. Es una matriz de objetos de tipo de tamaño variable. t. Por supuesto, en nuestra tarea no es necesario utilizar una clase de plantilla. Sin embargo, queríamos demostrar cómo C++ puede crear una estructura de datos polimórfica que puede funcionar con cualquier tipo de elemento.
  • Línea 5. Constructor de clases. Inicializa la representación del objeto. Por ejemplo, en el campo METRO Se ingresa la dirección del bloque de memoria ordenado por la operación. nueva T.
  • Línea 8. Un ejemplo de sobrecarga de operaciones. Función operador Se llamará cuando aparezcan corchetes a la derecha de un objeto de clase. Formación.
  • Línea 9. Esta función es la principal en la implementación. Agrega elementos a la matriz y la expande según sea necesario. Como es más complejo que los demás, su definición se toma de la descripción de la clase. Las funciones descritas en el cuerpo de la clase se implementan en C++ no mediante llamada, sino mediante sustitución en línea. Esto acelera el programa, aunque aumenta su tamaño.
  • Líneas 15-24. Definición de función Matriz::Agregar(T)(ese es su nombre completo, por cierto).
  • Línea 27. Crear un objeto de tipo Formación. Plantilla Aggau parametrizado por tipo En t.

Historia de la creación

El lenguaje se originó a principios de la década de 1980, cuando Björn Stroustrup, empleado de Bell Labs, ideó una serie de mejoras al lenguaje C para sus propias necesidades. Cuando Stroustrup comenzó a trabajar en los Laboratorios Bell a finales de la década de 1970 en problemas de la teoría de colas (aplicada al modelado de llamadas telefónicas), descubrió que los intentos de utilizar los lenguajes de modelado existentes en ese momento eran ineficaces y que el uso de lenguajes de máquina altamente eficientes Fue demasiado difícil de implementar por su limitada expresividad. Por lo tanto, el lenguaje Simula tiene características que serían muy útiles para desarrollar software de gran tamaño, pero es demasiado lento, y el lenguaje BCPL es lo suficientemente rápido, pero está demasiado cerca de los lenguajes de bajo nivel y no es adecuado para desarrollar software de gran tamaño.

Recordando la experiencia de su disertación, Stroustrup decidió complementar el lenguaje C (el sucesor de BCPL) con las capacidades disponibles en el lenguaje Simula. C, al ser el lenguaje base del sistema UNIX en el que se ejecutan las computadoras Bell, es rápido, rico en funciones y portátil. Stroustrup agregó la capacidad de trabajar con clases y objetos. Como resultado, los problemas prácticos de modelado resultaron ser fáciles de resolver tanto en términos de tiempo de desarrollo (gracias al uso de clases similares a Simula) como en términos de tiempo de cálculo (gracias a la velocidad de C). En primer lugar, se agregaron a C clases (con encapsulación), herencia de clases, verificación estricta de tipos, funciones en línea y argumentos predeterminados. Las primeras versiones del lenguaje, originalmente llamadas "C con clases", estuvieron disponibles en 1980.

Mientras desarrollaba C con clases, Stroustrup escribió un programa llamado cfront, un traductor que convierte el código fuente C con clases en código fuente C simple. Esto hizo posible trabajar en un nuevo lenguaje y usarlo en la práctica, utilizando la infraestructura ya disponible en. UNIX para desarrollo en C. El nuevo lenguaje, inesperadamente para el autor, ganó gran popularidad entre sus colegas y pronto Stroustrup ya no pudo apoyarlo personalmente, respondiendo miles de preguntas.

Al crear C++, Björn Stroustrup quería
  • Obtenga un lenguaje de propósito general con tipos de datos estáticos, la eficiencia y portabilidad del lenguaje C.
  • Admite directa e integralmente una variedad de estilos de programación, incluida la programación de procedimientos, la abstracción de datos, la programación orientada a objetos y la programación genérica.
  • Dar al programador libertad de elección, incluso si esto le da la oportunidad de elegir mal.
  • Mantenga la compatibilidad con C tanto como sea posible, haciendo posible una transición fácil desde la programación en C.
  • Evite discrepancias entre C y C++: cualquier construcción que sea válida en ambos lenguajes debe significar lo mismo en cada uno de ellos y conducir al mismo comportamiento del programa.
  • Evite funciones que dependan de la plataforma o que no sean universales.
  • “No pague por lo que no usa”: ninguna característica del lenguaje debería causar una degradación del rendimiento de los programas que no la usan.
  • No requiere un entorno de programación demasiado complicado.

La elección de C como base para la creación de un nuevo lenguaje de programación se explica por el hecho de que el lenguaje C:

1. es un lenguaje multipropósito, conciso y de nivel relativamente bajo;
2. adecuado para resolver la mayoría de los problemas del sistema;
3. realizado en todas partes y en todo;
4. interactúa con el entorno de programación UNIX.

— B. Stroustrup. Lenguaje de programación C++. Sección 1.6

A pesar de una serie de deficiencias conocidas del lenguaje C, Stroustrup decidió utilizarlo como base, ya que "C tiene sus problemas, pero un lenguaje desarrollado desde cero los tendría, y conocemos los problemas de C". Además, esto permitió obtener rápidamente un compilador prototipo (cfront), que solo traducía los elementos sintácticos añadidos al lenguaje C original.

A medida que se desarrolló C++, se incluyeron otras características que cubrían las capacidades de las construcciones de C y, por lo tanto, se planteó repetidamente la cuestión de abandonar la compatibilidad del lenguaje mediante la eliminación de construcciones obsoletas. Sin embargo, la compatibilidad se ha mantenido por los siguientes motivos:

  • preservación del código actual, escrito originalmente en C y transferido directamente a C++;
  • eliminar la necesidad de volver a capacitar a los programadores que previamente estudiaron C (solo necesitan aprender nuevas herramientas de C++);
  • eliminar la confusión entre idiomas cuando se usan juntos (“si dos idiomas se usan juntos, sus diferencias deben ser mínimas o tan grandes que sea imposible confundir los idiomas”).

En 1983, se habían agregado nuevas características al lenguaje, como funciones virtuales, sobrecarga de funciones y operadores, referencias, constantes, control del usuario sobre la gestión de memoria libre, verificación de tipos mejorada y un nuevo estilo de comentario (//). El lenguaje resultante ya no era sólo una versión aumentada del C clásico y pasó de llamarse C con clases a “C++”. Su primer lanzamiento comercial tuvo lugar en octubre de 1985.

El nombre del idioma resultante proviene del operador de incremento de sufijo unario de C++ (que aumenta el valor de una variable en uno).

Antes de que comenzara la estandarización oficial, el lenguaje fue desarrollado principalmente por Stroustrup en respuesta a solicitudes de la comunidad de programación. La función de descripciones estándar del lenguaje se realizaba mediante trabajos impresos escritos por Stroustrup en C++ (descripción del lenguaje, manual de referencia, etc.).

Historia de las normas

En 1985 se publicó la primera edición de El lenguaje de programación C++, proporcionando la primera descripción del lenguaje, lo cual fue de suma importancia debido a la falta de un estándar oficial.


En 1989, se lanzó la versión 2.0 de C++. Sus nuevas características incluían herencia múltiple, clases abstractas, funciones miembro estáticas, funciones constantes y miembros protegidos. En 1990 se publicó la “Guía de referencia comentada de C++”, que más tarde se convirtió en la base del estándar. Las actualizaciones recientes han incluido plantillas, excepciones, espacios de nombres, nuevos tipos de conversión y tipos booleanos.

La biblioteca estándar de C++ también evolucionó con ella. La primera incorporación a la biblioteca estándar de C++ fueron los flujos de E/S, que proporcionan un medio para reemplazar las funciones tradicionales printf y scanf de C. Posteriormente, el desarrollo más significativo de la biblioteca estándar fue la inclusión de la Biblioteca de plantillas estándar.

En 1998 se publicó el estándar de lenguaje ISO/IEC 14882:1998 (conocido como C++98), desarrollado por el Comité de Estándares C++ (grupo de trabajo ISO/IEC JTC1/SC22/WG21). El estándar C++ no describe cómo se nombran los objetos, algunos detalles de manejo de excepciones y otras características detalladas de la implementación, lo que hace que el código objeto producido por diferentes compiladores sea incompatible. Sin embargo, muchos estándares han sido creados por terceros para arquitecturas y sistemas operativos específicos.

En 2005, se publicó el Informe técnico de la biblioteca 1 (abreviado como TR1). Si bien no forma parte oficialmente del estándar, el informe describe extensiones de la biblioteca estándar que los autores esperaban que se incluyeran en la próxima versión del lenguaje C++. La compatibilidad con TR1 está mejorando en casi todos los compiladores de C++ compatibles.

Desde 2009 se viene trabajando en la actualización del estándar anterior, la versión preliminar del nuevo estándar fue primero C++09, y un año después C++0x, hoy C++11, que incluía adiciones al núcleo de el idioma y una expansión de la biblioteca estándar, incluida la mayor parte de TR1.

C++ continúa evolucionando para satisfacer las demandas actuales. Uno de los grupos que desarrolla el lenguaje C++ y presenta propuestas para mejorarlo al comité de estandarización de C++ es Boost, que se dedica, entre otras cosas, a mejorar las capacidades del lenguaje agregándole funciones de metaprogramación.

Nadie posee los derechos del lenguaje C++; Sin embargo, el documento estándar del idioma en sí (excluidos los borradores) no está disponible de forma gratuita.

¿Por qué C++?

Actualmente, C++ se considera el lenguaje dominante utilizado para desarrollar productos de software comercial. En los últimos años, este dominio ha flaqueado ligeramente debido a afirmaciones similares de un lenguaje de programación como Java, pero el péndulo de la opinión pública ha oscilado en la otra dirección, y muchos programadores que abandonaron C++ por Java recientemente se apresuraron a volver a su antiguo afecto. En cualquier caso, los dos idiomas son tan parecidos que una vez que aprendes uno, automáticamente dominas el 90% del otro.

C# es un nuevo lenguaje desarrollado por Microsoft para la plataforma de redes. Esencialmente, C# es una variación de C++ y, a pesar de una serie de diferencias fundamentales, los lenguajes C# y C++ son aproximadamente iguales en un 90%. Probablemente pasará mucho tiempo antes de que C# compita seriamente con C++; pero incluso si esto sucede, el conocimiento del lenguaje C++ será una ventaja significativa.

C++ es un lenguaje de programación de propósito general. Su ámbito natural de aplicación es la programación de sistemas, entendida en el sentido amplio de la palabra. Además, C++ se ha utilizado con éxito en muchas áreas de aplicación que van mucho más allá de este ámbito. Las implementaciones de C++ ahora están disponibles en todas las máquinas, desde las microcomputadoras más humildes hasta las supercomputadoras más grandes, y prácticamente en todos los sistemas operativos.

El surgimiento y evolución del lenguaje C++.

Bjarne Stroustrup es el desarrollador del lenguaje C++ y creador del primer traductor. Es empleado del Centro de Computación de Investigación de AT&T Bell Laboratories en Murray Hill (Nueva Jersey, EE. UU.). Recibió una Maestría en Matemáticas e Informática de la Universidad de Aarus (Dinamarca) y un Doctorado en Informática de la Universidad de Cambridge (Inglaterra). Se especializa en sistemas distribuidos, sistemas operativos, modelado y programación. Junto con M. A. Ellis, es el autor de la guía definitiva del lenguaje C++, The Annotated C++ Manual.

Por supuesto, C++ le debe mucho al lenguaje C, que sigue siendo un subconjunto del mismo. También se han conservado todas las herramientas C de bajo nivel diseñadas para resolver los problemas más urgentes de programación de sistemas. C, a su vez, le debe mucho a su predecesor, el lenguaje BCPL. El comentario del lenguaje BCPL se ha restaurado en C++. Otra fuente de inspiración fue el lenguaje SIMULA-67; De allí se tomó prestado el concepto de clases (junto con las clases derivadas y las funciones virtuales). La capacidad de C++ para sobrecargar operadores y la libertad de colocar declaraciones dondequiera que aparezca un operador recuerdan al lenguaje ALGOL-68.

A partir de 1980 se utilizaron versiones anteriores del lenguaje, llamadas "C con clases". Este lenguaje surgió porque el autor necesitaba escribir programas de simulación controlados por interrupciones. El lenguaje SIMULA-67 es ideal para esto, dejando de lado la eficiencia. El lenguaje C con clases se utilizó para grandes problemas de modelado. En ese momento, se sometieron a estrictas pruebas las posibilidades de escribir programas en él, para los cuales el tiempo y los recursos de memoria eran críticos. Este lenguaje carecía de sobrecarga de operadores, referencias, funciones virtuales y muchas otras características. C++ se lanzó por primera vez fuera del grupo de investigación del autor en julio de 1983, pero muchas de las características de C++ aún no se habían desarrollado.

El nombre C++ (C plus plus) fue acuñado por Rick Mascitti en el verano de 1983. El nombre refleja la naturaleza evolutiva de los cambios en el lenguaje C. La notación ++ se refiere a la operación de crecimiento de C. El nombre ligeramente más corto C+. es un error de sintaxis. Además, ya se ha utilizado como nombre de un idioma completamente diferente. Quienes conocen la semántica de C consideran que C++ es peor que ++C. El lenguaje no se llama D porque es una extensión de C y no intenta resolver ningún problema eliminando las características de C. Otra interpretación interesante del nombre C++ se puede encontrar en el apéndice de .

C++ fue concebido originalmente para que el autor y sus amigos no tuvieran que programar en lenguaje ensamblador, C u otros lenguajes modernos de alto nivel. Su objetivo principal es simplificar y hacer que el proceso de programación sea más agradable para el programador individual. Hasta hace poco, no existía ningún plan sobre el papel para el desarrollo de C++. El diseño, la implementación y la documentación se desarrollaron en paralelo. Nunca ha habido un "Proyecto C++" o un "Comité de Desarrollo de C++". Por tanto, el lenguaje ha evolucionado y sigue evolucionando de tal forma que supera todos los problemas que enfrentan los usuarios. Las discusiones del autor sobre todos los problemas con sus amigos y colegas también sirven como impulso para el desarrollo.

Desde la publicación de la primera edición de este libro, el lenguaje C++ ha experimentado cambios y mejoras importantes. Esto se refiere principalmente a la resolución de ambigüedades en la sobrecarga, el enlace y la gestión de la memoria. Sin embargo, se han realizado cambios menores para aumentar la compatibilidad con el lenguaje C. También se han introducido algunas generalizaciones y extensiones importantes, como herencia múltiple, funciones miembro con especificaciones estáticas y constantes, miembros protegidos, plantillas de tipos y manejo de situaciones especiales. Todas estas extensiones y mejoras tenían como objetivo hacer de C++ un lenguaje en el que se puedan crear y utilizar bibliotecas. Todos los cambios se describen en .

Otras ampliaciones introducidas entre 1985 y 1991 (como herencia múltiple, funciones miembro estáticas y funciones virtuales puras) surgieron de la generalización de la experiencia de programación en C++ y no de otros lenguajes.

Las extensiones de lenguaje realizadas durante estos seis años tuvieron como objetivo principal aumentar la expresividad de C++ como lenguaje de abstracción de datos y programación orientada a objetos en general, y como medio para crear bibliotecas de alta calidad con tipos de datos definidos por el usuario en particular.

Alrededor de 1987, se hizo evidente que el trabajo de estandarización de C++ era inminente y que el trabajo debería comenzar de inmediato.

AT&T Bell Laboratories fue uno de los principales contribuyentes a este trabajo. Alrededor de cien representantes de unas 20 organizaciones revisaron y comentaron lo que se convirtió en la versión moderna del manual de referencia y el material fuente para la estandarización ANSI. C++. Finalmente, por iniciativa de Hewlett-Packard, se formó el comité X3J16 dentro de ANSI en diciembre de 1989. Se espera que el trabajo de estandarización de ANSI (American Standard) para C++ pase a formar parte del trabajo de estandarización de ISO (Organización Internacional de Normalización).

C++ se desarrolló simultáneamente con el desarrollo de algunas clases fundamentales.

C++ es un lenguaje de programación compilado de propósito general que combina las propiedades de los lenguajes de programación de alto y bajo nivel. En comparación con su predecesor, el lenguaje de programación C, se presta la mayor atención al soporte de programación genérica y orientada a objetos. El nombre "lenguaje de programación C++" proviene del lenguaje de programación C, en el que el operador unario ++ indica el incremento de una variable.

El lenguaje de programación C++ se utiliza ampliamente para el desarrollo de software. Es decir, la creación de diversos programas de aplicaciones, el desarrollo de sistemas operativos, controladores de dispositivos, así como videojuegos y mucho más. Fue creado a principios de los años 1980 por Björn Stroustrup. Se le ocurrieron una serie de mejoras en el lenguaje de programación C para sus propias necesidades. aquellos. Inicialmente no había planes para crear el lenguaje de programación C++.

Admite paradigmas de programación como programación de procedimientos, programación orientada a objetos, programación genérica, proporciona modularidad, compilación separada, manejo de excepciones, abstracción de datos, declaración de tipos de objetos (clases), funciones virtuales.

El nombre del idioma resultante proviene del operador de incremento de sufijo unario de C++ (que aumenta el valor de una variable en uno). El nombre C+ no se utilizó porque era un error de sintaxis en C y también porque el nombre estaba ocupado por otro idioma. El lenguaje tampoco fue nombrado D porque "es una extensión de C y no intenta solucionar problemas eliminando elementos de C".

Ventajas del idioma:

1. Escalabilidad. Los programas se desarrollan en C++ para una amplia variedad de plataformas y sistemas.

2. Capacidad para trabajar a bajo nivel con memoria, direcciones, puertos.

3. La capacidad de crear algoritmos generalizados para diferentes tipos de datos, su especialización y cálculos en la etapa de compilación mediante plantillas.

4. Multiplataforma. Hay compiladores disponibles para una gran cantidad de plataformas y los programas se desarrollan en C++ para una amplia variedad de plataformas y sistemas.

5. Eficiencia. El lenguaje está diseñado para brindar al programador el máximo control sobre todos los aspectos de la estructura del programa y el orden de ejecución.

Desventajas del idioma:

1. La presencia de muchas características que violan los principios de seguridad de tipos lleva al hecho de que errores sutiles pueden introducirse fácilmente en los programas C++.

2. Escaso soporte para la modularidad. Conectar la interfaz de un módulo externo mediante la inserción del preprocesador de un archivo de encabezado (#include) ralentiza seriamente la compilación cuando se conecta una gran cantidad de módulos.

3. El lenguaje C++ es difícil de aprender y compilar.

4. Algunas conversiones de tipos no son intuitivas. En particular, una operación en un número con signo y sin signo produce un resultado sin signo.

5. Algunas personas consideran que la falta de un sistema integrado de recolección de basura es una desventaja del lenguaje C++. Por otro lado, C++ tiene suficientes herramientas para casi eliminar el uso de punteros peligrosos; no hay problemas fundamentales en la implementación y el uso de la recolección de basura (a nivel de biblioteca, no a nivel de lenguaje). La ausencia de recolección de basura incorporada permite al usuario elegir su propia estrategia de gestión de recursos.



gastrogurú 2017