Universidad de Costa Rica
|
|
Programación de computadores
C++, C, Pascal,
EficienciaProgramación orientada a los objetos
Implementación de programas
Pese a lo anterior, y si del proyecto resulta un descubrimiento que puede servir de base para entrar al mercado con un producto, con suficiente antelación el investigador principal lo hará del conocimiento de las autoridades universitarias, para con ellos negociar un acuerdo adecuado.
Este proyecto ha sido planeado para que su ejecución comience en el II Semestre de 1998, y para que termine a fines del año 1999, con una carga de 1/3 TC para el investigador principal. El presupuesto docente será aportado por la ECCI por la duración total del proyecto, que es de tres semestres.
El profesor Di Mare será responsable de ejecutar todo el trabajo en el proyecto, que consiste en obtener material bibliográfico adecuado, experimentar implementando programas de computación y reportar los resultados en artículos de investigación.
No hará falta que la Vicerrectoría de Investigación apoye presupuestariamente el proyecto, pues se usarán los recursos disponibles en la ECCI para su desarrollo.
Vo.Bo. Dr. Marcelo Jenkins, Director, ECCI |
[DiM78] | Di Mare, Adolfo:
Diseño y Programación Estructurada,
en Fundamentos de Algoritmos y Lenguajes,
pp [2842],
Departamento de Ciencias de la Computación,
Escuela de Matemática, Universidad de
Costa Rica, 1978.
|
[DiM87a] | Di Mare, Adolfo:
DB3mnugn: Generación de Prototipos de Sistemas y
Tutores Electrónicos mediante Menúes,
Reporte Técnico PIBDC-01-87, proyecto 326-86-053,
Escuela de Ciencias de la Computación e Informática, UCR
1987.
|
[DiM88a] | Di Mare, Adolfo:
MAKE : cómo compilar
rápido en Clipper ,
Reporte Técnico PIBDC-04-88,
Proyecto 32686053, Escuela de Ciencias de la
Computación e Informática, Universidad de
Costa Rica, 1988.
http://www.di-mare.com/adolfo/p/makedbf.htm
|
[DiM88b] | Di Mare, Adolfo:
Convenciones de Programación para
Pascal,
Reporte Técnico ECCI0188, Proyecto
32686053, Escuela de Ciencias de la
Computación e Informática, Universidad de
Costa Rica, 1988.
http://www.di-mare.com/adolfo/p/convpas.htm
|
[DiM90c] | Di Mare, Adolfo:
Programación de Computadores:
Ayer, Hoy, Mañana,
Revista Rumbo, 1990.
http://www.di-mare.com/adolfo/p/rumboprg.htm
|
[DiM91a] | Di Mare, Adolfo:
Abstracción de datos en Pascal,
Reporte Técnico PIBDC-01-91, proyecto 326-89-019,
Escuela de Ciencias de la Computación e Informática, UCR
1991.
|
[DiM91b] | Di Mare, Adolfo & Oviedo, Eduardo:
Turtle: La Tortuga LOGO para Turbo
Pascal, Ponencia presentada en el
V Congreso Internacional de Logo, celebrado en
noviembre de 1991 en San José, Costa Rica,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica;1991.
http://www.di-mare.com/adolfo/p/turtle.htm
|
[DiM91c] | Di Mare, Adolfo:
Tipos Abstractos de Datos y
Programación por Objetos,
Reporte Técnico PIBDC-03-91, proyecto 326-89-019,
Escuela de Ciencias de la Computación e Informática,
UCR 1991.
http://www.di-mare.com/adolfo/p/oop-adt.htm
|
[DiM92] | Di Mare, Adolfo:
Yet Another C++ Money Class,
The C Users Journal,
Vol.10 No.4,
pp [5864],
Abril 1992.
http://www.di-mare.com/adolfo/p/money.htm
|
[DiM93] | Di Mare, Adolfo:
La programación por objetos
en los sistemas de información,
Revista
Acta Académica,
Universidad Autónoma de Centro América,
Número 13,
pp [3541],
Noviembre 1993.
http://www.uaca.ac.cr/acta/1993nov/oopsig.htm
|
|
Di Mare, Adolfo:
Prueba interactiva de ADTs,
Reporte Técnico ECCI9401,
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
|
|
Di Mare, Adolfo:
La Implementación de Elem.pas ,
Reporte Técnico ECCI9402,
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
|
|
Di Mare, Adolfo:
La Implementación de Rational.pas ,
Reporte Técnico ECCI9403,
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
|
|
Di Mare, Adolfo:
La Implementación de Poly.pas ,
Reporte Técnico ECCI9404,
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
|
|
Di Mare, Adolfo:
La Implementación de ListAHO.pas ,
Reporte Técnico ECCI9405,
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
|
|
Di Mare, Adolfo:
La Implementación de List.pas ,
Reporte Técnico ECCI9406,
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
|
|
Di Mare, Adolfo:
La Implementación de Tree.pas ,
Reporte Técnico ECCI9407,
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
|
|
Di Mare, Adolfo:
La Implementación de Heap.pas ,
Reporte Técnico ECCI9408,
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
|
|
Di Mare, Adolfo:
Uso de la unidad Test.pas ,
Reporte Técnico ECCI9409,
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
|
[DiM94j] | Di Mare, Adolfo:
Manejo de excepciones en Turbo Pascal,
Reporte Técnico ECCI9410
(Revisión 3),
Proyecto 32689019,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
1994.
http://www.di-mare.com/adolfo/adt/except.htm
|
[DiM94k] | Di Mare, Adolfo:
Licenciado programador,
Revista
Acta Académica,
Universidad Autónoma de Centro América,
Número 14,
Páginas [5657],
Marzo 1994.
http://www.di-mare.com/adolfo/p/licprog.htm
|
[DiM94l] | Di Mare, Adolfo:
"genridx.h " Una interfaz uniforme para el uso
de archivos indizados en C,
Revista
Acta Académica,
Universidad Autónoma de Centro América,
Número 15,
pp [3558],
Noviembre 1994.
http://www.uaca.ac.cr/acta/1994nov/genridx.htm
|
[DiM96b] | Di Mare, Adolfo:
Tres formas diferentes de explicar
la recursividad;
Revista Ingeniería,
Facultad de Ingeniería,
Universidad de Costa Rica,
Volumen 6, Número 2,
pp [3144], 1996.
http://www.di-mare.com/adolfo/p/recurse1.htm
|
[DiM96c] | Di Mare, Adolfo:
Uso de convenciones de programación
para descifrar programas,
Revista Ingeniería,
Facultad de Ingeniería,
Universidad de Costa Rica,
Volumen 6, Número 2,
pp [4554], 1996.
http://www.di-mare.com/adolfo/p/reverse.htm
|
[DiM97d] | Di Mare, Adolfo:
Propuesta para mejorar
el curso Principios de Informática,
Reporte Técnico ECCI9701,
Escuela de Ciencias de la Computación e Informática,
Universidad de Costa Rica,
Julio 1997.
http://www.di-mare.com/adolfo/p/princinf.htm
|
Parece entonces que la ciencia y la academia tienen objetivos contrapuestos, al menos bajo la óptica del uso de los resultados de investigación que cada uno hace. Es usual que los investigadores afirmen que solo un 5% de toda la investigación tiene aplicación en el "mundo real". O sea, prácticamente afirman que la labor de los investigadores es tener muchas ideas, y concretarlas en publicaciones o prototipos, para que luego la industria escoja unos pocos y los transforme en productos que la sociedad pueda asimilar.
Sin embargo, a veces ocurre que una invención académica tiene una belleza especial, que seduce a alguna persona. Eso es lo que ha ocurrido con el polimorfismo uniforme, cuya mejor definición aparece en [MDC91]. Esta técnica de programación es una tecnología que puede reducir sustancialmente el tamaño de los programas. ¿Por qué es esto importante?
En verdad el tamaño de los computadores actuales es tan grande, en los niveles de los giga-bytes, que resulta paradójico esforzarse en reducir el tamaño de un programa de varios megabytes, a unos cuantos kilobytes (recuerde el lector que Basic, el lenguaje que hizo famoso a Bill Gates, en su versión original ¡ocupa solo 2K!). El progreso requiere de la eficiencia, como lo muestra la siguientes anécdota del automóvil.
Pese a que ya en los años cincuentas se había desarrollado la tecnología mecánica para que los autos alcanzaran velocidades superiores a los cien kilómetros por hora, en los ochentas, y todavía en los noventas, se continúa trabajando en lograr mayor eficiencia, para disminuir el consumo de combustible, la polución, el tamaño y comodidad de los vehículos modernos, etc.
Por eso cabe estudiar ahora como aumentar la reutilización de componentes de programación [Kru92] para mejorar el desempeño de los sistemas computacionales, y disminuir su costo de mantenimiento [Boe81], usando para ello la elegante tecnología del polimorfismo uniforme.
¿Qué promete el polimorfismo uniforme? Reutilizar componentes de programación. ¿Por qué ha sido desechado por la industria? Pues sencillamente porque en la industria primero se usó la genericidad de Ada [Mey86], y luego el polimorfismo paramétrico de C++ [Str89] los que, aunque funcionan, hacen muy difícil compartir la implementación de cada algoritmo polimórfico. Pese a que Ada ha sido desechado como el principal lenguaje del departamento de defensa de los Estados Unidos, ya la industria ha aceptado a C++ como su estándar [Bec98], lo que efectivamente desecha el uso del polimorfismo uniforme a favor del paramétrico.
A primera vista parece que todos estos problemas ya están resueltos, pues C++ cuenta con plantillas que permiten especializar algoritmos para cualquier tipo de datos. Sin embargo, esta solución siempre implica que haya duplicación del código objeto final, pues cada instanciación de una plantilla resulta en una sección de código ejecutable diferente, especializada para el tipo de datos instanciado. Si en lugar de usar plantillas se usa herencia para implementar los algoritmos polimórficos, entonces se cae en el problema de que se pierde la verificación fuerte de tipos, pues para reuitilizar algoritmos lo que se hace es homologarlos a un solo tipo base, que es el polimórfico.
En este proyecto se busca estudiar algoritmos polimórficos para implentarlos de forma que se pueda compartir el código objeto final (lo que no ocurre si se usan plantillas en C++), pero sin renunciar a la verificación fuerte de tipos (que es el precio de usar herencia y polimorfismo en la implementación). Se busca encontrar formas de expresar algoritmos polimórficos que mejoren el rendimiento de una implementación en que se usa siempre semántica de referencia, aunque no se llegue a la eficiencia que implica la parametrización.
¿Es posible disfrutar de las ventajas del polimorfismo uniforme sin caer en los problemas del polimorfismo paramétrico? ¿Es siempre necesario perder la verificación fuerte de tipos si se usan algoritmos polimórficos? Vale la pena estas preguntas. Pero más vale llegar a la respuesta.
Además, los resultados de este proyecto insidirán positivamente en la docencia porque las técnicas desarrolladas se podrán aprovechar rápidamente en los cursos de programación de computadoras, organización de lenguajes, sistemas operativos, etc.
También esta línea de investigación, si es apoyada por los académicos de la ECCI, puede llegar a convertirse en un sólido Programa de Investigación.
Pero lo más importante es que es un problema bonito, que merece una solución.
Object
.
Libg++
es una
biblioteca basada en la jerarquía de clases del lenguaje
Smalltalk
[GR83]. Ha sido muy utilizada porque
tiene el apoyo del proyecto
GNU, que busca entregarle a la
humanidad programas reutilizables de alta calidad, a precio
nulo. Libg++
es producto del esfuerzo de Keith
Gorlen [Gor87].Libg++
, aunque incluye algoritmos para
manipulación de grafos que no se encuentran en otras
bibliotecas.Muchas de estas bibliotecas se pueden conseguir en Internet, sin costo alguno. Es interesante que a veces los desarrolladores hasta han tenido la opción de modificar el lenguaje para adaptarlo a la biblioteca [Ste95].
El común denominador de todos estos esfuerzos es que no implementan el polimorfismo uniforme, sino más bien parametrización por medio de plantillas, u obligan al programador cliente de la bibioteca a prescindir de la verificación fuerte de tipos, pues los contenedores almacenan referencias (punteros) a los objetos. O sea que, si se escoge usar una biblioteca eficiente (plantillas), hay que renunciar al polimorfismo uniforme, mas si se escoge la generalidad de un contenedor heterogéneo, entonces hay que renunciar a la verificación fuerte de tipos. Por eso en esta investigación se busca lograr la combinación de ambas cualidades: la eficiencia de las plantillas con la generalidad del polimorfismo uniforme.
Como ya hay mucho terreno avanzado en la implementación de contenedores, en esta investigación se hará especial énfasis en la implementación de algoritmos polimórficos, sin por ello descuidar la de contenedores.
Al usar parametrización el programador puede escribir
algoritmos que no dependan del tipo de los datos manipulados, lo
que evita duplicar código fuente. En el contexto de los
Tipos abstractos de datos contenedores (ADT:
Abstract data type), la parametrización es el
mecanismo que permite que el contenedor sea independiente de los
objetos que contiene, pues con un solo módulo es posible
obtener contenedores para elementos de tipos diferentes. Con base
en el mismo código fuente parametrizable es posible obtener
un árbol de enteros, de personas, o de listas de valores
booleanos. La parametrización sirve para definir un nuevo
ADT contenedor en términos del ADT contenido; este
último tipo de datos es el parámetro de la
definición. Si Pascal fuera capaz de parametrizar
contenedores directamente, sería posible escribir
declaraciones como la siguiente, que define las listas de
números enteros y de árboles de reales
"TLint
" y "TLreal
":
VAR TLint : TList< INTEGER >; TLTreal : TList< TTree< REAL > >;
Sort()
parametrizable
El ejemplo clásico de parametrización de
procedimientos es la rutina Sort()
, que ordena un
vector independientemente del tipo de datos que contenga. En la
Figura 1 está una versión
simplificada de Sort()
, expresada como una plantilla
escrita en pseudo-Pascal. Esta implementación
parametrizable del procedimiento Sort()
puede ordenar
cualquier arreglo, independientemente de las cualidades del vector
(tipo de elemento contenido, dimensión, cantidad de
elementos, algoritmo para comparar los elementos). Los
parámetros que deben ser definidos por el programador para
usar la función Sort()
se encuentran
encerrados entre paréntesis angulares:
<TSort>
, <TElem>
,
Low<A>
y High<A>
.
Estos dos últimos sirven para definir el rango del vector.
Además, el operador "<=
" también es
un parámetro de esta plantilla, pues es el que se usar para
comparar a cualesquiera dos elementos del vector.
Se llama Instanciación al proceso de especializar una plantilla de código parametrizable a un tipo. Para instanciar basta copiar el código de la plantilla y sustituirle las hileras por los nombres adecuados de las constantes y los tipos de datos. En el caso de los tipos, la instanciación ocurre cuando se declara la variable, y se obtiene así una instancia. El término "parametrización" nace de instanciar de esta forma los tipos, que son parámetros en las plantillas de código.
Pese a que no hay duplicación de código fuente cuando se usa parametrización, el resultado de compilar un algoritmo parametrizable produce código objeto diferente para tipos de datos diferentes, pues lo usual es que el compilador genere una copia completa de toda la implementación del contenedor para cada uno de los tipos parametrizados (de aquí viene el nombre "plantilla" que se usa para denotar a la facilidad de parametrización de C++).
Es fácil compartir el código objeto si lo que cada instancia del contenedor contiene es una referencia, -puntero-, al elemento almacenado, pues lo usual es que todos los punteros tengan el mismo tamaño, independientemente del tamaño del objeto a que apuntan. Este es el enfoque que se ha usado para CLU [LG86] o para Napier88 [MDC91], y para los lenguajes que permiten polimorfismo uniforme, en que se usa la "Semántica de referencia". En esos lenguajes, en casi todos los casos, los objetos son punteros al lugar en la memoria en que su valor está almacenado. Cuando el contenedor almacena los objetos, y no referencias a ellos, compartir el código de las operaciones es más difícil porque los objetos diferentes tienen tamaños diferentes y requieren ser manipulados usando operaciones diferentes.
Si se usa semántica de referencia para implementar la parametrización, no hace falta duplicar el código objeto de cada algoritmo, pero a cambio el acceso a cada dato es más lento, pues hay que derreferenciar un puntero para llegar a su valor. Además, cada dato ocupa más espacio de memoria, pues al usado para almacenar su valor hay que agregarle el que ocupa el puntero que le referencia. Por eso en este trabajo se hacen esfuerzos por implementar la parametrización sin recurrir a la semántica de referencia.
De acuerdo a [MDC91] el "Polimorfismo" en un lenguaje de programación "es la habilidad de escribir programas que son independientes de la forma de los objetos que manipulan". Es un concepto mucho más amplio que la unión de la parametrización con la herencia, pues el polimorfismo hace al lenguaje mucho más expresivo. Por eso en [CW85] se le llama "Polimorfismo de inclusión" a la herencia y en [MDC91] se afirma que la parametrización que ofrecen tanto Ada como C++ apenas es un truco para implementar el polimorfismo, que ellos llaman "Polimorfismo textual" (pg 344). En estos dos lenguajes, la parametrización es una forma restringida del "Polimorfismo paramétrico" de [CW85] (pg 475).
qsort()
polimórfico
En la práctica, el concepto de polimorfismo tiene dos
significados. El primero ya se ha explicado, y se deriva de la
práctica de usar punteros a funciones, como en el caso del
procedimiento qsort()
de la
Figura 2. En este caso un programa o un
módulo es polimórfico cuando usa punteros a
funciones para ocultar el proceso que las rutinas realizan sobre
los datos; puede verse la parametrización como un camino
para llegar al polimorfismo, pues la parametrización se
puede implementar usando polimorfismo.
El segundo significado de polimorfismo se usa en el contexto de la programación orientada a los objetos (OOP: Object Oriented Programming), cuando se dice que un método es polimórfico si puede ser invocado indirectamente por medio de un puntero que está almacenado dentro de cada instancia del objeto; este es el polimorfismo de inclusión de [CW85]. Usando la terminología de C++, los objetos polimórficos son los que tienen "Métodos virtuales", también llamados "Funciones virtuales". Cuando se invoca un método virtual se dice que se ha usado "ligamiento tardío" (late binding), "ligamiento dinámico" (dynamic binding) o "ligamiento en tiempo de ejecución" (run-time binding).
Una muestra de que el polimorfismo es un concepto mucho más amplio que la parametrización es el del lenguaje ML [Mil84], o el de Miranda [Tur86], que cuentan con "Polimorfismo uniforme", que garantiza que todos los tipos siempre compartan la misma implementación de cualquier algoritmo polimórfico. Esto no ocurre se usan los paquetes genéricos de Ada, o las plantillas de C++, pues en estos lenguajes al instanciar un procedimiento polimórfico el compilador genera una copia del código para cada tipo (de aquí el nombre despectivo de polimorfismo de editor de textos para la genericidad [MDC91], pg 369).
Los lenguajes C, C++ y Pascal no incorporan las formas más poderosas de polimorfismo porque el costo que se paga por esa gran flexibilidad, en tiempo de ejecución, es demasiado alto, pues las formas más abstractas de polimorfismo se implementan usando punteros, lo que aumenta tanto el tamaño de las variables como el tiempo de ejecución de los programas. Esta pérdida de eficiencia es inaceptable para muchos programadores C++, pese a que para bastantes programadores no tiene sentido siquiera entender qué es el polimorfismo uniforme. De todas formas, siempre habrá casos en que contar con la expresividad adicional que brinda esta técnica de programación justifique el costo de aprender a usarla.
En el contexto de los lenguaje Pascal y C (o C++), diseñados para producir programas de alta eficiencia, cuando se habla de polimorfismo es porque internamente (a nivel de implementación) se usan referencias a objetos en lugar de los objetos en sí. Una forma simple de entender el polimorfismo es pensar que "polimorfismo" significa "uso de punteros". O sea que, cuando se usa polimorfismo, no se manipula al objeto, sino que se usa una referencia al objeto, que es un puntero. Con frecuencia se confunde la parametrización con el polimorfismo, pues la idea de usar punteros a funciones como vehículo para implementar la parametrización no es nueva. Por ejemplo, ya en 1986 se hablaba de cómo hacerlo [CI86], aunque la técnica usada es bastante restrictiva [Gol86].
En un plano más abstracto, el polimorfismo es un concepto muy similar a la parametrización. Como se sobreentiende que al usar polimorfismo internamente el compilador recurre a punteros y referencias [MDC91], que es lo contrario de lo que generalmente ocurre al usar parametrización [Str89], los objetos polimórficos pueden tener comportamientos mucho más variados que los que solo están parametrizados. Por ejemplo, una lista polimórfica puede contener varios elementos, cada uno de un tipo diferente, mientras que la lista parametrizada solo puede contener elementos de un mismo tipo (en particular, una lista polimórfica podría contener a su vez otra lista, o varios elementos de tipos diferentes).
En la Figura 3 se compara la
expresividad que se logra con el polimorfismo, pues la lista
"Lm1
" tiene elementos que son de tipos muy variados
(listas, arreglos, números, hileras), mientras que las
listas parametrizadas "Lp1
" y "Lp2
" son
homogéneas, pues todos sus elementos son del mismo tipo.
Para manipular la lista "Lm1
" el programador necesita
que el lenguaje le provea de mecanismos para averiguar en tiempo
de ejecución el tipo de cada objeto, para que pueda
aplicarle las operaciones que le son válidas. Desde la
perspectiva de los contenedores heterogéneos, el
polimorfismo es una facilidad de abstracción más
general que la parametrización.
En este proyecto se tratará de reclutar estudiantes, preferiblemente de la Maestría en Computación e Informática de la ECCI, para que colaboren en esta investigación. También busca apoyar ayudar a la formación del Centro de Investigación en Computación de la ECCI, promoviendo la investigación en una de las áreas más importante de la computación: la programación de computadores.
En lo posible, se tratará de producir resultados para el lenguaje Pascal, que no tiene plantillas, aunque seguramente el éxito se alcanzará usando el lenguaje C++, que tiene construcciones sintácticas más avanzadas. Siempre es saludable tratar de lograr resultados usando un mínimo de recursos, pues de esa manera se llega a la eficiencia, por lo que como estrategia de investigación siempre se tratará de lograr resultados primero en Pascal, y luego en C y C++. Será durante el proceso de investigación cuando se pueda determinar si la expresividad de Pascal no es suficiente para alcanzar los objetivos propuestos. La gran ventaja de lograr resultados en Pascal que es que podrán ser usados para los cursos básicos en la ECCI.
La primera labor a realizar es probar varias formas de implementar el polimorfismo uniforme, usando como base la tecnología que ya se ha desarrollado, principalmente examinando la biblioteca BIDS de Borland, y la biblioteca estándar STL para C++. Sin embargo, también es importante echarle un vistazo a la biblioteca LEDA, pues incluye algoritmos para grafos.
Luego hay que entrar a una etapa es de consolidación, en la que se busca implementar varios de los algoritmos escogidos en la primera etapa. Posiblemente en esta etapa sea necesario hacer y rehacer varias veces el trabajo pues, infortunadamente, cuando se construyen artefactos de programación es usual iterar varias veces hasta encontrar una implementación adecuada. En esta etapa también hay que escoger los algoritmos a implementar; esta escogencia se hará con base en la información recolectada a lo largo del proyecto, por lo que en esta propuesta no se puede predecir cuáles algoritmos conviene estudiar.
Cabe destacar que el trabajo de implementar algoritmos no se
reducirá a implementar contenedores, sino otros algoritmos
en general. Por ejemplo, no será suficiente para cumplir
con los objetivos del proyecto implementar el contenedor
polimórfico lista, sino que también hay que estudiar
algoritmos como el qsort()
de la
Figura 2.
Al final del proyecto se hará una evaluación retrospectiva, en que se buscará determinar si el trabajo realizado es suficiente, o si por el contrario han quedado por fuera algoritmos importantes. En esta etapa se usará como punto de evaluación la experiencia documentada en el uso de la biblioteca STL de C++, la que todavía no es muy conocida por los programadores.
La eficiencia en computación se determina midiendo la cantidad de recursos que utiliza un algoritmo. Lo usual es medir dos variables: el espacio (cantidad de memoria utilizada) y el tiempo (esfuerzo requerido para realizar una tarea). Como los algoritmos sobre los que se trabajará ya existen, pues no es el fin de esta investigación desarrollar nuevos algoritmos sino implementar los ya conocidos de mejor manera, la forma de medir la eficiencia consiste en comparar los algoritmos programados de forma tradicional, con los producidos en el proyecto. Al cotejar tiempos de ejecución y uso de espacio será posible determinar cuán eficientes son los algoritmos producidos en el proyecto.
Pero también la eficiencia puede medirse de otra manera, que es menos objetiva, porque no se puede hacer mecánicamente. Esta otra forma de eficiencia consiste en evaluar la "belleza" o "elegancia" con que se ha implementado un algoritmo. En esto el investigador principal de este proyecto ya ha trabajado en el pasado, en que produjo el artículos "Convenciones de Programación para Pascal" [DiM88b]. Muchas personas opinan que no hace falta hacer este tipo de estudio, pues si "ya funciona no hay que arreglarlo" (if it ain't broken; don't fix it!). Pero siempre es bueno analizar, aunque no con gran detalle, este aspecto de la implementación de un algoritmo. Por eso, en este proyecto se usará un poquito de esfuerzo para determinar si los algoritmos producidos son más elegantes, más simples, o menos engorrosos, aunque el esfuerzo más importante se dedicará a medir eficiencia cuantitavivamente. Estas comparaciones se harán con la versión de cada algoritmo implementado usando parametrización.
La tecnología STL será un punto de guía durante todo el proyecto, y las experiencias reportadas por otros investigadores y por la industria moldearán el desarrollo de esta investigación. En la última etapa, a la luz del trabajo realizado, será posible determinar si este proyecto se transforma en un Programa de Investigación que pase a formar parte del Centro de Investigación en Computación de la ECCI, o si más bien conviene invertir esfuerzos en otros trabajos.
X
" en la columna indica que se
trabajará en la actividad respectiva. Algunas labores se
realizarán en forma concurrente, y en la etapa final se
revisará todo el trabajo realizado.
El proyecto terminará en con el siglo, al finalizar el año 1999; ya para ese momento habrá suficiente trabajo avanzado como para determinar si vale la pena ampliarlo, o transformarlo en un programa de investigación.
Actividad | II-1998 | I-1999 | II-1999 | ||||
---|---|---|---|---|---|---|---|
1. | Examen de bibliotecas disponibles | X |
|
X |
X |
|
|
2. | Desarrollo de técnica | X |
X |
X |
|
X |
|
3. | Implementación de contenedores | |
X |
X |
X |
|
|
4. | Implementación de algoritmos | |
X |
X |
X |
X |
|
5. | Evaluación retrospectiva | |
|
|
X |
X |
X |
En amena conversación el Director de la ECCI, profesor Marcelo Jenkins, PhD. y el investigador principal del proyecto, profesor Adolfo Di Mare, acordaron que lo que más conviene es que este proyecto se ejecute en tres semestres, para acoplarlo con los planes generales de investigación de toda la ECCI. Originalmente se había planeado insertar este proyecto en el PIBD: Programa de investigación en bases de datos (326-97-902), que dirige el profesor José Ronald Argüello, pero a fin de cuentas se determinó que conviene más a la Escuela que este proyecto se desarrolle en un corto plazo.
Los resultados de este proyecto serán, principalmente, publicaciones, preferiblemente en el idioma inglés. Se espera producir una publicación por semestre, aunque es muy posible que al finalizar el proyecto haya más de tres.
Como productos quedarán las bibliotecas de
programas producidas, junto con su documentación escrita en
formato HTML. Una versión inicial de las bibliotecas
será entregada al finalizar el segundo semestre de
ejecución del proyecto, a mediados del
año 1999.
Además, el investigador principal cuenta con un computador Pentium bastante completo, que usará para escribir programas o artículos. Ya cuenta también con los compiladores necesarios para trabajar, y mediante Internet se pueden obtener otros recursos que puedan requerirse para realizar el trabajo.
[Anu96] | Anuff, Ed:
Java Sourcebook,
ISBN 0471148598;
John Wiley & Sons, Inc.,
1996.
|
[Aus97] |
Austern, Matthew H.:
The SGI Standard Template Library,
Dr. Dobb's Journal,
No.268, pp [1820, 2224, 2627, 90],
Agosto 1997.
http://www.sgi.com/Technology/STL/
|
[Bec98] |
Becker, Pete:
C++ Standard Approved,
C/C++ User's Journal,
Vol.16, No.2,
pp [8993],
Febrero 1998.
|
[BI92] | Borland International:
Borland C++ v3.1 Programmer's Guide,
Borland International, California (U.S.A.), 1992.
|
[Boe81] | Boehm, Bary:
Software Engineering Economics,
Prentice-Hall, 1981.
|
[Boo87] | Booch, Grady:
Software Components with Ada,
Benjamin/Cummings,
1987.
|
[CI86] | Czyzwicsz, Jurek & Iglewski, Michal:
Implementing Generic Types in Modula2,
SIGPLAN Notices, Vol.20 No.12,
pp [2632],
Diciembre 1986.
|
[CW85] | Cardelli, Luca & Wegner, Peter:
On Understanding Types, Data Abstraction, and
Polymorphism,
ACM Computing Surveys,
Vol.17 No.4, pp [471522],
Diciembre 1985.
|
[Dvo97] |
Dvorak, John C.:
Eiffel and the Attack on Java,
PC Magazine,
Vol.16 No.21,
pp 87,
Diciembre 2 1997.
|
[Gol86] | Goldsby, Michael E.:
Concurrent Use of Generic Types in Modula2,
SIGPLAN Notices, Vol.21 No.6,
pp [2834],
Junio 1986.
|
[Gor87] | Gorlen, Keith E.:
An Object-Oriented Class Library for
C++ Programs,
Software Practice and Experience,
Vol.17 No.12, pp [899922],
Diciembre 1987.
|
[GR83] | Goldberg, Adele & Robson, David:
Smalltalk80, the Language and its
Implementation,
Addison-Wesley, 1983.
|
[Kru92] | Krueger, Charles W.:
Software Reuse,
ACM Computing Surveys, Vol.24 No.2, pp 131183,
Junio 1992.
|
[LED96] |
LEDA: Library of Efficient Data Types,
mantenida por
Christian Uhrig,
Max Planck Institute of Computer Science,
1996.
http://ftp.mpi-sb.mpg.de/pub/LEDA/leda.html
|
[Lg++95] |
GNU libg++: versión 2.6.
ftp://prep.ai.mit.edu/pub/gnu/libg++2.6.tar.gz
|
[LG86] | Liskov, Barbara & Guttag, John:
Abstraction and Specification in Program
Development,
McGraw-Hill, 1986.
|
[MDC91] | Morrison, P. & Dearle, A. & Connor, R. C. H. & Brown, A. L.:
An Ad Hoc Approach to the Implementation of
Polymorphism,
ACM Transactions on Programming Languages and Systems,
Vol.13 No.3,
pp 342371,
Julio 1991.
|
[Mey86] | Meyer, Bertrand:
Genericity vs Inheritance,
OOPSLA'86 Conference Proceedings,
pp [391405],
Portland, Oregon, 1986.
|
[Mey90] | Meyer, Bertrand:
Lessons from the design of the Eiffel Libraries,
Communications of the ACM,
Vol.33 No.9,
pp 6888,
Septiembre 1993.
|
[Mil84] | Milner, R:
A proposal for Standard ML,
en Proceedings of the Symposium on LISP and Functional Programming
(Austin, Texas, Agosto 68),
ACM, New York,
pp [184197],
1984.
|
[Ste95] | Stevens, Al:
Alexander Stepanov and STL,
Dr. Dobbs's Journal, No.228,
pp [118123],
Marzo 1995.
|
[STL95] | Stepanov, Alexander & Lee, Meng:
The C++ Standard Template Library,
Generic Programming Project, Hewlett Packard Research Labs,
1995.
ftp://butler.hpl.hp.com/stl/stl.zip .
|
[Str89] | Stroustrup, Bjarne:
Parametrized Types for C++,
Computing Systems, Vol.2 No.1,
pp [5585],
Invierno 1989.
(También en
Proceedings of the USENIX C++ Workshop, Octubre 1988).
http://www.research.att.com/~bs/papers.html
|
[Tur86] | Turner, David:
An Overview of Miranda,
Sigplan Notices,
Vol.21 No.12,
pp [158166],
Diciembre 1986.
|
[US94] | Uhl, Jürgen & Schmid, Hans Aelbrecht:
A Systematic Catalogue of Reusable Abstract Data
Types,
ISBN 3540532293 o 0387532293,
Springer Verlag Lecture Notes in Computer Science 460,
1994.
|
Indice
|
Adolfo Di Mare <adolfo@di-mare.com>
Referencia: | Di Mare, Adolfo:
Polimorfismo uniforme más eficiente -
Propuesta de Investigación,
Proyecto N° 326-98-391,
Escuela de Ciencias de la Computación e Informática,
UCR 1998.
http://www.di-mare.com/adolfo/inv/polimefc.htm
|
Internet: |
http://www.di-mare.com/adolfo/inv/polimefc.htm
|
Autor: | Adolfo Di Mare
<adolfo@di-mare.com>
|
Contacto: | Apdo 4249-1000, San José Costa Rica Tel: (506) 207-4020 Fax: (506) 438-0139 |
Revisión: | ECCI-UCR, Junio 1998
|
Visitantes: |
|
Adolfo Di Mare <adolfo@di-mare.com>.
|