Programacion
Programacion
Índice general
1 Programación 1
1.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Léxico y programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 Programas y algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.4 Compilación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.∧ Programación e ingeniería del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.∨ Referencias históricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.∩ Objetivos de la programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.∪ Ciclo de vida del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.9 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.10 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.11 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Portal:Programación 5
3 & 6
3.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨
3.2 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩
3.3 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩
4 Acoplamiento secuencial 8
4.1 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪
4.2 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪
5 Adobe Director 9
∧.1 Interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
∧.2 Timeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
∧.3 Director y Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
∧.4 Shockwave / Shockwave 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
∧.∧ Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
∧.∨ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
6 Anidamiento (informática) 12
∨.1 En las planillas de cálculo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
i
ii ÍNDICE GENERAL
∨.2 En programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
∨.3 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
7 Antipatrón de diseño 13
∩.1 Algunos antipatrones de desarrollo de software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
∩.1.1 Antipatrones de gestión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
∩.1.2 Antipatrones de gestión de proyectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
∩.1.3 Antipatrones generales de diseño de software . . . . . . . . . . . . . . . . . . . . . . . . 14
∩.1.4 Antipatrones de programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∧
∩.1.∧ Antipatrones metodológicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨
∩.1.∨ Antipatrones de gestión de la con guración . . . . . . . . . . . . . . . . . . . . . . . . . 1∨
∩.2 Algunos antipatrones organizacionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩
∩.3 Relación alfabética de otros antipatrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩
∩.4 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
∩.∧ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
8 Archivo de cabecera 21
∪.1 Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
∪.2 Alternativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
∪.3 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
∪.4 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
9 Aserción (informática) 24
9.1 Uso de las aserciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
9.1.1 Aserciones en el diseño por contrato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
9.1.2 Aserciones en tiempo de ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
9.1.3 Aserciones durante el ciclo de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∧
9.1.4 Aserciones estáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∧
9.2 Desactivación de las aserciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∧
9.3 Comparación con los manejadores de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∧
9.4 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨
10 Automatización de tareas 27
11 Base de código 28
11.1 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∪
12 Bean 29
12.1 Bean en Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
12.2 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
13 Beta tester 30
13.1 Generalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
13.2 Alfa tester . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
ÍNDICE GENERAL iii
15 Binding 32
1∧.1 Psicología y educación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1∧.2 Informática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1∧.3 Derecho mercantil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1∧.4 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
16 Bloqueo mutuo 33
1∨.1 Representación de Bloqueos Mutuos usando grafos . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1∨.2 Condiciones necesarias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1∨.3 Evitando bloqueos mutuos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1∨.4 Prevención . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1∨.∧ Livelock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
17 Bodyshopping 35
1∩.1 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧
18 BrookGPU 36
21 CamelCase 40
21.1 Usos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
21.2 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
22 Caml 41
22.1 Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
22.1.1 Hola Mundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
22.1.2 Función factorial (recursividad y programación puramente funcional) . . . . . . . . . . . . 41
22.1.3 Derivación numérica (funciones de alto orden) . . . . . . . . . . . . . . . . . . . . . . . . 41
22.1.4 Transformada Wavelet discreta (concordancia de patrones) . . . . . . . . . . . . . . . . . 42
iv ÍNDICE GENERAL
24 Clase utilidad 44
24.1 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
25 [Link] 45
26 CMake 46
2∨.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∨
2∨.2 Documentación y tutoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∨
2∨.3 Principales funcionalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∨
2∨.4 CTest, CPack, CDash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∩
2∨.∧ Aplicaciones que utilizan CMake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∩
2∨.∨ Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∩
2∨.∩ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∩
27 Codecademy 48
2∩.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∪
2∩.2 Code Year . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∪
2∩.3 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∪
2∩.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4∪
2∩.∧ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
28 Código cerrado 50
2∪.1 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧0
29 Código compilado 51
30 Código mutante 52
31 Código objeto 53
31.1 Código objeto en lenguajes de programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧3
31.2 Errores comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧3
31.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧3
31.4 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧3
32 Ofuscación 54
32.1 Informática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧4
ÍNDICE GENERAL v
32.1.1 Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧4
32.2 Otros objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧4
32.3 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧∧
33 ColdFusion 56
33.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧∨
33.2 Versiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧∨
33.3 Ejemplos de código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧∩
33.4 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧∩
34 Coloreado de sintaxis 58
34.1 Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧∪
34.2 Programas con coloreado de sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧∪
34.3 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧∪
35 Comentario (informática) 59
3∧.1 Información general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧9
3∧.2 Usos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∧9
3∧.2.1 Planeación / Revisión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨0
3∧.2.2 Descripción de código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨0
3∧.2.3 Descripción algorítmica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨0
3∧.2.4 Inclusión de recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨0
3∧.2.∧ Depuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨1
3∧.2.∨ Generación de documentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨1
3∧.3 Estilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨1
3∧.3.1 Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨1
3∧.4 Curiosidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨1
3∧.∧ Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.1 Ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.2 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.3 C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.4 Delphi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.∧ Lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.∨ Ruby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.∩ Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.∪ Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.9 Javascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.10 código HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.11 SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.12 Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.13 Pauscal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∧.14 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
vi ÍNDICE GENERAL
3∧.∧.1∧ Cobol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∨ Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨2
3∧.∩ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨3
36 Compatibilidad (informática) 64
3∨.1 Problemas de compatibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨4
3∨.2 Emulación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨4
3∨.3 OpenSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨4
3∨.4 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨4
3∨.∧ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨∧
38 Computación parasitaria 69
3∪.1 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨9
3∪.2 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∨9
39 Conectiva lógica 70
39.1 Lenguajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩0
39.1.1 Lenguaje natural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩0
39.1.2 Lenguajes formales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩0
39.2 Lista de conectivos lógicos comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩0
39.2.1 Lista de conectivos lógicos comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩0
39.2.2 Historia de las notaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩1
39.3 Redundancia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩1
39.4 Propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩2
39.∧ Ciencias de la computación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩2
39.∨ Conectivas por el número de argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩3
39.∨.1 Sin argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩3
39.∨.2 Con un argumento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩3
39.∨.3 Con dos argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩3
39.∩ Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩3
39.∪ Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩3
39.9 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩3
ÍNDICE GENERAL vii
41 Conteo de referencias 75
41.1 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∩∧
43 Cracking (software) 81
43.1 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪1
44 Cuaderno de carga 82
45 Curri cación 83
4∧.1 Nomenclatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪3
4∧.2 De nición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪3
viii ÍNDICE GENERAL
4∧.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪3
4∧.4 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪3
46 Código enhebrado 84
4∨.1 Historia que llevó al código enhebrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪4
4∨.2 Desarrollo del código enhebrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∧
4∨.3 Modelos de enhebrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∧
4∨.3.1 Enhebrado directo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∧
4∨.3.2 Enhebrado indirecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∨
4∨.3.3 Enhebrado de subrutina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∨
4∨.3.4 Enhebrado de token . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∨
4∨.3.∧ Enhebrado de Hu man . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∨
4∨.3.∨ Enhebrados menos usados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∩
4∨.4 Bifurcaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∩
4∨.∧ Amenidades comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∩
4∨.∨ Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∩
4∨.∩ Lectura adicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∩
4∨.∪ Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪∪
47 Código inalcanzable 89
4∩.1 Causas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪9
4∩.2 Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ∪9
4∩.3 Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4∩.3.1 Pro ling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4∩.4 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4∩.∧ Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4∩.∨ Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4∩.∩ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
48 Código muerto 91
4∪.1 Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4∪.2 Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4∪.3 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4∪.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4∪.∧ Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4∪.∨ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
49 Código redundante 93
49.1 Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
49.2 Eliminación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
49.3 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
49.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
ÍNDICE GENERAL ix
50 Dato 94
∧0.1 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
∧0.2 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
51 Depuración de programas 95
∧1.1 Origen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∧
∧1.2 Aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∧
∧1.3 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∧
52 Desarrollador de software 96
∧2.1 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∨
53 Desarrollo en cascada 97
∧3.1 Fases del modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∩
∧3.1.1 Análisis de requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∩
∧3.1.2 Diseño del Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∩
∧3.1.3 Diseño del Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∪
∧3.1.4 Codi cación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∪
∧3.1.∧ Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∪
∧3.1.∨ Veri cación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∪
∧3.1.∩ Mantenimiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∪
∧3.2 Variantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∪
∧3.3 Ventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∪
∧3.4 Desventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∪
∧3.∧ Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9∪
∧3.∨ Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
∧3.∩ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
60 di 115
ÍNDICE GENERAL xi
65 DLO 126
∨∧.1 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12∨
68 eAthena 132
∨∪.1 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
70 Emtp 134
∩0.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
∩0.2 ATP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
∩0.3 Método de solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
∩0.4 Distribución de EMTP-ATP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
∩0.∧ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
∩0.∨ Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
ÍNDICE GENERAL xiii
73 Enlazado 137
80 Flag 153
∪0.1 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∧3
85 Gledplay 161
∪∧.1 Dispositivos Soportados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨1
∪∧.2 GledDraw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨1
∪∧.3 GledVideo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨2
∪∧.4 GledSave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨2
∪∧.∧ GledApplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨2
∪∧.∨ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨2
ÍNDICE GENERAL xv
86 GPGPU 163
∪∨.1 Modelo de programación GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨3
∪∨.2 Herramientas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨3
∪∨.3 Críticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨4
∪∨.4 Otros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨4
∪∨.∧ Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨4
∪∨.∨ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨4
87 Hackathon 165
∪∩.1 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∧
∪∩.2 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∧
88 Hacker 166
∪∪.1 Otros signi cados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∨
∪∪.2 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∩
∪∪.2.1 ARPANET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∩
∪∪.2.2 UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∩
∪∪.2.3 GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∩
∪∪.2.4 LINUX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∪
∪∪.3 Ética hacker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∪
∪∪.4 Controversia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∪
∪∪.4.1 Ambigüedad y debate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨∪
∪∪.∧ Activismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨9
∪∪.∨ Terminología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨9
∪∪.∨.1 OverHat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨9
∪∪.∨.2 White hat y black hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∨9
∪∪.∨.3 Samurái . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩0
∪∪.∨.4 Phreaker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩0
∪∪.∨.∧ Lamer o script-kiddie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩0
∪∪.∨.∨ Newbie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩0
∪∪.∩ Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩0
∪∪.∪ Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩0
∪∪.9 Descripción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩1
∪∪.10Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩1
89 Heisenbug 172
∪9.1 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩2
∪9.2 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩2
92 Homebrew 175
92.1 Generalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∧
92.2 Homebrew en diferentes consolas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∨
92.2.1 Sega Dreamcast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∨
92.2.2 Nintendo Entertainment System (NES) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∨
92.2.3 Super Nintendo Entertainment System (SNES) . . . . . . . . . . . . . . . . . . . . . . . . 1∩∨
92.2.4 Nintendo DS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∩
92.2.∧ Sony PSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∩
92.2.∨ Microsoft Xbox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∩
92.2.∩ Microsoft Xbox 3∨0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∩
92.2.∪ Nintendo Wii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∪
92.2.9 PlayStation 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∪
92.3 Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∪
92.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩∪
93 ICONIX 179
93.1 Ventajas de Iconix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩9
93.2 Tareas de la metodología Iconix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩9
93.2.1 Fase 1: Análisis de requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩9
93.2.2 Fase 2: Análisis y diseño preliminar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩9
93.2.3 Fase 3: Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩9
93.2.4 Fase 4: Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩9
93.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩9
93.4 Conceptos Relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∩9
93.∧ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪0
93.∧.1 Fase 2: Análisis y diseño preliminar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪0
93.∧.2 Fase 3: Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪0
93.∧.3 Fase 4: Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪0
93.∨ Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪0
93.∩ Conceptos Relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪0
93.∪ Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪0
9∧.4 C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪2
9∧.∧ Perl ∨ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
9∧.∨ Javascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
9∧.∩ PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
9∧.∪ Transact-SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
9∧.9 MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
9∧.10PSeInt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
9∧.11Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
9∧.12Ruby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
9∧.13Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
9∧.14Pl/pgsql de PostgreSql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1∪3
97 Indirección 186
105Jframe 211
10∧.1Herencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
10∧.2Constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
10∧.3Métodos propios de la clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
10∧.4Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
109Kommander 220
109.1El editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
109.2El ejecutor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
109.3Direcciones de Kommander . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
113Macro 226
113.1Macros de aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22∨
113.2Macros en programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22∨
113.3Macros ocultas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22∨
113.4Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22∨
118MCML 233
11∪.1Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
119Metaprogramación 234
119.1Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
123Modularidad 239
123.1Modularidad en Ciencias de la Computación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
123.2Modularidad en Biología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
123.3Modularidad en Economía y en la Empresa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
123.4Modularidad en el diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
123.∧Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
123.∨Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
132Null 254
133NWNScript 255
133.1Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∧∧
135Oday 257
137OGNL 259
13∩.1Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∧9
13∩.2Cadenas (chains) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∧9
13∩.3Proyectos que usan OGNL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∧9
13∩.4Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∧9
138OpenACS 260
13∪.1Arquitectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨0
ÍNDICE GENERAL xxiii
13∪.2Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨0
13∪.3Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨0
13∪.4Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨0
140Operador 262
140.1Operadores en un espacio vectorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨2
140.2Operadores bilineales o bivariantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨2
140.3Tipos generales de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨2
140.3.1 Operadores de condición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨2
140.3.2 Operadores de orden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨3
140.3.3 Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨3
140.3.4 Operaciones aritméticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨3
140.4Otros operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨3
140.∧Temas relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨4
140.∨Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨4
141Operando 265
141.1En informática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨∧
141.2Conexiones externas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨∧
141.2.1 Matemática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨∧
141.2.2 Informática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∨∧
145Phrogram 270
14∧.1Detalles técnicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩0
14∧.2¡Hola, Mundo! en KPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩0
14∧.3Filosofía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩0
14∧.4Otra información . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩0
14∧.∧The Phrogram Company . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩1
14∧.∨Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩1
xxiv ÍNDICE GENERAL
148Polling 275
14∪.1Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩∧
14∪.2Polling del registro de Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩∧
14∪.3Soluciones para el polling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩∧
14∪.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩∧
14∪.∧Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩∨
150Portabilidad 278
1∧0.1Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩∪
1∧0.2Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩∪
151Postcondición 279
1∧1.1Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∩9
152Pragma 280
1∧2.1Programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∪0
1∧2.2Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∪0
1∧2.3Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∪0
153Precondición 281
1∧3.1Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2∪1
161Programador 299
1∨1.1Reseña histórica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
1∨1.2Funciones del programador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
1∨1.3Especialidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
1∨1.4Notas y referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
1∨1.∧Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
162Pseudocódigo 301
1∨2.1Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
1∨2.2Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
1∨2.3De nición de datos del pseudocódigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
1∨2.4Funciones y operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
1∨2.∧Estructuras de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
1∨2.∧.1 Estructuras secuenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
1∨2.∧.2 Estructuras selectivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
1∨2.∧.3 Estructuras iterativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
1∨2.∧.4 El anidamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
1∨2.∨Desarrollo de algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
1∨2.∩Funciones y procedimientos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
1∨2.∪Ventajas del pseudocódigo sobre los diagramas de ujo . . . . . . . . . . . . . . . . . . . . . . . 304
1∨2.9Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
1∨2.10Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
1∨2.11Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
1∨2.12Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
166QuadTIN 313
168Quest3D 315
1∨∪.1Entorno de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∧
1∨∪.1.1 Lógica de las aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∧
1∨∪.1.2 Orientación a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∧
1∨∪.1.3 Editores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∧
1∨∪.1.4 Publicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∧
1∨∪.2Requerimientos del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∧
1∨∪.3Licencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∨
1∨∪.4Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∨
1∨∪.∧Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∨
1∨∪.∨Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31∨
172Recursión 323
1∩2.1Recursión en matemáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
1∩2.1.1 Conjuntos de nidos de forma recurrente . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
1∩2.1.2 Funciones de nidas de forma recurrente . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
1∩2.1.3 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
1∩2.1.4 Resolución de problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
1∩2.2Recursión en informática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
1∩2.3Humor recursivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32∧
1∩2.4Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32∧
1∩2.∧Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32∧
1∩2.∨Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32∧
173Refactorización 326
1∩3.1Refactorización de código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32∨
1∩3.2Refactorización de otros textos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32∨
ÍNDICE GENERAL xxix
1∩3.3Etimología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32∩
1∩3.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32∩
1∩3.∧Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32∩
179scanf 336
1∩9.0.1 Modi cantes de longitud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33∨
1∩9.1Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33∪
1∩9.2Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33∪
1∩9.3Funciones derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33∪
1∩9.3.1 fscanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33∪
1∩9.3.2 sscanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33∪
1∩9.4Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33∪
1∩9.∧Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
xxx ÍNDICE GENERAL
180SCons 340
1∪0.1Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
1∪0.2Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
183Serialización 343
1∪3.1Usos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
1∪3.2Soporte en los lenguajes de programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
1∪3.3Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
184Sigil 344
188Smarty 349
1∪∪.1Características . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
1∪∪.2Críticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
1∪∪.3Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
1∪∪.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧0
ÍNDICE GENERAL xxxi
189Snippet 351
1∪9.1Rich snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧1
1∪9.2Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧1
191StarBasic 354
191.1Primer virus para OpenO ce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧4
191.2Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧4
192Stub 355
192.1Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧∧
192.2Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧∧
193Subalgoritmo 356
193.1Tipos de subalgoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧∨
193.2→mbito de las variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧∨
193.3Paso de argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧∨
193.4Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∧∨
196Thunk 366
19∨.1Invocación por «gestionada» a «no gestionada» . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∨∨
19∨.2Invocación por «no gestionada» a «gestionada» . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∨∨
19∨.3Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∨∨
201Waf 372
201.1Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩2
201.2Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩2
201.3Ejemplo Waf archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩3
201.4Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩3
201.∧Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩3
201.∨Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩3
203Wrapper 375
203.1Computación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩∧
203.2Véase también . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩∧
203.3Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩∧
204XAML 376
204.1Tecnología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩∨
204.2Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩∨
ÍNDICE GENERAL xxxiii
205Zenphp 378
20∧.1←Qué es zenphp? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩∪
20∧.2←Qué ventajas ofrece zenphp? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩∪
20∧.3Origen del texto y las imágenes, colaboradores y licencias . . . . . . . . . . . . . . . . . . . . . . 3∩9
20∧.3.1 Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3∩9
20∧.3.2 Imágenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
20∧.3.3 Licencia del contenido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39∨
Capítulo 1
Programación
La programación informática, acortada como progra- trivial como multiplicar dos números puede necesitar un
mación, es el proceso de diseñar, codi car, depurar y conjunto de instrucciones en lenguaje ensamblador, en
mantener el código fuente de programas computaciona- un lenguaje de alto nivel bastará con solo una. Una vez
les. El código fuente es escrito en un lenguaje de progra-
que se termina de escribir un programa, sea en ensam-
mación. El propósito de la programación es crear progra-blador o en algunos lenguajes de alto nivel, es necesa-
mas que exhiban un comportamiento deseado. El proceso rio compilarlo, es decir, traducirlo completo a lenguaje
de escribir código requiere frecuentemente conocimien- máquina.* [1] Eventualmente será necesaria otra fase de-
nominada comúnmente link o enlace, durante la cual se
tos en varias áreas distintas, además del dominio del len-
anexan al código, generado durante la compilación, los
guaje a utilizar, algoritmos especializados y lógica for-
mal. Programar no involucra necesariamente otras tareas recursos necesarios de alguna biblioteca. En algunos len-
guajes de programación, puede no ser requerido el pro-
tales como el análisis y diseño de la aplicación (pero sí el
diseño del código), aunque sí suelen estar fusionadas enceso de compilación y enlace, ya que pueden trabajar en
el desarrollo de pequeñas aplicaciones. modo intérprete. Esta modalidad de trabajo es equivalen-
Del proceso de programación surge lo que comúnmente te pero se realiza instrucción por instrucción, a medida
se conoce como software (conjunto de programas), aun- que es ejecutado el programa.
que estrictamente este último abarca mucho más que solo
la programación.
1.2 Léxico y programación
1.1 Historia La programación se rige por reglas y un conjunto más o
menos reducido de órdenes, expresiones, instrucciones y
Para crear un programa, y que la computadora lo inter- comandos que tienden a asemejarse a una lengua natural
prete y ejecute las instrucciones escritas en él, debe es- acotada (en inglés); y que además tienen la particularidad
cribirse en un lenguaje de programación. En sus inicios de una reducida ambigüedad. Cuanto menos ambiguo es
las computadoras interpretaban solo instrucciones en un un lenguaje de programación, se dice, es más potente. Ba-
lenguaje especí co, del más bajo nivel, conocido como jo esta premisa, y en el extremo, el lenguaje más potente
código máquina, siendo éste excesivamente complicado existente es el binario, con ambigüedad nula (lo cual lleva
para programar. De hecho solo consiste en cadenas de a pensar así del lenguaje ensamblador).
números 1 y 0 (sistema binario). Para facilitar el trabajo En los lenguajes de programación de alto nivel se distin-
de programación, los primeros cientí cos, que trabaja- guen diversos elementos entre los que se incluyen el léxi-
ban en el área, decidieron reemplazar las instrucciones, co propio del lenguaje y las reglas semánticas y sintácti-
secuencias de unos y ceros, por palabras o abreviaturas cas.
provenientes del inglés; las codi caron y crearon así un
lenguaje de mayor nivel, que se conoce como Asembly
o lenguaje ensamblador. Por ejemplo, para sumar se po-
dría usar la letra A de la palabra inglesa add (sumar). 1.3 Programas y algoritmos
En realidad escribir en lenguaje ensamblador es básica-
mente lo mismo que hacerlo en lenguaje máquina, pero Un algoritmo es una secuencia no ambigua, nita y or-
las letras y palabras son bastante más fáciles de recordar denada de instrucciones que han de seguirse para resol-
y entender que secuencias de números binarios. A me- ver un problema. Un programa normalmente implementa
dida que la complejidad de las tareas que realizaban las (traduce a un lenguaje de programación concreto) uno o
computadoras aumentaba, se hizo necesario disponer de más algoritmos. Un algoritmo puede expresarse de dis-
un método sencillo para programar. Entonces, se crea- tintas maneras: en forma grá ca, como un diagrama de
ron los lenguajes de alto nivel. Mientras que una tarea tan ujo, en forma de código como en pseudocódigo o un
1
2 CAPÍTULO 1. PROGRAMACIÓN
lenguaje de programación, en forma explicativa, etc. puede almacenarse solo de forma temporal. Un programa
Los programas suelen subdividirse en partes menores, lla- podría tener partes escritas en varios lenguajes, por ejem-
madas módulos, de modo que la complejidad algorítmica plo, Java, C, C++ y ensamblador, que se podrían compilar
de cada una de las partes sea menor que la del programa de forma independiente y luego enlazar juntas para for-
completo, lo cual ayuda al desarrollo del programa. Esta mar un único módulo ejecutable.
es una práctica muy utilizada y se conoce como “re no
progresivo”.
Según Niklaus Wirth, un programa está formado por los 1.5 Programación e ingeniería del
algoritmos y la estructura de datos. software
Se han propuesto diversas técnicas de programación cu-
yo objetivo es mejorar tanto el proceso de creación de Existe una tendencia a identi car el proceso de creación
software como su mantenimiento. Entre ellas, se pueden de un programa informático con la programación, que es
mencionar las siguientes: cierta cuando se trata de programas pequeños para uso
personal, y que dista de la realidad cuando se trata de
• Programación declarativa grandes proyectos.
El proceso de creación de software, desde el punto de vis-
• Programación estructurada
ta de la ingeniería, incluye mínimamente los siguientes
• Programación modular pasos:
1.10 Referencias
[1] Laboda, Xavier; Josep Galimany, Rosa María Pena, An-
toni Gual (19∪∧). «Software». Biblioteca práctica de la
computación. Barcelona: Ediciones Océano-Éxito, S.A.
Capítulo 2
Portal:Programación
∧
Capítulo 3
&
«Et» redirige aquí. Para otras acepciones, véase El signo en sí es una ligadura ̶combinación de diseño de
E. T. dos letras en un único grafema, usado primero para au-
mentar la velocidad de la escritura manual̶desarrollada
por Marco Tulio Tirón, secretario del gran orador romano
Cicerón. Para poder registrar los discursos y la correspon-
dencia dictada por este último, Tiro, que era un esclavo li-
berto, inventó varias formas de acelerar la escritura, sien-
do por ello considerado el padre de la taquigrafía. En la
Edad Media o en los primeros tiempos de la imprenta el
Evolución de la ligadura &:
uso de ligaduras era muy común, en este caso por la eco-
1-3, cursivas romanas de los siglos ii-iv
4-5, minúsculas medievales de los siglos vi-vii nomía de espacio, cuando la materia prima ̶pergamino
6, minúscula carolingia, s. ix. o papel̶añadía mucho al precio de los libros.
También se le conoce como signo tironiano.
El signo &, cuyo nombre en español es et,* [1] es una al-
ternativa grá ca de la conjunción copulativa latina et, que
signi ca y de la que deriva la española «y».
3.1 Historia
Es conocido también por su nombre en inglés ampersand,
proveniente a su vez de la expresión and per se and, es de-
cir, «y por sí mismo, y», antiguamente usada como parte
de la retahíla para la memorización del alfabeto.
Deriva del latín de donde el signo pasó a diversos idiomas,
incluido el español. Su uso en nuestra lengua es super uo,
pues no resulta económico (a diferencia de otros idiomas)
ya que la conjunción copulativa y tiene una grafía más
breve y sencilla. En textos españoles antiguos es frecuente
encontrarlo empleado en la expresión latina adoptada et
cetera, en las formas &c. o &cetera. El et latino a la izquierda se encuentra estilizado, pero la forma
itálica a la derecha revela sus orígenes de la palabra del latín et.
Un uso extendido es el que persiste en la bibliografía aca-
démica en inglés, en la enumeración de los autores, in- El símbolo fue usado en el antiguo Imperio romano, y su
cluidas la expresión como & al. (del latín et alii, plural uso data del primer siglo d.C. Se adjudica su invención a
masculino, o et alia, plural neutro) que se traduce como Marco Tulio Tirón.* [2]
«y otros».
Para el siglo viii, la caligrafía occidental estaba bien desa-
rrollada, particularmente en la forma uncial, escritura in-
sular y minúscula carolingia. Los calígrafos hicieron un
extensivo uso del et, ya que la condensación de una pala-
bra en una sola letra hacía su trabajo más fácil. Durante
aquel tiempo, se desarrolló una versión mucho más com-
primida del et. Normalmente se le llama ampersand“Ro-
En la tipografía de la derecha es evidente el origen de la ligadura mana”.
et.
En HTML se usa al comienzo de los códigos de entidad
Como se observa en la lista de letras de Byrhtferð (año con que se designan los caracteres especiales: los ejem-
1011), este signo «&» fue considerado a menudo como plos más típicos son > <, y & (>, < y &,
una letra más al nal del alfabeto latino. respectivamente).
∨
3.3. ENLACES EXTERNOS ∩
3.2 Referencias
[1] Real Academia Española (2001). «Apéndice 4: Lista de
símbolos o signos no alfabetizables». Diccionario de la
lengua española. Consultado el 2∧ de septiembre de 2012.
Acoplamiento secuencial
• Patrón de diseño
4.2 Referencias
[1] Andriy, Buday. «Refactor: Acoplamiento secuencial =>
Template Method». The Code Project. Consultado el 23
de abril de 2011.
∪
Capítulo 5
Adobe Director
9
10 CAPÍTULO 5. ADOBE DIRECTOR
Anidamiento (informática)
El anidamiento (llamado nesting en inglés) es la linea, ruta as string dim valor_a_devolver as integer
práctica de incorporar llamadas (calls) a funciones o ruta="C:\[Link]”if FileExists(ruta) then open
procedimientos (unas) dentro de otras, mediante la inclu- “C:\[Link]”for input as #1 do while not EOF(1)
sión de diversos niveles de paréntesis. line input #1, linea if left(linea, 3)=cod then 'Realizar
Debido a que la potencial acumulación de éstos últimos una acción o varias acciones End if loop close #1
suele hacer que la edición y la detección de errores se BuscarCodigo=valor_a_devolver end function
vuelva un proceso engorroso, los entornos de programa-
ción modernos -así como los programas de planilla de En este simple ejemplo, la estructura condicional if...
cálculo- resaltan en negrita el par correspondiente a la po- then... end if (“si... entonces... n si”) está anidada
sición que está editando el programador o usuario en cada dentro de otra que la contiene, el ciclo do while... loop
momento. El control (automático) del balance o equili- (“repetir... mientras”, literalmente “hacer mientras...
brio entre los paréntesis de apertura y de cierre se suele bucle”).
conocer como brace match checking en inglés.
Naturalmente, para la resolución matemática de estas
complejas formulas encadenadas, las expresiones deben 6.3 Véase también
ser evaluadas desde adentro hacia afuera, ya que los re-
sultados de las más internas sirven, temporalmente, de • Bucle (programación)
datos de entrada de las exteriores.
• Estructuras de control
• Función (programación)
6.1 En las planillas de cálculo
• Procedimiento (programación)
En las hojas de cálculo, se suelen anidar o agrupar fun- • Programación estructurada
ciones unas dentro de otras, derivando en fórmulas rela-
tivamente complejas. El programa OpenO [Link] Calc • Pseudocódigo
permite, mediante su asistente de funciones (function wi-
zard), navegar a través de los varios o múltiples niveles
de anidamiento, permitiendo editar (y eventualmente co-
rregir) cada una de ellas por separado. Tal vez de manera
sorprendente, su rival Microsoft Excel no posee esa ca-
racterística, eventualmente deseable cuando se trabaja en
algunas grandes planillas.
6.2 En programación
En los lenguajes de programación estructurada, el anida-
miento está relacionado a la inclusión de estructuras de
control dentro de otras, usualmente indicado mediante la
inclusión de distintos niveles de sangría (llamada indenta-
tion en inglés) dentro del código fuente, como se muestra
en el sencillo código BASIC siguiente:
function BuscarCodigo(cod as string) as integer dim
12
Capítulo 7
Antipatrón de diseño
Un antipatrón de diseño es un patrón de diseño que in- calidad de vida de sus empleados, intenta homoge-
variablemente conduce a una mala solución para un pro- neizar los puestos de trabajo quitando en la medida
blema. de lo posible los permisos a los programadores para
Al documentarse los antipatrones, además de los patro- que no dañen los sistemas operativos, monitoriza a
los equipos de trabajo y actúa cortando la visibili-
nes de diseño, se dan argumentos a los diseñadores de
sistemas para no escoger malos caminos, partiendo de dad de ciertas páginas o las reuniones de programa-
dores, al nal se consigue que se vaya la gente de
documentación disponible en lugar de simplemente la
intuición. la empresa cuando la situación es insostenible, esto
suele ocurrir en ciclos de uno o dos años.
El término se origina inspirado en el libro Design Patterns,
escrito por un grupo de autores conocido como Gang of • Responsable ausente (absentee manager): Situación
Four, y que aglutina un conjunto de buenas soluciones en la que el principal responsable o coordinador se
de programación. Los autores bautizaron dichas solucio- ausenta o permanece en paradero desconocido o no
nes con el nombre de “patrones de diseño”por analo- localizable durante importantes períodos de tiempo.
gía con el mismo término, usado en arquitectura. El libro
Anti-Patterns (de William Brown, Raphael Malveau, Skip • Todo lo que tienes es un martillo (all you have is a
McCormick y Tom Mowbray, junto con la más reciente hammer): Gestión gris y plana, incapaz de tratar a
incorporación de Scott Thomas) describe los antipatrones los subordinados de manera personalizada y acorde
como la contrapartida natural al estudio de los patrones con sus necesidades particulares.
de diseño. El estudio formal de errores que se repiten per-
mite reconocer y reconducir los elementos involucrados • Negociador de jaula de acero (cage match negotia-
hacia una mejor solución. Los antipatrones no se men- tor): Se aplica cuando un coordinador, gestor o res-
cionan en el libro original de Design Patterns, puesto que ponsable aplica una losofía de "éxito a cualquier
éste es anterior. precio”.
Los antipatrones se consideran una parte importante de • Dos caras (doppelganger): Coordinador o compañe-
una buena práctica de programación. Es decir, un buen ro que en un determinado momento puede ser agra-
programador procurará evitar los antipatrones siempre dable y de trato fácil, pero igualmente puede volver-
que sea posible, lo que requiere su reconocimiento e iden- se irracional y despiadado de modo inesperado.
ti cación tan pronto como sea posible, dentro del ciclo de
vida del software. • Rodeos improductivos (fruitless hoops): Gestor o
El concepto de antipatrón se puede aplicar a la ingeniería coordinador que solicita grandes cantidades de da-
en general, e incluso a cualquier tarea realizada por el tos (en ocasiones sin relevancia alguna) antes de to-
hombre. Aunque no se escucha con frecuencia fuera del mar una decisión.
campo ingenieril, la noción está ampliamente extendida.
• Niñito de oro (golden child): Situación en la que
ciertas responsabilidades, oportunidades, reconoci-
mientos o recompensas van a parar a un determina-
7.1 Algunos antipatrones de do miembro del equipo como consecuencia de una
desarrollo de software relación personal o en clara contradicción con su
rendimiento real.
7.1.1 Antipatrones de gestión • Pollo sin cabeza (headless chicken): Se aplica al ges-
tor, coordinador o responsable que vive en una per-
• Productividad a toda costa: La empresa busca la pro- manente situación de pánico y medidas desespera-
ductividad a costa de la calidad del software y de la das.
13
14 CAPÍTULO 7. ANTIPATRÓN DE DISEÑO
• Líder pero no gestor (leader not manager): Un buen • Mala gestión (bad management): Gestionar un pro-
líder no tiene por qué ser necesariamente un buen yecto sin tener su cientes conocimientos sobre la
gestor, coordinador o responsable. materia.
• Gestión clonada (managerial cloning): Situación en • Software in ado (software bloat): Permitir que las
la que los coordinadores o gestores son contratados sucesivas versiones de un sistema exijan cada vez
e instruidos para actuar y trabajar todos del mismo más recursos.
modo, a imagen y semejanza de sus propios jefes.
• Gestor pero no líder (manager not leader): Un coor- 7.1.3 Antipatrones generales de diseño de
dinador brillante en sus deberes administrativos y de software
gestión, pero que carece de habilidades de liderazgo.
• Base de datos como comunicador de procesos (data-
• Abuso de la métrica (metric abuse): Utilización ma- base as an IPC): Usar una base de datos para comu-
nipuladora o incompetente de las medidas y las mé- nicar procesos en uno o varios ordenadores, cuando
tricas. la comunicación entre procesos directa es más ade-
cuada.
• Sr. Amigo de todos (Mr. Nice Guy): Se aplica al ges-
tor que pretende convertirse en amigo de todos. • Blob: Véase Objeto todopoderoso.
• Héroe del proletariado (proletariat hero): El “em- • BOMQ (Batch Over MQ): Abuso en el empleo de in-
pleado para todo”que siempre es puesto como ejem- tegración basada en mensajes en tiempo real para
plo ante sus compañeros, pero que realmente es la transferencias esporádicas de gran tamaño en segun-
excusa perfecta para demandas crecientes y cons- do plano.
tantes incrementos de expectativas.
• Clase Gorda: Dotar a una clase con demasiados atri-
• Estrellas nacientes (rising upstart): Se aplica a quie- butos y/o métodos, haciéndola responsable de la ma-
nes, teniendo potencial, no son capaces de respe- yoría de la lógica de negocio.
tar la progresión profesional establecida, y preten-
• Botón mágico (magic pushbutton): Tender, desarro-
den sortear los plazos y requisitos de aprendizaje y
llando interfaces, a programar la lógica de negocio
madurez.
en los métodos de interacción, implementando los
• Ejecutivo sin carácter (spineless executive): Gestor, resultados de las acciones del usuario en términos
coordinador o responsable que no tiene el coraje de no su cientemente abstractos.
enfrentarse a las situaciones, asumir las responsabi- • Carrera de obstáculos (race hazard): Incapacidad de
lidades de los errores, o dar la cara por sus subordi- prever las consecuencias de diferentes sucesiones de
nados. eventos.
• Caballero de tres cabezas (three-headed knight): • Entrada chapuza (input kludge): No especi car e im-
Gestor indeciso, poco rme, dubitativo. plementar el manejo de entradas inválidas.
• Arma de nitiva (ultimate weapon): Individuos alta- • Fábrica de combustible (gas factory): Diseñar de
mente competentes en los que la organización o sus manera innecesariamente compleja.
compañeros confían tanto que se convierten en el
canal por el que todo pasa. • Gran bola de lodo (big ball of mud): Construir un
sistema sin estructura de nida.
• Recién llegado (warm body): Trabajador que apenas
cubre las expectativas mínimas y por tanto circula de • Interfaz in ada (interface bloat): Pretender que una
proyecto en proyecto o de equipo en equipo. interfaz sea tan potente que resulta extremadamente
difícil de implementar.
• Arquitecto a obrero (super builder): Creencia por la
• Inversión de abstracción (abstraction inversion): No
que se asigna a un buen diseñador de software al
exponer las funcionalidades implementadas que los
desarrollo de código pensando en que tardara mu-
usuarios necesitan, forzando a que se reimplementen
cho menos en teclearlo.
a más alto nivel.
• Objeto todopoderoso (god object): Concentrar de- • Código ravioli (ravioli code): Construir sistemas con
masiada funcionalidad en una única parte del diseño multitud de objetos muy débilmente conectados.
(clase).
• Comprobación de tipos en lugar de interfaz (chec-
king type instead of interface): Comprobar que un
• Poltergeist (informática): Emplear objetos cuyo úni-
objeto es de un tipo concreto cuando lo único que
co propósito es pasar la información a terceros ob-
se necesita es veri car si cumple un contrato deter-
jetos.
minado.
• Problema del círculo-elipse (circle-ellipse problem): • Con anza ciega (blind faith): Descuidar la compro-
Crear variables de tipo pensando en los valores de bación de los resultados que produce una subrutina,
posibles subtipos. o bien de la efectividad de un parche o solución a un
problema.
• Problema del yoyó (yo-yo problem): Construir es-
tructuras (por ejemplo, de herencia) que son difíci- • Doble comprobación de bloqueo (double-checked
les de comprender debido a su excesiva fragmenta- locking): Comprobar, antes de modi car un objeto,
ción. si es necesario hacer esa modi cación, pero sin blo-
quear para comprobarlo, de manera que dicha com-
• Singletonitis: Abuso de la utilización del patrón probación puede fallar.
singleton. • Fallo de caché (caching failure): Olvidar restablecer
una marca de error cuando éste ya ha sido tratado.
• YAFL (yet another fucking layer, y otra maldita ca-
pa más) o 'Código Lasagna': Añadir capas innece- • Lava seca (lava ow): Código muerto e información
sarias a un programa, biblioteca o framework. Esta de diseño olvidada permanecen congelados en un di-
tendencia se extendió bastante después de que se pu- seño cambiante. Esto es análogo a un ujo de lava
blicase el primer libro sobre patrones. en el que se van endureciendo pedazos de roca. La
1∨ CAPÍTULO 7. ANTIPATRÓN DE DISEÑO
• Ocultación de errores (error hiding): Capturar un • Reinventar la rueda (reinventing the wheel): Enfren-
error antes de que se muestre al usuario, y reem- tarse a las situaciones buscando soluciones desde ce-
plazarlo por un mensaje sin importancia o ningún ro, sin tener en cuenta otras que puedan existir ya
mensaje en absoluto. para afrontar los mismos problemas.
• Packratting: Consumir memoria en exceso debido • Reinventar la rueda cuadrada (reinventing the square
a no liberar objetos reservados dinámicamente una wheel): Crear una solución pobre cuando ya existe
vez ya han dejado de ser necesarios. una buena.
• Bala de plata (silver bullet): Asumir que nuestra so- • In erno DLL (DLL hell): Problemas con las
lución técnica favorita puede resolver un problema versiones, disponibilidad o proliferación de
mucho mayor. DLLs (especí co de Microsoft Windows)
• Desarrollo conducido por quien prueba (tester dri- • In erno JAR (JAR hell): Problemas con dife-
ven development): Permitir que un proyecto softwa- rentes versiones o ubicaciones de cheros JAR
re avance a base de extraer sus nuevos requisitos de (Java), típicamente causados por la falta de
los informes de errores. comprensión del modelo de carga de clases.
7.3. RELACIÓN ALFABÉTICA DE OTROS ANTIPATRONES 1∩
7.2 Algunos antipatrones organi- • Sistema de cañerías (stovepipe): Tener una organi-
zación estructurada de manera que favorece el ujo
zacionales de información vertical, pero inhibe la comunica-
ción horizontal.
• Alcance incremental (scope creep): Permitir que el
alcance de un proyecto crezca sin el control adecua- • Te lo dije (I told you so): Permitir que la atención se
do. centre en que la desoída advertencia de un experto
se ha demostrado justi cada.
• Dependencia de proveedor (vendor lock-in): Cons-
truir un sistema que dependa en exceso de un com- • Gallina de los huevos de oro (cash cow): Pecar de au-
ponente proporcionado por un tercero. tocomplacencia frente a nuevos productos por dis-
poner de un producto legacy muy lucrativo.
• Diseño en comité (design by committee): Contar con
muchas opiniones sobre un diseño, pero adolecer de
falta de una visión uni cada. 7.3 Relación alfabética de otros an-
• Escalada de compromiso (escalation of commit- tipatrones
ment): No ser capaz de revocar una decisión a la
vista de que no ha sido acertada. • Arrojar al otro lado del muro (thrown over the wall):
Cuando un proyecto involucra a varios grupos de
• Funcionalitis creciente (creeping featuritis): Añadir trabajo y va pasando secuencialmente de uno a otro,
nuevas funcionalidades al sistema en detrimento de con escasa o nula comunicación entre ellos.
su calidad.
• Billete lobo (wolf ticket): Declarar compatibilidad
• Gestión basada en números (management by num- con un estándar cuando ésta no existe, o bien cuando
bers): Prestar demasiada atención a criterios de ges- el estándar solo incluye recomendaciones no obliga-
tión cuantitativos, cuando no son esenciales o difí- torias que, de hecho, no se siguen.
ciles de cumplir.
• Fiesta de los bocazas (Blowhard Jamboree): Cuando
• Gestión de champiñones (mushroom management): se intenta que las decisiones técnicas del proyecto
Tratar a los empleados sin miramientos, sin infor- sean las basadas en opiniones de expertos publicadas
marles de las decisiones que les afectan (mantenién- en prensa.
dolos cubiertos y en la oscuridad, como los champi-
ñones). • Cadena sin longitud (string without length).
• Gestión porque lo digo yo (management by perkele): • Cajas de diálogos en cascada (cascading dialog bo-
Aplicar una gestión autoritaria con tolerancia nula xes).
ante las disensiones. • Callejón sin salida (dead end): Encontrar un proble-
ma que impide continuar trabajando, pero la direc-
• Migración de costes (cost migration): Trasladar los
ción no permite corregir el problema. El equipo que-
gastos de un proyecto a un departamento o socio de
da estancado.
negocio vulnerable.
• Caminar por un campo de minas (walking through
• Obsolescencia continua (continuous obsolescence): a mine eld): Trabajar con un componente pobre-
Destinar desproporcionados esfuerzos a adaptar un mente probado (usualmente inestable), y por tanto
sistema a nuevos entornos. poco con able.
• Organización de cuerda de violín (violin string orga- • Chivo expiatorio (scape goat): Ante circunstancias
nization): Mantener una organización a nada y en de crisis en un proyecto se toma la decisión de di-
buen estado, pero sin ninguna exibilidad. rigir las culpas a una persona o a un conjunto de
personas concretas sin analizar si verdaderamente la
• Parálisis por análisis (analysis paralysis): Dedicar naturaleza del problema se encuentra en las mismas.
esfuerzos desproporcionados a la fase de análisis
de un proyecto, eternizando el proceso de diseño • Codi cación brutal: Presionar a los programadores
iterando sobre la búsqueda de mejores soluciones o a trabajar sobre una arquitectura sin diseñar y sin
variantes. requisitos evidentes.
• Peligro moral (moral hazard): Aislar a quien ha to- • Comité designado (appointed team): Crear un comi-
mado una decisión a raíz de las consecuencias de la té o grupo de trabajo para resolver un problema y no
misma. ocuparse de lograr que el grupo funcione.
1∪ CAPÍTULO 7. ANTIPATRÓN DE DISEÑO
• Contenedor mágico (magic container): La imple- • El gestor controla el proceso (manager controls pro-
mentación de métodos que intentan ser tan exibles cess).
como para adaptar su comportamiento a multitud de • El traje nuevo del emperador (emperor's new clot-
circunstancias, sobrepasando el umbral de una man- hes): Temor a señalar los defectos de un producto o
tenibilidad adecuada del mismo. proceso que un gerente o manager cree que funciona
• Cuerpos tibios (warm bodies). bien.
• El viejo gran duque de York (the grand old Duke of
• Culto al carguero (cargo cult): Consiste en copiar York): Cuando los arquitectos o analistas no inter-
ciertas prácticas que podrían ser consideradas (no vienen (uno o los dos), dejando a los programadores
siempre) buenas prácticas sin saber muy bien los (especialistas en la implementación) prácticamente
bene cios o ventajas que proporcionan, provocando todas las decisiones a nivel e ejecución de las espe-
esfuerzo innecesario en el proyecto para incorporar- ci caciones del usuario.
las o problemas.
• Ellos me entendieron (they understood me): Expli-
• Cultura del miedo (fear culture)): Ambiente en el car a programadores o diseñadores junior lo que se
que cada empleado tiene miedo de mostrar el resul- espera de ellos muy brevemente, y asumir que en-
tado de su trabajo por miedo a ser despedido por tendieron lo que se les pidió.
tener errores.
• Embudo de excepciones (exception funnel): Atrapar
• Cultura del héroe (hero culture): Se produce cuando una excepción e ignorarla, sin reportarlo.
una o pocas personas toman la responsabilidad del
• Entrenar al entrenador (train the trainer): Contratar
éxito de todo el equipo o proyecto, a menudo traba-
una formación sin haber precisado con cierta exac-
jando sobretiempo.
titud la materia sobre la que se desea la misma. Es-
• Decisión aritmética (decision by arithmetic): En lu- to puede provocar que la formación no se enfoque
gar de intentar tomar una decisión con los datos dis- de manera adecuada, tratando aspectos que no son
ponibles y basado en el conocimiento y experiencia necesarios en el proyecto o dejando fuera aspectos
de nuestros colaboradores y el nuestro, se trata de fundamentales. Contratar una formación sin tener
justi car la misma sobre la base de unos factores referencias del formador, ya que lo mismo su nivel
presuntamente objetivos. de conocimiento no es el adecuado a la naturaleza
de la formación a impartir.
• Desarrollo distribuido geográ camente (geographi-
cally distributed development). • Es un problema de operadores (it is an operator pro-
blem).
• Desarrollo marcado por las herramientas (autogene-
• Esconder las armas (cover your assets).
rated stovepipe): Preferir una solución generada au-
tomáticamente sobre la mejor solución. • Falsa economía (false economy): Permitir que los
recortes de presupuesto afecten la e ciencia de los
• Descomposición funcional (functional decomposi- trabajadores (las pérdidas terminan siendo mayores
tion): Traducir un programa de un lenguaje estruc- que lo ahorrado).
turado a uno OO usando una sola clase y muchos
métodos privados. • Falso punto nal subrogado (false surrogate end-
point).
• Diseñar por diseñar (design for the sake of design):
Realizar un diseño excesivamente complejo sin ne- • Fechas en punto otante ( oating point times).
cesidad real. • Haz tu propia base de datos (roll your own databa-
se): Ante la necesidad de persistencia de datos se
• Diseño con arquitectura impuesta (architecture as utiliza una solución que no se basa en un estándar.
requirement): Imponer que el diseño considere, obli-
gatoriamente, el uso de herramientas o métodos no • Ingenieros compatibles e intercambiables (plug
necesariamente idóneos. compatible interchangeable engineers).
• Diseño de fregadero (kitchen sink design). • Introducción de di cultad por analogía (analogy
breakdown): Diseñar por analogía con problemas
• Diseñadores empíricos (architects don't code): Inca- resueltos, posiblemente introduciendo di cultades
pacidad del grupo de diseño para evaluar la comple- no inherentes al problema, o descuidando di culta-
jidad del objeto diseñado. des propias del nuevo caso que se maneja.
7.3. RELACIÓN ALFABÉTICA DE OTROS ANTIPATRONES 19
• Invocar a constructores con nulos (passing nulls to contingencias del proceso de desarrollo, o cuando no
constructors). se es exible ante una plani cación inicial, conser-
vándose a lo largo del proyecto pese a que se pueda
• La disputa familiar (the feud): Cuando existiendo un apreciar que resulta absolutamente irreal.
con icto entre gestores de proyectos no se le busca
una solución de nitiva al mismo. • Nacionalismo (national ism).
• La experiencia mata el diseño (architecture by im- • Navaja suiza (swiss army knife): Intentar crear un
plication): Descuidar el diseño por con ar excesiva- producto que solucione varios problemas poco rela-
mente en la experiencia previa. cionados entre sí.
• Los clientes son tontos (customers are idiots): Pensar • No es mi trabajo (Not my job): No solucionar algún
que uno sabe más que el cliente, y por tanto no es problema evidente argumentando que es problema o
necesaria una investigación con el cliente. fallo de otro.
• Maníaco del control (control freak): El deseo de • No especi car (specify nothing).
control lleva a la microgestión y ésta a su vez a una • No inventado aquí (not invented here): Cuando la or-
pérdida importante de la capacidad de autogestión ganización o uno se niega a utilizar soluciones, me-
del equipo, ya que todos los pasos se miden milimé- todologías, prácticas, herramientas, etc. externas só-
tricamente. lo porque no se nos ocurrió previamente.
• Máquina de Rube Goldberg (Rube Goldberg machi- • Otra reunión más lo resolverá (yet another meeting
ne): Realizar implementaciones muy complejas para will solve it): Ante un problema en la plani cación
tareas sencillas. del proyecto, se convocan reuniones para intentar
dar una solución al problema. En éstas reuniones
• Matar al mensajero (shoot the messenger). participan los miembros del equipo de proyecto que
• Matar dos pájaros de un tiro (kill two birds with one tendrán que dejar su trabajo habitual, produciéndo-
stone). se nuevos retrasos.
• Matrimonio sumarísimo (sumo marriage): Suele • Otro programador más (yet another programmer).
ocurrir en cualquier situación en la que exista una • Presunto heredero (heir apparent): Cuando vemos
dependencia de un elemento o de una serie de facto- que los posibles huecos que podrían quedar para se-
res que di cultan el mantenimiento o evolución del guir progresando en nuestra organización tienen ya
sistema. nombres y apellidos (cuando además sus méritos son
más que discutibles), provocará la salida de la orga-
• Mazorca de maíz (corn cob): Mantener personas en
nización en busca de otras alternativas o se produci-
el proyecto que resultan difíciles, con ictivas o que
rá una pérdida de motivación que impactará direc-
funcionan de manera absolutamente al margen de lo
tamente en la productividad.
que es cualquier trabajo en equipo o de un compor-
tamiento solidario y que rompen con la armonía del • Proceso a prueba de idiotas (idiot proof process).
grupo.
• Programador discordante (net negative producing
• Mecanismos de recompensa discordantes (discor- programmer): Hay proyectos donde el rendimiento
dant reward mechanisms): Un equipo recibe reco- de uno o más miembros del equipo es muy inferior
nocimiento por ser el que más trabajo ejecuta sobre al esperado, hasta el punto de ser su productividad
la base de criterios objetivos que no son válidos para neta en el proyecto negativa (el proyecto mejoraría
medir el nivel de productividad o calidad. con el simple hecho de prescindir de estas personas,
sin necesidad de sustituirlas por otra)
• Mezclador de software (software merger).
• Proyecto del día de la marmota (ground hog day pro-
• Miedo al éxito (fear of success): Permitir que las ject): Discutir los mismos temas en todas las reunio-
únicas razones de que los trabajos no se completen nes, sólo para llegar a la conclusión de que “algo
sean de índole social. debe hacerse”.
• Moneda en punto otante ( oating point currency): • Prueba incompleta (asynchronous unit testing): Des-
Utilizar una representación en punto otante para cuidar en la etapa de pruebas, algunas unidades en
valores que representan dinero, lo que puede provo- todos los casos, o todas las unidades en algunos ca-
car pérdida de precisión. sos.
• Morir plani cando (death by planning): Invertir más • Quiero estimaciones ahora (give me estimates now):
esfuerzo (y tiempo) del necesario para establecer un Dar estimaciones sin tener su cientes datos para ha-
plan que después puede ser destruido por las propias cerlas.
20 CAPÍTULO 7. ANTIPATRÓN DE DISEÑO
• Requisitos esparcidos por la pared (requirements tos- • Violencia intelectual (intellectual violence): De ma-
sed over the wall): Existe un desorden general en los nera interna en un equipo de trabajo o en una
requisitos: se encuentran en distinto grado de termi- reunión con el cliente y/o con usuarios se utilizan
nación, no hay priorización de los mismos o es muy términos, generalmente técnicos, que no son com-
general como para poder hacer una ordenación ade- prendidos o conocidos por la mayoría de los inter-
cuada por ese criterio, etc. Esto normalmente es pro- locutores.
vocado por una colaboración inadecuada por parte
del área usuaria.
• Requisitos ocultos (Hidden requirements): El equipo 7.4 Véase también
de proyecto conocedor de la di cultad de implemen-
tar un determinado requisito lo obvia dentro del ca- • Patrón de diseño
tálogo de requisitos, le asigna una prioridad muy ba-
• Crisis del software
ja o lo engloba dentro de un requisito de mayor nivel
quedando difuminado en el mismo. El área usuaria • Hediondez del código
no especi ca un requisito o no lo especi ca de ma-
nera adecuada, solicitando explicaciones a posterio- • No hay balas de plata
ri por la no implementación de ese requisito o por
su comportamiento incorrecto.
• Si funciona, no lo toques (if it is working don't chan-
7.5 Enlaces externos
ge):.
• [Link] (antipatrones) Portland Pattern Reposi-
• Somos tontos (we are idiots): Pensar que el conoci- tory's Wiki
miento interno del problema es peligroso (por riesgo
de que sea pobre o equivocado), y pedir validación
del cliente para cada característica o decisión ma-
yor.
• Tarjetas CRCI (CRCI cards): Cuando se usa
la técnica de tarjetas CRC, se aprovecha e
incluye en la misma la implementación de la
clase, convirtiéndose automáticamente la tar-
jeta CRC (Class-Responsibility-Collaboration)
en CRCI (Class-Responsibility-Collaboration-
Implementation).
• Tormenta de reproches (blame storming): En un
equipo de proyecto se llega a la conclusión de que
la mejor forma de analizar las causas de la no con-
secución de los objetivos es que se discuta quiénes
internamente han tenido la culpa.
• Torre de vudú (tower of voodoo):Se tiene un código
que se sabe que funciona (aunque generalmente no
se sabe muy bien cómo) y se pretende añadir algún
tipo de funcionalidad adicional, en ocasiones no muy
cohesionada con la ya implementada y se le coloca
un envoltorio (wrapper) proporcionando una nueva
interfaz de acceso a ese nuevo componente.
• Trampa para osos (bear trap): Invertir mucho en
una herramienta poco adaptada o factible, de ma-
nera que después es imposible deshacerse de ella.
• Único punto de salida de función (single function exit
point).
• Valor por defecto inde nido (zero means null): Es-
coger un valor arbitrario para representar la inde ni-
ción, sin garantizar que ese valor no puede realmente
ocurrir.
Capítulo 8
Archivo de cabecera
Se denomina header file, al español chero/archivo (de) Sin embargo en esta simple ilustración se requiere que
cabecera, o include file, al español chero de inclu- el programador mantenga la declaración de la función de
sión, en ciencias de computación, especialmente en el add en dos sitios ̶en el archivo que contiene su imple-
ámbito de los lenguajes de programación C y C++, al mentación y en el archivo que usa la funcionalidad. Si
archivo, normalmente en forma de código fuente, que el la de nición de la función llega a alterarse, entonces el
compilador incluye de forma automática al procesar al- programador debe actualizar todos los prototipos repar-
gún otro archivo fuente. Típicamente los programadores tidos a lo largo del programa. Esto es necesario porque
especi can la inclusión de los header les por medio de la implementación de ambos, C y C++ han de diagnosti-
pragmas al comienzo (head o cabecera) de otro archivo car todas las violaciones de lo que en C++ se llama "one
fuente. de nition rule" (ODR), al español “regla de una única
Un header le contiene, normalmente, una declaración de nición”. De hecho, la mayoría de ellos se sirven de
directa de clases, subrutinas, variables, u otros un enlazador para realizar esta labor. El enlazador, sin
identi cadores. Aquellos programadores que desean embargo, suele conocer, de forma muy limitada los tipos
declarar identi cadores estándares en más de un archivo usados en los programas. Por ello, algunas de las viola-
fuente pueden colocar esos identi cadores en un único ciones de ODR no se detectan a la hora de implemen-
header le, que se incluirá cuando el código que contiene tar el lenguaje. Como resultado, es responsabilidad del
sea requerido por otros archivos. programador el mantener la coherencia de todas las de-
claraciones que cruzan las fronteras de una unidad por
La biblioteca estándar de C y la biblioteca estándar de traducir. Buscar todas estas declaraciones de una entidad
C++ tradicionalmente declaran sus funciones estándar en externa y ver car que son compatibles de forma manual
header les. es una tarea ardua. (Nótese que C no de ne el término
“one de nition rule”̶es especí co del lenguaje C++.
Si declaraciones de la misma entidad en muchos archivos
fuentes de C son diferentes, la función no funcionará de
8.1 Motivación forma adecuada y puede llegarse a un comportamiento
impredecible, independientemente de la regla que se esté
En la mayoría de lenguajes de programación modernos, violando.)
los programadores pueden dividir los programas en com- Para entender una violación ODR, considérese el siguien-
ponentes de menor tamaño (como pueden ser clases y te código (correcto):
subrutinas) y distribuir esos componentes entre muchas
/* File print-heading.c */ #include <stdio.h> void
unidades por traducir (típicamente en forma de archivos),
print_heading(void) { printf(“standard heading\n”); }
que el sistema puede compilar de forma autónoma. Si una
/* File main.c */ void print_heading(void); int main(void)
subrutina se tiene que usar al margen de la unidad por
{ print_heading(); return 0; }
traducir donde ha sido de nida, se tiene que introducir el
concepto de declaración directa o prototipos de funcio-
nes. Por ejemplo, una función de nida así en un archivo La unidad por traducir representada por el archivo fuen-
fuente: te main.c referencia a la función print_heading() que está
de nida en otra unidad por traducir (print-heading.c). De
int add(int a, int b) { return a + b; }
acuerdo con las reglas de C99, los programadores deben
declarar una función externa antes del primer uso. Para
puede declararse (con un prototipo de función) y ser re- cumplir con este requisito el archivo main.c declara la
ferida desde un segundo archivo fuente como sigue: función en la primera línea. Esta versión del código fun-
int add(int, int); int triple(int x) { return add(x, add(x, ciona de forma correcta.
x)); } Posteriormente, el programador que mantiene el archivo
21
22 CAPÍTULO 8. ARCHIVO DE CABECERA
fuente print-heading.c puede decidir hacer la función más /* File add.c */ #include “add.h”int add(int a, int b) {
exible y dar soporte a cabeceras a gusto del usuario. Una return a + b; }
posible implementación podría ser la siguiente:
/* File print-heading.c */ #include <stdio.h> void Normalmente, los programadores sólo utilizan los hea-
print_heading(const char *heading) { printf("%s\n”, der les para especi car los interfaces, y suelen aportar al
heading); } menos, una pequeña cantidad de información explicando
cómo usar los componentes declarados en el archivo. Al
Si el programador olvida actualizar la declaración en igual que en este ejemplo, las implementaciones de su-
main.c, se pueden dar resultados devastadores. La fun- brutinas permanecen en un archivo fuente separado, que
ción print_heading() espera un argumento y hace uso del continua siendo compilado de forma independiente. (Una
valor del mismo, sin embargo la función main() no pro- excepción común entre C y C++ son las "funciones inli-
vee ningún valor. Al ejecutar este programa se produce un ne", que suelen incluirse en header les porque la mayoría
comportamiento impredecible: la aplicación puede im- de implementaciones no pueden expendir funciones inli-
primir basura, terminar de forma inesperada o dar pie a ne de forma adecuada sin ver sus de niciones durante el
resultados impredecibles en la plataforma en la que es eje- tiempo de compilación.)
cutado.
←Por qué se puede compilar y enlazar este código sin pro-
blema alguno? El motivo es que el compilador se guía por 8.2 Alternativas
la declaración en main.c a la hora de compilar la unidad
por traducir main.c. Y esa declaración se ajusta con la for- Los header les no son la única solución al problema de
ma de la función. Más tarde, cuando el enlazador combina acceder identi cadores declarados en diferentes archivos.
las unidades de traducción ya compiladas main.c y print- Tienen la desventaja de que los programadores siguen te-
heading.c (en la mayoría de implementaciones represen- niendo que realizar cambios en dos sitios diferentes (en
tadas como archivos main.o o [Link]), probablmente el archivo fuente y en el header le) cuando se realiza un
podría detectar la inconsistencia ̶pero no en C. Las cambio en una de nición. Algunos lenguajes más jóve-
implementaciones en C referencian las funciones por el nes (como Java) prescienden de los header les y usan, en
nombre al nivel de archivo objeto y archivo binario, esto su lugar, una esquema de nombres que permite al compi-
no incluye el valor de retorno o la lista de argumentos. El lador localizar los archivos fuente asociados con imple-
enlazador encuentra una referencia a print_heading() en mentaciones de clases e interfaces (pero, al hacerlo, se
main.o y una función adecuada en print-heading.o. Lle- restringe la libertad a la hora de nombrar archivos). En
gado este punto, toda la información relativa a tipos de estos lenguajes, el problema de ODR se suele resolver
argumentos de funciones se pierde. por medio de dos técnicas: la primera, el compilador po-
←Cómo es entonces posible llevar a cabo declaraciones ne toda la información necesaria sobre los tipos en el có-
múltiples sin problema alguno? La solución se llama hea- digo compilado y esta información es accesisble incluso
der le. El header le de un módulo declara cada función, cuando el programa se ejecuta.; la segunda, Java y otros
objeto y tipo de dato que forma parte del interfaz públi- lenguajes modernos tienen la posiblidad de veri car el
co del módulo ̶por ejemplo, en este caso el header le número y tipo de los argumentos como método de invo-
incluiría sólo la delcaración de add. Todo aquel archivo cación. Todo esto tiene su precio: un exceso en espacio
fuente que se re era a add usa la directiva #include en el y tiempo de ejecución que no es aceptable para algunas
header le: aplicaciones donde el tiempo de respuesta es crítica.
/* File add.h */ #ifndef ADD_H #de ne ADD_H int COBOL y RPG IV tienen una forma de incluir archivos
add(int, int); #endif /* ADD_H */ llamada copybooks. Los programadores“incluyen”éstos
en la fuente del programa de forma similar a como se ha-
ce con los header les, permitiendo también reemplazar
(Nótese que el header le utiliza un "Include guard".) ciertas partes del texto. La palabra clave de COBOL para
/* File triple.c */ #include “add.h”int triple(int x) { la inclusión es copy, y el reemplazo se realiza por medio
return add(x, add(x, x)); } de la cláusula replacing...by.
Aserción (informática)
En programación, una aserción es un predicado (i.e., una 9.1 Uso de las aserciones
sentencia verdadero-falso) incluido en un programa co-
mo indicación de que el programador piensa que dicho En lenguajes como Ei el, las aserciones son parte del pro-
predicado siempre se cumple en ese punto del ujo de ceso de diseño, mientras que en otros, como C o Java,
programa. solamente son utilizadas para comprobar suposiciones en
Por ejemplo, el siguiente código contiene dos aserciones: tiempo de ejecución.
x := ∧; {x > 0} x := x + 1 {x > 1}
9.1.1 Aserciones en el diseño por contrato
x > 0 y x > 1, y las dos son ciertas en dichos puntos de la
ejecución. Las aserciones pueden ser una forma de documentación:
pueden describir el estado en que el código empieza su
Las aserciones suelen ser útiles para especi car progra-
ejecución (precondición), y el estado que el código espera
mas y para razonar la corrección de los mismos. Por
alcanzar cuando nalice (postcondición); asimismo pue-
ejemplo, una precondición ̶una aserción al comienzo
den servir de especi cación para los invariantes de clase.
de una sección de código ̶determina que se espera que
En Ei el, tales aserciones se integran en el código y son
el conjunto de sentencias que la siguen sean ejecutadas.
automáticamente extraídas para documentar la clase. Es-
Una postcondición ̶colocada al nal ̶describe el esta-
to supone una parte importante del método de diseño por
do que se espera alcanzar al nal de la ejecución.
contrato.
El ejemplo anterior utiliza la notación introducida por C.
Esta aproximación también resulta útil en lenguajes que
A. R. Hoare en su artículo de 19∨9 "An axiomatic ba-
no las soportan explícitamente: la ventaja de usar senten-
sis for computer programming" ("Una base axiomá-
cias de aserción en lugar de aserciones en comentarios es
tica para la programación de ordenadores"). Como esta
que las primeras pueden ser comprobadas en cada ejecu-
notación normalmente no es aceptada por los compilado-
ción; si la aserción no se cumple, puede informarse del
res de los lenguajes actuales, los programadores suelen
error. Esto previene que el código y las aserciones se des-
incluir aserciones mediante comentarios. A continuación
fasen (un problema que puede ocurrir con las aserciones
se incluye un ejemplo en C:
comentadas).
x = ∧; /* {x > 0} */ x = x + 1; /* {x > 1} */
24
9.2. DESACTIVACIÓN DE LAS ASERCIONES 2∧
posición ̶si contarUsuarios devuelve un valor negativo, 9.2 Desactivación de las aserciones
es probable que haya un fallo en el programa.
Una gran ventaja de esta técnica es que cuando se produce Las aserciones suelen ser implementadas de modo que
algún error éste es inmediata y directamente detectado, puedan ser activadas o desactivadas, normalmente en el
evitando posibles daños colaterales ocultos. Puesto que conjunto del programa. Sin embargo, los lenguajes que
un error de aserción normalmente informa de la línea de distinguen entre distintos tipos de aserciones – [Link]. pre
código donde se produce, se puede localizar el error sin y postcondiciones – suelen permitir activarlas o desacti-
necesidad de una depuración más exhaustiva. varlas de forma independiente. Si las aserciones son des-
activadas, no se comprueban en tiempo de ejecución. De
Las aserciones también suelen colocarse en puntos que
esta forma el programador puede colocar aserciones en
se supone que no se alcanzan durante la ejecución. Por
lugares donde en otro caso no tendría sentido ponerlas
ejemplo, las aserciones pueden ser colocadas en la cláu-
([Link]., comprobar que no se accede a un array median-
sula default de una estructura switch en lenguajes como
te índices fuera de rango). Puesto que las aserciones son
C, C++ y Java. Los casos que intencionadamente no se
en principio una herramienta de desarrollo, normalmente
manejan pueden provocar errores que aborten el progra-
son desactivadas cuando el programa en cuestión es pu-
ma.
blicado. Por otra parte, como algunas versiones del pro-
En Java, las aserciones han sido parte del lenguaje desde grama pueden incluir aserciones y otras no, es primordial
la versión 1.4. Los errores de aserción resultan en Asser- que su desactivación no modi que el comportamiento del
tionError cuando el prorgama es ejecutado con los pará- programa. En otras palabras, las aserciones deben ser li-
metros correctos, sin los cuales las sentencias de aserción bres de efectos colaterales. Una alternativa en el caso de
son ignoradas. En C y C++, son añadidas por el chero de C o C++ es rede nir la macro assert para evaluar la ex-
cabeceras estándar assert.h de niendo assert (aserción) presión incluso cuando las aserciones están desactivadas.
como una macro que devuelve un error en caso de fallo y
La eliminación de las aserciones del código de produc-
naliza el programa.
ción es un proceso que se realiza de forma casi automá-
Las inclusión en los lenguajes de construcciones de aser- tica. Normalmente se realiza mediante compilación con-
ción facilitan el desarrollo guiado por pruebas (Test- dicional, por ejemplo utilizando el preprocesador de C
driven Development - TDD) al no necesitar de una libre- o C++ o pasando un parámetro de ejecución, como en
ría independiente que implemente dichas aserciones. Java. Algunas personas, sin embargo, se oponen a la eli-
minación de las aserciones basándose en una analogía que
compara la ejecución con aserciones y sin ellas en la fase
de desarrollo con la práctica de la natación en una piscina
9.1.3 Aserciones durante el ciclo de desa- con la vigilancia de un socorrista para después nadar solo
rrollo en el mar. Asimismo añaden que las aserciones también
ayudan a desarrollar un programa a prueba de fallos.
Durante el ciclo de desarrollo, el programador normal-
mente ejecuta su programa con las aserciones activadas.
Cuando una aserción resulta falsa y se produce el corres-
pondiente error, el programador automáticamente recibe 9.3 Comparación con los maneja-
un aviso. Muchas implementaciones además detienen la dores de errores
ejecución del programa ̶esto resulta útil ya que si el pro-
grama sigue ejecutándose tras la violación de una aser-
Es importante establecer las semejanzas y diferencias en-
ción, éste entra en un estado corrupto que puede hacer
tre las aserciones y las rutinas de control de errores. Las
más difícil la localización del problema. Gracias a la in-
aserciones deberían ser utilizadas para documentar situa-
formación proporcionada por el error de aserción (punto
ciones lógicamente imposibles y descubrir posibles erro-
del código que ha provocado el fallo, quizás el stack trace
res de programación̶si ese“imposible”ocurre, es que
o incluso todo el contexto de la aserción violada), el pro-
algo fundamental está claramente equivocado. Esto di e-
gramador puede corregir el problema. De este modo, las
re del control de errores: la mayoría de las condiciones de
aserciones sirven como potente herramienta de depura-
error son posibles, aunque deberían ser muy poco proba-
ción.
bles en la práctica. El uso de aserciones como mecanismo
general de control de errores suele ser algo desacertado:
las aserciones no permiten al programa recuperarse de
9.1.4 Aserciones estáticas los errores, y un fallo de aserción suele suponer una ter-
minación abrupta del programa. Asimismo las aserciones
Las aserciones que son comprobadas en tiempo de com- no suelen mostrar mensajes de error comprensibles por el
pilación reciben el nombre de aserciones estáticas. Este usuario.
tipo de aserciones resultan particularmente útiles en la Considérese el siguiente ejemplo de uso de aserciones pa-
metaprogramación de plantillas. ra manejar un error:
2∨ CAPÍTULO 9. ASERCIÓN (INFORMÁTICA)
Automatización de tareas
2∩
Capítulo 11
Base de código
2∪
Capítulo 12
Bean
29
Capítulo 13
Beta tester
13.1 Generalidades
Los beta testers usan sus conocimientos informáticos y su
tiempo para detectar errores en la versión beta del soft-
ware y así poder informar de éstos para que los desarro-
lladores los corrijan, o corregirlos ellos mismos. Algu-
nas compañías los contratan para asegurarse de que sus
programas van a funcionar lo mejor posible en el merca-
do. Otro tipo de beta testers son los que trabajan desinte-
resadamente ofreciendo soporte y ayuda a la comunidad
GNU.
Generalmente el“betatester”comparte una cierta a ni-
dad con la herramienta puesta a prueba en cuestión, de ahí
el entusiasmo por probarla, veri car nuevas funcionalida-
des y detectar anomalías en pos de mejorar el desarrollo
de la herramienta en cuestión.
13.4 Referencias
[1] S.E. Smith (2003). «What is a Beta Tester?» (en inglés).
Consultado el 20 de octubre de 2010.
30
Capítulo 14
Este artículo se re ere a la bifurcación Soy el padre con id 1 id proceso original 1 Soy el hijo con
de procesos en sistemas operativos, consulta id 2 id proceso original 1
Bifurcación (informática) para otros usos. El orden de la salida será determinada por diversos pa-
rámetros del núcleo del sistema operativo. Como se pue-
Una bifurcación o fork, cuando se aplica en el contex- de observar, el valor contenido en la variable idPropio es
to de un lenguaje de programación o un sistema operati- compartido por proceso padre e hijo; sin embargo, la re-
vo, hace referencia a la creación de una copia de sí mis- ferencia a la variable no es la misma y su posterior modi-
mo por parte de un programa, que entonces actúa como cación en cada código, ya sea del padre o del hijo, no se
un "proceso hijo" del proceso originario, ahora llamado verá re ejada en ambos procesos.
"padre". Los procesos resultantes son idénticos, salvo que
tienen distinto número de proceso (PID).
Más generalmente, una bifurcación en un entorno 14.2 Véase también
multihilo signi ca que un hilo de ejecución se bifurca.
• Bomba fork
• Tubería
14.1 UNIX
En el caso de los sistemas operativos derivados de UNIX,
la llamada al sistema fork permite realizar una bifurca-
ción del proceso. Esta llamada devuelve el identi cador
de proceso del proceso hijo al padre y un 0 al proceso
hijo.
Aquí hay un ejemplo escrito en lenguaje de programación
C que muestra el uso de esta llamada. El código que se
ejecute depende de si el proceso es padre o hijo.
#include <stdio.h> #include <unistd.h> #include
<sys/types.h> int main(void) { pid_t idHijo; pid_t idPro-
pio; idPropio = getpid(); //Se obtiene el id del proceso
actual idHijo = fork(); //Se crea un proceso 'hijo' if
(idHijo == −1) { //Si hay un código menor que cero,
hubo un error perror(“Error al realizar la bifurcación”
); //Se noti ca al usuario return 1; //Se interrumpe la
ejecución del proceso con una salida distinta a cero } if
(idHijo == 0) //la ejecución de la llamada al sistema fork
devuelve un cero al proceso 'hijo' printf(“Soy el hijo
con id %ld id proceso original %ld\n”, (long)getpid(),
(long)idPropio); else //la ejecución de la llamada al
sistema fork devuelve el identi cador al proceso 'padre'
printf(“Soy el padre con id %ld id proceso original
%ld\n”, (long)getpid(), (long)idPropio); return 0; }
31
Capítulo 15
Binding
En Psicología, el término binding se re ere a una metodo- • [Link] - Información sobre el pro-
logía innovadora (Proyecto Binding) para enseñar a leer grama 'Binding'
que nace de aplicar la evidencia cientí ca en el ámbito
del aprendizaje, desarrollada por la Universidad de Bar-
celona. Saber cómo trabaja nuestro cerebro para realizar
una tarea tan complicada como la lectura es esencial pa-
ra poder crear las mejores técnicas de aprendizaje lector
([Link]
Aunque todavía queda mucho camino por recorrer en es-
te sentido, hoy en día se sabe que leer (y comprender) es
el resultado de una gran cantidad de procesos cognitivos:
la memoria de trabajo, el bucle fonológico, la capacidad
de inferencia y deducción, entre otros. Así pues, Binding
parte de la idea de que la mejor manera de enseñar a leer
es entrenar lo que se ha comprobado cientí camente que
es importante a la hora de adquirir la lectura - decodi-
cación, memoria de trabajo, morfología, léxico −. Los
resultados extraídos los últimos años de la aplicación del
Binding así lo avalan.
15.2 Informática
32
Capítulo 16
Bloqueo mutuo
33
34 CAPÍTULO 16. BLOQUEO MUTUO
• Condición de espera circular: dado el conjunto • La condición de espera circular es la más fácil de
de procesos P0 ...Pm (subconjunto del total de proce- atacar. Se le permite a un proceso poseer sólo un
sos original),P0 está esperando un recurso adquirido recurso en un determinado momento, o una jerar-
por P1 , que está esperando un recurso adquirido por quía puede ser impuesta de modo tal que los ciclos
P2 ,... ,que está esperando un recurso adquirido por de espera no sean posibles.
Pm , que está esperando un recurso adquirido por P0 .
Esta condición implica la condición de retención y
espera. 16.5 Livelock
Un livelock es similar a un deadlock, excepto que el estado
16.3 Evitando bloqueos mutuos de los dos procesos envueltos en el livelock constantemen-
te cambia con respecto al otro. Livelock es una forma de
Los bloqueos mutuos pueden ser evitados si se sabe cier- inanición y la de nición general sólo dice que un proceso
ta información sobre los procesos antes de la asignación especí co no está procesando.
de recursos. Para cada petición de recursos, el sistema
En un ejemplo del mundo real, un livelock ocurre por
controla si satisfaciendo el pedido entra en un estado in-
ejemplo cuando dos personas, al encontrarse en un pa-
seguro, donde puede producirse un bloqueo mutuo. De
sillo angosto avanzando en sentidos opuestos, y cada una
esta forma, el sistema satisface los pedidos de recursos
trata de ser amable moviéndose a un lado para dejar a
solamente si se asegura que quedará en un estado seguro.
la otra persona pasar, pero terminan moviéndose de lado
Para que el sistema sea capaz de decidir si el siguiente
a lado sin tener ningún progreso, pues ambos se mueven
estado será seguro o inseguro, debe saber por adelanta-
hacia el mismo lado, al mismo tiempo.
do y en cualquier momento el número y tipo de todos los
recursos en existencia, disponibles y requeridos. Existen Livelock es un riesgo con algunos algoritmos que detec-
varios algoritmos para evitar bloqueos mutuos: tan y recuperan los interbloqueos, pues si más de uno to-
ma cartas en el asunto, la detección del interbloqueo pue-
• Algoritmo del banquero, introducido por Dijkstra. de ser disparada continuamente; pudiendo ser arreglado
asegurándose que sólo un proceso (escogido al azar o por
• Algoritmo de grafo de asignación de recursos. prioridad) tome acción.
• Algoritmo de Seguridad.
• Algoritmo de solicitud de recursos.
16.4 Prevención
Los bloqueos mutuos pueden prevenirse asegurando que
no suceda alguna de las condiciones necesarias vistas an-
teriormente.
Bodyshopping
3∧
Capítulo 18
BrookGPU
3∨
Capítulo 19
3∩
Capítulo 20
3∪
20.5. VÉASE TAMBIÉN 39
• Interfaz
• Interfaz de usuario
• Diseño estructurado
• Cajanegrizar
Capítulo 21
CamelCase
• BellSouth
• CompuServe
• LinuxCabal
• Microsoft, antiguamente MicroSoft
Ejemplo de CamelCase en un indicador.
• PriceWaterhouseCoopers
CamelCase es un estilo de escritura que se aplica a frases • OmegaSoft
o palabras compuestas. El nombre se debe a que las ma- • VaxaSoftware
yúsculas a lo largo de una palabra en CamelCase se ase-
mejan a las jorobas de un camello. El nombre CamelCase • La Sexta
se podría traducir como Mayúsculas/Minúsculas Camello. • eDreams
El término case se traduce como“caja tipográ ca”, que
a su vez implica si una letra es mayúscula o minúscula y • En algunos hashtag
tiene su origen en la disposición de los tipos móviles en
casilleros o cajas.
Existen dos tipos de CamelCase:
21.2 Enlaces externos
• Primer wiki, creado por Ward Cunningham
• UpperCamelCase, cuando la primera letra de cada
una de las palabras es mayúscula. Ejemplo: Ejem- • Caja alta y baja en el DRAE.
ploDeUpperCamelCase.
• lowerCamelCase, igual que la anterior con la excep-
ción de que la primera letra es minúscula. Ejemplo:
ejemploDeLowerCamelCase.
21.1 Usos
• En varios lenguajes de programación
• Java
• .NET
• C
• C++
• Python
• C#
• Objective-C
• ActionScript
• PHP
• En las primeras herramientas wiki
40
Capítulo 22
Caml
Caml (Originalmente un acrónimo para Categorical let rec fact = function | 0 -> 1 | n -> n * fact(n - 1);;
Abstract Machine Language, en español Lenguaje Má-
quina Abstracto Categórico) es un dialecto de lafamilia de Esta última forma es la de nición matemática de factorial
losmeta lenguajes, desarrollado en INRIA y anteriormen- como una relación de recurrencia.
te en ENS.
Note que el compilador in rió el tipo de esta función para
Como muchos descendientes delML, Caml es un len- ser int -> int, signi ca que esta función mapea enteros a
guaje de tipado estático, evaluación estricta, y utiliza enteros. Por ejemplo, 12! Es:
administración de memoria automática.
# fact 12;; - : int = 4∩9001∨00
La primera implementación de Caml en Lisp fue apodada
“CAML pesado”debido a los requisitos de memoria y
CPU relativos a su sucesor “Caml Light”, aquello fue
implementado en C por Xavier Leroy y Damien Doligez.
Además de una reescritura completa, “CAML Special 22.1.3 Derivación numérica (funciones de
Light”añadió un potente sistema de módulos al núcleo
alto orden)
del lenguaje.
Actualmente, la implementación principal de Caml es Desde que OCaml es un lenguaje de programación fun-
OCaml, el cual añade muchas características nuevas al cional, es fácil crear y repasar funciones en programas de
lenguaje, entre ellas una capa de objeto. OCaml. Esta capacidad tiene un número enorme de apli-
caciones. Calcular la derivada numérica de una función es
una de ellas. La funciónd en Caml computa la derivada
22.1 Ejemplos numérica de una función dada f en un punto dado x:
let d delta f x = (f (x +. delta) −. f (x −. delta)) /. (2. *.
Lo siguiente, # representa el prompt de OCaml. delta);;
22.1.1 Hola Mundo Esta función requiere un valor in nitesimal delta. Una
buena elección para delta es la raíz cúbica del épsilon de
print_endline “Hello World!";; la máquina.
El tipo de la función d indica que ésta mapea un tipo
de dato otante a otra función del mismo tipo ( oat ->
oat) -> oat -> oat. Esto nos permite aplicar argumen-
22.1.2 Función factorial (recursividad y tos parcialmente. Este estilo funcional es conocido como
programación puramente funcio- curri cación. En este caso, es útil al aplicar parcialmente
nal) el primer argumento delta a d, para obtener una función
más especializada:
Muchas funciones matemáticas, como el factorial, son re- # let d = d (sqrt epsilon_ oat);; val d : ( oat -> oat) ->
presentadas más naturalmente en una forma puramente oat -> oat = <fun>
funcional. La siguiente función recursiva, puramente fun-
cional implementa la operación factorial en Caml:
Note que el tipo inferido indica que la sustitución d espe-
let rec fact n = if n=0 then 1 else n * fact(n - 1);; ra una función del tipo otante oat -> oat como primer
argumento. Podemos computar una aproximación numé-
La función puede ser escrita equivalentemente utilizando rica a la derivada de la función x3 − x − 1 en el punto
patrones de emparejamiento: x = 3 con:
41
42 CAPÍTULO 22. CAML
Los conceptos de funciones curri cadas y de alto orden • [Sitio o cial de Caml]
son útiles evidentemente en programas matemáticos. De
• [Tutoriales de caml (inglés)]
hecho, estos conceptos son igualmente aplicables a otras
formas de programación y pueden ser empleados en códi-
go de factor mucho más agresivamente, resultando epro- 22.4.1 Libros
gramas más cortos y con menos errores.
• The Functional Approach to Programming with
Caml by Guy Cousineau and Michel Mauny.
22.1.4 Transformada Wavelet discreta
(concordancia de patrones)
La transformada Wavelet de Haarde de una lista de nú-
meros enteros de potencia en base dos puede ser imple-
mentada muy sucintamente en Caml y es un ejemplo ex-
celente del uso de la concordancia de patrones sobre lis-
tas, tomando pares de elementos (h1 y h2) del frente y
almacenando sus sumas y diferencias en las listas s y d,
respectivamente:
# let haar l = let rec aux l s d = match l, s, d with [s], [],
d -> s :: d | [], s, d -> aux s [] d | h1 :: h2 :: t, s, d -> aux t
(h1 + h2 :: s) (h1 - h2 :: d) | _ -> invalid_arg “haar”in
aux l [] [];; val haar : int list -> int list = <fun>
Por ejemplo:
# haar [1; 2; 3; 4; −4; −3; −2; −1];; - : int list = [0; 20;
4; 4; −1; −1; −1; −1]
22.3 Referencias
Cardelli, Luca (19∪4). Compiling a functional language
ACM simposio en LISP y programación funcional, Asso-
Capítulo 23
43
Capítulo 24
Clase utilidad
44
Capítulo 25
[Link]
4∧
Capítulo 26
CMake
CMake es una herramienta multiplataforma de genera- el Visualization Toolkit (VTK), un sistema para grá cos
ción o automatización de código. El nombre es una abre- 3D y visualización libres.
viatura para“cross platform make”(make multiplatafor- Para crear CMake, Bill Ho man en Kitware incorporó
ma); más allá del uso de “make”en el nombre, CMake algunas ideas de pcmaker, y añadió más cosas propias,
es una suite separada y de más alto nivel que el sistema con el pensamiento de adoptar algunas de las funciona-
make común de Unix, siendo similar a las autotools. lidades del GNU build system. La implementación ini-
CMake es una familia de herramientas diseñada para cial de CMake tuvo lugar a mediados del 2000, con un
construir, probar y empaquetar software. CMake se uti- desarrollo acelerado a comienzos del 2001. Muchas me-
liza para controlar el proceso de compilación del softwa- joras se debieron a in uencias de otros desarrolladores a
re usando cheros de con guración sencillos e indepen- la hora de incorporar CMake a sus propios sistemas. Por
dientes de la plataforma. Cmake genera make les nativos ejemplo, la comunidad de VXL adoptó CMake, contribu-
y espacios de trabajo que pueden usarse en el entorno yendo con muchas características esenciales. Brad King
de desarrollo deseado. Es comparable al GNU build sys- añadió varias características para dar soporte a CABLE
tem de Unix en que el proceso es controlado por cheros y GCC-XML, un juego de herramientas de envoltura au-
de con guración, en el caso de CMake llamados CMake- tomáticas; y GE Corporate R&D necesitaba soporte para
[Link]. Al contrario que el GNU build system, que está su infraestructura de pruebas (DART). Otras funcionali-
restringido a plataformas Unix, CMake soporta la gene- dades se añadieron para soportar la transición de VTK's
ración de cheros para varios sistemas operativos, lo que a CMake, y soportar ParaView, un sistema de visualiza-
facilita el mantenimiento y elimina la necesidad de tener ción paralela para el Advanced Computing Lab en Los
varios conjuntos de cheros para cada plataforma. Alamos National Laboratory.
El proceso de construcción se controla creando uno o más
cheros [Link] en cada directorio (incluyendo
subdirectorios). Cada [Link] consiste en uno o 26.2 Documentación y tutoriales
más comandos. Cada comando tiene la forma COMAN-
DO (argumentos...) donde COMANDO es el nombre del Aparte de la documentación o cial de CMake, existe un
comando, y argumentos es una lista de argumentos sepa- libro titulado Mastering CMake, publicado por Kitware.
rados por espacios. CMake provee comandos prede ni-
dos y de nidos por el usuario. Existen generadores ma-
ke le para Unix, Borland make, Watcom make, MinGW,
MSYS y Microsoft NMake. También es posible generar 26.3 Principales funcionalidades
cheros de proyecto para Code::Blocks, Eclipse CDT,
Microsoft Visual Studio de la ∨ a la 10 incluyendo ver- • Ficheros de con guración escritos en un lenguaje de
siones de ∨4 bits y KDevelop. scripting especí co para CMake
4∨
26.6. VÉASE TAMBIÉN 4∩
• Documentación
26.4 CTest, CPack, CDash • Listas de correo
Codecademy
Codecademy es una plataforma interactiva en línea que para aprender como programar, mediante la introducción
ofrece clases gratuitas de codi cación en lenguajes de de un nuevo curso cada semana en el 2012.* [12] Más de
programación como Python, PHP, JavaScript, y Ruby, 4∧0,000 personas tomaron el curso en el 2012,* [13]* [14]
así como lenguajes de marcado incluyendo HTML y y Codecademy continua ofertando el programa en el
CSS* [2]* [3] y también uso de API's. A partir de sep- 2013.
tiembre del 2011, el sitio ha tenido más de ∧∧0,000 usua-
rios que han completado más de seis millones de ejerci-
cios.* [4]* [∧] El sitio ha recibido críticas positivas de va- 27.3 Véase también
rios blogs y sitios web, incluyendo el New York Times* [∨]
y TechCrunch.* [∩]
• Academic Earth
Para motivar a los usuarios a participar el sitio cuenta con
un sistema de gami cación por el que ofrece insignias o • Coursera
medallas al completar ejercicios, cuenta con foros de dis-
cusión y un glosario por curso, y mantiene un registro de • Dev Bootcamp
la puntuación total del usuario y la muestra a los demás. El
• edX
sitio también permite que cualquier persona pueda crear
y publicar un nuevo curso usando la herramienta de crea- • Gilles Babinet
ción de cursos.
• Khan Academy
• [Link]
27.1 Historia
• Marginal Revolution University
Codecademy fue fundada en 2011 por Zach Sims y Ryan
Bubinski.* [∪] Sims dejó la universidad Columbia Uni- • Udacity
versity para centrarse en el lanzamiento de una empresa,
• Udemy
mientras que Bubinski se graduó en Columbia con una li-
cenciatura en ciencias de la computación y biofísica.* [9]
La compañía actualmente se encuentra en Nueva York.
Obtuvo 2,∧ millones de dólares en su primera ronda de - 27.4 Referencias
nanciación en octubre de 2011 y 10 millones en la segun-
da serie en junio de 2012.* [∪]* [10] La última ronda de [1] «[Link] Site Info». Alexa Internet. Consultado
nanciación fue llevada a cabo por Index Ventures.* [11] el 1∪ de Septiembre de 201∧.
Finalmente en el año 2014, la empresa Codecademy deci- [2] «Codecademy». Codecademy. Consultado el 4 de agosto
de vender publicidad, comenzando con brindar un banner de 2012.
al gobierno de la ciudad de buenos aires.
[3] Indvik, Lauren. «Codeacademy Releases Free Ruby De-
velopment Courses». Mashable. Mashable. Consultado el
30 de diciembre de 2012.
27.2 Code Year
[4] Frier, Sarah. «Codecademy Raises $10M, Sees Job Ser-
vice as Part of Its Future». Consultado el 19 de junio de
Code Year es un programa gratuito de Codecademy 2012.
para cualquiera que este interesado en aprender como
programar. El programa tiene la intención de ayudar a las [∧] Kafka, Peter. «Codecademy Rounds Up $10 Million for
personas a seguir a través de un New Year's Resolution Web Lessons». Consultado el 19 de junio de 2012.
4∪
27.5. ENLACES EXTERNOS 49
[∪] «30 Under 30: Zach Sims and Ryan Bubinski, Codeca-
demy». [Link]. 2 de julio de 2012. Consultado el 13 de
agosto de 2012.
Código cerrado
∧0
Capítulo 29
Código compilado
∧1
Capítulo 30
Código mutante
∧2
Capítulo 31
Código objeto
En programación, se llama código objeto al código que con parámetros incorrectos o inexistentes puede generar
resulta de la compilación del código fuente.* [1] un error que generalmente el compilador no detecta ya
Consiste en lenguaje máquina o bytecode y se distribuye que el código objeto no es veri cado, únicamente uni-
en varios archivos que corresponden a cada código fuente do. Este tipo de error se puede solucionar reescribiendo
compilado. Para obtener un programa ejecutable se han el código de manera correcta y re compilarlo a código
objeto.
de enlazar todos los archivos de código objeto con un pro-
grama llamado enlazador (linker).
31.3 Referencias
[1] [Link]
∧3
Capítulo 32
Ofuscación
∧4
32.3. ENLACES EXTERNOS ∧∧
ColdFusion
Coldfusion (Adobe ColdFusion) es una plataforma de Es un lenguaje que se ejecuta en el servidor. A diferencia
desarrollo rápido de aplicaciones web que usa el lenguaje de JavaScript y Applets Java, que se ejecuta en el cliente,
de programación CFML. En este aspecto, es un producto ColdFusion se ejecuta en el servidor web. Esto signi -
similar a ASP, JSP o PHP. ca que los guiones escritos en ColdFusion correrán de la
ColdFusion es una herramienta que corre en forma misma manera en cualquier navegador web.
concurrente con la mayoría de los servidores web de
Windows, Mac OS X, Linux y Solaris (también en servi-
dores web personales en Windows 9∪ y puede ser usado 33.1 Historia
para intranets). El servidor de aplicaciones web de Cold-
Fusion trabaja con el servidor HTTP para procesar peti- ColdFusion fue desarrollado inicialmente por J. J. Allai-
ciones de páginas web. Cada vez que se solicita una pági- re, y su primera versión apareció en julio de 199∧. En
na de ColdFusion, el servidor de aplicaciones ColdFusion 2001, estando en el mercado la versión ∧, Allaire fue
ejecuta el guion o programa contenido en la página. adquirido por Macromedia, que en junio de 2002 lanzó
El lenguaje de programación CFML, propio de Coldfu- ColdFusion MX (∨.0), llamado de esta manera para se-
sion, puede crear y modi car variables igual que en otros guir la nomenclatura de sus otros productos. Esta versión
lenguajes de programación que nos son familiares. Posee fue completamente reescrita en Java desde cero, y fue di-
control de ujo de programas, como IF, Case, ciclo, etc. señada, entre otros aspectos, para integrarse de manera
Tiene muchas funciones built-in para realizar tareas más sencilla con Macromedia Flash, el producto estrella de la
complicadas, por ejemplo: para averiguar qué día de la compañía.
semana será el 3 de agosto del 202∩ ColdFusion MX ∩ fue lanzado en febrero de 200∧, meses
DayOfWeekAsString(DayOfWeek('202∩/0∪/03')) antes de la adquisición de Macromedia por Adobe Sys-
tems. En la actualidad está disponible la versión 11.
No es un lenguaje de bases de datos, pero interacciona
de manera simple con bases de datos (Sybase, Oracle,
MySQL, SQL Server, o Access). Usando SQL estándar, 33.2 Versiones
las páginas y aplicaciones web pueden fácilmente recu-
perar, guardar, formatear y presentar información diná- • 1995: Allaire Cold and Fusion, versión 1.0
micamente.
• 1996: Allaire Cold and Fusion, versión 1.∧
Muchas de las funciones poderosas de ColdFusion, co-
mo leer desde y escribir en discos duros del servidor, son • 1996: Allaire Cold and Fusion, versión 2.0
basadas en tags. Así como el tag
• Junio 1997: Allaire Cold and Fusion, versión 3.0
puede tener argumentos como 'width' o 'align', el
tag <CFFILE> tiene argumentos que especi can 'ac- • Enero 1998: Allaire Cold and Fusion, versión 3.1
tion=read/write/copy/delete', path=' etc.
• Noviembre 1998: Allaire ColdFusion, versión 4.0
El tag <CFFORM> construye automáticamente todo el
(a partir de esta versión se le conoce como ColdFu-
código JavaScript para veri car los campos requeridos
sion, ya que antes era “Cold and Fusion”)
antes de hacer el formulario. ColdFusion también tiene
tags para COM, Corba y Applets y Servlets de Java. • Noviembre 1999: Allaire ColdFusion, versión 4.∧
ColdFusion fue diseñado para desarrollar sitios comple-
• Junio 2001: Macromedia ColdFusion, versión ∧.0
jos y de alto trá co. ColdFusion está diseñado para correr
en máquinas multi-procesador, y permite construir sitios • Mayo 2002: Macromedia ColdFusion MX, version
que pueden correr en clusters de servidores. ∨.0, Updater 1, Updater 2, Updater 3
∧∨
33.3. EJEMPLOS DE CÓDIGO ∧∩
Coloreado de sintaxis
34.1 Ejemplo
Abajo se muestra un trozo de código en C++:
// Bucle for normal for (int i=0; i<maximo; i++) {
*(Una_estructura).un_campo = i+∧; }
∧∪
Capítulo 35
Comentario (informática)
∧9
∨0 CAPÍTULO 35. COMENTARIO (INFORMÁTICA)
El fragmento de código de arriba sugiere que el progra- Factores tales como la preferencia personal, la exibili-
mador optó por desactivar la opción de depuración por dad de las herramientas de programación, y otras consi-
alguna razón. Este estilo especí co de comentario es más deraciones tienden a in uir en las variantes de estilo uti-
adecuado para la depuración. Un carácter de barra simple lizado en el código fuente.
delante del delimitador de apertura es el que permite ha-
bilitar o deshabilitar el comentarios de bloque completo.
35.3.1 Etiquetas
Muchos EIDs permiten agregar o remover rápidamente
este tipo de comentarios con opciones del menú singula-
Algunas etiquetas se utilizan en los comentarios para ayu-
res o atajos del teclado. El programador solamente debe
dar en la indexación de los problemas comunes. Tales
marcar la parte de texto que desea comentar o descomen-
etiquetas son comúnmente resaltado de sintaxis y permi-
tar y elegir la opción apropiada. Esto es particularmente
te búsquedas con herramientas de programación común,
útil con fragmentos grandes de código.
como la utilidad grep de UNIX. Ejemplos de convenios
etiqueta son:
35.5.2 Java
35.5.11 SQL
//comentario de línea /*comentario de bloque*/ /** co-
mentario que será usado por javadoc */ //esto es un comentario --este también /* y este en bloque
*/
35.5.3 C/C++
35.5.12 Visual Basic
//comentario en línea /* comentario en bloque*/ #if 0 Co-
mentario de bloque aunque el bloque contenga /* este tipo 'comentario '''comentario XML
de comentarios */ #endif
35.5.13 Pauscal
35.5.4 Delphi
' Soy un sensual comentario.
//comentario en línea
{ comentario en bloque } 35.5.14 PHP
(* comentario en bloque *)
//comentario en línea #este también /* comentario en blo-
En delphi se pueden anidar comentarios de bloque siem- que */
pre que no usen el mismo delimitador, e.g.
(* comentario en bloque { que contiene otros comentarios
en bloque } // o de n de línea y que es perfectamente 35.5.15 Cobol
válido *)
* Comentario
35.5.5 Lua
35.6 Referencias
-- Un comentario de línea --[[ Un comentario de bloque
]]-- [1] Para los propósitos de este artículo, los comentarios de
un lenguaje de programación son tratados indistintamen-
te de comentarios que aparecen en lenguajes de marcas,
35.5.6 Ruby archivos de con guración u otros contextos similares. Más
aún, los lenguajes de marcas con frecuencia se relacio-
#comentario =begin comentario de bloque =end nan de manera cercana con código de lenguajes de pro-
gramación, especialmente en el contexto de generación
de código. Ver por ejemplo Ganguli, Madhushree (2002).
35.5.7 Python Making Use of Jsp (en inglés). Nueva York: Wiley. ISBN
04∩1219∩4∨., Hewitt, Eben (2003). Java for Coldfusion
#comentario Developers (en inglés). Upper Saddle River: Pearson Edu-
cation. ISBN 01304∨1∪0∨.
[2] Source code can be divided into program code (which con-
35.5.8 Perl sists of machine-translatable instructions); and comments
(which include human-readable notes and other kinds of
#comentario annotations in support of the program code).Penny Grubb,
Armstrong Takang (2003). Software Maintenance: Con-
cepts and Practice (en inglés). World Scienti c. pp. ∩,
35.5.9 Javascript 120–121. ISBN 9∪123∪42∨X.
de ser descartados una vez han sido reconocidos por el [19] Ambler, Scott (2004). The Object Primer: Agile Model-
procesador de lenguaje. Driven Development with UML 2.0 (en inglés). Cambridge
University Press. ISBN 139∩∪0∧21∪.
[4] Los comentarios deben ser indicados de tal manera que
sea posible para el procesador de código fuente recono- [20] Murach. C# 2005. p. ∧∨.
cerlos como tal. Esto es usualmente simpli cado al decir
que los comentarios son “ignorados”(luego de ser reco-
nocidos y desechados) por el procesador.
35.7 Enlaces externos
[∧] Dixit, J.B. (2003). Computer Fundamentals and Pro-
gramming in C (en inglés). Laxmi Publications. ISBN • 13 consejos para comentar tu código
∪1∩00∪∪∪2∪.
• Como escribir comentarios (en inglés)
[∨] Desmond, Higham (200∧). MATLAB Guide (en inglés).
SIAM. ISBN 0∪9∪∩1∧∩∪4.
Compatibilidad (informática)
Incompatibilidad Caso B (Imposibilidad de ejecución): Y por último instala los ejecutables compilados con:
El programa le indica una orden al sistema que para él es Logrando así obtener un programa genérico completa-
arbitraria y por ende no logra interpretarla. mente adaptado al sistema operativo que lo ha compilado.
∨4
36.5. ENLACES EXTERNOS ∨∧
• Más emuladores
Capítulo 37
La Competición Internacional Universitaria ACM de universidad antes del concurso. Los estudiantes que ha-
Programación (en inglés ACM International Colle- yan competido en dos nales mundiales (World Finals) o
giate Programming Contest, abreviado ACM-ICPC o cinco competiciones regionales no pueden participar otra
simplemente ICPC) es una competición anual de pro- vez.
gramación y algorítmica entre universidades de todo el Durante la competición, los equipos tienen ∧ horas pa-
mundo patrocinada por IBM. En la competición prima el ra resolver entre ∪ y 10 problemas (lo normal es ∪ para
trabajo en equipo, el análisis de problemas y el desarrollo las competiciones regionales y 10 para la nal). Se deben
rápido de software. ICPC es un evento organizado por la programar las soluciones con C, C++ o Java. Los progra-
Association for Computing Machinery (ACM). mas enviados por los equipos se compilan y ejecutan con
unos ciertos datos de entrada, si el programa falla al cal-
cular la solución, el equipo es noti cado del error y pue-
37.1 Historia den enviar nuevamente el programa o probar con otros
problemas.
La ACM ICPC es una competición que hubo en la Uni- El ganador es el equipo que resuelve más problemas. Si
versidad A&M de Texas en 19∩0. Pasó a ser una compe- hay equipos empatadas con el mismo número de proble-
tición con varias rondas clasi catorias en 19∩∩ y la nal mas resueltos, el orden de clasi cación se calcula a partir
mundial se organizó en colaboración con la ACM Com- de los que han tardado menos en resolver los problemas.
puter Science Conference. Ejemplo: si un equipo A ha enviado sus soluciones para 2
De 19∩∩ a 19∪9, compitieron principalmente equipos de problemas los ∨0 y 120 minutos desde el inicio del con-
Estados Unidos y Canadá. La sede central está ubicada en curso, y otro equipo B lo ha hecho a los ∪0 y 90 minutos.
la Universidad de Baylor desde 19∪9 y las competiciones El desempate entre ambos equipos se haría mirando los
regionales se ubican en universidades de todo el mundo, tiempos, para el equipo A: ∨0+120 = 1∪0 minutos. Para
bajo el auspicio de la ACM y la colaboración de grandes el equipo B: ∪0+90 = 1∩0 minutos. El equipo B ganaría.
empresas de la industria informática. La ACM ICPC ha El tiempo que se toma para los desempates es el tiempo
ido aumentando en número de participantes y países por que ha pasado desde el inicio del concurso más 20 minu-
lo que ahora es una competición mundial con equipos de tos por cada solución incorrecta enviada. En el ejemplo
∪4 países (en 200∧). anterior, si el equipo A hubiera enviado 2 soluciones in-
Desde 199∩ el principal patrocinador es IBM y la parti- correctas para su primer problema, su tiempo nal sería:
cipación en la competición ha aumentado enormemente. 20+20+∨0+120 = 220.
En 199∩ participaron ∪40 equipos de ∧∨0 universidades. El ICPC se diferencia de otras competiciones de progra-
En 200∧, ∧∨0∨ equipos de 1∩3∩ universidades. El núme- mación (por ejemplo la IOI) en que suele tener un gran
ro de equipos aumenta en un 10 y un 20% cada año. número de problemas (∪ o más para resolver en ∧ ho-
ras) y que es una competición por equipos con un sólo
ordenador. Es necesario un buen entendimiento entre los
37.2 Reglas de la competición miembros de un equipo para conseguir la victoria.
∨∨
37.5. GANADORES ∨∩
• 200∪ - Instituto de Óptica y Mecánica Fina de San • 19∩9 - Universidad Washington en San Luis,
Petersburgo, Rusia Estados Unidos
• 200∩ - Universidad de Varsovia, Polonia • 19∩∪ - Instituto Tecnológico de Massachusetts,
Estados Unidos
• 200∨ - Universidad Estatal de Saratov, Rusia
• 19∩∩ - Universidad Estatal de Míchigan, Estados
• 200∧ - Universidad de Shanghai Jiaotong, China Unidos
• 2004 - Instituto de Óptica y Mecánica Fina de San
Petersburgo, Rusia
37.6 Véase también
• 2003 - Universidad de Varsovia, Polonia
• 2002 - Universidad de Shanghai Jiaotong, China • Olimpiada Internacional de Informática
• 19∪4 - Universidad Johns Hopkins, Estados Unidos • Online Problems Solving System
• 19∪3 - Universidad de Nebraska, Estados Unidos • University of Dhaka Online Judge & Contest Trai-
ning
• 19∪2 - universidad Baylor, Estados Unidos
• Moscow State University Virtual Contest System
• 19∪1 - Universidad de Missouri-Rolla, Estados Uni-
dos [1] [Link]
• 19∪0 - Universidad Washington en San Luis,
Estados Unidos
Capítulo 38
Computación parasitaria
∨9
Capítulo 39
Conectiva lógica
En lógica, una conectiva lógica, o simplemente conecti- ya que da el valor de verdad de (C) está completamente
va, (también llamado operador lógico o conectores ló- determinado por el valor de (A) y (B) no tiene sentido pa-
gicos) es un símbolo o palabra que se utiliza para conec- ra el estado (A) y (B) y negar (C). Sin embargo, entonces
tar dos fórmulas bien formadas o sentencias (atómicas o en (D) no es un conector lógico, ya que sería bastante ra-
moleculares), de modo que el valor de verdad de la fórmu- zonable para a rmar (A) y (B) y negar (D): tal vez Pedro
la compuesta depende del valor de verdad de las fórmulas subió a la montaña para ir a buscar un balde de agua, y
componentes. no porque Juan subió la montaña.
Los conectivos lógicos más comunes son los conectivos
binarios (también llamados conectivos diádicos) que
39.1.2 Lenguajes formales
unen dos frases, que pueden ser consideradas los operan-
dos de la función. También es común considerar a la ne-
En los lenguajes formales, las funciones de verdad son
gación como un conectivo monádico.
representadas por símbolos inequívocos. Estos símbolos
Las conectivas lógicas son, junto con los cuanti cadores, se llaman “conectivos lógicos”, “operadores lógicos”
las principales constantes lógicas de muchos sistemas ló- , “operadores proposicionales”, o, en la lógica clásica,
gicos, principalmente la lógica proposicional y la lógica la “de funciones conectivos de verdad.”Véase fórmu-
de predicados. las bien formadas para saber las reglas que permiten las
En programación se utilizan para combinar valores de nuevas fórmulas bien formadas sean construidas al jun-
verdad y obtener nuevos valores que determinen el u- tar otras fórmulas bien formadas utilizando conectivos de
jo de control de un algoritmo o programa. funciones de verdad.
Los conectivos lógicos pueden ser utilizados para conec-
tar más de dos a rmaciones, entonces es común hablar
39.1 Lenguajes de “conector lógico n-ario”.
∩0
39.3. REDUNDANCIA ∩1
Por ejemplo, el signi cado de los estados está lloviendo y • Bicondicional: el símbolo fue utilizado ≡ al menos
estoy en el interior se transforma cuando los dos se com- por Russell en 190∪;* [3] se utilizó al menos por
binan con conectivos lógicos: Tarski in 1940;* [9] ⇔ fue utilizado en Vax; otros
símbolos aparecieron puntualmente en la historia
• No está lloviendo como en Gentzen,* [10] ~ en Schfin nkel* [∧] o
en Chazal.* [11]
• Está lloviendo y estoy dentro de casa (P Q)
• Verdadero: el símbolo 1 vino de la interpretación
• Está lloviendo o estoy dentro de casa (P Q) de Boole de la lógica como un álgebra elemental de
booleana como la álbegra dos elementos; otras ano-
• Si está lloviendo, entonces estoy en casa. (P Q) taciones incluyendo fueron encontrados en Peano.
∧
• Si estoy en casa, entonces está lloviendo. (P Q) • Falso: el símbolo 0 también proviene de la inter-
pretación de Boole de la lógica
∨ como un anillo [?];
• Estoy dentro si y solo si está lloviendo (P Q) otras anotaciones inclusive fueron encontradas en
Peano.
• No está lloviendo (¬ P)
Algunos autores utilizan letras para conectivos en algún
Por declaración P = Q = Está lloviendo Estoy dentro de momento de la historia: u. para conjunción (del Alemán
casa. “und”, signi ca“y”) y el. para la disyunción (del Alemán
También es común considerar la fórmula siempre verda- “oder”, signi ca “o”) en los primeros trabajos de Hil-
dera y la fórmula siempre falsa como conectivos bert (1904); N para la negación, K para la conjunción, A
para la disyunción, C para bicondicional en Łukasiewicz
(1929).* [12]
• Verdadero (⊤, 1 o T)
• Falso (⊥, 0 o F)
39.3 Redundancia
39.2.2 Historia de las notaciones El conectivo lógico de la implicación recíproca es en
realidad el mismo que el condicional material con las pre-
• Negación: el símbolo ¬ apareció en Heyting en misas cambiadas, luego el símbolo de implicación es re-
1929.* [1]* [2] (comparar con en símbolo
A cripoca es redundante. En algunos cálculos lógicos (en
de Frege en Begri sschrift); el símbolo ~ apareció particular, en la lógica clásica, ciertas a rmaciones com-
en Russell en 190∪;* [3] una notación alternativa es puestas esencialmente diferentes son lógicamente equiva-
añadir una línea horizontal encima de la fórmula, lentes. Un ejemplo menos trivial es una redundancia de la
como en P ; otra notación alternativa es utilizar una equivalencia clásica entre ¬ P Q P y Q. Por lo tanto,
comilla simple como en P'. un sistema lógico de base clásica no necesita del operador
condicional " " si "¬" (no) y " " (o) operador condicio-
• Conjunción: el símbolo apareció en Heyting en nal que ya se utilizan, o se puede utilizar el " " solo con
1929* [1] (comparar el uso de la notación de Peano un azúcar sintáctico para una composición que tiene una
de notación de intersección en teoría de conjun- negación y una disyunción.
tos)* [4]); & apareció al menos en Schfin nkel en Hay 1∨ funciones booleanas que asocian los valores ver-
1924;* [∧] ∙ vino la interpretación de Boole de la ló- dad de entrada de P y Q con salidas binarias 4 dígitos.
gica como un álgebra elemental. Estos corresponden a las posibles opciones conectivos ló-
gicos binarios para la lógica clásica. Una implementación
• Disyunción: el símbolo apareció en Russell en
diferente de la lógica clásica puede elegir diferentes sub-
190∪ (comparar el uso de Peano de la notación de
conjuntos de funcionalmente completos de conectivos.
unión en teoría de conjuntos); también se utiliza
el símbolo +, a pesar de la ambigüedad surgida de la Un método consiste en elegir un mínimo establecido y -
álgebra elemental ordinaria al ser el + considerado jado por cualquier otra manera lógicas como en el ejem-
un o exclusivo lógicamente interpretado como una plo con el condicional material anteriormente. Los si-
alianza de dos elementos; puntualmente en la histo- guientes son conjuntos mínimos funcionalmente comple-
ria, un + junto con un punto en la esquina inferior tos de conectivos de los operadores en la lógica clásica,
derecha fue usado por Peirce,* [∨] cuyo aridades no excedan 2:
39.6 Conectivas por el número de [9] Tarski (1940) Introduction to logic and to the methodology
of deductive sciences.
argumentos
[10] Gentzen (1934) Untersuchungen über das logische
Schließen.
Si vemos las distintas conectivas por su número de argu-
mentos podemos distinguir: [11] Chazal (199∨): Éléments de logique formelle.
40.2 Referencias
[1] Microsoft Corporation. «Traducción del término en el
Portal de idiomas de Microsoft». Consultado el 1 de no-
viembre de 2014.
∩4
Capítulo 41
Conteo de referencias
∩∧
Capítulo 42
• para reducir el esfuerzo necesario para leer y enten- • para proporcionar datos signi cativos que se utili-
der el código fuente;* [1] zarán en los traspasos de proyectos que requieren la
presentación de código fuente del programa y toda
• para mejorar la apariencia del código fuente (por la documentación pertinente
ejemplo, al no permitir nombres excesivamente lar-
gos o abreviaturas poco claras). • para proporcionar una mejor comprensión en el ca-
so de la reutilización de código después de un largo
intervalo de tiempo.
La elección de las convenciones de nombres puede ser
un problema de enorme polémica, con los partidarios
considerar su tendencia mejor y las demás inferiores.
Coloquialmente, este se dice que es una cuestión de 42.2 Desafíos
dogma.* [2] Muchas empresas también han establecido su
propio conjunto de convenciones para satisfacer mejor La elección de las convenciones de nombres (y la medida
sus intereses. en que se hacen cumplir) es a menudo un tema polémico,
con partidarios considerando su punto de vista para ser el
mejor y los demás como inferiores. Además, incluso con
42.1 Bene cios potenciales las convenciones de nombres conocidos y bien de nidos
en el lugar, algunas organizaciones pueden no adherirse
constantemente a ellos, haciendo que la incoherencia y
Algunos de los bene cios potenciales que se pueden obte-
confusión. Estos retos pueden ser exacerbadas si las reglas
ner mediante la adopción de una convención de nombres
de la convención de nomenclatura no tienen coherencia
incluyen los siguientes:
interna, arbitraria, difíciles de recordar, o percibida de
otra manera como más gravosas de lo bene cioso.
• para proporcionar información adicional (es decir,
los metadatos) sobre el uso que se hace de un iden-
ti cador;
42.3 El valor del negocio
• para ayudar a formalizar las expectativas y promover
la coherencia dentro de un equipo de desarrollo; Aunque en gran parte oculto a la vista de la mayoría de
los usuarios de negocios, identi cadores bien escogidos
• para permitir el uso de refactorización automatizado hacen que sea mucho más fácil para las siguientes genera-
o buscar y reemplazar herramientas con un potencial ciones de analistas y desarrolladores para entender lo que
mínimo para el error; hace el sistema y cómo solucionarlo o ampliar el código
• para mejorar la claridad en los casos de ambigüedad fuente para las nuevas necesidades del negocio.
potencial; Por ejemplo, aunque la siguiente:
∩∨
42.4. ELEMENTOS COMUNES ∩∩
• identi cadores más cortos pueden ser preferidos co- 42.4.3 Identi cadores de varias palabras
mo más conveniente, ya que son más fáciles de es-
cribir Una recomendación común es “Utilizar identi cadores
signi cativos.”Una sola palabra puede no ser tan signi-
• extremadamente identi cadores cortos (por ejem-
cativa, o especí cas, como varias palabras. En conse-
plo, 'i' o 'j') son muy difíciles de distinguir de forma
cuencia, algunas convenciones de nombres especi can las
única mediante la búsqueda automática y reempla-
reglas para el tratamiento de identi cadores “compues-
zar herramientas
tos”que contienen más de una palabra.
• identi cadores más largos pueden ser preferidos Como en la mayoría de los lenguajes de programación no
porque identi cadores cortos no pueden codi car la están permitidos los espacios en blanco en los identi -
información su ciente o parecer demasiado críptico cadores, se necesita un método de delimitación de cada
• identi cadores más largos pueden ser desfavorecido palabra (para que sea más fácil para los lectores poste-
debido a la confusión visual riores para interpretar personajes que pertenecen a cada
palabra).
Es un tema de investigación abierto si algunos programa-
dores pre eren identi cadores más cortos porque son más Palabras delimitadores separados
fáciles de escribir, o inventan, de los identi cadores más
largos, o porque en muchas situaciones un identi cador Un enfoque consiste en delimitar palabras separadas con
ya simplemente estorba el código visible y proporciona un carácter no alfanumérico. Los dos caracteres más usa-
no perciben bene cio adicional. dos para este n son el guión ("-") y el guión bajo ("_”);
La brevedad en la programación podría ser en parte atri- por ejemplo, el nombre de dos palabras “two words”se
buido a: representaría como “two-words”o “two_words”. El
∩∪ CAPÍTULO 42. CONVENCIÓN DE NOMBRES (PROGRAMACIÓN)
guión es usado por casi todos los programadores que es- ve en los ∪,3 (máximo ∪ caracteres con periodo separador
criben COBOL, Forth, y Lisp; también es común que los seguido de 3 caracteres tipo de archivo) estilo MS-DOS.
nombres de selector en Cascading Style Sheets. La ma-
yoría de los otros idiomas (por ejemplo, las lenguas en las
familias C y Pascal) se reservan el guión para su uso co-
mo el operador in jo resta, por lo que no está disponible 42.5.3 Esquema de palabra compuesta (del
para su uso en los identi cadores y por lo tanto se utilizan lenguaje)
en lugar de subrayado. Véase el caso de serpientes.
Uno de los sistemas de convenciones publicadas prime-
Carta de los casos separados palabras ros fue de IBM “del lenguaje”documentada en un IMS
(Information Management System) 19∪0 Manual * [cita
requerida].
Otro enfoque consiste en indicar los límites de pala-
bra utilizando capitalización medial (también llamado Se detalla el esquema de palabra PRIME-MODIFIER-
"CamelCase" y muchos otros nombres), haciendo así CLASS, que consistía en nombres como “MEM-ACT-
“two words”ya sea como“twoWords”o“TwoWords” NO”para indicar “número de cuenta del cliente.”
. Esta convención se utiliza comúnmente en Java, C# y PRIME palabras estaban destinadas a indicar las princi-
Visual Basic. Tratamiento de las siglas en identi cadores pales “entidades”de interés para un sistema.
(por ejemplo, el“XML”y“HTTP”en XMLHttpRequest
) varía. Algunos dictan que sean en minúsculas (por Palabras MODIFIER fueron utilizados para el re na-
ejemplo XmlHttpRequest ) para facilitar la mecanogra- miento adicional, la cuali cación y la legibilidad.
fía y la lectura, mientras que otros los dejan upperca- Palabras CLASS ideal sería una lista muy corta de los
sed (por ejemplo XMLHTTPRequest ) para la exacti- tipos de datos relevantes para una aplicación particular.
tud. Una opción menos popular es ampliar siempre las Clase de palabras comunes pueden ser: NO (número),
siglas (por ejemplo ExtensibleMarkupLanguageHyper- ID (identi cador), TXT (texto), AMT (cantidad), CANT
TextTransferProtocolRequest ). (cantidad), FL (bandera), CD (código), W (trabajo) y así
sucesivamente. En la práctica, la clase de palabras dispo-
nibles sería una lista de menos de dos docenas de térmi-
42.5 Metadatos y convenciones hí- nos.
bridas Palabras CLASS, normalmente situados a la derecha (su-
jo), sirven el mismo propósito como pre jos de notación
húngara.
Algunas convenciones de nombres representan normas o
requisitos que van más allá de los requisitos de un pro- El propósito de la clase de palabras, además de la consis-
yecto especí co o dominio del problema, y en lugar de tencia, era especi car al programador el tipo de datos de
re ejar una mayor conjunto general de principios de - un campo de datos particular. Antes de la aceptación de
nidos por la arquitectura de software, lenguaje de pro- BOOLEAN (dos valores únicos) Campos, FL (bandera)
gramación subyacente u otro tipo de metodología entre indicarían un campo con sólo dos valores posibles.
proyectos.
mentos, como: aplicación: didFinishLaunchingWithOp- [11] Microsoft NET Framework Estilos de Capitalización
tions:, stringWithFormat: y IsRunning.
[12] Guía de NET Framework Developer - Convenciones de
nomenclatura general
42.6.9 Perl [13] [Framework Instrucciones de diseño, Krzysztof Cwalina,
Brad Abrams Página ∨2]
Perl toma algunas señales de su patrimonio C para con-
venciones. A nivel local ambito de variables y nombres [14] «Perl style guide».
de subrutinas son minúsculas con guiones bajos in jos. [1∧] «perlmodlib - constructing new Perl modules and nding
Subrutinas y variables con la intención de ser tratado co- existing ones».
mo privado están pre jadas con un guión bajo. Las va-
riables del paquete son título entubado. Constantes de- [1∨] [Guía de Estilo [Link]
claradas son mayúsculas. Los nombres de paquetes son pep-000∪/ de código Python PEP∪]
camel case-exceptuando prágmata por ejemplo, strict y
mro -que son minúsculas. * [14] * [1∧]
42.9 Enlaces externos
42.6.10 Python y Ruby • Americana Name Society - Promueve la onomásti-
ca, el estudio de los nombres y las prácticas de asig-
Python y Ruby tanto recomiendan UpperCa-
nación de nombres, tanto en Estados Unidos como
melCase para nombres de clases, CAPITALI-
en el extranjero.
ZED_WITH_UNDERSCORES para las constantes
y lowercase_separated_by_underscores para otros • Codi cació[Link] tiene una de 100 pági-
nombres. En Python, si un nombre está destinado a ser nas pdf que usa la lingüística y la psicología para
“privado”, que está precedido de un guión bajo.* [1∨] intentar un análisis de costo / bene cio de las cues-
tiones de nomenclatura de identi cadores
[3] [Link]
[4] [Link]
9∧style/html/sec_3/[Link]
[10] [Link]
Capítulo 43
Cracking (software)
• Password cracking
• Razor 1911
∪1
Capítulo 44
Cuaderno de carga
∪2
Capítulo 45
Curri cación
• Currying in Scala
45.2 De nición
• Currying in Perl
Dada una función f del tipo f : (X × Y ) → Z , cu-
rri cándola sería una función del tipo curry(f ) : X →
(Y → Z) . En otras palabras, curry(f ) toma un argu-
mento del tipo X y retorna una función del tipo Y → Z
. Descurri car es la transformación inversa.
Intuitivamente, la curri cación expone que“Si jas algu-
nos argumentos, tendrás una función de los argumentos
restantes”. Por ejemplo, si la función div signi ca la ver-
sión curri cada de la operación x / y, entonces div con
el parámetro x jado en 1 es otra función: igual que la
función inv que devuelve la inversa multiplicativa de sus
argumentos, de nida por inv(y) = 1 / y.
La motivación práctica para curri car es que en oca-
siones, muy seguidas, las funciones obtenidas al utili-
zar algunos, pero no todos, los argumentos en una fun-
ción curri cada pueden resultar útiles; por ejemplo, mu-
chos lenguajes tienen una función o un operador similar
a plus_one. Curri car hace fácil de nir dichas funciones.
45.3 Referencias
∪3
Capítulo 46
Código enhebrado
En ciencias de la computación, el término código en- plataforma de hardware especí ca. Un acercamiento di-
hebrado se re ere a una técnica de implementación ferente usa un conjunto de instrucciones de una máquina
del compilador donde el código generado tiene una for- virtual - que no tiene un destino particular de hardware.
ma que esencialmente consiste enteramente en llama- Un intérprete lo ejecuta en cada nuevo hardware de des-
das a subrutinas. El código puede ser procesado por un tino.
intérprete, o simplemente puede ser una secuencia de ins-
Los computadores tempranos tenían relativamente poca
trucciones de llamadas a código de máquina. memoria. Por ejemplo, la mayoría de los Data General
Una de las principales ventajas del código enhebrado es Nova, IBM 1130, y muchas computadores Apple II te-
que es muy compacto, comparado al código generado nían solamente 4 k palabras de memoria RAM instalada.
por técnicas alternativas de generación del código y de Consecuentemente se pasaba mucho tiempo intentando
convención de llamadas. Esta ventaja usualmente viene a encontrar formas de reducir el tamaño de los programas
expensas de una velocidad de ejecución ligeramente más de tal manera que pudieran caber en la memoria dispo-
lenta (usualmente apenas una sola instrucción de máqui- nible. Al mismo tiempo, los computadores eran relati-
na). Sin embargo, a veces hay un efecto sinergético - a vamente lentos, así que la interpretación simple era per-
veces un código más compacto es más pequeño y sig- ceptiblemente mucho más lenta que ejecutar el código de
ni cativamente más rápido que el código no enhebra- máquina.
do.* [1] Un programa su cientemente pequeño para ca- En vez de escribir cada paso de una operación en cada
ber enteramente en la memoria de acceso aleatorio pue- parte del programa donde era necesaria, los programa-
de correr más rápido que un programa menos compacto dores ahorraban memoria escribiendo cada paso de tales
en el espacio de intercambio que requiere un constante operaciones una sola vez y poniéndolo en una subrutina
acceso mecánico de la unidad de disco, aunque sufra de (ver "no te repitas").
la sobrecarga en la interpretación del código enhebrado.
Similarmente, un programa lo su cientemente pequeño Este proceso - la refactorización de código - es usado hoy,
para caber enteramente en el caché del procesador de laaunque por diversas razones. En estos programas, la apli-
computadora puede correr más rápido que un programa cación del nivel superior puede consistir de nada más que
menos compacto que sufra fallas de caché constantes. llamadas a subrutinas. A su vez, muchas de estas subru-
tinas, también no consisten nada más que llamadas a su-
El código enhebrado es bien conocido como la técnica brutinas de nivel inferior.
de implementación comúnmente usada en el lenguaje de
programación Forth. También fue usado en las versiones Los mainframes y algunos microprocesadores tempranos
tempranas del lenguaje de programación B, así como en tales como el RCA 1∪02 requerían varias instrucciones
muchas implementaciones de BASIC, y algunas imple- para llamar a una subrutina. En la aplicación de nivel su-
mentaciones de COBOL y de otros lenguajes para pe- perior y en muchas subrutinas, esa secuencia es constan-
queños microcomputadores. temente repetida, sólo cambiando la dirección de la su-
brutina desde una llamada a la siguiente. Usando la me-
moria para almacenar las mismas instrucciones repetida-
mente era un desperdicio.
46.1 Historia que llevó al código
La respuesta simple fue una tabla de saltos (es decir una
enhebrado tabla consistiendo solo en las direcciones contiguas de las
subrutinas - usualmente extraídas usando un índice, un
La manera común de hacer programas de computadora es registro de propósitos generales o un puntero). Las direc-
usando un compilador para“traducir”un programa escri- ciones pueden ser directas o indirectas, contiguas o no
to en una cierto lenguaje simbólico al código de máquina. contiguas (encadenadas por punteros), relativas o absolu-
El código es típicamente rápido pero no es portable pues- tas, resueltas en de tiempo de compilación o construidas
to que el código binario ejecutable es diseñado para una dinámicamente - pero el programa se convierte en una
∪4
46.3. MODELOS DE ENHEBRADO ∪∧
46.3.2 Enhebrado indirecto thread: pushA: pushB: add: call pushA *sp++ = A *sp++
= B *sp++ = *--sp + *--sp call pushB ret ret ret call add
El enhebrado indirecto usa punteros que apuntan hacia
localizaciones que a su vez apuntan al código de máqui-
na. El puntero indirecto puede ser seguido por los ope- 46.3.4 Enhebrado de token
randos que son almacenados en el“bloque”indirecto en
vez de estar almacenados repetidamente en el enhebra- El código enhebrado de token usa listas de índices de ∪
do. Así, el código indirecto es a menudo más compacto ó 12 bits a una tabla de punteros. El código enhebrado
que el código enhebrado directo, pero la indirección típi- de token es notablemente compacto, sin mucho esfuer-
camente también lo hace más lenta, aunque usualmente zo especial por un programador. Tiene usualmente entre
todavía más rápida que los intérpretes de bytecode. Don- la mitad y tres cuartas partes el tamaño de otros códi-
de los operandos del handler incluyen tanto valores como gos enhebrados, los cuales a su vez tienen entre la cuarta
tipos, los ahorros de espacio sobre el código enhebrado y la octava parte del tamaño del código compilado. Los
directo pueden ser signi cativos. Los sistemas Forth más punteros de la tabla pueden ser tanto indirectos como di-
antiguos producían típicamente código enhebrado indi- rectos. Algunos compiladores Forth producen código en-
recto. hebrado de token. Algunos programadores consideran al
“p-code”generado por algunos compiladores de Pascal,
Como ejemplo, si la meta es ejecutar el“psuh A, push B,
al igual que los bytecodes usados por .NET, Java, BASIC,
add”, lo siguiente puede ser usado. Aquí, el tp es inicia-
y algunos compiladores C, como enhebrado de token.
lizado apuntando a la dirección &thread, cada fragmento
del código (push, add) es encontrado por doble indirec- Históricamente, un acercamiento común es el bytecode,
ción por medio del tp; y los operandos para cada frag- que utiliza opcodes de ∪ bits y, a menudo, una máquina
mento de código son encontrados en el primer nivel de virtual basada en pila. Un interpretador típico es conocido
indirección siguiendo la dirección del fragmento. como "decode and dispatch interpreter" y sigue la forma:
thread: i_pushA: push: add: &i_pushA &push *sp++ = bytecode: top: pushA: pushB: add: 0 /*pushA*/ i = deco-
*(*tp + 1) *sp++ = *--sp + *--sp &i_pushB &A jump de(vpc++) *sp++ = A *sp++ = B *sp++ = *--sp + *--sp
*(*tp++) jump *(*tp++) &i_add i_pushB: &push &B 1 /*pushB*/ addr = table[i] jump top jump top jump top
i_add: &add 2 /*add*/ jump *addr
Si la máquina virtual usa solamente instrucciones del ta-
maño de un byte, el decode() es simplemente un ferch
46.3.3 Enhebrado de subrutina desde el bytecode, pero a menudo hay instrucciones co-
munes de 1 byte más instrucciones menos comunes de
El “código enhebrado de subrutina”(también llamado múltiples bytes (ver CISC), en este caso, decode() es más
“código enhebrado de llamada”) consiste en una serie complejo. La decodi cación de opcodes de un solo by-
de instrucciones “call”en lenguaje de máquina (o solo te puede ser muy simple y e cientemente manejado por
las direcciones de las funciones “call”, en oposición el una tabla de saltos usando el opcode directamente como
enhebrado directo el cual usa“jump”). Los compilado- un índice.
res tempranos para el ALGOL, FORTRAN, COBOL y
Para, en las instrucciones donde las operaciones indivi-
algunos sistemas Forth produjeron a menudo código en-
duales son simples, por ejemplo “push”y “add”, la
hebrado de subrutina. El código en muchos de estos sis-
sobrecarga implicada en decidir lo que se debe ejecutar
temas operaba una pila de operandos LIFO (last-in- rs-
es más grande que el costo real de la ejecución, tales intér-
out), que tenía una bien desarrollada teoría del compi-
pretes son a menudo mucho más lentos que el código de
lador. La mayoría de los procesadores modernos tienen
máquina. Sin embargo para instrucciones (“compuestas”
soporte especial del hardware para las subrutinas con las
) más complejas, el porcentaje de sobrecarga es propor-
instrucciones “call”y “return”, así que la sobrecar-
cionalmente menos signi cativo.
ga de una instrucción de máquina adicional por envío es
disminuida; pero según mediciones de Antón Ertl, “en
contraste con los mitos populares, el enhebrado de subru- 46.3.5 Enhebrado de Hu man
tina es usualmente más lento que el enhebrado directo”.
[3] Pruebas más recientes de Ertl demuestran que el en- El código enhebrado de Hu man consiste en listas de
hebrado directo es el modelo de enhebrado más rápido códigos Hu man. Un código de Hu man es una cade-
en los procesadores Xeon, Opteron, y Athlon, mientras na de bits de longitud variable usada para identi car un
que el enhebrado indirecto es el modelo de enhebrado elemento único. Un intérprete de enhebrado de Hu man
más rápido en procesadores Pentium M, y el enhebrado localiza las subrutinas usando una tabla de índice o un ár-
de subrutina es el modelo de enhebrado más rápido en el bol de punteros que pueden ser navagados por el código
Pentium 4, el Pentium III, y procesadores PPC. Hu man. El código enhebrado de Hu man es una de las
Como un ejemplo de enhebrado de llamada, el“push A, más compactas representaciones conocidas para un pro-
push B, add": grama de computadora. Básicamente el índice y los códi-
46.6. REFERENCIAS ∪∩
gos están organizados midiendo la frecuencia en que cada • SP o s (puntero de pila de parámetros, usado para
subrutina ocurre en el código. A las llamadas frecuen- pasar parámetros entre las palabras)
tes se le dan los códigos más cortos. Las operaciones con
frecuencias aproximadamente iguales se le dan códigos
A menudo, las máquinas virtuales enhebradas tales como
con longitudes de bits casi iguales. La mayoría de los sis-
las implementaciones de Forth tienen una máquina virtual
temas enhebrados de Hu man han sido implementados
simple en su corazón, consistiendo en tres primitivas. Ésas
como sistemas Forth de enhebrado directo, y son usados
son:
para grandes cantidades de paquetes de código corriendo
lentamente dentro de pequeños y baratos [[microcontro-
lador}}es. La mayoría de las aplicaciones publicadas han • nest, también llamado docol
estado en juguetes, calculadoras o relojes.
• unnest, o semi_s (; s)
46.4 Bifurcaciones
46.6 Referencias
Los ejemplos de arriba no muestran bifurcaciones. Para
todos los intérpretes, una bifurcación cambia el puntero [1] Speed of various interpreter dispatch techniques V2
del enhebrado (arriba indicado como tp). Como ejemplo,
una bifurcación condicional cuando el valor tope de la pi- [2] James R. Bell, “Threaded Code”, CACM, 19∩3, 1∨, ∨,
la es cero puede ser codi cada como sigue. Observe que pp 3∩0–3∩2
el &thread[123] es la localización a saltar (jump), no la
dirección de un handler, y así que debe ser saltada (tp++)
independientemente de si la bifurcación es tomada.
46.7 Lectura adicional
thread: brz: ... tmp = *tp++ &brz if (*sp++ == 0) &th-
read[123] tp = tmp ... jump *tp++
• Anton Ertl's explanatory page What is Threaded
Code? describes di erent threading techniques and
provides further references.
46.5 Amenidades comunes
• The Development of the C Language by Dennis M.
En una máquina, la separación de las pilas de datos y de Ritchie describes B (a precursor of C) as implemen-
retorno elimina mucho del código para el manejo de la ted using “threaded code”.
pila, reduciendo substancialmente el tamaño del código
enhebrado. El principio de la doble pila fue originado tres • Thinking Forth Project includes the seminal (but out
veces independientemente: para los grandes sistemas de of print) book Thinking Forth by Leo Brodie publis-
Burroughs, el Forth y el PostScript, y es usado en algunas hed in 19∪4.
máquinas virtuales de Java.
Tres registros están a menudo presentes en una máquina • Starting FORTH online version of the book Starting
virtual enhebrada. Otro existe para pasar datos entre las FORTH by Leo Brodie published in 19∪1.
subrutinas (“palabras”). Éstos son:
• Brad Rodriguez's Moving FORTH: Part 1: Design
Decisions in the Forth Kernel covers threading tech-
• IP o i (puntero de instrucción); llamado tp en los niques in depth.
ejemplos de arriba
• Forth
Capítulo 47
Código inalcanzable
En programación, el código inalcanzable es una parte • Código complejo obsoleto que se retuvo intencio-
del código fuente que nunca podrá ser ejecutado porque nalmente, pero se dejó inalcanzable para que pueda
no existe ningún camino dentro de las estructuras de con- ser utilizado más adelante en el desarrollo si es ne-
trol en el resto del programa para llegar a este código.* [1] cesario.
Suele referirse a este tipo de código como código muerto,
aunque entre ellos hay una diferencia (el código muerto • Construcciones de depuración y vestigios de código
se ejecuta pero no produce cambios en la salida del pro- durante el desarrollo que aún no se han retirado del
grama).* [2] programa.
∪9
90 CAPÍTULO 47. CÓDIGO INALCANZABLE
• Código redundante
• Cobertura de código
47.5 Referencias
[1] Debray, S. K.; Evans, W., Muth, R., and De Sutter, B.
(2000-03). «Compiler techniques for code compaction.»
(PDF). Volume 22, issue 2 (en inglés). New York, USA:
Capítulo 48
Código muerto
En programación, se conoce como código muerto a una mente cuando algún módulo entero quede muerto.* [3]
parte del código fuente que se ejecuta pero sus resultados Algunos IDE (como Visual Studio 2010* [4] y
nunca se usan.* [1]* [2] La ejecución de este tipo de código Eclipse* [∧]) poseen la habilidad de detectar código
consume tiempo de computo en algo que jamás se utiliza. muerto durante tiempo de compilación.
Es frecuente confundirlo con el código inalcanzable aun-
que conservan una diferencia (este jamás se ejecuta, y si
bien los dos son indeseables el código muerto es más gra- 48.3 Véase también
ve que el inalcanzable).
Además de consumir tiempo de computo el código muer- • Código inalcanzable
to puede arrojar excepciones o afectar un estado global
del programa. por lo tanto si bien los resultados jamás • Código redundante
se utilizan remover este código puede cambiar la salida
del programa y evitar bugs innecesarios. Esta es una ra-
zón por la cual el código muerto es menos deseado que el 48.4 Referencias
código inalcanzable.
[1] Debray, S. K., Evans, W., Muth, R., and De Sutter, B.
2000. Compiler techniques for code compaction. ACM
48.1 Ejemplo Trans. Program. Lang. Syst. 22, 2 (Mar. 2000), 3∩∪-41∧.
48.5 Bibliografía
48.2 Análisis
• Muchnick S. S. 199∩ Advanced Compiler Design
Se puede utilizar una optimización de compilador lla- and Implementation. Morgan Kaufmann.
mada eliminación de código muerto para eliminar este
código. Este análisis se puede llevar a cabo mediante el • Appel, A. W. 199∪ Modern Compiler Implementa-
análisis de variable viva, que es una forma de análisis está- tion in Java. Cambridge University Press.
tico de software y análisis de ujo de datos. Esta también
es una diferencia con respecto al código inalcanzable que
se descubre mediante un análisis de control del ujo. 48.6 Enlaces externos
La eliminación de código en general es la misma técnica
que se usa para eliminar el código inalcanzable y el código • Optimización de código
redundante.
• Dead Code Detector (DCD) Java/JEE
En los proyectos de programación grandes, a veces es
difícil de reconocer y eliminar código muerto, especial- • Comparación de DCD para Java
91
92 CAPÍTULO 48. CÓDIGO MUERTO
Código redundante
• Código inalcanzable
49.4 Referencias
49.1 Ejemplos
[1] Debray, S. K., Evans, W., Muth, R., and De Sutter, B.
2000. Compiler techniques for code compaction. ACM
int foo(int X) { int Y = X*2; return X*2; } Trans. Program. Lang. Syst. 22, 2 (Mar. 2000), 3∩∪–41∧.
93
Capítulo 50
Dato
94
Capítulo 51
Depuración de programas
51.1 Origen
Existe una controversia acerca del origen del término de-
puración o “debugging”en inglés. Los términos “bug”
y “debugging”son atribuidos popularmente a la almi-
rante Grace Murray Hopper por los años 1940. Mientras
trabajaba con un Mark II en la Universidad de Harvard,
ella encontró una polilla atrapada en un relé impidiendo
las operaciones de dicha computadora, por lo cual ella co-
mentó que cuando se sacó aquella polilla le habían hecho
“debugging”al sistema. Sin embargo el término “bug”
cómo signi cado de error técnico data cerca de 1∪∩∪, y
el término “debugging”o depuración ha sido usado en
aeronáutica antes de entrar al mundo de las computado-
ras.
Una fotografía del supuestamente primer “bug”(bicho) real, el
cual fue depurado (“debugged”) en 1947.
51.2 Aplicación
Como el software y los sistemas electrónicos se vuelven
generalmente más complejos, se han desarrollado varias
técnicas comunes de depuración para detectar anomalías,
corregir funcionalidades y optimizar código fuente. Exis-
Depuración de programas es el proceso de identi car y
ten algunos a cionados que consideran la depuración co-
corregir errores de programación. En inglés se le conoce
mo una forma de arte.
como debugging, es que se asemeja a la eliminación de
bichos (bugs), manera en que se conoce informalmente a
los errores de programación. Se dice que el término bug
proviene de la época de los ordenadores de válvula ter- 51.3 Véase también
moiónica, en los cuales los problemas se generaban por
los insectos que eran atraídos por las luces y estropeaban • Depurador
el equipo. Si bien existen técnicas para la revisión siste-
mática del código fuente y se cuenta con medios compu- • Error de software
tacionales para la detección de errores (depuradores) y fa- • Emulador BOCHS
cilidades integradas en los sistemas lower CASE y en los
ambientes de desarrollo integrado, sigue siendo en buena
medida una actividad manual, que desafía la paciencia,
la imaginación y la intuición del programador. Muchas
veces se requiere incluir en el código fuente instruccio-
nes auxiliares que permitan el seguimiento de la ejecu-
ción del programa, presentando los valores de variables
y direcciones de memoria y ralentizando la salida de da-
tos (modo de depuración). Dentro de un proceso formal
de aseguramiento de la calidad, puede ser asimilado al
concepto de prueba unitaria.
9∧
Capítulo 52
Desarrollador de software
• Desarrollador de videojuegos
9∨
Capítulo 53
Desarrollo en cascada
1. Análisis de requisitos.
qué objetivos debe cubrir. De esta fase surge
2. Diseño del Sistema.
una memoria llamada SRD (documento de es-
3. Segregación del programa. peci cación de requisitos), que contiene la es-
peci cación completa de lo que debe hacer el
4. Diversi cación. sistema sin entrar en detalles internos.
∧. Veri cación integral.
Es importante señalar que en esta etapa se debe
∨. Ordeñado del programa. consensuar todo lo que se requiere del sistema
y será aquello lo que seguirá en las siguientes
De esta forma, cualquier error de diseño detectado en etapas, no pudiéndose requerir nuevos resulta-
la etapa de prueba conduce necesariamente al rediseño dos a mitad del proceso de elaboración del soft-
y nueva programación del código afectado, aumentando ware de una manera.
los costos del desarrollo. La palabra cascada sugiere, me-
diante la metáfora de la fuerza de la gravedad, el esfuer-
zo necesario para introducir un cambio en las fases más 53.1.2 Diseño del Sistema
avanzadas de un proyecto.
Descompone y organiza el sistema en elemen-
Si bien ha sido ampliamente criticado desde el ámbito tos que puedan elaborarse por separado, apro-
académico y la industria* [cita requerida], sigue siendo el vechando las ventajas del desarrollo en equipo.
paradigma más seguido al día de hoy* [cita requerida]. Como resultado surge el SDD (Documento de
Diseño del Software), que contiene la descrip-
ción de la estructura relacional global del sis-
53.1 Fases del modelo tema y la especi cación de lo que debe hacer
cada una de sus partes, así como la manera en
53.1.1 Análisis de requisitos que se combinan unas con otras.
En esta fase se analizan las necesidades de los Es conveniente distinguir entre diseño de al-
usuarios nales del software para determinar to nivel o arquitectónico y diseño detallado. El
9∩
9∪ CAPÍTULO 53. DESARROLLO EN CASCADA
53.6 Referencias
[1] S. Pressman, Roger. Ingeniería del Software: Un enfoque
práctico, 3.ª Edición, Pag. 2∨-30.
Desarrollo en espiral
El desarrollo en espiral es un modelo de ciclo de vida Enhancement”.* [1] En 19∪∪, Boehm publicó un artículo
del software de nido por primera vez por Barry Boehm similar* [2] destinado a una audiencia más amplía. Bási-
en 19∪∨,* [1] utilizado generalmente en la Ingeniería de camente consiste en una serie de ciclos que se repiten en
software. Las actividades de este modelo se conforman en forma de espiral, comenzando desde el centro. Se suele
una espiral, en la que cada bucle o iteración representa un interpretar como que dentro de cada ciclo de la espiral se
conjunto de actividades. Las actividades no están jadas sigue un Modelo Cascada, pero no necesariamente debe
a ninguna prioridad, sino que las siguientes se eligen en ser así. El Espiral puede verse como un modelo evoluti-
función del análisis de riesgo, comenzando por el bucle vo que conjuga la naturaleza iterativa del modelo MCP
interior. con los aspectos controlados y sistemáticos del Modelo
Cascada, con el agregado de gestión de riesgo.
100
54.3. MECANISMOS DE CONTROL 101
2. Radial: Indica el aumento del coste del proyecto, • Dependiendo del resultado de la evaluación de los
ya que con cada nueva iteración se pasa más tiempo riesgos, se elige un modelo para el desarrollo, el que
desarrollando. puede ser cualquiera de los otros existentes, como
formal, evolutivo, cascada, etc. Así si por ejemplo
Este sistema es muy utilizado en proyectos grandes y si los riesgos en la interfaz de usuario son dominan-
complejos como puede ser, por ejemplo, la creación de tes, un modelo de desarrollo apropiado podría ser
un Sistema Operativo. la construcción de prototipos evolutivos. Si lo ries-
gos de protección son la principal consideración, un
Al ser un modelo de Ciclo de Vida orientado a la gestión desarrollo basado en transformaciones formales po-
de riesgo se dice que uno de los aspectos fundamentales dría ser el más apropiado.
de su éxito radica en que el equipo que lo aplique tenga
la necesaria experiencia y habilidad para detectar y cata-
logar correctamente los riesgos. Análisis del riesgo
• Hay una cosa que solo se hace una vez: plani cación • Plani cación - Tareas inherentes a la de nición de
inicial. recursos, el tiempo y otras informaciones relaciona-
das con el proyecto. Son todos los requerimientos.
Desarrollar, veri car y validar(probar) • Análisis de riesgos – Tareas para evaluar riesgos téc-
nicos y otras informaciones relacionadas con el pro-
• Tareas de la actividad propia y de prueba. yecto.
• Análisis de alternativas e identi cación resolución • Ingeniería - Tareas para construir una o más repre-
de riesgos. sentaciones de la aplicación.
102 CAPÍTULO 54. DESARROLLO EN ESPIRAL
El modelo Win-Win es una adaptación del modelo espiral 54.8 Véase también
que se enfatiza en la participación del cliente en el pro-
ceso de desarrollo de un producto de software. En un ca- • Ingeniería de Software
so ideal, el desarrollador simplemente pregunta al cliente
lo que se requiere y el cliente proporciona su ciente in- • Desarrollo de Software
formación y detalles para proceder. Sin embargo esto no • Modelo en Cascada o Secuencial
suele ocurrir en la mayoría de los casos y es necesario
que se establezcan negociaciones signi cativas entre am- • Modelo Iterativo Incremental
bas partes para equilibrar la funcionalidad y rendimiento
con los costos y tiempo de salida al mercado del produc- • Modelo por Prototipos
to. El modelo Win-Win deriva su nombre del objetivo de • Modelo de Desarrollo Rápido
estas negociaciones, es decir, “ganar-ganar”. El cliente
recibe el producto que satisface la mayoría de sus nece-
sidades, y el desarrollador trabaja para alcanzar presu-
puestos y fechas de entrega. Para lograr este objetivo, se
54.9 Referencias
realizan varias actividades de negociación al principio de
cada paso alrededor de la espiral.* [4] [1] Boehm B, A Spiral Model of Software Development
and Enhancement, ACM SIGSOFT Software Enginee-
ring Notes, ACM, 11(4):14-24, Agosto 19∪∨.
[4] [Link]
• Reduce riesgos del proyecto
[∧] Developing a Software Project Life Cycle Process (IEEE
• Incorpora objetivos de calidad 10∩4), 30 de marzo de 200∨.
54.6 Desventajas
• Modelo costoso
103
104 CAPÍTULO 55. DESARROLLO ITERATIVO Y CRECIENTE
desarrollo iterativo. Por ejemplo, las técnicas para desa- • Las modi caciones deben ser más fáciles de hacer
rrollar el concepto del producto están concebidas para su conforme avanzan las iteraciones. Si no es así, hay un
aplicación en los primeros esfuerzos del desarrollo, cuan- problema primordial usualmente encontrado en un
do las necesidades se identi can y el esquema general del diseño débil o en la proliferación excesiva de parches
sistema se establece. Aunque es aconsejable aplicarlas al sistema.
también más tarde, para re nar el concepto, su princi-
pal esfuerzo de aplicación esta en las tareas iniciales de • Los parches normalmente deben permanecer solo
desarrollo.* [∧] por una o dos iteraciones. Se hacen necesarios para
evitar el rediseño durante una fase de implementa-
ción.
55.2.2 Etapa de inicialización
• La implementación existente debe ser analizada fre-
Se crea una versión del sistema. La meta de esta etapa cuentemente para determinar qué tal se ajusta a las
es crear un producto con el que el usuario pueda inter- metas del proyecto.
actuar, y por ende retroalimentar el proceso. Debe ofre-
cer una muestra de los aspectos claves del problema y • Las facilidades para analizar el programa deben ser
proveer una solución lo su cientemente simple para ser utilizadas cada vez para ayudar en el análisis de im-
comprendida e implementada fácilmente. Para guiar el plementaciones parciales.
proceso de iteración se crea una lista de control de pro-
• La opinión del usuario debe ser solicitada y anali-
yecto, que contiene un historial de todas las tareas que
zada para indicar de ciencias en la implementación
necesitan ser realizadas. Incluye cosas como nuevas fun-
referida por él.
cionalidades para ser implementadas, y areas de rediseño
de la solución ya existente. Esta lista de control se revisa
periódica y constantemente como resultado de la fase de
análisis. 55.3 Caso práctico
La mejora iterativa fue exitosamente aplicada al desarro-
55.2.3 Etapa de iteración llo de una familia extensa de compiladores para una fa-
milia de lenguajes de programación en una gama de ar-
Esta etapa involucra el rediseño e implementación de una quitecturas de hardware. Un conjunto de 1∩ versiones del
tarea de la lista de control de proyecto, y el análisis de la sistema se desarrollaron en un lugar, generando 1∩ mil lí-
versión más reciente del sistema. La meta del diseño e neas de código fuente de lenguaje de alto nivel (∨∧00 de
implementación de cualquier iteración es ser simple, di- código ejecutable). El sistema posteriormente fue desa-
recta y modular, para poder soportar el rediseño de la rrollado en dos sitios diferentes, llegando a dos versiones
etapa o como una tarea añadida a la lista de control de diferentes del lenguaje base: una versión esencialmente
proyecto. El código puede, en ciertos casos, representar se enfocaba en aplicaciones matemáticas, añadiendo nú-
la mayor fuente de documentación del sistema. El aná- meros reales y varias funciones matemáticas, y la otra se
lisis de una iteración se basa en la retroalimentación del centró en añadir capacidades para escribir del compila-
usuario y en el análisis de las funcionalidades disponibles dor. Cada iteración fue analizada del punto de vista de
del programa. Involucra el análisis de la estructura, mo- los usuarios (las capacidades del lenguaje fueron deter-
dularidad, usabilidad, con abilidad, e ciencia y e cacia minadas en parte por las necesidades del usuario) y el
(alcanzar las metas). La lista de control del proyecto se punto de vista del desarrollador (el diseño del compila-
modi ca bajo la luz de los resultados del análisis. dor evolucionó para ser más fácilmente modi cable, por
Las guías primarias que guían la implementación y el aná- ejemplo, para añadir nuevos tipos de datos). Mediciones
lisis incluyen: tales como acoplamiento y modularización fueron segui-
das sobre múltiples versiones.
• Cualquier di cultad en el diseño, codi cación y
prueba de una modi cación debería apuntar a la ne-
cesidad de rediseñar o recodi car. 55.4 Características
• Las modi caciones deben ajustarse fácilmente a los
Usando análisis y mediciones como guías para el proce-
módulos fáciles de encontrar y a los aislados. Si no
so de mejora es una diferencia mayor entre las mejoras
es así, entonces se requiere algún grado de rediseño.
iterativas y el desarrollo rápido de aplicaciones, princi-
• Las modi caciones a las tablas deben ser especial- palmente por dos razones:
mente fáciles de realizar. Si dicha modi cación no
ocurre rápidamente, se debe aplicar algo de redise- • Provee de soporte para determinar la efectividad de
ño. los procesos y de la calidad del producto.
55.7. DEBILIDADES DE ESTE MODELO DE DESARROLLO 10∧
• Permite estudiar y después mejorar y ajustar el pro- • Permite separar la complejidad del proyecto, gracias
ceso para el ambiente en particular. a su desarrollo por parte de cada iteración o bloque.
Estas mediciones y actividades de análisis pueden ser • El producto es consistente y puntual en el desarrollo.
añadidas a los métodos de desarrollo rápido existentes. • Los productos desarrollados con este modelo tienen
De hecho, el contexto de iteraciones múltiples conlleva una menor probabilidad de fallar.
ventajas en el uso de mediciones. Las medidas a veces
• Se obtiene un aprendizaje en cada iteración que es
son difíciles de comprender en lo absoluto, aunque en los
aplicado en el desarrollo del producto y aumenta las
cambios relativos en las medidas a través de la evolución
experiencias para próximos proyectos.* [∩]
del sistema puede ser muy informativo porque proveen
una base de comparación. Por ejemplo, un vector de me-
didas m1, m2,..., mn puede ser de nido para caracterizar
varios aspectos del producto en cierto punto, como pue- 55.7 Debilidades de este modelo de
den ser el esfuerzo total realizado, los cambios, los defec- desarrollo
tos, los atributos lógico, físico y dinámico, consideracio-
nes del entorno, etcétera. Así el observador puede decir • La entrega temprana de los proyectos produce la
como las características del producto como el tamaño, la creación de sistemas demasiados simples que a ve-
complejidad, el acoplamiento y la cohesión incrementan ces se ven un poco monótonos a los ojos del personal
o disminuyen en el tiempo. También puede monitorear- que lo recibe.* [∨]
se el cambio relativo de varios aspectos de un producto o
pueden proveer los límites de las medidas para apuntar a
• La mayoría de los incrementos se harán en base de
problemas potenciales y anomalías.
las necesidades de los usuarios. Los incrementos en
si ya son estipulados desde antes de la entrega del
proyecto, sin embargo hay que ver cómo se maneja
55.5 Ventajas del desarrollo incre- el producto para ver si necesita otros cambios ade-
mental más de los estipulados antes de la entrega del pro-
yecto. Este problema no se ve frecuentemente ya
• En este modelo los usuarios no tienen que esperar que la mayoría de las veces los incrementos estipu-
hasta que el sistema completo se entregue para hacer lados suplen satisfactoriamente al usuario.* [∨]
uso de él. El primer incremento cumple los reque-
rimientos más importantes de tal forma que pueden • Los incrementos no deben constar de muchas líneas
utilizar el software al instante. de código ya que la idea de los incrementos es agre-
gar accesorios al programa principal (o funcional),
• Los usuarios pueden utilizar los incrementos inicia- para que este tenga una y mil formas de desenvol-
les como prototipos y obtener experiencia sobre los verse en su tarea; llenar los incrementos de muchas
requerimientos de los incrementos posteriores del líneas de código provocaría que se perdiera la obje-
sistema. tividad o base de lo que se trata el desarrollo incre-
• Existe muy pocas probabilidades de riesgo en el sis- mental.* [∨]
tema. Aunque se pueden encontrar problemas en al-
gunos incrementos, lo normal es que el sistema se • Requiere de un cliente involucrado durante todo el
entregue sin inconvenientes al usuario. curso del proyecto. Hay clientes que simplemente no
estarán dispuestos a invertir el tiempo necesario.
• Ya que los sistemas de más alta prioridad se entre-
gan primero, y los incrementos posteriores se inte-
• El trato con el cliente debe basarse en principios
gran entre ellos, es muy poco probable que los sis-
éticos y colaboración mutua, más que trabajar ca-
temas más importantes sean a los que se les hagan
da parte independientemente, defendiendo sólo su
más pruebas. Esto quiere decir que es menos proba-
propio bene cio.* [∪]
ble que los usuarios encuentren fallas de funciona-
miento del software en las partes más importantes
del sistema.* [∨] • La entrega de un programa que es parcial pero fun-
cional puede hacer vulnerable al programa debido
a la falta de robustez en su sistema, provocando que
agentes ajenos puedan interferir con el correcto fun-
55.6 Ventajas del desarrollo itera- cionamiento del programa en sí.* [∨]
tivo
• Infunde responsabilidad en el equipo de desarrollo
• En el desarrollo de este modelo se da la retroalimen- al trabajar directamente con el cliente, requiriendo
tación muy temprano a los usuarios. de profesionales sobre el promedio.
10∨ CAPÍTULO 55. DESARROLLO ITERATIVO Y CRECIENTE
• Desarrollo en cascada
• Ingeniería de software
• Desarrollo de software
55.9 Referencias
[1] |Proceso de Desarrollo Iterativo| [Link]
[Link]/?p=13
56.1 Implementaciones
La implementación más famosa es Daikon
10∩
Capítulo 57
Diagrama de colaboración
Un diagrama de colaboración en las versiones de UML implícitas. Un diagrama de comunicación muestra rela-
1.x es esencialmente un diagrama que muestra interaccio- ciones entre roles geométricamente y relaciona los men-
nes organizadas alrededor de los roles. A diferencia de los sajes con las relaciones, pero las secuencias temporales
diagramas de secuencia, los diagramas de colaboración, están menos claras.
también llamados diagramas de comunicación, muestran
explícitamente las relaciones de los roles. Por otra par-
te, un diagrama de comunicación no muestra el tiempo
como una dimensión aparte, por lo que resulta necesario
etiquetar con números de secuencia tanto la secuencia de 57.2 Tipos
mensajes como los hilos concurrentes.
10∪
57.5. CAMBIOS EN VERSIONES RECIENTES DE UML 109
57.4 Flujos
Generalmente, un diagrama de comunicación contiene un
símbolo para un objeto durante una operación completa.
Sin embargo, a veces, un objeto contiene diferentes esta-
dos que se deban hacer explícitos. Por ejemplo, un objeto
pudo cambiar de localización o sus asociaciones pudieron
diferenciarse.
Los diferentes símbolos de objeto que representan un ob-
jeto se pueden conectar usando ujos“become”o“con-
versión”. Un ujo“become”es una transición, a partir
de un estado de un objeto a otro. Se dibuja como una e-
cha de línea discontinua con el estereotipo “become”o
“conversión”y puede ser etiquetado con un número de
serie para mostrar cuando ocurre. Un ujo de conversión
también se utiliza para mostrar la migración de un objeto
a partir de una localización a otra distinta para otro lugar
también se deben marcar con el número en secuencias.
Diagrama de ujo
La lámpara no
funciona
¿Está No
enchufada Enchufar
la lámpara? la lámpara
Sí
¿Está Sí
quemada la Cambiar la
ampolleta? ampolleta
No
Comprar
nueva lámpara
110
58.3. TIPOS DE DIAGRAMAS DE FLUJO 111
58.1 Normas de trabajo es una forma especial de diagrama de estado usado para
modelar una secuencia de acciones y condiciones toma-
Un diagrama de ujo presenta generalmente un único das dentro de un proceso.
punto de inicio y un único punto de cierre, aunque puede La especi cación del Lenguaje de Noti cación Uni cado
tener más, siempre que cumpla con la lógica requerida. (UNL) de ne un diagrama de actividad como:
Las siguientes son acciones previas a la realización del “…una variación de los estados de una máquina, los cuales
diagrama de ujo: representan el rendimiento de las acciones o subactivida-
des y las transiciones se provocan por la realización de las
*
• Identi car las ideas principales al ser incluidas en el acciones o subactividades.” [1]
diagrama de ujo. Deben estar presentes el autor o El propósito del diagrama de actividad es modelar un pro-
responsable del proceso, los autores o responsables ceso de ujo de trabajo (work ow) y/o modelar operacio-
del proceso anterior y posterior y de otros proce- nes.
sos interrelacionados, así como las terceras partes
interesadas. Una Operación es un servicio proporcionado por un ob-
jeto, que está disponible a través de una interfaz.
• De nir qué se espera obtener del diagrama de ujo.
Una Interfaz es un grupo de operaciones relacionadas con
• Identi car quién lo empleará y cómo. la semántica.
• Determinar los límites del proceso a describir. 58.3 Tipos de diagramas de ujo
Los pasos a seguir para construir el diagrama de ujo son: • Formato vertical: En él, el ujo y la secuencia de las
operaciones, va de arriba hacia abajo. Es una lista
ordenada de las operaciones de un proceso con toda
• Establecer el alcance del proceso a describir. De es-
la información que se considere necesaria, según su
ta manera quedará jado el comienzo y el nal del
propósito.
diagrama. Frecuentemente el comienzo es la salida
del proceso previo y el nal la entrada al proceso • Formato horizontal: En él, el ujo o la secuencia de
siguiente. las operaciones, va de izquierda a derecha.
• Identi car y listar las principales activida-
• Formato panorámico: El proceso entero está repre-
des/subprocesos que están incluidos en el proceso a
sentado en una sola carta y puede apreciarse de una
describir y su orden cronológico.
sola mirada mucho más rápido que leyendo el tex-
• Si el nivel de detalle de nido incluye actividades to, lo que facilita su comprensión, aun para personas
menores, listarlas también. no familiarizadas. Registra no solo en línea vertical,
sino también horizontal, distintas acciones simultá-
• Identi car y listar los puntos de decisión. neas y la participación de más de un puesto o depar-
tamento que el formato vertical no registra.
• Construir el diagrama respetando la secuencia cro-
nológica y asignando los correspondientes símbolos. • Formato Arquitectónico: Describe el itinerario de
• Asignar un título al diagrama y veri car que esté ruta de una forma o persona sobre el plano arquitec-
completo y describa con exactitud el proceso ele- tónico del área de trabajo. El primero de los ujo-
gido. gramas es eminentemente descriptivo, mientras que
los utilizados son fundamentalmente representati-
vos.
58.2 Descripción
En UML 1.x, un diagrama de actividades es una variación
58.4 Simbología y signi cado
del diagrama de estado UNL donde los “estados”re-
presentan operaciones, y las transiciones representan las • Óvalo o Elipse: Inicio y Final (Abre y cierra el dia-
actividades que ocurren cuando la operación se completa. grama).
El diagrama de mensajes de UML 2.0, mientras que es • Rectángulo: Actividad (Representa la ejecución de
similar en aspecto al diagrama de actividades UML 1.x, una o más actividades o procedimientos).
ahora tiene semánticas basadas en redes de Petri. En
UML 2.0, el diagrama general de interacción está basado • Rombo: Decisión (Formula una pregunta o cues-
en el diagrama de actividades. El diagrama de actividad tión).
112 CAPÍTULO 58. DIAGRAMA DE FLUJO
• Permiten identi car los problemas y las oportunida- 58.11 Enlaces externos
des de mejora del proceso. Se identi can los pasos,
los ujos de los reprocesos, los con ictos de autori-
dad, las responsabilidades, los cuellos de botella, y • Wikimedia Commons alberga contenido multi-
los puntos de decisión. media sobre Diagrama de ujoCommons.
Diagrama Nassi-Shneiderman
En programación de computadores un diagrama Nassi- do lo que se puede representar con un diagrama Nassi-
Shneiderman (o NSD por sus siglas en inglés), también Shneiderman se puede representar con un diagrama de
conocido como diagrama de Chapin* [1]* [2] es una repre- ujo. Las únicas excepciones se dan en las instrucciones
sentación grá ca que muestra el diseño de un programa GOTO, break y continue.
estructurado.
59.2 Referencias
[1] Molina Marco, A.; Letelier Torres, P.; Sánchez Palma, P.;
Sánchez Díaz, J. (199∩). «Métodos para especi cación
de módulos». Metodología y tecnología de la programa-
ción. Valencia: Universidad Politécnica de Valencia. p. ∧0.
ISBN ∪4∩∩21∧19∩. Consultado el 2∨ de agosto de 2013.
Basado en un diseño top-down (de lo complejo a lo sim- • Wikimedia Commons alberga contenido mul-
ple), el problema que se debe resolver se divide en sub- timedia sobre Diagrama Nassi-Shneiderman.
problemas cada vez más pequeños - y simples - hasta que Commons
solo queden instrucciones simples y construcciones para
el control de ujo. El diagrama Nassi-Shneiderman re- • A short history of structured owcharts (Nassi-
eja la descomposición del problema en una forma sim- Shneiderman Diagrams), por Ben Shneiderman
ple usando cajas anidadas para representar cada uno de
los subproblemas. Para mantener una consistencia con los
59.3.1 Software
fundamentos de la programación estructurada, los diagra-
mas Nassi-Shneiderman no tienen representación para las • Structorizer – Editor de diagramas Nassi-
instrucciones GOTO. Shneiderman para Linux, Mac OS X & Microsoft
Los diagramas Nassi-Shneiderman se utilizan muy rara- Windows, distribuido bajo GNU General Public
mente en las tareas de programación formal. Su nivel de License
abstracción es muy cercano al código de la programación
estructurada y ciertas modi caciones requieren que se re- • Nessi – Editor e intérprete de diagramas Nassi-
dibuje todo el diagrama. Shneiderman, multiplataforma (Java), distribuido
bajo GNU General Public License
Los diagramas Nassi-Shneiderman son (la mayoría de
las veces) isomór cos con los diagramas de ujo. To-
114
Capítulo 60
di
En informática, di es una utilidad para la comparación veía di con la habilidad natural para crear órdenes de
de archivos que genera las diferencias entre dos archi- edición útiles. Estas órdenes de edición, cuando se gra-
vos o los cambios realizados en un archivo determinado baban en un archivo, podían, junto con el archivo origi-
comparándolo con una versión anterior del mismo archi- nal, ser reconstituidas completamente por ed en el archi-
vo. Di expone los cambios realizados por línea en los vo modi cado. Esto reducía enormemente el necesario
archivos de texto. Las implementaciones modernas tam- almacenamiento secundario para mantener las distintas
bién soportan archivos binarios.* [1] El resultado se cono- versiones de un archivo. McIlroy consideró escribir un
ce como di o patch ya que el mismo puede ser aplicado post-procesador para di donde una variedad de forma-
con el programa Unix patch. El resultado de la compa- tos de resultados pudiesen ser diseñados e implementa-
ración de un archivo similar también se llama “di ”. dos, pero encontró que era más frugal y sencillo hacer
De la misma manera que se usa la palabra "grep" para que di fuese el responsable de generar la sintaxis y la in-
describir la acción de buscar, la palabra di se usa en la formación de entrada de orden contrario aceptada por el
jerga como un verbo que se re ere al cálculo de cualquier comando ed. En 19∪∧, Larry Wall compuso una utilidad
diferencia. Un ejemplo de di . separada, patch, que generalizó y extendió la habilidad
para modi car archivos con resultado di . Los modos de
Emacs permiten también convertir el formato de patches
e incluso editar patches interactivamente.
60.1 Historia
En los primeros años de di , los usos habituales eran la
La utilidad di fue desarrollada a comienzos de los años comparación de cambios en la fuente del código del soft-
setenta en el sistema operativo Unix que estaba creándo- ware y el marcado de documentos técnicos, la veri ca-
se en AT&T Bell Labs en Murray Hill, Nueva Jersey. La ción de la salida de errores de programa, la comparación
versión nal, que apareció por primera vez con la ∧ª edi- de listados de sistemas de archivos y el análisis del códi-
ción de Unix en 19∩4, fue toda ella escrita por Douglas go del montaje del ordenador. La salida apuntada por ed
McIlroy. Este trabajo fue publicado en un artículo de fue modi cada para proporcionar compresión a una se-
19∩∨ co-escrito con James W. Hunt que desarrolló un cuencia de modi caciones hecha a un archivo. La Source
prototipo inicial de di .* [2] Code Control System (SCCS) y su habilidad para archi-
var revisiones apareció a nales de los años setenta como
El trabajo de McIlroy fue precedido e in uido por el pro- consecuencia de almacenar órdenes de edición de di .
grama comparison de Steve Johnson en GECOS y por
el programa proof de Mike Lesk también originado en El Project Xanadu es un predecesor conceptual de di .
Unix y, como di , producía cambios línea a línea e in- Era un proyecto de hipertexto concebido por primera vez
cluso utilizaba paréntesis angulares (">" y "<") para pre- en 19∨0 que debía incluir una versión de un sistema de se-
sentar las inserciones y borrados de línea en el resultado guimiento necesario para su característica de“transpoin-
del programa. Las heurísticas utilizadas en estas prime- ting windows”. La característica subsumía las diferencias
ras aplicaciones fueron, sin embargo, juzgadas como no de archivos en el término expansivo "transclusión", en el
ables. La utilidad potencial de la herramienta di pro- que un documento incluía en él partes de otros documen-
vocó que McIlroy acometiese la investigación y diseño tos o revisiones.
de una herramienta más robusta que podía usarse en una
gran variedad de tareas pero que al tiempo se condujese
bien en los procesos y con las limitaciones de tamaño del
hardware de PDP-11. Su análisis del problema lo llevó
60.2 Algoritmo
a cabo con la colaboración de distintas personas de Bell
Labs como Alfred Aho, Elliot Pinson, Je rey Ullman y La operación de di se basa en resolver el problema
Harold S. Stone. Problema de Subsecuencia Común mas Larga (LCS).
En el contexto de Unix, el uso del editor de línea ed pro- En el problema LCS, se tienen dos secuencias de ítems:
11∧
11∨ CAPÍTULO 60. DIFF
Dirección de retorno
11∪
Capítulo 62
Diseño estructurado
En programación y diseño de algoritmos, el diseño es- Ciencias de la Computación Niklaus Wirth, que consis-
tructurado persigue elaborar algoritmos que cumplan la te precisamente en volver a aplicar el estudio descendente
propiedad de modularidad, para ello, dado un problema Top-Down a cada subproblema una y otra vez hasta obte-
que se pretende resolver mediante la elaboración de un ner subproblemas su cientemente pequeños, que puedan
programa de ordenador, se busca dividir dicho programa ser resueltos por módulos que cumplan, en la medida de
en módulos siguiendo los principios de diseño de Des- lo posible, las características deseables en un módulo en
composición por re namientos sucesivos, creación de el ámbito de la programación. En palabras del propio Ni-
una Jerarquía modular y elaboración de módulos Inde- klaus Wirth:
pendientes.
• En cada paso (del re namiento), una o varias ins-
trucciones del programa dado, se descomponen en
62.1 Etapas del Diseño estructura- instrucciones más detalladas. Esta descomposición
sucesiva o re namiento de especi caciones termina
do cuanto todas las instrucciones están expresadas en
términos de la computadora usada o del lenguaje de
62.1.1 Descomposición programación...
Para ello se requiere un adecuado análisis de dicho pro- • Conforme se re nan las tareas, también los datos
blema, siendo necesario de nir primeramente el proble- pueden ser re nados, descompuestos o estructura-
ma, para lo cual deberá de contener una detallada pero dos, siendo lo natural re nar las especi caciones del
concisa descripción del mismo, un problema bien de ni- programa y de los datos en paralelo.
do es aquel que lleva implícitas tanto una situación inicial
como nal claras • Cada paso de re namiento implica algunas decisio-
nes de diseño. Es importante que el programador sea
←Por qué descomponer un problema en partes? Experi- consciente de los criterios subyacentes (en las de-
mentalmente está comprobado que: cisiones de diseño adoptadas) y de la existencia de
soluciones alternativas...
• Un problema complejo cuesta más de resolver que
otro más sencillo (de Perogrullo). Problema del re namiento sucesivo
• La complejidad de un problema global es mayor que ←Cuándo parar el re namiento?. Un re namiento excesi-
el valor de las complejidades de cada una de sus par- vo podría dar lugar a un número tan grande de módulos
tes por separado. que haría poco práctica la descomposición. Se tendrán en
cuenta estos criterios para dejar de descomponer:
Según esto, merece la pena el esfuerzo de dividir un pro- • Cuando no haya tareas bien de nidas.
blema grande en subproblemas más pequeños. Si el obje-
tivo es elaborar un programa para resolver dicho proble- • Cuando la interfaz de un módulo sea tan complicada
ma grande, cada subproblema (menos complejo) podrá como el propio módulo
ser resuelto por un módulo (subalgoritmo) relativamen-
te fácil de implementar (más que el programa global No
dividido). Ahora la cuestión es ¿cómo realizar la descom- 62.1.2 Jerarquía de módulos
posición?; realizando un estudio descendente Top-Down
que nos lleve desde la concepción del problema (progra- Ésta es una consecuencia directa de la descomposición
ma o algoritmo) global hasta identi car sus partes (módu- del problema mediante re namientos sucesivos, el re-
los). Esta técnica se repite aplicando una estrategia llama- sultado será un conjunto de módulos estrati cados en ca-
da de re namiento sucesivo propuesta por el experto en pas a modo de pirámide donde en la cima habrá un único
119
120 CAPÍTULO 62. DISEÑO ESTRUCTURADO
módulo que representará al programa global y en los ni- • Acoplamiento Común.- Dos módulos acceden a un
veles inferiores aparecerán los módulos resultantes de las mismo recurso común, típicamente memoria com-
sucesivas divisiones. partida, una variable global o un chero. Una varian-
Al nal, debe obtenerse una estructura piramidal donde te de este tipo de acoplamiento es el acoplamiento
los módulos de los niveles superiores se encargan de las externo:
tareas de coordinación, lógica de la aplicación y mani- • Acoplamiento externo.- Los módulos están
pulación de los módulos inferiores; estos otros deberán ligados a componentes externos. Por ejemplo,
realizar tareas de cálculo, tratamiento y entrada/salida de dispositivos de E/S, protocolos de comunica-
información. ciones... etc.
Se de ne como el grado de interdependencia que hay • Cohesión secuencial: Un módulo realiza distintas
entre los distintos módulos de un programa; lo desea- tareas en secuencia, de forma que las entradas de
ble es que esta interdependencia sea lo menor posible, es cada tarea son las salidas de la tarea anterior. No es
decir, un bajo acoplamiento. Los niveles de acoplamien- una mala cohesión si las tareas implicadas no son
to, ordenados de menor (más deseable) a mayor (menos muy complejas y requieren pocas líneas de código.
deseable) son:
• Cohesión comunicacional: El módulo realiza ac-
tividades paralelas usando los mismos datos de en-
• Acoplamiento normal.- Un módulo llama a otro de trada y salida. Como en el caso anterior, tampoco
un nivel inferior y tan solo intercambian datos (pa- se trata de un mal tipo de cohesión si las tareas son
rámetros de entrada/salida). Dentro de este tipo de relativamente sencillas.
acoplamiento podemos encontrarnos 3 subtipos, de-
pendiendo de los datos que intercambien los módu- • Cohesión procedimental: El módulo tiene una se-
los: rie de funciones relacionadas por un procedimiento
efectuado por el código (a modo de biblioteca). Es
• Acoplamiento de datos: Los módulos se comu- similar a la secuencial, pero puede incluir el paso de
nican mediante parámetros. controles. Será deseable que las funciones estén rela-
• Acoplamiento de marca o por estampado: Los cionadas o realicen tareas dentro del mismo ámbito
módulos se pasan datos con estructura de re- (p.e. la biblioteca string.h de C contienen funciones
gistro. No es muy deseable si el módulo recep- para operar con cadenas de caracteres).
tor sólo requiere parte de los datos que se le
pasan. • Cohesión temporal: Los elementos del módulo es-
tán implicados en actividades relacionadas con el
• Acoplamiento de control: Los datos que se in- tiempo.
tercambian entre los módulos son controles.
Debido a que en este subtipo un módulo con- • Cohesión lógica: Las actividades que realiza el mó-
trola la ejecución del otro, no es un buen aco- dulo tienen la misma categoría. Esto es, es como si
plamiento, ya que impide que sean totalmente se tuvieran partes independientes dentro del mismo
independientes. módulo.
62.3. VÉASE TAMBIÉN 121
• Programación modular
• Dinámica de sistemas
• Sistema complejo
• Sistema dinámico
Distancia de Damerau-Levenshtein
63.3 Referencias
122
Capítulo 64
Distancia de Levenshtein
La distancia de Levenshtein, distancia de edición o lenStr2+1 columns declare int d[0..lenStr1, 0..lenStr2]
distancia entre palabras es el número mínimo de ope- // i and j are used to iterate over str1 and str2 declare int
raciones requeridas para transformar una cadena de ca- i, j, cost for i from 0 to lenStr1 d[i, 0] := i for j from 0
racteres en otra, se usa ampliamente en teoría de la in- to lenStr2 d[0, j] := j for i from 1 to lenStr1 for j from
formación y ciencias de la computación. Se entiende por 1 to lenStr2 if str1[i] = str2[j] then cost := 0 else cost :=
operación, bien una inserción, eliminación o la sustitu- 1 d[i, j] := minimum( d[i-1, j] + 1, // deletion d[i, j-1]
ción de un carácter. Esta distancia recibe ese nombre en + 1, // insertion d[i-1, j-1] + cost // substitution ) return
honor al cientí co ruso Vladimir Levenshtein, quien se d[lenStr1, lenStr2]
ocupó de esta distancia en 19∨∧. Es útil en programas que El invariante mantenido a través del algorítmo es que pue-
determinan cuán similares son dos cadenas de caracteres, da transformar el segmento inicial str1[1..i] en str2[1..j]
como es el caso de los correctores de ortografía. empleando un mínimo de d[i,j] operaciones. Al nal, el
Por ejemplo, la distancia de Levenshtein entre “casa”y elemento ubicado en la parte INFERIOR derecha de la
“calle”es de 3 porque se necesitan al menos tres ediciones matriz contiene la respuesta.
elementales para cambiar uno en el otro.
123
124 CAPÍTULO 64. DISTANCIA DE LEVENSHTEIN
64.2.2 C++
deletion, Min(d[i, j-1] + 1, // insertion d[i-1, j-1] + cost) == s2[j - 1]) c = 0; else c = 1; var r = d[j * a + i - 1] +
// substitution ); end; Result:=d[Len1,Len2]; end; 1; var s = d[(j - 1) * a + i] + 1; var t = d[(j - 1) * a + i
- 1] + c; d[j * a + i] = [Link]([Link](r, s), t); } }
return(d[l2 * a + l1]); }
64.2.10 [Link]
Public Function Levenshtein(ByVal s1 As String, ByVal 64.3 Aplicaciones
s2 As String) As Integer Dim coste As Integer = 0
Dim n1 As Integer = [Link] Dim n2 As Integer =
• El proyecto ASJP usa la distancia de Levenshtein
[Link] Dim m As Integer(,) = New Integer(n1, n2)
total en una lista de palabras en diferentes lenguas
{} For i As Integer = 0 To n1 m(i, 0) = i Next For i As
del mundo, para medir la “similaridad”o “cer-
Integer = 1 To n2 m(0, i) = i Next For i1 As Integer = 1
canía”de las mismas, esa distancia calculada puede
To n1 For i2 As Integer = 1 To n2 coste = If((s1(i1 - 1) =
emplearse para proponer una clasi cación logené-
s2(i2 - 1)), 0, 1) m(i1, i2) = [Link]([Link](m(i1
tica tentativa de las lenguas del mundo.* [1]
- 1, i2) + 1, m(i1, i2 - 1) + 1), m(i1 - 1, i2 - 1) + coste)
Next Next Return m(n1, n2) End Function • La distancia de Damerau-Levenshtein es una ge-
neralización de la distancia de Levenshtein usada
por los correctores ortográ cos y en la detección de
fraudes en listas de datos.
64.2.11 ActionScript 3.0
public class StringUtils { public static function
levenshtein(s1:String, s2:String):int { if ([Link]
64.4 Véase también
== 0 || [Link] == 0) return 0; var m:uint = [Link]
+ 1; var n:uint = [Link] + 1; var i:uint, j:uint, • Distancia de Damerau-Levenshtein
cost:uint; var d:Vector.<Vector.<int>> = new Vec- • Algoritmo Needleman-Wunsch
tor.<Vector.<int>>(); for (i = 0; i < m; i++) { d[i] =
new Vector.<int>(); for (j = 0; j < n; j++) d[i][j] = 0; • Algoritmo Smith-Waterman
} for (i = 0; i < m; d[i][0] = i++) ; for (j = 0; j < n;
d[0][j] = j++) ; for (i = 1; i < m; i++) { for (j = 1; j < • Algoritmo Bitap
n; j++) { cost = ([Link](i - 1) == [Link](j - 1)) ? • Autómata de Levenshtein
0 : 1; d[i][j] = [Link]([Link](d[i - 1][j] + 1, d[i][j
- 1] + 1), d[i - 1][j - 1] + cost); } } return d[m-1][n-1]; } } • Espacio métrico
• Agrep
• Ratcli /Obershelp
64.2.12 ColdFusion
• Dynamic time warping
<cfscript> function levDistance(s,t) { var d = Array-
New(2); var i = 1; var j = 1; var s_i = “A"; var t_j = • Distancia de Jaro-Winkler
“A"; var cost = 0; var n = len(s)+1; var m = len(t)+1;
d[n][m]=0; if (n is 1) { return m; } if (m is 1) { return n;
} for (i = 1; i lte n; i=i+1) { d[i][1] = i-1; } for (j = 1; j lte 64.5 Referencias
m; j=j+1) { d[1][j] = j-1; } for (i = 2; i lte n; i=i+1) { s_i
= Mid(s,i-1,1); for (j = 2; j lte m; j=j+1) { t_j = Mid(t,j- [1] ASJP - World Language Tree
1,1); if (s_i is t_j) { cost = 0; } else { cost = 1; } d[i][j] =
min(d[i-1][j]+1, d[i][j-1]+1); d[i][j] = min(d[i][j], d[i-
1][j-1] + cost); } } return d[n][m]; } </cfscript>
DLO
12∨
Capítulo 66
La tecnología DCM viene instalada en Windows. La 4. Todos los drivers de la cadena usarán el mismo có-
biblioteca se actualiza cuando se actualizan las ayudas. digo de escape para controlar la comunicación entre
Un programador puede utilizar DCM en sus aplicaciones los usuarios y los controladores.
programando desde Microsoft Visual Studio empleando
∧. En caso de que se cambie el adaptador de la pantalla
la biblioteca MSDN.
se detectará si el ajuste de la cadena puede llevarse
a cabo.
∨. Los drivers instalados no interferirán con los nuevos.
66.1 ¿Qué hace?
66.1.3 Cuestiones fuera del alcance de
DCM es un conjunto de rutinas de la biblioteca MSDN DCM
usada por la tecnología de asistencia de Windows. Permi-
te la instalación, desinstalación y mantenimiento de inter- 1. DCM no garantiza que 2 drivers se puedan ejecu-
ceptadores del driver grá co. tar al mismo tiempo. Esto queda en manos de los
Las aplicaciones de asistencia utilizan éstas rutinas para desarrolladores de éstos.
saber en que posición de la cadena de drivers deben co- 2. Para los vendedores que soportan DCM, Los dri-
locar el suyo, de manera que no inter eran con las demás vers instalados pueden permanecer después de los
aplicaciones y éstas con ella que usan DCM. Sin embargo DCM no tendrá co-
nocimiento de ellos.
3. Puede haber otros driver que no usen DCM, pero
66.1.1 Objetivos DCM no tendrá conocimiento de ellos.
4. DCM no soporta usuarios con múltiples monitores.
1. Proporcionar su ciente información sobre los obje-
tos en la pantalla.
66.2 Sotrware que utiliza DCM
2. Asegurarse de que otras aplicaciones de asistencia
instaladas en el sistema no inter eran con las que ya
66.2.1 Aplicaciones que utilizan DCM
se están ejecutando.
Las siguientes aplicaciones ya utilizan esta tecnología.
3. Asegurarse de que varias aplicaciones de asistencia
pueden ejecutarse simultáneamente. • Dolphin Computer Access:
12∩
12∪ CAPÍTULO 66. DRIVER CHAIN MANAGER
66.2.3 Sistemas operativos que soportan 66.4 Otras aplicaciones que utili-
‘DCM zan DCM
DCM 1.0 es compatible con Windows NT versión 4,
Windows 2000 y Windows XP. Existen otras aplicaciones, de distintas tipologías, que
pueden utilizar DCM. De ellas se destaca el software de
acceso remoto, el cual necesita capturar la imagen de la
pantalla y enviarla por la red.
66.3 Funcionamiento de la cadena
de drivers
66.5 Véase también
El sistema operativo Windows permite instalar una cade-
na de drivers para la generación de la imagen de la panta- • Ti otecnología.
lla. El primer driver obtendrá la información de las apli-
caciones y se la pasará al siguiente driver y así sucesiva- • Windows.
mente con el resto de los drivers, esta cadena acabará en
• MSDN.
el driver de la tarjeta grá ca. Al colocar otros drivers lo
que se pretende es capturar y/o modi car la información.
Por ejemplo, un lector de pantalla no modi cará la infor- 66.6 Fuentes y referencias
mación que reciba, pero capturará los datos necesarios
que requiera para poder leer por el altavoz. Por el contra-
1. biblioteca MSDN: DCM (en inglés).
rio un magni cador de pantalla recortará un rectángulo
de la entrada y se lo pasará al siguiente driver.
66.3.1 El problema
El problema es que el orden de la cadena no es aleato-
rio. Algunas aplicaciones deben ejecutar sus rutinas an-
tes que otras. Por ejemplo, si ejecutamos el magni cador
antes que un lector de pantalla, es posible que el primero
Capítulo 67
Dublin Core
Dublin Core es un modelo de metadatos elaborado y aus- • Elementos relacionados principalmente con el con-
piciado por la DCMI (Dublin Core Metadata Initiative), tenido del recurso.
una organización dedicada a fomentar la adopción exten-
sa de los estándares interoperables de los metadatos y a • Elementos relacionados principalmente con el re-
promover el desarrollo de los vocabularios especializados curso cuando es visto como una propiedad intelec-
de metadatos para describir recursos para permitir siste- tual.
mas más inteligentes el descubrimiento del recurso. • Elementos relacionados principalmente con la ins-
Las implementaciones de Dublin Core usan generalmente tanciación del recurso.
XML y se basan en el Resource Description Framework.
Dublin Core se de ne por ISO en su norma ISO 1∧∪3∨ Dentro de cada clasi cación encontramos los siguientes
del año 2003, y la norma NISO Z39.∪∧-200∩. elementos:
El nombre viene por Dublin, Ohio, Estados Unidos, ciu- Contenido:
dad que en 199∧ albergó la primera reunión a nivel mun-
dial de muchos de los especialistas en metadatos y Web
• Título: el nombre dado a un recurso, habitualmente
de la época.
por el autor.
Etiqueta: [Link]
67.1 Descripción general
• Claves: los temas del recurso. Típicamente, Subject
Dublin Core es un sistema de 15 de niciones semánti-
expresará las claves o frases que describen el título o
cas descriptivas que pretenden transmitir un signi cado
el contenido del recurso. Se fomentará el uso de vo-
semántico a las mismas.
cabularios controlados y de sistemas de clasi cación
Estas de niciones: formales.
• Se pueden repetir
• Descripción: una descripción textual del recurso.
• Pueden aparecer en cualquier orden Puede ser un resumen en el caso de un documen-
to o una descripción del contenido en el caso de un
documento visual.
Este sistema de de niciones fue diseñado especí camen-
te para proporcionar un vocabulario de características
“base”, capaces de proporcionar la información descrip- Etiqueta: [Link]
tiva básica sobre cualquier recurso, sin que importe el for-
mato de origen, el área de especialización o el origen cul- • Fuente: secuencia de caracteres usados para identi-
tural. car unívocamente un trabajo a partir del cual pro-
viene el recurso actual.
En general, podemos clasi car estos elementos en tres • Tipo del Recurso: la categoría del recurso. Por
grupos que indican la clase o el ámbito de la información ejemplo, página personal, romance, poema, diccio-
que se guarda en ellos: nario, etc.
129
130 CAPÍTULO 67. DUBLIN CORE
67.4 Ventajas
• La simplicidad
• La exibilidad
• La independencia sintáctica
• La interoperabilidad semántica
• SEDIC
• y documentos XML/RDF para Recuperación
Capítulo 68
eAthena
132
Capítulo 69
Efecto Hover
69.1 Referencias
[1] Ejemplo de efecto Hover sobre un enlace.
133
Capítulo 70
Emtp
134
Capítulo 71
Enlace dinámico
13∧
Capítulo 72
Enlace estático
13∨
Capítulo 73
Enlazado
13∩
Capítulo 74
Entrada chapuza
13∪
Capítulo 75
Error de software
75.1 Orígenes del término • Estimar que el equipo donde se instalará tiene de-
terminadas características (como la resolución de la
pantalla, la velocidad del procesador, la cantidad de
En 19∨∩, los creadores de Mark III informaron del pri- memoria o conectividad a internet) propias de un
mer caso de error en un ordenador causado por un bug. equipo de gama alta, en vez de diseñar el software
El Mark II, ordenador sucesor de ASCC Mark II, cons- para su ejecución en equipos normales
truido en 1944, sufrió un fallo en un relé electromagnéti-
co. Cuando se investigó ese relé, se encontró una polilla
(bug) que provocó que el relé quedase abierto. Grace Mu-
rray Hopper, licenciada en física y destacada matemática 75.3 Errores de programación co-
que trabajó como programadora en el Mark II, pegó el munes
insecto con cinta adhesiva en la bitácora.* [4]
Este incidente es erróneamente referido como el origen • División por cero
de la utilización del término inglés bug («bicho») para
indicar un problema en un aparato o sistema.* [∧]* [∨] En • Ciclo in nito
139
140 CAPÍTULO 75. ERROR DE SOFTWARE
• Depurador
Estilo de programación
142
76.3. ENLACES EXTERNOS 143
• Doble clic
144
Capítulo 78
Los algoritmos de exclusión mutua (comúnmente abre- semáforo y ambos se quedan a la espera de que el otro
viada como mutex por mutual exclusion) se usan en proceso libere el semáforo. Otros efectos comunes inclu-
programación concurrente para evitar el ingreso a sus sec- yen la Inanición, en el cual un proceso esencial no se eje-
ciones críticas por más de un proceso a la vez. La sección cuta durante el tiempo deseado, y la inversión de priori-
crítica es el fragmento de código donde puede modi car- dades, en el que una tarea de prioridad elevada espera por
se un recurso compartido. otra tarea de menor prioridad, así como la latencia alta en
La mayor parte de estos recursos son las señales, conta- la que la respuesta a las interrupciones no es inmediata.
dores, colas y otros datos que se emplean en la comuni- La mayor parte de la investigación actual en este campo,
cación entre el código que se ejecuta cuando se da servi- pretende eliminar los efectos anteriormente descritos. Si
cio a una interrupción y el código que se ejecuta el resto bien no hay un esquema perfecto conocido, hay un in-
del tiempo. Se trata de un problema de vital importan- teresante esquema no clásico de envío de mensajes entre
cia porque, si no se toman las precauciones debidas, una fragmentos de código que, aunque permite inversiones de
interrupción puede ocurrir entre dos instrucciones cua- prioridad y produce una mayor latencia, impide los inter-
lesquiera del código normal y esto puede provocar graves bloqueos.
fallos. Algunos ejemplos de algoritmos clásicos de exclusión
La técnica que se emplea por lo común para conseguir la mutua son:
exclusión mutua es inhabilitar las interrupciones durante
el conjunto de instrucciones más pequeño que impedi- • El algoritmo de Dekker.
rá la corrupción de la estructura compartida (la sección
crítica). Esto impide que el código de la interrupción se • El algoritmo de Peterson.
ejecute en mitad de la sección crítica.
En un sistema multiprocesador de memoria compartida,
se usa la operación indivisible test-and-set sobre una ban- 78.1 Véase también
dera, para esperar hasta que el otro procesador la despeje.
La operación test-and-set realiza ambas operaciones sin • Cierre de exclusión mutua o locks
liberar el bus de memoria a otro procesador. Así, cuando
el código deja la sección crítica, se despeja la bandera. • Semáforo (inventado por Edsger Dijkstra)
Esto se conoce como spin lock o espera activa. • Monitor (concurrencia)(inventado por C. A. R.
Algunos sistemas tienen instrucciones multioperación in- Hoare) (sin interbloqueos)
divisibles similares a las anteriormente descritas para ma-
nipular las listas enlazadas que se utilizan para las colas
de eventos y otras estructuras de datos que los sistemas
operativos usan comúnmente.
La mayoría de los métodos de exclusión mutua clásicos
intentan reducir la latencia y espera activa mediante las
colas y cambios de contexto. Algunos investigadores a r-
man que las pruebas indican que estos algoritmos espe-
ciales pierden más tiempo del que ahorran.
A pesar de todo lo dicho, muchas técnicas de exclu-
sión mutua tienen efectos colaterales. Por ejemplo, los
semáforos permiten interbloqueos (deadlocks) en los que
un proceso obtiene un semáforo, otro proceso obtiene el
14∧
Capítulo 79
Expresión regular
Una expresión regular, a menudo llamada también re- Agrupación Los paréntesis pueden usarse para de nir
gex, es una secuencia de caracteres que forma un patrón el ámbito y precedencia de los demás operadores.
de búsqueda, principalmente utilizada para la búsqueda Por ejemplo, "(p|m)adre”es lo mismo que “pa-
de patrones de cadenas de caracteres u operaciones de dre|madre”, y "(des)?amor”se corresponde con
sustituciones. Por ejemplo, el grupo formado por las ca- amor y con desamor.
denas Handel, Hflndel y Haendel se describe con el patrón
“H(a|ä|ae)ndel”. La mayoría de las formalizaciones pro-
porcionan los siguientes constructores: una expresión re-
gular es una forma de representar a los lenguajes regula-
res ( nitos o in nitos) y se construye utilizando caracteres Los constructores pueden combinarse libremente dentro
del alfabeto sobre el cual se de ne el lenguaje. de la misma expresión, por lo que“H(ae?|ä)ndel”equivale
a “H(a|ae|ä)ndel”.
En informática, las expresiones regulares proveen una
manera muy exible de buscar o reconocer cadenas de La sintaxis precisa de las expresiones regulares cambia
texto. según las herramientas y aplicaciones consideradas, y se
describe con más detalle a continuación.
Cuanti cación Un cuanti cador tras un carácter espe- Numerosos editores de texto y otras herramientas utilizan
ci ca la frecuencia con la que éste puede ocurrir. expresiones regulares para buscar y reemplazar patrones
Los cuanti cadores más comunes son ?, + y *: en un texto. Por ejemplo, las herramientas proporciona-
das por las distribuciones de Unix (incluyendo el editor
? El signo de interrogación indica que el carácter sed y el ltro grep) popularizaron el concepto de expre-
que le precede puede aparecer como mucho sión regular entre usuarios no programadores, aunque ya
una vez. Por ejemplo, “ob?scuro”se corres- era familiar entre los programadores.
ponde con oscuro y obscuro.
Inicialmente, este reconocimiento de cadenas se progra-
+ El signo más indica que el carácter que le prece- maba para cada aplicación sin mecanismo alguno inhe-
de debe aparecer al menos una vez. Por ejem- rente al lenguaje de programación pero, con el tiempo, se
plo,“ho+la”describe el conjunto in nito hola, ha ido incorporado el uso de expresiones regulares para
hoola, hooola, hoooola, etcétera. facilitar programar la detección de ciertas cadenas. Por
* El asterisco indica que el carácter que le prece- ejemplo, Perl tiene un potente motor de expresiones re-
de puede aparecer cero, una, o más veces. Por gulares directamente incluido en su sintaxis. Otros len-
ejemplo,“0*42”se corresponde con 42, 042, guajes lo han incorporado como funciones especí cas sin
0042, 00042, etcétera. incorporarlo a su sintaxis.
14∨
79.3. LAS EXPRESIONES REGULARES EN PROGRAMACIÓN 14∩
79.3 Las expresiones regulares en • C++: Desde su versión C++11 es posible utilizar ex-
presiones regulares mediante la biblioteca estándar,
programación usando la cabecera <regex>.
Nota: Para el entendimiento completo de esta • Java: existen varias bibliotecas hechas para java que
sección es necesario poseer conocimientos ge- permiten el uso de RegEx, y Sun planea dar soporte
nerales acerca de lenguajes de programación o a estas desde el SDK
programación en general.
• JavaScript: a partir de la versión 1.2 (ie4+, ns4+)
En el área de la programación las expresiones regulares JavaScript tiene soporte integrado para expresiones
son un método por medio del cual se pueden realizar bús- regulares.
quedas dentro de cadenas de caracteres. Sin importar la
amplitud de la búsqueda requerida de un patrón de ni- • Perl: es el lenguaje que hizo crecer a las expresio-
do de caracteres, las expresiones regulares proporcionan nes regulares en el ámbito de la programación hasta
una solución práctica al problema. Adicionalmente, un llegar a lo que son hoy en día.
uso derivado de la búsqueda de patrones es la validación
• PCRE: biblioteca de ExReg para C, C++ y otros
de un formato especí co en una cadena de caracteres da-
lenguajes que puedan utilizar bibliotecas dll (Visual
da, como por ejemplo fechas o identi cadores.
Basic ∨ por ejemplo).
Para poder utilizar las expresiones regulares al programar
es necesario tener acceso a un motor de búsqueda con la • PHP: tiene dos tipos diferentes de expresiones re-
capacidad de utilizarlas. Es posible clasi car los motores gulares disponibles para el programador, aunque la
disponibles en dos tipos según su uso: motores para el variante POSIX (ereg) va a ser desechada en PHP
programador y motores para el usuario nal. ∨.
Motores para el usuario nal: son programas que per- • Python: lenguaje de scripting con soporte de expre-
miten realizar búsquedas sobre el contenido de un archivo siones regulares mediante su librería <regex>.
o sobre un texto extraído y colocado en el programa. Es-
tán diseñados para permitir al usuario realizar búsquedas • .Net Framework: provee un conjunto de clases me-
avanzadas usando este mecanismo, sin embargo es nece- diante las cuales es posible utilizar expresiones re-
sario aprender a redactar expresiones regulares adecuadas gulares para hacer búsquedas, reemplazar cadenas y
para poder utilizarlos e cientemente. Algunos programas validar patrones.
disponibles de este tipo son:
Nota: de las herramientas mencionadas con anterioridad
• grep: programa de los sistemas operativos se utilizan el EditPad Pro y el .Net Framework para dar
Unix/Linux. ejemplos, aunque es posible utilizar las expresiones re-
• sed: programa de los sistemas operativos gulares con cualquier combinación de las herramientas
Unix/Linux que permite la modi cación de la mencionadas. Aunque en general las Expresiones Regu-
salida. lares utilizan un lenguaje común en todas las herramien-
tas, las explicaciones prácticas acerca de la utilización de
• PowerGrep: versión de grep para los sistemas ope- las herramientas y los ejemplos de código deben ser inter-
rativos Windows. pretados de forma diferente. También es necesario hacer
• RegexBuddy: ayuda a crear las expresiones regulares notar que existen algunos detalles de sintaxis de las expre-
en forma interactiva y luego le permite al usuario siones regulares que son propios del .Net Framework que
usarlas y guardarlas. se utilizan en forma diferente en las demás herramien-
tas de programación. Cuando estos casos se den se hará
• EditPad Pro: permite realizar búsquedas con expre- notar en forma explícita para que el lector pueda buscar
siones regulares sobre archivos y las muestra por información respecto a estos detalles en fuentes adicio-
medio de código de colores para facilitar su lectu- nales. En el futuro se incluirán adicionalmente ejemplos
ra y comprensión. de otras herramientas y lenguajes de programación.
Expresiones regulares como motor de búsqueda
Motores para el programador: permiten automatizar el
Las expresiones regulares permiten encontrar porciones
proceso de búsqueda de modo que sea posible utilizarlo
especí cas de texto dentro de una cadena más grande de
muchas veces para un propósito especí co. Estas son al-
gunas de las herramientas de programación disponiblescaracteres. Así, si es necesario encontrar el texto“lote”en
que ofrecen motores de búsqueda con soporte a expre- la expresión“el ocelote saltó al lote contiguo”cualquier
siones regulares: motor de búsqueda sería capaz de efectuar esta labor. Sin
embargo, la mayoría de los motores de búsqueda encon-
• AWK: Forma una parte esencial del lenguaje y por trarían también el fragmento“lote”de la palabra“ocelo-
extensión de la herramienta awk de Unix/Linux te”, lo cual podría no ser el resultado esperado. Algunos
14∪ CAPÍTULO 79. EXPRESIÓN REGULAR
• \d ̶Representa un dígito del 0 al 9. con la barra inversa dentro de los corchetes es la propia
barra inversa. La expresión regular "[\dA-Fa-f]" nos per-
• \w ̶Representa cualquier carácter alfanumérico. mite encontrar dígitos hexadecimales. Los corchetes nos
• \s ̶Representa un espacio en blanco. permiten también encontrar palabras aún si están escri-
tas de forma errónea, por ejemplo, la expresión regular
• \D ̶Representa cualquier carácter que no sea un “expresi[oó]n”permite encontrar en un texto la palabra
dígito del 0 al 9. “expresión”aunque se haya escrito con o sin tilde. Es
necesario aclarar que sin importar cuantos caracteres se
• \W ̶Representa cualquier carácter no alfanuméri-
introduzcan dentro del grupo por medio de los corchetes,
co.
el grupo sólo le dice al motor de búsqueda que encuentre
• \S ̶Representa cualquier carácter que no sea un es- un solo carácter a la vez, es decir, que“expresi[oó]n”no
pacio en blanco. encontrará “expresion”o “expresión”.
de una fecha también es posible mediante expresiones re- de nen grupos “anónimos”, sin embargo el signo de
gulares, como se ejempli ca más adelante. pregunta en conjunto con los paréntesis triangulares "<>"
permite “nombrar”estos grupos de la siguiente forma:
"^(?<Día>\d\d)\/(?<Mes>\d\d)\/(?<Año>\d\d\d\d)$";
79.4.8 Los paréntesis "()" Con lo cual se le especi ca al motor de búsqueda que
los primeros dos dígitos encontrados llevarán la etiqueta
De forma similar que los corchetes, los paréntesis sirven “Día”, los segundos la etiqueta “Mes”y los últimos
para agrupar caracteres, sin embargo existen varias dife- cuatro dígitos llevarán la etiqueta “Año”.
rencias fundamentales entre los grupos establecidos por
medio de corchetes y los grupos establecidos por parén- NOTA: a pesar de la complejidad y exibilidad dada por
tesis: los caracteres especiales estudiados hasta ahora, en su
mayoría nos permiten encontrar solamente un carácter
a la vez, o un grupo de caracteres a la vez. Los meta-
• Los caracteres especiales conservan su signi cado
caracteres enumerados en adelante permiten establecer
dentro de los paréntesis.
repeticiones.
• Los grupos establecidos con paréntesis establecen
una “etiqueta”o “punto de referencia”para el
motor de búsqueda que puede ser utilizada poste- 79.4.10 Las llaves "{}"
riormente como se denota más adelante.
Comúnmente las llaves son caracteres literales cuando se
• Utilizados en conjunto con la barra "|" permite ha- utilizan por separado en una expresión regular. Para que
cer búsquedas opcionales. Por ejemplo la expresión adquieran su función de metacaracteres es necesario que
regular “al (este|oeste|norte|sur) de”permite bus- encierren uno o varios números separados por coma y que
car textos que den indicaciones por medio de puntos estén colocados a la derecha de otra expresión regular
cardinales, mientras que la expresión regular “es- de la siguiente forma: "\d{2}" Esta expresión le dice al
te|oeste|norte|sur”encontraría“este”en la palabra motor de búsqueda que encuentre dos dígitos contiguos.
“esteban”, no pudiendo cumplir con este propósito. Utilizando esta fórmula podríamos convertir el ejemplo
"^\d\d/\d\d/\d\d\d\d$" que servía para validar un formato
• Utilizados en conjunto con otros caracteres especia-
de fecha en "^\d{2}/\d{2}/\d{4}$" para una mayor cla-
les que se detallan posteriormente, ofrece funciona-
ridad en la lectura de la expresión.
lidad adicional.
"\d{2,4}" Esta forma añade un segundo número separado
por una coma, el cuál indica al motor de búsqueda que
79.4.9 El signo de interrogación "?" como máximo debe aparecer 4 veces la expresión regular
\d. Los posibles valores son:
El signo de interrogación tiene varias funciones dentro
del lenguaje de las expresiones regulares. La primera de
• "^\d\d$" (mínimo 2 repeticiones)
ellas es especi car que una parte de la búsqueda es op-
cional. Por ejemplo, la expresión regular “ob?scuridad” • "^\d\d\d$"(tiene 3 repeticiones, por lo tanto entra en
permite encontrar tanto “oscuridad”como “obscuri- el rango 2-4)
dad”. En conjunto con los paréntesis redondos permite
especi car que un conjunto mayor de caracteres es • "^\d\d\d\d$" (máximo 4 repeticiones)
opcional; por ejemplo“Nov(\.|iembre|ember)?" permite
encontrar tanto “Nov”como “Nov.”, “Noviembre” Nota: aunque esta forma de encontrar elementos repeti-
y “November”. Como se mencionó anteriormente, los dos es muy útil, algunas veces no se conoce con claridad
paréntesis nos permiten establecer un “punto de refe- cuantas veces se repite lo que se busca o su grado de re-
rencia”para el motor de búsqueda. Sin embargo, algunas petición es variable. En estos casos los siguientes meta-
veces, no se desea utilizarlos con este propósito, como caracteres son útiles.
en el ejemplo anterior “Nov(\.|iembre|ember)?". En
este caso el establecimiento de este punto de referencia
(que se detalla más adelante) representa una inversión 79.4.11 El asterisco "*"
inútil de recursos por parte del motor de búsqueda.
Para evitarlo se puede utilizar el signo de pregunta El asterisco sirve para encontrar algo que se encuentra re-
de la siguiente forma: “Nov(?:\.|iembre|ember)?". petido 0 o más veces. Por ejemplo, utilizando la expresión
Aunque el resultado obtenido será el mismo, el motor "[a-zA-Z]\d*" será posible encontrar tanto “H”como
de búsqueda no realizará una inversión inútil de recursos “H1”,“H01”,“H100”y“H1000”, es decir, una letra
en este grupo, sino que lo ignorará. Cuando no sea seguida de un número inde nido de dígitos. Es necesario
necesario reutilizar el grupo, es aconsejable utilizar tener cuidado con el comportamiento del asterisco, ya que
este formato. De forma similar, es posible utilizar el éste, por defecto, trata de encontrar la mayor cantidad po-
signo de pregunta con otro signi cado: Los paréntesis sible de caracteres que correspondan con el patrón que se
79.4. DESCRIPCIÓN DE LAS EXPRESIONES REGULARES 1∧1
Flag
1∧3
Capítulo 81
Front-end y back-end
Front-end y back-end son términos que se re eren a la presentación simbólico-fonética y el back-end convierte
separación de intereses entre una capa de presentación y la representación fonética y simbólica en el sonido.
una capa de acceso a datos, respectivamente. Pueden tra- Muchos programas tienen su concepto de diseño dividi-
ducirse al español el primero como interfaz, nal fron- do en front-ends y back-ends, pero en la mayoría de los
tal o frontal y el segundo como motor, dorsal nal* [1]o
casos, el back-end está oculto del usuario nal y solo pue-
zaga,* [2] aunque es común dejar estos términos en in- den utilizarlo el cliente intermedio o el administrador que
glés.
se encargará de gestionar el sistema de información. Sin
embargo, muchos programas están escritos para servir de
simple front-end para otros que ya existen, como es el ca-
81.1 Informática so de las interfaces grá cas construidas sobre una interfaz
de línea de órdenes. Este tipo de front-end es común en
En diseño de software el front-end es la parte del software entornos de escritorio Unix (como los GUI), donde los
que interactúa con el o los usuarios y el back-end es la programas son desarrollados siguiendo la losofía de di-
parte que procesa la entrada desde el front-end. La se- seño de muchos programas pequeños capaces de ejecutar-
paración del sistema en front-ends y back-ends es un tipo se independientemente o combinados.
de abstracción que ayuda a mantener las diferentes partes
del sistema separadas. La idea general es que el front-end
sea el responsable de recolectar los datos de entrada del
usuario, que pueden ser de muchas y variadas formas, y
81.2 Tecnología
los transforma ajustándolos a las especi caciones que de-
manda el back-end para poder procesarlos, devolviendo En radiotelescopios y antenas parabólicas, el front-end
generalmente una respuesta que el front-end recibe y ex- consiste en un paquete que contiene a la antena de bo-
pone al usuario de una forma entendible para este. La co- cina y a la guía de ondas, como un requisito para que las
nexión del front-end y el back-end es un tipo de interfaz. antenas detecten la señal de radio. El back end se re ere
al ampli cador y al ltro que re na y modi ca la señal
En diseño web (o desarrollo web) hace referencia a la vi- antes de presentarla al usuario.
sualización del usuario navegante por un lado (front-end),
y del administrador del sitio con sus respectivos sistemas En la automatización de diseño electrónico, el ciclo del
por el otro (back-end). diseño, que es el front-end, equivale al diseño lógico y
eléctrico (ej. captura esquemática, síntesis lógica). A ve-
Muchos métodos conocidos para interactuar con ordena-
ces el boceto de una estructura (del inglés oorplanning),
dores pueden ser conceptualizados en términos de front- es considerado como un front-end. Un place and route
end y back-end. Por ejemplo, un administrador de archi- (del idioma inglés, un lugar y ruta) o un diseño persona-
vos grá co como Windows Explorer, Dolphin, Nautilus lizado de la capa de veri cación física (design rule chec-
y Finder puede ser considerado como un front-end para king), o una disposición (layout) versus esquemática, son
el sistema de archivos de la computadora. Otro ejemplo considerados como back-end.
consiste en considerar al Shell como front-end que sirve
como interfaz para interactuar con el núcleo del sistema En diseño de circuitos integrados de radiofrecuencia el
operativo que cumple el rol back-end. front-end hace referencia a los bloques de la cadena de
recepción que se encargan de ltrar, ampli car y trasla-
En un compilador el front-end traslada el lenguaje del có- dar la señal de RF a banda base. Generalmente los blo-
digo fuente a una representación intermedia que a su vez ques comprendidos son balun, ampli cador de bajo ruido
funciona con el back-end para producir en la salida el có- (LNA), ltros y mezcladores de señal. Por otro lado, ac-
digo. tualmente las tecnologías de radio de nida por software
En sintetizadores del habla, el front-end se re ere a la par- (SDR) y radio cognitiva (CR), entre otras, implementan
te del sistema que convierte la entrada del texto en una re- front-ends que no necesariamente integran todos los blo-
1∧4
81.4. REFERENCIAS 1∧∧
81.4 Referencias
[1] [Link]
21∧444
[2] [Link]
Capítulo 82
Fuga de memoria
Una fuga de memoria (más conocido por el término tos terminan su vida. A diferencia de la recolección de
inglés memory leak) es un error de software que ocurre basura, RAII tiene las ventajas de: saber cuándo los ob-
cuando un bloque de memoria reservada no es liberada en jetos existen y saber cuándo no. Se puede comparar los
un programa de computación. Comúnmente ocurre por- siguientes ejemplos en C y C++:
que se pierden todas las referencias a esa área de memoria
/* Versión en C */ #include <stdlib.h> void f(int
antes de haberse liberado.
n) { int* array = calloc(n, sizeof(int)); reali-
Dependiendo de la cantidad de memoria perdida y el zar_otras_operaciones(); free(array); }
tiempo que el programa siga en ejecución, este proble- // Versión en C++. #include <vector> void f(int n) {
ma puede llevar al agotamiento de la memoria disponible std::vector<int> array (n); realizar_otras_operaciones();
en la computadora. }
Este problema se da principalmente en aquellos lenguajes
de programación en los que el manejo de memoria es La versión en C requiere que el desarrollador haga la li-
manual (C o C++ principalmente), y por lo tanto es el beración de memoria, a diferencia de la versión en C++.
programador el que debe saber en qué momento exac- Esto evita la sobrecarga de los esquemas de la recolección
to puede liberar la memoria. Otros lenguajes utilizan un de basura, e incluso puede ser aplicado a otros recursos
recolector de basura o conteo de referencias que automá- como:
ticamente efectúa esta liberación. Sin embargo todavía es
posible la existencia de fugas en estos lenguajes si el pro- •“Handles”a archivos, que la recolección de basura
grama acumula referencias a objetos, impidiendo así que “mark-and-sweep”no maneja tan efectivamente
el recolector llegue a considerarlos en desuso. • Ventanas que han de ser cerradas
Existen varias formas de luchar contra este problema.
• Iconos en el área de noti cación que han de ser ocul-
Una forma es el uso de un recolector de basura incluso
tados
en el caso en el que éste no sea parte estándar del lengua-
je. El más conocido recolector de basura usado de esta • Código de sincronización como monitores, seccio-
manera es el Boehm-Demers-Weiser conservative garba- nes críticas, etc. que deben ser liberados para per-
ge collector. Otras técnicas utilizadas son la adopción de mitir que otros hilos de ejecución(“threads”) los
esquemas de conteo de referencias o el uso de pools de obtengan
memoria (técnica menos popular, utilizada en el servidor
•“Handles”al registro de Windows que están abiertos
Apache y en el sistema de versiones Subversion).
También hay herramientas para“auscultar”un programa • Conexiones de red
y detectar las fugas. Una de las herramientas más cono- • Objetos GDI de Windows
cidas es Valgrind.
• Acciones a realizar cuando se termina una función
(o bloque de código) en cualquier punto posible (la
acción la realiza el destructor de un objeto creado
82.1 RAII cuando empieza la función)
1∧∨
82.3. VÉASE TAMBIÉN 1∧∩
• Conteo de referencias
• Recolector de basura
Capítulo 83
Generación de código
1∧∪
Capítulo 84
Estos cuatro valores deben ser números enteros no nega- Por ejemplo, tomando como valores m = 25 = 32 ,
tivos y que cumplan la siguiente condición: x0 , a, c < m a = 5 , x0 = 1 y c = 3 se obtiene la siguiente secuencia
. de números, que tiene longitud máxima:
La mayor parte de los generadores de números aleatorios 1−∪-11-2∨-∧-2∪-1∧-14-9-1∨-19-2-13-4-23-22-1∩-24-
son, en realidad, pseudoaleatorios; se calcula (o introduce 2∩-10-21-12-31-30-2∧-0-3-1∪-29-20-∩-∨-1
1∧9
1∨0 CAPÍTULO 84. GENERADOR DE NÚMEROS ALEATORIOS
84.2 Bibliografía
• Alberto, Marva; Schwer, Ingrid; Cámara, Vivia-
na; Fumero, Yanina (200∧). Matemática Discre-
ta. Universidad Nac. del Litoral. p. 29∧. ISBN
9∩∪9∪∩∧0∪431∧.
Gledplay
GledPlay es un SDK para desarrollar juegos para cepto de Sprite. Las características principales de Gled-
dispositivos móviles. Los juegos construidos con Gled- Draw son:
Play corren sobre PC de escritorio con Microsoft Win-
dows, PocketPC and Smartphones. • copiado rápido de super cies, con transparencia
GledPlay contiene 4 módulos de desarrollo: alpha blending o color clave.
• Clipping opcional
85.1 Dispositivos Soportados • Utilización de Shaders del sistema o personalizados,
para personalizar los efectos del copiado de super -
'GledPlay está construido para: cies.
• Microsoft Windows para computadores personales • Traducción de Surface desde o hacia un HDC, para
de escritorio. permitir el uso de la librería estandard de windows
GDI sobre las super cies.
• Pocket PC
• Puntos, líneas, y rectángulos, con manejo de trans-
• Smartphones parencia.
GledPlay fomenta el desarrollo sobre PC de escritorio, • Clase panel, para utilizar coordenadas relativas en
sin utilizar emuladores o dispositivos móviles reales. Una los métodos de dibujo, y facilitar la modularización.
vez nalizado el desarrollo con GledPlay para compu- • Fullscreen en PC. (Los modos soportados son:
tadores de escritorio, la aplicación se compila para las 320X240, ∨40X4∪0, ∪00X∨00, 1024X∩∨∪)
plataformas deseadas utilizando el mismo código. De es-
ta manera se reduce el tiempo de desarrollo. • Zoom X2 opcional en desktop PC para facilitar la
detección de errores.
1∨1
1∨2 CAPÍTULO 85. GLEDPLAY
85.3 GledVideo
Las principales funcionalidades de GledVideo son:
85.4 GledSave
GledSave provee un API común para acceder a diferen-
tes sistemas de archivo, basado en Jakarta's Common Vir-
tual File System. Es una interfaz simple que permite acce-
der a diferentes sistemas de la misma manera. Funciona
para:
• Pocket PC
• Smartphones
• Archivos ZIP
85.5 GledApplication
GledApplication maneja los detalles especí cos de la
programación que no están relacionadas con la lógica del
juego como la inicialización de threads, el manejo de
eventos, el ciclo del juego, los estados del juego, etc.
GPGPU
GPGPU o General-Purpose Computing on Grap- que generalmente no se puede leer y escribir en la misma
hics Processing Units es un concepto reciente dentro de textura, si esta operación es imprescindible para el desa-
informática que trata de estudiar y aprovechar las capa- rrollo del algoritmo, éste se debe dividir en varias pasa-
cidades de cómputo de una GPU. das.
Una GPU es un procesador diseñado para los cómputos Pese a que cualquier algoritmo que sea implementable en
implicados en la generación de grá cos 3D interactivos. una CPU lo es también en una GPU, esas implementacio-
Algunas de sus características (bajo precio en relación nes no serán igual de e cientes en las dos arquitecturas.
a su potencia de cálculo, gran paralelismo, optimización En concreto, los algoritmos con un alto grado de para-
para cálculos en coma otante), se consideran atracti- lelismo, sin necesidad de estructuras de datos complejas
vas para su uso en aplicaciones fuera de los grá cos por y con una alta intensidad aritmética son los que mayores
computadora, especialmente en el ámbito cientí co y de bene cios obtienen de su implementación en la GPU.
simulación. Así, se han desarrollado técnicas para la im-
plementación de simulaciones de uidos, bases de datos,
algoritmos de clustering, etc.
Debido a las diferencias fundamentales entre las arqui- Tradicionalmente, el desarrollo de software GPGPU se
tecturas de la GPU y la CPU, no cualquier problema se
había hecho bien en lenguaje ensamblador, o bien en al-
puede bene ciar de una implementación en la GPU. En guno de los lenguajes especí cos para aplicaciones grá-
concreto, el acceso a memoria plantea las mayores di - cas usando la GPU, como GLSL, Cg o HLSL. Pero
cultades. Las CPU están diseñadas para el acceso aleato- recientemente han surgido herramientas para facilitar el
rio a memoria. Esto favorece la creación de estructuras desarrollo de aplicaciones GPGPU, al abstraer muchos de
de datos complejas, con punteros a posiciones arbitra- los detalles relacionados con los grá cos, y presentar una
rias en memoria. En cambio, en una GPU, el acceso a interfaz de más alto nivel. Una de ellas es BrookGPU,
memoria está mucho más restringido. Por ejemplo, en un desarrollada en la Universidad de Stanford, consistente
procesador de vértices (la parte de una GPU diseñada pa- en una extensión a ANSI C que proporciona nuevos tipos
ra transformar vértice en aplicaciones 3D), se favorece el de datos y operaciones (“stream”, “kernel”, “re-
modelo scatter, en el que el programa lee en una posición duction”, etc.) automáticamente convertidos a una im-
predeterminada de la memoria, pero escribe en una o va- plementación que aprovecha la GPU sin intervención ex-
rias posiciones arbitrarias. En cambio, un procesador de plícita por parte del programador. Otra herramienta con
píxeles, o fragmentos, favorece el modelo gather, pudien- objetivos similares es Sh, una extensión de C++ para
do el programa leer de varias posiciones arbitrarias, pero metaprogramación con una implementación automática
escribir en sólo una posición predeterminada. en la GPU. La opción más extendida en la actualidad es
La tarea del diseñador de algoritmos GPGPU consiste CUDA, de NVidia, una extensión de C que permite la co-
principalmente en adaptar los accesos a memoria y las di cación de algoritmos en GPU de NVidia. Por último,
estructuras de datos a las características de la GPU. Ge- podemos incluir en esta discusión a OpenCL, una com-
neralmente, la forma de almacenar datos es en un bu er binación de interfaz y lenguaje de programación para el
2D, en lugar de lo que normalmente sería una textura. El desarrollo de aplicaciones paralelas que puedan ser eje-
acceso a esas estructuras de datos es el equivalente a una cutadas, de forma transparente, en diversas unidades de
lectura o escritura de una posición en la textura. Puesto procesamiento (CPU multinúcleo, GPU, etc.).
1∨3
1∨4 CAPÍTULO 86. GPGPU
86.4 Otros
Microsoft ha terminado de desarrollar la nueva versión 11
de su API Direct3D. A pesar de que la anterior versión,
Direct3D 10, es relativamente nueva, debido a la canti-
dad de novedades que están apareciendo últimamente en
el mundo de las tarjetas grá cas, entre ellas el teselado,
Microsoft desarrolló esta nueva versión, en la que cabe
destacar la nueva tecnología de computación de “sha-
ders”para permitir que la GPU no sea solamente usada
para grá cos 3D y así puedan los desarrolladores tomar
ventaja de las tarjetas grá cas como procesadores en pa-
ralelo.
El proyecto de computación distribuida Folding@home,
creado por la Universidad de Stanford, ha dado soporte
para utilizar la potencia computacional de la GPU, ade-
más de la CPU. Pruebas recientes hablan de que son posi-
bles ganancias de rendimiento de hasta 40 veces una CPU
Intel Pentium 4, aunque claro, todo esto depende de la
GPU utilizada.
• CUDA
• Close to Metal
• Larrabee (GPU)
• OpenCL
• Intel MIC
Hackathon
Un hackathon o hackatón, es un término usado en las [2] Caldeiro, Graciela; Merpert, Ariel y Odetti, Valeria.
comunidades hacker para referirse a un encuentro de Nuestro primer Hackaton (2013). PENT, Flacso Argenti-
programadores cuyo objetivo es el desarrollo colaborati- na, Disponible en: [Link]
vo de software, aunque en ocasiones puede haber también nuestro-primer-hackaton
un componente de hardware. Estos eventos pueden durar
entre dos días y una semana. El objetivo es doble: por un
lado hacer aportes al proyecto de software libre que se 87.2 Enlaces externos
desee y, por otro, aprender sin prisas.* [1]
El término integra los conceptos de maratón y hacker, • CyberCamp Hackathon organizado por el INCIBE
aludiendo a un experiencia colectiva que persigue la me-
• Hackathon en la Universidad de Granada
ta común de desarrollar aplicaciones de forma colabora-
tiva en un lapso corto. Se cree que el término fue creado • HackathonExpress en la Ciudad de Corrientes
en 1999 de forma independiente por los desarrolladores
de OpenBSD y el equipo de marketing de Sun Microsys- • El Club de Emprendedores de la CEU-UAO orga-
tems. niza el maratón “BCN Thinking Challenge”
Algunos hackatons tienen propósitos educativos o socia-
les, aunque en muchos casos el objetivo es crear un soft-
ware utilizable. Los Hackatons tienden a tener un enfoque
especí co, que puede incluir el lenguaje de programación
utilizado, el sistema operativo, una aplicación, una API,
el destinatario o el grupo demográ co de los programa-
dores. En otros casos, no hay ninguna restricción sobre el
tipo de software que está siendo creado en el evento.
El hackatón, desde el punto de vista organizativo, supone
una dinámica horizontal e intensiva en donde los parti-
cipantes complementan experiencias y habilidades indi-
viduales con el propósito de desarrollar soluciones con-
cretas. De allí que para los especialistas en educación, el
hackatón posea ciertas características propias de un dis-
positivo pedagógico en tanto promueve el trabajo cola-
borativo entre pares orientado a la resolución de proble-
mas, hace foco sobre el proceso de trabajo como instan-
cia de aprendizaje y favorece la motivación intrínseca de
los participantes. En 201∧, en el campeonato de hackat-
hon internacional en Barcelona, Pablo Pardo Alcócer, el
representante de Bolivia, ganó el primer puesto.* [2]
87.1 Referencias
1∨∧
Capítulo 88
Hacker
El término hacker tiene diferentes signi cados. Según el depuran y arreglan errores en los sistemas (“White
diccionario de los hackers,* [1] es todo individuo que se hats”) y a los de moral ambigua como son los“Grey
dedica a programar de forma entusiasta, o sea un exper- hats”.
to entusiasta de cualquier tipo, que considera que poner
la información al alcance de todos constituye un extraor-
• Una comunidad de entusiastas programadores y
dinario bien.* [2] De acuerdo a Eric Raymond el motivo
diseñadores de sistemas originada en los sesen-
principal que tienen estas personas para crear software en
ta alrededor del Instituto Tecnológico de Mas-
su tiempo libre, y después distribuirlos de manera gratui-
sachusetts (MIT), el Tech Model Railroad Club
ta, es el de ser reconocidos por sus iguales.* [3]El término
(TMRC) y el Laboratorio de Inteligencia Arti -
hacker nace en la segunda mitad del siglo XX y su origen
cial del MIT.* [∧]Esta comunidad se caracteriza
está ligado con los clubes y laboratorios del MIT.
por el lanzamiento del movimiento de software li-
bre.«How To Become A Hacker».El [[Request for
• En seguridad informática este término concierne • De nición 1: Término para designar a alguien con
principalmente a entradas remotas no autorizadas talento, conocimiento, inteligencia e ingenio, es-
por medio de redes de comunicación como Internet pecialmente relacionadas con las operaciones de
( Black hats”). Pero también incluye a aquellos que
“ computadora, redes, seguridad, etc.
1∨∨
88.2. HISTORIA 1∨∩
• De nición 2: Persona que disfruta aprendiendo de- Los hackers de MIT crearon su propio sistema operativo,
talles de los sistemas de programación y cómo ex- el ITS que usaba el lenguaje LISP.* [10]
tender sus capacidades, tan intensamente como, al
contrario, muchos usuarios pre eren aprender sólo
el mínimo necesario. 88.2.2 UNIX
88.4 Controversia
En la actualidad se usa de forma corriente para referir-
se mayormente a los criminales informáticos, debido a su
utilización masiva por parte de los medios de comunica-
ción desde la década de 19∪0.* [21] Según Helen Nissen-
baum que los hackers sean mal vistos ayuda al gobierno
y a los poderes privados con dos cosas: 1) a de nir lo que
es normal en el mundo computacional haciendo creer que
Steven Levy, autor de Hackers: heroes of the computer revolution un buen ciudadano es todo lo que el hacker no es; 2) a jus-
ti car la seguridad, la vigilancia y el castigo.* [22]
En 19∪4, Steven Levy publica el libro Hackers: heroes of
A los criminales se le pueden sumar los llamados "script
the computer revolution en el cual se ve por primera oca-
kiddies", gente que invade computadoras, usando progra-
sión la idea de la ética hacker, donde se mani esta una
mas escritos por otros, y que tiene muy poco conocimien-
ética de libre acceso a la información y código fuente del
to sobre cómo funcionan. Este uso parcialmente incorrec-
software. Levy se basó en entrevistas para poder identi -
to se ha vuelto tan predominante que, en general, un gran
car seis principios básicos relacionados con las creencias
segmento de la población no es consciente de que existen
y operaciones de hackers para hacer ésta ética.* [1∨] De
diferentes signi cados.
acuerdo a Levy los seis fundamentos del hacker son:
Mientras que los hackers a cionados reconocen los tres
1. El acceso a los computadores debe ser ilimitado y tipos de hackers y los hackers de la seguridad informá-
total. tica aceptan todos los usos del término, los hackers del
software libre consideran la referencia a intrusión infor-
2. Toda información debería ser libre mática como un uso incorrecto de la palabra, y se re-
eren a los que rompen los sistemas de seguridad como
3. Es necesario promover la descentralización y des- "crackers" (analogía de “safecracker”, que en español
con ar de las autoridades se traduce como “un ladrón de cajas fuertes”).
4. Los hackers deberían ser juzgados por su labor y no
por cosas como su raza, edad o posición social
88.4.1 Ambigüedad y debate
∧. Se puede crear arte y belleza en un computador
Los términos hacker y hack pueden tener connotaciones
∨. Las computadoras pueden cambiar tu vida para me- positivas y negativas. Los programadores informáticos
jor* [1∩][[Link]] suelen usar las palabras hacking y hacker para expresar
admiración por el trabajo de un desarrollador cuali cado
Sin embargo, la ética hacker genera controversia y hay de soporte lógico, pero también se puede utilizar en un
personas, como el estudiante de derecho Patrick S. Ryan sentido negativo (delincuentes informáticos) para descri-
que critican que la [[ética hacker]] y consideran que“hay bir una solución rápida pero poco elegante a un problema.
88.6. TERMINOLOGÍA 1∨9
Algunos* [¿quién?] desaprueban el uso del hacking como clasi cada que se considera debe estar, por de nición, a
un sinónimo de cracker, en marcado contraste con el resto disposición de la sociedad (casos de WikiLeaks o las l-
del mundo,* [¿dónde?] en el que la palabra hacker se uti- traciones de Snowden sobre las actividades militares y
liza normalmente para describir a alguien que se in ltra casos de espionaje gubernamentales).
en un sistema informático con el n de eludir o desactivar Por tanto, el fenómeno hacker tiene un importante com-
las medidas de seguridad.* [23] ponente de aperturismo y liberación de conocimientos e
En un principio se utilizaba “hack”como verbo para información que, a través del activismo de estos especia-
expresar “perder el tiempo”(e.j. “Puedo hackear con listas, bene cian a la sociedad en general.
el computador”), el signi cado del término ha cambiado En este caso, los roles de un hacker pueden entenderse en
a lo largo de décadas desde que empezó a utilizarse en un cuatro aspectos:
contexto informático. Como su uso se ha extendido más
ampliamente, el signi cado primario de la palabra, por
parte de los nuevos usuarios, ha pasado a uno que entra • Apoyar procesos de apropiación social o comunita-
en con icto con el énfasis original. ria de las tecnologías.
88.6 Terminología
En sentido amplio el término Hacker o Hacking se puede asociar
a movimientos sociales que promueven cambios en los modos de
88.6.1 OverHat
vida.
Un término acuñado a mediados del año 2014 por
Desde el año 2002-2003, se ha ido con gurando una pers- un Hacker de la comunidad Underground llamado
pectiva más amplia del hacker, pero con una orienta- T4r4t3uX* [24], quien de nió como “sobre el sombre-
ción a su integración al hacktivismo en tanto movimien- ro”a todos los profesionales vinculados con las artes Hac-
to. Aparecen espacios autónomos denominados hacklab king. En un corto escrito, explica como a través del tiem-
o hackerspace y los hackmeeting como instancias de diá- po deben comprender y aprender todas las formas exis-
logo de hackers. Desde esta perspectiva, se entiende al tentes de“Hackeo”. Lo cual causa una doble moral, por
hacker como una persona que es parte de una conciencia un lado existe la ética a la cual han sido eles y por ello
colectiva que promueve la libertad del conocimiento y la prestan servicios profesionales a miles de empresas en el
justicia social. mundo asegurando su infraestructura; por otro, conocer
y usar métodos propios de los BlackHat que incluyen ata-
Se entiende, por tanto, el Hacktivismo como el empleo de ques de denegación de servicio e ingeniería social agresi-
las destrezas técnicas más diversas, en pro de nes socia- va entre otros. Según el escrito, están por encima del bien
les, ecológicos, humanitarios o de cualquier otra índole y del mal electrónico, lo cual concluye que solo una am-
con repercusión o tendente a la defensa de los derechos plia capacidad moral autodeterminada por ellos mismos
humanos. los convierte en profesionales con la capacidad de deter-
Así, el Hacktivismo debe ser entendido no desde un pris- minar adecuadamente y con las regulaciones de la actual
ma reduccionista como equivalente siempre al desarrollo sociedad.
de actividades subversivas. Encontramos rami caciones
del hacktivismo en la liberación de conocimiento (como
puede ser la misma Wikipedia, en la que los conocimien- 88.6.2 White hat y black hat
tos informáticos y técnicos de sus creadores dieron lugar
a toda una revolución en el modo de crear y compartir- Un hacker de sombrero blanco (del inglés, white hat),
se el conocimiento humano más allá de barreras acadé- en jerga informática, se re ere a una ética hacker que se
micas o comerciales); O en la liberación de información centra en asegurar y proteger los sistemas de tecnologías
1∩0 CAPÍTULO 88. HACKER
Heisenbug
89.1 Referencias
[1] «The Jargon File: heisenbug».
[2] «The Jargon File: Mandelbug». [Link]. Consultado el ∧
de septiembre de 2013.
[3] Raymond, Eric S.; The New Hacker's Dictionary, 3rd edi-
tion, 199∨
[4] Clarke, Arthur C., The Ghost from the Grand Banks, Ban-
tam Books, 1990
[∧] «The Jargon File: Schroedinbug». [Link]. Consultado el
∧ de septiembre de 2013.
[∨] Raymond, Eric S.; The New Hacker's Dictionary, 3rd edi-
tion, 199∨
[∩] The following article investigates the various de nitions
of bohrbug, mandelbug and heisenbug proposed in the li-
terature, as well as the statements made about the rela-
tionships between these fault types: Grottke, Michael; and
Trivedi, Kishor S.; Software Faults, Software Aging and
Software Rejuvenation, Journal of the Reliability Enginee-
ring Association of Japan, Vol. 2∩, No. ∩, pp. 42∧-43∪,
200∧.
[∪] Grottke, Michael; and Trivedi, Kishor S.; Fighting Bugs:
Remove, Retry, Replicate, and Rejuvenate, IEEE Computer
vol. 40, no. 2 (February 200∩), pp. 10∩-109
[9] A February 2012 Google Books search returns about ∩0
hits for “schroedinbug”, 100 for “mandelbug”, 400
for “bohrbug”or “heisenbug”.
1∩2
Capítulo 90
Hoja de estilo
Las hojas de estilo (style sheets) son conjuntos de ins- • Hojas de estilo para la Web: Trucos y sugerencias
trucciones, a veces en forma de archivo anexo, que se aso- para CSS (Este documento es una traducción del tu-
cian a los archivos de texto y se ocupan de los aspectos de torial “CSS tips & tricks”propiedad de Bert Bos
formato y de presentación de los contenidos: tipo, fuen- publicado en el sitio de W3C.)
te y tamaño de letras, alineación y posicionamiento del
texto, colores y fondos, etc. Las hojas de estilo permiten
liberar la composición del texto de los aspectos visuales 90.3 Referencias
y favorecen que se estructure y anote mediante códigos
que permiten un tratamiento más e caz de los contenidos.
El uso adecuado de las hojas de estilo es uno de los as-
pectos clave de la edición digital. Las hojas de estilo son
una herramienta de gran utilidad de los programas de
tratamiento de textos, como OpenO [Link] o Microsoft
Word. Asimismo, constituyen una parte esencial de los
lenguajes de marcas para edición digital: LaTeX, XML
y XHTML. Dos lenguajes de hojas de estilo son CSS y
XSL.
1∩3
Capítulo 91
Hola mundo
1∩4
Capítulo 92
Homebrew
1∩∧
1∩∨ CAPÍTULO 92. HOMEBREW
pre y cuando se respeten sus derechos y se les acredite integrados para el usuario se utilizan dentro de los car-
como autores del mismo. Muchas veces podemos mandar tuchos de NES para ampliar las capacidades del sistema,
un mensaje de felicitación si nos ha gustado su trabajo o la mayoría son difíciles de replicar, excepto al eliminar
ponernos en contacto con el autor o los autores o con sus cartuchos usados. El mecanismo de bloqueo de hardware
representantes para nes particulares o comerciales. Mu- de la NES complica aún más la construcción de cartuchos
chas empresas privadas han comercializado legalmente el físicos utilizables. Sin embargo, la NES-101 elimina el
software creado en un principio como homebrew. chip de cierre 10NES para cualquier juego, ya sea home-
La palabra «homebrew» tiene relación con el Homebrew brew, sin licencia, o de otra región de un partido o cial,
se reproduce. El chip 10NES nalmente se puede desac-
Computer Club, aunque se desconoce si fue éste el ori-
gen. En Japón estos juegos son llamados Dojin Soft, que tivar de forma permanente mediante la realización de un
pequeño cambio en el hardware.
es la manera de decir que este software no es ilegal, en
principio, aunque depende del uso que se haga de él. Sue-
le cuestionarse la legalidad del homebrew; sin embargo,
su uso está muy extendido entre los usuarios avanzados. 92.2.3 Super Nintendo Entertainment
Además, su uso, excluyendo las copias de seguridad no System (SNES)
propietarias, es completamente legal.
Después de la interrupción de los juegos en 199∪, y la
producción en 1999, los fans de la Super Nintendo En-
92.2 Homebrew en diferentes con- tertainment System hicieron imágenes ROM homebrew,
incluso sin el apoyo de Nintendo para la consola. Des-
solas pués del lanzamiento de la SNES había un gran interés
en la ingeniería inversa del sistema para permitir jugar
92.2.1 Sega Dreamcast homebrew y copias de seguridad. Nintendo equipado la
máquina con varias medidas de seguridad, tales como el
La Sega Dreamcast (DC) es, en muchos aspectos, una de chip de bloqueo para evitar que código no autorizado que
las pioneras en incorporar homebrew. Para lograr correr se ejecuta en la máquina. Finalmente, la comunidad ho-
este tipo de software era necesario utilizar una puerta tra- mebrew descubierto cómo los juegos corrían en el hard-
sera que permitía iniciar la consola desde discos compac- ware SNES y fueron capaces de eludir sus mecanismos de
tos convencionales (la DC utilizaba un formato especial seguridad. Empresas como TAPÓN plugins hardware li-
llamado GD-ROM). berados como la serie SF doctor Game. Los usuarios que
pueden no solo los juegos de copia, sino también para eje-
• Aplicaciones: Reproductores de MP3 y de video, cutar juegos caseros elaborados en el hardware de SNES.
visores de Flash, y versiones de Linux entre otras. ROMs Homebrew se podrían convertir en el formato SF
Médico juego y poner en un 3 1/2 “disquete. Juegos tan
grandes como 12 Mbits (1.∧ megabytes) podrían poner-
• Emuladores: Con el tiempo, la consola ha llegado se en disquetes formateados de 1.∨ megabytes. Un dis-
a ejecutar emuladores de SNES, Genesis, NES, Neo positivo alternativo fue el Super Flash, por Tototek, que
Geo y Neo Geo CD, entre otros. permitía múltiples juegos para quemarla en un chip de
memoria ash de cartucho (que permite hasta 4∪Mbits).
• Juegos: Se han realizado ports del clásico Doom y Este chip es el rom máscara para el cartucho ash Súper
de la primera y segunda versión de Quake entre otras desarrollo. El dispositivo es fácil de usar y tiene una in-
adaptaciones. Además, se ha desarrollado un sinnú- terfaz de usuario en el extremo del ordenador. Conectar
mero de juegos freeware y de código abierto, des- el cartucho de Super Flash y cargar los juegos que quieras
tacándose los clones de Tetris y de juegos de naves simplemente. Esto permitió a los usuarios hacer un jue-
(shoot'em ups). go de SNES y juegan en un cartucho real en lugar de un
disquete. La legalidad de homebew SNES lanzamientos
de juegos no ha sido probado en los tribunales, y es dis-
92.2.2 Nintendo Entertainment System cutible si o no pasar por sus medidas de seguridad caería
(NES) en con icto con las leyes modernas de ingeniería inver-
sa. Presumiblemente juegos caseros se pueden producir
Varios compiladores están disponibles para la Nintendo legalmente los SNES, siempre y cuando se incluye nin-
Entertainment System, pero como el Atari 2∨00, la mayo- gún material con derechos de autor. Anteriormente, en la
ría del desarrollo se aplica directamente en lenguaje en- década de 1990, Nintendo demandó Color Dreams para
samblador. Un impedimento para la NES desarrollo ho- producir juegos de NES sin licencia o cial. El resultado
mebrew es la relativa di cultad involucrada con la pro- fue un acuerdo no revelado, pero los sueños de color si-
ducción de cartuchos físicos, aunque cartuchos ash de guió produciendo juegos sin licencia. La fuerza del color
terceros existen, haciendo posible homebrew en el hard- de la posición de los sueños se encuentra con que traba-
ware original de NES. Muchas variedades de circuitos jaron todo el código de chip de cierre 10NES en lugar de
92.2. HOMEBREW EN DIFERENTES CONSOLAS 1∩∩
92.2.8 Nintendo Wii multiarcade Final Burn Arcade y del emulador mul-
tisistema Mednafen.
La Wii permite la incorporación de homebrew mediante
la explotación de diversos fallos, de acuerdo a la versión • Juegos: Existen ports del videojuego Doom, además
del software o cial que se posea.* [4] La ejecución de las de versiones de reconocidos juegos como Tetris, en-
diversas aplicaciones se realiza por medio del Homebrew tre otros.
Channel, programa que se puede instalar y ejecutar desde
el menú principal de la consola.* [∧]
92.3 Véase también
• Aplicaciones: Reproductores de MP3 y de vídeo
(desde SD, USB o DVD), editores de texto o uti-
• Homebrew Computer Club
lidades que utilizan las características especiales del
mando wii (tales como un módulo que permite dibu- • Sega Dreamcast
jar en la pantalla utilizando el mando como pincel.
• PlayStation Portable
• Emuladores: Existen emuladores de consolas co- • Anexo:Modchips para Wii
mo NES, SNES, Sega Genesis, Sega Master Sys-
tem, MSX, Game Boy Color, Game Boy Advance,
MAME, Neo Geo Pocket, Nintendo ∨4, PC Engi-
ne, PSX, SCUMM, ZX Spectrum, Chip-∪, Amstrad
92.4 Referencias
CPC, Atari 2∨00 y Neo Geo.
[1] «The Complete Guide to Whats Needed for Homebrew
on Each Console.» (en inglés). DC Emu UK. Archivado
• Juegos: Entre los juegos, nos encontramos desde desde el original el 2∪ de noviembre de 201∧. Consultado
clásicos como Pong, Asteroides o Tetris hasta otros el 12 de enero de 2011.
más modernos como Quake. Destacar el GuitarFun,
versión del Guitar Hero realizada por un español. [2] «Homebrew de NDS». El Otro Lado. 3 de abril de 2010.
Consultado el 12 de enero de 2011.
• Copias de seguridad: Además el Homebrew se [3] «Homebrew Xbox 3∨0». El Otro Lado. 30 de diciembre
puede utilizar para que la consola cargue copias de 2010. Consultado el 12 de enero de 2011.
de seguridad, sistema popularmente conocido co-
[4] «Cargar Homebrew en Wii». El Otro Lado. 1∪ de diciem-
mo piratear sin chip. O incluso instalar juegos de la bre de 2010. Consultado el 12 de enero de 2011.
Consola Virtual y WiiWare.
[∧] «Homebrew Channel». El Otro Lado. 9 de enero de 2011.
Consultado el 12 de enero de 2011.
92.2.9 PlayStation 3
[∨] «PS3 Jailbreak: un pendrive para hackear la PlayStation
3». Red Users. 21 de agosto de 2010. Consultado el 2∧ de
PlayStation 3 puede ser utilizada para homebrew median-
octubre de 2010.
te la utilización del dispositivo PS Jailbreak o sus deriva-
dos clónicos o de código abierto, únicamente con el rm- [∩] «PlayStation 3 ha sido hackeada». Meristation. 20 de
ware 3.41 o anteriores.* [∨]* [∩] Adicionalmente, es posi- agosto de 2010. Consultado el 2∧ de octubre de 2010.
ble realizar un downgrade desde las versiones 3.42 y 3.∧0.
[∪] «Hackers se hacen con las claves de seguridad secretas de
En este caso, se estaría ejecutando software no rmado.
PlayStation 3». Meristation. 3 de enero de 2011. Consul-
También es posible instalar y ejecutar homebrew hasta tado el ∨ de enero de 2011.
la versión de rmware 3.∧∧, a partir del descubrimiento
de las claves privadas de la consola que el hacker George
Hotz sacó a la luz con su rmware personalizado. versión
3.∧∧ GeoHot* [∪] En este caso, se estaría ejecutando soft-
ware rmado.
ICONIX
• Diagramas de secuencia
93.1 Ventajas de Iconix
• Proceso ágil para obtener un sistema informático. 93.2.4 Fase 4: Implementación
• Dedicada a la construcción de sistemas de gestión de Dentro de esta fase se realiza la siguiente tarea:
pequeña y mediana complejidad con la participación
de los usuarios nales. • Escribir y generar código
1∩9
1∪0 CAPÍTULO 93. ICONIX
• URDAD, the Use Case Driven Analysis and Design 93.7 Conceptos Relacionados
methodology is a methodology for technology neu-
tral design. • Dynamic Systems Development Method (DSDM)
• RATF, using Robustness Analysis in combination • Extreme Programming
with Technology Forecasting, to further investigate
future software evolution alternatives. • Rational Uni ed Process
• Metodología ICONIX
Dentro de esta fase se realizan las siguientes tareas:
• Uso de la metodología ICONIX
• Descripción de los casos de uso
• Diagramas de robustez
• Diagramas de secuencia
93.6 Referencias
• 1. Rosenberg, Doug; Stephens, Matt (200∩). Use Ca-
se Driven Object Modeling with UML: Theory and
Practice. Apress. ISBN 1∧90∧9∩∩4∧.
Anexo:Implementaciones de Smalltalk
1∪1
Capítulo 95
1∪2
95.10. PSEINT 1∪3
Inanición (informática)
1∪∧
Capítulo 97
Indirección
1∪∨
Capítulo 98
2001. En abril del año 2003 ISO rati có este estándar con
el denominación ISO/IEC 232∩1:2003 .
Para comprender mejor la inclusión de cada una de las
partes principales de la arquitectura de CLI es interesante
analizar los objetivos de diseño que se plantearon desde
su concepción. Según su especi cación, la arquitectura de
CLI debe:
1∪∩
1∪∪ CAPÍTULO 98. INFRAESTRUCTURA DE LENGUAJE COMÚN
• Metadatos.
• Especi caciones de lenguaje común, en inglés Com-
mon Language Speci cation (CLS).
• Sistema de ejecución virtual, del inglés Virtual Exe-
cution System (VES).
• ECMA
Capítulo 99
Ingeniería de software
1∪9
190 CAPÍTULO 99. INGENIERÍA DE SOFTWARE
tra la vida de estas personas.* [9] Esto remarca los riesgos ternet; esto hace que los desarrolladores tuviesen que ma-
de control por software,* [10] afectando directamente al nejar imágenes mapas y animaciones para optimizar la
nombre de la ingeniería de software. visualización/almacenamiento de imágenes (como el uso
A principios de los 19∪0, [11] la ingeniería del software de imágenes en miniatura). El uso de los navegadores y
*
ya había surgido como una genuina profesión, para estar utilización de lenguaje HTML cambia drásticamente la
al lado de las ciencias de la computación y la ingeniería visión y recepción de la información.
tradicional. Antes de esto, las tareas eran corridas ponien-Las amplias conexiones de red crea la proliferación de
do tarjetas perforadas como entrada en el lector de tarje- virus informáticos y la basura en los correos electrónicos
tas de la máquina y se esperaban los resultados devueltos (E-mail) esto pone en una carrera contra el tiempo los
por la impresora. desarrolladores para crear nuevos sistemas de bloqueo o
Debido a la necesidad de traducir frecuentemente el soft- seguridad de estas anomalías en la informática ya *que se
ware viejo para atender las necesidades de las nuevas má- volvían sumamente tediosas y difíciles de arreglar [10]
quinas, se desarrollaron lenguajes de orden superior. A Después de una fuerte y creciente demanda surge la
medida que apareció el software libre, las organizaciones necesidad de crear soluciones de software a bajo costo,
de usuarios comúnmente lo liberaban. esto conlleva al uso de metodologías más simples y
Durante mucho tiempo, solucionar la crisis del software rápidas que desarrollan software funcional. Cabe señalar
fue de suma importancia para investigadores y empresas que los sistemas más pequeños tenían un enfoque más
que se dedicaban a producir herramientas de software. simple y rápido para poder administrar el desarrollo de
cálculos y algoritmos de software.
Para la década de 19∪0, el costo de propiedad y mante-
nimiento del software fue dos veces más caro que el pro-
pio desarrollo del software, y durante la década de 1990,
el costo de propiedad y mantenimiento aumentó 30 %
con respecto a la década anterior. En 199∧, muchos de 99.2 Objetivos
los proyectos de desarrollo estaban operacionales, pero
no eran considerados exitosos. El proyecto de software La ingeniería de software aplica diferentes normas y mé-
medio sobrepasaba en un ∧0 % la estimación de tiempo todos que permiten obtener mejores resultados, en cuan-
previamente realizada, además, el ∩∧ % de todos los gran- to al desarrollo y uso del software, mediante la aplicación
des productos de software que eran entregados al cliente correcta de estos procedimientos se puede llegar a cum-
tenían fallas tan graves, que no eran usados en lo absolu- plir de manera satisfactoria con los objetivos fundamen-
to o simplemente no cumplían con los requerimientos del tales de la ingeniería de software.
cliente.* [10]
Entre los objetivos de la ingeniería de software están:
Algunos expertos argumentaron que la crisis del software
era debido a la falta de disciplina de los programadores.
• Mejorar el diseño de aplicaciones o software de tal
Cada nueva tecnología y práctica de la década de 19∩0 a
modo que se adapten de mejor manera a las nece-
la de 1990 fue pregonada como la única solución a todos
sidades de las organizaciones o nalidades para las
los problemas y el caos que llevó a la crisis del software.
cuales fueron creadas.
Lo cierto es que la búsqueda de una única clave para el
éxito nunca funcionó. El campo de la ingeniería de soft-
• Promover mayor calidad al desarrollar aplicaciones
ware parece un campo demasiado complejo y amplio pa-
complejas.
ra una única solución que sirva para mejorar la mayoría
de los problemas, y cada problema representa sólo una
pequeña porción de todos los problemas de software. • Brindar mayor exactitud en los costos de proyectos
y tiempo de desarrollo de los mismos.
El auge del uso del Internet llevó a un vertiginoso creci-
miento en la demanda de sistemas internacionales de des- • Aumentar la e ciencia de los sistemas al introducir
pliegue de información en la World Wide Web. Los desa- procesos que permitan medir mediante normas es-
rrolladores se vieron en la tarea de manejar ilustraciones, pecí cas, la calidad del software desarrollado, bus-
mapas, fotografías y animaciones, a un ritmo nunca antes cando siempre la mejor calidad posible según las ne-
visto, con casi ningún método para optimizar la visuali- cesidades y resultados que se quieren generar.
zación y almacenamiento de imágenes. También fueron
necesarios sistemas para traducir el ujo de información
• Una mejor organización de equipos de trabajo, en el
en múltiples idiomas extranjeros a lenguaje natural hu-
área de desarrollo y mantenimiento de software.
mano, con muchos sistemas de software diseñados para
uso multilenguaje, basado en traductores humanos.
• Detectar a través de pruebas, posibles mejoras pa-
La ingeniería de software contribuyo alrededor de 90,000 ra un mejor funcionamiento del software desarrolla-
millones de dólares por año ya que entra en juego el In- do.* [12]
99.5. NOTACIONES 191
Además, con la industria del lenguaje está hallando cada • Artefactos: objetos de datos, grupo, anotación.* [14]
vez más campos de aplicación a escala global.
99.5.3 Diagrama de ujo de datos (DFD)
99.4.2 Socialmente
Un diagrama de ujo de datos permite representar el mo-
La ingeniería de software cambia la cultura del mundo vimiento de datos a través de un sistema por medio de
debido al extendido uso de la computadora. El correo modelos que describen los ujos de datos, los procesos
electrónico (e-mail), la WWW y la mensajería instantá- que tranforman o cambian los datos, los destinos de da-
nea permiten a la gente interactuar de nuevas maneras. tos y los almacenamientos de datos a la cual tiene acceso
El software baja el costo y mejora la calidad de los servi-el sistema.
cios de salud, los departamentos de bomberos, las depen- Su inventor fue Larry Constantine, basado en el modelo
dencias gubernamentales y otros servicios sociales. Los de computación de Martin y Estrin: ujo grá co de datos.
192 CAPÍTULO 99. INGENIERÍA DE SOFTWARE
Con los diagramas de ujo de datos determina la manera presentan, los motivos que crean insatisfacción y aque-
en que cualquier sistema puede desarrollarse, ayuda en la llos que deben ser cubiertos a plenitud. Por ejemplo: ←El
identi cación de los datos de la transacción en el modelo contenido de los reportes generados, satisface realmente
de datos y proporciona al usuario una idea física de cómo las necesidades del usuario? ←Los tiempos de respuesta
resultarán los datos a última instancia.* [14] ofrecidos, son oportunos?, etc.
Hay que de nir las funciones que realizara el software ya
que estas ayudan al usuario nal y al funcionamiento del
99.6 Herramienta CASE mismo programa.
Se tiene que tener en cuenta como será el comportamiento
Las Herramienta CASE son herramientas computaciona- del software ante situaciones inesperadas como lo son por
les (software) que están destinadas a asistir en los proce- ejemplo una gran cantidad de usuarios usando el software
sos de ciclo de vida de un software, facilitan la producción o una gran cantidad de datos entre otros.
del software, varias se basan principalmente en la idea de
un modelo grá co.* [1∧]
Análisis de requisitos
• Tener un control más completo en la etapa creación La integración de infraestructura, desarrollo de aplicacio-
del software, en cuanto a tiempo de desarrollo y cos- nes, bases de datos y herramientas gerenciales, requieren
tos. de capacidad y liderazgo para poder ser conceptualiza-
dos y proyectados a futuro, solucionando los problemas
• Utilización de métodos más e cientes que permitan de hoy. El rol en el cual se delegan todas estas actividades
el mejor aprovechamiento del software según sea la es el del Arquitecto.
nalidad de uso del mismo. El arquitecto de software es la persona que añade valor
a los procesos de negocios gracias a su valioso aporte de
• Aumentar la calidad del software desarrollado al dis- soluciones tecnológicas.
minuir los riesgos de mal funcionamiento.* [1∪]
La arquitectura de sistemas en general, es una actividad
de planeación, ya sea a nivel de infraestructura de red y
No siempre en la etapa de “análisis de requisitos”las hardware, o de software.
distintas metodologías de desarrollo llevan asociado un
estudio de viabilidad y/o estimación de costes. El más co- Lo principal en este punto es poner en claro los aspectos
nocido de los modelos de estimación de coste del software lógicos y físicos de las salidas, modelos de organización y
es el modelo COCOMO representación de datos, entradas y procesos que compo-
nen el sistema, considerando las bondades y limitaciones
de los recursos disponibles en la satisfacción de las paci-
Limitaciones* [14] caciones brindadas para el análisis.
Hay que tener en consideración la arquitectura del siste-
Los software tienen la capacidad de emular inteligencia ma en la cual se va a trabajar, elaborar un plan de trabajo
creando un modelo de ciertas características de la inte- viendo la prioridad de tiempo y recursos disponibles. En
ligencia humana pero sólo posee funciones prede nidas los diseños de salidas entra los que es la interpretación de
que abarcan un conjunto de soluciones que en algunos requerimientos lo cual es el dominio de información del
campos llega a ser limitado. Aun cuando tiene la capa- problema, las funciones visibles para el usuario, el com-
cidad de imitar ciertos comportamientos humanos no es portamiento del sistema y un conjunto de clases de re-
capaz de emular el pensamiento humano porque actúa ba- querimientos que agrupa los objetos del negocio con los
jo condiciones. métodos que les dan servicio.
Otro aspecto limitante de los software proviene del pro- La arquitectura de software consiste en el diseño de com-
ceso totalmente mecánico que requiere de un mayor es- ponentes de una aplicación (entidades del negocio), ge-
fuerzo y tiempos elevados de ejecución lo que lleva a tener neralmente utilizando patrones de arquitectura. El dise-
que implementar el software en una máquina de mayor ño arquitectónico debe permitir visualizar la interacción
capacidad. entre las entidades del negocio y además poder ser vali-
dado, por ejemplo por medio de diagramas de secuencia.
Un diseño arquitectónico describe en general el cómo se
Especi cación construirá una aplicación de software. Para ello se docu-
menta utilizando diagramas, por ejemplo:
La especi cación de requisitos describe el comporta-
miento esperado en el software una vez desarrollado. • Diagramas de clases
Gran parte del éxito de un proyecto de software radicará
en la identi cación de las necesidades del negocio (de - • Diagramas de base de datos
nidas por la alta dirección), así como la interacción con • Diagrama de despliegue
los usuarios funcionales para la recolección, clasi cación,
identi cación, priorización y especi cación de los requi- • Diagrama de secuencia
sitos del software.
Siendo los dos primeros los mínimos necesarios para des-
Entre las técnicas utilizadas para la especi cación de re-
cribir la arquitectura de un proyecto que iniciará a ser
quisitos se encuentran:
codi cado. Dependiendo del alcance del proyecto, com-
plejidad y necesidades, el arquitecto elegirá cuales de los
• Caso de uso diagramas se requiere elaborar.
Las herramientas para el diseño y modelado de software
• Historias de usuario
se denominan CASE (Computer Aided Software Enginee-
ring) entre las cuales se encuentran:
Siendo los primeros más rigurosas y formales, los segun-
das más ágiles e informales. • Enterprise Architect
194 CAPÍTULO 99. INGENIERÍA DE SOFTWARE
El modelo en espiral, que Barry Boehm propuso origi- Desarrollo iterativo y creciente (o incremental) es un pro-
nalmente en 19∪∨, es un modelo de proceso de software ceso de desarrollo de software, creado en respuesta a las
evolutivo que conjuga la naturaleza iterativa de la cons- debilidades del modelo tradicional de cascada, es decir,
trucción de prototipos con los aspectos controlados y sis- este modelo aplica secuencias lineales como el modelo en
temáticos del modelo en cascada, es decir, cuando se apli- cascada, pero de una manera iterativa o escalada según
ca este modelo, el software se desarrolla en una serie de como avance el proceso de desarrollo y con cada una de
entregas evolutivas (ciclos o iteraciones), cada una de es- estas secuencias lineales se producen incrementos (mejo-
tas entregando prototipos más completas que el anterior, ras) del software.* [2∩]
todo esto en función del análisis de riesgo y las necesi- Se debe tener en cuenta que el ujo del proceso de cual-
dades del cliente. Aunque el modelo espiral representa quier incremento puede incorporar el paradigma de cons-
ventajas por sobre el desarrollo lineal, el cálculo de los trucción de prototipos, ya que como se mencionó ante-
riesgos puede ser muy complicado y por lo cual su uso en riormente, este tipo de modelo es iterativo por naturale-
el ámbito real es muy escaso.* [2∨] za, sin embargo se diferencia en que este busca la entrega
de un producto operacional con cada incremento que se
le realice al software.
99.8.4 Modelo de desarrollo por etapas
Este desarrollo incremental es útil principalmente cuando
Es un modelo en el que el software se muestra al cliente en el personal necesario para una implementación completa
etapas re nadas sucesivamente. Con esta metodología se no está disponible.
desarrollan las capacidades más importantes reduciendo
el tiempo necesario para la construcción de un producto; Modelo estructurado
el modelo de entrega por etapas es útil para el desarro-
llo de la herramienta debido a que su uso se recomienda Este modelo ―como su nombre lo indica ―utiliza las
para problemas que pueden ser tratados descomponién- técnicas del diseño estructurado o de la programación
dolos en problemas más pequeños y se caracteriza princi- estructurada para su desarrollo, también se utiliza en la
palmente en que las especi caciones no son conocidas en creación de los algoritmos del programa. Este formato
detalle al inicio del proyecto y por tanto se van desarro- facilita la comprensión de la estructura de datos y su con-
llando simultáneamente con las diferentes versiones del trol.* [2∪] Entre las principales características de este mo-
código. delo se encuentan las siguientes:
En este modelo pueden distinguirse las siguientes fases:
• Generalmente se puede diferenciar de una manera
más clara los procesos y las estructuras de datos.
• Especi cación conceptual.
• Existen métodos que se enfocan principalmente en
• Análisis de requisitos. ciertos datos.
Cuando es por etapas, en el diseño global estas fases pue- Este modelo también presenta sus desventajas entre las
den repetirse según la cantidad de etapas que sean reque- cuales podemos mencionar algunas:
ridas.
• Se podía encontrar datos repetidos en diferentes
Entre sus ventajas tenemos: partes del programa.* [2∪]
• Cuando el código se hace muy extenso o grande su
• Detección de problemas antes y no hasta la única manejo se complica demasiado.* [29]
entrega nal del proyecto.
En el modelo estructurado las técnicas que comúnmente
• Eliminación del tiempo en informes debido a que se utilizan son:
cada versión es un avance.
• El modelo entidad-relación, esta técnica se relaciona
• Estimación de tiempo por versión, evitando errores principalmente con los datos.
en la estimación del proyecto general.
• El diagrama de ujo de datos, esta es utilizada prin-
• Cumplimiento a la fecha por los desarrolladores. cipalmente para los procesos.* [30]
99.8. MODELOS Y CICLOS DE VIDA DEL DESARROLLO DE SOFTWARE 19∩
Modelo orientado a objetos estado hecho al estado cambios en espera. Este mode-
lo de desarrollo se utiliza a menudo como el paradigma
Estos modelos tienen sus raíces en la programación orien- de desarrollo de aplicaciones cliente/servidor. Un sistema
tada a objetos y como consecuencia de ella gira entorno al cliente/servidor se compone de un conjunto de compo-
concepto de clase, también lo hacen el análisis de requi- nentes funcionales. Cuando se aplica a cliente/servidor,
sitos y el diseño. Esto además de introducir nuevas técni- el modelo de proceso concurrente de ne actividades en
cas, también aprovecha las técnicas y conceptos del desa- dos dimensiones: una división de sistemas y una división
rrollo estructurado, como diagramas de estado y transi- de componentes. Los aspectos del nivel de sistemas se
ciones. El modelo orientado a objetos tiene dos caracte- afrontan mediante dos actividades: diseño y realización.
rísticas principales, las cuales ha favorecido su expansión:
La concurrencia se logra de dos maneras:
• Permite la reutilización de software en un grado sig-
ni cativo. • Las actividades del sistema y de componente ocu-
rren simultáneamente y pueden modelarse con el en-
• Su simplicidad facilita el desarrollo de herramien- foque orientado a objetos descrito anteriormente;
tas informáticas de ayuda al desarrollo, el cual es fá-
cilmente implementada en una notación orientada a • Una aplicación cliente/servidor típica se implementa
objetos llamado UML.* [31] con muchos componentes, cada uno de los cuales se
pueden diseñar y realizar concurrentemente.
99.8.6 Modelo RAD (rapid application de- En realidad, el modelo de desarrollo concurrente es apli-
velopment) cable a todo tipo de desarrollo de software y proporciona
una imagen exacta del estado actual de un proyecto. En
El RAD (rapid application development:ʻdesarrollo rápi- vez de con nar actividades de ingeniería de software a
do de aplicacionesʼ), es un modelo de proceso de softwa- una secuencia de sucesos, de ne una red de actividades,
re incremental, desarrollado inicialmente por James Mas- todas las actividades de la red existen simultáneamente
low en 19∪0, que resalta principalmente un ciclo corto de con otras. Los sucesos generados dentro de una actividad
desarrollo. dada o algún otro lado de la red de actividad inicia las
Esta es una metodología que posibilita la construcción de transiciones entre los estados de una actividad.
sistemas computacionales que combinen técnicas y uti-
lidades CASE (Computer Aided Software Engineering),
99.8.8 Proceso uni cado del desarrollo de
la construcción de prototipos centrados en el usuario y el
seguimiento lineal y sistemático de objetivos, incremen- software
tando la rapidez con la que se producen los sistemas me-
El proceso uni cado es un proceso de software genérico
diante la utilización de un enfoque de desarrollo basado
que puede ser utilizado para una gran cantidad de tipos de
en componentes.* [32]
sistemas de software, para diferentes áreas de aplicación,
Si se entienden bien los requisitos y se limita el ámbi- diferentes tipos de organizaciones, diferentes niveles de
to del proyecto, el proceso RAD permite que un equipo competencia y diferentes tamaños de proyectos.
de desarrollo cree un producto completamente funcional
Provee un enfoque disciplinado en la asignación de ta-
dentro de un periodo muy limitado de tiempo sin reducir
reas y responsabilidades dentro de una organización de
en lo más mínimo la calidad del mismo.* [33]
desarrollo. Su meta es asegurar la producción de softwa-
re de muy alta calidad que satisfaga las necesidades de
99.8.7 Modelo de desarrollo concurrente los usuarios nales, dentro de un calendario y presupues-
to predecible.* [34]
El modelo de desarrollo concurrente es un modelo de tipo El proceso uni cado tiene dos dimensiones:
de red donde todas las personas actúan simultáneamente
o al mismo tiempo. Este tipo de modelo se puede repre-
• Un eje horizontal que representa el tiempo y muestra
sentar a manera de esquema como una serie de activi-
los aspectos del ciclo de vida del proceso a lo largo
dades técnicas importantes, tareas y estados asociados a
de su desenvolvimiento
ellas.
El modelo de proceso concurrente de ne una serie de • Un eje vertical que representa las disciplinas, las
acontecimientos que dispararan transiciones de estado a cuales agrupan actividades de una manera lógica de
estado para cada una de las actividades de la ingeniería acuerdo a su naturaleza.
del software. Por ejemplo, durante las primeras etapas del
diseño, no se contempla una inconsistencia del modelo de La primera dimensión representa el aspecto dinámico del
análisis. Esto genera la corrección del modelo de análi- proceso conforme se va desarrollando, se expresa en tér-
sis de sucesos, que disparara la actividad de análisis del minos de fases, iteraciones e hitos (milestones).
19∪ CAPÍTULO 99. INGENIERÍA DE SOFTWARE
La segunda dimensión representa el aspecto estático del para el usuario el producto nal es la información que de
proceso: cómo es descrito en términos de componentes cierto modo soluciona el problema planteado por el usua-
del proceso, disciplinas, actividades, ujos de trabajo, ar- rio.
tefactos y roles.
El re namiento más conocido y documentado del proceso
uni cado es el RUP (proceso uni cado racional). 99.10 Naturaleza de la Ingeniería
El proceso uni cado no es simplemente un proceso, sino de Software
un marco de trabajo extensible que puede ser adaptado a
organizaciones o proyectos especí cos. De la misma ma- La ingeniería de software es una disciplina que está orien-
nera, el proceso uni cado de rational, también es un mar- tada a aplicar conceptos y métodos de ingeniería al desa-
co de trabajo extensible, por lo que muchas veces resulta rrollo de software de calidad.
imposible decir si un re namiento particular del proceso
ha sido derivado del proceso uni cado o del RUP. Por
dicho motivo, los dos nombres suelen utilizarse para re- Matemáticas
ferirse a un mismo concepto.* [3∧]
Los programas tienen muchas propiedades matemáticas.
Por ejemplo la corrección y la complejidad de muchos al-
99.9 Producto goritmos son conceptos matemáticos que pueden ser ri-
gurosamente probados. El uso de matemáticas en la IS es
El software se ha convertido en algo muy necesario en llamado métodos formales.
nuestra sociedad actual, es la máquina que conduce a la
toma de decisiones comerciales, sirve para la investiga- Creación
ción cientí ca moderna, es un factor clave que diferencia
productos y servicios modernos, etc. Esto se da porque el Los programas son construidos en una secuencia de pa-
software está inmerso en sistemas de todo tipo alrededor sos. El hecho de de nir propiamente y llevar a cabo es-
de nosotros. tos pasos, como en una línea de ensamblaje, es necesario
El software de computadora es el producto que diseñan para mejorar la productividad de los desarrolladores y la
y construyen los ingenieros de software. Esto abarca pro- calidad nal de los programas. Este punto de vista inspira
gramas que se ejecutan dentro de una computadora de los diferentes procesos y metodologías que se encuentran
cualquier tamaño y arquitectura, después de estar cons- en la IS.
truido casi cualquier persona en el mundo industrializado,
ya sea directa o indirectamente.
Gestión de Proyecto
Los productos se pueden clasi car en:
El desarrollo de software de gran porte requiere una ade-
• Productos genéricos: Son los producidos por una or- cuada gestión del proyecto. Hay presupuestos, estableci-
ganización para ser vendidos al mercado. miento de tiempos de entrega, un equipo de profesionales
• Productos hechos a medida: Sistemas que son desa- que liderar. Recursos (espacio de o cina, insumos, equi-
rrollados bajo pedido a un desarrollador especí co. pamiento) por adquirir. Para su administración se debe
tener una clara visión y capacitación en gestión de pro-
Estos productos deben cumplir varias características al yectos.
ser entregados, estas son:
• Personal: Los ingenieros de software participaran [3] ACM (200∨). «Computing Degrees & Careers». ACM.
toda su vida en el aprendizaje con la práctica y pro- Consultado el 23 de noviembre de 2010.
moverán un enfoque ético de la profesión, mejo-
[4] Bureau of Labor Statistics, U.S. Department of Labor,
rando su conocimiento de los avances en el análi-
USDL 05-2145: Occupational Employment and Wages,
sis, especi cación, diseño, desarrollo, mantenimien- November 2004, Table 1.
to, pruebas del software y documentos relacionados
en conjunto con administración del proceso de desa- [∧] Universidad Siglo XXI,Argentina,
rrollo.* [41]
[∨] Universidad Autónoma de Guadalajara, México,
• Anexo:Filosofías del desarrollo de software [14] Ingenieria de SoftwareUML, artículo en el sitio web Mo-
nografías.
• Ingeniería informática
[1∧] Monogra [Link] Ingeniería del software
• Gestión de la con guración
[1∨] [[Link]
• Proceso para el desarrollo de software
[1∩] [[Link]
• Mantenimiento de software analisis-de-requerimientos-ingenieria-de-software
99.15 Bibliografía
• Ingeniería de software (sexta edición), Ian Sommer-
ville. Addison Wesley. Sitio en Inglés
• Pressman, Roger S.: Ingeniería del software: un en-
foque práctico (información en inglés). McGraw Hill
Higher Education, sexta edición, pág. ∧0-∧1.</ref>
Instancia (informática)
En el paradigma de la orientación a objetos, una instancia la que pertenece y, por tanto, puede llamar a los métodos
(en inglés, instance) se re ere a una realización especí ca de instancia que hayan sido declarados como de instancia,
de una clase o prototipo determinados. así como a todos aquellos que hayan sido heredados por
En general, cuando se ejecuta un programa en un compu- la jerarquía de herencia estática entre clases.
tador, se dice que éste se instancia. En lenguajes que crean Ciertos lenguajes de programación permiten utilizar cla-
objetos a partir de clases, un objeto es una instancia de ses mixin, que permiten además realizar asociaciones en-
una clase. Esto es, un miembro de una clase que tiene tre instancias de objetos para establecer relaciones simi-
atributos en lugar de variables. En un contexto del mun- lares a la herencia en tiempo de ejecución.
do real, podríamos pensar en “Perro”como una clase
y en un perro concreto es una instancia de esta clase.* [1]
En este caso no nos importa la raza del perro. Si fuese 100.2.1 Clases como objetos
de nuestro interés modelarla, y diferenciásemos entre un
dóberman y un chihuahua, no solo cada instancia sería Multitud de lenguajes de programación basados en cla-
diferente, sino que pertenecerían a clases o prototipos di- ses proporcionan mecanismos de re exión o introspec-
ferentes, c.f. herencia (informática). ción, esto es, permiten que el programa pueda observar
(e incluso modi car) su propia estructura de alto nivel. Si
estos mecanismos siguen el paradigma de orientación a
100.1 Etimología objetos también, entonces las clases serán representadas
también como instancias de objetos. En particular, si el
El término en informática procede del inglés, en donde lenguaje no permite dos de niciones de una misma cla-
instance viene del signi cado que podría traducirse por se (puede hacerlo para permitir ejecuciones concurren-
caso o ejemplo en castellano. Aunque la palabra existe tes de distintas versiones de una clase)* [Nota 1] entonces
en el idioma inglés por incorporación desde el latín co- las clases serán representadas utilizando un Singleton. En
mo instantia (que es de donde lo hace también la pala- Java, por ejemplo, si tenemos una clase de nida como:
bra en castellano), pero posteriormente también adquirió public class Perro {}
(del latín también) parte de la semántica de instāns, que
en nuestro caso derivó únicamente en instante.* [2] Esta
Podremos acceder a la instancia que representa la clase
incorporación desde el inglés tendría la consideración de
(y es una instancia de la [Link]<Perro>), en
préstamo semántico, aunque esta acepción no está con-
un programa principal de clase Main, del siguiente modo:
templada todavía por la Real Academia Española.* [3]
public class Main { public static void main(String...
args) { Class<?> perroClass = [Link]; Sys-
100.2 Programación basada en cla- [Link](perroClass); } }
ses
En este apartado hablaremos de la programación orienta-
da a objetos basada en clases, que es la que implementa la
100.3 Programación basada en
mayoría de lenguajes de programación orientados a ob- prototipos
jetos. En el modelo basado en prototipos, que es el de
lenguajes como JavaScript, los términos que se re eren a En el estilo de programación orientada a objetos basada
clases han de sustituirse por los prototipos de los objetos, en prototipos las instancias son los objetos creados a partir
pero por lo demás, son de aplicación similar. de los prototipos. En general, los prototipos también son
En este modelo, un objeto tiene una referencia a la clase a objetos creados a partir de otros prototipos, con lo que
202
100.5. REFERENCIAS 203
100.4 Notas
[1] Erlang, por ejemplo, permite la ejecución concu-
rrente de varias versiones de un mismo programa,
véase change-3 [Link] ser-
[Link]#Module:code change-3, y CLOS.
100.5 Referencias
[1] [Link] (en in-
glés)
[3] [Link]
Capítulo 101
Instrucción (informática)
204
101.4. VÉASE TAMBIÉN 20∧
Linux kernel-to-userspace Linux kernel-internal La adhesión a las ABIs (las cuales pueden o no es-
✔ API stability is guaranteed, source code
☐ ✘
☐
tar o cialmente estandarizadas) es normalmente trabajo
API stability is not guaranteed,
is portable! source code portability is not a given
API
system Linux
process
scheduler
las ABIs directamente cuando escriben las aplicaciones
I/O
interface
Network
interface
en una mezcla de lenguajes de programación, utilizando
interfaces de funciones foráneas entre ellas.
✔ compatible ABI can be guaranteed,
☐ ✘
☐ no stable ABI over Linux kernel releases,
binaries are portable
Linux OS
binaries are not portable
✘ DRM
Las ABIs di eren de las interfaces de programación de
aplicaciones (APIs) en que ambas de nen interfaces entre
"Alpha"
ABI BricsCAD
CATIA5
Linux OS
"Bravo"
binary
device
driver
✘ DRM componentes de programa pero las API a nivel de código
fuente.
Maya
compiled for in Linux kernel 3.7
et al.
Linux kernel 3.0
compiled against
Linux OS
"Charlie" ✔ DRM
LSB 5.0 for x86-64
compiled against in Linux kernel 3.0
LSB 5.0 for x86-64
datos
Iterator i; Iterator i; Iterator i;
char *p, *q; char *p, *q; char *p, *q;
sigsdet_t mask; sigsdet_t mask; sigsdet_t mask;
FILE *pack = NULL; FILE *pack = NULL; FILE *pack = NULL;
char *pack_fn_new = NULL, *pack_fn = NULL; char *pack_fn_new = NULL, *pack_fn = NULL; char *pack_fn_new = NULL, *pack_fn = NULL;
bool on_ssd, on_btrfs; bool on_ssd, on_btrfs; bool on_ssd, on_btrfs;
struct statfs sfs; struct statfs sfs; struct statfs sfs;
usec_t not_after; usec_t not_after; usec_t not_after;
uint64_t previous_block_readahead; uint64_t previous_block_readahead; uint64_t previous_block_readahead;
bool previous_block_readahead_set = false; bool previous_block_readahead_set = false; bool previous_block_readahead_set = false;
if (asprintf(&pack_fn, "%s/.readahead", root) < 0) { if (asprintf(&pack_fn, "%s/.readahead", root) < 0) { if (asprintf(&pack_fn, "%s/.readahead", root) < 0) {
r = log_oom(); r = log_oom(); r = log_oom();
goto finish; goto finish; goto finish;
20∨
102.5. ENLACES EXTERNOS 20∩
Otras ABIs estandarizan detalles como la convención de [4] «EABI Summary». PowerPC Embedded Application Bi-
nombres de funciones en C++,* [2] manejo de excepcio- nary Interface: 32-Bit Implementation (Version 1.0 edi-
nes, propagación,* [3] y convención sobre llamadas entre ción). Freescale Semiconductor, Inc. 01-10-199∧. pp. 2∪–
compiladores de la misma plataforma que no requieren 30.
compatibilidad con otras plataformas. [∧] «Debian ARM accelerates via EABI port». Linuxdevi-
[Link]. 19-01-200∩. Archivado desde el original el 21
de enero 200∩. Consultado el 11-10-200∩.
102.2 EABI [∨] Andrés Calderón and Nelson Castillo (14-03-200∩).
«Why ARM's EABI matters». [Link].
Una interfaz binaria de aplicación embebida (EABI) es- Archivado desde el original el 31 de marzo 200∩.
peci ca convenciones estandarizadas para los formatos Consultado el 11-10-200∩.
de archivo, tipos de datos, uso de registros, organización [∩] “PowerPC Embedded Processors Application Note”
de la pila y paso de parámetros en funciones de una apli-
cación de un sistema embebido. [∪] «ARM Information Center». [Link]. Con-
sultado el 2∩-02-2014.
Los compiladores que soportan EABI crean código obje-
to compatible con el código generado por otros compila- [9] «Eric Christopher - mips eabi documentation». Cyg-
dores, permitiendo a los desarrolladores enlazar librerías [Link]. 11-0∨-2003. Consultado el 2∩-02-2014.
generadas con otros compiladores. Los desarrolladores
que escriben su propio código en lenguaje ensamblador
pueden usar EABI para interactuar con el ensamblador 102.5 Enlaces externos
generado por otro compilador.
Las diferencias principales entre EABI y ABI para siste- • KDE Techbase Policies - Buen compendio de reglas
mas operativos de propósito general son que se permiten de desarrollo (con algunos ejemplos) para no romper
instrucciones privilegiadas en el código de la aplicación la compatibilidad binaria entre diferentes versiones
sin necesidad de enlazado dinámico y se utiliza un mar- de tu librería.
co de pila más compacto para ahorrar memoria.* [4] La
• Mac OS X ABI Function Call Guide
elección de EABi puede afectar al rendimiento.* [∧]* [∨]
Ejemplos de EABIs ampliamente utilizadas: • Debian ARM EABI port
PowerPC,* [∩] ARM EABI2* [∪] y MIPS EABI.* [9]
• οClib: Motorola ∪/1∨-bit embedded ABI
• SWIG
102.4 Referencias
[1] Intel Binary Compatibility Standard (iBCS)
Interfaz uida
En ingeniería de software, una interfaz uida (término ICon gurationFluent { string color; int height; int length;
acuñado por primera vez por Eric Evans y Martin Fow- int width; ICon gurationFluent SetColor(string color)
ler) es una construcción orientada a objeto que de ne un { [Link] = color; return this; } ICon gurationFluent
comportamiento capaz de retransmitir el contexto de la SetHeight(int height) { [Link] = height; return this; }
instrucción de una llamada subsecuente. Generalmente, ICon gurationFluent SetLength(int length) { [Link]
el contexto es = length; return this; } ICon gurationFluent SetDepth(int
depth) { [Link] = depth; return this; } } public class
• de nido a través del valor de retorno de un método ExampleProgram { [STAThread] public static void
llamado Main(string[] args) { //Ejemplo estándar ICon gura-
tion con g = new Con guration(); con [Link](
• autoreferencial, donde el nuevo contexto es equiva- “blue”); con [Link](1); con [Link](2); con-
lente al contexto anterior [Link](3); //Ejemplo uido ICon gurationFluent
con g = new Con gurationFluent().SetColor(“blue”)
• terminado por medio del retorno de un contexto va-
.SetHeight(1) .SetLength(2) .SetDepth(3); } } }
cío (void context).
Este estilo es bene cioso debido a su capacidad de pro- El siguiente es un ejemplo en C++ de cómo proveer una
porcionar una sensación más uida al código, aunque al- envoltura de una interfaz uida arriba de una interfaz más
gunos ingenieros encuentran el estilo difícil de leer. Una tradicional:
segunda crítica es que generalmente, las necesidades de // de nición básica class GlutApp { private: int w_,
programación son demasiado dinámicas para con ar en h_, x_, y_, argc_, display_mode_; char **argv_; char
la de nición estática de contacto ofrecida por una inter- *title_; public: GlutApp(int argc, char** argv) { argc_
faz uida. = argc; argv_ = argv; } void setDisplayMode(int mode)
{ display_mode_ = mode; } void getDisplayMode() {
return display_mode_; } void setWindowSize(int w,
103.1 Ejemplos int h) { w_ = w; h_ = h; } void setWindowPosition(int
x, int y) { x_ = x; y_ = y; } void setTitle(const char
El siguiente ejemplo muestra una clase implementando *title) { title_ = title; } void create(); }; // uso básico int
una interfaz no uida, y otra implementando una contra- main(int argc, char **argv) { GlutApp app(argc, argv);
parte uida, junto con las diferencias en el uso. El ejem- [Link](GLUT_DOUBLE|GLUT_RGBA|GLUT_ALPHA|GL
plo se escribe en C #: // Ajusta los parámetros del framebu er
[Link](∧00, ∧00); // Ajusta los pará-
namespace [Link] { using System; metros de la ventana [Link](200, 200);
public interface ICon guration { void SetColor(string [Link](“My OpenGL/GLUT App”); [Link]();
color); void SetHeight(int height); void SetLength(int } // Envoltorio uido class FluentGlutApp : private
length); void SetDepth(int depth); } public interface GlutApp { public: FluentGlutApp(int argc, char **argv)
ICon gurationFluent { ICon gurationFluent SetCo- : GlutApp(argc, argv) {} // hereda el constructor del
lor(string color); ICon gurationFluent SetHeight(int pariente FluentGlutApp &withDoubleBu er() { set-
height); ICon gurationFluent SetLength(int length); DisplayMode(getDisplayMode() | GLUT_DOUBLE);
ICon gurationFluent SetDepth(int depth); } public return *this; } FluentGlutApp &withRGBA() { setDis-
class Con guration : ICon guration { string color; playMode(getDisplayMode() | GLUT_RGBA); return
int height; int length; int width; void SetColor(string *this; } FluentGlutApp &withAlpha() { setDisplay-
color) { [Link] = color; } void SetHeight(int height) Mode(getDisplayMode() | GLUT_ALPHA); return
{ [Link] = height; } void SetLength(int length) *this; } FluentGlutApp &withDepth() { setDisplayMo-
{ [Link] = length; } void SetDepth(int depth) { de(getDisplayMode() | GLUT_DEPTH); return *this;
[Link] = depth; } } public class Con gurationFluent :
20∪
103.2. ENLACES EXTERNOS 209
Invariante (informática)
210
Capítulo 105
Jframe
JFrame es una clase utilizada en Swing (biblioteca grá - • addImpl(Component comp, Object constraints, int in-
ca) para generar ventanas sobre las cuales añadir distintos dex): Añade el componente especi cado al JFrame.
objetos con los que podrá interactuar o no el usuario. A
diferencia de JPanel, JFrame posee algunas nociones tí-
picas de una ventana como minimizar, cerrar, maximizar • createRootPane(): Crea un Panel por defecto por
y poder moverla. medio de una llamada al constructor.
211
212 CAPÍTULO 105. JFRAME
• setRootPaneCheckingEnabled(boolean enabled):
• isRootPaneCheckingEnabled(): Devuelve un valor Establece si las llamadas add y setLayout se remiten
de cierto si las llamadas add y setLayout se remiten o no a la contentPane.
a la contentPane.
• setTransferHandler(TransferHandler newHandler):
• paramString(): Devuelve una representación en De ne el transferHandler, que es un mecanismo
cadena de texto del JFrame. de soporte de transferencia de datos dentro del
JFrame.
• setDefaultLookAndFeelDecorated(boolean de-
faultLookAndFeelDecorated): Establece la apa-
riencia que debe tener el JFrame, como bordes,
botones para distintos usos, título...
• setLayeredPane(JLayeredPane layeredPane): De -
ne el objeto layeredPane del JFrame.
Usuario discusión:Juliasocorro
Hola, Julia. Olvidé introducir el aviso «en obras». Por ello 3. Conocimiento de los CMS.
hubo un con icto de edición. Si te convencen los cambios,
mi versión era ésta: 4. Dominio de las API de las redes sociales importan-
tes: Facebook, Twitter, LinkedIn, Instagram, You-
Agente SEO es un profesional que gestiona el tube, Google Plus... otras.
posicionamiento SEO de los sitios web y blogs en
los motores de búsqueda de Internet, tales como Google, ∧. Programador Web.
Bing y Yahoo.
• Personal:
Si se considera una puesta en común de las ofertas genera-
les recientes a nivel nacional, el per l laboral del Agente
SEO, según la demanda de empleabilidad actual de las 1. Positivo, creativo, estratega.
empresas en cuanto a conocimientos, habilidades y des- 2. Metódico, ordenado, esquemático.
trezas, es el siguiente:
3. Proactivo, que asista a congresos SEO, Analytic, So-
• Experto en Marketing online y en Analítica Web: cial Media, Adwords.
4. Dominio del estrés y de la presión de trabajo, ya que
1. Análisis e investigación de las palabras claves: Mar- muchas veces se labora contra el paso del robot de
keting online & SEO. Google y de otros buscadores.
2. Experiencia demostrable con SEMrush, Webmaster ∧. Capacidad de aprendizaje continuo, pasión por el
Tools, Google Analytics, Ahref y otras herramientas trabajo, sin límite de horario.
de auditoría y gestión SEO.
∨. Trabajo por resultados.
3. Diseño de estrategias de enlaces – linkbuilding.
El Agente SEO puede ser:
4. Testeo de la web, mantenimiento de backlinks.
213
214 CAPÍTULO 106. USUARIO DISCUSIÓN:JULIASOCORRO
•
•
•
•
•
Capítulo 107
Kanban (desarrollo)
Este artículo se re ere a la gestión de procesos y método 107.2 Los principios del método
de mejora. Para el proceso de manufactura esbelta, con-
sulte Kanban.
Kanban
Kanban es un método para gestionar el trabajo intelec-
El método Kanban tiene sus raíces en cuatro principios
tual, con énfasis en la entrega justo a tiempo, mientras no
básicos:
se sobrecargan a los miembros del equipo. En este enfo-
que, el proceso, desde la de nición de una tarea hasta su
entrega al cliente, se muestra para que los participantes lo 1. Comience con lo que hace ahora
vean y los miembros del equipo tomen el trabajo de una
cola. El método Kanban se inicia con las fun-
ciones y procesos que ya se tienen y esti-
Kanban se puede dividir en dos partes:
mula cambios continuos, incrementales
y evolutivos a su sistema.
• Kanban - Un sistema de gestión de proceso visual
que le indica qué producir, cuándo producirlo, y 2. Se acuerda perseguir el cambio incremental y evo-
cuánto producir. lutivo
21∧
21∨ CAPÍTULO 107. KANBAN (DESARROLLO)
107.3 Cinco prácticas centrales del consenso. El método Kanban sugiere que
un enfoque cientí co sea utilizado para
método Kanban implementar los cambios continuos, gra-
duales y evolutivos. El método no pres-
Anderson identi có cinco características básicas que ha- cribe un método cientí co especí co pa-
bían sido observadas en cada implementación correcta ra utilizarlo.
del método Kanban. Posteriormente fueron etiquetadas
como prácticas y se ampliaron con la adición de una sex-
ta característica.* [3] 107.4 Comportamiento emergente
1. Visualizar con Kanban
Visualizar el ujo de trabajo y hacerlo Hay una creciente lista de comportamientos emergentes
visible es la base para comprender cómo que hemos llegado a esperar de la implementación de
avanza el trabajo. Sin comprender el u- Kanban, tales como* [4]
jo de trabajo, realizar los cambios ade-
cuados es más difícil. Una forma común
• Proceso único a la medida de cada cadena de valor
de visualizar el ujo de trabajo es el uso
de columnas. Las columnas representan • Cadencias desacopladas
los diferentes estados o pasos en el ujo
de trabajo. • Trabajo programado por el costo de la demora
Limitar el trabajo en curso implica que • Gestión de riesgo con asignación de capacidad
un sistema de extracción se aplica en la • Tolerancia en la experimentación de procesos
totalidad o parte del ujo de trabajo. El
sistema de extracción actúa como uno de • Gestión cuantitativa
los principales estímulos para los cam-
bios continuos, incrementales y evoluti- • Propagación viral de Kanban en toda la organización
vos en el sistema. • Pequeños equipos fusionados para crear bolsas de
3. Dirigir y gestionar el ujo trabajo más uidas.
[3] [Link]
principles-kanban-method David Anderson “The
principles of the Kanban method”December 10, 2010
108.2 SDK para añadidos • Los kits de herramientas de Widgets, en los que se
basan muchas utilidades desarrolladas con lenguajes
de programación orientados a objetos.
Un SDK para un añadido (add-on) de un determinado sis-
tema operativo (por ejemplo, QuickTime para Mac OS) • Turbo Pascal.
21∪
108.7. ENLACES EXTERNOS 219
• Clipper.
• Delphi.
• El Source SDK, una herramienta diseñada por Valve
en el que se puede diseñar mods y mapas para juegos
del motor Source. Disponible en Steam al comprar
un juego que use el motor Source.
• El SDK de Android, elaborado por Google para su
sistema homónimo.
108.5 Referencias
[1] [Link]
Kommander
Kommander es de nido con un conjunto de herramien- También hay un página de fans de Kommander
tas que permite la construcción de interfaces para scripts.
[Link]
Estos scripts pueden tener interacción con aplicaciones
propias del entorno de KDE y programas compilados en Y ahora se une Famelix, con un wiki especial para Kom-
algún lenguaje como por ejemplo C, C++, Phyton, etc. mander en español
Estas propiedades lo hacen ser muy útil al momento de [Link]
integrar soluciones.
Ahora Kommander, en términos más técnicos, consta de
dos componentes: Editor y Ejecutor.
109.1 El editor
Es la interfaz disponible para el programador, en la cual
se crean las ventanas o cuadros de diálogo. Dentro de los
cuadros de diálogo se pueden insertar controles o widget,
tales como barras de progreso, botones, cuadros de ima-
gen, etc.
109.2 El ejecutor
Es simplemente el motor que ejecuta el código generado
por el editor.
220
Capítulo 110
• Listado de Errores
• Ejemplo de FormatMessage en Delphi
110.1 Errores personalizados
221
Capítulo 111
La de nición de línea de código fuente es esencialmente for (i=0; i<100; ++i) {printf(“hola”);} /* ←Cuántas
ambigua para la mayor parte del software. Su signi cado líneas tiene este programa? */
varía de un lenguaje de programación a otro, pero tam-
bién dentro de un mismo lenguaje de programación. Proviene de las siglas en inglés de Source Lines of Code
Una línea de código fuente es cada una de las líneas de (SLC), en español, “Líneas de Código Fuente”(LCF)
un archivo de código fuente de un programa informático. o “Líneas de Código Fuente Únicas”(LCFU).
Habitualmente en cada línea se ejecuta una instrucción
que tiene que ejecutar el programa. También es habitual
tabular las estructuras de control del programa en cuestión 111.1 El uso de medidas de LCF
para una lectura más fácil. Viene a ser como la oración en
libros y textos escritos en general.
De acuerdo a Andrew Tanenbaum, los valores de líneas
En ocasiones los programadores hablan del número de de código fuente para diferentes sistemas operativos de
“líneas de código”que tiene cierto programa para hablar la línea de productos de Microsoft Windows NT son las
de la magnitud o complejidad de este. siguientes:
En computación, el número de línea de una instrucción es
un punto bastante útil a la hora de compilar el programa
porque habitualmente los compiladores detectan errores David A. Wheeler ha estudiado el sistema operativo Red
de programación mostrando el número de línea donde se Hat (distribución de los sistemas operativos de Linux) e
ha encontrado el error que el programador deberá corregir informó que Red Hat versión ∩.1 (lanzado en abril de
para una compilación satisfactoria. 2001) contiene cerca de 30 millones de LCFU físicos.
Como curiosidad, algunos programadores se divierten También extrapoló que, de haber sido desarrollado por
complicando la forma de programar, bien por diversión, medios convencionales de propiedad (medida de tiempo-
como reto entre programadores, o para que sea imposible persona) habría requerido de unos ∪.000 años/persona de
de entender para un programador poco experimentado. esfuerzo y desarrollo y hubiesen costado más de mil mi-
A este pasatiempo se le denomina programación ofusca- llones de dólares (cotizados en el año 2000).
da y uno de los puntos más habituales para programar Un estudio similar, reveló que Debian versión 2.2 (cono-
ofuscadamente es no escribir una instrucción por línea cido por su nombre clave “Potato”) contiene unos ∧∧
y no hacer tabulaciones, en ocasiones se escriben varias millones de LCFU y de haber sido realizado mediante las
instrucciones por línea o a veces se corta una instrucción
propiedades convencionales, hubiese tardado unos 1400∧
en varias líneas. Los más experimentados en este tipo de años/persona y costado unos 1900 millones de dólares.
pasatiempos, se atreven incluso a realizar obras de AsciiMás tarde se ejecutó una de las herramientas utilizadas
art con las líneas de su código fuente. en el informe para la siguiente versión y se reportó que
En el lenguaje de programación C, por ejemplo, una línea Debian posee 104 millones de LCFU, y a partir del año
de código puede ser: 200∧, las siguientes versiones poseerán, al menos, más de
213 millones de LCFU.
1. una instrucción acabada en un salto de línea, Se pueden encontrar las cifras de los principales sistemas
operativos (las distintas versiones de Windows se han pre-
2. una instrucción acabada en un punto y coma, sentado en una tabla de arriba).
3. cualquier línea del programa que acabe en un salto
de línea (comentarios incluidos).
En comparación, las cifras de algunas herramientas grá-
Por ejemplo: cas.
222
111.3. VÉASE TAMBIÉN 223
• Dos maneras de contar LCFU en Windows PowerS- [3] Robles, Gregorio. «Debian Counting». Archivado desde
hell en todos los archivos .cxx, .cpp, .h, and .c dentro el original el 23 de noviembre de 201∧. Consultado el 1∨
y debajo del directorio. de febrero de 200∩.
224 CAPÍTULO 111. LÍNEA DE CÓDIGO FUENTE
[∧] [Link]
contents/download/program/[Link]
[∨] [Link]
com/sivaram_subr/codeanalyzer/[Link]
[∩] [Link]
[Link]
[∪] [Link]
[9] [Link]
200∩/12/2∨/source-line-of-code-counter
[10] [Link]
Macintosh Toolbox
22∧
Capítulo 113
Macro
22∨
Capítulo 114
Malla de triángulos 3D
La Malla de triángulos 3D es una colección de DirectX, no son compatibles con las mallas arbitrarias de
triángulos y vértices que aproximan una super cie en 3D. triángulos. Sin embargo, estructuras como tiras de trián-
Aunque el campo de aplicación de la generación auto- gulos - (donde cada triángulo, comparte un vértice con un
mática de una malla triangular, ha sido tradicionalmen- vecino y otro con el próximo) y el abanicos de triángulos
te la obtención de modelos digitales de elevaciones del (un conjunto de triángulos conectados por un vértice cen-
tral) se tratan de manera e ciente con la necesidad de sólo
terreno, su aplicación es mucho más amplia. Cualquier
variable espacial relacionada con una cierta tipología, es procesar N+2 vértices para dibujar N triángulos.
susceptible de ser modelizada como una super cie tridi- Una malla de triángulos, construida a partir de tiras, en
mensional, en la que la cota de cada punto es el valor de abanico y posiblemente triángulos independientes, gene-
la variable a estudiar. ralmente se obtienen mediante un mosaico de objetos po-
Para saber cómo podríamos descomponer un objeto con ligonales.
todas sus partes, la mínima regla es la teoría del sistema Otra forma de evitar la redundancia de procesamiento de
de visión humano. Para interpretar cómo los seres huma- vértices es compartiendo vértices explícitos. La de ni-
nos pueden descomponer un objeto en mallas, podríamos ción de los vértices está separada de la descripción trián-
desarrollar un algoritmo de segmentación de malla ya que gulo. Todo el conjunto de triángulos se de ne por un con-
además éste nos permite obtener un nivel superior de des- junto de índices en una matriz de vértices. El sistema grá-
cripciones del objeto en cuestión. co procesa los vértices primero y hace el render de los
triángulos después, utilizando el conjunto de índices tra-
bajando sobre la transformación de datos.
114.1 Aplicaciones
Una utilidad de las mallas de triángulos podría ser para
114.2 Obtención de las mallas
sistemas de reconocimiento de objetos, la comprensión
de una escena, y las características del modelado. Para la generación automática de una malla triangular
existen distintos estudios y algoritmos. Por ejemplo, hay
Los grá cos por ordenador también utilizan mallas de algoritmos que parten de una nube de puntos irregular-
triángulos. Se componen de un conjunto de triángulos
mente distribuidos y procurando de nir cada triángulo lo
(normalmente en tres dimensiones) que están conectados más regular posible (el caso óptimo, triánguos equiláte-
por sus vértices.
ros) permiten la creación de una malla de triángulos.
Muchos paquetes de software de grá cos y dispositivos Partiendo de una distribución irregular de puntos a los
de hardware puede funcionar de manera más e ciente que se les ha asociado una cierta variable, por ejemplo su
en triángulos que se agrupan en mallas que en un gru- cota, si estamos hablando de un terreno o el valor de la
po de triángulos que se presentan individualmente. Esto contaminación acústica en una cierta zona urbana, exis-
es porque normalmente los grá cos por ordenador hacen ten técnicas para interpolar dicha variable en cualquier
operaciones sobre los vértices (en las esquinas de trián- otro punto de la zona en la que no disponemos de su va-
gulos). Con cada uno de los triángulos, el sistema tiene lor mediante un proceso de medición directo. Mientras
que funcionar en tres vértices de cada triángulo. En una que algunos de estos métodos están desarrollados a par-
gran malla, puede haber ocho o más triángulos reunidos tir de una interpolación que utiliza algoritmos de ʻpat-
en un único vértice. Así, procesando los vértices una sola chesʼ, super cies cuadráticas, interpolaciones polinómi-
vez, es posible hacer una fracción del trabajo y lograr un cas, etc.; la técnica habitualmente utilizada es la basada
efecto idéntico. en los polígonos de Voronoi y la triangulación de Delau-
Las dos interfaces de programación de aplicaciones nay para así obtener una malla triangular, lo más regular
(APIs) más importantes del mercado grá co, OpenGL y posible, tal que los vértices de los triángulos que confor-
22∩
22∪ CAPÍTULO 114. MALLA DE TRIÁNGULOS 3D
114.3 Compresión
Un método de compresión de una malla con pluralidad
de vértices, es decir, que cada vértice se caracteriza por
un grado igual al número de bordes incidentes y con la
casi totalidad de vértices en un orden consecutivo. Así
generamos una lista con la tipología de los grados de los
vértices en orden consecutivo y el código de secuencia de
señales con la tipología de la lista.
Capítulo 115
Mapeo objeto-relacional
El mapeo objeto-relacional (más conocido por su nom- lares simples en el programa. El mapeo objeto-relacional
bre en inglés, Object-Relational mapping, o sus siglas es utilizado para implementar la primera aproximación.
O/RM, ORM, y O/R mapping) es una técnica de pro- El núcleo del problema reside en traducir estos objetos a
gramación para convertir datos entre el sistema de tipos formas que puedan ser almacenadas en la base de datos
utilizado en un lenguaje de programación orientado a ob-
para recuperarlas fácilmente, mientras se preservan las
jetos y la utilización de una base de datos relacional como propiedades de los objetos y sus relaciones; estos objetos
motor de persistencia. En la práctica esto crea una base
se dice entonces que son persistentes.
de datos orientada a objetos virtual, sobre la base de da-
tos relacional. Esto posibilita el uso de las características
propias de la orientación a objetos (básicamente herencia
y polimor smo). Hay paquetes comerciales y de uso libre 115.2 Implementaciones
disponibles que desarrollan el mapeo relacional de ob-
jetos, aunque algunos programadores pre eren crear sus
Los tipos de bases de datos usados mayoritariamente son
propias herramientas ORM.
las bases de datos SQL, cuya aparición precedió al cre-
cimiento de la programación orientada a objetos en los
1990s. Las bases de datos SQL usan una serie de tablas
115.1 El problema para organizar datos. Los datos en distintas tablas están
asociados a través del uso de restricciones declarativas en
En la programación orientada a objetos, las tareas de lugar de punteros o enlaces explícitos. Los mismos da-
gestión de datos son implementadas generalmente por la tos que pueden almacenarse en un solo objeto podrían
manipulación de objetos, los cuales son casi siempre va- requerir ser almacenados a través de varias tablas.
lores no escalares. Para ilustrarlo, considere el ejemplo de Una implementación del mapeo relacional de objetos po-
una entrada en una libreta de direcciones, que representa dría necesitar elegir de manera sistemática y predictiva
a una sola persona con cero o más números telefónicos qué tablas usar y generar las sentencias SQL necesarias.
y cero o más direcciones. En una implementación orien-
Muchos paquetes han sido desarrollados para reducir el
tada a objetos, esto puede ser modelado por un “obje-
to persona”con “campos”que almacenan los datos de tedioso proceso de desarrollo de sistemas de mapeo re-
lacional de objetos proveyendo bibliotecas de clases que
dicha entrada: el nombre de la persona, una lista de nú-
meros telefónicos y una lista de direcciones. La lista de son capaces de realizar mapeos automáticamente. Dada
una lista de tablas en la base de datos, y objetos en el pro-
números telefónicos estaría compuesta por “objetos de
números telefónicos”y así sucesivamente. La entrada de grama, ellos pueden automáticamente mapear solicitudes
la libreta de direcciones es tratada como un valor único de un sentido a otro. Preguntar a un objeto persona por
por el lenguaje de programación (puede ser referenciada sus números telefónicos resultará en la creación y envío
por una sola variable, por ejemplo). Se pueden asociar va- de la consulta apropiada a la base de datos, y los resulta-
rios métodos al objeto, como uno que devuelva el número dos son traducidos directamente en objetos de números
telefónico preferido, la dirección de su casa, etc.. telefónicos dentro del programa.
Sin embargo, muchos productos populares de base de da- Desde el punto de vista de un programador, el sistema
tos, como los Sistemas de Gestión de Bases de Datos debe lucir como un almacén de objetos persistentes. Uno
SQL, solamente pueden almacenar y manipular valores puede crear objetos y trabajar normalmente con ellos, los
escalares como enteros y cadenas, organizados en tablas cambios que sufran terminarán siendo re ejados en la ba-
normalizadas. El programador debe convertir los valores se de datos.
de los objetos en grupos de valores simples para almace- Sin embargo, en la práctica no es tan simple. Todos los
narlos en la base de datos (y volverlos a convertir luego de sistemas ORM tienden a hacerse visibles en varias for-
recuperarlos de la base de datos), o usar sólo valores esca- mas, reduciendo en cierto grado la capacidad de ignorar
229
230 CAPÍTULO 115. MAPEO OBJETO-RELACIONAL
la base de datos. Peor aún, la capa de traducción puede ser 115.3 Bases de datos distintas a
lenta e ine ciente (comparada en términos de las senten-
cias SQL que escribe), provocando que el programa sea
SQL
más lento y utilice más memoria que el código “escrito
a mano”. Las bases de datos como Caché no necesitan mapeo
objeto-relacional manual. El acceso del SQL a los valo-
Un buen número de sistemas de mapeo objeto-relacional res no escalares ya ha sido construido. Caché permite a
se han desarrollado a lo largo de los años, pero su efec- los desarrolladores diseñar cualquier combinación de pro-
tividad en el mercado ha sido diversa. NeXT's Enter- gramación orientada a objetos y almacenamiento estruc-
prise Objects Framework (EOF) fue una de las prime- turado en tablas en la misma base de datos en lugar de
ras implementaciones, pero no tuvo éxito debido a que depender de herramientas externas.
estaba estrechamente ligado a todo el kit de NeXT's,
OpenStep * [cita requerida]. Fue integrado más tarde en Otra solución puede ser el uso de un sistema de adminis-
NeXT's WebObjects, el primer servidor web de apli- tración de base de datos orientada a objetos (OODBMS:
caciones orientado a objetos. Desde que Apple compró Object-oriented database management system), lo cual,
NeXT's en 199∩, EOF proveyó la tecnología detrás de los como el nombre lo sugiere, es una base de datos diseña-
sitios web de comercio electrónico de Apple: los servicios da especí camente para trabajar con valores orientados a
.Mac y la tienda de música iTunes. Apple provee EOF en objetos. Usar un OODBMS puede eliminar la necesidad
dos implementaciones: la implementación en Objective- de convertir datos desde y hacia su forma SQL, y los da-
C que viene con Apple Developers Tools y la implemen- tos pueden ser almacenados en su representación original
tación Pure Java que viene en WebObjects ∧.2. Inspirado como objetos.
por EOF es el open source Apache Cayenne. Cayenne Las bases de datos orientadas a objetos aún no han con-
tiene metas similares a las de EOF e intenta estar acorde seguido una alta aceptación y uso. Una de las principales
a los estándares JPA. limitaciones reside en que, cambiar de un sistema de ad-
Una aproximación alternativa ha sido tomada por tecno- ministración de base de datos SQL a un sistema orienta-
logías como RDF y SPARQL, y el concepto de“triplesto- do totalmente a objetos implica que se pierde la capaci-
re”. RDF es una serialización del concepto objeto-sujeto- dad de crear sentencias SQL, un método ya probado para
predicado, RDF/XML es una representación en XML de obtener combinaciones especí cas de datos. Por esta ra-
aquello, SPARQL es un lenguaje de consulta similar al zón, muchos programadores se encuentran más a gusto
SQL, y un “triplestore”es una descripción general de trabajando con un sistema de mapeo de objetos y SQL,
una base de datos que trabaja con un tercer componente. aún cuando la mayoría de las bases de datos comerciales
orientadas a objetos son capaces de procesar consultas
Más recientemente, un sistema similar ha comenzado a SQL de manera limitada.
evolucionar en el mundo Java, conocido como Java Da-
ta Objects (JDO). A diferencia de EOF, JDO es un es-
tándar, y muchas implementaciones están disponibles por
parte de distintos distribuidores de software. La especi - 115.4 Véase también
cación 3.0 de Enterprise Java Beans (EJB) también cubre
la misma área. Han existido algunos con ictos de están- • Propel (PHP)
dares entre ambas especi caciones en términos de pre-
• Doctrine (PHP)
eminencia. JDO tiene muchas implementaciones comer-
ciales, mientras que EJB 3.0 está aún en desarrollo. Sin • JPA (Java)
embargo, recientemente otro estándar ha sido anuncia-
do por JCP para abarcar estos dos estándares de manera • Hibernate (Java)
conjunta y lograr que el futuro estándar trabaje en diver- • [Link] Entity Framework (C#)
sas arquitecturas de Java. Otro ejemplo a mencionar es
Hibernate, el framework de mapeo objeto-relacional más • LINQ to SQL (C# sólo para SQL Server) su sintaxis
usado en Java que inspiró la especi cación EJB 3. es similar a JPA
En el framework de desarrollo web Ruby on Rails, el ma- • NHibernate (C#)
peo objeto-relacional juega un rol preponderante y es ma-
nejado por la herramienta ActiveRecord. Un rol similar • peewee (Python)
es el que tiene el módulo DBIx::Class para el framework
basado en Perl Catalyst, aunque otras elecciones también
son posibles. 115.5 Enlaces relacionados
• Patrón de diseño Association Table Mapping:
• Introducción a JPA
Capítulo 116
Máquina de estados
Se denomina máquina de estados a un modelo de com- compleja, depender de la entrada actual (no sólo del
portamiento de un sistema con entradas y salidas, en don- estado) y pudiendo también prescindirse de un esta-
de las salidas dependen no sólo de las señales de entradas do inicial.
actuales sino también de las anteriores.
Las máquinas de estados se de nen como un conjunto de La bibliografía a veces llama autómata finito a las acep-
estados que sirve de intermediario en esta relación de en- toras, mientras que en otros casos se emplea autómata
tradas y salidas, haciendo que el historial de señales de como sinónimo de máquina de estados sin importar su
entrada determine, para cada instante, un estado para la tipo.
máquina, de forma tal que la salida depende únicamente Las aceptoras son los de mayor interés en la Teoría de
del estado y las entradas actuales. la Computación, más precisamente en la Teoría de autó-
Una máquina de estados se denomina máquina de esta- matas, siendo éstas ramas de la matemática. Las trans-
dos finitos (FSM por nite state machine) si el conjunto ductoras, en cambio, lo son en la electrónica digital y la
de estados de la máquina es nito, este es el único tipo de computación práctica. Es por eso que, por lo general, en
máquinas de estados que podemos modelar en un compu- los textos sobre matemática y ciencias de la computación
tador en la actualidad; debido a esto se suelen utilizar los se suele hablar de autómatas (y se re eren a las acepto-
términos máquina de estados y máquina de estados ni- ras) mientras que los de electrónica y computación prác-
tos de forma intercambiable. Sin embargo un ejemplo de tica hablan de máquinas de estados (y se re eren a los
una máquina de estados infinitos sería un computador transductoras).
cuántico esto es debido a que los Qubit que utilizaría es- En UML (Lenguaje Uni cado de Modelado), dice que
te tipo de computadores toma valores continuos, en con- una máquina de estado es aquel comportamiento que per-
traposición los bits toman valores discretos (0 ó 1). Otro mite hacer un seguimiento de la vida de un objeto en el
buen ejemplo de una máquina de estados in nitos es una transcurso de un tiempo nito.
Máquina universal de Turing la cual se puede de nir teó-
ricamente con una “cinta”o memoria in nita.
La representación de una máquina de estados se realiza
mediante un Diagrama de estados, sin embargo también
es posible utilizar un Diagrama de ujo.
Es posible clasi car las máquinas de estados en aceptoras
o transductoras:
231
Capítulo 117
Máquina desnuda
232
Capítulo 118
MCML
• Xbox 3∨0
• XAML
233
Capítulo 119
Metaprogramación
234
Capítulo 120
23∧
Capítulo 121
Modelo de prototipos
El Modelo de prototipos, en Ingeniería de software, per- La construcción de prototipos se puede utilizar como un
tenece a los modelos de desarrollo evolutivo. El prototipo modelo del proceso independiente, se emplea más co-
debe ser construido en poco tiempo, usando los progra- múnmente como una técnica susceptible de implemen-
mas adecuados y no se debe utilizar muchos recursos. tarse dentro del contexto de cualquiera de los modelos
del proceso expuestos. Sin importar la forma en que és-
El diseño rápido se centra en una representación de aque-
llos aspectos del software que serán visibles para el cliente te se aplique, el paradigma de construcción de prototipos
ayuda al desarrollado de software y al cliente a entender
o el usuario nal. Este diseño conduce a la construcción
de un prototipo, el cual es evaluado por el cliente para una de mejor manera cuál será el resultado de la construcción
cuando los requisitos estén satisfechos. De esta manera,
retroalimentación; gracias a ésta se re nan los requisitos
del software que se desarrollará. La interacción ocurre este ciclo de vida en particular, involucra al cliente más
profundamente para adquirir el producto.
cuando el prototipo se ajusta para satisfacer las necesi-
dades del cliente. Esto permite que al mismo tiempo el
desarrollador entienda mejor lo que se debe hacer y el
cliente vea resultados a corto plazo. 121.3 Inconvenientes
• El usuario tiende a crearse unas expectativas cuando
ve el prototipo de cara al sistema nal. A causa de la
121.1 Etapas intención de crear un prototipo de forma rápida, se
suelen desatender aspectos importantes, tales como
• Plan rápido. la calidad y el mantenimiento a largo plazo, lo que
obliga en la mayor parte de los casos a reconstruirlo
• Modelado, diseño rápido
una vez que el prototipo ha cumplido su función. Es
• Construcción del Prototipo frecuente que el usuario se muestre reacción a ello y
pida que sobre ese prototipo se construya el sistema
• Desarrollo, entrega y retroalimentación nal, lo que lo convertiría en un prototipo evoluti-
vo, pero partiendo de un estado poco recomendado.
• Comunicación
• En aras de desarrollar rápidamente el prototipo, el
• Entrega del desarrollo nal desarrollador suele tomar algunas decisiones de im-
plementación poco convenientes (por ejemplo, ele-
gir un lenguaje de programación incorrecto porque
proporcione un desarrollo más rápido). Con el paso
121.2 Ventajas del tiempo, el desarrollador puede olvidarse de la ra-
zón que le llevó a tomar tales decisiones, con lo que
• Este modelo es útil cuando el cliente conoce los ob- se corre el riesgo de que dichas elecciones pasen a
jetivos generales para el software, pero no identi ca formar parte del sistema nal...
los requisitos detallados de entrada, procesamiento
o salida.
23∨
121.5. VÉASE TAMBIÉN 23∩
Modi cador
23∪
Capítulo 123
Modularidad
239
240 CAPÍTULO 123. MODULARIDAD
• Morfología (biología)
• Diseño modular
Capítulo 124
Módulo (informática)
En programación un módulo es una porción de un lles internos de otros módulos. Como consecuencia
programa de ordenador. De las varias tareas que debe de la independencia modular un módulo cumplirá:
realizar un programa para cumplir con su función u ob-
jetivos, un módulo realizará, comúnmente, una de dichas • Características de caja negra, es decir
tareas (o varias, en algún caso). abstracción (ver abstracción en progra-
En general (no necesariamente relacionado con la pro- mación orientada a objetos).
gramación), un módulo recibe como entrada la salida que • Aislamiento de los detalles mediante en-
haya proporcionado otro módulo o los datos de entrada al capsulamiento (ver encapsulamiento en
sistema (programa) si se trata del módulo principal de és- programación orientada a objetos).
te; y proporcionará una salida que, a su vez, podrá ser uti-
lizada como entrada de otro un módulo o bien contribuirá La independencia modular mejora el ren-
directamente a la salida nal del sistema (programa), si
dimiento humano, pudiendo realizarse pro-
se retorna al módulo principal. gramación en equipo y desarrollar módu-
Particularmente, en el caso de la programación, los mó- los paralelamente. También contribuye a la
dulos suelen estar (no necesariamente) organizados jerár- reutilización de software.
quicamente en niveles, de forma que hay un módulo prin-
cipal que realiza las llamadas oportunas a los módulos de
nivel inferior. 124.2 Véase también
Cuando un módulo es convocado, recibe como entrada
los datos proporcionados por otro del mismo o superior • Algoritmo
nivel, el que ha hecho la llamada; luego realiza su tarea.
A su vez este módulo convocado puede llamar a otro u • Programa
otros módulos de nivel inferior si fuera necesario; cuando • Modularidad
ellos nalizan sus tareas, devuelven la salida pertinente al
módulo inmediato llamador, en secuencia reversa, nal- • Diseño estructurado
mente se continúa con la ejecución del módulo principal.
• Programación modular
241
Capítulo 125
Monitor (concurrencia)
En la programación paralela, los monitores son objetos 125.2 Exclusión mutua en un mo-
destinados a ser usados sin peligro por más de un hilo de
ejecución. La característica que principalmente los de ne
nitor
es que sus métodos son ejecutados con exclusión mutua.
Lo que signi ca, que en cada momento en el tiempo, un Los monitores están pensados para ser usados en entor-
hilo como máximo puede estar ejecutando cualquiera de nos multiproceso o multihilo, y por lo tanto muchos pro-
sus métodos. Esta exclusión mutua simpli ca el razona- cesos o threads pueden llamar a la vez a un procedimiento
miento de implementar monitores en lugar de código a del monitor. Los monitores garantizan que en cualquier
ser ejecutado en paralelo. momento, a lo sumo un thread puede estar ejecutando
dentro de un monitor. Ejecutar dentro de un monitor sig-
En el estudio y uso de los semáforos se puede ver que las ni ca que sólo un thread estará en estado de ejecución
llamadas a las funciones necesarias para utilizarlos que- mientras dura la llamada a un procedimiento del moni-
dan repartidas en el código del programa, haciendo difícil tor. El problema de que dos threads ejecuten un mismo
corregir errores y asegurar el buen funcionamiento de los procedimiento dentro del monitor es que se pueden dar
algoritmos. Para evitar estos inconvenientes se desarro- condiciones de carrera, perjudicando el resultado de los
llaron los monitores. El concepto de monitor fue de nido cálculos. Para evitar esto y garantizar la integridad de los
por primera vez por Charles Antony Richard Hoare en un datos privados, el monitor hace cumplir la exclusión mu-
artículo del año 19∩4.* [1] La estructura de los monitores tua implícitamente, de modo que sólo un procedimiento
se ha implementado en varios lenguajes de programación, esté siendo ejecutado a la vez. De esta forma, si un thread
incluido Pascal concurrente, Modula-2, Modula-3 y Java, llama a un procedimiento mientras otro thread está dentro
y como biblioteca de programas. del monitor, se bloqueará y esperará en la cola de entrada
hasta que el monitor quede nuevamente libre. Aunque se
la llama cola de entrada, no debería suponerse ninguna
política de encolado.
125.1 Componentes Para que resulten útiles en un entorno de concurrencia, los
monitores deben incluir algún tipo de forma de sincroni-
Un monitor tiene cuatro componentes: inicialización, da- zación. Por ejemplo, supóngase un thread que está dentro
tos privados, métodos del monitor y cola de entrada. del monitor y necesita que se cumpla una condición para
poder continuar la ejecución. En ese caso, se debe contar
con un mecanismo de bloqueo del thread, a la vez que se
• Inicialización: contiene el código a ser ejecutado debe liberar el monitor para ser usado por otro hilo. Más
cuando el monitor es creado tarde, cuando la condición permita al thread bloqueado
continuar ejecutando, debe poder ingresar en el monitor
en el mismo lugar donde fue suspendido. Para esto los
• Datos privados: contiene los procedimientos priva- monitores poseen variables de condición que son accesi-
dos, que sólo pueden ser usados desde dentro del bles sólo desde adentro. Existen dos funciones para ope-
monitor y no son visibles desde fuera rar con las variables de condición:
• Métodos del monitor: son los procedimientos que • cond_wait(c): suspende la ejecución del proceso que
pueden ser llamados desde fuera del monitor. la llama con la condición c. El monitor se convierte
en el dueño del lock y queda disponible para que otro
proceso pueda entrar.
• Cola de entrada: contiene a los hilos que han llama-
do a algún método del monitor pero no han podido • cond_signal(c): reanuda la ejecución de algún pro-
adquirir permiso para ejecutarlos aún. ceso suspendido con cond_wait bajo la misma con-
242
125.4. VERIFICACIÓN DE MONITORES 243
dición c. Si hay varios procesos con esas caracterís- ejecutarlo a seguir con el proceso despertante.
ticas elige uno. Si no hay ninguno, no hace nada.
Desventajas:
Nótese que, al contrario que los semáforos, la llamada a
cond_signal(c) se pierde si no hay tareas esperando en la
• Si el proceso que ejecuta cond_signal no terminó
variable de condición c.
con su ejecución se necesitarán dos cambios de con-
Las variables de condición indican eventos, y no poseen texto para que vuelva a tomar el lock del monitor.
ningún valor. Si un thread tiene que esperar que ocurra
un evento, se dice espera por (o en) la variable de condi- • Al despertar a un thread que espera en una variable
ción correspondiente. Si otro thread provoca un evento, de condición, se debe asegurar que reanude su ejecu-
simplemente utiliza la función cond_signal con esa con- ción inmediatamente. De otra forma, algún otro th-
dición como parámetro. De este modo, cada variable de read podría cambiar la condición. Esto implica que
condición tiene una cola asociada para los threads que es- la plani cación debe ser muy able, y di culta la im-
tán esperando que ocurra el evento correspondiente. Las plementación.
colas se ubican en el sector de datos privados visto ante-
riormente.
La política de inserción de procesos en las colas de las
125.3.2 Tipo Mesa
variables condición es la FIFO, ya que asegura que ningún
Butler W. Lampson y David D. Redell en 19∪0 desarro-
proceso caiga en la espera inde nida, cosa que sí ocurre
llaron una de nición diferente de monitores para el len-
con la política LIFO (puede que los procesos de la base
guaje Mesa que lidia con las desventajas de los monitores
de la pila nunca sean despertados) o con una política en
de tipo Hoare y añade algunas características.
la que se desbloquea a un proceso aleatorio.
En los monitores de Lampson y Redell el thread que eje-
cuta cond_signal sobre una variable de condición conti-
125.3 Tipos de monitores núa con su ejecución dentro del monitor. Si hay otro th-
read esperando en esa variable de condición, se lo des-
pierta y deja como listo. Podrá intentar entrar el monitor
Antes se dijo que una llamada a la función cond_signal
cuando éste quede libre, aunque puede suceder que otro
con una variable de condición hacía que un proceso que
thread logre entrar antes. Este nuevo thread puede cam-
estaba esperando por esa condición reanudara su ejecu-
biar la condición por la cual el primer thread estaba dur-
ción. Nótese que el thread que reanuda su ejecución nece-
miendo. Cuando reanude la ejecución el durmiente, debe-
sitará obtener nuevamente el lock del monitor. Surgen las
ría veri car que la condición efectivamente es la que ne-
siguientes preguntas: ←Qué sucede con el thread que hizo
cesita para seguir ejecutando. En el proceso que durmió,
el cond_signal? ←Pierde el lock para dárselo al thread que
por lo tanto, es necesario cambiar la instrucción if por
esperaba? ←Qué thread continúa con su ejecución? Cual-
while, para que al despertar compruebe nuevamente la
quier solución debe garantizar la exclusión mutua. Según
condición, y de no ser cierta vuelva a llamar a cond_wait.
quién continúa con la ejecución, se diferencian dos tipos
de monitores: Hoare y Mesa. Además de las dos primitivas cond_wait(c) y
cond_signal(c), los monitores de Lampson y Redell
poseen la función cond_broadcast(c), que noti ca a los
125.3.1 Tipo Hoare threads que están esperando en la variable de condición
c y los pone en estado listo. Al entrar al monitor,
En la de nición original de Hoare, el thread que ejecuta cada thread veri cará la condición por la que estaban
cond_signal le cede el monitor al thread que esperaba. El detenidos, al igual que antes.
monitor toma entonces el lock y se lo entrega al thread
Los monitores del tipo Mesa son menos propensos a erro-
durmiente, que reanuda la ejecución. Más tarde cuando
res, ya que un thread podría hacer una llamada incorrecta
el monitor quede libre nuevamente el thread que cedió el
a cond_signal o a cond_broadcast sin afectar al thread en
lock volverá a ejecutar.
espera, que veri cará la condición y seguirá durmiendo
Ventajas: si no fuera la esperada.
hacen correcto. Dicha veri cación se puede realizar me- en espera vuelva a ser ejecutado, debe garantizarse que el
diante axiomas y reglas de inferencia como, por ejemplo, invariante del monitor sigue siendo válido.
los propuestos por la Lógica de Hoare. {IM ∧ L}wait(){IM ∧ L}
Los procesos bloqueados, se desbloquean con
125.4.1 Inicialización de las variables del cond_signal o con cond_broadcast pero, esta vez,
monitor el proceso que llama a cond_signal sigue ejecutándose y
utilizando el monitor. Es decir, en éste tipo de monitores,
El código de inicialización debe incluir la asignación de señalar a otro proceso no puede provocar un cambio
las variables del monitor antes de que los procedimientos ni en las variables locales el procedimiento ni en las
del monitor puedan ser usados. La inicialización de éstas variables del monitor. * [2]
variables debe estar acorde al Invariante de representa-
ción del monitor.
{V }inicializacion{IM } 125.5 Véase también
Donde IM es el invariante del monitor.
• Semáforos
• Cierres de exclusión mutua (Locks)
125.4.2 Monitores tipo Hoare
En monitores con señales desplazantes, cond_signal y
cond_wait hacen referencia a estados visibles del progra- 125.6 Referencias
ma. cond_wait implica la cesión de la exclusión mútua
del monitor. Por lo tanto, debe veri car el Invariante del [1] Hoare, Charles Antony (octubre de 19∩4). «Monitors: An
monitor antes de que pueda ejecutarse. Operating System Structuring Concept». ACM 17: ∧49–
∧∩. Consultado el 9 de diciembre de 2012.
{IM ∧ L}wait(){C ∧ L}
[2] Capel Tuñón, Rodríguez Valenzuela (2012). Sistemas
Donde: Concurrentes y Distribuídos. Copicentro. pp. ∪9–92. ISBN
9∩∪-∪4-1∧∧3∨-∨∪-0.
• L son el invariante del conjunto de variables locales
del procedimiento.
• C es la condición de desbloqueo, que se hace cierta
tras terminar la ejecución de cond_wait.
Anexo:Motores de persistencia
• FireStorm/DAO
126.0.1 ColdFusion • Hibernate, , muy usado.
• Arf ARF - Active Record Factory • Hydrate
• CFCPowerTools Generación Batch de tu capa de • iBATIS
datos en pocos minutos.
• intelliBO de Signsoft , implementación de JDO.
• Reactor Reactor es un sencillo API para ColdFu-
sion que abstrae la base de datos al vuelo según se • Java Data Objects (JDO)
necesite.
• JDBCPersistence
• objectBreeze objectBreeze crea objetos directa-
mente desde tu capa de persistencia. • JDX
• Lychee
126.0.2 Common Lisp • OpenAccess
• CLSQL • OJB,
• cl-perec • OpenJPA,
• elephant • POEM,
• postmodern • PriDE
• submarine
• SavePoint
• SimpleORM
126.0.3 Java
• Speedo
• BuzzSQL
• TopLink de Oracle
• Carbonado
• Torque de ASF
• Castor
• WebObjects de Apple.
• Cayenne
• CocoBase PURE POJO V∧ For JPA Primera he-
rramienta ORM Java (199∩) 126.0.4 JavaScript
• CrossDB • GearsORM
24∧
24∨ CAPÍTULO 126. ANEXO:MOTORES DE PERSISTENCIA
• .netTiers • [Link]
• Business Logic Toolkit for .NET (open source) • Signum Framework (open source)
• Data Tier Modeler , reemplazado por Euss. • Wilson ORMapper for .NET
126.0.8 Python
• Axiom
• Ape , para [[Zope]
• SQLAlchemy (open source)
• SQLObject (open source)
• PyDO (open source)
• PyDO2
• MiddleKit, parte de Webware (open source)
• Modeling
• ForgetSQL (open source)
• QLime (open source)
• Storm (open source)
• The open source Django web framework
• Dejavu
• Twisted Asynchronous Database Api (open source)
• PyDAO
126.0.9 Ruby
• Active Record , parte de Ruby on Rails (open sour-
ce)
• Og part of Nitro (open source)
• Rubernate
• Lafcadio
• Sequel
• DataMapper
• Momomoto , para PostgreSQL
• Kansas
126.0.10 Smalltalk
• GLORP (open source)
126.0.11 C++
• DTL
• DataXtend CE for C++
• Object Builder
• SOCI
• StactiveRecord (open source)
Capítulo 127
• Revision estructurada
• Programación en pareja
127.2 Referencias
[1] The Pragmatic Programmer: From Journeyman to Master.
Addison Wesley. ISBN 9∩∪-0201∨1∨224. p. 9∧, footnote.
24∪
Capítulo 128
Net Yaroze
La Net Yaroze (ネットやろうぜ netto yarōze* ?) era • 1 cable de comunicación, para conectar la consola al
un kit de desarrollo de software de Sony Computer En- PC mediante tipo serie
tertainment creado en 199∩ para juegos de PlayStation.
Estaba enfocado a los desarrolladores a cionados. Yaro- • 1 guía de iniciación
ze signi ca “Vamos a hacerlo juntos”.* [1]
• 1 manual de bibliotecas
Costaba alrededor de los $∩∧0 USD. El pack incluía, ade-
más de la consola, que era idéntica a la Playstation pero • 1 guía de usuario
en negro, documentación y software. No incluía bloqueo
regional.* [2] Para usarla, el usuario necesitaba tener un A pesar de ser un kit de desarrollo para juegos de PlayS-
ordenador personal IBM, Macintosh o NEC PC-9∪01. tation, la Net Yaroze carecía de varias características
Así, el usuario, en el propio ordenador escribía el códi- que sí tenían los desarrolladores de PlayStation. No tenía
go del juego, lo compilaba y lo enviaba a la Net Yaroze hardware avanzado, software, bibliotecas, herramientas
para probarlo. varias y una amplia asistencia técnica de Sony. Además,
A pesar de no tener bloqueo regional, existían tres ver- los grupos de Usenet existentes, estaban restringidos a los
siones, la japonesa, la americana y la europea/australiana. miembros de Net Yaroze, lo que provocó que la colabo-
La principal diferencia entre ellas era que, las versiones ración entre usuarios fuese poco práctica.
europea/australiana era en modo Pal mientras que la ver- La memoria principal de la Net Yaroze era la misma que
sión japonesa y americana tenía modo NTSC. Entre la la de la PlayStation, de 2 Megabytes. Sin embargo, la Net
versión japonesa y americana, la diferencia estaba en el Yaroze tenía una memoria secundaria extra que ofrecía
idioma del manual, el software para PC japoneses, discos 1,∧ megabytes más a la consola. Así pues, contaba con
y los diferentes dibujos en las calcomanías. Extrao cial- un total de 3,∧ megabytes de memoria RAM. Esta capa-
mente, la versión japonesa es llamada DTL-3000 en lugar cidad era la que marcaba el espacio total del juego, es de-
de DTL-H3000. cir, lo que tenía que ocupar como mucho su código fuen-
La Net Yaroze estaba sólo disponible a través de pedido te, grá cos, música y bibliotecas, pues todo esto debía
por correo. No obstante, Sony, proporcionó este kit a al- de instalarse para poder ser probado. No obstante, exis-
gunas universidades del Reino Unido, Francia (Epita) y ten muchos títulos comerciales que están completamente
Japón.* [3] instalados en la RAM, a excepción del sonido, y podrían
haber sido desarrollados complemente con la Net Yaroze.
El kit europeo de la Net yaroze contenía:
Muchos títulos desarrollados por a cionados con la Net
Yaroze fueron distribuidos con la PlayStation: The O -
• 1 Net Yaroze (textura negro mate) cial Magazine en Europa desde diciembre de 199∩ hasta
• 2 controladores de PlayStation (textura negro mate) marzo de 2004. El último número o cial revista PlayS-
tation del Reino Unido, la número 10∪, presentó una re-
• Un cable de alimentación de corriente alterna (con copilación con muchos juegos de la Net Yaroze. Algunos
enchufe para Reino Unido y adaptador para Francia) títulos que salieron con la revista fueron:
249
2∧0 CAPÍTULO 128. NET YAROZE
• A dog tale
• Adventure game
• Rocksʼn'Gems
• Psychon
• Pushy II
• Clone
• Gravitation
• Mah Jongg
128.3 Referencias
[1] Absolute PlayStation, Section I. «PlayStation FAQ». Ar-
chivado desde el original el 23 de noviembre de 201∧.
Consultado el 1∧ de Junio, 2012.
Nodo (informática)
129.1 Referencias
[1] Castells, Manuel (199∩). La era de la información. Eco-
nomía, sociedad y cultura. Vol I: La sociedad red. Madrid:
Alianza Editorial. ISBN ∪4-20∨-424∩-9.
2∧1
Capítulo 130
Notación Reddick
130.1 Ejemplo
• intContador: una variable del tipo INTEGER que se
usa como un contador.
• strNombre: variable del tipo STRING que se usa pa-
ra almacenar un nombre.
2∧2
Capítulo 131
Notación húngara
En programación informática, la notación húngara es editores de código inteligente que utilicemos, la mayo-
un sistema usado normalmente para crear los nombres de ría de proyectos siempre acaban teniendo ciertas partes
variables. También se utiliza para nombrar las instancias escritas en lenguajes dinámicamente tipados, en espe-
de objetos en lenguajes de programación visuales, como cial JavaScript, el único implementado por la mayoría de
por ejemplo Delphi. El nombre de la notación proviene navegadores web para ejecutar código en cliente
del hecho de que su inventor, Charles Simonyi, nació en
Puesto que a la hora de realizar proyectos se suelen esta-
Hungría. blecer previamente unas Coding Style Guidelines (Guías
Esta convención es muy poco utilizada en las viejas ver- de estilo de programación), no conviene hacerlas distin-
siones de Delphi pero es muy utilizada por los programa- tas para cada lenguaje y se podría de nir un estándar de
dores de Microsoft y, en particular, en la programación notación húngara que tenga un ligero compromiso con
del sistema operativo Windows. la facilidad de reconocimiento de tipos, sin que llegue a
Consiste en pre jos en minúsculas que se añaden a los suponer un in erno sobre la complejidad de lectura de
nombres de las variables y que indican su tipo. El resto código.
del nombre indica, lo más claramente posible, la función
que realiza la variable. 131.2.1 Ejemplo notaciones de 1 carácter
Este ejemplo de notación húngara no parecerá tan crítico
131.1 Ejemplos y extraño como el que se ha puesto de ejemplo al principio
del artículo, en el cual se llegaban a utilizar hasta cuatro
• nContador: la variable es un entero que se usará co- letras para denotar el tipo.
mo contador.
2∧3
Capítulo 132
Null
2∧4
Capítulo 133
NWNScript
2∧∧
Capítulo 134
Objeto todopoderoso
2∧∨
Capítulo 135
Oday
2∧∩
Capítulo 136
O set (informática)
136.2 Referencias
2∧∪
Capítulo 137
OGNL
Object-Graph Navigation Language (OGNL), creado 137.3 Proyectos que usan OGNL
por OGNL Technology, es un Lenguaje de Expresiones
de código abierto para Java,el cual, mediante el uso de ex- • WebWork
presiones más simples que el amplio espectro que soporta
Java, permite obtener y establecer propiedades (a través • Struts 2 (sucesor del anterior)
de métodos ya de nidos getProperty y setProperty simila-
• Tapestry
res a los presentes en todos los JavaBeans) y la ejecución
de métodos de clases Java. • Spring Web Flow
• Apache Click
137.1 Aplicaciones • NReco (.NET integration framework for lightweight
MDD)
Algunas de las ventajas de OGNL sobre Java son:
• op4j (extensión op4j-ognl) - implementación de in-
• Las transformaciones entre tipos son más senci- terfaz uida de Java.
llas.
• MyBatis - framework de mapeo SQL
• Es un lenguaje de fuente de datos útil para mapear
• The Thymeleaf Template Engine - motor de planti-
columnas de una tabla con su TableModel en Swing.
llas Java XML/XHTML/HTML∧
• Es un sustituto del lenguaje de obtención de propie-
dades usado en el paquete BeanUtils. • Unitils - marco (framework) de testeo modular para
Java
[Link]
• Llamadas a métodos.
hashCode()
• Índices de Array.
listeners[0]
Ejemplo:
[Link]()[0].[Link]()
Se pasa a String la propiedad “name”de la que se toma
el carácter de la posición 0 y se obtiene su valor numérico
que se pasa a String nuevamente.
2∧9
Capítulo 138
OpenACS
OpenACS del inglés Open Architecture Community Sys- comenzó a reescribir ACS en Java dando lugar a Red Hat
tem (Arquitectura Abierta para Sistemas de Comunida- CMS. La comunidad de OpenACS asumió mantenimien-
des) es un kit de herramientas libre (de código abierto) to del código escrito en Tcl.
para el desarrollo rápido de aplicaciones web, con licen-
cia GPL.
138.3 Véase también
138.1 Arquitectura • Sistema de gestión de contenido (en inglés CMS:
Content Management System)
OpenACS utiliza el servidor web AOLserver y como base
de datos tanto Oracle como PostgreSQL.
OpenACS proporciona: 138.4 Enlaces externos
138.2 Historia
OpenACS era originalmente desarrollado con el ArsDi-
gita Community System, teniendo como base de datos
Oracle. ACS fue la razón por la que AOLServer fue libe-
rado. OpenACS surgió como un fork para soportar ACS
con PostgreSQL. Después RedHat compró ArsDigita y
2∨0
Capítulo 139
• Archivo informático
• Sistema de archivos
2∨1
Capítulo 140
Operador
2∨2
140.4. OTROS OPERADORES 2∨3
• A = B establece que A es igual que B. lógicos nos proporcionan un resultado a partir de que se
cumpla o no una cierta condición. Esto genera una se-
En este caso hay que distinguir en- rie de valores que, en los casos más sencillos, pueden ser
tre operador = de asignación y el parametrizados con los valores numéricos 0 y 1, como se
operador = de comparación. El pri- puede apreciar en los ejemplos de abajo. La combinación
mero toma el valor de B y se lo asig- de dos o más operadores lógicos conforma una función
na a A; el segundo solamente com- lógica.
para los valores de A y B sin mo-
di carlos y devuelve un valor lógi- • Los más sencillos son (nótese su relación con los
co o de verdad verdadero si ambos operadores relacionales):
valores son iguales o falso si dichos
valores no son iguales. • Operador NO-lógico: '¬A' signi ca todo lo
que no es A'
• A ≠ B o desigualdad. • Operador Y-lógico: 'A B' signi ca 'A y B a
la vez'; resultando FALSO (0) si no se cumple
Este caso es justamente el opues- y VERDADERO (1) si lo hace.
to al anterior, aunque aquí no po-
• Operador O-lógico: 'A B' signi ca 'O bien
demos hablar de asignación, pero si
A, o bien B, o bien los dos'; resultando FALSO
de comparación. Ahora el resulta-
(0) si no se dan ni A ni B y VERDADERO (1)
do de esta operación será F si los
si se da alguno de los dos o los dos a la vez.
valores A y B son iguales y V si son
distintos. • Operador =: 'A = B' signi ca 'A debe ser igual
a B'; resultando FALSO (0) si esto no es así y
VERDADERO (1) en caso contrario.
140.3.2 Operadores de orden • Operador <: 'A < B' signi ca 'A debe ser me-
nor que B'; resultando FALSO (0) si no se sa-
Los operadores de orden establecen o veri can clasi ca- tisface y VERDADERO (1) en caso contrario.
ciones entre números (A < B, A > B, etc.) u otro tipo de
• Operador >: 'A > B' signi ca 'A debe ser ma-
valores (caracteres, cadenas, ...).
yor que B'; resultando FALSO (0) si no se sa-
tisface y VERDADERO (1) en caso contrario.
Todo tipo de dato susceptible de
ser ordenado por cualquier crite-
rio puede ser comparado con estos • Los operadores más complejos se construyen a
operadores; como los anteriores de- partir de los anteriores (podría incluirse alguno
vuelven un valor de verdad en fun- más) y ya entran dentro de lo que sería una
ción del resultado que tenga la com- función lógica. Un ejemplo muy utilizado sería
paración en cada caso. 'SI(condición;A;B)' ('IF condición THEN A ELSE
B' en la mayoría de los lenguajes de programación)
• A > B Devuelve V si A es es-
cuyo resultado sería A si se satisface la 'condición' o
trictamente mayor que B y F
B en caso contrario.
en caso contrario
• A < B Devuelve V si A es es-
trictamente menor que B y F 140.3.4 Operaciones aritméticas
en caso contrario
• A ≥ B Devuelve V si A es ma- Las operaciones aritméticas pueden ser entendidas, des-
yor o igual que B y F en caso de un punto de vista operacional, como operadores biva-
contrario riantes o como operadores a derecha. Por ejemplo, '2 ×
• A ≤ B Devuelve V si A es me- 3' puede ser el operador bivariante de la multiplicación
nor o igual que B y F en caso actuando sobre los números 2 y 3, o el operador '2 ×' que
contrario actúa sobre 3. En este grupo se encuentran la adición, la
sustracción, multiplicación y la división.
• Otros operadores relacionales menos usuales son los Otras operaciones, derivadas de las operaciones arit-
llamados operadores geométricos: paralelismo (A || méticas usuales son la potenciación, radicación y
B), perpendicularidad y otros logaritmación.
• Operador diferencial
• Operador hermítico
• Operador cuántico
• Operador lineal
• Operador norma
• Operador nabla
• Gradiente
• Divergencia
• Rotacional
• Laplaciano
• Transformada integral
• Sumatorio
• Productorio
• Cálculo lógico
140.6 Referencias
[1] Domingo Agustín Vázquez. «Diccionario de ciencias».
Capítulo 141
Operando
141.1 En informática
En los lenguajes de programación de computadora, las
de niciones de operador y operando son casi las mismas
que las de matemáticas.
Adicionalmente, en lenguaje máquina, un operando es
un valor (un argumento) con el cual la instrucción, nom-
brada por un mnemónico, opera. El operando puede ser
un registro, una dirección de memoria, una constante lite-
ral, o una etiqueta. Un ejemplo simple en la arquitectura
PC es
MOV DS, AX
141.2.1 Matemática
• Otávio N. Cipriani; José Monserrat N.; Ila M. S. de
Souza. Construyendo un Juego Para Uso en la Edu-
cación Matemática en UFLA. Accedido el 23 de fe-
brero de 200∪.
2∨∧
Capítulo 142
Paquetes en PL/SQL
Los paquetes en PL/SQL tienen el objetivo de agru- sores... subprogramas en PLSQL END nombre_paquete
par procedimientos y funciones de forma lógica. De es-
ta manera, se consigue agrupar en un único objeto, to- Para realizar llamadas a objetos dentro de un paquete, ha-
da la casuística asociada a un determinado tipo de tarea. bría que diferenciar si la llamada es desde un subprogra-
Por ejemplo, si tenemos un conjunto de procedimientos y
ma dentro del mismo paquete o si la llamada es externa
funciones para realizar cálculos matemáticos complejos, al paquete:
los podemos poner en un paquete.
La ventaja de los paquetes es que la primera vez que se • Llamada interna
invoca, es cargado en memoria, por lo que las siguien-
tes veces ya no será necesario hacerlo de nuevo. Además, Se pone el nombre del subprograma y entre pa-
el paquete mantiene una copia en memoria para todos réntesis los parámetros que se deben pasar.
los usuarios. Otra ventaja, es que podemos encapsular Por ej. para llamar a la función “Multipli-
procedimientos y funciones que no forman parte de la in- ca(real r1, real r2)" desde la función “Cal-
terfaz de usuario. Podemos ocultar ciertos objetos y solo culaBene cios”, se pondría “r3:= Multipli-
hacer públicos los que se necesiten. También se permite ca(2.∧,3.∧)"
la sobrecarga dentro de los paquetes. El paquete se divide
en especi cación y cuerpo. • Llamada externa
2∨∨
142.2. CUERPO 2∨∩
Pascal Casing
2∨∪
Capítulo 144
Patch (Unix)
2∨9
Capítulo 145
Phrogram
Phrogram (anteriormente Kid's Programming Lan- mado el núcleo del Phrogram Team (Equipo Phrogram),
guage, or KPL) es un lenguaje de programación dise- trabajando en el producto (como extensiones llamadas
ñado para ser inteligible y fácil para los niños. La versión add-in libraries) como un programa comercial destinado
1 (KPL) fue nalizada en Agosto de 200∧, y la versión 2 a la enseñanza del software y para dar valor a Phrogram
(Phrogram) es ahora mismo la versión más actual. con respecto a lenguaje de programación.
El principal objetivo de The Phrogram Company es dis-
tribuir un simple pero poderoso grupo de herramientas
145.1 Detalles técnicos que hacen del aprender a programar algo fácil y diverti-
do. Phrogram (KPL) se ha convertido en una gran herra-
Phrogram es un lenguaje de programación y un IDE que mienta para los programadores novatos por la facilidad
guarda cierta similitud con Visual Basic. El lenguaje so- para crear programas multi-media con sprites, música,
porta un número de datos complejos, incluyendo estruc- efectos sonoros, animaciones y algunas opciones más.
turas. El objetivo secundario de Phrogram es proveer un len-
Phrogram depende de Microsoft .NET Framework y pro- guaje moderno con algunas opciones de lenguajes avan-
vee muchas funciones y métodos para interactuar con esa zados como C++, Java, Visual Basic y C#, y la sintaxis
plataforma. Por esto, Phrogram actualmente sólo puede de Visual Basic, para hacer la transición entre estos len-
usarse en la serie de sistemas operativos Microsoft Win- guajes lo más sencilla posible. Phrogram (KPL) sopor-
dows que [Link] Framework. ta programación orientada a objetos (OOP) y permite la
de nición de clases y de sus propiedades y métodos aso-
Un programa de Phrogram es una colección de bloques
ciados, los cual provee a los programadores principiantes
anidados. En el nivel mayor hay un bloque Program, y
una introducción a la programación OOP.
dentro de este, otros bloques Method y Function son de -
nidos. Las funciones y los métodos (functions y methods) Para lograr estos objetivos, los desarrolladores de Phro-
son ambos un conjunto de acciones reusables, pero exis- gram construyeron la Versión 2 sobre el reciente .NET
te una diferencia: las funciones devuleven un valor y los Framework Version 2 (Noviembre de 200∧). Phrogram
métodos no tienen esa obligación. Las estructuras (struc- intenta ser completamente compatible con otros lengua-
tures) son declaradas fuera de métodos y funciones. Las jes que [Link] Framework, por lo que esas“runtime
variables deben ser declaradas en el momento de decla- libraries”pueden ser redistribuidas donde o a quien se
ración. quiera.
2∩0
145.6. ENLACES EXTERNOS 2∩1
Plataforma de desarrollo
2∩2
Capítulo 147
∧. Herramientas del curso, como tablón de anuncios, • GÓMEZ, F (200∧) Plataformas Virtuales y Diseño
evaluaciones. De Cursos, Chile, Universidad Ponti cia Católica de
Valparaíso: Online
2∩3
2∩4 CAPÍTULO 147. PLATAFORMA VIRTUAL DIDÁCTICA
Polling
Polling en computación hace referencia a una operación 148.2 Polling del registro de Win-
de consulta constante, generalmente hacia un dispositivo
de hardware, para crear una actividad sincrónica sin el
dows
uso de interrupciones, aunque también puede suceder lo
mismo para recursos de software. En cualquier versión del sistema operativo Microsoft
Windows desde la versión 3.11 podemos encontrar apli-
Esto, aplicado a programación puede ser visto como una caciones pobremente desarrolladas que consultan repe-
pobre implementación en búsqueda del sincronismo de titivamente llaves del registro de Windows en busca de
procesos. Por ejemplo, se podría consultar constantemen- cambios, degradando el rendimiento general del sistema.
te un directorio del sistema de archivos para indicarle al En versiones antiguas este modelo de implementación era
usuario cuando lleguen nuevos contenidos a la misma sin la única alternativa, pero ahora en versiones modernas de
embargo estas constantes consultas degradarían el rendi- Windows desde NT 3.1 o Windows 9∪ en adelante exis-
miento del equipo y probablemente sería mejor imple- te la función RegNotifyChangeKeyValue* [1] dentro de
mentar la solución por otro medio, en particular, pidién- la biblioteca Advapi32, la cual forma parte de la API de
dole al sistema operativo que informe de transferencias a Windows. Esta función permite hacer una especie de“in-
ese directorio en particular. terrupción de software”la cual nos avisará ante cambios
en el contenido de una clave de registro sin tener que con-
sultarla directamente ni periódicamente.
A pesar de la función comentada anteriormente hay apli-
caciones que siguen haciendo un mal uso de los recursos
del equipo e incluso programas de Microsoft (como MSN
Desktop Search) pobremente desarrollados que producen
polling.* [2]
148.1 Historia
148.3 Soluciones para el polling
En los primeros sistemas de computación cuando una En sistemas de código abierto la solución simplemen-
aplicación necesitaba leer la pulsación de una tecla, inte- te abarca la corrección sobre el código de las funciones
rrogaba continuamente al teclado esperando hasta que la que generen el problema, empleando funciones como las
tecla fuera presionada. Debido a la ausencia de sistemas nombradas anteriormente o en su defecto las apropiadas
multitarea, mientras se esperaba una tecla, no se podían según la plataforma utilizada.
ejecutar otras tareas.
El problema se torna más interesante en aplicaciones de
La solución a este problema apareció con la llamada código cerrado, en este caso la solución generalmente está
interrupción de teclado en donde el controlador del dis- en manos de la empresa desarrolladora, sin embargo, es
positivo, en este caso el teclado, es quien genera una posible aplicar prácticas de ingeniería inversa para lograr
interrupción sólo cuando el dispositivo está listo para cambiar el comportamiento que causa el problema.
transferir datos. La CPU maneja estas interrupciones que
el sistema operativo sabe como priorizar y obtener infor-
mación de ellas.
148.4 Referencias
Estas múltiples consultas pueden referirse a uso excesivo
de recursos de red, registros o cheros, aunque también [1] RegNotifyChangeKeyValue Function (Windows)
pueden relacionarse con actividades de más bajo nivel del
equipo. [2] Mark's Blog : Polling and MSN Desktop Search
2∩∧
2∩∨ CAPÍTULO 148. POLLING
Poltergeist (informática)
149.1 Consecuencias
• Proliferación de clases.
2∩∩
Capítulo 150
Portabilidad
La portabilidad (en inglés portability) es uno de los con- 150.1 Véase también
ceptos clave en la programación de alto nivel.
Se de ne como la característica que posee un software • Interoperatividad.
para ejecutarse en diferentes plataformas, el código fuen-
te del software es capaz de reutilizarse en vez de crearse
un nuevo código cuando el software pasa de una platafor- 150.2 Referencias
ma a otra (ver la nota, a continuación de este párrafo). A
mayor portabilidad menor es la dependencia del software • Diccionario de Informática. “Portabilidad”. Pági-
con respecto a la plataforma. na 2∧4. Editorial Cultural. 1999. Madrid, España.
(Nota: la portabilidad no tiene relación directa con el có- ISBN ∪4-∪0∧∧-2∧∨-∧
digo fuente de una aplicación y, por eso, tampoco tiene
• Mooney (199∩). "Bringing Portability to the Softwa-
relación directa con la reutilización del mismo. En cam-
re Process" (PDF). West Virginia University. Dept.
bio, la portabilidad se re ere exclusivamente a la propie-
of Statistics and Computer Science. Revisado el 1∩
dad que posee un software que le permite ser ejecutado
de marzo de 200∪.
en diferentes plataformas y/o sistemas operativos. De es-
te modo, si un determinado software compilado pudie- • Garey (200∩),“Software Portability: Weighing Op-
re ser ejecutado en cualquier sistema operativo, diríamos tions, Making Choices”, The CPA Journal ∩∩(11):
que ese software es 100% portable. Éste es el núcleo del 3
concepto de portabilidad. En este sentido, la a rmación
precedente: “el código fuente del software es capaz de
reutilizarse en vez de crearse un nuevo código cuando el
software pasa de una plataforma a otra”, tiene como su-
puesto erróneo que tenemos acceso al código fuente, el
cual podría reutilizarse (como es la meta que buscan los
diseñadores de los lenguajes cuyos códigos corren sobre
máquinas virtuales, como es el caso de Java y la familia
DOT NET). Esto es incorrecto: la portabilidad es un con-
cepto que se re ere exclusivamente a la relación software
<-> plataforma).
El prerrequisito para la portabilidad es la abstracción ge-
neralizada entre la aplicación lógica y las interfaces del
sistema. Cuando un software se puede compilar en diver-
sas plataformas (x∪∨, IA∨4, amd∨4, etc.), se dice que es
multiplataforma. Esta característica es importante para
el desarrollo de reducción costos, cuando se quiere hacer
una misma aplicación.
En algunos casos el software es “independiente”de
la plataforma y puede ejecutarse en plataformas diver-
sas sin necesidad de ser compilado especí camente pa-
ra cada una de ellas, a este tipo de software se le llama
interpretado, donde un "intérprete" traduce (propiamente
interpreta) las instrucciones en tiempo de ejecución para
que sean entendidas por diferentes plataformas.
2∩∪
Capítulo 151
Postcondición
• Lógica de Hoare
• Invariantes mantenidas por condiciones
2∩9
Capítulo 152
Pragma
152.1 Programación
Los pragmas son sentencias especiales que controlan el
comportamiento del compilador, es decir son directivas
de compilador. Tienen esta forma estándar:
pragma Nombre (lista_de_argumentos);
• Efecto
• Pragmatismo
2∪0
Capítulo 153
Precondición
2∪1
Capítulo 154
154.1 Ejemplo
Ejemplo en Ada donde el proceso Cola acepta un rende-
vouz de nombre agregar:
task type Cola is entry agregar(n: in Integer); entry eli-
minar(x: out Integer); ... end Cola -- Implementación de
Cola task body Cola is begin ... accept agregar(n: in In-
teger) do ... -- Cuerpo de la operación end agregar; ...
end Cola; --LLamada desde otro proceso: begin ... Co-
[Link](n) end
2∪2
Capítulo 155
Proceso (informática)
Este artículo se re ere al proceso Un proceso se rige en pequeñas porciones, conocidas co-
informático, para otros usos véase mo páginas, y cada proceso tiene su propia tabla de pa-
Proceso. ginación, fungiendo como una optimización del sistema
operativo ante los fallos de página.
Un proceso puede informalmente entenderse como un Esta de nición varía ligeramente en el caso de sistemas
programa en ejecución. Formalmente un proceso es“Una operativos multihilo, donde un proceso consta de uno o
unidad de actividad que se caracteriza por la ejecución más hilos, la memoria de trabajo (compartida por todos
de una secuencia de instrucciones, un estado actual, y un los hilos) y la información de plani cación. Cada hilo
conjunto de recursos del sistema asociados”.* [1] consta de instrucciones y estado de ejecución.
Para entender lo que es un proceso y la diferencia entre Los procesos son creados y eliminados por el sistema
un programa y un proceso, A. S. Tanenbaum propone la operativo, así como también éste se debe hacer cargo
analogía “Un cientí co computacional con mente culi- de la comunicación entre procesos, pero lo hace a peti-
naria hornea un pastel de cumpleaños para su hija; tiene ción de otros procesos (interrupción o tiempo de reloj).
la receta para un pastel de cumpleaños y una cocina bien El mecanismo por el cual un proceso crea otro proceso
equipada con todos los ingredientes necesarios, harina, se denomina bifurcación (fork). El proceso de arranque
huevo, azúcar, leche, etcétera.”Situando cada parte de la de GNU/Linux inicia con un sólo proceso (init) y después
analogía se puede decir que la receta representa el progra- comienza a crear los hilos necesarios para tener el sistema
ma (el algoritmo), el cientí co computacional es el pro- listo para su uso. Los nuevos procesos pueden ser inde-
cesador y los ingredientes son las entradas del programa. pendientes y no compartir el espacio de memoria con el
El proceso es la actividad que consiste en que el cientí - proceso que los ha creado o ser creados en el mismo es-
co computacional vaya leyendo la receta, obteniendo los pacio de memoria.
ingredientes y horneando el pastel.
En los sistemas operativos multihilo es posible crear tan-
Cada proceso tiene su contador de programa, registros to hilos como procesos. La diferencia estriba en que un
y variables, aislados de otros procesos, incluso siendo el proceso solamente puede crear hilos para sí mismo y en
mismo programa en ejecución 2 veces. Cuando este úl- que dichos hilos comparten toda la memoria reservada
timo caso sucede, el sistema operativo usa la misma re- para el proceso.
gión de memoria de código, debido a que dicho código
Los procesos pueden ser cooperativos o independientes.
no cambiará, a menos que se ejecute una versión distinta
Dos o más procesos pueden cooperar mediante señales
del programa.
de forma que uno obliga a detenerse a los otros hasta que
Los procesos son gestionados por el sistema operativo y reciban una señal para continuar.
están formados por:
• Se usa una variable de tipo semáforo para sincroni-
• Las instrucciones de un programa destinadas a ser zar los procesos.
ejecutadas por el microprocesador. • Si un proceso está esperando una señal, se suspende
hasta que la señal se envíe.
• Su estado de ejecución en un momento dado, esto
es, los valores de los registros de la unidad central • Se mantiene una cola de procesos en espera en el
de procesamiento para dicho programa. semáforo.
• Su memoria de trabajo (memoria crítica), es decir, • La forma de elegir los procesos de la cola en espera
la memoria que ha reservado y sus contenidos. es mediante una política rst in rst out.
• Otra información que permite al sistema operativo La sincronización explícita entre procesos es un caso par-
su plani cación. ticular del estado “bloqueado”. En este caso, el suceso
2∪3
2∪4 CAPÍTULO 155. PROCESO (INFORMÁTICA)
que permite desbloquear un proceso no es una operación Salida normal, ésta se presenta cuando el proceso termi-
de entrada/salida, sino una señal generada a propósito por na de forma voluntaria, por ejemplo, cuando se cierra en
el programador desde otro proceso. navegador web o el procesador de textos.
Hay cuatro eventos principales que provocan la creación Salida por error, ésta se presenta cuando el proceso tie-
de procesos: ne que salir debido a insu ciencia de datos, por ejemplo,
cuando solicita un archivo que no existe.
• El arranque del sistema. Error fatal, éste sucede por un error en el programa, como
las divisiones entre 0 o requerimiento de memoria inac-
• La ejecución, desde un proceso, de una llamada al cesible.
sistema para la creación de otro proceso.
Eliminado por otro proceso, éste es sumamente útil cuan-
• Una petición de usuario para crear un proceso. do un proceso se queda colgado, es decir, sin terminar,
pero tampoco responde. En Unix un ejemplo es cuando
• El inicio de un trabajo por lotes. se utiliza el comando kill para terminar procesos abrup-
tamente.
Los procesos pueden contener uno o más hilos, hacien-
do más e ciente las tareas, asimismo la complejidad de
los algoritmos de sincronización, ya que podría ocurrir la
condición de carrera muy a menudo, inclusive los inde-
155.3 Estados de un proceso
seados interbloqueos.
Los estados de un proceso obedecen a su participación y
disponibilidad dentro del sistema operativo y surgen de la
155.1 Creación de un proceso necesidad de controlar la ejecución de cada proceso. Los
procesadores sólo pueden ejecutar un solo proceso a la
vez, turnándolos para el uso de éste. Existen procesos no
Básicamente hasta el día de hoy existen sólo 4 formas de apropiativos o cooperativos que básicamente ocupan todo
crear un proceso: el tiempo del procesador hasta que ellos deciden dejarlo.
Los procesos apropiativos son aquellos que ocupan por
• Arranque del sistema. un período de tiempo el procesador hasta que una inte-
rrupción o señal llega al procesador para hacer el cambio
• En la ejecución, desde un proceso, de una llamada de proceso, a esto se le conoce como cambio de contexto.
al sistema para la creación del proceso.
Los posibles estados que puede tener un proceso son eje-
• Una petición deliberada del usuario para crear un cución, bloqueado y listo:
proceso.
• El inicio de un trabajo por lotes. • Ejecución, es un proceso que está haciendo uso del
procesador.
La forma de creación de procesos en Unix es a través de • Bloqueado, No puede ejecutarse hasta que un evento
una llamada al sistema fork la cual creará un proceso hijo externo sea llevado a cabo.
en total semejanza al padre, hasta que el recién proceso
decida cambiar su imagen en memoria, incluso obtener • Listo, ha dejado disponible al procesador para que
sus propios descriptores de archivos abiertos. otro proceso pueda ocuparlo.
• Unix
• Paginación
155.6 Referencias
[1] Stallings ∧º edición pag. 109
155.7 Bibliografía
Tanenbaum, Andrew S. (2009). «2 Procesos e hilos». Sis-
temas operativos modernos (3 edición). Prentice Hall. p.
10∩∨.
Capítulo 156
El Proceso para el desarrollo de software, también de- 156.2 Actividades del desarrollo de
nominado ciclo de vida del desarrollo de software es
una estructura aplicada al desarrollo de un producto de
software
software. Hay varios modelos a seguir para el estableci-
miento de un proceso para el desarrollo de software, cada
uno de los cuales describe un enfoque diferente para di-
ferentes actividades que tienen lugar durante el proceso.
Algunos autores consideran un modelo de ciclo de vida
un término más general que un determinado proceso para
el desarrollo de software. Por ejemplo, hay varios proce-
sos de desarrollo de software especí cos que se ajustan a
un modelo de ciclo de vida de espiral.
156.1 Generalidades
La gran cantidad de organizaciones de desarrollo de soft- Actividades del proceso de desarrollo de software representados
ware implementan metodologías para el proceso de desa- en el desarrollo en cascada. Hay algunos modelos más para re-
presentar este proceso.
rrollo. Muchas de estas organizaciones pertenecen a la in-
dustria armamentística, que en los Estados Unidos nece-
sita un certi cado basado en su modelo de procesos para
poder obtener un contrato. 156.2.1 Plani cación
El estándar internacional que regula el método de selec-
ción, implementación y monitoreo del ciclo de vida del La importante tarea a la hora de crear un producto de
software es ISO 1220∩. software es obtener los requisitos o el análisis de los re-
quisitos. Los clientes suelen tener una idea más bien abs-
Durante décadas se ha perseguido la meta de encontrar
tracta del resultado nal, pero no sobre las funciones que
procesos reproducibles y predecibles que mejoren la pro-
debería cumplir el software.
ductividad y la calidad. Algunas de estas soluciones inten-
tan sistematizar o formalizar la aparentemente desorgani- Una vez que se hayan recopilado los requisitos del cliente,
zada tarea de desarrollar software. Otros aplican técnicas se debe realizar un análisis del ámbito del desarrollo. Este
de gestión de proyectos para la creación del software. Sin documento se conoce como especi cación funcional.
una gestión del proyecto, los proyectos de software co-
rren el riesgo de demorarse o consumir un presupuesto
mayor que el planeado. Dada la cantidad de proyectos 156.2.2 Implementación, pruebas y docu-
de software que no cumplen sus metas en términos de mentación
funcionalidad, costes o tiempo de entrega, una gestión de
proyectos efectiva es algo que a menudo falta. La implementación es parte del proceso en el que los
Algunas organizaciones crean un grupo propio (Software ingenieros de software programan el código para el pro-
Engineering Process Group, abreviado SEPG) encargado yecto.
de mejorar los procesos para el desarrollo de software en Las pruebas de software son parte esencial del proceso
la organización. de desarrollo del software. Esta parte del proceso tiene la
2∪∨
156.3. MODELOS DE DESARROLLO DE SOFTWARE 2∪∩
Los modelos de desarrollo de software son una represen- 3. Paradigma de Desarrollo →gil: Es un paradigma de las
tación abstracta de una manera en particular. Realmente Metodologías De Desarrollo basado en procesos ágiles.
no representa cómo se debe desarrollar el software, sino Estos intentan evitar los tediosos caminos de las meto-
de un enfoque común. Puede ser modi cado y adaptado dologías tradicionales enfocándose en las personas y los
de acuerdo a las necesidades del software en proceso de resultados. Usa un enfoque basado en el Valor para cons-
desarrollo. * [1] Hay varios modelos para per lar el pro- truir software, colaborando con el cliente e incorporando
ceso de desarrollo, cada uno de las cuales cuenta con pros los cambios continuamente.* [∧]
y contras. El proyecto debería escoger el más apropiado
para sus necesidades. En ocasiones puede que una com-
binación de varios modelos sea apropiado. Existen tres 156.3.1 Modelo de cascada
paradigmas de los modelos de desarrollo de software:
El modelo de cascada de ne las siguientes etapas que de-
1. Paradigma Tradicional: ben cumplirse de forma sucesiva:
Es uno de los paradigmas más antiguo, se inventó durante
la creación del método estructurado. Si se elige un pro- 1. Especi cación de requisitos
yecto, el método varia en etapas.* [2] Como todo modelo,
existen sus pros y contras al usar este paradigmas: 2. Diseño del software
2∪∪ CAPÍTULO 156. PROCESO PARA EL DESARROLLO DE SOFTWARE
todas las pruebas se superan sin errores, y los desa- 156.4 Modelos de mejora de proce-
rrolladores ya no sabrían como mejorar el conjun-
to de pruebas necesario. El diseño y la arquitectura
sos
emergen a partir de la refactorización del código, y
se da después de programar. El diseño lo realizan Capability Maturity Model Integration El Capability
los propios desarrolladores del código. El sistema, Maturity Model Integration (CMMI), en español
incompleto, pero funcional se despliega para su de- «Integración de Modelos de Madurez de Capaci-
mostración a los usuarios (al menos uno de los cua- dades» es uno de los modelos líderes basados en
les pertenece al equipo de desarrollo). Llegado es- mejores prácticas. Son evaluaciones independientes
te punto, los profesionales comienzan a escribir las las que con rman el grado con el que una organi-
pruebas para la siguiente parte del sistema de más zación siguen sus propios procesos, que no evalúa
importancia. la calidad de los procesos o del software que se
produce. CMMI ha reemplazado a CMM y tiene
un ámbito global, no sólo en procesos destinados al
desarrollo del software.
156.3.5 Codi cación y corrección ISO 9000 ISO 9000 describe estándares para un proce-
so organizado formalmente para resultar en un pro-
El desarrollo de codi cación y corrección (en inglés“Co- ducto y los métodos de gestión y monitoreo del pro-
de and x”) es, más que una estrategia predeterminada, greso. Aunque este estándar se creó inicialmente pa-
el resultado de una falta de experiencia o presión que se ra el sector de producción, los estándares de ISO
ejerce sobre los desarrolladores para cumplir con una fe- 9000 también se han aplicado al desarrollo del soft-
cha de entrega.* [∩] Sin dedicar tiempo de forma explícita ware. Al igual que CMMI, que una organización está
para el diseño, los programadores comienzan de forma in- certi cada con el ISO 9000 no garantiza la calidad
mediata a producir código. Antes o después comienza la del resultado nal, sólo con rma que se ha seguido
fase de pruebas de software (a menudo de forma tardía) los procesos establecidos.
y los inevitables errores que se encuentran han de elimi-
narse antes de poder entregar el software. ISO 15504 ISO 1∧∧04, también conocido como Soft-
ware Process Improvement Capability Determination
(SPICE), en español «Determinación de la Capaci-
dad de Mejora del Proceso de Software» es un mar-
co para la evaluación de procesos de software. Este
156.3.6 Orientado a la Reutilización estándar tiene como objetivo un modelo claro pa-
ra poder comparar procesos. SPICE se utiliza como
La reutilización de software es un proceso donde se recu- en el caso de CMMI. Modela procesos para gestio-
rre al uso de activos de software en las especi caciones de nar, controlar, guiar y monitorear el desarrollo del
análisis, diseños, implementación y pruebas de una apli- software. Este modelo se utiliza entonces para me-
cación o sistemas de software.* [∪] dir lo que una organización o proyecto hace durante
el desarrollo del software. Esta información se ana-
La reutilización tiene ciertos Indicadores por ejemplo: liza para identi car puntos débiles y de nir acciones
1. Entre el 40% y ∨0% de una aplicación es re-utilizable para subsanarlos. También identi ca puntos fuertes
en otra. que pueden adoptarse en el resto de la organización.
2. Aproximadamente el ∨0% de una aplicación adminis-
trativa es re-utilizable.
3. Aproximadamente el ∩∧% de las funciones son comu-
156.5 Métodos formales
nes a más de un programa.
Los métodos formales son soluciones matemáticas pa-
4. Solo el 1∧% del código encontrado en muchos sistemas ra resolver problemas de software y hardware a nivel de
es único y novedoso a una aplicación especi ca. requisitos, especi cación y diseño. Ejemplos de méto-
El rango general de uso recurrente esta entre el 1∧% y dos formales incluyen el Método B, la red de Petri, la
∪∧%.* [9] demostración automática de teoremas, RAISE y el VDM.
La reutilización tiene Principios como la existencia de Hay varias notaciones de especi caciones formales, ta-
parecidos en distintos sistemas de un mismo dominio, les como el lenguaje Z. Más generalmente, se puede uti-
donde el software puede representarse como una com- lizar la teoría de autómatas para aumentar y validar el
binación de módulos y los sistemas nuevos se puede ca- comportamiento de la aplicación diseñando un sistema
racterizar por diferencias respecto a los antiguos siste- de autómata nito.
mas.* [10] Las metodologías basadas en los autómatas nitos permi-
290 CAPÍTULO 156. PROCESO PARA EL DESARROLLO DE SOFTWARE
ten especi cación de software ejecutable y evitar la crea- [∩] McConnell, Steve. «∩: Lifecycle Planning». Rapid Deve-
ción convencional de código. lopment. Redmond, Washington: Microsoft Press. p. 140.
Los métodos formales se suelen aplicar en software de [∪] [Link] engineering with reusable compo-
aviación, especialmente si es software de seguridad críti- nents. Springer Verlag, Agosto 199∩
co. Los estándares de aseguramiento del software de se-
[9] Jonas A. Montilva, Nelson Arape y Juan Andres Colme-
guridad, tales como DO1∩∪B demandan métodos forma-
nares. (14 de noviembre de2003). «Desarrollo de softwa-
les en el nivel más alto de categorización (Nivel A).
re basado en componentes». Consultado el 2 de abril de
La formalización del desarrollo de software está ganando 2014.
en fuerza poco a poco, en otros ámbitos, con la aplica-
[10] «Ciclo de vida del Software». Archivado desde el original
ción del lenguaje de especi cación OCL2.0 (y especiali- el 2∪ de noviembre de 201∧. Consultado el 2 de abril de
zaciones tales como Java Modeling Language) y particu- 2014.
larmente con Model-driven Architecture, que permite la
ejecución de diseños, incluso especi caciones.
Otra tendencia que está surgiendo en el desarrollo de soft- 156.8 Enlaces externos
ware es la redacción de especi caciones en algún tipo de
lógica (normalmente una variación de FOL), para acto • No Silver Bullet: Essence and Accidents of Software
seguido ejecutar esa lógica como si se tratase de un pro- Engineering", 19∪∨
grama. El lenguaje OWL, basado en lógica descriptiva,
es un buen ejemplo. También se está trabajando en en- • Gerhard Fischer,“The Software Technology of the
lazar un idioma natural de forma automática con lógica, 21st Century: From Software Reuse to Collaborati-
lógica que puede ejecutarse. Ejemplo en este campo es ve Software Design”, 2001
el Attempto Controlled English, una lógica de negocios de
Internet, que no busca controlar el vocabulario o la sin- • Lydia Ash: The Web Testing Companion: The Insi-
taxis. Una características de los sistemas que apoyan el der's Guide to E cient and E ective Tests, Wiley,
vínculo bidireccional inglés-lógica y ejecución directa de May 2, 2003. ISBN 0-4∩1-43021-∪
la lógica es que pueden explicar sus resultados en inglés • [Link] ̶Software as a Service Systems
en un nivel de negocios o cientí co. Development Life Cycle Project
• Software development life cycle (SDLC) [visual
156.6 Véase también image], software development life cycle
• Ingeniería de software
• Anexo:Filosofías del desarrollo de software
• Scrum
• Metodología de desarrollo de software
• Desarrollo ágil de software
• Programación extrema
• Prototipo
• Desarrollo de software
156.7 Referencias
[1]
[2] [[Link]
[3]
[∨] [Link]
Capítulo 157
Programa informático
157.1 Programación
La programación de computadoras es el proceso iterati-
vo de escribir o editar código fuente. Dicha edición de
código fuente implica probar, analizar y perfeccionar, y,
a veces, coordinar con otros programadores, en el caso
de un programa desarrollado en conjunto. Una persona
que practica esta técnica se le conoce como programador
de computadoras, desarrollador de software, o codi ca-
Un programa informático escrito en un estilo orientado a objetos. dor. El proceso, a veces a largo plazo, de programación de
computadoras normalmente se lo conoce como desarrollo
Un programa informático o programa de computado- de software. El término ingeniería de software se está
ra es una secuencia de instrucciones, escritas para rea- convirtiendo en muy popular, ya que esta actividad es vis-
lizar una tarea especí ca en una computadora.* [1] Es- ta como una disciplina de ingeniería.
te dispositivo requiere programas para funcionar, por lo
general, ejecutando las instrucciones del programa en un
procesador central.* [2] El programa tiene un formato eje- 157.1.1 Paradigmas
cutable que la computadora puede utilizar directamen-
te para ejecutar las instrucciones. El mismo programa Los programas de ordenador se pueden clasi car según
en su formato de código fuente legible para humanos, el paradigma del lenguaje de programación utilizado pa-
del cual se derivan los programas ejecutables (por ejem- ra producirlos. Dos de los principales paradigmas son
plo, compilados), le permite a un programador estudiar y imperativos y declarativos.
desarrollar sus algoritmos. Una colección de programas Los programas escritos con un lenguaje imperativo espe-
de computadora y datos relacionados se conoce como ci can un algoritmo utilizando declaraciones, expresio-
software. nes e informes.* [4] Una declaración asocia un nombre de
Generalmente, el código fuente lo escriben profesionales variable a un tipo de datos. Por ejemplo: var x: integer; .
conocidos como programadores de computadora.* [3] Es- Una expresión produce un valor. Por ejemplo: 2 + 2 pro-
te código se escribe en un lenguaje de programación que duce 4. Por último, una declaración puede asignar una
sigue uno de los siguientes dos paradigmas: imperativo expresión a una variable o usar el valor de una variable
o declarativo, y que posteriormente puede ser converti- para alterar las estructuras de control del programa. Por
do en un archivo ejecutable (usualmente llamado un pro- ejemplo: x := 2 + 2; if x = 4 then hacer_algo(); Una crí-
grama ejecutable o un binario) por un compilador y más tica de los lenguajes imperativos es el efecto secundario
tarde ejecutado por una unidad central de procesamien- de una sentencia de asignación en una clase de variables
to. Por otra parte, los programas de computadora se pue- llamadas variables no locales.* [∧]
291
292 CAPÍTULO 157. PROGRAMA INFORMÁTICO
Los programas escritos en un lenguaje declarativo espe- representación intermedia e ciente para la ejecución fu-
ci can las propiedades que tienen o que deben cumplir- tura. BASIC, Perl y Python son ejemplos de programas de
se para la salida. No especi can detalles expresados en computadora ejecutados inmediatamente. Por otra parte,
términos de ujo de control de la máquina de ejecución los programas de computadora de Java se compilan antes
pero sí de las relaciones matemáticas entre los objetos de tiempo y se almacena como un código independien-
declarados y sus propiedades. Los lenguajes funcionales te de la máquina llamado bytecode. Entonces, dicho by-
y lógicos son dos amplias categorías de lenguajes declara- tecode es ejecutado a petición de un intérprete llamado
tivos. El principio detrás de los lenguajes funcionales (co- máquina virtual.
mo Haskell) es el de no permitir efectos secundarios, lo
La principal desventaja de los intérpretes es que los pro-
que hace que sea más fácil para razonar sobre los progra-gramas de computadora corren más lento que cuando son
mas como si se tratasen de funciones matemáticas.* [∧] El
compilados. La interpretación de código resulta más lenta
principio detrás de los lenguajes lógicos (como Prolog) es
que la ejecución de la versión compilada porque el intér-
de nir el problema a ser resuelto - la meta - y dejar la so-
prete debe decodi car cada declaración cada vez que se
lución detallada al propio sistema Prolog.* [∨] El objetivo
carga y luego realizar la acción deseada. Sin embargo, el
se de ne proporcionando la lista de sub-objetivos. Luego,desarrollo de software puede ser más rápido usando un in-
cada subobjetivo se de ne más arriba, proporcionando la térprete porque la prueba es inmediata cuando se omite el
lista de sus sub-objetivos, etc. Si la ruta de sub-objetivos
paso de la compilación. Otra desventaja de los intérpretes
no encuentra una solución, entonces ese subobjetivo se es que debe estar presente al menos uno en la computado-
retrocede y otra vía se intenta sistemáticamente. ra durante la ejecución del programa de computadora. Por
La forma en que se crea el programa puede ser textual o el contrario, los programas de computadora compilados
visual. En un programa de lenguaje visual, los elementos no necesitan compilador presente durante la ejecución.
en vez de ser textualmente especi cados son manipulados No se requieren propiedades de un lenguaje de progra-
grá camente. mación si se está compilado exclusivamente o interpre-
tándose exclusivamente. Por lo general, la clasi cación
re eja el método más popular de ejecución del lenguaje.
157.1.2 Compilado o interpretando
Por ejemplo, BASIC se considera un lenguaje interpreta-
do y C un lenguaje compilado, a pesar de la existencia de
Un programa de computadora bajo la forma de lengua-
compiladores de BASIC e intérpretes de C. Algunos sis-
je de programación de computadoras legible por un hu-
temas utilizan compilación en tiempo de ejecución (JIT)
mano, se lo llama código fuente. Dicho código fuen-
mediante la cual las secciones de la fuente se compilan
te se puede convertir en una imagen ejecutable por un
'sobre la marcha' y se almacenan para ejecuciones poste-
compilador o ejecutarse inmediatamente con la ayuda de
riores.
un intérprete.
Cualquiera de los programas compilados o interpretados
pueden ser ejecutados en un proceso por lotes sin inter- 157.1.3 Programas que se auto-modi can
vención humana, pero los programas interpretados le per-
miten al usuario escribir comandos en una sesión interac- Un programa informático en ejecución normalmente es
tiva. En este caso, los programas son los comandos sepa- tratado como algo diferente de los datos con los cuales
rados, cuya ejecución se produce secuencialmente, y por opera. Sin embargo, en algunos casos ésta distinción es
lo tanto simultáneamente. Cuando se utiliza un lenguaje ambigua, especialmente cuando un programa se modi ca
para dar órdenes a una aplicación de software (como un a sí mismo. El programa modi cado es ejecutado secuen-
shell de Unix u otra interfaz de línea de comandos), se le cialmente como parte del mismo programa. En el caso de
llama un lenguaje de scripts. programas escritos en código máquina, lenguaje ensam-
Los compiladores se utilizan para traducir el código fuen- blador, Lisp, C, COBOL, PL/1 y Prolog y JavaScript (la
te de un lenguaje de programación, ya sea en código ob- función eval), entre otros, es posible tener código que se
jeto o código máquina.* [∩] El código objeto de objeto auto-modi ca.
necesita procesamiento adicional para convertirse en có-
digo máquina, y el código máquina es el código nativo de
la unidad central de procesamiento, listo para su ejecu-
ción. Los programas de computadora compilados se co-
157.2 Ejecución y almacenamiento
nocen comúnmente como ejecutables, imágenes binarias, de los programas
o simplemente como binarios ̶una referencia al formato
de archivo binario utilizado para almacenar el código eje- Típicamente, los programas se almacenan en una
cutable. memoria no volátil (por ejemplo un disco), para que luego
Los programas de computadora ̶interpretados en un lo- el usuario de la computadora, directa o indirectamente,
te o una sesión interactiva ̶o bien se descodi can y lue- solicite su ejecución. Al momento de dicha solicitud, el
go ejecutados inmediatamente o se decodi can en alguna programa es cargado en la memoria de acceso aleatorio
157.2. EJECUCIÓN Y ALMACENAMIENTO DE LOS PROGRAMAS 293
También se puede lograr la multitarea por medio del [4] Wilson, Leslie B. (1993). Comparative Programming Lan-
hardware; las computadoras modernas que usan varios guages, Second Edition (en inglés). Addison-Wesley. p. ∩∧.
procesadores o procesadores con varios núcleos pueden ISBN 0-201-∧∨∪∪∧-3.
correr muchos programas a la vez.* [12]
[∧] Wilson, Leslie B. (1993). Comparative Programming Lan-
guages, Second Edition (en inglés). Addison-Wesley. p.
213. ISBN 0-201-∧∨∪∪∧-3.
157.3 Categorías funcionales
[∨] Wilson, Leslie B. (1993). Comparative Programming Lan-
guages, Second Edition (en inglés). Addison-Wesley. p.
Los programas se pueden categorizar aplicando criterios
244. ISBN 0-201-∧∨∪∪∧-3.
funcionales. Estas categorías funcionales son software de
sistema y software de aplicación. El software de sistema [∩] «What is a Compiler?» (en inglés). Consultado el 10 de
incluye al sistema operativo el cual acopla el hardware enero de 2012.
con el software de aplicación.* [13] El propósito del siste-
ma operativo es proveer un ambiente en el cual el softwa- [∪] Silberschatz, Abraham (1994). Operating System Con-
re de aplicación se ejecuta de una manera conveniente y cepts, Fourth Edition (en inglés). Addison-Wesley. p. 30.
*
e ciente. [13] Además del sistema operativo, el softwa- ISBN 0-201-∧04∪0-4.
re de sistema incluye programas utilitarios que ayudan a
[9] Tanenbaum, Andrew S. (1990). Structured Computer Or-
manejar y con gurar la computadora. Si un programa no
ganization, Third Edition. Prentice Hall. p. 11. ISBN 0-
es software de sistema entonces es software de aplicación. 13-∪∧4∨∨2-2. (en inglés).
El middleware también es un software de aplicación que
acopla el software de sistema con la interfaz de usuario. [10] Silberschatz, Abraham (1994). Operating System Con-
También son software de aplicación los programas utili- cepts, Fourth Edition (en inglés). Addison-Wesley. p. ∨.
tarios que ayudan a los usuarios a resolver problemas de ISBN 0-201-∧04∪0-4.
aplicaciones, como por ejemplo la necesidad de ordena-
miento. [11] Silberschatz, Abraham (1994). Operating System Con-
cepts, Fourth Edition (en inglés). Addison-Wesley. p. 100.
ISBN 0-201-∧04∪0-4.
157.4 Véase también [12] Akhter, Shameem (200∨). Multi-Core Programming (en
inglés). Richard Bowles (Intel Press). pp. 11–13. ISBN 0-
• Algoritmo para la relación entre los programas in- 9∩∨4∪32-4-∨..
formáticos y algoritmos
[13] Silberschatz, Abraham (1994). Operating System Con-
• Aplicación informática cepts, Fourth Edition (en inglés). Addison-Wesley. p. 1.
ISBN 0-201-∧04∪0-4.
• Archivo cabra para un tipo especí co de programa
informático utilizado solo para liberar y estudiar los
efectos de virus informáticos en los sistemas físicos 157.6 Bibliografía
y virtuales
[3] «Algorithms and Computer Programming» (en inglés). • De nición de “Computer Program” en dictio-
Consultado el ∪ de setiembre de 2014. [Link] (en inglés)
157.7. ENLACES EXTERNOS 29∧
Programa interactivo
Un programa interactivo aquél que necesita la • Como programa interactivo, se irán solicitando al
realimentación continúa del usuario para poder ejecutar- usuario los distintos parámetros en distintos menús.
se. Este concepto se enfrenta al de procesamiento por
lotes en el cual se le indica al programa todo lo que debe
hacer antes de empezar, con lo cual el usuario se puede
desentender de la máquina. Sin embargo esto último
requiere mayor plani cación.
158.1.1 Ventajas
158.1.2 Inconvenientes
158.2 Ejemplos
29∨
Capítulo 159
159.1 Referencias
• HILLER - LIEBERMAN. INVESTIGACIÓN DE
OPERACIONES. Mc Graw Hill Interamericana Edi-
tores S.A. OCLC 1∨∪224∪∩. Texto « edición: Sépti-
ma
» ignorado (ayuda)
29∩
Capítulo 160
Programación visual
La programación visual brinda los conocimientos nece- la programación orientada a objetos y permiten aprove-
sarios para diseñar y desarrollar aplicaciones con un en- char al máximo toda la funcionalidad que ofrecen estos
torno visual amigable y fácil de utilizar para el usuario. lenguajes para el desarrollo de aplicaciones de gestión.
Los lenguajes de programación visual tienden a facilitar
la tarea de los programadores, dado que con los primeros
lenguajes de programación crear una ventana era tarea de 160.2 Véase también
meses de desarrollo y de un equipo de trabajo.
• Diagrama de ujo
• Gambas lenguaje de programación visual libre deri-
160.1 Programación orientada a vado de Basic
objetos • Lenguaje Uni cado de Modelado
29∪
Capítulo 161
Programador
299
300 CAPÍTULO 161. PROGRAMADOR
Pseudocódigo
En ciencias de la computación, y análisis numérico, el introducción y que explica las convenciones particulares
pseudocódigo (o falso lenguaje) es una descripción de en uso. El nivel de detalle del pseudocódigo puede, en al-
alto nivel compacta e informal* [1] del principio operati- gunos casos, acercarse a la de formalizar los idiomas de
vo de un programa informático u otro algoritmo. propósito general.
Utiliza las convenciones estructurales de un lenguaje de Un programador que tiene que aplicar un algoritmo es-
programación real,* [2] pero está diseñado para la lectura pecí co, sobre todo uno desfamiliarizado, generalmente
humana en lugar de la lectura mediante máquina, y con comienza con una descripción en pseudocódigo, y luego
independencia de cualquier otro lenguaje de programa- “traduce”esa descripción en el lenguaje de programación
ción. Normalmente, el pseudocódigo omite detalles que meta y lo modi ca para que interactúe correctamente con
no son esenciales para la comprensión humana del algorit- el resto del programa. Los programadores también pue-
mo, tales como declaraciones de variables, código especí- den iniciar un proyecto describiendo la forma del código
co del sistema y algunas subrutinas. El lenguaje de pro- en pseudocódigo en el papel antes de escribirlo en su len-
gramación se complementa, donde sea conveniente, con guaje de programación, como ocurre en la estructuración
descripciones detalladas en lenguaje natural, o con nota- de un enfoque de Top-down y Bottom-up arriba hacia
ción matemática compacta. Se utiliza pseudocódigo pues abajo.
este es más fácil de entender para las personas que el có-
digo del lenguaje de programación convencional, ya que
es una descripción e ciente y con un entorno indepen-
diente de los principios fundamentales de un algoritmo.
Se utiliza comúnmente en los libros de texto y publica-
ciones cientí cas que se documentan varios algoritmos, 162.2 Sintaxis
y también en la plani cación del desarrollo de programas
informáticos, para esbozar la estructura del programa an-
tes de realizar la efectiva codi cación. En la actualidad y por lo general, el pseudocódigo, como
su nombre lo indica, no obedece a las reglas de sintaxis de
No existe una sintaxis estándar para el pseudocódigo,
ningún idioma en particular ni es de forma estándar sis-
aunque los ocho IDE's que manejan pseudocódigo tengan
temática, a pesar de que cualquier escritor en particular
su sintaxis propia. Aunque sea parecido, el pseudocódi-
vaya a pedir prestado las estructuras de control general,
go no debe confundirse con los programas esqueleto que
la sintaxis y el estilo, por ejemplo, de algún lenguaje de
incluyen código cticio, que pueden ser compilados sin
programación convencional. Pero en caso de que se quie-
errores. Los diagramas de ujo y UML pueden ser con-
ra ejecutar, se debe llevar a forma tipo, para que no genere
siderados como una alternativa grá ca al pseudocódigo,
mensajes de error. Las fuentes populares incluyen la sin-
aunque sean más amplios en papel.
taxis de Pascal, BASIC, C, C++, Java, Lisp, y ALGOL.
Por lo general, se omiten las declaraciones de variables.
A veces, las llamadas a funciones, los bloques de código
162.1 Aplicaciones y el código contenido dentro de un loop se remplazan por
una sentencia de una línea en lenguaje natural.
Generalmente se utiliza pseudocódigo en los libros de Dependiendo del escritor, el pseudocódigo puede variar
texto y publicaciones cientí cas relacionadas con la in- mucho en su estilo, yendo desde en un extremo, una imi-
formática y la computación numérica, para la descripción tación casi exacta de un lenguaje de programación real,
de algoritmos, de manera que todos los programadores hasta al acercarse a una descripción en prosa de formato
puedan entenderlo, aunque no todos conozcan el mismo de pseudocódigo en el otro extremo.
lenguaje de programación. Generalmente, en los libros Este es un ejemplo de pseudocódigo (para el juego mate-
de texto se adjunta una explicación que acompaña a la mático bizz buzz):
301
302 CAPÍTULO 162. PSEUDOCÓDIGO
• asigne a x el valor de y
La instrucción alternativa realiza una instrucción de dos También es común el uso de una selección múltiple que
posibles, según el cumplimiento de una condición. equivaldría a anidar varias funciones de selección.
La condición es una variable booleana o una función re- En este caso hay una serie de condiciones que tienen que
ducible a booleana (lógica, Verdadero/Falso). Si esta con- ser mutuamente excluyentes, si una de ellas se cumple las
dición es cierta se ejecuta Instrucciones1 , si no es así, en- demás tienen que ser falsas necesariamente, hay un caso
tonces se ejecuta Instrucciones2 . si no que será cierto cuando las demás condiciones sean
162.6. DESARROLLO DE ALGORITMOS 303
Una construcción similar a la anterior (equivalente en al- Una estructura de control muy común es el ciclo para,
gunos casos) es la que se muestra a continuación. la cual se usa cuando se desea iterar un número conoci-
do de veces, empleando como índice una variable que se
En este caso hay un Indicador es una variable o una fun-
incrementa (o decrementa): Plantilla:Definiciones
ción cuyo valor es comparado en cada caso con los va-
lores "Valorᵢ", si en algún caso coinciden ambos valores, la cual se de ne como:
entonces se ejecutarán las Instruccionesᵢ correspondien-
tes. La sección en otro caso es análoga a la sección si no
del ejemplo anterior. Bucle para cada
El bucle se repite mientras la condición sea cierta, si al Sin embargo, en la práctica existen mejores formas de
llegar por primera vez al bucle mientras la condición es implementar esta instrucción dependiendo del problema.
falsa, el cuerpo del bucle no se ejecuta ninguna vez. Es importante recalcar que el pseudocódigo no es un len-
guaje estandarizado. Eso signi ca que diferentes autores
podrían dar otras estructuras de control o bien usar estas
mismas estructuras, pero con una notación diferente. Sin
embargo, las funciones matemáticas y lógicas toman el
signi cado usual que tienen en matemática y lógica, con
las mismas expresiones.
162.5.4 El anidamiento
Bucle repetir
162.6 Desarrollo de algoritmos
Existen otras variantes que se derivan a partir de la an-
terior. La estructura de control repetir se utiliza cuando Con este pseudocódigo se puede desarrollar cualquier al-
es necesario que el cuerpo del bucle se ejecuten al menos goritmo que:
una vez y hasta que se cumpla la condición:
La estructura anterior equivaldría a escribir: • Tenga un único punto de inicio.
304 CAPÍTULO 162. PSEUDOCÓDIGO
1. Ocupan mucho menos espacio en el desarrollo del ∧. Edebé, ed. (∪ de 1993). Pseudocódigos y programa-
problema. ción estructurada (1 edición). ISBN 9∩∪-∪4-23∨-312∨-
1.
2. Permite representar de forma fácil operaciones re-
petitivas complejas.
3. Es más sencilla la tarea de pasar de pseudocódigo a 162.12 Véase también
un lenguaje de programación formal.
4. Si se siguen las reglas de identación se puede obser-
var claramente los niveles en la estructura del pro-
grama.
∧. En los procesos de aprendizaje de los alumnos de
programación, éstos están más cerca del paso si-
guiente (codi cación en un lenguaje determinado,
que los que se inician en esto con la modalidad Dia-
gramas de Flujo).
∨. Mejora la claridad de la solución de un problema.
Capítulo 163
Puente de aplicación
30∧
Capítulo 164
Puntero inteligente
30∨
164.2. ENLACES EXTERNOS 30∩
n << endl; }; void lanzar(const char * msg){ cout << "* boost::shared_ptr<Observado> fan; Mirador(){ cout <<
Elemento " << n << " says: " << msg << endl; }; virtual tab() << "+ Creando Mirador”<< endl; } ~Mirador(){
~Elemento(){ cout << "* So Long, Elemento " << n << cout << tab() << "- Borrando Mirador”<< endl; } }; /*
endl; }; }; int Elemento::counter = 0; int main(int argc, La función popular rellena el atributo del Mirador con
char *argv[]) { /* Utilizamos corchetes para abrir un un shared pointer a Observado. */ void popular(Mirador
nuevo entorno (scope) Vemos que al terminar el scope, el & m1, Mirador & m2){ boost::shared_ptr<Observado>
scoped pointer se libera automáticamente, mientras que O(new Observado); [Link] = O; [Link] = O; } int
en el caso del puntero clásico, si no liberamos manulmen- main(int argc, char *argv[]) { tabulados = 0; cout <<
te se produciría una fuga de memoria. */ cout <<“Inicio "-- Inicio”<< endl; { tabulados ++; cout << tab() <<
del scope”<< endl; { boost::scoped_ptr<Elemento> "-- Inicio del primer scope”<< endl; Mirador M1; {
miElemento(new Elemento()); miElemento -> lanzar( tabulados ++; cout << tab() << "-- Inicio del segundo
“Mensaje desde myFun_1”); Elemento * classic- scope”<< endl; Mirador M2; popular(M1, M2); cout <<
Pointer = new Elemento(); classicPointer -> lanzar ( tab() << "-- Fin del segundo scope”<< endl; } tabulados
“Mensaje del elemento con puntero clásico”); delete --; cout << tab() << "-- Final del primer scope”<< endl;
classicPointer; // Necesario borrarlo manualmente! } } tabulados--; cout << "-- Fin”<< endl; return 0; }
cout << “Fin del scope”<< endl; /* Si tenemos un
scoped pointer como atributo de una clase, o como
variable suelta, es posible asignarle un valor utilizando
el método reset, que borrará lo que estuviera contenido 164.2 Enlaces externos
en el puntero previamente. */ boost::scoped_ptr<string>
ptrCadena; [Link](new string(“Hola”)); /*
• Capítulo de muestra "Smart Pointers" del libro
Los operadores habituales se conservan. En el caso del
Modern C++ Design: Generic Programming and
*, se devuelve una referencia &. Para acceder al puntero
Design Patterns Applied por Andrei Alexandrescu,
en bruto se utiliza el método get(), aunque NO SE RE-
Addison-Wesley, 2001.
COMIENDA, ya que hacer modi caciones o borrar el
objeto apuntado a través de get() puede producir errores. • Código de ejemplo "[Link]" del libro The
*/ cout << “Longitud de cadena: " << ptrCadena -> C++ Standard Library - A Tutorial and Reference
length() << endl; cout << *ptrCadena << endl; return 0; } por Nicolai M. Josuttis
• Artículo "Smart Pointers in Boost"
Un shared pointer es un tipo de puntero inteligente que • "Smart Pointers - What, Why, Which?" por Yonat
guarda un contador de referencias al objeto al que apunta. Sharon
Cada vez que se hace una copia del puntero, se aumenta el • "Smart Pointers Overview" por John M. Dlugosz
contador. Cuando se destruye uno de los shared pointer,
el contador disminuye. • YASPER library otra implementación de punteros
inteligentes en C++
Cuando el contador llega a cero, quiere decir que no hay
más punteros apuntando al objeto, por lo que este puede • Smart Pointers en Delphi
destruirse y liberar la memoria que ocupa. Todo esto se
hace de forma transparente al usuario.
Sintaxis:
boost::shared_ptr<MiClase> MiPuntero (new MiCla-
se(1)); boost::shared_ptr<MiClase> OtroPuntero =
MiPuntero; [Link](new MiClase(2));
Ejemplo:
#include <iostream> #include <string> using namespace
std; int tabulados; #include <boost/shared_ptr.hpp>
/* Tenemos dos clases. La clase Mirador tiene un
shared pointer a Observado. */ string tab(){ return
string(tabulados, '\t'); } struct Observado{ Obser-
vado(){ cout << tab() << "+ Creando Observado”
<< endl; } ~Observado(){ cout << tab() << "- Bo-
rrando Observado”<< endl; } }; struct Mirador{
Capítulo 165
Pure data
30∪
165.2. OBJETOS MÁS IMPORTANTES 309
Oscilador.
Test audio/MIDI.
Objeto de PDP que te crea una cuadrícula que divide la imagen.
QuadTIN
313
Capítulo 167
Query string
Query string, en español: cadena de consulta, este tér- el valor se obtiene trás aplicar una separación de la query
mino generalmente se utiliza para hacer referencia a una string mediante el símbolo /. De ésta forma se puede tra-
interacción con una base de datos. Es la parte de una URL bajar con Friendly Urls siguiendo las recomendaciones
que contiene los datos que deben pasar a aplicaciones web de los principales motores de búsqueda, sin necesidad de
como los programas CGI. crear una estructura de directorios en el servidor. Una
gran cantidad de sitios web utilizan esta forma de inter-
En los comienzos de la web las direcciones de las páginas
contenían la estructura jerárquica de los directorios del pretación de la query string.
sitio. Por ejemplo:
[Link]/paginaprincipal/ 167.1 Véase también
paginasecundaria/[Link]
• Página web
Estos sitios eran estáticos: a menos que el administrador
modi que las páginas siempre mostrarían el mismo con- • Web 2.0
tenido a los visitantes.
• HTML dinámico
Más tarde aparecieron los sitios dinámicos. En este ca-
so, el servidor crea automáticamente la página cuando el
navegante la solicita. Para ello se vale de una serie de pa-
rámetros o datos que se incluyen en la URL. Éstos nor-
malmente están compuestos por un nombre y un valor
separados por el signo igual. Un ejemplo de dirección di-
námica sería:
[Link]/[Link]?nombredevalor1=
valor1&nombredevalor2=valor2
314
Capítulo 168
Quest3D
31∧
31∨ CAPÍTULO 168. QUEST3D
• 32 MB de memoria grá ca
168.3 Licencias
Se pueden adquirir diferentes licencias para el uso tanto
comercial como educacional.
168.4 Aplicaciones
Realidad virtual, Videojuegos, visualización arquitectó-
nica, “serious games”, simuladores, TV y cine.
168.5 Referencias
• [Link] Quest3D speci cations
Quine (programa)
169.1 Ejemplos
169.1.4 Common Lisp
169.1.1 C (funcall (lambda (x) (append x (list (list 'quote x)))))
'(funcall (lambda (x) (append x (list (list 'quote x))))))
#include<stdio.h> char*i="\\#include<stdio.h>",n='\n',q='"',*p=
"%s%cchar*i=%c%c%s%c,n='%cn',q='%c',*p=%c%c%s%c,*m=%c%c%s%c%c;%s%c”
,*m=“int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}"
169.1.5 Ocaml
;int main(){return!printf(p,i+1,n,q,*i,i,q,*i,q,n,q,p,q,n,q,m,q,n,m,n);}
(fun s -> [Link] "%s %S”s s) "(fun s -> [Link]
Otro (este debe ser una sola línea, y supone que el compi- \"%s %S\" s s)"
lador ejecuta en una máquina que usa el código ASCII):
extern printf(char*,...);main(){char*a="extern 169.1.6 Python
printf(char*,...); main(){char*a=%c%s%c;printf(a,34,a,34,10);}%c";printf(a,34,a,34,10);}
a='a=%s;print a%%`a`';print a%`a`
O aún más corto (aunque no es código C99 de ISO co-
rrecto): Otro:
main(){char*a="main(){char*a=%c%s%c;printf(a,34,a,34);}";printf(a,34,a,34);}
b='\\';g='"';p='%';s="b='%s%s';g='%s';p='%s';s=%s%s%s;print
s%s(b,b,g,p,g,s,g,p)";print s%(b,b,g,p,g,s,g,p)
31∩
31∪ CAPÍTULO 169. QUINE (PROGRAMA)
Nota: Debe ser una sola línea. Los cortes de línea se agre-
unescape(q="unescape(q=%22*%22).replace('*',q)").replace('*',q)
garon para hacerlo más fácil de leer.
->+>+++>>+>++>+>+++>>+>++>>>+>+>+>++>+>>>>+++>+>>++>+
169.1.8 Perl +>>>>+++>+>>>>++>++>>>>+>>++>+>+++>>>++>>++++++>>+>>+
>>>++>>++>>+>>++>+>+++>>>++>>+++++++++++++>>+>>++>+>+
$_=q{$_=q{Q};s/Q/$_/;print};s/Q/$_/;print ++>+>>>>+++>>+++++>>>>++>>>>+>+>++>>+++>+>>>>+++>+>>>
++>+>++>++>>>>>>++>+>+++>>>>>+++>>>++>+>+++>+>+>++>>>
+>>>+>>++>+>++++++++++++++++++>>>>+>+>>>+>>++>+>+++>>
El más corto conocido: >>+++>>++++++>>>+>++>>+++>+>+>++>+>+++>>>>>+++>>>+>+>
open+0;print<0> >>+>>++>+>>>>+++>>++++>>+>+++>>>>>>++>+>+++>>+>++>>>>
[[->>+<<]]<+]+++++[-
>+++++++++<]>.[+]>>[<<+++++++[-
Y una combinación de Perl y script de shell:
>+++++++++<]>- .------------------->-[-
perl -le '$n=q{perl -le <.<+>>]<[+]<+>>>]<<<[-[-[-[>>+<++++++[-
a$n=q{$x};($_=$n)=~s/\141/\4∩/g;s/\$x/$n/;printa};($_=$n)=~s/\141/\4∩/g;s/\$x/$n/;print'
>+++++<]]>++++ ++++++++++<]>+++<]++++++[-
>+++++++<]>+<<<-[->>>++<<<]>[->>.<<]<<]
10 LIST Q
169.1.16 PostScript
(dup == {dup cvx exec} pop ∪ 12 getinterval =) dup cvx
exec
Rebanamiento estático
170.1 Ejemplo
int i; int suma = 0; int producto = 1; for(i = 0; i < N;
++i) { suma = suma + i; producto = producto * i; }
write(suma); write(producto);
• CMM
320
Capítulo 171
Recolector de basura
321
322 CAPÍTULO 171. RECOLECTOR DE BASURA
Recursión
323
324 CAPÍTULO 172. RECURSIÓN
172.1.2 Funciones de nidas de forma re- b) Se reemplaza an por r , an−1 por r y an−2 por 1
2
Refactorización
La refactorización (del inglés refactoring) es una téc- nombre de una variable para que sea más signi cativo,
nica de la ingeniería de software para reestructurar un como una sola letra 't' a 'tiempo'. Una refactorización
código fuente, alterando su estructura interna sin cambiar más compleja es transformar el trozo dentro de un blo-
su comportamiento externo. que en una subrutina. Una refactorización todavía más
compleja es remplazar una sentencia condicional if por
polimor smo.
173.1 Refactorización de código Aunque la limpieza de código se lleva realizando desde
hace décadas, el factor clave de la refactorización es rea-
lizar de manera intencionada la limpieza separándola de
En ingeniería del software, el término refactorización se
la adición de funcionalidad nueva, usando un catálogo co-
usa a menudo para describir la modi cación del código
nocido de métodos útiles de refactorización, para después
fuente sin cambiar su comportamiento, lo que se conoce
comprobar el código ejecutando las pruebas unitarias, sa-
informalmente por limpiar el código. La refactorización
biendo que cualquier cambio en el comportamiento sig-
se realiza a menudo como parte del proceso de desarrollo
ni ca que se ha introducido un error.
del software: los desarrolladores alternan la inserción de
nuevas funcionalidades y casos de prueba con la refacto- La refactorización es un aspecto importante de la
rización del código para mejorar su consistencia interna programación extrema.
y su claridad. Los tests aseguran que la refactorización no El libro de Martin Fowler Refactoring es la referencia clá-
cambia el comportamiento del código. sica. Aunque la refactorización de código se ha llevado a
La refactorización es la parte del mantenimiento del có- cabo de manera informal durante años, la tesis doctoral
digo que no arregla errores ni añade funcionalidad. El ob- de William F. Opdyke (1993) es el primer trabajo co-
jetivo, por el contrario, es mejorar la facilidad de com- nocido que examina especí camente esta técnica. Todos
prensión del código o cambiar su estructura y diseño y estos recursos proporcionan un catálogo de métodos ha-
eliminar código muerto, para facilitar el mantenimiento bituales de refactorización. Un método de refactorización
en el futuro. Añadir nuevo comportamiento a un progra- tiene una descripción de cómo aplicar el método e indi-
ma puede ser difícil con la estructura dada del programa, caciones sobre cuándo debería (o no debería) aplicarse.
así que un desarrollador puede refactorizarlo primero pa- La refactorización es un concepto tan importante que ha
ra facilitar esta tarea y luego añadir el nuevo comporta- sido identi cado por David A. Wheeler como «una de
miento. las más importantes innovaciones en el campo del soft-
El término se creó como analogía con la factorización de ware».* [1]
números y polinomios. Por ejemplo, x2 −1 puede ser fac-
torizado como (x + 1)(x − 1) , revelando una estructura
interna que no era visible previamente (como las dos raí-
ces en −1 y +1). De manera similar, en la refactorización
173.2 Refactorización de otros tex-
del software, el cambio en la estructura visible puede fre- tos
cuentemente revelar la estructura interna “oculta”del
código original. El término refactorización se originó en el ámbito de la
La refactorización debe ser realizada como un paso sepa- programación de ordenadores, pero el concepto se ha
rado, para poder comprobar con mayor facilidad que no aplicado a la modi cación de cualquier texto.
se han introducido errores al llevarla a cabo. Al nal deEn los sitios Wiki, la refactorización se re ere al proceso
la refactorización, cualquier cambio en el comportamien-de reescribir y reorganizar el texto para abreviarlo preser-
to es claramente un bug y puede ser arreglado de manera vando su contenido. Se aplica en especial en las discusio-
separada a la depuración de la nueva funcionalidad. nes, que de esta manera pueden ser hechas accesibles para
Un ejemplo de una refactorización trivial es cambiar el personas que están interesadas en los argumentos ofreci-
32∨
173.5. ENLACES EXTERNOS 32∩
173.3 Etimología
El primer uso conocido del término refactorización en
la literatura publicada se encuentra en el artículo Re-
factoring: An Aid in Designing Application Frameworks
and Evolving Object-Oriented Systems, Proceedings of the
Symposium on Object Oriented Programming Emphasi-
zing Practical Applications (SOOPPA) September, 1990,
ACM por William F. Opdyke y Ralph E. Johnson.* [2] La
tesis doctoral de William Opdyke titulada “Refactoring
Object-Oriented Framework”(Universidad de Illinois) se
publicó en 1992.* [3] Tanto el término refactorización co-
mo la técnica que de ne se usaban ya con toda seguridad
antes.
173.4 Referencias
[1]
[2]
[3]
Re exión (informática)
174.1 Implementación
Un lenguaje con re exión proporciona un conjunto de ca-
racterísticas disponibles en tiempo de ejecución que, de
otro modo, serían muy difícilmente realizables en un len-
guaje de más bajo nivel. Algunas de estas características
son las habilidades para:
32∪
Capítulo 175
329
Capítulo 176
La resolución de un problema mediante un ordenador periencia del experto del dominio para entender el proble-
consiste en el proceso que a partir de la descripción de un ma. Al nal, si se quiere llegar a una solución satisfactoria
problema, expresado habitualmente en lenguaje natural y es necesario que:
en términos propios del dominio del problema, permite
desarrollar un programa que resuelva dicho problema.
• El problema esté bien de nido con el máximo de-
Este proceso exige los siguientes pasos: talle
• Análisis del problema. • Las especi caciones de las entradas y salidas del
problema, deben ser descritas también en deta-
• Diseño o desarrollo de un algoritmo. lle:
• Transformación del algoritmo en un programa (co- • ←Qué datos son necesarios para resolver el pro-
di cación). blema?
• Ejecución y validación del programa. • ←Qué información debe proporcionar la reso-
lución del problema?
Los dos primeros pasos son los más difíciles del proceso.
Una vez analizado el problema y obtenido un algoritmo
que lo resuelva, su transformación a un programa de or-
denador es una tarea de mera traducción al lenguaje de
176.2 Diseño del algoritmo
programación deseado.
Un algoritmo consiste en una especi cación clara y con-
cisa de los pasos necesarios para resolver un determinado
problema, pero para poder diseñar algoritmos es necesa-
176.1 Análisis del problema infor- rio disponer de una notación, que llamaremosʻnotación
mático algorítmicaʼ, que permita:
Cuando un usuario plantea a un programador un proble- • Describir las operaciones puestas en juego (accio-
ma que resolver mediante su ordenador, por lo general nes, instrucciones, comandos,...)
ese usuario tendrá conocimientos más o menos amplios
sobre el dominio del problema, pero no es habitual que • Describir los objetos manipulados por el algoritmo
tenga conocimientos de informática. Por ejemplo, un con- (datos/informaciones)
table que necesita un programa para llevar la contabilidad
de una empresa será un experto en contabilidad (domi- • Controlar la realización de las acciones descritas, in-
nio del problema), pero no tiene por qué ser experto en dicando la forma en que estas se organizan en el
programación. tiempo
Del mismo modo, el informático que va a resolver un de-
terminado problema puede ser un experto programador, Para poder describir cualquier tipo de acción de las que
pero en principio no tiene por qué conocer el dominio intervienen en un algoritmo, diversos autores proponen el
del problema; siguiendo el ejemplo anterior, el informá- uso de un conjunto de construcciones lógicas (secuencia,
tico que hace un programa no tiene por qué ser un expertodecisión e iteración) con las que es posible escribir cual-
en contabilidad. quier programa. Lo que sigue a continuación es la des-
Por ello, al abordar un problema que se quiere resolver cripción de las diferentes construcciones disponibles para
mediante un ordenador, el programador necesita de la ex- el diseño de algoritmos.
330
176.2. DISEÑO DEL ALGORITMO 331
Se entiende por acciones elementales aquellas que el or- También es posible que a la hora de especi car la eje-
denador es capaz de realizar y que serán de dos tipos: cución de una acción haya que escoger ésta entre varias
dependiendo del valor de una determinada variable (o in-
dicador). Este caso se expresa del siguiente modo:
• Aritmético – lógicas: Operaciones que, a partir de
unos determinados datos, realizan un cálculo arit- Según Indicador Hacer Caso Valor 1: Acción 1; Caso
mético (suma, resta, multiplicación,...) o un cálculo Valor 2: Acción 2; ... Caso Valor n: Acción n; [De Otro
lógico (mayor que, menor que, igual que,...).Las pri- Modo: Acción X;] FinSegun
meras devuelven un valor numérico (4, −∧.∨∩,...) y En esta construcción Indicador debe tener un determi-
las segundas un valor lógico (verdadero o falso). nado valor que en caso de coincidir con alguno de los
n valores provocará la ejecución de la acción asociada a
• De entrada – salida: Acciones que permiten cap- dicho valor. Si el valor del Indicador no coincidiera con
turar datos para su posterior tratamiento (las de en- ninguno de los especi cados se ejecutará la Acción X. No
trada) y guardar los resultados de dicho tratamiento tiene por qué haber una Acción X para cuando el Indi-
(las de salida). cador' no coincida con ninguno de los n valores; en ese
caso, si el Indicador' no coincide con ningún valor no se
ejecutaría ninguna acción.
176.2.2 Secuencia de acciones elementales Al igual que en los casos anteriores, todas las acciones que
aparecen en esta estructura (Acción 1, Acción 2,..., Acción
Cuando en un algoritmo se deben ejecutar varias accio- n y Acción X) pueden referirse a una única acción o a un
nes sucesivamente, éstas se describen una detrás de otra conjunto de ellas.
según el orden en que deban ejecutarse. Si se desea se
puede emplear algún tipo de símbolo para separar dos ac-
ciones consecutivas. En el siguiente ejemplo se muestra 176.2.6 Composición iterativa o bucle
la descripción de n acciones separadas por punto y coma
(símbolo que habitualmente se emplea como separador). Cuando una acción o conjunto de acciones debe ejecu-
tarse varias veces se recurre a una estructura iterativa o
Acción 1; Acción 2; ... Acción n; bucle. En este tipo de estructuras se necesita una condi-
ción que determine cuando terminan las iteraciones. De-
pendiendo de si esa condición se evalúa al principio o al
176.2.3 Composición condicional nal de la estructura y de si la condición para que las ite-
raciones continúen debe ser verdadera o falsa, se pueden
Cuando en un algoritmo se quiere indicar que cierta ac- de nir cuatro construcciones iterativas distintas:
ción solo se debe ejecutar bajo cierta condición se indica Sobre las cuatro construcciones que se acaban de presen-
del siguiente modo: tar cabe hacer las siguientes observaciones:
Si Condición Entonces Acción; FinSi
• Si en las estructuras 1 y 2, cuando se evalúa laʻCon-
Solo si la Condición (operación lógica) es verdadera se diciónʼ, ésta toma por primera vez un valor tal que
ejecutará la Acción. En este caso, la Acción puede refe- no permita ejecutar laʻAcciónʼ(FALSO en la 1 y
rirse tanto a una acción elemental como a un conjunto de VERDADERO en la 2), ésta no se ejecutará ningu-
ellas. na vez. Es decir, puede ocurrir que la ʻAcciónʼ,
en las estructuras 1 y 2, no se ejecute nunca.
• En las estructuras 3 y 4, al estar laʻCondiciónʼde
176.2.4 Composición condicional doble
terminación al nal, laʻAcciónʼse ejecutará antes
(alternativa) de que la condición se evalúe por primera vez, por
lo que aunque laʻCondiciónʼtome un valor tal que
En ocasiones, se deben ejecutar unas acciones u otras de- no se permita realizar más iteraciones, la ʻAcciónʼ
pendiendo de la ocurrencia de una determinada condi- se ejecutará al menos una vez.
ción. Esta especi cación se realiza del siguiente modo:
• Si las ʻCondicionesʼde las estructuras 1 y 2 son
Si Condición Entonces Acción A; SiNo Acción B; FinSi complementarias, es decir, que siempre que una es
Dependiendo de si la Condición es verdadera o falsa se verdadera la otra es falsa y viceversa (ejemplo: [a
ejecutará la Acción A o la Acción B respectivamente. De > b] y [a ≤ b] son condiciones complementarias),
forma análoga a como ocurría en el caso anterior, tanto la entonces ambas estructuras son equivalentes ya que
Acción A como la Acción B pueden referirse a una acción en ambas laʻAcciónʼse ejecutará el mismo número
elemental o a un conjunto de ellas. de veces.
332 CAPÍTULO 176. RESOLUCIÓN DE PROBLEMAS DE PROGRAMACIÓN
• Programación
• Pseudocódigo
• Diagrama de ujo
• Estructuras de control
• Bucle (programación)
• Bucle for
• Bucle while
• Bucle repetir
• Bucle in nito
• Programación estructurada
• Lenguaje de programación
• Resolución de problemas
Capítulo 177
Instancia (programación)
En el paradigma de la orientación a objetos, una instan- se (puede hacerlo para permitir ejecuciones concurren-
cia se re ere a una realización especí ca de una clase o tes de distintas versiones de una clase)* [Nota 1] entonces
prototipo determinados. las clases serán representadas utilizando un Singleton. En
En general, cuando se ejecuta un programa en un compu- Java, por ejemplo, si tenemos una clase de nida como:
tador, se dice que éste se instancia. En lenguajes que crean public class Perro {}
objetos a partir de clases, un objeto es una instancia de
una clase. Esto es, es un miembro de una clase que tiene Podremos acceder a la instancia que representa la clase
atributos en lugar de variables. En un contexto del mundo (y es una instancia de la clase [Link]<Perro>), en
real, podríamos pensar en “Perro”como una clase y en un programa principal de clase Main, del siguiente modo:
un perro conreto en una instancia de esta clase.* [1]
public class Main { public static void main(String...
args) { Class<?> perroClass = [Link]; Sys-
[Link](perroClass); } }
177.1 Programación basada en cla-
ses
En este apartado hablaremos de la programación orienta-
da a objetos basada en clases, que es la que implementa la
mayoría de lenguajes de programación orientados a ob-
jetos. En el modelo basado en prototipos, que es el de
lenguajes como JavaScript, los términos que se re eren a 177.2 Programación basada en
clases han de sustituirse por los prototipos de los objetos, prototipos
pero por lo demás, son de aplicación similar.
En este modelo, un objeto tiene una referencia a la clase a
la que pertenece y, por tanto, puede llamar a los métodos En el estilo de programación orientada a objetos basada
de instancia que hayan sido declarados como de instancia, en prototipos las instancias son los objetos creados a partir
así como a todos aquellos que hayan sido heredados por de los prototipos. En general, los prototipos también son
la jerarquía de herencia estática entre clases. objetos creados a partir de otros prototipos, con lo que
las propiedades y métodos se heredan en la profundidad
Ciertos lenguajes de programación permiten utilizar cla-
completa del árbol de herencia de prototipado.
ses mixin, que permiten además realizar asociaciones en-
tre instancias de objetos para establecer relaciones simi- En el caso particular de JavaScript, aunque no se puede
lares a la herencia en tiempo de ejecución. cambiar el prototipo de un objeto una vez instanciado, sí
se pueden cambiar las propiedades y métodos que tiene
el prototipo, afectando a todas las instancias (en profun-
177.1.1 Clases como objetos didad) de ese prototipo. En el caso particular de este len-
guaje, en el que todos los objetos son instancias de Ob-
Multitud de lenguajes de programación basados en cla- ject, modi car o añadir métodos a Object tendrá como
ses proporcionan mecanismos de re exión o introspec- consecuencia la modi cación de esos métodos u objetos
ción, esto es, permiten que el programa pueda observar en todos los demás objetos que no los hayan rede nido
(e incluso modi car) su propia estructura de alto nivel. Si posteriormente, incluyendo los ya instanciados. Este es
estos mecanismos siguen el paradigma de orientación a el mecanismo que utilizan algunas bibliotecas de JavaS-
objetos también, entonces las clases serán representadas cript* [Nota 2] para proporcionar funciones que no hayan
también como instancias de objetos. En particular, si el implementado ciertos motores a ciertos objetos del len-
lenguaje no permite dos de niciones de una misma cla- guaje.
333
334 CAPÍTULO 177. INSTANCIA (PROGRAMACIÓN)
177.3 Notas
[1] Erlang, por ejemplo, permite la ejecución concurren-
te de varias versiones de un mismo programa, véase
[[Link]#Module:code change-3 [Link]
org/doc/man/gen [Link]#Module:code change-3], y
CLOS.
177.4 Referencias
[1] [Link] (en in-
glés)
Capítulo 178
Anexo:Scan code
33∧
Capítulo 179
scanf
En C, la función scanf() (scan-format, analizar con for- mento con el tipo indicador al doble; o que una c siguien-
mato), en realidad representa a una familia de funciones te, s, o [el especi cador de la conversión se aplica a una
que analizan una entrada de datos con formato y cargan el argumento con el tipo indicador al wchar_t.
resultado en los argumentos que se pasan por referencia
ll (codo-codo) - Especi ca que especi cador una d, un i,
a dicha función o funciones: un o, un u, un x, de una conversión siguiente de X, o de
n se aplica a un argumento con el tipo indicador a largo
• La función scanf() lee los datos de entra- largo largo o sin rmar largo.
da en el stdin ( ujo de entrada estándar).
j - Especi ca que especi cador una d, un i, un o, un u,
• La función fscanf() ( le-scanf) lee en un un x, de una conversión siguiente de X, o de n se apli-
ujo de entrada dado, por lo general un ca a un argumento con el tipo indicador al intmax_t o al
chero ( le) abierto para lectura. uintmax_t.
• La función sscanf() (string-scanf) obtie- z - Especi ca que especi cador una d, un i, un o, un u,
ne la entrada que se va a analizar de una un x, de una conversión siguiente de X, o de n se aplica
cadena de caracteres dada (string). a un argumento con el tipo indicador al size_t o al tipo
correspondiente del entero con signo.
Todas ellas leen caracteres, los interpretan según un for- t - Especi ca que especi cador una d, un i, un o, un u, un
mato, y almacenan los resultados en sus argumentos. Ca- x, de una conversión siguiente de X, o de n se aplica a un
da uno cuenta con varios argumentos: por un lado, un for- argumento con el tipo indicador al ptrdi _t o al tipo sin
mato de la secuencia del control (se describe más abajo), rmar correspondiente.
por otro, un sistema de argumentos del indicador que se-
ñala dónde la entrada convertida debe ser almacenada. L - Especi ca que una a siguiente, A, e, E, f, F, g, o espe-
El resultado es inde nido si hay escasos argumentos pa- ci cador de la conversión de G se aplica a un argumento
ra dar formato. Si se agota el formato mientras que sigue con el tipo indicador al doble largo.
habiendo las argumentos, los argumentos sobrantes son Si un modi cante de la longitud aparece con cualquier
evaluados pero no procesados de ninguna otra manera. especi cador de la conversión con excepción de según lo
especi cado arriba, el comportamiento es inde nido.
33∨
33∩
signo, que formato es igual según lo esperado para la se- >>>Si un l (codo) cali cador está presente, la entrada es
cuencia sujeta del strtoul() con el valor ∪ para el argu- una secuencia de caracteres que comienza en el estado
mento bajo. En ausencia de un modi cante del tamaño, inicial de la cambio. Cada carácter en la secuencia será
el uso se asegurará de que el argumento correspondiente convertido a un carácter ancho como si por una llamada a
sea un indicador a sin rmar. la función del mbrtowc (), con el estado de la conversión
u - Empareja un número entero decimal opcionalmente descrito por un objeto del mbstate_t inicializado a cero
con signo, que formato es igual según lo esperado para la antes del primer carácter sea convertido. El uso se asegu-
secuencia sujeta del strtoul() con el valor 10 para el argu- rará de que el argumento correspondiente sea un indica-
dor a un arsenal de wchar_t bastante grande para aceptar
mento bajo. En ausencia de un modi cante del tamaño,
el uso se asegurará de que el argumento correspondiente la secuencia y el carácter ancho nulo que termina, que
serán agregados automáticamente.
sea un indicador a sin rmar.
x - Empareja un número entero hexadecimal opcional- >>>La especi cación de la conversión incluye todos los
mente con signo, que formato es igual según lo esperado octetos subsecuentes en la secuencia del formato hasta e
para la secuencia sujeta del strtoul() con el valor 1∨ pa- incluir el corchete derecho que empareja (“]”). Los oc-
ra el argumento bajo. En ausencia de un modi cante del tetos entre los corchetes (el scanlist) abarcan el scanset, a
tamaño, el uso se asegurará de que el argumento corres- menos que el octeto después de que el corchete izquierdo
pondiente sea un indicador a sin rmar. sea un circun ejo (“^”), en este caso el scanset contiene
todos los octetos que no aparezcan en el scanlist entre el
a, e, f, g - Empareja un número, un in nito, o un NaN circun ejo y el corchete derecho. Si la especi cación de
oating-point opcionalmente con signo, que formato es la conversión comienza con”[] “o”[^] “, el corche-
igual según lo esperado para la secuencia sujeta del strtod te derecho se incluye en el scanlist y el corchete derecho
(). En ausencia de un modi cante del tamaño, el uso se siguiente es el corchete derecho que empareja que ter-
asegurará de que el argumento correspondiente sea un in- mina la especi cación de la conversión; si no, el primer
dicador a otar. corchete derecho es el que termina la especi cación de
>>>Si la familia del fprintf() de funciones genera las re- la conversión. Si “-”es en el scanlist y no es el primer
presentaciones de la cadena de caracteres para el in ni- carácter, ni el segundo donde está un“^”, ni el carácter
to y NaN (una entidad simbólica codi cada en formato el primer carácter pasado, puesta en práctica-se de ne el
oating-point) para apoyar IEEE Std ∩∧4-19∪∧, la familia comportamiento.
del fscanf () de funciones las reconocerá como entrada. s c - Empareja una secuencia de los octetos del número es-
- Empareja una secuencia de los octetos que no son ca- peci cado por la anchura del campo (1 si no hay anchura
racteres del blanco-espacio. El uso se asegurará de que del campo presente en la especi cación de la conversión).
el argumento correspondiente sea un indicador al octeto El uso se asegurará de que el argumento correspondiente
inicial de un arsenal del carbón, del carbón rmado, o sea un indicador al octeto inicial de un arsenal del car-
del carbón sin rmar bastante grande aceptar la secuen- bón, del carbón rmado, o del carbón sin rmar bastante
cia y un código de carácter nulo que termina, que serán grande aceptar la secuencia. No se agrega ningún octe-
agregados automáticamente. to nulo. Los caracteres excesivos del blanco-espacio del
>>>Si un l (codo) cali cador está presente, la entrada es salto normal serán suprimidos en este caso.
una secuencia de caracteres que comienza en el estado >>>Si un l (codo) cali cador está presente, la entrada se-
inicial de la cambio. Cada carácter será convertido a un rá una secuencia de caracteres que comienza en el estado
carácter ancho como si por una llamada a la función del inicial de la cambio. Cada carácter en la secuencia se con-
mbrtowc (), con el estado de la conversión descrito por vierte a un carácter ancho como si por una llamada a la
un objeto del mbstate_t inicializado a cero antes del pri- función del mbrtowc (), con el estado de la conversión
mer carácter sea convertido. El uso se asegurará de que el descrito por un objeto del mbstate_t inicializado a cero
argumento correspondiente sea un indicador a un arsenal antes del primer carácter sea convertido. El uso se asegu-
de wchar_t bastante grande para aceptar la secuencia y rará de que el argumento correspondiente sea un indica-
el carácter ancho nulo que termina, que serán agregados dor a un arsenal de wchar_t bastante grande para aceptar
automáticamente. la secuencia que resulta de caracteres anchos. No se agre-
[ - Empareja una secuencia no vacía de octetos de un sis- ga ningún carácter ancho nulo.
tema de los octetos previstos (el scanset). Los caracteres s - Indica que es una cadena de caracteres (string). La en-
excesivos del blanco-espacio del salto normal serán supri- trada se termina con un espacio en blanco y un caracter
midos en este caso. El uso se asegurará de que el argu- null es guardado al nal de la cadena de caracteres. Esto
mento correspondiente sea un indicador al octeto inicial signi ca que el bu er utilizado debe ser por lo menos un
de un arsenal del carbón, del carbón rmado, o del car- caracter más grande que la longitud de entrada especi ca-
bón sin rmar bastante grande aceptar la secuencia y un da. De no ser así podría darse el caso que se sobrescriban
octeto nulo que termina, que serán agregados automáti- porciones de memorias adyacentes, generando resultados
camente. inesperados.
33∪ CAPÍTULO 179. SCANF
/*Posibles resultados no deseados al leer un solo carac- introducidos por teclado, de tipos int, oat y char //Si se
ter*/ char a; scanf("%s”,&a); /*Una forma non-sancta introduce un dato erróneo se interrumpe la lectura del
de evitarlo usando arreglos el caracter quedaría en a[0] */resto. int validos; printf(“Introduce un entero, un real, y
char a[2]; scanf("%s”,a); un caracter:"); validos=scanf("%i%f%c”,&a,&b,&c);
p - Empareja un sistema puesta en práctica-de nido de las //Entrada: ∧ 1.2 J | Salida: 3 //Lectura de una cade-
secuencias, que serán iguales que el sistema de secuencias nas de caracteres printf(“Introduce una palabra: ");
que es producido por la especi cación de la conversión scanf("%10s”,cad); // lee máximo 10 caracteres y le
de %p de las funciones correspondientes del fprintf (). El concatena el caracter cero.
uso se asegurará de que el argumento correspondiente sea
un indicador a un indicador a anular. La interpretación
del artículo de la entrada puesta en práctica-se de ne. Si
el artículo de la entrada es un valor convertido anterior 179.3 Funciones derivadas
durante la misma ejecución de programa, el indicador que
los resultados compararán el igual a ese valor; si no, el
comportamiento de la especi cación de la conversión de 179.3.1 fscanf
%p es inde nido.
La función fscanf lee datos de entrada desde un chero,
n - No se consume ninguna entrada. El uso se asegurará
en lugar de utilizar la entrada estándar.
de que el argumento correspondiente sea un indicador al
número entero en el cual será escrito el número de los oc- (C o C++)
tetos leídos en la entrada hasta ahora por esta llamada a int fscanf (FILE * le, const char *format,...);
las funciones del fscanf (). La ejecución de una especi -
cación de la conversión de %n no incrementará la cuenta (PHP)
de la asignación vuelta en la terminación de la ejecución int fscanf (resource le, const string format [, mixed
de la función. No se convertirá ningún argumento, pero args...]);
una será consumido. Si la especi cación de la conversión
incluye un carácter asignación-que suprime o una anchu- fscanf trabaja igual que la función scanf original; las en-
ra del campo, el comportamiento es inde nido. tradas una vez leídas no serán leídas otra vez hasta que el
archivo sea cerrado y abierto de nuevo.
SCons
340
Capítulo 181
Screen scraping
341
Capítulo 182
Sección crítica
342
Capítulo 183
Serialización
183.1 Usos
Serialización tiene una serie de ventajas:
343
Capítulo 184
Sigil
344
Capítulo 185
Signatura (informática)
1. tipos bool
2. operaciones
3. verdadero : bool
4. falso : bool
34∧
Capítulo 186
Signum Framework
Signum Framework es un framework ORM Open Sour- de otros frameworks, la base de datos se genera a partir
ce creado por una empresa española en C# orientado del código y no a la inversa.
al desarrollo de aplicaciones sobre la tecnología .Net de Dada la importancia que se concede a las entidades como
Microsoft, con un visión centrada en las entidades, de ma- núcleo de las aplicaciones, Signum Framework provee un
nera que es el modelo de datos el que determina el esque- pequeño grupo de clases base y primitivas que permiten
ma de la base de datos. Como base de datos sólo está
modelar los objetos de una manera modular y reusable,
soportado MS SQL Server. evitando la redundancia y asegurando la integridad de los
Signum Framework se distribuye bajo licencia LGPL. objetos, tanto en lógica como una vez persistidos en base
de datos. Esto mismo (al tener que heredar las entidades
desde alguna de estas clases base) hace que Signum Fra-
186.1 Características mework no soporte POCO (Plain Old C# Object).
34∨
186.2. HISTORIA 34∩
187.4 Referencias
187.1 Origen del nombre
187.5 Bibliografía
El origen del nombre, Simple Network Library, puede 187.5.1 Documentación de SNL
considerarse como un guiño a la biblioteca Simple Di-
rectMedia Layer, SDL, ya que como se puede observar • Jesús Hernández Gormaz (2009). Documentacion de
las siglas solo varían de una D, SDL, a una N, SNL. Esto SNL (1). p. 2.
es debido a que al igual que SDL es ampliamente usada
para el desarrollo de videojuegos, especialmente de vi-
deojuegos que sean software libre, SNL se creó con la
intención de facilitar el desarrollo y programación de vi-
187.6 Enlaces externos
deojuegos multijugador en red aún más de lo que pueda
facilitarlo otras bibliotecas como SDL Net, de forma que • [Link] - Página o cial de SNL (en esperanto,
el trabajo de el programador con los sockets y la labor español e ingles).
de conseguir Multiplexación, para que un servidor pue-
da atender a varios clientes de forma no bloqueante, sea
lo su cientemente sencillo para que el programador no
pierda tiempo en la comunicación que podría invertir en
el juego en si.
34∪
Capítulo 188
Smarty
Smarty es un motor de plantillas para PHP, es decir, se- medida van surgiendo sistemas de separación en capas
para el código PHP, como lógica de negocios, del código que intentan disciplinar un poco las metodologías de pro-
HTML, como lógica de presentación, y genera conteni- gramación envueltas en el desarrollo con PHP, pero que
dos web mediante la colocación de etiquetas Smarty en un no hacen otra cosa que acercarse más y más a otras herra-
documento. Se encuentra bajo la Licencia Pública Gene- mientas ya existentes en otros entornos de desarrollo más
ral Reducida de GNU. complejos y pensados desde sus orígenes para proyectos
más grandes, como pueden ser J2EE (Java), .NET (C#)
Es común que en grandes proyectos el rol de diseñador
grá co y el de programador sean cubiertos por personas o Django (Python).
distintas, sin embargo la programación en PHP tiene la
tendencia de combinar estas dos labores en una persona
y dentro del mismo código, lo que trae consigo grandes 188.3 Ejemplo
di cultades a la hora de cambiar alguna parte del diseño
de la página, pues se tiene que escarbar entre los scripts [Link]
para modi car la presentación del contenido, Smarty tie-
ne como objetivo solucionar este problema. require_once(“smarty/[Link]”); // Instanciar
la clase de Smarty $smarty = new Smarty(); // Con -
gurar Smarty $smarty->template_dir = "./templates/";
188.1 Características $smarty->compile_dir = "./templates_c/"; $smarty-
>con g_dir = "./con gs/"; $smarty->cache_dir =
"./cache/"; // Establecer variables que se usarán en la
• Expresiones regulares
plantilla $smarty->assign(“nombre”, “José Manuel
• Bucles foreach, while Pardo Pérez”); $smarty->assign(“direccion”, “C/
Alpes, 992”); // Mostrar la plantilla $smarty->display(
• Sentencias condicionales if, elseif, else “[Link]”);
• Modi cadores de variables (por ejemplo: {$varia-
ble|nl2br})
[Link]
• Funciones creadas por el usuario
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
• Evaluación de expresiones matemáticas en la plan- 4.01//EN”"[Link]
tilla <html lang="es"> <head> <title>Información del
Usuario</title> </head> <body> <p>Información del
Usuario:</p> <p> Nombre: {$nombre}<br /> Direc-
188.2 Críticas ción: {$direccion} </p> </body> </html>
349
3∧0 CAPÍTULO 188. SMARTY
188.4 Referencias
Snippet
3∧1
Capítulo 190
Stack Over ow
3∧2
190.4. ESTADÍSTICAS 3∧3
StarBasic
3∧4
Capítulo 192
Stub
Un stub es, en el contexto del testeo del software, un tro- • Stub/mock frameworks for Java Review and com-
zo de código usado como sustituto de alguna otra fun- parison of stub & mock frameworks for Java
cionalidad. Un stub puede simular el comportamiento de
código existente (tal como un procedimiento en una má-
quina remota) o ser el sustituto temporal para un código
aún no desarrollado. Los stubs son, por tanto, muy úti-
les para porting, computación distribuida así como en el
desarrollo y pruebas de software en general.
Un ejemplo de stub en pseudocódigo podría ser como és-
te:
INICIO Temperatura = LeerTermometro(Afuera) SI
Temperatura > 40 ENTONCES ESCRIBIR “Hace ca-
lor!" FIN SI FIN INICIO LeerTermometro(Fuente aden-
troOafuera) RETORNAR 2∪ FIN LeerTermometro
El pseudocódigo de arriba utiliza la función LeerTermo-
metro, que devuelve la temperatura. Aunque se preten-
de que LeerTermometro obtenga la temperatura de al-
gún dispositivo, la función en este momento no contie-
ne el código necesario. LeerTermometro, en esencia, no
simula ningún proceso aunque devuelve un valor legal,
permitiendo así probar aunque sea en parte el programa
principal. Hay que notar también que aunque acepta un
parámetro de tipo Fuente para determinar si se va a leer
la temperatura externa o interna, éste no se usa.
Un stub* [1] es una rutina que realmente no hace otra cosa
que declararse a sí misma y a los parámetros que acepta
y que devuelve un valor habitual dentro de los 'escena-
rios felices' del que llama al stub. Los stubs se usan habi-
tualmente como sustitutos de la implementación aún no
nalizada de una interfaz ya de nida. El stub contendría
sólo el código necesario para que compile y enlace con el
resto del programa.
192.1 Referencias
[1] [Link]
3∧∧
Capítulo 193
Subalgoritmo
Se llama subalgoritmo a cada una de las partes de un nes en su funcionamiento. Este paso de argumentos se
algoritmo más general que resuelve cada una de las ta- puede hacer por valor o por referencia.
reas particulares necesarias para que dicho algoritmo ge- Ver Paso de argumentos en Argumento (Ciencias de la
neral alcance el objetivo para el que fue diseñado, es de- computación)'
cir resolver un problema. Este concepto está vinculado al
diseño estructurado de algoritmos, en el cual un problema
se divide en partes que posteriormente son resueltas por
un módulo. Cada módulo coincidirá con un subalgoritmo. 193.4 Véase también
• Programación estructurada
193.1 Tipos de subalgoritmos • Programación modular
3∧∨
Capítulo 194
Tabla de saltos
En programación, se denomina tabla de saltos a un mé- funciones por su número (el índice en la tabla) pueden
todo e ciente de transferencia de control de programas ser útiles en ciertos programas.
saltando a otra parte del código mediante una tabla de
instrucciones de salto. Este sistema es utilizado normal-
mente en la programación en ensamblador aunque estas 194.1 Ejemplo
tablas también pueden ser generadas por un compilador.
Una tabla de saltos consiste en una lista de instrucciones Un ejemplo simple del uso de tablas de saltos en ensam-
de salto incondicional que se ejecutan utilizando un o set blador del microcontrolador PIC de ∪ bits es:
creado mediante la multiplicación de un índice secuencial
por la longitud de la instrucción (los bytes que ocupa en movf INDEX, W ; mover el valor de índice al registro
memoria cada instrucción). Se basa en el hecho de que W (registro de trabajo) desde la dirección de memoria
las instrucciones de salto en código máquina tienen una INDEX addwf PCL, F ; sumarlo al registro de contador
longitud ja y pueden ser ejecutadas de forma extrema- de programa (PCL). Cada instrucción PIC ocupa 1 byte
damente e ciente por la mayoría del hardware, además ; de modo que no es necesario realizar ninguna multipli-
de ser más útil cuando se trabaja con datos sin formato cación. La mayoría de las arquitecturas transformarían ;
fácilmente convertibles a valores secuenciales de índice. el índice de alguna manera antes de sumarlo al contador
Dados estos datos, una tabla de saltos suele ser bastante de programa table ; esta etiqueta marca el comienzo de
e ciente, siguiendo normalmente estos pasos: validación la tabla de salto goto index_zero ; cada una de estas ins-
opcional de los datos de entrada, transformación de los trucciones goto es un salto incondicional a diferentes sec-
mismos en un o set dentro de la tabla de saltos (esto sue- ciones goto index_one ; del código goto index_two goto
le necesitar multiplicarlos o desplazarlos para su longitud index_three index_zero ; en esta parte se añadiría el códi-
coincida con las instrucciones de salto) y salto a una di- go necesario para realizar cualquier acción que requiera
rección obtenida a partir de la base de la tabla y el o set que el valor de INDEX sea igual a cero return index_one
generado (esta operación suele incluir la suma del o set ...
al registro del contador de programa).
Otro método de implementación de las tablas de saltos
consiste en un array de direcciones desde las cuales es
194.2 Historia
capturada la dirección necesaria para saltar. Este método
suele implicar un menor tamaño del código y evita los El uso de las tablas de saltos y de la representación de
saltos indirectos. Normalmente el método empleado para los datos sin formato mediante índices era común en los
construir la tabla de saltos suele venir determinada por la inicios de la informática cuando las memorias eran caras
arquitectura del procesador en el cual va a ser ejecutado y los procesadores lentos, siendo la representación com-
el código. pacta de los datos y la elección e ciente de las alternativas
de almacenamiento dos factores importantes. También se
Las tablas de saltos suelen usarse en el desarrollo de ven con frecuencia en los sistemas empotrados modernos,
sistemas operativos. Tanto las llamadas al sistema como donde suele hacer falta que el código quepa en espacios
las funciones de biblioteca pueden ser referenciadas me- realmente mínimos y que a la vez opere de manera e -
diante un índice entero de una tabla de saltos. Con esto se ciente. La principal ventaja de tal conversión es que una
consigue una mejora de la compatibilidad con las versio- vez que un valor ha sido convertido a un índice, puede
nes siguientes: si el código de una función y la dirección ser utilizado para saltar o para recuperar algún dato de
de su destino de salto son modi cados, solamente hará una tabla de búsqueda de forma e ciente y en cualquier
falta reajustar la instrucción de salto en la tabla, de este momento sin necesidad de ser convertido de nuevo. Por
modo todas las aplicaciones compiladas utilizando códi- ejemplo, se podría decir que, relativamente, hay pocos
go de la biblioteca y/o sistema operativo en cuestión no países en el mundo; de forma que éstos podrían ser repre-
necesitan modi cación alguna. Además, las llamadas a sentados de manera sencilla mediante un código de país
3∧∩
3∧∪ CAPÍTULO 194. TABLA DE SALTOS
Tabla de verdad
Una tabla de verdad, o tabla de valores de verdad, Negación La negación es un operador que se ejecu-
es una tabla que muestra el valor de verdad de una ta, sobre un único valor de verdad, devolviendo el valor
proposición compuesta, para cada combinación de ver- contradictorio de la proposición considerada.
dad que se pueda asignar.* [1]
Fue desarrollada por Charles Sanders Peirce por los A ∼A
años 1∪∪0, pero el formato más popular es el que in- V F
trodujo Ludwig Wittgenstein en su Tractatus logico- F V
philosophicus, publicado en 1921.
3∧9
3∨0 CAPÍTULO 195. TABLA DE VERDAD
A B A⇔B n
V V V Para componer una tabla de verdad, pondremos las n va-
V F F riables en una línea horizontal, debajo de estas variables
F V F desarrollamos las distintas combinaciones que se pueden
F F V formar con V y F, dando lugar a la distintas Nc, núme-
ro de combinaciones. Normalmente solo se representa la
Que se corresponde con la columna ∩ del algoritmo fun- función para la que se confecciona la tabla de verdad, y en
damental. todo caso funciones parciales que ayuden en su cálculo,
en la gura, se pueden ver todas las combinaciones po-
sibles Cp, que pueden darse para el número de variables
dado.
195.2 Número de combinaciones
n C
Partiendo de un número n de variables, cada una de las
cuales puede tomar el valor verdadero: V, o falso: F,
por Combinatoria, podemos saber que el número total de A B 1 2 3 4 5 6 7
combinaciones: Nc, que se pueden presentar es:
V V V V V V V V V
N c = 2n
V F V V V V F F F
el número de combinaciones que se pueden dar con n va-
Nc
riable, cada una de las cuales puede tomar uno entre dos
F V V V F F V V F
valores lógicos es de dos elevado a n, esto es, el núme-
ro de combinaciones: Nc, tiene crecimiento exponencial
F F V F V F V F V
respecto al número de variable n:
195.3. TABLAS DE VERDAD 3∨1
Así podemos ver que para dos variables binarias: A y B, Considérese además a "·" como una operación o función
n= 2 , que pueden tomar los valores V y F, se pueden lógica que realiza una función de verdad al tomar los va-
desarrollar cuatro combinaciones: Nc= 4, con estos valo- lores de verdad de A y de B, y devolver un único valor de
res se pueden de nir dieciséis resultados distintos, Cp= verdad. Entonces, existen 1∨ funciones distintas posibles,
1∨, cada una de las cuales seria una función de dos va- y es fácil construir una tabla que muestre qué devuelve ca-
riables binarias. Para otro número de variables se obten- da función frente a las distintas combinaciones de valores
drán los resultados correspondientes, dado el crecimien- de verdad de A y de B.
to exponencial de Nc, cuando n toma valores mayores
de cuatro o cinco, la representación en un cuadro resul-
ta compleja, y si se quiere representar las combinaciones
posibles Cp, resulta ya complejo para n= 3.
Las dos primeras columnas de la tabla muestran las cuatro
combinaciones posibles de valores de verdad de A y de
195.2.1 Para cero variables B. Hay por lo tanto 4 líneas, y las 1∨ columnas despliegan
todos los posibles valores que puede devolver una función
Un circuito sin variables, puede presentar una combina- "·".
ción posible: Nc=1, con dos circuitos posibles: Cp=2. De esta forma podemos conocer mecánicamente, me-
Que serían el circuito cerrado permanentemente, y el cir- diante algoritmo, los posibles valores de verdad de cual-
cuito abierto permanentemente. quier conexión lógica interpretada como función, siempre
y cuando de namos los valores que devuelva la función.
Se hace necesario, pues, de nir las funciones que se uti-
lizan en la confección de un sistema lógico.
En este caso se puede ver que no interviene ninguna va-
De especial relevancia se consideran las de niciones para
riable.
el Cálculo de deducción natural y las puertas lógicas
Cada uno de estos circuitos admite una única posición y en los circuitos electrónicos.
hay dos circuitos posibles.
El caso de una variable binaria, que puede presentar dos Las tablas nos mani estan los posibles valores de verdad
combinaciones posibles: Nc=2, con 4 circuitos posibles: de cualquier proposición molecular, así como el análisis
Cp=4. de la misma en función de las proposicíones que la inte-
gran, encontrándonos con los siguientes casos:
dad es V o F según la la de los valores de A, B, y C que No obstante la sencillez del algoritmo, aparecen dos di -
consideremos. (Columnas 1,4 ∧) cultades.
Donde podemos comprobar cuándo y por qué la propo-
sición A ∧ (B ∨ C) es V y cuándo es F. • La gran cantidad de operaciones que hay que hacer
para una proposición con más de 4 variables.
Se entiende por proposición contradictoria, o contradic- • Que únicamente será aplicable a un esquema de in-
ción, aquella proposición que en todos los casos posibles ferencia, o argumento cuando la proposición condi-
de su tabla de verdad su valor siempre es F. Dicho de otra cionada, como conclusión, sea previamente conoci-
forma, su valor F no depende de los valores de verdad de da, al menos como hipótesis, hasta comprobar que
las proposiciones que la forman, sino de la forma en que su tabla de verdad mani esta una tautología.
están establecidas las relaciones sintácticas de unas con
otras. Sea el caso: Por ello se construye un cálculo mediante cadenas deduc-
tivas:
195.5 Aplicaciones
A∨ ∼ A
En realidad toda la lógica está contenida en las tablas de • valor “1”permite el paso de corriente eléctrica; y
verdad, en ellas se nos manifesta todo lo que implican las
relaciones sintácticas entre las diversas proposiciones. • valor “0”corta el paso de dicha corriente.
195.5. APLICACIONES 3∨3
• Caso 2
• Caso 1 B
3∨4 CAPÍTULO 195. TABLA DE VERDAD
• Caso ∩ • Caso 13
El séptimo caso corresponde a la relación bicondicional En el caso decimotercero podemos ver que el resultado
entre A y B, el resultado solo es verdad si A y B son ambos es el opuesto de A, independientemente del valor de B:
verdad o si A y B son ambos falsos.
∼A
(A ∧ B) ∨ (∼ A∧ ∼ B) = A ⇔ B
• Caso 14
• Caso ∪
En el octavo caso el resultado es verdad si A y B son ver- Caso decimocuarto, el resultado de la función solo es ver-
dad, en el resto de los valores de A y B el resultado es dad si A es falso y B verdadero, luego es equivalente a un
falso, corresponde a la conjunción de A y B, equivalente circuito en serie de A en conexión inversa y de B en co-
a un circuito en serie. nexión directa.
A∧B ∼A∧B
• Caso 9 • Caso 1∧
En el noveno caso el resultado solo es falso si A y B son En el caso decimoquinto, el resultado solo es verdad si A
verdad, en el resto de los valores de A y B el resultado es y B son falsos, Luego es necesario que tanto A como B
verdadero, corresponde a la disyunción de la negación A y sean falsos para que el resultado sea verdadero.
de B, equivalente a un circuito en paralelo de conexiones
inversas.
∼ A∧ ∼ B
∼ A∨ ∼ B • Caso 1∨
• Caso 10
Por último en el caso decimosexto, tenemos que el resul-
tado siempre es falso independientemente de los valores
Podemos ver que el décimo caso es lo opuesto a la bi-
de A o de B.
condicional, solo es verdad si A y B discrepan, si A y B
son diferentes el valor es verdad, si A y B son iguales el
resultado es falso.
F
(A∧ ∼ B) ∨ (∼ A ∧ B)
195.6 Véase también
• Caso 11
• Operador lógico
En este caso podemos ver que cuando B es verdad el re-
sultado es falso y que cuando B es falso el resultado es • Anexo:Tabla de símbolos matemáticos
verdadero, independientemente del valor de A, luego la
función solo depende de B, en sentido inverso. • Lenguaje formalizado
• →lgebra de Boole
∼B • Cálculo lógico
• Función lógica
A∧ ∼ B • Función de verdad
195.8. ENLACES EXTERNOS 3∨∧
• Tablas de Verdad
• Lógica matemática
Capítulo 196
Thunk
Thunk es un término usado en la jerga del desarrollo de public ref class CManagedClass { private: System::Int32
software que designa la llamada o invocación a un código m_i; public: void SetValue( int i ) { m_i = i; // Implemen-
que pertenece a otra plataforma o a otro Framework. En tación del tipo de datos } };
el paso de 1∨ a 32 bit por ejemplo, los sistemas operativos
Las clases nativas C++ en un proyecto C++/CLI. Aquí se
(OS/2, Windows NT etc.) podían resolver código de 1∨ puede ver que también el camino inverso es posible, es
bit a través de la transformación de los parámetros de lla-
decir, instanciar el código gestionado dentro de una clase
madas y direcciones, de modo tal que fue posible seguir no gestionada. La condición es, sin embargo, que se trate
utilizando los programas de 1∨ bit. de un proyecto C++/CLI, de modo tal que el compilador
En el desarrollo de software moderno, un thunk es la lla- comprenda la correspondiente sintaxis. El thunk ya apa-
mada del código nativo desde el código gestionado y vi- rece en la instrucción «gcnew», ya que aquí se invoca al
ceversa (véase por ejemplo Java Native Access o .NET constructor de la clase gestionada:
P/Invoke). Es decir, se trata de una plataforma de tran- public class CNativeClass { public: void Foo() { int i =
sición, en la que las convenciones y/o parámetros de in- 42; CManagedClass^ pManagedClass = gcnew CMana-
vocación tienen que transformarse correspondientemente gedClass(); pManagedClass->SetValue( i ); } };
(Marshalling). El lenguaje de programación C++/CLI del
.NET-Framework de Microsoft fue concebido especial-
mente para posibilitar tales thunks en ambas direcciones:
196.3 Bibliografía
• Marcus Heege: Expert C++/CLI. Apress Verlag,
196.1 Invocación por «gestionada» Berkeley 200∩, ISBN 9∩∪-1-∧90∧9-∩∧∨-9, Capítulo
a «no gestionada» 9, p. 203 y siguientes.
3∨∨
Capítulo 197
• Char (Carácter)
• Int (Entero)
3∨∩
Capítulo 198
Triángulo de Floyd
En Java es:
public class TrianguloFloyd { public static void
main(String[] args) { nal int TAMANO = 10; int t = 1;
[Link]("\nTriángulo Floyd\n”); for (int i =
1; i <= TAMANO; ++i) { for (int j = t; j <= t + i - 1; ++j)
{ [Link](j + "\t”); } [Link]("\n”
); t += i; } } }
3∨∪
Capítulo 199
Tubería (informática)
|¦
tores (aquellos que envían datos) se comunican con los
procesos consumidores (que reciben datos) siguiendo un
orden FIFO. Una vez que el proceso consumidor recibe
un dato, éste se elimina de la tubería.
Las tuberías (pipes) están implementadas en forma muy
e ciente en los sistemas operativos multitarea, iniciando
todos los procesos al mismo tiempo, y atendiendo auto-
máticamente los requerimientos de lectura de datos para
cada proceso cuando los datos son escritos por el proce-
so anterior. De esta manera el plani cador de corto plazo
va a dar el uso de la CPU a cada proceso a medida que
pueda ejecutarse minimizando los tiempos muertos.
Para mejorar el rendimiento, la mayoría de los sistemas
operativos implementan las tuberías usando bu ers, lo
que permite al proceso proveedor generar más datos que
lo que el proceso consumidor puede atender inmediata-
mente.
Podemos distinguir dos tipos de tuberías:
3∨9
3∩0 CAPÍTULO 199. TUBERÍA (INFORMÁTICA)
• Pleca
Violación de acceso
3∩1
Capítulo 201
Waf
Waf es una herramienta que ayuda a con gurar automá- • Información en pantalla colorida y barra de progre-
ticamente la compilación y la instalación de otros progra- so.
mas o bibliotecas (build).
• Los scripts son módulos de Python.
• Ofrece un lenguaje de programación real (similar a • Soporta caché de objetos global para evitar compi-
SCons). laciones innecesarias.
• Soporta objetivos estándar: con gurar, compilar,
limpiar, instalar y desinstalar. • Soporta la ejecución de pruebas(test) en los progra-
mas al nal de la compilación.
Requerimientos
3∩2
201.6. ENLACES EXTERNOS 3∩3
201.5 Referencias
[1] ←Por qué el proyecto KDE cambió a CMake(ingles)
En computación, el Win32 Thread Information Block Ejemplos en C inlined-assembly para x∪∨ de 32 bits:
(TIB) es una estructura de datos en los sistemas Win32, // gcc (AT&T-style inline assembly). void *getTIB() {
especí camente en la arquitectura x∪∨, que almacena in-
void *pTib; __asm__(“movl %%fs:0x1∪, %0”: "=r”
formación acerca del hilo que se está ejecutando. Tam- (pTib) : : ); return pTib; }
bién es conocido como el Thread Environment Block
// Microsoft C void *getTib() { void *pTib; __asm {
(TEB).* [1] mov EAX, FS:[1∪h] mov [pTib], EAX } return pTib; }
El TIB no está documentado o cialmente para Windows // Usando intrinsics de Microsoft en vez de inline
9x. El DDK de la familia Windows NT incluye una es- assembly void *getTib() { void *pTib = ( void * )
tructura NT_TIB en winnt.h que documenta la parte in- __readfsdword( 0x1∪ ); return pTib; }
dependiente de subsistema. El emulador Wine incluye de-
claraciones para el TIB extendido (una parte especi ca
del subsistema). Todavía muchos programas de Win32
usan estos campos no documentados que son en efecto 202.3 Enlaces externos
una parte de la API. El primer campo, en particular, está
directamente referenciado por el código producido por el
• Under The Hood - MSJ, May 199∨
propio compilador de Microsoft.* [1]
El TIB puede ser usado para obtener una buena canti- • Wine HQ
dad de información sobre el proceso sin tener que llamar
a ninguna API de Win32 (por ejemplo, emulaciones de [1]
GetLastError() , GetVersion() ). A través del puntero al
PEB se puede obtener acceso a las tablas de importación
(IAT), los argumentos de inicio pasados al proceso, nom-
bre de la imagen, etc.
3∩4
Capítulo 203
Wrapper
Wrapper (en castellano empaquetador), es un término • Esta obra deriva de la traducción parcial de Wrapper
inglés que generalmente se re ere a un tipo de embalaje, de Wikipedia en portugués, publicada por sus edi-
tal como una hoja plana de papel, celofán o plástico para tores bajo la Licencia de documentación libre de
envolver un objeto. GNU y la Licencia Creative Commons Atribución-
CompartirIgual 3.0 Unported.
203.1 Computación
• Función wrapper, una función cuyo principal propó-
sito es llamar a otra función.
• Biblioteca wrapper
• Driver wrapper, software que funciona como
un adaptador entre un sistema operativo y un
driver.
• Patrón Wrapper, donde algunos códigos de
programación permiten que ciertas clases tra-
bajen juntas, lo que no sería posible de otra
forma.
• Clase wrapper, término de computación que se re-
ere a una clase Java en programación orientada a
objetos.
• TCP Wrapper, software usado para ltrar el acceso
a la red.
• Wrapper (Minería de datos), técnica usada en la mi-
nería de datos.
203.3 Referencias
• Esta obra deriva de la traducción parcial de Wrapper
de Wikipedia en inglés, concretamente de esta ver-
sión del 1∧ de mayo de 2014, publicada por sus edi-
tores bajo la Licencia de documentación libre de
3∩∧
Capítulo 204
XAML
XAML (acrónimo pronunciado xammel del inglés como un recurso en un ensamblado de Framework .NET.
eXtensible Application Markup Language, Lenguaje Ex- En el momento de ejecución, el motor del Framework ex-
tensible de Formato para Aplicaciones en español) es el trae el archivo .baml de los recursos del ensamblado, se
lenguaje de formato para la interfaz de usuario para la analiza sintácticamente, y crea el correspondiente árbol
Base de Presentación de Windows (WPF por sus siglas en visual WPF o Work ow.
inglés) y Silverlight(wpf/e), el cual es uno de los“pilares”
Cuando se use en Windows Presentation Foundation,
de la interfaz de programación de aplicaciones .NET en XAML es usado para describir interfaces visuales para
su versión 3.0 (conocida con anterioridad con el nombre usuarios. WPF permite la de nición de objetos en 2D y
clave WinFX). 3D, rotaciones, animaciones y otra variedad de caracte-
XAML es un lenguaje declarativo basado en XML, opti- rísticas y efectos.
mizado para describir grá camente interfaces de usuarios
Cuando es usado en el contexto de Windows Work ow
visuales ricas desde el punto de vista grá co, tales co- Foundation, XAML es usado para describir lógica de-
mo las creadas por medio de Adobe Flash. XUL y UIML clarativa potencialmente larga (potentially long-running
son otros ejemplos de lenguajes de interfaz basados en declarative logic), como aquellos creados en el proceso
XML. SVG es un estándar de la organización W3C, el de sistemas de modelado y herramientas. El formato de
cual soporta grá cos, animaciones, audio y video inte- serialización para WorkFlows había sido llamado previa-
grados, eventos y comportamiento descrito por medio de mente XOML, para diferenciarlo de su uso en IU de los
escritura y puede ser utilizado como lenguaje de interfaz XAML, pero esa diferenciación ya no existe. Sin embar-
basado en XML. go las extensiones de los archivos que contienen marcado
En su uso típico, los archivos tipo XAML serían pro- de work ow es todavía XOML. [4][∧]
ducidos por una herramienta de diseño visual, como
Microsoft Visual Studio o Microsoft Blend. El XML re-
sultante es interpretado en forma instantánea por un sub-
sistema de despliegue de Windows que reemplaza al GDI
204.2 Ejemplos
de las versiones anteriores de Windows. Los elementos de
XAML se interconectan con objetos del Entorno Común Este ejemplo en XAML muestra un texto“Hola Mundo!"
de Ejecución para Lenguajes. Los atributos se conectan dentro de un contenedor del tipo Canvas.
con propiedades o eventos de esos objetos. <Canvas xmlns="[Link]
XAML fue diseñado para soportar las clases y métodos //[Link]/client/200∩" xmlns:x=\_
de la plataforma de desarrollo .NET que tienen relación _xunadd_text_character:nN{\textquotedbl}{"}{}http:
con la interacción con el usuario, en especial el despliegue //[Link]/web/[Link]
en pantalla. El acrónimo XAML originalmente signi ca- com/winfx/200∨/xaml"> <TextBlock>Hola Mun-
ba Extensible Avalon Markup Language, Lenguaje do!</TextBlock> </Canvas>
Extensible de Formato de Avalon; habiendo sido Ava-
lon el nombre clave original de la Base de Presentación
de Windows, nombre que engloba a este grupo de clases
de .NET. 204.3 Véase también
• Microsoft Expression Blend (Herramienta de Mi-
204.1 Tecnología crosoft que utiliza XAML)
• Adobe Flex
Un archivo XAML puede ser compilado para obtener un
archivo binario XAML .baml, el cual puede ser insertado • JavaFX
3∩∨
204.5. ENLACES EXTERNOS 3∩∩
• OpenLaszlo
• XUL
• ZUL
204.4 Referencias
Zenphp
3∩∪
205.3. ORIGEN DEL TEXTO Y LAS IMÁGENES, COLABORADORES Y LICENCIAS 3∩9
Doble, BOTirithel, Kizar, Ravmn, PatruBOT, Sergi∩0, Nanopulga, Gerda Arendt, ASTUR2000, EmausBot, Yayolas, KLBot2, Gusama
Romero, Elvisor, Daltreck, BenjaBot y Anónimos: ∨2
• ICONIX Fuente: [Link] Colaboradores: BOT-Superzerocool, CEM-bot, CommonsDe-
linker, Technopat, Rwheimle, Ortisa, Marsal20, PatruBOT, Angelito∩, KLBot2, Invadibot, Arvelo∧92, Jarould y Anónimos: 12
• Anexo:Implementaciones de Smalltalk Fuente: [Link]
∩0∩∩∧90∩ Colaboradores: Sabbut, Tano4∧9∧, Dusan, Stickel, Shooke, Muro Bot, Carmin, MiguelAngelCaballero, Alelapenya, Lividiniski,
Elvisor y Anónimos: 1
• Anexo:Implementaciones para algoritmo de rut Fuente: [Link]
de_rut?oldid=∪∩1∨∨∨∪3 Colaboradores: Josemoya, Isha, Terinchu y Anónimos: 1
• Inanición (informática) Fuente: [Link] Colaborado-
res: Sabbut, GermanX, Thijs!bot, Mcapdevila, Angelito∩, Ripchip Bot, EmausBot, KLBot2, Nejnadusho, Angeldefuego22 y Anónimos:
2
• Indirección Fuente: [Link] Colaboradores: DMG, Glia, Muro de Aguas, Bia-
soli, Elabra sanchez, Xqbot, KLBot2, Lizbeth Melissa Appleton Tavarez y Sociologiaipa
• Infraestructura de lenguaje común Fuente: [Link]
∩004∩1∨∩ Colaboradores: Pino, Wikier~eswiki, Yrbot, BOTijo, Dangertn, Biasoli, Muro Bot, [Link], XalD, Leonpolanco,
Luckas-bot, SuperBraulio13, Canyq, Waeswaes, EmausBot, Javiermarinros, MerlIwBot, KLBot2, Dexbot y Anónimos: ∨
• Ingeniería de software Fuente: [Link] Colaboradores: Zeno
Gantner, 4lex, Caligari~eswiki, Soniautn, Sabbut, Moriel, Sauron, JorgeGG, Lourdes Cardenal, ManuelGR, Head, Lsanabria, Rosarino,
Dodo, Jonik, Jynus, Ascánder, Sms, Rsg, Cookie, Tano4∧9∧, Robotito, JavierCantero, Amana, Ograma, Rodrigouf, Cinabrium, Porao, Lo-
co0∪∧, Jabernal, Renabot, Richy, Robotkarel, Chlewey, Soulreaper, Petronas, Airunp, JMPerez, Edub, Taichi, Emijrp, Rembiapo pohyiete
(bot), Magister Mathematicae, RobotQuistnix, Platonides, Chobot, Afpineda, Yrbot, Bai to, BOT-Superzerocool, Adrruiz, Mortadelo200∧,
Martingala, GermanX, The Photographer, Tigerfenix, Ppja, Maldoror, Covi, BOTpolicia, CEM-bot, Jorgelrm, Laura Fiorucci, Eneaslabra,
Ignacio Icke, Osepu, Dou19∪∧, Davius, Govelamo, Antur, [Link], Julian Mendez, Gafotas, Genaro Rafael, Fsd141, Jonpagecr, Dio-
sa, Bot que revierte, Eidansoft, Ninovolador, Botones, Isha, Arcibel, Migp~eswiki, JAnDbot, Jugones∧∧, Antipatico, Xavigivax, Gsrdzl,
Fugarte, Humberto, Netito∩∩∩, Fixertool, Nioger, Pólux, Developer, Manuel Trujillo Berges, Biasoli, Bucephala, VolkovBot, Drever, Tech-
nopat, Jose gueredo, Galandil, Queninosta, Raystorm, MasterNoX, Belgrano, Matdrodes, Autonomia, Gmarinp, Muro Bot, Jmvgpartner,
SieBot, Ctrl Z, Carmin, Hompis, Bigsus-bot, Alben9∧∪∨, Switcher∨∩4∨, Navarroaxel, Greek, BuenaGente, Mafores, Fadesga, Arnombela,
Tirithel, Javierito92, Marcecoro, Antón Francho, Nicop, Brayan Jaimes, Eduardosalg, Qwertymith, Graimito, Leonpolanco, Pan con queso,
Alejandrocaro3∧, LordT, Furti, Poco a poco, Rαge, Camilo, UA31, SergioN, Climens, Andres romeroc, AVBOT, Flakinho, Diegusjaimes,
Davidgutierrezalvarez, CarsracBot, Arjuno3, Saloca, Andreasmperu, Luckas-bot, Jaromero, Nallimbot, Sergiportero, Vic Fede, Dangelin∧,
ArthurBot, Usuwiki, Txangu22, Jefrcast, Angelux3000, SuperBraulio13, Xqbot, Jkbw, FrescoBot, Josemariasaldana, Igna, Botarel, Kraixx,
Ochonueve9∪, Yabama, BOTirithel, [Link], Brian2∨, Luysys, RedBot, Fidelleandro, Abece, Leugim19∩2, PatruBOT,
Dinamik-bot, Jpussacq, Axvolution, EmausBot, Burny~eswiki, Savh, ZéroBot, Joinsolutions, Hdavila1, Grillitus, Cris Dav CDVS, Kasir-
bot, MerlIwBot, JABO, KLBot2, Ayaita, Thehelpfulbot, Iranvaur, AvocatoBot, Sebrev, MetroBot, Diegosangz, TQLEOFULL, Raes123,
Aine Takarai, Elvisor, Felener, Makecat-bot, Ralgisbot, Withsell, Legobot, Ssamuel, Addbot, Balles2∨01, MarielCB, Guilberth, Ricardo
concepcion, DianaJMZr1∪, Isaacjuc, Bryanro, [Link], Starmird, FlareXIII, Abdiel Williams, LisleidysDominguez, Joseline Jara-
millo, Neogeo02, RicardoFong, Albert-∧0∩, Joxeph1∪, Javrro, Alecjz, Jarould, Lomejordejr, Miranda23~eswiki, BenjaBot, José Tomás
reyes rodriguez, FidiasX y Anónimos: 403
• Instancia (informática) Fuente: [Link] Colaboradores: Carlos
Castañeda Girón, Ascánder, BOT-Superzerocool, Varano, CEM-bot, Laura Fiorucci, Santhy, Nightwish, Isha, Netito∩∩∩, Technopat, Car-
min, Javierito92, Poco a poco, AVBOT, Msanguino, David0∪11, Diegusjaimes, Bethan 1∪2, Boto a Boto, SuperBraulio13, Jkbw, FrescoBot,
Botarel, Grillitus, Balles2∨01, Jarould, Unmanitito y Anónimos: 2∪
• Instrucción (informática) Fuente: [Link] Colabora-
dores: Vanbasten 23, Dodo, Airunp, RobotQuistnix, Joanfusan, Yrbot, Amadís, BOT-Superzerocool, GermanX, Jesuja, Maldoror, Cheveri,
Folkvanger, Feiri2∧, BOTpolicia, CEM-bot, Rastrojo, Fsd141, Tortillovsky, →ngel Luis Alfaro, Dogor, JAnDbot, Netito∩∩∩, Bedwyr, Bia-
soli, Cinevoro, Rmarcel, Muro Bot, SieBot, PaintBot, Loveless, LordT, Al Lemos, Juan Mayordomo, Diegusjaimes, DumZiBoT, Arjuno3,
Kavor, Txangu22, Ortisa, Jkbw, Botarel, Pablotol, AnselmiJuan, Grillitus, Elías, MerlIwBot, JABO, Matiia y Anónimos: 34
• Interfaz binaria de aplicaciones Fuente: [Link] Colaborado-
res: JKD, Lobillo, Hprmedina, Invadibot y Korislife
• Interfaz uida Fuente: [Link] Colaboradores: GermanX, TXiKiBoT, Shooke, Lu-
cienBOT, Luckas-bot, ZéroBot, KLBot2 y Anónimos: 1
• Invariante (informática) Fuente: [Link] Colaboradores: Poco
a poco, Waeswaes, EmausBot y KLBot2
• Jframe Fuente: [Link] Colaboradores: Ivordro UV
• Usuario discusión:Juliasocorro Fuente: [Link]
Colaboradores: Frank sin Otra
• Kanban (desarrollo) Fuente: [Link] Colaboradores: Lourdes Cardenal, In-
vadibot, Elvisor, Marco. unno, Jarould, Bossarro, Galo Jerez y Anónimos: 9
• Kit de desarrollo de software Fuente: [Link] Colaboradores:
Aleator, Laura Fiorucci, Bryant1410, TXiKiBoT, Humberto, Biasoli, Shooke, Marcecoro, Quijav, LucienBOT, MastiBot, Ambil, Die-
gusjaimes, MystBot, Gua-naiko-che, SuperBraulio13, Xqbot, Rubinbot, RedBot, MarioGL, PatruBOT, Cifz, EmausBot, ZéroBot, Chuis-
pastonBot, Cybelmar, KLBot2, Minsbot, Elvisor, Javier casas sevilla, BOTito y Anónimos: 1∪
• Kommander Fuente: [Link] Colaboradores: CEM-bot, Phirosiberia, Moi-
[Link], Loveless, StarBOT, KLBot2 y Anónimos: 3
3∪∨ CAPÍTULO 205. ZENPHP
• Pure data Fuente: [Link] Colaboradores: Aloriel, Dodo, Ejmeza, Jar l, Cinabrium,
Mescalier, Edub, Taichi, Orgullobot~eswiki, [Link], Yucon, Dibujon, Deprieto, Yrbot, Acracia, FlaBot, YurikBot, GermanX, Marb,
→l, Gizmo II, CEM-bot, Di erentSmoke~eswiki, Mpeinadopa, Sergeeo, VolkovBot, [Link], Shooke, Muro Bot, Dinopmi, Loveless,
Drinibot, Botellín, LordT, LucienBOT, Angel GN, Luckas-bot, MystBot, Angelalg, DanielrocaES, ArthurBot, KLBot, KLBot2, El erno,
DerProspekt, Elvisor y Anónimos: 2∩
• QuadTIN Fuente: [Link] Colaboradores: Lobillo, Alex1∧090, Tito HX, PaintBot y Die-
goFb
• Query string Fuente: [Link] Colaboradores: Taichi, Rembiapo pohyiete (bot), Va-
rano, GermanX, Lobillo, The Photographer, CEM-bot, Resped, PaintBot, BOTarate, Ortellado, MystBot, DiegoFb, Xqbot, D'ohBot,
KLBot2, Vichock, Ytotrip, Elvisor y Anónimos: ∧
• Quest3D Fuente: [Link] Colaboradores: Vanbasten 23, Benjavalero, BOTijo, GermanX,
Thijs!bot, Calapito, Biasoli, Loveless, Tirithel, Alexaltea, Kroji, MastiBot, Sbarrera, MystBot, KLBot2 y Anónimos: 3
• Quine (programa) Fuente: [Link] Colaboradores: Pieter, Robbot, Zwobot,
Renabot, OMenda, RobotQuistnix, Chobot, Yrbot, BOTijo, YurikBot, YoungSpinoza, C-3POrao, Eskimbot, Spc, BOTpolicia, CEM-bot,
JoaquinFerrero, Ajavier, Rulo∪∨, Dusan, Matdrodes, Elabra sanchez, Valenluis, [Link], El bot de la dieta, Amoceann~eswiki,
MastiBot, Luckas-bot, Kizar, Abece, KamikazeBot, GrouchoBot, Addbot y Anónimos: 11
• Rebanamiento estático Fuente: [Link] Colaboradores: Kiekvo-
gel, Airunp, Orgullobot~eswiki, Yrbot, Bai to, Lobillo, SieBot, BOTarate, Obersachsebot, BenzolBot, Angelito∩, Ll0l00l, KLBot2 y Anó-
nimos: 2
• Recolector de basura Fuente: [Link] Colaboradores: Comae, Dodo, Opi-
nador, Niqueco, LeonardoRob0t, Gelo∩1, Yrithinnd, Emijrp, Rembiapo pohyiete (bot), Orgullobot~eswiki, Unf, Afpineda, Yrbot, FlaBot,
YurikBot, GermanX, Beto29, KnightRider, Ban eld, BOTpolicia, Qwertyytrewqqwerty, Ch guer, CEM-bot, Thijs!bot, Ñuño Martínez,
JAnDbot, ColdWind, Rei-bot, Biasoli, AlnoktaBOT, Technopat, AlleborgoBot, SieBot, Loveless, Mutari, XalD, Rizziac, Louperibot, Mas-
tiBot, Diegusjaimes, Victormoz, Luckas-bot, Nallimbot, Xqbot, Hprmedina, RedBot, PatruBOT, TjBot, GrouchoBot, EmausBot, Savh,
WikitanvirBot, MerlIwBot, Elvisor, Addbot y Anónimos: 33
• Recursión Fuente: [Link] Colaboradores: Sabbut, [Link], JorgeGG, Cdlfd,
Zwobot, Triku, Sms, Pabloa, Rembiapo pohyiete (bot), Magister Mathematicae, Orgullobot~eswiki, RobotQuistnix, Yrbot, Bai to, Dagavi,
BOTijo, Equi, CarCar, Jesuja, Ban eld, José., Jarke, Paintman, Calsbert, CEM-bot, -jem-, Davius, Ingenioso Hidalgo, Escarbot, JAnDbot,
Soulbot, Kakico, TXiKiBoT, HiTe, Humberto, Netito∩∩∩, Amanuense, Miguelmrm, Matdrodes, Amitie 10g, Peregring-lk, Ensada, Daniel
Ajoy, Farisori, Eduardosalg, Alejandrocaro3∧, Poco a poco, BodhisattvaBot, Raulshc, AVBOT, Diegusjaimes, MelancholieBot, Carsrac-
Bot, Arjuno3, Luckas-bot, Fabiocalde, ArthurBot, Secdio, Xqbot, Bitarray, Ricardogpn, Carlospretelt, TiriBOT, KamikazeBot, EmausBot,
MerlIwBot, Jnjnjn, Acratta, Addbot, DarkBlueZV, BenjaBot, [Link] y Anónimos: ∨2
• Refactorización Fuente: [Link] Colaboradores: Sabbut, Pilaf, Rsg, Wi-
kier~eswiki, LeonardoRob0t, [Link], Taichi, RobotQuistnix, Platonides, Yrbot, YurikBot, Wiki-Bot, GermanX, Eskimbot, Cals-
bert, JAnDbot, TXiKiBoT, Rei-bot, Idioma-bot, Aibot, VolkovBot, Muro Bot, BotMultichill, El bot de la dieta, PipepBot, Amischol,
[Link], UA31, MastiBot, ArthurBot, SuperBraulio13, Xqbot, Kismalac, EmausBot, ZéroBot, ChuispastonBot, KLBot2 y Anónimos: 4
• Re exión (informática) Fuente: [Link] Colaborado-
res: Fibonacci, Pilaf, Yrithinnd, Chobot, GermanX, KnightRider, Moiwiki, CEM-bot, Santhy, Thijs!bot, JoaquinFerrero, Gusgus, Bia-
soli, Dusan, VolkovBot, Elabra sanchez, Gerakibot, SieBot, Asclepios~eswiki, Arjuno3, Felipe Raimann, [Link], JackieBot,
KLBot2, Makecat-bot y Anónimos: 11
• Relación de compresión (informática) Fuente: [Link]
A1tica)?oldid=349∩240∪ Colaboradores: Neurotronix
• Resolución de problemas de programación Fuente: [Link]
C3%B3n?oldid=∪4∪2∩∩90 Colaboradores: Vivero, Jesuja, CEM-bot, LMLM, Queninosta, Edmenb, Alejandrocaro3∧, Botito∩∩∩, Camilo,
AVBOT, Angel GN, Botarel, AstaBOTh1∧, BOTirithel, Hprmedina, Iwèr, MercurioMT, Helmy oved, Jarould y Anónimos: 23
• Usuario:Santhy/En edición/Instancia (programación) Fuente: [Link]
Instancia_(programaci%C3%B3n)?oldid=∨∩39∪4∪1 Colaboradores: Santhy
• Anexo:Scan code Fuente: [Link] Colaboradores: Murphy era un optimista,
Rembiapo pohyiete (bot), GermanX, Ciencia Al Poder, CEM-bot, R2D2!, Snakeyes, Muro Bot, Xqbot, EmausBot, WikitanvirBot, Addbot
y Anónimos: 2
• Scanf Fuente: [Link] Colaboradores: Dodo, Ascánder, Jesuja, Faelomx, [Link], CEM-
bot, Jorgelrm, RoyFocker, Hameryko, VolkovBot, Shooke, Muro Bot, Loveless, MacaBot, AntonCampos, Botito∩∩∩, AVBOT, Luckas-bot,
Kurt∪∨, Eññe, Dreitmen, WikitanvirBot, KLBot2, Pccoronado, JacobRodrigues, Monty programador y Anónimos: 22
• SCons Fuente: [Link] Colaboradores: Hari Seldon, Lin linao, Paintman, Anonimato1990,
Dalacost, Thijs!bot, Muro Bot, LordT, UA31, Amirobot, Nallimbot, Xqbot, D'ohBot, KLBot, FranKapranos, KLBot2, Invadibot, Osoram-
bolo y Anónimos: 1
• Screen scraping Fuente: [Link] Colaboradores: RobotQuistnix, Cacique∧00,
Teufelskerl, VolkovBot, Rapto, Leonpolanco, [Link], UA31, DiegoFb, Ortisa, Grillitus, Mentibot, KLBot2, Biblio lotranstornado, Pro-
fesorFavalli y Anónimos: 1
• Sección crítica Fuente: [Link] Colaboradores: ManuelGR, Co-
mae, Dodo, Robotito, Rembiapo pohyiete (bot), Orgullobot~eswiki, RobotQuistnix, Francosrodriguez, Toxickore, Martincarr, GermanX,
Lobillo, CEM-bot, Dogor, Hameryko, JAnDbot, Antipatico, Aibot, VolkovBot, Muro Bot, BotMultichill, SieBot, PaintBot, Loveless, Cous-
teau, Alexbot, MastiBot, MelancholieBot, Luckas-bot, Xqbot, WikitanvirBot, Elvisor, Addbot y Anónimos: ∪
• Serialización Fuente: [Link] Colaboradores: Angus, Boticario, Rembiapo
pohyiete (bot), Viko~eswiki, RobotQuistnix, Yrbot, YurikBot, GermanX, The Photographer, Ban eld, Cad, Qwertyytrewqqwerty, Ch -
guer, CEM-bot, Byzs, BotMultichill, SieBot, Inuyasha1111, [Link], HUB, AVBOT, Luckas-bot, Jackie, Almabot, Jkbw, MauritsBot,
BOTirithel, JackieBot, KLBot2, Victorvic1 y Anónimos: 20
390 CAPÍTULO 205. ZENPHP
205.3.2 Imágenes
• Archivo:Actual_DEC_UNIX_License_Plate_DSC_0317.jpg Fuente: [Link]
DEC_UNIX_License_Plate_DSC_031∩.jpg Licencia: CC BY-SA 3.0 Colaboradores: Trabajo propio Artista original: Armandops
• Archivo:Ada_Lovelace_1838.jpg Fuente: [Link] Licencia:
Public domain Colaboradores:
From The Ada Picture Gallery.
Evelyn Silva scanned this from a picture she found “in the trash”in Louisiana, USA, and submitted it to the Ada Picture Gallery in
October 2000. She wrote: On the bottom of the picture it says “LONDON PUBLISHED NOV 1 1838 FOR THE PROPRIETORS, No 18 &
19 SOUTHAMPTON PLACE, EUSTON SQUARE, NEW ROAD”. In the lower left corner it says “Printered by Mc Queen”. On the lower
right of the picture its “Engraved By W. H. Mote”. On the left “Drawn by A.E. Chaton R.A.”. There was also a page with a bio on it.
This was not in a book when I found it, it was loose along with some other Ladies of the Queens court. So I don't have any other info on it. It
is an original print from its time, not a reproduction.