Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf ·...

21
1 Capítulo II Conceptos Fundamentales de Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica, análisis sintáctico y semántico Definición: Sintaxis y Semántica l SINTAXIS: forma de expresiones, sentencias y unidades de programa l SEMÁNTICA: significado de estas expresiones, sentencias y unidades de programa l Ejemplo: while (<expr>) do <sentencia> Elementos Sintácticos l Conjunto de carácteres l Identificadores l Símbolos de operadores l Palabras claves y reservadas l Comentarios l Blancos, delimitadores y paréntesis l Expresiones l Sentencias Descripción de Sintaxis l Definición de Lenguajes l Reconocimiento (reconoce si string de entrada pertenece al lenguaje) l Generación (genera strings que pertenecen al lenguaje) l Métodos formales de descripción l Backus Naur Form (BNF) l Extended BNF (EBNF) Elementos de BNF l Símbolos no terminales l Abstracción que representa una regla l Símbolos terminales l Tokens de las reglas l Símbolo de partida l Símbolo no terminal que permite generar un programa

Transcript of Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf ·...

Page 1: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

1

Capítulo II

Conceptos Fundamentales de

Lenguajes de Programación

2.1 Sintaxis y Semántica

Descripción de sintaxis y semántica, análisis sintáctico y

semántico

Definición: Sintaxis y Semántica

l SINTAXIS: forma de expresiones, sentencias y unidades de programa

l SEMÁNTICA: significado de estas expresiones, sentencias y unidades de programa

l Ejemplo:while (<expr>) do <sentencia>

Elementos Sintácticos

l Conjunto de carácteresl Identificadoresl Símbolos de operadoresl Palabras claves y reservadasl Comentariosl Blancos, delimitadores y paréntesisl Expresionesl Sentencias

Descripción de Sintaxis

l Definición de Lenguajesl Reconocimiento (reconoce si string de entrada

pertenece al lenguaje)l Generación (genera strings que pertenecen al

lenguaje)

l Métodos formales de descripciónl Backus Naur Form (BNF)l Extended BNF (EBNF)

Elementos de BNF

l Símbolos no terminalesl Abstracción que representa una regla

l Símbolos terminalesl Tokens de las reglas

l Símbolo de partidal Símbolo no terminal que permite generar un

programa

Page 2: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

2

Ejemplo de Gramática

<program> ::= begin <stmt_list> end <stmt_list> ::= begin <stmt> ; <stmt_list> end | NULL <stmt> ::= <id> := <exp> <id> ::= A | B | C <exp> ::= <id> | <exp> + <exp> | <id> * <exp> | (<exp>)

Parse Tree

l Expresión A := A*B + C

A

id

A B

C

*

id id

exp +

id

exp:=

stmt

exp

exp exp

Ambigüedad

l Para la expresión A := A*B + C existen dos parsetree:

A

id

A B

C

*

id id

exp +

id

exp:=

stmt

exp

exp exp

A

id

A

*

id

exp

B C

+

id id

exp

:=

stmt

exp

exp

exp

Otro ejemplo de ambigüedad:

if condition

if_stmt

stmtthen

if_stmt

if condition stmtthen else stmt

if_stmt

if condition stmtthen else stmt

if condition

if_stmt

stmtthen

Dada la siguiente gramática:

<if_stmt> ::= if <condition> then <stmt>| if <condition> then <stmt> else <stmt>

<stmt> ::= <if_stmt> | …

Reconocer: if (C1) then if (C2) then S1 else S2

Resolución de Ambigüedad

l Caso de operadores:l Definir precedencial A igual precedencia, definir asociatividad por

izquierda o derecha

l Caso del if:l Asociar el else con el último if

Extended BNF (EBNF)

l Elemento opcional se indica con [ …]l Alternativa puede usar | en una regla

l Repetición de elementos se indican con { … }

Page 3: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

3

Ejemplos de EBNF

<if_stmt> ::= if <condition> then <stmts> [ else <stmts>]

<identifier> ::= <letter> {<letter> | < digit> }

Grafos Sintácticos

<if_stmt> ::= if <condition> then <stmts> {<else_if> }[ else <stmts> ] end if

<else_if> ::= elseif <condition> then <stmts>

conditionelseif then stmtselse_if

conditionif then stmtselse_stmt

else

end if

stmtselse_if

Proceso de Compilación

Análisis LéxicoAnálisis Léxico

Análisis SintácticoAnálisis Sintáctico

Análisis SemánticoAnálisis Semántico

Generación de CódigoGeneración de Código

Programa Fuente

Programa Objeto

Tokens léxicos

Parse tree

Código intermedio

Reconocimientodel programafuente

Tabla de símbolos

Ejemplo: C

