lunes, 22 de abril de 2013

INTRODUCCIÓN


La computadora se ha convertido ya en uno de los principales desarrollos del siglo XX. Las películas animadas por computadora dan sensaciones realistas de mundos que solo pueden existir en nuestra imaginación. Los héroes ya no son seres vivos, sino patrones electrónicos de ceros y unos que deambulan en el ciberespacio. El humano se comunica con las computadoras  por medio de un lenguaje, este lenguaje suele tener características muy particulares que depende del fabricante del equipo, o del tipo de problema que se desee resolver. Con estos lenguajes los seres humanos construyen paquetes de instrucciones que le dicen a la computadora como resolver problemas.  Los paquetes de instrucciones se conocen como programas.

El lenguaje más primitivo de la computadora es muy difícil de comprender para un ser humano, y no es entendible  para alguien que no tenga experiencia en él. Es conocido como lenguaje máquina, algunos también lo llaman “ensamblador” porque con él se ensamblan las instrucciones de mayor nivel. Al lenguaje ensamblador se le conoce también como lenguaje de primer nivel. Cada tipo de computadora o plataforma (PC, Mac, as400, etc.) tiene su propio lenguaje ensamblador.

Con los lenguajes de primer nivel se construyen otros lenguajes, estos son comprensibles para los humanos pues son parecidos a las matemáticas o al inglés y son llamados lenguajes de alto nivel. El primero que se desarrolló fue el lenguaje FORTRAN, después han surgido cientos de lenguajes, cada uno con características definidas, con sus propias reglas y enfocados a algún ámbito de problemas.

Sobre los lenguajes  de alto nivel, se pueden construir lenguajes más elaborados y que por regla están limitados por el sistema operativo sobre el que trabajan. Estos son llamados lenguajes de cuarta generación, en el cual encontramos C++ 


Para poder comprender el lenguaje de programación C++ estudiaremos primero su historia y descubrir las razones que inspiraron a su fundador a crearlo, para así poder entender sus conceptos básicos: las funciones, las bibliotecas y los objetos. También es muy importante comprender las diferencias entre su antecesor  C y C++ y las diferentes implementaciones y compiladores del lenguaje, finalizando en las grandes ventajas que tienen los programadores al elegir C++ como su lenguaje predeterminado para programar. 

OBJETIVOS


·      Objetivo General.

Investigar y dar a conocer la historia de C++, las razones por las cuales su creador toma la decisión de diseñarlo y el impacto que tuvo su invención en el mundo de la programación.

·      Objetivos Específicos.
 1.      Investigar, describir e identificar los elementos básicos que componen C++ para así entender la razón por la cual dicho lenguaje fue diseñado.

      2.      Describir y comprender las diferencias entre C++ y lenguajes anteriores a su creación.

3.      Describir como la invención de nuevo lenguaje lleva al diseño de diferentes entornos de desarrollo integrados e identificarlos unos de otros.  

domingo, 21 de abril de 2013

C++

C++ es uno de los lenguajes de programación con más uso, multiparadigma, soporta tanto programación orientada a objetos como estructurada. Fue creado 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.
C++ evolucionó de C, que a su vez evoluciono de dos lenguajes anteriores (BCLP y B). C utiliza muchos conceptos importantes de estos últimos.

Historia de C++

