Historia de la Programación
Gottfried Wilheml von Leibniz (1646-1716), quien aprendió matemáticas de
forma autodidacta (método no aconsejable en programación) construyó una máquina
similar a la de Pascal, aunque algo más compleja, podía dividir, multiplicar y
resolver raíces cuadradas.
Pero quien realmente
influyó en el diseño de los primeros computadores fue Charles Babbage (1793-1871).
Con la colaboración de la
hija de Lord Byron, Lady Ada
Countess of Lovelace (1815-1852),
a la que debe su nombre el lenguaje ADA creado por el DoD (Departamento de
defensa de Estados Unidos) en los años 70. Babbage diseñó y construyó la
"máquina diferencial" para el cálculo de polinomios. Más tarde diseñó
la "máquina analitica" de propósito general, capaz de resolver
cualquier operación matemática. Murió sin poder terminarla, debido al
escepticismo de sus patrocinadores y a que la tecnología de la época no era lo
suficientemente avanzada. Un equipo del Museo de las Ciencias de Londres, en
1991, consiguió construir la máquina analítica de Babbage, totalmente
funcional, siguiendo sus dibujos y especificaciones.
Un hito importante en
la historia de la informática fueron las tarjetas perforadas como medio para
"alimentar" los computadores. Lady Ada Lovelace propuso la
utilización de las tarjetas perforadas en la máquina de Babbage. Para que se
enteren todos esos machistas desaprensivos, el primer programador/a fue una
mujer. En 1880 el censo en Estados Unidos tardó más de 7 años en realizarse. Es
obvio que los datos no eran muy actualizados. Un asistente de la oficina del
censo llamado Herman Hollerit (1860-1929) desarrolló un sistema para
automatizar la pesada tarea del censo. Mediante tarjetas perforadas y un
sistema de circuitos eléctricos, capaz de leer unas 60 tarjetas por minuto
realizó el censo de 1890 en 3 años ahorrando tiempo y dinero. Más tarde fundó
la Tabulating Machine Company y en 1924 tras alguna que otra fusión nació la
Internacional Bussines Machines, IBM.
Las computadoras de
hoy en día se sustentan en la lógica
matemática basada en unsistema
binario. Dicho sistema se implementa sobre dispositivos electrónicos que
permiten, o no, pasar la corriente, con lo que se consiguen los 2 estados
binarios: 0 y 1. A mediados del siglo XX, cuando se empezaron a construir las
primeras computadoras digitales, se utilizaban tubos de vacío para implementar
los 2 estados binarios, pero ¿ cómo aparecieron estos conceptos ? Alan Mathison Turing (1912-1954) diseñó una calculadora
universal para resolver cualquier problema, la "máquina de Turing".
Tuvo mucha influencia en el desarrollo de la lógica matemática. En 1937 hizo
una de sus primeras contribuciones a la lógica matemática y en 1943 plasmó sus
ideas en una computadora que utilizaba tubos de vacío. George Boole (1815-1864) también contribuyó al
algebra binaria y a los sistemas de circuitos de computadora, de hecho, en su
honor fue bautizada el álgebra booleana.
La primera
computadora digital electrónica patentada fue obra de John Vincent Atanasoff (1903-1995). Conocedor de las inventos
de Pascal y Babbage, y ayudado por Clifford
Berry (1918-1963), construyó
el Atanasoff Berry Computer (ABC). El ABC se desarrolló entre 1937 y 1942.
Consistía en una calculadora electrónica que utilizaba tubos de vacío y estaba
basada en el sistema binario (sistema numérico en el que se combinan los
valores verdadero y falso, o 0 y 1).
Entre 1939 y 1944, Howard Aiken (1900-1973) de la universidad de
Harvard en colaboración con IBM desarrolló el Mark 1. Era una computadora
electromecánica de 16 metros de largo y más de dos de alto. Tenía 700.000
elementos móviles y varios centenares de kilómetros de cables. Podía realizar
las cuatro operaciones básicas y trabajar con información almacenada en forma
de tablas.
Por desgracia, los
avances tecnológicos suelen producirse gracias a los militares que se
aprovechan de la ciencia para perfeccionar sus armas. En la Moore School de la
Universidad de Pensilvania se estaba trabajando en un proyecto militar para
realizar unas tablas de tiro para armas balísticas. Los cálculos eran enormes y
se tardaban semanas en realizarlos. Parece ser que John W. Mauchly (1907-1980), quien dirigía el
departamento de física del Ursine College de Filadelfia vivió en casa de
Atanasoff durante cuatro días a partir del 13 de Junio de 1941, lo que
seguramente aprovechó para conocer las ideas de Atanasoff.
Junto a John Presper Eckert (1919-1995),
Mauchly desarrolló una computadora electrónica completamente operacional a gran
escala, para acelerar los complicados cálculos del proyecto militar de la
universidad Moore. Se terminó en 1946 y se llamó Electronic Numerical
Integrator And Computer (ENIAC). El ENIAC tenía 18.000 tubos electrónicos
integrados en un volumen de 84 metros cúbicos. Pesaba unas 30 toneladas y
consumía alrededor de 100.000 vatios. Su capacidad de cálculo era de 5.000
operaciones por segundo, aunque tenía que programarse manualmente conectándola
a 3 tableros que contenían más de 6000 interruptores. Cargar un programa podía
ser una tarea de varios días. El calor dispado por semejante monstruo debía ser
importante, y se necesitaba una instalación de aire acondicionado. En
definitiva, un ordenador portátil... más o menos.
Puede que no os
suene, pero quien conozca de "los entresijos de la informática"
seguro que considera importante nombrar a Johann
Ludwig Von Neumann (1903-1957),
genio de las matemáticas, quien tuvo el honor de asistir a las clases de Albert
Einstein en la universidad de Berlín. Autor de trabajos de lógica simbólica,
matemática pura y aplicada, física y tecnología, publicó un artículo acerca del
almacenamiento de los programas, en 1945. Proponía que los programas se
guardaran en memoria al igual que los datos, en forma binaria. Esto tuvo como
consecuencia el aumento de velocidad de los cálculos y la ausencia de errores
producidos por fallos mecánicos al programar la máquina mediante cables.
En cuanto a la
aparición de los lenguajes de programación, el archiconocido COBOL, que tantos
problemas causó con el "efecto 2000", fue el primer lenguaje en el que
no había que programar directamente en código binario, y fue Grace Murray Hoper en 1952, una oficial de la Marina de
Estados Unidos desarrolló el primer compilador, un programa que puede traducir
enunciados parecidos al inglés en un código binario comprensible para la
maquina llamado COBOL (COmmon Business-Oriented Languaje).
A partir de ahí, los
avances han sido vertiginosos.
- La utilización del
transistor en las computadoras en 1958, sustituyendo los tubos de vacío
- La aparición del circuito
integrado de mano de Jack Kilby, también en 1958
- La miniaturización de un
circuito electrónico en un chip de silicio en 1961
- El primer microprocesador,
el 4004 de Intel, en 1971
- Gary Kildall crea el sistema
operativo CP/M en 1973
- IBM comercializa el primer
PC en 1980
Recordando a los
primeros tiempos del ENIAC, con enormes computadores, en 1998 se terminó el
proyecto Blue Pacific. La "maquinita" tiene la nada despreciable
cantidad de 5856 procesadores que en conjunto tienen una velocidad de 3'9
teraflops, 2'6 Terabytes de memoria, ocupa 2400 metros cuadrados y tiene un
peso de 47 toneladas. Se utiliza para la simulación de explosiones nucleares, y
"ha salido" por unos 13000 millones de pesetas... baratito.
Tecnología
orientada a Objetos
Hoy en día la tecnología orientada a objetos ya no se aplica solamente a los lenguajes
de programación, además se viene aplicando en el análisis y diseño con mucho
éxito, al igual que en las bases de datos. Es que para hacer una buena
programación orientada a objetos hay que desarrollar
todo el sistema aplicando esta tecnología, de ahí la importancia del análisis y
el diseño orientado a objetos.
La programación orientada a objetos es una de las formas más populares de
programar y viene teniendo gran acogida en el desarrollo de proyectos de
software desde los últimos años. Esta acogida se debe a sus grandes capacidades
y ventajas frente a las antiguas formas de programar.
Una Perspectiva Histórica
Tradicionalmente, la programación fue hecha
en una manera secuencial o lineal, es decir una serie de pasos consecutivos con
estructuras consecutivas y bifurcaciones.
Los lenguajes basados en esta forma de
programación ofrecían ventajas al principio, pero el problema ocurre cuando los
sistemas se vuelven complejos. Estos programas escritos al estilo “espaguetti”
no ofrecen flexibilidad y el mantener una gran cantidad de líneas de código en
sólo bloque se vuelve una tarea complicada.
Frente a esta dificultad aparecieron los
lenguajes basados en la programación estructurada. La idea principal de esta
forma de programación es separar las partes complejas del programa en módulos o
segmentos que sean ejecutados conforme se requieran. De esta manera tenemos un
diseño modular, compuesto por módulos independientes que puedan comunicarse
entre sí. Poco a poco este estilo de programación fue reemplazando al estilo
“espaguetti” impuesto por la programación lineal.
Entonces, vemos que la evolución que se fue
dando en la programación se orientaba siempre a ir descomponiendo más el
programa. Este tipo de descomposición conduce directamente a la programación
orientada a objetos.
Pues la creciente tendencia de crear
programas cada vez más grandes y complejos llevó a los desarrolladores a crear
una nueva forma de programar que les permita crear sistemas de niveles
empresariales y con reglas de negocios muy complejas. Para estas necesidades ya
no bastaba la programación estructurada ni mucho menos la programación lineal.
Es así como aparece la programación orientada a objetos (POO).
La POO viene de la evolución
de la programación estructurada; básicamente la POO simplifica la
programación con la nueva filosofía y nuevos conceptos que tiene. La POO se basa en la dividir
el programa en pequeñas unidades lógicas de código. A estas pequeñas unidades
lógicas de código se les llama objetos. Losobjetos
son unidades independientes que se comunican entre ellos mediante mensajes.
Veamos con mayor detenimiento este tema.
¿Cuáles son las ventajas de un lenguaje
orientado a objetos?
- Fomenta la reutilización y extensión del código.
- Permite crear sistemas más
complejos.
- Relacionar el sistema al
mundo real.
- Facilita la creación de
programas visuales.
- Construcción de prototipos
- Agiliza el desarrollo de
software
- Facilita el trabajo en
equipo
- Facilita el mantenimiento
del software
- Reusabilidad. Cuando hemos diseñado adecuadamente las
clases, se pueden usar en distintas partes del programa y en numerosos
proyectos.
- Mantenibilidad. Debido a la sencillez para abstraer el
problema, los programas orientados a objetos son más sencillos de leer y
comprender, pues nos permiten ocultar detalles de implementación dejando
visibles sólo aquellos detalles más relevantes.
- Modificabilidad. La facilidad de añadir, suprimir o modificar
nuevos objetos nos permite hacer modificaciones de una forma muy sencilla.
- Fiabilidad. Al dividir el problema en partes más
pequeñas podemos probarlas de manera independiente y aislar mucho más
fácilmente los posibles errores que puedan surgir.
La programación orientada a objetos presenta
también algunas desventajas como pueden ser:
- Cambio
en la forma de pensar de la programación tradicional a la orientada a
objetos.
- La
ejecución de programas orientados a objetos es más lenta.
- La
necesidad de utilizar bibliotecas de clases obliga a su aprendizaje y
entrenamiento.
Lo interesante de la POO es que proporciona
conceptos y herramientas con las cuales se modela y representa el mundo real
tan fielmente como sea posible.
El
modelo Orientado a Objetos
Para entender este modelo vamos a revisar 4
conceptos básicos:
- objetos
- clases
- Herencia
- Envío de mensajes
Objetos
Entender que es un objeto es la clave para
entender cualquier lenguaje orientado
a objetos.
Existen muchas definiciones que se le ha dado
al objeto. Primero empecemos
entendiendo que es un objeto del mundo real. Un objeto del mundo real es
cualquier cosa que vemos a nuestro alrededor. Digamos que para leer este
artículo lo hacemos a través del monitor y una computadora, ambos son objetos, al igual que nuestro teléfono celular, un
árbol o un automóvil.
Analicemos un poco más a un objeto del mundo real, como
la computadora. No necesitamos ser expertos en hardware para saber que una
computadora está compuesta internamente por varios componentes: la tarjeta
madre, el chip del procesador, un disco duro, una tarjeta de vídeo, y otras
partes más. El trabajo en conjunto de todos estos componentes hace operar a una
computadora.
Internamente, cada uno de estos componentes
puede ser sumamente complicado y puede ser fabricado por diversas compañías con
diversos métodos de diseño. Pero nosotros no necesitamos saber cómo trabajan
cada uno de estos componentes, como saber que hace cada uno de los chips de la
tarjeta madre, o cómo funciona internamente el procesador. Cada componente es
una unidad autónoma, y todo lo que necesitamos saber de adentro es cómo
interactúan entre sí los componentes, saber por ejemplo si el procesador y las
memorias son compatibles con la tarjeta madre, o conocer donde se coloca la
tarjeta de vídeo. Cuando conocemos como interaccionan los componentes entre sí,
podremos armar fácilmente una computadora.
¿Que tiene que ver esto con la programación?
La programación orientada a objetos trabaja de esta
manera. Todo el programa está construido en base a diferentes componentes (objetos),
cada uno tiene un rol específico en el programa y todos los componentes pueden
comunicarse entre ellos de formas predefinidas.
Todo objeto del mundo real tiene 2 componentes: características y
comportamiento.
Por ejemplo, los automóviles tienen
características (marca, modelo, color, velocidad máxima, etc.) y comportamiento
(frenar, acelerar, retroceder, llenar combustible, cambiar llantas, etc.).
Los objetos de Software, al
igual que los objetos del mundo real,
también tienen características y comportamientos. Un objeto de software mantiene
sus características en una o más "variables", e implementa su
comportamiento con "métodos". Un método es una función o subrutina
asociada a un objeto.
Para redondear estas ideas, imaginemos que
tenemos estacionado en nuestra cochera un Ford Focus color azul que corre hasta
260 km/h. Si pasamos ese objeto del mundo real al mundo del software, tendremos un objeto Automóvil con sus
características predeterminadas:
Marca = Ford
Modelo = Focus
Color = Azul
Velocidad Máxima = 260 km/h
Modelo = Focus
Color = Azul
Velocidad Máxima = 260 km/h
Cuando a las características del objeto le ponemos valores
decimos que el objeto tiene estados. Las
variables almacenan los estados de un objeto en un determinado momento.
Definición teórica: Un objeto es una unidad de
código compuesto de variables y métodos relacionados.
Clases
Una clase es una descripción de datos y
operaciones que describen el comportamiento de cierto tipo de elementos. Por lo
tanto, para que pueda haber objetos, antes debe haberse definido las clases a
las que pertenecerán dichos objetos. No tiene sentido un objeto sin una clase,
ya que el objeto tiene los atributos de la clase a la que pertenece, y recibe
mensajes correspondientes a métodos de la clase a la que pertenece.
Una clase se divide en una parte pública y en una parte privada. El nombre de la clase
debe ser único.
Antes de continuar, recordar cómo era una librería (UNIT) en
Pascal. Tiene una parte donde se declaran las cabeceras de los subprogramas
(ineterface) que prodrán usarse desde los ficheros que usen la librería, y otra parte donde se
implementan dichos subprogramas (implementation).
Parte pública
Describe a qué operaciones responden los
objetos de una clase (cómo se comportan los objetos). En esta parte de la clase
se declaran las cabeceras de los métodos de la clase que podrán ser
"invocados" por los objetos. Es decir, si un método se declara en la
parte pública, podrá ser "invocado" por un objeto de dicha clase, de
lo contrario no podrá ser "invocado" por un objeto. Es la parte
"visible" de la clase, la interfaz de la clase.
Parte privada
Describe los datos de la clase y cómo las
operaciones manipulan dichos datos. Esta parte de la clase es donde se oculta
(encapsula) la información de la clase: datos e implementación de métodos
declarados o no en la parte pública de la clase. Es una parte "no
visible", cada objeto de una determinada clase tiene sus atributos (datos)
y sus métodos.
Herencia
La herencia es uno de los conceptos más
cruciales en la POO. La herencia
básicamente consiste en que una clase puede heredar sus variables y métodos a varias subclases
(la clase que hereda es llamada superclase o clase padre). Esto significa que una subclase,
aparte de los atributos y métodos propios, tiene incorporados los atributos y
métodos heredados de la superclase. De esta manera se crea una
jerarquía de herencia.
Por ejemplo, imaginemos que estamos haciendo
el análisis de un Sistema para una tienda que vende y repara equipos celulares.
Envío de Mensajes
Un objeto es inútil si está aislado. El medio empleado para que un objeto interactúe con otro
son los mensajes. Hablando en términos un poco más técnicos, los mensajes son
invocaciones a los métodos de los objetos.
Características
asociadas al POO
Abstracción
La abstracción consiste en captar las
características esenciales de un objeto, así como su
comportamiento. Por ejemplo, volvamos al ejemplo de los automóviles, ¿Qué
características podemos abstraer de los automóviles? O lo que es lo mismo ¿Qué
características semejantes tienen todos los automóviles? Todos tendrán una
marca, un modelo, número de chasis, peso, llantas, puertas, ventanas, etc. Y en
cuanto a su comportamiento todos los automóviles podrán acelerar, frenar,
retroceder, etc.
En los lenguajes de programación orientada a objetos, el concepto de clase es la representación
y el mecanismo por el cual se gestionan las abstracciones.
Por ejemplo, en Java tenemos:
public class Automovil {
// variables
// métodos
}
// variables
// métodos
}
Encapsulamiento
El encapsulamiento consiste en unir en la clase las características y
comportamientos, esto es, las variables y métodos. Es tener todo esto es una
sola entidad. En los lenguajes estructurados esto era imposible. Es evidente
que el encapsulamiento se logra gracias a la abstracción y el ocultamiento que
veremos a continuación.
La utilidad del encapsulamiento va por la
facilidad para manejar la complejidad, ya que tendremos a las clases como cajas negras donde sólo se conoce el
comportamiento pero no los detalles internos, y esto es conveniente porque nos
interesará será conocer qué hace la clase pero no será necesario saber cómo lo hace.
Ocultamiento
Es la capacidad de ocultar los detalles
internos del comportamiento de una clase y exponer sólo los detalles que sean necesarios para el
resto del sistema.
El ocultamiento permite 2 cosas: restringir y
controlar el uso de la clase. Restringir porque
habrá cierto comportamiento privado de la clase que no podrá ser
accedido por otras clases. Y controlar porque
daremos ciertos mecanismos para modificar el estado de nuestra clase y es en estos
mecanismos dónde se validarán que algunas condiciones se cumplan. En Java el
ocultamiento se logra usando las palabras reservadas: public, private y
protected delante de las variables y métodos.
Lenguajes
de Programación Orientado a Objetos
En 1985, E. Stroustrup extendió el lenguaje
de programación C a C++, es decir C con conceptos de clases y objetos, también por esas
fechas se creo desde sus bases el lenguaje EIFFEL.
En 1995 apareció el más reciente lenguaje OO,
Java desarrollado por SUN, que hereda conceptos de C++.
El lenguaje de desarrollo más extendido para
aplicaciones Web, el PHP 5, trae todas las características necesarias para
desarrollar software orientado a objetos.
Además de otros lenguajes que fueron
evolucionando, como el Pascal a Delphi
.
Finalmente también otros lenguajes script
como el ActionScript que si bien no es totalmente orientado a objetos pero sí posee las características.
Análisis
y diseño Orientado a objetos
Para el desarrollo de software orientado a objetos no basta usar un lenguaje orientado a objetos. También se
necesitará realizar un análisis y diseño orientado aobjetos.
El modelamiento visual es la clave para
realizar el análisis OO. Desde los inicios del desarrollo de software OO han
existido diferentes metodologías para hacer esto del modelamiento, pero sin
lugar a duda, el Lenguaje de Modelamiento Unificado (UML) puso fin a la guerra
de metodologías.
Según los mismos diseñadores del lenguaje
UML, éste tiene como fin modelar cualquier tipo de sistemas (no solamente de
software) usando los conceptos de la orientación a objetos. Y además, este lenguaje debe ser
entendible para los humanos y máquinas.
Actualmente en la industria del desarrollo de
software tenemos al UML como un estándar para el modelamiento de sistemas OO.
Fue la empresa Racional que creó estas definiciones y especificaciones del
estándar UML, y lo abrió al mercado. La misma empresa creó uno de los programas
más conocidos hoy en día para este fin; el Racional Rose, pero también existen
otros programas como el Poseidon que trae licencias del tipo community edition
que permiten su uso libremente.
El UML consta de todos los elementos y
diagramas que permiten modelar los sistemas en base al paradigma orientado a objetos. Los modelos orientados a objetos cuando se construyen en forma correcta, son
fáciles de comunicar, cambiar, expandir, validar y verificar. Este modelamiento
en UML es flexible al cambio y permite crear componentes plenamente
reutilizables.
Lenguajes orientados a objetos
Simula (1967) es aceptado como el primer lenguaje que posee
las características principales de un lenguaje orientado a objetos. Fue creado
para hacer programas de simulación, en donde los "objetos" son la
representación de la información más importante. Smalltalk (1972 a 1980) es
posiblemente el ejemplo canónico, y con el que gran parte de la teoría de la
programación orientada a objetos se ha desarrollado.
Entre los lenguajes orientados a objetos se destacan los
siguientes:
- ABAP -> SAP Lenguaje orientado a eventos
- ABL Lenguaje de programación de OpenEdge de Progress Software
- ActionScript
- ActionScript 3
- Ada
- C++
- C#
- Clarion
- Clipper1
- D
- Object Pascal (Embarcadero Delphi)
- Gambas
- GObject
- Genie
- Harbour
- Eiffel
- Fortran 90/95
- Java
- JavaScript2
- Lexico3
- Objective-C
- Ocaml
- Oz
- R
- Pauscal [En español]
- Perl4
- PHP5
- PowerBuilder
- Python
- Ruby
- Self
- Smalltalk6
- Magik (SmallWorld)
- Vala
- VB.NET
- Visual FoxPro7
- Visual Basic 6.0
- Visual DataFle
- Visual Objects
- XBase++
- Lenguaje DRP
- Scala8
Resumen
¿Por qué seguimos buscando nuevas
técnicas de desarrollo? Por el aumento de la complejidad de los sistemas.
En un programa orientado a objetos
tendremos a un conjunto de objetos colaborando entre ellos.
La orientación a objetos
es paradigma de que está de moda para el desarrollo de software.
Un objeto es
una abstracción conceptual del mundo real que se puede traducir a un lenguaje
de programación orientado a objetos.
Un objeto del
mundo real tiene características y comportamientos, y de la misma manera, un objeto del
mundo del software tiene variables y métodos.
Una clase es
una plantilla que define las variables y métodos a ser incluidas en un tipo de objeto específico.
Los objetos también
son llamados instancias de la clase. Los objetos
sólo almacenan su estado.
Dice que un objeto tiene
estado cuando tiene valores en sus variables.
Los objetos se
comunican entre ellos usando los mensajes. Un mensaje es la invocación de un
método del objeto.
La orientación a objetos
requiere de una metodología que integre el proceso de desarrollo y un lenguaje
de modelamiento con herramientas y técnicas adecuadas.
No hay comentarios.:
Publicar un comentario