l Archivos de cabecerasl Implementación de cabecerasl Makefile para facilitar la compilación

Ejemplo: C

l Interfaz paralelal Requiere de cabeceras para interfazl Requiere de dos ejecutables

Cliente.c

Cparallel.c

Servidor.c

Cliente.o

Cparallel.o

Servidor.o

servidor

cliente

Cparallel.h

Código fuente Programa objeto Programa ejecutable

Ejemplo: C

#ifndef _CPARALLEL_H_#define _CPARALLEL_H_

#define BASE_ADDRESS 0x378

int rxParallel(void);int txParallel(int);

#endif

Cparallel.h#include "cparallel.h"

#include <unistd.h>#include <asm /io.h>

int rxParallel() {...

}

int txParallel(int Data_Byte) {...}

Cparallel.c

Page 4: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

4

Ejemplo: C

#include "cparallel.h"

int main(){printf("Sending data....\n");int i, x;x=0;while(1){int i=1;for(i=1;i<17;i=2*i){

txParallel(i);sleep(1);

}printf("\ n");

}return 1;

}

Servidor.c#include "cparallel.h"

int main(){printf("Receiving...\n");int y=0;while(1){int n y,d0,d1,j=0;n y=rxParallel ();printf("\ nRecieved: %d",n y);sleep(1);

}return 1;

}

Cliente.c

Ejemplo: C

all: cliente servidor

clean:rm -f *.orm -f *~rm -f cliente servidor

servidor: cparallel.o servidor.ogcc -O2 -lm $^ -o $@

cliente: cparallel.o cliente.ogcc -O2 -lm $^ -o $@

%.o: %.cgcc -c -O2 $< -o $@

Makefile

Ejemplo: Java

l No permite la definición de cabecerasl Archivos de clasesl Archivo “Ant” para facilitar compilación y

ejecución

JVM

Ejemplo: Java

l Agenda de contactosl Objetos con datos y funcionalidadl Objeto para ejecución

Agenda.java

Persona.java

AdmAgenda.java

Agenda.class

Persona.class

AdmAgenda.class

Código fuente Código bytecode Ejecución en JVM

Ejemplo: Java

public class Persona {private String nombre;private String telefono;public Persona(String n, String t){

nombre=n;telefono=t;

}public void mostrarDatos(){

System.out.println("Nombre:"+nombre+", telefono: "+telefono);

}}

public class Agenda {

private Vector personas=new Vector();

public void agregarPersona(Persona p){personas.add(p);

}public void mostrarPersonas(){

for(int i=0;i<personas.size();i++)((Persona)personas.get(i)).mostrarDatos();

}}

Persona.java Agenda.java

Ejemplo: Java

public class AdmAgenda {

public static void main(String args[]){Agenda a = new Agenda();a.agregarPersona(new Persona("NN", "112233"));a.agregarPersona(new Persona("MM", "445566"));a.mostrarPersonas();

}}

AdmAgenda.java

Page 5: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

5

Ejemplo: Java

<project basedir="." default="run">

<description></description>

<target name="compile" description="Compiles java files."><echo message="Compiling the java files."/><javac srcdir="." destdir="." debug="yes"/>

</target>

<target name="run" depends="compile"><java classname="usm.lp.AdmAgenda" fork="true"

classpath="."></java>

</target></project>

Build.xml2.2 Nombres, Ligado y

Ámbito

Ligado estático y dinámico, reglas de ámbito y prueba de

tipos.

Conceptos

l Nombres e Identificadoresl Variablesl Tiposl Ámbitol Constantes

Nombres

l Identificador que designa en el lenguaje un elemento u objeto de programal (e.g. variable, tipo, constante, función, etc.)

l Aspectos de diseño:l Largo (con significativo) del nombrel Tipos de caracteres aceptados (e.g. conector _)l Sensibilidad a mayúsculas y minúsculasl Palabras reservadas

Variables

l Abstracción de un objeto de memoria, que tiene los siguientes atributos:l Nombre (identificador)l Dirección (l-value: ¿Dónde está localizada?)l Valor (r-value: contenido)l Tipo (tipo de dato que almacena y operaciones válidas)l Tiempo de vida (¿Cuándo se crea y se destruye?)l Ámbito (¿Dónde se puede referenciar?)

Dirección de una Variable

l Un nombre puede ser asociado con diferentes direcciones en diferentes partes y tiempo de ejecución de un programal El mismo nombre puede ser usado para referirse a

diferentes objetos (direcciones), según el ámbito.l Diferentes nombres pueden referirse a un mismo objeto

(alias), lo que puede provocar efectos laterales.l Ejemplo:l Union y punteros en C y C++l Variables dinámicas en PERL

Page 6: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

6

