You are on page 1of 124

LENGUAJES DE

PROGRAMACIN

Unidad Didctica 0: Introduccin

Tema 1:
El estudio de los lenguajes de programacin
2

Hardware

Dispositivo de salida

Carcasa (tipo torre)

Monitor
Unidad
de CD-ROM
Unidad
de disquetes
Memoria principal
(ambos dentro)
y Unidad de Disco
Duro

Memori
a

Teclado
Ratn

Modelo Von Neumann


UNIDAD CENTRAL DE PROCESAMIENTO DE DATOS-CPU
Unidad de Control

Unidad Aritmtico-Lgica

Unidad de Memoria

Ideas importantes:
Un programa es una cadena secuencial de instrucciones
Las instrucciones ordenan al ordenador realizar una
operacin sobre unos datos
Las instrucciones se ejecutan una tras otra, aunque puede
haber bifurcaciones condicionales (usar un dato para
decidir entre dos instrucciones diferentes por donde
continuar)
El computador procesa tanto instrucciones como sus datos
Las instrucciones y los datos se almacenan juntos en
4
memoria

Qu entiende la computadora?
La computadora manipula nicamente informacin digital:
Datos e instrucciones se codifican como
dgitos binarios (0s y 1s)

Por qu no se usa una representacin de otro tipo?


Problema tecnolgico (es ms fcil representar ceros y
unos)
A qu nos conduce la solucin adoptada para evitar el
problema tecnolgico?
La mquina slo puede trabajar con cadenas de ceros y
unos
5

a la
= (bcomputadora
+ c)/(d + e)
Qu
entiende
?
Pasos

sumar b y c, y guardar el resultado en una direccin de


memoria temporal X
sumar d y e, y guardar el resultado en una direccin de
memoria temporal Y
dividir el contenido de X por el de Y y guardar el resultado en
la direccin de memoria de a
Ejemplo de cdigo mquina
codigoOp direccOp1 direccOp2 direccRes

0000 00001000 00001100 00001110


0000 00011000 00011100 00011110
0101 00011110 00001110 00000100

Porqu estudiar lenguajes de programacin?

La pregunta es cul es la ventaja de estudiar una variedad


de lenguajes diferentes que es poco probable que uno
llegue a utilizar?:
Mejorar la habilidad para desarrollar algoritmos eficaces.
Mejorar el uso del lenguaje de programacin disponible.
Acrecentar el propio vocabulario con construcciones
tiles sobre programacin.
Hacer posible una mejor eleccin del lenguaje de
programacin.
Facilitar el aprendizaje de un nuevo lenguaje.
Facilitar el diseo de un nuevo lenguaje.
7

Breve historia de los lenguajes de programacin:

Desarrollo de los primeros lenguajes:


Lenguajes

basados en el clculo numrico


(Ejemplo: FORTRAN).
Lenguajes para negocios (Ejemplo:
COBOL).
Lenguajes para Inteligencia Artificial
(Ejemplo: LISP).
Lenguajes para sistemas (Ejemplo: C).

Evolucin de los
Lenguajes de Programacin

Declarativos

Evolucin de los
Lenguajes de Programacin
Orientados a Objetos e
Imperativos

10

El papel de los lenguajes de programacin

Inicialmente los lenguajes se proyectaban para ejecutar programas con


eficiencia. A mediados de los aos sesenta la programacin cambia:

Las mquinas son menos costosas y aumentan los costos de programacin.


Surge la necesidad de trasladar programas de unos sistemas a otros.
El mantenimiento del producto consume mayores recursos de cmputo.
La tarea del lenguaje de alto nivel es la de facilitar el desarrollo de programas
correctos para resolver problemas en alguna rea de aplicacin dada.

Los lenguajes de programacin evolucionan o dejan de usarse.


Influencias que obligan a la revisin del los lenguajes:

Capacidad de las computadoras.


Aplicaciones: Los requerimientos de nuevas reas de aplicacin afectan los
diseos de nuevos lenguajes y las revisiones y ampliaciones de los ms
antiguos.
Mtodos de programacin.
Mtodos de implementacin.
Estudios tericos.
Estandarizacin.
11

Atributos de un buen lenguaje

Claridad, sencillez y unidad (legibilidad): La sintaxis del lenguaje afecta la


facilidad con la que un programa se puede escribir, por a prueba, y ms tarde
entender y modificar.
Ortogonalidad: Capacidad para combinar varias caractersticas de un lenguaje en
todas las combinaciones posibles, de manera que todas ellas tengan significado.
Naturalidad para la aplicacin: La sintaxis del programa debe permitir que la
estructura del programa refleje la estructura lgica subyacente.
Apoyo para la abstraccin: Una parte importante de la tarea del programador es
proyectar las abstracciones adecuadas para la solucin del problema y luego
implementar esas abstracciones empleando las capacidades ms primitivas que
provee el lenguaje de programacin mismo.
Facilidad para verificar programas: La sencillez de la estructura semntica y
sintctica ayuda a simplificar la verificacin de programas.
Entorno de programacin: Facilita el trabajo con un lenguaje tcnicamente dbil
en comparacin con un lenguaje ms fuerte con poco apoyo externo.
Portabilidad de programas
Costo de uso:

1. Costo de ejecucin del programa.


2. Costo de traduccin de programas.
3. Costo de creacin, prueba y uso de programas.
4. Costo de mantenimiento de los programas: costo total del ciclo de vida.
12

Dominios de aplicacin

Aplicaciones de los aos sesenta. Durante la dcada de 1960, casi


toda la programacin se poda dividir en cuatro modelos bsicos de
programacin:

De procesamiento de negocios (COBOL).


Cientficos (FORTRAN).
De sistemas (ALGOL, JOVIAL, etc.): Para construir sistemas operativos.
De Inteligencia Artificial (LISP).

Aplicaciones de los aos noventa. La situacin actual tiene ms


dominios de aplicacin:
De procesamiento de negocios (COBOL).
Cientficos (FORTRAN 90).
De sistemas: Con el advenimiento de los microprocesadores baratos que
gobiernan automviles, hornos de microondas, etc., ha aumentado la
necesidad de contar con lenguajes para tiempo real.
Edicin: Los sistemas de procesamiento de texto tienen su propia sintaxis
para mandatos de entrada y archivos de salida. El traductor TEX produce un
programa en el lenguaje PostScript de descripcin de pginas. PostScript se
puede compilar por medir de un procesador adecuado. ste suele ser la
impresora lser que se utiliza para imprimir el documento.
De proceso: Dentro de UNIX, el lenguaje de comandos de usuario se conoce
como shell y a los programas se les llama guiones de shell (parecidos a los
archivos .bat). Estos guiones se pueden invocar siempre que ocurren ciertas
13
condiciones habilitadoras.

Estandarizacin de los lenguajes

Los estndares son en general de dos clases:

1. Estndares patentados (DE PACTO): Son las definiciones


elaboradas por la compaa que desarrollo el lenguaje y que es su
propietaria.
2. Estndares de consenso (DE FACTO): Se trata de documentos
elaborados por organizaciones con base en un acuerdo entre los
participantes pertinentes. Mtodo principal para asegurar la
uniformidad entre varias implementaciones de un lenguaje.
Ejemplo: ANSI, IEEE, ISO, etc..

Proceso en el desarrollo de normas: Un grupo decide


que un lenguaje requiere una definicin estndar. El
organismo normativo organiza un grupo de trabajo de
voluntarios para desarrollar esa norma. Cuando el grupo de
trabajo llega a un acuerdo sobre su norma, se somete a
votacin por parte de un bloque ms grande de individuos
interesados. Los desacuerdos se resuelven y se produce el
estndar del lenguaje.
14

Uso de estndares en forma eficaz

Es necesario ocuparse de tres cuestiones:


