Sie sind auf Seite 1von 65

Lenguajes de Programacin I

1.

INTRODUCCIN
1.1. EVOLUCIN DE CONCEPTOS
Abstraccin de Datos Tipos elementales Tipos estructurados Tipos abstractos Abstraccin de Control Sentencias Unidades de programa

1.2. CLASIFICACIN DE LENGUAJES


Los lenguajes, en general, admiten la siguiente posible clasificacin: Lenguajes Naturales (idiomas) De programacin De mquina Simblicos De bajo nivel (ensambladores) De alto nivel Imperativos (Fortran, Pascal, C, Ada) Funcionales (Lisp, Apl, Forth) Lgicos (Prolog) Orientados a objetos (C++, Eiffel, Java, Smalltalk) Los lenguajes de programacin, segn su nivel de abstraccin, admiten la siguiente categorizacin grfica:

Lenguajes de Programacin I

1.3. CRITERIOS DE DEFINICIN Y DISEO DE LENGUAJES


Ortogonalidad Dotar al lenguaje de la mxima generalidad posible de modo que no existan restricciones o casos especiales. Como una muestra de carencia de ortogonalidad en Pascal, el tipo de un parmetro formal no puede ser annimo, es decir, no es posible declararlo explcitamente como, por ejemplo, procedure noort(var a : array[1..10] of real); debindose declarar procedure noort(var a : A); despus de la declaracin global type A = array[1..10] of real; Claridad sintctica Permitir que las diferencias semnticas se manifiesten en diferencias sintcticas. Orientacin Proveer una sintaxis comprometida con la orientacin del lenguaje. Extensin Facilitar la implementacin de estructuras inexistentes en funcin de las existentes. Portabilidad Proveer una definicin del lenguaje independiente de las caractersticas de una mquina en particular. Eficiencia En traduccin En ejecucin En construccin

Lenguajes de Programacin I

1.4. SINTAXIS
Definicin La sintaxis de un lenguaje es un conjunto de reglas que determinan si las sentencias de un programa estn bien formadas o no. Objetivo Proveer una notacin que permita la comunicacin entre procesador del lenguaje. Criterios sintcticos Legibilidad Facilidad de escritura Facilidad de traduccin Ausencia de ambigedad. Por ejemplo, M(i) puede significar un elemento del arreglo M una llamada a la funcin M. el programador y el

Elementos Sintcticos Set de caracteres Identificadores Smbolos para operadores Palabras claves y reservadas. Una palabra clave es un identificador que constituye la parte no cambiante de una instruccin. Una palabra reservada es una palabra clave no declarable como identificador de usuario. Comentarios Abreviaciones Espacios Delimitadores Formatos fijo y libre Expresiones Sentencias Estructura de unidades de programa Definicin separada: Cada unidad representa un bloque sintctico independiente (Fortran). Definicin anidada: Las unidades aparecen como declaraciones y pueden contener sus propias definiciones de unidades (Pascal). Definicin centralizada de datos: Las declaraciones de datos para todas las unidades se centralizan en una nica divisin ( Cobol).

Lenguajes de Programacin I

Gramticas Una gramtica representa la definicin formal de la sintaxis de un lenguaje. Consta de un conjunto de reglas que especifican las secuencias de smbolos (tems de lxico) que forman estructuras sintcticas en el lenguaje definido. Metalenguajes Un metalenguaje es una gramtica formal destinada a la descripcin de un lenguaje. Existen tres metalenguajes comnmente utilizados. BNF (Backus-Naur-Form) Notacin desarrollada por los especialistas Backus y Naur para definir lenguaje Algol60 Ejemplo de BNF para lenguaje Pascal: <sentencia for> ::= for <variable> := <intervalo> do <sentencia> <intervalo> ::= < valor inicial> to <valor final> | <valor inicial> downto <valor final> <variable> ::= <identificador> <identificador> ::= <letra>{<letra>|<dgito>}o <letra>::= A | B ... | Z | a | b ... | z <dgito>::= 0 | 1 | 2 ... | 9 <valor inicial>::= <expresin> <valor final>::= <expresin> Alternativamente se pueden usar reglas BNF en forma recursiva. <alfanum> ::= <letra> | <dgito> <secuencia> ::= <alfanum> | <alfanum> <secuencia> <identificador> ::= <letra> | <letra> <secuencia> Los smbolos <, >, |, {, }, ::=, no son parte del lenguaje definido, sino parte del mecanismo de descripcin y reciben el nombre de metasmbolos. El smbolo ::= significa "se define como". Las secuencias encerradas entre < > constituyen smbolos no terminales (o metavariables) y las secuencias restantes (subrayadas y otras) smbolos terminales. Diagramas sintcticos Constituyen un mtodo de descripcin de lenguajes, equivalente a la BNF, originalmente propuesto por Wirth. Equivalencias entre BNF y diagramas sintcticos: <S> ::= <v1> | <v2> | <vk>

Cada ocurrencia de un smbolo terminal corresponde al diagrama

Lenguajes de Programacin I

Cada ocurrencia de un smbolo no terminal corresponde al diagrama Una produccin de la forma <S> ::= {<x>}0 corresponde al diagrama Una produccin de la forma <S> ::= {<x>}1 corresponde al siguiente diagrama Diagramas sintcticos para Lenguaje Pascal: Identificador Sentencia if Sentencia while Sentencia compuesta CBL (COBOL-Like) Constituye una extensin de la BNF destinada a la descripcin sintctica del lenguaje Cobol. Incluye la siguiente simbologa: Elementos opcionales se denotan entre parntesis cuadrados [x] Elementos alternativos se listan verticalmente entre parntesis llave Elementos cuadrados. alternativos opcionales se listan verticalmente entre parntesis

La repeticin de los elementos se indica mediante tres puntos a continuacin de una ocurrencia del elemento. [ x ] Ejemplos: <entero> ::=

Lenguajes de Programacin I

<identificador> ::=

1.5. SEMNTICA
La semntica de un lenguaje especifica el significado algortmico de un programa y se define como un conjunto de reglas que describen el comportamiento de ese lenguaje en tiempo de ejecucin. Una expresin sintctica, mediante BNF, como <fecha> ::= <d><d>/<d><d>/<d><d> puede tener dos interpretaciones semnticas; por ejemplo, 12/03/99 se entiende como 12 de Marzo de 1999 en Chile y 03 de Diciembre de 1999 en EEUU.

1.6. PROCESADORES DE LENGUAJES


Procesador Es una mquina capaz de ejecutar acciones expresadas en algn lenguaje concreto (actualmente, slo lenguaje de mquina). Traductor Es un decodificador que acepta programas escritos en algn lenguaje fuente y genera programas, funcionalmente equivalentes, en algn lenguaje objeto. Compilador Es un traductor cuyo lenguaje fuente es un lenguaje de alto nivel y cuyo lenguaje objeto es un lenguaje de mquina. Lenguaje de alto nivel Lenguaje ensamblador Lenguaje de mquina (cdigo reubicable) Lenguaje de mquina (cdigo real)

Lenguajes de Programacin I

Intrprete Es un procesador cuyo lenguaje concreto es un lenguaje de alto nivel. Sin embargo, como ningn computador es capaz de ejecutar un cdigo distinto al de mquina, se debe simular mediante software la existencia de un computador cuyo lenguaje de mquina es un lenguaje de alto nivel. Diferencias entre compilador e interprete El compilador slo traduce; el intrprete decodifica y ejecuta. El compilador acepta las instrucciones segn su secuencialidad fsica (las traduce slo una vez); el intrprete los acepta segn su secuencialidad lgica (puede procesar varias veces algunas e ignorar completamente otras instrucciones).

Lenguajes de Programacin I

2.

OBJETOS DE DATO
2.1. COMPONENTES DE UN OBJETO
La memoria de un computador es capaz de representar objetos de cualquier naturaleza lgica. Cada objeto de dato tiene un nombre el cual, sintcticamente, es un identificador (exceptuando los literales). Cada nombre tiene atributos, una referencia (si es un nombre de variable) y un valor: los atributos determinan las propiedades de un nombre, siendo el ms importante el tipo; la referencia es un nmero que identifica a la celda de memoria que contiene un valor asociado a un nombre; el valor es uno perteneciente al conjunto conocido como tipo.

2.2. CONSTANTES
Un objeto de dato cuyo valor no se modifica durante la ejecucin, se denomina constante. Una constante cuyo nombre es la representacin escrita de su valor se denomina literal. Una constante cuyo nombre es un identificador se denomina constante declarada. const Pi = 3.1416; x := 3.1416; z := Pi; {Constante declarada} {Literal}

2.3. VARIABLES
Un objeto de dato cuyo valor suele modificarse durante la ejecucin se denomina variable. Una variable es una cudrupla X = (N,A,R,V) donde N = Nombre A = Atributo R = Referencia V = Valor Grficamente:

Lenguajes de Programacin I

2.4. DECLARACIONES
Una declaracin es una sentencia de programa que provee al traductor del lenguaje informacin sobre los atributos de una variable. Por ejemplo, la traduccin de la declaracin en Pascal var x : integer; provoca el siguiente efecto grfico: Sin embargo, la traduccin de la declaracin en Fortran Integer x provoca el siguiente efecto grfico: ya que Fortran sita todos los objetos de dato en un rea de memoria contigua al cdigo, situacin que se mantiene invariante durante ejecucin.

2.5. BINDING (LIGADURA)


Definicin Ligadura es la accin de asociar tipo, referencia o valor a un nombre de variable. Ligadura en lenguajes fuertemente tipados (variables estticas y automticas) La asociacin de un tipo a una variable se conoce como ligadura esttica, anticipada en tiempo de compilacin. (N + T) La asociacin de una referencia a una variable se conoce como ligadura intermedia en tiempo de creacin. ((N + T) + R)) La asociacin de un valor a una variable se conoce como ligadura dinmica en tiempo de ejecucin. (((N + T) + R) + V) Ligadura en lenguajes dbilmente tipados (variables dinmicas)

Lenguajes de Programacin I

10

La asociacin de un tipo a una variable se conoce como ligadura dinmica, tarda en tiempo de ejecucin. Sin embargo, en este caso, los tipos estn ligados a los valores y los valores estn representados a partir de cierta referencia. Luego, la ligadura dinmica puede consistir en crear un valor de cierto tipo a partir de una referencia y asociar esa referencia a un nombre de variable, bien, asociar a un nombre de variable una referencia en la cual existe un valor de cierto tipo. (N + (R +(T + V)))

