17
Paradigmas de Programación Héctor Zárate Rea Universidad Nacional Autónoma de México Facultad de Ingeniería Ciudad de México, Noviembre de 2008. Profesor: Pedro Israel Rodríguez Pérez

Paradigmas de Programación

Embed Size (px)

DESCRIPTION

Este trabajo detalla brevemente los cuatro paradigmas de programación más relevantes junto con sus características: Imperativo, Funcional , Orientado a objetos y Lógico. Además, ofrece una introducción en la que son definidos varios conceptos esenciales dentro del tema y que intentan explorar más allá de las ciencias del cómputo.No pretende ser una guía profunda y extensiva acerca de cada uno de estos paradigmas pero sí tiene el propósito de que para sus lectores sea un primer acercamiento al tema que pueda ser fehaciente, claro, divertido y fácil de entender.

Citation preview

Page 1: Paradigmas de Programación

Paradigmas de ProgramaciónHéctor Zárate Rea

Universidad Nacional Autónoma de MéxicoFacultad de Ingeniería

Ciudad de México, Noviembre de 2008.

Profesor: Pedro Israel Rodríguez Pérez

Page 2: Paradigmas de Programación

ResumenEste trabajo detalla brevemente los cuatro paradigmas de programación más relevantes junto con sus características: Imperativo, Funcional , Orientado a objetos y Lógico. Además, ofrece una introducción en la que son definidos varios conceptos esenciales dentro del tema y que intentan explorar más allá de las ciencias del cómputo.

No pretende ser una guía profunda y extensiva acerca de cada uno de estos paradigmas pero sí tiene el propósito de que para sus lectores sea un primer acercamiento al tema que pueda ser fehaciente, claro, divertido y fácil de entender.

Es publicado bajo la licencia de Creative Commons:

Creative Commons Attribution-Noncommercial-Share Alike 2.5 Mexico

Page 3: Paradigmas de Programación

Tabla de Contenidos

1. Introducción

1.1 Lenguajes de Programación 2

1.2 Definición de Paradigma 3

2. Paradigmas de Programación

Programación Imperativa 5

Programación Funcional 6

Programación Lógica 8

Programación Orientado a Objetos 10

3. Conclusión

4. Recomendaciones

5. Bibliografía

6. Ilustraciones

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 1

Page 4: Paradigmas de Programación

1. Introducción

Me parece imposible hablar de paradigmas de programación sin antes saber qué signifi-ca el término paradigma, qué es un lenguaje de programación, y entender exactamente qué es el lenguaje. Así que me parece prudente empezar desde aquí.

Edward Sapir, definió el lenguaje como un método humano y no instintivo de comunicar ideas, emociones y deseos mediante un sistema de símbolos producidos vo-luntariamente1. Esta definición en principio se refiere a un lenguaje natural, que es aquel lenguaje hablado o escrito que usamos para la comunicación más cotidiana y ge-neral. No obstante, en este trabajo nos es de interés otro tipo de lenguajes llamados “lenguajes formales”.

Un lenguaje formal es un lenguaje donde existe una gramática que implementa el conjunto de concatenaciones (cadenas) posibles de un alfabeto finito particular. Esta gramática provee al lenguaje de 3 elementos importantes:

1. Un vocabulario de símbolos;

2. Reglas sintácticas para combinar estos símbolos en cadenas y fórmulas gramatical-mente correctas, y

3. Reglas semánticas para darle significado e interpretación a esas fórmulas.

Con esto, se obtiene un lenguaje en el que a diferencia de un lenguaje natural, sus sen-tencias no significan nada en particular2, ya que su significado aparece cuando les es dado un significado a sus símbolos, que no da cabida a ambigüedades y que carece del poder de crecer y evolucionar autónomamente.

1.1 Lenguajes de Programación

Los lenguajes de programación forman un subconjunto de los lenguajes formales. Me-diante ellos el ser humano puede comunicarse con una computadora y decirle qué es lo que tiene que hacer y, al mismo tiempo, sirven para comunicarse con otros seres huma-nos y expresarles qué es lo que se quiere que haga una computadora. Para terminar, vale la pena citar otra definición del lenguaje, esta vez por Bryan Higman, quien lo describió como: “(...) un conjunto de objetos llamados vocabulario que pueden ser combinados en cadenas lineales de acuerdo a ciertas reglas llamadas gramática. Esto, con el propósi-to de comunicarse con un receptor e inducir en él la realización de ciertas

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 2

