Sei sulla pagina 1di 11

Ingeniera de Computacin

Practica de Compiladores: CARACTERSTICAS DE LOS COMPILADORES EN LOS LENGUAJES DE PROGRAMACIN

OBJETIVOS Conocer los conceptos bsicos que intervienen en el desarrollo de lenguajes de programacin. Identificar las diferencias entre compiladores, intrpretes y procesadores intermedios como Java. Aprender comandos y sintaxis de Bash Shell y Formar aplicaciones de sistemas utilizando scripts Bash.

FUNDAMENTACIN TERICA

La programacin de computadoras se realiza en los llamados lenguajes de programacin, stos posibilitan la comunicacin entre el programador y la computadora, a travs de un conjunto de instrucciones u rdenes especificadas por el lenguaje. Un lenguaje de programacin puede definirse como Notacin formal para describir algoritmos o funciones que sern ejecutados por una computadora, o bien, un lenguaje para comunicar instrucciones al computador. Diferentes puntos de vista para clasificar los lenguajes de programacin: a) Su grado de independencia con la mquina. b) La forma de sus instrucciones. c) Por generaciones. Los lenguajes de programacin segn su grado de independencia de la mquina pueden ser: Lenguaje mquina (representacin binaria o hexadecimal.). Lenguaje ensamblador o de bajo nivel (versin simblica de un lenguaje mquina). Lenguaje de medio nivel (lenguaje C). Lenguaje de alto nivel (FORTRAN, COBOL, Pascal). Los lenguajes de programacin segn la forma de sus instrucciones pueden ser: Lenguajes imperativos o procedimentales: lenguajes FORTRAN). Lenguajes declarativos: o Funcionales o aplicativos: sus construcciones se basan en llamadas a funciones matemticas, utilizados a menudo en Inteligencia Artificial (LISP, ML. APL, Haskell). o Lgicos: manejan relaciones entre objetos. Las relaciones se especifican con reglas y hechos. La orientados a instrucciones (Pascal, C, C++, Ada,

ejecucin de programas lgicos, consiste en la demostracin de hechos sobre las relaciones por medio de preguntas. (PROLOG es el ms utilizado de este tipo). Lenguajes orientados a objetos: si soportan tipos de datos abstractos y clases. (C++, Smalltalk, Java, Prolog++) Los lenguajes de programacin por generaciones son aquellos nombrados como: 1., 2., 3. 4. generacin y aquellos identificados como generacin visual y generacin internet. Procesadores de Lenguaje es el nombre genrico que reciben todas las aplicaciones en las cuales uno de los datos fundamentales de entrada en un lenguaje. La definicin anterior afecta a una gran variedad de herramientas de SW, algunas de ellas son las siguientes: Traductores (translators) Compiladores (compilers) Ensambladores (assemblers) Interpretes (interpreters) Editores (editors)

A continuacin se definen algunos procesadores de lenguajes que sern analizados durante la prctica: Traductor: Un traductor es un programa que procesa un texto fuente y genera un texto objeto o lenguaje objeto (p. e.: lenguaje mquina, ensamblador, alto nivel). Compiladores: Un traductor que transforma textos fuente de lenguajes de alto nivel a lenguajes de bajo nivel se le denomina compilador. El tiempo que se necesita para traducir un lenguaje de alto nivel a lenguaje objeto se denomina tiempo de compilacin. El tiempo que tarda en ejecutarse un programa objeto se denomina tiempo de
Programacin de Sistemas 2011-B. Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

ejecucin. Intrpretes: Los intrpretes son programas que simplemente ejecutan las instrucciones que encuentran en el texto fuente. En muchos casos coexisten en memoria el programa fuente y el programa intrprete. Ntese que en este caso todo se hace en tiempo de ejecucin. Un ejemplo de lenguaje interpretado es BASIC. La ejecucin de un programa compilado es mucho ms rpida que la de un programa interpretado. Sin embargo los intrpretes son ms interactivos y facilitan la puesta a punto de programas.

Arquitectura En la

de de los para particular

las los ms el del

computadoras procesadores de lenguajes, los utilizados por los

disciplina son

compiladores programadores el caso

desarrollo de aplicaciones. En desarrollo de compiladores, hay arquitectura de la computadora

que tener bien definida la

Cmo se pueden ejecutar las aplicaciones desarrolladas para otras arquitecturas de computadoras en la nueva arquitectura? El problema planteado anteriormente no slo es aplicable a la construccin de nuevas arquitecturas, sino tambin cuando es necesaria la compatibilidad de aplicaciones entre diferentes sistemas operativos y arquitecturas de computadoras. Algunas de las tcnicas utilizadas para realizar migraciones de aplicaciones entre distintas arquitecturas y sistemas operativos se muestran en la siguiente figura:

Un intrprete software o emulador de software es un programa en cdigo binario que lee una a una las instrucciones binarias de la arquitectura antigua de las computadoras, que se encuentran en un archive ejecutable, y las interpreta. Los intrpretes no son muy rpidos, pero pueden construir y adaptar a distintas arquitecturas sin excesivos costos de desarrollo. Algunos ejemplos de intrpretes software binario son: Emuladores de DOS para distintos sistemas operativos (SoftPC de Insignia Solutions). Intrpretes de la mquina abstracta JVM (Java Virtual Machine) para distintas plataformas y que permiten ejecutar los cdigos binarios denominados bytecode (ficheros con la extensin .class). Un emulador hardware trabaja de forma similar a un intrprete de software, pero est implementado en HW de forma que decodifica las instrucciones de la arquitectura antigua y las traduce a la nueva arquitectura. Un ejemplo de emulador de hardware son los microprocesadores Java, que emulan la mquina abstracta JVM (Java Virtual Machine). Un traductor entre cdigos binarios o ensambladores son conjuntos de instrucciones de la nueva arquitectura que reproducen el comportamiento de un programa en la arquitectura antigua (la informacin de la mquina antigua se almacena en registros de la nueva mquina). Un ejemplo de estos traductores son los desarrollados por DEC (Digital

Equipment Corporation) para traducir instrucciones de la arquitectura VAX y MIPS a la nueva arquitctura ALPHA. Un compilador nativo es aqul que toma un programa fuente antiguo y lo vuelve a compilar (recompilar) con compiladores desarrollados para la nueva arquitectura. Son los ms rpidos y ptimos con respecto a las dems tcnicas, pues produce la mejor calidad del cdigo objeto.

Programacin de Sistemas 2011-B.

Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

I PARTE. Valor 5% PROGRAMAS COMPILADOS C Y C++. Los lenguajes de programacin compilados(C, C++, FORTRAN, etc), necesitan pasar por una serie de pasos que son definidos por su compilador. La compilacin (Como se menciono anteriormente), es el proceso de traduccin de programas fuente a programas objeto. El programa objeto obtenido de la compilacin ha sido traducido normalmente a cdigo mquina. Para conseguir el programa mquina real se debe utilizar un programa llamado montador o enlazador (linker). El proceso de montaje conduce a un programa en lenguaje mquina ejecutable. Estos son los pasos necesarios para ejecutar un programa escrito en un lenguaje de programacin y compilado mediante un compilador):