Ligado (Binding)

l Definición: Proceso de asociación de un atributo a una entidad del lenguaje.l Variable:Dirección, tipo → Nombrel Operador: Código → Símbolo

l El tiempo de ligado se refiere al instante en que sucede la asociación:l Estática: diseño o implementación del lenguaje;

compilación, enlace o carga del programal Dinámica: ejecución del programa

a) Ligado de Tipos a Variables

l Variables deben ser ligadas a un tipo antes de usarlas.

l Ligado Estático : con declaración explícita o implícital Lenguajes modernos usan sólo declaración explícital C y C++ hacen la diferencia entre declaración y definición

l Ligado Dinámico : en el momento de la asignaciónl Ventaja: Permite programar en forma genérical Desventaja: disminuye capacidad de detección de errores y

aumento del costo (ejecución)

b) Ligado a Memoria y Tiempo de Vida de Variables

l El carácter de un lenguaje está en gran medida determinado por cómo se administra la memoria.

l A la variables se les puede asignar y liberar memoria de un espacio común (liberación implícita requiere de un recolector de basura).

l Las variables escalares, según tipo de ligado, se clasifican en:l Estáticasl Dinámica de stackl Dinámica de heap

b.1) Variables Estáticas

l Ligadas antes de la ejecuciónl Ventajasl Útil para variables globalesl Para variables sensibles a la historia de un

subprograma (e.g. uso de static en variables de funciones C y C++)

l Acceso directo permite mayor eficiencia

l Desventajasl Falta de flexibilidadl No soportan recursiónl Impide compartir memoria entre diferentes variables

b.2) Variables Dinámicas de Stack

l Ligadas (a la memoria) en el momento en que la ejecución alcanza el código asociado a la declaración.

l Típicamente el tipo se liga estáticamente.l En Pascal se asigna memoria en el momento de

ingresar al bloque que define el ámbito de la variable.

l En C y C++ las variables son por defecto de este tipo (denominadas variables automáticas).

b.3) Variables Dinámicas de Heap

l La memoria se asigna y libera en forma explícita por el programador, usando un operador del lenguaje o una llamada al sistemal C++ dispone del operador new y deletel C usa llamada al sistema malloc()y free()l Javano permite la liberación explícita

l Ventaja: útil para estructuras dinámicas usando punteros.

l Desventaja: Dificultad en su uso correcto

Page 7: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

7

Tipo de Datos

l Para generalizar, supongamos:l La asignación es un operador binario con una variable y una

expresión como operandosl Un subprograma es un operador cuyos parámetros son sus

operandosl Verificación de tipo es asegurar que los operandos de un

operador son de tipo compatible.l Un tipo compatible es uno legal o que mediante reglas el

compilador lo puede convertir a legal.l La conversión automática de tipo se denomina coerción

Verificación de Tipo

l Si todos los tipos se ligan estáticamente⇒ verificación de tipos se puede hacer estáticamente.

l Ligado dinámico requiere realizar una verificación de tipo en tiempo de ejecución.

l Lenguajes modernos prefieren una verificación de tipo estática

l Verificación de tipo se complica cuando se permite almacenar valores de diferente tipo en una variable=> (e.g. Registro con variante en Pascal y Union en C).

Tipificado Fuerte(strong typing)

l Un lenguaje es de tipificado fuerte si permite detectar siempre los errores de tipo:l Cada nombre debe ser ligado estáticamente a un tipol Ligado dinámico a memoria requiere verificación en tiempo

de ejecución

l Ejemplos:l ¡Pascal casi lo es! (registro con variante es excepción)l C y C++ no lo son (parámetros en funciones y union)l Java si lo es (permite forzar conversión de tipo)

Compatibilidad de Tipos

l Compatibilidad de nombrel Las variables están en la misma declaración o usan el

mismo nombre de tipol Fácil implementación, pero muy restrictivo

l Compatibilidad de estructural Si los tipos tienen la misma estructural Más flexible, pero de difícil implementación

l Algunos lenguajes permiten forma intermedia!(e.g. Equivalencia declarativa en Pascal)

Ejemplo: C y C++

struct s1 {int c1; real c2 }; struct s2 {int c1; real c2 }; s1 x; s2 y = x; /* error de

compatibilidad */ typedef char* pchar; pchar p1, p2; char* p3 = p1;

Ámbito (Scope)

l Rango de sentencias en el cual un nombrees visible.

l Nombres pueden ser sólo referenciadasdentro del ámbito.

l Nombres no locales son los que son visibles dentro de un bloque, pero han sido declarado fuera de él.

Page 8: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

8

2.3 Tipos de Datos

Tipos de datos simples, estructurados y punteros

2.3.1 Tipos de Datos Simples

