3.2.- Lenguajes De Programación

Un lenguaje de programación es un lenguaje formal diseñado para expresar procesos que pueden ser llevados a cabo por máquinas como los ordenadores.

Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila (de ser necesario) y se mantiene el código fuente de un programa informático se le llama programación.

Por algoritmo se entiende el "conjunto de operaciones y procedimientos que deben seguirse para resolver un problema en un número finito de pasos". La palabra "algoritmo" deriva del nombre del matemático árabe Mohamed Ibn Moussa Al Kow Rizmi, quien escribió entre los años 800 y 825 su obra Quitab Al Jabr Al Mugabala, donde se recogía el sistema de numeración hindú y el concepto del cero. Fue Fibonacci, el que tradujo su obra al latín y la inició con las palabras, Algoritmi dicit. El siguiente esquema indica el algoritmo para indicar que un número es mayor que otro.

Diagrama algoritmos

La diferencia entre el lenguaje algorítmico y el informático, es que el algorítmico es aquel por medio del cual se realiza un análisis previo del problema a resolver y encontrar un método que permita resolverlo. El conjunto de todas las operaciones a realizar, y el orden en el que deben efectuarse, se denomina algoritmo. El lenguaje informático es aquel por medio del cual dicho algoritmo se codifica a un sistema comprensible por el ordenador.

Diagrama programación

Una clasificación habitual de los lenguajes es considerar dos grupos según la forma de ejecución en un ordenador, intérpretes y compiladores, según se describe seguidamente.

Un lenguaje se dice que es interpretado, por ejemplo el BASIC original, cuando para ejecutar un programa el lenguaje ha de leer y traducir al lenguaje nativo de la máquina las instrucciones una por una. Como es lógico el proceso se ralentiza, por ejemplo si una operación está dentro de la estructura conocida como ciclo y este se repite 100 veces, el lenguaje tiene que traducir el programa fuente 100 veces al código de la máquina. No todo son desventajas, pues la parte buena de este tipo de lenguajes es que los errores se pueden corregir al momento y seguir fácilmente la ejecución del programa, por lo cual son idóneos, aunque el BASIC no es recomendable, para aprender a programar, proceso en el que da lo mismo la lentitud. Otro ejemplo habitual de lenguaje interpretado es el código HTML con el que se escriben la mayoría de las páginas web, que no es propiamente un lenguaje de programación, sino un conjunto de instrucciones que permiten diseñar el contenido de los documentos). El siguiente esquema muestra como funciona un intérprete:

Intérpretes

Ventajas de los intérpretes

- Su principal ventaja es que permiten una fácil depuración. Permiten una mayor interactividad con el código en tiempo de desarrollo.
- En algunos lenguajes (Smalltalk, Prolog, LISP) está permitido y es frecuente añadir código según se ejecuta otro código, y esta característica solamente es posible implementarla en un intérprete.
- Puede ser interrumpido con facilidad.
- Puede ser rápidamente modificado y ejecutado nuevamente.
- Un Intérprete necesita menos memoria que un compilador.
- Facilita la búsqueda de errores.
- En algunos lenguajes está permitido añadir código según se ejecuta otro código.
- Menor consumo de memoria.
Desventajas de los intérpretes

- Lentitud de ejecución, ya que al ejecutar a la vez que se traduce no puede aplicarse un alto grado de optimización. Cada instrucción debe ser traducida a código máquina tantas veces como sea ejecutada,
-Durante la ejecución, el intérprete debe residir en memoria ya que no genera código objeto.
-Tamaño del programa objeto, que exige añadir el intérprete al programa propiamente dicho.
Por contra un lenguaje se dice que es compilado, cuando el programa entero se traduce mediante el compilador de dicho lenguaje al código máquina correspondiente y el resultado se almacena de manera permanente en un archivo. De esta forma el programa se ejecutará de forma mucho más rápida que con un intérprete, sobre todo si hay estructuras que se repiten, caso de los ciclos. La principal desventaja es cuando se produce un error, que muchas veces se detecta en el momento de la ejecución, y la corrección no se puede hacer de inmediato, sino que hay que realizar todo el proceso de compilado desde el principio. Un ejemplo típico de lenguaje de este tipo el C ++, ampliamente usado en el desarrollo de programas. El siguiente esquema muestra como trabaja un compilador:
Compiladores

Tipos de compiladores:

- Una sola pasada: examina el código fuente una vez, generando el código o programa objeto.

- Pasadas múltiples: requieren pasos intermedios para producir un código en otro lenguaje, y una pasada final para producir y optimizar el código producido durante los pasos anteriores.

- Optimación: lee un código fuente, lo analiza y descubre errores potenciales sin ejecutar el programa.