EJERCICIO 1. Proceso de ejecucin Para analizar como es el proceso de ejecucin de un programa en C, se describe a continuacin los pasos necesarios para compilar y ejecutar un pequeo cdigo de programa en C: La primera operacin es introducir las instrucciones (sentencias) del programa, con un editor de texto. Crear una carpeta, en el Escritorio (Digitar su nombre) Crear un proyecto en Visual C++, dentro de la carpeta de trabajo (la que creo en el Escritorio) Utilizar el editor de Visual C++, y digite el siguiente cdigo: //Este programa contiene un error para que sea detectado por el compilador #include <stdio.h> //librer a de C int main() { int n; //declaraci n de variable printf("Digite un numero: "); //mensaje en pantalla scanf("%d", &x); //lectura del nmero ( x no est declarado) printf("%d", n); //se imprime el numero return 0; } Guarde el programa como EjemploC.

Etapa de Compilacin Aqu se traduce el cdigo fuente escrito en lenguaje C a cdigo mquina (entendible por la computadora). En este caso, cada compilador se construye para un determinado lenguaje de programacin. Al respecto, se ejecutar un programa bajo un compilador de C que forma parte del programa EID (Entorno Integrado de Desarrollo) de Visual C++. El compilador de Visual C++ (compatible para lenguaje C), leer el programa del archivo de texto creado anteriormente y comprueba que siga las reglas de sintaxis del lenguaje de programacin. Cuando el programa es compilado, el compilador traduce el cdigo fuente C (las sentencias del programa) en un cdigo mquina (cdigo objeto). El cdigo objeto consta de instrucciones mquina e informacin de cmo carga r el programa en memoria antes de su ejecucin, normalmente se almacena en disco con extensin .obj .o Realice lo siguiente: Compile el archivo editado, en el compilador de Visual C++ (c, o cpp) Que mensajes muestra el compilador__________________________________________________________________ _________________________________________________________________________________________________ Cul sera la sintaxis correcta_________________________________________________________________ Para crear el archivo ejecutable (ejemploc.exe), ejecute el archivo ya compilado ejemploc, el resultado se verificar en la carpeta Debug del proyecto. El archivo objeto contiene solamente la traduccin del cdigo fuente. Esto no es suficiente para ejecutar el programa.

