Download CUESTIONES DE DISEÑO DE LENGUAJES C2

Document related concepts

Programación funcional wikipedia , lookup

Turing completo wikipedia , lookup

Little man computer wikipedia , lookup

Lisp wikipedia , lookup

Common Lisp wikipedia , lookup

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