2.6. OPERACIONES
En un lenguaje, una operacin (inherente a un tipo de dato) se puede definir como una funcin que transforma una lista de argumentos en una lista de resultados. Luego, cada operacin tiene un dominio (conjunto de argumentos posibles) y un recorrido (conjunto de resultados posibles).
nombreOperacin : (tipoArgumento, tipoArgumento, ...) (tipoResultado, tipoResultado, ...)

Por ejemplo: + = * ord : : : : (real, real) (entero, entero) (real, entero) (carcter) (real) (boolean) (real) (entero)

2.7. EXPRESIONES
Definicin Una expresin es un conjunto bien formado de operadores y operandos cuyo objetivo es la generacin de un valor. Alternativas de descripcin sintctica Notacin prefija Ordinaria Cambridge Polaca *(+(a,b),-(c,d)) ( * (+ a b ) (- c d ) ) *+ ab-cd {Lenguaje Lisp}

Notacin infija (convencional) a+b*c-d Notacin postfija

10

Lenguajes de Programacin I

11

Ordinaria ( ( a , b) + , ( c , d ) - ) * Polaca inversa a b + c d - * Control de secuencia Las reglas implcitas de control destinadas a eliminar el excesivo uso de parntesis en expresiones exentas de ambigedad, en notacin convencional son: Prioridad de operadores Si x = 12 e y = 3 entonces el valor de la expresin x - 3 * y es 3 en Pascal y 27 en Smalltalk. Asociatividad para operadores de idntica prioridad Si x = 7 e y = 4 entonces el valor de la excpresin x - y - 3 es 0 en Pascal y 6 en APL.

11

Lenguajes de Programacin I

12

3.

SENTENCIAS
3.1. ASIGNACIN
Definicin Una asignacin es una sentencia que almacena el valor del argumento ubicado a la derecha del smbolo que la representa, en la referencia del argumento ubicado a la izquierda del mismo. l-valor y r-valor En la sentencia x := x + 1, la variable x tiene un doble comportamiento respecto al valor contenido en su referencia: a la izquierda, uno activo que lo modifica, y a la derecha, uno pasivo que slo lo usa. Referencia y valor corresponden, respectivamente, a los conceptos l-valor y r-valor (left-value y right-value) los cuales expresan la funcin que ellos desempean a ambos lados de un smbolo de asignacin. Consideraciones: Cada variable tiene un l-valor que designa su ubicacin en memoria. Una constante slo tiene r-valor. En una variable subindicada A[i], el l-valor es la ubicacin en memoria del i-simo elemento de A y el r-valor es el valor almacenado en esa ubicacin Si p es una variable puntero, su r- valor es la direccin a la cual p apunta y su l-valor es la ubicacin en la cual esa direccin se encuentra almacenada. Grficamente:

Para una variable, el l-valor es nico; sin embargo, un l-valor pueda pertenecer a ms de una variable.

En este, caso, x e y tienen el mismo l-valor, razn por la cual x es llamada "alias de y" e y "alias de x". Lenguaje Fortran provee el concepto de alias a travs de la sentencia Equivalence. Implementacin Sea la sentencia a := b; El compilador genera cdigo para calcular el r-valor de b en algn registro R. Si los tipos de a y b son distintos, el compilador genera cdigo para convertir en R (si es posible) el r-valor de b al tipo de a.

12

Lenguajes de Programacin I

13

El compilador genera cdigo para almacenar el contenido del registro R en el l-valor de a. Formas Ciertos lenguajes, como C, definen la asignacin como una operacin binaria infija con prioridad inferior a la de las restantes operaciones sobre tipos elementales. Por ejemplo: a = ( b = c + d ) + ( e = f + g ); Tambin, en C, se acepta la expresin m[++i] = i. Algunos lenguajes, como PL/I, permiten asignaciones de la forma A = B, donde A y B pueden ser de tipos estructurados compatibles. Si A es un arreglo en PL/I, la asignacin A=0 lo inicializa con ceros. La modalidad v1 , v2 , ... , vk e1 , e2 , ... , ek constituye una asignacin mltiple de acuerdo a una correspondencia posicional entre l-valores y r-valores. Resulta til para intercambiar valores entre variables, por ejemplo: p, q q, p;

3.2. INICIALIZACIN
Una inicializacin consiste en proporcionar un valor a una variable antes de comenzar la ejecucin del cdigo al cual pertenece. La inicializacin puede ser implcita, por ejemplo asignar el valor cero a todas las variables numricas, o explcita, si aparece como parte de una declaracin. Por ejemplo: int v[5] = {11, 22, 33, 44, 55};

3.3. CONTROL DE SECUENCIA


Control de secuencia implcito La ejecucin procede segn el orden fsico de las sentencias que conforman una unidad de cdigo. Ejecucin paralela Ciertos lenguajes permiten la ejecucin paralela conceptual de un bloque de instrucciones. Para expresar paralelismo, Dijkstra sugiere la estructura parbegin/parend:

13

Lenguajes de Programacin I

14

parbegin S1; S2; Sn; parend; Grficamente:

Por ejemplo: parbegin c[1]:= a[1] * b[1]; c[2]:= a[2] * b[2]; c[3]:= a[3] * b[3]; parend; Sentencia goto El objetivo de la sentencia goto es el traspaso explcito del control a una instruccin con label desde cualquier punto de un programa, excepto cuando tal instruccin se encuentra al interior de un bloque. Ejemplo: label L; var A : array[1..9] of integer; i : integer; begin i := 0; L :read(A[i]); i := i + 1; if i < 10 then goto L; end;

14

Lenguajes de Programacin I

15

Sentencias de seleccin Seleccin simple (if-then) Seleccin doble (if-then-else) Seleccin mltiple (case) Sentencias de repeticin Repeticin "mientras" (while) Repeticin "hasta" (repeat) Repeticin con variable de control (for) Sentencias de I/O Constituyen la interfaz de comunicacin con las rutinas del sistema operativo destinadas a la transferencia de datos. Sentencias de invocacin Constituyen el mecanismo de activacin de unidades de programa. Sentencias estructuradas Corresponde a la concepcin recurrente de sentencia compuesta o bloque. Ciertos lenguajes, como C, permiten declarar variables locales al interior de un bloque, por ejemplo: { int i = 0; { int j = 0; } }

15

Lenguajes de Programacin I

16

4.

TIPOS DE DATOS
4.1. CONCEPTOS BSICOS
Definicin de tipo Un tipo de dato es un conjunto de objetos con una coleccin de operaciones. Tal conjunto se conoce como dominio. Tipo elemental de dato Tambin conocido como escalar, es aquel cuyo dominio consta slo de valores constantes (enteros, reales, lgicos, caracteres). Tipo estructurado de dato Tambin conocido como agregado, es aquel en el cual cada uno de los valores de su dominio es una composicin de objetos de tipo escalar y/o agregado (producto cartesiano, aplicacin finita, unin discriminada, conjunto potencia).

4.2. ESTRUCTURA DE TIPOS


La estructura de los tipos de datos en un lenguaje la determinan dos componentes: Equivalencia Criterio con el cual se decide que dos objetos son del mismo tipo. Si los tipos de los dos objetos tienen el mismo nombre, entonces la equivalencia es nominal; en cambio, si tienen la misma estructura, la equivalencia es estructural. Ejemplo : type E = integer; A = array[1..10] of integer; var x1 : integer; x2 : integer; x3 : E; v1 : array [1..10] of integer; v2 : A; v3 : A; Equivalencia nominal x1 eq x2 y v2 eq v3 (el tipo de v1 es annimo)

Equivalencia estructural x1 eq x2 eq x3 y v1 eq v2 eq v3

16

Lenguajes de Programacin I

17

Conversin La conversin de tipos en un lenguaje se realiza con el propsito de transformar la representacin interna de un r-valor segn la representacin interna del respectivo l-valor. La conversin se puede materializar de dos formas: Conversin implcita o coercin. Conversin explcita o casting. Por ejemplo, con el siguiente cdigo en lenguaje C float p, q; int s, n; s = 5; n = 2; p = s/n; q = (float)s/n; printf(%f %f \n, p, q);

/* coercin */ /* casting */

se despliegan los valores 2.0 y 2.5 para p y q, respectivamente. Esto debido a que la divisin entre los enteros s y n genera un valor entero, el cual se convierte al tipo de p (coercin). En la siguiente lnea, se crea una copia temporal de tipo float del entero s; luego, se calcula la divisin entre el valor de la copia float de s y el valor de una copia float de n (coercin). En C, un operador de casting es un operador unario.

4.3. COMPROBACIN DE TIPOS


Comprobacin de tipos es la accin consistente en verificar la consistencia entre un l-valor y un r-valor. La comprobacin puede ser esttica, si ocurre durante el proceso de compilacin, o dinmica, si ocurre durante el proceso de ejecucin. La comprobacin esttica es ms segura y eficiente que la dinmica. Sin embargo, esta ltima (aunque ms costosa en tiempo y espacio) dota de mayor flexibilidad a los lenguajes. Costosa en tiempo en cuanto a la asignacin y desasignacin de almacenamiento, al acceso de datos y la ejecucin de la operacin misma de comprobacin. Costosa en espacio debido a que el compilador no puede establecer el tamao de ciertos objetos lo cual impone el uso de formas de gestin menos eficientes (por ejemplo, heap). Si el objetivo del diseo de un lenguaje es la seguridad, entonces se intentar que toda la comprobacin de tipos se realice durante la compilacin. Lamentablemente, esto no es siempre posible. Es casi inevitable la existencia de determinados tipos que fuerzan a comprobaciones en tiempo de ejecucin. Esto puede ocurrir, por ejemplo, con los intervalos. Si se tiene

17

Lenguajes de Programacin I

18

type rango = 1..100; var k, n : rango; n := 2*k + 1; el valor que se intenta asignar a n slo se puede comprobar durante ejecucin. La misma situacin se presenta con la comprobacin de ndices de arreglos. Por esta razn, casi no existen lenguajes en los cuales toda la comprobacin de tipos se realice durante compilacin. ML es una de las excepciones. A esta clase de lenguajes se les conoce como "fuertemente tipados". En lenguajes similares a Pascal, la comprobacin de tipos es extraordinariamente simple. Si la comprobacin es esttica, a partir de la declaracin, el compilador guardar en la tabla de smbolos, para cada objeto, el tipo al que pertenece y, para cada operacin, los tipos de sus operandos. Luego, al compilar una sentencia comprobar, consultando la tabla, si los objetos tienen el tipo adecuado. Por ejemplo, si se tiene x := f(x) + z; el compilador comprobar que x tenga el tipo del parmetro formal de f, que el tipo de f, el de x y el de z coincidan y todos ellos sean compatibles. Si la comprobacin fuera dinmica, el proceso sera similar, pero durante la ejecucin; para ello, el compilador, al procesar las declaraciones, generar instrucciones que almacenen el tipo asociado a cada objeto para que est disponible durante la ejecucin. Posteriormente, al procesar una instruccin, el compilador generar instrucciones que consulten la informacin almacenada sobre los tipos de los objetos, y que comprueben que los valores que se van obteniendo durante la ejecucin de la instruccin tienen el tipo adecuado.