Programacin de Sistemas 2011-B.

Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

Es necesario incluir los archivos de biblioteca (p.e. stdio.h). Una biblioteca es una coleccin de cdigo que ha sido programada y traducida para ser utilizada en el programa.

Etapa de montaje (Linkage) Normalmente un programa consta de diferentes unidades o partes de programa que se han compilado dependientemente. Por consiguiente puede haber varios archivos objeto. Un programa especial llamado enlazador (linker), tome el archivo objeto y las partes necesarias de la biblioteca del sistema y construye un archivo ejecutable (.exe).

Etapa de ejecucin Finalmente el programa es ejecutado (*.exe). Para ejecutar el programa digite el nombre del archivo ejecutable (ejemploc.exe): Compruebe la ejecucin satisfactoria del programa. Haga una descripcin del programa ejecutado _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ ____________________________________________________________________________________________

Programacin de Sistemas 2011-B.

Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

II PARTE. Valor 5% PROGRAMAS INTERPRETADOS QBASIC. Un intrprete (como se mencion anteriormente) es un traductor que toma un programa fuente, lo traduce y a continuacin lo ejecuta. Los programas intrpretes clsicos como BASIC, prcticamente ya no se utilizan, aunque versiones como Qbasic y QuickBASIC todava se encuentran en algunos sistemas operativos. Los intrpretes analizan una sentencia y la ejecutan (lnea por lnea), y as sucesivamente para todo el programa fuente. El principal problema de un intrprete es que si a mitad del programa fuente se producen errores, se debe volver a comenzar el proceso de anlisis y ejecucin del programa. EJERCICIO 2. Proceso de ejecucin Para analizar como es el proceso de ejecucin de un programa interpretado, realice los siguientes pasos para probar y ejecutar un pequeo cdigo de programa escrito en Qbasic: Desde la lnea de comando digite lo siguiente: qbasic (c:\Lab1\qbasic). (Es probable que no pueda crear carpeta en el directorio raz, ubquese dentro del Escritorio o Mis documentos) Una vez cargada la aplicacin escriba el siguiente cdigo: Recordando programar en Qbasic DIM n S INTEGER declaracin de variable INPUT "Digite un numero: ", x lectura de una variable no declarada 'x' PRINT "El numero digitado fue: ", n END Guarde el programa como ejemploB.bas en la carpeta de trabajo (Lab1). Para ejecutar el programa presione F5. Durante la ejecucin del programa pruebe las siguientes entradas: o Cuando el programa muestra el mensaje de Digite un nmero en lugar de un nmero digite una letra y

