Download CUESTIONES DE DISEÑO DE LENGUAJES C2
Document related concepts
Transcript
CUESTIONES DE DISEÑO DE LENGUAJES La estructura y operación de una computadora. Computadoras virtuales y tiempos de enlace. Paradigmas en lenguajes. Leng. de Prog. Jorge Jimenéz G. 1 INTRODUCCIÓN En el diseño de un Lenguaje de Programación, hay que considerar tres aspectos básicos: La estructura y operación de la computadora dónde se van a ejecutar los programas escritos en el lenguaje. El Modelo de Ejecución o Computadora Virtual con que se implementará el lenguaje en la Máquina Real. El Modelo de Computación (Paradigma) que el lenguaje soportará. Leng. de Prog. Jorge Jimenéz G. 2 La estructura y operación de una computadora Una computadora es un conjunto integrado de algoritmos y estructuras de datos capaz de almacenar y ejecutar programas. Se puede construir una computadora por medio de: 1. Un dispositivo físico real utilizando circuitos integrados, en cuyo caso se le conoce como: computadora real o una computadora de hardware. 2. Programas que se ejecutan en una computadora simulando a otra computadora: computadora simulada por software o computadora virtual. Leng. de Prog. Jorge Jimenéz G. 3 Estructura y operación de una computadora Un lenguaje de programación se implementa construyendo un traductor, el cual traduce los programas expresados en el lenguaje a programas en lenguaje de máquina que pueden ser ejecutados directamente por alguna computadora. La computadora que ejecuta los programas traducidos puede ser una computadora de hardware o una computadora virtual. Arquitectura de Von Neumann. Consiste en una unidad central de procesamiento (UCP), compuesta de: operaciones primitivas; control de secuencia y registros internos para guardar los resultados de las operaciones primitivas; una memoria principal; y un proceso para recuperar y guardar palabras de datos entre la UCP y la memoria. Leng. de Prog. Jorge Jimenéz G. 4 Tanto una computadora como un lenguaje de programación consisten de seis componentes fundamentales: 1. Datos. Diversas clases de datos elementales y estructurados. 2. Operaciones primitivas. Operaciones para manipular los datos. 3. Control de secuencia. Mecanismos para controlar el orden en el que se van a ejecutar las operaciones primitivas. 4. Acceso a datos. Mecanismos para controlar los datos a cada ejecución de una operación. 5. Gestión de almacenamiento. Mecanismos para controlar la asignación de almacenamiento para programas y datos. 6. Entorno de operación. Mecanismos para la comunicación con el entorno. Leng. de Prog. Jorge Jimenéz G. 5 Organización física de una computadora Una computadora cuenta con una memoria principal la cual contiene programas y datos que se van a procesar. El procesamiento está a cargo de un intérprete, el cuál toma cada instrucción de lenguaje de máquina por turno, la decodifica, e invoca la operación primitiva designada con los operandos designados como entrada. Las Primitivas manipulan los datos almacenados en la memoria principal y en registros internos de alta velocidad. También pueden transmitir programas o datos de la memoria hacia el exterior. Leng. de Prog. Jorge Jimenéz G. 6 Organización de una Computadora Leng. de Prog. Jorge Jimenéz G. 7 Partes principales de una computadora Datos: Hay cuatro componentes principales de almacenamiento de datos: Memoria Principal . Organizada como una secuencia lineal de Registros Internos. Se componen de secuencias de bits con Memoria Caché. Se encuentra entre la memoria principal y los Archivos Externos. Son una serie de bits divididos en registros. bits subdividida en palabras de longitud fija. Almacena datos y programas. longitud de palabra. Su contenido puede representar datos o la dirección en la memoria principal dónde están los datos o la próxima instrucción. registros internos. Sirve para acelerar el acceso a los datos de la memoria. Sirven para el almacenamiento externo de datos o programas. Leng. de Prog. Jorge Jimenéz G. 8 Una computadora tiene ciertos tipos de datos integrados que se pueden manipular directamente con operaciones primitivas de hardware: enteros, números de punto flotante (reales), cadenas de caracteres y cadenas de bits, todos ellos de longitud fija igual al número de bits de una palabra de almacenamiento. Los programas también son un tipo de datos y por tanto tiene que haber una representación interconstruida para programas, la cual se designa como representación en lenguaje de máquina de la computadora. Un programa en lenguaje de máquina se estructura como una serie de localidades de memoria, cada una de las cuales tiene una o más instrucciones. Cada instrucción se compone de un código de operación y un operando. Leng. de Prog. Jorge Jimenéz G. 9 Operaciones: Una computadora debe contener un conjunto de operaciones primitivas interconstruidas, ordinariamente apareadas una a una con los códigos de operación que pueden aparecer en las instrucciones de lenguaje de máquina. Incluyen: Primitivas para Aritmética. Suma, resta, multiplicación y división de enteros y reales. Primitivas para probar propiedades de los elementos de datos. Primitivas de acceso y modificación de las componentes de un elemento de datos. Primitivas para controlar dispositivos de E/S. Primitivas para el control de secuencia. Leng. de Prog. Jorge Jimenéz G. 10 Control de secuencia: La instrucción siguiente que se debe ejecutar en cualquier punto durante la ejecución de un programa en lenguaje de máquina está determinada por el contenido de un registro de direcciones de programa ( o contador de localidades), el cuál siempre contiene la dirección de memoria de la próxima instrucción. El intérprete ocupa un lugar central en la operación de una computadora. Accesa al registro de direcciones y guía la secuencia de operaciones. Ejecuta un algoritmo cíclico. En cada ciclo obtiene del registro, la dirección de la instrucción siguiente, incrementa el valor del registro (para apuntar a la dirección de una nueva instrucción), toma la instrucción de la memoria, decodifica la instrucción a un código de operación y a un conjunto de designadores de operando, toma los operadores designados e invoca la operación designada con los operandos como argumentos. La operación primitiva puede modificar datos de la memoria o los registros, acceder a dispositivos de E/S o cambiar el orden de ejecución cambiando el contenido del registro. Leng. de Prog. Jorge Jimenéz G. 11 Interpretación y Ejecución de un Programa Leng. de Prog. Jorge Jimenéz G. 12 Acceso a datos: Toda instrucción de máquina especifica un código de operación y los operandos que la operación va a usar. Un operando puede estar en la memoria principal o en un registro. Se debe de contar con algún mecanismo para designar operandos y recuperarlos de un designador dado. De igual forma, el resultado de una operación primitiva se debe guardar en alguna localidad designada. Llamamos a estos recursos el control de acceso a datos de la computadora. Consiste en asociar direcciones de enteros con localidades de memoria y suministrar operaciones para recuperar el contenido de una localidad dada su dirección. Leng. de Prog. Jorge Jimenéz G. 13 Gestión de almacenamiento: Un principio de diseño es el de tener en operación “simultánea” todos los recursos de la computadora. El problema es que las operaciones de la UCP son mucho más rápidas que que el acceso a la memoria; y éste a su vez, es más rápido que las operaciones con datos externos. Una solución simple, es integrar en el hardware recursos sencillos para gestión de almacenamiento; los programas y los datos residen en memoria sólo durante la ejecución del programa. Aunque la UCP debe esperar para que los datos apropiados queden disponibles, resulta económico no tener que agregar hardware adicional para acelerar el proceso. Leng. de Prog. Jorge Jimenéz G. 14 Para compensar el desequilibrio entre el acceso a datos externos y el procesador central, el S.O. puede usar multiprogramación. Mientras espera a que se lean los datos (p.ejm., de un disco), se ejecuta otro programa. Para ello, el hardware debe de soportar directamente la paginación o reubicación dinámica de programas. Que consiste en permitir que varios programas puedan residir conjuntamente y al mismo tiempo en memoria. Hay algoritmos de paginación que calculan cuales cuales direcciones de programas y datos tienen más probabilidad de ser utilizados nuevamente. Otro mecanismo de compensación es el uso de una memoria caché. Es una memoria de alta velocidad, contiene los datos e instrucciones que con más probabilidad se volverán a usar. El procesador central accesa inmediatamente a los datos de esta memoria y si se modifican se almacenan en la memoria principal. Leng. de Prog. Jorge Jimenéz G. 15 Entorno de operación: El entorno de operación de una computadora consiste en un conjunto de dispositivos periféricos de almacenamiento y de E/S que sirven para comunicarse con ella. Arquitecturas alternativas de computadora: Un enfoque alternativo a la arquitectura de Von Newmann es el uso de sistemas de multiprocesamiento formados por múltiples UCP acoplados y compartiendo conjuntos únicos de memoria, discos, etc. Esto implica el diseño de lenguajes que permitan escribir programas que se ejecuten en varias máquinas y puedan comunicarse entre sí (paralelismo). Leng. de Prog. Jorge Jimenéz G. 16 Estados de computadora: El concepto de estado de computadora es un medio para visualizar el comportamiento dinámico de una computadora. El proceso de ejecución de programas se da se da a través de una serie de estados, cada uno definido por el contenido de la memoria, de los registros internos, y de los almacenes externos; en algún instante de tiempo durante la ejecución. El contenido inicial en áreas de almacenamiento define el estado inicial . Cada paso en la ejecución del programa transforma el estado existente en uno nuevo a través de la modificación del contenido de un área de almacenamiento o más; es decir, genera una transición de estado. Al terminar el programa, el estado final esta definido por el contenido final de las áreas de almacenamiento. Leng. de Prog. Jorge Jimenéz G. 17 Computadora de Firmware Existe un principio de diseño que estipula que: “Cualquier algoritmo o estructura de datos definida con precisión se puede producir en hardware”. Esto significa que se pueden construir computadoras que directamente en su hardware implementen un lenguaje de alto nivel e incluso simulen otra máquina por hardware. Una alternativa a la producción estricta en hardware de una computadora es la computadora de firmware, simulada por un microprograma que se ejecuta en una computadora microprogramable de hardware especial. El microprograma simula la operación de la computadora deseada en la computadora microprogramable anfitrión. A este proceso se le conoce como emulación y la computadora resultante es una máquina virtual. Leng. de Prog. Jorge Jimenéz G. 18 Traductores y Computadoras Simuladas por Software Para facilitar la programación, lo común 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 máquina (bajo nivel). El lenguaje de máquina es distinto para cada plataforma de hardware. El problema que se enfrenta al implementar un lenguaje es, como hacer que se ejecuten programas en un lenguaje de alto nivel en diferentes computadoras, independientemente de su lenguaje de máquina. Leng. de Prog. Jorge Jimenéz G. 19 Existen dos soluciones básicas: 1. Traducción (compilación): Se puede construir un traductor para traducir programas en el lenguaje de alto nivel a programas equivalentes en el lenguaje de máquina 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 codificados en otro lenguaje objeto. a) b) c) d) TIPOS ESPECIALIZADOS DE TRADUCTORES. Ensambladores. Compiladores. Cargador o Editores de Vínculos. Preprocesadores o Macroprocesadores. Leng. de Prog. Jorge Jimenéz G. 20 Un ensamblador, es un traductor cuyo lenguaje fuente es un lenguaje ensamblador, y cuyo lenguaje objeto es un lenguaje de máquina de una computadora real específica. Un lenguaje ensamblador es una representación simbólica de de un lenguaje de máquina. Un compilador, es un traductor cuyo lenguaje fuente es un lenguaje de alto nivel y cuyo lenguaje objeto se aproxima al lenguaje de máquina de una computadora real, ya sea que se trate de un lenguaje ensamblador o alguna variedad de lenguaje de máquina. Leng. de Prog. Jorge Jimenéz G. 21 Un cargador o editor de vínculos es un traductor cuyo lenguaje objeto es un código de máquina real y cuyo lenguaje fuente es casi idéntico; y está compuesto por lo general de programas en lenguaje de máquina en forma reubicable junto con tablas de datos que especifican puntos donde el código reubicable se debe modificar para volverlo auténticamente ejecutable. En otras ocasiones se le denomina enlazador o ligador. Un preprocesador o macroprocesador es un traductor cuyo lenguaje fuente es una forma ampliada de un lenguaje de alto nivel ( como C++ ) y cuyo lenguaje objeto es la forma estándar del mismo lenguaje. Leng. de Prog. Jorge Jimenéz G. 22 2. Simulación de software: En lugar de traducir los programas de un lenguaje de alto nivel a un lenguaje de máquina, se puede simular una computadora cuyo lenguaje de máquina sea el lenguaje de alto nivel. Para hacer esto se construye un conjunto de programas en el lenguaje de máquina de la computadora anfitrión que representan los algoritmos (y estructuras de datos) necesarios para la ejecución de programas en el lenguaje de alto nivel. A diferencia de un traductor, el simulador ejecuta el programa directamente, no lo traduce. En la práctica pocas veces se usan la traducción o la simulación puras, mas bién se trabaja con una combinación de ambas. Un programa se descompone en varios subprogramas independientes que se compilan por separado, luego en la fase de carga se combinan con rutinas de apoyo (operaciones simuladas por software) en tiempos de ejecución para obtener su forma ejecutable, la cual se decodifica y se ejecuta por simulación. Leng. de Prog. Jorge Jimenéz G. 23 Estructura de la Implementación de un Lenguaje Leng. de Prog. Jorge Jimenéz G. 24 Lenguajes Compilados e Interpretados La cuestión clave en la implementación de un lenguaje es saber si la representación base del programa durante su ejecución será la del lenguaje de máquina de la computadora real en la que corra o nó. Esto establece dos tipos de implementaciones de lenguajes: 1. Lenguajes compilados. Los programas en estos lenguajes se traducen al lenguaje de máquina de la computadora real antes de ejecutarse, y la simulación se usa en las rutinas de apoyo en tiempo de ejecución que simulan operaciones primitivas que no tienen representación directa en el lenguaje de máquina. Ejm: C, C++, Pascal, Ada, FORTRAN. 2. Lenguajes Interpretados. El traductor produce un código intermedio, y un software intérprete lo ejecuta ya que el intérprete de hardware no lo puede ejecutar. Ejm: LISP, Prolog, Smalltalk, ML y BASIC. Leng. de Prog. Jorge Jimenéz G. 25 Computadoras Virtuales y Tiempos de Enlace Cuando se implementa un lenguaje de programación, se define una computadora virtual, formada por las estructuras de datos y algoritmos en tiempo de ejecución que se emplean en la ejecución de programas. El lenguaje de máquina de una computadora virtual es el programa ejecutable que produce el traductor del lenguaje, el cuál puede adoptar la forma de código de máquina autentico si el lenguaje se compila o, de manera alternativa, puede tener alguna estructura arbitraria si el lenguaje se interpreta. Leng. de Prog. Jorge Jimenéz G. 26 Sintaxis y Semántica La sintaxis de un lenguaje de programación es el aspecto que ofrece el programa, proporcionar las reglas de sintaxis para un lenguaje de programación significa decir como se escriben los enunciados , declaraciones y otras construcciones de lenguaje. La semántica de un lenguaje de programación es el significado que se le da a las diversas construcciones sintácticas. Leng. de Prog. Jorge Jimenéz G. 27 Computadoras virtuales e implementación de lenguajes Cuando un lenguaje de programación se implementa en una computadora particular, primero se determina la computadora virtual que representa una interpretación de la semántica 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 operación de suma de enteros se implemente directamente por hardware y que una raíz cuadrada se simule en la computadora virtual. También se debe determinar qué se va a hacer durante la traducción del programa y qué durante su ejecución. Ya que algunas representaciones de estructuras de datos u operaciones en la computadora virtual, sólo se pueden usar si el traductor las definió dentro de la estructura en tiempos de ejecución. Leng. de Prog. Jorge Jimenéz G. 28 Jerarquías de Computadoras La computadora virtual que se utiliza cuando se hace un programa en algún lenguaje de alto nivel, esta formada por una jerarquía de computadoras virtuales. El el nivel más bajo se encuentra la máquina real. El segundo nivel (o tercero si existe un microprograma antes) se encuentra el sistema operativo, que provee simulaciones de un cierto número de operaciones y estructuras de datos nuevas que no proporciona directamente el hardware. Luego se encuentra la máquina virtual del lenguaje de programación y su traductor que se ejecutan en la máquina virtual definida por el sistema operativo. Por último, en la parte superior de la jerarquía se encuentra la computadora virtual implementada por el modelo de ejecución del programa codificado en el lenguaje de programación. Leng. de Prog. Jorge Jimenéz G. 29 Jerarqía de computadoras virtuales para un programa en C. Leng. de Prog. Jorge Jimenéz G. 30 Enlace y tiempos de enlace Nombramos enlace de un elemento de programa a una característica o propiedad particular a la elección de dicha propiedad de entre un conjunto de propiedades posibles. El momento durante la formulación o procesamiento del programa en el que se hace está elección se conoce como tiempo de enlace de esa propiedad para ese elemento. Los lenguajes de programación cuentan con distintas variedades de enlaces y tiempos de enlace. Leng. de Prog. Jorge Jimenéz G. 31 Clases de tiempos de enlace 1.-TIEMPO DE EJECUCIÓN. Tiempo de los enlaces que se llevan a cabo durante la ejecución de programa, como son los enlaces de las variables a sus valores o localidades particulares de almacenamiento. Hay varias categorias: a) Al entrar a un subprograma o bloque. En casi todos los lenguajes las clases importantes de enlaces sólo pueden ocurrir en el momento de entrar a un subprograma bloque durante la ejecución. P. ejm., en C y Pascal el enlace de parametros formales a reales sólo puede ocurrir al entrar a un subprograma. b) En puntos arbitrarios durante la ejecucion. Ciertos enlaces pueden ocurrir en cualquier punto durante la ejecución de un programa. P. Ejm., el enlace de variables a valores a través de asignación, o como en LISP y ML que permiten enlazar nombres a localidades de almacenamiento en puntos arbitrarios del programa. Leng. de Prog. Jorge Jimenéz G. 32 2.- TIEMPO DE TRADUCCIÓN o COMPILACION. a) 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 traducción. b) Enlaces elegidos por el traductor. Ciertos enlaces son elegidos por el traductor del lenguaje sin que el programador intervenga. P. ejm., la asignación de las localidades relativas de almacenamiento de un objeto de datos. c) 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 vinculación) las direcciones relativas deben de ser asignadas a las direcciones reales de la máquina real donde se ejecuta el programa. Leng. de Prog. Jorge Jimenéz G. 33 3.- Tiempo de implementación del lenguaje. Ciertos aspectos de la definición de un lenguaje pueden ser iguales para todos los programas que se ejecutan usando una implementación particular del mismo, pero pueden variar entre las distintas implementaciones. Por ejemplo, sí un programa usa una característica que se ha definido durante la implementación, no se puede asegurar que correrá en otra implementación del mismo lenguaje. 4.- Tiempo de definición del lenguaje. Casi toda la estructura de un lenguaje de programación se fija cuando el lenguaje se define, en el sentido de la especificación de las alternativas disponibles para un programador cuando escribe un programa. Por ejemplo, todos los tipos de datos, estructuras de programa, etc., suelen fijarse en el tiempo de definición del lenguaje. Leng. de Prog. Jorge Jimenéz G. 34 Para ilustrar la diversidad de enlaces y tiempos de enlace, analice-mos el siguiente enunciado de asignación: x := x + 10 Tenemos enlaces y tiempos de enlace en los elementos siguientes: 1. El Conjunto de posibles tipos para la variable X. Se suele fijar durante la definición del lenguaje. Sí el lenguaje puede dejar que cada programa defina tipos nuevos, el conjunto de posibles tipos para X se fija durante la traducción. 2. Tipo de variable X. El tipo de datos elegido para la variable X se suele fijar durante la traducción, a través de una declaración explícita en el programa. En algunos lenguajes, como Smalltalk y Prolog, el tipo de datos de X puede enlazarse sólo durante la ejecución a través de la asignación de un valor de un tipo particular a X. En estos lenguajes, X se puede referir a un entero en un punto y a una cadena en un punto posterior del mismo programa. Leng. de Prog. Jorge Jimenéz G. 35 3. Conjunto de valores posibles para la variable X. Esta determinado por el intervalo de valores que se pueden representar y manipular en la computadora virtual que define el lenguaje, el cual a su vez se relaciona con el conjunto de valores que se pueden representar en la computadora de hardware subyacente. Así pues, el conjunto de valores posibles para X se puede determinar durante la implementación del lenguaje; las distintas implementaciones del lenguaje pueden permitir diferentes intervalos de valores posibles para X. De manera alternativa, se puede determinar en el tiempo de carga, de acuerdo con el hardware que ejecutará el programa. 4. Valor de la variable X. En cualquier punto durante la ejecución del programa, un valor particular está enlazado a la variable X. De modo habitual, este valor se determina durante la ejecución a través de la asignación de un valor a X. La asignación X := X + 10 cambia el enlace de X sustituyendo su valor antiguo por uno nuevo que es 10 más que el antiguo. Leng. de Prog. Jorge Jimenéz G. 36 5. Representación de la constante 10. El entero 10 tiene a la vez una representación como constante en los programas, usando la cadena 10, esta elección se hace generalmente en el tiempo de definición del lenguaje ; y una representación durante la ejecución, casi siempre como una serie de bits, que se hace en el tiempo de implementación del lenguaje. 6. Propiedades del operador +. En un lenguaje compilado el símbolo + se enlaza a un conjunto de operaciones de adición durante la definición del lenguaje; cada operación de adición del conjunto se define durante la implementación del lenguaje, cada uso particular del símbolo + en un programa se enlaza a una operación particular de adición durante la traducción, y el valor particular de cada operación particular de adición para sus operandos se determina sólo durante la ejecución. Este ejemplo representa los posibles enlaces y tiempos de enlace en diversos lenguajes de programación. Sin embargo, también es posible elegir muchos otros enlaces y tiempos de enlace. Leng. de Prog. Jorge Jimenéz G. 37 Importancia de los tiempos de enlace Muchas de las diferencias más importantes y sutiles entre lenguajes implican diferencias en cuanto a tiempos de enlace. Se dice que un lenguaje, donde casi todos los enlaces se efectúan durante la traducción, al principio del procesamiento de un programa, tiene enlace temprano; un lenguaje con enlace tardío, demora casi todos los enlaces hasta el tiempo de ejecución. Las ventajas y desventajas del enlace temprano respecto al enlace tardío giran en torno al conflicto entre eficiencia y flexibilidad. En lenguajes donde se persigue la eficiencia de ejecución, como FORTRAN, Pascal y C, es común proyectar el lenguaje de manera que se puedan efectuar tantos enlaces como sea posible durante la traducción. En los casos donde la flexibilidad es lo se persigue, como en ML y LISP, casi todos los enlaces se retrasan hasta el tiempo de ejecución para que puedan adaptarse a los datos introducidos durante la ejecución. En un lenguaje diseñado para ofrecer a la vez ejecución eficiente y flexibilidad, como Ada, se suele disponer de múltiples opciones que permiten elegir tiempos de enlace. Leng. de Prog. Jorge Jimenéz G. 38 Tiempos de enlace e implementaciones de lenguajes Un lenguaje se proyecta de tal modo que un enlace particular se puede efectuar, por ejemplo, durante la traducción, pero el momento efectivo en el cual el enlace se lleva a cabo está definido de hecho sólo por la implementación del lenguaje. P. ejm., Pascal se diseñó para permitir que el tipo de variables se determine durante la compilación, pero una implementación particular de Pascal puede realizar la verificación de tipos durante la ejecución. En general, un diseño de lenguaje especifica el momento más cercano durante el procesamiento del programa en el cual es posible un enlace particular. Sin embargo, por lo general casi todas las implementaciones del lenguaje efectúan la mayoría de los enlaces al mismo tiempo. Si el lenguaje está proyectado para permitir enlaces durante la compilación, entonces el retraso de estos enlaces hasta el tiempo de ejecución conducirá probablemente a una ejecución menos eficiente sin tener ganancia de flexibilidad, como en el ejemplo anterior de verificación de tipos en tiempo de ejecución en Pascal. De hecho, resulta conveniente efectuar los enlaces lo más pronto posible. Leng. de Prog. Jorge Jimenéz G. 39 Paradigmas en Lenguajes Además de conocer la máquina virtual que va a proporcionar el almacenamiento de datos en tiempo de ejecución y las operaciones para la ejecución de un programa traducido y el hardware dónde se va a correr realmente el programa traducido a código ejecutable, se tiene que analizar el modelo de computación que maneja el lenguaje de programación. Es decir, el modelo de computación se plantea preguntas como: ¿Cómo se ejecuta el programa? ¿Qué clase de construcciones suministra el programa? Existen dos modelos básicos de computación que describen a los lenguajes de programación actuales: el Imperativo y el Declarativo. Leng. de Prog. Jorge Jimenéz G. 40 Lenguajes Imperativos Los lenguajes imperativos o de procedimiento son lenguajes controlados por mandatos u orientados a enunciados (instrucciones). Un programa se compone de una serie de enunciados, y la ejecución de cada enunciado hace que el intérprete cambie el valor de una localidad o más en su memoria, es decir, que pase a un nuevo estado. La sintaxis de esta clase de lenguajes tiene por lo general la forma: enunciado1; enunciado2; ... enunciadoN; Leng. de Prog. Jorge Jimenéz G. 41 Lenguajes Imperativos ... La memoria consiste en una colección de celdas, y la ejecución 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 máquina sucesivos (valores en las celdas) que se necesitan para llegar a la solución. Muchos lenguajes (por ejemplo, C, C++, FORTRAN, ALGOL, PL/I, Pascal, Ada, Smalltalk, COBOL) manejan este modelo. En general, este modelo procede del hardware de la computadora convencional que ejecuta instrucciones en forma secuencial. Leng. de Prog. Jorge Jimenéz G. 42 Lenguajes de Programación y Modelos de Computación Leng. de Prog. Jorge Jimenéz G. 43 Lenguajes Estructurados en Bloques . 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 término estructuras en bloques se refiere 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 construcción de los programas. Ejemplos de lenguajes son Ada, ALGOL 60, Pascal, ALGOL 68 y C. Leng. de Prog. Jorge Jimenéz G. 44 Lenguajes Basados en Objetos El paradigma basado en objetos describe los lenguajes que soportan objetos en interacción. Un objeto es un grupo de procedimientos que comparten un estado. Puesto que los datos son también parte de un estado, los datos y todos los procedimientos o funciones que se le aplicarán son encapsulados en un solo objeto. Los ejemplos son Ada, donde los objetos son llamados paquetes; Modula, donde se denominan módulos; y Smalltalk, donde los objetos se llaman (correctamente) objetos. En C++, una colección de objetos se agrupa en una clase. Lenguajes Orientado 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. Leng. de Prog. Jorge Jimenéz G. 45 Lenguajes para la Programación Concurrente. La programa- ción concurrente está asociada con más de un CPU funcionando simultáneamente en paralelo, compartiendo o no datos. Sin embargo, los CPU múltiples no son esenciales para este paradigma. Lo que es esencial es que el trabajo sobre un problema en particular pueda ser compartido. En Ada o en Java dos o más procedimientos se ejecuten de manera independiente. La programación concurrente se divide en dos categorías, sistemas distribuidos y sistemas con memoria compartida. El término distribuido se refiere a lenguajes para sistemas acoplados débilmente que soportan que un programa se ejecute de manera simultánea y se comunique a través de paso de mensajes mediante un canal de comunicación, tal como un enlace de punto a punto o una red de área local. Leng. de Prog. Jorge Jimenéz G. 46 Un sistema acoplado fuertemente o de memoria compartida, permite que más de un proceso en ejecución tenga acceso a la misma ubicación de memoria. Un lenguaje asociado con el sistema debe sincronizar el uso compartido de memoria, de modo que sólo un proceso escriba 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 ejecución. La memoria compartida tiene la ventaja de la velocidad, porque no se necesita pasar mensajes. Recientemente, se han hecho trabajos en lenguajes que difuminan la distinción entre los paradigmas acoplados débil y fuertemente. Lenguajes tales como PROLOG concurrente, Linda y Occam tienen algunas características de ambos. Leng. de Prog. Jorge Jimenéz G. 47 Lenguajes Declarativos Un lenguaje declarativo es aquel en el que un programa especifica una relación o función. Cuando se programa en el estilo declarativo, no se hacen asignaciones a variables del programa. El intérprete o compilador para el lenguaje en particular administra la memoria independientemente del programador. Lenguajes Funcionales. Los lenguajes aplicativos o funcionales en vez de examinar la serie de estados a través de los cuales debe pasar la máquina para obtener una respuesta, se preguntan: ¿Cuál es la función que se debe aplicar al estado de máquina inicial accediendo al conjunto inicial de variables y combinándolas en formas específicas para obtener una respuesta? Leng. de Prog. Jorge Jimenéz G. 48 El desarrollo de programas procede a través del desarrollo de funciones a partir de funciones previamente desarrolladas para construir funciones más complejas que manipulan el conjunto inicial de datos hasta que la función final se puede usar para calcular una respuesta a partir de los datos iniciales. Así, la programación funcional proporciona la capacidad para que un programa (función) se modifique a sí mismo, es decir, aprenda. En general, la sintaxis de esta clase de lenguajes es similar a: funciónN (....función2 (función1 (datos))..) LISP , Scheme y ML son lenguajes funcionales manejan este modelo de programación. Leng. de Prog. Jorge Jimenéz G. 49 Lenguajes de Programación Lógica. La programación lógica está basada en el cálculo 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 lógica se compone de una serie de axiomas o hechos, reglas de inferencia y un teorema o cuestión por demostrarse. La salida es verdadera si los hechos soportan o apoyan la cuestión, y es falsa en el caso contrario. Prolog es el ejemplo típico de este tipo de lenguajes. Leng. de Prog. Jorge Jimenéz G. 50 Lenguajes de base de datos. Las propiedades que distinguen a los lenguajes diseñados para tratar con bases de datos son la persistencia y la administración de cambios. Las entidades de base de datos no desaparecen después de que finaliza un programa, sino que permanecen activas durante tiempo indefinido como fueron estructuradas originalmente. Puesto que la base de datos, una vez organizada, es permanente, estos lenguajes también deben soportar los cambios. Los datos pueden cambiar y así también pueden hacerlo las relaciones entre objetos o entidades de datos. Un sistema de administración de base de datos incluye un lenguaje de definición de datos (DDL) para describir una nueva colección de hechos, o datos, y un lenguaje de manipulación de datos (DML) para la interacción con las bases de datos existentes. SQL es un ejemplo de este tipo de lenguajes. Leng. de Prog. Jorge Jimenéz G. 51 Clasificación de los Lenguajes de Programación Leng. de Prog. Jorge Jimenéz G. 52