4.4. DEFINICIONES FORMALES


Producto cartesiano El producto cartesiano de n conjuntos C1, C2, ... Cn, denotado en la forma C1 x C2 x ... x Cn, es un conjunto cuyos elementos son n-tuplas (c1, c2, ... cn) donde ci Ci. Por ejemplo, los polgonos regulares se pueden caracterizar por un nmero entero que representa el numero de lados y un nmero real que representa la longitud de un lado. Todo polgono regular as expresado es un elemento del producto cartesiano ZxR. A los productos cartesianos se les conoce como registros o estructuras.

18

Lenguajes de Programacin I

19

Aplicacin finita Una aplicacin finita es una funcin de un conjunto de valores pertenecientes a un dominio D sobre un conjunto de valores pertenecientes a una imagen I. Las aplicaciones finitas se conocen como arreglos. En Pascal, var A: array [1..5] of real; define una aplicacin del subrango de enteros 1...5 sobre los nmeros reales, pudindose seleccionar, mediante un ndice, un objeto del conjunto imagen, por ejemplo A[k], k = 1..5. Para ligar el dominio de la funcin a un subconjunto especfico de valores, los lenguajes pueden optar por alguna o algunas de las siguientes estrategias: Esttica El subconjunto se determina en tiempo de compilacin. Semidinmica El subconjunto se determina en tiempo de creacin del objeto. Por ejemplo, [m:n] int A; declara un arreglo semidinmico cuyo espacio en memoria se asigna de acuerdo a los valores actuales de m y n y permanece mientras A exista en el ambiente en el que fue definido. Dinmica El subconjunto puede cambiar en cualquier instante de la existencia del objeto. Por ejemplo flex [1:0] int B; declara un arreglo vaco de modo que, la asignacin B:= (2, 3, 8) cambia sus lmites a [1:3]. Unin discriminada La unin discriminada constituye una extensin del producto cartesiano, cuyo propsito es permitir, en cualquier instante de la ejecucin del cdigo al que pertenece, la eleccin de una entre diferentes estructuras alternativas, cada una de las cuales se denomina variante, dependiendo del valor que presenta un selector conocido como discriminante.

19

Lenguajes de Programacin I

20

Conjunto potencia Corresponde a un mecanismo de estructuracin que permite definir variables cuyo valor puede ser cualquier subconjunto de un conjunto de elementos de un determinado tipo T. El tipo de tales variables es el conjunto de todos los subconjuntos de elementos de tipo T, conocido como tipo base. Si T = {a, b, c}

entonces, el conjunto potencia de T y la cardinalidad del conjunto potencia de T, respectivamente, son

P (T) = { {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}} ,
#(P (T)) = 2#(T) = 23 = 8

4.5. MODELOS DE IMPLEMENTACIN


Caracterizacin Los modelos de implementacin constituyen una tcnica de representacin interna de objetos de dato. Los traductores de lenguajes operan con tales modelos con el propsito de satisfacer abstracciones de alto nivel. Un modelo de implementacin est formado por un par consistente en un descriptor y un objeto. El descriptor es un conjunto de atributos del objeto. Con respecto al acceso de componentes de tipos agregados de datos, los modelos de implementacin deben considerar frmulas de acceso. Una frmula de acceso es una funcin que transforma referencias lgicas en fsicas, a partir de los atributos contenidos en el descriptor. Tipos elementales En casi todos los lenguajes, los tipos elementales constituyen una abstraccin de una implementacin hardware. Sin embargo, ciertos lenguajes definen como elementales algunos tipos para los cuales no existe representacin hardware, debiendo simularse mediante software.

20

Lenguajes de Programacin I

21

Producto cartesiano La representacin interna del producto cartesiano (modalidad Pascal) consta de un descriptor y de la disposicin secuencial de sus componentes (campos) en un bloque. Por ejemplo var R : record a : integer; b : real; end; se representa, grficamente, de la siguiente forma: Descriptor Nombre: Constructor: Selector 1: Tipo 1: Tamao 1: Dir. relativa 1: Selector 2: Tipo 2: Tamao 2: Dir. relativa 2: Dir. base: R record a integer T1 K1 = 0 b real T2 K2

Objeto a b

El acceso al i-simo selector, durante ejecucin, se expresa mediante la frmula: Dir(R.Si) = +

T
j =1

i 1

donde es la direccin base de R, resuelta en tiempo de carga, y Tj el tamao del jsimo selector. Sin embargo, la expresin Luego Dir(R.Si) = + Ki

T
j =1

i 1

se resuelve en tiempo de traduccin.

21

Lenguajes de Programacin I

22

con Ki =

T
j =1

i 1

y K1 = 0, constantes.

Aplicacin finita La representacin interna de una aplicacin finita consta de un descriptor y de un bloque compuesto de un nmero entero de unidades direccionables. Tal es el caso de vectores y matrices en Pascal. El vector var V : array [1..10] of real; Se representa, grficamente, de la siguiente forma: Descriptor Nombre: V Constructor: array Tipo elemento: real Tamao elemento: T Num. dimensiones: 1 Tipo ndice: integer Lmite inferior: li Lmite superior: ls Direccin base:

Objeto
V[1] V[2] V[3]

V[10]

El acceso al i-simo elemento de V, durante ejecucin , se expresa mediante la frmula: Dir(V[i]) = + (i - li)*T donde los valores li y T se determinan en tiempo de traduccin y la direccin base en tiempo de carga. Luego, Dir(V[i]) = + K + i*T con K = -li*T constante La matriz var M : array [1..10,1..10] of real; Se representa, grficamente, de la siguiente forma:

22

Lenguajes de Programacin I

23

Descriptor Nombre: M Constructor: array Tipo elemento: real Tamao elemento: T Num. dimensiones: 2 Tipo ndice: integer Lm. inf. filas: if Lm. sup. filas: sf Lm. inf. columnas: ic Lm. sup. columnas: sc Direccin base:

Objeto
M[1,1] M[1,2] M[1,10] M[2,1]

M[10,10]

El acceso al elemento M[i, j], durante ejecucin, se expresa mediante la frmula: Dir(M[i, j]) = +(i - if)*S + (j - ic)*T donde los valores S = (sc - ic + 1)*T ( tamao de fila), if, ic y T se determinan en tiempo de traduccin y la direccin base en tiempo de carga. Luego, Dir(M[i,j]) = + K + i*S + j*T con K = -(if*S + ic*T) constante La frmula de acceso a un elemento de un arreglo multidimensional M, es la siguiente: Dir(M[in, in-1, ..., i2, i1]) = + (i k id k ) * S k
k =1 n

con Sk = Ord(k=1)*T + Ord(k>1)* (sdk-1 - idk-1 + 1)*Sk-1 y donde, T es el tamao de un elemento del tipo base, sdk el lmite superior de la ksima dimensin e idk el lmite inferior de la k-sima dimensin. Unin discriminada La representacin interna de una unin discriminada, consta de un descriptor y del espacio necesario para sus componentes, considerando el tamao de la mayor variante definida.

23

Lenguajes de Programacin I

24

Por ejemplo: var Z : record a : integer; case b : boolean of True: (c : integer); False: (d : integer; e : real); end; se representa, grficamente, de la siguiente forma: Descriptor Nombre: Z Constructor: union Selector 1: a Tipo 1: integer Tamao 1: T1 Dir. relativa 1: K1 = 0 Selector 2: b Tipo 2: boolean Tamao 2: T2 Dir. relativa 2: K2 Dir. tabla seleccin: Dir. base:

Tabla seleccin True False

Objeto

Selector 3: Tipo 3: Tamao 3: Dir relativa 3: Selector3: Tipo 3: Tamao 3: Dir. relativa3: Selector 4: Tipo 4: Tamao 4: Dir. relativa 4:

c integer T3 K3 d integer T3 K3 e real T4 K4

El acceso al i-simo selector, durante ejecucin, se expresa mediante la frmula: Dir(Z.Si) = + Ord(i j)* Tk +
k =1 i 1

24

Lenguajes de Programacin I

25