- Compiladores incrementales: generan un código objeto instrucción por instrucción (en vez de hacerlo para todo el programa) cuando el usuario teclea cada orden individual. El otro tipo de compiladores requiere que todos los enunciados o instrucciones se compilen conjuntamente.

- Ensamblador: el lenguaje fuente es lenguaje ensamblador y posee una estructura sencilla.

- Compilador cruzado: se genera código en lenguaje objeto para una máquina diferente de la que se está utilizando para compilar. Es perfectamente normal construir un compilador de Pascal que genere código para MS-DOS y que el compilador funcione en Linux y se haya escrito en C++.

- Compilador con montador: compilador que compila distintos módulos de forma independiente y después es capaz de enlazarlos.
- Autocompilador: compilador que está escrito en el mismo lenguaje que va a compilar. Evidentemente, no se puede ejecutar la primera vez. Sirve para hacer ampliaciones al lenguaje, mejorar el código generado, etc.

- Metacompilador: es sinónimo de compilador de compiladores y se refiere a un programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje. El desarrollo de los metacompiladores se encuentra con la dificultad de unir la generación de código con la parte de análisis.

- Descompilador: es un programa que acepta como entrada código máquina y lo traduce a un lenguaje de alto nivel, realizando el proceso inverso a la compilación.
Otra modalidad de clasificación de los lenguajes de programación es según su nivel de abstracción, en dos grandes grupos, lenguajes de alto nivel y lenguajes de bajo nivel. El grupo de los de bajo nivel, como su nombre indica, incluye los relacionados íntimamente con la arquitectura de la máquina, por lo que generalmente son específicos de un microprocesador (CPU) y no son válidos para otra diferente.

Dentro de los de estos grupos está el lenguaje máquina, que es programar en el ámbito de la CPU, por lo tanto usando ceros y unos, lenguaje muy difícil y propenso a errores. El otro más conocido dentro de esta categoría es el Ensamblador, que utiliza nemónicos, por ejemplo ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), a escala sencilla, y por lo tanto evita las secuencias de ceros y unos. Aún así es bastante complicado y no es recomendable para usuarios sin amplios conocimientos.

Seguidamente se muestra un programa en lenguaje ensamblador para CPU Intel, que muestra en pantalla el texto "Universidad de Murcia",

.model tiny .data message db 'Universidad de Murcia'
.code org 100h
start: mov ah,9 mov dx,offset message int 21h
ret end start
Mientras que en un lenguaje de alto nivel como el Pascal, se escribiría de forma muy sencilla,

program UniMurcia;
begin writeln('Universidad de Murcia'); end.


En conclusión, un lenguaje de bajo nivel está orientado hacia una determinada máquina o clases de ordenadores, es decir es específico de un tipo de CPU concreta. Mientras que un lenguaje de alto nivel es independiente del microprocesador del ordenador que lo soporta, así por ejemplo un programa escrito en lenguaje C, se puede compilar sin modificar para cualquier máquina, y en principio funcionará sin ningún problema.

Esto implica dos ventajas principales, una es que la persona que desarrolla los programas no ha de saber nada acerca del ordenador en que se ejecutará el programa, la otra es que los programas son portables, es decir el mismo programa (en teoría) ha de funcionar sobre distintos tipos de ordenadores.

El desarrollo de los lenguajes de alto nivel comenzó a mediados de los años cincuenta del siglo pasado, en esta época se crearon los lenguajes COBOL, Fortran y ALGOL60. Posteriormente han ido originándose otros muchos, aunque sobreviven muy pocos.

Seguidamente se citan algunos lenguajes de alto nivel:

JAVA, BASIC, FORTRAN, MODULA 2, Pascal, ADA, C, C ++, LOGO, LISP, PROLOG, Ruby, Dart.

Una tercera forma de clasificar los lenguajes de programación es según el paradigma de programación, declarativo, imperativo, orientado a objetos y funcional. Los imperativos establecen cómo debe ejecutarse una tarea fraccionándola en procedimientos que especifican cada una de las tareas, por ejemplo C, Fortran y Pascal. Por el contrario los declarativos establecen estructuras de datos y las relaciones entre ellos que son significativas para ejecutar una tarea determinada, al tiempo que indican cual es el objetivo de dicha tarea. Un lenguaje típico de este grupo es el Prolog. El orientado a objetos usa objetos y sus interacciones para diseñar aplicaciones y programas de ordenador; está basado en varias técnicas, incluyendo herencia, modularidad, polimorfismo y encapsulamiento, Smalltalk es el lenguaje más representativo de este tipo. Funcional es un paradigma de programación declarativo basado en la utilización de funciones matemáticas, el lenguaje más representativo es LISP (procesado de listas). Aunque puede seleccionarse la forma pura de estos paradigmas a la hora de programar, en la práctica es habitual que se mezclen, dando lugar a la programación multiparadigma.