martes, 17 de julio de 2007

"Gran Orden" de programadores

Ideas.



“Se mistifica lo que no se conoce”. Aquí un ejemplo escrito por Herbert Schildt:

¿Cómo escribir un programa que tenga como entrada una cadena que contenga una expresión numérica, como por ejemplo (10-5)*3, y que calcule el resultado adecuado? [...] Si todavía existe una “Gran Orden” de programadores, deben de pertenecer a ella los pocos que sepan hacer esto.

La mayoría de los demás programadores [no C] mistifican la forma en que los lenguajes de alto nivel convierten las expresiones algebraicas en instrucciones que la computadora puede ejecutar. Este procedimiento se denomina análisis de expresiones y es lo que forma la espina dorsal de todos los compiladores e intérpretes de lenguajes, de los programas de hojas de cálculo y de cualquier otro programa que convierta expresiones numéricas en forma que puedan usar las computadoras.

Aunque resulte misterioso, el análisis de expresiones es realmente algo simple y, en muchos sentidos, es más fácil que otras tareas de programación. La razón se encuentra en que el problema está muy bien definido y se basa estrictamente en las reglas del álgebra. (Schildt, 2001: 515).

[...]

No es difícil ni define ninguna "Orden". Una manera de solucionar la pregunta introductoria de Schildt a su Capítulo 24. Análisis y Evaluación de Expresiones, es: En tiempo de ejecución, cualquier expresión se desmenuza en tokens y sobre ellos se aplican las reglas algebraicas. El producto es un algoritmo que dicta la secuencia de instrucciones que calculan el resultado adecuado. Pero ahora...

Torito! ¿Como convertir "cualquier" consulta válida sobre "cualquier" base de datos georreferenciada en una vista 3D en Google Earth, y que muestre el resultado correcto sin tener que reescribir el programa para cada consulta?

Ejemplo de consulta, solucionada con un sistema que desarrollaba llamado z_KML: Desde una base de datos llamada xUgaDB, el siguiente programa ejemplo genera un KML (Google Earth) de todos los 'gatos fotografiados' después de 1995 en Tamaulipas, y los ordena por fecha, hora y número de memoria del GPS.

open   xUgaDB   1
agroup   l_date   l_anio   l_mes   l_dia
agroup   l_time   l_hora   l_minuto
sort   l_date   l_time   gps_mem
search   l_localidad   ?   "Tamaulipas"
search   l_notas   ?   "gato"   and
search   l_notas   ?   "foto"   and
search   l_anio   ?   "1995"   and
coord   lat_gra   lat_min   lat_seg   lon_gra   lon_min   lon_seg
do
end

Comentarios: En el proceso se crean los campos temporales L_DATE y L_TIME que se usaran en SORT; la geoposición se controla en COORD; el 1 en OPEN desecha el primer registro de la base -porque no es útil-; en DO no se solicita enumerar los registros en la respuesta; y no se han cambiado los parámetros default para generar el KML. El resultado es un conjunto de geoposiciones en formato KML.

La imagen arriba es una captura de pantalla de una consulta real (solicitada a xUgaDB), en donde se necesita que el resultado (conjunto de geoposiciones que responden a la pregunta) sea organizado como un conjunto de rutas de longitud mínima (un árbol de rutas). Se logra con la función PATHS ruta mínima; para lograrlo, simplemente se agrega antes de DO:

set   _KML_STYLE_name   x_style_02
set   _KML_STYLE_type   paths
set   _KML_STYLE_altitude   1500
set   _KML_STYLE_line_style_color   7f00ffff
set   _KML_STYLE_line_style_width   4
set   _KML_STYLE_poly_style_color   7f00ff00
set   _KML_STYLE_tessellate   1
style
set   _KML_PATHS_style_name   x_style_02
paths   _KML_PATHS_style_name   min

Comentarios: Los primeros 7 SET declaran un estilo; con STYLE se crea el nuevo estilo; en el siguiente SET se asocia el estilo a PATHS; y finalmente, en PATHS se solicita con el estilo asociado, la ruta mínima entre todas los registros geoposicionados de la respuesta (la consulta ya configurada). PATHS se encarga de localizar una ruta base, a la cual se unan las demás rutas generadas, para que entre todas generen una distancia mínima de recorrido.

Parafraseando ¿Como escribir un programa que tenga como entrada el libreto con las instrucciones anteriores y que genere un gráfico (KML) con el resultado adecuado? Mi respuesta: z_KML es un lenguaje que analiza tokens, donde cada token es una función paramétrica que se aplica a una estructura de datos georreferenciada.

Actualización 23 jul 2007: Y si estamos en exigencias, entonces ¡que también genere un shapefile para ArcView!


_____
del libro que actualmente leo:
Schildt, H. 2001. C Manual de referencia. Osborne McGraw-Hill. 709 pp.


Herbert Schildt // Link
wiki: Google Earth // Link
wiki: KML // Link
wiki: Shapefile // Link
wiki: ArcView // Link


[entrada publicada originalmente el 17-07-2007 21:41 en Yahoo! 360]

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.