Ord(i>j)*( Tk + Ord(Z.Sj=True)*
k =1

k = j +1

Tk + Ord(Z.Sj=False)*

i 1

k = j +1

i 1

donde Sj es el selector discriminante. Sin embargo, las expresiones

se resuelven en tiempo de traduccin. Luego,

Dir(Z.Si) = + Ord(i j)*Ki + Ord(i>j)*( Kj + Ord(Z.Sj=True)*Kp + Ord(Z.Sj=False)*Kq) con Ki =

Tk , Kj =
k =1

i 1

Tk , Kp =
k =1

k = j +1

i 1

, Kq =

k = j +1

i 1

y K1 = 0 constantes.

Conjunto potencia La representacin interna de un conjunto potencia est restringida a los conjuntos definidos por extensin y se sustenta en la estructura conocida como string de bits. Si C es una variable de tipo conjunto potencia y #(T) = n, entonces C se representa mediante un string de n bits de modo que, el i-simo bit en 1 indica la presencia del isimo valor del tipo T en C, mientras que los n bits en cero indican C = . Un string de bits coincide conceptualmente con la estructura packed array of boolean. Con respecto a las variables P, Q y R, de tipo conjunto potencia de T = {a, b, c}, con P = {a, c}, Q = {b, c} y R = PQ = {c}, la correspondiente representacin de string de bits es la siguiente: P Q R a 1 0 0 b 0 1 0 c 1 1 1

de donde se aprecia que el resultado de una operacin sobre dos conjuntos se obtiene realizando, posicin a posicin, las respectivas operaciones lgicas sobre bits.

5.

UNIDADES DE PROGRAMA
5.1. UNIDADES SUBORDINADAS

25

Lenguajes de Programacin I

26

Los lenguajes de programacin permiten que un programa est compuesto de cierto nmero de unidades, conocidas como subprogramas, las cuales se pueden desarrollar en forma independiente y cumplen un objetivo bien definido resultante del proceso de descomposicin de un problema. Los subprogramas soportan la definicin de una accin abstracta (cuerpo de un subprograma) y su uso (invocacin del subprograma). Los datos declarados al interior de un subprograma se conocen como locales. La invocacin de una unidad de programa durante ejecucin se conoce como activacin. Una activacin se compone de un segmento de cdigo, de contenido fijo, y un registro de activacin de contenido variable, el cual incluye toda la informacin necesaria para ejecutar la unidad. Un subprograma se puede activar desde otra unidad, a la cual se le devolver el control una vez finalizada la ejecucin de aquel. Luego, el registro de activacin debe almacenar la direccin de retorno al efectuarse la invocacin. Un subprograma puede referenciar variables no locales, pertenecientes a otro registro de activacin que est activo durante toda la ejecucin. Tales variables reciben el nombre de globales. El entorno de referencia para una activacin de cierta unidad S consta de los objetos contenidos en el registro de activacin de S (entorno local) y de los objetos contenidos en los registros de activacin de otras unidades (entorno global). Estructura tipo Fortran Cada unidad se compila por separado y se asocia a un registro de activacin cuyo tamao se determina antes de la ejecucin y permanece ligado a la unidad durante la ejecucin del programa, aun cuando tal unidad no est activa. El mbito de una variable se reduce a la unidad en la cual se ha declarado. Sin embargo, las unidades pueden tener acceso a variables globales, declaradas mediante sentencias Common, las cuales se pueden considerar pertenecientes a un registro de activacin que es global para todas las unidades. Esta modalidad no soporta las activaciones recursivas. Por ejemplo:

26

Lenguajes de Programacin I

27

Estructura tipo Algol Dos unidades cualesquiera de cdigo fuente pueden ser disjuntas o bien anidadas. El ambiente (contexto de validez) de una variable x local a una unidad U es U y todas las unidades al interior de U, para las cuales x tiene el carcter de global. Las variables locales se crean implcitamente al activarse la unidad y la cantidad de almacenamiento requerido por ellas se determina en tiempo de traduccin. Al igual que en Fortran, el tamao del registro se conoce en tiempo de traduccin. Sin embargo, el referido registro es asignado y ligado dinmicamente al respectivo cdigo con cada nueva activacin. Con el fin de hacer posible el retorno desde una unidad activa es necesario que el registro de activacin contenga: La direccin de retorno, determinada por el puntero al segmento de cdigo de la unidad que llama, ms el desplazamiento al interior de ese segmento. El enlace dinmico, o puntero al registro de activacin de la unidad que llama. El tratamiento de los registros de activacin es de naturaleza LIFO y, consecuentemente, la estructura de soporte el stack. Esto favorece la implementacin de algoritmos recursivos. Grficamente:

Representacin de un stack de registros de activacin:

27

Lenguajes de Programacin I

28

Invocaciones explcitas La comunicacin entre unidades de programa se puede efectuar mediante parmetros. A diferencia de la comunicacin a travs de entornos globales, los parmetros permiten la variabilidad de los elementos transferidos en diferentes llamadas. Luego, los parmetros formales constituyen parte del registro de activacin. Generalmente, los lenguajes utilizan la modalidad de correspondencia posicional entre parmetros actuales y formales en llamadas a subprogramas. Sin embargo, existe una alternativa conocida como correspondencia nominal, en la cual se indica explcitamente en la invocacin la correspondencia entre parmetros actuales y formales. Por ejemplo, en la invocacin: Inicializar (Tabla is V, Limite is N); V y N son los parmetros actuales que corresponden a los parmetros formales Tabla y Limite en una definicin como procedure Inicializar(Limite: in integer; Tabla: in out Arreglo); Invocaciones implcitas Ciertos lenguajes contemplan la invocacin implcita de una unidad cuando se produce alguna situacin de excepcin. Esta cualidad permite excluir aquellos errores que podran desviar la atencin del objetivo principal del programa. Las unidades que se activan cuando se detecta alguna irregularidad se denominan manejadores de excepciones. Un manejador de excepciones en Delphi se establece como bloque protegido, delimitado por try/end, en cuyo interior las palabras reservadas except o finally proveen dos formas alternativas de comportamiento: except se usa para tratar errores mediante una instruccin ad-hoc; finally para ejecutar acciones finales de liberacin de recursos tales como memoria. Ejemplos: function Potencia(Base, Exponente : Real) : Real; begin try Result := Exp(Ln(Abs(Base))*Exponente); if (Base < 0) And (Odd(Trunc(Exponente))) then Result := -Result; except on EMathError do Result := 0; end; end;

28

Lenguajes de Programacin I

29

function Fib(N : Byte) : Longint; type Puntero = ^Arreglo; Arreglo = Array[0..255] of Longint; var Lista : Puntero; B : Byte; F : Longint; begin New(Lista); try; Lista^[0] := 0; Lista^[1] := 1; for B := 2 to N-1 do Lista^[B] := Lista^[B-1] + Lista^[B-2]; F := Lista^[N-1]; finally Dispose(Lista); end; Result := F; end;

5.2. UNIDADES SIMTRICAS


Las unidades simtricas, o corrutinas, son unidades que se activan mutua, alternada y explcitamente. El cdigo, en Algol68: corroutine X; begin resume Y; resume Y; end; corroutine Y; begin resume X; resume X; end; se puede representar, grficamente, como sigue: X Y

resume Y resume Y

resume X

resume X

29

Lenguajes de Programacin I

30

La sentencia "resume" tiene un comportamiento similar al de una sentencia "call" con la salvedad de que el punto de entrada a la corrutina es variable. La ejecucin de una sentencia "resume" en X involucra dos acciones: Almacenar en la direccin de reinicio la direccin de la sentencia inmediatamente posterior a resume Y. Accesar la direccin de reinicio de Y para obtener la direccin en la cual debe continuar la ejecucin.

5.3. UNIDADES CONCURRENTES


Dos procesos son paralelos si se pueden ejecutar (conceptualmente) en forma simultnea. Dos procesos paralelos son disjuntos si, durante ejecucin, no acceden compartidos. a recursos

Dos procesos paralelos son concurrentes si, durante ejecucin, interactan compitiendo por el acceso a recursos compartidos (competicin) y cooperando para alcanzar un objetivo comn (cooperacin). Los procesos concurrentes interactan en forma correcta slo si existe una cierta relacin de procedencia entre sus acciones elementales, lo cual se logra estableciendo una adecuada sincronizacin entre ellos. Mecanismos de sincronizacin: Semforos Un semforo constituye un mecanismo de bajo nivel y se define como un objeto de dato que toma valores enteros y sobre el cual se pueden realizar las operaciones atmicas P y V.

30

Lenguajes de Programacin I

31

Monitores Un monitor es un tipo abstracto de dato con las operaciones primitivas Agregar y Extraer. La exclusin mutua en el acceso a recursos compartidos est implcitamente garantizada por la implementacin. Sin embargo, la cooperacin debe programarse explcitamente, suspendiendo y activando procesos mediante operaciones primitivas. Rendezvous Es el mecanismo proporcionado por el lenguaje Ada para establecer la sincronizacin de procesos concurrentes (a los que se les denomina "tasks") mediante el cual desaparece la distincin entre entidades activas (procesos) y pasivas (monitores). Este esquema refleja ms claramente el comportamiento de un sistema concurrente en una estructura distribuida, en la cual recursos ajenos son administrados por procesos que actan como guardianes.

31

Lenguajes de Programacin I

32

6.

PARAMETRIZACIN
Cada uno de los elementos que participan en la representacin de una variable (nombre, tipo, referencia y valor) es susceptible de ser parametrizado. Sin embargo, la parametrizacin del tipo establece una diferencia conceptual importante en la categorizacin de los lenguajes. Luego, se diferenciar entre parametrizacin de datos (para aludir al nombre, la referencia o el valor) y parametizacin de tipos. Por otra parte, adems de datos, tambin es posible la parametrizacin de subprogramas.

6.1. PARAMETRIZACIN DE DATOS


Considrense los siguientes subprogramas: procedure uno(<modalidad> a, b : integer); begin a := 7; b := 5; end; procedure cero; var c, d : integer; begin c:= 5; d := 7; uno(c, d); write(c, d); end; Llamada por nombre Bajo esta modalidad, al producirse una invocacin, cada parmetro formal es textualmente sustituido por el respectivo parmetro actual. En este caso, <modalidad> ::= name. Ejemplo: c : = 5; d := 7; uno(c, d); write(c, d); 7 5 ya que la regla de sustitucin establece que, en "uno", las sentencias a ejecutar son: c := 7;

32

Lenguajes de Programacin I

33

d := 5; Grficamente:

Esta regla, aparentemente simple, puede provocar efectos inesperados. Por ejemplo, si se tiene procedure swap(name a, b : integer); var temp : integer; begin temp := a; a := b; b := temp; end; la llamada swap(i, v[i]); puede producir un resultado imprevisible e incorrecto, ya que la regla de sustitucin especifica que las sentencias a ejecutar son: temp := i; i:= v[i]; v[i] := temp; de modo que, si i = 3 y v[3] = 4 antes de la llamada, entonces i = 4 y v[4] = 3 al finalizar la ejecucin.
1 2 3 4 5 n

v:

33

Lenguajes de Programacin I

34

Otra situacin poco clara se presenta con el cdigo procedure dos; var c: integer; procedure swap(name a, b : integer); var temp : integer; begin temp := a; a := b; b := temp; c := c + 1; end; procedure tres... var c, d : integer; begin c := 5; d := 7; swap(c, d); write(c,d); end; begin c := 5; tres; end; ya que la regla de sustitucin especifica que las sentencias a ejecutar son: temp := c; c := d; d := temp; c := c + 1; segmento de cdigo en el cual la variable c de la ltima lnea no es la misma que aparece en las lneas primera y segunda. Llamada por referencia Los parmetros actuales transfieren su referencia a los respectivos parmetros formales. Si se acepta como parmetro actual una expresin, se transfiere la direccin de la variable temporal que contiene el valor de la expresin. En este caso, <modalidad> ::= ref. Ejemplo: c : = 5; d := 7;

34

Lenguajes de Programacin I

35

uno(c, d); write(c, d); 7 5 Grficamente:

Llamada por copia Los parmetros actuales se relacionan con sus respectivos parmetros formales mediante la asignacin de valores. Existen tres formas: Llamada por valor Los valores de los parmetros actuales se utilizan para inicializar los respectivos parmetros formales. En este caso, <modalidad> ::= in. Ejemplo: c : = 5; d := 7; uno(c, d); write(c, d); 5 7 Al producirse la invocacin de "uno" se ejecutan las acciones a := c y b := d; Grficamente:

Llamada por resultado Los parmetros formales no se inicializan al invocarse el subprograma pero, al terminar ste su ejecucin, los valores de aquellos son asignados a los respectivos parmetros actuales usados en la llamada. En este caso, <modalidad> ::= out. Ejemplo: uno(c, d); write(c, d);

35

Lenguajes de Programacin I

36

7 5 Al finalizar la ejecucin de "uno" se ejecutan las acciones c := a y d := b; Grficamente:

Llamada por valor-resultado Se trata de un efecto combinado de llamada por valor, al producirse la invocacin, y llamada por resultado, al terminar la ejecucin del subprograma. En este caso, <modalidad> ::= in out. Ejemplo: c : = 5; d := 7; uno(c, d); write(c, d); 7 5 Grficamente:

Llamada por indireccin Se trata de una llamada por valor en la cual el parmetro formal recibe la direccin de la variable utilizada como parmetro actual. En este caso, tambin <modalidad> ::= in. Sin embargo, en la definicin se debe anteponer el operador de indireccin (por ejemplo, *) al nombre del parmetro formal y, en la invocacin, se debe anteponer el operador de direccin (por ejemplo, &) al nombre del parmetro actual. procedure uno(in *a, *b : integer); begin *a := 7; *b := 5; end; procedure cero; var c, d : integer; begin c := 5;

36

Lenguajes de Programacin I

37

d := 7; uno(&c, &d); write(c, d); 7 5 end; Grficamente:

6.2. PARAMETRIZACIN DE TIPOS


La parametrizacin de tipos se define mediante el concepto de unidad genrica y se implementa mediante el concepto de macro-expansin. Una unidad genrica es una unidad formal (modelo) cuyos parmetros son instalados en tiempo de traduccin producindose una unidad actual. La parametrizacin de tipos involucra un alto nivel de abstraccin y disminuye el tamao del cdigo fuente. Sea el siguiente subprograma genrico en lenguaje Ada: generic type T; procedure Swap(X, Y : in out T) is Temp : T; begin Temp:= X; X := Y; Y := Temp; end; En este caso, el tipo de X e Y es el parmetro que debe ser sustituido en tiempo de traduccin. La produccin de distintos subprogramas, que difieran slo en el tipo de sus argumentos, se puede lograr, por ejemplo, mediante: procedure Swapinteger is new Swap (integer); procedure Swapreal is new Swap (real);

6.3. PARAMETRIZACIN DE SUBPROGRAMAS


El envo de un subprograma como parmetro requiere pasar una referencia al segmento de cdigo del parmetro actual y la informacin respecto del entorno no local de ese parmetro.

37

Lenguajes de Programacin I

38

Por consiguiente, un subprograma parmetro se puede representar como un par ordenado (c, r) donde c es un puntero al segmento de cdigo y r un puntero al registro de activacin de la unidad que contiene la definicin del subprograma. Por ejemplo: procedure P... procedure A... begin end; procedure B(procedure X); var y: integer; procedure C... begin end; begin X; B(C); end; begin B(A); end; P llama a B con el procedimiento A como parmetro actual. Como B tiene definido un parmetro formal X, la llamada a X activa el procedimiento A. Seguidamente, B se autoinvoca con el procedimiento C como parmetro actual.

38

Lenguajes de Programacin I

39

7.

CONTROL DE DATOS
7.1. DEFINICIONES
Alcance Rango de cdigo en el cual est activo un nombre de objeto, es decir, segmento de programa en el cual todas las instancias de un identificador se refieren al mismo objeto de dato. Extensin Tiempo de ejecucin durante el cual una variable se encuentra ligada a su referencia. Entorno de referencia Conjunto de objetos de dato activos al interior de un segmento de cdigo. Queda determinado por las reglas de alcance que provee el lenguaje.

7.2. REGLAS DE ALCANCE


Estticas Permiten determinar el alcance de un nombre de objeto de dato durante compilacin (Fortran, Pascal, C, Ada, etc.). Esta modalidad se basa en el concepto de registros de activacin lxicamente anidados, es decir, el uso de un objeto de dato genera una bsqueda del nombre de ese objeto en (el registro de activacin de) la unidad en curso; si no se encuentra all, se le busca en la primera unidad que incluya (lxicamente) a aquella; de no encontrarse en ese ambiente, se le busca en la siguiente unidad jerrquicamente superior; este proceso se puede extender hasta llegar al programa principal. Dinmicas Permiten determinar el alcance de un nombre de objeto de dato durante ejecucin (Apl, Lisp, Snobol, etc.). Bajo esta modalidad, el uso de un objeto de dato provoca la bsqueda del nombre de ese objeto en (el registro de activacin de) la unidad en curso; si no se encuentra all, se le busca en la unidad que invoc a aquella; de no encontrarse en ese ambiente, el proceso de bsqueda contina en sentido inverso al de las invocaciones, hasta encontrar el objeto en cuestin. Ejemplo Con respecto a la ejecucin del siguiente cdigo:

39

Lenguajes de Programacin I

40

program Alcance(input, output); var b: integer; procedure Z; begin write(b); end; procedure Y; var b: integer begin b := 9; Z; end; begin b := 5; Y; end. segn las reglas de alcance esttico, se imprime 5 y, segn las reglas de alcance dinmico, se imprime 9. Grficamente:

7.3. IMPLEMENTACIN
Alcance esttico En Fortran, la extensin de los objetos de datos en un programa coincide con el tiempo destinado a su completa ejecucin. Cuando se invoca un subprograma, se activan todos los objetos locales, con excepcin de aquellos declarados en una sentencia Common. Al terminar la ejecucin del subprograma, se desactivan todos los objetos locales (manteniendo los ltimos valores adquiridos) y se activan todos los objetos de la unidad que lo invoc. Cada subprograma posee un registro de activacin que contiene: Objetos locales Parmetros Direccin de rea Common Direccin de retorno

En Pascal, la extensin de los objetos de datos en un subprograma comienza en el instante en que este se activa y termina cuando devuelve el control a la unidad que lo invoc. La excepcin la constituyen los datos creados con new los cuales slo son destruidos con dispose. Cada subprograma posee un registro de activacin que contiene: Objetos locales Parmetros

40

Lenguajes de Programacin I

41

Enlace a objetos no locales activos Direccin de retorno Enlace dinmico La referenciacin de objetos no locales se consigue mediante una cadena de punteros estticos, lo cual significa que cada registro de activacin incluye un puntero al registro de activacin del primer subprograma que lo contenga lxicamente. Lo anterior se encuentra condicionado por las operaciones push y pop de registros (segn se concreten las invocaciones y concluyan las ejecuciones de subprogramas) sobre un stack de registros de activacin. Con respecto al cdigo: program U; procedure A; procedure B; procedure C; begin A; end {C}; begin C; end {B}; procedure D; begin B; end {D}; begin D; end {A}; begin A; end {U}. la cadena de punteros estticos es: y el stack de registros de activacin, presenta el siguiente comportamiento:

Alcance dinmico El soporte de las reglas de alcance dinmico es un stack de registros de activacin y la referenciacin de objetos de datos no locales desencadena procesos de bsqueda

41

Lenguajes de Programacin I

42

determinados por el comportamiento LIFO. El registro de activacin perteneciente a cada unidad de programa contiene: Objetos locales Parmetros Direccin de retorno Enlace dinmico

7.4. EXTENSIN DE DATOS


Las caractersticas de los datos determinan su extensin y se establecen durante el proceso de definicin de un lenguaje. Existen tres categoras de datos: Estticos Tienen una extensin coincidente con la ejecucin de la totalidad del programa. El soporte de almacenamiento es un rea fija de memoria (Fortran). Automticos Tienen una extensin determinada por el tiempo que toma la ejecucin de la totalidad de la unidad en la cual se encuentran definidos. El soporte de almacenamiento es un stack de registros de activacin. Dinmicos Tienen una extensin definida por el programador, quien los crea y destruye explcitamente. El soporte de almacenamiento es un bloque de memoria denominado heap. Dependiendo de la extensin inherente a los datos, cada lenguaje utiliza una o ms alternativas de soporte de almacenamiento.

42

Lenguajes de Programacin I

43

7.5. SOPORTE HEAP


Un heap es un bloque de memoria compuesto de elementos de tamao fijo o variable, dentro del cual se puede reservar o liberar espacio de manera no estructurada. Heap de elementos de tamao fijo Si k es el tamao de un elemento (en bytes) y n es la cantidad total de elementos del heap, entonces ste ocupar un espacio de k*n bytes. En un heap, el espacio disponible tiene la estructura de una lista de enlace simple; luego, cada vez que se solicita espacio, se desplaza el puntero de acceso al prximo elemento libre, y se retorna un puntero al primer elemento del espacio reservado. Los elementos que conforman una variable, pueden distribuirse, por ejemplo, del siguiente modo: Nombre y Referencia, en un espacio fijo de memoria (tabla de variables). Atributo y Valor, en un espacio al interior de un heap (a partir de la referencia). El proceso de devolucin de elementos en desuso a la lista de espacio disponible es simple, sin embargo, el proceso de identificacin de esos elementos como tales resulta ser extremadamente complejo. Existen tres formas de solucin a este problema: Devolucin explcita Mecanismo que permite al programador identificar y devolver los elementos en desuso. Presenta dos inconvenientes: Dangling reference Puntero a un elemento que ha sido devuelto a la lista de espacio disponible. Conceptualmente, en Pascal, new(p); q := p; dispose(p); {q es una dangling reference} Garbage Elemento en condicin de ser reutilizado pero inaccesible debido a su no devolucin a la lista de espacio disponible. Conceptualmente, en Pascal, new(p); p:=q; Dangling reference es, potencialmente, ms peligroso que garbage. Cuenta referencias Consiste en incluir, al interior del espacio para cada variable en el heap, un contador de referencias que lo apuntan. Al reservarse un espacio, el contador se inicializa en 1; cada vez que se le asocia una nueva variable, el contador se incrementa en 1; en cambio, cada vez que una variable se desliga de ese espacio, el contador se decrementa en 1. Si el contador toma el valor 0, el espacio en cuestin se devuelve a la lista de espacio disponible. Garbage Collection

43

Lenguajes de Programacin I

44

Esta tcnica consiste en que, cuando la lista del espacio disponible se agota y se requiere ms memoria, se suspende temporalmente la ejecucin del proceso solicitante precedindose a marcar los elementos en uso y recolectar los elementos en desuso (devolverlos a la lista de espacio disponible). Heap de elementos de tamao variable En este caso, se desea organizar el espacio disponible en bloques del mximo tamao posible. Luego, inicialmente, el heap tiene el carcter de bloque disponible nico y, solicitar un bloque de m bytes implica: Avanzar m posiciones al puntero de acceso. Retornar la direccin a la cual apuntaba el puntero de acceso. A causa de la variabilidad en el tamao de los bloques, el problema de reutilizacin de espacio se puede resolver de dos formas: Buscar en la lista el espacio disponible y reservar un bloque del tamao adecuado devolviendo, si existe, el espacio sobrante de la lista. Generar un nico bloque de espacio disponible mediante el desplazamiento de todos los elementos en uso hacia un extremo del heap (compactacin).

44

Lenguajes de Programacin I

45

8.

INTRODUCCIN A LENGUAJE C
8.1. TIPOS ELEMENTALES DE DATOS
int k; short s; /* Calificador o subtipo */ short int j; /* Equivalente a short j */ float x; char c; int *p;

8.2. ESTRUCTURA DE UN PROGRAMA


Directivas del preprocesador (comienzan con #) [Declaracin de tipos globales] [Declaracin de variables globales] [Definicin de funciones] Definicin de funcin main() #include <stdio.h> #define LARGO 100 int n; main() { int k = 10; n = k*LARGO; }

8.3. OPERADORES
Lgicos Relacionales Aritmticos Asignacin || && == != < > + * / = += = *= c += 7 c = c + 7 c 7 c = c 7 = c *= 7 c = c * 7 c /= 7 c = c / 7 c %= 7 c = c % 7 Incremento en 1 : ++ a++ a = a + 1 ++a a = a + 1 Decremento en 1 : a a = a 1 a = a 1 a if : : : : <= >= % %=

8.4. ESTRUCTURAS DE CONTROL DE FLUJO

45

Lenguajes de Programacin I

46

if (a > b) a = a + 1; if-else if (m < 10 || p != 0) p = 10 + p; else if (m >= 10 && m < 20) p = 20 + p; else if (m >= 20 && m < 30) p = 30 + p; else p = 40 + p; while s = 0; i = 1; while (i < 10) { s = s + i; i++; } do while s = 0; i = 1; do { s = s + i; i++; } while (i < 10) for s = 0; for(i = 1; i < 10; i++) s = s + i; switch a = 1; switch (n) { case 1 : a = a + n; break; case 2 : a = a n; break; case 3 : a = a * n; break; default : a = a / n; }

8.5. ENTRADA Y SALIDA


Salida Entrada : printf printf("%d %f %c",k,x,c); : scanf

46

Lenguajes de Programacin I

47

printf("Ingrese un entero y un real"); scanf("%d %f",&k,&x);

8.6. TIPOS ESTRUCTURADOS DE DATOS


int v[10]; char s[] = "datos"; struct term { float coef; int expo; } t1, t2; struct term poli[LARGO];

8.7. DECLARACIN DE TIPOS Y VARIABLES


typedef int arreglo[10]; typedef char string[]; typedef struct { float coef; int expo; } registro; typedef registro polinomio[LARGO]; registro t1, t2; arreglo v; string s = "datos"; polinomio poli;

8.8. PARMETROS
En lenguaje C, todos los parmetros se pasan "por valor", excepto cuando se trata de arreglos en cuyo caso se pasan "por referencia".

8.9. MACROS
Una macro es una funcin definida en la zona de directivas del preprocesador. #define CUADRADO(X) ((X)*(X)) #define MAX(A, B) ((A) > (B) ? (A) : (B))

47

Lenguajes de Programacin I

48

8.10. VARIABLES GLOBALES Y LOCALES


En lenguaje C, una variable global con respecto a todas las funciones se declara fuera de cualquier bloque (grupo de sentencias delimitado por {}). Una variable local es aquella declarada al interior de un bloque, inmediatamente despus de { y antes de la primera sentencia. Los bloques pueden estructurarse en forma anidada de manera tal que las variables locales a un bloque tienen el carcter de globales para todos los bloques al interior de aquel.

8.11. STRINGS
En lenguaje C un string es un arreglo de caracteres que termina con el carcter \0. Se accede a una variable string mediante un puntero a su primer elemento; esto es posible porque un string es un arreglo y un arreglo tambin es un puntero a su primer elemento. El valor de un string es el valor de su primer elemento. Funciones de conversin de strings double atof(const char *s) int atoi(const char *s) long atol(const char *s) double strtod(const char *s, char **fs) string long strtol(const char *s, char **fs, int base) string convierte el string s en double convierte el string s en int convierte el string s en long convierte la parte numrica del s en double; en *fs retorna resto convierte la parte numrica del

s en long; en *fs retorna resto unsigned long strtoul(const char *s, char **fs, int base) convierte la parte numrica del string s en entero sin signo; en *fs retorna resto Ejemplo #include <stdio.h> #include <stdlib.h> main() { int i; double d, e; long l, m; unsigned long n; char *c1, *c2, *c3, *c4, *c5, *c6; i = atoi("2593");

48

Lenguajes de Programacin I

49

printf("%s %d \n %s %d \n", "El string \" 2593 \" convertido en int es", i, "El valor convertido menos 593 es ", i-593); d = atof("99.0"); printf("%s %.3f \n %s %.3f \n", "El string \" 99.0 \" convertido en double es", d, "El valor convertido dividido por 2 es ", d/2.0); l = atol("1000000"); printf("%s %ld \n %s %ld \n", "El string \" 1000000 \" convertido en long es", l, "El valor convertido dividido por 2 es ", l/2); c1 = "51.2% es aceptado"; e = strtod(c1, &c2); printf("El string \" %s \" es convertido en el valor double %.2f y el string \" %s \" \n", c1, e, c2); c3 = "-1234567abc"; m = strtol(c3, &c4, 0); printf("%s \" %s \" \n %s %ld \n %s \" %s \" \n %s %ld \n", "El string original es ", c3, "El valor convertido es ", m, "El resto del string original es ", c4, "El valor convertido mas 567 es ", m+567); c5 = "1234567abc"; n = strtoul(c5, &c6, 0), printf("%s \" %s \" \n %s %lu \n %s \" %s \" \n %s %lu \n", "El string original es ", c5, "El valor convertido es ", n, "El resto del string original es ", c6, "El valor convertido menos 567 es ", n-567); } Salida: El string " 2593 " convertido en int es 2593 El valor convertido menos 593 es 2000 El string " 99.0 " convertido en double es 99.0000 El valor convertido dividido por 2 es 49.500 El string " 1000000 " convertido en long es 1000000 El valor convertido dividido por 2 es 500000 El string "51.2% es aceptado " es convertido en el valor double 51.20 y el string "% es aceptado" El string original es "-1234567abc" El valor convertido es 1234567 El resto del string original es "abc" El valor convertido mas 567 es 1234000 El string original es "1234567abc" El valor convertido es 1234567 El resto del string original es "abc" El valor convertido mas 567 es 1234000 Funciones de entrada/salida int getchar(void) char *gets(char *s) int putchar(int n) acepta el siguiente carcter y lo retorna como un entero acepta caracteres en el arreglo s hasta eoln o eof; se agrega el carcter de terminacin NULL imprime el carcter n

49

Lenguajes de Programacin I

50

int puts(const char *s) int sprintf(char *s, const char *f, ) int sscanf(char *s, const char *f, )

imprime el string s seguido por un carcter de nueva lnea equivalente a printf, salvo en que la salida se almacena en el arreglo s en vez de desplegarla en pantalla equivalente a scanf, salvo en que la entrada es el contenido del arreglo s en vez de capturarla por teclado

Funciones para operar con strings char *strcpy(char *s1, const char *s2) retorna en el string s1 una copia del string s2 char *strncpy(char *s1, const char *s2, int n) retorna en el string s1 una copia de los primeros n caracteres de s2 char *strcat(char *s1, const char *s2) retorna en el string s1 el string s1 concatenado con el string s2, copiando este ltimo a partir del carcter NULL de s1 original char *strncat(char *s1, const char *s2, int n) retorna en el string s1 el string s1 concatenado con los primeros n caracteres del string s2 int *strcmp(const char *s1, const char *s2) compara los strings s1 y s2; retorna 0, menor que 0 o mayor que 0, si s1 es igual a s2, menor que s2 o mayor que s2 int *strncmp(const char *s1, const char *s2, int n) compara el substring de largo n del string s1 con s2; retorna 0, menor que 0 o mayor que 0, si el substring de s1 es igual a s2, menor que s2 o mayor que s2

8.12. LISTAS ENLAZADAS


Una lista enlazada es una estructura de datos la cual puede estar vaca o bien constar de un nodo ligado a una lista enlazada. Un nodo es una estructura compuesta de varios campos entre los cuales existe uno que es un puntero a un objeto del mismo tipo del nodo. Se puede definir un tipo nodo de la siguiente forma: typedef struct node { int info; struct node *link; } nodo; Y, a continuacin, se puede definir el tipo lista como sigue: typedef nodo *lista;

50

Lenguajes de Programacin I

51

8.13. ARCHIVOS
En lenguaje C un archivo es una secuencia de bytes. Un archivo puede tener una longitud desconocida, en cuyo caso debe advertirse una marca de fin de archivo, o bien tener una longitud conocida en cuanto a su nmero de bytes. En C no existen estructuras predefinidas de archivo. Es el programador el que proporciona la estructura del archivo. Ejemplo Creacin de un archivo secuencial #include <stdio.h> main() { int c; char nombre[15]; float grados; FILE *f; if ((f = fopen(" arch.dat","w")) == NULL) printf("Archivo no puede ser abierto\n"); else { printf("Ingrese un entero, un string y un real, \n"); printf("Ingrese EOF (<ctrl> z) para terminar la creacin del archivo\n"); printf("?"); scanf("%d %s %f ", &c, nombre, &grados); while (!feof(stdin)) { fprintf(f,"%d %s %.2f \n", c, nombre, grados); printf("?"); scanf("%d %s %f ", &c, nombre, &grados); } fclose(f); } return0; } Lectura e impresin de un archivo secuencial #include <stdio.h> main() { int c; char nombre[15]; float grados; FILE *f; if ((f = fopen(" arch.dat","r")) == NULL) printf("Archivo no puede ser abierto\n"); else { printf("%-10s %-13s %s \n", "c", "nombre", "grados"); fscanf(f, "%d %s %f ", &c, nombre, &grados); while (!feof(f))

51

Lenguajes de Programacin I

52

{ printf("%-10d %-13s %7.2f \n", c, nombre, grados); fscanf(f, "%d %s %f ", &c, nombre, &grados); } fclose(f); } return 0; }

