jueves, 11 de febrero de 2016

Historia breve del lenguaje C ++

Historia breve del lenguaje C++



La imagen anterior presenta el árbol genealógico del lenguaje de programación C++.

 El desarrollo de este lenguaje no puede ser mejor relatado que por su propio creador:
Bjarne Stroustrup.

Stroustrup señala que la primera influencia de C++ proviene del lenguaje Fortran
(FORmula TRANslation), desarrollado inicialmente en 1956 y considerado el primer
lenguaje de programación de alto nivel, es decir, el primer paso dado hacia la
implementación de los programas en el dominio del problema.i,2 Fortran ya cuenta
con arreglos, ciclos de repetición, una librería de funciones matemáticas,
mecanismos de entrada/salida, funciones definidas por el usuario y, entre las
cuestiones más importantes logradas con su desarrollo, se descubrió la estructura
básica de un compilador así como la notación Backus-Naur Form (BNF) para
expresar la gramática de un lenguaje de programación.

El primero de los lenguajes de programación que empleó la notación BNF, fue
Algol60. El lenguaje algorítmico (ALGOrithmic Language), Algol, fue desarrollado por
un grupo de gente auspiciada por la Federación Internacional de Procesamiento de
Información (IFIP – International Federation of Information Processing), el cual
estableció los fundamentos para los lenguajes de programación modernos, incluido
C++, con las características implementadas en Algol: tipos de datos en tiempo de
compilación, ámbito léxico, uso de una gramática para definir el propio lenguaje,
separación de las reglas sintácticas de las semánticas así como de la definición del
lenguaje con respecto a su implementación y, al final pero no menos importante, el
soporte para la programación estructurada. Aunque Algol no tuvo gran éxito, por ser
demasiado diferente a lo que existía, fue un parteaguas que estableció las bases para
el futuro de la programación.

Siguiendo el linaje de Algol, a mediados de la década de los 60’s se desarrolló el
lenguaje Simula, como un superconjunto de Algol60 y como el primer lenguaje de
programación en implementar los conceptos que hoy definen a la POO: la
encapsulación, la herencia y el polimorfismo.iii Simula acuñó los términos clase, para
denominar a un tipo definido por el usuario; y virtual, para denotar una función que
puede ser sobrescrita e invocada a través de una clase base o padre. Así, un
programa se convierte en un conjunto de objetos interactuando entre ellos y no en
un monolito de código.

A través de otra derivación de Algol, diferente a la que originó Simula, llega la
principal influencia del lenguaje C++, el lenguaje de programación C, conocido
también como su lenguaje padre, por la cantidad tan grande de características que
heredó de él.

El origen de C proviene del proyecto CPL que nunca se completó en Inglaterra;
del lenguaje BCPL (CPL Básico – Basic CPL) que Martin Richards creó cuando visitó
el Instituto Tecnológico de Massachusetts, en Estados Unidos, proveniente de la
Universidad de Cambridge; y de un lenguaje interpretado denominado B, creado por
Ken Thompson.

CPL fue un proyecto conjunto entre la Universidad de Cambridge y el Colegio
Imperial en Londres. Como el proyecto se inició en Cambridge, el significado del
nombre, “C”, correspondía oficialmente a “Cambridge”. Luego entró al proyecto el
Colegio Imperial y el significado cambió a “Combinado”. Se supone que en realidad
su significado siempre fue “Christopher”, derivado del nombre del diseñador
principal de CPL, Christopher Strachey.

Dennis Ritchie diseñó e implementó el lenguaje de programación C en el Centro
de Investigación en Ciencias Computacionales de los Laboratorios Bell, en Murray
Hill, Nueva Jersey. Su trabajo fue un esfuerzo realizado como una clara
contraposición a la costumbre establecida en esa época de que el software de
sistemasv debía programarse en lenguaje ensamblador, generando la imposibilidad
de ser portable. Por tal motivo, Ken Thompson y el propio Dennis Ritchie
desarrollaron más tarde el sistema operativo Unix, programándolo exclusivamente en
C, incluidas las herramientas necesarias para su funcionamiento, como el
compilador. Unix es la influencia más grande conocida en el tema de los sistemas
operativos y, unido a él, el lenguaje C es el referente primario en el área de los
lenguajes de programación. Más ahora que el sistema operativo GNU/Linux,
derivado directo de Unix y también programado en C, ha tenido un repunte
impresionante, respaldado por los movimientos de software abierto y libre.