1 Sapir, Edward, Language. Estados Unidos: BiblioBazaar, 2008. Página 17.

2 Shand, John. Fundamentals of Philosophy. Estados Unidos: Routledge, 2003.

Page 5: Paradigmas de Programación

actividades.”3. Ahora, entiéndase ‘receptor’ por cualquier tipo de computadora y nues-tra definición de lenguaje de programación esta lista.

1.2 Definición de Paradigma

¿Qué es un paradigma? Aunque la definición de paradigma que se encuentra en el dic-cionario de María Moliner (véase el recuadro amarillo) es cierta y suficiente, para esta

discusión necesitaremos de una más amplia.

Una búsqueda fugaz por Google, apunta a una relación entre el término paradigma y algún oscuro individuo llamado Thomas Kuhn, quien en su libro publicado en 1962, The Structure of Scientific Revolutions, amplió la

concepción del término paradigma. Para Kuhn, el término se refiere a la forma en que un científico percibe al mundo y a la estructura de teorías y suposiciones que modifican esta percepción. Otro punto importante para nuestro interés es el señalamiento que hace Kuhn acerca de cómo el éxito de un paradigma es consecuencia de su efectividad para resolver algún problema. En breve, un paradigma es el resultado de un proceso social en el cual un grupo de personas desarrolla nuevas ideas y crea principios y prác-ticas alrededor de estas ideas, y no solamente un conjunto de prácticas y conocimientos objetivamente validados.

Más específicamente para la ciencia de la computación, probablemente fue Ro-bert Floyd4 quien habló por primera vez del término Paradigmas de Programación y quien los definió como un proceso de diseño que va más allá de una gramática, reglas semánticas y algoritmos, sino que es un conjunto de métodos sistemáticos aplicables en todos los niveles del diseño de programas.

paradigma (del lat. "paradigma", del gr. "parádeigma")1 m. *Modelo o *ejemplo.

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 3

3 Higman, Bryan. A Comparative Study in Programming Languages. Reino Unido: MacDonald, 1967. (Traducción propia)

4 Sin asociación con la banda británica de rock psicodélico, Pink Floyd.

Page 6: Paradigmas de Programación

2. Paradigmas de Programación

Hoy en día, el uso de la computación es extremadamente diverso e intensivo, el cual va desde asistir el control de aeronaves o plantas nucleares, hasta aplicaciones tan críticas como determinar el tiempo de centrifugado en nuestra lavadora o reproducir en forma-to .mov la última producción estelarizada por Jenna Jameson. Todas estas distintas apli-caciones del cómputo han requerido del desarrollo de un sinnúmero de lenguajes de programación, cada uno con propósitos y formas distintas. No obstante, todos estos lenguajes pueden ser clasificados en una jerarquía de familias a partir del modelo que siguen para definir y operar información (Figura 1), es decir, que pueden ser jerarquiza-dos según el paradigma que siguen.

En una primera clasificación, se encuentran dos grandes grupos en donde es posible englobar casi todos los paradigmas de programación conocidos hasta ahora. Aunque existe un gran número de paradigmas, voy a enfocarme solamente a los más esenciales que son: programación imperativa; orientada a objetos; funcional, y lógica.

Figura 1: Clasificación general de los paradigmas de programación.

Paradigmas de Programación

Programación Declarativa Programación Imperativa

Funcional

Lógica

Orientada a Objetos

Visual, Orientada a Even-tos, Orientada a Aspectos,

etc.

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 4

Page 7: Paradigmas de Programación

Programación Imperativa

El término imperativo en este caso, no difiere esencialmente del modo gramático imperativo del español, donde una ora-

ción como: “¡Gutiérrez, cierre el Youtube y póngase a trabajar en lo que le pedí!” le esta indicando a un sujeto, presumiblemente flojo, que deje de perder el tiempo y, en lugar de

eso, realice el trabajo para el cual se le esta pagando. Es decir, es una orden para realizar

una acción específica. De forma similar, la pro-gramación imperativa consiste en una serie de co-mandos que una computadora ejecutará. Estos co-mandos detallan de forma clara y específica el cómo