8.14. PUNTEROS Y ARREGLOS


En lenguaje C, una nombre de arreglo puede ser considerado un puntero constante. int k, b[] = {5, 6, 7, 8}; int *p, *q; p = b; p = &b[0]; k = b[3]; k = *(p + 3); k = *(b + 3); k = p[3]; b[0] = b[0] + 3; *p = *p + 3; q = &b[3]; q = p + 3; Ejemplo main() { int i, k, b[] = {10, 20, 30, 40}; int *p = b; printf("El arreglo b se imprime con notacin subindicada \n"); for (i = 0; i <= 3; i++) printf("b[%d] = %d \n", i, b[i]); printf("Notacin puntero-desplazamiento donde el puntero es el nombre del arreglo \n"); for (k = 0; k <= 3; k++) printf("*(b + %d) = %d \n", k, *(b + k)); printf("Notacin puntero-subndice \n"); for (i = 0; i <= 3; i++) printf("p[%d] = %d \n", i, p[i]); printf("Notacin puntero-desplazamiento \n"); for (k = 0; k <= 3; k++) printf("*(p + %d) = %d \n", k, *(p + k)); return 0; } }

52

Lenguajes de Programacin I

53

8.15. PUNTEROS A FUNCIONES


En lenguaje C, un puntero a una funcin contiene la direccin de la funcin en memoria. El nombre de una funcin es realmente la direccin inicial en memoria del cdigo de dicha funcin. Ejemplo #include <stdio.h> #define LARGO 10 int asc(const int a, const int b) { return b < a; } int des(const int a, const int b) { return b > a; } void swap(int *p, int *q) { int x; x = *p; *p = *q; *q = x; } void ordenar(int w, const int t, int (*comparar)(int, int)) { int c, k; for (k = 1; k <= t-1; k++) for (c = 0; c <= t-2; c++) if ((*comparar)(w[c], w[c+1])) swap(&w[c], &w[c+1]); } main() { int c, k, int a[LARGO] = {45, 23, 78, 56, 12, 34, 98, 89, 65, 10}; printf("Ingrese 1 para orden ascendente o 2 para orden descendente \n"); scanf("%d", &k); printf("Contenido original del arreglo \n"); for (c = 0; c <= LARGO; c++) printf("%4d", a[c]); scanf("%d",&a[i]); if (k == 1) { ordenar(a, LARGO,asc); printf("\n Datos en orden ascendente \n"); } else { ordenar(a, LARGO,des); printf("\n Datos en orden descendente \n"); } for (c = 0; c <= LARGO; c++) printf("%4d", a[c]); return 0; }