La belleza del lenguaje C radica en que es deliberadamente simple, apegado a
los aspectos fundamentales del hardware, esto es, las características del lenguaje
mapean directamente a las características de hardware.

Dennis Ritchie describió a C como “un lenguaje fuertemente tipado, pero
débilmente verificado”; esto es, C es muy estricto en tiempo de compilación, pero
muy débil o demasiado permisivo en tiempo de ejecución. Lo anterior no es un
efecto premeditado del diseño del lenguaje, se debe a las características tan
restrictivas que en esos tiempos tenía el hardware.

Finalmente, Bjarne Stroustrup diseñó e implementó el lenguaje de programación
C++ en el mismo Centro de Investigación en Ciencias Computacionales de los
Laboratorios Bell, en Murray Hill, donde nació el lenguaje C (y a unos cuantos pasos
de la oficina de Dennis Ritchie). C++ es un lenguaje de programación de propósitos
múltiples, con una cierta orientación hacia la programación de sistemas, que es un
mejor C y que soporta la abstracción de datos, la POO y la programación genérica.

Conceptos que, en los tiempos en que nació C++, se consideraban demasiado costosos en cuanto a recursos de cómputo, como para usarlos en el mundo real, o demasiado complicados para que los programadores ordinarios los aprendieran.

El trabajo de desarrollo de C++ inició en 1979, generando una versión comercial
en 1985. Posteriormente, Stroustrup siguió desarrollando el lenguaje con ayuda de
sus compañeros de los laboratorios Bell, y de gente externa a estos, hasta que
comenzó su estandarización oficial en 1990. A partir de ahí y teniendo como líder
del esfuerzo al propio Stroustrup, la definición de C++ la desarrolló el Instituto
Nacional Estadounidense de Estándares (ANSI – American National Standards
Institute) y, desde 1991, la Organización Internacional de Estándares (ISO –
International Organization for Standardization). Bjarne Stroustrup sigue dirigiendo el
grupo internacional de estandarización a cargo de diseñar e implementar las
características nuevas del lenguaje. El primer estándar internacional se ratificó en
1998 (denominado C++98) y, el segundo, en 2011 (denominado C++11)

El desarrollo más significativo del lenguaje C++, después de su primera década
de crecimiento, es la Librería Estándar de Plantillas (STL – Standard Template Library)
creada por Alexander Stepanov. La STL es la librería estándar del lenguaje para
manejo de contenedores (estructuras de datos) y los algoritmos que las manipulan.

El “C con clases” mostrado en la Figura 1, fue una síntesis inicial de ideas
tomadas de los lenguajes C y Simula, que dio paso a su sucesor, C++.

Las fortalezas principales que han hecho de C y C++ lo que hoy son, no son ni la
elegancia, ni las características avanzadas; son su flexibilidad, su rendimiento y su
estabilidad. En el mundo siempre cambiante de los sistemas de software, estas son
tres de las características más codiciadas.

Para finalizar este apartado, cabe señalar que el lector interesado en profundizar
en la descripción, el diseño, la evolución, el futuro y la propia programación en este
lenguaje puede recurrir a The C++ Programming Language,3 al estándar oficial C++11 de la ISO,4 a The Design and Evolution of C++,5 a la página web del propio
Bjarne Stroustrup6 y a Programming and Practice – Principles and Practice Using
C++.



Metodología para la construcción de programas

METODOLOGÍA PARA LA CONSTRUCCIÓN DE PROGRAMAS

Nota: Recuerde que estos son apuntes muy simplificados que deberá completar con la bibliografía                 recomendada.

Presentaremos de forma muy general los principales pasos que se deben seguir para resolver problemas aplicando técnicas de programación. Esta metodología será desarrollada a lo largo de todo el curso, en la medida que se estudien las restantes unidades del mismo.

1. FORMULACIÓN Y ANÁLISIS DEL PROBLEMA
Consiste en entender de qué se trata el problema planteado y esbozar su posible solución, concluyendo con una clara definición de tres aspectos: 1º qué es lo que nos piden, es decir, definición del resultado o solución deseada (para qué). 2º cómo obtener lo que nos piden (qué hacer). 3º qué necesitamos para obtener los resultados pedidos (con qué). Esto último nos facilitará la construcción de lo que denominaremos Especificación Funcional.

1.1.- Especificación Funcional: Consiste en determinar las funciones que se van a realizar (qué hacer) y sus respectivas entradas (con qué) y salidas (para qué):