hacer las cosas y llevarán al programa a través de dis-tintos estados. En nuestro ejemplo, con el Sr. Gutie-rrez, un comando resultó en un cambio de estado: de

“procastinador” a “productivo”.

Los elementos más importantes de este paradigma son:

• Variables: Son objetos cuyo valor depende de una localidad de memoria y que puede cambiar a lo largo de la ejecución del programa. La definición de este paradigma sería imposible sin estos elementos fundamentales, ya que los estados de un programa son representados y diferenciados por su conjunto de variables y sus contenidos.

• Tipos de datos: Son abstracciones que representan un conjunto de valores junto con las operaciones y relaciones que son aplicables a ellos. Algunos tipos comunes en va-rios lenguajes son: integer, que define parcialmente el conjunto de los números ente-ros, float, que representa números reales y boolean, que generalmente especifica al pe-queño conjunto conformado por true y false. Es importante recalcar que estos no son los únicos tipos de datos y que muchos lenguajes permiten la implementación de mu-chos otros.

• Expresiones: Aunque son la forma fundamental de programar instrucciones, en la programación imperativa su papel más importante está en las sentencias de asigna-ción. Una sentencia de asignación sirve para modificar el valor de una variable y así cambiar el estado de un programa. Esto puede ser algo muy sencillo como copiar el valor de una variable a otra localidad de memoria o involucrar algo más complicado como realizar operaciones sobre las variables antes de re-localizarlas en la memoria. Los operadores empleados pueden ser matemáticos, lógicos o una combinación de ambos.

• Estructuras de Control: Las estructuras de control son mecanismos que un lenguaje requiere para realizar dos tareas indispensables:

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 5

Page 8: Paradigmas de Programación

1. Seleccionar una opción entre algunos flujos de control alternativos, e

2. Iterar la ejecución de una serie de sentencias.

Una sentencia de selección provee al programa de medios para elegir entre dos o más “caminos” de ejecución. Su forma más sencilla es el condicional if que seleccio-na entre dos opciones y puede extenderse a una selección prácticamente infinita me-diante constructores múltiples (como switch o case) o la anidación5 de condicionales if.

Las sentencias de iteración representan el verdadero poder del cómputo, ejecu-tan un bloque de sentencias desde cero hasta un número teóricamente infinito de veces. Es interesante que todos los lenguajes de programación desde el primero6, que data de la década de los cuarenta, Plankalkül, implementaron estructuras de itera-ción. Estas se dividen en dos categorías principales dependiendo de cómo se contro-la la iteración. Pueden ser: controlados con contadores (tradicionalmente for) o con-trolados lógicamente (como while).

En esta categoría también estarían incluidas sentencias como goto, sin embargo, estas han caído en desuso y que, como señalo Dijkstra7, representan más desventajas que ventajas.

Excepto por los paradigmas lógico y funcional, todos los demás heredan muchas carac-terísticas de la programación imperativa.

Programación Funcional

El paradigma funcional esta basado en el concepto matemático de función8:

Una función f asigna a cada miembro de un conjunto X, exactamente un miembro de un conjunto Y.

Donde: El conjunto X y Y pueden o no ser el mismo y donde X es llamado dominio de f y Y es llamado co-do-minio o rango de f.

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 6

5 La anidación consiste en integrar estructuras de control dentro de otras.

6 Rojas Raul y Ulf Hashagen. The First Computers: History and Architectures. Estados Unidos: MIT Press, 2002. Página 277.

7 Dijkstra, Edsger W. Go To Statement Considered Harmful. Communications of the ACM. Vol. 11, No. 3, Páginas 147 y 148.Disponible en: <http://www.ifi.uzh.ch/req/courses/kvse/uebungen/Dijkstra_Goto.pdf>

8 Johnsonbaugh, Richard. Discrete Mathematics. Estados Unidos: Prentice Hall, 2008. Pagina 117.

Page 9: Paradigmas de Programación

El paradigma funcional considera al programa como una función matemática, donde el dominio representaría el conjunto de todas las entradas posibles (inputs) y el rango sería el conjunto de todas las salidas posibles (outputs). La forma en que funciona puede ser entendida como una caja negra:

