You are on page 1of 84

CONCEPTOS Y PARADIGMAS DE LENGUAJES DE

PROGRAMACION

CONTENIDOS MINIMOS:

Sintaxis y semntica.
Semntica operacional.
Entidades y ligaduras.
Sistemas de tipos.
Encapsulamiento y abstraccin.
Intrpretes y Compiladores.
Paradigmas de lenguajes (imperativo, orientado a objetos, funcional, lgico).
Programa

1- Lenguajes de Programacin como herramientas para producir software. Objetivo del estudio de sus
conceptos. Distintos puntos de vista. Capacidad de comunicacin. Relacin e integracin de los
lenguajes de programacin respecto a otros conceptos.
2- Evaluacin de los lenguajes de programacin a travs de las caractersticas del software que
producen. Principios de diseo de los lenguajes.
Perspectiva histrica de los lenguajes de programacin motivacin, herencia, caractersticas,
evolucin. Desde Fortran hasta Java. Lenguajes funcionales. Lenguajes Orientados a objetos.
Abstraccin: qu papel juega.
Necesidad de estandarizar: cundo y cmo hacerlo?
3- Estructura de un lenguaje: sintaxis y semntica.
Sintaxis: Caractersticas de las sintaxis. Elementos de las sintaxis. Estructuras sintcticas. Reglas
lxicas y sintcticas. Tipos de sintaxis. Sintaxis abstracta y concreta.
Formas de definir la sintaxis. Gramticas. (Backus Naum Form).rboles sintcticos y de derivacin.
Gramticas recursivas. Subgramticas. Gramticas ambiguas. EBNF. Diagramas sintcticos
(CONWAY)
Semntica esttica.
4- Semntica. Tipos de semnticas. Formas de definir la semntica de un lenguaje de programacin.
Procesamiento de un lenguaje interpretacin y traduccin. Tipos de traductores. Comparacin entre
Traductor e Intrprete. Combinacin de ambas tcnicas. Compiladores. Etapas de Anlisis y Sntesis.
Optimizacin.
1

5- Semntica Operacional.
Ligadura. Descriptores. Momentos de ligadura. Estabilidad.
Variables. Arquitectura Von Newman. Atributos. Momentos y estabilidad. Nombre: caractersticas.
Alcance: visibilidad, reglas. Tipo: definicin, clasificacin. L-valor: tiempo de vida, alocacin. R-valor:
constantes, inicializacin. Alias
6- Unidades. Atributos. Representacin en ejecucin. Elementos. Unidades recursivas. Unidades
genricas. Alias y sobrecarga. Procesador abstracto: elementos, instrucciones.
Procesamiento de un lenguaje: clasificacin. Lenguaje esttico. Entidades locales. Rutinas internas.
Compilacin separada. Lenguajes basados en pila. Unidades recursivas, implementacin. Estructura
de bloque. Datos semidinmicos y dinmicos. Lenguajes dinmicos.
7- Compartir Datos. Ambiente comn. Acceso al ambiente no-local. Parmetros. Ventajas. Evaluacin de
los parmetros reales y ligadura con los parmetros formales. Clase de parmetros: Datos y
Subprogramas. Modos de pasaje de parmetros datos. Pasaje de Rutinas como parmetros.
8- Sistema de tipos. Tipos predefinidos, tipos definidos por el usuario, tipos estructurados, tipos
abstractos. Implementacin de datos, su representacin.
Sistema de tipos: lenguajes seguros y fuertemente tipados.
Encapsulamiento y abstraccin. Evolucin de los tipos. Tipos abstractos. Equivalencias de tipos.
9- Abstraccin de Control. Estructuras de control: Definicin de estructuras de control a nivel de sentencia
y a nivel de unidad. Tipos de estructuras de control a nivel de sentencia. Diferencia entre sentencia de
asignacin y expresin. Evolucin de las sentencias de seleccin e iteracin en diferentes lenguajes,
desde PL/1 a Java.
10- Abstraccin de control a nivel de unidad. Excepciones: Definicin. Modelos de Terminacin y
Reasuncin. Distintos modelos de manejo de excepciones. Comparacin.
11- Paradigma funcional. Caractersticas. Comparacin lenguaje imperativo con lenguaje funcional.
Definiciones de funciones. Script. Expresin y valor. Transparencia referencial. Evaluacin de las
expresiones, mecanismo de reduccin o simplificacin. Orden aplicativo, orden normal (lazy
evaluation).Tipos de datos bsicos y derivados. Tipos de funciones. Expresiones polimrficas.
Currificacin. Clculo Lambda. Dominios de aplicacin.
12- Paradigma Orientado a Objetos. Caractersticas. Elementos bsicos de la programacin orientada a
objetos: objetos, mensajes, mtodos, clases. Conceptos de generalizacin, especificacin y herencia.
Diferentes tipos de herencia. Lenguajes hbridos, caractersticas principales. Dominios de aplicacin
13- Paradigma lgico. Caractersticas. Elementos de la programacin lgica: variables, constantes,
trminos compuestos, listas. Clusulas y predicados. Reglas y hechos. Dominios de aplicacin

RESUMEN
INTRO
El valor de un lenguaje o de un concepto se debe juzgar segn la forma en que afecta la produccin de Software y a
la facilidad con la que puede integrarse a otras herramientas
PARA QU ESTUDIAR CONCEPTOS DE LENGUAJES?
1. Para aumentar la capacidad para producir software
Conocer profundamente las caractersticas de los lenguajes permite aprovechar su potencia y evitar
errores, minimizando esfuerzo
2. Para mejorar el uso del lenguaje que ya se esta utilizando
Si se entiende como se implementa cada caracterstica se mejora la capacidad para escribir programas
eficientes.
3. Para incrementar el vocabulario
El lenguaje
equivale a comunicacin.
es una ayuda y una limitacin al pensamiento.
permite expresar y estructurar el pensamiento
Incrementamos la capacidad para expresar ideas
4. Para elegir mejor un lenguaje
Si se conocen ms a lenguajes, se facilita la eleccin del ms adecuada de acuerdo al rea del
problema y por lo tanto se reduce el esfuerzo de codificacin.
5. Para facilitar el aprendizaje de nuevos lenguajes
Un lingista que conoce profundamente la estructura subyacente del lenguaje natural aprende
muchsimo mas rpido un nuevo lenguaje (idioma) que una persona que no sabe nada del tema
6. Para facilitar el diseo e implementacin de lenguajes
El programador puede convertirse en diseador o implementador de un lenguaje.
LENGUAJE DE PROGRAMACION Y METODO DE DISEO
Paradigmas de lenguajes
Procedural: descomposicin en pasos - rutinas
Funcional: expresiones y funciones - composicin.
Con TADs: reconocimientos de Tads
basada en mdulos: grupo de entidades-interfaces
OO: clases instancias - jerarquas
Programacin genrica: mdulos genricos instanciados en compilacin o ejecucin
Programacin declarativa: no algortmico, declaracin del problema (especificacin)

CRITERIOS PARA EVALUAR LOS LENGUAJES DE PROGRAMACION


1. FACILIDAD DE ESCRITURA
La facilidad de escritura es la medida de cuan fcil resulta usar un lenguaje para

construir soluciones.

Elementos que favorecen a la facilidad de escritura:


1.

SIMPLICIDAD
Las caractersticas del lenguaje deben ser fciles de capturar: entender y recordar

2.

EXPRESIVIDAD
Un lenguaje es expresivo si sus herramientas permiten expresar la naturaleza del problema.

3.

ORTOGONALIDAD
Permite que los elementos del lenguaje puedan componerse conforme un conjunto determinado de reglas. Esto
es, que los efectos de la composicin puedan entenderse y predecirse. El usuario comprende mejor si tiene un
pequeo nmero de primitivas y un conjunto consistente de reglas de combinacin.

4.

SOPORTE DE ABSTRACCIN
Concepto clave para manejar la complejidad
Abstraccin de procesos y de datos
Principio de diseo: Ocultamiento de la Informacin

2. LEGIBILIDAD
Fcil de leer por las personas (equipo)
Es una propiedad que favorece la modicabilidad y la mantenibilidad de los programas. Los elementos que
caracterizan la legibilidad de un lenguaje son:
1. Semntica/Sintaxis
Restricciones semnticas
If-then-else anidados
Separacin de sentencias
indentacin
2. Sintaxis
Documentacin y comentarios
Eleccin de nombres
Uso de constantes
Convenciones lxicas

3. Definicin del lenguaje


Precisin en la definicin de la sintaxis y de la semntica
Ambigedad
Portabilidad
Definiciones formales
4. Estructuras de control
Programacin estructurada
5. Estructuras de datos
Facilidades para expresar los datos del problema
3. CONFIABILIDAD
El lenguaje aporta mecanismos para comprobar que los programas sean correctos. El objetivo es comprobar
estticamente la mayor cantidad de aspectos, pues las comprobaciones dinmicas no certifican el estado correcto de un
programa.
De esta manera se tiene mas probabilidades que el programa sea correcto y ms eficiente. El lenguaje es robusto si es
capaz de prevenir situaciones.
Correcto: cumple con las especificaciones
Certificacin:
Verificacin de programas: probar su Correccin
Chequeo de tipos
Chequeos estticos y dinmicos
Robusto
Capacidad de prevenir situaciones
Manejo de excepciones
Restriccin de alias
Dos nombres que referencian la misma posicin de memoria

4. MANTENIBILIDAD
Modificabiliad: facilidad de introducir cambios
Factoreo: una sola vez y luego reusar
Localidad: el efecto de una caracterstica se restringirse a una porcin local del programa
5. EFICIENCIA
Tiempo y Espacio
Esfuerzo humano
Optimizable

Evolucin de los lenguajes


Primera Etapa
Las primeras mquinas estaban proyectadas para resolver problemas numricos y se pensaba en ellas como calculadoras
electrnicas. Los clculos numricos han sido la forma dominante de su aplicacin.
1. ASSEMBLER
Ao de aparicin. 1950
Objetivo. Resolver problemas numricos
Caractersticas. Cdigo similar al de mquina, introduce smbolos para su uso, adems del cdigo hexadecimal
Aportes. Introduce el uso de subprogramas y estructuras de datos lineales
2. FORTRAN
Ao de aparicin. 1954
Objetivo. Demostrar que a pesar de que es un lenguaje de ms alto nivel, es tan eficiente como ASSEMBLER. Sus creadores
buscaban trasladar frmulas matemticas al cdigo de mquina
Caractersticas. La meta era conseguir un lenguaje de programacin que incluyera estructuras de control, condicionales y
enunciados de entrada salida. No es flexible en cuanto a su sintaxis pero si eficiente
Aportes. Se incorpora la posibilidad de escribir expresiones cientficas casi literalmente
3. ALGOL-60
Ao de aparicin. 1958
Objetivo. Es un lenguaje diseado para describir algoritmos. Tiene una notacin aproximada a las matemticas normales. Los
programas escritos en ALGOL deban ser compilados en lenguaje de mquina y no ligarse a una arquitectura.
Caractersticas. Fue diseado por un comit, por lo que es ms denso que los lenguajes que existan hasta entonces.
Originalmente fue pensado para que manejara la interaccin de entrada y salida en mayor escala que el clculo. Backus fue el
editor del informe que defini el lenguaje. Us una notacin sintctica que aplicaba el concepto de lenguaje libre de contexto, y de
esta manera introdujo la teora formal de la gramtica al mundo de los lenguajes.
Aportes. Introdujo las estructuras de bloques anidados y su implementacin como una pila de ejecucin. Utilizando la escritura
prefija o polaca para expresiones se implement un proceso ms eficiente de evaluacin con base en pilas
4. COBOL
Ao de aparicin. 1960
Objetivo. El COBOL (Common Busisness Oriented Languaje) se ha usado ampliamente desde principios de los aos setenta para
aplicaciones de negocios. Muchos aspectos del lenguaje estn planteados para permitir el uso de estructuras relativamente
eficientes en tiempo de ejecucin, aunque este objetivo es menos importante que el de la independencia del hardware y
transportabilidad del programa. El desarrollo de COBOL fue organizado por el Departamento de Defensa de EE.UU. bajo la
direccin de Grace Hopper. Un objetivo que se persegua era desarrollar un lenguaje en ingles natural
Caractersticas. Si bien el lenguaje es bastante legible, tiene una sintaxis formal y, sin capacitacin adecuada, no se puede
programar con facilidad.
La traduccin de COBOL a cdigo ejecutable eficiente es compleja a causa del nmero de diferentes representaciones de datos y
la gran cantidad de opciones para la mayora a de los enunciados
Aportes. COBOL brinda las herramientas sintcticas para separar los elementos del programa dependientes de los independientes
de la mquina. El resultado es una divisin del programa en DATA (datos) conteniendo descripciones de datos, ENVIRONMENT
(entorno) con especificaciones del programa dependientes de la mquina, y PROCEDURE (procedimiento) conteniendo los
algoritmos. Puede agregarse una divisin IDENTIFICATION (identificacin) que sirve para dar nombre al programa y
proporcionar documentacin adicional
Segunda Etapa
Se desarrollan lenguajes especficos que consumen muchos recursos de mquina y terminales. Estos lenguajes no tuvieron tanta
distribucin.
1. LISP
Ao de aparicin. 1960
Objetivo. Proyectado por John McCarthy, el lenguaje se ha llegado a usar ampliamente para investigacin en ciencias de la
computacin, en forma destacada en el rea de inteligencia artificial (prueba de teoremas, sistemas inteligentes, etc.).
6