La historia de C surge a partir de un lenguaje anterior: llamado B, escrito por Kenneth L. Thompson en 1969, el cual es creado con el objeto de recodificar el sistema operativo UNIX. A su vez B se basó en BCPL (Basic Combined Programming Language) el lenguaje diseñado en 1966 por Matrin Richard.
En 1972, Dennis Ritchie (de los Laboratorios Bell de AT&T) diseña finalmente C a partir del B de Thompson, aportando un diseño de tipos y estructuras de datos que consiguen una claridad y eficacia en el lenguaje muy superior. Es un lenguaje que permite realizar una programación estructurada economizando las expresiones, con abundancia de operadores y tipos de datos (aunque los básicos sean pocos), codificando en alto y bajo nivel simultáneamente, reemplazando ventajosamente la programación en ensamblador y permitiendo una utilización natural de las funciones primitivas del sistema. Además, no está orientado a ningún área en especial y sobre todo consigue un código objeto altamente optimizado que repercute en que los programas son muy rápidos.
Inicialmente, C se hizo popular como un programa de desarrollo para el sistema operativo UNIX. En la actualidad, la mayor parte de los sistemas operativos se escriben en C y/u C++. C está disponible para la mayoría de las computadoras y es independiente del hardware. Con un diseño cuidadoso, es posible escribir programas en C que sean portables para la mayoría de computadoras.
Durante muchos años C se maneja bajo un estilo no estandarizado. Lamentablemente, el amplio uso de C con diversos tipos de computadoras (a las que algunas veces se les denomina plataformas de hardware) produjo muchas variaciones de manera que esto fue un gran problema para los desarrolladores de programas, quienes necesitaban escribir programas portables que pudieran ejecutarse en varias plataformas.
Fue entonces que surgió la necesidad de crear una versión estándar de C. el instituto nacional estadounidense de estándares (ANSI) cooperó con la Organización Internacional para la Estandarización (ISO) para así homogenizar C a nivel mundial.
Paralelamente, en 1980 surge C++ de  la mano de Bjarne Stroustrup (también de Laboratorios Bell de AT&T) quien diseña este lenguaje con  el objetivo de añadir nuevas características, entre ellas clases y funciones virtuales, tipos genéricos y expresiones, la posibilidad de declarar variables en cualquier punto del programa, y sobre todo, un auténtico motor de objetos con herencia múltiple que permite combinar la programación imperativa de C con la programación orientada a objetos.
Estas nuevas características mantienen siempre la esencia del lenguaje C: otorgan el control absoluto de la aplicación al programador, consiguiendo una velocidad muy superior a la ofrecida por otros lenguajes. El siguiente hecho fundamental en la evolución de C++ es, sin duda, la incorporación de la librería STL (Standard Template Library) años más tarde, obra de Alexander Stepanov y Adrew Koening. Esta librería de clases con contenedores y algoritmos genéricos proporciona a C++ una potencia única entre los lenguajes de alto nivel.



Debido al éxito del lenguaje, en 1990 se reúnen las organizaciones ANSI e ISO para definir un estándar que formalice el lenguaje. El proceso culmina en 1998 con la aprobación del ANSI C++.

¿Qué inspiró a Bjarne Stroustrup a crear C++?

 
Bjarne Stroustrup.
Posee una Maestría en Matemáticas y Ciencias de la Computación (1979) por la Universidad de Aarhus, Dinamarca, y un Doctorado en Ciencias de la Computación (1979) por la Universidad de Cambridge, Inglaterra. Anteriormente trabajó a la cabeza del departamento de Investigación en Programación de los laboratorios Bell de AT&T, desde su creación en 1980 hasta finales de 2002.
En sus propias palabras, lo que lo inspiró se resume a que en tiempos anteriores, los programadores tenían que escribir su código para trabajar directamente con el hardware (es decir, se hacía en lenguaje de máquina). Con lo cual se podían crear muy buenos trabajos, pero era algo muy especializado y complejo. Luego se dieron cuenta de que se podían construir lenguajes aptos para los seres humanos, orientados a áreas específicas. Así  se diseñó FORTRAN para ingenieros y científicos, y COBOL fue diseñado para empresarios.
Luego, a mediados de los 60's, un grupo de noruegos, sobre todo Ole-Johan Dahl y Kristen Nygaard, pensaron en obtener un tipo de lenguaje que es apropiado para los seres humanos, en cualquier ámbito. Es decir, no sólo para el área de álgebra lineal y de negocios. Y así, construyeron SIMULA que fue el primer lenguaje de Programación Orientada a Objetos que introdujo el concepto de clase, "algo" que se tiene  en el programa para representar un concepto en el mundo de la aplicación. Así, que si se es un matemático, una matriz sería una clase; si se es empresario, un registro de personal podría convertirse en una clase; es decir, se puede representar cualquier cosa como una clase. Y fueron más allá representando las relaciones entre las clases y cualquier relación jerárquica se podía representar como un grupo de clases. Así se podría decir que un camión de bomberos es una especie de camión que a su vez es un tipo de coche que es un tipo de vehículo y organizar las cosas de esa manera. Esto se dio a conocer en computación como la Programación Orientada a Objetos, o también, en alguna variación de ella, como la Abstracción de datos.
El plan de Strousptrup era muy simple: tomar las ideas de abstracción de SIMULA y combinarlas con C: un lenguaje de medio nivel con muchas características de bajo nivel, es decir muy cercano al hardware. Al juntar esas dos ideas se podía hacer abstracción de alto nivel, pero con suficiente eficacia y lo suficientemente cerca del hardware para tareas de computación que realmente demandaban recursos de memoria. He ahí donde surgió C++ que tiene clases como SIMULA pero corre tan rápido como C, por lo que la combinación fue un éxito.