Figura 2: Las entradas, llamadas parámetros, se operan mediante una definición y se obtiene una

salida llamada resultado.

Al observar la Figura 2, podríamos pensar que cualquier tipo de programación podría ser clasificada como programación funcional y esto es relativamente cierto a excepción de unos puntos claves:

• Primero, que en los lenguajes funcionales no existe el concepto de variables y conse-cuentemente tampoco existen operaciones de asignación. Aunque podría parecer que los parámetros de una función se comportan como una variable (puesto que pueden llevar un nombre y su uso es de hecho parecido al de las variables), esto es incorrecto: El valor de los parámetros es dado como fijo al inicio de la función.

• Segundo, la existencia de una propiedad llamada transparencia referencial (Referential transparency), la cual indica que una función sólo depende de sus parámetros y que tendrá efecto únicamente en su resultado, por lo que podríamos llamar a una función arbitrariamente sin tener efectos colaterales en el resto de las computaciones.

• Por último, que una función puede ser utilizada como parámetros y resultados de cualquier otra función.

Los lenguajes más utilizados dentro de este paradigma son Standard ML, Haskell y Scheme9 aunque al hoy por hoy LOGO10 figuraría junto con otros dialectos de LISP.

Parámetros Resultado

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 7

9 Goldberg, Benjamin. Functional Programming Languages. ACM Computing Surveys, Vol. 28, No. 1, Marzo 1996. Disponible en: <http://cs.nyu.edu/goldberg/pubs/gold96.pdf>.

10 "TIOBE Programming Community Index for November 2008". TIOBE Software: The Coding Standards Industry. 13 de Noviembre de 2008. <http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html>.

Page 10: Paradigmas de Programación

Programación Lógica

El paradigma lógico difiere de forma importante de otros paradigmas11. No sólo en su sintaxis o semántica, sino que en él la lógica representa conocimiento, el cual es mani-pulado mediante inferencias. A diferencia de los demás paradigmas, trabajar en este significa especificar qué hacer y no cómo hacerlo, por ello son llamados lenguajes de-clarativos.

El proceso general de la programación lógica es que a partir de un conjunto de reglas (axiomas) e inferencias podamos comprobar nuevas proposiciones que nos sean relevantes. Este proceso está basado en reglas de lógica de primer orden.

Al ser un paradigma bastante abstracto vale la pena esclarecerlo a través de al-gunos ejemplos. Aunque Prolog es el lenguaje más representativo en este paradigma, haré los ejemplos en Structured Query Language (SQL), un lenguaje para operar bases de datos y el cual representa otra de las aplicaciones de la programación lógica.

Definamos un conjunto de películas mexicanas inmortales con algunos de sus atribu-tos12:

Título Estelar Género Estreno

Nosotros los Pobres Pedro Infante Drama 1948

El Padrecito 12 Cantinflas Comedia 1964

Pepe el Toro Pedro Infante Drama 1952

¡Espérame en Siberia, vida mía!

Mauricio Garcés Comedia 1969

Santo y Blue Demon contra los monstruos

El Santo Sci-Fi Mexicano

1969

Ahora, suponiendo este conjunto, vamos a realizar algunas operaciones sobre él. Prime-ro, voy a realizar una consulta que devolvería el conjunto ordenado de forma descen-dente por su fecha de estreno:

SELECT * FROM peliculas ORDER BY estreno DESC

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 8

11 Véase: Mitchell, John. Concepts in Programming Languages, Reino Unido: Cambridge Univer-sity Press, 2003.

12 Desde el punto de vista de quien suscribe, la Magnum opus de Mario Moreno Cantinflas.

Page 11: Paradigmas de Programación

Título Estelar Género Estreno

¡Espérame en Siberia, vida mía!

Mauricio Garcés Comedia 1969

Santo y Blue Demon contra los monstruos

El Santo Sci-Fi Mexicano

1969

El Padrecito Cantinflas Comedia 1964

Pepe el Toro Pedro Infante Drama 1952

Nosotros los Pobres Pedro Infante Drama 1948

Después tratemos de seleccionar un subconjunto de películas a través de predicados, que son consultas que involucran el operador where. Dado que el invierno esta cerca y la privación de luz solar podría desencadenarnos un trastorno afectivo estacional, vamos a seleccionar todas las películas que no sean del género “Drama”.