Caractersticas. Desde el punto de vista de su diseo, est destinado a la programacin en forma aplicativa. La ejecucin de una
expresin es el concepto principal que se necesita para la secuenciacin de programas. Por esta razn el almacenamiento en
estructuras de begindescription se convierte en un proceso para la gestin de almacenamiento en lugar del mecanismo tradicional
de registros de activacin de los lenguajes de procedimiento.
Aportes. Sus objetos bsicos son tomos y listas de tomos, y la llamada y recursin de funciones constituyen los mecanismos
bsicos de ejecucin. LISP es diferente en muchos aspectos, y el ms notable es la equivalencia de forma entre programas y datos,
lo que permite ejecutar estructuras de datos como programas y modificar programas como datos. Se destaca la fuerte dependencia
de la recursin como estructura de control, en vez de la iteracin.
2. APL
Ao de aparicin. 1966
Objetivo. Se crea para conseguir un eficiente manejo de arreglos.
Caractersticas. Define el uso de smbolos especiales para clculos matemticos especficos.
Aportes. Se codifica en los mismos terminales IBM/360 en lugar de la utilizacin de tarjetas.
3. SNOBOL
Ao de aparicin. 1965
Objetivo. El desarrollo fue iniciado en 1972 en los laboratorios Bell. La meta era desarrollar un lenguaje de procesamiento de
cadenas para manipulacin de frmulas y anlisis de grficos. Su nombre proviene de StriNg Oriented symBOlic Language.
Caractersticas. Implementa la concordancia de patrones con base en gramticas BNF. Es totalmente dinmico, incluyendo sus
declaraciones, tipos, asignacin de almacenamiento, hasta puntos de entrada y salida de procedimientos
Aportes. Procesamiento de Strings. La implementacin emplea macros virtuales de procesamiento de cadenas (rescritura de
macros para cualquier computadora existente.
Tercera Etapa
En cuanto a hardware se percibe una evolucin hacia un tamao y velocidad creciente y costo decreciente. Surgen las
minicomputadoras, la micro-programacin y los circuitos integrados.
1. BASIC
Ao de aparicin. Principio de los 60
Objetivo. El BASIC (Begginers All-purpose Symbolic Instruction code) fue desarrollado con el objetivo de suministrar un
entorno sencillo de computacin. En especial para estudiantes no cientficos. Adems, para aumentar la eficiencia, el BASIC se
proyect como un lenguaje interactivo antes de que el tiempo compartido estuviera presente en todas las arquitecturas.
Caractersticas. Se trata de un lenguaje con sintaxis y semntica extremadamente simples, posee enunciados numerados y los
nombres de variables se definen con una letra sola ms un digito. Sus estructuras de decisin (IF), iteracin (FOR) e invocacin a
subrutinas (GOSUB) tienen vinculacin simple.
Aportes. BASIC es un ejemplo contradictorio de la programacin. Mientras que la sintaxis es extremadamente fcil de aprender,
la complejidad de armar un programa hace que el cdigo sea ilegible en una cantidad mayor de sentencias. Las versiones mas
recientes incluyen mayor flexibilidad, asemejndolo a lenguajes como Pascal FORTRAN.
2. PL/1
Ao de aparicin. 1965
Objetivo. Con la introduccin de su nueva lnea de computadoras 360, IBM desarroll un lenguaje que fusionara los atributos
numricos de FORTRAN con las caractersticas de programacin para negocios de COBOL. Busc reunir todos los conceptos
importantes de los lenguajes predecesores. Un subconjunto logr un xito moderado en los aos setenta como compilador
educativo (PL/C)
Caractersticas.
Aportes. Incorpora el manejo de situaciones excepcionales, la posibilidad del manejo de concurrencia y el uso explcito de
punteros
Cuarta Etapa
1. Simula
Ao de aparicin. 1967
Objetivo. Desarrolla un esquema de clases para comunicacin de procesos y lo introduce como mecanismo de modularizacin,
para lo que dispone de nuevas herramientas sintcticas
Caractersticas. Es un derivado de ALGOL que introdujo clases como objetos de datos.
Aportes.
7

2. ALGOL-68
Ao de aparicin. 1968
Objetivo. Tuvo como principal objetivo el de ser un lenguaje ortogonal
Caractersticas. Define pocos elementos y permite su libre combinacin
Aportes. Introduce arreglos flexibles y tipos definidos por el usuario
3. Pascal
Ao de aparicin. 1968
Objetivo. Fue proyectado por Niklaus Wirth para superar muchas deficiencias del lenguaje ALGOL ms antiguo. Su creador tena
como objetivo disear un lenguaje que se pudiera compilar en un solo paso y utiliz un algoritmo de anlisis sintctico para
desarrollar el intrprete de cdigo P. Por mucho tiempo fue el lenguaje que se utiliz como herramienta de enseanza en la
iniciacin a la programacin.
Caractersticas. Es un lenguaje muy simple y expresivo. Permite declarar procedimientos locales internos y crear una jerarqua
completa de nombres anidados de objetos de datos. Un programa Pascal siempre est formado por un solo bloque de programa
que contiene definiciones de los subprogramas que se usan. Tiene un conjunto bastante grande de tipos de datos primitivos y
estructurados; permite, mediante la sentencia type, definir tipos nuevos, aunque no proporciona encapsulamiento de sus
operaciones.
Aportes. El compilador de Pascal traduca primero el programa fuente en Pascal a un lenguaje de mquina hipottico para una
mquina que tena como base una arquitectura de pilas. El compilador de Pascal estaba escrito en el mismo Pascal. A causa de
esta estructura, el Pascal era fcil de transportar a otros sistemas. Para pasar a una mquina nueva requiere solamente rehacer el
intrprete de cdigo P.
Permite el uso de un tipo apuntador y una operacin para crear nuevos objetos de datos que permiten construir una secuencia de
datos de tamao dinmico (listas enlazadas)
Quinta Etapa
1. C
Ao de aparicin. 1972 - Laboratorios Bell
Objetivo. Aunque es un lenguaje de programacin para usos generales, se le ha asociado con la programacin de sistemas
operativos. Se uso por primera vez para escribir el ncleo de UNIX, y conforme este sistema se comercializ en los aos 80, C se
hizo cada vez ms popular
Caractersticas. Est relacionado con ALGOL y Pascal en cuanto a estilo, y con la inclusin de atributos de PL/I. Su sintaxis es
compacta y clara, y tiene caractersticas de ejecucin eficientes. La gran biblioteca de funciones normales proporciona a C una
forma fcil de administrar los recursos del sistema con un alto nivel de abstraccin. La relacin entre arreglos y apuntadores, al
igual que la visin transparente de las cadenas como arreglos de caracteres o apuntadores a series de caracteres, da lugar a
operaciones eficientes de procesamiento de cadenas.
Aportes. Es el primer lenguaje de alto nivel que se uso para la implementacin de sistemas, dado que los sistemas operativos
anteriores estaban implementados en ASSEMBLER. Muchas de sus ideas provienen del lenguaje BCPL, en su subconjunto B, que
fue proyectado para la programacin de sistemas. Estos antecesores carecan de tipos, por lo que C fue innovador al incluir una
variedad de tipos de datos. El estndar ANSI contribuye con la definicin de una biblioteca de funciones de acceso al sistema
operativo y otras actividades semejantes. C no es un lenguaje fuertemente tipado, sino que al evolucionar, su verificacin de tipos
ha sido reforzada.
Sexta Etapa
Se introduce el concepto de ambiente de desarrollo de software y el paradigma Orientado a Objetos. El costo de dicho desarrollo
involucra desde entonces el costo humano adems del tecnolgico.
1. Ada
Ao de aparicin. 1983
Objetivo. Originalmente fue diseado para aplicaciones militares. La meta era proyectar un lenguaje y estandarizarlo antes de que
existieran variantes incompatibles. Este estndar se concret antes de que existieran traductores funcionales para el lenguaje.
Caractersticas. Pascal fue el punto de partida para el dise de Ada, pero difieren en muchos aspectos importantes. Ada est
pensado para permitir la construccin de programas grandes por equipos de programadores, ya que un programa se proyecta como
una coleccin de componentes de software llamados paquetes, donde cada uno representa un tipo de datos abstracto que se
comparten entre subprogramas
Aportes. A travs del uso de paquetes suministra los conceptos de abstraccin y encapsulamiento de tipos de datos y operaciones
definidos por el programador. Introduce un extenso conjunto de caractersticas para el manejo de excepciones. El aspecto mas
notable de las caractersticas de control de Ada es la provisin de tareas (tasks) capaces de ejecutarse concurrentemente. En sus
versiones posteriores al Standard ANSI introduce herramientas de definicin de objetos de datos y cdigo genricos.
8

2. Smalltalk
Ao de aparicin. 1972
Objetivo. Fue proyectado como un sistema total y no simplemente como una notacin para desarrollar programas
Caractersticas. Smalltalk tiene una definicin nuclear pequea, ya que toda su funcionalidad se basa en desarrollar subclases de
otras ya existentes y anexar mtodos a cada una de ellas. Sus sentencias bsicas definen asignacin y ejecucin secuencial, ya que
el resto de las estructuras de control necesarias estn implementadas por clases y pasaje de mensajes. Conforme se construye un
conjunto de clases y mtodos, es simple ampliar el programa para manejar problemas mayores.
Aportes. Se basa por completo en encapsulamiento y abstraccin. La herencia es una caracterstica bsica del proceso de
invocacin de mtodos.
3. C++
Ao de aparicin. 1986
Objetivo. A partir del lenguaje C, Bjarne Stroustrup busc desarrollar un lenguaje ecaz que conservara la eficiencia de C y que
incorpore la herencia de objetos, percibiendo que el concepto de clase que fue introducido por Simula era un mecanismo eficiente
de tipificacin
Caractersticas. El uso de clases no hace que los programas se ejecuten ms lentamente. C++ tiene tipificacin ms fuerte que la
de C, pero casi todos los programas escritos en C deben poder ser compilados por un compilador de C++. No es lenguaje muy
simple de aprender, pero para programadores experimentados, C++ permite desarrollar programas muy eficientes.
Aportes. C++ da cabida a clases y definiciones de mtodos para hacer extensivo el proceso de encapsulamiento de tipos de datos
abstractos a funciones polimrficas. Mientras que el desarrollo de clases es una ampliacin relativamente menor a la sintaxis de C,
el uso apropiado de mtodos y funciones modifica en grado considerable la manera como se construyen los programas en C++
La implementacin subyacente de caractersticas del lenguaje es bastante transparente, lo que produce programas que se ejecutan
con eficiencia
4. Java
Ao de aparicin.
Objetivo. Fue diseado para desarrollar software de redes.
Caractersticas. El cdigo Java se compila a un nivel intermedio, generando "bytecodes que son posibles de interpretar por una
maquina virtual Java. Existe un maquina virtual para cada plataforma.
Aportes. Introduce ms movilidad, de manera que el software producido sea portable e independiente de la plataforma.

SINTAXIS Y SEMNTICA

Sintaxis
La sintaxis es un conjunto de reglas que definen como componer letras, dgitos y otros caracteres para formar los programas.
Estas reglas se dividen en dos grupos: reglas lxicas y reglas sintcticas.

Caractersticas
-

Ayuda al programador a escribir programas sintcticamente correctos.


Establece reglas que sirven para que el programador se comunique con el procesador.
Favorece a:
Legibilidad

Verificabilidad y Traduccin

Falta de ambigedad

Elementos de la sintaxis

Alfabetos o conjuntos de caracteres, donde el orden de los caracteres es lo que se utiliza en las comparaciones.

La secuencia de bits que compone cada carcter la determina la implementacin.

Identificadores: cadena de letras y dgitos, que deben comenzar con una letra.
Si se restringe la longitud se pierde legibilidad

Operadores: uniformidad de las operaciones aritmticas (estndares)

Comentarios y uso de blancos (hacen los programas ms legibles)

10

Palabra clave y palabra reservada


-

Palabra clave o keyword: tiene un significado dentro de un contexto, puede ser usada por el programador como identificador de
otra entidad.

Palabra reservada: palabra clave que no puede ser usada por el programador como identificador de otra entidad.
Ventajas de su uso
favorece expresividad y legibilidad.
Desambiguar:
Usar palabras reservadas
Diferenciarlas
Libre uso y determinar de acuerdo al contexto.

sintaxis y la semntica de un lenguaje? Quines se benefician?

sintaxis y la semntica de un lenguaje de programacin proporcionan mecanismos para que una


persona o una computadora pueda decir:

lo es, qu significa

Estructura sintctica
Vocabulario o words
Conjunto de caracteres y palabras para construir expresiones, sentencias y programas.
Las words no son elementales sino que se construyen a partir del alfabeto
Expresiones
Son funciones que devuelven un resultado.
Son bloques sintcticos bsicos
Sentencias
Componente sintctico ms importante.
Tiene un fuerte impacto en la facilidad de escritura y legibilidad
Hay sentencias simples, estructuradas y anidadas.
11

Reglas lxicas y sintcticas.


Reglas lxicas: Conjunto de reglas para formar las palabras, a partir de los caracteres del alfabeto.
Reglas sintcticas: Conjunto de reglas que definen como formar las expresiones y sentencias

Tipos de Sintaxis
ABSTRACTA
Se refiere a la estructura
CONCRETA
Se refiere a la parte lxica
PRAGMTICA
Se refiere al uso prctico

Cmo definir la sintaxis


Se necesita una descripcin finita para definir un conjunto infinito
Formas para definir la sintaxis:
Lenguaje natural (mtodo no formal). Ej.: Fortran
Utilizando la gramtica libre de contexto, definida por Backus y Naun: BNF (mtodo formal). Ej.: Algol
Diagramas sintcticos (son equivalentes a BNF pero mucho ms intuitivos)

rboles sintcticos
Juan el un manta
No todas las oraciones que se pueden armar con los terminales son vlidas
Se necesita de un Mtodo de anlisis (reconocimiento): Parsing.
El parse, para cada sentencia construye un rbol sintctico o rbol de derivacin

12

Dos maneras de construirlo:


Mtodo botton-up
De izquierda a derecha
De derecha a izquierda
Mtodo top-dow
De izquierda a derecha
De derecha a izquierda
Ejemplo: rbol sintctico de oracin. Top-down de izquierda a derecha

rbol de derivacin:
Ejemplo top-down de izquierda a derecha

Producciones recursivas:
Regla recursiva por la izquierda
La asociatividad es por la izquierda
El smbolo no terminal de la parte izquierda de una regla de produccin aparece al comienzo de la parte
derecha
Regla recursiva por la derecha
La asociatividad es por la derecha
El smbolo no terminal de la parte izquierda de una regla de produccin aparece al final de la parte
derecha

13

14

SEMNTICA
Conjunto de reglas para dar significado a los programas sintcticamente vlidos. Este significado puede ser expresado mediante el
mapeo de cada construccin del lenguaje en un dominio cuya semntica es conocida. Para proveer una descripcin formal
completa de la semntica del lenguaje, los programas sintcticamente validos son mapeados en dominios matemticos. Hay otra
manera de expresar la semntica de un lenguaje, llamada semntica operacional, que se basa en mostrar los cambios de estado en
una maquina abstracta que ejecuta las construcciones del lenguaje.
La semntica define el significado de los programas sintcticamente vlidos en el lenguaje. No todos los programas
sintcticamente validos tienen significado, por esto la semntica separa los programas que tienen significado de los que no lo
tienen, estas reglas definen la semntica esttica (se chequea antes de la ejecucin); al contrario de la semntica dinmica que
describe el efecto de usar diferentes construcciones del lenguaje. En esos casos los programas pueden ser ejecutados solo si son
correctos para la sintaxis y para la semntica esttica.
Semntica axiomtica: ve al programa como una mquina de estados. Las construcciones del lenguaje de programacin son
formalizadas describiendo como su ejecucin causa un cambio de estado. Un estado es descrito por un predicado lgico de primer
orden que define las propiedades de los valores de las variables de programas en este estado. El significado de la construccin del
lenguaje es definido por una regla que relaciona el estado anterior y el posterior a la ejecucin. Establece precondiciones y pos
condiciones para la ejecucin de cada sentencia.
Semntica denotacional: asocia cada sentencia del lenguaje con una funcin que va desde el estado del programa antes de la
ejecucin al estado despus de la ejecucin. El estado es representado por una funcin que va desde el conjunto de nombres de
variables a los valores.
La diferencia entre estas semnticas est en la forma de definir el estado (predicados contra funciones).
Compare la gramtica BNF con el lenguaje natural como mecanismo de definicin de la sintaxis de un lenguaje.
El lenguaje natural es un mtodo informal y en consecuencia es no preciso, incompleto; aqu es el implementador el que decide
cosas por su cuenta. Se generan dialectos.
En cambio BNF es un mtodo formal, lo que da una implementacin ms precisa de la sintaxis de un lenguaje. Es una notacin
formal para describir la sintaxis. Es un metalenguaje. Utiliza meta smbolos. Define las reglas por medio de producciones.
Ejemplo:
<digito> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9..............terminales
meta smbolo

no terminal
La semntica describe el significado de los smbolos, palabras y frases de un lenguaje ya sea lenguaje natural o lenguaje
informtico
Tipos de semntica:
Semntica esttica
Semntica dinmica
Semntica esttica
est relacionado con las formas validas.

almente sirven las denominadas gramticas de atributos,


inventadas por Knuth en 1968.
Semntica dinmica.
de ejecutar las diferentes construcciones en el lenguaje de programacin.
sintaxis y para la semntica esttica.
15

Cmo se describe la semntica?


No existen herramientas estndar como en el caso de la sintaxis (diagramas sintcticos y BNF)
Soluciones formales:
Semntica axiomtica
Semntica denotacional
Semntica operacional
Semntica axiomtica
La notacin empleada es el clculo de predicados.
Se desarroll para probar la correccin de los programas.
Ve al programa como una mquina de estados.
Los constructores de un lenguajes de programacin se formalizan describiendo como su ejecucin provoca un
cambio de estado.
Un estado se describe con un predicado que describe los valores de las variables en ese estado
Existe un estado anterior y un estado posterior a la ejecucin del constructor.
Cada sentencia se precede y se contina con una expresin lgica que describe las restricciones y relaciones
entre los datos.
Precondicin
Pos condicin
Semntica denotacional
Se basa en la teora de funciones recursivas
Se diferencia de la axiomtica por la forma que describe los estados, la axiomtica lo describe a travs de los
predicados, la denotacional a travs de funciones.
Se define una correspondencia entre los constructores sintcticos y sus significados
Semntica Operacional
Describe el significado de un programa ejecutando sus sentencias sobre una mquina abstracta.
Es un intrprete.

Los cambios que se producen en el estado de la mquina cuando se ejecuta una sentencia del lenguaje de
programacin definen su significado
Es un mtodo informal
Es el ms utilizado en los libros de texto
PL/1 fue el primero que la utiliz

16

Procesamiento de un lenguaje - Interpretacin y traduccin


Las computadoras ejecutan lenguajes de bajo nivel
Cmo los programas escritos en lenguajes de alto nivel pueden ser ejecutados sobre una computadora
cuyo lenguaje es de muy bajo nivel?
Alternativas:
Interpretacin
Traduccin
Interpretacin
Intrprete programa capaz de leer, analizar, decodificar y ejecutar una a una las sentencias de un programa
escrito en un lenguaje de programacin.
Por cada posible accin hay un subprograma que ejecuta esa accin.
La interpretacin se realiza llamando a estos subprogramas en la secuencia adecuada.

Un intrprete ejecuta repetidamente la siguiente secuencia de acciones:


Obtiene la prxima sentencia
Determina la accin a ejecutar
Ejecuta la accin
Traduccin
Los programas escritos en un lenguaje de alto nivel se traducen a una versin en lenguaje de mquina antes de ser ejecutados.

La traduccin lleva varios pasos.


Ej.: Pasos que se realizan para traducir un programa escrito en Fortran:

Tipos de traductores:
Compilador
Assembler
Link-editor
Loader
Preprocesador o macro-procesador:
-Procesador o Procesador

mplazado por su cdigo cuando se procesen las macros


Comparacin entre Traductor e Intrprete:
Forma de ejecucin
Orden ejecucin
Tiempo de ejecucin
Eficiencia
Espacio ocupado
Deteccin de errores
17

Combinacin de ambas tcnicas:


Los compiladores y los interpretes se diferencian en la forma que ellos reportan los errores de ejecucin.
Algunos ambientes de programacin contienen las dos versiones interpretacin y compilacin.
Utilizan el intrprete en la etapa de desarrollo, facilitando el diagnstico de errores.
Luego que el programa ha sido validado se compila para generar cdigo mas eficiente.
Un programa puede traducirse en un cdigo intermedio que luego se interpretar.
Diferentes soluciones:
Ms cerca de la interpretacin
Ms cerca de la traduccin

Compiladores
, etc.
un solo paso o en dos pasos y en ambos casos cumplen con distintas etapas:
Etapas de compilacin:
1- Anlisis
Hace el anlisis a nivel de palabra
Divide el programa en: identificadores, delimitadores, smbolos especiales, nmeros,
clave, delimitadores, comentarios, etc.
Analiza el tipo de cada token
Convierte a representacin interna los nmeros en punto fijo o punto flotante
Poner los identificadores en la tabla de smbolos
Remplaza cada smbolo por su entrada en la tabla
tems lxicos o tokens.

palabras

Se identifican las estructuras; sentencias, declaraciones, expresiones, etc. ayudndose con los
tokens.
El analizador sintctico se alterna con el anlisis semntico. Usualmente se utilizan tcnicas
basadas en gramticas formales.
Aplica una gramtica para construir el rbol sintctico del programa.
Es la ms importante
Las estructuras sintcticas reconocidas por el analizador sintctico son procesadas y la estructura
del cdigo ejecutable toma forma.
Se realiza la comprobacin de tipos
Se agrega la informacin implcita
Se agrega a la tabla de smbolos los descriptores de tipos, etc. a la vez que se hacen consultas
para realizar comprobaciones.
Se hacen las comprobaciones de nombres. Es el nexo entre el anlisis y la sntesis
2- Sntesis
Se construye el programa ejecutable.
Genera el cdigo necesario y se optimiza el programa generado.
Si hay traduccin separada de mdulos, es en esta etapa cuando se linkedita.
Se realiza el proceso de optimizacin. Optativo
(ejemplo)
Posibles optimizaciones locales:
Cuando hay dos saltos seguidos se puede quedar uno solo P/E El ejemplo anterior quedara as:

18

Generacin de cdigo intermedio

Debe ser fcil de producir


Debe ser fcil de traducir al programa objeto
Ejemplo: Un formato de cdigo intermedio es el cdigo de tres direcciones.
Forma: A:= B op C, donde A, B, C son operandos y op es un operador binario
Se permiten condicionales simples y saltos.

19

SEMANTICA OPERACIONAL
1.
2.
3.
4.
5.

CONCEPTO DE LIGADURA
VARIABLES
UNIDADES
MODELOS DE EJECUCION
PARAMETROS

1-

CONCEPTO DE LIGADURA (binding)


Los programas trabajan con entidades
Las entidades tienen atributos
LIGADURA: especificacin exacta de la naturaleza de un atributo
DESCRIPTOR: lugar donde se almacenan los Atributos
Momento de Ligadura

Momento y estabilidad
Una ligadura es esttica si se establece antes de la ejecucin y no se puede cambiar.
Una ligadura es dinmica si se establece en el momento de la ejecucin y puede cambiarse de acuerdo a
alguna regla especfica del lenguaje.
2-

VARIABLES - Concepto
memoria principal: celdas elementales, identificadas por una direccin.
contenido de una celda: representacin codificada de un valor

<nombre,alcance,tipo,l-value,r-value>
nombre: string de caracteres que se usa para referenciar a la variable.
alcance: rango de instrucciones en el que se conoce el nombre
tipo: valores y operaciones
l-value: lugar de memoria asociado con la variable (tiempo de vida)
r-value: valor codificado almacenado en la ubicacin de la variable
nombre
Se define en una sentencia llamada declaracin.
Aspectos de diseo:
longitud mxima
conectores
sensitivos
palabra reservada - palabra clave
20

Alcance
rango de instrucciones en el que se conoce el nombre. (visibilidad)
alcance - momentos
alcance esttico
define el alcance en trminos de la estructura lxica del programa.
alcance dinmico
define el alcance del nombre de la variable en trminos de la ejecucin del programa.
tipo
conjunto de valores
conjunto de las operaciones
Protege a las variables de operaciones no Permitidas
tipos- definicin del lenguaje
Predefinidos
Definidos por el usuario
TADs
tipos momentos

L-VALUE
rea de memoria ligada a la variable
Tiempo de vida (lifetime) o extensin: periodo de tiempo que existe la ligadura por l-valor
Alocacin: reservar memoria y ligar ese lugar al l-value
Momentos del l_valor
Esttica: sensible a la historia
Dinmica
Automtica
Explcita
Persistente:

R-VALUE
Valor almacenado en el l-valor de la variable
Objeto: (l-valor, r-valor)

momento
Dinmico: por naturaleza
Constantes: se congela el valor
r-valor: inicializacin
Cul es el r-valor luego de crearse la variable?
ignorar el problema
estrategia de inicializacin
control de acceso
21

Variables annimas y Referencias


Algunos lenguajes permiten que el r-valor de una variable sea una referencia al r-valor de otra variable

Alias
Dos nombres comparten un objeto si sus caminos de acceso conducen al objeto. Un objeto compartido modificado va un camino, se modifica
para todos los caminos
Durante su tiempo de vida un objeto puede tener ms de un nombre, por ejemplo, puede haber varias asociaciones en diferentes ambientes de
referencia, donde cada uno proporciona un nombre distinto para el objeto de datos. Por ejemplo, cuando un objeto de datos se transmite por
referencia como parmetro a una rutina, se puede hacer referencia a l a travs de un nombre de parmetro formal en la rutina y tambin
conserva su nombre original en el programa que llama a esa rutina.
Alternativamente, un objeto de datos puede convertirse en componente de varios objetos de datos a travs de punteros y tener as nombres
compuestos a travs de los cuales se puede tener acceso a l. Los nombres mltiples para un mismo objeto de datos son posibles de diversas
maneras en casi todos los lenguajes de programacin.
Cuando un objeto de datos es visible a travs de ms de un nombre en un solo ambiente de referencia, cada un de los nombres se conoce como
un alias del objeto. Cuando un objeto tiene ms de un nombre pero se utilizan en diferentes ambientes de referencia, no se ocasionan problemas.
Inconvenientes en su uso
Hacer referencia a un mismo dato usando nombres distintos dentro del mismo ambiente plantea problemas tanto para el programador, porque
dificulta la comprensin del cdigo y puede introducir errores difciles de detectar, como para el implementador del lenguaje. La optimizacin
del cdigo puede buscar reordenar los pasos de un cmputo, pero cuando es posible el uso de alias, se debe hacer un anlisis adicional para
asegurar que los pasos de cmputo sean independientes.
Ejemplos de alias

Puede establecerse el alias durante la ejecucin de un procedimiento cuando los parmetros se pasan por referencia. Supongamos el
siguiente procedimiento en Pascal, que intercambia los valores de dos variables enteras sin usar variables locales.
Procedure intercambio (var x, y: integer)
Begin
x:=x+y;
y:=x-y;
x:=x-y
End
Este procedimiento funciona correctamente para aquellos casos en que x es distinto de y, en caso contrario como por ejemplo si lo
invocamos as > intercambio(a,a), en este caso, el procedimiento pone a cero a a ya que x e y se convierten en alias y as cualquier
asignacin a x y a y en el mismo procedimiento afecta a la misma posicin de memoria. El mismo problema puede derivarse de la llamada
intercambio (b[i], b[j]) cuando i = j.

Los punteros son generadores de alias:


var p, q: ^t;
.
.
new(p);
q := p;

Los punteros p y q apuntan al mismo objeto, de esta forma es posible cambiar el valor de p^ con una asignacin a q^ y viceversa.
Formas de evitarlo
Hay dos caminos para eliminar el alias, uno consiste en acabar por completo con las caractersticas que hacen posible el alias, como punteros,
parmetros por referencia, datos globales y matrices. Sin embargo, esto nos llevara a un lenguaje muy pobre. El otro camino consiste en poner
restricciones al uso de tales caractersticas para excluir la posibilidad de alias.
-

En el caso de los parmetros por referencia el problema solo surgen si los parmetros reales se solapan, entonces si dichos parmetros son
variables simples, es necesario asegurarse que sean distintas, de esta manera la llamada intercambio(a,a) sera ilegal.
Estas formas de alias ilegales pueden detectarse en compilacin, sin embargo la llamada intercambio(b[i], b[j]) genera alias solo si i = j, por
lo tanto se podran prohibir tales llamadas, pero el resultado sera un lenguaje torpe y difcil de usar. Sera conveniente que en tal caso el
compilador genere la condicin i distinto de j.

El manejo de alias en presencia de punteros es ms complejo. La deteccin de alias ilegal entre dos punteros, causados por llamadas a
procedimientos, es similar al caso de las matrices o vectores. La referenciacin que exactamente igual que la indexacin de una matriz. Por
ejemplo, si p y q apuntan a la misma coleccin y p^ y q^ se pasan ambos como parmetros, para que no haya solapamiento es necesario que
se compruebe que p sea distinto de q.
22

3-

UNIDADES DE PROGRAMA

<nombre,alcance,tipo,l-value,r-value>
nombre: string de caracteres que se usa para invocar a la rutina.
alcance: es el rango de instrucciones donde se conoce su nombre.
Activacin: dentro del alcance de la rutina
Ambiente de referencia
local
no local
global
EJEMPLO

Tipo
tipo: tipo de los parmetros
Signatura: permite especificar el tipo de una rutina
Una rutina fun que tiene como entrada parmetros e tipo T1, T2, Tn y devuelve un valor de tipo R, puede especificarse con la
siguiente signatura

un llamado a una rutina es correcto si esta de acuerdo al tipo de la rutina.


la conformidad requiere la correspondencia de tipos entre parmetros formales y reales.
l-valor / r-valor
l-value: es el lugar en el que se almacena el cuerpo de la rutina.
r-value: es el cdigo de la rutina que se ejecuta en la invocacin
esttico
dinmica
Definicin-Declaracin
Si el lenguaje distingue entre la declaracin y la definicin de una rutina permite manejar esquemas de rutinas mutuamente recursivas.

23

4-

REPRESENTACION EN EJECUCION

instancia de la unidad: es la representacin de la rutina en ejecucin.

Elementos en ejecucin
punto de retorno
ambiente de referencia
ambiente local
ambiente no local
Alias
Efecto lateral
Rutinas recursivas
Segmento de cdigo: el mismo para todas las instancias de la unidad
Registro de activacin: uno nuevo para cada activacin
Comunicacin entre rutinas
Ambiente no local
Parmetros
Rutinas genricas
las rutinas factorean un segmento de cdigo, que se ejecutar customizada a travs de los parmetros.
rutina genrica: se puede parametrizar el tipo (C++, Ada)
Una rutina genrica es un molde.
Alias y sobrecarga

Sobrecarga: un nombre est sobrecargado si:


en un momento, referencia mas de una entidad y
hay suficiente informacin para permitir establecer la ligadura univocamente.
Alias: dos nombres que denotan la misma entidad en el mismo ambiente.
PROCESADOR ABSTRACTO
Memoria de Cdigo: C(y) valor almacenado en la y-sima celda de la memoria de cdigo. Comienza en cero
Memoria de Datos: D(y) valor almacenado en la y-sima celda de la memoria de datos. Comienza en cero
Ip: puntero a la instruccin que se esta ejecutando.
Ejecucin:
obtener la instruccin actual para ser ejecutada (C[ip])
incrementar ip
ejecutar la instruccin actual
PROCESADOR ABSTRACTO-Instrucciones
SET: setea valores en la memoria de datos
set target,source
copia el valor representado por source en la direccin representada por target
JUMP: bifurcacin incondicional
JUMPT: bifurcacin condicional, bifurca si la expresin se evala como verdadera
direccionamiento indirecto: set D[10],D[20]
procesador

24

Estructuras de ejecucin de los lenguajes de programacin


Def 3.13 (Lenguaje de modelo esttico). El espacio requerido en memoria de datos puede precisarse en tiempo de
compilacin. Por lo tanto, es posible alocar la memoria necesaria antes de la ejecucin. Claramente, un lenguaje esttico
no puede permitir la recursin, pues se requiere un nmero arbitrario de instancias de unidad. Ver lenguajes C1, C2 y
C2.
ESTATICO: espacio fijo
El espacio necesario para la ejecucin se deduce del cdigo
La alocacin puede hacerse estticamente
No puede haber recursin

C1: lenguaje simple

25

Def 3.14 (Lenguaje de modelo basado en pila). La memoria de datos requerida no puede precisarse en compilacin, pero es
predecible y respeta un comportamiento LIFO. Las variables declaradas en cierto mbito se alocan en memoria cuando
dicho mbito es alcanzado en ejecucin, y se las desaloca cuando se sale de el (variables denominadas automticas). En
general, la implementacin de estos lenguajes utiliza una pila, pero no es estrictamente parte de la semntica del lenguaje.
Ver lenguajes C3 y C4.
BASADO EN PILA: espacio predecible
el espacio se deduce del cdigo.
el espacio es predecible

C3: C2 + recursin y valor de retorno


rutinas con capacidad de recursin
rutinas con capacidad de devolver valores.

no se sabe cuantas instancias de cada unidad se necesitarn


el compilador puede ligar cada variable con su desplazamiento
cada nueva invocacin aloca un nuevo registro de activacin y nuevas ligaduras
26

nuevos elementos:
current: direccin base del registro de activacin de la unidad que se este ejecutando actualmente
free: prxima direccin libre en la pila
link dinmico puntero a la direccin base del registro de activacin de la rutina llamadora
valor de retorno

C3: moldes

27

C4: estructura de bloque

controla el alcance de las variables,


define el tiempo de vida de las variables
divide el programa en unidades mas pequeas.

C4: anidamiento va sentencias compuestas


bloque:
{<lista de declaraciones>;<lista de sentencias>}
las variables tienen alcance local
si hay una nueva declaracin de un nombre, la declaracin interna enmascara la externa

C4: sentencias Compuestas

28

C4: rutinas anidadas

C4 rutinas anidadas
acceso al ambiente no-local

C4 acceso al ambiente no local


link esttico: apunta al registro de activacin de la unidad que estticamente la contiene

29

C4 acceso al ambiente no local

Def 3.15 (Lenguaje de modelo dinmico). Estos lenguajes tienen un uso de memoria impredecible. Las variables se alocan
dinmicamente cuando se lo requiere durante la ejecucin (variables dinmicas). Para manejar la memoria libre no existe
una poltica predenida (como la LIFO), usualmente se utiliza el termino heap para referirse a la memoria de datos. Ver
lenguaje C5.
DINAMICO: espacio impredecible
El espacio es impredecible.
Los datos se alocan dinmicamente durante la ejecucin.

C5: datos ms dinmicos

C5: datos semidinmicos


Arreglos dinmicos
type VECTOR is array (INTEGER range <>);
A: VECTOR (0..N);
B: VECTOR(1..M);
N y M conocidos cuando se invoca la unidad

implementacin: arreglos dinmicos


COMPILACION: descriptores

Todos los accesos al arreglo son traducidos como referencias indirectas


30

A: VECTOR (0..N);
B: VECTOR(1..M);

C5: datos dinmicos


se alocan explcitamente durante la ejecucin

C5

el tiempo de vida no depende de la sentencia de alocacin, vivir mientras este apuntada

31

C6: LENGUAJES dinmicos


Se trata de aquellos lenguajes que adoptan ms reglas dinmicas que estticas.
Una propiedad dinmica significa que las ligaduras correspondientes se llevan a cabo en ejecucin y no en compilacin.

C6: tipado dinmico


el tipo de una variable no pueden determinarse en compilacin.
en el descriptor debe mantenerse
el descriptor debe almacenarse en la heap
para cada variable se reserva en el registro de activacin un puntero

C6: alcance dinmico


Un programa
n rutinas
variables locales sin definicin de tipo
un main
regla de alcance: depende de la cadena dinmica

32

RUTINAS
il presente desde los primeros lenguajes ensambladores son las subprogramas, unidades de programa
con llamada explicita, que responden al esquema de call/return.
raciones primarias integradas en el
lenguaje

digo.

una instancia de la unidad.

esultados los produce en variables no locales o en parmetros que cambian su valor.

olo producen un valor y no producen efectos laterales.


remplaza a la invocacin dentro de la expresin

dor se concentra en cmo trabaja dicho subprograma.


permanece oculta.
definicin de un subprograma es un patrn para crear
activaciones durante la ejecucin.
incorporado una nueva sentencia a nuestro lenguaje.

33

Parmetros

uetes de ADA

ventajas del uso de parmetros


saje de parmetros es el ms flexible y permite la transferencia de diferentes datos en cada llamada.
mente lo que se comparte

de ella o un dato no local pero visible


en dicha unidad o una expresin

les locales
Si es una funcin debe darse el tipo de lo que ser retorna

ego se hace la ligadura antes de


transferir el control a la unidad llamada.

stintamente en la lista.
En Ada pueden mezclarse ambos mtodos.
En C++ y en Ada los parmetros formales pueden tener valores por defecto, con lo cual a veces no es necesario listarlos
todos en la invocacin.
ama

Hay diferentes formas de transmitir los parmetros hacia y desde el programa llamado.
Desde el punto de vista semntico los parmetros formales pueden ser:
al

real
34

Por Valor:
inicializar el correspondiente parmetro real al invocar la unidad.

Desventaja: consume el tiempo para hacer la copia y el almacenamiento para duplicar el dato.
Ventaja: protege los datos de la unidad llamadora, el parmetro real no se modifica.

Por valor constante:


al no sea
modificado.
Desventaja: requiere realizar mas trabajo para implementar los controles.
Ventaja: protege los datos de la unidad llamadora, el parmetro real no se modifica

Por Resultado:
armetro formal se copia al parmetro real al terminar de ejecutarse la unidad llamada.

ser diferentes.

Por resultado de funciones:


o de una funcin puede devolverse con el return como en PL1, C, etc., o como en Pascal en el nombre de la funcin
(ultimo valor asignado) que se considera como una variable local.

35

Por Valor/Resultado:
vacin de la unidad llamadora.
da el
parmetro real recibe una copia de lo que tiene el parmetro formal.
metro formal es una referencia local.

Por Referencia:

iene la direccin en el ambiente no local.


parmetro
formal dentro del cuerpo del subprograma quedar registrado en el parmetro real.

Desventajas:

tanto la confiabilidad, hacen muy difcil la verificacin de


programas.
Ventaja:

Por Nombre:
lece la ligadura entre parmetro formal y
parmetro real en el momento de la invocacin pero la ligadura de valor se difiere hasta el momento en que se lo utiliza.
Si el dato a compartir es:

una expresin se evala cada vez


36

Por Nombre (continuacin):


a en
el cuerpo de la unidad llamado por un invocacin a un thunks que en el momento de la ejecucin activara al procedimiento que
evaluar el parmetro real en el ambiente apropiado.
onfusas para el lector y el escritor.

) solo
producir un resultado.
deberan ser siempre modo IN. (no Pascal y C, si ADA)
Ejemplo: Ada
Pascal y Modula solo permiten escalares