53

Lenguajes de Programacin I

54

#include <stdio.h> void swap(int *p, int *q) { int x; x = *p; *p = *q; *q = x; } int suma(int w, int t) { int k; scanf("%d",&k); return w + t + k; } main() { int m, n, s; scanf("%d %d", &m, &n); s = n m; swap(&m,&n) printf(" %d %d %d \n", m, n, suma(m, n)); }

54

Lenguajes de Programacin I

55

GUA DE EJERCICIOS Error! Marcador no definido.

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

Explicar la diferencia entre Lenguaje de Mquina y Lenguaje Simblico. Describir el criterio de "ortogonalidad" en la definicin de un lenguaje. Citar un ejemplo. Explicar el criterio sintctico conocido como "ausencia de ambigedad". Citar un ejemplo. Comentar, desde el punto de vista sintctico, el cdigo IF IF THEN ELSE = THEN ELSE THEN = ELSE; Describir, brevemente, las alternativas de estructura de definicin sintctica para programas y subprogramas. Citar un caso en el cual un lenguaje de alto nivel constituye lenguaje objeto. Describir el proceso de traduccin conocido como "carga". Comente las siguientes afirmaciones: a) "Un compilador procesa varias veces una sentencia de repeticin". b) "Un intrprete puede no procesar alguna sentencia en un cdigo". Comente las siguientes afirmaciones: a) "Con respecto al elemento sintctico 'estructura de programas y subprogramas', la alternativa de definicin anidada, concebida por ciertos lenguajes, no involucra un aspecto semntico". b) "Un metalenguaje constituye la definicin formal de los datos que procesa un traductor". Una multilista es una estructura compuesta de tomos y multilistas. Por ejemplo, la multilista (1 2(3 4(5)6)7 8) consta de cinco elementos: cuatro tomos y una multilista. Describir, mediante BNF, la representacin sintctica de multilistas de nmeros enteros. Un rbol general G se define como un objeto vaco un nodo con un conjunto de rboles G. Describir, mediante BNF, la sintaxis de la representacin lineal de rboles generales como, por ejemplo: 25 ( -43 ( 36 , -59 , 94 ) , 71 ( 87 ) ) Representar mediante BNF y diagramas sintcticos la declaracin de: Registros en lenguaje Pascal. Arreglos en lenguaje C. Describir, mediante BNF, la representacin sintctica del anverso de la cdula nacional de identidad. La foto y la firma constituyen meta-variables que no deben definirse.