Lo que resultaría en este subconjunto de elementos que esta ordenado por fecha de estreno y los cuales satisfacen una clausula específica: que su genero sea distinto a “Drama”.

Título Estelar Género Estreno

¡Espérame en Siberia, vida mía!

Mauricio Garcés Comedia 1969

Santo y Blue Demon contra los monstruos

El Santo Sci-Fi Mexicano

1969

El Padrecito Cantinflas Comedia 1964

Dado que no este no es un tutorial de SQL no se agregará más al respecto, no obstante, parece suficiente para demostrar cómo en el paradigma lógico se establece qué hacer pero no cómo hacerlo. En estos dos ejemplos, hemos declarado únicamente que es lo

SELECT * FROM peliculas WHERE genero <> ‘Drama’ ORDER BY estreno DESC

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 9

Page 12: Paradigmas de Programación

que queríamos hacer con nuestro conjunto, pero no definimos cosas como, cuantas ve-ces iterar alguna instrucción, especificaciones para hacer cada comparación, etc.

Programación Orientado a Objetos

A menos que los libros sobre computación que usted consulta hayan sido impresos cuando el término “teléfono celular” fuera desconocido para la mayoría de la población, sabrá que la programación orientada a objetos (POO) es el paradigma de programación más popular en la actualidad.

Programar bajo este paradigma es como tratar de simular o modelar los objetos del mundo real. Una mascota como un perro podría servir para un ejemplo introducto-rio:

Un objeto está compuesto por estados y métodos. Los estados son pro-piedades del objeto y están representados por variables con valores úni-cos para cada objeto y que son llamadas variables de instancia. En este

ejemplo, podríamos pensar en cosas como: edad, color, tener hambre, tener ganas de salir al parque, etc., propiedades todas

que son intrínsecas a cada perro pero cuyos valores son únicos en cada uno.

Los métodos son representaciones de los com-portamientos que el objeto es capaz de hacer. Por

ejemplo, mi perro en particular tendría los métodos: sentarse, echarse, comer, saludar, dormir y bailar, entre

otros, y que son comportamientos que probablemente presentan otros perros.

Ahora que tenemos una noción de lo que es un objeto, quiero mencionar las propiedades más generales y formales de este paradigma:

• Encapsulamiento: Significa que el código o datos de un objeto pueden estar ocultos para cualquier entidad externa a él.

• Herencia: La herencia es la propiedad de crear nuevos objetos a partir de la defini-ción de otros. Un objeto “nuevo” será idéntico al modelo que seguimos para crearlo, excepto por algunos cambios incrementales o re-definiciones de sus estados o méto-dos.

Me gusta pensar en la taxonomía para ejemplificar esta propiedad. Pensemos en un zorro común (Vulpes Vulpes, aquí a la de-recha). Como se ve, esta especie pertenece al género Vulpes, el cual especifica características como: tamaño pequeño, cráneo aplanado y el color de la punta de la cola generalmente distinto al resto del cuerpo. A su vez, este género esta contenido dentro de la familia Canidae, que se caracteriza por tener garras no retráctiles y caminar apoyándose únicamente en sus dedos. To-dos los cánidos son al mismo tiempo miembros del orden Carnivora, el cual es bastante diverso y que en particular

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 10

Page 13: Paradigmas de Programación

tiene dientes y garras para cazar a otros animales, ojos que apuntan hacia el frente y, claro, un menú donde la mayoría de los platillos son carne. Y así ad nauseam...

Ahora, supongamos que cada una de estas categorías es la definición de un ob-jeto. Así, cualquier objeto del tipo Canidae presentaría todas las características de los objetos de donde fue heredado, es decir, que sería vertebrado, tendría dientes, garras y predilección por la carne. No obstante, esto no sucedería a la inversa: un objeto del tipo Carnivora no necesariamente es pequeño o presenta la punta de la cola de un co-lor diferente.

• Polimorfismo: Esencialmente, es la propiedad que le permite a un método aceptar o devolver valores de más de un tipo. Formalmente se define así:

Siendo M un método y t1 y t2 son dos tipos de datos diferentes, M es polimórfico si M puede ser ejecutado con el argumento t1: M( t1) y el argumento t2: M( t2)