esultado, por referencia

valor (por defecto)

Pero como las variables de tipos no primitivos son todas referencias a variables annimas en el Heap, el paso por valor de
una de estas variables constituye en realidad un paso por referencia de la variable.
variable no local de tipo primitivo (a travs de los parmetros formales), a no ser que dicha variable forme parte de una
estructura mayor (una instancia de una clase) que se pasa por referencia.

Por resultado OUT


IN OUT.
-resultado,

arcialmente la posibilidad de efectos


laterales.

Ejemplo: supongamos un subprograma que acepta como parmetro una referencia o puntero a un arreglo de enteros, y cuyo efecto sea
ordenarlo segn un criterio de ordenacin, que no siempre es el mismo.
Sera natural que el nombre del procedimiento que ordena sea un parmetro.
Ada no contempla los subprogramas como valores. Utiliza unidades genricas.
Pascal permite que una referencia a un procedimiento sea pasada a un subpograma
C permite pasaje de funciones como parmetros.
37

Ambiente de referencia para las referencias no locales dentro del cuerpo del subprograma pasado como parmetro.
pasado
como parmetro.
subprograma que tiene el parmetro formal
subprograma.
Ejemplo: SNOBOL.
parmetro real. Se utiliza en los lenguajes con alcance esttico y estructura de bloque.
natural.