Oportunidad (Cundo estandarizar un lenguaje?): Lo deseable sera
estandarizar un lenguaje lo suficientemente pronto para que exista
suficiente experiencia en el uso del lenguaje, pero no demasiado tarde,
para no alentar muchas implementaciones incompatibles.
Conformidad (Qu significa que un programa se adhiere a un estndar y
que un compilador compila un estndar?): Si existe un estndar para un
lenguaje, se suele hablar de conformidad con respecto a ese estndar. Un
programa es conforme si slo utiliza caractersticas definidas en el
estndar. Un compilador conformable es uno que, cuando se le da un
programa conforme, produce un programa ejecutable que genera la salida
correcta.
Obsolescencia (Cundo envejece un estndar y cmo se modifica?): Los
estndares se tienen que revisar cada 5 aos y ya sea renovarse o
descartarse. Casi todos los estndares requieren compatibilidad hacia
atrs; El nuevo estndar debe incluir versiones ms antiguas del lenguaje.
Esto tiene el problema de que el lenguaje se puede hacer difcil de manejar
a causa de las numerosas construcciones obsoletas.

Una caracterstica es obsolescente si es candidata a ser descartada en la


prxima versin del estndar.
Una caracterstica desaprobada se puede volver obsolescente en el
prximo estndar, por lo cual puede ser descartada despus de dos
revisiones.
15

Efectos de los entornos sobre los lenguajes

Cuatro clases generales de entornos objetivo


cubre casi todas las aplicaciones de
programacin:
de

procesamiento por lotes,


interactivo,
de sistema empotrado, y
de programacin (entorno interactivo).

Cada uno plantea distintos requerimientos


sobre los lenguajes adaptados a esos
entornos.
16

Entornos de procesamiento por lotes

El ms simple entorno operativo se compone slo de


archivos externos de datos. Un programa toma un cierto
conjunto de archivos de datos como entrada, procesa los
datos y produce un conjunto de archivos de datos de salida.
El nombre de procesamiento por lotes viene porque los
datos de entrada se renen en lotes de archivos y son
procesados en lotes por programas.

Los archivos constituyen la base para casi toda la estructura de E/S.


Un error que termine la ejecucin del programa es aceptable aunque
costoso. No es posible la ayuda externa por parte del usuario para
manejar o corregir errores de inmediato.
Carencia de restricciones de regulacin de tiempo. No hay recursos
para monitorear o afectar directamente la velocidad de ejecucin del
programa.
17

Entornos interactivos

El programa interacta durante su ejecucin directa con un


usuario en una consola de visualizacin, enviando
alternativamente salidas hacia sta y recibiendo entradas
desde el teclado o ratn (procesadores de texto, hojas de
clculo, juegos, etc.).

Las caractersticas de E/S interactivas son diferentes de las


operaciones ordinarias con archivos.
El programa debe ser capaz de gestionar el manejo de errores. La
terminacin del programa como respuesta aun error no es
ordinariamente aceptable (a diferencia del procesamiento por lotes).
Los programas interactivos deben utilizar con frecuencia algn
concepto de restricciones de tiempo.
El concepto de programa principal suele estar ausente. En su lugar,
el programa se compone de un conjunto de subprogramas y el
usuario introduce el programa principal como una serie de
comandos en el terminal.
18

Entornos de sistemas incrustados (empotrados)

Un sistema de computadora que se usa para controlar parte de


un sistema ms grande como una planta industrial, una
aeronave, etc., se conoce con el nombre de sistema de
computadora incrustado. El fallo de una aplicacin empotrada
puede poner en peligro la vida. La seguridad de funcionamiento
y correccin son atributos principales.

Suelen operar sin un sistema operativo subyacente y sin archivos de


entorno y dispositivos de E/S usuales. El programa debe interactuar
directamente con la mquina.
El manejo de errores tiene gran importancia. Cada programa debe estar
preparado para manejar todos los errores en forma interna, adoptando
acciones apropiadas para recuperarse y continuar. La interrupcin del
programa no es aceptable y no hay un usuario en el entorno que pueda
proporcionar la correccin interactiva del error.
Operan en tiempo real, donde la respuesta las entradas debe producirse
en intervalos de tiempo restringidos.
Suele ser un sistema distribuido, compuesto por ms de una
computadora.
Una vez iniciadas las tareas, se ejecutan por lo comn de forma
19
simultnea e indefinida.

Entornos de programacin

Es el entorno en el cual los programas se crean y se ponen a prueba. Consiste en


un conjunto de herramientas (editor, depurador, verificador, generadores de datos
de prueba, etc.) de apoyo y un lenguaje para invocarlas.
Al compilar por separado cada subprograma el compilador necesita informacin
de:

La especificacin del nmero, orden y tipo de parmetros.


La declaracin de tipo de datos.
La definicin de un tipo de datos (para la declaracin local de variables).

Un problema comn, es encontrar, durante el ensamblado del programa final


completo, que varios subprogramas y otras unidades de programa tienen nombres
(de variables) iguales. Mtodos para evitar este problema:
Todo nombre compartido debe ser nico. Se deben usar convenciones para la
asignacin de nombres desde un principio.
2. Definir, en el lenguaje, reglas de mbito, para ocultar nombre.
3. Los nombres se pueden conocer agregando explcitamente sus definiciones desde una
biblioteca externa (herencia en POO).
1.

Caractersticas que ayudan a poner a prueba y depurar programas.


Caractersticas para rastreo de ejecucin.
Puntos de interrupcin. Cuando se alcanza un punto de interrupcin durante la
ejecucin del programa, la misma se interrumpe y el control se traslada al programador
en un terminal.
3. Asertos: expresan relaciones que deben cumplirse entre los valores de las variables en
ese punto del programa.
1.
2.

20

Marcos de ambiente

Un ambiente de apoyo
consiste en servicios
de infraestructura que
se conocen como
marco de ambiente.
Este marco suministra
servicios como un
depsito de datos,
interfaz grfica de
usuario, seguridad y
servicios de
comunicacin. Los
programas se escriben
de modo que utilicen
estos servicios.
21

Mquinas virtuales

Aunque hay muchos rasgos que se podran destacar


como candidatos para formar parte de una definicin del
concepto de mquina virtual (a partir de ahora MV), una
MV se puede definir sencillamente como una capa de
abstraccin que separa el funcionamiento de un
ordenador de su hardware. Adems, las MV se dividen
en abstractas o tericas, como sera la mquina de
Turing (el primer ejemplo de una MV), y concretas o
prcticas (a las que se quiere normalmente se hace
referencia al hablar de MV). En esta seccin se tratarn
las MV concretas que, como se ver, son capas de
software que juegan un papel relevante tanto en el
funcionamiento de los lenguajes compilados como
interpretados.
22

Introduccin al concepto

Las MV se construyeron para simplificar el


proceso del control del hardware de un
ordenador porque extienden y enmascaran la
funcionalidad del hardware a travs de
procedimientos y datos abstractos.
Se pueden identificar dos tipos de MV
concretas:
las

que juegan un papel en la preparacin de un


programa para su ejecucin (tiempo de compilacin)
y
las que permiten la ejecucin de dicho programa. La
figura muestra la diferencia entre los dos tipos:
23

El papel de las mquinas virtuales en la compilacin y la ejecucin de un programa.


24

Introduccin al concepto

Las MV suelen aparecer en una jerarqua. Usamos la jerarqua de MV de


compilacin, por ejemplo, cada vez que invocamos el compilador de C+
+. Y dos ejemplos muy comunes del papel de una MV en la jerarqua de
MV de ejecucin son PostScript (que define una MV para una impresora)
y MSDOS bajo MS Windows (que define una MV que permite que
antiguos programas de DOS funcionen bajo Windows).

PostScript es una MV que incluye el estado grfico, la ruta actual, el estado


del diccionario y, aunque sea bastante complejo, presenta una visin de alto
nivel de muchos tipos distintos de impresoras, aislando las caractersticas de
las impresoras de las aplicaciones que las usan.

A la hora de implementar un lenguaje de programacin, las estructuras


