GOLD 3 Un Lenguaje De Programación Imperativo Para La Manipulación De Grafos Y Otras Estructuras De Datos
Total Page:16
File Type:pdf, Size:1020Kb
GOLD 3 Un lenguaje de programación imperativo para la manipulación de grafos y otras estructuras de datos Autor Alejandro Sotelo Arévalo UNIVERSIDAD DE LOS ANDES Asesora Silvia Takahashi Rodríguez, Ph.D. UNIVERSIDAD DE LOS ANDES TESIS DE MAESTRÍA EN INGENIERÍA DEPARTAMENTO DE INGENIERÍA DE SISTEMAS Y COMPUTACIÓN FACULTAD DE INGENIERÍA UNIVERSIDAD DE LOS ANDES BOGOTÁ D.C., COLOMBIA ENERO 27 DE 2012 > > > A las personas que más quiero en este mundo: mi madre Gladys y mi novia Alexandra. > > > Abstract Para disminuir el esfuerzo en la programación de algoritmos sobre grafos y otras estructuras de datos avanzadas es necesario contar con un lenguaje de propósito específico que se preocupe por mejorar la legibilidad de los programas y por acelerar el proceso de desarrollo. Este lenguaje debe mezclar las virtudes del pseudocódigo con las de un lenguaje de alto nivel como Java o C++ para que pueda ser fácilmente entendido por un matemático, por un científico o por un ingeniero. Además, el lenguaje debe ser fácilmente interpretado por las máquinas y debe poder competir con la expresividad de los lenguajes de propósito general. GOLD (Graph Oriented Language Domain) satisface este objetivo, siendo un lenguaje de propósito específico imperativo lo bastante cercano al lenguaje utilizado en el texto Introduction to Algorithms de Thomas Cormen et al. [1] como para ser considerado una especie de pseudocódigo y lo bastante cercano al lenguaje Java como para poder utilizar la potencia de su librería estándar y del entorno de programación Eclipse. Índice general I Preliminares 1 1 Introducción 2 1.1 Resumen ............................................... 2 1.2 Contexto................................................ 2 1.3 Motivación .............................................. 3 1.4 Justificación.............................................. 5 1.5 Descripción del problema....................................... 6 1.6 Objetivos ............................................... 8 1.7 ¿Cómo leer este documento?..................................... 9 2 Antecedentes 11 2.1 CSet .................................................. 11 2.2 GOLD 1 ................................................ 13 2.3 GOLD 2 (GOLD+).......................................... 15 3 Estado del arte 20 3.1 Lenguajes para describir grafos.................................... 20 3.1.1 GOLD 1 ............................................ 21 3.1.2 GML ............................................. 22 3.1.3 Graphviz DOT ........................................ 22 3.1.4 Dialectos XML: GraphML, GXL, DGML y XGMML .................... 23 3.2 Aplicaciones de escritorio para manipular grafos .......................... 24 3.2.1 GIDEN ............................................ 24 3.2.2 Grafos ............................................ 25 3.3 Frameworks y librerías sobre grafos ................................. 26 3.3.1 GTL .............................................. 26 3.3.2 Gravisto ........................................... 28 3.3.3 FGL .............................................. 29 3.3.4 JUNG ............................................. 29 3.3.5 JGraphT ........................................... 30 3.3.6 Implementaciones de referencia de Cormen et al....................... 31 3.4 Lenguajes para implementar algoritmos sobre grafos ........................ 32 3.4.1 GOLD 2 (GOLD+)...................................... 32 3.4.2 GP .............................................. 33 3.4.3 Gremlin ............................................ 34 3.4.4 GRAAL ............................................ 35 4 Marco teórico 36 II ÍNDICE GENERAL III 4.1 Lenguajes de propósito general.................................... 36 4.1.1 Introducción ......................................... 37 4.1.1.1 Paradigmas de programación........................... 38 4.1.1.2 Criterios para evaluar un lenguaje de programación ............... 39 4.1.2 Sintaxis............................................ 41 4.1.2.1 Criterios sintácticos generales........................... 42 4.1.2.2 Elementos sintácticos de un lenguaje....................... 43 4.1.3 Semántica........................................... 44 4.1.3.1 Semántica axiomática............................... 44 4.1.3.2 Semántica denotacional.............................. 44 4.1.3.3 Semántica operacional............................... 44 4.1.4 Compilación ......................................... 45 4.1.4.1 Análisis del código fuente............................. 45 4.1.4.2 Síntesis del código ejecutable........................... 45 4.1.5 Conceptos básicos ...................................... 46 4.1.5.1 Valores y tipos................................... 46 4.1.5.2 Expresiones y evaluación............................. 48 4.1.5.3 Variables y almacenamiento............................ 50 4.1.5.4 Comandos y control de flujo ........................... 51 4.1.5.5 Ataduras (bindings) y alcance (scope) ...................... 53 4.1.5.6 Procedimientos y funciones............................ 54 4.1.5.7 Módulos y paquetes................................ 54 4.2 Lenguajes de propósito específico .................................. 55 4.2.1 Definición .......................................... 55 4.2.2 Categorías .......................................... 56 4.2.3 Tópicos generales (Fowler).................................. 56 4.2.4 Patrones de diseño (Spinellis) ................................ 57 II Propuesta de solución 58 5 Requerimientos 59 5.1 Criterios de calidad de acuerdo con el estándar ISO/IEC 9126.................... 60 5.1.1 Funcionalidad (Functionality)................................ 60 5.1.2 Confiabilidad (Reliability).................................. 66 5.1.3 Usabilidad (Usability) .................................... 66 5.1.4 Eficiencia (Efficiency) .................................... 66 5.1.5 Mantenibilidad (Maintainability) .............................. 67 5.1.6 Portabilidad (Portability)................................... 67 5.2 Criterios de calidad de acuerdo con Pratt y Zelkowitz........................ 67 5.3 Criterios de calidad de acuerdo con Watt............................... 69 6 Herramientas 71 6.1 Tecnologías.............................................. 71 6.1.1 Java .............................................. 71 6.1.2 Eclipse ............................................ 72 6.1.3 Xtext ............................................. 73 6.2 Librerías externas........................................... 73 IV ÍNDICE GENERAL 6.2.1 JUNG ............................................. 73 6.2.2 JGraphT ........................................... 75 6.2.3 Implementaciones de referencia de Cormen et al....................... 76 6.2.4 Apfloat ............................................ 76 7 Diseño 77 7.1 Pragmática .............................................. 77 7.1.1 Clasificación......................................... 77 7.1.2 Procesamiento ........................................ 78 7.2 Sintaxis................................................ 80 7.2.1 Elementos léxicos ...................................... 81 7.2.2 Tipos............................................. 83 7.2.3 Expresiones.......................................... 85 7.2.4 Variables........................................... 91 7.2.5 Comandos .......................................... 92 7.2.6 Procedimientos........................................ 100 7.2.7 Programas .......................................... 105 7.2.8 Alcance (scope)........................................ 107 7.3 Semántica............................................... 111 7.3.1 Semántica Denotacional ................................... 111 7.3.2 Semántica Axiomática.................................... 114 7.3.3 Semántica Operacional.................................... 114 8 Implementación 115 8.1 Entorno de desarrollo integrado (IDE)................................ 115 8.1.1 Tipografía (font) ....................................... 116 8.1.2 Mapa de caracteres (character map)............................. 119 8.1.3 Editor de código fuente (source code editor) ........................ 123 8.1.4 Proveedor de codificación de caracteres (encoding provider) . 123 8.1.5 Resaltado de la sintaxis (syntax highlighting)........................ 124 8.1.6 Formateado de código (code formatting)........................... 127 8.1.7 Autoedición de código (autoedit strategies)......................... 128 8.1.8 Plegamiento de código (code folding)............................ 129 8.1.9 Emparejamiento de paréntesis (bracket matching)...................... 129 8.1.10 Ayudas de contenido (content assist) ............................ 130 8.1.11 Validación de código (code validation) ........................... 131 8.1.12 Convertidores de valores (value converters)......................... 132 8.1.13 Proveedor de etiquetas (label provider) ........................... 134 8.1.14 Esquema semántico (outline view).............................. 135 8.1.15 Contribuciones de menú (menu contributions)........................ 135 8.1.16 Generador de código (code generator)............................ 137 8.1.17 Proveedor de alcance (scope provider)............................ 139 8.1.18 Asistentes (wizards) ..................................... 140 8.2 Núcleo del lenguaje.......................................... 142 8.2.1 Gramática (grammar) .................................... 142 8.2.2 Analizador léxico (lexer)................................... 144 8.2.3 Analizador sintáctico (parser)................................ 145 8.2.4