.
entes que
estticamente no le eran visibles.
en el momento de la invocacin a la unidad con parmetro
subprograma adems del puntero al cdigo, se indique cual debe ser su ambiente de referencia, es decir un puntero al lugar de la cadena esttica
correspondiente.

genrica es una unidad que puede instanciarse con parmetros formales de distinto tipo.
Como todas las unidades instanciadas tienen el mismo nombre, da la sensacin que una unidad pudiera ejecutarse con parmetros de
distinto tipo.
d genrica que ordena elementos de un arreglo, podr instanciarse para elementos enteros, flotantes, etc.

38

Ejemplos sobre pasaje de parmetros


Ejemplo donde se pone de manifiesto la diferencia entre el pasaje por referencia y por nombre.

Procedure inter (x, y: integer)


Var
Temp: integer;
Begin
temp:=x;
x:= y
y:=temp;
End;
Si en inter los parmetros se pasan por referencia se realiza un intercambio de variables correctamente ya que se intercambian los valores de las
referencias de x e y.
En cambio si los parmetros son pasados por nombre ante la invocacin a inter (i, a(i)) la ejecucin quedara:

1)
2)

Temp:=i;
i := a(i);
a(i) ;= temp;

pero aqu a(i) de 1) no ser el mismo que a(i) de 2), pues como el valor de i ya fue modificado queda la posicin del arreglo sin modificar y se
modifica otra. Luego entonces no se intercambian los valores. Esto se da pues los parmetros pasados son un ndice y un elemento de un arreglo.

Ejemplo de pasaje de parmetro por valor-resultado.

proc (f1, f2)


{
f1 := f1 + 1;
f2 := f2 +11;
}
-

Con igual efecto que por referencia.


Call proc (a,b)
En este caso ya sea por valor-resultado o por referencia a a se le va a sumar 1 y a b se le sumar 11. En el pasaje por valor-resultado los
valores se modificarn al terminar el procedimiento y en el caso del pasaje por referencia se modifica en el momento ya que se pasan las
direcciones de las variables.

Con distinto efecto que por referencia.


Call proc(a,a)
Si el pasaje es por valor-resultado. En este caso si a= 0, entonces al entrar a proc en f1 y en f2 se copiarn los valores de a. Luego f1 = 1 y
f2 = 12. Al salir de proc a tendr el valor de 1 u 11 (ver en que orden se copian los parmetros).
Si el pasaje es por referencia a al terminar el procedimiento tendra el valor 12.

Ejemplo donde se manifiesta la necesidad de tener toda la informacin que debe ligarse en el caso de
parmetros subrutina.

Esto se refiere a la consistencia de tipos, por eso tenemos:


Proc ejemplo (i, j: int; proc f)
Var
k:boolean;
Begin
K := j < i
If k -> f(k) else f(j)
End;
As se pueden tener una o dos llamadas incorrectas al parmetro formal f, debido a la inconsistencia de tipos y/o diferencia en el nmero de
parmetros.
En ALGOL 68 en los procedimientos que se pasan por parmetro, se requiere que se especifiquen los tipos (llamados modos) de sus parmetros
y sus valores devueltos. De esta manera puede verificarse la consistencia de tipos estticamente.
Proc ejemplo (i, j:int; proc f (bool) void f ) void
Begin
If i < j then f (k)
else f (j)
---- dara error
end

39

Ejemplo en el que se pone de manifiesto la necesidad de enganchar el ambiente de referencia de un


parmetro procedimiento.

El envo de subprogramas como parmetros requiere pasar al menos una referencia al segmento de cdigo del parmetro real. Sin embargo el
subprograma pasado puede acceder tambin a variables no locales siendo necesario entonces pasar informacin acerca del entorno no local del
subprograma parmetro real. Hay tres opciones para saber cual es el ambiente correcto de referencia para ejecutar el subprograma pasado como
parmetro:
1)
2)
3)

El ambiente del subprograma que llama al subprograma pasado.


El ambiente del subprograma en el cual el subprograma pasado est declarado.
El ambiente del subprograma que incluye la sentencia de llamado que pasa al subprograma como un parmetro actual.

Procedure sub1;
Var X: integer;
Procedure sub2;
Begin
Write (x=, x);
End;
Procedure sub3;
Var x: integer;
Begin
X := 3;
sub4 (sub2);
End;
Procedure sub4;
Var x: integer;
Begin
X := 4;
subx;
End;
Begin
X := 1;
Sub3;
End;
-

Considerando la opcin 1) el ambiente de referencia de sub2 es el de sub4.


Considerando la opcin 2) el ambiente de referencia de sub2 es el de sub1.
Considerando la opcin 3) el ambiente de referencia de sub2 es el de sub3.

En los casos en que el subprograma declara un subprograma y adems lo paso como parmetros las opciones 2 y 3 son las mismas.
Diferencias y puntos de contacto entre el pasaje de parmetros por nombre y el de procedimientos.
Diferencias
1)
2)
3)
4)

Momento de ligadura: en el pasaje de parmetro por nombre la ligadura se difiere hasta el momento en que se la utiliza. En el pasaje por
procedimiento, la ligadura se realiza en el momento de la invocacin.
Modo: el pasaje de parmetro por nombre es modo IN/OUT. En parmetro rutina depende del tipo de la rutina (procedimiento o funcin) y
de los tipos de parmetros que estos tienen.
Utilizacin de procedimientos adicionales: los parmetros por nombre utilizan los thunks y los parmetros rutina no.
Informacin requerida: en el pasaje por nombre se pasa la direccin de memoria del parmetro. En cambio en el caso de parmetros rutina
se pasan los parmetros de la rutina, el ambiente de referencia y el encabezamiento de la rutina y una referencia al segmento de cdigo del
parmetro real.

Puntos de contacto
En ambos casos se necesitan referencias a otras zonas de memoria, debido al uso de thunks y por las referencias al registro de activacin y al
segmento de cdigo. Los dos realizan una llamada a un subprograma.
Comparacin entre el llamado a una rutina con una referencia a un elemento del un arreglo.
Supongamos que tenemos la siguiente sintaxis: A(i)
-