de datos y algoritmos utilizados en la ejecucin de un programa (es
decir, la sintaxis y semntica de cada estructura) definen las MV
(implcitamente) para este lenguaje. Y las decisiones que toma el
desarrollador afectan tanto a la traduccin como a la ejecucin de los
programas escritos en este lenguaje. Las MV se distinguen entre s
segn tres criterios:
La concepcin de las MV que tiene el desarrollador basada en la definicin
del lenguaje.
Las facilidades disponibles en el hardware del ordenador.
Las decisiones de implementacin tomadas por los desarrolladores.

25

Introduccin al concepto

Aunque se puede escribir un compilador para traducir (o compilar) un


programa escrito en un lenguaje de alto nivel directamente al cdigo
mquina (en el sentido de no depender de ninguna otra pieza en el
sistema para producirlo), no es nada comn hacerlo hoy en da por varias
razones, dos de las cuales son:
Cuando aparezca en el mercado el siguiente procesador (por ejemplo, Pentium
IVdespus de Pentium III), habr que modificar el compilador.
No tiene sentido repetir el proceso de diseo y desarrollo, que es costoso,
cuando ya se ha hecho lo mismo muchas veces antes para otros lenguajes
para una mquina concreta.

Un caso lo constituyen los compiladores C, que ya llevan mucho tiempo


en funcionamiento y son muy eficientes y estables. Por lo tanto, hay varios
lenguajes como C++ (al menos en las primeras versiones) cuyo
compilador tradujo el cdigo fuente de C++ a C para poder luego usar el
compilador C estndar. En general, slo se suele redisear un compilador
nuevo desde cero cuando los ingenieros del lenguaje estn intentando
alcanzar nuevos objetivos para ese lenguaje, en caso de que vayan ms
all que el modelo funcional de los compiladores ya disponibles como, por
ejemplo, es el caso de Java.
26

Jerarquas de mquinas virtuales

La realidad es que el desarrollador de un lenguaje suele implementar las MV (de


compilacin y/o ejecucin) de su lenguaje en trminos de otras MV ya existentes. Y
en el futuro, un programador de aplicaciones utilizar las MV implementadas por el
desarrollador del lenguaje para producir programas que a su vez puedan servir como
MV para otras aplicaciones, etc. La conclusin, como puede verse, es que una MV
no suele existir aislada, sino como parte de una jerarqua de MV. A continuacin se
va a ver el papel de las jerarquas de MV en el tiempo de compilacin y de ejecucin.
En primer lugar, se va a considerar el papel de la jerarqua de MV en el tiempo de
compilacin. En el caso de C++, como lenguaje de alto nivel que se compila a un
lenguaje tan cerca del nivel de mquina como sea posible, se puede ver que el
proceso de compilacin de un programa de C++ consiste en la interaccin de la
jerarqua de MV mostrada en la figura 2 (aunque puede haber diferencias entre
compiladores de C++; por ejemplo, aqu se supone que es un proceso de
compilacin que usa C como cdigo intermedio). El pre-procesador acepta el cdigo
C++ como fuente y produce otra versin del mismo cdigo C++ con algunas
extensiones e incorporaciones resueltas. El traductor convierte el cdigo fuente C++
estndar a cdigo fuente C. El compilador C acepta este cdigo como fuente y lo
traduce a cdigo ensamblador (una representacin simblica del cdigo mquina). El
ensamblador traduce este cdigo simblico a un cdigo mquina reubicable. Y por
fin, el cargador de libreras acepta este cdigo mquina como entrada y produce un
programa simple ejecutable, compuesto por el cdigo mquina de entrada y todos
los subprogramas necesarios con direcciones de memoria contiguas. Adems del
proceso de compilacin, la traduccin completa de los programas de alto nivel
(previa a su ejecucin) en una forma que corre sobre la mquina, tambin existe otro
proceso, que se llama interpretacin, que tiene ms que ver con el papel de las MV
en el tiempo de ejecucin que en el tiempo de compilacin. 27

Jerarquas de mquinas virtuales

Adems de los lenguajes compilados


completamente, hay otros que son compilados
parcialmente en el sentido de que terminan el
proceso de compilacin en un cdigo (o lenguaje)
intermedio, en vez de en cdigo mquina (lenguajes
intermedios).
En segundo lugar, vamos a considerar el papel de la
jerarqua de MV en el tiempo de ejecucin. Se puede
ver un ejemplo en la figura 3. Como se puede ver en
l, lo que se podra llamar una aplicacin Web (unas
pginas Web con elementos interactivos incrustados)
est escrita en HTML y funciona sobre una MV dada
por el navegador Web, que a su vez est
implementado en C o C++. ste corre sobre una MV
compuesta por las libreras de tiempo de ejecucin
que encapsulan el funcionamiento de los
procedimientos (o mtodos) y datos de navegador
Web que, a su vez, utilizan las funciones de la MV
del sistema operativo implementadas en cdigo
mquina. Y los programas que componen esta MV
corren sobre el firmware, un conjunto de programas
de micro-cdigo que controlan directamente el
hardware del ordenador.

28

Jerarquas de mquinas virtuales

Las jerarquas del tipo mostrado en la figura


tienen una estructura muy parecida a una
jerarqua usa, donde cada capa usa la capa
que est directamente debajo. La diferencia es
que una MV puede tener una interfaz hacia
abajo, adems de la interfaz hacia arriba, que
especifica los servicios que requiere de la capa
inferior, pero sin especificar exactamente qu
implementacin de los servicios es necesario.
Un ejemplo sera la jerarqua de MV que
compone el sistema de ventanas X, donde hay
una capa que define el funcionamiento
independientemente de los dispositivos y,
directamente debajo, una capa que define el
funcionamiento en trminos de los dispositivos.
Aqu X depende de la capa que depende de los
dispositivos, no de una implementacin en
concreto de esta capa (por lo tanto, hay
versiones de X para muchos tipos de hardware
donde la nica diferencia es la implementacin
de la capa relacionada con los dispositivos; las
dems capas superiores son idnticas).

29

Lenguajes intermedios

Un lenguaje intermedio se puede definir


como una manera de representar
procedimientos y estructuras de datos que
sirva como entrada para una MV en alguna
parte de su jerarqua, entre el lenguaje de
entrada (el nivel ms alto) y el cdigo
ejecutado en la mquina (el nivel ms bajo)
tanto en el tiempo de compilacin como en el
de ejecucin.
30

Lenguajes intermedios

Un lenguaje intermedio se puede definir


como una manera de representar
procedimientos y estructuras de datos que
sirva como entrada para una MV en alguna
parte de su jerarqua, entre el lenguaje de
entrada (el nivel ms alto) y el cdigo
ejecutado en la mquina (el nivel ms bajo)
tanto en el tiempo de compilacin como en el
de ejecucin.
31

Lenguajes intermedios

Para considerar el papel de los lenguajes intermedios y sus


ventajas y desventajas, conviene destacar la diferencia entre
la traduccin de un lenguaje de alto nivel a cdigo mquina
anteriormente a su ejecucin (su compilacin) y su
interpretacin, es decir, la conversin de cada instruccin del
lenguaje a cdigo mquina y su ejecucin, una por una, al
ejecutar el programa. Este proceso se realiza a travs de
una MV de interpretacin que simula un ordenador cuyo
cdigo mquina es el lenguaje de alto nivel que est siendo
interpretado. Y tpicamente, esta MV se construye a travs
de un conjunto de programas de cdigo mquina que
representa los algoritmos y estructuras de datos necesarios
para la ejecucin de las instrucciones del lenguaje de alto
nivel. Hay ventajas y desventajas en cada manera de
convertir los lenguajes de alto nivel a cdigo mquina, que
se pueden resumir as:
32

Lenguajes intermedios

33

Lenguajes intermedios

Estos dos casos representan los dos extremos


