Universidad de Costa Rica
|
|
Programación de computadores
C++, C, Pascal,
EficienciaServicios del sistema operativo
Contenedores reutilizables
Linux
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 fue aprobado con el número 32698391, según consta en la nota VI-DGI-3231-98 de la Vicerrectoría de Investigación, con vigencia desde 1 de agosto de 1998 hasta el 31 de diciembre de 1999, con una carga de 1/3 TC para el investigador principal. El presupuesto docente es aportado por la ECCI por la duración total del proyecto, que es de tres semestres.
El profesor Di Mare es el 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.
En esta solicitud de renovación se solicita extender el proyecto por tres semestres adicionales, de manera que la renovación comience ajecutarse el primer semestre del año 2000, y termine con el primer semestre del año 2001 (antes de que comiencen las lecciones del segundo semestre del año 2001).
El presupuesto de trabajo es mínimo porque se se usarán los recursos disponibles en la ECCI para su desarrollo, aunque se solicita un presupuesto para compra de materiales pequeñas, como papel, fotocopias, etc.
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
|
[DiM99a] | Di Mare, Adolfo:
C Iterators,
Reporte Técnico ECCI9901,
Universidad de Costa Rica, Enero 1999.
http://www.di-mare.com/adolfo/p/c-iter.htm
|
[DiM99b] | Di Mare, Adolfo:
C Parametrized Lists,
Reporte Técnico ECCI9902,
Universidad de Costa Rica, Abril 1999.
http://www.di-mare.com/adolfo/p/c-list.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.
Como parte del desarrollo del proyecto de investigación se ha definido una arquitectura de programación que permite reutilizar los módulos de una biblioteca de contenedores, pero con la particularidad de que la reutilización se hace a nivel de lenguaje de máquina, y no a nivel del código fuente de los algoritmos. Para lograrlo, se ha cambiado levemente la forma en que se representan los contenedores, siguiendo un esquema como el que se muestra en la Figura 4. Lo novedoso de este enfoque es que, en lugar de enlazar nodos mediante punteros, lo que se hace es intereconectar con punteros los campos de enlace del contenedor, como se explica en detalle en el artículo "C Parametrized Lists" [DiM99b].
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.
Los sistemas operativos actuales (Win.NT & Linux) están escritos, primordialmente, en el lenguaje C (no C++), por lo que será necesario evaluar cuidadosamente si conviene realizar las implementaciones en el lenguaje C, pese a que tiene mucho menos poder expresivo que C++. De todas maneras, será necesario construir interfaces C++ para el código objeto final. Como estrategia, es mejor implementar primero todos los servicios para el contenedor "lista", para verter toda la experiencia desarrollada esa labor en las implementaciones de los otros contendores ("pila", "cola", "montículo").
Para tener una aplicación de referencia que sirva para poner los pies sobre la tierra, y no terminar estudiando formas abstractas de polimorfismo que no sirven en la práctica, se estudiará la biblioteca de clases desarrollada por el profesor José Ronald Argüello, en su proyecto de investigación "Extracción inductiva de reglas de asociación en grandes bases de datos (326-97-316)". De esta forma los resultados obtenidos serán insumos directos al programa de investigación en que está incluido el proyecto. Esta labor ser hará cuando el proyecto haya avanzado un poco, para dar tiempo a que hay una colaboración estrecha entre el profesor Argüello y el profesor Di Mare.
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 es necesario hacer ajustes importantes.
El cronograma se ha confeccionado con una granularidad de un
trimestre. Una "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.
Actividad | I-2000 | II-2000 | I-2001 | ||||
---|---|---|---|---|---|---|---|
1. | Evaluación preliminar (C & C++) vs Linux | X |
X |
X |
|
|
|
2. | Diseño del contenedor "lista" | |
X |
X |
X |
|
|
3. | Implementación del contenedor "lista" | |
X |
X |
X |
X |
|
4. | Implementación del contenedor "pila" | |
|
X |
X |
X |
|
5. | Implementación del contenedor "cola" | |
|
X |
X |
X |
|
6. | Diseño del contenedor "montículo" (heap) | |
|
X |
X |
X |
|
7. | Implementación del contenedor "montículo" (heap) | |
|
X |
X |
X |
X |
8. | Incorporación del la biblioteca a Linux | |
|
|
X |
X |
X |
9. | Evaluación retrospectiva | |
|
|
|
|
X |
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.
Existe la posibilidad de que la Universidad pueda obtener algún beneficio material si la empresa Microsoft, dueña del sistema operativo Win.NT, decide incorporar la tecnología desarrollada en este proyecto en sus programas; es deseable que la empresa Microsoft apoye la investigación en la Universidad de Costa Rica, como reconocimiento a la incorporación en sus productos de las tecnologís desarrolladas en este proyecto. Será necesario esperar a que los productos propuestos en este trabajo existan para definir qué estrategia seguir en este respecto. Por lo pronto, todos los aportes se harán para el sistema operativo Linux, que es de dominio público, lo que evita solicitar permisos o contraer compromisos para usarlo como plataforma de trabajo.
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.
Es deseable, y muy importante, contar con un asistente de investigación, quien pueda colaborar durante todo el desarrollo del proyecto. Aunque este apoyo no es un requisito indispensable para alcanzar las metas propuestas, pues al no tener este apoyo lo que ocurrirá es que la amplitud y profundidad del trabajo realizado será menor, vale la pena que el investigador principal del proyecto no se vea obligado a realizar labores de menor nivel intelectual, que lo distraen de profundizar en la investigación.
[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 Renovación 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/polirenv.htm
|
Internet: |
http://www.di-mare.com/adolfo/inv/polirenv.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 1999
|
Visitantes: |
|
Adolfo Di Mare <adolfo@di-mare.com>.
|