Conceptos Básicos De C++

·      Funciones.      
El lenguaje C++ está basado en el concepto de funciones en donde cada una tiene un nombre y una lista de argumentos. En general se puede dar a una función el nombre que se quiera con excepción de MAIN que se reserva para la función que inicia la ejecución del programa.
Una función es un proceso con entradas y salidas bien definidas. Su implementación práctica también debe ir encaminada a la realización de bloques bien definidos en cuanto al proceso que realicen y los insumos y consumos que requiera. Las funciones reciben datos a través de una lista, y devuelven determinada información de un tipo específico. A la lista de datos que la función recibe, se le conoce con el nombre de lista de parámetros. Las funciones son una de las herramientas más útiles en la programación por que permiten encerrar código  con un nombre e invocarlo a través de él. Con esto los programadores evitan repetir el código cada vez que sea necesario en un programa. Una segunda ventaja adicional es que es posible ocultar código de forma que el usuario de la función no tenga que conocer los detalles del cómo se hacen las cosas.
·      Biblioteca Estándar de C++.
En C++, la biblioteca estándar es una colección de Clases y funciones, escritas en el núcleo del lenguaje. La biblioteca estándar proporciona varios contenedores genéricos, funciones para utilizar y manipular esos contenedores, funciones objeto, cadenas y flujos genéricos (incluyendo E/S interactiva y de archivos) y soporte para la mayoría de las características del lenguaje. La biblioteca estándar de C++ también incorpora la ISO C90 biblioteca estándar de C. Las características de la biblioteca estándar están declaradas en el espacio de nombres (namespace) std.
La Standard Template Library es un subconjunto de la biblioteca estándar de C++ que contiene los contenedores, algoritmos, iteradores, funciones objeto, etc.; aunque algunas personas utilizan el término STL indistintamente con la biblioteca estándar de C++
·      Biblioteca Estándar de Plantillas (STL, Standard Template Library)
Los lenguajes de programación suelen tener una serie de bibliotecas de funciones integradas para la manipulación de datos a nivel más básico. En C++, además de poder usar las bibliotecas de C, se puede usar la nativa STL (Standard Template Library), propia del lenguaje. Proporciona una serie plantillas (templates) que permiten efectuar operaciones sobre el almacenado de datos, procesado de entrada/salida.


·      Objetos en C++
En C++ un objeto es una variable declarada a partir de una clase. Es decir para crear un objeto, primero es necesario crear una clase en la que se declaren las funciones y los datos propios del objeto. Donde los datos se agrupan bajo un solo nombre, cada dato es independiente de los demás e inclusive puede ser de distinto tipo, primero hay que declarar una clase, de la cual se podrían declarar variables que serán las “instancias” de las clases, o para abreviar: los objetos.
Las clases son definiciones de nuevos tipos de datos, con los que estamos teniendo el poder de ampliar a C++ con tipos de nuestra invención.

·      El Concepto de Clase.
Una clase puede ser vista como una plantilla generadora de objetos que poseen información y conoce los métodos con los cuales realiza su trabajo. Es una colección de elementos agrupados como un dato compuesto más abstracto. Ningún miembro puede ser accedido individualmente sin referirse a la variable más grande de la cual forma parte.
Una clase consta de:
o   Identidad, que lo diferencia de otros objetos (Nombre que llevara la clase a la que pertenece dicho objeto).
o   Métodos  (funciones) miembro.
o   Atributos (variables) miembro.

Diferencias entre C y C++

“C++ ha evolucionado para satisfacer las necesidades de sus usuarios; la experiencia de usuarios de diversa formación trabajando en un amplio espectro de aplicaciones ha guiado su evolución (…) Tiempos y espacios de procesamientos de C se consideran inaceptables para C++”.
-BJARNE STROUSTRUP.

 