Si interpretamos A(i) como la llamada a una rutina, i representara el parmetro de la misma y A el nombre de la rutina.
Tambin se puede tomar como que A(i) es la referencia del elemento en la posicin i del arreglo A.

El problema de utilizar indistintamente parntesis para los parmetros de una rutina y la posicin de un elemento de un arreglo hace que
tengamos una misma sintaxis con diferente semntica y esto atento contra la simplicidad de los lenguajes.
Por esta razn algunos lenguajes utilizan el uso de [] para referirse a posiciones de arreglos y () para los parmetros de los mdulos.
40

SISTEMAS DE TIPOS
conjunto de reglas para estructurar y organizar los tipos
componente semntica fundamental
captura la naturaleza de los datos de los programas.
un tipo es conjunto de valores y un conjunto de operaciones
Operaciones: nica forma de manipular los objetos instanciados
Un error de tipo se produce cuando se intenta manipular a un objeto con operaciones ilegales
Un programa es seguro en el manejo de tipos si garantiza no tener errores de tipo

Clasificacin de los errores

Chequeo esttico de errores


Es el que se realiza antes de la ejecucin: en compilacin o en linkedicin
Consistencia entre declaracin y llamado de una rutina
El chequeo esttico es preferible al dinmico pero nunca pueden realizarse todos los chequeos estticos
a := b/c

Chequeo dinmicos de errores


el compilador generara el llamado a una rutina que chequear
hay que ejecutar con datos de entrada
el chequeo dinmico hace mas lenta la ejecucin.
el chequeo dinmico gana en flexibilidad
mantenimiento y manejo de los descriptores

Tipado fuerte y chequeo de tipos


El sistema de tipos de un lenguaje se define como el conjunto de reglas
Las reglas restringen el conjunto de programas legales que se pueden escribir en un lenguaje.
El objetivo de un sistema de tipos es escribir programas seguros.
Un sistema de tipos es fuerte si garantiza la seguridad en el uso de tipos.

Tipado fuerte / dbil


Un lenguaje se dice fuertemente tipado si su sistema de tipos es fuerte.
Si el lenguaje es fuertemente tipado el compilador puede garantizar la ausencia de errores de tipo del programa.
Un sistema de tipos dbil (no fuerte) genera un lenguaje dbilmente tipado

41

No fuertemente tipados
Pascal: parmetro procedimiento

No fuertemente tipados
Pascal: los limites de una dimensin son parte de la definicin de la matriz. Sin embargo el acceso a un elemento
requiere una comprobacin dinmica para saber si correcto.
Algol-68 y Ada los limites no pertenecen al tipo del arreglo, son parte de su valor, por lo tanto los subndices se ignoran
en traduccin y esto no afecta la verificacin esttica.

COMPATIBILIDAD DE TIPOS
Ligadura de tipo: antes de poder referenciar un objeto debe tener ligado un tipo
Chequeo de tipos: El chequeo de tipos es lo que asegura que los operandos y los operadores son de tipo correcto
Tipo compatible: reglas semnticas que determinan si el tipo de un objeto es valido en un contexto particular
Un lenguaje debe definir en que contexto el tipo Q es compatible con el tipo T.
Si el sistema de tipos define la compatibilidad se puede realizar el chequeo de tipos

compatible confomable - equivalente

Tipos compatibles
Equivalencia por nombre: dos variables son del mismo tipo si y solo si estn declaradas juntas (no para ADA) o si estn
declaradas con el mismo nombre de tipo.
Equivalencia por estructura: dos variables son del mismo tipo si i los componentes de su tipo son iguales
Las dos equivalencias son sintcticas y no semnticas, no se da la nocin de comportamiento idntico (TADS)
La equivalencia por nombre extiende naturalmente los tipos predefinidos

42

Ada tiene equivalencia por nombre


C tiene equivalencia por salvo para los registros
C++ tiene equivalencia por nombre
Pascal: por estructura salvo los parmetros formales que son por nombre.

CONVERSIN DE TIPO
un tipo es compatible con otro si
es equivalente
se puede convertir
el compilador genera el cdigo necesario
Coercin: significa convertir un valor de un tipo a otro.

Clasificacin de conversiones
Widening (ensanchar): cada valor del dominio tiene su correspondiente valor en el rango
entero a real
Narrowing (estrechar): cada valor del dominio puede no tener su correspondiente valor en el rango
real a entero
En este caso algunos lenguajes producen un mensaje avisando la prdida de informacin

TIPOS DE DATOS
SISTEMA DE TIPOS: conjunto de reglas usadas por un lenguaje para estructurar y organizar sus tipos.
Componente semntica importante.

capturan la naturaleza de los datos del problema que sern manipulados por los programas.
los lenguajes de programacin se diferencian en la definicin y comportamiento de los tipos.

Operaciones: nica forma de manipular los objetos instanciados


las operaciones protegen a los objetos de usos ilegales
Tipo: comportamiento abstracto de un conjunto de objetos y un conjunto de operaciones.
Programas: funciones que mapean datos de entrada en datos de salida.

Los lenguajes proveen los tipos predefinidos y los constructores.


permiten instanciar o crear objetos de datos.
Constructores: pueden crearse tipos nuevos
definidos por el usuario: predefinidos y Constructores

43

Dominio de un tipo
DOMINIO DE UN TIPO: conjunto de valores posibles
Un literal es una constante cuyo valor esta dado por una secuencia de smbolos.
dominio son solamente valores atmicos entonces el tipo es escalar, elemental o primitivo.
Si los valores del dominio estn compuestos por un conjunto de datos entonces el tipo es estructurado o
compuesto

TIPOS PREDEFINIDOS
hard subyacente y son una abstraccin de l.

acuerdo al tipo al que pertenezcan.

Propiedades de los tipos predefinidos


mecanismo de clasificacin de los datos manejados por un lenguaje
son la forma de proteger a los datos contra usos indebidos
instanciar un tipo para crear un dato indica cuales son las operaciones que legalmente pueden aplicrsele.
Las ventajas de los tipos predefinidos son:
Invisibilidad de la representacin
Verificacin esttica
Desambiaguar operadores
Control de precisin

Invisibilidad de la representacin
El programador no tiene acceso al string de bits subyacente que representa un valor de un cierto tipo.
Los cambios no se ven como un nuevo string, sino como un nuevo valor
Estilo de programacin:
Modificabilidad

Verificacin esttica
Si el lenguaje exige la declaracin de variables, entonces las operaciones ilegales sobre una variable pueden ser
detectadas por el traductor

Desambiguar operadores
Operadores polimrficos - genricos -o sobrecargados
uso moderado de la sobrecarga puede contribuir a la simplicidad de un
Lenguaje de Programacin.
uso excesivo de la sobrecarga puede generar programas que sean difciles de entender

Control de precisin
algunos lenguajes permiten controlar la precisin de los datos numricos.
ADA. Enteros: shortinteger,integer ,large integer
optimizacin de espacio para el traductor
insertar chequeos en tiempo de ejecucin para monitorear los valores de las variables.

44

TIPOS PREDEFINIDOS ELEMENTALES

NUMEROS: CONVERSIONES
Capacidad de adecuar los tipos cuando estn mezclados.
* Por tabla
* Por el tipo del resultado: examinar la expresin determinando el tipo del resultado y convirtiendo todo a ese tipo.
* Prefijo de tipo: se convierte al tipo indicado. Pedido de conversin explcito

BOOLEANOS

CARACTERES
- STRING
Es el tipo que mas ha evolucionado
Fortran y Algol.60 apenas considerados
PL/1: tipo string de caracteres y operaciones de manipulacin
Pascal: char y string como vectores de char con un mximo de longitud fija.
SNOBOL4 es un lenguaje especializado en el manejo de texto.
Modula y C los string son arreglos de char

45

TIPOS DEFINIDOS POR EL USUARIO


MECANISMOS DE TIPADO
es la facilidad de definir nuevos tipos e instanciarlos
separa la especificacin de la implementacin.
se definen los tipos que el problema necesita.
* Legibilidad
* Modificabilidad
* Factorizacin
La instanciacin de los objetos en un tipo dado implica una descripcin abstracta de sus valores. Los detalles de la
implementacin solo quedan en la definicin del tipo

ELEMENTALES: ENUMERADOS
DOMINIO: lista de constantes simblicas
OPERACIONES: comparacin, asignacin y posicin en la lista

ENUMERDOS - SUBRANGOS
Dominio: subconjunto de un tipo entero o de un enumerado
Operaciones: hereda las operaciones del tipo original.
Chequeo dinmico

COMPUESTOS CONSTRUCTORES
Constructores: mecanismo que proveen los lenguajes para agrupar datos denominados compuestos
Dato compuesto:
nombre nico
componente accesible a travs de un mecanismo de seleccin.
posibilidad de manipular conjunto completo.
Tipo compuesto: nuevos tipos definidos por el usuario usando los constructores
Rutinas: constructores que permiten combinar instrucciones elementales para formar un nuevo operador.
Definicin de Constructores como modelos matemticos (abstracta)
definicin
mtodo de acceso
operaciones de campos
operaciones de tipo
inicializacin de los campos
PRODUCTO CARTESIANO
CORRESPONDENCIA FINITA
UNION
RECURSION

PRODUCTO CARTESIANO

46

distintos tipos agrupados que se tratan como una unidad.


REGISTROS

los tipos elementales ocultan su representacin al usuario del objeto.


los tipos estructurados no la ocultan completamente
el nuevo tipo tiene acceso a las operaciones asociadas con los tipos constitutivos.
son nuevos tipos con descripcin de estructura sin operaciones asociadas.

CORRESPONDENCIA FINITA

Rutina: su definicin es la regla de asociacin de valores del tipo DT en valores del tipo RT.definicin intencional: que
especifica una regla (la intencin) en lugar de una asociacin individual
Arreglos: definicin extensional, los valores de la funcin son explcitamente enumerados

Caractersticas a tener en cuenta:


1.
2.
3.
4.
5.
6.
7.

Sintaxis para nombrar los elementos


Dominio posible
Limites de cada ndice
Rango posible
Formas de slicing
Inicializacin
Operaciones de tipo

1. Sintaxis para nombrar los elementos


Los subndices pueden ir entre () o []
*elemento de la fila 3 columna 5de una matriz ?
A(3,5)
A[3,5]
47

2. Dominio posible
Fortran: constantes enteras
DIMENSION A(100), B(10,10)
SUBROUTINE SORT (A,N)
DIMENSION A(N)
Pascal: enumerado o subrango
var x: array [2..5] of integer
type colores = (rojo,verde,azul,amarillo)
type vec_color = array(colores) of integer
var v_color:vec_color
ADA: subconjunto de enteros
X: array (INTEGER rango 2..6) of INTEGER := (0,2,0,5,-33);

Arreglos no rectangulares
SNOBOL4: tipos dinmicos
-los elementos del dominio o el rango no tienen que ser del mismo tipo.
-el dominio y el rango pueden verse como la unin de todos los tipos
Algol-68

3. Lmites de cada ndice


Como ligar el dominio un subconjunto especfico de un tipo dado?
ligadura en compilacin
ligadura en la creacin del objeto:
ligadura en la manipulacin del objeto

4. Rango posible
En general el rango puede ser cualquier tipo permitido en el lenguaje

5. Formas de slicing
Slicing: los ndices pueden seleccionar tajadas del arreglo
PL/1,. APL, Algol.68 y ADA.
X: array (INTEGER rango 1..6) of INTEGER
X(3..5) referencia los elementos, 3,4 y 5 slicing de X

6. Inicializacin
Los lenguajes pueden permitir inicializaciones, lo proveyendo un mecanismo para construir valores constantes
de un tipo compuesto.
ADA
LIST array (1..5) of INTEGER := (1,3,4,5,6)
LIST2 array (1..5) of INTEGER:=(1=>,3,2=>4,others=>0)
C
char digits[5] = {a,b,c,c,e}
48

7. Operaciones de tipo

UNION y UNION DISCRIMINADA

diferentes tipos en distinto momento de la ejecucin


FORTRAN
EQUIVALENCE A,B
COBOL y PL/1
REDEFINES
C
union - union discriminada
Pascal: registro con variante
ADA: variantes restringidas
ALGOL: unin discriminada segura
unin discriminada agrega un discriminante para indicar la opcin elegida.

Si tenemos la unin discriminada de dos conjuntos S y T, y aplicamos el discriminante a un


elemento e perteneciente a la unin discriminada devolver S o T.
RECURSION

define datos agrupados:


cuyo tamao puede crecer arbitrariamente
cuya estructura puede ser arbitrariamente compleja.
IMPLEMENTACIN
Los lenguajes de programacin convencionales soportan la implementacin de los tipos de datos
recursivos a travs de los punteros.
Los lenguajes funcionales proveen mecanismos mas abstractos que enmascaran a los punteros

49

PUNTEROS
Un puntero es una referencia a un objeto.
Una variable puntero es una variable cuyo r-valor es una referencia a un objeto.

VALORES:
- direcciones de memoria
- valor nulo (no asignado) direccin no valida
OPERACIONES (l-valor r-valor r-valor de la variable apuntada)
asignacin de valor: generalmente asociado a la alocacin de la variable apuntada
referencias
-a su valor (direccin) operaciones entre punteros
-al valor de la variable apuntada: dereferenciacin implcita
INSEGURIDAD DE LOS PUNTEROS
1. violacin de tipos
2. referencias sueltas - referencias dangling
3. liberacin de memoria: objetos perdidos
4. punteros no inicializados
5. punteros y uniones discriminadas
6. alias
1 - Violacin de tipos

2- Punteros sueltos
Si este objeto no esta alocado se dice que el puntero es peligroso (dangling).
Una referencia suelta o dangling es un puntero que contiene una direccin de una variable dinmica que fue
desalocada. Si luego se usa el puntero producir error.

50

3. Liberacin de memoria: objetos perdidos


los objetos (apuntados) que se alocan a travs de la primitiva new son alocados en la heap
La memoria disponible (heap) puede agotarse
si los objetos en el heap dejan de ser accesibles (objeto perdido) esa memoria podria liberarse

Implcita: garbage collector


El sistema, dinmicamente, tomar la decisin de descubrir la basura por medio de una algoritmo de
recoleccin de basura. garbage collector.
LISP
En Algol-68 y Simula 67
Eiffel y Java
ADA
4. Punteros no inicializados
Peligro de acceso descontrolado a posiciones de memoria
Verificacin dinmica de la inicializacin
Solucin:
valor especial nulo: nil en Pascal
void en C/C++
null en ADA
5 - Punteros y unin discriminada: C

En el caso de C, este es el mismo efecto que causa la aritmtica de punteros.


Para resolver este problema asociado con los punteros Java elimina la nocin de puntero explicito
completamente.
6 Alias

51

TADS
EL ROL DE LA ABSTRACCION
mecanismo para manejar la complejidad
descubrir caractersticas esenciales y suprimir las que no lo son.
principio bsico de la abstraccin: informacin oculta.

Evolucin hacia el concepto de TAD


