2.
Lenguaje de programación C++
2.1
Historia
Hay muchas leyendas
acerca del origen de C y el sistema operativo con el que está íntimamente
relacionado, Unix. Algunas de ellas son:
El desarrollo de C fue el
resultado del deseo de los programadores de jugar con Space Travel. Habían
estado jugando en el mainframe de su compañía, pero debido a su poca capacidad
de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no tenían
suficiente control sobre la nave para evitar colisiones con los asteroides.
Por ese motivo decidieron
portar el juego a un PDP-7 de la oficina que no se utilizaba; pero esa máquina
no tenía sistema operativo, así que decidieron escribir uno. Finalmente decidieron
portar el sistema operativo del PDP-11 que había en su oficina, pero era muy
costoso, pues todo el código estaba escrito en lenguaje ensamblador.
Entonces decidieron usar
un lenguaje de alto nivel y portátil para que el sistema operativo se pudiera
portar fácilmente de un ordenador a otro. Consideraron usar B, pero carecía de
las funcionalidades necesarias para aprovechar algunas características
avanzadas del PDP-11. Entonces empezaron a crear un nuevo lenguaje, C.
La justificación para
obtener el ordenador original que se usó para desarrollar Unix fue crear un
sistema que automatizase el archivo de patentes. La versión original de Unix se
desarrolló en lenguaje ensamblador. Más tarde, el lenguaje C se desarrolló para
poder reescribir el sistema operativo.
En 1973,
el lenguaje C se había vuelto tan potente que la mayor parte del kernel Unix,
originalmente escrito en el lenguaje ensamblador PDP-11/20, fue reescrita en C.
Éste fue uno de los primeros núcleos de sistema operativo implementados en un
lenguaje distinto al ensamblador. (Algunos casos anteriores son el sistema
Multics, escrito en PL/I, y Master Control Program para el B5000 de Burroughs,
escrito en ALGOL en 1961).
2.2 Características
·
Propiedades
Un núcleo del lenguaje simple, con funcionalidades añadidas importantes,
como funciones matemáticas y de manejo de archivos, proporcionadas por bibliotecas.
Es un lenguaje muy flexible que permite programar con múltiples estilos.
Uno de los más empleados es el estructurado "no llevado al extremo"
(permitiendo ciertas licencias de ruptura).
Un sistema de tipos que impide operaciones sin sentido.
Usa un lenguaje de preprocesado,
el preprocesador de C, para tareas como definir macros e incluir
múltiples archivos de código fuente.
Acceso a memoria de bajo nivel mediante el uso de punteros.
Interrupciones al procesador con uniones.
Un conjunto reducido de palabras
clave.
Por defecto, el paso de parámetros a una función se realiza
por valor. El paso por referencia se consigue pasando explícitamente a las
funciones las direcciones de memoria de dichos parámetros.
Punteros a funciones y variables estáticas, que permiten una forma
rudimentaria de encapsulado y polimorfismo.
Tipos de datos agregados (struct) que
permiten que datos relacionados (como un empleado, que tiene un id, un nombre y
un salario) se combinen y se manipulen como un todo (en una única variable
"empleado").
·
Carencias
Recolección de basura nativa, sin
embargo se encuentran a tal efecto bibliotecas como la "libgc"
desarrollada por Sun Microsystems, o el Recolector de
basura de Boehm.
Soporte para programación orientada a objetos,
aunque la implementación original de C++ fue un preprocesador que traducía
código fuente de C++ a C. Véase también la librería GObject.
Funciones anidadas, aunque GCC tiene esta característica como extensión.
Soporte nativo para programación multihilo.
Disponible usando librerías como libpthread.
Aunque la lista de las características útiles de las que carece C es larga,
este factor ha sido importante para su aceptación, porque escribir rápidamente
nuevos compiladores para nuevas plataformas, mantiene lo que
realmente hace el programa bajo el control directo del programador, y permite
implementar la solución más natural para cada plataforma. Ésta es la causa de
que a menudo C sea más eficiente que otros lenguajes. Típicamente, sólo la
programación cuidadosa en lenguaje ensamblador produce un
código más rápido, pues da control total sobre la máquina, aunque los avances
en los compiladores de C y la complejidad creciente de los microprocesadores modernos
han reducido gradualmente esta diferencia.
En algunos casos, una característica inexistente puede aproximarse. Por
ejemplo, la implementación original de C++ consistía en un preprocesador que
traducía código fuente C++ a C. La mayoría de las funciones orientadas a
objetos incluyen un puntero especial, que normalmente recibe el nombre
"this", que se refiere al objeto al que pertenece la función.
Mediante el paso de este puntero como un argumento de función, esta
funcionalidad puede desempeñarse en C. Por ejemplo, en C++ se puede escribir:
stack.push(val);
Mientras que en C se podría escribir:
push(stack, val);
Donde el argumento stack es un puntero a una struct equivalente al puntero this de
C++, que es un puntero a un objeto.
·
Ventajas
Lenguaje muy eficiente puesto que es posible utilizar sus características
de bajo nivel para realizar implementaciones óptimas.
A pesar de su bajo nivel es el lenguaje más portado en existencia, habiendo compiladores para
casi todos los sistemas conocidos.
Proporciona facilidades para realizar programas modulares y/o utilizar
código o bibliotecas existentes.
·
Inconvenientes
El mayor problema que presenta el lenguaje C frente a los lenguajes de tipo de dato dinámico
es la gran diferencia en velocidad de desarrollo: es más lento programar en C,
sobre todo para el principiante. La razón estriba en que el compilador de C se
limita a traducir código sin apenas añadir nada. La gestión de la memoria es un
ejemplo clásico: en C el programador ha de reservar y liberar la memoria
explícitamente. En otros lenguajes (como BASIC, Matlab o C#) la memoria es
gestionada de forma transparente para el programador. Esto alivia la carga de
trabajo humano y en muchas ocasiones evita errores, aunque también supone mayor
carga de trabajo para el procesador.
El mantenimiento en algunos casos puede ser más difícil y costoso que con
ciertos lenguajes de más alto nivel. El código en C se presta a sentencias
cortas y enrevesadas de difícil interpretación.
Cabe destacar el contexto y época en la que fue desarrollado C. En aquellos
tiempos existían muy pocos programadores, los cuales, a su vez, eran
prácticamente todos expertos en el área. De esta manera, se asumía que los
programadores eran conscientes de sus trabajos y capaces de manejar
perfectamente el lenguaje. Por esta razón es muy importante que los recién
iniciados adopten buenas prácticas a la hora de escribir en C y manejar la
memoria, como por ejemplo un uso intensivo de indentación y
conocer a fondo todo lo que implica el manejo de punteros y direcciones de
memoria.
2.3 Componentes del lenguaje C++
El lenguaje
de programación C++ está caracterizado por ser de uso general, con una sintaxis
sumamente compacta y de alta portabilidad. Es común leer que se caracteriza
como un lenguaje de “alto nivel”, maneja los elementos básicos presentes en
todas las computadoras: caracteres, números y direcciones. Esta particularidad,
junto con el hecho de no poseer operaciones de entrada salida, manejo de
arreglo de caracteres, de asignación de memoria, puede al principio parecer un
grave defecto; sin embargo el hecho de que estas operaciones se realicen por
medio de llamadas a Funciones contenidas en Librerías externas al lenguaje en
sí, es el que confiere al mismo su alto grado de portabilidad, independizándolo
del “Hardware” sobre el cual corren los programas
Un
programa en C++ está definido por funciones (grupo de instrucciones que pueden
o no hacer algún cálculo), donde la función principal debe ser llamada main.
La
composición general de un programa en C++ es:
·
Directivas
de preprocesamiento.
·
Declaraciones
globales.
·
Función
main.
·
Funciones
definidas por el usuario.
·
Comentarios
para entender el funcionamiento del programa.


Comentarios
Publicar un comentario