Evolución de los lenguajes de programación ¿Por qué cambiarse a la Programación Orientada a Objetos? (página 2)
Enviado por Gerson Johan Samaniego Rodr�guez
2.1.2. Lenguaje Ensamblador
Son una representación más entendible para el humano de los códigos del lenguaje máquina. Cada instrucción en lenguaje ensamblador representa una instrucción en el lenguaje máquina [6]. El lenguaje ensamblador aparece casi a la par con el lenguaje máquina, esto debido a que los fabricantes de hardware diseñan sus Chips pensando ya en las instrucciones de un lenguaje de ensamblado.
Un ejemplo de una instrucción en lenguaje máquina y en lenguaje ensamblador:
Tabla 1: Ejemplo de Lenguaje Máquina vs. Lenguaje Ensamblador
Lenguaje Máquina | Lenguaje Ensamblador |
0010111000000001 0000000000001010 | mov ax, 10 |
A pesar de que el lenguaje ensamblador es más fácil de entender por las personas sigue teniendo las desventajas del lenguaje de máquina. Realmente lo que hace es ayudar un poco a que el código sea más legible. El lenguaje ensamblador adicionalmente necesita un traductor (ensamblador) capaz de convertir dichos códigos en lenguaje máquina [1].
Ejemplos de ensambladores: TASM (Turbo Assembler de Borland), MASM (Microsoft Macro Assembler), NASM (Netwide Assembler – Libre).
2.2. Lenguajes de Alto nivel
Son lenguajes más afines con el programador en los que una instrucción puede representar varias instrucciones en lenguaje máquina. Incluyen los lenguajes estructurados y no estructurados. Como ejemplos tenemos: Basic, Pascal, C, APL, FORTRAN (Aplicaciones Científicas) [7], COBOL (para aplicaciones de procesamiento de datos), LISP Y PROLOG (para Inteligencia Artificial), etc.
Los lenguajes de alto nivel necesitan de un traductor que puede ser interpretador o compilador. Los interpretadores o intérpretes, necesitan de un programa auxiliar que traduce en tiempo real las instrucciones al lenguaje máquina, por lo tanto, cada vez que un programa interpretado se ejecuta debe ejecutarse también su interprete. Ejemplos de lenguajes interpretados [7]: Basic, PROLOG, LISP, entre otros.
Los lenguajes compilados son aquellos que necesitan de un compilador para la traducción al lenguaje máquina. La traducción o compilación se hace solo una vez, y el resultado es un código objeto entendible por la máquina. Para ejecutar un programa compilado no se necesita de su compilador. Ejemplos de lenguajes compilados: Pascal, C, Fortran, Cobol, Modula-2 (evolución del Pascal), etc.
Algunas de las características de los lenguajes de alto nivel [1]:
- Depuración más sencilla: Debido a que el código es más legible, la depuración también se hace más fácil. Con la ayuda editores (IDEs – Entornos de Desarrollo Integrados) la compilación, depuración y ejecución se hacen más fácilmente.
- Productividad aceptable: son más productivos que los lenguajes de alto nivel.
- Algunos permiten la Portabilidad: generalmente los interpretados.
Los lenguajes estructurados, existen controles que le dan secuencia ordenada a la ejecución del código. Dichos controles se implementan con estructuras definidas que permiten bifurcaciones condicionadas o ciclos repetitivos. Los lenguajes estructurados hacen que el programador desarrolle sus algoritmos disciplinadamente.
Una rama de los lenguajes de alto nivel son los lenguajes procedurales, donde la unidad funcional es el procedimiento. Los procedimientos implementan la lógica de caja negra donde existen unas entradas y unas salidas y al programador que usa el procedimiento no le interesa su funcionamiento interno sino su funcionalidad.
Java y los lenguajes .Net de Microsoft también forman parte de los lenguajes de alto nivel, pero para éste articulo es más importante su clasificación dentro de los lenguajes Orientados a Objetos.
2.3. Generaciones de los lenguajes de programación
La evolución de los lenguajes de programación es vista también desde el punto de vista de las generaciones. Los lenguajes de primera generación son los mismos lenguajes del nivel de la máquina. Los lenguajes de segunda generación son los ensambladores. Y Los lenguajes de tercera generación son los nombrados en los lenguajes de alto nivel [8].
Una cuarta generación de lenguajes de programación es aun confusa por definir, algunos autores la relacionan con lenguajes visuales con facilidades para acceso a bases de datos que aparecieron para desarrollar bajo la plataforma Windows [9]. Entre ellos encontramos los lenguajes del Visual Studio de Microsoft (como Visual Basic, Visual FoxPro, Visual C++); las herramientas de Borlad (Delphi, JBilder, C++ Builder); entre otros. Otros autores incluyen específicamente los lenguajes Orientados a Objetos [8].
También se pueden incluir en ésta generación, las herramientas que generan el código a partir de plantillas y configuraciones [10], lenguajes de consulta como SQL [10], los lenguajes script (JavaScript, VBScript) y los lenguajes de marcado (HTML, XML).
- Lenguajes Orientados a Objetos
La Programación Orientada a Objetos (POO) no es algo nuevo, pues existe desde los años 60 con lenguajes como Smaltalk, Simula y Ada. Se ha hecho más popular en los últimos 10 años con la aparición de Java y C# [1]. La POO es una extensión de los lenguajes de alto nivel estructurados que trata de representar de una forma más sencilla el modelo del mundo real.
La POO intenta resolver principalmente los problemas de la Ingeniería del Software como: portabilidad, reusabilidad, mantenibilidad, entre otros [11]. Para ello se base en características claves como el encapsulamiento, la herencia, el polimorfismo, y el desarrollo orientado primero hacia el qué, y luego hacia el cómo (interfaces).
El elemento principal de la POO es la Clase, la cual representa abstractamente un elemento del mundo real o una unidad que agrupa propiedades y funcionalidades comunes. Una instancia de una clase es un Objeto el cual tiene atributos y métodos. Los métodos modifican los atributos o prestan algún servicio a otros objetos.
La POO debe estar acompañada de un buen diseño que logre una alta cohesión y un bajo acoplamiento, para así poder solucionar los problemas objetivos.
3. Programación Orientada a Objetos
En la Programación Procedural la unidad básica es el procedimiento, el cual se comporta como una caja negra puede recibir unos parámetros de entrada, los procesa y puede devolver datos de salida [1].
En un programa con procedimientos los datos pueden ser comunes o globales a todos ellos, y no existe un control más detallado de ellos, o no existe una entidad encargada de su ciclo de vida. No existen formas de esconder funcionalidades ni de controlar accesos.
En la Programación Orientada a Objetos la unidad básica es el objeto. Un objeto tiene atributos y métodos que le dan comportamiento. Cada objeto controla sus propios datos y se comunica con otros objetos a través de sus métodos (mensajes). Los objetos encapsulan su funcionamiento mostrando a otros objetos sólo lo necesario.
Algunos conceptos de la POO son muy importantes y se deben tener claros en todo momento. Si no se tienen claros los conceptos, posiblemente nunca se puedan desarrollar verdaderos programas Orientados a Objetos. Los objetos derivan o son instancias de una clase, por lo tanto, tanto el objeto como la clase forman parte de la unidad funcional de la POO. Los siguientes son los elementos más importantes de la POO:
- Herencia: es una propiedad esencial que permite crear clases a partir de otras existentes. [13] Permite organizar los elementos u objetos de forma jerárquica. Se basa principalmente en que un objeto hijo puede heredar las características y comportamientos de otro objeto padre. La herencia es la base principal de la reutilización.
- Polimorfismo: se refiere a clases con nombres y métodos iguales pero con comportamientos diferentes. Una de la forma de implementarlo es mediante clases abstractas. Éstas son clases que definen los métodos pero no implementan su funcionalidad, y dicha funcionalidad puede ser implementada por cualquier otra clase que la herede. Así, se define un marco, y pueden existir muchas implementaciones diferentes.
- Contratos de servicios: las interfaces son una de las herramientas más potentes en la POO. Para los desarrolladores que recién se inician en la POO ver el poder de la interfaces es muy difícil. Su funcionalidad es muy parecida a la del polimorfismo basado en clases abstractas, se trata de definir solo los métodos que una clase debería de implementar. Así, de una misma Interface pueden existir muchas implementaciones diferentes.
El cambio de lo procedural a lo POO es un poco difícil al principio. A pesar de que la POO es más natural, requiere de cierto tiempo para poder acostumbrarse y usarla correctamente, los resultados no son inmediatos [13]. Las buenas prácticas se logran con la experiencia.
Para iniciarse en la POO es recomendable comenzar con un lenguaje que exija una fuerte estructuración OO. Lenguajes como Java y C# son buenos ejemplos. En ellos, hasta el más mínimo programa es una clase, y la documentación se basa interfaces y herencias, por lo que es necesario tener claros esos conceptos. Además es recomendable tener un buen editor que muestre los errores en tiempo de codificación y que ayude también autocompletando código para saber si lo que se esta escribiendo es correcto.
Otro punto clave para tener en cuenta al iniciar, son los métodos estáticos de las clases. Para poder usar una clase normalmente es necesario instanciarla en un objeto. En términos más técnicos, lo que se crea es un espacio en memoria que puede albergar la estructura del objeto, y la variable en la que se instancia la clase, es un puntero a ese espacio de memoria. Algunas clases tienen métodos que se pueden invocar sin necesidad de instanciarlas, éstos métodos se conocen como métodos estáticos y generalmente son transformaciones sobre sus parámetros y realizan procedimientos que no modifican los atributos de la clase.
Ejemplo de instanciación en lenguaje Java:
String cadena = new String("Hola Mundo");
En el ejemplo anterior se crea una nueva instancia (objeto) de la clase String de Java. "cadena" guarda ahora una referencia a un objeto de tipo String.
Lo de los métodos estáticos es clave porque generalmente uno se encuentra con instrucciones comunes como: System.out.println("Hola mundo"); -> Imprime un texto en la salida por defecto. Y se pregunta, pero si todo son clases, a qué horas se hizo new System()…?. En el ejemplo, println es un método estático de la clase PrintStream, out es un atributo estático de tipo PrintStream que pertenece a la clase System. Por lo tanto, por ser out un atributo estático y println un método estático se puede invocar éste último sin necesidad de instanciar System. En Java, la definición del atributo out de la clase System sería:
public class System{
…
public static PrintStream out = new PrintStream(…);
…
}
Y la definición del método println en PrintStream sería algo así:
public class PrintStream extends FileOutputStream {
…
public static void println(String toOut){ … }
…
}
En el ejemplo anterior public static void println (String arg) puede ser solo una de las sobrecargas del método println(). La sobrecarga es otra de las características de la POO y consiste en que un método de una clase puede implementarse varias veces, pero con diferentes parámetros cada vez. Podría existir otro método println (de hecho existen) que en lugar de recibir un String como parámetro recibiera un Long (clase que representa un tipo de dato numérico grande) e imprimiese el número.
En el ejemplo del println también existe una instanciación implícita de una cadena con el uso de las comillas " ", eso es ayuda de Java para no tener que hacer: System.out.println(new String("Hola Mundo")).
4. Internet y los nuevos requerimientos del software
La aparición de Internet cambió el foco de los sistemas informáticos. Industrialmente, son pocas las aplicaciones desktop (de escritorio) que se desarrollan, a menos que se requieran específicamente. Los negocios de una empresa dependen de datos que casi nunca están centralizados, y se necesita que esos datos puedan ser consultados y manipulados por clientes internos y externos vía un navegador de Internet.
El párrafo anterior encierra muchas cosas nuevas para los desarrolladores. Aparecen Requerimientos No funcionales (RNF) del Software que no tienen nada que ver con el proceso de negocio de la empresa sino con limitaciones e imposiciones externas. Saltan a la vista requerimientos como el control de la seguridad, la escalabilidad de la aplicación, alta disponibilidad, interoperatibilidad, etc. [12]
- Seguridad: Autenticación (que el cliente sea quien dice ser), autorización (que el cliente tenga los permisos para ejecutar tareas específicas – roles), datos seguros en la red (que los datos puedan viajar seguros por la red – SSL).
- La escalabilidad tiene que ver con que la aplicación mantenga su rendimiento y tiempos de respuesta aun cuando el número de clientes conectados crece.
- La alta disponibilidad hace referencia al tiempo que una aplicación puede estar fuera de servicio. Generalmente, una aplicación nunca debería caerse.
- La interoperatibilidad permite que la aplicación se comunique con otras aplicaciones usando protocolos estándares como SOAP.
Los anteriores son algunos de los ejemplos de las nuevas tareas de las que tendría que ocuparse un desarrollador en la actualidad. Por suerte, plataformas de desarrollo como el .Net Framework, o contenedores de aplicaciones J2EE, ayudan a solucionar gran parte de éstos problemas.
En cuanto a modelos de componentes y arquitecturas de aplicaciones empresariales, .Net de Microsoft y J2EE de Sun Microsystems, son los competidores más fuertes en la actualidad. Y el punto clave aquí, es que tanto los lenguajes del Visual Studio .Net como Java son Orientados a Objetos, lo que hace pensar que la orientación a Objetos es realmente la mejor opción para desarrollar aplicaciones empresariales de gran escala.
5. Conclusiones
- Los lenguajes de programación han evolucionado para poder representar mejor los problemas del mundo real y hacer las cosas más fáciles para los diseñadores y desarrolladores de software.
- Dado que las arquitecturas empresariales implantadas para solucionar los problemas de la ingeniería del software en la actualidad están pensadas para trabajar con lenguajes Orientados a Objetos, es indispensable que todo desarrollador conozca y se familiarice con la POO.
- Iniciar en la POO puede ser algo complicado al principio, lo ideal es tener las definiciones y conceptos claros, y comenzar con un lenguaje netamente Orientado a Objetos (como Java o C#), además de un buen editor (Eclipse, IDE de Visual Studio).
6. Referencias
- Microsoft .Net, Programción con C# Net, [Documento PDF] disponible en internet:
http://ohm.utp.edu.co/gustavoa/res/Documentos/prog_estruct.doc
- G.A. Betancourt, Programación estructurada antes de programación orientada a objetos. [Documento Word] Disponible en internet:
http://www.ilustrados.com/publicaciones/EpZVVllyAyovOwMHjf.php
- I.A. POOL, Lenguaje Ensamblador. [Página] Disponible en Internet:
- P. Norton y J. Socha. Nueva Guía del programador en ensamblador para IBM PC/XT/AT y compatibles. Anaya Multimedia, S.A., - 1991.
http://es.wikipedia.org/wiki/Lenguaje_m%C3%A1quina
- Wikipedia, Lenguaje máquina. [Página] disponible en Internet:
http://es.wikipedia.org/wiki/Lenguaje_ensamblador
- Wikipedia, Lenguaje ensamblador. [Página] disponible en Internet:
http://www.monografias.com/trabajos/tendprog/tendprog.shtml
- J. Mendez, Las tendencias de los lenguajes de programación. [Página] Disponible en Internet:
http://es.wikipedia.org/wiki/Generaciones_de_lenguajes_de_programaci%C3%B3n
- Wikipedia, Generaciones de los lenguajes de programación. [Página] disponible en Internet:
http://www.monografias.com/trabajos26/lenguajes-programacion/lenguajes-programacion.shtml#estand
- L. Guzman, Lenguajes de Programación. [Página] Disponible en Internet:
- M.M. Marqués, Lenguajes de cuarta generación. Disponible en Internet:
/trabajos/objetos/objetos.shtml
- Lucas, Programación Orientada a Objetos. [Página] Disponible en Internet:
- J. Arias. Arquitectura de Software: Conceptos y Definiciones. Presentación de la clase Arquitectura de Software. Universidad de los Andes, Bogotá – Colombia 2006.
- A. Franco, Programación en lenguaje Java [Sitio Web], Disponible en Internet:
http://www.sc.ehu.es/sbweb/fisica/cursoJava/Intro.htm
Nota: Todas las referencias a Internet se consultaron en la fecha: 26/Sep/2006
Gerson Johan Samaniego Rodríguez
Universidad de los Andes
Maestría en Ingeniería de Sistemas
Página anterior | Volver al principio del trabajo | Página siguiente |