porque, como ya se ha visto, existe tambin lo
que se llama la compilacin parcial, que es una
mezcla de los dos enfoques, donde se compila
el lenguaje de alto nivel a un lenguaje
intermedio (ms cerca de las estructuras
presentes en el cdigo mquina que las del
cdigo fuente) y luego se interpreta este
lenguaje al ejecutar el programa.
Como puede imaginarse, esta tcnica combina
las ventajas y desventajas de los dos enfoques
anteriores. Un ejemplo de esta combinacin
existe en el lenguaje de programacin Java y su
entorno.
34

Lenguajes intermedios

Entre otras cosas, Java empez con la idea de liberar al


programador de las dificultades de portar su aplicacin a
nuevas plataformas lo cual, si el programa est muy
vinculado a algn aspecto del sistema operativo donde fue
escrito, podra ser muy difcil.
Se compilar el cdigo fuente de Java a un cdigo byte
(bytecode) antes de ejecutarlo. Y a la hora de correr el
programa, este cdigo, como lenguaje intermedio, sera el
lenguaje de entrada para una MV, que con un conjunto de
libreras (el entorno de ejecucin de Java, Java Runtime o
JRE), la interpretara para su ejecucin.
Por lo tanto, este bytecode podra correr en cualquier
hardware donde haya una versin del JRE disponible. Como
este bytecode est ms cerca del nivel de mquina que de
un lenguaje de alto nivel, los programas corrern ms
rpidamente que los programas completamente
interpretados, aunque ms despacio que los programas
previamente compilados al cdigo mquina. 35

Lenguajes intermedios

Como se puede ver en la figura 1, tanto los


programas compilados parcialmente a un
lenguaje intermedio (como Java) como los
programas escritos en lenguajes de alto nivel
que se interpretan (como Lisp) requieren una
MV para interpretar el programa. La principal
ventaja del lenguaje intermedio en este caso
es su proximidad al nivel del cdigo mquina,
en el sentido de que supone menos trabajo a
la hora de ejecutarlo y, por lo tanto, los
programas corren ms rpidamente que los
puramente interpretados.
36

Lenguajes intermedios

Adems del papel de los lenguajes


intermedios en la compilacin parcial, se
puede destacar su papel en la compilacin
estndar. Como ejemplo se puede considerar
C como lenguaje intermedio para un lenguaje
compilado nuevo. Si el autor de un nuevo
lenguaje decide utilizar C, por ejemplo, como
su lenguaje intermedio, slo tendr que
implementar una MV para convertir el cdigo
fuente de su lenguaje a C, ahorrando mucho
trabajo.
37

Lenguajes intermedios

Las ventajas de utilizar un lenguaje tan establecido


como C como lenguaje intermedio son:
La

facilidad de portar el lenguaje a una nueva mquina


(slo hay que tener un compilador C disponible all).
La generacin de cdigo mquina es una tarea muy
compleja que requiere un conocimiento profundo de la
arquitectura de la mquina en cuestin y de cada
mquina en que se quiere una versin del lenguaje.
La facilidad de modificar algn rasgo del comportamiento
del lenguaje en alguna mquina en concreto (por ejemplo,
caractersticas de memoria o rendimiento se pueden
aadir libreras C customizadas sin grandes problemas).
Las posibilidades disponibles para mapear estructuras
intermedias del nuevo lenguaje a estructuras de datos de
C.
38

Lenguajes intermedios

Y las desventajas son:


La

depuracin es muy difcil porque, entre otras cosas, los


errores que ocurren en el cdigo C no son muy fciles de
localizar en lo que ha escrito el programador originalmente
en el nuevo lenguaje.
Las caractersticas de rendimiento y eficiencia del
lenguaje estn determinadas por el
compilador C.
Habr ocasiones en las que no exista una buena
traduccin entre una estructura en el nuevo lenguaje y las
estructuras de datos en C, por lo que habr una prdida de
eficiencia en el programa resultante (como, por ejemplo,
ocurre en la mayora de las ocasiones en que se compilan
estructuras de Prolog a C slo se puede expresar
iteracin en Prolog utilizando recursin).
39

La mquina virtual de Java como


ejemplo de una MV

La MV de Java es una mquina de pila. Las instrucciones


interpretadas por ella manipulan datos almacenados como
elementos en una pila. El contenido ejecutable de un archivo
de bytecodes contiene un vector de instrucciones bytecode
para cada mtodo. Los bytecodes son instrucciones para la
MV, que tiene algunos registros de variables locales y una
pila para la evaluacin de expresiones.
Las primeras variables locales son inicializadas con los
parmetros actuales. Cada variable local o elemento de la
pila es una palabra que corresponde a un entero de 32 bits,
a un punto flotante o a una referencia a objeto (puntero).
Para puntos flotantes dobles y enteros largos se utilizan dos
huecos de la pila.
40

La mquina virtual de Java como


ejemplo de una MV

Los huecos de la pila no estn relacionados con un tipo de


datos, es decir, en algn punto un hueco podra contener un
valor entero y en otro, el mismo hueco podra contener una
referencia a un objeto. Sin embargo, no se puede almacenar
un entero en un hueco y luego recuperarlo reinterpretndolo
como si fuera una referencia a un objeto. An ms, en
cualquier punto del programa, el contenido de cada hueco
est asociado con un nico tipo de datos que puede ser
determinado usando un flujo esttico de datos.
El tipo de datos podra ser no asignado, con lo cual no se
permite leer el valor del hueco. Estas restricciones son parte
del modelo de seguridad de Java y se ven reforzadas por el
verificador de bytecodes.
41

La mquina virtual de Java como


ejemplo de una MV

El cdigo interpretado es generalmente ms lento


que un programa escrito en un lenguaje compilado, y
Java no es distinto en este aspecto. Se han sealado
muchas posibilidades para mejorar el rendimiento de
los intrpretes.
Una muy comn hoy en da es incluir un compilador
relativamente simple en el tiempo de ejecucin de la
MV. Es decir, en vez de interpretar los bytecodes del
programa una y otra vez, se compilan una sola vez
al instante en el interior de la MV, y la
representacin compilada de los mtodos que
corresponden al programa es ejecutada al efectuar
una llamada. Esto es conocido como un compilador
al instante (o JIT, Just In Time).
42

Unidad Didctica 1: Sintaxis y


Semntica de los Lenguajes de
Programacin

Tema 2:
Sintaxis formal de los lenguajes de
programacin
43

Ver Sintaxis y Semntica del resumen en


Problema de traduccin de lenguajes
(Capitulo 2)

44

Unidad Didctica 2:
Paradigmas y lenguajes

Tema 4:
Descripcin de los paradigmas ms
representativos
45

PARADIGMAS DE PROGRAMACIN

La clasificacin de los lenguajes atendiendo a sus


caractersticas intrnsecas conduce a los llamados
paradigmas de programacin. Un paradigma de
programacin es un modelo de programacin que
engloba a ciertos lenguajes que comparten:

Elementos estructurales: con qu se confeccionan los


programas?
Elementos metodolgicos: cmo se confecciona un programa?

46

Programacin Imperativa o
Procedural: FORTRAN

Es la primera que se desarrolla porque va determinando


las operaciones que hay que realizar sobre una mquina
ideal de Von Neumann. Desde este punto de vista un
programa es una secuencia de acciones (instrucciones)
que se realizan en un cierto orden determinado por el
flujo del programa.
Las estructuras para el control son generalmente
sentencias condicionales y bucles. Como un ejemplo
ilustrativo veamos el aspecto de un programa en
lenguaje Pascal que calcula el factorial de un nmero
positivo x:
47

FORTRAN. Historia
Primer lenguaje de alto nivel (1957).
Desarrollado por IBM para el IBM 704.
Estaba orientado a la eficiencia en la
ejecucin.
Definicin estndar del lenguaje en el 66.
Otras versiones:

FORTRAN

77
FORTRAN 90
48

FORTRAN. Ejemplo
PROGRAMTRIVIAL
INTEGERI
I=2
IF(I.GE.2)CALLPRINTIT
STOP
END
SUBROUTINEPRINTIT
PRINT*,HolaMundo
RETURN
END