lenguajes de mquina: datos como cadenas de bits
primeros lenguajes de alto nivel: entero, real, lgico
PL/1 muchas abstracciones predefinidas.
Algol-68, Pascal y Simula-67 se puede definir nuevas abstracciones.
Con que definirlos?
los tipos de datos predefinidos son abstracciones de datos.
mecanismo para crear
mecanismo para manipular
Tipo abstracto de dato (TAD) es el que satisface:
1- Encapsulamiento
2- Ocultamiento de la informacin
ESPECIFICACION

IMPLEMENTACION

52

Instanciacion de una pila


with PILA
procedure USAR
pil:PILA
y: INTEGER
..
pil.PUSH (pil,y)
End USAR
Ventajas de tads
legibilidad
modificabilidad
portabilidad
integridad de los objetos
OBJETIVO: escribir programas dependiendo solo de las propiedades abstractas de los bjetos de dato.
ABSTRACCIONES DE DATOS GENERICAS
tipo abstracto genrico atributo de tipo como un parmetro.
tipos especializados derivados del mismo tipo.

53

Compatibilidad de tipos
Tipo compatible: reglas semnticas que determinan si el tipo de un objeto es valido en un contexto particular
Un lenguaje debe definir en que contexto el tipo Q es compatible con el tipo T.
Si el sistema de tipos define la compatibilidad

Tipos compatibles
Equivalencia por nombre: dos variables son del mismo tipo si y solo si estn declaradas juntas (no para ADA)
o si estn declaradas con el mismo nombre de tipo.
Equivalencia por estructura: dos variables son del mismo tipo si i los componentes de su tipo son iguales
CONVERSIN DE TIPO
un tipo es compatible con otro si
es equivalente
se puede convertir
Coercin: significa convertir un valor de un tipo a otro.
Clasificacin de conversiones
Widening (ensanchar): cada valor del dominio tiene su correspondiente valor en el rango
Narrowing (estrechar): cada valor del dominio puede no tener su correspondiente valor en el rango

54

Sentencias de Control
Estructuras de control
Son el medio por el cual los programadores pueden determinar el flujo de ejecucin entre los componentes de un
programa
Hay dos tipos de niveles:
o A NIVEL DE SENTENCIAS:
Cuando el flujo de control se pasa entre unidades.
Intervienen los pasajes de parmetros.
o A NIVEL DE UNIDAD
SECUENCIA
SELECCIN
ITERACION

Secuencia
Es el flujo de control ms simple.
Indica la ejecucin de una sentencia a continuacin de otra.
Delimitadores
Pascal tiene como delimitador al punto y coma (;).
Smalltalk tiene por delimitados al punto ( . ).
Fortran permite solo una instruccin por lnea. En consecuencia el delimitador seria el retorno de
carro o enter.
Sentencias compuestas
La sentencia compuesta es una abstraccin en una sentencia de una coleccin de
sentencias. Generalmente estn compuestas por un par de delimitadores y una secuencia,
y no todos los lenguajes la implementan de la misma manera.
Pascal, Algol : <instruccin _ compuesta>= Begin <secuencia -instruccin> end
C, C++: <instruccin _ compuesta>= {secuencias _ instruccin}
Ada (bloque): <instruccin _ compuesta> = declare <sec_declaracion> Begin
<secuencia_instruccin> end;

Distincin entre sentencia de asignacin y expresin


En cualquier lenguaje convencional, ej. Pascal, existe diferencia entre sentencia de asignacin y
expresin
En otros lenguajes tales como C definen la sentencia de asignacin, como una expresin con efectos
laterales.
Las sentencias de asignacin devuelven valores.
Evala de derecha a izquierda
Ejemplo a=b=c=0;
La mayora de los lenguajes de programacin requieren que sobre el lado izquierdo de la asignacin
aparezca un
l-valor. C permite cualquier expresin que denote un l-valor. Ej.: ++ p = *q;
En Pascal:
A:=B
La evaluacin seria:
1- Se resuelve la ecuacin de la derecha (en este caso es el valor contenido en b)
2- Se guarda el valor resultado en la posicin de memoria correspondiente a la
variable a.

55

En C
A=B

La evaluacin seria:
1- Se resuelve la ecuacin de la derecha(en este caso es el valor contenido en b)
2- Se guarda el valor resultado en la posicin de memoria correspondiente a la
variable a.
3- Se retorna el resultado de la asignacin, que es el valor de b. En este caso no
ocurre nada, pero si tuviramos x=a=b esto asignara tambin el valor de b a x

Seleccin
Esta estructura de control permite que el programador pueda expresar una eleccin entre un cierto nmero
posible de sentencias alternativa.

Evolucin de IF
FORTRAM:
If (condicin lgica) sentencia
Si la condicin es verdadera ejecuta la sentencia
ALGOL:
If (condicin lgica) then sentencia1
else sentencia2
Este permite tomar dos caminos posibles. El problema que tiene es que es ambiguo, ya que no se
establece a quien corresponde el ultimo else, con los if abierto.
PASCAL, C , PL/I
IF THEN ELSE

No es ambiguo pues el lenguaje establece que el ultimo else corresponde al ultimo if abierto.
Tiene el problema que pude ser ilegible cuando posee muchos if anidados.

Utiliza Begin y End.


ADA Y ALGOL 68
IF THEN ELSE FI. Incorporo la clusula que cierra los if, la cual es el fi.
Ambos lenguajes permiten el ELIF que reemplaza al ELSE IF.

Seleccin mltiples
PASCAL: Incorpora que los valores de la expresin sean Ordinales y ramas con etiquetas.
No importan el orden en que aparecen las ramas.
Es inseguro porque no establece qu sucede cuando un valor no cae dentro de las
alternativas puestas.
ADA: Combina los aspectos positivos del Pascal y de Algol68.
Las expresiones pueden ser de tipo entero o enumeracin.
Se debe estipular en las selecciones todos los valores posibles que puede tomar la
expresin.
Tiene la clusula Others que se puede utilizar para representar a aquellos valores que no se
especificaron explcitamente.

Si en la sentencia no se coloca la rama para un posible valor y no aparece la opcin Others, no


pasar la compilacin.
Case Operador is
when + => result:= a + b;
when - => result:= a - b;
when others => result:= a * b;
end;
PL/I: incorpora la sentencia de seleccin entre dos o ms opciones
56

Select
when(A) sentencia1;
when(B) sentencia2;
............
Otherwise sentencia n;
End;
Reemplazara a los If anidados
ALGOL 68: La expresin debe ser de tipo entera
La rama i-sima corresponde se ejecuta cuando la expresin da el valor i.
Tiene una clusula opcional Out que se ejecuta cuando el valor dado por la expresin no
est expresado en el conjunto de valores.
Si no se coloca se ejecuta por defecto Out y Skip. La sentencia Skip es una sentencia nula.
C , C++: Para mltiple seleccin provee el constructor Switch.
Cada rama es etiquetada por uno o ms valores constantes.
Cuando se coincide con una etiqueta del Switch se ejecutan las sentencias asociadas y se
contina con las sentencias de las otras entradas.
Existe la sentencia break, que provoca la salida del switch.
Tiene una clusula default que sirve para los casos que el valor no coincida con
ninguna de las opciones establecidas. Esta opcin es optativa y si no est, y
ninguno de los casos coincide, no se toma ninguna accin.
Switch Operador {
case + :result:= a + b;
case -: result:= a - b;
default : result:= a * b; }

break;
break;

Diferencias entre C y Pascal:


C en el caso que no coincida el valor de la expresin con alguna de las alternativas no hace nada o
utiliza la clusula default si apareciera. Pascal no tiene definido que es lo que debe hacer.
C tiene el break para salir de la ejecucin, Pascal no.
La manera de ejecutar es diferente, Pascal ejecuta las sentencias que corresponden a la alternativa y
sale, en cambio C comienza a ejecutar a partir de donde coincide el valor y continua en orden secuencial
hasta el final o hasta un break, pasando por todas las alternativas.
Diferencias entre C y Ada:
Ambos pueden contemplar los valores que no aparecen con las clusulas default y others
respectivamente.
La manera de ejecutar es diferente, ya que Ada ejecuta de la misma forma que Pascal.
En el lenguaje C tenemos la sentencia switch, la cual difiere de Pascal y Ada en que al machear en una
etiqueta, se ejecutarn las acciones de la misma y las de las posteriores hasta el final del switch; es decir,
desde la etiqueta vlida en adelante.
Se puede hacer que el switch funcione de manera similar que en PASCAL o ADA, incluyendo la sentencia
breack al final de cada caso posible, con lo cual al entrar en un caso, al llegar al breack se saltarn todos los
casos posteriores, yendo al final del switch.

57

Iteracin
Este tipo de instrucciones se utilizan para representar aquellas acciones que se repiten un
cierto nmero de veces.
FORTRAM :
Sentencia Do de Fortran
Do label var-de-control= valor1, valor2
...........
Label continue
-> La variable de control solo puede tomar valores enteros
-> El Fortran original evaluaba si la variable de control haba llegado al lmite al final del bucle, o
sea que siempre una vez lo ejecutaba.
Algol 68(FOR): no permite que se toque el valor de la variable de control, pero s los valores de
los lmites superior e inferior, porque los evala en el comienzo. Adems el alcance de la variable
de control es solo en el bucle.
Pascal no permite que se toquen ni los valores del lmite inferior y superior, ni el valor de la
variable de control.
La variable de control puede ser de cualquier valor ordinal.
El valor de la variable fuera del bloque se asume indefinido.
Ada: encierra todo proceso iterativo entre las clusulas loop y end loop.
Permite el uso de la sentencia Exit para salir del loop y la variable de control NO necesita
declararse, se declara implcitamente cuando se entra al bucle y desaparece cuando se sale de
l.
C, C++ se compone de tres partes: una inicializacin y dos expresiones.
La primer expresin (2do. Parmetro) es el testeo que se realiza ANTES de cada iteracin. Si no
se coloca el for queda en LOOP.
En el primer y ltimo parmetro se pueden colocar sentencias separadas por comas.

Problemas que pueden generarse con los if anidados. Soluciones.


Uno de los problemas que pueden presentarse es el de la ambiguedad.
If cond1 then if cond2 then s1 else s2
En este caso no se puede determinar si el else corresponde al primer o al segundo if.
Una solucin podra ser la que plantearon Pascal y C, establecer por lenguaje que cada else cierra con el
ltimo if abierto. La desventaja de esta solucin es la ilegibilidad ya que un programa con muchos if anidados
se hace ms difcil de leer.
Otra solucin podra ser utilizar begin-end como delimitadores de bloques.
Algol 68 no resuelve el tema del if then else de la misma manera que Pascal, sino que implementa un if then
else con ligeras modificaciones, de tal manera que se diferencia a que if pertenece un determinado else.
If cond1 then s1 fi
If cond2 tehn s2 else s3 fi

58

Estructuras de Control
Son el medio por el cual los programadores pueden determinar el flujo de ejecucin entre
los componentes de un programa
A Nivel de Unidad: Cuando el flujo de control se pasa entre unidades. Intervienen los pasajes
de parmetros.
A Nivel de Sentencia: Se dividen en tres grupos
Secuencia
Es el flujo de control ms simple.
Indica la ejecucin de una sentencia a continuacin de otra.
El delimitador ms general y ms usado es el ; .
Hay lenguajes que no tienen delimitador y establecen que por cada lnea vaya una
instruccin. Se los llaman orientados a lnea. Ej: Fortran, Basic, Python, etc.
Se pueden agrupar sentencias en una, llamada sentencia compuesta, llevan
delimitadores como Begin y End. Ej: Algol, Pascal, { y } en C, C++, etc.
Sentencia de Asignacin
Sentencia que produce cambios en los datos de la memoria.
Asigna al l-valor de un dato objeto el r-valor de una expresin.
Sintaxis en diferentes lenguajes

Distincin en entre sentencia y expresin


En cualquier lenguaje convencional, ej. Pascal, existe diferencia entre sentencia de asignacin y expresin
En otros lenguajes tales como C definen la sentencia de asignacin, como una expresin con efectos laterales.
Las sentencias de asignacin devuelven valores.
Evala de derecha a izquierda
Ejemplo a=b=c=0;
La mayora de los lenguajes de programacin requieren que sobre el lado izquierdo de la asignacin
aparezca un l-valor. C permite cualquier expresin que denote un l-valor. Ej.: ++ p = *q;
(i<j?z:y)=4;
Seleccin
Esta estructura de control permite que el programador pueda expresar una eleccin entre un cierto
nmero posible de sentencias alternativa
Evolucin:
If lgico de Fortran
If (condicin lgica) sentencia
Si la condicin es verdadera ejecuta la sentencia

59

if then else de Algol


if (condicin lgica) then sentencia1
else sentencia2
Este permite tomar dos caminos posibles
Problemas: Ambigedad, no estableca por lenguaje cmo se asociaban los else con los If abiertos.
if then else de Pl/1, Pascal y C sin ambigedad
Establecen por lenguaje que cada else cierra con el ltimo if abierto.
Desventajas: Ilegibilidad, programas con muchos if anidados pueden ser ilegibles. Utilizar Begin
End.

60

En otros lenguajes

La expresin debe ser de tipo entera


La rama i-sima corresponde se ejecuta cuando la expresin da el valor i.
Tiene una clusula opcional Out que se ejecuta cuando el valor dado por la expresin no est
expresado en el conjunto de valores
Si no se coloca se ejecuta por defecto Out y Skip. La sentencia Skip es una sentencia nula.

Incorpora que los valores de la expresin sean ordinales y ramas con etiquetas. No importan el
orden en que aparecen las ramas.
Es inseguro porque no establece qu sucede cuando un valor no cae dentro de las alternativas
puestas

Combina los aspectos positivos del Pascal y de Algol68


Las expresiones pueden ser de tipo entero o enumeracin
En las selecciones se debe estipular todos los valores posibles que puede tomar la expresin
Tiene la clusula Others que se puede utilizar para representar a aquellos valores que no se
especificaron explcitamente
Si NO se coloca la rama para un posible valor o si NO aparece la opcin Others en esos casos, no
pasar la compilacin.

Para mltiple seleccin provee el constructor Switch


Cada rama es etiquetada por uno o ms valores constantes
Cuando se coincide con una etiqueta del Switch se ejecutan las sentencias asociadas y se contina
con las sentencias de las otras entradas.
Existe la sentencia break, que provoca la salida
Tiene una clusula default que sirve para los casos que el valor no coincida con ninguna de las
opciones establecidas

61

Sentencia For de Pascal, Algol 68, ADA, C , C++


ariable de control puede tomar cualquier valor ordinal, no solo enteros

control.
La variable de control puede ser de cualquier valor ordinal.
El valor de la variable fuera del bloque se asume indefinida

inferior, porque los evala en el comienzo. Adems el alcance de la variable de control es solo en el bucle.
y end loop. Permite el uso de la sentencia Exit para
salir del loop y la variable de control NO necesita declararse, se declara
implcitamente cuando se entra al bucle y desaparece cuando se sale de l

62

La primera expresin (2do Parmetro) es el testeo que se realiza ANTES de cada iteracin. Si no se
coloca el for queda en LOOP.
En el primer y ltimo parmetro se pueden colocar sentencias separadas por comas

Otras sentencias iterativas: while y until


while