observara como Qbasic genera un mensaje de error y vuelve a interpretar esa lnea. o Como usted habr notado al intrprete no le interesa si x est declarado, esta es una caracterstica propia del

lenguaje. Obviamente es en x que se guarda el valor digitado y no en n. Salga de Qbasic y describa a continuacin lo que entiende por un compilador y un intrprete: _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ ____________________________________________________________________________________________

Programacin de Sistemas 2011-B.

Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

PARTE III. Valor 10 % PROGRAMAS COMPILADOS E INTERPRETADOS JAVA. Antes de probar la ejecucin de un programa en JAVA, se mencionan a continuacin algunas de sus caractersticas: Es simple. Los programadores en Java dejan fuera muchas de las capacidades innecesarias de otros lenguajes de alto nivel. Por ejemplo, Java no soporta matemticas de puntero, casting implcito de tipos de datos, estructuras, uniones, operadores cargados (overloading), plantillas, archivos de cabecera, o herencia mltiple. Orientado a objetos. As como C++, Java usa clases para organizar el cdigo en mdulos lgicos. En tiempo de ejecucin un programa crea objetos a partir de las clases. Dichas clases pueden heredar propiedades de otras clases. Tipeo esttico. Todos los objetos utilizados en un programa deben ser declarados antes de ser usados. Esto permite que el compilador de Java localice y reporte los conflictos de tipos. Compilado e Interpretado. Antes de ser ejecutado, un programa Java debe ser compilado, lo que resulta en un

archivo objeto (byte -code), similar a lenguaje mquina, el cual puede ser ejecutado por cualquier sistema operativo que posea un intrprete de Java. Esto hace pensar que Java es un lenguaje tanto compilado como interpretado. La diferencia de Java a otros lenguajes de programacin Un programa escrito en lenguaje Java (extensin .java ), se compila primero para traducir el programa fuente en un lenguaje intermediario llamado Java bytecodes , es decir, genera un archivo con formato binario denominado bytecode (extensin

.class ). Este archivo es independiente de la plataforma y es interpretado posteriormente en cualquier sistema operativo que disponga de un intrprete de bytecode (normalmente un navegador de Internet). Luego el intrprete analiza y ejecuta bytecode cada de instruccin Java en la

computadora. La compilacin solo ocurre una vez, la

interpretacin ocurre cada vez que el programa e s

ejecutado. La siguiente figura ilustra lo descrito anteriormente: Se puede pensar que los bytecodes Java son como las instrucciones en lenguaje mquina para la mquina virtual de Java (JVM). Cada intrprete de Java, ya sea una herramienta de desarrollo o un navegador Web que pueden correr applets, es una implementacin de mquina virtual de Java. Por lo tanto, un programa en JAVA puede correr en Windows XP, Windows Seven, Solaris o Macintosh siempre y cuando se tenga una implementacin de Java VM(mquina virtual).

EJERCICIO 3. Proceso de creacin e insercin de un applet en una pgina Web Para analizar como es el proceso de ejecucin de un programa en Java, se utilizaran applets. Los applets son similares a las aplicaciones, pero ellos no corren de forma independiente. En su lugar, utilizan un navegador o browser (con Java habilitado o compatible) para su ejecucin. Antes de crear el applet, deber configurar una variable de entorno path, de modo que contenga el directorio de binarios de Java (JDK): Primero verifique que la variable de entorno PATH este establecida para su sistema. Para hacer esto, en la ventana de DOS abierta escriba path Se le mostrarn los directorios que han sido exportados como parte de PATH. Si se encuentra en la carpeta de trabajo, salga de ella y ubquese en el directorio raz (C:\). Escriba la orden siguiente: path=%path%;c:\DIRECTORIO DEL J2SDK Nuevamente verifique el estado de la variable de entorno PATH. Podr ver como el directorio donde se encuentra la aplicacin ha sido aadida al PATH. De esta manera podr ejecutar el compilador de Java (javac) estando en cualquier directorio de la unidad C. Cmbiese al directorio de trabajo: c:\Lab1.
Programacin de Sistemas 2011-B. Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