9.

10.

11.

12. a) b) 13.

55

Lenguajes de Programacin I

56

14.

Dada la expresin en notacin convencional a-b+c-(d+e-f) y considerando las dos posibles opciones de asociatividad: a) Evaluarla sabiendo que a,b,c,d,e,f = 9,7,5,4,6,8. b) Expresar su equivalente en notaciones pre y postfija. Con respecto al programa Program Asocia(Input,Output); Var x, y, z : Integer; Function F(Var p, q : Integer) : Integer; Begin p := p + 2; q := q + 2; F := p - q + 1; End; Begin x := 6; y := 3; z := x - y + F(x,y) - (x - y + 1); Write(x,y,z); End. indicar los valores que se imprimen y explicar porqu: a) Sabiendo que Pascal asocia por la izquierda. b) Basndose en la parte anterior, si se aplica asociatividad por la derecha. Las expresiones x a b + c d e / y + a b c / d e tienen exactamente la misma estructura sintctica en notacin infija. a) Identificar la notacin en que est escrita cada una de ellas. b) Escribir las respectivas expresiones en notacin infija, con todos los parntesis necesarios para incorporar ambas opciones de asociatividad. Con respecto a la expresin a b * c d * e f, con a, b, c, d, e, f 6, 1, 4, 3, 2, 5, escribir todas las expresiones alternativas que se generan al incorporar los parntesis necesarios para que cada operacin evidencie su carcter binario, considerando todas las opciones posibles de prioridad y asociatividad. Posteriormente, indicar el valor que se obtiene al evaluar cada una de las expresiones obtenidas. Escribir, en lenguaje Pascal, un cdigo en el cual se manifieste el concepto de alias, utilizando exclusivamente dos variables. Justificar. Si, en lenguaje C, se declara int *p, n, representar grficamente esas variables e indicar el efecto que consigue el par de asignaciones { p = &n; n = *p; }. Con respecto al cdigo i = 5; p = &i; q = &p; i = **q + 2;

15.

16.

17.

18. 19. 20.

56

Lenguajes de Programacin I

57

a) Declarar los tipos de datos adecuados. b) Identificar los conceptos l-valor y r-valor en cada una de las instrucciones. 21. ++C define la sentencia "equivalence", modalidad Fortran. Con respecto al cdigo en ++C: void enigma() { float x = 3.3, y = 4.4, z = 5.5; equivalence int i, j, k; i = x; printf("i = %d\n",i); j = y; printf("i = %d j = %d\n",i,j); k = z; printf("i = %d j = %d k = %d\n",i,j,k); } a) Indicar los valores que se imprimen y explicar porqu. b) Escribir un cdigo en Pascal que consiga el mismo efecto. Dado el siguiente cdigo en lenguaje Ada: k := 1; while k <= 100 loop j := j + k; k := k + 1; end loop; a) Describir mediante BNF y diagramas la sintaxis de la sentencia while. b) Escribir cdigos equivalentes en Pascal y C, utilizando todas las opciones de repeticin provistas por ambos lenguajes. Se sabe que Pascal-- es una versin de Pascal que no dispone de sentencias de repeticin. Implementar, de manera no recursiva en Pascal--, la funcin Suma con el propsito de calcular el valor de la suma de n nmeros enteros ingresados por teclado.

22.

23.

24. Indicar los efectos que se logran con las siguientes sentencias en lenguaje C: a) m = (j > k) ? j : k; b) printf("%d + %d = %d\n",x,y,z); c) p = n << 2; si el valor de n es 15 d) i = j = k = 7; e) s = f + ++g + --h; si f, g y h tienen el mismo valor f) v %= w; si el valor de v es 11 y el valor de w es 3 g) p = *q * *r * *s; h) q = &a[3][2]; 25. Con respecto al siguiente cdigo en C: c = getchar(); switch (c) { case 'A' : b = b + 1; case 'B' : if (j = x) z = 4; break; case 'C' :

57

Lenguajes de Programacin I

58

case 'D' : a = b + z; case 'E' : printf("ANSI"\n); break; default : m[i++] = 3; } a) Destacar tres elementos relevantes involucrados en la sentencia switch para su implementacin en otro lenguaje. b) Implementar el cdigo anterior en lenguaje Pascal. 26. 27. Explicar el efecto de la asignacin i,a[i] := a[i],i. Con respecto al siguiente programa en Fortran program constante real i, x, res x = 3.0 res = potencia(x,4.0) print 7, res do 6 i = 1.0, 4.0, 1.0 res = res - 1.0 6 continue print 7, res stop 7 format(F10.2) end function potencia(x,n) real n, p, x p = 1.0 8 if(n.EQ.0.0) goto 9 p = p*x n = n - 1.0 goto 8 9 continue potencia = p return end indicar los valores que se imprimen y explicar porqu, teniendo en consideracin que, para asociar parmetros actuales con formales, este lenguaje slo provee llamada por referencia.. Muchas operaciones sobre matrices incluyen un proceso secuencial para todos los elementos de una fila o columna. El ciclo en el cual se efecta este proceso involucra una referencia al elemento [i,j] con uno de los ndices incrementado en 1 en cada pasada. En este caso, no es eficiente calcular la direccin del elemento [i,j] independientemente en cada iteracin. Con respecto a una matriz B y asumiendo que es el ndice de fila el que vara, desarrollar analticamente una frmula para calcular Dir(B[i,j]) en funcin de Dir(B[i-1,j]).

28.

29.

Una matriz marco se define como aquella en la cual slo las filas primera y ltima y las columnas primera y ltima tienen elementos no nulos. Con respecto a una matriz marco M: a) Desarrollar una frmula para acceder a cualquier elemento de su ltima fila, de decir, Dir(M[sf,j]).