49

FORTRAN. Caractersticas
Tipos de datos:
Numricos

(enteros, reales, complejos y doble

precisin).
Booleanos (logical)
Arreglos
Cadenas de caracteres
Archivos

FORTRAN 90 ya es estructurado, y no requiere


sentencias GOTO.
Slo dos mbitos para las variables: local y
global
50

Ejemplo anotado

51

FORTRAN. Objetos de datos


Variables y constantes

FORTRAN no es sensible a maysculas y minsculas. Los


nombre de variables tienen de 6 a 31 caracteres mximo y
deben comenzar por una letra. Los blancos son
significativos.
Declaracin explicita de variables.
Enteras (I-N), el resto reales. (se modifica con IMPLICIT).
Punteros: en los primeros FORTRAN no hay punteros y
todas las variables se almacenan en memoria esttica. En
FORTRAN 90 se declaran INTEGER, POINTER::P.
Para memoria dinmica ALLOCATE y DEALLOCATE
52

FORTRAN. Objetos de datos


Tipos de datos estructurados

Arrays, pueden tener hasta 7 dimensiones y se guardan por


colummnas.
REAL M(20),N(-5:5)
DIMENSION I(20,20) (tipo por nomenclatura implcita)

Cadenas de caracteres, el primer carcter es el 1, el operador //


permite concatenar cadenas.

Almacenamiento de datos. Se usa COMMON para datos compartidos


y EQUIVALENCE cuando almacenamos una variable con dos posibles
tipos en la misma posicin de memoria (como union en C). Se usa
DATA para inicializar datos estticos.

CHARACTER S*10, T*25

DATA X/1.0/,Y/3.1416/,K/20/

Tipos definidos por el usuario, con TYPE <nombre>... END TYPE


<nombre>
53

FORTRAN. Control de secuencia


EL conjunto de estructuras de control es limitado:
Expresiones, prioridad de operadores
Enunciados
Asignacin,

cuando se hace entre cadenas hay ajuste


de tamao con blancos o truncamiento.
Condicional. Permite IF <cond> ELSE IF... Para
seleccin mltiple SELECT CASE <expr>
CASE.....CASE DEFAULT.... END SELECT
Iteracin. DO....END DO
Nulo, se usa solo para la etiqueta. CONTINUE.

Control de subprogramas. CALL invoca al


subprograma y RETURN devuelve un valor al
programa llamante.
Construcciones propensas a error: GOTO.
54

FORTRAN. Entrada y Salida

Tipos de archivos:
Secuenciales
De

acceso directo

Comandos: READ, WRITE, PRINT, OPEN ,


CLASE, INQUIRE (propiedades o estado del
archivo) REWIND y ENDFILE (para ubicar el
puntero del fichero).
Para el tratamiento de excepciones en las
sentencias READ/WRITE se puede introducir la
posicin de la rutina de dicho tratamiento
(ERR=90).
55

FORTRAN. Subprogramas

Hay tres tipos de subprogramas:


Function,

devuelven un solo valor de tipo numrico,


lgico o cadena de caracteres.
Subroutine, devuelve valores a travs de variables no
locales COMMON.
Funcin de enunciado, permite calcular una sola
expresin aritmtica o lgica.

FN(X,Y)=SIN(X)**2-COS(Y)**2

Gestin de almacenamiento.
Las

variables son locales o globales (COMMON)


Recursividad: RECURSIVE FUNCTION FACTORIAL(X)
Parmetros de subprograma. Paso por referencia.
56

Abstraccin y encapsulamiento
FORTRAN. Evaluacin del lenguaje

La abstraccin es posible mediante los


subprogramas y el uso de variables COMMON,
aunque su uso es propenso a errores.
FORTRAN sigue siendo utilizado en el mbito
cientfico y es muy eficiente realizando clculos.
La

estructura del programa suele ser dificil de entender.


En FORTRAN 90 se incluye la recursividad y la memoria
dinmica.
Las etiquetas de las sentencias ya no son necesarias, ni
el GOTO, pues se ha transformado en un lenguaje
estructurado.
El aspecto de los programas sigue siendo de
procesamiento por lotes
57

Programacin Imperativa o
Procedural: C

Desarrollado por Ritchie y Thompson en el 72.


Multiuso (inicialmente
Sintaxis compacta

para sistemas)

Historia
60

Thompson desarrolla en Bell Multics, se crea un


lenguaje llamado B.
70, el proyecto UNIX avanza y el lenguaje B se queda
pequeo, se comienza a desarrollar C
82, C es distribuido con Unix y muy usado en las
universidades. ANSI comienza a desarrollar un
estndar
58

Perspectiva del lenguaje C

La programacin en C se compone de:


El

lenguaje C, con un limitado n de estructuras