Creacin del Applet (Despliegue de texto). Una de las operaciones ms sencillas de entrada/salida en una applet es desplegar una lnea de texto. Pero debido a que la salida de texto debe ser grfica, es necesario utilizar las funciones de texto grfico de Java. De estas la ms comnmente usada es drawString() , la cual forma parte de la clase Graphics , contenida en el paquete awt .

Nota: Un paquete no es ms que una coleccin de clases relacionadas. El paquete awt (abstract Windows toolkit) contiene todas las clases que manejan grficos y ventanas grficas. Realice los siguientes pasos: Desde la lnea de comando digite notepad. (C:\Lab1\notepad). A continuacin digite el siguiente cdigo de un applet sencillo que despliega una lnea de texto: import java.awt.*; import java.applet.*; public class Applet1 extends Applet { public void paint(Graphics g) { g.drawString("Primer programa de Java!", 60, 75); } } Guarde el cdigo mostrado en un archivo llamado Applet1.java dentro de la carpeta de trabajo (Lab1). Como compilar el applet. La compilacin usando JDK (Java Development Kit) es sumamente sencilla. Solamente debe seguirse la misma sintaxis propuesta en la lnea de comando siguiente (por supuesto, debe estar ubicado en el directorio c:\Lab1): javac Applet1.java . A esta lnea solamente debe cambiarse el nombre del cdigo fuente para compilar otros applets. Cuando se realiza la compilacin se crea un archivo bytecode (.class), que en este caso se llama Applet1.class , el cual deber ser incrustado en una pgina web para ser ejecutado. Nota: Tenga en cuenta que el compilador de Java es case -sensitive, as que si en la lnea de cdigo anterior, el nombre del applet se ha escrito iniciando con maysculas (tal como en el obligatoriamente debe escribirse tambin con maysculas. ejemplo), el nombre del archivo Applet1.java

Insercin del applet en una pgina Web (Intrprete). La sintaxis general para la insercin de un applet es la siguiente: <applet y atributos> parametros contenido alternativo </applet> A continuacin se muestra todo el proceso a seguir para insertar un applet en una pgina de modo que pueda ser mostrado en una ventana del navegador: Cree una nueva pgina Web. Para esto, abra el programa Notepad (bloc de notas). Escriba el siguiente cdigo: < html> <head> <title>Prueba de Applets Java</title> </head> <body> <center><h1>Pagina de Prueba</h1></center> <center> <applet code="Applet1.class" width=200 height=150 name="Applet1"> </applet> </center> </body> </html> Guarde el archivo como ejemplo1.html .

Programacin de Sistemas 2011-B.

Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

Abra el archivo prueba.html usando cualquier Navegador. En este momento podr ver como el navegador interpreta y ejecuta el applet.

Puedes explicar el funcionamiento de este ejercicio_________________________________________________ ___________________________________________________________________________________________________ ___________________________________________________________________________________________________ ___________________________________________________________________________________________________ ___________________________________________________________________________________________________ ________________________________________________________________________________________

EJERCICIO 4. Ejecucin de un applet sin un navegador En la actualidad todos los navegadores han sido habilitados para dar soporte a applets de Java, todava podemos ver la ejecucin de un Applet sin necesidad de un navegador. Esto gracias a la herramienta Appletviewer provista como parte del JDK (Java Development Kit). Esta herramienta es una aplicacin de Windows, que puede ser ejecutada desde la lnea de comando de DOS. Para ejecutar el applet creado anteriormente usando el Appletviewer, escriba lo siguiente: appletviewer ejemplo1.html Que observas__________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ ____________________________________________________________________________________________