58

Lenguajes de Programacin I

59

b) Utilizar la declaracin Var M : Array[4..8,-3..2] Of Integer; y la frmula desarrollada para determinar la direccin del elemento M[8,1] si, durante ejecucin, M se encuentra almacenada a partir de la direccin 3178. 30. Con el propsito de ahorrar espacio, cierto lenguaje permite representar en memoria slo los valores efectivos de una matriz tridiagonal principal S, linealizada por filas. a) Desarrollar una frmula para acceder a un elemento S[i,j]. b) Utilizar la declaracin Var S : Array[0..4,0..4] Of Integer; y la frmula desarrollada para determinar la direccin del elemento S[3,3] si, durante ejecucin, S se encuentra almacenada a partir de la direccin 1000. Con el propsito de ahorrar espacio, cierto lenguaje permite representar en memoria slo los valores efectivos de una matriz triangular inferior T, linealizada por filas. a) Desarrollar una frmula para acceder a un elemento T[i,j]. b) Utilizar la declaracin Var T : Array[-3..1,-1..3] Of Integer; y la frmula desarrollada para determinar la direccin del elemento T[0,2] si, durante ejecucin, T se encuentra almacenada a partir de la direccin 98755. Considerar la declaracin Type Cubo = Array[-1..1,-1..1,-1..1] Of Registro; Var C : Cubo; donde Registro ocupa n unidades direccionables. a) Desarrollar una frmula para acceder al p-simo campo del elemento C[i,j,k]. b) Utilizar la frmula desarrollada para determinar la direccin de comienzo del registro C[0,0,0] si n=64 y, durante ejecucin, C se encuentra almacenada a partir de la direccin 9744.

31.

32.

Sea U = {x / 0 x 9} y A, B, C subconjuntos propios de U. Utilizando la representacin de string de bits para conjuntos, implementar (en lenguajes Pascal y C) las operaciones eB, C = AB, C = AB y C = A B. 34. Con respecto a la expresin recurrente del factorial de un entero no negativo n: a) Escribir, en C, la funcin recursiva "fact". b) Identificar los elementos que conforman el registro de activacin para "fact". c) Si cada elemento del registro de activacin para "fact" ocupa k bytes y la memoria disponible al momento de producirse el llamado es de m bytes, determinar el menor valor de n para el cual se debe producir una interrupcin por overflow. 33. 35. Con respecto al cdigo: Function X(m, n: Integer) : Integer; Begin If n = 0 Then X := m Else X := X(n, m mod n); End;

59

Lenguajes de Programacin I

60

a) Identificar los elementos que conforman el registro de activacin para X. b) Determinar la mxima cantidad de registros de activacin existentes en el stack, en un momento dado, con la llamada X(6,4). c) Determinar la mxima cantidad (en bytes) de memoria requerida con la invocacin X(12,8), si cada elemento del registro de activacin ocupa 4 bytes. d) Indicar el objetivo de la funcin X. 36. Con respecto al siguiente cdigo: type indice = 1..1000; arreglo = array[indice] of real; var v : arreglo; procedure Colgado(a : ref arreglo; i, n : in integer); var x, y : real; begin if i < n then begin x := a[i]; y := a[n]; Colgado(a,i+1,n-1); a[n] := x; a[i] := y; end; end; b) Indicar el objetivo del procedimiento Colgado si, siempre, el 2do parmetro actual tiene el valor 1 y el 3er parmetro actual representa el nmero de elementos que contiene el 1er parmetro actual. Usar como ejemplo v := (6,8,9,7) y la invocacin Colgado(v,1,4). c) Si, el cdigo ejecutable de Colgado ocupa 200 bytes y al invocar Colgado(v,1,199) existen 3256 bytes de memoria disponible, determinar la cantidad (en bytes) de memoria disponible al ejecutarse Colgado por ltima vez. El nmero de Stirling de primera clase se define como 0 si k=0 S(n,k) = 1 si k=n S(n-1,k-1) - (n-1)*S(n-1,k) si 0<k<n donde n es un nmero natural. a) Identificar los elementos que conforman el registro de activacin para "stirling". b) Si, el cdigo ejecutable de "stirling" ocupa 100 bytes, todos los elementos del registro de activacin son del mismo tamao y, el espacio de memoria requerido para la ejecucin normal de la funcin invocada con n=5 y k=2 es de 200 bytes, determinar el tamao (en bytes) de cada elemento del registro de activacin. En cada uno de los casos, construir una tabla con todas las variables que tengan direcciones de memoria distintas, mostrar los valores que toma cada una de ellas, indicar los valores que se imprimen y citar el efecto logrado, al ejecutarse el cdigo: procedure Zero; var p, q : integer; procedure One<parmetros>; begin {One}

37.

38.

60

Lenguajes de Programacin I

61

p := p + q; q := p - q; p := p -q; end {One}; begin {Zero} p := 4; q := 7; One(q,p); write(p,q); end {Zero}; Si, <parmetros> tiene la forma a) (p, q : in out integer) b) (p, q : ref integer) c) (p, q : name integer) 39. Con respecto a la ejecucin del siguiente cdigo: int Tres(int k) { return(k); } int Dos(int Y, int j) { return(j + Y); } int Uno(int X, int i) { return(i + X); } void Main() { display(Uno(Dos(Tres(3),2),1)); } a) Mostrar claramente la secuencia de invocaciones mediante el stack del registros de activacin e indicar el valor desplegado en Main. b) Citar y explicar claramente el concepto que ms se destaca en este cdigo. 40. Mostrar los cambios ocurridos a cada una de las variables declaradas, al ejecutarse el cdigo. Program Exito(Input,Output); Type Tabla = Array[1..10] Of Integer; Var a : Tabla; i : Integer; Procedure Fracaso<lista de parmetros>; Var i : Integer; Begin For i := 1 To 10 Do a[i] := i; For i := 1 To 9 Do q[i+1] := p[a[i]] + 1; End; Begin For i := 1 To 10 Do a[i] := 11 - i; Fracaso(a,a,a); End. si, <lista de parmetros> tiene la forma: a) (p,q,a:Tabla) b) (Var p,q:Tabla; a:Tabla) c) (Name p,q:Tabla; a:Tabla)

61

Lenguajes de Programacin I

62

41.

Con respecto a la ejecucin del cdigo Program Pormas(Output); Var s, t : Integer; Procedure Por(x, y : Name Integer); Begin x := x*y; y := x*y; end; Procedure Mas(s, t : Ref Integer); Begin s := s + t; t := s + t; Por(s,t); end; Begin s := 1; t := 2; Mas(s,t); Print(s,t); end. escrito en un lenguaje con reglas de alcance estticas: a) Indicar la cantidad de direcciones distintas existentes para todas las variables utilizadas. b) Mostrar los valores que toma cada variable e indicar los valores que se imprimen. c) Explicar las modalidades de paso de parmetros utilizadas. 42. El cdigo logical mas(logical in a, logical in b) { mas := a + b; } permite obtener el resultado de la suma (or) de dos valores de tipo logical. a) Agregar y/o modificar el cdigo necesario para que la unidad "mas" permita, adems, sumar valores de tipos integer, rational y real. b) Citar el concepto utilizado en la parte anterior y, adems, las formalidades de definicin e implementacin en modalidad Ada. 43. Dado el cdigo Program Cero(I,O); Var j, k, x, z : Integer; Procedure Uno(y : In Integer; z : Ref Integer); Begin z := j + k; Writeln(k,y,z); j := j + y; k := k + y; End; Procedure Dos(x : Ref Integer); Var k : Integer; Begin x := x + j; k := 1;

62

Lenguajes de Programacin I

63

Uno(x,k); Writeln(j,k,x); End; Function Tres(w : In Integer) : Integer; Var j : Integer; Begin j := 5; Dos(j); Tres := w*j; End; Begin j := 2; k := 3; x := Tres(3*j); z := k + j; Writeln(j,k,x,z); End. definir el entorno de referencia para cada unidad de programa e indicar los valores que se imprimen, si se utilizan reglas de alcance: a) Estticas. b) Dinmicas. 44. Explicar el concepto de "registros de activacin lxicamente anidados". 45. Con respecto al cdigo void main(); int a, b, c; int efe(int c); begin /* efe */ efe := a + b + c; end /* efe */; void equis(int g, int h); int b; begin /* equis */ b := h - 2; if g > 0 then zeta(g-1,h+1) else begin b := efe(h-g); a := a + b; display(b,g+h); end; end /* equis */; void zeta(int d, int e); int a; begin /* zeta */ if d > 0 then begin

63

Lenguajes de Programacin I

64

a := b + d; equis(d-1,e+1); c := efe(e-d); display(a,c,d+e); end; end /* zeta */; begin /* main */ a := 3; b := 4; c := 8; zeta(a,b); display(a,c); end /* main */. representar grficamente el entorno de referencia de cada unidad de programa, mostrar las variaciones que presenta cada una de las variables declaradas e indicar los valores desplegados, al utilizar reglas de alcance: a) Estticas. b) Dinmicas. 46. La extensin de los datos puede ser de carcter esttico y/o automtico. Explicar como se manifiesta este concepto en los lenguajes C, Fortran y Pascal. 47. Considrese Type Nombre = 'a'..'z'; Puntero = -1..255; Direc = Array[Nombre] Of Puntero; Heap = Array[0..255] Of Byte; donde Nombre representa posibles nombres de variables y Puntero las direcciones asignadas a un rea de memoria heap de elementos de tamao fijo. Si D es de tipo Direc, H de tipo Heap, v de tipo Nombre y p de tipo Puntero entonces D[v] = p est asociada a H[p] = k, lo cual significa que la variable v ocupa k posiciones de memoria a partir de la direccin p+1. Si D[v] = -1, entonces la variable v est en desuso. Implementar, en Pascal, el operador Disponible(D,H) que determina la cantidad de memoria desocupada en el rea heap. La tabla de variables de un cdigo en ejecucin se ha definido de la siguiente forma: Type Variable = Record nombre : String[8]; largo : Natural; referencia : Direccion; End; Tabla = Array[1..100] Of Variable; Adems, se dispone de la funcin Libre(H), que retorna la cantidad de bytes que el administrador del heap registra como disponible en todo momento, y de la variable global Size (exclusiva del administrador) que indica el tamao del rea heap en bytes. Conforme a esta especificacin, implementar el operador Garbage(T,n) que determina el porcentaje de memoria en calidad de garbage al interior del heap, para un programa en ejecucin cuya tabla T contiene n variables.

48.

64

Lenguajes de Programacin I

65

65