C tiene los mecanismos básicos para expresar cálculos. Tiene iteraciones, tiene tipos de datos, tiene funciones y eso es todo. Pero no entra en el área de expresar abstracciones.
Así si por ejemplo se quiere hacer una matriz en C, se tiene que declarar una matriz y luego arreglos pero cuando quiero obtener el tercer elemento de la matriz hay que programar el camino hacia el ese tercer elemento.
En C++ se puede definir algo, un concepto abstracto y llamarlo matriz y si no se quiere una matriz rectangular se puede obtener matrices triangulares, cuadradas, etc. Entonces se puede construir ese conjunto de conceptos y luego se programan directamente.
Es más fácil de programar, es más fácil de depurar y, a veces es incluso más fácil para optimizar el rendimiento cuando se expresan las ideas a nivel superior, por qué es el mismo nivel en que opera un experto en el campo. Así, la finalidad principal es llevar de un nivel o lenguaje del hardware a un nivel más humano.
El lenguaje C++ posee una serie de características que lo hacen distinto del lenguaje C. Aunque es posible verlo como una simple extensión del lenguaje C, en realidad implica un cambio en la forma de pensar por parte del programador.
·         El compilador. Es evidente que el compilador de C estándar no acepta los programas de C++. Pero un compilador de C++ puede aceptar los programas de C sin muchos cambios. Es conveniente tener en cuenta que C++ es un lenguaje que cuida mucho más tipología de datos. El compilador de C++ típico no aceptará conversiones a menos que exista una conversión explícita de datos. Esto implica que las funciones prototipo son ahora más necesarias y que los tipos de entrada y salida de las funciones son más importantes de lo que eran en C.


·         Clase iostream. Al igual que en el lenguaje C estándar, C++ no posee una función determinada para las salidas y las entradas, en su lugar hace uso de la corriente o flujo de salida (stream: flujo, alusión a la corriente de datos generada en una operación de entrada y salida).
El operador << se utiliza con el archivo de cabecera iostream.h. En general se encuentra asociada a un dispositivo de almacenamiento temporal conocido como COUT. Este operador despliega en dispositivo de salida los argumentos que se colocan a su derecha.

·         Argumentos por omisión. En el lenguaje C no es posible dejar de incluir un argumento dentro de una lista de parámetros. En C++ es posible definir una serie de valores por omisión, es decir, si el usuario de una función omite enviar un valor de parámetro, la función asignara un valor predefinido a dicho argumento. Para ello basta con añadir en la declaración de la función el nombre del argumento seguido por el signo de asignación y el valor que tomará la variable en caso de que no se envié el correspondiente valor.

·         Funciones en línea (inline). Para explicar esta característica es necesario recordar como genera el compilador el código de una función. La declaración de una variable genera un espacio en la memoria para que pueda almacenar sus datos y cualquier invocación posterior se traduce como un acceso a dicha zona de la memoria. Con este método no importa que la función sea llamada en múltiple ocasiones porque el código solo se encontrará una sola vez en memoria.
Todo es conveniente cuando se realiza la invocación de una función con cierta carga de procesamiento, pero a veces puede resultar caro en términos de velocidad. Por eso C++ proporciona un mecanismo en el que el código de la función se inserta en la línea de código que realiza la llamada. Si el programa define una función en línea que se invoca siendo 132 veces, entonces el código se repite 132 veces en el ejecutable resultante. Se aumenta el tamaño del binario pero la velocidad se incrementa, pues el efecto final es como si se hubiese repetido el código sin invocar ninguna función.
Una función en línea funciona de la misma forma que una macro del procesador. El código definido dentro de una especificación en línea es repetido en todas las referencias en la llamada. Eso es muy benéfico, porque existen menos riesgos de equivocación en los programas de comportamiento inesperado.
·         Argumento por referencia. C++ utiliza un nuevo tipo de paso de parámetros; este tipo de llamado es conocido como envío por referencia; por él, se puede lograr la modificación de los valores de la variable       que se envíe dentro de la función, pero con la claridad en la sintaxis que tiene el envío por valor. La sintaxis asociada a los punteros que confunde frecuentemente a los programadores se puede evitar con el envío por referencia.
·         Sentencias new y delete. El lenguaje C++ dispone de dos nuevas sentencias, las cuales nos sirven para crear y destruir objetos.
En C al alojar una estructuras bajo asignación dinámica de memoria, utilizábamos la función malloc() para realizar una petición de memoria. A su vez, para liberar la memoria obtenida a través de la función malloc(), se utilizaba la función free(). En C++ podemos utilizar la función delete.
·      Sobrecarga de funciones. En C, no es posible repetir el nombre de dos variables en el mismo ámbito. Es claro que se trata de un error por la ambigüedad en los nombres. De la misma forma no es posible declarar dos funciones con el mismo nombre.
En C++ es posible declarar dos funciones que tengan el mismo nombre, pero posean listas de parámetros diferentes, a esto se le llama sobrecarga de funciones. Las listas de parámetros deben de variar en el número o en el tipo de variable declarada.