EJERCICIO 5. Entradas del usuario En este caso, debido a los despliegues eminentemente grficos que se obtienen en la ejecucin de un applet, no es tan sencillo llamar a una funcin o comando input Primero debe crearse un rea en la pantalla en la cual el usuario pueda digitar y editar su entrada. Existen diversas maneras de hacerlo, pero una de las ms prcticas es aadir un control de clase TextField al applet. Escriba el cdigo presentado a continuacin y gurdelo como Applet2.java . import java.awt.*; import java.applet.*; public class Applet2 extends Applet { TextField textField; /* Caja de texto */ public void init() { textField = new TextField(20); add(textField); } } Explicacin del Applet (Applet2.class): ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ _______________________________________________________________________________________________

Programacin de Sistemas 2011-B.

Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

EJERCICIO 6. Compile Applet2.java, de modo que obtenga Applet2.class. Luego inclyalo en una pgina Web y verifique el resultado de la ejecucin el Applet. Recomendacin: siempre que haga cambios en un applet y lo recompile, ser necesario cerrar la ventana del navegador (ya sea Firefox o Internet Explorer), para que el archivo de clase especificado en la pgina vuelva a ser ledo. De lo contrario no podr ver el resultado de dichos cambios.

Que observas__________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________ _______________________________________________________________________________________________________


EJERCICIO 7. Recuperacin de texto desde controles Escriba el siguiente cdigo y gurdelo como Applet3.java.
import java.awt.*; import java.applet.*; public class Applet3 extends Applet { TextField textField; public void init() { textField = new TextField(20); add(textField); } public void paint(Graphics g) { string s = textField.getText(); g.drawString(s, 40, 50); } public boolean action(Event event, Object arg) { repaint(); return true; } }

Explicacin del Applet (Applet3.class): ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________

Programacin de Sistemas 2011-B.

Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

PARTE IV. Valor 10 % PROGRAMAS EN BASH 1. Con un editor de texto de Linux: a) Escriba las siguientes lneas de cdigo para verificar el uso de entradas y salidas: #!/bin/bash echo Ingrese su nombre: read a echo Ingrese su apellido: read b echo Su nombre completo es : $a $b Guarde el documento como un mensaje de texto. Luego ejecute las lneas de cdigos anteriores usando el comando bash: [usuario@linux ~] $ bash mensaje Escribe que observas, que sucedi?________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ____________________________________________________________________________________________ b) Escriba las siguientes lneas de cdigo: #!/bin/bash echo Indique el archivo a buscar: read a var =ls l $a echo $var $var

Cul es el uso de $a dentro de la expresin var=ls l $a ?, Ejecute el cdigo anterior usando el comando bash: [usuario@linux ~] $ bash listado Escribe que observas, que sucedi?________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ _____________________________________________________________________________________________ c) Cul es el resultado del siguiente cdigo? #!/bin/bash a=ls -l $a echo Ingrese un nombre de directorio: read b var=mkdir $b $var $a De acuerdo a la salida generada para que se usa md $b ? Escribe que observas, que sucedi?________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ____________________________________________________________________________________________ d) Cul es el resultado del siguiente codigo? #!/bin/bash echo Ingrese un nombre de usuario: read b var=sudo adduser $b $var De acuerdo a la salida generada para que se usa adduser $b ? Qu modificaciones deben ser realizadas para agregar a el grupo Trabajo? Escribe que observas, que sucedi?________________________________________________________________ ______________________________________________________________________________________________________ ______________________________________________________________________________________________________ ____________________________________________________________________________________________

Programacin de Sistemas 2011-B.

Prof. Pablo A. Villarreal R. (M.Ed)

Ingeniera de Computacin

Programacin de Sistemas 2011-B.

Prof. Pablo A. Villarreal R. (M.Ed)

Potrebbero piacerti anche