La condicin se evala antes de que se entre al proceso


- En Pascal:
while condicin do sentencia;
- En C, C++:
while (condicin) sentencia;
- En ADA:
while sentencia
end loop;

63

- En Phyton:
while condicin :
sentencia1
sentencia2
Until

- En Pascal:
repeat
sentencia
until condicin;
- En C, C++:
do sentencia;
while (condicin);

Otra sentencia iterativa


Ada tiene una estructura iterativa
loop
...
end loop;
De este bucle se sale normalmente, mediante una sentencia "exit when" o con una alternativa que contenga una
clusula "exit".
loop
...
exit when condicin;
...
end loop;

64

Excepciones
Definicin de Excepcin
Es un estado de un proceso anmalo. Se da cuando una unidad est incapacitada para proceder de una manera tal
que se llegue a una terminacin normal.

La incapacidad del programa para detectar estados anmalos de proceso y manejarlos de la forma apropiada,
puede producir un software que trabaje solo bajo ciertas circunstancias, o sea un software no tolerante a
fallos.
Definicin de Manejador
Realiza un procesamiento especial requerido cuando se detecta una excepcin. Una excepcin se levanta cuando
ocurre un evento asociado y en ese momento se llama al manejador que lo resuelve.

Modelos de Excepciones
-

Reasuncin: se maneja la excepcin y se devuelve el control al punto siguiente donde se invoco la


excepcin, permitiendo la continuacin de ejecucin de la unidad.
Terminacin: se termina la ejecucin que alcanza la excepcin y se transfiere el control al manejador.

Diferencias entre el MANEJO DE EXCECPIONES y el esquema CALL-RETURN


Una unidad no es, en ningn caso, una parte del programa independiente ni autosuficiente. En caso de que sea un
subprograma, se lo puede activar mediante una llamada realizada por otra unidad, a la que se le devolver el control
despus de la ejecucin. Por lo tanto, el punto de retorno no es una informacin que se debe preservar en el registro
de activacin cuando se hace la llamada al subprograma.

Para explicar las diferencias tenemos el siguiente ejemplo:


U1

U2
.
.
.
raise excepcin()
.
.
.

.
.
.
U3

call return

Una unidad U1 levanta una excepcin Excecpcion(), la cual implcitamente llama a un manejador que se ejecuta, y
dependiendo del modelo del manejo de excepcin; si es por reasuncin, se devuelve el control a la siguiente
instruccin donde se produjo la excepcin. En cambio, si es por terminacin, se aborta la ejecucin de U1.

En la unidad U2, se hace un llamado explcito a la unidad U3, la cual se ejecuta, y luego devuelve el control
a la instruccin siguiente a su llamado.

65

Excepciones en los diferentes lenguajes


C#
Criterio de Terminacin
Terminacin.
Lanzamiento de Excepcin
THROW <ObjentoExcepcionALanzar>
Ej: throw New DivideByZeroException()
Captura de la Excepcin
Si se desea tratar a la excepcin hay que encerrar la operacin dentro de una instruccin TRY.
Una vez lanzada la excepcin es posible escribir cdigo que se encargue de tratarla. Por defecto si este cdigo no se
escribe la excepcin provoca que la aplicacin aborte mostrando un mensaje de error en el que se describe la
excepcin producida y donde se ha producido.

Estructura
Try

<instrucciones>
catch (<excepcion1>)
<tratamiento1>
catch (<excepcion2>)
<tratamiento2>
finally
<instuccionesFinally>
Propagacin de Errores
-

Si durante la ejecucin las <instrucciones> se lanza una excepcin de tipo <excepcion1> se ejecuta las
instrucciones <tratamiento1>, si fuera de tipo <excepcion2 >se ejecuta las instrucciones <tratamiento2>,
y as hasta que se encuentre una clusula catch que pueda tratar la excepcin producida.
Si no se encuentra ninguna clusula catch y la instruccin TRY estuviese anidada dentro de otra, se
mirara en el catch de su try padre y se repetira el proceso.
Si al final se recorren todos los trys padres y no se encuentra ningn catch compatible, entonces se
buscara en el cdigo desde el que se llamo al mtodo que produce la excepcin.
Si as se termina llegando al mtodo que inicio el hilo donde se produce la excepcin y tampoco all se
encuentra ningn tratamiento apropiado se aborta dicho hilo y si ese hilo es el principal se aborta el
programa y se muestra el mensaje de error con informacin sobre la excepcin lanzada ya vista.
Cuando en <instrucciones> se lance una excepcin que sea tratada por el catch de algn try (ya sea suyo
de del try padre), SE SEGUIRA EJECUTANDO A PARTIR DE LA INSTRUCCIN SIGUIENTE A
ESE TRY.

BLOQUE FINALLY
Es opcional, y si se incluye has de hacerlo tras todos los bloques catch.
Las <instruccionesFinally> de ese bloque se ejecutaran tanto si se producen excepciones en <instrucciones>
como si no.
Si no se produce una excepcin en <instrucciones>, se ejecutara la <instruccinFinally> despus de haber
ejecutado todas las <instrucciones>.
Si se produce una excepcin se ejecutara la <instruccinFinally> despus de tratar la excepcin pero antes
de seguir ejecutando por la instruccin siguiente al Try que la trato. Si en un try no se encuentra un catch
66

compatible, antes de pasar a buscar en su try padre o en su mtodo llamante padre se ejecutaran las
<instruccionesFinally>.
Solo si dentro de un bloque finally se lanza una excepcin se ABORTA la ejecucin del mismo. Dicha
excepcin seria propagada al try o al mtodo llamante padre del try que contuviera el finally.
Aunque los bloques catch y finally son opcionales, toda instruccin try ha de incluir al menos un bloque catch o un
bloque finally.

Relevantar la Excepcin
Respecto al uso de TROW, hay que sealar que hay una forma extra de usarlo que solo es valida dentro del cdigo de tratamiento de la excepcin
(cdigo <tratamiento i > de la clusula catch). Esta forma consiste en seguir simplemente esta sintaxis:

TROW;
En este caso lo que se hace es relanzar la misma excepcin que se capturo en el bloque catch dentro de cuyo
cdigo de tratamiento se usa el thow;. Hay que precisar que la excepcin relanzada es precisamente la
capturada, y aunque en el bloque catch se la modifique a travs de las variables que la representa, la versin
relanzada ser la versin original de la misma y no la modificada.
Adems cuando se relanza una excepcin en un try con clusula finally, antes de pasar a reprocesar la
excepcin en el try padre del que la lanz se ejecutara dicha clusula.
Derivacin de la Clase System Excepcin
La clase System Exception es el tipo base de todas las excepciones
Esta clase tiene algunas propiedades que todas las excepciones comparten.
Message: Es una propiedad de solo lectura que tiene una legible descripcin de la razn de la excepcin.
Inner Exception: Es una propiedad de solo lectura que contiene el inner excepcin para una excepcin. Si no
es null, indica que la corriente excepcin fue levantada en respuesta a otra excepcin. Las excepciones que
ocasionan la excepcin corriente esta disponible en la propiedad Inner Exception.
JAVA
Criterio de Terminacin
Terminacin.
Lanzamiento de Excepcin
THROW ObjentoExcepcion;
donde: objetoExcepcion es un objeto de una clase que se extiende de la clase Exception.

Ej: void MetodoAsesino ( ) THROW NullPointerException,CaidaException


Se pueden definen excepciones propias, extendiendo la clase Exception y proporcionando la funcin extra que
requiere el tratamiento de esa excepcin. Tambin pueden producirse no de forma explcita como en el caso anterior,
sino de forma implcita cuando se realiza alguna accin ilegal o no valida.
Captura de la Excepcin

Las excepciones lanzadas por un mtodo que pueda hacerlo deben recogerse en bloque Try/catch o
Try/finally.

67

Estructura
Try {

<instrucciones> }
catch (<excepcion1>)
{ <tratamiento1>}
catch (<excepcion2>){
<tratamiento2>}
finally
{<instuccionesFinally>}
Observacin: en el cdigo catch tenemos que asegurarnos de poner cdigo que no genere excepciones.
Propagacin de Errores
Igual que C#.
Excepciones Definidas por el Usuario

Podemos lanzar nuestras propias excepciones, extendiendo la clase System.exception.


Un mtodo debe capturar las excepciones que genera, o en todo caso, declararlas como parte de su llamado,
indicando a todo el mundo que es capaz de generar excepciones. Esto debe ser as para que cualquiera que
escriba una llamada a ese mtodo avise de que le puede llegar una excepcin, en lugar del valor de retorno
normal. Esto permite al programador que llama a ese mtodo, elegir entre controlar la excepcin o
propagarla hacia arriba en la pila de llamadas.
C++
Criterio de Terminacin
Terminacin.
Tipo de Excepcin
Sincrnica: Son las que ocurren dentro del programa. Por ej: que se agote la memoria o cualquier otro tipo
de error. (Criterio de Terminacin)
Asincrnica: Son las que tiene su origen fuera del programa, a nivel del S.O. (Excepciones lanzadas con la
sentencia Thow)
Lanzamiento de Excepcin
THROW Excepcion;
Ej: Class EfueraRango{};
Con esto podramos lanzar una excepcin de la siguiente manera:
Throw EfueraRango();
El lanzamiento de una excepcin se realiza llamando a la funcin throw(). Cuando se lanza una excepcin,
en realidad lo que se hace es crear un objeto de la clase que se le indique a thow(), y precisamente ser dicho
objeto la excepcin en s.
Captura de la Excepcin
Si una excepcin que ha sido lanzada no encuentra un manejador apropiado, se llamara a la funcin TERMINATE( ),
la cual por defecto realiza un ABORT( ). Pero se puede definir nuestra propia funcin TERMINATE() con
set_terminate( ).

Algo parecido ocurre si un mtodo lanza una excepcin de un tipo que no tiene listado en su especificacin
de excepciones, entonces llama a la funcin UNEXCTED( ) la cual por defecto llama a TERMINATE (
).Pero de igual manera que con TERMINATE( ) podemos definir nuestra propia funcin UNEXPECTED( )
con SET_ UNEXPECTED( )
68

Estructura
Try {

<instrucciones> }
catch (<tipo excepcion1> <variable1>)
{ <tratamiento1>}
catch (<tipo excepcion2><variable2>){
<tratamiento2>}
Observacin: Si se especifica catch() se capturar cualquier excepcin. No tiene Finally
Propagacin de Errores

Igual que C#. (Pero sin la parte del finally)


ADA
Criterio de Terminacin
Terminacin.
Lanzamiento de Excepcin

RAISE <NombreExcepcionALanzar>
Ej: Raise EXCEPCIN-1
Captura de la Excepcin
En Ada cada bloque puede contener una coleccin opcional de manejadores de excepciones y son declaradas al final
del bloque.
Cada manejador es una secuencia de instrucciones. Esta secuencia aparece precedida de:
Palabra clave WHEN + un parmetro opcional denominado OCURRENCIA terminado en dos puntos + los nombres
de las excepciones manejadas + el smbolo =>

Estructura
Begin

.
When nomExcep1 => Manejador1
When nomExcep2 => Manejador2
..
When OTHERS => Manejador (opcional);
End;
Propagacin de Errores
-

Si la unidad que alcanza una excepcin proporciona un manejador para la misma, se transfiere inmediatamente el
control al manejador; se saltan las acciones al punto donde se alcanzo la excepcin, se ejecuta el manejador y se
termina la unidad.
Si la unidad que se esta ejecutando, U, no proporciona un manejador, se propaga la excepcin:

1- Si U es un bloque, termina su ejecucin y se vuelve a alcanzar implcitamente la excepcin en


la unidad que engloba a U.
2- Si U es el cuerpo de un subprograma se hace el retorno del mismo y se realza implcitamente
la excepcin en el punto de llamada.
3 - Si U es el cuerpo de un package, acta como si fuera un procedimiento que se activa cuando
se procesa la declaracin de package. En el caso de que no haya un manejador asociado al
package se propaga la excepcin a la unidad que alberga a dicho package.
69

Si una excepcin se propaga fuera de su mbito de visibilidad puede ser capturada utilizando un
manejador por defecto (When Others..).
Si queda alguna excepcin sin manejar en la tarea de entorno, el programa ser finalizado.

Relevantar la Excepcin
En algunas ocasiones, las acciones que se realizan como consecuencia de una excepcin necesita ser
estructurada en dos niveles:
-

Parte en el contexto en el que ocurri la excepcin.


Parte en el contexto de invocacin.

Para ello se emplea la clusula RAISE SIN NOMBRAR la excepcin.


Ejemplo:
Procedure Main is
E,F:Exception
Procedure A is Begin

-Bloque donde se levanta F


...
-Bloque donde se levanta E
...
exception
when E|F =>
--Accin comn a E y F;
RAISE;
end;
end A;
Begin {Main}
...
A;--En a puede ocurrir E o F
...
exception
When E => Accin relativa a E;
When F => Accin relativa a F;
End;
EndMain;
Pasaje de Parmetros
Unicamente se puede pasar como parmetro una cadena de caracteres.
Excepciones Predefinidas
Ada provee un conjunto de excepciones predefinidas que pueden ser automticamente detectadas por la maquina
de ejecucin subyacente:

Constraint_Error: Falla un chequeo en tiempo de ejecucin sobre alguna limitacin ( por


ejemplo: fuera del limite en un arreglo.)
Program_Error: Falla un chequeo en tiempo de ejecucin sobre alguna regla del lenguaje.
Storage_Error: Falla un chequeo de tiempo de ejecucin sobre la disponibilidad de memoria
(por ejemplo por alocacin dinmica.).
Tasking_Error: Falla un chequeo de tiempo de ejecucin en el sistema de task.

70

Clu
Criterio de Terminacin
Terminacin.
Lanzamiento de Excepcin
SIGNAL <NombreExcepcionALanzar>
Ej: SIGNAL EXCEPCION-2
Captura de la Excepcin
Las excepciones solo pueden ser alcanzadas en los procedimientos.
Las excepciones que un procedimiento puede sealar han de declararse en la cabecera del mismo.
El manejador de excepciones se relaciona con las sentencias por medio de la clusula Except, segn la sintaxis:
<sentencia> Except <lista de manejadores> end; donde: <sentencia> puede ser cualquier sentencia compuesta.
Si la ejecucin de un procedimiento que ha sido llamado en sentencias alcanza una excepcin, se cede el control a la
lista de manejadores que tiene el siguiente formato:

When <nomExcep1> :<Sentencia 1>


When <nomExcep2> :<Sentencia 2>
Estructura
<sentencia> Except
When <nomExcep1> :<Sentencia 1>
When <nomExcep2> :<Sentencia 2>
...
When Others :<Sentencia 1>
Propagacin de Errores
Al producirse una excepcin:
-