Tipos primitivos, representación, tipos definidos por el usuario

Introducción

l ¿Cómo calzan los tipos de datos con problemas del mundo real?

l Evolución de los tipos :l Números enteros y realesl Arreglos y Registrosl Cadenas de Caracteresl Definidos por el usuariol Tipo de dato abstracto

Tipos Ordinales

l Un tipo ordinal es aquel que puede ser asociado a un número natural (ordenados)

l Tipos ordinales primitivos:l entero, caracter y booleano

l Tipos ordinales definidos por el usuario:l 1) Enumeradosl 2) Subrangos

Representación de Números

l Características de Representaciónl Conjunto Finitol Rango de representación y precisión depende del

largo del registrol Tipos de Representaciónl Números enterosl Números de punto fijol Números de punto flotante

Tipo Enumerado

l Se enumeran todos los posibles valores a través de constantes literales.

l Relación de orden permite definir operadores relacionales y predecesor y sucesor.

l Mejoran facilidad de lectura y fiabilidadl Normalmente no se usan en E/S

Page 9: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

9

Ejemplo : C y C++

<enum-type> ::= enum [<identifier>] { <enum-list> }<enum-list> ::= <enumerador> | <enum-list> , <enumerador><enumerador> ::= <identificador> | <identificador> = <constant-exp>

enum color {rojo, amarillo, verde=20, azul};color col = rojo;color* cp = &col;

if (*cp == azul) // ...

Tipo Subrango

l Subsecuencia contigua de un tipo ordinall Introducido por Pascall Mejora lectura y fiabilidadl Ejemplo: Pascaltype mayuscula = ́ A´..´Z´; indice = LUNES .. VIERNES;

Tipos de Datos Primitivos

l Numéricol Entero (e.g. C permite diferentes tipos de enteros:

signed, unsigned, short, long) l Punto flotante (e.g C permite float y double)l Decimal (típicamente 4 bits por dígito decimal)

l Booleano (típicamente ocupa un byte)l Caracter (típicamente un byte y código ASCII;

Java usa Unicode con 2 bytes)

2.3.2 Tipos de Datos Estructurados

Arreglos, Registros y Strings

Tipo Arreglo

l Es un tipo estructurado consistente en un conjunto ordenado de elementos que se identifican por su posición relativa mediante un índice.

l Existe un tipo asociado a los elementos y al índice.l Índice se escribe entre:l paréntesis redondo (Basic) ol cuadrado (Pascal, C, C++y Java).

l Verificación de rango del índice mejora fiabilidad (Pascal y Java lo hacen).

Arreglos Multidimensionales

l Pascal permite sólo dos dimensiones

l C y C++

TYPEmatriz = ARRAY [subindice, subindice] OF real;

real matriz [DIM1][DIM2];

Page 10: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

10

Inicialización de Arreglos

l ANSI C y C++

l Java

l Pascal no lo permite

char *mensaje = “Hola mundo\n”; char *dias[] = {“lu”, ”ma”, “mi”, “ju”, “vi”, “sa”, “do”};

int[] edades = { 7, 12, 18, 21, 25 };

Operadores con Arreglo

l Pascal y C y no tienen soporte especial (sólo selector con subíndice [])

l C++ permite definir una clase arreglo por el usuario y operadores tales como subíndice, asignación, inicialización, etc.

l Java define los arreglos como tipos especiales de objetos. Permite uso de subíndice, cálculo del largo y otros métodos.

Operadores con Arreglo

l C/C++ no tiene chequeo de rango para los índices. Tampoco permite averiguar el largo de un arreglo.

l Pascal provee chequeo de rangol Java provee chequeo de rango y permite

conocer el largo del arreglo.

int[] arr = {1,2,3,4,6,7,2,3};for(int i=0;i<arr.length;i++){

...}

Implementación de Arreglos

l La memoria es un arreglo unidimensional de celdas:l Un arreglo es una abstracción del lenguajel Un arreglo debe ser mapeado a la memoria

l Ejemplo: dirección de lista[k]

l Arreglos bidimensionales se almacenan como fila de columnas, o viceversal Puede influir en la forma más eficiente de

recorrido.

dir(lista[0]) + (k)*tamañodir(lista[bajo]) + (k-bajo)*tamaño

Arreglos Asociativos

l Arreglo no ordenado de elementos que son accedidos por una clave

l Cada elementos corresponde a un par ordenado (clave, dato)

l PERL provee esta estructura con el nombre de hash:

%dias = (1 => “Enero”,…12 => “Diciembre”

);print $dias{7};

Arreglos Asociativos

l C++ provee mapas y multimapas a travé de la STL (Standard Template Library)l Mapas: una clave, un valor.l Multimapas: un clave, múltiples valores.

