Title: CUESTIONES DE DISEO DE LENGUAJES
1CUESTIONES DE DISEÑO DE LENGUAJES
- La estructura y operación de una computadora.
- Computadoras virtuales y tiempos de enlace.
- Paradigmas en lenguajes.
2INTRODUCCIÓ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á.
3La 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
- Un dispositivo fÃsico real utilizando circuitos
integrados, en cuyo caso se le conoce como
computadora real o una computadora de hardware. - Programas que se ejecutan en una computadora
simulando a otra computadora computadora
simulada por software o computadora virtual.
4Estructura 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.
5- Tanto una computadora como un lenguaje de
programación consisten de seis componentes
fundamentales - Datos. Diversas clases de datos elementales y
estructurados. - Operaciones primitivas. Operaciones para
manipular los datos. - Control de secuencia. Mecanismos para controlar
el orden en el que se van a ejecutar las
operaciones primitivas. - Acceso a datos. Mecanismos para controlar los
datos a cada ejecución de una operación. - Gestión de almacenamiento. Mecanismos para
controlar la asignación de almacenamiento para
programas y datos. - Entorno de operación. Mecanismos para la
comunicación con el entorno.
6Organizació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. -
7Organización de una Computadora
8Partes principales de una computadora
- Datos Hay cuatro componentes principales de
almacena-miento de datos - Memoria Principal . Organizada como una secuencia
lineal de bits subdividida en palabras de
longitud fija. Almacena datos y programas. - Registros Internos. Se componen de secuencias de
bits con 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. - Memoria Caché. Se encuentra entre la memoria
principal y los registros internos. Sirve para
acelerar el acceso a los datos de la memoria. - Archivos Externos. Son una serie de bits
divididos en registros. Sirven para el
almacenamiento externo de datos o programas.
9- 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.
10- 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.
11- 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.
-
12Interpretación y Ejecución de un Programa
13- 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.
14- 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.
15- 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.
16- 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).
17- 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.
18Computadora 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.
19Traductores 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.
20Existen dos soluciones básicas
- 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.
- TIPOS ESPECIALIZADOS DE TRADUCTORES.
- Ensambladores.
- Compiladores.
- Cargador o Editores de VÃnculos.
- Preprocesadores o Macroprocesadores.
21- 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.
22- 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.
23- 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
len-guaje 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) necesa-rios 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.
24Estructura de la Implementación de un Lenguaje
25Lenguajes 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 lengua-je 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.
26Computadoras 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.
27Sintaxis 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.
28Computadoras 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.
29JerarquÃ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 ejecu-ción del
programa codificado en el lenguaje de
programación.
30JerarqÃa de computadoras virtuales para un
programa en C.
31Enlace 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.
32Clases 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 len-guajes 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 for-males 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.
33- 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.
343.- 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
estructu-ra de un lenguaje de programación se
fija cuando el len-guaje 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.
35Para 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 len-guajes, X se puede referir a un
entero en un punto y a una cadena en un punto
posterior del mismo programa.
363. 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 valo-res 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.
375. 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.
38Importancia 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
len-guajes 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.
39Tiempos 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 cer-cano durante el procesamiento
del programa en el cual es posible un enlace
particular. Sin embargo, por lo general casi
todas las imple-mentaciones 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
eficien-te 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.
40Paradigmas 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.
41Lenguajes 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
- Â
42Lenguajes 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 resulta-do 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.
43Lenguajes de Programación y Modelos de Computación
44- 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.
45Lenguajes 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. Â
46 Lenguajes para la Programación Concurrente. La
programa-ción concurrente está asociada con más
de un CPU funcionan-do simultáneamente en
paralelo, compartiendo o no datos. Sin embargo,
los CPU múltiples no son esenciales para este
para-digma. 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.
47Un 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.
48Lenguajes 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? Â
49 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.
50 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.
51 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.Â
52Clasificación de los Lenguajes de Programación