Objetivo El alumno describir los procedimientos y gramticas empleadas en el diseo de los lenguajes de programacin. Figura 1.1: Preguntas incmodas 1.1. Los lenguajes en la estructura y operacin de una compu- tadora Un programa es una serie de instrucciones que una computadora puede entender y ejecutar. Un lenguaje de programacin es un lenguaje articial utilizado para escribir dichos programas. Posteriormente stos se introducirn en la memoria de la computadora y ejecutar todas las operaciones que se incluyan. Los lenguajes de programacin constan de: Vocabulario del lenguaje, un conjunto nito de smbolos. Sintaxis, un conjunto nito de reglas para la construccin de las sentencias correctas. Semntica, que asocia un signicado a cada posible instruccin. 1 CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 2 As, podemos decir que un lenguaje de programacin consta de un conjunto de smbolos y un conjunto de reglas vlidas para componerlos, de manera que formen un mensaje con signicado para la computadora. Al disear un lenguaje de programacin, es necesario considerar tres aspectos bsicos: La estructura y operacin de la computadora dnde se van a ejecutar los programas escritos en el lenguaje. El modelo de ejecucin o computadora virtual con que se implementar el lenguaje en la mquina real. El modelo de cmputo (paradigma) que el lenguaje soportar. Un lenguaje de programacin se implementa construyendo un traductor, el cual lee los programas expresados en dicho lenguaje y entrega programas en lenguaje de mquina que pueden ser ejecuta- dos directamente por alguna computadora, la computadora que ejecuta los programas traducidos puede ser una computadora fsica: hardware o una computadora virtual: software. Figura 1.2: Arquitectura von Neumann 1.2. Computadoras virtuales Para facilitar la programacin, lo comn es expresar los programas en un lenguaje de alto nivel, el cual es muy cercano al lenguaje del programador y muy distante del lenguaje de mquina (bajo nivel). El lenguaje de mquina es distinto para cada tipo de hardware. El problema que se enfrenta al implementar un lenguaje es, cmo hacer que se ejecuten progra- mas en un lenguaje de alto nivel en diferentes computadoras, independientemente de su lenguaje de mquina. Para resolver este problema existen dos soluciones bsicas: traduccin (compilacin) y simulacin por software. CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 3 Figura 1.3: Teclado virtual 1.2.1. Traduccin (compilacin) Se puede construir un traductor que toma programas en el lenguaje de alto nivel y produce programas equivalentes en el lenguaje de mquina de la computadora real. Un traductor es un procesador de lenguajes que toma programas en un cierto lenguaje fuente y los transforma en programas funcionalmente equivalentes codicados en otro lenguaje objeto. Por ejemplo: ensambladores y compiladores. Figura 1.4: Proceso de compilacin 1.2.2. Simulacin por software En lugar de traducir los programas de un lenguaje de alto nivel a un lenguaje de mquina, se puede simular una computadora cuyo lenguaje de mquina sea el lenguaje de alto nivel. Para hacer esto se construye un conjunto de programas en el lenguaje de mquina de la computadora antrin que representan los algoritmos (y estructuras de datos) necesarios para la ejecucin de programas en el lenguaje de alto nivel. CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 4 Figura 1.5: Interpretacin directa A diferencia de un traductor, el simulador ejecuta el programa directamente, no lo traduce. En la prctica pocas veces se usan la traduccin o la simulacin puras, mas bin se trabaja con una combinacin de ambas. Un programa se descompone en varios subprogramas independientes que se compilan por separado, luego en la fase de carga se combinan con otras rutinas (operaciones simuladas por software) en tiempos de ejecucin, y se ejecuta por simulacin. Traductor (software) Cdigo fuente Enlazador Traductor (software) Cdigo fuente Errores de sintxis Errores de sintxis Cdigo objeto Cdigo objeto Libreras auxiliares en tiempo de ejecucin Cdigo ejecutable Computadora virtual (Simulada completa o parcialmente) Intrprete (hardware o software) Operaciones (hardware o software) Datos de ejecucin Salida de resultados Mensajes de error TRADUCCIN CARGA EJECUCIN Figura 1.6: Estructura de implementacin de un lenguaje de programacin Una cuestin importante en la implementacin de un lenguaje es saber si la representacin del programa durante su ejecucin ser la del lenguaje de mquina de la computadora real o una virtual. Esto establece dos tipos de implementaciones de lenguajes: CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 5 1. Compilados. Los programas en estos lenguajes se traducen al lenguaje de mquina de la computadora real antes de ejecutarse, y la simulacin se usa en las rutinas auxiliares en tiempo de ejecucin que simulan operaciones primitivas que no tienen representacin directa en el lenguaje de mquina. Por ejemplo: C, C++, Pascal, Ada, FORTRAN, etc. 2. Interpretados. El traductor produce un cdigo intermedio, y un software intrprete lo ejecuta ya que el hardware no lo puede ejecutar directamente. Por ejemplo: LISP, Prolog, Smalltalk, ML, Java, Python, BASIC, etc. 1.2.3. Jerarqua de computadoras La computadora virtual que se utiliza cuando se hace un programa en algn lenguaje de alto nivel, esta formada por una jerarqua de computadoras virtuales. La gura siguiente muestra la jerrqua de computadoras para un programa desarrollado en C. Computadora de !"#$%"#& reaI (Implementada por dispositivos fsicos) Computadora virtuaI de '#(%"#& (Instrucciones en lenguaje de mquina implementadas por microcdigo ejecutado por la computadora real) Computadora virtuaI deI system operativo (Implementadas por programas en el lenguaje mquina que se ejecutan en la computadora virtual de !"#$%"&) Computadora virtuaI de C (Implementadas por rutinas de libreras auxiliares en tiempo de ejecucin cargadas en el programa compilado) Computadora virtuaI desarroIIada por eI programador (Implementada por el modelo de ejecucin desarrollado en lenguaje C, para ejecutarse en la computadora virtual de C) Datos de entrada Datos de salida Figura 1.7: Jerarqua de computadoras virtuales de un programa en C Tarea: Leer el artculo Computational Thinking en http://bit.ly/1fD8eWT y hacer un breve co- mentario (1 cuartilla por integrante del equipo), no resumen, puedes hacer referencia entre otros muchos a los siguientes puntos: Qu relacin tiene con el curso? Ests de acuerdo con lo que se expone? Todas las personas piensan que cualquier persona se beneciara al saber algo de sus distintos campos de conocimiento? CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 6 1.3. Sintaxis La sintaxis de un lenguaje de programacin es el aspecto que ofrece el programa, proporcio- nar las reglas de sintaxis para un lenguaje de programacin signica decir como se escriben los enunciados, declaraciones y otras construcciones de lenguaje. 1.4. Semntica bsica La semntica de un lenguaje de programacin es el signicado que se le da a las diversas construcciones sintcticas, la semntica de un lenguaje de programacin est muy relacionada con el paradigma que implementa dicho lenguaje. Cuando un lenguaje de programacin se implementa en una computadora particular, primero se determina la computadora virtual que representa una interpretacin de la semntica del lenguaje y luego se construye esa computadora virtual a partir de los elementos de hardware y software que suministra la computadora subyacente. Por ejemplo, se puede determinar que una operacin de suma de enteros se implemente directamente por hardware y que una raz cuadrada se simule en la computadora virtual. Tambin se debe determinar qu se va a hacer durante la traduccin del programa y qu durante su ejecucin. Ya que algunas representaciones de estructuras de datos u operaciones en la computadora virtual, slo se pueden usar si el traductor las deni dentro de la estructura en tiempos de ejecucin. Figura 1.8: Sintaxis y semntica de lenguajes Programa: El cifrado Atbash realiza una sustitucin invirtiendo el orden del alfabeto del texto en claro. Por tanto en espaol, la A ser sustituida por la Z, la B por la Y , etc. Desarrollar un programa que implemente este mtodo para cifrar y descifrar mensajes. CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 7 Figura 1.9: Alice & Bob 1.5. Enlace y tiempo de enlace Se denomina enlace de un elemento de programa a una caracterstica o propiedad particular a la eleccin de dicha propiedad de entre un conjunto de propiedades posibles. El momento durante la formulacin o procesamiento del programa en el que se hace est eleccin se conoce como tiempo de enlace de esa propiedad para ese elemento. Los lenguajes de programacin cuentan con distintas variedades de enlaces y tiempos de enlace. 1.5.1. Tiempo de ejecucin Enlaces que se llevan a cabo durante la ejecucin de programa, como son los enlaces de las variables a sus valores o localidades particulares de almacenamiento. Hay dos categoras: 1. Al entrar a un subprograma o bloque. En casi todos los lenguajes las clases importan- tes de enlaces slo pueden ocurrir en el momento de entrar a un subprograma durante la ejecucin. Por ejemplo, en C y Pascal el enlace de parametros formales a reales slo puede ocurrir al entrar a un subprograma. 2. En puntos arbitrarios durante la ejecucion. Ciertos enlaces pueden ocurrir en cualquier punto durante la ejecucin de un programa. Por ejemplo, el enlace de variables a valores a travs de asignacin, o como en LISP y ML que permiten enlazar nombres a localidades de almacenamiento en puntos arbitrarios del programa. 1.5.2. Tiempo de traduccin o compilacin 1. Enlaces elegidos por el programador. El programador elige nombres de variables y tipos de las mismas, estructuras de enunciados, etc., que representan enlaces durante la traduccin. CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 8 2. Enlaces elegidos por el traductor. Ciertos enlaces son elegidos por el traductor del lenguaje sin que el programador intervenga. Por ejemplo, la asignacin de las localidades relativas de almacenamiento de un objeto de datos. 3. Enlaces elegidos por el cargador. Un programa se compone generalmente de varios subprogramas que se deben de fusionar en un programa ejecutable nico. El traductor enlaza variables a direcciones relativas dentro del espacio de almacenamiento designado para cada subprograma. Durante el tiempo de carga (o tiempo de vinculacin, link) las direcciones relativas deben de ser asignadas a las direcciones reales de la mquina real donde se ejecuta el programa. 1.5.3. Tiempo de implementacin del lenguaje. Ciertos aspectos de la denicin de un lenguaje pueden ser iguales para todos los programas que se ejecutan usando una implementacin particular del mismo, pero pueden variar entre las distintas implementaciones. Por ejemplo, s un programa usa una caracterstica que se ha denido durante la implementacin, no se puede asegurar que correr en otra implementacin del mismo lenguaje. 1.5.4. Tiempo de denicin del lenguaje. Casi toda la estructura de un lenguaje de programacin se ja cuando el lenguaje se dene, en el sentido de la especicacin de las alternativas disponibles para un programador cuando escribe un programa. Por ejemplo, todos los tipos de datos, estructuras de programa, etc., suelen jarse en el tiempo de denicin del lenguaje. 1.5.5. Importancia de los tiempos de enlace Muchas de las diferencias ms importantes y sutiles entre lenguajes implican diferencias en cuanto a tiempos de enlace. Se dice que un lenguaje, donde casi todos los enlaces se efectan durante la traduccin y al principio del procesamiento de un programa, tiene enlace temprano; un lenguaje con enlace tardo, demora casi todos los enlaces hasta el tiempo de ejecucin. Las ventajas y desventajas del enlace temprano respecto al enlace tardo giran en torno al conicto entre eciencia y exibilidad. En lenguajes donde se persigue la eciencia de ejecucin, como FORTRAN, Pascal y C, es comn proyectar el lenguaje de manera que se puedan efectuar tantos enlaces como sea posible durante la traduccin. En los casos donde la exibilidad es lo se persigue, como en ML y LISP, casi todos los enlaces se retrasan hasta el tiempo de ejecucin para que puedan adaptarse a los datos introducidos durante la ejecucin. En un lenguaje diseado para ofrecer a la vez ejecucin eciente y exibilidad, como Ada, se suele disponer de mltiples opciones que permiten elegir tiempos de enlace. Un lenguaje se disea de tal modo que un enlace particular se puede efectuar, por ejemplo, durante la traduccin, pero el momento efectivo en el cual el enlace se lleva a cabo est denido de hecho slo por la implementacin del lenguaje. CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 9 1.6. Paradigmas de lenguajes Adems de conocer la mquina virtual que va a proporcionar el almacenamiento de datos en tiempo de ejecucin y las operaciones para la ejecucin de un programa traducido y el hardware dnde se va a correr realmente el programa traducido a cdigo ejecutable, se tiene que analizar el modelo de computacin que maneja el lenguaje de programacin. Es decir, el modelo de compu- tacin se plantea preguntas como: Cmo se ejecuta el programa? Qu clase de construcciones suministra el programa? Existen dos modelos bsicos de computacin que describen a los lenguajes de programacin actuales: el imperativo y el declarativo. Lenguajes de Programacin Imperativos Declarativos Estructurados Orientados a Objetos Funcionales Lgicos C Pascal COBOL php ... C++ Java C# php5 ... Haskell LISP Dr. Scheme Dr. Racket ... Prolog CLIPS ... Python Figura 1.10: Paradigmas de lenguajes de programacin 1.6.1. Lenguajes imperativos Los lenguajes imperativos o de procedimiento son lenguajes controlados por mandatos u orien- tados a enunciados (instrucciones). Un programa se compone de una serie de enunciados, y la ejecucin de cada enunciado hace que el intrprete cambie el valor de una localidad o ms en su memoria, es decir, que pase a un nuevo estado. La memoria consiste en una coleccin de celdas, y la ejecucin del enunciado (por ejemplo, sumar dos variables para obtener una tercera) se puede representar como acceder a las localidades de memoria (las celdas), combinar los valores contenidos en las celdas en alguna forma y guardar el resultado en la nueva localidad. El desarrollo de programas consiste en construir los estados de mquina sucesivos (valores en las celdas) que se necesitan para llegar a la solucin. En general, este modelo procede del hardware de la computadora convencional que ejecuta instrucciones en forma secuencial (arquitectura von Neumann). CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 10 1.6.1.1. Lenguajes estructurados en bloques (procedimientos) Un lenguaje con bloques de programa, divide el estado en bloques que representan subrutinas y datos comunes. Los bloques se pueden pensar como un archivo plano, donde cada bloque sigue a sus predecesores. El trmino estructuras en bloques se reere a los mbitos anidados. Es decir, los bloques pueden estar anidados dentro de otros bloques, y pueden contener sus propias variables. El estado representa una pila con una referencia al bloque actualmente activo en la parte superior. En los lenguajes estructurados en bloques, el procedimiento es el principal bloque de construccin de los programas. Figura 1.11: Programa estructurado 1.6.1.2. Lenguajes orientados a objetos Son aquellos lenguajes basados en objetos que soportaban clases de objetos y la herencia de atributos de un objeto padre por parte de sus hijos. Un objeto es un grupo de procedimientos que comparten un estado. Puesto que los datos son tambin parte de un estado, los datos y todos los procedimientos o funciones que se le aplicarn son encapsulados en un solo objeto. 1.6.1.3. Lenguajes para la programacin concurrente La programacin concurrente est asociada con ms de un CPU funcionando simultneamente en paralelo, compartiendo o no datos. Sin embargo, los CPU mltiples no son esenciales para este paradigma. Lo esencial es que el trabajo sobre un problema en particular pueda ser compartido. La programacin concurrente se divide en dos categoras, sistemas distribuidos y sistemas con memoria compartida. 1.6.1.3.1. Sistemas distribuidos El trmino distribuido se reere a lenguajes para sistemas acoplados dbilmente que soportan que un programa se ejecute de manera simultnea y se comu- nique a travs de paso de mensajes mediante un canal de comunicacin, tal como un enlace de punto a punto o una red de rea local. 1.6.1.3.2. Sistemas de memoria compartida o fuertemente acoplados Permite que ms de un proceso en ejecucin tenga acceso a la misma ubicacin de memoria. Un lenguaje asociado con el sistema debe sincronizar el uso compartido de memoria, de modo que slo un proceso escriba CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 11 a una variable compartida a la vez, y de modo que un proceso pueda esperar hasta que ciertas condiciones se satisfagan por completo antes de continuar la ejecucin. La memoria compartida tiene la ventaja de la velocidad, porque no se necesita pasar mensajes. 1.6.2. Lenguajes declarativos Un lenguaje declarativo es aquel en el que un programa especica una relacin o funcin. Cuando se programa en el estilo declarativo, no se hacen asignaciones a variables del programa. El intrprete o compilador para el lenguaje en particular administra la memoria independientemente del programador. 1.6.2.1. Lenguajes Funcionales Los lenguajes funcionales en vez de examinar la serie de estados a travs de los cuales debe pasar la mquina para obtener una respuesta, se preguntan: Cul es la funcin que se debe aplicar al estado de mquina inicial accediendo al conjunto inicial de variables y combinndolas en formas especcas para obtener una respuesta? El desarrollo de programas procede a travs del desarrollo de funciones a partir de funciones previamente desarrolladas para construir funciones ms complejas que manipulan el conjunto inicial de datos hasta que la funcin nal se puede usar para calcular una respuesta a partir de los datos iniciales. As, la programacin funcional proporciona la capacidad para que un programa (funcin) se modique a s mismo, es decir, aprenda. LISP , Scheme y ML son lenguajes funcionales manejan este modelo de programacin. 1.6.2.2. Lenguajes de Programacin Lgica La programacin lgica est basada en el clculo de predicados, el cual proporciona axiomas y reglas de modo que se pueden deducir nuevos hechos a partir de otros hechos conocidos. Un programa basado en la lgica se compone de una serie de axiomas o hechos, reglas de inferencia y un teorema o cuestin por demostrarse. La salida es verdadera si los hechos soportan o apoyan la cuestin, y es falsa en el caso contrario. Prolog es el ejemplo tpico de este tipo de lenguajes. 1.6.3. Lenguajes de base de datos Las propiedades que distinguen a los lenguajes diseados para tratar con bases de datos son la persistencia y la administracin de cambios. Las entidades de base de datos no desaparecen despus de que naliza un programa, sino que permanecen activas durante tiempo indenido como fueron estructuradas originalmente. Puesto que la base de datos, una vez organizada, es permanente, estos lenguajes tambin deben soportar los cambios. Los datos pueden cambiar y as tambin pueden hacerlo las relaciones entre objetos o entidades de datos. Un sistema de administracin de base de datos incluye un lenguaje de denicin de datos (DDL) para describir una nueva coleccin de hechos, o datos, y un lenguaje de manipulacin de datos (DML) para la interaccin con las bases de datos existentes. SQL es un ejemplo de este tipo de lenguajes. CAPTULO 1. PRINCIPIOS DE DISEO DE LENGUAJES 12 Tarea: Realizar una lista de 30 lenguajes de programacin e indicar qu paradigma(s) de programa- cin implementa, si realiza enlace temprano o tardo, as como si es compilado o interpretado.