De la misma manera una función puede ser definida como polimórfica si al llamarla mediante dos parámetros distintos, arroja un retorno de tipos diferentes.

• Invocación Dinámica de Métodos (Dynamic Method Binding): Se traduce en que cuando llamamos algún método de un objeto estaremos ejecutando la operación es-pecífica de ese objeto y no alguna implementación de alguno de sus padres.

Este paradigma hace posible el desarrollo modular de un software, porque, has-ta cierto grado, cada componente es independiente de los demás, lo que permite que estos componentes puedan ser reutilizados y reciclados, incluso, a lo largo de distintos proyectos. Es posible que esta “modularidad” haya colocado a la programación orienta-da a objetos en la posición dominante en la que se encuentra ahora, dado que le ha permitido a la industria encontrar nuevas formas de trabajo y patrones de diseño más productivos.

Gran parte de los lenguajes más utilizados hoy en día están orientados a objetos, entre ellos se encuentran: Java, C++, PHP, Python, C#, Delphi, Ruby, D y Actionscript, entre otros.

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 11

Page 14: Paradigmas de Programación

3. Conclusión

Como conclusión, sólo quiero recalcar que en la actualidad no existe una frontera bien definida para cada paradigma. Los lenguajes actuales, como Ruby, Actionscript o C# pueden ser mejor definidos como multi-paradigmas. Involucran características de más de uno solo.

También quiero mencionar que estos cuatro paradigmas no son los únicos que existen y hay muchos otros que parecen relevantes, como la programación a aspectos, o que han sido ampliamente usados, como la programación a eventos. De cualquier for-ma, cualquier tipo de programación involucra los elementos mencionados en este traba-jo.

Finalmente, pienso que la comprensión de todos estos conceptos es significati-vamente más sencilla al ponerlos en práctica. Así que si hay algo que aún te parece mis-terioso e inexplicable una buena forma de resolverlo es programando.

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 12

Page 15: Paradigmas de Programación

4. Recomendaciones

• Floyd, Robert. The Paradigms of Programming. 1978 ACM Turing Award Lecture. <https://eprints.kfupm.edu.sa/70764/1/70764.pdf>

• Introduction to Computer Science | Programming Paradigms. Stanford School of En-gineering). 10 de Noviembre de 2008<http://see.stanford.edu/see/courseinfo.aspx?coll=2d712634-2bf1-4b55-9a3a-ca9d470755ee>

• Lycan, William. Philosphy of Language. Reino Unido: Routledge, 2000.

• Dershem, Herbert, y Michael Jipping. Programming Languages: Structures and Mo-dels. Estados Unidos: PWS Publishing Company, 1995.

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 13

Page 16: Paradigmas de Programación

5. Bibliografía

• Scott, Michael Lee. Programming Languages Pragmatics. Estados Unidos: Morgan Kauffmann Publishers, 2000.

• Sebesta, Robert W. Concepts of Programming Languages. Estados Unidos: Pearson Education, 2004.

• Linz, Peter. An Introduction to Formal Languages and Automata. Estados Unidos: Jo-nes and Bartlett Publishers, 2001.

• Craig, Iain. Object-Oriented Programming Languages: Interpretation. Estados Uni-dos: Springer, 2007.

• Bruce, Kim. Foundations of Object-oriented Languages: Types and Semantics. Estados Unidos: MIT Press, 2002.

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 14

Page 17: Paradigmas de Programación

6. Ilustraciones

• Bwrah bwrah. Shouting in the city... 21 de Mayo de 2008.<http://flickr.com/photos/rrrr030/2512299748/>

• Zi, Prashant. Empty Product Box. 19 de Mayo de 2008.<http://flickr.com/photos/prashant_zi/2505010429/>

• Brown, Vicki. Beggy Dog. 11 de Abril de 2007.<http://flickr.com/photos/vickispics/455309498/>

• McCartney, Simon. The Inquisitive Fox. 5 de Septiembre de 2008.<http://flickr.com/photos/vickispics/455309498/>

Utilizadas de acuerdo a la licencia Creative Commons Attribution-Noncommercial-Sha-re Alike 2.0 Generic.

Paradigmas de Programación

Héctor Zárate | www.mieldemaple.com 15