de control. No hay primitivas si no se usan las
libreras.
El preprocesador de C (#), estos enunciados no
forman parte del lenguaje C y son
preprocesados antes de la compilacin.
Los supuestos de interfaz C (.h), lor archivos
header informan al usuario de las funciones
incluidad en una biblioteca.
Las bibliotecas de C. Archivos obj o lib
conteniendo la implementacin de59las funciones.

Ejemplo anotado

60

Objetos de datos

Tipos de datos primitivos


Los

nombres de variables no pueden comenzar con


dgito. Sensible a may-min.
Los datos son enteros (char, short, long),
enumerados (enum) o float. Los punteros se declaran
con el tipo seguido de *.
No hay booleanos.

Tipos de datos estructurados


Arrays, comienzan en 0 y se guardan por filas.
Tipos definidos por el usuario. Struct { }.
Union, es una definicin de tipo si tcticamente

con
un struct, pero todos los componentes ocupan la
misma memoria.
61

Representacin de almacenamiento
Los tipos de C emplean bsicamente la
representacin hardware de sus datos.
Una variable de tipo array es tambin el
puntero al primer elemento del array que
comienza con el ndice 0.
Es posible inicializar cualquier variable
declarada estticamente.

62

Control de secuencia

Expresiones.Se emplea notacin infija.

Coerciones, pueden ser forzadas haciendo una cast unaria


antes de un valor.

Enunciados. Pueden ser bloques de sentencias entre


llaves.

A + (int)b

Condicional, if...then...else...;
Condicinal mltiple, switch...{case....case...default...;}
Iterativos: while, do , for.
Transferencia del control: brak, continue, goto, return.
De preprocesador: #define, #include, #ifdef, #if...#undef...#else

C no tiene enunciados E/S, estn en stdio.h.


63

Subprogramas y Gestin de
almacenamiento

main() es la funcin de entrada al programa


principal.
Cada funcin tiene asociado un registro de
activacin, que la invoca cuando es llamada.
No hay anidamiento de funciones, por lo que las
variables son globales o locales. Las globales
deben ser declaradas por extern, para que sea
vistas por otros mdulos. extern int i, j, k;
Las funciones de C slo toman argumentos por
valor. Para simular paso por referencia hay que
pasar el puntero por valor.
64

Abstraccin y encapsulamiento
El lenguaje da facilidades para la
definicin de tipos, pero no implementa el
ocultamiento de la informacin, de
manera que si se tiene acceso a un struct,
tambien se acceder a todos sus
componentes.
El uso de bibliotecas con interfaces
header tambin permite la abstraccin.

65

Evaluacin del lenguaje

C es muy potente y popular:


Flexible
Eficiente
Disponible

(se distribuye con Unix)

Portatil

Pero C tambin permite una


programacin descuidada y propensa a
errores.
66

Lenguajes funcionales: LISP


60. McCarthy en el MIT
Muy usado en IA
En LISP la recursin se emplea a menudo
como estructura de control, lo que resta
eficiencia a las ejecuciones.
La ltimas versiones de LISP incluyen un
recolector de basura

67

Hola Mundo en LISP

68

Perspectiva del lenguaje

Interactivo (usualmente)
Los datos en LISP son muy restringidos:

tomos literales (smbolos)


tomos numricos

La estructura de datos bsica es la lista. Incluye


primitivas para su manipulacin.
Los comentarios comienzan por ;
Los parmetros de funcin van todos por valor o por
referencia segn la clasificacin de la funcin.
LISP es interpretado y usa una estructura de gestin de
almacenamiento en montculo con recoleccin de
basura como almacenamiento primario para datos y
programas.
69

Ejemplo anotado

70

Objetos de datos

Tipos de datos primitivos: tomos. Cada tomo


tiene una lista de propiedades asociada, accesible
a travs del puntero que almacena el nombre del
tomo.

No se distinguen may-min para identificadores

Tipos de datos estructurado: listas. Tienen


asociado un puntero al primer elemento (car) y otro
al elemento siguiente (cdr). Una lista vaca apunta
a nil.

Para la asignacin se utiliza setq(x val).


Representacin y almacenamiento.

Cada descriptor de un objeto de datos proporciona tipo y atributos.


En los datos estructurados (listas) se tienen slo punteros a primero
y a siguiente.
71

Control de secuencia

El traductor LISP es una funcin read() que


toma el fuente del fichero y lo interpreta.
La ejecucin del programa consiste en la
evaluacin de las funciones contenidas en el
mismo.
Expresiones:
Condicional
Operaciones
Operaciones

sobre tomos (en preorden): +, -, *, /


sobre listas: cons, car, cdr, list, replace,

null, equal.
Operaciones sobre propiedades: put, get.
Enunciados: prog() para ejecucin secuencial.
Entrada y salida: open(), read(), print().
Definicin de funciones: defun, define.
72

Gestin de subprogramas

Tres clases de funciones:


Funcin

interpretada, en forma de estructura


de listas. Primitivas eval y apply.
Funcin compilada, compiladas en un bloque
de cdigo mquina que puede ser ejecutado
por el interprete del hardware.
Macro, se declara con define. Es
simplemente una funcin ordinaria en LISP.
Puede ser interpretada y compilada.
73

Gestin de almacenamiento

La memoria se estructura en forma de montculo, que


maneja unidades de una palabra de tamao fijo usando
una lista de espacios libres y un recolector de basura.
Entorno de referencia:

Local, es el que se da en las listas, como asociaciones de tomos


relacionados de una determinada manera.
Global o comn, se consigue mediante asociacin de un tomo
con una propiedad del mismo que contiene un puntero al datos
referenciado. Se usa set y setq.

Paso de parmetros:

Transmisin por valor, consiste en evaluar las expresiones de una


lista de parmetros y transmitir los valores resultantes.
Transmisin por nombre, transmitir las expresiones de la lista de
parmetros sin evaluar, y dejar que la funcin llamada los evalue
usando eval. En funciones macro la transmisin por nombre es la
norma. Para funciones lambda se puede especificar la
transmisin por nombre usando nlambda, en lugar de lambda.
74

Funciones en LISP I

Funciones normales, son las que se suelen incluir en las


implementaciones de LISP (ver manual en cada caso).
Funciones de lista, para manipulacin de listas:

car L, devuelve el primer elemento de L.


cdr L, devuelve la cola (lista - primero).
cons x y, devuelve uan lista formada por x e y.
list x y z, devuelve la lista (x y z).
quote x, no se evala x

Predicados

atom x, devuelve True si x es un tomo.


numberp x, devuelve True si x es un nmero
greaterp x y, devuelve True si x>y
lessp x y, devuelve True si x<y
null x, devuelve True si x es nulo
and x y, devuelve x and y
or x y, devuelve x or y
not x, devuelve not x
eq x y, devuelve True si x=y

75

Funciones en LISP I

Funciones aritmticas:
+,

-, *, y /.
rem x y, devuelve el mdulo x/y (remainder).

Funciones de entrada y salida


load

nombrearchivo, lee el archivo a memoria


print x, imprime el elemento x
open nombrearchivo, abre un archivo y devuelve
una puntero al mismo
read, lee del terminal un tomo
help, proporciona ayuda
trace, traza la funcin
bye, termina LISP
76

Abstraccin y encapsulamiento

LISP, en origen, no incluye caractersticas de


abstraccin de datos.
CLOS fue una ampliacin de LISP con
orientacin de objetos. Caractersticas:
Herencia

mltiple
Funciones genricas
Metaclases y metaobjetos
Tcnica de creacin e inicializacin de objetos que
permite control del proceso por parte del usuario.

77

Evaluacin del lenguaje


LISP ha evolucionado durante ms de 30
aos y desarrollado para inteligencia
artificial, pero no es adecuado para
aplicaciones convencionales.
Las versiones compiladas son algo ms
eficientes.

78

Programacin lgica: PROLOG

PROLOG est orientado a la resolucin de


problemas mediante el clculo de predicados,
basado en:
Preguntas

a la base de datos
Pruebas matemticas

El programa PROLOG especifca cmo debe


ser la solucin, en vez de dar el algoritmo para
su resolucin. La solucin se obtiene mediante
bsqueda aplicando la lgica de predicados.
79

Historia
Coulmerauer (1970) desarroll un
lenguaje para hacer deducciones de texto
Se aplica un mecanismo de resolucin
sobre predicados especiales, clusulas de
Horn, llamado unificacin.
La difusin del lenguaje se produce en los
80, pero de forma muy limitada debido a
la falta de aplicaciones en dicho lenguaje.

80

Hola mundo, en PROLOG

81

Perspectiva del lenguaje

El programa prolog se compone de unos hechos


(datos) y un conjunto de reglas, es decir, relaciones
entre objetos de la base de datos.
La ejecucin del programa cargado en memoria
consiste en realizar una pregunta de forma
interactiva: el interprete generar por inferencia los
resultados que se deducen a partir del contenido de
la base de datos.
PROLOG tiene una sintaxis y semntica simples.
Slo busca relaciones entre los objetos creados, las
variables y las listas, que son sus estructuras
bsicas.
Comentarios entre /* */
82

Ejemplo anotado

83

Objetos de datos

Tipos de datos primitivos: variables y constantes:


Enteros
Reales
Caracteres

Los identificadores con minscula representan hechos,


los que van con mayscula variables.
El alcance de una variable es la regla donde aparece.

Tipos de datos estructurados:


tomos:

constantes y variables de cadena


Listas, representadas entre [ ]

Tipos definidos por el usuario. Las reglas para


definir relaciones pueden actuar como tipos de
84
usuario.

Representacin de almacenamiento
Las reglas y hechos son almacenadas en
memoria como listas enlazadas.
La ejecucin de prolog consiste en una
bsqueda en profundidad de un rbol
conteniendo todas las posibles
soluciones. Para cada una de ellas se
evaluar su correccin. La bsqueda se
puede hacer ms eficiente mediante la
poda del rbol de bsqueda (corte).

85

Control de secuencia
El orden de evaluacin es secuencial
Expresiones, operaciones aritmticas y operadores
relacionales. Not().
Enunciados

Hechos, relaciones que se expresan en una consulta. Son


tuplas con un nombre de predicado y unos argumentos.
Reglas, implicaiones que se expresan en una operacin consult
Preguntas, sucesin de trminos que finalizan con un punto.
Cortes, (!), fuerza el retroceso en la bsqueda. Esto puede
impedir que se encuentren ciertas soluciones, pero puede hacer
ms eficiente la bsqueda.

Entrada y salida, nl y write.

86

Subprogramas y gestin de almacenamiento

PROLOG tiene dos modos:


Modo consulta, se introducen nuevas relaciones (hechos) en el almacenamiento
dinmico de la base de datos.
Modos pregunta, se ejecuta un intrprete basado en pilas para evaluar las preguntas
del usuario.

Alcance de las variables:


Ambiente local de referencia, todas las variables son locales a la regla en que estn
definidas. La unificacin hace interaccionar nombres locales de una regla con los de
otras reglas.
Ambiente comn de referencia, todos los datos son compartidos.
Paso de parmetros, la unificacin proporciona el paso de parmetros entre reglas.

Funciones normales, van integradas en el lenguaje:

Consult(nommbrearchivo)
Fail, siempre fracasa
See(nombrearchivo), lee las entradas de un archivo y las incorpora al conjunto de
reglas.
Write(trmino)
Tell(trmino), reorienta la salida del write al archivo
Told, cierra el archivo anterior
Nl, salto de lnea
Atom(X), devuleve cierto si X es un tomo
Var(X), devuelve cierto si X es una variable
Integer(X), devuelve cierto si X es un entero
Trace, activa la depuracin del programa
87

Abstraccin y encapsulamiento

PROLOG no proporciona estas


capacidades.

88

Evaluacin del lenguaje

PROLOG va bien para problemas de relaciones,


p.e. Tratamiento del lenguaje natural, y consulta
de bases de datos.
A pesar de que es posible desarrollar programas
sin especificar el algoritmo de resolucin a
veces hay que echar mano de otro tipo de
programacin para hacer los programas ms
eficientes, y a menudo se emplea el corte para
limitar el espacio de bsqueda.
89

Unidad Didctica 2:
Paradigmas y lenguajes

Tema 5:
El paradigma de la programacin orientada a
objetos (POO)
90

PROG. ORIENTADA A OBJETO

Ver Apuntes sobre la POO

91

HERENCIA

Con frecuencia la informacin se pasa entre


componentes de programa de manera implcita,
a este traspaso de informacin le llamamos
herencia.
La herencia consiste en la recepcin en un
componente de programa de propiedades o
caractersticas de otro componente de acuerdo
con la relacin especial que existe entre ambos
componentes.
Las reglas de alcance de variables son una
forma de herencia.
La herencia mltiple se da cuando una clase
tienen varias superclases de las que hereda.
92

Clases derivadas

La herencia se implementa en los lenguajes orientados


a objetos a travs de clases derivadas, que heredan
propiedades y mtodos de sus superclases.
La visibilidad de los objetos heredados depende de la
forma en que se declaran:

PRIVATE
PUBLIC
PROTECTED

Implementacin: En la clase derivada los nombre


derivados de la superclase se agregan al espacio.

Si en la definicin hay una funcin constructora, hay que incluir


en la declaracin una llamada a dicha funcin.
El objeto guarda la referencia de los apuntadores a todas las
propiedades y mtodos, a esto se llama enfoque con base en
copia de la herencia (usado en C++).
93

Mtodos

La herencia de mtodos para crear objetos


nuevos proporciona un poder adicional que va
ms all del simple encapsulamiento.
En las clases derivadas, cuando se quiere
cambiar uno de los mtodos hay dos
posibilidades:
Redefinir el mtodo en la clase derivada
Usar una funcin virtual, que se enlaza

dinmicamente en el momento de llamada del


subprograma.

94

Clases abstractas

Se usa cuando la superclase define una especie de


plantilla para las subclases, aunque no permite que se
declaren objetos en esta definicin. Esto requiere que
todos los objetos que requieren esta clase se definan de
una subclase derivada.
No se puede crear ningn objeto que tenga funciones
virtuales nulas, del tipo:

Virtual void NombreDeTipo()=0;

HERENCIA MIXIN. Tambin se llama herencia de


incorporacin, en la que solo se define la diferencia entre
la clase base y la clase derivada. Las diferencia se define
en una clase delta:
Deltaclass ModPila {}
Class PilaNueva = class PilaElem + deltaclass ModPila
La ventaja es que las clase delta se pueden adicionar a cualquier
clase.
95

Objetos y mensajes

El lenguaje Smalltalk presenta 3 caractersticas:


Definicin

de clase. Define la estructura interna y los


mtodos que se pueden usar para crear y manipular
objetos.
Ejemplarizacin de objetos. Se crean objetos
especficos para cada definicin de clase.
Paso de mensajes. Los mtodos se pasan como
mensajes a un objeto para llevar a cabo una accin.
Tipos:

Un mensaje unario es un mtodo sin parmetros.


El mensaje binario se usa, principalmente, para operadores
aritmticos.
Los mensajes de palabra clave se usan para hacer
asignaciones de valor, por ejemplo, en un array:

X_Array new: 10
X at:3 put:42
96

Herencia de clases
Si se enva un mensaje a un objeto con
un mtodo que no est definido en su
clase se pasa a la clase progenitora, y as
sucesivamente.
En los mtodos de palabra clave el
parmetro se nombra de forma explcita
en la declaracin del mtodo

97

Conceptos de abstraccin

El encapsulamiento es un mecanismo divide y vencers


para proporcionar control sobre el programa en
desarrollo.
La abstraccin y la herencia puede ser usada para
impedir al programador ver el contenido de los objetos
de datos que no convenga. La herencia,
fundamentalmente, es un mecanismo para pasar
informacin entre objetos en clases relacionadas.
Permite:

Especializacin, para que los objetos derivados contengan


caractersiticas de otros objetos.
Descomposicin, permite separar una abstraccin en sus
componentes. Lo contrario es la agregacin.
Ejemplarizacin, es el proceso de crear ocurrencias de una
clase (se trata de un proceso de copia).
Individualizacin, objetos similares se agrupan con otros para
propsitos comunes. Es lo contrario de agrupamiento.
98

POLIMORFISMO

El polimorfismo es la capacidad de un
solo operador o nombre de subprograma
para referirse a varias definiciones en
funcin del contexto, es decir, de los tipos
de daos de los argumentos y del
resultado.

99

Unidad Didctica 2:
Paradigmas y lenguajes

Tema 6:
La programacin centrada en la red
100

Ver Apuntes sobre la PCR

101

Unidad Didctica 3:
Mecanismos de los LP

Tema 7:
Tipos, declaraciones y control
102

Control de secuencia

Las estructuras para el control de la secuencia


son de 3 tipos:
Estructuras

que se usan en expresiones: precedencia


y parntesis.
Estructuras que se usan en enunciados:
condicionales e iterativos.
Estructuras que se usan en subprogramas: llamadas
a subprogramas.

Estructuras de control explcitas, son las que el


programador usa de forma optativa; mientras
que las implcitas son las que el lenguaje define.
103

Secuenciamiento en expresiones

La evaluacin de expresiones depende de las


prioridades y de los parntesis. Se puede
representar la evaluacin en una estructura de
rbol. Tres rdenes:
Prefijo

(polaca prefija), el operador antecede a los n


operandos.

Se puede evaluar en un solo examen de la expresin


Se puede usar para cualquier nmero de operandos
Traduccin a cdigo fcil y almacenamiento en pila

Postfija,

el operador sigue a sus operandos. Ventajas


parecidas a la prefija.
Infija, slo es adecuada para dos operandos.
Requiere reglas de precedencia y parntesis. La
evaluacin suele ser de izquierda a derecha, pero en
la potenciacin es al revs.
104

Representacin de expresiones en
tiempo de ejecucin

Es necesario traducir las expresiones a una


forma ejecutable:
Secuencias

de cdigo mquina, que deben hacer uso


de localizaciones absolutas de los datos y registros
para guardar datos intermedios.
Estructuras de rbol, luego se ejecutan usando
intrpretes software.
Formas prefija y postfija, pueden ser ejecutadas
almacenndolas en la pila de forma fcil.

105

Evaluacin de expresiones en rbol

Se pueden presentar algunos problemas :


Reglas de validacin uniforme.
Impaciente. Consiste en evaluar todos los operandos que
cuelgan de un operador para luego realizar la operacin.
Frecuente y conceptualmente sencilla.
Perezosa. No evaluar la operacin, sino pasar los operandos sin
evaluar hasta que no quede otro remedio. Se pueden ahorrar
operaciones, pero es difcil de implementar.
Efectos colaterales, si un operando aparece varias

veces en una expresin, pero del momento dela primera


evaluacin a la segunda cambia su valor por un efecto
colateral, no se puede ahorrar su clculo.
Condiciones de error, determinadas operaciones en la
secuencia de clculo pueden fallar (divisin por 0).
Expresiones booleanas en cortocircuito. Una evaluacin
impaciente de expresiones booleanas puede conducir a
un error no previsto por el programador. 106

Secuenciamiento con expresiones


no aritmticas

Este tipo de operaciones son muy utilizadas en lenguajes


lgicos:

Concordancia de patrones
Reescritura de trminos (reglas de produccin)
Unificacin, que consiste, ante una consulta (predicado
conteniendo variables), en la sustitucin de variables para
concordar patrones congruentes con las reglas y hechos de la
base de datos.

En la implementacion de la unificacin en PROLOG las


pilas desempean un papel importante. Adems, para el
recorrido del rbol de bsqueda se emplea el
RETROCESO, salvo que se encuentre la funcin ! (corte),
que hace que se produzca siempre fracaso al retroceder a
la ltima solucin plausible.
107

Control de secuencia mediante


enunciados

Asignaciones a objetos de datos. El valor de los datos


puede variar la secuencia.

Formas de control de secuencia:

Enunciado de asignacin. Suele ser un operador binario que


asigna a la variable izquierda el resultado de evaluar la derecha.
Enunciado de entrada. Leer datos desde un terminal u otro
perifrico.
Otras operaciones de asignacin. La ms usada es la
transmisin de parmetros.
Composicin o secuencia
Alternancia
Iteracin

Control explcito de secuencia: GOTO

Otras sentencias (ya estructuradas): BRAK y CONTINUE.


108

Control de secuencia estructurado

Enunciados compuestos. Serie de enunciados


que se pueden tratar como un solo enunciado
(bloques).
Enunciados condicionales, expresan alternancia
de dos o ms enunciados:
If
Case

Enunciados de iteracin, es le mecanismo


bsico para la repeticin de un proceso:
Repeticin
Repeticin
Repeticin
Repeticin

simple: perform (FORTRAN)


mientras: while.
mientras con contador: for
indefinida: loop
109

El problema del control de


secuencia estructurado.

La estructura puede ir complicndose por:

Programas primos, tienen:

Enunciado de iteracin con salidas mltiples.


Condiciones excepcionales (errores y su tratamiento)
Un solo arco de entrada
Un solo arco de salida
Unas sola ruta del arco de entrada a cada nodo, y de cada nodo
al arco de salida

El teorema de la estructura (Jacobini) establece que


todos los programas se pueden reescribir usando los
enunciados de la programacin estructurada.
110

Control de secuencia en los


subprogramas: Llamada/Regreso simple

Tienen el mismo efecto que si se copia el cdigo


del subprograma en la llamada call (regla de
copia):
Los

subprogramas no pueden ser recursivos


Se requieren enunciados call explcitos
Los subprogramas se deben ejecutar por completo
en cada llamada
Transferencia inmediata del control en el punto de
llamada
Secuencia nica de ejecucin
111

Control de secuencia en los


subprogramas: Subprograma simple
Llamada/Regreso

Es posible el control sobre los datos:


Transmisin de parmetros
Variables locales
Variables globales

Para la implementacin es necesario:


La definicin del subprograma, esttica e invariable.
Un registro de activacin, cambiante, que almacena:
Datos locales
Parmetros
Otros elementos de datos:

Apuntador a la instruccin presente (CIP)


Apuntador del ambiente presente (CEP). El ambiente de
referencia es el registro de activacin.
Direccin de retorno
112

Control de secuencia en los


subprogramas: Subprogramas recursivos

La recursividad es un procedimiento para el


control de secuencia consistente en que un
programa se llama a s mismo, de manera que
se crea una segunda activacin del subprograma
durante el tiempo de vida de la primera
activacin.
Implementacin:
No

es conceptualmente distinto del caso anterior, slo


es necesario disponer de espacio para los registros de
activacin de las llamadas recursivas (pila).
113

Atributos del control de datos

Es necesario, durante la ejecucin, conocer el significado o valor de


cada identificador que aparece en el programa.
Nombres, sirven para asociar un identificador a un dato. Clases:

De variables
De parmetros formales
De subprogramas
Para tipos definidos
Para constantes definidas
De enunciados
De excepciones
Para operaciones primitas
Para constantes de literales

Un nombre compuesto corresponde a una estructura de datos.


Segn el ambiente de referencia, cada ASOCIACIN representa la
pareja de un identificador y su objeto de datos.

114

Ambientes de referencia

Ambiente local de referencia:

Parmetros formales
Variables locales
Subprogramas definidos

Ambiente no local de referencia, son identificadores que


se pueden usar desde el subprograma, pero no se crean
en l.
Ambiente global de referencia, es la parte del ambiente
no local. Una variable local oculta a la global del mismo
nombre.
Ambiente predefinido de referencia. Algunos
identificadores son predefinidos por el lenguaje
115

Alcance esttico y dinmico


El alcance esttico de un identificador
para una asociacin es el conjunto de
activaciones de subprograma en las
cuales la asociacin es visible.
Una regla de alcance dinmico define las
asociaciones en el curso dinmico de
activaciones de subprogramas.

116

Datos compartidos en subprogramas

Los objetos de daots suelen ser


compartidos para la comunicacin con y
entre los distintos subprogramas.
Enfoques:
Ambientes

comunes explcitos
Ambientes no explcitos con base a alcance
dinmico
Alcances esttico
herencia
117

Parmetros y transmisin de parmetros

Los parmetros y resultados transmitidos de


manera explcita son el mtodo principal para
compartir datos entre subprogramas.
Parmetro real, es una clase de objeto de datos
dentro de un subprograma que aparece declarado
en el encabezamiento.
El parmetro real es el objeto de datos que se
comparte con el subprograma llamado.
El establecimiento de correspondencia entre el
parmetro real y el formal puede ser:
Correspondencia
Correspondencia

de posicin (lo ms frecuente)


por nombre explcito, ambos
parmetros se aparean en la llamada:

Sub(Y => B, X => 27)


118

Mtodos para transmitir parmetros

Llamada por nombre, se copia.


Llamada por referencia, se pasa el puntero al
parmetro real.
Llamada por valor resultado, se copia y
caundo finaliza se escribe el valor resultado
sobre el parmetro real.
Llamada por valor constante, el parmetro real
se pasa al formal como valor constante, no se
puede modificar.
Llamada por resultado, se usa slo para
transferir un resultado de regreso al programa.
No importa su valor inicial.
119

Semntica de la transmisin

Independientemente de la la
implementacin los parmetros pueden ser:
De

entrada (IN)
De salida (OUT)
De entrada/salida (IN/OUT)

Lo normal es que los parmetros con tipos


elementales de datos admitan las 3
posibilidades, y que los tipos de datos
compuestos (arrays y registros) se pasen
por referencia.
120

Subprogramas como parmetros

Para transmitir un subprograma como parmetro al


subprograma que se llama hay que tener en
cuenta que:
El

parmetro real es el nombre del subprograma que se


transmite
El parmetro formal especifica el tipo de subprograma
Procedure Q(x:integer, function R(y,z:integer):integer)
Problemas asociados con los parmetros de
subprograma:

Verificacin esttica de tipos, pues en la llamada se debe hacer


esta comprobacin.
Referencias no locales (variables libres), es decir variables que
no tienen enlaces dentro de la definicin del subprograma.
Son necesarias reglas de asociacin ms reciente para
referencias no locales.
121

Ambientes comunes explcitos

Un ambiente comn para compartir objetos de


datos es la forma ms sencilla de compartir
datos entre subprogramas.
Bloque

COMMON, de fortran
Paquetes en ADA.
Clases en C++ y SmallTalk, aunque no es su principal
objetivo

Es necesario definir el alcance y la proteccin


para los ambientes comunes explcitos
122

Unidad Didctica 3:
Mecanismos de los LP

Tema 8:
Mecanismos de abstraccin
123

124

You might also like