1.1 HISTORIA DE LOS LENGUAJES
Con la idea de facilitarnos las tareas que debemos de desempeñar los humanos, hemos venido inventado diversas herramientas a lo largo de nuestra historia, que nos permiten tener una mejor calidad de vida.
Los ordenadores son uno más de los inventos del hombre, aunque debemos decir que las tecnologías para su fabricación y explotación han tenido un desarrollo sorprendente a partir de la segunda mitad del siglo XX.
Esta herramienta por sí sola no es capaz de efectuar ninguna tarea, es tan sólo un conjunto de cables y circuitos que necesitan recibir instrucción por parte de los humanos para desempeñar alguna tarea. El problema entonces, se puede fijar en ¿cómo vamos a poder hacer que un conjunto de circuitos desempeñen una determinada tarea y nos entreguen los resultados que nosotros esperamos?, es decir, ¿de qué manera se puede lograr la comunicación entre el hombre y el ordenador?
Así pues, tratando de dar una solución al problema planteado, surgieron los lenguajes de programación, que son como un lenguaje cualquiera, pero simplificado y con ciertas normas, para poder trasmitir nuestros deseos al ordenador.
Por otro lado, como se sabe, un conjunto de circuitos no entendería ningún lenguaje que nosotros conozcamos, por más sencillo que éste parezca. Los circuitos en todo caso, sólo reconocen presencia o ausencia de energía, es decir que debemos hablarle a la máquina en su propio lenguaje (presencia y ausencia de energía, 0 y 1), o nuestro lenguaje deberá de ser traducido a un lenguaje binario cuyo alfabeto es el 0 y el 1, mediante las herramientas desarrolladas para llevar a cabo esta tarea, las cuales reciben el nombre de traductores, y como veremos más adelante, los hay de muchos tipos, dependiendo de características más específicas del lenguaje a traducir y de la manera de llevar a cabo su traducción.
Como ya habréis entendido, para crear un lenguaje de programación, deberemos crear la herramienta que lo traduce, y es justamente de ellas, de las que hablaremos a continuación, para describir como han ido evolucionando en los últimos 50 años.
• 1946: Konrad Zuse , un ingeniero Alemán mientras trabajaba en los Alpes de Bavaria, desarrolló el lenguaje Plankalkul, el cual, fue aplicado entre otras cosas para jugar al ajedrez.
• 1949: Aparece Short Code, que viene a ser el primer lenguaje que fue usado en un dispositivo de cómputo electrónico, aunque se debe decir que se trata de un lenguaje traducido a mano.
• 1951: Grace Hopper , trabajando para Remington Rand, comenzó el trabajo de diseño del primer compilador conocido ampliamente, el A-0, el cual, al ser liberado por la compañía en 1957, lo hizo con el nombre de MATH-MATIC.
• 1952: Alick E. Glennie, durante su tiempo libre en la Universidad de Manchester, concibe un sistema de programación llamado AUTOCODE, que viene a ser un compilador muy rudimentario.
• 1957: aparece FORTRAN (FORmula TRANslator) sistema traductor de fórmulas matemáticas. Fue desarrollado por un equipo, al frente del cual se encontraba John Backus quien después vendría a contribuir en el desarrollo del compilador para el lenguaje ALGOL y de la notación usada para la especificación sintáctica de los lenguajes, conocida como BNF (Backus Naur Form).
A partir de los años sesenta, empiezan a surgir diferentes lenguajes de programación, atendiendo a diversos enfoques, características y propósitos, que más adelante describiremos.
Por lo pronto, puede decirse, que actualmente existen alrededor y continuamente, están apareciendo otros más nuevos, que prometen hacer mejor uso de los recursos computacionales y facilitar el trabajo de los programadores.
Tratando de resumir un poco, presentaremos el siguiente cuadro evolutivo, donde aparecen los lenguajes que por su uso y comercialización, han resultado ser los más populares a lo largo de este medio siglo.
La existencia de tantos lenguajes obedece a que cada uno de ellos está encaminado a resolver ciertas tareas, dentro de la amplia problemática de la explotación de la información, o bien, a que su arquitectura, o su forma de llevar a cabo la programación, tiene un enfoque particular.
En esta pagina podrás observar un tabla que contiene la historia de los lenguajes de programación
http://iabot.iespana.es/ciencia/software/historia_lenguajes_programacion.htm
Clasificación según el estilo de programación
De acuerdo con el estilo de programación, podemos clasificar los lenguajes en las siguientes categorías:
* Imperativos: Son aquellos lenguajes, que basan su funcionamiento en un conjunto de instrucciones secuenciales, las cuales, al ejecutarse, van alterando las regiones de memoria donde residen todos los valores de las variables involucradas en el problema que se plantea resolver. Es decir, se cambia progresivamente el estado del sistema, hasta alcanzar la solución del problema.
Como un ejemplo ilustrativo vamos a escribir un programa en un lenguaje de este tipo para calcular el factorial de un número positivo x.
READ(x);
fac := 1 ;
for i = 1 to x do
{
fac := fac * i ;
}
WRITELN(fac);
* Declarativos: En este paradigma, más que el ¿cómo? desarrollar paso a paso un proceso, nos interesa el ¿qué? deseamos obtener a través del programa. Quizás el lenguaje declarativo que nos sea más familiar, es SQL, el cual es utilizado para interactuar con la información de bases de datos, concentrándose (como se podrá observar en el siguiente ejemplo), sólo en los resultados que van a ser obtenidos, dejándole al traductor la tarea de cómo llegar a ellos y presentárnos los SELECT * FROM alumnos WHERE sexo = "M" ORDER BY edad
*Orientados a Objetos: Algunas veces se mezcla con alguno de los otros 2 modelos, sin embargo mantiene características propias, que lo diferencian claramente. Los programas de este tipo, se concentran en los objetos que van a manipular, y no en la lógica requerida para manipularlos. Ejemplos de objetos pueden ser: estudiantes, coches, casas etc, cada uno de los cuales tendrá ciertas funciones (métodos) y ciertos valores que los identifican, teniendo además, la facultad de comunicarse entre ellos a través del paso de mensajes. Cabe mencionar con más detalle los elementos fundamentales que deben de poseer este tipo de lenguajes: o Abstracción: Determinación de las características de los objetos, que sirven para identificarlos y hacerlos diferentes a los demás.
Clasificación según el modo de traducción
Ahora bien, si tomamos como referencia las herramientas usadas en el proceso de traducción y ejecución de los programas, vamos a tener la siguiente clasificación de lenguajes:
- Programa Fuente: escrito por el programador.
- Traductor: programa que logra el entendimiento.
- Programa Objeto: es el que entiende la máquina.
• Lenguajes Ensamblados: Se refieren al lenguaje ensamblador, que viene a ser una representación simbólica de las instrucciones correspondientes al lenguaje ensamblador de alguna arquitectura específica, con lo que, casi siempre, la correspondencia entre las instrucciones de este lenguaje, y las del lenguaje máquina son de 1 a 1, si bien existen algunas excepciones, que dan lugar a lo que se conoce como lenguajes macro-ensambladores.
• Lenguajes Compilados: Son aquellos, que son traducidos de un lenguaje de alto nivel (como FORTRAN o PASCAL) a lenguaje máquina o bien a lenguaje ensamblador, produciendo un programa objeto permanente.
• Lenguajes Interpretados: Estos lenguajes, tienen la particularidad, de que no producen código objeto, sino que cada instrucción es analizada y ejecutada a la vez, lo que ofrece mucha interacción con los usuarios, pero a la vez resultan ineficientes, cuando se desea ejecutar repetitivamente un programa.
• Lenguajes Preprocesados: Son lenguajes que son traducidos primeramente a un lenguaje intermedio de más bajo nivel, para posteriormente volverlos a traducir y producir el programa objeto. Este tipo de lenguajes fueron creados, con la idea de proporcionar un lenguaje más potente que el lenguaje intermedio, mediante la implementación de algunas macroinstrucciones.
Clasificación según el entorno de programación
Finalmente, existen otros conceptos tomados en cuenta para agrupar los lenguajes, que dan origen a diversas clasificaciones, entre los que destacan las siguientes:
• Lenguajes de cuarta generación 4GL: Estos lenguajes se distinguen por formar parte de un entorno de desarrollo, que comprende el manejador de una base de datos, y todo lo que de esto se deriva, como la administración de un diccionario de datos, el control de accesos, el manejo de la consistencia de la información y otras características enfocadas a facilitar los programas de acceso y explotación de la información. Como ejemplos podemos citar a los 4 grandes: PROGRESS, SYSBASE, INFORMIX, y ORACLE.
• Lenguajes Visuales: Se les llama de esta manera a los lenguajes que forman parte de una aplicación dotada de una Interfase gráfica, la cual por medio de iconos y otras herramientas visuales y simbólicas, pretenden facilitar las tareas rutinarias de los programadores, como son el diseño y desarrollo de formularios e informes. Los ejemplos más comerciales de estos lenguajes son: VISUAL BASIC, VISUAL CAFE, VISUAL FOX, etc.
• Metalenguajes: Son lenguajes como XML, SGML y HTML que sirven para definir otros lenguajes, cuyo objetivo es llevar a cabo la estructuración de textos mediante un conjunto de etiquetas, de manera tal, que puedan ser entendidos por los humanos y también procesado por los ordenadores. Estos lenguajes están teniendo un gran auge sobre la plataforma de Internet, en la cual son usados para la creación de documentos, y el intercambio o transferencia de información.
• Lenguajes de propósito específico: Son aquellos lenguajes desarrollados con la finalidad de resolver problemas de una naturaleza muy determinada, tal como SPSS para problemas estadísticos, MATLAB para cálculos científicos y de ingeniería, CAD/CAM para el diseño de piezas y programación de máquinas de control numérico, como tornos y fresadoras, GPSS para simulación de sistemas, CORBA para el manejo de interfaces en ambientes cliente-servidor, etc.
• Lenguajes Script: Son lenguajes como JAVASCRIPT, VBSCRIPT, PERLSCRIPT, que se utilizan en ambientes clientes servidor, mediante la incrustación de código en las páginas HTML, y así permitir la programación del lado del cliente, buscando fundamentalmente, hacer más atractivos los interfaces gráficos de las páginas.
Esta gran cantidad de lenguajes, señala de manera clara que existe un esfuerzo continuo en la creación, y mejora de los lenguajes de programación, en aras, de hacer más fácil la tarea del programador y/o hacer un uso más eficiente de los recursos computacionales.
La búsqueda de los objetivos antes mencionados, así como la guerra mercantil de las compañías dedicadas a la producción de herramientas de software, han diversificado las opciones que los programadores pueden elegir. Sin embargo, hasta nuestros días, podemos decir que realmente no existe ningún lenguaje, o grupo de ellos, que destaque en la totalidad de las aplicaciones informáticas que se desarrollan actualmente, ya que cada uno, tiene cualidades que lo hacen más convenientes para algunos propósitos, pero al mismo tiempo, cuentan con inconvenientes para otros.
Evolución de los Lenguajes de programación (LDP)
1.2 ELEMENTOS DE LOS LENGUAJES DE PROGRAMACIÓN
Introducción
Todo lenguaje de programación tiene una serie de elementos que le permiten utilizar diferentes tipos de datos y manipularlos por medio de abstracciones y es a través de ellas que se logran definir instrucciones, para producir un algoritmo previamente diseñado para solucionar algún problema utilizando una computadora digital, entre los elementos esenciales de un lenguaje de programación se tienen:
Operadores
Declaraciones
Constantes
Variables
Funciones de Biblioteca
1.- Operadores
Se componen de dos tipos; los lógicos y los aritméticos.
Entre los lógicos están el AND, el OR, el XOR y el NOT.
Y los aritméticos están:
Menos unario
exponenciación
División
Multiplicación
Suma
Resta
2. Declaraciones
Las instrucciones de un programa se dividen en ejecutables y no ejecutables, las declaraciones caen en el campo de las no ejecutables, pero dan a la computadora la información necesaria sobre las características de las variables, tales como de que tipo son (compuesta o simples por ejemplo).
3. Constantes
Son localidades de memoria, donde sus valores son inicialiados al principio de la ejecución del programa y no son modificadas durante su ejecución. Pudiendo ser del tipo Enteras, Reales, Alfanuméricas, etc.
4. Variables
También son localidades de memoria, pero que pueden ir cambiando su contenido en el transcurso de la ejecución de un programa y también pueden ser del tipo Enteras, Reales, Alfanuméricas, etc.
1.3 ENTORNO DE PROGRAMACIÓN
Compiladores
Un lenguaje de programación está formado por un conjunto de símbolos básicos (alfabeto) y un conjunto de reglas que especifican como manipularlos. También debe darle significado a las cadenas formadas al manipular los símbolos básicos.
Los lenguajes de programación pueden clasificarse de acuerdo a su semejanza con el lenguajes maquina o a su semejanza con el lenguaje humano (generalmente inglés).
Los lenguajes que tiene mayor semejanza con el lenguaje humano se les llama lenguajes de alto nivel, mientras que los lenguajes más parecidos al lenguaje de maquina son conocidos como de bajo nivel.
Entre los lenguajes de bajo nivel se encuentra el lenguajes ensamblador.
Algunos ejemplos de lenguajes de alto nivel son:
Algol
Basic
C
Cobol
Fortran
Modula 2
Pascal
Prolog
Traductores
Un traductor es un programa que recibe como entrada código escrito en un cierto lenguaje y produce como salida código en otro lenguaje. Generalmente el lenguaje de entrada es de más alto nivel que el de salida. Ejemplos de traductores son los ensambladores y los compiladores.
Un ensamblador es un programa que traduce de un lenguaje ensamblador a lenguaje máquina, mientras que un compilador es un programa que traduce de un lenguaje de alto nivel a un lenguaje de bajo nivel o a lenguaje máquina.
Un traductor es un programa que toma el texto escrito en un lenguaje (el lenguaje fuente) y lo convierte en el texto equivalente en un segundo lenguaje (el lenguaje destino u objeto).
Si el fuente es un lenguaje abstracto o de alto nivel y si el objetivo es un lenguaje de ensamble de bajo nivel o de máquina, el traductor es un compilador.
Diseño de lenguajes
El lenguaje de programación puede definirse al describir
1. Lo que parecen sus programas (la sintaxis del lenguaje)
2. Lo que significan sus programas (la semántica del lenguaje).
La sintaxis del lenguaje se presenta ampliamente con una notación denominada gramática libre de contexto o BNF. (Backus-Naur Form).
La semántica del lenguaje es más difícil de expresar que la sintaxis y generalmente se decide por especificarla usando descripciones informales y ejemplos.
Estructura de un Compilador.