Se termina el procedimiento donde se levanto la excepcin y devuelve el control al llamante inmediato donde se debe
encontrar el manejador.
Si el manejador se encuentra en ese mbito y la excepcin alcanzada pertenece a <nomExcep_i> entonces se ejecuta
<sentencia_i>(el cuerpo del manejador). Cuando acabo, el control pasa a la sentencia siguiente a la que esta ligado dicho
manejador.
Si <sentenci_i > contiene una llamada a una unidad, pudiera ser que se alcanzara otro excepcin. En tal caso el control se
pasa a la sentencia Except que incluye <sentencias>. Si la excepcin alcanzada no figura en ninguna lista de excepciones se
repite el proceso para las sentencias incluidas estticamente. En caso de no encontrar un manejador en el procedimiento que
hizo la llamada, el procedimiento seala implcitamente a la excepcin predefinida FAILURE y devuelve el control.
Si el manejador no se encuentra en ese mbito, la excepcin se propaga estticamente. Esto significa que el proceso se repite
para las sentencias incluidas estticamente.

Relevantar Excepcin

Una excepcin se puede volver a levantar con RESIGNAL


Pasaje de Parmetros
En Clu las excepciones pueden devolver parmetros a sus manejadores.

71

PL/1
Criterio de Terminacin

Reasuncin: Cada vez que se produce la excepcin la maneja el manejador y devuelve el control a la
sentencia siguiente de donde se levanto.
Lanzamiento de Excepcin
Las excepciones son llamadas CONDITIONS.
SIGNAL CONDITION <NombreExcepcionALanzar>
Ej: SIGNAL EXCECPCION-3
Captura de la Excepcin
Los manejadores se declaran con la sentencia ON:
ON CONDITION (Nombre-Excepcion) Manejador
El manejador puede ser un bloque o una instruccin.
Este lenguaje aloca los manejadores en forma de pila, por eso cuando una unidad levanta una excepcin tiene
prioridad el ultimo manejador que se carg en la pila. Los manejadores se desalocan de la pila cuando termina la
unidad en la que estn definidos.
Los manejadores se ligan dinmicamente con las excepciones. Una excepcin siempre esta ligada con el ultimo
manejador definido.
El alcance de un manejador de una excepcin termina cuando finaliza la ejecucin de la unidad donde fue declarado.
El alcance de un manejador de una excepcin se acota cuando se define otro manejador para esa excepcin y se
restaura cuando se desactiva los manejadores que la enmascaran.

Propagacin de Errores
Al producirse una excepcin(bien automticamente o por una sentencia Signal):
- Se ejecuta el manejador vinculado actualmente a la excepcin como si fuera un subprograma llamado
explcitamente desde ese punto. Por lo tanto a no ser que se especifique lo contrario en el manejador, el
control volver al punto donde se produjo la sentencia Signal.
Excepciones Predefinidas
Este lenguaje tiene una serie de excepciones ya predefinidas con un manejador asociado. Son las Built_in
Exception. Ej:divisionporCero.
- A las Built_in se les puede redefinir los manejadores de la siguiente manera:
On Nombre-Built-in Begin
end;
-

A las built_in se las puede habilitar y deshabilitar explcitamente.


- Se habilitan anteponiendo el nombre de la built_in antes del bloque, instruccin o procedimiento al
que van a afectar.
- Se deshabilitan anteponiendo NO al nombre de la built_in antes del bloque, instruccin o
procedimiento al que van a afectar.
Ej (ZeroDivide) Begin...End; //habilitada
(NOZeroDivide)BeginEnd; //deshabilitada.

72

Pasaje de Parmetros
En PL/1 las excepciones no pueden devolver parmetros a sus manejadores.
Por consiguiente solo se puede establecer el flujo de informacin mediante el uso de variables globales, lo
que por otro lado puede ser una practica poco recomendable. Adems no siempre es posible utilizar
variables globales.
DELPHI

Lanzamiento de una Excepcin


Una excepcin es un objeto que contiene informacin acerca del error ocurrido y donde sucedi". Esto quiere decir
que una excepcin nos indica por qu sucedi el error y adems cual recurso se estaba accesando cuando esto
sucedi.
Captura de Excepcin

-El primero es para liberar recursos y se puede representar as:


...
Solicitud del recurso
try
Cdigo de uso del recurso.
finally
Cdigo para liberar el recurso solicitado
end;
...

- El segundo es slo para el manejo de errores, su representacin es la siguiente:


...
try
Cdigo de acceso al recurso.
except
Cdigo para manejar los errores
on Tipo de excepcin do begin
Cdigo para manejar este tipo de error
end;
...
on Tipo de excepcin do begin
En caso de que la excepcin no sea soportada
raise;
end;
end.

El cdigo llamado "bloque protegido" es el que se coloca entre el Try y el finally o entre Try y el except , este cdigo es el que
va a quedar protegido por el manejador de errores o excepciones.
La diferencia entre estos dos tipos de manejadores es que el primero ejecuta el bloque entre el finally y el end siempre, esto
aunque ocurra un error o finalice exitosamente y el segundo slo ejecuta el bloque entre el except y el end si ocurre un error en el
bloque protegido.
Para manejar los errores Delphi define un objeto llamado Exception del cual derivan todos los objetos manejadores de
excepciones. Estos objetos son los que se colocan entre las palabras reservadas on y do con el fin de manejar el tipo de excepcin
que se desee. Se pueden declarar tantas expresiones on y do como excepciones se quieran manejar, o tambin se pueden declarar
manejadores genricos de excepciones omitiendo las declaraciones on y do.
Hay casos en que una excepcin no puede ser manejada, para esto se utiliza la palabra reservada raise con el fin de levantar la
excepcin de nuevo; de esta forma la excepcin salta al manejador de excepciones anterior, si no encuentra un manejador sigue
recursivamente cayendo en los contextos de excepcin definidos, si no existe quien la maneje primero despliega un mensaje de
error y en muchos casos puede abortar el programa.

73

Excepciones de Usuario
Delphi permite definir en una forma muy sencilla los tipos de excepcin que necesite el programador para hacer ms
seguro su programa.
SIGNAL Y THROW

Objetivo
Transferir el control al llamado de la excepcin.

Diferencias
SIGNAL
Signal( ) ignora los contexto de excepcin que estn a su mismo nivel, y siempre retorna a los de algn
procedimiento llamado, causando la terminacin del procedimiento en que aparece el Signal( ).
THROW
Throw( ) siempre retorna al contexto de excepcin ms inmediato, aunque este contexto se encuentre en el
mismo procedimiento en que se invoco al Throw().
Incorporacin del manejo de excepciones a la hora de disear un lenguaje.
Es importante incorporar el manejo de excepciones a la hora disear un lenguaje para que los programas sean
tolerantes a fallos y no funcionen correctamente solo bajo ciertas circunstancias. Un buen modelo a utilizar es el de
terminacin ya que provee ms seguridad debido a que al producirse la excepcin se aborta el programa yno
temrmina normalmente pudiendo de esta manera dejar un estado inconsistente como puede ocurrir con el modelo de
reasuncin.

Excepciones
Una excepcin es un proceso anmalo. Es un proceso que la unidad dnde se provoc est incapacitada para atenderlo de manera que
termine normalmente.
Algunas cuestiones a tener en cuenta en el diseo de un lenguaje de programacin que contenga manejo de excepciones:
Cmo se maneja una excepcin y cul es su mbito?
Cmo se alcanza una excepcin?
Cmo especificar la unidades (manejadores de excepciones) que se han de ejecutar cuando se alcanza las excepciones?
A dnde se cede el control cuando se termina de atender las excepciones?
Qu accin toman los lenguajes cuando se termina de manejar las excepciones?
Esta es una de las cuestiones fundamentales, ya que determina la potencia y la utilidad del mecanismo.

74

Algunos lenguajes que incorporaron el manejo de excepciones.

PL/1
De los primeros lenguajes, ste fue el nico que incorpor el

manejo de excepciones. Fue el primer lenguaje.

Cmo lo implementa?
Utiliza el criterio de Reasuncin. Cada vez que se produce la excepcin, la maneja el manejador y devuelve el control a
la sentencia siguiente de dnde se levant.
La excepciones son llamadas CONDITIONS
Los manejadores se declaran con la sentencia ON:
ON CONDITION(Nombre-excepcin) Manejador
El manejador puede ser una instruccin o un bloque
Las excepciones se alcanzan explcitamente con la palabra clave
Signal condition(Nombre-excepcin)
Este lenguaje tiene una serie de excepciones ya predefinidas con su manejador asociado. Son las Built-in exceptions.
Ejemplo de estas zerodivide, se levanta cuando hay una divisin por cero.
A las built-in se les puede redefinir los manejadores de la siguiente manera:
ON Nombre-Built-in Begin
End
A las built-in se las puede habilitar y deshabilitar explcitamente
Algunas built-in se habilitan por defecto.
Se habilita anteponiendo el nombre de la built-in al bloque, instruccin o procedimiento al que va a afectar.
Se deshabilita anteponiendo NONombre de la built-in al bloque, instruccin o procedimiento al que va a afectar
Ej: (ZERODIVIDE) begin

(NOZERODIVIDE) begin
end

end

Los manejadores se ligan dinmicamente con las excepciones. Una excepcin siempre estar ligada con el ltimo manejador
definido.
El alcance de un manejador de una excepcin termina cuando finaliza la ejecucin de la unidad donde fue declarado
El alcance de un manejador de una excepcin se acota cuando se define otro manejador para esa excepcin y se restaura cuando se
desactivan los manejadores que la enmascararon.
No permite que se pasen parmetros a los manejadores
Desventajas:
Los dos ltimos puntos provocan

programas difciles de escribir y comprender y la necesidad de uso de variables globales

75

ADA
Cmo lo implementa?
Utiliza el criterio de Terminacin. Cada vez que se produce una excepcin, se termina el bloque,
procedimiento, paquete o tarea dnde se levant y se ejecuta el manejador asociado.
La excepciones se definen en la zona de definicin de las variables, colocando la palabra Exception.
Ejemplo: e:exception;
El alcance de una excepcin es igual que el de las variables.
Las excepciones se alcanzan explcitamente con la palabra clave raise
Raise Nombre-excepcin
Los manejadores pueden encontrarse en el
Procedimiento, Paquete o Tarea. Forma de definirlos:

final de cuatro diferentes unidades de programa: Bloque,

Este lenguaje tiene cuatro excepciones ya predefinidas con su manejador asociado. Estas son: Constrainterror, Program-error, Storage-error y Tasking-error.
Propagacin de errores:
Al producirse una excepcin:
Se termina la unidad, bloque, etc. dnde se alcanza la unidad.
Si el manejador se encuentra en ese mbito, se ejecuta.
Si el manejador no se encuentra en ese lugar la excepcin se propaga dinmicamente. Esto significa que
se vuelve a levantar en otro mbito.
Una excepcin se pude levantar nuevamente colocando solo la palabra raise. Se vuelve a levantar la ltima
excepcin levantada.

76

CLU
Cmo lo implementa?
Utiliza el criterio de Terminacin.
Las excepciones en Clu solamente pueden ser alcanzadas por los procedimientos.
Las excepciones estn asociadas a sentencias.
La excepciones que un procedimiento puede alcanzar se declaran en el encabezamiento del procedimiento.
Las excepciones se alcanzan explcitamente con la palabra clave signalSignal Nombre-excepcin
Los manejadores se colocan al lado de una sentencia que puede ser simple o compleja. Forma de definirlos:

Este lenguaje tiene excepciones ya predefinidas con su manejador asociado.


Propagacin de errores:
Al producirse una excepcin:
Se termina el procedimiento donde se levant la excepcin y devuelve el control al llamante inmediato
donde se debe encontrar el manejador.
Si el manejador se encuentra en ese mbito, se ejecuta y luego se pasa el control a la sentencia siguiente
a la que est ligado dicho manejador.
Si el manejador no se encuentra en ese lugar la excepcin se propaga estticamente. Esto significa
que el proceso se repite para las sentencias incluidas estticamente.
En caso de no encontrar ningn manejador en el procedimiento que hizo la llamada se levanta una
excepcin faliure y devuelve el control.
Se pueden pasar parmetros a los manejadores.
Una excepcin se puede volver a levantar utilizando resignal

77

C++
Cmo lo implementa?
Utiliza el criterio de Terminacin.
Las excepciones pueden alcanzarse:
Implcitamente, ejemplo: Divisin por cero
Explcitamente a travs de la sentencia throw
Los manejadores van asociados a bloques que necesitan manejar ciertos casos excepcionales.
Los bloques que pueden llegar a levantar excepciones van precedidos por la palabra clave Try y al finalizar el
bloque se detallan los manejadores utlizando la palabra clave Catch(NombreDeLaExcepcin)
Al levantarse una excepcin dentro del bloque Try el control se transfiere al manejador correspondiente.
Al finalizar la ejecucin del manejador la ejecucin contina como si la unidad que provoc la excepcin fue
ejecutada normalmente.
Permite pasar parmetros al levantar la excepcin.
Ejemplo: Throw (Ayuda msg);
Se est levantando la excepcin Ayuda y se le pasa el parmetro msg.

Las rutinas en su interface pueden listar las excepciones que ellas pueden alcanzar.
Ejemplo: void rutina ( ) throw (Ayuda, Zerodivide);
Qu sucede si la rutina ?
alcanz otra excepcin que no est contemplada en el listado de la Interface?
En este caso NO se propaga la excepcin y una funcin especial se ejecuta automticamente: unexpected(),
que generalmente causa abort(), que provoca el final del programa. Unexpected puede ser redefinida por el
programador.
no coloc en su interface el listado de posibles excepciones a alcanzar?
En este caso Si se propaga la excepcin. Si una excepcin es repetidamente propagada y no machea con
ningn manejador, entonces una funcin terminate() es ejecutada automticamente.
coloc en su interface una lista vaca (throw())?
Significa que NINGUNA excepcin ser propagada.
78

JAVA
Cmo lo implementa?
Al igual que C++ las excepciones son objetos que puden ser alcanzados y manejados por manejadores adicionados
al bloque donde se produjo la excepcin.
Diferencias:
TODAS las excepciones (chequeadas) que puedan ser alcanzadas explcitamente por la rutina, DEBEN ser
listadas en la interface de la misma o ser manejadas por un manejador.
Justificacin de esta obligatoriedad: El usuario de la rutina DEBE conocer qu excepciones puede alcanzar la
misma.

79

Delphi
Delphi presenta dos estructuras de manejo de excepciones:
Uno utilizado bsicamente para liberar recursos. Su representacin es la siguiente:

Esto sirve por ejemplo, para controlar errores que pueden producirse en el transcurso del uso de un archivo, como ser:
permanencia del archivo, integridad del mismo, mantenimiento de la conexin activa, en caso que se trabaje con un
archivo que est en una red, etc.

El segundo slo para el manejo de errores. Su representacin es la siguiente:


...
try
...
except
on Tipo de excepcin do begin
Cdigo para manejar este tipo de error
end;
on Tipo de excepcin do begin
Cdigo para manejar este tipo de error
end;
end;
Este sirve para el caso que se desee manejar las excepciones.
Las excepciones se pueden levantar explcitamente con Raise.
Raise; levanta nuevamente la misma excepcin

80

81

Python

Lenguajes que NO proveen manejo de Excepciones

82

Encapsulamiento y abstraccin.
Intrpretes y Compiladores.
Paradigmas de lenguajes (imperativo, orientado a objetos, funcional,
lgico).

83

84

You might also like