TEMA 10: Características de otros LOO.
Contenidos
1. Introducción
- De temas anteriores conocemos las características que debe tener un lenguaje de programación para ser considerado como orientado a objetos.
- También hemos hablado de la parte histórica de este paradigma de
programación:
- Se considera a Simula-67 como el primer LOO.
- Y a Smalltalk como el ejemplo icónico de LOO.
- En este tema vamos a ver de que manera otros LOO implementan algunos de los principios que hemos visto en la práctica sólo con C++.
2. Lenguajes elegidos
- SmalllTalk
- Objective-C
- Java
- C#
- Vala
- D
- Python
3. SmallTalk
- Surge en los años 70 en los laboratorios de investigación de XEROX ( XEROX PARC).
- Trataba de aunar las tareas de programación y gestión a nivel de S.O. del computador.
- Introdujo :
- El interfaz gráfico que conocemos hoy en día para comunicarnos con un ordenador, así como la metáfora del escritorio de una oficina en la pantalla del computador.
- El concepto de una máquina virtual para representar y ejecutar su código objeto. Este concepto lo han empleado luego lenguajes como Java y C#.
- Una biblioteca de clases y objetos reusables que facilitaban las labores del programador.
3.1. El lenguaje SmallTalk
- En SmallTalk todo es un objeto, incluso los tipos base de lenguaje y por tanto las constantes de estos.
- Tiene sólo herencia simple y con una clase base común:
Object
. - Es débilmente tipado.
- Dispone de un browser de clases.
- Dispone de recolección de basura.
- Tenemos diversas implementaciones disponibles, una de ellas bastante sencilla de instalar y usar en diversos S.O.: Squeak SmallTalk.
- El equivalente a this de C++ es self.
3.2. Ejemplos de código SmallTalk
- Hola mundo:
1: "Hello world Program" 2: 'Hello World!' printNl !
- Cáculo del factorial de un número:
1: factorial 2: "Answer the factorial of the receiver." 3: 4: self = 0 ifTrue: [^ 1]. 5: self > 0 ifTrue: [^ self * (self - 1) factorial]. 6: self error: 'Not valid for negative integers'
- Ejemplo de llamada al factorial:
1: Transcript show: 10 factorial.
- Ejemplo de un bucle:
1: 10 timesRepeat: [ 2: Transcript show:'hello'. 3: Transcript cr. 4: ].
3.3. Ejemplos de código SmallTalk
- Bucle for:
1: 1 to: 10 do:[ :i | 2: Transcript show:i. 3: Transcript show:' '. 4: Transcript show:i sqt. 5: Transcript cr. 6: ].
- Bucle sobre una coleccion:
1: #('a' 'b' 'c' ) do: [:each | 2: Transcript show: each. 3: Transcript cr. 4: ].
3.4. Ejemplos de código SmallTalk
- Los […] que acompañan al do: ¡son un objeto!:
1: |myArray myOperation| 2: 3: myArray := #('a' 'b' 'c' ). 4: myOperation := [:each | 5: Transcript show: each. 6: Transcript cr. 7: ]. 8: myArray do: myOperation.
4. Otros LOO
- En la década de los 80 comienza a imponerse el desarrollo de aplicaciones bajo el paradigma orientado a objetos.
- Lenguajes como SmallTalk o bien son interpretados o producen ejecutables lentos.
- Por tanto desarrolladores de compiladores de lenguajes de 3ª generación se plantean incorporar algunas de las características de la POO a este tipo de lenguajes.
- Surgieron así extensiones de lenguajes como Pascal y de C.
- En el caso de Pascal se creó Object Pascal y en el de C aparecieron varias extensiones para convertirlo en un LOO: C++, Objective-C y otras.
5. Objective-C
- Los creadores de Objective-C (Brad Cox y Tom Love) estaban muy influenciados por SmallTalk.
- La extensión que crearon de C es una mezcla de ambos lenguajes:
- Sintáxis de C para la parte procedural.
- Sintáxis de SmallTalk para la parte de POO.
- En los 80 y 90 Objective-C fue superado ampliamente en uso por C++. Pero en 1998 algo ocurrió…
- … NeXT Inc. licenció el uso de Objective-C y preparó el compilador de C de GNU (gcc) para que lo soportara. Se convirtió en el lenguaje de desarrollo de NeXTStep, más tarde OpenStep y más tarde OS-X / iOS.
5.1. El lenguaje Objective-C
- Dispone de herencia simple.
- Es fuertemente tipado pero de dispone de un tipo base id. Sería como una referencia a la clase base Object.
- En lugar de #include usa #import:
#import <stdio.h>
- Los ficheros de cabecera usan la extensión .h y los de implementación .m.
- Los mensajes a objetos se envían con notación de SmallTalk:
[obj method:parameter];
5.2. Ejemplos de código Objective-C
Puedes encontrar más en la página de la wikipedia.
Declaración de una clase:
1: // class.h 2: @interface classname : superclassname { ... } 3: +classMethod1; 4: +(return_type) classMethod2; 5: +(return_type) classMethod3: (param1_type)parameter_varName; 6: -(return_type) instanceMethod: (param1_type)param1_varName 7: secondParam: (param2_type)param2_varName; 8: @end
Implementación:
1: #import "class.h" 2: 3: @implementation classname 4: +classMethod { 5: // implementation 6: } 7: -instanceMethod { 8: // implementation 9: } 10: @end
5.3. Ejemplos de código Objective-C
- Se admite dar nombre a argumentos de métodos:
1: -(int)changeColorToRed:(float)red green:(float)green blue:(float)blue 2: [myColor changeColorToRed:5.0 green:2.0 blue:6.0];
- Creación de objetos
1: MyObject * o = [[MyObject alloc] init]; 2: ... 3: -(id) init { 4: self = [super init]; 5: if (self) {...} 6: return self; 7: }
6. Java
- Creado por Sun MicroSystems en 1995. Hoy en día es propiedad de Oracle Corp.
- Sintáxis muy parecida a la de C++.
- Es compilado y usa una máquina virtual (JVM) para respresentar y ejecutar su código objeto.
- Desde 2010 aproximadamente es uno de los lenguajes de programación más usados. El espaldarazo definitivo le vino por su uso en el S.O. Android de Google.
- Puede generar aplicaciones que funcionan tanto en la parte de escritorio como en la parte web.
6.1. El lenguaje Java
- Dispone de clases e interfaces.
- Fuertemente tipado con herencia simple de clases y múltiple de interfaces.
- Genericidad que permite crear una biblioteca de colecciones muy amplia y que ha marcado un estándar entre los programadores.
- Recolección de basura.
- No tiene destructores, si finalizadores. No hay archivos de cabecera e implementación.
- No puede haber funciones libres, incluso la función main en Java debe formar parte de una clase.
- No dispone de espacios de nombres pero si de paquetes: package. Estos deben ser importados donde se usan mediante la orden import.
6.2. Componentes de Java
- Disponemos de dos paquetes de software relacionados con Java:
- OpenJDK
- OpenJRE
- Disponemos de un compilador (javac) y de la máquina virtual para ejecutar el código compilado (java).
- Formando parte del JRE se encuentra la biblioteca de clases de Java (JCL).
- No es imprescindible pero si conveniente, para desarrollar en Java es bueno disponer de un IDE:
6.3. Ejemplos de código Java
Creación de una clase:
1: public class Model { 2: private Map<Character, FeatureVector> features; 3: /// Default constructor 4: public Model() { 5: features = new HashMap<>(); 6: } 7: ...
Herencia de clases:
1: package gtaligner; 2: import gtaligner.io.Messages; 3: import gtaligner.io.TextReader; 4: public class BWImage extends BufferedImage { 5: private int[] weights; 6: ....
6.4. Ejemplos de código Java
Herencia de interfaz:
1: public interface Sortable { 2: public bool isLessThan (Sortable b); 3: } 4: public class Line implements Sortable {...}
7. C# (C Sharp)
- Creado por Microsoft.
- Similar en arquitectura a Java. Dispone de una máquina virtual en la que se ejecuta el código compilado.
- A la plataforma creada por Microsoft para desarrollar y ejecutar código en C# (y otros lenguajes) se le llama .Net.
- C# se parece mucho A C++ en cuanto a sintáxis y palabras reservadas.
- Dispone de manera estándar de una biblioteca de clases muy amplia.
- .Net permite mezclar código objeto generado por diferentes lenguajes. Los tipos base de todos los lenguajes para .Net ocupan lo mismo.
7.1. El lenguaje C#
- Dispone de clases e interfaces.
- Fuertemente tipado con herencia simple de clases y múltiple de interfaces.
- Genericidad que permite crear una biblioteca de colecciones muy amplia.
- Recolección de basura.
- Tiene destructores pero se parecen más a los finalizadores de Java.
- No hay archivos de cabecera e implementación.
- Se recomienda desarrollar con VisualStudio o con la versión de código abierto visual studio code.
7.2. Ejemplo de código C#
- El siguiente código de ejemplo está tomado de aquí.
1: using System.Windows; 2: namespace MyCalculatorv1 3: { 4: public partial class App : Application 5: { 6: } 7: }
7.3. Ejemplo de código C#
1: using System; 2: using System.Windows; 3: using System.Windows.Controls; 4: namespace MyCalculatorv1 { 5: public partial class MainWindow : Window { 6: public MainWindow() { 7: InitializeComponent(); 8: } 9: private void Button_Click_1(object sender, RoutedEventArgs e) { 10: Button b = (Button) sender; 11: tb.Text += b.Content.ToString(); 12: } 13: private void Result_click(object sender, RoutedEventArgs e) { 14: try { 15: result(); 16: } 17: catch (Exception exc) { 18: tb.Text = "Error!"; 19: } 20: } 21: ...
7.4. Proyecto mono
- Mono es una implementación libre y de código abierto de .Net, de la máquina virtual y del compilador de C#.
- Ha permitido disponer de esta tecnología en S.O. distintos a Windows.
- Dispone de su propio IDE: MonoDevelop.
- El compilador libre que teneis instalado de C# se llama mcs.
8. Vala
- Vala es un lenguaje muy parecido a C#, aunque toma cosas de C++ y también de Java.
- Está asociado a proyectos de código abierto.
- Puedes ver documentación sobre el mismo aquí.
- Dispone de una biblioteca de colecciones llamada Gee.
- Permite crear aplicaciones con interfaz gráfico de usuario de manera muy sencilla, mira este vídeo.
8.1. El lenguaje Vala
- Dispone de clases e interfaces.
- Fuertemente tipado con herencia simple de clases y múltiple de interfaces.
- Genericidad que permite crear una biblioteca de colecciones muy amplia (Gee).
- Liberación de memoria basada en cuenta de referencias.
- Tiene destructores como en C++.
- Permite añadir métodos a tipos enumerados.
- Dispone de la emisión de señales y ejecución de código diferido en el mismo lenguaje.
- Al igual que en C# dispone de propiedades.
- No hay archivos de cabecera e implementación.
8.2. Ejemplo de código Vala
- Un ejemplo sencillo:
1: using GLib; 2: class Droid { 3: public Droid (string n) { 4: name = n; 5: } 6: public string name {get; set;} // propiedad: variable+set+get todo-junto 7: } 8: 9: int main () { 10: Droid d = new Droid ("correo"); 11: 12: stdout.printf("Nombre: %s\n", d.name); 13: return 0; 14: }
8.3. Características adicionales a Vala
- Dispone de una web con la documentación de todas las bibliotecas que tienen una adaptación a Vala.
- Realmente el compilador de Vala es un traductor a C.
- Se puede parar la compilación en el instante en el que se genera el código C y verlo.
- El compilador de vala se llama igual: valac. Lo tenéis instalado en la máquina virtual.
9. D
- Creado inicialmente por Digital Mars, fabricante de compiladores de C/C++.
- Trata de afrontar las pegas de C++ como LOO debido a su compatibilidad hacia atrás con C.
- Hoy en día su desarrollo se hace por parte de una comunidad y se cuenta con una fundación que promueve el desarrollo y uso del mismo.
9.1. El lenguaje D
- Dispone de clases e interfaces.
- Fuertemente tipado con herencia simple de clases y múltiple de interfaces.
- Genericidad al estilo de C++ (permite metaprogramación).
- Recolección de basura.
- Tiene destructores para clases parecidos a los finalizadores de Java y destructores similares a los de C++ para structs.
9.2. El lenguaje D
- Permite tener funciones libres, incluso permite anidar funciones.
- No dispone de espacios de nombres pero sí de módulos: module. Estos deben ser importados donde se usan mediante la orden import.
- Aquí dispones de un resumen de todas sus características.
- Existen tres compiladores de D. Todos ellos libres. Los puedes descargar de aquí.
9.3. Ejemplo de código D
Haciendo uso de notación funcional:
1: // Sort lines 2: import std.stdio, std.array, std.algorithm; 3: 4: void main() { 5: stdin 6: .byLineCopy // No es necesario usar () en la llamada 7: .array // si no hay argumentos 8: .sort 9: .each!writeln; 10: }
9.4. Ejemplo de código D
Uso de clases:
1: import std.stdio; 2: 3: class Base { 4: protected int y = 8; 5: private int n = 9; 6: } 7: 8: class Derived : Base { 9: public int get_n () { return n; } // We can access 'n' 'cause Base and 10: // Derived are declared in the same file! 11: public int get_k () { return k; } 12: 13: private int k = 0; 14: 15: ~this () { 16: writeln ("~Derived."); 17: } 18: } 19: 20: void main () { 21: Derived d = new Derived; 22: 23: writeln (d.get_k); 24: }
10. Python
10.1. Historia
- Creado a finales de los años 80.
- Su desarrollador inicial fue Guido van Rossum.
- Toda la documentación sobre el lenguaje la puedes encontrar en la web del mismo: python.
- Python admite diversos paradigmas de programación, entre ellos el Orientado a Objetos. También soporta el concepto de módulos como mecanismo de división del código fuente en varios archivos.
- Actualmente puedes encontrar dos versiones de python empleadas en producción: La versión ptyhon2 y la versión python3. Ten en cuenta que son incompatibles a nivel de sintáxis. Nosotros emplearemos la versión 3.
10.2. Python: Clases
- Se declaran y definen en el mismo archivo.
- Los métodos de instancia deben declarar explícitamente un primer
parámetro que representa el objeto al que se le envia el
mensaje. El convenio es llamarlo
self
. Los objetos se crean con la notacion que ya conocemos de
C++
:1: myObject = myClass()
El constructor invoca el método especial
__init__
:1: def __init__(self): 2: self.data = [] # Obligatorio el uso de self
10.3. Python: Clases
Debemos emplear
self
para llamar a otros métodos de la clase:1: class Bag: 2: def __init__(self): 3: self.data = [] 4: 5: def add(self, x): 6: self.data.append(x) 7: 8: def addtwice(self, x): 9: self.add(x) 10: self.add(x)
10.4. Python: Clases
Podemos declarar variables y métodos de clase :
class Complex: count = 0 def onemore(): Complex.count += 1 def __init__(self, realpart = 0.0, imagpart = 0.0): self.r = realpart self.i = imagpart Complex.onemore() def rpart(this): return this.r x = Complex(3.0, -4.5) x2 = Complex() print ("x.r = ", x.rpart()) print ("x2.r = ", x2.rpart()) print ("Complex numbers created: ", Complex.count) # -------------- Output: --------------------
x.r = 3.0 x2.r = 0.0 Complex numbers created: 2
10.5. Python: Clases
Admite herencia simple:
class DerivedClassName(BaseClassName): ...
Y también múltiple:
class DerivedClassName(Base1, Base2,...,BaseN):...
- Técnicamente no existe la visibilidad privada de identificadores definidos en una clase, pero se puede obtener un resultado parecido empleando como prefijos/sufijos símbolos de subrayado.
10.6. Python: Módulos
- Los módulos son la manera que Python tiene de permitirnos separar el código que escribimos en diversos archivos.
- Cada fichero se convierte en un módulo llamado como el archivo
pero sin la extensión
.py
. Los módulos se importan con la sentencia import:
import name-of-module
Los símbolos importados de un módulo pertenecen al espacio de nombres de ese módulo:
1: # Fibonacci numbers module, file: fibmod.py 2: def fib(n): # write Fibonacci series up to n 3: a, b = 0, 1 4: while a < n: 5: print(a, end=' ') 6: a, b = b, a+b 7: print() 8: .... 9: 10: # Main Program, file: main.py 11: import fibmod 12: fibmod.fib(200)
10.7. Python: Módulos
Se puede hacer visible un símbolo de un módulo importado con la construcción:
1: from fibmod import fib 2: fib(120)
Se admite el uso del carácter '*' como comodín:
1: from fibmod import * 2: fib(120)
Se permite el renombrado:
1: from fibo import fib as fibonacci 2: fibonacci(120)
- Los módulos se importan desde el directorio actual o desde los directorios definidos en la variable: sys.path.
- Esta variable contiene una lista de directorios donde residen los módulos estándar que vienen con la instalación de python, p.e. el módulo sys.
- Para más información sobre módulos consulta el tutorial.
10.8. Python: Depuración
- Para depurar un programa en Python podemos hacer uso del módulo
pdb
. - Este módulo define un depurador interactivo a nivel de código fuente. Podemos poner puntos de parada, ejecutar sentencias paso paso, movernos por la pila de llamadas, etc…
- Para más información consulta la página web de pdb.
11. Aclaraciones
- En ningún caso estas transparencias son la bibliografía de la asignatura, por lo tanto debes estudiar, aclarar y ampliar los conceptos que en ellas encuentres empleando los enlaces web y bibliografía recomendada que puedes consultar en la página web de la ficha de la asignatura y en la web propia de la asignatura.