Historia Y Evolución De Lenguajes De Programación
ScorSMJ7 de Febrero de 2014
3.005 Palabras (13 Páginas)434 Visitas
1. Introducción
Este articulo está dirigido principalmente a aquellas personas que se iniciaron en el mundo de la programación con lenguajes de tercera generación como Pascal y C. Lenguajes de alto nivel y estructurados que hacían de la programación procedural toda un arte. Me refiero específicamente a los compiladores Turbo de Borland que corrían sobre el sistema operativo DOS. Para aquellos programadores, donde cada problema se convertía en un reto por resolver, y a los que el lenguaje les respondía de forma excelente. Para aquellos programadores que ven la programación como un arte, como un reto, y que la toman con pasión, para los que no había nada difícil y todo lo podían resolver tan solo con un compilador clásico de C o Pascal. El artículo quiere mostrar, por qué esos lenguajes se quedan cortos ante los requerimientos de software actuales y porque es necesario cambiarse a la POO.
Es muy seguro, que alguien que aprendió C o Pascal a fondo, conoce también del lenguaje de ensamblado o ensamblador, y porque no hasta del lenguaje de la máquina. Esto, porque algunas aplicaciones que necesitaban mucho más control sobre la máquina o necesitaban usar recursos del sistema operativo requerían de la mezcla del lenguaje de alto nivel con lenguaje ensamblador, y con esa mezcla, el programador terminaba conociendo más a fondo el funcionamiento del PC, y podía lograr hazañas muy interesantes.
Con la aparición de Object Pascal y C++, incorporando a los lenguajes nativos elementos del paradigma Orientado a Objetos, muy pocos eran los programadores que utilizaban las nuevas características y, los que las utilizaban, no lo hacían de la mejor manera. La razón de esto, es que dichos lenguajes, permitían mezclar programación procedural con POO, y los programas terminaban siendo programas procedurales a pesar de utilizar elementos de POO.
La aparición de Windows dejó atrás al DOS, y por lo tanto tenían que aparecer lenguajes para el nuevo sistema operativo. Los nuevos lenguajes visuales insistían un poco más en la POO, pero aún así, se podían seguir construyendo aplicaciones meramente procedurales. Esto permitía que el programador, por estar utilizando herramientas de la POO, se sintiera confiado de estar utilizando el nuevo paradigma y no notaba las verdaderas ventajas éste. Lo que hacía usando POO, lo podía hacer de forma procedural.
Internet y los requerimientos no Funcionales del software como mantenibilidad, flexibilidad, robustez, escalabilidad, entre otros, hacen que características de la POO como la herencia, el polimorfismo y el uso de interfaces para prestar servicios, logren imponer a la POO como una de las mejores opciones para desarrollar software hoy en día. Al usar correctamente la potencia de la orientación a objetos combinada con un buen Framework o Middleware de desarrollo, los "desarrolladores" pueden construir aplicaciones ajustables a las variaciones de los requerimientos tanto funcionales como no funcionales que los clientes necesiten.
Para poder usar correctamente la POO también es necesario que existan herramientas pensadas para ello. Afortunadamente nacieron Java de Sun Microsystems y C# de la plataforma .Net de Microsoft, entre otros. En estos lenguajes, hasta el más mínimo programa es una Clase, lo que hace que el desarrollador piense en términos de clases y de interfaces y empiece a dejar atrás la programación procedural. Aun así, dichos lenguajes no garantizan que los desarrolladores usen correctamente la POO.
2. Evolución de los Lenguajes de Programación
En ésta sección se describirá brevemente cómo han evolucionado los lenguajes de programación, desde el lenguaje de máquina y ensamblador (Bajo Nivel) hasta los lenguajes estructurados y orientados a objetos (Alto Nivel). También se incluye la evolución desde el punto de vista de las generaciones.
2.1. Lenguajes de Bajo Nivel
2.1.1. Lenguaje Máquina
Es el lenguaje que entiende el procesador y está basado en el sistema binario [4]. Está formado por un conjunto de instrucciones o códigos que pueden ser interpretados directamente por el procesador [5]. El lenguaje máquina varía dependiendo del hardware y evoluciona con cada versión del CHIP. Cuando se habla del lenguaje máquina en el IBM PC y compatibles, se habla principalmente de la familia de procesadores Intel 80xX y de su evolución hasta el actual Pentium IV. ´
En cada versión del CHIP Intel se han agregado nuevas funcionalidades, pero Intel siempre ha tratado de mantener la compatibilidad con las versiones anteriores, por lo que se habla de que un programa es compatible con la Familia x86. Según lo anterior, un programa hecho para el 80x386 (Primera versión estable que soporta multi-tarea [4]) debería funcionar aun en los últimos Pentium IV de doble núcleo. La verdad es que si funcionan, pero no utilizan las características nuevas del procesador.
La principal ventaja del lenguaje máquina es su alta velocidad, debida a la traducción inmediata de los códigos binarios. Entre sus muchas debilidades encontramos [1]:
• Codificación compleja: el programador debe entender el significado de los unos y ceros y tener tablas de instrucciones y variables. En los procesadores actuales de 64bits, por ejemplo, una instrucción tiene 64 unos y ceros, lo cual es muy difícil de controlar.
• Errores en la codificación y depuración compleja: debido a la complejidad de los códigos.
• Productividad mínima: tiempos de desarrollo muy altos
• No portabilidad: un programa solo funciona sobre el hardware para el que es hecho.
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 intérprete. 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
...