l Java provee interfaces para diccionarios e implementaciones de tablas hash.

Page 11: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

11

Arreglos Asociativos

l Hashingl Ubicación de un elemento dentro del arreglo por una

función matemática sobre la clave.l Los arreglos son casos especiales, donde la clave es el

índice y la función matemática es la identidad.l Permite que las claves sean estructuras más complejas.

clave f(clave)

posición

Tipo Registro

l Permite composición heterogénea de elementos de datosCada elemento se identifica por un nombre (campo o miembro)l Introducido por COBOL (data division)l En C equivale a structl Concepto de clase en O-O soporta registros (e.g.

C++ y Java)

Ejemplo: Registros en C y C++ (struct)

struct empleado_t {struct {

char primer[10];char paterno[10];char materno[10];

} nombre;int sueldo;

}

empleado_t pelao, guaton;

guaton.sueldo = 550000;strcpy( pelao.nombre.primer, “Juan”);

Ejemplo: Registros en Pascal

TYPE empleado_t = RECORD

nombre :RECORD primer: PACKED ARRAY [1.10] OF char;

paterno: PACKED ARRAY [1.10] OF char; materno: PACKED ARRAY [1.10] OF char;

END {nombre}; sueldo : integer

END;VAR pelao, guaton : empleado_t;

BEGIN… pelao.sueldo := 550000;

Cadena de Caracteres (String)

l Principalmente para la comunicación máquina-usuario y para manipulación de textosl Mejora la facilidad de escritura

l ¿Es una cadena un tipo primitivo? l Algunos lenguajes lo proveen como tipo (Java y

Perl )l Otros sólo como arreglo de carácteres (C, C++ y

Pascal)l ¿Puede el largo variar dinámicamente?

Strings: Operaciones Básicas

l Asignaciónl Comparaciónl Concatenaciónl Largol Transformación (e.g. de string a entero)

Page 12: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

12

Ejemplo de String en C

char str[20];

