Lp13

767 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
767
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Lp13

  1. 1. Lenguajes deprogramaciónAbdiel E. Cáceres GonzálezInstituto Tecnológico de Monterrey Campus Ciudad de México Verano 2004 Tower of Babel by Gustav Dore 1986 1
  2. 2. MétodosUn método de una clase define las operaciones que una instancia de la claseejecutará cuando se reciba un mensaje correspondiente a ese método. En ciertosentido, los métodos son como las definiciones de funciones, incluyendo el uso deparámetros y la capacidad de regresar valores. 2
  3. 3. MétodosLa forma sintáctica general de un método en Smalltalk es: patrón_del_mensaje[ |variables temporales| ] sentenciasdonde los corchetes son meta-símbolos que indican que lo que se encuentra dentrode ellos es opcional. 3
  4. 4. MétodosDado que Smalltalk no tiene declaraciones de tipo, las variables temporales, cuandoestán presentes, sólo necesitan ser nombradas en una lista. Las variables temporalesexisten sólo durante la ejecución del método en el cual están listadas. No hay signosde puntuación al final de un método.El mensaje del patrón corresponde a las sentencias procedurales de lenguajesimperativos tales como Pascal. Los patrones de mensajes, los cuales son prototipospara los mensajes, pueden estar en una de dos formas básicas. 4
  5. 5. MétodosPara los mensajes unarios o binarios, sólo se incluye el nombre del método. Para losmensajes de palabra clave, se incluyen las palabras clave y los nombres de losparámetros del patrón de mensaje.Para indicar que un método regresará un valor, se utiliza la flecha hacia arriba (^). Enmuchos casos, esta es la última expresión que aparece en el método. Si no seespecifica un valor de retorno en un método, el objeto receptor mismo es el valor deretorno. 5
  6. 6. ClasesTodos los objetos de Smalltalk son instancias de clases. Una clase tiene cuatropartes:1) Un nombre (de la clase).2) El nombre de la superclase, el cual especifica la posición de la nueva clase en lajerarquía de clases del sistema.3) Una declaración de las variables locales, llamadas variables instanciadas. Estasdeclaraciones estarán disponibles a las instancias de la clase.4) Los métodos que definen cómo responderán las instancias de la clase a losmensajes. (Recordemos que un objeto hereda también el método de todas las clasesque son sus ancestros). 6
  7. 7. ClasesLos mensajes a un objeto normalmente hacen que se busque un métodocorrespondiente en la clase a la que el objeto pertenece. Si la búsqueda falla, secontinúa ésta en la superclase de esa clase y así sucesivamente, hasta llegar a la clasedel sistema, llamada “Object”, la cual no tiene superclase.Si no se encuentra un método en ninguna parte de esa cadena, entonces ocurre unerror. Es importante recordar que este método de búsqueda es dinámico. 7
  8. 8. ClasesEjemplo de una definición de clase:"Smalltalk Example Program""The following is a class definition, instantiations of which can draw equilateral polygons of any number of sides"class name Polygonsuperclass Objectinstance variable names ourPen numSides sideLength "Class methods" "Create an instance" new ^ super new getPen 8
  9. 9. Clases"Get a pen for drawing polygons"getPen ourPen ← Pen new"Instance methods""Draw a polygon"draw numSides timesRepeat: [ourPen go: sideLength; turn: 360 // numSides]"Set length of sides"length: len sideLength len"Set number of sides" sides: num numSides num 9
  10. 10. ClasesSmalltalk sigue el Principio de Abstracción al agrupar los objetos que tienencomportamiento y propiedades similares bajo la misma clase. Nótese quesimultáneamente, los particulares que distinguen un objeto de otro se omiten.Este enfoque resulta ideal para simulación y es una muestra de la fuerte influenciade Simula-67 en Smalltalk.La memoria privada de una instancia de una clase contiene sus variablesinstanciadas.Las variables instanciadas no son visibles a otros objetos. Cada variable instanciadase refiere a un objeto, al que se denomina “valor”. Los valores de todas las instanciasde una cierta variable representan (en su conjunto) el estado actual de esa instancia. 10
  11. 11. ClasesLas variables instanciadas pueden ser “nombradas” o “indizadas”. Las variables nombradas corresponden a apuntadores a tipos distintos de los arreglos en un lenguaje imperativo. Las variables indizadas no se accesan mediante su nombre, sino mediante los mensajes que usan parámetros enteros.La mayor parte de las variables indizadas se usan de tal forma que corresponden aarreglos en lenguajes imperativos convencionales, aunque la indización misma serealiza a través del paso de mensajes. 11
  12. 12. ClasesEl parámetro entero en un mensaje se usa para referenciar una variable indizadainstanciada y corresponde al subíndice de un arreglo en un lenguaje imperativoconvencional.Las instancias de una clase se crean enviando el mensaje “new” a la clase en unaasignación, la cual hace que la variable a su izquierda haga referencia al nuevo objetorecién creado.Por ejemplo: ourPen ← Pen newcrea una instancia de la clase “Pen” (enviando el mensaje “new” a la clase “Pen”). 12
  13. 13. ClasesEsto también hace que la variable “ourPen” haga referencia a esta nueva instanciade la clase “Pen”. Este ejemplo demuestra que pueden enviarse mensajes tanto a las clases como a los objetos.Las variables de Smalltalk no tienen tipo; cualquier nombre puede asociarse concualquier objeto.El único chequeo de tipos que se efectúa ocurre dinámicamente cuando un mensajese envía a un objeto. 13
  14. 14. Chequeo de TiposSi el objeto es una de sus clases previas (ancestro), entonces tiene un método para elmensaje, el mensaje es legal y el objeto reacciona a él. Si no hay método quecorresponda a un mensaje, ya sea en el objeto en una de sus clases ancestrales,entonces se produce un error en tiempo de ejecución.Este es un concepto de chequeo de tipos significativamente diferente del utilizadoen los lenguajes imperativos. El chequeo de tipos en Smalltalk tiene como objetivosimplemente asegurar que un mensaje corresponde a un cierto método.Advierta que el chequeo dinámico de tipos no implica en este caso un chequeo débilde tipos. Smalltalk tiene un chequeo fuerte de tipos, a pesar de que éste es dinámico(en vez del chequeo estático de lenguajes como Pascal y Ada). 14
  15. 15. Chequeo de TiposUna ventaja del chequeo dinámico de tipos es su flexibilidad, ya que podemos hacerel mismo trabajo que con los paquetes genéricos de Ada, pero sin recurrir a lainherente complejidad de esa técnica.Puesto que Smalltalk es un lenguaje interpretado y no compilado, el activar mensajesen tiempo de ejecución es algo aceptable y la motivación para detectar tan tempranocomo sea posible un error que se aplica a los lenguajes compilados no tiene razón deser en este caso.Asimismo, no hay violaciones al Principio de Seguridad, porque Smalltalk siguechecando si un objeto tiene un método que responda a un cierto mensaje y, de noencontrarlo, activa un error. De tal forma, se impide que el programa se colapsedebido a violaciones al sistema de tipos. 15
  16. 16. HerenciaLa herencia es naturalmente un concepto central en Smalltalk. El sistema deSmalltalk incluye una enorme jerarquía de clases. La programación en Smalltalkconsiste, en gran medida en crear subclases de las clases existentes.Es precisamente este reuso potencial de código existente lo que resulta másinteresante y valioso sobre el mecanismo de herencia. De hecho, la herencia esquizás la contribución más importante de los lenguajes orientados a objetos. 16
  17. 17. HerenciaLas subclases pueden construirse basadas en el comportamiento de sus superclases,pero también pueden modificarlo. Recordemos que en los lenguajes estructurados,una redeclaración de una variable anula la declaración previa.Lo mismo ocurre en Smalltalk con los métodos: la definición de un método en unasubclase anula cualquier definición que pueda existir de ese mismo método en sussuperclases.Un objeto puede enviarse un mensaje a sí mismo porque es un miembro de susuperclase. Como puede verse, Smalltalk es un sistema muy extensible, en el cual elreuso de software tiene un significado real. 17
  18. 18. HerenciaUn problema con las jerarquías definidas en Smalltalk es que su organización impideel uso de una clasificación ortogonal. En la vida real, frecuentemente nosencontramos con objetos que deben ser clasificados de varias formas diferentes.Por ejemplo, un biólogo podría clasificar a los mamíferos como primates, roedores,rumiantes, etc. Alguien interesado en los usos de los mamíferos podría clasificarloscomo mascotas, bestias de carga, fuentes de comida, etc. Finalmente, un zoológicopodría clasificarlos como Norteamericanos, Sudamericanos, Africanos, etc. 18
  19. 19. HerenciaEstas son 3 clasificaciones ortogonales: cada una de las clases corta a través de lasotras en ángulo recto. En Smalltalk, el programador está forzado a violar ya sea elPrincipio de Seguridad o el de Abstracción, a fin de modelar una clasificaciónortogonal.Es decir, tenemos que repetir atributos de algunos objetos en otras clases (violandoel Principio de Abstracción) o tenemos que efectuar una clasificación anidada declases (violando el Principio de Seguridad). La fuente del problema es que un objetopuede pertenecer a sólo una clase a la vez.Cuando se define una clase, puede especificarse que será una subclase inmediata deexactamente una clase (y sólo una). Una solución posible a este problema que siguesiendo tema de investigación es permitir la herencia múltiple. 19
  20. 20. Implementación: Clases y Objetos Others SmalltalkUna de las cosas más interesantes de Smalltalk esque la mayor parte de su sistema está escrito en 3%Smalltalk.Esto incluye el compilador, el de-compilador, eldepurador, los editores y el sistema de archivos.En total, esto constituye alrededor del 97% del 97%código de Smalltalk. 20
  21. 21. Implementación: Clases y ObjetosUna de las razones principales por las cuales Smalltalk puede programarse enSmalltalk es que la mayor parte de las estructuras de datos de la implementación,tales como los registros de activación del lenguaje, son objetos de Smalltalk.Esto significa que pueden ser manipulados mediante programas en Smalltalk y quetienen las propiedades de los objetos de Smalltalk (por ejemplo, se auto-despliegan).La parte de Smalltalk que no es portátil es llamada “Máquina Virtual deSmalltalk-80”; su tamaño va de 6 a 12K en ensamblador. Los diseñadores deSmalltalk aseguran que toma alrededor de un año producir una versióncompletamente depurada de una “Máquina Virtual de Smalltalk”. Estohace de Smalltalk un excelente ejemplo del Principio de Portabilidad. 21
  22. 22. Implementación: Clases y ObjetosLa Máquina Virtual de Smalltalk tiene 3 componentes principales:1) Manejador de Almacenamiento: Es el manejador de tipos de datos abstractos paralos objetos. Encapsula la representación de los objetos y la organización de lamemoria.Las únicas operaciones que otros módulos pueden realizar sobre los objetos sonaquellas proporcionadas por el Manejador de Almacenamiento (Storage Manager): 1) Tomar la clase de un objeto. 2) Tomar y almacenar los campos de los objetos. 3) Crear nuevos objetos. 22
  23. 23. Implementación: Clases y ObjetosPuesto que el Manejador de Almacenamiento tiene que ser capaz de crear nuevosobjetos, debe poder obtener espacio libre donde colocarlos, también. Por lo tanto,otra responsabilidad del Manejador de Almacenamiento es colectar y manejar elespacio libre de memoria.Para este propósito, usa una estrategia de conteo de referencias con extensionespara poder manejar estructuras cíclicas. 23
  24. 24. Implementación: Clases y Objetos2) Intérprete: Es el corazón del sistema de Smalltalk.Aunque sería posible interpretar directamente las formas escritas en Smalltalk, esmás eficiente si el intérprete opera sobre una forma intermedia del programa. Elintérprete es esencialmente el manejador de tipos de datos abstractos para losmétodos. 24
  25. 25. Implementación: Clases y ObjetosSubrutinas Primitivas: Es simplemente una colección de los métodos que, porrazones de desempeño, se implementan en lenguaje máquina en vez de hacerse enSmalltalk. Aquí se incluyen las funciones básicas de entrada/salida, la aritmética conenteros, el indizamiento de los objetos que lo requieren (p.ej., los arreglos) y lasoperaciones gráficas básicas.La representación de un objeto debe contener sólo la información que varía deobjeto a objeto. La información que sea igual para una clase de objetos se almacenaen la representación de dicha clase. 25
  26. 26. Representación de ObjetosLa información que varía entre las instancias de una clase es simplemente lacorrespondiente a las variables de instanciación. La información almacenada con laclase incluye los métodos de la clase y los métodos de la instancia.Puesto que necesitamos saber la clase a la que pertenece cada objeto, larepresentación de un objeto debe contener alguna indicación de su clasecorrespondiente.Hay varias formas de hacer eso: la forma más simple es incluir en la representacióndel objeto un apuntador a la estructura de datos que representa la clase. 26
  27. 27. Representación de ObjetosB1 box len. 6 B2 len. 6 c.d. c.d. loc loc 500@600 tilt tilt size size scribe scribe len. 4 point c.d. 500 x y 200 27
  28. 28. Representación de ObjetosAdemás de las variables de instanciación y de la descripción de la clase, cada objetotiene un campo de longitud requerido por el manejador de almacenamiento paraasignar, liberar y mover objetos en memoria.Puesto que el Smalltalk mantiene la regularidad en todo momento, no debierasorprendernos que las clases sean también objetos, los cuales son instanciaciones dela metaclase.Por lo tanto, las clases se representan en la misma forma que los objetos, pero conun apuntador a la metaclase. Las variables instanciadas de una clase contienenapuntadores a los objetos que representan la información que es igual para todas lasinstancias de la clase. 28
  29. 29. Representación de la clase Object classbox class string len 8 “box” c.d. class name displayObject superclass string inst.vars “loc tilt size scribe” class msgs. ist. msgs. messageDictionary inst. size 4 message dict. messageDictionary message dict. 29
  30. 30. Representación de ClasesEsta información incluye lo siguiente: El nombre de la clase La superclase (la cual es “object” si no se especifica otra) Los nombres de las variables instanciadas El diccionario de mensajes instanciadosAdvierta que en este caso es necesario conocer el número de variables instanciadaspara determinar la cantidad de almacenamiento requerida. Si no tuviésemos estecampo, sería más lento efectuar instanciaciones de objetos. 30
  31. 31. Representación de ClasesPuesto que sería demasiado lento que el intérprete tuviese que decodificar elformato fuente de un método cada vez que el método fuese ejecutado, es una buenaidea compilar los métodos en alguna forma de pseudo-código que puedainterpretarse rápidamente.Por otra parte, el formato fuente de los métodos se requiere para editar y desplegarlas definiciones de la clase. Por lo tanto, los diccionarios de mensajes contienen dosentradas para cada formato del mensaje: una que contiene el formato fuente delmétodo y otra que contiene una forma compilada.Para encontrar estas entradas en el diccionario de mensajes, se utilizan técnicas de“hashing”. 31
  32. 32. Representación de los Registros de ActivaciónEl paso de mensajes en Smalltalk es muy similar a la invocación de procedimientosen los lenguajes estructurados. Por lo tanto, no debiera sorprendernos que se usentécnicas de implementación muy similares, aunque con algunas diferenciasimportantes.Hemos visto que los registros de activación (RAs) son el vehículo principal para laimplementación de procedimientos. Puesto que un RA tiene toda la informaciónpertinente a una activación del procedimiento, el proceso de invocar unprocedimiento y regresar de él puede entenderse como la manipulación de RAs.Lo mismo aplica a Smalltalk: usaremos registros de activación para conservar toda lainformación relevante a una activación de un método. 32
  33. 33. Representación de los Registros de ActivaciónLa estructura de un RA en Smalltalk es muy similar a la usada en los lenguajesestructurados: 1) Parte del ambiente: El contexto a usarse para la ejecución del método. 2) Parte de la instrucción: La instrucción a ejecutarse cuando este método continúa. 3) Parte del remitente: El registro de activación del método que envió el mensaje invocando este método (esto es similar a la liga dinámica). 33
  34. 34. Representación de los Registros de ActivaciónSe usa un sistema de coordenadas en dos dimensiones para identificar instrucciones: Un apuntador al objeto identifica el método-objeto que contiene todas las instrucciones de un método. Un desplazamiento relativo que identifica la instrucción en particular dentro del par método-objectEste direccionamiento en coordenadas bidimensionales es necesario porque eldireccionamiento de instrucciones pasa a través del manejador de almacenamiento.Esto último indica que nos adherimos al Principio de Ocultamiento de Información.La parte del ambiente debe proporcionar acceso tanto al ambiente local como al nolocal. 34
  35. 35. Representación de los Registros de ActivaciónEl ambiente local incluye espacio para los parámetros del método y para las variablestemporales. Esta parte del registro de activación debe proporcionar espacio paravariables temporales ocultas tales como los resultados intermedios de lasexpresiones.El ambiente no local incluye a todas las otras variables visibles (es decir, las variablesinstanciadas y las variables de la clase). Las variables instanciadas se almacenan en larepresentación del objeto que recibió el mensaje. Por lo tanto, un simple apuntadora este objeto las vuelve accesibles. 35
  36. 36. Representación de los Registros de Activación instanceActivation record parameters length locals temporary vars. c.d. intermediates non locals static link instance vars. method instruction part instruction sender part dynamic link Class Superclass length length c.d. c.d. superclass superclass class class variables variables 36
  37. 37. Representación de los Registros de ActivaciónLa representación del objeto contiene un apuntador a la clase de la cual es unainstancia el objeto; por lo tanto, las variables de la clase también son accesibles vía lareferencia al objeto. Finalmente, puesto que la representación de la clase tambiéncontiene un apuntador a su superclase, las variables de la superclase son tambiénaccesibles.Advierta que el enfoque usado por Smalltalk para acceder ambientes no locales esmuy similar a la cadena estática que estudiamos anteriormente. En esa técnica, lacadena estática nos llevaba del ambiente activo más anidado al ambiente activo másexterior.En el caso de Smalltalk, la cadena estática nos lleva del método activo al objeto querecibió el mensaje, y de ahí hacia arriba, a través de la jerarquía de clases, hastaterminar en la clase “object” (la metaclase). 37
  38. 38. Representación de los Registros de ActivaciónAl igual que en los lenguajes estructurados, el acceso a las variables requiere conocerla distancia estática a la variable, de manera que se salte ese número de ligas de lacadena estática para llegar al ambiente que define la variable. 38
  39. 39. Paso y Regreso de MensajesCuando se envía un mensaje a un objeto, deben efectuarse los siguientes pasos: 1) Crear un registro de activación para el receptor (“callee”, en inglés). 2) Identificar el método que está siendo invocado extrayendo el patrón (template) del mensaje y buscándolo en el diccionario de mensajes de la clase del objeto receptor o en sus superclases. 3) Transmitir los parámetros al registro de activación del receptor. 4) Suspender al remitente (invocador) almacenando su estado en su registro de activación 5) Establecer una ruta (liga dinámica) del receptor al remitente, y establecer como activo el registro de activación del receptor. 39
  40. 40. Paso y Regreso de Mensajes primerArreglo at: 1 put: 5 1 3primerArreglo parameters locals temporary vars. 2 4 intermediates non locals static link instruction part method 5 instruction sender part dynamic link 40
  41. 41. Paso y Regreso de MensajesComo es de esperarse, regresar de un método debe revertir este proceso: 1) Transmitir el objeto retornado (si hay alguno) del receptor al remitente 2) Continuar la ejecución del remitente, restaurando su estado a partir de su registro de activaciónAdvierta que los registros de activación no son liberados de la memoriaexplícitamente, sino que se usa recolección de basura. El Manejador deAlmacenamiento crea el espacio libre y reclama espacio que un objeto ya no estáusando de vez en cuando.Este enfoque es muy diferente del usado en los lenguajes estructurados, en los cualeslos registros de activación ocupan posiciones contiguas en una pila. El enfoque deSmalltalk es menos eficiente, pero es más regular y más simple.La otra razón para no usar una pila tiene que ver con la concurrencia. Las pilas sóloson apropiadas si estamos lidiando con algo que siga una estructura LIFO (Last-In,First-Out). 41
  42. 42. Paso y Regreso de MensajesLos procedimientos en un lenguaje procedural siguen esta estructura, pero losprocedimientos en un lenguaje concurrente no. Por lo tanto, necesitamos un modelodiferente para lidiar con las tareas concurrentes en Smalltalk. 42
  43. 43. Puntos Finales sobre SmalltalkSmalltalk es un buen ejemplo de lo que puede hacerse con un lenguaje pequeño,simple y extremadamente regular.Smalltalk ha sido utilizado en un sinnúmero de aplicaciones: juegos, simulaciones,gráficos, inteligencia artificial, etc. 43
  44. 44. Puntos Finales sobre SmalltalkDado que Smalltalk no tiene tipos, hablar de polimorfismo no es muy adecuado,pero sí podemos mencionar que la sobrecarga se da de manera natural. No hayninguna razón por la que objetos de diferentes clases no puedan responder a unmismo mensaje.El diseño de Smalltalk ha sido guiado por varios principios muy valiosos:Simplicidad, Regularidad, Abstracción, Seguridad y Ocultamiento de Información.En general, ilustra un principio de MacLennan que no habíamos mencionado: elde la Elegancia. 44
  45. 45. Extensiones Orientadas a Objetos Varios lenguajes han sido extendidos para soportar el paradigma de orientación a objetos. Por ejemplo: LISP, C y Ada-83. Ada 95 posee nuevos mecanismos que hacen más flexible su manejo de clases y tipos. De hecho, se manejan clases como tipos especiales (restringidos) que pueden pasarse como parámetros pero no pueden usarse como tipos de variables.Sin embargo, el soporte de orientación a objetos en Ada es realmente muy complejoy costoso. Esto se debe a que se pretende agregar un nuevo mecanismo que implicatipos dinámicos sin sacrificar la estructura de un sistema de tipos estáticos. 45
  46. 46. Extensiones Orientadas a Objetos Bjarne StroupstrupC++ es una extensión orientada a objetos del popular lenguaje C. C++ fuedesarrollado también en Laboratorios Bell y es, en gran parte, responsabilidad deBjarne Stroupstrup. Las clases en C++ son una generalización del los registros (records) de C. C++ soporta objetos representados internamente a través de la declaración de clases. Nótese, sin embargo, que C++ permite herencia múltiple. Esto se debe, en buena medida, a que usa un sistema de tipos estático. 46
  47. 47. Extensiones Orientadas a ObjetosLos componentes de una clase en C++ pueden ser de tipo “public” (visibles a todomundo), “protected” (visibles en la clase y sus subclases) o “private” (visibles sólodentro de la clase). La programación orientada a objetos de C++ depende en buenamedida de las funciones virtuales.C++ se vale de los “templates” para implementar un mecanismo similar a lospaquetes genéricos de Ada.La mayor crítica al C++ se debe a que retiene las características estáticas (de lostipos, sobre todo) de C a fin de poder compilar ambos lenguajes. 47
  48. 48. Extensiones Orientadas a ObjetosJava ha sido foco de atención más recientemente y puede verse como una variantedel C++. En Java se han enfatizado aspectos de seguridad, robustez, portabilidad yasociaciones tardías. El enfoque principal del lenguaje es la programación enambientes de red y sistemas distribuidos.Java omite varias funciones de C++, como por ejemplo sobrecarga de operadores,apuntadores, coerciones excesivas y herencia múltiple (sólo se permite de maneramás restringida), pero a cambio agrega otras tales como recolección de basuraautomática y un chequeo seguro de tipos. 48
  49. 49. Extensiones Orientadas a ObjetosCLOS (Common LISP Object System) es una extensión bastante popular delLISP que permite que éste soporte orientación a objetos. CLOS proporcionaobjetos representados externamente dado que los métodos se implementan comofunciones genéricas. Dado que LISP tiene tipos dinámicos, éstos se mantienen enla orientación a objetos.Un detalle interesante de CLOS es que sí soporta herencia múltiple, pero elmecanismo para realizarla dista de lo trivial. Las reglas de la herencia múltipledeben expresarse en la forma de un algoritmo a fin de determinar la lista deprecedencia de clases que se requiere. 49

×