Cualquier compilador debe realizar dos tareas principales: análisis del programa a compilar y síntesis de un programa en lenguaje maquina que, cuando se ejecute, realizara correctamente las actividades descritas en el programa fuente. Para el estudio de un compilador, es necesario dividir su trabajo en fases. Cada fase representa una transformación al código fuente para obtener el código objeto. La siguiente figura representa los componentes en que se divide un compilador. Las tres primeras fases realizan la tarea de análisis, y las demás la síntesis. En cada una de las fases se utiliza un administrador de la tabla de símbolos y un manejador de errores.
Análisis Léxico.
En la fase de análisis léxico se leen los caracteres del programa fuente y se agrupan en cadenas que representan los componentes léxicos. Cada componente léxico es una secuencia lógicamente coherente de caracteres relativa a un identificador, una palabra reservada, un operador o un carácter de puntuación. A la secuencia de caracteres que representa un componente léxico se le llama lexema (o con su nombre en inglés token). En el caso de los identificadores creados por el programador no solo se genera un componente léxico, sino que se genera otro lexema en la tabla de símbolos.
Análisis Sintáctico.
En esta fase, los componentes léxicos se agrupan en frases gramaticales que el compilador utiliza para sintetizar la salida.
Análisis Semántico.
La fase de análisis semántico se intenta detectar instrucciones que tengan la estructura sintáctica correcta, pero que no tengan significado para la operación implicada.
Generación de código Intermedio.
Algunos compiladores generan una representación intermedia explícita del programa fuente, una vez que se han realizado las fases de análisis. Se puede considerar esta operación intermedia como un subprograma para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes: debe ser fácil de producir y fácil de traducir al programa objeto.
Optimización de Código.
En esta fase se trata de mejorar el código intermedio, de modo que resulte un código de máquina más rápido de ejecutar.
Generación de Código.
Esta constituye la fase final de un compilador. En ella se genera el código objeto que por lo general consiste en código en lenguaje máquina (código relocalizable) o código en lenguaje ensamblador.
Administrador de la tabla de símbolos.
Una tabla de símbolos es una estructura de datos que contiene un registro por cada identificador. El registro incluye los campos para los atributos del identificador. El administrador de la tabla de símbolos se encarga de manejar los accesos a la tabla de símbolos, en cada una de las etapas de compilación de un programa.
Manejador de errores.
En cada fase del proceso de compilación es posibles encontrar errores. Es conveniente que el tratamiento de los errores se haga de manera centralizada a través de un manejador de errores. De esta forma podrán controlarse más eficientemente los errores encontrados en cada una de las fases de la compilación de un programa.
Este es el proceso estandar que un compilador comercial sigue para cualquier programa.... .
BIBLIOGRAFÍA
http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n
http://iabot.iespana.es/ciencia/software/historia_lenguajes_programacion.htm
http://lenguajes-de-programacion.com/