…if (strcmp(str,”Hola”){

…else {

…}

Strings: Calce de Patrones (Pattern matching)

l Perl hace uso de expresiones regularesl Ejemplo:l /[A-Za-z][A-Za-z\d]+/ permite calzar un

identificadorl /^(\s+)\s+(s+)\s+(\s+)$/ permite calzar tres

palabras

Diseño de String

l Diseño de string considera:l Largo estático (Pascal y Java)l Largo dinámico limitado (e.g. C y C++)l Largo dinámico (Perl )

l Último es el más flexible, pero es más costoso de implementar y ejecutar.

Tipo Union

l Permite almacenar diferentes tipos de datos en diferentes tiempos en una misma variable.

l Reserva espacio de memoria igual al mayor miembro definido.

l Todos los miembros comparten la memoria y comienzan desde la misma dirección.

l Su uso es en general poco seguro.l Java no provee este tipo de estructura

Ejemplo: C y C++

union direccion {char dominio[20];int IP[4];

};

Dominio

IP

2.3.3 Tipo Puntero

Operaciones, problemas de uso, tipo referencia e implementación

Page 13: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

13

Tipo Puntero

l Su valor corresponde a una dirección de memoria, habiendo un valor especial nulo (nil) que no apunta a nada.

l Aplicaciones:l �Método de gestión dinámica de memoria

(acceso a variables dinámicas de heap)l �Método de direccionamiemto indirecto

l No corresponde a un tipo estructurado, aun cuando se definen en base a un operador de tipo

Operaciones con Punteros

l Asignación: asigna a la variable como valor una dirección a algún objeto de memoria.

l Desreferenciación: entrega el valor del objeto apuntado.l Operador * en C y C++ (e.g. *ptr)l Operador ^ en Pascal (e.g. ptr̂ )l Aritmética de punteros en C y C++

Ejemplo en C

int j, *ptr;

ptr= (int*) malloc(sizeof(int));*ptr = 432;j = *ptr;

432432

ptr2145

7023

j7127

Problema con Punteros

l � Dejar colgado (dangling)

typedef tipo* ptipo;tipo x;ptipo p, q;

p= (ptipo) malloc(sizeof(tipo));...q= p;...free(p);... /* puede que la variable de heap sea reasignada */*q = x;

Problema con Punteros

l �Pérdida de variables dinámicas de heap

l Se pierde el acceso a la variable, convirtiéndose en basura dado que no puede ser reasignada

tipo* p;

p= (tipo *) malloc(sizeof(tipo));...p= (ptipo *) malloc(sizeof(tipo));/* se pierde la variable asignada anteriormente */

Punteros y Estructuras en C y C++ struct nodo_t { tipodato info; struct nodo_t *siguiente; }; typedef nodo_t* enlace_t;

enlace_t nodo;

#ifndef C++ nodo = (enlace_t) malloc(sizeof(nodo_t));#elif nodo = new nodo_t; /* caso C++ */#endif (*nodo).info = dato;

/* forma más conveniente de referirse es */ nodo->siguiente = NULL;

Autoreferencia

Page 14: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

14

Punteros y Arreglos en C y C++

l Un arreglo es en realidad una constante de tipo puntero

int a[10];int *pa;

pa = &a[0];pa = a; /* hace lo mismo que la linea anterior */

for (int i=0; i<10; i++) printf(a[i]);for (int i=0; i<10; i++) printf(*(pa+i));for (int i=0; i<10; i++) printf(*(a+i));/* los tres for hacen lo mismo */

Aritmética de Punteros en C y C++

#define ALLOCSIZE 1000 /* tamaño del buffer */ static char allocbuf[ALLOCSIZE]; /* el buffer */ static char* allocp = allocbuf; /* primera posición libre */ char *alloc(int n) / retorna puntero a “n” caracteres */ { if (allocbuf + ALLOCSIZE – allocp >= n) { /*si cabe */ allocp += n; return allocp – n; /* antigua direccion */ } else return 0; } void afree (char *p) { if (p >= allocbuf && p < allocbuf + ALLOCSIZE) allocp = p; }

Tipo Referencia en C++

l Un tipo referencia es una variable tipo puntero constante que es implícitamente desreferenciada.

l Dado que es constante, debe ser inicializada en su definición.

l La referencia actúa como alias de una variable.

int valor = 3;int &ref_valor = valor;

ref_valor = 100; /* ahora valor == 100 */

Referencias en Java

l Java extiende la forma de variables de referencia de C++, haciendo innecesario y, por lo tanto, eliminando el uso de punteros. l Java permite asignar un nuevo objeto a una

variable de referencial Todo objeto sólo se referencia con estas

variables

l En Java liberación de objetos es implícital Requiere de un recolector de basura

Métodos de Reclamo de Basura

l Contadores de Referencia (impaciente)l Se mantiene un contador de referencia por cada celdal Se incrementa con una nueva referencia y se

decrementacuando se pierde una referencial Celda se libera tan pronto cuenta llega a cero

(cuando se convierte en basura)

l Recolección de Basura (perezoso)l Se acumula basura hasta que se agota la memorial Si se agota la memoria se identifican las celdas de

basura y se pasan a la lista de celdas libres

Recolección de Basura

void* allocate (int n){ if (!hay_espacio) { /* recolectar basura */ 1) marcar todo los objetos del heap como basura; 2) for (todo puntero p) { if (p alcanza objeto o en el heap) marcar o como NO basura; } /* for */ 3) liberar todos los objetos marcados como basura }

if (hay_espacio) { asignar espacio; return puntero al objeto; } else return NULL;}

Page 15: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

15

Evaluación de los Métodos

l Contadores de referencial Requiere bastante memoria para mantener

contadoresl Asignaciones a punteros requiere de más tiempo

de ejecución para mantener contadores

l Recolección de basural Basta un bit por celda para marcar basural Mal desempeño cuando queda poca memoria

2.4 Expresiones y Asignaciones

Expresiones aritméticas y lógicas, sobrecarga de

operadores, conversiones de tipo, evaluación con corto-circuito

Introducción

l Lenguajes imperativos se caracterizan por el uso dominante de expresiones y asignaciones

l El valor de las expresiones depende del orden de evaluación de operadores y operandos

l Ambigüedades en el orden de la evaluación puede conducir a diferentes resultados

Expresiones Aritméticas

l Orden de evaluación está principalmente definida por las reglas de precedencia y asociatividad

l Paréntesis fuerzan determinado orden

Expresión Condicional

/* version N°1 */ int abs(int n) { if (n>=0) return n; else return –n; } /* version N°2 */ int abs(int n) { return (n>=0)? n: -n; }

Efectos Laterales Funcionales

l Orden de evaluación de los operandos puede producir resultados diferentes si existen efectos laterales

l Ejemplo: int a = 2; int f1() { return a++; } int f2 (int i) { return (--a * i); } void main { printf(“%i\n”, f1()*f2(3)); }

Page 16: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

16

¿Cómo evitar efectos laterales de funciones?

l Deshabilitar efectos laterales en la evaluación de funcionesl Quita flexibilidad, por ejemplo habría que negar acceso a

variables globales

l Imponer un orden de evaluación a las funcionesl Evita que el compilador puede realizar optimizacionesl Enfoque seguido en Java (evaluación de izquierda a

derecha).

Expresiones Relacionales

Operación Pascal C Ada Fortran

Igual = == = .EQ.

No es igual <> != /= .NE.

Mayor que > > > .GT.

Menor que < < < .LT.

Mayor oigual que

>= >= >= .GE.

Menor oigual que

<= <= <= .LE.

Operadores Booleanos

l Incluye: AND, OR, NOT y, a veces, XOR.l La precedencia está generalmente definida

de mayor a menor: NOT, OR y AND

Ejemplos:Operadores relacionales y lógicos

C: b + 1 > b*2 /* aritmeticos primero */

C: a > 0 || a < 5 /* relacional primero */

Pascal: a > 0 OR a < 5 {es ilegal}

Corto Circuito o Término Anticipado de Evaluación

C: (a >=0) || (b < 10) while ( (c = getchar()) != EOF && c != \́n´) {

procesar linea;

Corto Circuitos en los Lenguajes Imperativos

l C, C++ y Java definen corto circuito para:&& y || (AND y OR)

l Pascal no lo especifica (algunas implementaciones los tienen, otras no)

Page 17: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

17

Sentencias de Asignación

l Permite cambiar dinámicamente el valor ligado a una variable

l Basic, C, C++ y Java usan =l Algol, Pascal y ADA usan :=l C, C++ y Java permiten incrustar una

asignación en una expresión (actúa como cualquier operador binario)

Operadores Compuestos y Unariosde Asignación

l Sólo presentes en C, C++ y Java

sum += A[i]; equivale a: sum = sum + A[i];

sum = ++contador; equivale a: contador = contador + 1; sum = contador;

Asignación en Expresiones

l C, C++ y Java permiten incrustar asignaciones en cualquier expresión

l Permite codificar en forma más compactal La desventaja de esta facilidad es que puede

provocar efectos laterales, siendo fuente de error en la programación

l Es fácil equivocarse confundiendo == y =

Asignación en Expresiones...

int x,y;x=0;y=1;if(x=y)

x++;...

•En C entrega x=2 e y=1•En Java entrega error de compilación

...int x,y;x=0;y=1;if((x=y)==1)x++;System.out.println("x:"+x+",

y:"+y);...

•En Java entrega x=2 e y=1

2.5 Estructuras de Control

Expresiones aritméticas y lógicas, sobrecarga de

operadores, conversiones de tipo, evaluación con corto-circuito

Introducción

l Ejecución es típicamente secuenciall Normalmente se requieren dos tipos de

sentencias de control:l Selección de alternativas de ejecuciónl Ejecución repetitiva de un grupo de sentencias

l En principio basta tener un simple gotoselectivo, pero es poco estructurado

Page 18: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

18

1) Sentencias Compuestas

l Permite agrupar un conjunto de sentenciasl Ejemplos:l begin y end en Pascall Paréntesis de llave en C, C++ y Java

2) Sentencias de Selección

l Selección binariaEjemplo: if-else o if (solo)

l Selección múltipleEjemplos: l case en Pascall switch en C, C++ y Javal elseif en ADA

3) Sentencias Iterativas

l Bucles controlados por contadorEjemplo: for en C

l Bucles controlados por condiciónEjemplo:l while, do-while en C, C++ y Javal do-until en Pascal

l Bucles controlados por Estructuras de Datosl Ejemplo: foreach en Perll Java 1.5 acaba de introducir una especie de foreach.

4) Salto Incondicional

l Uso de rótulos o etiquetasl Ejemplo: goto FINAL

l Restricciones:l Sólo rótulos en el ámbito de la variablel Rótulos deben ser constantes

2.6 Subprogramas

Ámbito, comprobación de tipos, semántica de paso de

parámetros, funciones genéricas, implementación

Características de un Subprograma

l Permite crear abstracción de proceso:l encapsulando códigol definiendo una interfaz de invocación para paso

de parámetros y resultadosl Permite reutilizar código, ahorrando memoria

y tiempo de codificación.l Existe en forma de procedimiento y función.

Page 19: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

19

Mecanismo de Invocación

Subprograma

Parámetros

Resultados

Activación

Invocación y

suspensión

RetornoReanu-dación

Firmas y Protocolos de la Interfaz

l La firma (signature), o prototipo, es un contrato entre el invocador y el subprograma que define la semántica de la interfaz.

l El protocolo especifica cómo debe realizarse la comunicación de parámetros y resultados (tipo y orden de los parámetros y, opcionalmente, valor de retorno).

procedure random(in real semilla; out real aleat);

Parámetros

l Parámetros formales son variables mudas que se ligan a los parámetros reales cuando se activa el subprograma.l Normalmente ligado se hace según posición en la lista.

l Parámetros permiten comunicación explícita de datos y, a veces, también (otros) subprogramas.