Donde: entrada son los argumentos (variables o constantes) que se requieren para resolver un problema, salida son los resultados (argumentos) que se desean obtener una vez resuelto el problema y proceso es el procedimiento(s) u operación(es) que deben efectuarse sobre las entradas para obtener las salidas deseadas.

1.2.- Especificación de los Argumentos o Parámetros: Consiste en la documentación de los argumentos o parámetros (sean estos de entrada, salida o intermedios) requeridos en la solución del problema, mediante la elaboración de una tabla que contemple los siguientes aspectos:


1.3.- Establecimiento de Restricciones y Atributos: Consiste en determinar bajo qué restricciones se ha de operar y cuales son las medidas de rendimiento y calidad que debe tener el sistema (programa). Este aspecto no se realizará en este curso dada la simplicidad de los problemas tratados.

2. DISEÑO.
Consiste en diseñar cómo hace el programa la tarea solicitada. En forma general consiste en dividir el programa en subprogramas y cada subprograma en módulos.


El criterio de descomposición más utilizado es el de tipo funcional, el cual produce una estructura jerárquica en la que cada módulo ejecuta una o más funciones y para cada módulo se produce una especificación de programa o módulo, la cual contiene lo siguiente:

Nombre del Programa o Módulo.
Función que desarrolla.
Parámetros o Argumentos.
Parámetros o Argumentos de Entrada.
Parámetros o Argumentos de Salida.
Estructura de Datos Requerida. 
Lenguaje de Programación.
Algoritmo

Donde ALGORITMO es un conjunto finito de pasos en secuencia que indican como se resuelve un determinado problema.

Propiedades de los algoritmos estructurales:

a) Número finito de pasos sin ambigüedades.
b) Numeración de cada paso en orden secuencial
c) La acción a realizar se indica con un verbo o con un gráfico.
d) Condicionado a las estructuras básicas de la programación estructurada.
e) Eficiente (menor número de pasos pero lo más claro posible)

Herramientas para diseñar algoritmos:

a) Diagramas de Flujo: representación gráfica de un algoritmo.
b) Pseudocódigo: lenguaje de especificación de algoritmos (el algoritmo se representa mediante palabras similares al inglés o al español, para facilitar tanto la lectura como la escritura de programas.

Los símbolos o la notación para elaborar, respectivamente, los diagramas de flujo o los pseudocódigos, serán indicados en los siguientes apuntes, en la medida que se estudie las correspondientes estructuras de programación.

3. CODIFICACIÓN.

Es la escritura en un lenguaje de programación de la representación del algoritmo desarrollado en la etapa de diseño. El resultado de la codificación es un programa fuente.

4. COMPILACIÓN Y EJECUCIÓN.

Es el proceso de traducción del programa fuente al lenguaje de máquina. Este proceso se realiza con el compilador y el Sistema Operativo. El resultado, si no hay errores, es la obtención del programa objeto que todavía no es ejecutable directamente. Luego, mediante el Sistema Operativo se realiza la carga del programa objeto con las librerías del programa compilador, el resultado es un programa ejecutable. Cuando el programa ejecutable se ha creado, se puede ejecutar el programa desde el Sistema Operativo generalmente con sólo teclear su nombre. Si no hay errores se obtiene como salida los resultados del programa. 

5. VERIFICACIÓN Y DEPURACIÓN.

Es el proceso de probar que el programa trabaje correctamente y cumpla con los requerimientos del usuario.

VERIFICAR: es el proceso de ejecución del programa con una amplia variedad de datos de entrada (test o pruebas) que determinarán si el programa tiene errores.
DEPURAR: es el proceso de encontrar los errores del programa y corregir o eliminar dichos errores.

TIPOS DE ERRORES:

a) Errores de compilación: suelen ser errores de sintaxis.
b) Errores de ejecución: suelen ser instrucciones que la computadora comprende pero que no puede ejecutar. Ejemplo: divisiones por cero, raíces negativas, etc.
c) Errores de lógica: se producen en la lógica del programa, en el diseño del algoritmo. Se detectan porque los resultados son incorrectos.

6. DOCUMENTACIÓN Y MANTENIMIENTO.

Consta de la descripción de los pasos a dar en el proceso de resolución de un problema. La documentación de un programa puede ser:
Interna: contenida en las líneas de comentarios del propio programa.
Externa: Incluye el análisis, la especificación del programa, el algoritmo, los manuales de los usuarios, etc.
El mantenimiento consiste en la actualización de los programas con los cambios requeridos por el usuario o corrección de posibles errores futuros.

Gráficamente la metodología puede ilustrarse de la siguiente manera: