lenguaje modula 2

46
EL LENGUAJE MODULA-2 Programación 2 Curso 2009 InCo

Upload: maria-noel

Post on 30-Jun-2015

1.117 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Lenguaje Modula 2

EL LENGUAJEMODULA-2

Programación 2Curso 2009

InCo

Page 2: Lenguaje Modula 2

Módulos

Los programas (ej:PASCAL) usan engeneral funciones y procedimientos “debiblioteca”

En Modula-2 las bibliotecas se organizanen módulos (de biblioteca)

M1 M2 Mn

Biblioteca

Módulo

. . .

Page 3: Lenguaje Modula 2

Módulos (2) Un módulo contiene un número de entidades de

exportación. Entidades posibles:

Tipos Constantes Variables Procedimientos y funciones

Exportación: disponibles para ser utilizados por otrosmódulos.

Cada módulo tiene también un nombre. Los “programas principales” son también llamados

módulos. Se distinguen:

Módulos de biblioteca Módulo Principal.

Page 4: Lenguaje Modula 2

Módulos (3) Estructura de un programa (módulo principal) :

MODULE nombre;<lista de importaciones><declaraciones>

BEGIN<instrucciones>

END nombre

Page 5: Lenguaje Modula 2

Importación:

FROM <nombre> IMPORT <lista_de_nombres>; <nombre> debe ser nombre de un módulo de

bibloteca. <lista_de_nombres> deben ser entidades exportadas

por el modulo referenciado.

FROM STextIO IMPORT WriteString, WriteLn;

Page 6: Lenguaje Modula 2

Ejemplo

Programa que lee dos naturales ycomputa su máximo común divisor.

Los procedimientos y funciones de E/S(Entrada/Salida) son importados de módulosque suponemos definidos.

ReadCard debe ser un procedimiento conun solo parámetro de tipo CARDINAL.

Page 7: Lenguaje Modula 2

EjemploMODULE módulo;

FROM InOut IMPORT ReadCard,WriteCard,WriteString,WriteLn;

VAR x, y: CARDINAL;

BEGIN

WriteString(“x =“);ReadCard(x);WriteLn;WriteString(“y= “);ReadCard(y);WriteLn;WHILE (x<>y) DO

IF (x>y) THEN x:= x-y;

ELSE y:=y-x;

END;

END; (*while*)WriteString(“MCSD = “); WriteCard(x,6);WriteLn;

END módulo.

Page 8: Lenguaje Modula 2

Estructura de programas (M-2)

Fuerte similitud con Pascal. Esquema general:

Instrucciones operando sobre y modificando estadode datos

(Programa = Estructura de Datos + Algoritmos)

Estructura de Datos Conjunto de variables (de estado) Cada variable puede contener ciertos valores (datos) Estado de una variable x:

x tiene valor “v” (v es un valor permitido de la variable) x está indefinida (no tiene valor)

Page 9: Lenguaje Modula 2

Estructura de Programas (M-2) (2)

Expresiones Variables y constantes denotan (representan)

valores Los valores pueden combinarse a través de

operaciones para computar otros valores

InstruccionesEstructuras de control

Asignación (x:=e;) Secuencia Selección Iteración Procedimientos

Page 10: Lenguaje Modula 2

Instrucciones

Asignación x:= e;

Secuencia: s1;s2

Selección: IF expresion(BOOLEAN) THEN

s1;ELSEIF expr THEN s2;…ELSEIF expr THEN s(n-1);ELSE sN;END

Page 11: Lenguaje Modula 2

Instrucciones Iteración:

WHILE expr(BOOLEAN) DOs1;

END

También FOR y REPEAT

Procedimientos y Funciones En general, mismas reglas que en PASCAL Pasaje de parámetros:

Por Valor Por Referencia (VAR)

Las funciones PUEDEN retornar valores de tiposestructurados

Page 12: Lenguaje Modula 2

Datos

Principio (metodológico)

No Existe el concepto de “dato” (aislado)

Los datos están clasificados en TIPO

Existe primero el concepto de TIPO DE DATOS ypara cada tipo T, tenemos el concepto de dato detipo T

Page 13: Lenguaje Modula 2

Tipos de Datos Conocer un tipo de datos es conocer:

Cuales son los valores de tipo T Cuales son las operaciones (primitivas) que se

pueden aplicar a valores del tipo T Para definir un tipo de datos deben darse reglas

de: Sintaxis

Cómo se escriben los valores (literales) Cómo se escribe la aplicación de cada operación

Semántica Qué valor denota cada literal Qué computa cada operación

Page 14: Lenguaje Modula 2

El sistema de tipos de Modula-2

Elementales

Estructurados

Page 15: Lenguaje Modula 2

Tipos Elementales

Los valores no se pueden descomponeren partes (básicos, atómicos)

BOOLEAN INTEGER CARDINAL REAL CHAR Enumeraciones Subrangos

Page 16: Lenguaje Modula 2

Tipos Elementales

El tipo INTEGER: Valores: un rango de enteros (depende de la

versión del lenguaje) Literales: se usa la notación decimal (octal y hexa) Operadores

Aritméticos: +, -, *, DIV, MOD Relaciones: <, <=, =, <> (#), >, >=, siguiendo casi las

mismas reglas que en Pascal.

Page 17: Lenguaje Modula 2

Tipos Elementales

El tipo CARDINAL: Tiene como valores números naturales (enteros no

negativos) hasta un máximo. Para hallar ese máximo se utiliza la función

estándar MAX(T) (donde T es el tipo básico)aplicado al tipo CARDINAL.

Page 18: Lenguaje Modula 2

Tipos Elementales Algunas diferencias con PASCAL:

+, -, * sobrecargados (igual que en PASCAL)

Pero NO se pueden combinar por medio de estas operacionesvalores de <> tipo.

2+3.1 : incorrecto x+y es incorrecto con x:CARDINAL e y:INTEGER

Existen funciones de conversión:

INTEGER

CARDINAL

REAL

CAST(INTEGER,…)

CAST(INTEGER,…)

CAST(CARDINAL,…)

CAST(REAL,…)

Page 19: Lenguaje Modula 2

Tipos Elementales

Excepción: valores de tipos subrangos sepueden combinar con valores del tipobase del subrango.

Page 20: Lenguaje Modula 2

Tipos Estructurados Vectores y Matrices (“arreglos”)

ARRAY <tipoindice> OF <tipo> Mismas reglas que en PASCAL Indice: [i]

miArreglo[i], miArray[2]; Literales: {}

TYPE TipoArray = ARRAY [0..2] OF CARDINAL

…a: TipoArray;

…a:= TipoArray{1,2,3};

Page 21: Lenguaje Modula 2

Tipos Estructurados (2)

Registros RECORD

c1: t1;…cn: tn;

END

Mismas reglas que en PASCAL Selección: _._ (rec.f) Literales: {} (similar al caso de array)

Page 22: Lenguaje Modula 2

Tipos Estructurados Uniones discriminadas (registros con variantes)

RECORDnombre, apellido: Nombre;CASE: estado: EstadoCIvil OF

soltero:casado: cant_hijos: CARDINAL;

fecha_matrimonio: FechaEND

El enumerado que se utiliza en el case debe definirsepreviamente.

Page 23: Lenguaje Modula 2

Tipos Estructurados

Punteros Se verán mas adelante

Utilizados en ESTRUCTURAS DINAMICAS.

Page 24: Lenguaje Modula 2

Vectores Abiertos Se pueden declarar parámetros formales sin especificar

el tipo índice: PROCEDURE P(s: ARRAY OF CHAR)

En este caso, vectores de CHAR de cualquier tamañopueden pasarse como argumentos efectivos de Pcorrespondiendo al parámetro formal s.

En el cuerpo del PROCEDURE, ‘s’ tiene primer índice 0y existe la función predefinida HIGH que permite calcularel índice máximo.(como si fuera s:ARRAY[0..HIGH(s)] OF CHAR;)

Page 25: Lenguaje Modula 2

Para que módulos?

Abstracción / Descomposición Se descompone el programa en módulos. Debe acordarse cual es la comunicación entre

ellos. Que entidades importan/exportan En caso que sean procedimientos, especificar QUE deben

hacer (y no es necesario conocer COMO)

Page 26: Lenguaje Modula 2

Para que módulos?

Los módulos pueden desarrollarse y compilarseseparadamente.

Para obtener una versión ejecutable debe efectuarse elproceso de linking.

Cambios en la implementación de entidades importadasno obligan a recompilar todo el sistema.

Solo se recompila el módulo de implementación y sereconecta todo el sistema.

Naturalmente, los “códigos incompletos” generados porel compilador son también mantenidos en archivos.

Page 27: Lenguaje Modula 2

Modulo de Biblioteca

Módulo de Definición

Módulo de Implementación

Page 28: Lenguaje Modula 2

Modulo de definición DEFINITION MODULE nombre;

<lista de importaciones><lista de declaraciones sintácticas (i)>

END

Las entidades declaradas en (i) son las exportadas por el módulo,pueden ser:

Tipos Constantes Variables Subprogramas (solo se declara el cabezal y no el cuerpo)

Ejemplo:PROCEDURE: ReadCArd(VAR x:CARDINAL)

En general, basta declarar la mínima información necesaria para verificarel uso correcto de la entidad solo desde el punto de vista sintáctico

En particular, los tipos exportados pueden ser declarados solo con unnombre (Tipos Opacos a ver más adelante …)

Page 29: Lenguaje Modula 2

Módulo de implementación IMPLEMENTATION MODULE nombre;

<lista de importaciones><declaraciones (ii)>

END

Cada entidad declarada en el módulo de definición esimplementada en el correspondiente módulo de implementación.

En particular, en este ultimo es donde se proveen los cuerpos de lossubprogramas exportados.

En el proceso de compilación de un módulo principal.

El compilador usa la información de los módulos de definición

El linker usa los módulos de implementación.

Page 30: Lenguaje Modula 2

Compilación y creación del ejecutable(linking)

CompiladorMódulo

Principal

Errores decompilación

Código Objeto“desconectado”

Conector“Linker”

Bibiloteca de Módulos

[2][1]

Código ObjetoEjecutable

Page 31: Lenguaje Modula 2

Compilación y creación del ejecutable(linking)

[1]: El compilador no accede al código objeto delos módulos referenciados.

Solo utiliza declaraciones que permitan verificarel uso correcto de las entidades importadas,desde el punto de vista sintáctico

Por ello, la salida del compilador no esta listapara ser ejecutada.

Page 32: Lenguaje Modula 2

Compilación y creación del ejecutable(linking)

Para construir los ejecutables es necesario completar elcódigo objeto del programa con el correspondiente a lasentidades importadas.

Esto ultimo lo realiza el “conector” (linker) accediendo[2] otra vez a las bibliotecas.

Cada módulo de biblioteca se compone de dos partes

Modulo de Definición Modulo de Implementación.

Page 33: Lenguaje Modula 2

Instalación del compilador

En el curso se trabajará con el compiladorNative XDS-x86 para Windows.

El instalador del compilador del entorno sepuede obtener de la pagina deExcelsior.(ver sitio P2 e instructivo)

Page 34: Lenguaje Modula 2

Compilar desde línea de comandos

El enfoque modular del lenguaje permite la compilación de cadamódulo como una entidad independiente

Sin necesidad de compilar cada uno de los módulos queconstituyen el proyecto

Un módulo de implementación se compila ingresando el siguientecomando:

xc =compile archivo1.mod xc =c archivo1.mod (abreviación)

El resultado es un archivo con el mismo nombre que el módulo perocon extensión “.obj”

Este archivo es denominado el código objeto del módulo.

Page 35: Lenguaje Modula 2

Compilar desde línea de comandos (2)

Un módulo de definición se compila con: xc =c archivo1.def

En este caso no se genera código objeto sino un archivocon extensión “.sym”

Para compilar un módulo es necesario disponer de losarchivos .sym de todos los módulos de definiciónimportados directa o indirectamente.

Los módulos de implementación no se requieren.

Page 36: Lenguaje Modula 2

Compilación de proyectos Cuando se trabaja con proyectos con muchos módulos,

la compilación independiente resulta incómoda

Es posible establecer relaciones de dependencia entremódulos de acuerdo a las importaciones.

Estas relaciones indican a que módulos podría afectar lamodificación y recompilación de un módulo.

El compilador cuenta con un modo de funcionamientoque maneja esto automáticamente.

En este modo solo se compilan aquellos módulosnecesarios de acuerdo a las dependencias.

Page 37: Lenguaje Modula 2

Compilación de proyectos (2) Para compilar el módulo archivo1.mod y todos

aquellos de los que depende y hayan sidomodificados desde la última compilación:

xc =make archivo1.mod xc =m archivo1.mod (abreviación)

SI el archivo que se pasa por parámetro es unmódulo principal, se ejecuta automáticamente ellinker. Es decir:

xc =m principal.mod

Compilará todos los módulos necesarios e invocará a xlink paragenerar el ejecutable principal.exe

Page 38: Lenguaje Modula 2

Creación del ejecutable (linking) Para la construcción del programa ejecutable se

requieren todos los archivos que resultan del proceso decompilación de los módulos (.obj y .sym)

No se requieren los archivos de código fuente (.mod y.def)

El proceso de linking se invoca con el siguientecomando:

xlink principal.obj archivo1.obj archivo2.objarchivoN.obj xds.25i.lib xstart.lib import32.lib

El resultado es un ejecutable “principal.exe”

Page 39: Lenguaje Modula 2

Compilación y creación del ejecutable(linking)

CompiladorMódulo

Principal

Errores decompilación

Código Objeto“desconectado”

Conector“Linker”

Bibiloteca de Módulos

[2][1]

Código ObjetoEjecutable

Page 40: Lenguaje Modula 2

Creación del ejecutable (linking) (2)

Los archivos “.lib” son librerías que agrupanvarios .obj

Las librerías “xds25i.lib”, “xstart.lib” e“import32.lib” se distribuyen junto con elcompilador (podría requerirse la ruta completa).

Contienen código de soporte para losprogramas, como por ejemplo rutinas de lasbibliotecas estándar.

Page 41: Lenguaje Modula 2

DEFINITION MODULE STextIO;

(* Input and output of character and string types over default channels. Theread result

is of the type IOConsts.ReadResults.*)

(* The following procedures do not read past line marks *)

PROCEDURE ReadChar (VAR ch: CHAR);(* If possible, removes a character from the default input stream, and assigns

thecorresponding value to ch. The read result is set to allRight, endOfLine orendOfInput.

*)

PROCEDURE ReadRestLine (VAR s: ARRAY OF CHAR);(* Removes any remaining characters from the default input stream before the

next linemark, copying to s as many as can be accommodated as a string value. The

read resultis set to the value allRight, outOfRange, endOfLine, or endOfInput.

*)

PROCEDURE ReadString (VAR s: ARRAY OF CHAR);(* Removes only those characters from the default input stream before the next

line markthat can be accommodated in s as a string value, and copies them to s. The

read resultis set to the value allRight, endOfLine, or endOfInput.

*)

Page 42: Lenguaje Modula 2

DEFINITION MODULE RealMath;(* Mathematical functions for the type REAL *)

CONSTpi = 3.141592;exp1 = 2.718281;

PROCEDURE sqrt (x: REAL): REAL;(* Returns the positive square root of x *)

PROCEDURE exp (x: REAL): REAL;(* Returns the exponential of x *)

PROCEDURE ln (x: REAL): REAL;(* Returns the natural logarithm of x *)(* The angle in all trigonometric functions is measured in radians *)

…PROCEDURE power (base, exponent: REAL): REAL;(* Returns the value of the number base raised to the power exponent *)

PROCEDURE round (x: REAL): INTEGER;(* Returns the value of x rounded to the nearest integer *)

PROCEDURE IsRMathException (): BOOLEAN;(* Returns TRUE if the current coroutine is in the exceptional execution state

because of the raising of an exception in a routine from this module;otherwise

returns FALSE.*)

END RealMath.

Page 43: Lenguaje Modula 2

Algunas diferencias entre PIM yestándar ISO

Existen varias definiciones del lenguaje Modula-2, cadacompilador utiliza una de ellas.

En cursos anteriores se utilizo la llamada PIM, que vienede “Programming in Modula2” (libro de Wirth)

En este curso se utilizara el estándar ISO. Algunas particularidades:

FROM modulo IMPORT; se puede utilizar en PIM para importartodo lo exportado por el módulo “modulo”. En ISO se debemencionar explícitamente la lista de elementos a importar

WriteLine y ReadLine NO están disponibles en ISO

CompareStr se reemplaza por Compare

Page 44: Lenguaje Modula 2

Algunas diferencias entre PIM yestándar ISO (2)

Mas diferencias: Copy para manejo de strings se reemplaza por Extract.

StringToCard (y similares) se reemplaza por StrToCard delmódulo WholeStr.

La declaración de un tipo enumerado dentro de unadeclaración record-case no es válida. Debe declararse antesel enumerado.

Se utiliza la función CAST, del modulo SYSTEM, paraconvertir valores (excepto literales numéricos) a otro tipo. Nose permite la conversión del tipo al estilo PIM como

CARDINAL(x)

Page 45: Lenguaje Modula 2

Algunas diferencias entre PIM yestándar ISO (3)

Para obtener más información sobre este estándarpuede consultarse:

La documentación que se distribuye con el compilador http://www.modula2.org/reference

En el laboratorio SOLO se utilizará la definición ISO.

Se desaconseja la utilización de compiladores diferentesal Native XDS-x86.

En los ejercicios de practico, parciales y exámenes, seadmitirán ambas definiciones

Page 46: Lenguaje Modula 2

PREGUNTAS?