l Comunicación implícita se da a través de variables no locales, lo que puede provocar efectos laterales.

Semántica de Paso de Parámetros

l Modo de interacción de parámetro actual a formal puede ser: l entrega de valor (IN)l recibo de valor (OUT)l ambos (INOUT)

l La implementación de la transferencia de datospuede ser:l copiando valores, o l pasando referencias (o puntero)

� Paso por Valor(pass-by-value)

l Modo IN e implementado normalmente con copia de valorl Implementación con paso de referencia requiere

protección de escritura, que puede ser difícil

l Permite proteger de modificaciones al parámetro actual, pero es más costoso l (más memoria y tiempo de copiado)

l Permite usar expresiones como parámetro actual

� Paso por Resultado(pass-by-result)

l Modo OUT y normalmente implementado con copia (mismas complicaciones que por valor)

l Parámetro formal actúa como variable local, pero al retornar copia valor a parámetro actual

l Parámetro actual debe ser variablel Dificultades:l Existencia de colisiones en los parámetros actuales, puede

conducir a ambigüedadl Cuándo se evalúa dirección de parámetro actual?

Page 20: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

20

� Paso por Valor-Resultado(pass-by-value-result)

l Modo INOUT con copia de parámetros en la entrega y en el retornol Por esto, llamada a veces paso por copia

l Mismas dificultades que paso por valor y paso por resultado

� Paso por Referencia(pass-by-reference)

l Modo INOUT e implementación con referenciasl Parámetro formal y real comparten misma variablel Ventaja: Comunicación es eficiente en:l espacio (no requiere duplicar variable)l tiempo (no requiere copiar)

l Desventajal Acceso es más lento (indirección)l Es fuente de error (modificación de parámetro real)l Creación de alias a través de parámetros actuales

Paso de Parámetros

l C: Paso por valor, y por referencia usando punterosl Puntero pueden ser calificado conconst; se logra semántica de

paso por valor (sin permitir asignación)l Arreglos se pasan por referencia (son punteros)

l C++: Igual que C, más paso por referencia usando operador &l Este operador también puede ser calificado conconst,

permitiendo semántica paso por valor con mayor eficiencia (e.g. paso de grandes arreglos)

l Java: Todos los parámetros son pasados por valor, excepto objetos que se pasan por referencial No existencia de punteros no permite paso por referencia de

escalares (si como parte de un objeto)l Pascal : Por defecto paso por valor, y por referencia si se usa

calificativo var.

Funciones como Parámetro

l En Pascal

l En C (solo usando punteros a funciones)

function integrar (function fun(x:real): real; bajo, alto: real) : real;...x := integrar(coseno, -PI/2, PI/2);...

float integrar (float *fun(float), float bajo, float alto);...x = integrar(&coseno, -PI/2, PI/2);...

Sobrecarga de Subprogramas

l En el mismo ámbito existen diferentes subprogramas con el mismo nombre.

l Cada versión debiera tener una firma diferente, de manera que a partir de los parámetros reales se pueda resolver a cual versión se refiere.

l Las versiones pueden diferir en la codificaciónl Es una conveniencia notacional, que es evidente

cuando se usan nombres convencionales, como en siguiente ejemplo

Ejemplo: Sobrecarga de Funciones en C++ y Java

double abs(double); int abs(int); abs(1); // invoca int abs(int); abs(1.0); // invoca double abs(double); // se sobrecargará print void print(int); void print (char*);

Page 21: Capítulo II 2.1 Sintaxis y Semántica - inf.utfsm.clmcloud/iwi-253/apuntes/apunte02-todo.pdf · Lenguajes de Programación 2.1 Sintaxis y Semántica Descripción de sintaxis y semántica,

21

Subprogramas Genéricosl Permite crear diferentes subprogramas que

implementan el mismo algoritmo, el cual actúa sobre diferentes tipos de datos.

l Mejora la reutilización, aumentando productividad en el proceso de desarrollo de software.

l Polimorfismo paramétrico: Parámetros genéricos de tipos usados para especificar los tipos de los parámetros de un subprograma

l Sobrecarga de subprogramas corresponde a un polimorfismo ad-hoc

Funciones Genéricas en C++

template <class Tipo> Tipo maximo (Tipo a, Tipo b) { return a>b ? a : b; } int x, y, z; char u, v, w; z = maximo(x, y); w = maximo(u, v);

Sobrecarga de Operadores definida por el Usuario

l Permite que el usuario sobrecargue operadores existentes en el lenguaje (Lo permiten ADA y C++)

int operator * (const vector &a, const vector &b, int len)

{ int sum = 0;for (int i = 0; i < len; i++)

sum += a[i] + b[i];return sum;

}...vector x, y;...printf(“%i”, x + y);