Você está na página 1de 430

Programacin.

ndice general
1

Programacin

1.1

Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2

Lxico y programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.3

Programas y algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4

Compilacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.5

Programacin e ingeniera del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.6

Referencias histricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.7

Objetivos de la programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.8

Ciclo de vida del software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.9

Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.10 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.11 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Portal:Programacin

&

3.1

Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.2

Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.3

Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Acoplamiento secuencial

4.1

Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4.2

Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Adobe Director

5.1

Interfaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5.2

Timeline

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5.3

Director y Flash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

5.4

Shockwave / Shockwave 3D

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

5.5

Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

5.6

Enlaces externos

10

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Anidamiento (informtica)

12

6.1

12

En las planillas de clculo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


i

ii

NDICE GENERAL
6.2

En programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

6.3

Vase tambin

12

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Antipatrn de diseo

13

7.1

Algunos antipatrones de desarrollo de software . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

7.1.1

Antipatrones de gestin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

7.1.2

Antipatrones de gestin de proyectos . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

14

7.1.3

Antipatrones generales de diseo de software

. . . . . . . . . . . . . . . . . . . . . . . .

14

7.1.4

Antipatrones de programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

7.1.5

Antipatrones metodolgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

7.1.6

Antipatrones de gestin de la conguracin

. . . . . . . . . . . . . . . . . . . . . . . . .

16

7.2

Algunos antipatrones organizacionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

7.3

Relacin alfabtica de otros antipatrones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

7.4

Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

7.5

Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

Archivo de cabecera

21

8.1

Motivacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

8.2

Alternativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

8.3

Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

8.4

Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

Asercin (informtica)

24

9.1

Uso de las aserciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

9.1.1

Aserciones en el diseo por contrato . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

9.1.2

Aserciones en tiempo de ejecucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

9.1.3

Aserciones durante el ciclo de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

9.1.4

Aserciones estticas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

9.2

Desactivacin de las aserciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

9.3

Comparacin con los manejadores de errores . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

9.4

Enlaces externos

26

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10 Automatizacin de tareas

27

11 Base de cdigo

28

11.1 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12 Bean

28
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

13.3 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

13.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

14 Bifurcacin (sistema operativo)

31

14.1 UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

14.2 Vase tambin

31

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15 Binding

32

15.1 Psicologa y educacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

15.2 Informtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

15.3 Derecho mercantil

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

15.4 Enlaces externos


16 Bloqueo mutuo

33

16.1 Representacin de Bloqueos Mutuos usando grafos . . . . . . . . . . . . . . . . . . . . . . . . . .

33

16.2 Condiciones necesarias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

16.3 Evitando bloqueos mutuos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

16.5 Livelock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

16.4 Prevencin

17 Bodyshopping

35

17.1 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

18 BrookGPU

36

19 Caja blanca (sistemas)

37

19.1 Vase tambin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


20 Caja negra (sistemas)

37
38

20.1 Justicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

20.2 Caja negra y programacin modular

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

20.3 Pruebas de software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

20.4 Caja negra vs 'Cajanegrizar' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

38

20.5 Vase tambin

38

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21 CamelCase

40

21.1 Usos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

21.2 Enlaces externos

40

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22 Caml
22.1 Ejemplos

41
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22.1.1 Hola Mundo

41

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

22.1.2 Funcin factorial (recursividad y programacin puramente funcional) . . . . . . . . . . . .

41

22.1.3 Derivacin numrica (funciones de alto orden) . . . . . . . . . . . . . . . . . . . . . . . .

41

22.1.4 Transformada Wavelet discreta (concordancia de patrones) . . . . . . . . . . . . . . . . .

42

iv

NDICE GENERAL
22.2 Vase tambin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

22.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

22.4 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

22.4.1 Libros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42

23 Cierre de exclusin mutua

43

23.1 Primitivas y uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

23.2 Bloqueos en bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

24 Clase utilidad

44

24.1 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

25 Clear.gif

45

26 CMake

46

26.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

26.2 Documentacin y tutoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

26.3 Principales funcionalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

26.4 CTest, CPack, CDash . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

26.5 Aplicaciones que utilizan CMake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

26.6 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

26.7 Enlaces externos


27 Codecademy

48

27.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

27.2 Code Year

48

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27.3 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

27.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

27.5 Enlaces externos

49

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28 Cdigo cerrado
28.1 Vase tambin

50
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

50

29 Cdigo compilado

51

30 Cdigo mutante

52

31 Cdigo objeto

53

31.1 Cdigo objeto en lenguajes de programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

31.2 Errores comunes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

31.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53

31.4 Enlaces externos

53

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32 Ofuscacin
32.1 Informtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54
54

NDICE GENERAL

32.1.1 Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

32.2 Otros objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

32.3 Enlaces externos

55

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33 ColdFusion

56

33.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

56

33.2 Versiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

56

33.3 Ejemplos de cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57

33.4 Enlaces externos

57

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34 Coloreado de sintaxis

58

34.1 Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

34.2 Programas con coloreado de sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

58

34.3 Vase tambin

58

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35 Comentario (informtica)

59

35.1 Informacin general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

59

35.2 Usos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

59

35.2.1 Planeacin / Revisin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

35.2.2 Descripcin de cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

35.2.3 Descripcin algortmica

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

35.2.4 Inclusin de recursos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

35.2.5 Depuracin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

35.2.6 Generacin de documentacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

35.3 Estilos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

35.3.1 Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

35.4 Curiosidades

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.1 Ensamblador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.2 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.3 C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.4 Delphi

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.5 Lua . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.6 Ruby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.7 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.8 Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.9 Javascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.10 cdigo HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.11 SQL

62

35.5 Ejemplos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35.5.12 Visual Basic

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.13 Pauscal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.5.14 PHP

62

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

vi

NDICE GENERAL
35.5.15 Cobol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.6 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

62

35.7 Enlaces externos

63

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

36 Compatibilidad (informtica)

64

36.1 Problemas de compatibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

36.2 Emulacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

36.3 OpenSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

36.4 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

64

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

36.5 Enlaces externos

37 Competicin Internacional Universitaria ACM de Programacin

66

37.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66

37.2 Reglas de la competicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

66

37.3 Competiciones locales, regionales y nal mundial

. . . . . . . . . . . . . . . . . . . . . . . . . .

67

37.4 Lista de competiciones regionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

37.5 Ganadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

37.6 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

37.7 Enlaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

37.7.1 Jueces en Lnea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

38 Computacin parasitaria

69

38.1 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

69

38.2 Enlaces externos

69

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39 Conectiva lgica

70

39.1 Lenguajes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

39.1.1 Lenguaje natural . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

39.1.2 Lenguajes formales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

39.2 Lista de conectivos lgicos comunes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

39.2.1 Lista de conectivos lgicos comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70

39.2.2 Historia de las notaciones

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

71

39.4 Propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

39.5 Ciencias de la computacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

72

39.6 Conectivas por el nmero de argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

39.6.1 Sin argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

39.6.2 Con un argumento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

39.6.3 Con dos argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

39.3 Redundancia

39.7 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

39.8 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

39.9 Enlaces externos

73

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

NDICE GENERAL

vii

40 Conguracin regional

74

40.1 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

74

40.2 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

74

40.3 Enlaces externos

74

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41 Conteo de referencias
41.1 Vase tambin

75
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

42 Convencin de Nombres (Programacin)

75
76

42.1 Benecios potenciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

42.2 Desafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

42.3 El valor del negocio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

42.4 Elementos comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

42.4.1 Longitud de identicadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

42.4.2 Maysculas, minsculas y nmeros

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

42.4.3 Identicadores de varias palabras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

42.5 Metadatos y convenciones hbridas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

42.5.1 Notacin hngara . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

42.5.2 Notacin posicional

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

42.5.3 Esquema de palabra compuesta (del lenguaje) . . . . . . . . . . . . . . . . . . . . . . . .

78

42.6 Convenciones especcas del lenguaje

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

42.6.2 Ada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

78

42.6.3 C y C++

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

42.6.4 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

42.6.5 JavaScript

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

42.6.6 Lisp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

42.6.7 .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

42.6.8 Objective-C

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

42.6.9 Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

42.6.10 Python y Ruby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

42.6.1 ActionScript

42.7 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

42.8 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

42.9 Enlaces externos

80

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43 Cracking (software)
43.1 Vase tambin

81
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

81

44 Cuaderno de carga

82

45 Curricacin

83

45.1 Nomenclatura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

45.2 Denicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

viii

NDICE GENERAL
45.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

45.4 Enlaces externos

83

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46 Cdigo enhebrado

84

46.1 Historia que llev al cdigo enhebrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

84

46.2 Desarrollo del cdigo enhebrado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

46.3 Modelos de enhebrado

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

46.3.1 Enhebrado directo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

46.3.2 Enhebrado indirecto

86

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46.3.3 Enhebrado de subrutina

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

46.3.5 Enhebrado de Human . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

46.3.6 Enhebrados menos usados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

46.4 Bifurcaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

46.5 Amenidades comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

46.6 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

46.7 Lectura adicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

46.8 Vase tambin

88

46.3.4 Enhebrado de token

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47 Cdigo inalcanzable
47.1 Causas

89

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

47.2 Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

47.3 Anlisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

47.3.1 Proling

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

47.5 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

47.6 Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

47.7 Enlaces externos

90

47.4 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48 Cdigo muerto

91

48.1 Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

48.2 Anlisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

48.3 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

48.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

48.5 Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

91

48.6 Enlaces externos

91

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49 Cdigo redundante
49.1 Ejemplos

93

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

93

49.2 Eliminacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

93

49.3 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

93

49.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

93

NDICE GENERAL

ix

50 Dato

94

50.1 Vase tambin


50.2 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

94

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

94

51 Depuracin de programas

95

51.1 Origen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

95

51.2 Aplicacin

95

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

51.3 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

52 Desarrollador de software
52.1 Vase tambin

95
96

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53 Desarrollo en cascada

96
97

53.1 Fases del modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

97

53.1.1 Anlisis de requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

97

53.1.2 Diseo del Sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

97

53.1.3 Diseo del Programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

53.1.4 Codicacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

53.1.5 Pruebas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

53.1.6 Vericacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

53.1.7 Mantenimiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

53.2 Variantes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

53.3 Ventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

53.4 Desventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

53.5 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

53.6 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

99

53.7 Enlaces externos

99

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54 Desarrollo en espiral
54.1 Introduccin

100

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

54.2 Ciclos o Iteraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100


54.2.1 Tareas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

54.3 Mecanismos de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101


54.4 Variaciones del Modelo En Espiral . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
54.5 Ventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
54.6 Desventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
54.7 Inconvenientes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

54.8 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

54.9 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102


54.10Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

55 Desarrollo iterativo y creciente


55.1 Concepto de desarrollo iterativo y creciente

103
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

NDICE GENERAL
55.2 Ciclo de vida

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

55.2.1 Consideraciones sobre el momento de aplicacin

. . . . . . . . . . . . . . . . . . . . . . 103

55.2.2 Etapa de inicializacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104


55.2.3 Etapa de iteracin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

55.3 Caso prctico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104


55.4 Caractersticas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

55.5 Ventajas del desarrollo incremental . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105


55.6 Ventajas del desarrollo iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
55.7 Debilidades de este modelo de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
55.8 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

55.9 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106


56 Deteccin dinmica de invariantes

107

56.1 Implementaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107


57 Diagrama de colaboracin

108

57.1 Usos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108


57.2 Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
57.3 Mensajes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

57.4 Flujos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109


57.5 Cambios en versiones recientes de UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
58 Diagrama de ujo

110

58.1 Normas de trabajo

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

58.2 Descripcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111


58.3 Tipos de diagramas de ujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
58.4 Simbologa y signicado

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

58.5 Cursograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112


58.5.1 Simbologa y normas del cursograma

. . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

58.6 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112


58.7 Ventajas de los diagramas de ujo

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

58.8 Software para diseo de diagramas de ujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113


58.9 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

58.10Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
58.11Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

59 Diagrama Nassi-Shneiderman

114

59.1 Descripcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114


59.2 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
59.3 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

59.3.1 Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114


60 di

115

NDICE GENERAL

xi

60.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115


60.2 Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
60.3 Uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
60.4 Variantes

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

60.4.1 Edit script

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

60.5 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116


60.6 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

60.7 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

61 Direccin de retorno

118

62 Diseo estructurado

119

62.1 Etapas del Diseo estructurado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119


62.1.1 Descomposicin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

62.1.2 Jerarqua de mdulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119


62.1.3 Independencia

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

62.2 Evaluando el diseo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120


62.2.1 Acoplamiento

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

62.2.2 Cohesin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120


62.2.3 Fan-In y Fan-Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
62.3 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

63 Distancia de Damerau-Levenshtein

122

63.1 Vase tambin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122


63.2 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

63.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122


64 Distancia de Levenshtein

123

64.1 El algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123


64.2 Implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
64.2.1 C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
64.2.2 C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
64.2.3 C#

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

64.2.4 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124


64.2.5 Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
64.2.6 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
64.2.7 Ruby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
64.2.8 PHP
64.2.9 Delphi

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

64.2.10 VB.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125


64.2.11 ActionScript 3.0

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

64.2.12 ColdFusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125


64.2.13 JavaScript (NodeJS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

xii

NDICE GENERAL
64.3 Aplicaciones

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

64.4 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

64.5 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125


65 DLO

126

65.1 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126


66 Driver Chain Manager

127

66.1 Qu hace? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127


66.1.1 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
66.1.2 Capacidades de DCM

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

66.1.3 Cuestiones fuera del alcance de DCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127


66.2 Sotrware que utiliza DCM

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

66.2.1 Aplicaciones que utilizan DCM


66.2.2 Empresas desarrolladoras

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

66.2.3 Sistemas operativos que soportan DCM . . . . . . . . . . . . . . . . . . . . . . . . . . 128


66.3 Funcionamiento de la cadena de drivers
66.3.1 El problema

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

66.3.2 Forma de solucionarlo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128


66.4 Otras aplicaciones que utilizan DCM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
66.5 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

66.6 Fuentes y referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128


67 Dublin Core

129

67.1 Descripcin general . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129


67.2 Clasicacin y elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
67.3 Usos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
67.4 Ventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
67.5 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
68 eAthena
68.1 Enlaces externos

132
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

69 Efecto Hover

133

69.1 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133


69.2 Enlaces de inters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
70 Emtp

134

70.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134


70.2 ATP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
70.3 Mtodo de solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
70.4 Distribucin de EMTP-ATP
70.5 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

70.6 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

NDICE GENERAL

xiii

71 Enlace dinmico

135

72 Enlace esttico

136

73 Enlazado

137

74 Entrada chapuza

138

74.1 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

74.2 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

75 Error de software

139

75.1 Orgenes del trmino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139


75.2 Defectos de diseo de programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
75.3 Errores de programacin comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
75.4 Defectos de instalacin o programacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

75.5 Cdigos de errores de lenguajes de programacin


75.6 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . 140

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

75.7 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140


75.8 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

76 Estilo de programacin

142

76.1 Caractersticas del estilo

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

76.1.1 Nombres de variable apropiadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142


76.1.2 Estilo de indentacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
76.1.3 Valores booleanos en estructuras de decisin . . . . . . . . . . . . . . . . . . . . . . . . . 142
76.1.4 Bucles y estructuras de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
76.1.5 Espaciado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
76.2 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

76.3 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

76.3.1 Convenciones de cdigo en castellano . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143


76.3.2 Convenciones de cdigo en ingls

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

76.3.3 Convenciones de cdigo de proyectos


77 Eventos del ratn
77.1 Vase tambin

144
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

78 Exclusin mutua (informtica)


78.1 Vase tambin
79 Expresin regular

. . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

145

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
146

79.1 Construccin de expresiones regulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146


79.2 Aplicaciones

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

79.3 Las expresiones regulares en programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147


79.4 Descripcin de las expresiones regulares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

xiv

NDICE GENERAL
79.4.1 El punto ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
79.4.2 La admiracin "!"

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

79.4.3 La barra inversa o antibarra "\" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148


79.4.4 Los corchetes "[ ]" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
79.4.5 La barra "|" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
79.4.6 El signo de dlar "$" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
79.4.7 El acento circunejo "^" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
79.4.8 Los parntesis "()" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
79.4.9 El signo de interrogacin "?" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
79.4.10 Las llaves "{}" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
79.4.11 El asterisco "*" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
79.4.12 El signo de suma "+" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
79.4.13 Grupos annimos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
79.5 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

80 Flag

153

80.1 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

81 Front-end y back-end

154

81.1 Informtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154


81.2 Tecnologa

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

81.3 Vase tambin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155


81.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
82 Fuga de memoria
82.1 RAII

156

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

82.2 Fugas de memoria en lenguajes con recolector de basura . . . . . . . . . . . . . . . . . . . . . . . 156


82.3 Vase tambin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
83 Generacin de cdigo

158

83.1 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

84 Generador de nmeros aleatorios


84.1 Algoritmos

159

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

84.2 Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160


84.3 Enlaces externos
85 Gledplay

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
161

85.1 Dispositivos Soportados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161


85.2 GledDraw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
85.3 GledVideo

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

85.4 GledSave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162


85.5 GledApplication

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

85.6 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

NDICE GENERAL

xv

86 GPGPU

163

86.1 Modelo de programacin GPU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163


86.2 Herramientas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
86.3 Crticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
86.4 Otros

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

86.5 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

86.6 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

87 Hackathon

165

87.1 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165


87.2 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

88 Hacker

166

88.1 Otros signicados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166


88.2 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
88.2.1 ARPANET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
88.2.2 UNIX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
88.2.3 GNU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
88.2.4 LINUX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
88.3 tica hacker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
88.4 Controversia

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

88.4.1 Ambigedad y debate

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168

88.5 Activismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169


88.6 Terminologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
88.6.1 OverHat

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

88.6.2 White hat y black hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169


88.6.3 Samuri

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

88.6.4 Phreaker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170


88.6.5 Lamer o script-kiddie

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

88.6.6 Newbie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170


88.7 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170

88.8 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170


88.9 Descripcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
88.10Enlaces externos
89 Heisenbug

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
172

89.1 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172


89.2 Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
90 Hoja de estilo
90.1 Vase tambin
90.2 Enlaces externos

173
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

90.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

xvi

NDICE GENERAL

91 Hola mundo
91.1 Vase tambin

174
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

91.2 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

91.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174


92 Homebrew

175

92.1 Generalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175


92.2 Homebrew en diferentes consolas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
92.2.1 Sega Dreamcast

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

92.2.2 Nintendo Entertainment System (NES) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176


92.2.3 Super Nintendo Entertainment System (SNES) . . . . . . . . . . . . . . . . . . . . . . . . 176
92.2.4 Nintendo DS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
92.2.5 Sony PSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
92.2.6 Microsoft Xbox

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

92.2.7 Microsoft Xbox 360 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177


92.2.8 Nintendo Wii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
92.2.9 PlayStation 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
92.3 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

92.4 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178


93 ICONIX
93.1 Ventajas de Iconix

179
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

93.2 Tareas de la metodologa Iconix

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

93.2.1 Fase 1: Anlisis de requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179


93.2.2 Fase 2: Anlisis y diseo preliminar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
93.2.3 Fase 3: Diseo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
93.2.4 Fase 4: Implementacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

93.3 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179


93.4 Conceptos Relacionados
93.5 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

93.5.1 Fase 2: Anlisis y diseo preliminar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180


93.5.2 Fase 3: Diseo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
93.5.3 Fase 4: Implementacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

93.6 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180


93.7 Conceptos Relacionados
93.8 Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

94 Anexo:Implementaciones de Smalltalk

181

95 Anexo:Implementaciones para algoritmo de rut

182

95.1 Objective-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182


95.2 C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
95.3 Visual Basic MS Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

NDICE GENERAL

xvii

95.4 C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
95.5 Perl 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
95.6 Javascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
95.7 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
95.8 Transact-SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
95.9 MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
95.10PSeInt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
95.11Python
95.12Ruby

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

95.13Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
95.14Pl/pgsql de PostgreSql

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183

96 Inanicin (informtica)

185

97 Indireccin

186

98 Infraestructura de lenguaje comn

187

98.1 Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

99 Ingeniera de software

189

99.1 Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189


99.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
99.3 Recursos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

99.3.1 Recurso humano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191


99.3.2 Recursos de software reutilizables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
99.3.3 Recursos de entorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
99.4 Implicaciones socioeconmicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
99.4.1 Econmicamente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
99.4.2 Socialmente
99.5 Notaciones

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

99.5.1 LUM (lenguaje unicado de modelado) o UML . . . . . . . . . . . . . . . . . . . . . . . 191


99.5.2 BPMN (notacin para el modelado de procesos de negocios)

. . . . . . . . . . . . . . . . 191

99.5.3 Diagrama de ujo de datos (DFD) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191


99.6 Herramienta CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
99.7 Metodologa

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

99.7.1 Etapas del proceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192


99.7.2 Ventajas* [22] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
99.8 Modelos y Ciclos de Vida del Desarrollo de Software

. . . . . . . . . . . . . . . . . . . . . . . . 195

99.8.1 Modelo en cascada o clsico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195


99.8.2 Modelo de prototipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
99.8.3 Modelo en espiral

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

99.8.4 Modelo de desarrollo por etapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196


99.8.5 Modelo Incremental o Iterativo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

xviii

NDICE GENERAL
99.8.6 Modelo RAD (rapid application development) . . . . . . . . . . . . . . . . . . . . . . . . 197
99.8.7 Modelo de desarrollo concurrente

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

99.8.8 Proceso unicado del desarrollo de software . . . . . . . . . . . . . . . . . . . . . . . . . 197


99.9 Producto

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

99.10Naturaleza de la Ingeniera de Software

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

99.11Participantes y papeles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198


99.11.1 Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
99.11.2 Desarrolladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
99.11.3 Gestores

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

99.11.4 Usuarios nales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199


99.11.5 Cdigo tico de un ingeniero de software

. . . . . . . . . . . . . . . . . . . . . . . . . . 199

99.12Educacin tica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200


99.12.1 Organizaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
99.13Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

99.14Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
99.15Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
99.16Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201

100Instancia (informtica)
100.1Etimologa

202

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

100.2Programacin basada en clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202


100.2.1 Clases como objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
100.3Programacin basada en prototipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
100.4Notas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
100.5Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
101Instruccin (informtica)

204

101.1Campos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
101.2Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
101.3Repertorio

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

101.4Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

102Interfaz binaria de aplicaciones

206

102.1Descripcin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
102.2EABI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
102.3Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207

102.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
102.5Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
103Interfaz uida

208

103.1Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
103.2Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

NDICE GENERAL

xix

104Invariante (informtica)

210

104.1Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

105Jframe
105.1Herencia

211
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

105.2Constructores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
105.3Mtodos propios de la clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
105.4Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

106Usuario discusin:Juliasocorro

213

107Kanban (desarrollo)

215

107.1El mtodo Kanban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215


107.2Los principios del mtodo Kanban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
107.3Cinco prcticas centrales del mtodo Kanban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
107.4Comportamiento emergente con Kanban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
107.5La implementacin del mtodo Kanban . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
107.6Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
107.7Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

108Kit de desarrollo de software

218

108.1Incompatibilidad de licencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218


108.2SDK para aadidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
108.3Trminos ms especcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
108.4Ejemplos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

108.5Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
108.6Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

108.7Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

109Kommander

220

109.1El editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220


109.2El ejecutor

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

109.3Direcciones de Kommander
110Last Error (informtica)
110.1Errores personalizados

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
221

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221

110.2En DELPHI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221


110.3Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221

111Lnea de cdigo fuente


111.1El uso de medidas de LCF

222
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

111.2Programas para contar lneas de cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223


111.2.1 Software Libre/Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
111.2.2 Freeware (software no libre) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

xx

NDICE GENERAL
111.2.3 Comerciales

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

111.2.4 Basados en web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223


111.3Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

111.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
111.5Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

112Macintosh Toolbox

225

113Macro

226

113.1Macros de aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226


113.2Macros en programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
113.3Macros ocultas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

113.4Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

114Malla de tringulos 3D

227

114.1Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
114.2Obtencin de las mallas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
114.3Compresin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
115Mapeo objeto-relacional

229

115.1El problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229


115.2Implementaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
115.3Bases de datos distintas a SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230
115.4Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

115.5Enlaces relacionados

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

116Mquina de estados

231

117Mquina desnuda

232

118MCML

233

118.1Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

119Metaprogramacin

234

119.1Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234


120Microformatos Dublin Core

235

121Modelo de prototipos

236

121.1Etapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
121.2Ventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
121.3Inconvenientes
121.4Conclusiones
121.5Vase tambin
122Modicador

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
238

NDICE GENERAL

xxi

122.1Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

123Modularidad

239

123.1Modularidad en Ciencias de la Computacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239


123.2Modularidad en Biologa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
123.3Modularidad en Economa y en la Empresa

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

123.4Modularidad en el diseo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239


123.5Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
123.6Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240

124Mdulo (informtica)

241

124.1Caractersticas de un mdulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241


124.2Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241

125Monitor (concurrencia)

242

125.1Componentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
125.2Exclusin mutua en un monitor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
125.3Tipos de monitores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
125.3.1 Tipo Hoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
125.3.2 Tipo Mesa

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

125.4Vericacin de monitores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243


125.4.1 Inicializacin de las variables del monitor

. . . . . . . . . . . . . . . . . . . . . . . . . . 244

125.4.2 Monitores tipo Hoare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244


125.4.3 Monitores tipo Mesa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
125.5Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

125.6Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
126Anexo:Motores de persistencia

245

126.0.1 ColdFusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245


126.0.2 Common Lisp

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245

126.0.3 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245


126.0.4 JavaScript

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245

126.0.5 .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246


126.0.6 Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
126.0.7 PHP

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

126.0.8 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247


126.0.9 Ruby . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
126.0.10Smalltalk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
126.0.11C++

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

127Mtodo de depuracin del patito de goma


127.1Vase tambin

248

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

127.2Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

xxii

NDICE GENERAL

127.3Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

128Net Yaroze

249

128.1Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

128.2Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

128.3Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
129Nodo (informtica)

251

129.1Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
129.2Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

130Notacin Reddick

252

130.1Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
130.2Notacin para objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
130.3Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

131Notacin hngara
131.1Ejemplos

253

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

131.2Situacin actual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253


131.2.1 Ejemplo notaciones de 1 carcter
131.3Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

132Null

254

133NWNScript

255

133.1Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255

134Objeto todopoderoso

256

134.1Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
134.2Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
134.3Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

135Oday

257

136Oset (informtica)

258

136.1Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258

136.2Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
137OGNL

259

137.1Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
137.2Cadenas (chains) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
137.3Proyectos que usan OGNL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
137.4Enlaces externos
138OpenACS
138.1Arquitectura

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
260

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260

NDICE GENERAL

xxiii

138.2Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
138.3Vase tambin
138.4Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260

139Operaciones con archivos (informtica)


139.1Vase tambin

261

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

140Operador

262

140.1Operadores en un espacio vectorial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262


140.2Operadores bilineales o bivariantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
140.3Tipos generales de operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
140.3.1 Operadores de condicin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
140.3.2 Operadores de orden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
140.3.3 Operadores lgicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
140.3.4 Operaciones aritmticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
140.4Otros operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
140.5Temas relacionados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
140.6Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
141Operando

265

141.1En informtica

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

141.2Conexiones externas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

141.2.1 Matemtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265


141.2.2 Informtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
142Paquetes en PL/SQL

266

142.1Especicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
142.2Cuerpo

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266

143Pascal Casing

268

143.1Enlaces externos
144Patch (Unix)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
269

144.1Contexto de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269


144.2Enlaces externos
145Phrogram

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
270

145.1Detalles tcnicos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270

145.2Hola, Mundo! en KPL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270


145.3Filosofa

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270

145.4Otra informacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270


145.5The Phrogram Company . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
145.6Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

xxiv

NDICE GENERAL

146Plataforma de desarrollo
146.1Vase tambin

272

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272

147Plataforma virtual didctica

273

147.1Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
147.2Herramientas que las componen

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

147.3Para que sirven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273


147.4Autores y contribuyentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
147.5Ventajas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
147.6Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
147.7Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
147.8Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274

148Polling

275

148.1Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
148.2Polling del registro de Windows

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275

148.3Soluciones para el polling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275


148.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
148.5Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276

149Poltergeist (informtica)
149.1Consecuencias

277

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

149.2Solucin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
149.3Vase tambin
149.4Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

150Portabilidad
150.1Vase tambin

278
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278

150.2Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
151Postcondicin

279

151.1Vase tambin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279


152Pragma

280

152.1Programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
152.2Vase tambin
152.3Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280

153Precondicin

281

153.1Vase tambin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281


154Primitiva de sincronizacin rendezvous

282

154.1Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
154.2Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

NDICE GENERAL

xxv

155Proceso (informtica)

283

155.1Creacin de un proceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284


155.2Terminacin de un proceso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
155.3Estados de un proceso

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

155.4Tipos de procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285


155.5Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285

155.6Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
155.7Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
156Proceso para el desarrollo de software

286

156.1Generalidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
156.2Actividades del desarrollo de software

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

156.2.1 Planicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286


156.2.2 Implementacin, pruebas y documentacin

. . . . . . . . . . . . . . . . . . . . . . . . . 286

156.2.3 Despliegue y mantenimiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287


156.3Modelos de Desarrollo de Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
156.3.1 Modelo de cascada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
156.3.2 Modelo de espiral

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

156.3.3 Desarrollo iterativo e incremental

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

156.3.4 Desarrollo gil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288


156.3.5 Codicacin y correccin
156.3.6 Orientado a la Reutilizacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

156.4Modelos de mejora de procesos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289


156.5Mtodos formales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
156.6Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

156.7Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
156.8Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

157Programa informtico

291

157.1Programacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
157.1.1 Paradigmas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
157.1.2 Compilado o interpretando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
157.1.3 Programas que se auto-modican

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

157.2Ejecucin y almacenamiento de los programas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292


157.2.1 Programas empotrados en hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
157.2.2 Programas cargados manualmente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
157.2.3 Programas generados automticamente

. . . . . . . . . . . . . . . . . . . . . . . . . . . 293

157.2.4 Ejecucin simultnea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293


157.3Categoras funcionales
157.4Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

157.5Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
157.6Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

xxvi

NDICE GENERAL

157.7Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

158Programa interactivo

296

158.1Frente a Procesamiento por lotes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296


158.1.1 Ventajas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

158.1.2 Inconvenientes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296


158.2Ejemplos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

158.2.1 Cajero automtico

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

158.2.2 Compresor de archivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296


159Programacin lineal paramtrica

297

159.1Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
160Programacin visual

298

160.1Programacin orientada a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298


160.2Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298

161Programador

299

161.1Resea histrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299


161.2Funciones del programador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
161.3Especialidades

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300

161.4Notas y referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300


161.5Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300

162Pseudocdigo
162.1Aplicaciones

301
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

162.2Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
162.3Denicin de datos del pseudocdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
162.4Funciones y operaciones

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302

162.5Estructuras de control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302


162.5.1 Estructuras secuenciales

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302

162.5.2 Estructuras selectivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302


162.5.3 Estructuras iterativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
162.5.4 El anidamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
162.6Desarrollo de algoritmos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303

162.7Funciones y procedimientos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304

162.8Ventajas del pseudocdigo sobre los diagramas de ujo


162.9Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . 304

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304

162.10Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
162.11Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
162.12Vase tambin
163Puente de aplicacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
305

NDICE GENERAL

xxvii

164Puntero inteligente

306

164.1Punteros inteligentes en Boost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306


164.1.1 Scoped pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
164.1.2 Shared pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
164.2Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
165Pure data

308

165.1Tipos de objetos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309

165.2Objetos ms importantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309


165.3Instalacin en GNU posibles problemas y soluciones . . . . . . . . . . . . . . . . . . . . . . . . . 310
165.4Introduccin rpida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
165.5Bibliotecas pdp, pidip y opencv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
165.6Patch patrones

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311

165.7Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

165.8Material en espaol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312


165.9Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

166QuadTIN

313

167Query string

314

167.1Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314

168Quest3D

315

168.1Entorno de desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315


168.1.1 Lgica de las aplicaciones

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315

168.1.2 Orientacin a objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315


168.1.3 Editores

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315

168.1.4 Publicacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315


168.2Requerimientos del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
168.3Licencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
168.4Aplicaciones

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316

168.5Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
168.6Enlaces externos
169Quine (programa)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
317

169.1Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
169.1.1 C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
169.1.2 C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
169.1.3 Scheme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
169.1.4 Common Lisp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
169.1.5 Ocaml . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
169.1.6 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
169.1.7 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318

xxviii

NDICE GENERAL
169.1.8 Perl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
169.1.9 BASIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
169.1.10Pascal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
169.1.11Brainfuck . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
169.1.12HQ9+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
169.1.13DOS Batch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
169.1.14PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
169.1.15PL/I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
169.1.16PostScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319
169.1.17Visual FoxPro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

169.2Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319


170Rebanamiento esttico

320

170.1Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
170.2Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320

170.3Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
170.4Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
171Recolector de basura

321

171.1Breve resea histrica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321


171.2Contexto

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

171.3Cmo funciona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321


171.4Ventajas y desventajas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322

171.5Cmo se implementa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322


171.6Ejemplos de lenguajes con recolector de basura
171.7Vase tambin
171.8Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . 322

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322

172Recursin

323

172.1Recursin en matemticas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324

172.1.1 Conjuntos denidos de forma recurrente . . . . . . . . . . . . . . . . . . . . . . . . . . . 324


172.1.2 Funciones denidas de forma recurrente . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
172.1.3 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
172.1.4 Resolucin de problemas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
172.2Recursin en informtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
172.3Humor recursivo
172.4Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325

172.5Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
172.6Enlaces externos
173Refactorizacin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
326

173.1Refactorizacin de cdigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326


173.2Refactorizacin de otros textos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326

NDICE GENERAL
173.3Etimologa

xxix
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

173.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
173.5Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

174Reexin (informtica)

328

174.1Implementacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
174.2Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
174.2.1 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
174.2.2 C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
174.3Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328

175Relacin de compresin (informtica)

329

175.0.1 Vase tambin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329


176Resolucin de problemas de programacin

330

176.1Anlisis del problema informtico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330


176.2Diseo del algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
176.2.1 Acciones elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
176.2.2 Secuencia de acciones elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
176.2.3 Composicin condicional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
176.2.4 Composicin condicional doble (alternativa) . . . . . . . . . . . . . . . . . . . . . . . . . 331
176.2.5 Composicin condicional mltiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
176.2.6 Composicin iterativa o bucle
176.3Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332

177Instancia (programacin)

333

177.1Programacin basada en clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333


177.1.1 Clases como objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
177.2Programacin basada en prototipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
177.3Notas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
177.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
178Anexo:Scan code

335

179scanf

336
179.0.1 Modicantes de longitud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336

179.1Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
179.2Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
179.3Funciones derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
179.3.1 fscanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
179.3.2 sscanf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
179.4Vase tambin
179.5Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339

xxx

NDICE GENERAL

180SCons
180.1Vase tambin

340
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340

180.2Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340

181Screen scraping
181.1Vase tambin

341
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341

182Seccin crtica
182.1Vase tambin

342
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342

183Serializacin

343

183.1Usos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
183.2Soporte en los lenguajes de programacin
183.3Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343

184Sigil

344

185Signatura (informtica)

345

186Signum Framework

346

186.1Caractersticas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346

186.1.1 Elementos de Signum Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346


186.1.2 Entidades primero

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346

186.1.3 Generacin del esquema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346


186.1.4 Herencia de entidades

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346

186.1.5 Interfaz de usuario y WCF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347


186.1.6 LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
186.2Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
186.3Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347

187Simple Network Library


187.1Origen del nombre

348
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348

187.2Desarrollo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
187.3Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348

187.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
187.5Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
187.5.1 Documentacin de SNL
187.6Enlaces externos
188Smarty
188.1Caractersticas

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
349
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349

188.2Crticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
188.3Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
188.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350

NDICE GENERAL

xxxi

188.5Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350

189Snippet

351

189.1Rich snippets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351


189.2Enlaces externos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
190Stack Overow

352

190.1Funcionamiento de Stack Overow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352


190.2Reputacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
190.3Moderacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
190.4Estadsticas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
191StarBasic

354

191.1Primer virus para OpenOce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354


191.2Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354

192Stub

355

192.1Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
192.2Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355

193Subalgoritmo

356

193.1Tipos de subalgoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356


193.2mbito de las variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
193.3Paso de argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
193.4Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356

194Tabla de saltos

357

194.1Ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
194.2Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
194.3Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358

195Tabla de verdad

359

195.1Deniciones en el clculo lgico

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359

195.2Nmero de combinaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360


195.2.1 Para cero variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
195.2.2 Para una variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
195.2.3 Para dos variables
195.3Tablas de verdad

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361

195.3.1 Verdad Indeterminada o Contingencia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361


195.3.2 Contradiccin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362

195.3.3 Tautologas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362


195.4Tablas de verdad, proposiciones lgicas y argumentos deductivos
195.5Aplicaciones

. . . . . . . . . . . . . . . . . . 362

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362

195.5.1 Clculo lgico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362

xxxii

NDICE GENERAL
195.5.2 Lgica de circuitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
195.5.3 Desarrollo del algoritmo fundamental en lgica de circuitos . . . . . . . . . . . . . . . . . 363

195.6Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364

195.7Notas y referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365


195.8Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365

196Thunk

366

196.1Invocacin por gestionada a no gestionada

. . . . . . . . . . . . . . . . . . . . . . . . . . . 366

196.2Invocacin por no gestionada a gestionada

. . . . . . . . . . . . . . . . . . . . . . . . . . . 366

196.3Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
197Tipo de dato elemental

367

198Tringulo de Floyd

368

198.1Algoritmo computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368


198.2Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368

198.3Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
199Tubera (informtica)

369

199.1Vase tambin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369


200Violacin de acceso

371

200.1Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371

201Waf

372

201.1Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
201.2Historia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372
201.3Ejemplo Waf archivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
201.4Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373

201.5Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
201.6Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373

202Win32 Thread Information Block


202.1Contenido del TIB

374

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374

202.2Acceso al TIB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374


202.3Enlaces externos
203Wrapper

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
375

203.1Computacin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
203.2Vase tambin

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375

203.3Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
204XAML
204.1Tecnologa
204.2Ejemplos

376
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376

NDICE GENERAL
204.3Vase tambin

xxxiii
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376

204.4Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
204.5Enlaces externos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377

205Zenphp
205.1Qu es zenphp?

378
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378

205.2Qu ventajas ofrece zenphp?

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378

205.3Origen del texto y las imgenes, colaboradores y licencias . . . . . . . . . . . . . . . . . . . . . . 379


205.3.1 Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
205.3.2 Imgenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
205.3.3 Licencia del contenido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396

Captulo 1

Programacin
La programacin informtica, acortada como programacin, es el proceso de disear, codicar, depurar y
mantener el cdigo fuente de programas computacionales. El cdigo fuente es escrito en un lenguaje de programacin. El propsito de la programacin es crear programas que exhiban un comportamiento deseado. El proceso
de escribir cdigo requiere frecuentemente conocimientos en varias reas distintas, adems del dominio del lenguaje a utilizar, algoritmos especializados y lgica formal. Programar no involucra necesariamente otras tareas
tales como el anlisis y diseo de la aplicacin (pero s el
diseo del cdigo), aunque s suelen estar fusionadas en
el desarrollo de pequeas aplicaciones.

trivial como multiplicar dos nmeros puede necesitar un


conjunto de instrucciones en lenguaje ensamblador, en
un lenguaje de alto nivel bastar con solo una. Una vez
que se termina de escribir un programa, sea en ensamblador o en algunos lenguajes de alto nivel, es necesario compilarlo, es decir, traducirlo completo a lenguaje
mquina.* [1] Eventualmente ser necesaria otra fase denominada comnmente link o enlace, durante la cual se
anexan al cdigo, generado durante la compilacin, los
recursos necesarios de alguna biblioteca. En algunos lenguajes de programacin, puede no ser requerido el proceso de compilacin y enlace, ya que pueden trabajar en
modo intrprete. Esta modalidad de trabajo es equivalente
pero se realiza instruccin por instruccin, a medida
Del proceso de programacin surge lo que comnmente
que
es ejecutado el programa.
se conoce como software (conjunto de programas), aunque estrictamente este ltimo abarca mucho ms que solo
la programacin.

1.2 Lxico y programacin


1.1 Historia

La programacin se rige por reglas y un conjunto ms o


menos reducido de rdenes, expresiones, instrucciones y
comandos que tienden a asemejarse a una lengua natural
acotada (en ingls); y que adems tienen la particularidad
de una reducida ambigedad. Cuanto menos ambiguo es
un lenguaje de programacin, se dice, es ms potente. Bajo esta premisa, y en el extremo, el lenguaje ms potente
existente es el binario, con ambigedad nula (lo cual lleva
a pensar as del lenguaje ensamblador).

Para crear un programa, y que la computadora lo interprete y ejecute las instrucciones escritas en l, debe escribirse en un lenguaje de programacin. En sus inicios
las computadoras interpretaban solo instrucciones en un
lenguaje especco, del ms bajo nivel, conocido como
cdigo mquina, siendo ste excesivamente complicado
para programar. De hecho solo consiste en cadenas de
nmeros 1 y 0 (sistema binario). Para facilitar el trabajo
de programacin, los primeros cientcos, que trabajaban en el rea, decidieron reemplazar las instrucciones,
secuencias de unos y ceros, por palabras o abreviaturas
provenientes del ingls; las codicaron y crearon as un
lenguaje de mayor nivel, que se conoce como Asembly
o lenguaje ensamblador. Por ejemplo, para sumar se podra usar la letra A de la palabra inglesa add (sumar).
En realidad escribir en lenguaje ensamblador es bsicamente lo mismo que hacerlo en lenguaje mquina, pero
las letras y palabras son bastante ms fciles de recordar
y entender que secuencias de nmeros binarios. A medida que la complejidad de las tareas que realizaban las
computadoras aumentaba, se hizo necesario disponer de
un mtodo sencillo para programar. Entonces, se crearon los lenguajes de alto nivel. Mientras que una tarea tan

En los lenguajes de programacin de alto nivel se distinguen diversos elementos entre los que se incluyen el lxico propio del lenguaje y las reglas semnticas y sintcticas.

1.3 Programas y algoritmos


Un algoritmo es una secuencia no ambigua, nita y ordenada de instrucciones que han de seguirse para resolver un problema. Un programa normalmente implementa
(traduce a un lenguaje de programacin concreto) uno o
ms algoritmos. Un algoritmo puede expresarse de distintas maneras: en forma grca, como un diagrama de
ujo, en forma de cdigo como en pseudocdigo o un
1

CAPTULO 1. PROGRAMACIN

lenguaje de programacin, en forma explicativa, etc.


Los programas suelen subdividirse en partes menores, llamadas mdulos, de modo que la complejidad algortmica
de cada una de las partes sea menor que la del programa
completo, lo cual ayuda al desarrollo del programa. Esta
es una prctica muy utilizada y se conoce como reno
progresivo.
Segn Niklaus Wirth, un programa est formado por los
algoritmos y la estructura de datos.

puede almacenarse solo de forma temporal. Un programa


podra tener partes escritas en varios lenguajes, por ejemplo, Java, C, C++ y ensamblador, que se podran compilar
de forma independiente y luego enlazar juntas para formar un nico mdulo ejecutable.

1.5 Programacin e ingeniera del


software

Se han propuesto diversas tcnicas de programacin cuyo objetivo es mejorar tanto el proceso de creacin de Existe una tendencia a identicar el proceso de creacin
software como su mantenimiento. Entre ellas, se pueden de un programa informtico con la programacin, que es
mencionar las siguientes:
cierta cuando se trata de programas pequeos para uso
personal, y que dista de la realidad cuando se trata de
grandes proyectos.
Programacin declarativa
Programacin estructurada
Programacin modular
Programacin orientada a objetos

1.4 Compilacin
El programa escrito en un lenguaje de programacin de
alto nivel (fcilmente comprensible por el programador)
es llamado programa fuente y no se puede ejecutar directamente en una computadora. La opcin ms comn
es compilar el programa obteniendo un mdulo objeto,
aunque tambin puede ejecutarse en forma ms directa a
travs de un intrprete informtico.
El cdigo fuente del programa se debe someter a un
proceso de traduccin para convertirlo a lenguaje mquina o bien a un cdigo intermedio, generando as un mdulo denominado objeto. A este proceso se le llama
compilacin.

El proceso de creacin de software, desde el punto de vista de la ingeniera, incluye mnimamente los siguientes
pasos:
1. Reconocer la necesidad de un programa para solucionar un problema o identicar la posibilidad de
automatizacin de una tarea.
2. Recoger los requisitos del programa. Debe quedar
claro qu es lo que debe hacer el programa y para
qu se necesita.
3. Realizar el anlisis de los requisitos del programa.
Debe quedar claro qu tareas debe realizar el programa. Las pruebas que comprueben la validez del
programa se pueden especicar en esta fase.
4. Disear la arquitectura del programa. Se debe descomponer el programa en partes de complejidad
abordable.

5. Implementar el programa. Consiste en realizar un


Habitualmente la creacin de un programa ejecutable (un
diseo detallado, especicando completamente totpico.exe para Microsoft Windows o DOS) conlleva dos
do el funcionamiento del programa, tras lo cual la
pasos. El primer paso se llama compilacin (propiamente
codicacin (programacin propiamente dicha) dedicho) y traduce el cdigo fuente escrito en un lenguaje
bera resultar inmediata.
de programacin almacenado en un archivo de texto a
6. Probar el programa. Comprobar que pasan pruebas
cdigo en bajo nivel (normalmente en cdigo objeto, no
que se han denido en el anlisis de requisitos
directamente a lenguaje mquina). El segundo paso se
llama enlazado en el cual se enlaza el cdigo de bajo ni7. Implantar (instalar) el programa. Consiste en poner
vel generado de todos los cheros y subprogramas que se
el programa en funcionamiento junto con los comhan mandado compilar y se aade el cdigo de las funcioponentes que pueda necesitar (bases de datos, redes
nes que hay en las bibliotecas del compilador para que el
de comunicaciones, etc.).
ejecutable pueda comunicarse directamente con el sistema operativo, traduciendo as nalmente el cdigo objeto
a cdigo mquina, y generando un mdulo ejecutable.
La ingeniera del software se centra en los pasos de plaEstos dos pasos se pueden hacer por separado, almace- nicacin y diseo del programa, mientras que antiguanando el resultado de la fase de compilacin en archivos mente (programacin artesanal) la realizacin de un proobjetos (un tpico .o para Unix, .obj para MS-Windows, grama consista casi nicamente en escribir el cdigo, baDOS); para enlazarlos en fases posteriores, o crear direc- jo solo el conocimiento de los requisitos y con una motamente el ejecutable; con lo que la fase de compilacin desta fase de anlisis y diseo.

1.8. CICLO DE VIDA DEL SOFTWARE

1.6 Referencias histricas


El trabajo de Ada Lovelace, hija de Anabella Milbanke Byron y Lord Byron, realiz para la mquina de
Babbage le hizo ganarse el ttulo de primera programadora de computadoras del mundo, aunque Babbage nunca complet la construccin de la mquina. El nombre del
lenguaje de programacin Ada fue escogido como homenaje a esta programadora.

1.7 Objetivos de la programacin

3
Portabilidad. Un programa es portable cuando tiene
la capacidad de poder ejecutarse en una plataforma,
ya sea hardware o software, diferente a aqulla en la
que se desarroll. La portabilidad es una caracterstica muy deseable para un programa, ya que permite, por ejemplo, a un programa que se ha elaborado
para el sistema GNU/Linux ejecutarse tambin en la
familia de sistemas operativos Windows. Esto permite que el programa pueda llegar a ms usuarios
ms fcilmente.

1.8 Ciclo de vida del software

La programacin debe perseguir la obtencin de programas de calidad. Para ello se establece una serie de factores El trmino ciclo de vida del software describe el desaque determinan la calidad de un programa. Algunos de los rrollo de software, desde la fase inicial hasta la fase nal,
incluyendo su estado funcional. El propsito es denir las
factores de calidad ms importantes son los siguientes:
distintas fases intermedias que se requieren para validar
Correctitud. Un programa es correcto si hace lo que el desarrollo de la aplicacin, es decir, para garantizar que
debe hacer tal y como se estableci en las fases pre- el software cumpla los requisitos para la aplicacin y vevias a su desarrollo. Para determinar si un progra- ricacin de los procedimientos de desarrollo: se asegura
ma hace lo que debe, es muy importante especi- que los mtodos utilizados son apropiados. Estos mtodos
car claramente qu debe hacer el programa antes de se originan en el hecho de que es muy costoso recticar
su desarrollo y, una vez acabado, compararlo con lo los errores que se detectan tarde dentro de la fase de implementacin (programacin propiamente dicha), o peor
que realmente hace.
aun, durante la fase funcional. El modelo de ciclo de vida
Claridad. Es muy importante que el programa sea permite que los errores se detecten lo antes posible y por
lo ms claro y legible posible, para facilitar tanto su lo tanto, permite a los desarrolladores concentrarse en la
desarrollo como su posterior mantenimiento. Al ela- calidad del software, en los plazos de implementacin y
borar un programa se debe intentar que su estructu- en los costos asociados. El ciclo de vida bsico de un softra sea sencilla y coherente, as como cuidar el es- ware consta de, al menos, los siguientes procedimientos:
tilo de programacin. De esta forma se ve facilita Denicin de objetivos: denir el resultado del prodo el trabajo del programador, tanto en la fase de
yecto y su papel en la estrategia global.
creacin como en las fases posteriores de correccin
de errores, ampliaciones, modicaciones, etc. Fases
Anlisis de los requisitos y su viabilidad: recopilar,
que pueden ser realizadas incluso por otro prograexaminar y formular los requisitos del cliente y examador, con lo cual la claridad es an ms necesaria
minar cualquier restriccin que se pueda aplicar.
para que otros puedan continuar el trabajo fcilmente. Algunos programadores llegan incluso a utilizar
Diseo general: requisitos generales de la arquitecArte ASCII para delimitar secciones de cdigo; una
tura de la aplicacin.
prctica comn es realizar aclaraciones en el cdigo
Diseo en detalle: denicin precisa de cada subfuente utilizando lneas de comentarios. Contrariaconjunto de la aplicacin.
mente, algunos por diversin o para impedirle un
anlisis cmodo a otros programadores, recurren al
Programacin (programacin e implementacin): es
uso de cdigo ofuscado.
la implementacin en un lenguaje de programacin
para crear las funciones denidas durante la etapa de
Eciencia. Se trata de que el programa, adems de
diseo.
realizar aquello para lo que fue creado (es decir, que
Prueba de unidad: prueba individual de cada subsea correcto), lo haga gestionando de la mejor forconjunto de la aplicacin para garantizar que se imma posible los recursos que utiliza. Normalmente,
plementaron de acuerdo con las especicaciones.
al hablar de eciencia de un programa, se suele hacer referencia al tiempo que tarda en realizar la ta Integracin: para garantizar que los diferentes
rea para la que ha sido creado y a la cantidad de
mdulos y subprogramas se integren con la aplicamemoria que necesita, pero hay otros recursos que
cin. ste es el propsito de la prueba de integracin
tambin pueden ser de consideracin para mejorar
que debe estar cuidadosamente documentada.
la eciencia de un programa, dependiendo de su na Prueba beta (o validacin), para garantizar que el
turaleza (espacio en disco que utiliza, trco en la
software cumple con las especicaciones originales.
red que genera, etc.).

CAPTULO 1. PROGRAMACIN
Documentacin: se documenta con toda la informacin necesaria, sea funcional nal para los usuarios
del software (manual del usuario), y de desarrollo
para futuras adaptaciones, ampliaciones y correcciones.
Mantenimiento: para todos los procedimientos correctivos (mantenimiento correctivo) y las actualizaciones secundarias del software (mantenimiento
continuo).

1.11 Enlaces externos

Wikimedia Commons alberga contenido multimedia sobre Programacin. Commons

Wikcionario tiene deniciones y otra informacin sobre programacin.Wikcionario

Wikiquote alberga frases clebres de o sobre


El orden y la presencia de cada uno de estos procedimienProgramacin. Wikiquote
tos en el ciclo de vida de una aplicacin dependen del tipo
de modelo de ciclo de vida acordado entre el cliente y el Wikilibros
equipo de desarrolladores.

1.9 Vase tambin

Portal:Programacin. Contenido relacionado


con Programacin.

Wikiproyecto:Informtica/Programacin
error de software
losofas del desarrollo de software
historia de la ingeniera del software
ingeniera en computacin
Desarrollo De Software
ingeniera en informtica
lnea de cdigo fuente
lenguaje de programacin
programacin automtica
programacin dirigida por eventos
programacin estructurada
programacin extrema
programacin en pareja
programacin dinmica
programacin orientada a objetos
pruebas de software
software

1.10 Referencias
[1] Laboda, Xavier; Josep Galimany, Rosa Mara Pena, Antoni Gual (1985). Software. Biblioteca prctica de la
computacin. Barcelona: Ediciones Ocano-xito, S.A.

Wikilibros alberga un libro o manual sobre


Fundamentos de programacin.

Captulo 2

Portal:Programacin

Captulo 3

&
El signo en s es una ligadura combinacin de diseo de
dos letras en un nico grafema, usado primero para aumentar la velocidad de la escritura manualdesarrollada
por Marco Tulio Tirn, secretario del gran orador romano
Cicern. Para poder registrar los discursos y la correspondencia dictada por este ltimo, Tiro, que era un esclavo liberto, invent varias formas de acelerar la escritura, siendo por ello considerado el padre de la taquigrafa. En la
Edad Media o en los primeros tiempos de la imprenta el
uso de ligaduras era muy comn, en este caso por la economa de espacio, cuando la materia prima pergamino
o papelaada mucho al precio de los libros.

Et redirige aqu. Para otras acepciones, vase


E. T.

Evolucin de la ligadura &:


1-3, cursivas romanas de los siglos ii-iv
4-5, minsculas medievales de los siglos vi-vii
6, minscula carolingia, s. ix.

Tambin se le conoce como signo tironiano.

El signo &, cuyo nombre en espaol es et,* [1] es una alternativa grca de la conjuncin copulativa latina et, que
signica y de la que deriva la espaola y.

3.1 Historia

Es conocido tambin por su nombre en ingls ampersand,


proveniente a su vez de la expresin and per se and, es decir, y por s mismo, y, antiguamente usada como parte
de la retahla para la memorizacin del alfabeto.
Deriva del latn de donde el signo pas a diversos idiomas,
incluido el espaol. Su uso en nuestra lengua es superuo,
pues no resulta econmico (a diferencia de otros idiomas)
ya que la conjuncin copulativa y tiene una grafa ms
breve y sencilla. En textos espaoles antiguos es frecuente
encontrarlo empleado en la expresin latina adoptada et
El et latino a la izquierda se encuentra estilizado, pero la forma
cetera, en las formas &c. o &cetera.
itlica a la derecha revela sus orgenes de la palabra del latn et.

Un uso extendido es el que persiste en la bibliografa acadmica en ingls, en la enumeracin de los autores, in- El smbolo fue usado en el antiguo Imperio romano, y su
cluidas la expresin como & al. (del latn et alii, plural uso data del primer siglo d.C. Se adjudica su invencin a
masculino, o et alia, plural neutro) que se traduce como Marco Tulio Tirn.* [2]
y otros.
Para el siglo viii, la caligrafa occidental estaba bien desarrollada, particularmente en la forma uncial, escritura insular y minscula carolingia. Los calgrafos hicieron un
extensivo uso del et, ya que la condensacin de una palabra en una sola letra haca su trabajo ms fcil. Durante
aquel tiempo, se desarroll una versin mucho ms comprimida del et. Normalmente se le llama ampersandRoEn la tipografa de la derecha es evidente el origen de la ligadura mana.
et.

En HTML se usa al comienzo de los cdigos de entidad


Como se observa en la lista de letras de Byrhtfer (ao con que se designan los caracteres especiales: los ejem1011), este signo & fue considerado a menudo como plos ms tpicos son &gt; &lt;, y &amp; (>, < y &,
una letra ms al nal del alfabeto latino.
respectivamente).
6

3.3. ENLACES EXTERNOS


En Internet y direcciones web, & simboliza la separacin
de variables pasadas mediante GET.
En Excel, se usa para concatenar celdas.
En la lnea de comando (CLI) de Bash (Bourne Again
Shell) Zbash, etc. usadas en Unix, GNU/Linux y *BSD
se usa & al nal de una orden para ejecutarla en segundo
plano.

3.2 Referencias
[1] Real Academia Espaola (2001). Apndice 4: Lista de
smbolos o signos no alfabetizables. Diccionario de la
lengua espaola. Consultado el 25 de septiembre de 2012.
[2] The History of Court Reporting. National Court Reporters Association.

3.3 Enlaces externos

Wikimedia Commons alberga contenido multimedia sobre &Commons.

Wikcionario tiene deniciones y otra informacin sobre &.Wikcionario

Wikcionario tiene deniciones y otra informacin sobre ampersand.Wikcionario

Apndice 4: Lista de smbolos o signos no alfabetizables en la pgina de la Real Academia Espaola.

Captulo 4

Acoplamiento secuencial
En Programacin orientada a objetos el antipatrn de diseo acoplamiento secuencial se reere a una clase que
requiere que sus mtodos sean llamados en un orden secuencial particular.
Los mtodos cuyo nombre comienza por Init, Begin, en
Inicio, etc puede indicar la existencia de acoplamiento
secuencial.
Usando el ejemplo de un coche a modo de analoga, si el
usuario sigue los pasos de acelerar sin antes arrancar el
motor, el coche no se mueve y enva una Excepcin.
Las excepciones son aceptables en algunas ocasiones porque los programas (en particular los grandes) necesitan la
informacin para determinar por qu en un objeto no se
est realizando el comportamiento esperado cuando uno
de sus mtodos es llamado. La inicializacin de objetos
no siempre es posible en el constructor y puede ser necesario retrasarla a un momento posterior.
El acoplamiento secuencial puede ser reprogramado con
el Template Method (patrn de diseo)* [1] para superar
los problemas planteados por el uso de este antipatrn.

4.1 Vase tambin


Antipatrn de diseo
Patrn de diseo

4.2 Referencias
[1] Andriy, Buday. Refactor: Acoplamiento secuencial =>
Template Method. The Code Project. Consultado el 23
de abril de 2011.

Captulo 5

Adobe Director
Adobe Director Es una aplicacin de Desarrollo de
Software (o Autora de Software) Multimedia (que inspir a Adobe Flash ) destinado para la produccin de
programas ejecutables ricos en contenido multimedia. Es
considerada una de las herramientas ms poderosas de
integracin y programacin de medios digitales, debido a
su versatilidad de poder incorporar imgenes, audio, vdeo digital, pelculas ash, y un engine 3D, en una sola
aplicacin, y manipularlas a travs de un lenguaje de programacin (Lingo; Javascript).

Con el lanzamiento de Director 11 y su evolucin a la


versin 11.5, de la mano de Adobe, se incorpor soporte para DirectX y se extendieron las capacidades en 3D
basadas en el engine PhysX de NVIDIA, importacin de
3D desde Google SketchUp, as como tambin ltros de
bitmaps, canales de audio 5.1, vdeo en alta denicin,
soporte para H.264, e integracin de Adobe Flash CS3
y Shockwave Player 11. Director 12, lanzado en febrero de 2013, incorpor la posibilidad de publicacin para
dispositivos iOS, adems de otras utilidades como esteDesarrollado a nes de los aos 80 por la empresa reoscopa, nuevos efectos, y nuevas potencialidades del
Macromedia, es distribuido desde el ao 2008 por Adobe engine 3D.
Systems Incorporated.
Adobe Director, permite crear y publicar juegos interactivos, prototipos, simulaciones y cursos eLearning para la
Web, dispositivos iOS, sistemas de escritorio Windows
y Mac, DVDs y CDs. Con Director tambin es posible
programar una amplia gama de aplicaciones basadas en
redes, lo que ha permitido crear innumerables sistemas y
juegos multiusuario online.

5.1

Interfaz

A lo largo de todas sus versiones, la interfaz de Director ha sido el a su concepcin inicial, y a su nombre:
entregarle al desarrollador un escenario (Stage), para el
armado de su Aplicacin. Cada uno de los mltiples medios que pueden ser utilizados en Director son consideradosactores(casts), cuyas caractersticas pueden ser
manipuladas a travs de guiones (o Scripts) escritos en
lenguaje Lingo o Javascript. En sntesis, el desarrollador
es el director de su propia pelcula, controlando todos sus
aspectos.

Director tambin permite la manipulacin de modelos en


3D, gracias a Shockwave 3D. Es as como diversos programas de modelamiento, como 3D Studio MAX (de la
empresa Autodesk), permiten exportar sus modelos (incluyendo las animaciones) en formato Shockwave 3D, el
que puede ser importado a Director, y manipulado a travs de instrucciones. A travs de variados Xtras (como
Havok), Director tambin puede manipular propiedades
fsicas de modelos 3D (como por ejemplo, gravedad, coecientes de roce, restitucin, etc) que permiten lograr simulaciones ms realistas, tanto para software de ingeniera avanzada, como para juegos.

5.2 Timeline
1985: VideoWorks (Disponible para Apple Macintosh)
1988: Director 1.0

Adems del potente lenguaje incorporado (Lingo), una


de sus principales ventajas radica en el uso de los llamados xtras. Se trata de pequeos programas(plugins)
desarrollados en lenguaje C++ por otros usuarios o terceras empresas, que proporcionan al usuario innidad de
utilidades.

1993: Macromind Director se convierte en Macromedia Director (v 3.1.3)


1994: Macromedia Director 4 (Plataformas Windows y Powermac)

Se pueden generar varios tipos de archivos, sin embargo lo ms normal es crear un archivo ejecutable para
Windows (.exe) o Macintosh (.app). De esta forma puede verse la presentacin en cualquier ordenador, sin tener
instalado Adobe Director.

1996: Macromedia Director 5 (Aparicin de Shockwave)


1997: Macromedia Director 6 (Implementacin de
Behaviors & y soporte mp3)
9

10
1997: Macromedia Director 6.5 (integracin de
Xtras)

CAPTULO 5. ADOBE DIRECTOR

5.4 Shockwave / Shockwave 3D

Desde la aparicin de Director 5, Shockwave es el for 1998: Macromedia Director 7 (Se re-escribi el en- mato exclusivo de publicacin para web de Director. El
gine)
plugin de shockwave permite ejecutar aplicaciones realizadas en Director (archivos DCR), a travs de Internet,
2000: Macromedia Director 8
sin que estas pierdan su calidad ni caractersticas, adems
de aprovechar al mximo las potencialidades de aquellas
2001: Macromedia Director 8.5 (Aparicin de que poseen engine multiusuario. Con la aparicin de Director 8.5, Shockwave tuvo un nuevo impulso, al incorShockwave3D)
porar capacidades de manipulacin de elementos en 3D
2002: Macromedia Director MX (Tambin conoci- (Shockwave 3D). Esto abri las puertas a los desarrolladores de Director a un nuevo mundo, a partir del cual fue
do como Director 9)
posible crear ambientes modelados en 3D (generados en
2004: Macromedia Director MX 2004 (Tambin Director, o importados como archivos W3D desde aplicaciones externas) y utilizar toda la riqueza del cdigo linconocido como Director 10)
go / javascript, para manipular dichos modelos en tiempo
real.
2008: Adobe Director 11
El motor 3D de Shockwave es todava el lder indiscutible en su mercado, y hace que este plugin sea muy popular
entre un gran nmero de desarrolladores de juegos en lnea y de jugadores. Los archivos Flash (swf) pueden ser
2010: Adobe Director 11.5.8
incorporados a Director y ser ejecutados en Shockwave,
2013: Adobe Director 12. (Publicacin a dispositi- pero no a la inversa.
vos iOS, estereoscopa, mejora de Engine 3D)
Otras caractersticas no incorporadas por Flash incluyen un motor de render mucho ms rpido, junto con
aceleracin 3D por medio de hardware, acceso directo
al pxel en imgenes bitmap, diferentes modos de ltrado
5.3 Director y Flash
para composiciones en capas de los grcos y compatibilidad con diversos protocolos de red, incluido Internet
Histricamente, la comunidad ms cercana a Flash y Relay Chat. Adems, a travs de los Xtras, los desarrodesconocedora de Director, tiende a preguntarse sobre lladores pueden ampliar la funcionalidad de Shockwave
las comparaciones entre ambos programas. Literalmen- con aplicaciones hechas a medida.
te, Director y Flash no son competidores. Flash naci en
1996, orientado al desarrollo de aplicaciones multimedia
Macromedia Shockwave Player, instalado en un
en Web, y en poco tiempo evolucion poderosamente de
50% de los navegadores. Ficheros con extensin
la mano del lenguaje ActionScript. Director naci varios
".dcrdesarrollados con Adobe Director
aos antes (1985), y evolucion como una poderosa herramienta de integracin de medios digitales de alta cali Macromedia Flash Player, instalado en un 98%
dad para plataformas de escritorio, y que tambin gener
de los navegadores. Utiliza cheros con extensin
una arista para su incorporacin a Web (Shockwave).
".swfdesarrollados con Macromedia Flash, Macro 2009: Adobe Director 11.5

La evolucin de la popularidad de Flash sobre Shockwave tiene varias explicaciones; no solo el plugin de Shockwave fue histricamente ms pesado y menos amigable
de instalar que Flash, sino tambin la autora de Director siempre ha requerido la mano de un desarrollador de
software, con conocimientos en programacin; en cambio
Flash se posicion rpidamente en el universo de diseadores Web (sin necesidad de poseer conocimientos de
programacin), y de hecho ha incentivado con los aos el
aprendizaje de programacin ActionScript a varios no
programadores, generando una importante sinergia en
el mundo del diseo y la programacin -antes estrictamente lejanos-. Por otro lado, Macromedia logr acuerdos con empresas como DELL y Apple, para que Flash
sea preinstalado en sus sistemas, evitando que los usuarios
deban instalar software adicional.

media FreeHand, Generator y otras aplicaciones.

5.5 Referencias
5.6 Enlaces externos
Sitio ocial de Adobe Director
Adobe Director Forum
Director-Online.com Foro temtico sobre el programa (en ingls).
Foro de usuarios de Adobe Director (en ingls).

5.6. ENLACES EXTERNOS


Dean's Director Tutorials, sitio web con tutoriales
del programa (en ingls).
IEEE History Center: John Thompson, inventor of
Lingo Programming Language Biografa de John
Thompson, inventor del lenguaje de programacin
Lingo(en ingls).

11

Captulo 6

Anidamiento (informtica)
El anidamiento (llamado nesting en ingls) es la
prctica de incorporar llamadas (calls) a funciones o
procedimientos (unas) dentro de otras, mediante la inclusin de diversos niveles de parntesis.

linea, ruta as string dim valor_a_devolver as integer


ruta="C:\Probar.csvif FileExists(ruta) then open
C:\Probar.csvfor input as #1 do while not EOF(1)
line input #1, linea if left(linea, 3)=cod then 'Realizar
Debido a que la potencial acumulacin de stos ltimos una accin o varias acciones End if loop close #1
suele hacer que la edicin y la deteccin de errores se BuscarCodigo=valor_a_devolver end function
vuelva un proceso engorroso, los entornos de programacin modernos -as como los programas de planilla de En este simple ejemplo, la estructura condicional if...
clculo- resaltan en negrita el par correspondiente a la po- then... end if (si... entonces... n si) est anidada
sicin que est editando el programador o usuario en cada dentro de otra que la contiene, el ciclo do while... loop
momento. El control (automtico) del balance o equili- (repetir... mientras, literalmente hacer mientras...
brio entre los parntesis de apertura y de cierre se suele bucle).
conocer como brace match checking en ingls.
Naturalmente, para la resolucin matemtica de estas
complejas formulas encadenadas, las expresiones deben
ser evaluadas desde adentro hacia afuera, ya que los resultados de las ms internas sirven, temporalmente, de
datos de entrada de las exteriores.

6.3 Vase tambin


Bucle (programacin)
Estructuras de control
Funcin (programacin)

6.1 En las planillas de clculo

Procedimiento (programacin)

En las hojas de clculo, se suelen anidar o agrupar funciones unas dentro de otras, derivando en frmulas relativamente complejas. El programa OpenOce.org Calc
permite, mediante su asistente de funciones (function wizard), navegar a travs de los varios o mltiples niveles
de anidamiento, permitiendo editar (y eventualmente corregir) cada una de ellas por separado. Tal vez de manera
sorprendente, su rival Microsoft Excel no posee esa caracterstica, eventualmente deseable cuando se trabaja en
algunas grandes planillas.

6.2 En programacin
En los lenguajes de programacin estructurada, el anidamiento est relacionado a la inclusin de estructuras de
control dentro de otras, usualmente indicado mediante la
inclusin de distintos niveles de sangra (llamada indentation en ingls) dentro del cdigo fuente, como se muestra
en el sencillo cdigo BASIC siguiente:
function BuscarCodigo(cod as string) as integer dim
12

Programacin estructurada
Pseudocdigo

Captulo 7

Antipatrn de diseo
Un antipatrn de diseo es un patrn de diseo que invariablemente conduce a una mala solucin para un problema.
Al documentarse los antipatrones, adems de los patrones de diseo, se dan argumentos a los diseadores de
sistemas para no escoger malos caminos, partiendo de
documentacin disponible en lugar de simplemente la
intuicin.
El trmino se origina inspirado en el libro Design Patterns,
escrito por un grupo de autores conocido como Gang of
Four, y que aglutina un conjunto de buenas soluciones
de programacin. Los autores bautizaron dichas soluciones con el nombre de patrones de diseopor analoga con el mismo trmino, usado en arquitectura. El libro
Anti-Patterns (de William Brown, Raphael Malveau, Skip
McCormick y Tom Mowbray, junto con la ms reciente
incorporacin de Scott Thomas) describe los antipatrones
como la contrapartida natural al estudio de los patrones
de diseo. El estudio formal de errores que se repiten permite reconocer y reconducir los elementos involucrados
hacia una mejor solucin. Los antipatrones no se mencionan en el libro original de Design Patterns, puesto que
ste es anterior.
Los antipatrones se consideran una parte importante de
una buena prctica de programacin. Es decir, un buen
programador procurar evitar los antipatrones siempre
que sea posible, lo que requiere su reconocimiento e identicacin tan pronto como sea posible, dentro del ciclo de
vida del software.
El concepto de antipatrn se puede aplicar a la ingeniera
en general, e incluso a cualquier tarea realizada por el
hombre. Aunque no se escucha con frecuencia fuera del
campo ingenieril, la nocin est ampliamente extendida.

7.1 Algunos
antipatrones
desarrollo de software
7.1.1

de

Antipatrones de gestin

Productividad a toda costa: La empresa busca la productividad a costa de la calidad del software y de la
13

calidad de vida de sus empleados, intenta homogeneizar los puestos de trabajo quitando en la medida
de lo posible los permisos a los programadores para
que no daen los sistemas operativos, monitoriza a
los equipos de trabajo y acta cortando la visibilidad de ciertas pginas o las reuniones de programadores, al nal se consigue que se vaya la gente de
la empresa cuando la situacin es insostenible, esto
suele ocurrir en ciclos de uno o dos aos.
Responsable ausente (absentee manager): Situacin
en la que el principal responsable o coordinador se
ausenta o permanece en paradero desconocido o no
localizable durante importantes perodos de tiempo.
Todo lo que tienes es un martillo (all you have is a
hammer): Gestin gris y plana, incapaz de tratar a
los subordinados de manera personalizada y acorde
con sus necesidades particulares.
Negociador de jaula de acero (cage match negotiator): Se aplica cuando un coordinador, gestor o responsable aplica una losofa de "xito a cualquier
precio.
Dos caras (doppelganger): Coordinador o compaero que en un determinado momento puede ser agradable y de trato fcil, pero igualmente puede volverse irracional y despiadado de modo inesperado.
Rodeos improductivos (fruitless hoops): Gestor o
coordinador que solicita grandes cantidades de datos (en ocasiones sin relevancia alguna) antes de tomar una decisin.
Niito de oro (golden child): Situacin en la que
ciertas responsabilidades, oportunidades, reconocimientos o recompensas van a parar a un determinado miembro del equipo como consecuencia de una
relacin personal o en clara contradiccin con su
rendimiento real.
Pollo sin cabeza (headless chicken): Se aplica al gestor, coordinador o responsable que vive en una permanente situacin de pnico y medidas desesperadas.

14

CAPTULO 7. ANTIPATRN DE DISEO

Lder pero no gestor (leader not manager): Un buen


lder no tiene por qu ser necesariamente un buen
gestor, coordinador o responsable.

Mala gestin (bad management): Gestionar un proyecto sin tener sucientes conocimientos sobre la
materia.

Gestin clonada (managerial cloning): Situacin en


la que los coordinadores o gestores son contratados
e instruidos para actuar y trabajar todos del mismo
modo, a imagen y semejanza de sus propios jefes.

Software inado (software bloat): Permitir que las


sucesivas versiones de un sistema exijan cada vez
ms recursos.

Gestor pero no lder (manager not leader): Un coor- 7.1.3 Antipatrones generales de diseo de
dinador brillante en sus deberes administrativos y de
software
gestin, pero que carece de habilidades de liderazgo.
Base de datos como comunicador de procesos (data Abuso de la mtrica (metric abuse): Utilizacin mabase as an IPC): Usar una base de datos para comunipuladora o incompetente de las medidas y las mnicar procesos en uno o varios ordenadores, cuando
tricas.
la comunicacin entre procesos directa es ms adecuada.
Sr. Amigo de todos (Mr. Nice Guy): Se aplica al gestor que pretende convertirse en amigo de todos.
Blob: Vase Objeto todopoderoso.
Hroe del proletariado (proletariat hero): El empleado para todoque siempre es puesto como ejemplo ante sus compaeros, pero que realmente es la
excusa perfecta para demandas crecientes y constantes incrementos de expectativas.
Estrellas nacientes (rising upstart): Se aplica a quienes, teniendo potencial, no son capaces de respetar la progresin profesional establecida, y pretenden sortear los plazos y requisitos de aprendizaje y
madurez.
Ejecutivo sin carcter (spineless executive): Gestor,
coordinador o responsable que no tiene el coraje de
enfrentarse a las situaciones, asumir las responsabilidades de los errores, o dar la cara por sus subordinados.

BOMQ (Batch Over MQ): Abuso en el empleo de integracin basada en mensajes en tiempo real para
transferencias espordicas de gran tamao en segundo plano.
Clase Gorda: Dotar a una clase con demasiados atributos y/o mtodos, hacindola responsable de la mayora de la lgica de negocio.
Botn mgico (magic pushbutton): Tender, desarrollando interfaces, a programar la lgica de negocio
en los mtodos de interaccin, implementando los
resultados de las acciones del usuario en trminos
no sucientemente abstractos.
Carrera de obstculos (race hazard): Incapacidad de
prever las consecuencias de diferentes sucesiones de
eventos.

Caballero de tres cabezas (three-headed knight):


Gestor indeciso, poco rme, dubitativo.

Entrada chapuza (input kludge): No especicar e implementar el manejo de entradas invlidas.

Arma denitiva (ultimate weapon): Individuos altamente competentes en los que la organizacin o sus
compaeros confan tanto que se convierten en el
canal por el que todo pasa.

Fbrica de combustible (gas factory): Disear de


manera innecesariamente compleja.

Recin llegado (warm body): Trabajador que apenas


cubre las expectativas mnimas y por tanto circula de
proyecto en proyecto o de equipo en equipo.
Arquitecto a obrero (super builder): Creencia por la
que se asigna a un buen diseador de software al
desarrollo de cdigo pensando en que tardara mucho menos en teclearlo.

7.1.2

Antipatrones de gestin de proyectos

Humo y espejos (smoke and mirrors): Mostrar cmo


ser una funcionalidad antes de que est implementada.

Gran bola de lodo (big ball of mud): Construir un


sistema sin estructura denida.
Interfaz inada (interface bloat): Pretender que una
interfaz sea tan potente que resulta extremadamente
difcil de implementar.
Inversin de abstraccin (abstraction inversion): No
exponer las funcionalidades implementadas que los
usuarios necesitan, forzando a que se reimplementen
a ms alto nivel.
Punto de vista ambiguo (ambiguous viewpoint): Presentar un modelo sin concretar ciertos aspectos, postergando as decisiones conictivas.
Re-dependencia (re-coupling): Introducir dependencias innecesarias entre objetos.

7.1. ALGUNOS ANTIPATRONES DE DESARROLLO DE SOFTWARE

15

Sistema de caeras de calefaccin (stovepipe sys- 7.1.4 Antipatrones de programacin


tem): Construir un sistema difcilmente mantenible,
Nomenclatura heroica (heroic naming): Identicar
ensamblando componentes poco relacionados.
los miembros de un programa (interfaces, clases,
propiedades, mtodos...) con nombres que provocan
que el conjunto aparente estandarizacin con la inAntipatrones de diseo orientado a objetos
geniera del software pero que en realidad oculta una
implementacin anrquica.
Acoplamiento secuencial (sequential coupling):
Construir una clase que necesita que sus mtodos
se invoquen en un orden determinado.
BaseBean: Heredar funcionalidad de una clase utilidad en lugar de delegar en ella.
Fallo de clase vaca (empty subclass failure): Crear
una clase que no supera el test de la subclase vaca, es
decir, que se comporta de manera diferente cuando
se invoca desde una subclase que no aade modicacin alguna.
Llamar a super (callsuper): Obligar a las subclases
a llamar a un mtodo de la superclase que ha sido
sobrescrito.
Modelo de dominio anmico (anemic domain model): Usar un modelo del dominio sin ninguna lgica
de negocio. Esto no es un enfoque orientado a objetos porque cada objeto debera tener tanto propiedades como comportamiento asociado.
Objeto sumidero (object cesspool): Reutilizar objetos
no adecuados realmente para el n que se persigue.
Objeto todopoderoso (god object): Concentrar demasiada funcionalidad en una nica parte del diseo
(clase).
Poltergeist (informtica): Emplear objetos cuyo nico propsito es pasar la informacin a terceros objetos.
Problema del crculo-elipse (circle-ellipse problem):
Crear variables de tipo pensando en los valores de
posibles subtipos.
Problema del yoy (yo-yo problem): Construir estructuras (por ejemplo, de herencia) que son difciles de comprender debido a su excesiva fragmentacin.
Singletonitis: Abuso de la utilizacin del patrn
singleton.
YAFL (yet another fucking layer, y otra maldita capa ms) o 'Cdigo Lasagna': Aadir capas innecesarias a un programa, biblioteca o framework. Esta
tendencia se extendi bastante despus de que se publicase el primer libro sobre patrones.

Accin a distancia (action at a distance): Provocar


la interaccin no prevista de componentes muy distantes de un sistema.
Acumular y disparar (accumulate and re): Establecer una coleccin de variables globales para ser usadas por un conjunto de subrutinas.
Ancla del barco (boat anchor): Retener partes del
sistema que ya no tienen utilidad.
Bucle activo (busy spin): Utilizar espera activa cuando existen alternativas.
Cdigo duro (hard code): Hacer supuestos sobre
el entorno del sistema en demasiados lugares de la
implementacin.
Complejidad no indispensable (accidental complexity): Dotar de complejidad innecesaria a una solucin.
Cdigo espagueti (spaghetti code): Construir sistemas cuya estructura es difcilmente comprensible, especialmente debido a la escasa utilizacin de
estructuras de programacin.
Cdigo ravioli (ravioli code): Construir sistemas con
multitud de objetos muy dbilmente conectados.
Comprobacin de tipos en lugar de interfaz (checking type instead of interface): Comprobar que un
objeto es de un tipo concreto cuando lo nico que
se necesita es vericar si cumple un contrato determinado.
Conanza ciega (blind faith): Descuidar la comprobacin de los resultados que produce una subrutina,
o bien de la efectividad de un parche o solucin a un
problema.
Doble comprobacin de bloqueo (double-checked
locking): Comprobar, antes de modicar un objeto,
si es necesario hacer esa modicacin, pero sin bloquear para comprobarlo, de manera que dicha comprobacin puede fallar.
Fallo de cach (caching failure): Olvidar restablecer
una marca de error cuando ste ya ha sido tratado.
Lava seca (lava ow): Cdigo muerto e informacin
de diseo olvidada permanecen congelados en un diseo cambiante. Esto es anlogo a un ujo de lava
en el que se van endureciendo pedazos de roca. La

16

CAPTULO 7. ANTIPATRN DE DISEO


solucin incluye un proceso de gestin de la conguracin que elimina el cdigo muerto y permite
evolucionar o rehacer el diseo para acrecentar la
calidad.

Lgica super-booleana (superboolean logic): Emplear comparaciones o abstracciones de la lgica


booleana innecesarias.
Manejo de excepciones (exception handling): Emplear el mecanismo de manejo de excepciones del
lenguaje para implementar la lgica general del programa.
Manejo de excepciones intil (useless exception
handling): Introducir condiciones para evitar que se
produzcan excepciones en tiempo de ejecucin, pero
lanzar manualmente una excepcin si dicha condicin falla.
Momento del cdigo (code momentum) : Establecer
demasiadas restricciones sobre una parte del sistema
debido a la asuncin de muchas de sus propiedades
desde otros lugares del propio sistema.
Nmeros mgicos (magic numbers): Incluir en los
algoritmos nmeros concretos sin explicacin aparente.

Desfactorizacin (de-factoring): Eliminar funcionalidad y reemplazarla con documentacin.


Factor de improbabilidad (improbability factor):
Asumir que es improbable que un error conocido
cause verdaderos problemas.
Martillo de oro (golden hammer): Asumir que nuestra solucin favorita es universalmente aplicable, haciendo bueno el refrn a un martillo, todo son clavos.
Optimizacin prematura (premature optimization):
Realizar optimizaciones sin disponer de la informacin suciente para hacerlo con garantas, sacricando decisiones de diseo.
Programacin de copiar y pegar (copy and paste programming): Programar copiando y modicando cdigo existente en lugar de crear soluciones genricas.
Programacin por permutacin (programming by
permutation): Tratar de aproximarse a una solucin
modicando el cdigo una y otra vez para ver si acaba por funcionar.

Ocultacin de errores (error hiding): Capturar un


error antes de que se muestre al usuario, y reemplazarlo por un mensaje sin importancia o ningn
mensaje en absoluto.

Reinventar la rueda (reinventing the wheel): Enfrentarse a las situaciones buscando soluciones desde cero, sin tener en cuenta otras que puedan existir ya
para afrontar los mismos problemas.

Packratting: Consumir memoria en exceso debido


a no liberar objetos reservados dinmicamente una
vez ya han dejado de ser necesarios.

Reinventar la rueda cuadrada (reinventing the square


wheel): Crear una solucin pobre cuando ya existe
una buena.

Programacin por excepcin (coding by exception):


Aadir trozos de cdigo para tratar casos especiales
7.1.6
a medida que se identican.
Secuencia de bucle por casos (Loop-switch sequence): Programar un conjunto de pasos secuenciales
usando un bucle en combinacin con una estructura
de control por casos.
Cadenas mgicas (magic strings): Incluir cadenas de
caracteres determinadas en el cdigo fuente para hacer comparaciones, como tipos de eventos, etc.

7.1.5

Antipatrones metodolgicos

Antipatrones de gestin de la conguracin

Conicto de extensiones (extension conict): Problemas con diferentes extensiones que tratan de gestionar las mismas partes del sistema (especco de Mac
OS).
Inerno de dependencias (dependency hell): Escenario de problemas producidos por las versiones de
otros productos que se necesitan para hacer funcionar un tercero.

Bala de plata (silver bullet): Asumir que nuestra solucin tcnica favorita puede resolver un problema
mucho mayor.

Inerno DLL (DLL hell): Problemas con las


versiones, disponibilidad o proliferacin de
DLLs (especco de Microsoft Windows)

Desarrollo conducido por quien prueba (tester driven development): Permitir que un proyecto software avance a base de extraer sus nuevos requisitos de
los informes de errores.

Inerno JAR (JAR hell): Problemas con diferentes versiones o ubicaciones de cheros JAR
(Java), tpicamente causados por la falta de
comprensin del modelo de carga de clases.

7.3. RELACIN ALFABTICA DE OTROS ANTIPATRONES

7.2 Algunos antipatrones organizacionales


Alcance incremental (scope creep): Permitir que el
alcance de un proyecto crezca sin el control adecuado.
Dependencia de proveedor (vendor lock-in): Construir un sistema que dependa en exceso de un componente proporcionado por un tercero.
Diseo en comit (design by committee): Contar con
muchas opiniones sobre un diseo, pero adolecer de
falta de una visin unicada.
Escalada de compromiso (escalation of commitment): No ser capaz de revocar una decisin a la
vista de que no ha sido acertada.
Funcionalitis creciente (creeping featuritis): Aadir
nuevas funcionalidades al sistema en detrimento de
su calidad.
Gestin basada en nmeros (management by numbers): Prestar demasiada atencin a criterios de gestin cuantitativos, cuando no son esenciales o difciles de cumplir.
Gestin de championes (mushroom management):
Tratar a los empleados sin miramientos, sin informarles de las decisiones que les afectan (mantenindolos cubiertos y en la oscuridad, como los championes).
Gestin porque lo digo yo (management by perkele):
Aplicar una gestin autoritaria con tolerancia nula
ante las disensiones.
Migracin de costes (cost migration): Trasladar los
gastos de un proyecto a un departamento o socio de
negocio vulnerable.
Obsolescencia continua (continuous obsolescence):
Destinar desproporcionados esfuerzos a adaptar un
sistema a nuevos entornos.
Organizacin de cuerda de violn (violin string organization): Mantener una organizacin anada y en
buen estado, pero sin ninguna exibilidad.
Parlisis por anlisis (analysis paralysis): Dedicar
esfuerzos desproporcionados a la fase de anlisis
de un proyecto, eternizando el proceso de diseo
iterando sobre la bsqueda de mejores soluciones o
variantes.
Peligro moral (moral hazard): Aislar a quien ha tomado una decisin a raz de las consecuencias de la
misma.

17
Sistema de caeras (stovepipe): Tener una organizacin estructurada de manera que favorece el ujo
de informacin vertical, pero inhibe la comunicacin horizontal.
Te lo dije (I told you so): Permitir que la atencin se
centre en que la desoda advertencia de un experto
se ha demostrado justicada.
Gallina de los huevos de oro (cash cow): Pecar de autocomplacencia frente a nuevos productos por disponer de un producto legacy muy lucrativo.

7.3 Relacin alfabtica de otros antipatrones


Arrojar al otro lado del muro (thrown over the wall):
Cuando un proyecto involucra a varios grupos de
trabajo y va pasando secuencialmente de uno a otro,
con escasa o nula comunicacin entre ellos.
Billete lobo (wolf ticket): Declarar compatibilidad
con un estndar cuando sta no existe, o bien cuando
el estndar solo incluye recomendaciones no obligatorias que, de hecho, no se siguen.
Fiesta de los bocazas (Blowhard Jamboree): Cuando
se intenta que las decisiones tcnicas del proyecto
sean las basadas en opiniones de expertos publicadas
en prensa.
Cadena sin longitud (string without length).
Cajas de dilogos en cascada (cascading dialog boxes).
Callejn sin salida (dead end): Encontrar un problema que impide continuar trabajando, pero la direccin no permite corregir el problema. El equipo queda estancado.
Caminar por un campo de minas (walking through
a mine eld): Trabajar con un componente pobremente probado (usualmente inestable), y por tanto
poco conable.
Chivo expiatorio (scape goat): Ante circunstancias
de crisis en un proyecto se toma la decisin de dirigir las culpas a una persona o a un conjunto de
personas concretas sin analizar si verdaderamente la
naturaleza del problema se encuentra en las mismas.
Codicacin brutal: Presionar a los programadores
a trabajar sobre una arquitectura sin disear y sin
requisitos evidentes.
Comit designado (appointed team): Crear un comit o grupo de trabajo para resolver un problema y no
ocuparse de lograr que el grupo funcione.

18

CAPTULO 7. ANTIPATRN DE DISEO

Compensacin equitativa (egalitarian compensation): Compensar al personal por el trabajo individual hecho.

El correo electrnico es peligroso (email is dangerous): Peligro de olvidar que detrs de los emails recibidos hay personas de carne y hueso.

Contenedor mgico (magic container): La implementacin de mtodos que intentan ser tan exibles
como para adaptar su comportamiento a multitud de
circunstancias, sobrepasando el umbral de una mantenibilidad adecuada del mismo.

El gestor controla el proceso (manager controls process).

Cuerpos tibios (warm bodies).


Culto al carguero (cargo cult): Consiste en copiar
ciertas prcticas que podran ser consideradas (no
siempre) buenas prcticas sin saber muy bien los
benecios o ventajas que proporcionan, provocando
esfuerzo innecesario en el proyecto para incorporarlas o problemas.
Cultura del miedo (fear culture)): Ambiente en el
que cada empleado tiene miedo de mostrar el resultado de su trabajo por miedo a ser despedido por
tener errores.
Cultura del hroe (hero culture): Se produce cuando
una o pocas personas toman la responsabilidad del
xito de todo el equipo o proyecto, a menudo trabajando sobretiempo.
Decisin aritmtica (decision by arithmetic): En lugar de intentar tomar una decisin con los datos disponibles y basado en el conocimiento y experiencia
de nuestros colaboradores y el nuestro, se trata de
justicar la misma sobre la base de unos factores
presuntamente objetivos.
Desarrollo distribuido geogrcamente (geographically distributed development).
Desarrollo marcado por las herramientas (autogenerated stovepipe): Preferir una solucin generada automticamente sobre la mejor solucin.
Descomposicin funcional (functional decomposition): Traducir un programa de un lenguaje estructurado a uno OO usando una sola clase y muchos
mtodos privados.
Disear por disear (design for the sake of design):
Realizar un diseo excesivamente complejo sin necesidad real.
Diseo con arquitectura impuesta (architecture as
requirement): Imponer que el diseo considere, obligatoriamente, el uso de herramientas o mtodos no
necesariamente idneos.
Diseo de fregadero (kitchen sink design).
Diseadores empricos (architects don't code): Incapacidad del grupo de diseo para evaluar la complejidad del objeto diseado.

El traje nuevo del emperador (emperor's new clothes): Temor a sealar los defectos de un producto o
proceso que un gerente o manager cree que funciona
bien.
El viejo gran duque de York (the grand old Duke of
York): Cuando los arquitectos o analistas no intervienen (uno o los dos), dejando a los programadores
(especialistas en la implementacin) prcticamente
todas las decisiones a nivel e ejecucin de las especicaciones del usuario.
Ellos me entendieron (they understood me): Explicar a programadores o diseadores junior lo que se
espera de ellos muy brevemente, y asumir que entendieron lo que se les pidi.
Embudo de excepciones (exception funnel): Atrapar
una excepcin e ignorarla, sin reportarlo.
Entrenar al entrenador (train the trainer): Contratar
una formacin sin haber precisado con cierta exactitud la materia sobre la que se desea la misma. Esto puede provocar que la formacin no se enfoque
de manera adecuada, tratando aspectos que no son
necesarios en el proyecto o dejando fuera aspectos
fundamentales. Contratar una formacin sin tener
referencias del formador, ya que lo mismo su nivel
de conocimiento no es el adecuado a la naturaleza
de la formacin a impartir.
Es un problema de operadores (it is an operator problem).
Esconder las armas (cover your assets).
Falsa economa (false economy): Permitir que los
recortes de presupuesto afecten la eciencia de los
trabajadores (las prdidas terminan siendo mayores
que lo ahorrado).
Falso punto nal subrogado (false surrogate endpoint).
Fechas en punto otante (oating point times).
Haz tu propia base de datos (roll your own database): Ante la necesidad de persistencia de datos se
utiliza una solucin que no se basa en un estndar.
Ingenieros compatibles e intercambiables (plug
compatible interchangeable engineers).
Introduccin de dicultad por analoga (analogy
breakdown): Disear por analoga con problemas
resueltos, posiblemente introduciendo dicultades
no inherentes al problema, o descuidando dicultades propias del nuevo caso que se maneja.

7.3. RELACIN ALFABTICA DE OTROS ANTIPATRONES


Invocar a constructores con nulos (passing nulls to
constructors).

19
contingencias del proceso de desarrollo, o cuando no
se es exible ante una planicacin inicial, conservndose a lo largo del proyecto pese a que se pueda
apreciar que resulta absolutamente irreal.

La disputa familiar (the feud): Cuando existiendo un


conicto entre gestores de proyectos no se le busca
una solucin denitiva al mismo.

Nacionalismo (national ism).

La experiencia mata el diseo (architecture by implication): Descuidar el diseo por conar excesivamente en la experiencia previa.

Navaja suiza (swiss army knife): Intentar crear un


producto que solucione varios problemas poco relacionados entre s.

Los clientes son tontos (customers are idiots): Pensar


que uno sabe ms que el cliente, y por tanto no es
necesaria una investigacin con el cliente.

No es mi trabajo (Not my job): No solucionar algn


problema evidente argumentando que es problema o
fallo de otro.

Manaco del control (control freak): El deseo de


control lleva a la microgestin y sta a su vez a una
prdida importante de la capacidad de autogestin
del equipo, ya que todos los pasos se miden milimtricamente.

No especicar (specify nothing).

Mquina de Rube Goldberg (Rube Goldberg machine): Realizar implementaciones muy complejas para
tareas sencillas.

Otra reunin ms lo resolver (yet another meeting


will solve it): Ante un problema en la planicacin
del proyecto, se convocan reuniones para intentar
dar una solucin al problema. En stas reuniones
participan los miembros del equipo de proyecto que
tendrn que dejar su trabajo habitual, producindose nuevos retrasos.

Matar al mensajero (shoot the messenger).


Matar dos pjaros de un tiro (kill two birds with one
stone).
Matrimonio sumarsimo (sumo marriage): Suele
ocurrir en cualquier situacin en la que exista una
dependencia de un elemento o de una serie de factores que dicultan el mantenimiento o evolucin del
sistema.
Mazorca de maz (corn cob): Mantener personas en
el proyecto que resultan difciles, conictivas o que
funcionan de manera absolutamente al margen de lo
que es cualquier trabajo en equipo o de un comportamiento solidario y que rompen con la armona del
grupo.
Mecanismos de recompensa discordantes (discordant reward mechanisms): Un equipo recibe reconocimiento por ser el que ms trabajo ejecuta sobre
la base de criterios objetivos que no son vlidos para
medir el nivel de productividad o calidad.
Mezclador de software (software merger).

No inventado aqu (not invented here): Cuando la organizacin o uno se niega a utilizar soluciones, metodologas, prcticas, herramientas, etc. externas slo porque no se nos ocurri previamente.

Otro programador ms (yet another programmer).


Presunto heredero (heir apparent): Cuando vemos
que los posibles huecos que podran quedar para seguir progresando en nuestra organizacin tienen ya
nombres y apellidos (cuando adems sus mritos son
ms que discutibles), provocar la salida de la organizacin en busca de otras alternativas o se producir una prdida de motivacin que impactar directamente en la productividad.
Proceso a prueba de idiotas (idiot proof process).
Programador discordante (net negative producing
programmer): Hay proyectos donde el rendimiento
de uno o ms miembros del equipo es muy inferior
al esperado, hasta el punto de ser su productividad
neta en el proyecto negativa (el proyecto mejorara
con el simple hecho de prescindir de estas personas,
sin necesidad de sustituirlas por otra)

Miedo al xito (fear of success): Permitir que las


nicas razones de que los trabajos no se completen
sean de ndole social.

Proyecto del da de la marmota (ground hog day project): Discutir los mismos temas en todas las reuniones, slo para llegar a la conclusin de que algo
debe hacerse.

Moneda en punto otante (oating point currency):


Utilizar una representacin en punto otante para
valores que representan dinero, lo que puede provocar prdida de precisin.

Prueba incompleta (asynchronous unit testing): Descuidar en la etapa de pruebas, algunas unidades en
todos los casos, o todas las unidades en algunos casos.

Morir planicando (death by planning): Invertir ms


esfuerzo (y tiempo) del necesario para establecer un
plan que despus puede ser destruido por las propias

Quiero estimaciones ahora (give me estimates now):


Dar estimaciones sin tener sucientes datos para hacerlas.

20
Requisitos esparcidos por la pared (requirements tossed over the wall): Existe un desorden general en los
requisitos: se encuentran en distinto grado de terminacin, no hay priorizacin de los mismos o es muy
general como para poder hacer una ordenacin adecuada por ese criterio, etc. Esto normalmente es provocado por una colaboracin inadecuada por parte
del rea usuaria.
Requisitos ocultos (Hidden requirements): El equipo
de proyecto conocedor de la dicultad de implementar un determinado requisito lo obvia dentro del catlogo de requisitos, le asigna una prioridad muy baja o lo engloba dentro de un requisito de mayor nivel
quedando difuminado en el mismo. El rea usuaria
no especica un requisito o no lo especica de manera adecuada, solicitando explicaciones a posteriori por la no implementacin de ese requisito o por
su comportamiento incorrecto.
Si funciona, no lo toques (if it is working don't change):.
Somos tontos (we are idiots): Pensar que el conocimiento interno del problema es peligroso (por riesgo
de que sea pobre o equivocado), y pedir validacin
del cliente para cada caracterstica o decisin mayor.
Tarjetas CRCI (CRCI cards): Cuando se usa
la tcnica de tarjetas CRC, se aprovecha e
incluye en la misma la implementacin de la
clase, convirtindose automticamente la tarjeta CRC (Class-Responsibility-Collaboration)
en CRCI (Class-Responsibility-CollaborationImplementation).
Tormenta de reproches (blame storming): En un
equipo de proyecto se llega a la conclusin de que
la mejor forma de analizar las causas de la no consecucin de los objetivos es que se discuta quines
internamente han tenido la culpa.
Torre de vud (tower of voodoo):Se tiene un cdigo
que se sabe que funciona (aunque generalmente no
se sabe muy bien cmo) y se pretende aadir algn
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 manera que despus es imposible deshacerse de ella.
nico punto de salida de funcin (single function exit
point).
Valor por defecto indenido (zero means null): Escoger un valor arbitrario para representar la indenicin, sin garantizar que ese valor no puede realmente
ocurrir.

CAPTULO 7. ANTIPATRN DE DISEO


Violencia intelectual (intellectual violence): De manera interna en un equipo de trabajo o en una
reunin con el cliente y/o con usuarios se utilizan
trminos, generalmente tcnicos, que no son comprendidos o conocidos por la mayora de los interlocutores.

7.4 Vase tambin


Patrn de diseo
Crisis del software
Hediondez del cdigo
No hay balas de plata

7.5 Enlaces externos


C2.com (antipatrones) Portland Pattern Repository's Wiki

Captulo 8

Archivo de cabecera
Se denomina header le, al espaol chero/archivo (de)
cabecera, o include le, al espaol chero de inclusin, en ciencias de computacin, especialmente en el
mbito de los lenguajes de programacin C y C++, al
archivo, normalmente en forma de cdigo fuente, que el
compilador incluye de forma automtica al procesar algn otro archivo fuente. Tpicamente los programadores
especican la inclusin de los header les por medio de
pragmas al comienzo (head o cabecera) de otro archivo
fuente.
Un header le contiene, normalmente, una declaracin
directa de clases, subrutinas, variables, u otros
identicadores. Aquellos programadores que desean
declarar identicadores estndares en ms de un archivo
fuente pueden colocar esos identicadores en un nico
header le, que se incluir cuando el cdigo que contiene
sea requerido por otros archivos.
La biblioteca estndar de C y la biblioteca estndar de
C++ tradicionalmente declaran sus funciones estndar en
header les.

8.1 Motivacin
En la mayora de lenguajes de programacin modernos,
los programadores pueden dividir los programas en componentes de menor tamao (como pueden ser clases y
subrutinas) y distribuir esos componentes entre muchas
unidades por traducir (tpicamente en forma de archivos),
que el sistema puede compilar de forma autnoma. Si una
subrutina se tiene que usar al margen de la unidad por
traducir donde ha sido denida, se tiene que introducir el
concepto de declaracin directa o prototipos de funciones. Por ejemplo, una funcin denida as en un archivo
fuente:

Sin embargo en esta simple ilustracin se requiere que


el programador mantenga la declaracin de la funcin de
add en dos sitios en el archivo que contiene su implementacin y en el archivo que usa la funcionalidad. Si
la denicin de la funcin llega a alterarse, entonces el
programador debe actualizar todos los prototipos repartidos a lo largo del programa. Esto es necesario porque
la implementacin de ambos, C y C++ han de diagnosticar todas las violaciones de lo que en C++ se llama "one
denition rule" (ODR), al espaol regla de una nica
denicin. De hecho, la mayora de ellos se sirven de
un enlazador para realizar esta labor. El enlazador, sin
embargo, suele conocer, de forma muy limitada los tipos
usados en los programas. Por ello, algunas de las violaciones de ODR no se detectan a la hora de implementar el lenguaje. Como resultado, es responsabilidad del
programador el mantener la coherencia de todas las declaraciones que cruzan las fronteras de una unidad por
traducir. Buscar todas estas declaraciones de una entidad
externa y vercar que son compatibles de forma manual
es una tarea ardua. (Ntese que C no dene el trmino
one denition rulees especco del lenguaje C++.
Si declaraciones de la misma entidad en muchos archivos
fuentes de C son diferentes, la funcin no funcionar de
forma adecuada y puede llegarse a un comportamiento
impredecible, independientemente de la regla que se est
violando.)
Para entender una violacin ODR, considrese el siguiente cdigo (correcto):
/* File print-heading.c */ #include <stdio.h> void
print_heading(void) { printf(standard heading\n); }
/* File main.c */ void print_heading(void); int main(void)
{ print_heading(); return 0; }

La unidad por traducir representada por el archivo fuente main.c referencia a la funcin print_heading() que est
denida 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 funcin externa antes del primer uso. Para
puede declararse (con un prototipo de funcin) y ser re- cumplir con este requisito el archivo main.c declara la
ferida desde un segundo archivo fuente como sigue:
funcin en la primera lnea. Esta versin del cdigo funint 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

CAPTULO 8. ARCHIVO DE CABECERA

fuente print-heading.c puede decidir hacer la funcin ms /* File add.c */ #include add.hint add(int a, int b) {
exible y dar soporte a cabeceras a gusto del usuario. Una return a + b; }
posible implementacin podra ser la siguiente:
/* File print-heading.c */ #include <stdio.h> void Normalmente, los programadores slo utilizan los heaprint_heading(const char *heading) { printf("%s\n, der les para especicar los interfaces, y suelen aportar al
heading); }
menos, una pequea cantidad de informacin explicando
cmo usar los componentes declarados en el archivo. Al
Si el programador olvida actualizar la declaracin en igual que en este ejemplo, las implementaciones de sumain.c, se pueden dar resultados devastadores. La fun- brutinas permanecen en un archivo fuente separado, que
cin print_heading() espera un argumento y hace uso del continua siendo compilado de forma independiente. (Una
valor del mismo, sin embargo la funcin main() no pro- excepcin comn entre C y C++ son las "funciones inlivee ningn valor. Al ejecutar este programa se produce un ne", que suelen incluirse en header les porque la mayora
comportamiento impredecible: la aplicacin puede im- de implementaciones no pueden expendir funciones inliprimir basura, terminar de forma inesperada o dar pie a ne de forma adecuada sin ver sus deniciones durante el
resultados impredecibles en la plataforma en la que es eje- tiempo de compilacin.)
cutado.
Por qu se puede compilar y enlazar este cdigo sin problema alguno? El motivo es que el compilador se gua por
la declaracin en main.c a la hora de compilar la unidad
por traducir main.c. Y esa declaracin se ajusta con la forma de la funcin. Ms tarde, cuando el enlazador combina
las unidades de traduccin ya compiladas main.c y printheading.c (en la mayora de implementaciones representadas como archivos main.o o main.obj), probablmente
podra detectar la inconsistencia pero no en C. Las
implementaciones en C referencian las funciones por el
nombre al nivel de archivo objeto y archivo binario, esto
no incluye el valor de retorno o la lista de argumentos. El
enlazador encuentra una referencia a print_heading() en
main.o y una funcin adecuada en print-heading.o. Llegado este punto, toda la informacin relativa a tipos de
argumentos de funciones se pierde.
Cmo es entonces posible llevar a cabo declaraciones
mltiples sin problema alguno? La solucin se llama header le. El header le de un mdulo declara cada funcin,
objeto y tipo de dato que forma parte del interfaz pblico del mdulo por ejemplo, en este caso el header le
incluira slo la delcaracin de add. Todo aquel archivo
fuente que se reera a add usa la directiva #include en el
header le:

8.2 Alternativas
Los header les no son la nica solucin al problema de
acceder identicadores declarados en diferentes archivos.
Tienen la desventaja de que los programadores siguen teniendo que realizar cambios en dos sitios diferentes (en
el archivo fuente y en el header le) cuando se realiza un
cambio en una denicin. Algunos lenguajes ms jvenes (como Java) prescienden de los header les y usan, en
su lugar, una esquema de nombres que permite al compilador localizar los archivos fuente asociados con implementaciones de clases e interfaces (pero, al hacerlo, se
restringe la libertad a la hora de nombrar archivos). En
estos lenguajes, el problema de ODR se suele resolver
por medio de dos tcnicas: la primera, el compilador pone toda la informacin necesaria sobre los tipos en el cdigo compilado y esta informacin es accesisble incluso
cuando el programa se ejecuta.; la segunda, Java y otros
lenguajes modernos tienen la posiblidad de vericar el
nmero y tipo de los argumentos como mtodo de invocacin. Todo esto tiene su precio: un exceso en espacio
y tiempo de ejecucin que no es aceptable para algunas
aplicaciones donde el tiempo de respuesta es crtica.

/* File add.h */ #ifndef ADD_H #dene ADD_H int COBOL y RPG IV tienen una forma de incluir archivos
llamada copybooks. Los programadoresincluyenstos
add(int, int); #endif /* ADD_H */
en la fuente del programa de forma similar a como se hace con los header les, permitiendo tambin reemplazar
(Ntese que el header le utiliza un "Include guard".)
ciertas partes del texto. La palabra clave de COBOL para
/* File triple.c */ #include add.hint triple(int x) { la inclusin es copy, y el reemplazo se realiza por medio
de la clusula replacing...by.
return add(x, add(x, x)); }
Esto reduce la carga del mantenimiento: cuando una denicin cambia, solo se tiene que actualizar una nica
copia de la declaracin (la del chero de cabecera). El
chero de cabecera tambin se puede incluir en el chero fuente que contiene las correspondientes deniciones,
dndole al compilador la oportunidad de comprobar si la
declaracin y la denicin son consistentes.

8.3 Vase tambin


Application Programming Interface
Interface description language
#pragma once

8.4. ENLACES EXTERNOS

8.4 Enlaces externos


Esta obra deriva de la traduccin de Header le de Wikipedia en ingls, publicada por sus editores bajo la Licencia de documentacin libre de
GNU y la Licencia Creative Commons AtribucinCompartirIgual 3.0 Unported.
Organizing Code Files (the potential pitfalls and guidelines for using header les in C++)
C++ header le inclusion rules

23

Captulo 9

Asercin (informtica)
En programacin, una asercin es un predicado (i.e., una 9.1 Uso de las aserciones
sentencia verdadero-falso) incluido en un programa como indicacin de que el programador piensa que dicho En lenguajes como Eiel, las aserciones son parte del propredicado siempre se cumple en ese punto del ujo de ceso de diseo, mientras que en otros, como C o Java,
programa.
solamente son utilizadas para comprobar suposiciones en
Por ejemplo, el siguiente cdigo contiene dos aserciones: tiempo de ejecucin.
x := 5; {x > 0} x := x + 1 {x > 1}

9.1.1 Aserciones en el diseo por contrato


x > 0 y x > 1, y las dos son ciertas en dichos puntos de la
Las aserciones pueden ser una forma de documentacin:
ejecucin.
pueden describir el estado en que el cdigo empieza su
Las aserciones suelen ser tiles para especicar prograejecucin (precondicin), y el estado que el cdigo espera
mas y para razonar la correccin de los mismos. Por
alcanzar cuando nalice (postcondicin); asimismo pueejemplo, una precondicin una asercin al comienzo
den servir de especicacin para los invariantes de clase.
de una seccin de cdigo determina que se espera que
En Eiel, tales aserciones se integran en el cdigo y son
el conjunto de sentencias que la siguen sean ejecutadas.
automticamente extradas para documentar la clase. EsUna postcondicin colocada al nal describe el estato supone una parte importante del mtodo de diseo por
do que se espera alcanzar al nal de la ejecucin.
contrato.
El ejemplo anterior utiliza la notacin introducida por C.
Esta aproximacin tambin resulta til en lenguajes que
A. R. Hoare en su artculo de 1969 "An axiomatic bano las soportan explcitamente: la ventaja de usar sentensis for computer programming" ("Una base axiomcias de asercin en lugar de aserciones en comentarios es
tica para la programacin de ordenadores"). Como esta
que las primeras pueden ser comprobadas en cada ejecunotacin normalmente no es aceptada por los compiladocin; si la asercin no se cumple, puede informarse del
res de los lenguajes actuales, los programadores suelen
error. Esto previene que el cdigo y las aserciones se desincluir aserciones mediante comentarios. A continuacin
fasen (un problema que puede ocurrir con las aserciones
se incluye un ejemplo en C:
comentadas).
x = 5; /* {x > 0} */ x = x + 1; /* {x > 1} */
Se han incluido las llaves para distinguir este uso de los
comentarios de su uso habitual.
Varios lenguajes de programacin modernos incluyen
una sentencia de asercin, que no es ms que una asercin
que se comprueba en tiempo de ejecucin. Si su evaluacin resulta falsa, se produce un error de asercin.
La intencin de estas sentencias de asercin es facilitar la
depuracin del programa, evitando que dicho fallo quede
sin comprobar.

9.1.2 Aserciones en tiempo de ejecucin


Una asercin puede ser utilizada para vericar que una
suposicin hecha por el programador durante la implementacin del programa sigue siendo vlida durante la
ejecucin del programa. Por ejemplo, considrese el siguiente cdigo en Java:
int total = contarUsuarios(); if (total % 2 == 0) { // total es par } else { // total es impar assert(total % 2 == 1); }

El uso de aserciones ayuda al programador en las tareas


En Java, % es el operador resto (no mdulo) si el pride diseo, desarrollo y razonamiento de un programa.
mer operando es negativo, el resultado puede ser tambin
negativo, Aqu, el programador ha asumido que la variable total no es negativa, as que el resto de una divisin
entre 2 siempre ser 0 o 1. La asercin explicita esta su24

9.2. DESACTIVACIN DE LAS ASERCIONES

25

posicin si contarUsuarios devuelve un valor negativo,


es probable que haya un fallo en el programa.

9.2 Desactivacin de las aserciones

Una gran ventaja de esta tcnica es que cuando se produce


algn error ste es inmediata y directamente detectado,
evitando posibles daos colaterales ocultos. Puesto que
un error de asercin normalmente informa de la lnea de
cdigo donde se produce, se puede localizar el error sin
necesidad de una depuracin ms exhaustiva.

Las aserciones suelen ser implementadas de modo que


puedan ser activadas o desactivadas, normalmente en el
conjunto del programa. Sin embargo, los lenguajes que
distinguen entre distintos tipos de aserciones p.ej. pre
y postcondiciones suelen permitir activarlas o desactivarlas de forma independiente. Si las aserciones son desactivadas, no se comprueban en tiempo de ejecucin. De
esta forma el programador puede colocar aserciones en
lugares donde en otro caso no tendra sentido ponerlas
(p.ej., comprobar que no se accede a un array mediante ndices fuera de rango). Puesto que las aserciones son
en principio una herramienta de desarrollo, normalmente
son desactivadas cuando el programa en cuestin es publicado. Por otra parte, como algunas versiones del programa pueden incluir aserciones y otras no, es primordial
que su desactivacin no modique el comportamiento del
programa. En otras palabras, las aserciones deben ser libres de efectos colaterales. Una alternativa en el caso de
C o C++ es redenir la macro assert para evaluar la expresin incluso cuando las aserciones estn desactivadas.

Las aserciones tambin suelen colocarse en puntos que


se supone que no se alcanzan durante la ejecucin. Por
ejemplo, las aserciones pueden ser colocadas en la clusula default de una estructura switch en lenguajes como
C, C++ y Java. Los casos que intencionadamente no se
manejan pueden provocar errores que aborten el programa.

En Java, las aserciones han sido parte del lenguaje desde


la versin 1.4. Los errores de asercin resultan en AssertionError cuando el prorgama es ejecutado con los parmetros correctos, sin los cuales las sentencias de asercin
son ignoradas. En C y C++, son aadidas por el chero de
cabeceras estndar assert.h deniendo assert (asercin)
como una macro que devuelve un error en caso de fallo y
La eliminacin de las aserciones del cdigo de producnaliza el programa.
cin es un proceso que se realiza de forma casi automLas inclusin en los lenguajes de construcciones de aser- tica. Normalmente se realiza mediante compilacin concin 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 parmetro de ejecucin, como en
ra independiente que implemente dichas aserciones.
Java. Algunas personas, sin embargo, se oponen a la eliminacin de las aserciones basndose en una analoga que
compara la ejecucin con aserciones y sin ellas en la fase
de desarrollo con la prctica de la natacin en una piscina
9.1.3 Aserciones durante el ciclo de desa- con la vigilancia de un socorrista para despus nadar solo
rrollo
en el mar. Asimismo aaden que las aserciones tambin
ayudan a desarrollar un programa a prueba de fallos.
Durante el ciclo de desarrollo, el programador normalmente ejecuta su programa con las aserciones activadas.
Cuando una asercin resulta falsa y se produce el correspondiente error, el programador automticamente recibe 9.3 Comparacin con los manejaun aviso. Muchas implementaciones adems detienen la
dores de errores
ejecucin del programa esto resulta til ya que si el programa sigue ejecutndose tras la violacin de una aserEs importante establecer las semejanzas y diferencias encin, ste entra en un estado corrupto que puede hacer
tre las aserciones y las rutinas de control de errores. Las
ms difcil la localizacin del problema. Gracias a la inaserciones deberan ser utilizadas para documentar situaformacin proporcionada por el error de asercin (punto
ciones lgicamente imposibles y descubrir posibles errodel cdigo que ha provocado el fallo, quizs el stack trace
res de programacinsi eseimposibleocurre, es que
o incluso todo el contexto de la asercin violada), el proalgo fundamental est claramente equivocado. Esto diegramador puede corregir el problema. De este modo, las
re del control de errores: la mayora de las condiciones de
aserciones sirven como potente herramienta de depuraerror son posibles, aunque deberan ser muy poco probacin.
bles en la prctica. El uso de aserciones como mecanismo
general de control de errores suele ser algo desacertado:
las aserciones no permiten al programa recuperarse de
los errores, y un fallo de asercin suele suponer una ter9.1.4 Aserciones estticas
minacin abrupta del programa. Asimismo las aserciones
Las aserciones que son comprobadas en tiempo de com- no suelen mostrar mensajes de error comprensibles por el
pilacin reciben el nombre de aserciones estticas. Este usuario.
tipo de aserciones resultan particularmente tiles en la Considrese el siguiente ejemplo de uso de aserciones pametaprogramacin de plantillas.
ra manejar un error:

26
int *ptr = malloc(sizeof(int) * 10); assert(ptr != NULL);
// usar ptr
Aqu, el programador advierte que malloc puede devolver un puntero a NULL si no resulta posible realizar la
asignacin de memoria. Esto es posible: el sistema operativo no garantiza que cada llamada a malloc termine con
xito, y el programa debe estar preparado para manejar
el error. Una asercin quizs no es la mejor eleccin en
este caso, ya que un error causado por malloc no es lgicamente imposible es una posibildad legtima, aunque
no es muy comn que suceda. En este ejemplo, es cierto
que la asercin resulta til, aclarando que el programador
ha decidido de forma deliberada no construir una rutina
robusta de control de errores de asignacin de memoria.
El programador tambin puede decidirse por una utilizacin mixta de aserciones y rutinas estndar de control de
errores para un mismo problema. Esto es til en situaciones donde el programador quiere recibir aviso inmediato
del error, pero con la seguridad de que ser manejado de
forma correcta en situaciones reales de explotacin del
programa. En el ejemplo anterior, esto supondra aadir
una rutina de control de errores, pero tambin habra que
mantener la asercin para que el programador supiese del
fallo de memoria durante el proceso de depuracin. Esto
permite al programador localizar errores de forma ms
sencilla, lo que a su vez har que el usuario nal pueda ejecutar el programa sin recibir mensajes de error innecesarios. Esta tctica solamente resulta til cuando el
error especicado no supone la terminacin abrupta del
programa o afecte a los datos que ste maneja, sino que
har que el programa siga funcionando aunque sea ms
lentamente o de forma menos eciente.

9.4 Enlaces externos


Hoare, C. A. R. (2001). Assertions: a personal perspective. research.microsoft.com. Archivado desde el original el 02 de diciembre de 2015.
Programming With Assertions in Java. java.sun.com. Archivado desde el original el 02 de diciembre de 2015.
Using Assertions. java.sun.com. Artculo tcnico.

CAPTULO 9. ASERCIN (INFORMTICA)

Captulo 10

Automatizacin de tareas
La automatizacin de tareas es, en informtica, el conjunto de mtodos que sirven para realizar tareas repetitivas en un ordenador. Algunos mtodos para la automatizacin de tareas son la programacin simple, los macros,
los intrpretes y las bombas lgicas. Tambin hay algunos
programas especcos que automatizan tareas. Incluso los
virus informticos utilizados de forma benca podran
considerarse otro mtodo para la automatizacin de tareas para el usuario.

27

Captulo 11

Base de cdigo
El trmino codebase, o base de cdigo, es usado en
el desarrollo de software con el signicado de la coleccin completa de cdigo fuente usada para construir una
aplicacin o componente particular. Tpicamente, el codebase incluye solamente los archivos del cdigo fuente
escritos por humanos y no los archivos del cdigo fuente
generados por otras herramientas o archivos de biblioteca
binaria. Sin embargo, incluye generalmente archivos de
conguracin y de propiedades.
El codebase para un proyecto es tpicamente almacenado en un repositorio de control de fuentes. Un repositorio del cdigo fuente es un lugar en donde son guardadas
grandes cantidades de cdigo fuente, tanto pblicamente como privadamente. Son frecuentemente usados por
proyectos de multi-desarrolladores para manejar, de una
manera organizada, varias versiones y los conictos que
se presentan con los desarrolladores sometiendo modicaciones conictivas. Subversion y Mercurial son herramientas populares usadas para manejar este ujo de trabajo, y son comunes en proyectos de fuente abierta.
Rerindose a mltiples codebases como distintosse
declara que hay implementaciones independientes sin cdigo fuente compartido y que histricamente, estas implementaciones no evolucionaron de un proyecto comn.
En el caso de estndares, esto puede ser una manera de
demostrar interoperabilidad mostrando dos piezas independientes de software que implementan un estndar dado.

11.1 Vase tambin


Apache Software Foundation
Bonsai (software)
Codase
Forja (software)
Programas para control de versiones
Control de versiones
SourceForge
Subversion (software)

28

Captulo 12

Bean
Un Bean es un componente software que tiene la particularidad de ser reutilizable y as evitar la tediosa tarea de
programar los distintos componentes uno a uno. Se puede decir que existen con la nalidad de ahorrarnos tiempo
al programar. Es el caso de la mayora de componentes
que manejan los editores visuales ms comunes. Los que
hayan utilizado Visual Studio, Eclipse o Delphi por ejemplo, ya estarn familiarizados con ellos. Un Bean puede
representar desde un botn, un grid de resultados, un panel contenedor o un simple campo de texto, hasta otras
soluciones mucho ms complejas como conexiones a bases de datos, etc.
Son bastante conocidas las EJB (Enterprise JavaBeans)
que ofrecen numerosos Beans para Java.

12.1 Bean en Java


Debe cumplir los siguientes criterios:
- implementacin serializable.
- tener todos sus atributos privados (private).
- tener mtodos set() y get() pblicos de los atributos privados.
- tener un constructor pblico por defecto

12.2 Enlaces externos


JavaBeans de Sun

29

Captulo 13

Beta tester
Un Beta tester es un usuario de programas cuyos ejecutables estn pendientes de terminar su fase de desarrollo,
o alcanzar un alto nivel de funcionamiento, pero que an
no son completamente estables.* [1]

13.1 Generalidades
Los beta testers usan sus conocimientos informticos y su
tiempo para detectar errores en la versin beta del software y as poder informar de stos para que los desarrolladores los corrijan, o corregirlos ellos mismos. Algunas compaas los contratan para asegurarse de que sus
programas van a funcionar lo mejor posible en el mercado. Otro tipo de beta testers son los que trabajan desinteresadamente ofreciendo soporte y ayuda a la comunidad
GNU.
Generalmente elbetatestercomparte una cierta anidad con la herramienta puesta a prueba en cuestin, de ah
el entusiasmo por probarla, vericar nuevas funcionalidades y detectar anomalas en pos de mejorar el desarrollo
de la herramienta en cuestin.

13.2 Alfa tester


Es el mismo concepto, pero aplicado a la versin alfa del
software, es decir, al software que se encuentra en la fase
alfa del desarrollo.

13.3 Vase tambin


Fases del desarrollo de software

13.4 Referencias
[1] S.E. Smith (2003). What is a Beta Tester? (en ingls).
Consultado el 20 de octubre de 2010.

30

Captulo 14

Bifurcacin (sistema operativo)


Este artculo se reere a la bifurcacin
de procesos en sistemas operativos, consulta
Bifurcacin (informtica) para otros usos.

Soy el padre con id 1 id proceso original 1 Soy el hijo con


id 2 id proceso original 1

Una bifurcacin o fork, cuando se aplica en el contexto de un lenguaje de programacin o un sistema operativo, hace referencia a la creacin de una copia de s mismo por parte de un programa, que entonces acta como
un "proceso hijo" del proceso originario, ahora llamado
"padre". Los procesos resultantes son idnticos, salvo que
tienen distinto nmero de proceso (PID).
Ms generalmente, una bifurcacin en un entorno
multihilo signica que un hilo de ejecucin se bifurca.

El orden de la salida ser determinada por diversos parmetros del ncleo del sistema operativo. Como se puede observar, el valor contenido en la variable idPropio es
compartido por proceso padre e hijo; sin embargo, la referencia a la variable no es la misma y su posterior modicacin en cada cdigo, ya sea del padre o del hijo, no se
ver reejada en ambos procesos.

14.2 Vase tambin


Bomba fork
Tubera

14.1 UNIX
En el caso de los sistemas operativos derivados de UNIX,
la llamada al sistema fork permite realizar una bifurcacin del proceso. Esta llamada devuelve el identicador
de proceso del proceso hijo al padre y un 0 al proceso
hijo.
Aqu hay un ejemplo escrito en lenguaje de programacin
C que muestra el uso de esta llamada. El cdigo 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 idPropio; idPropio = getpid(); //Se obtiene el id del proceso
actual idHijo = fork(); //Se crea un proceso 'hijo' if
(idHijo == 1) { //Si hay un cdigo menor que cero,
hubo un error perror(Error al realizar la bifurcacin
); //Se notica al usuario return 1; //Se interrumpe la
ejecucin del proceso con una salida distinta a cero } if
(idHijo == 0) //la ejecucin 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 ejecucin de la llamada al
sistema fork devuelve el identicador al proceso 'padre'
printf(Soy el padre con id %ld id proceso original
%ld\n, (long)getpid(), (long)idPropio); return 0; }
Este cdigo imprimir:
31

Captulo 15

Binding
15.4 Enlaces externos

15.1 Psicologa y educacin


En Psicologa, el trmino binding se reere a una metodologa innovadora (Proyecto Binding) para ensear a leer
que nace de aplicar la evidencia cientca en el mbito
del aprendizaje, desarrollada por la Universidad de Barcelona. Saber cmo trabaja nuestro cerebro para realizar
una tarea tan complicada como la lectura es esencial para poder crear las mejores tcnicas de aprendizaje lector
(http://www.binding.es).
Aunque todava queda mucho camino por recorrer en este sentido, hoy en da se sabe que leer (y comprender) es
el resultado de una gran cantidad de procesos cognitivos:
la memoria de trabajo, el bucle fonolgico, la capacidad
de inferencia y deduccin, entre otros. As pues, Binding
parte de la idea de que la mejor manera de ensear a leer
es entrenar lo que se ha comprobado cientcamente que
es importante a la hora de adquirir la lectura - decodicacin, memoria de trabajo, morfologa, lxico . Los
resultados extrados los ltimos aos de la aplicacin del
Binding as lo avalan.

15.2 Informtica
En informtica, un binding es una ligadurao referencia a otro smbolo ms largo y complicado, y que se
usa frecuentemente. Este otro smbolo puede ser un valor
de cualquier tipo, numrico, de cadena, etc o el nombre
de una variable que contiene un valor o un conjunto de
valores.
En el campo de la programacin, un binding es una adaptacin de una biblioteca para ser usada en un lenguaje de
programacin distinto de aqul en el que ha sido escrita.

15.3 Derecho mercantil


En Derecho mercantil, cuando un contrato es binding
indica que el mismo es vinculante, debiendo estar rmado
y no forzar ninguna norma superior.
32

http://www.binding.es - Informacin sobre el programa 'Binding'

Captulo 16

Bloqueo mutuo
En sistemas operativos, el bloqueo mutuo (tambin conocido como interbloqueo, traba mortal, deadlock, abrazo mortal) es el bloqueo permanente de un conjunto de
procesos o hilos de ejecucin en un sistema concurrente que compiten por recursos del sistema o bien se comunican entre ellos. A diferencia de otros problemas de
concurrencia de procesos, no existe una solucin general
para los interbloqueos.

R1

Todos los interbloqueos surgen de necesidades que no


pueden ser satisfechas, por parte de dos o ms procesos.
En la vida real, un ejemplo puede ser el de dos nios que
intentan jugar al arco y echa, uno toma el arco, el otro
la echa. Ninguno puede jugar hasta que alguno libere lo
que tom.
En el siguiente ejemplo, dos procesos compiten por dos
recursos que necesitan para funcionar, que slo pueden
ser utilizados por un proceso a la vez. El primer proceso
obtiene el permiso de utilizar uno de los recursos (adquiere el lock sobre ese recurso). El segundo proceso toma el
lock del otro recurso, y luego intenta utilizar el recurso
ya utilizado por el primer proceso, por lo tanto queda en
espera. Cuando el primer proceso a su vez intenta utilizar
el otro recurso, se produce un interbloqueo, donde los dos
procesos esperan la liberacin del recurso que utiliza el
otro proceso.

16.1 Representacin de Bloqueos


Mutuos usando grafos

R2
B

Ejemplo de representacin de Bloqueo Mutuo en grafos de alocacin de recursos con dos procesos A y B, y dos recursos R1 y
R2.

16.2 Condiciones necesarias


Tambin conocidas como condiciones de Coman por
su primera descripcin en 1971 en un artculo escrito por
E. G. Coman.
Estas condiciones deben cumplirse simultneamente y no
son totalmente independientes entre ellas.
Sean los procesos P0 , P1 , ..., Pn y los recursos R0 , R1 , ...,
Rm :

El Bloqueo mutuo tambin puede ser representado usando grafos dirigidos, donde el proceso es representado por
un cuadrado y el recurso, por un crculo. Cuando un proceso solicita un recurso, una echa es dirigida del crculo
al cuadrado. Cuando un recurso es asignado a un proceso,
una echa es dirigida del cuadrado al crculo.
En la gura del ejemplo, se pueden ver dos procesos diferentes (A y B), cada uno con un recurso diferente asignado (R1 y R2). En este ejemplo clsico de bloqueo mutuo,
es fcilmente visible la condicin de espera circular en
la que los procesos se encuentran, donde cada uno solicita
un recurso que est asignado a otro proceso.
33

Condicin de exclusin mutua: existencia de al


menos de un recurso compartido por los procesos,
al cual slo puede acceder uno simultneamente.
Condicin de retencin y espera: al menos un proceso Pi ha adquirido un recurso Ri , y lo retiene mientras espera al menos un recurso Rj que ya ha sido
asignado a otro proceso.
Condicin de no expropiacin: los recursos no
pueden ser expropiados por los procesos, es decir,
los recursos slo podrn ser liberados voluntariamente por sus propietarios.

34
Condicin de espera circular: dado el conjunto
de procesos P0 ...Pm (subconjunto del total de procesos original),P0 est esperando un recurso adquirido
por P1 , que est esperando un recurso adquirido por
P2 ,... ,que est esperando un recurso adquirido por
Pm , que est esperando un recurso adquirido por P0 .
Esta condicin implica la condicin de retencin y
espera.

CAPTULO 16. BLOQUEO MUTUO


La condicin de espera circular es la ms fcil de
atacar. Se le permite a un proceso poseer slo un
recurso en un determinado momento, o una jerarqua puede ser impuesta de modo tal que los ciclos
de espera no sean posibles.

16.5 Livelock

Un livelock es similar a un deadlock, excepto que el estado


de los dos procesos envueltos en el livelock constantemente cambia con respecto al otro. Livelock es una forma de
Los bloqueos mutuos pueden ser evitados si se sabe cier- inanicin y la denicin general slo dice que un proceso
ta informacin sobre los procesos antes de la asignacin especco no est procesando.
de recursos. Para cada peticin de recursos, el sistema
En un ejemplo del mundo real, un livelock ocurre por
controla si satisfaciendo el pedido entra en un estado inejemplo cuando dos personas, al encontrarse en un paseguro, 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 movindose a un lado para dejar a
solamente si se asegura que quedar en un estado seguro.
la otra persona pasar, pero terminan movindose de lado
Para que el sistema sea capaz de decidir si el siguiente
a lado sin tener ningn progreso, pues ambos se mueven
estado ser seguro o inseguro, debe saber por adelantahacia el mismo lado, al mismo tiempo.
do y en cualquier momento el nmero y tipo de todos los
recursos en existencia, disponibles y requeridos. Existen Livelock es un riesgo con algunos algoritmos que detectan y recuperan los interbloqueos, pues si ms de uno tovarios algoritmos para evitar bloqueos mutuos:
ma cartas en el asunto, la deteccin del interbloqueo puede ser disparada continuamente; pudiendo ser arreglado
Algoritmo del banquero, introducido por Dijkstra.
asegurndose que slo un proceso (escogido al azar o por
Algoritmo de grafo de asignacin de recursos.
prioridad) tome accin.
Algoritmo de Seguridad.

16.3 Evitando bloqueos mutuos

Algoritmo de solicitud de recursos.

16.4 Prevencin
Los bloqueos mutuos pueden prevenirse asegurando que
no suceda alguna de las condiciones necesarias vistas anteriormente.
Eliminando la exclusin mutua: ningn proceso puede tener acceso exclusivo a un recurso. Esto es imposible para procesos que no pueden ser encolados
(puestos en un spool), e incluso con colas tambin
pueden ocurrir interbloqueos.
La condicin de posesin y espera puede ser eliminada haciendo que los procesos pidan todos los recursos que van a necesitar antes de empezar. Este
conocimiento por adelantado muchas veces es imposible nuevamente. Otra forma es requerir a los
procesos liberar todos sus recursos antes de pedir todos los recursos que necesitan. Esto tambin es poco
prctico en general.
La condicin de no expropiacin puede ser tambin
imposible de eliminar dado que un proceso debe poder tener un recurso por un cierto tiempo o el procesamiento puede quedar inconsistente.

Captulo 17

Bodyshopping
Bodyshopping es un trmino ligado al mundo empresarial informtico o tecnolgico que hace referencia a la
venta de capital humano. Conlleva la cesin de personal
de este tipo a terceras empresas con nimo de lucro.
Trmino que proviene del ingls que podramos denir
como anglicismo o extranjerismo y que en su traduccin
literal hace referencia a la compra de cuerpos. Una forma castiza de denominar estas empresas es charcuteras o
crnicas.
Esta prctica es muy habitual en el mundo de la consultora informtica y existen multitud de empresas que basan
su negocio en esta "venta" de personal actuando prcticamente como empresas de trabajo temporal orientadas
a la tecnologa.
En ocasiones ciertas compaas que tienen esta prctica
como ncleo de su negocio, fundamentan sus ingresos en
la contratacin de este personal, normalmente con poca
experiencia y bajo salario, con contratos temporales o
por obra, quienes posteriormente son revendidos a terceras empresas como profesionales altamente cualicados y
con una gran experiencia, siendo sta nica y exclusivamente la base de su negocio y de su Retorno de la inversin, ya que a menos experiencia y salario del personal,
mayor benecio por las altas tarifas cobradas.
La legislacin espaola expone claramente en su Estatuto
de los Trabajadores (Artculo 43. Cesin de trabajadores.)
que el bodyshopping es ilegal.

17.1 Enlaces externos


Trabajo Basura Directorio con estas empresas y experiencias personales de gente que ha trabajado en
ellas.
Trabajungla Experiencias personales y salarios sobre estas empresas revelados de forma annima.
El Informtico Impasible: Outsourcing: OnShore y
OShore
El Sector de la Consultora Informtica en Espaa
Peccata Minuta
Entendiendo el Bodyshopping Peccata Minuta
35

Las consultoras informticas :: LinuxAdicto.org


Podcast monogrco sobre consultora

Captulo 18

BrookGPU
BrookGPU fue desarrollado por la Universidad de Stanford, es un grupo de compiladores y aplicaciones basadas en el lenguaje Brook para utilizar con unidades de
procesamiento grco (GPU). la programacin con unidades GPU es continuamente abreviada con el nombre
de General-purpose computing on graphics processing
units (GPGPU). Para usar este programa es necesario
una unidad de procesamiento grco (GPU) tipo ATI,
NVIDIA o Grcos integrados Intel, capaces de soportar
gran paralelismo. BrookGPU compila programas escritos
en Brook, una extensin de ANSI C diseado para incorporar computacin de datos paralelos y aritmticos con
un ecaz y familiar lenguaje. respecto al modelo general de programacin, por ujo de datos tipo por Stream,
ofrece 2 grandes ventajas respecto a estos:
Paralelismo de datos: permite al programador especicar cmo realizar las mismas operaciones en
paralelo sobre diferentes datos.
Intensidad aritmtica: le da a los programadores
el poder para minimizar la comunicacin global de
las operaciones y maximizar la comunicacin local
de las mismas
Muchos de los progresos en este lenguaje se han visto en
el proyecto de computacin distributiva Folding@home,
adems con el n de expandir las nuevas tcnicas
GPGPU, viene bajo licencia GPL, y as abrir las puertas
a nuevos programadores de Direct3D, OpenGL o hasta
Close to Metal sin dejar los detalles implementados en
estos dichos lenguajes.* [cita requerida]

36

Captulo 19

Caja blanca (sistemas)


En programacin, se denomina cajas blancas a un tipo
de pruebas de software que se realiza sobre las funciones internas de un mdulo. As como las pruebas de caja
negra ejercitan los requisitos funcionales desde el exterior del mdulo, las de caja blanca estn dirigidas a las
funciones internas. Entre las tcnicas usadas se encuentran; la cobertura de caminos (pruebas que hagan que se
recorran todos los posibles caminos de ejecucin), pruebas sobre las expresiones lgico-aritmticas, pruebas de
camino de datos (denicin-uso de variables), comprobacin de bucles (se verican los bucles para 0,1 e interacciones, y luego para las interacciones mximas, mximas
menos uno y ms uno).
Las pruebas de caja blanca se llevan a cabo en primer
lugar, sobre un mdulo concreto, para luego realizar las
de caja negra sobre varios subsistemas (integracin).
En los sistemas orientados a objetos, las pruebas de caja
blanca pueden aplicarse a los mtodos de la clase, pero
segn varias opiniones, ese esfuerzo debera dedicarse a
otro tipo de pruebas ms especializadas (un argumento
podra ser que los mtodos de una clase suelen ser menos complejos que los de una funcin de programacin
estructurada). Dentro de las Pruebas de Caja Blanca encontramos las llamadas coberturas (sentencia, decisin,
condicin y mltiple adems de los mencionados caminos ciclomticos propuestos por McCabe)
Este concepto tambin es utilizado de manera anloga en
la teora general de sistemas.

19.1 Vase tambin


Pruebas de software
Pruebas de caja blanca
Pruebas de caja negra

37

Captulo 20

Caja negra (sistemas)


deber conocer como es la comunicacin con los otros
mdulos (la interfaz), pero no necesitar conocer como
trabajan esos otros mdulos internamente; en otras palabras, para el desarrollador de un mdulo, idealmente, el
resto de mdulos sern cajas negras.
Esquema de una caja negra

En teora de sistemas y fsica, se denomina Caja Negra a


aquel elemento que es estudiado desde el punto de vista de
las entradas que recibe y las salidas o respuestas que produce, sin tener en cuenta su funcionamiento interno. En
otras palabras, de una caja negra nos interesar su forma
de interactuar con el medio que le rodea (en ocasiones,
otros elementos que tambin podran ser cajas negras)
entendiendo qu es lo que hace, pero sin dar importancia a cmo lo hace. Por tanto, de una caja negra deben
estar muy bien denidas sus entradas y salidas, es decir,
su interfaz; en cambio, no se precisa denir ni conocer los
detalles internos de su funcionamiento.

20.1 Justicacin
Un sistema formado por mdulos que cumplan las caractersticas de caja negra ser ms fcil de entender ya que
permitir dar una visin ms clara del conjunto. El sistema tambin ser ms robusto y fcil de mantener, en caso
de ocurrir un fallo, ste podr ser aislado y abordado ms
gilmente.

20.2 Caja negra y programacin


modular

20.3 Pruebas de software


En pruebas de software, conociendo una funcin especca para la que fue diseado el producto, se pueden
disear pruebas que demuestren que dicha funcin est
bien realizada. Dichas pruebas son llevadas a cabo sobre
la interfaz del software, es decir, de la funcin, actuando
sobre ella como una caja negra, proporcionando unas entradas y estudiando las salidas para ver si concuerdan con
las esperadas.

20.4 Caja negra vs 'Cajanegrizar'


Este concepto de caja negra utilizado en fsica, informtica y disciplinas tcnicas o tecnolgicas en general, aunque est relacionado, no debe confundirse con el
'Cajanegrismo'; ste es un concepto ms vinculado a la
sociologa que hace referencia al hecho de que las personas solemos olvidarnos del funcionamiento interno de las
cosas (generalmente nuevos dispositivos tecnolgicos) a
medida que nos familiarizamos con ellos y terminamos
por asimilarlos como de uso cotidiano. A este proceso de
olvidar el funcionamiento interno de las cosas se le conoce con el nombre de 'cajanegrizar'.

Se podra decir que la principal diferencia entre ambos


conceptos es que mientras el primero, el estudio de un sistema como una caja negra, es un proceso de abstraccin,
En programacin modular, donde un programa (o un el segundo, el 'cajanegrismo', es ms bien un proceso de
algoritmo) es dividido en mdulos, en la fase de diseo se olvido.
buscar que cada mdulo sea una caja negra dentro del
sistema global que es el programa que se pretende desarrollar, de esta manera se consigue una independencia en- 20.5 Vase tambin
tre los mdulos que facilita su implementacin separada
por un equipo de trabajo donde cada miembro va a en Teora de sistemas
cargarse de implementar una parte (un mdulo) del pro Modularidad
grama global; el implementador de un mdulo concreto
38

20.5. VASE TAMBIN


Interfaz
Interfaz de usuario
Diseo estructurado
Caja blanca (sistemas)
Abstracto y Abstraccin
Cajanegrizar

39

Captulo 21

CamelCase
En nombres de empresas tales como
BellSouth
CompuServe
LinuxCabal
Microsoft, antiguamente MicroSoft

Ejemplo de CamelCase en un indicador.

PriceWaterhouseCoopers

CamelCase es un estilo de escritura que se aplica a frases


o palabras compuestas. El nombre se debe a que las maysculas a lo largo de una palabra en CamelCase se asemejan a las jorobas de un camello. El nombre CamelCase
se podra traducir como Maysculas/Minsculas Camello.
El trmino case se traduce comocaja tipogrca, que
a su vez implica si una letra es mayscula o minscula y
tiene su origen en la disposicin de los tipos mviles en
casilleros o cajas.
Existen dos tipos de CamelCase:

OmegaSoft
VaxaSoftware
La Sexta
eDreams
En algunos hashtag

21.2 Enlaces externos

UpperCamelCase, cuando la primera letra de cada


una de las palabras es mayscula. Ejemplo: EjemploDeUpperCamelCase.
lowerCamelCase, igual que la anterior con la excepcin de que la primera letra es minscula. Ejemplo:
ejemploDeLowerCamelCase.

21.1 Usos
En varios lenguajes de programacin
Java
.NET
C
C++
Python
C#
Objective-C
ActionScript
PHP
En las primeras herramientas wiki
40

Primer wiki, creado por Ward Cunningham


Caja alta y baja en el DRAE.

Captulo 22

Caml
Caml (Originalmente un acrnimo para Categorical let rec fact = function | 0 -> 1 | n -> n * fact(n - 1);;
Abstract Machine Language, en espaol Lenguaje Mquina Abstracto Categrico) es un dialecto de lafamilia de Esta ltima forma es la denicin matemtica de factorial
losmeta lenguajes, desarrollado en INRIA y anteriormen- como una relacin de recurrencia.
te en ENS.
Note que el compilador inri el tipo de esta funcin para
Como muchos descendientes delML, Caml es un len- ser int -> int, signica que esta funcin mapea enteros a
guaje de tipado esttico, evaluacin estricta, y utiliza enteros. Por ejemplo, 12! Es:
administracin de memoria automtica.
# fact 12;; - : int = 479001600
La primera implementacin de Caml en Lisp fue apodada
CAML pesadodebido a los requisitos de memoria y
CPU relativos a su sucesor Caml Light, aquello fue
implementado en C por Xavier Leroy y Damien Doligez.
Adems de una reescritura completa, CAML Special 22.1.3 Derivacin numrica (funciones de
Lightaadi un potente sistema de mdulos al ncleo
alto orden)
del lenguaje.
Actualmente, la implementacin principal de Caml es Desde que OCaml es un lenguaje de programacin funOCaml, el cual aade muchas caractersticas nuevas al cional, es fcil crear y repasar funciones en programas de
lenguaje, entre ellas una capa de objeto.
OCaml. Esta capacidad tiene un nmero enorme de aplicaciones. Calcular la derivada numrica de una funcin es
una de ellas. La funcind en Caml computa la derivada
22.1 Ejemplos
numrica de una funcin dada f en un punto dado x:
Lo siguiente, # representa el prompt de OCaml.

22.1.1

Hola Mundo

print_endline Hello World!";;

let d delta f x = (f (x +. delta) . f (x . delta)) /. (2. *.


delta);;
Esta funcin requiere un valor innitesimal delta. Una
buena eleccin para delta es la raz cbica del psilon de
la mquina.

El tipo de la funcin d indica que sta mapea un tipo


de dato otante a otra funcin del mismo tipo (oat ->
oat) -> oat -> oat. Esto nos permite aplicar argumen22.1.2 Funcin factorial (recursividad y tos parcialmente. Este estilo funcional es conocido como
programacin puramente funcio- curricacin. En este caso, es til al aplicar parcialmente
el primer argumento delta a d, para obtener una funcin
nal)
ms especializada:
Muchas funciones matemticas, como el factorial, son re- # let d = d (sqrt epsilon_oat);; val d : (oat -> oat) ->
presentadas ms naturalmente en una forma puramente oat -> oat = <fun>
funcional. La siguiente funcin recursiva, puramente funcional implementa la operacin factorial en Caml:
Note que el tipo inferido indica que la sustitucin d espelet rec fact n = if n=0 then 1 else n * fact(n - 1);;
ra una funcin del tipo otante oat -> oat como primer
argumento. Podemos computar una aproximacin numLa funcin puede ser escrita equivalentemente utilizando rica a la derivada de la funcin x3 x 1 en el punto
patrones de emparejamiento:
x = 3 con:
41

42

CAPTULO 22. CAML

# d (fun x -> x *. x *. x . x . 1.) 3.;; - : oat = 26.

ciation of Computer Machinery.

La respuesta correcta es: f (x) = 3x2 1 f (3) =


27 1 = 26

22.4 Enlaces externos

La funcin d se denomina funcin de alto ordenya


que acepta otra funcin (f) como argumento.

[Repositorio de Caml en Github]

[Sitio ocial de Caml]


Los conceptos de funciones curricadas y de alto orden
son tiles evidentemente en programas matemticos. De
[Tutoriales de caml (ingls)]
hecho, estos conceptos son igualmente aplicables a otras
formas de programacin y pueden ser empleados en cdigo de factor mucho ms agresivamente, resultando epro- 22.4.1 Libros
gramas ms 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 nmeros enteros de potencia en base dos puede ser implementada muy sucintamente en Caml y es un ejemplo excelente del uso de la concordancia de patrones sobre listas, 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 haarin
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]
El patrn de emparejamiento permite transformaciones
complicadas para ser representadas claramente y sucintamente (brevemente). Adems, el compilador de OCaml
realiza concordancia de patrones en un cdigo muy ecaz, el tiempo en el que los programas arrojan resultados
es ms corto y ms rpido que el cdigo equivalente escrito con una estructura "switch-case" (Cardelli 1984, p.
210.).

22.2 Vase tambin


OCaml
ML
F#

22.3 Referencias
Cardelli, Luca (1984). Compiling a functional language
ACM simposio en LISP y programacin funcional, Asso-

Captulo 23

Cierre de exclusin mutua


En ciencias de la computacin, los cierres de exclusin Estas son:
mutua o candados son un mecanismo de sincronizacin
que limita el acceso a un recurso compartido por varios
Slo el dueo de un cerrojo puede desbloquearlo
procesos o hilos en un ambiente de ejecucin concurrente,
La readquisicin de un cerrojo no est permitida
permitiendo as la exclusin mutua.
Cuando un elemento es compartido por ms de un hilo,
pueden ocurrir condiciones de carrera si el mismo no es
protegido adecuadamente. El mecanismo ms simple para la proteccin es el cierre o cerrojo. En general cuando
debe protegerse un conjunto de elementos, se le asocia
un cerrojo. Cada proceso/hilo para tener acceso a un elemento del conjunto, deber bloquear, con lo que se convierte en su dueo. Esa es la nica forma de ganar acceso.
Al terminar de usarlo, el dueo debe desbloquear, para
permitir que otro proceso/hilo pueda tomarlo a su vez.
Es posible que mientras un proceso/hilo est accediendo a un recurso (siendo por lo tanto dueo del cerrojo),
otro proceso/hilo intente acceder. Esta accin debe esperar hasta que el cerrojo se encuentre libre, para garantizar la exclusin mutua. El proceso/hilo solicitante queda
entonces en espera o pasa a estado de bloqueo segn el
algoritmo implementado. Cuando el dueo del cerrojo lo
desbloquea puede tomarlo alguno de los procesos/hilos
que esperaban.
Este mecanismo se puede ver en un ejemplo de la vida
real. Supongamos un bao pblico, donde slo puede entrar una persona a la vez. Una vez dentro, se emplea un
cierre para evitar que entren otras personas. Si otra persona pretende usar el bao cuando est ocupado, deber quedar esperando a que la persona que entr anteriormente termine. Si ms personas llegaran, formaran una
cola (del tipo FIFO) y esperaran su turno. En informtica, el programador no debe asumir este tipo de comportamiento en la cola de espera.

Algo muy importante es que todos los procesos/hilos deben utilizar el mismo protocolo para bloquear y desbloquear los cerrojos en el acceso a los recursos, ya que si
mientras dos procesos/hilos utilizan el cerrojo de forma
correcta, existe otro que simplemente accede a los datos
protegidos, no se garantiza la exclusin mutua y pueden
darse condiciones de carrera y errores en los resultados.

23.1 Primitivas y uso


Las funciones de los cerrojos en general son tres: init(),
lock() y unlock(). El cerrojo se inicializa con la funcin
init(). Luego cada proceso/hilo debe llamar a la funcin
lock() antes de acceder a los datos protegidos por el cierre.
Al nalizar su seccin crtica, el dueo del cerrojo debe
desbloquearlo mediante la funcin unlock().

23.2 Bloqueos en bases de datos


Los sistemas gestores de bases de datos suelen utilizar
bloqueos para evitar problemas de concurrencia y, en
ocasiones, garantizar la serializabilidad de las transacciones. Para hacerlo adecuadamente, los mecanismos de bloqueo suelen implementar protocolos como el bloqueo de
dos fases y utilizar registros transaccionales (logs) como
apoyo.

El cerrojo, usado de esta manera, forma una seccin crtica en cada proceso/hilo, desde que es tomado hasta que
se libera. En el ejemplo del bao, dentro de la seccin
crtica se encuentran las funciones que se realizan generalmente dentro de este tipo de instalaciones sanitarias.
Como garantizan la exclusin mutua, muchas veces se los
denomina mutex (por mutual exclusion).
En general hay un nmero de restricciones sobre los cerrojos, aunque no son las mismas en todos los sistemas.

43

Captulo 24

Clase utilidad
En programacin, una clase utilidad es una clase que dene un conjunto de mtodos que realizan funciones, normalmente muy reutilizadas. La mayora de las clases utilidad denen estos mtodos comunes con alcance esttico.
Ejemplos de clases utilidad incluyen java.util.Collections
que proveen muchos mtodos estticos (tales como ordenar) en objetos que implementan una Collection (java.util.collection ).

24.1 Enlaces externos


Utility Pattern: Para una clase utilidad, que no requiere instanciacin y slo tiene mtodos estticos,
se debe usar un constructor privado.

44

Captulo 25

Clear.gif
El lenguaje HTML para desarrollar pginas web no permite el alineamiento arbitrario de los objetos dentro del
documento.
Cuando Internet no se encontraba tan desarrollado, y
prcticamente el HTML era lo nico con lo que se contaba para mostrar contenidos, un truco que los desarrolladores utilizaban para poder alinear los textos a la altura y
anchura que se desearan dentro de la pgina, era crear un
archivo transparente de un pxel de tamao y en formato
grco GIF, que en aquel entonces era el nico que permita manejar transparencia en las imgenes. El archivo
era manipulado dentro del cdigo de la pgina web para
que apareciera con cierta alineacin, ya que las imgenes
si permitan la alineacin, pero no el texto.
La transparencia era importante, pues permita que la
imagen no apareciera dentro de la visualizacin de la pgina web.
El archivo era usualmente llamado clear.gif, aunque
cualquier desarrollador que hiciera la imagen poda crearla con el nombre que quisiera. El nombre de dicho archivo
dio lugar al de la tcnica.
La manera sencilla en la que se hace trabajar este truco
en el cdigo HTML es la siguiente:
<IMG
hspace=x
SRC="/ruta/al/archivo/clear.gif">

vspace=y

Donde x y y son las coordenadas de espaciado horizontal y vertical que se desean, y el atributo SRC seala la
ruta hacia el archivo clear.gif. El texto que se escriba a
continuacin de ese fragmento de cdigo, se alinear a la
altura y anchura indicada en la etiqueta.

45

Captulo 26

CMake
CMake es una herramienta multiplataforma de generacin o automatizacin de cdigo. El nombre es una abreviatura paracross platform make(make multiplataforma); ms all del uso de makeen el nombre, CMake
es una suite separada y de ms alto nivel que el sistema
make comn de Unix, siendo similar a las autotools.
CMake es una familia de herramientas diseada para
construir, probar y empaquetar software. CMake se utiliza para controlar el proceso de compilacin del software usando cheros de conguracin sencillos e independientes de la plataforma. Cmake genera makeles nativos
y espacios de trabajo que pueden usarse en el entorno
de desarrollo deseado. Es comparable al GNU build system de Unix en que el proceso es controlado por cheros
de conguracin, en el caso de CMake llamados CMakeLists.txt. Al contrario que el GNU build system, que est
restringido a plataformas Unix, CMake soporta la generacin de cheros para varios sistemas operativos, lo que
facilita el mantenimiento y elimina la necesidad de tener
varios conjuntos de cheros para cada plataforma.

el Visualization Toolkit (VTK), un sistema para grcos


3D y visualizacin libres.
Para crear CMake, Bill Homan en Kitware incorpor
algunas ideas de pcmaker, y aadi ms cosas propias,
con el pensamiento de adoptar algunas de las funcionalidades del GNU build system. La implementacin inicial de CMake tuvo lugar a mediados del 2000, con un
desarrollo acelerado a comienzos del 2001. Muchas mejoras se debieron a inuencias de otros desarrolladores a
la hora de incorporar CMake a sus propios sistemas. Por
ejemplo, la comunidad de VXL adopt CMake, contribuyendo con muchas caractersticas esenciales. Brad King
aadi varias caractersticas para dar soporte a CABLE
y GCC-XML, un juego de herramientas de envoltura automticas; y GE Corporate R&D necesitaba soporte para
su infraestructura de pruebas (DART). Otras funcionalidades se aadieron para soportar la transicin de VTK's
a CMake, y soportar ParaView, un sistema de visualizacin paralela para el Advanced Computing Lab en Los
Alamos National Laboratory.

El proceso de construccin se controla creando uno o ms


cheros CMakeLists.txt en cada directorio (incluyendo
subdirectorios). Cada CMakeLists.txt consiste en uno o 26.2 Documentacin y tutoriales
ms comandos. Cada comando tiene la forma COMANDO (argumentos...) donde COMANDO es el nombre del Aparte de la documentacin ocial 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 predenidos y denidos por el usuario. Existen generadores makele para Unix, Borland make, Watcom make, MinGW,
MSYS y Microsoft NMake. Tambin es posible generar 26.3 Principales funcionalidades
cheros de proyecto para Code::Blocks, Eclipse CDT,
Microsoft Visual Studio de la 6 a la 10 incluyendo ver Ficheros de conguracin escritos en un lenguaje de
siones de 64 bits y KDevelop.
scripting especco para CMake
Anlisis automtico de dependencias para C, C++,
Fortran, y Java

26.1 Historia
CMake se cre en respuesta a la necesidad de disponer
de un entorno multiplataforma apropiado de construccin para el Insight Segmentation and Registration Toolkit (ITK) creado por la United States National Library of
Medicine como parte del Visible Human Project. Fue inuenciado por un sistema anterior llamado pcmaker creado por Ken Martin y otros desarrolladores para soportar
46

Soporte para SWIG, Qt, FLTK, a travs del lenguaje


de scripting de CMake
Soporte para varias versiones de Microsoft Visual
Studio, incluyendo la 6, 7, 7.1, 8.0, 9.0 y 10.0
Genera cheros para Eclipse CDT (C/C++ Development Tools)

26.6. VASE TAMBIN

47

Deteccin de cambios en cheros usando timestamps tradicionales

26.6 Vase tambin

Soporte para builds paralelos

Automake

Compilador cruzado

Autoconf

Vista global de todas las dependencias, usando


CMake para generar un diagrama graphviz

premake

Soporte para builds multiplataforma


Linux y otros sistemas POSIX (incluyendo
AIX, *BSD, HP-UX, IRIX/SGI, y Solaris)
Mac OS X
Windows 95/98/NT/2000/XP, Windows Vista, Windows 7 y MinGW/MSYS
Integrado con DART (software), CDash, CTest y
CPack, una coleccin de herramientas para prueba
y liberacin de software

SCons
VTK
Waf

26.7 Enlaces externos


CMake
CMake Wiki
Documentacin

26.4 CTest, CPack, CDash

Listas de correo

Kitware desarroll estas herramientas en colaboracin


con muchos otros. Incluyen CMake, CTest, CPack y
CDash. CPack es una utilidad de empaquetamiento y despliegue. CTest es un cliente de pruebas libre.

26.5 Aplicaciones
CMake
Avidemux
Compiz
Kicad
KVIrc
LMMS
MiKTeX
MuseScore
MySQL
OpenCV
Poppler
PvPGN
Quantum GIS
Scribus
Second Life
SuperTux
OGRE 3D
Ryzom

que

utilizan

Captulo 27

Codecademy
Codecademy es una plataforma interactiva en lnea que
ofrece clases gratuitas de codicacin en lenguajes de
programacin como Python, PHP, JavaScript, y Ruby,
as como lenguajes de marcado incluyendo HTML y
CSS* [2]* [3] y tambin uso de API's. A partir de septiembre del 2011, el sitio ha tenido ms de 550,000 usuarios que han completado ms de seis millones de ejercicios.* [4]* [5] El sitio ha recibido crticas positivas de varios blogs y sitios web, incluyendo el New York Times* [6]
y TechCrunch.* [7]

para aprender como programar, mediante la introduccin


de un nuevo curso cada semana en el 2012.* [12] Ms de
450,000 personas tomaron el curso en el 2012,* [13]* [14]
y Codecademy continua ofertando el programa en el
2013.

27.3 Vase tambin


Academic Earth

Para motivar a los usuarios a participar el sitio cuenta con


un sistema de gamicacin por el que ofrece insignias o
medallas al completar ejercicios, cuenta con foros de discusin y un glosario por curso, y mantiene un registro de
la puntuacin total del usuario y la muestra a los dems. El
sitio tambin permite que cualquier persona pueda crear
y publicar un nuevo curso usando la herramienta de creacin de cursos.

Coursera
Dev Bootcamp
edX
Gilles Babinet
Khan Academy
lynda.com

27.1 Historia

Marginal Revolution University


Codecademy fue fundada en 2011 por Zach Sims y Ryan
Bubinski.* [8] Sims dej la universidad Columbia University para centrarse en el lanzamiento de una empresa,
mientras que Bubinski se gradu en Columbia con una licenciatura en ciencias de la computacin y biofsica.* [9]
La compaa actualmente se encuentra en Nueva York.
Obtuvo 2,5 millones de dlares en su primera ronda de nanciacin en octubre de 2011 y 10 millones en la segunda serie en junio de 2012.* [8]* [10] La ltima ronda de
nanciacin fue llevada a cabo por Index Ventures.* [11]

Udacity
Udemy

27.4 Referencias

Finalmente en el ao 2014, la empresa Codecademy decide vender publicidad, comenzando con brindar un banner
al gobierno de la ciudad de buenos aires.

27.2 Code Year


Code Year es un programa gratuito de Codecademy
para cualquiera que este interesado en aprender como
programar. El programa tiene la intencin de ayudar a las
personas a seguir a travs de un New Year's Resolution
48

[1] Codecademy.com Site Info. Alexa Internet. Consultado


el 18 de Septiembre de 2015.
[2] Codecademy. Codecademy. Consultado el 4 de agosto
de 2012.
[3] Indvik, Lauren. Codeacademy Releases Free Ruby Development Courses. Mashable. Mashable. Consultado el
30 de diciembre de 2012.
[4] Frier, Sarah. Codecademy Raises $10M, Sees Job Service as Part of Its Future. Consultado el 19 de junio de
2012.
[5] Kafka, Peter. Codecademy Rounds Up $10 Million for
Web Lessons. Consultado el 19 de junio de 2012.

27.5. ENLACES EXTERNOS

[6] Wortham, Jenna. Codecademy Oers Free Coding Classes for Aspiring Entrepreneurs. The New York Times.
Consultado el 26 de julio de 2012.
[7] Cincaid, Jason. Codecademy Surges To 200,000 Users,
2.1 Million Lessons Completed In 72 Hours. TechCrunch. Consultado el 26 de julio de 2012.
[8] 30 Under 30: Zach Sims and Ryan Bubinski, Codecademy. Inc.com. 2 de julio de 2012. Consultado el 13 de
agosto de 2012.
[9] Segall, Laurie (29 de noviembre de 2011). Codecademy
says it can turn anyone into a Web programmer - Nov.
29, 2011. Money.cnn.com. Consultado el 13 de agosto
de 2012.
[10] Wortham, Jenna (27 de octubre de 2011). Codecademy
Lands $2.5 Million From Investors - NYTimes.com.
Bits.blogs.nytimes.com. Consultado el 13 de agosto de
2012.
[11] Colao, JJ (19 de junio de 2012). Codecademy Raises $10
Million To Conquer The World. Forbes.com.
[12] Segall, Laurie (6 de enero de 2012). Code Year draws
200,000 aspiring programmers - Jan. 6, 2012. Money.cnn.com. Consultado el 16 de febrero de 2013.
[13] Learning JavaScript With Code Year " Feld Thoughts
Feld Thoughts. Feld.com. Consultado el 16 de febrero
de 2013.
[14] Codecademy. Code Year. Code Year. Consultado el 16
de febrero de 2013.

27.5 Enlaces externos


Sitio Web de Codecademy

49

Captulo 28

Cdigo cerrado
En informtica un programa es de cdigo cerrado cuando el cdigo fuente no se encuentra disponible para cualquier usuario, es decir no se hace pblico. Se le llama as
en contraposicin al cdigo abierto.
El software no libre generalmente utiliza un cdigo cerrado. Por su calidad de secreto industrial, su divulgacin
podra ser constituyente de delito en algunos pases.

28.1 Vase tambin


Software privativo

50

Captulo 29

Cdigo compilado
Un cdigo compilado es un cdigo que previamente fue
un cdigo simblico interpretable por un compilador, y
luego ese compilador lo convirti en un cdigo directamente interpretable por un controlador (Cdigo mquina).

51

Captulo 30

Cdigo mutante
En informtica, el trmino cdigo mutante o cdigo
ambiguo se emplea para referirse a un cdigo cuya integridad es modicada por s mismo durante su ejecucin, generalmente este cdigo trata de un malware por
el hecho de que si como algoritmo (cuando es ejecutado) se automodica como informacin (donde est almacenado) fcilmente puede engaar a un programa del tipo antivirus o similar. Aunque de todas maneras, ciertos
programas Antivirus son capaces de detectar este tipo de
modicaciones.

52

Captulo 31

Cdigo objeto
En programacin, se llama cdigo objeto al cdigo que con parmetros incorrectos o inexistentes puede generar
resulta de la compilacin del cdigo fuente.* [1]
un error que generalmente el compilador no detecta ya
Consiste en lenguaje mquina o bytecode y se distribuye que el cdigo objeto no es vericado, nicamente unien varios archivos que corresponden a cada cdigo fuente do. Este tipo de error se puede solucionar reescribiendo
compilado. Para obtener un programa ejecutable se han el cdigo de manera correcta y re compilarlo a cdigo
objeto.
de enlazar todos los archivos de cdigo objeto con un programa llamado enlazador (linker).

31.3 Referencias
[1] http://www.alegsa.com.ar/Dic/codigo%20objeto.php

31.4 Enlaces externos

Fases en la realizazin de software

31.1 Cdigo objeto en lenguajes de


programacin
Un claro ejemplo de lenguaje de programacin que usa
cdigo objeto en sus libreras es Pauscal. Esto le permite
aumentar la velocidad de compilacin de los programas y
reducir su tamao (ya que cada librera objeto puede ser
comprimida), tambin permite a programadores compartir sus libreras/funciones sin tener la necesidad de liberar
sus cdigos fuentes originales. Incluso puede permitir a
distintos lenguajes de programacin compartir funciones
sin necesidad de tener que reescribir el cdigo plano a sus
respectivas sintaxis.

Wikcionario tiene deniciones y otra informacin sobre cdigo objeto.Wikcionario

el cdigo objeto es el resultado de la compilacin del cdigo fuente. Puede ser en lenguaje mquina o bytecode, y
puede distribuirse en varios archivos que corresponden a
cada cdigo fuente compilado. Luego un enlazador (linker) se encarga de juntar todos los archivos de cdigo
objeto para obtener el programa ejecutable. - See more at: http://www.alegsa.com.ar/Dic/codigo%20objeto.
php#sthash.ktzQpZxJ.dpuf Cdigo objeto: Conjunto de
instrucciones y datos escritos en un lenguaje que entiende el ordenador directamente: binario o cdigo mquina.
Provienen de la traduccin de cierto cdigo fuente, es un
fragmento del programa nal y es especco de la plataforma de ejecucin.

31.2 Errores comunes


Los cdigo objeto pueden ser muy tiles en muchas situaciones sin embargo consigo traen problemas que pueden generar errores muy difciles de corregir, por ejemplo cuando un objeto importa funciones de otro cdigo
objeto que ha sido modicado, el intento de la librera o
el programa que import la librera de ejecutar el cdigo
53

Captulo 32

Ofuscacin
La ofuscacin se reere a encubrir el signicado de una 32.1.1 Ejemplos
comunicacin hacindola ms confusa y complicada de
interpretar.
Un ejemplo simple de ofuscacin es llamar a las variables
o funciones con palabras reservadas del lenguaje aadiendo algn smbolo
int int_;

32.1 Informtica

Con esta lnea se dene una variable de tipo entero.


En computacin, la ofuscacin se reere al acto delibe- long int _int(int int_){return int_-int_};
rado de realizar un cambio no destructivo, ya sea en el
cdigo fuente de un programa informtico o cdigo mquina cuando el programa est en forma compilada o bi- Con esta lnea denimos una funcin con un parmetro
entero que devuelve un valor long int, que por otra parte
naria, con el n de que no sea fcil de entender o leer.
siempre ser 0.
En Internet, la ofuscacin reere a crear una publicacin
_int-_int;
o formar parte del grupo los Ofuscados.
El cdigo ofuscado es aqul cdigo que, aunque se tiene
el cdigo fuente, ha sido enrevesado especcamente para Esto equivale a poner 0.
ocultar su funcionalidad (hacerlo ininteligible).
(_int-_int)!;
La ofuscacin binaria se realiza habitualmente para impedir o hacer ms difcil los intentos de ingeniera inversa Esto equivale a poner 1.
y desensamblado que tienen la intencin de obtener una
(((!(int_-int_)<<!(int_-int_))<<(!(int_-int_)<<!(int_forma de cdigo fuente cercana a la forma original.
int_)))|(!(int_-int_)<<!(int_-int_)));
Como un efecto lateral, la ofuscacin, en ocasiones, hace
que los programas resultantes sean ms pequeos (aunque
Esto equivale a poner 10.
puede hacer que los programas sean ms grandes en otros
casos).
Algunos tienden ms a la ofuscacin que otros. C, C++
y Perl son los ms citados como fcilmente ofuscables.
Las macros de preprocesador son usadas a menudo para
crear cdigo complicado de leer enmascarando la gramtica y sintaxis estndar del lenguaje del cuerpo principal
de cdigo.

32.2 Otros objetivos

Aparte de los lenguajes ms conocidos, existen lenguajes


de programacin esotricos. Adems, tambin se puede
buscar que el cdigo fuente resulte una obra de ascii art.
Existen otros programas ofuscados llamados quine que al
ejecutarse la salida debe ser el cdigo fuente del programa.

La ofuscacin puede servir para otros propsitos. Los


mdicos han sido acusados de usar una jerga para encubrir hechos desagradables de un paciente. El autor y doctor Michael Crichton ha armado que la escritura mdica
es un intento altamente capacitado y calculado de confundir al lector. De forma similar, el lenguaje basado
Tambin hay programas ofuscadores que pueden actuar en texto, como gyaru-moji y algunas formas de leet speak
sobre el cdigo fuente, cdigo objeto o ambos para di- es ofuscado para hacerlo incomprensible a terceras percultar la ingeniera inversa.
sonas. lomelo
54

32.3. ENLACES EXTERNOS

32.3 Enlaces externos


Competicin de cdigo ofuscado en C
Proteccin online de libreras javascript
The International Obfuscated C Code Contest (Concurso internacional de cdigo en C ofuscado)
Cmo proteger cdigo en Java por medio de la ofuscacin de cdigo
- Ofuscador de Codigo PHP online
FOPO - Free Online PHP Obfuscator
Anlisis de ofuscacin de cdigo en Javscript

55

Captulo 33

ColdFusion
Coldfusion (Adobe ColdFusion) es una plataforma de
desarrollo rpido de aplicaciones web que usa el lenguaje
de programacin CFML. En este aspecto, es un producto
similar a ASP, JSP o PHP.

Es un lenguaje que se ejecuta en el servidor. A diferencia


de JavaScript y Applets Java, que se ejecuta en el cliente,
ColdFusion se ejecuta en el servidor web. Esto signica que los guiones escritos en ColdFusion corrern de la
ColdFusion es una herramienta que corre en forma misma manera en cualquier navegador web.
concurrente con la mayora de los servidores web de
Windows, Mac OS X, Linux y Solaris (tambin en servidores web personales en Windows 98 y puede ser usado 33.1 Historia
para intranets). El servidor de aplicaciones web de ColdFusion trabaja con el servidor HTTP para procesar peti- ColdFusion fue desarrollado inicialmente por J. J. Allaiciones de pginas web. Cada vez que se solicita una pgi- re, y su primera versin apareci en julio de 1995. En
na de ColdFusion, el servidor de aplicaciones ColdFusion 2001, estando en el mercado la versin 5, Allaire fue
ejecuta el guion o programa contenido en la pgina.
adquirido por Macromedia, que en junio de 2002 lanz
El lenguaje de programacin CFML, propio de Coldfu- ColdFusion MX (6.0), llamado de esta manera para sesion, puede crear y modicar variables igual que en otros guir la nomenclatura de sus otros productos. Esta versin
lenguajes de programacin que nos son familiares. Posee fue completamente reescrita en Java desde cero, y fue dicontrol de ujo de programas, como IF, Case, ciclo, etc. seada, entre otros aspectos, para integrarse de manera
Tiene muchas funciones built-in para realizar tareas ms sencilla con Macromedia Flash, el producto estrella de la
complicadas, por ejemplo: para averiguar qu da de la compaa.
semana ser el 3 de agosto del 2027
ColdFusion MX 7 fue lanzado en febrero de 2005, meses
antes de la adquisicin de Macromedia por Adobe SysDayOfWeekAsString(DayOfWeek('2027/08/03'))
tems. En la actualidad est disponible la versin 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 estndar,
las pginas y aplicaciones web pueden fcilmente recuperar, guardar, formatear y presentar informacin dinmicamente.

33.2 Versiones

Muchas de las funciones poderosas de ColdFusion, como leer desde y escribir en discos duros del servidor, son
basadas en tags. As como el tag
puede tener argumentos como 'width' o 'align', el
tag <CFFILE> tiene argumentos que especican 'action=read/write/copy/delete', path=' etc.
El tag <CFFORM> construye automticamente todo el
cdigo JavaScript para vericar los campos requeridos
antes de hacer el formulario. ColdFusion tambin tiene
tags para COM, Corba y Applets y Servlets de Java.
ColdFusion fue diseado para desarrollar sitios complejos y de alto trco. ColdFusion est diseado para correr
en mquinas multi-procesador, y permite construir sitios
que pueden correr en clusters de servidores.
56

1995: Allaire Cold and Fusion, versin 1.0


1996: Allaire Cold and Fusion, versin 1.5
1996: Allaire Cold and Fusion, versin 2.0
Junio 1997: Allaire Cold and Fusion, versin 3.0
Enero 1998: Allaire Cold and Fusion, versin 3.1
Noviembre 1998: Allaire ColdFusion, versin 4.0
(a partir de esta versin se le conoce como ColdFusion, ya que antes era Cold and Fusion)
Noviembre 1999: Allaire ColdFusion, versin 4.5
Junio 2001: Macromedia ColdFusion, versin 5.0
Mayo 2002: Macromedia ColdFusion MX, version
6.0, Updater 1, Updater 2, Updater 3

33.3. EJEMPLOS DE CDIGO

57

Julio 2003: Macromedia ColdFusion MX, version


6.1, hot x, Updater 1

33.3 Ejemplos de cdigo

2005: Macromedia ColdFusion MX 7, 7.0.1, 7.0.2

Consulta a una base de datos:

30 de julio, 2007: Adobe ColdFusion 8


4 de abril, 2009: Adobe ColdFusion 8.0.1

<cfquery
name="nombredelaconsultadatasource="conexion_odbc"> SELECT * FROM table WHERE
campo = 'hola' </cfquery>

5 de octubre, 2009: Adobe ColdFusion 9

Mostrar la respuesta de la consulta:

13 de julio, 2010: Adobe ColdFusion 9.0.1

<cfoutput query="nombredelaconsulta"> #nombredelaconsulta.campo# <!---Las variables se escriben entre #


#. Este texto es un comentario ---> </cfoutput>

15 de mayo, 2012: Adobe ColdFusion 10


31 de mayo, 2012: Adobe ColdFusion 9.0.2

Dar valores y mostrar variables:

<cfset sCadena = Hola mundo!"> Contenido de la va 31 de agosto, 2012: Adobe ColdFusion 10 Update riable: <cfoutput>#sCadena#</cfoutput>
1
Usar servicios web:
11 de septiembre, 2012: Adobe ColdFusion 10 Up<cnvoke webservice="http://web.service/service?wsdl"
date 2
method="pruebareturnVariable="resultado">
16 de octubre, 2012: Adobe ColdFusion 10 Update
3
2 de noviembre, 2012: Adobe ColdFusion 10 Update 4
19 de noviembre, 2012: Adobe ColdFusion 10 Update 5
11 de diciembre, 2012: Adobe ColdFusion 10 Update 6
15 de enero, 2013: Adobe ColdFusion 10 Update 7
27 de febrero, 2013: Adobe ColdFusion 10 Update
8
10 de abril, 2013: Adobe ColdFusion 10 Update 9
14 de mayo, 2013: Adobe ColdFusion 10 Update
10
9 de julio, 2013: Adobe ColdFusion 10 Update 11
12 de noviembre, 2013: Adobe ColdFusion 10 Update 12
10 de enero, 2014: Adobe ColdFusion 10 Update
13
14 de octubre, 2014: Adobe ColdFusion 10 Update
14
9 de diciembre, 2014: Adobe ColdFusion 10 Update 15
29 de abril, 2014: Adobe ColdFusion 11
22 de septiembre: Adobe ColdFusion 11 Update 1
14 de octubre, 2014: Adobe ColdFusion 11 Update
2
9 de diciembre, 2014: Adobe ColdFusion 11 Update 3

33.4 Enlaces externos

Web ocial de ColdFusion en Adobe


Adobe ColdFusion community
Introduccin a Adobe ColdFusion

Captulo 34

Coloreado de sintaxis
34.1 Ejemplo
Abajo se muestra un trozo de cdigo en C++:
// Bucle for normal for (int i=0; i<maximo; i++) {
*(Una_estructura).un_campo = i+5; }
A veces, estos editores pueden resaltar las llaves, parntesis y corchetes de forma que al posicionar el cursor sobre uno de ellos, se destacan los dos elementos, tanto el
de apertura, como el de cierre incluso con etiquetas
HTML. Esto es de gran ayuda al escribir programas con
gran nmero de anidamientos hechos con estos elementos.
Un ejemplo de cdigo HTML con coloreado de sintaxis

El resaltado de sintaxis, a veces llamado coloreado de


sintaxis, es una capacidad de algunas aplicaciones para
tratamiento de textos (como los editores de texto), para
diferenciar elementos de texto (especialmente el llamado
cdigo fuente) mediante diversos colores o estilos tipogrcos, dependiendo de las categoras sintcticas de sus
trminos, conforme a las reglas de algn lenguaje formal
concreto.

34.2 Programas con coloreado de


sintaxis
Scintilla
Notepad++
Notepad2
SciTE

Este resaltado se utiliza a modo de notacin secundaria, habitualmente para mejorar la legibilidad del cdigo
fuente de programas o de textos escritos en algn lenguaje
de marcado, permitiendo aumentar la productividad de
los programadores. Los estilos aplicados por defecto dependen de cada programa informtico, alguno de los cuales permiten congurar los estilos e incluso reconocer diversos lenguajes.

Geany
Vim
Emacs
gedit
El visor de cdigo fuente de la mayora de los
navegadores web.

Presentacin independiente del signicado


La interpretacin del texto no vara en absoluto al resaltar
sus elementos. Los cambios en la representacin del texto
cumplen una funcin visual identicativa y no semntica,
slo se usan para transmitir informacin al lector humano.
Por tanto, en el caso del cdigo fuente de un programa,
los intrpretes y los compiladores lo ignoran. No forman
parte ni del lenguaje formal en s, ni del texto, por lo que
tampoco se guardan en el chero, sino que se analiza cada
vez que se carga.

34.3 Vase tambin

58

Editor de pginas web


Editor de texto
WYSIWYG
WYSIWYM

Captulo 35

Comentario (informtica)
/**
* Simple HelloButton() method.
* @version 1.0
* @author john doe <doe.j@example.com>
*/
HelloButton()
{
JButton hello = new JButton( "Hello, wor
hello.addActionListener( new HelloBtnList

// use the JFrame type until support for t


// new component is finished
JFrame frame = new JFrame( "Hello Button"
Container pane = frame.getContentPane();
pane.add( hello );
frame.pack();
// display the fra
frame.show();

a un amplio abanico de formas de uso distintas y a la inclusin de informacin intil dentro del cdigo fuente.
Para evitar este inconveniente, muchos programadores y
analistas de software adoptan alguna de las losofas
o metodologas para la correcta utilizacin de los comentarios.

35.1 Informacin general


Los comentarios adoptan por norma general un formato
o bien debloque(tambin denominado deprlogo
) o bien den de lnea(tambin denominadoinline
).* [5]

Un comentario de bloque delimita una zona del cdigo


fuente en la cual es permitido expandirse a varias lneas
Un ejemplo de cdigo fuente de Java, con comentarios de prlogo de texto. Esta regin se reconoce por un delimitador de
en rojo, comentarios entre lneas en verde. Cdigo del prograinicio y un delimitador de nal del comentario. Algunos
ma en azul.
lenguajes de programacin admiten que los comentarios
se aniden recursivamente (e.g., MATLAB), pero otros
En la programacin de computadoras, un comentario lenguajes no lo admiten (e.g., Java).* [6]* [7]* [8]
es una construccin del lenguaje de programacin* [1] Un comentario de n de lnea comienza con un delimitadestinada a incrustar anotaciones legibles al programa- dor y contina hasta el nal de la lnea de texto (es decir,
dor en el cdigo fuente de un Programa informtico.* [2] no es necesario un segundo delimitador). En otros casos,
Estas anotaciones son potencialmente signicativas pa- el comentario de n de lnea comienza en una cierta cora los programadores, pero usualmente ignorados por los lumna dentro del cdigo fuente no siendo necesario un
compiladores e intrpretes.* [3]* [4] Los comentarios son delimitador.* [8]
aadidos usualmente con el propsito de hacer el cdigo
fuente ms fcil de entender con vistas a su mantenimien- Los delimitadores son una secuencia conocida de caracteto o reutilizacin. La sintaxis y reglas para los comenta- res y suelen ser distintos para los comentarios de bloque
rios varan y usualmente son denidas en la especicacin que para los de n de lnea. Por ejemplo, el lenguaje C++
usa, para los comentarios de bloque, los delimitadores /*
del lenguaje de programacin.
y */ mientras que los comentarios de n de lnea utiliza
Se ha de tener en cuenta que los comentarios necesitan el delimitador //. Otros lenguajes solamente admiten un
mantenimiento igual que el cdigo y, por tanto, que un tipo de comentario. Por ejemplo, ADA solamente dispocomentario preciso y conciso es ms fcil de mantener ne de comentarios de n de lnea mediante el delimitador
que uno largo, repetitivo y complicado.
-.* [8]
Los comentarios tienen una amplia gama de posibles
usos: desde la mejora del cdigo fuente con descripciones bsicas hasta la generacin de documentacin exter- 35.2 Usos
na. Tambin se utilizan para la integracin con sistemas
de control de versiones y otros tipos de herramientas de La mejor manera de dar uso a los comentarios es obprogramacin externas.
jeto de controversia con posiciones a menudo enfrentaLa exibilidad proporcionada por los comentarios da pie das.* [9]* [10] Hay una gran variedad de formas de escri59

60

CAPTULO 35. COMENTARIO (INFORMTICA)

bir comentarios y muchos comentaristas que ofrecen, en 35.2.3


ocasiones, consejos contradictorios.* [10]

35.2.1

Planeacin / Revisin

Los comentarios se pueden utilizar como una forma de


pseudocdigo para describir la intencin antes de escribir el cdigo real. En este caso se debe explicar la lgica
detrs del cdigo en lugar del cdigo en s mismo.

Descripcin algortmica

A veces, el cdigo fuente contiene una solucin nueva o


digna de mencionarse a un problema especco. En tales
casos, los comentarios pueden contener una explicacin
de la metodologa. Estas explicaciones pueden incluir diagramas y pruebas matemticas formales. Esto puede ser
la explicacin del cdigo, en lugar de una claricacin
de sus intenciones, pero otros encargados del mantenimiento del cdigo pueden encontrar como fundamental
esta explicacin. Esto puede ser especialmente cierto en
el caso de problemas de dominios de alta especializacin;
as como en optimizaciones, construcciones o llamadas a
funciones de uso no cotidiano.* [13]

/* itera hacia atrs por todos los elementos retornados


por el servidor (estos deben ser procesados cronolgicamente)*/ for (i = (numElementsReturned - 1); i
>= 0; i--){ /* procesa los datos de cada elemento */
Por ejemplo, un programador puede agregar un comentaupdatePattern(i, returnedElements[i]); }
rio para explicar por qu se eligi un Ordenamiento por
insercin en lugar de quicksort, pues el primero es, en
Si se deja este tipo de comentario luego de escribir el c- teora, ms lento que el segundo. Esto podra escribirse
digo, se simplica el proceso de revisin al permitir la de la siguiente manera:
comparacin directa del cdigo con los resultados previstos. Una falacia lgica comn es que el cdigo fcil de list = [f (b), f (b), f (c), f (d), f (a), ...]; // Se requiere un
ordenamiento estable, mientras el desempeo realmente
entender hace lo que tiene que hacer.
no importa. insertion_sort (list);

35.2.2

Descripcin de cdigo

Los comentarios pueden ser utilizados para resumir el cdigo o para explicar la intencin del programador. Se- 35.2.4 Inclusin de recursos
gn esta escuela de pensamiento, re-explicar el cdigo en
lenguaje natural se considera superuo y la necesidad de
volver a explicar el cdigo puede ser un signo de que es Logotipos, diagramas y diagramas de ujo consistentes
en construcciones de arte ASCII pueden ser insertados en
demasiado complejo y debe ser reescrito.
el cdigo fuente en forma de comentario.* [14] Adems,
puede incrustarse como comentarios avisos de derechos
de autor, fecha de creacin, versin del producto, contacNo documentes mal cdigo re-escrbelo.
*
to con el propietario y/o creador, etc..
[11]
El fragmento de cdigo que sigue es un simple diagrama
ASCII que representa el ujo de proceso para un script
Los buenos comentarios no repiten el cdigo,
de administracin de sistemas contenido en un Fichero
ni lo explican. Estos aclaran su intencin. Los
Windows Script que se ejecuta en Windows Script Host
comentarios deben explicar, a un nivel de absA pesar de que la seccin que marca el cdigo aparece cotraccin ms alto que el propio cdigo, lo que
mo un comentario, el diagrama de hecho aparece en una
*
se intenta conseguir [12]
seccin XML CDATA seccin, que tcnicamente se considera distinta de los comentarios, pero que puede servir
*
Los comentarios tambin pueden ser utilizados para ex- para propsitos similares. [15]
plicar por qu un bloque de cdigo no se ajusta a las con- <!-- begin: wsf_resource_nodes --> <resource
<![CDATA[
HostApp
venciones o las buenas prcticas. Esto est especialmente id="ProcessDiagram000">
relacionado con proyectos de escaso tiempo de desarro- (Main_process) | V script.wsf (app_cmd) --> ClientApp
(async_run, batch_process) | | V mru.ini (mru_history)
llo, o en la correccin de errores. Por ejemplo:
' Se asigna una segunda variable debido a que se pro- ]]> </resource>
ducen errores ' en el servidor cuando se reutilizan los
datos del formulario. No se encontr documentacin
' sobre el comportamiento extrao del servidor, as
que simplemente se codic para resolverlo. vtx =
server.mappath(local settings)

An cuando este diagrama fcilmente podra haber sido


incluido como un comentario, el ejemplo ilustra un caso en que el programador puede optar por no utilizar los
comentarios, como una forma de incluir recursos en el
cdigo fuente.* [15]

35.3. ESTILOS

35.2.5

Depuracin

61

35.3 Estilos

Una prctica comn entre programadores es comentar un


fragmento de cdigo, es decir, agregar delimitadores de
modo que un bloque de cdigo se convierta en un comentario, y por tanto no se ejecutar en el programa nal. Esto podra hacerse para excluir algunas piezas del cdigo
del programa o, de manera ms comn, para encontrar la
causa de un error. Comentando sistemticamente y ejecutando partes del programa, la causa del error puede ser
determinada, permitiendo su correccin. A continuacin
un ejemplo de cmo comentar cdigo con el propsito de
excluirlo:

Hay muchas alternativas cuando se considera como los


comentarios deben aparecer en el cdigo fuente. Para
grandes proyectos, los estilos de los comentarios se agregan apenas comienzan el proyecto. Normalmente los programadores preeren estilos que son consistentes, no obstructivos, fciles de modicar, y difciles de romper.

El fragmento de cdigo de arriba sugiere que el programador opt por desactivar la opcin de depuracin por
alguna razn. Este estilo especco de comentario es ms
adecuado para la depuracin. Un carcter de barra simple
delante del delimitador de apertura es el que permite habilitar o deshabilitar el comentarios de bloque completo.

Factores tales como la preferencia personal, la exibilidad de las herramientas de programacin, y otras consideraciones tienden a inuir en las variantes de estilo utilizado en el cdigo fuente.

Los siguientes fragmentos de cdigo en C son solo un


ejemplo de como los comentarios pueden variar de estilo,
mientras todos contienen la misma informacin bsica:

/* Este es el cuerpo del comentario. Variante 1 */


if (opt.equals
( e)) opt_enabled = true; /* if (opt.equals /***********************************\ * * *
(d)) opt_debug = true; // */ //* if (opt.equals (v Este es el cuerpo del comentario. * * Variante 2. * * *
\************************************/
)) opt_verbose = true; // */

Muchos EIDs permiten agregar o remover rpidamente


este tipo de comentarios con opciones del men singulares o atajos del teclado. El programador solamente debe
marcar la parte de texto que desea comentar o descomentar y elegir la opcin apropiada. Esto es particularmente
til con fragmentos grandes de cdigo.

35.2.6

Generacin de documentacin

Las herramientas de programacin en ocasiones incorporan documentacin y metadatos en los comentarios.* [16]
Estas pueden incluir las posiciones de insercin para la
inclusin automtica de archivos de cabecera, comandos
para congurar el modo de resaltado de sintaxis* [17] o el
nmero de revisin del archivo.* [18] Estos comentarios
de control funcional son tambin conocidos comnmente como anotaciones. Mantener la documentacin dentro
de comentarios en el cdigo fuente es considerado como una forma de simplicar el proceso de documentacin, as como un aumento en las posibilidades de que la
documentacin se mantendr al da con los cambios en
el cdigo.* [19] Habitualmente este tipos de comentarios
requiere utilizar una sintaxis bsica para que puedan ser
interpretados por el generador de documentacin a diferencia de los comentarios anteriores donde no necesariamente se debe de utilizar una sintaxis predenida.

35.3.1 Etiquetas
Algunas etiquetas se utilizan en los comentarios para ayudar en la indexacin de los problemas comunes. Tales
etiquetas son comnmente resaltado de sintaxis y permite bsquedas con herramientas de programacin comn,
como la utilidad grep de UNIX. Ejemplos de convenios
etiqueta son:
FIXME: para marcar cdigo problemtico potencial
que requiere una atencin especial y/o revisin.
NOTE: peligros potenciales para documentar el funcionamiento interno del cdigo y de indicar.
TODO: para indicar las mejoras planicadas.
XXX: para advertir a otros programadores de cdigo
problemtico o equivoco.
Existe el riesgo de que las etiquetas se acumulan con el
tiempo, es conveniente incluir la fecha y el propietario
de etiqueta en el comentario de etiquetas para facilitar el
seguimiento.

35.4 Curiosidades

Ddoc para el [[lenguaje de programacinet D]] y doxygen,


para ser usado con C/C++, Java IDL y PHPDoc para Whitespace es un lenguaje de programacin esotrico en
PHP.
el cual la sintaxis consiste nicamente en espacios en
C#, F# e implementan una caracterstica similar llamada blanco, tabulador y lneas nuevas, cualquier otro carcter
comentarios XML, que son ledos por IntelliSense para es ignorado, por lo que en este lenguaje cualquier escrito
los ensamblados compilados del entorno.NET.* [20]
es un comentario.

62

CAPTULO 35. COMENTARIO (INFORMTICA)

35.5 Ejemplos

35.5.10 cdigo HTML

35.5.1

En las pginas webs .html se introduce el comentario entre

Ensamblador

;comentario

35.5.2

Java

<!-- --> <!-- esto es un comentario en cdigo HTML //


-->

35.5.11 SQL

//comentario de lnea /*comentario de bloque*/ /** co//esto es un comentario --este tambin /* y este en bloque
mentario que ser usado por javadoc */
*/

35.5.3

C/C++

35.5.12 Visual Basic

//comentario en lnea /* comentario en bloque*/ #if 0 Comentario 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 lnea
{ comentario en bloque }

35.5.14 PHP

(* comentario en bloque *)

//comentario en lnea #este tambin /* comentario en bloEn 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 lnea y que es perfectamente 35.5.15 Cobol
vlido *)
* Comentario

35.5.5

Lua

-- Un comentario de lnea --[[ Un comentario de bloque


]]--

35.5.6

Ruby

#comentario =begin comentario de bloque =end

35.5.7

Python

#comentario

35.5.8

Perl

#comentario

35.5.9

Javascript

En archivo.js pueden darse las siguientes formas:


//comentario en lnea /* comentario en bloque */

35.6 Referencias
[1] Para los propsitos de este artculo, los comentarios de
un lenguaje de programacin son tratados indistintamente de comentarios que aparecen en lenguajes de marcas,
archivos de conguracin u otros contextos similares. Ms
an, los lenguajes de marcas con frecuencia se relacionan de manera cercana con cdigo de lenguajes de programacin, especialmente en el contexto de generacin
de cdigo. Ver por ejemplo Ganguli, Madhushree (2002).
Making Use of Jsp (en ingls). Nueva York: Wiley. ISBN
0471219746., Hewitt, Eben (2003). Java for Coldfusion
Developers (en ingls). Upper Saddle River: Pearson Education. ISBN 0130461806.
[2] Source code can be divided into program code (which consists of machine-translatable instructions); and comments
(which include human-readable notes and other kinds of
annotations in support of the program code).Penny Grubb,
Armstrong Takang (2003). Software Maintenance: Concepts and Practice (en ingls). World Scientic. pp. 7,
120121. ISBN 981238426X.
[3] Algunos entornos de programacin incluyen los comentarios como uno de los elementos de la sintaxis del lenguaje
que son retenidos para procesamiento posterior, en lugar

35.7. ENLACES EXTERNOS

de ser descartados una vez han sido reconocidos por el


procesador de lenguaje.
[4] Los comentarios deben ser indicados de tal manera que
sea posible para el procesador de cdigo fuente reconocerlos como tal. Esto es usualmente simplicado al decir
que los comentarios son ignorados(luego de ser reconocidos y desechados) por el procesador.
[5] Dixit, J.B. (2003). Computer Fundamentals and Programming in C (en ingls). Laxmi Publications. ISBN
8170088828.
[6] Desmond, Higham (2005). MATLAB Guide (en ingls).
SIAM. ISBN 0898715784.
[7] Vermeulen, Al (2000). The Elements of Java Style (en ingls). Cambridge University Press. ISBN 0521777682.
[8] Using the right comment in Java (en ingls). Consultado el 24 de julio. Parmetro desconocido |aoacce3so=
ignorado (ayuda)
[9] W. R., Dietrich (2003). Applied Pattern Recognition: Algorithms and Implementation in C++ (en ingls). Springer.
p. 66. ISBN 3528355581. ofrece puntos de vista sobre el
uso adecuado de comentarios en el cdigo fuente
[10] Keyes, Jessica (2003). Software Engineering Handbook
(en ingls). CRC Press. p. 256. ISBN 0849314798. discute los comentarios y la ciencia de la documentacin
[11] The Elements of Programming Style, Kernighan & Plauger
[12] Code Complete, McConnell
[13] Spinellis, Diomidis (2003). Code reading: The Open
Source Perspective (en ingls). Addison-Wesley. ISBN
0201799405.
[14] CodePlotter 1.6 - Add and edit diagrams in your code
with this 'Visio-like' tool. Consultado el 24 de julio de
2007.
[15] Niederst, Jennifer (2006). Web Design in a Nutshell:
A Desktop Quick Reference (en ingls). O'Reilly. ISBN
0596009879.En ocasiones la diferencia entre uncomentarioy otros elementos de la sintaxis de un lenguaje de
programacin o de marcas implica matices sutiles. Niederst indica una situacin tal al decir: Unfortunately,
XML software thinks of comments as unimportant information and may simply remove the comments from a document before processing it. To avoid this problem, use
an XML CDATA section instead.
[16] Vease e.g., Wynne-Powell, Rod (2008). Mac Os X for
Photographers: Optimized Image Workow for the Mac
User (en ingls). Oxford: Focal Press. p. 243. ISBN
0240520270.
[17] Lamb, Linda (1998). Learning the VI Editor (en ingls).
Sebastopol: O'Reilly & Associates. ISBN 1565924266.
describe el uso de sintaxis modeline en los archivos de
conguracin de Vim
[18] Ver e.g., Berlin, Daniel (2006). Practical Subversion, Second Edition (en ingls). Berkeley: APress. p. 168. ISBN
1590597532.

63

[19] Ambler, Scott (2004). The Object Primer: Agile ModelDriven Development with UML 2.0 (en ingls). Cambridge
University Press. ISBN 1397805218.
[20] Murach. C# 2005. p. 56.

35.7 Enlaces externos


13 consejos para comentar tu cdigo
Como escribir comentarios (en ingls)

Captulo 36

Compatibilidad (informtica)
La compatibilidad es la condicin que hace que un
programa y un sistema, arquitectura o aplicacin logren
comprenderse correctamente tanto directamente o indirectamente (mediante un algoritmo). A este algoritmo que hace que un programa logre ser comprendido
por un sistema, arquitectura o aplicacin se lo denomina emulador por el hecho de que es un intrprete entre el
programa y el sistema, arquitectura o aplicacin.

Un ejemplo:
Ejecucin de orden del programa:
programa_orden_decir=(huta)
Ejecucin del emulador:
emul transformar
ma_realizar_*

programa_orden_*

en

siste-

Ejecucin de orden del programa emulada en memoria:


sistema_realizar_decir=(Hola)

36.1 Problemas de compatibilidad

Resultado en el sistema:

Un problema de compatibilidad (incompatibilidad) surge sistema> Hola


a partir de la falta o mala interpretacin de un programa
por un algoritmo, esto conlleva a una mala ejecucin de
dicho programa o a la imposibilidad de ser ejecutado.
36.3 OpenSource
Un ejemplo prctico:
Hoy en da los programas OpenSource (cdigo abierto),
generalmente en los sistemas basados en unix lograron
programa_orden_decir=(Hola) sistema> Hola
solucionar bastante el tema de la compatibilidad, por el
El programa le indica una orden al sistema y el sistema la hecho de que el sistema que compilar el programa, podr
antes adaptar el cdigo a su kernel modicando opciones
interpreta y la ejecuta sin problemas.
de compilacin, generalmente ingresando en la consola el
Incompatibilidad Caso A (Mala ejecucin):
siguiente comando:
programa_orden_decir=(Hola) sistema> Chau
./congure
Compatibilidad:

El programa le indica una orden al sistema y el sistema la Luego compila el cdigo con el siguiente comando:
interpreta pero de forma errnea, devolviendo un resulmake
tado no esperado.
Y por ltimo instala los ejecutables compilados con:
Incompatibilidad Caso B (Imposibilidad de ejecucin):
make-install

programa_orden_da31s4s232sd2453ce sistema> Error

El programa le indica una orden al sistema que para l es Logrando as obtener un programa genrico completamente adaptado al sistema operativo que lo ha compilado.
arbitraria y por ende no logra interpretarla.

36.4 Vase tambin

36.2 Emulacin
La emulacin consiste en utilizar un algoritmo de por medio, denominado emulador que simula ser el sistema, arquitectura o aplicacin para el cual el programa est preparado, el emulador modica los comandos del programa
en memoria para que el sistema pueda interpretarlo como
si estuviera especialmente diseado para l.

64

Compatibilismo e incompatibilismo
Emulador
Software
Wine

36.5. ENLACES EXTERNOS


Compatibilidad hacia atrs

36.5 Enlaces externos


Emulacin de windows para unix
Emuladores
Ms emuladores

65

Captulo 37

Competicin Internacional Universitaria


ACM de Programacin
La Competicin Internacional Universitaria ACM de
Programacin (en ingls ACM International Collegiate Programming Contest, abreviado ACM-ICPC o
simplemente ICPC) es una competicin anual de programacin y algortmica entre universidades de todo el
mundo patrocinada por IBM. En la competicin prima el
trabajo en equipo, el anlisis de problemas y el desarrollo
rpido de software. ICPC es un evento organizado por la
Association for Computing Machinery (ACM).

37.1 Historia
La ACM ICPC es una competicin que hubo en la Universidad A&M de Texas en 1970. Pas a ser una competicin con varias rondas clasicatorias en 1977 y la nal
mundial se organiz en colaboracin con la ACM Computer Science Conference.
De 1977 a 1989, compitieron principalmente equipos de
Estados Unidos y Canad. La sede central est ubicada en
la Universidad de Baylor desde 1989 y las competiciones
regionales se ubican en universidades de todo el mundo,
bajo el auspicio de la ACM y la colaboracin de grandes
empresas de la industria informtica. La ACM ICPC ha
ido aumentando en nmero de participantes y pases por
lo que ahora es una competicin mundial con equipos de
84 pases (en 2005).

universidad antes del concurso. Los estudiantes que hayan competido en dos nales mundiales (World Finals) o
cinco competiciones regionales no pueden participar otra
vez.
Durante la competicin, los equipos tienen 5 horas para resolver entre 8 y 10 problemas (lo normal es 8 para
las competiciones regionales y 10 para la nal). Se deben
programar las soluciones con C, C++ o Java. Los programas enviados por los equipos se compilan y ejecutan con
unos ciertos datos de entrada, si el programa falla al calcular la solucin, el equipo es noticado del error y pueden enviar nuevamente el programa o probar con otros
problemas.
El ganador es el equipo que resuelve ms problemas. Si
hay equipos empatadas con el mismo nmero de problemas resueltos, el orden de clasicacin se calcula a partir
de los que han tardado menos en resolver los problemas.
Ejemplo: si un equipo A ha enviado sus soluciones para 2
problemas los 60 y 120 minutos desde el inicio del concurso, y otro equipo B lo ha hecho a los 80 y 90 minutos.
El desempate entre ambos equipos se hara mirando los
tiempos, para el equipo A: 60+120 = 180 minutos. Para
el equipo B: 80+90 = 170 minutos. El equipo B ganara.

El tiempo que se toma para los desempates es el tiempo


que ha pasado desde el inicio del concurso ms 20 minutos por cada solucin incorrecta enviada. En el ejemplo
anterior, si el equipo A hubiera enviado 2 soluciones inDesde 1997 el principal patrocinador es IBM y la parti- correctas para su primer problema, su tiempo nal sera:
cipacin en la competicin ha aumentado enormemente. 20+20+60+120 = 220.
En 1997 participaron 840 equipos de 560 universidades. El ICPC se diferencia de otras competiciones de prograEn 2005, 5606 equipos de 1737 universidades. El nme- macin (por ejemplo la IOI) en que suele tener un gran
ro de equipos aumenta en un 10 y un 20% cada ao.
nmero de problemas (8 o ms para resolver en 5 horas) y que es una competicin por equipos con un slo
ordenador. Es necesario un buen entendimiento entre los
miembros de un equipo para conseguir la victoria.

37.2 Reglas de la competicin


El ICPC es una competicin por equipos. Las reglas actuales estipulan que cada equipo ha de tener como mximo 3 miembros. Los miembros han de ser estudiantes
universitarios, que hayan estudiado menos de 5 aos en la

66

37.5. GANADORES

37.3 Competiciones locales, regionales y nal mundial

67
- Manila
- Seul
- Teern

La competicin tiene distintas fases clasicatorias. Algunas universidades tienen competiciones locales para elegir a los componentes de los equipos. Cada universidad
puede mandar un mximo de 2 equipos de 3 personas a
la fase regional, si desean participar con un tercer equipo
deben solicitarlo a la organizacin que determinar si les
conceden permiso o no. Las competiciones locales son
opcionales y las organiza cada universidad como estime
conveniente. Algunas universidades optan por seleccionar a los alumnos con notas ms altas o a los que muestran
ms inters.

- Xian

Los equipos de cada universidad participan en la fase regional, con otros equipos de universidades prximas geogrcamente. Hay ms de 30 regiones en todo el mundo.
Algunas regiones agrupan distintos pases (por ejemplo la
SWERC incluye a Espaa, Portugal, Francia y otros pases Europeos), otras son un slo pas (la regin de Brasil)
y otras son slo parte un pas (Estados Unidos est dividido en varias regiones). Los mejor clasicados en cada
competicin regional participarn en la nal mundial. Cada regin enva a la nal un cierto nmero de equipos, no
puedo haber ms de un equipo de una misma universidad.

- Caribe

- Shanghai
- Yokohama
- Hanoi
Regiones de Oceana:
- Pacco sur (SPacic)
Regiones de Amrica Latina:
- Mxico y Centroamrica (CAmerica)
- Brasil
- Suramrica Norte
- Suramrica Sur
Regiones de Norteamrica:
- Pacic Northwest (PacNW)
- North Central (NCNA)
- East Central (ECNA)

La nal mundial se celebra cada ao en un lugar distinto, - Northeastern (NENA)


normalmente hoteles de lujo, y congrega a los equipos
- Rocky Mountain (RM)
ganadores de todas las competiciones regionales.
- Mid-Central (MCUSA)
- Greater New York (GNY)

37.4 Lista de competiciones regionales

- Southern California (Scal)


- South Central (SCUSA)
- Southeast USA (SEUSA)

Regiones de Europa y Rusia:


- Suroeste (SWERC): esta regin comprende Espaa,
Portugal, Francia, Italia, Suiza y el oeste de Austria.* [1]
- Noroeste (NWERC)
- Central (CERC)
- Sureste (SEERC)
- Noreste (NEERC)
Regiones de frica:
- frica y Arabia (AARPC)
- Sudfrica (SAfrica)
Regiones de Asia:
- Beijing

- Mid-Atlantic (MAUSA)

37.5 Ganadores
2015 - Instituto de ptica y Mecnica Fina de San
Petersburgo, Rusia
2014 - Universidad Estatal de San Petersburgo,
Rusia
2013 - Instituto de ptica y Mecnica Fina de San
Petersburgo, Rusia
2012 - Instituto de ptica y Mecnica Fina de San
Petersburgo, Rusia

- Coimbatore (Coim)

2011 - Universidad de Zhejiang, China

- Kanpur (Kolkata)

2010 - Universidad de Shanghai Jiaotong, China

- Dhaka

2009 - Instituto de ptica y Mecnica Fina de San


Petersburgo, Rusia

- Kaohsiun

68

CAPTULO 37. COMPETICIN INTERNACIONAL UNIVERSITARIA ACM DE PROGRAMACIN

2008 - Instituto de ptica y Mecnica Fina de San


Petersburgo, Rusia

1979 - Universidad Washington en San Luis,


Estados Unidos

2007 - Universidad de Varsovia, Polonia

1978 - Instituto Tecnolgico de Massachusetts,


Estados Unidos

2006 - Universidad Estatal de Saratov, Rusia


2005 - Universidad de Shanghai Jiaotong, China
2004 - Instituto de ptica y Mecnica Fina de San
Petersburgo, Rusia
2003 - Universidad de Varsovia, Polonia
2002 - Universidad de Shanghai Jiaotong, China
2001 - Universidad Estatal de San Petersburgo,
Rusia
2000 - Universidad Estatal de San Petersburgo,
Rusia
1999 - Universidad de Waterloo, Canad
1998 - Universidad Carlos, Repblica checa

1977 - Universidad Estatal de Mchigan, Estados


Unidos

37.6 Vase tambin


Olimpiada Internacional de Informtica

37.7 Enlaces
Sitio ocial

37.7.1 Jueces en Lnea

1997 - Harvey Mudd College, Estados Unidos

ACM-ICPC Live Archive Around the World

1996 - Universidad de California, Berkeley, Estados


Unidos

Universidad de Valladolid Online Judge

1995 - Universidad Albert-Ludwigs, Friburgo,


Alemania

Ural State University Online Judge

1994 - Universidad de Waterloo, Canad


1993 - Universidad de Harvard, Estados Unidos
1992 - Universidad de Melbourne, Australia
1991 - Universidad de Stanford, Estados Unidos
1990 - Universidad de Otago, Nueva Zelanda
1989 - Universidad de California, Los ngeles,
Estados Unidos
1988 - Instituto Tecnolgico de California, Estados
Unidos
1987 - Universidad de Stanford, Estados Unidos
1986 - Instituto Tecnolgico de California, Estados
Unidos

Caribbean Online Judge

Tianjin University Online Judge


Saratov State University Online Judge
Sphere Online Judge
A2 Online Judge
Codeforces
MIPT Online Judge
Peking University Online Judge
Jilin University Online Judge
Zhejiang University Online Judge
Harbin Institute of Technology Online Judge
Tianjin University Online Judge

1985 - Universidad de Stanford, Estados Unidos

Fuzhou University Online Judge

1984 - Universidad Johns Hopkins, Estados Unidos

Online Problems Solving System

1983 - Universidad de Nebraska, Estados Unidos

University of Dhaka Online Judge & Contest Training

1982 - universidad Baylor, Estados Unidos


1981 - Universidad de Missouri-Rolla, Estados Unidos
1980 - Universidad Washington en San Luis,
Estados Unidos

Moscow State University Virtual Contest System


[1] http://pc.fdi.ucm.es/swerc/

Captulo 38

Computacin parasitaria
Computacin parasitaria es un paradigma de
programacin por el cual una aplicacin consigue
realizar clculos complejos utilizando interacciones
autorizadas sobre otras aplicaciones. Surge a partir de un
trabajo publicado en Nature en el ao 2000.
En el trabajo original se utilizan dos ordenadores comunicndose a travs de internet y protocolo TCP/IP, en una
sesin de comunicacin estndar. Uno de los ordenadores intenta solucionar un complicado problema, el de la
satisfactibilidad de la lgica booleana, o 3-SAT; Lo hace descomponiendo el problema original en un nmero
considerable de problemas ms pequeos. Cada uno de
estos problemas ms pequeos se codica como una relacin entre un checksum (suma de control) y un paquete
de red, de manera que la comprobacin de si el checksum
es correcto o no es la solucin del problema ms pequeo. El ordenador enva estos paquetes al ordenador que
pretende realice la computacin, el ordenador de destino
comprueba el checksum del paquete recibido, si es correcto solicita mas paquetes, si es incorrecto, solicita la
retransmisin.

38.1 Referencias
1. Parasitic computing, Barabasi et al., Nature, 412:
894-897 (2000).

38.2 Enlaces externos

De esta manera, el ordenador que recibe los paquetes y


comprueba checksums, est realizando computaciones en
benecio del ordenador que las solicita, sin ser consciente
de elllo, y sin hacer nada ms que mantener una sesin
TCP/IP normal.
La prueba de concepto en el trabajo original es extremadamente ineciente, ya que la cantidad de recursos
computacionales necesarios para generar y enviar los paquetes fcilmente exceden los recursos computacionales
solicitados al otro extremo; El problema 3-SAT se podra haber solucionado mucho antes si se analizase nicamente en local. Adems, en la prctica, los paquetes probablemente y ocasionalmente debern ser retransmitidos
realmente cuando ocurran errores de transmisin y/o red
reales.
De todas maneras, la computacin parasitaria a nivel de
checksums simplemente es una prueba de concepto. Los
autores del trabajo original sugieren que a medida que se
mueva la computacin a lo largo de la pila de protocolo,
se puede llegar a un punto en el cual la computacin solicitada al/los ordenadores husped favorezca al parsito.

69

http://www.nd.edu/~{}parasite
http://www.szene.ch/parasit/

Captulo 39

Conectiva lgica
En lgica, una conectiva lgica, o simplemente conectiva, (tambin llamado operador lgico o conectores lgicos) es un smbolo o palabra que se utiliza para conectar dos frmulas bien formadas o sentencias (atmicas o
moleculares), de modo que el valor de verdad de la frmula compuesta depende del valor de verdad de las frmulas
componentes.

ya que da el valor de verdad de (C) est completamente


determinado por el valor de (A) y (B) no tiene sentido para el estado (A) y (B) y negar (C). Sin embargo, entonces
en (D) no es un conector lgico, ya que sera bastante razonable para armar (A) y (B) y negar (D): tal vez Pedro
subi a la montaa para ir a buscar un balde de agua, y
no porque Juan subi la montaa.

Los conectivos lgicos ms comunes son los conectivos


binarios (tambin llamados conectivos didicos) que
39.1.2 Lenguajes formales
unen dos frases, que pueden ser consideradas los operandos de la funcin. Tambin es comn considerar a la neEn los lenguajes formales, las funciones de verdad son
gacin como un conectivo mondico.
representadas por smbolos inequvocos. Estos smbolos
Las conectivas lgicas son, junto con los cuanticadores, se llaman conectivos lgicos, operadores lgicos
las principales constantes lgicas de muchos sistemas l- , operadores proposicionales, o, en la lgica clsica,
gicos, principalmente la lgica proposicional y la lgica la de funciones conectivos de verdad.Vase frmude predicados.
las bien formadas para saber las reglas que permiten las
En programacin se utilizan para combinar valores de nuevas frmulas bien formadas sean construidas al junverdad y obtener nuevos valores que determinen el u- tar otras frmulas bien formadas utilizando conectivos de
funciones de verdad.
jo de control de un algoritmo o programa.

39.1 Lenguajes
39.1.1

Lenguaje natural

Los conectivos lgicos pueden ser utilizados para conectar ms de dos armaciones, entonces es comn hablar
de conector lgico n-ario.

39.2 Lista de conectivos lgicos comunes

La gramtica de los lenguajes naturales, dos frases pueden unirse mediante una conjuncin gramatical para formar una oracin gramaticalmente compuesta. Algunas de
estas conjunciones gramaticales, pero no todas, son fun- 39.2.1 Lista de conectivos lgicos comunes
ciones de verdad. Por ejemplo, considere las siguientes
Conectivos lgicos comnmente usados:
frases:
A: Juan subi la montaa.

Negacin (no): , ~

B: Pedro subi a la montaa.

Conjuncin (y): , y,

C: Juan subi a la montaa y Pedro se subi a


la montaa.

Disyuncin (o)

D: Juan subi la montaa, por lo tanto Pedro


subi la montaa.

Implicacin material (Si.. entonces): , ,


Bicondicional (si y solo si): , , =

Las palabras y y entonces son conjunciones gramaticales


que unen las oraciones (A) y (B) para formar las oracio- Nombres alternativos para bicondicional son sii,
nes compuestas (C) y (D). O y (C) es un conector lgico, xnory bi-implicacin.
70

39.3. REDUNDANCIA

71

Por ejemplo, el signicado de los estados est lloviendo y


estoy en el interior se transforma cuando los dos se combinan con conectivos lgicos:
No est lloviendo
Est lloviendo y estoy dentro de casa (P Q)
Est lloviendo o estoy dentro de casa (P Q)
Si est lloviendo, entonces estoy en casa. (P Q)
Si estoy en casa, entonces est lloviendo. (P Q)
Estoy dentro si y solo si est lloviendo (P Q)
No est lloviendo ( P)

Bicondicional: el smbolo fue utilizado al menos


por Russell en 1908;* [3] se utiliz al menos por
Tarski in 1940;* [9] fue utilizado en Vax; otros
smbolos aparecieron puntualmente en la historia
como en Gentzen,* [10] ~ en Schnnkel* [5] o
en Chazal.* [11]
Verdadero: el smbolo 1 vino de la interpretacin
de Boole de la lgica como un lgebra elemental de
booleana como la lbegra
dos elementos; otras ano
taciones incluyendo fueron encontrados en Peano.
Falso: el smbolo 0 tambin proviene de la interpretacin de Boole de la lgica
como un anillo [?];
otras anotaciones inclusive fueron encontradas en
Peano.

Algunos autores utilizan letras para conectivos en algn


Por declaracin P = Q = Est lloviendo Estoy dentro de momento de la historia: u. para conjuncin (del Alemn
casa.
und, signicay) y el. para la disyuncin (del Alemn
oder,
signica o) en los primeros trabajos de HilTambin es comn considerar la frmula siempre verdabert
(1904);
N para la negacin, K para la conjuncin, A
dera y la frmula siempre falsa como conectivos
para la disyuncin, C para bicondicional en ukasiewicz
(1929).* [12]
Verdadero (, 1 o T)
Falso (, 0 o F)

39.2.2

39.3 Redundancia

Historia de las notaciones

Negacin: el smbolo apareci en Heyting en

1929.* [1]* [2] (comparar con en smbolo


de Frege en Begrisschrift); el smbolo ~ apareci
en Russell en 1908;* [3] una notacin alternativa es
aadir una lnea horizontal encima de la frmula,
como en P ; otra notacin alternativa es utilizar una
comilla simple como en P'.

El conectivo lgico de la implicacin recproca es en


realidad el mismo que el condicional material con las premisas cambiadas, luego el smbolo de implicacin es recripoca es redundante. En algunos clculos lgicos (en
particular, en la lgica clsica, ciertas armaciones compuestas esencialmente diferentes son lgicamente equivalentes. Un ejemplo menos trivial es una redundancia de la
equivalencia clsica entre P Q P y Q. Por lo tanto,
un sistema lgico de base clsica no necesita del operador
condicional "" si "" (no) y "" (o) operador condicional que ya se utilizan, o se puede utilizar el "" solo con
un azcar sintctico para una composicin que tiene una
negacin y una disyuncin.

Conjuncin: el smbolo apareci en Heyting en


1929* [1] (comparar el uso de la notacin de Peano
de notacin de interseccin en teora de conjuntos)* [4]); & apareci al menos en Schnnkel en Hay 16 funciones booleanas que asocian los valores ver1924;* [5] vino la interpretacin de Boole de la l- dad de entrada de P y Q con salidas binarias 4 dgitos.
gica como un lgebra elemental.
Estos corresponden a las posibles opciones conectivos lgicos binarios para la lgica clsica. Una implementacin
Disyuncin: el smbolo apareci en Russell en
diferente de la lgica clsica puede elegir diferentes sub1908 (comparar el uso de Peano de la notacin de
conjuntos de funcionalmente completos de conectivos.
unin en teora de conjuntos); tambin se utiliza
el smbolo +, a pesar de la ambigedad surgida de la Un mtodo consiste en elegir un mnimo establecido y lgebra elemental ordinaria al ser el + considerado jado por cualquier otra manera lgicas como en el ejemun o exclusivo lgicamente interpretado como una plo con el condicional material anteriormente. Los sialianza de dos elementos; puntualmente en la histo- guientes son conjuntos mnimos funcionalmente compleria, un + junto con un punto en la esquina inferior tos de conectivos de los operadores en la lgica clsica,
cuyo aridades no excedan 2:
derecha fue usado por Peirce,* [6]
Implicacin: el smbolo se puede ver en Hilbert Un elemento {}, {}.
en 1917;* [7] fue utilizado por Russell en 1908* [3]
(comparar con la notacin de la C invertida de Dos elementos { , }, { , }, {, }, {, }, {,
Peano); se utiliz en Vax.* [8]
}, {, }, {, }, {, }, {, }, {,

72

CAPTULO 39. CONECTIVA LGICA


}, {, }, {, }, { , }, { , }, {
, }, { , }, { , }, { , }.

Tres elementos { , , }, { , , }, { ,
, }, { , , }, { , , }, { , , }.
Vea ms detalles sobre integridad funcional.
Otro enfoque es utilizar en igualdad de derechos, de un
cierto conjunto conveniente y funcionalmente completo,
pero no mnimo. Este enfoque requiere ms axiomas proposicionales y cada equivalencia entre las formas lgicas
debe ser o bien un axioma o comprobada como un teorema.
Pero la lgica intuicionista tiene una situacin ms complicada. De sus cinco conectivos {, , , , } solamente la negacin tiene que ser reducida a otros conectivos (p (p )). Ni la conjuncin, disyuncin
y condicional material tiene una forma equivalente construida de los otros cuatro conectivos lgicos.

Dualidad: Para leer las asignaciones de valores de


verdad para la operacin desde arriba hacia abajo
en su tabla de verdad es lo mismo que tomar el complemento de lectura de la tabla de la misma u otra
conectiva desde abajo hacia arriba. Sin recurrir a tablas de verdad esto se puede formular como g (a1 ,
..., an ) = g(a1 , ..., an ). E.j., .
Preservacin de la verdad: El compuesto todos los
argumentos son tautologas es una tautologa en s.
E.j., , , , , , . (ver validez)
Falsedad de preservacin: El compuesto de todos
los argumentos son contradicciones es una contradiccin en s. Por ejemplo, , , , , , . (ver
validez)
Involutividad (para conectivos unarios): f(f(a)) =
a. Por ejemplo negacin en la lgica clsica.

En la lgica clsica, tanto la conjuncin y la disyuncin


son asociativas, conmutativas y idempotentes, en la mayora de las variedades de lgica multi-valuada y la lgica
Algunos conectivos lgicos tienen propiedades que se intuicionista. Lo mismo es cierto sobre distributiva de la
pueden expresar en teoremas que contienen el conectivo. conjuncin y la disyuncin sobre ms de conjuncin, as
Algunas de estas propiedades que una conectiva lgica como para la ley de absorcin.
puede tener son:
En lgica clsica y algunas variedades de lgica multi-

39.4 Propiedades

valuada, la conjuncin y la disyuncin son duales, y la


Asociatividad: En una expresin que contiene dos negacin es auto-dual, en la lgica intuicionista, esta lo ms del mismo conectivo asociativo en una lnea, tima tambin es auto-dual.
el orden de las operaciones, no importa, siempre y
cuando la secuencia de los operandos no cambia.
Conmutatividad: Los operandos del conectivo 39.5 Ciencias de la computacin
pueden ser intercambiados (uno por el otro), mientras que la preservacin de equivalencia lgica de la
El planteamiento funcional a la verdad a los operadores
expresin original.
lgicos se implementa como puertas lgicas en circuitos
Distributividad: Un conectivo denotado por dis- digitales. Prcticamente todos los circuitos digitales (la
tribuye sobre otra que conecta denotado por el signo principal excepcin es DRAM) se construye a partir de
+, si a (b + c) = (a b) + (a c) para todos los NAND, NOR, NOT y puertas de transmisin; ver ms
detalles en funcin de verdad en informtica. Los operaoperandos a, b, c.
dores lgicos ms de vectores de bits (correspondientes a
Idempotencia: Cuando los operandos de una opera- nita lgebra de boole) son operaciones bit a bit.
cin son iguales, el compuesto es lgicamente equi- Pero no todo uso de un conector lgico en programacin
valente al operando.
informtica tiene una semntica de Boole. Por ejemplo,
a veces se implementa evaluacin perezosa para P Q
Absorcin: Un par de conectivos , satisface la
y P Q, de modo que estos conectores no son conmuley de absorcin si a (a b) = a para todos los
tativo si algunas de las expresiones P, Q tiene efecto seoperandos a, b.
cundario. Tambin, un condicional, que en cierto sentido
Monotonicidad: Si f(a1 ,..., an ) f(b1 ,..., bn ) para corresponde al conectivo condicional material, es esentodo a1 ,..., an , b1 ,..., bn {0,1} tal que a1 b1 , a2 cialmente no-booleano porque para si (P) entonces Q; la
consiguiente Q no se ejecuta si el antecedente P es falso
b2 ,..., an bn . Ej., , , , .
(aunque un compuesto como un todo es exitosa verda Anidad: Cada variable siempre hace una diferen- deraen tal caso). Esto se acerca ms a las pticas intuicia en el valor de verdad de la operacin o nunca cionistas y constructivistas sobre el condicional material,
ms que a las de la lgica clsica.
hace una diferencia. Ej., , , , , .

39.9. ENLACES EXTERNOS

39.6 Conectivas por el nmero de


argumentos

73

[9] Tarski (1940) Introduction to logic and to the methodology


of deductive sciences.
[10] Gentzen (1934) Untersuchungen ber das logische
Schlieen.

Si vemos las distintas conectivas por su nmero de argumentos podemos distinguir:


[11] Chazal (1996): lments de logique formelle.
[12] Vase Roegel

39.6.1

Sin argumentos

Las conectivas lgicas sin argumentos son:

39.6.2

Con un argumento

Las conectivas con solo un argumento son:

39.6.3

Con dos argumentos

Las conectivas que necesitan dos argumentos son:

39.9 Enlaces externos


Hazewinkel, Michiel, ed. (2001), Propositional
connective (en ingls), Encyclopaedia of Mathematics, Springer, ISBN 978-1556080104
Lloyd Humberstone (2011). The Connectives. MIT
Press. ISBN 978-0-262-01654-4.
Bocheski, Jzef Maria (1959). A Prcis of Mathematical Logic. traducido al ingls de las ediciones
francesa y alemana por Otto Bird. Dordrecht, South
Holland.
Enderton, Herbert (2001). A Mathematical Introduction to Logic (2da edicin). Boston, MA: Academic Press. ISBN 978-0-12-238452-3.
Gamut, L.T.F (1991). Chapter 2. En University
of Chicago Press. Logic, Language and Meaning 1.
pp. 5464. OCLC 21372380.

39.7 Vase tambin


39.8 Referencias
[1] Heyting (1929) Die formalen Regeln der intuitionistischen
Logik.
[2] Denis Roegel (2002), Petit panorama des notations logiques du 20e sicle (vase chart en pgina 2).
[3] Russell (1908) Mathematical logic as based on the theory
of types (American Journal of Mathematics 30, p222
262, tambin en From Frege to Gdel edited by van Heijenoort).
[4] Peano (1889) Arithmetices principia, nova methodo exposita.
[5] Schnnkel (1924) ber die Bausteine der mathematischen Logik, translated as On the building blocks of mathematical logic in From Frege to Gdel edited by van Heijenoort.
[6] Peirce (1867) On an improvement in Boole's calculus of
logic.
[7] Hilbert (1917/1918) Prinzipien der Mathematik (Bernays'
course notes).
[8] Vax (1982) Lexique logique, Presses Universitaires de
France.

Humberstone, Lloyd (2010), Sentence Connectives in Formal Logic, Stanford Encyclopedia


of Philosophy, http://plato.stanford.edu/entries/
connectives-logic/
MacFarlane, John (2005), Logical constants,
Stanford Encyclopedia of Philosophy, http://plato.
stanford.edu/entries/logical-constants/
Esta obra deriva de la traduccin total de Logical
connective de Wikipedia en ingls, concretamente de esta versin, publicada por sus editores bajo la Licencia de documentacin libre de
GNU y la Licencia Creative Commons AtribucinCompartirIgual 3.0 Unported.

Captulo 40

Conguracin regional
En informtica, la conguracin regional* [1] conocida como locale en inglses un conjunto de parmetros
que dene el idioma, pas y cualquier otra preferencia especial que el usuario desee ver en su interfaz de usuario.
Generalmente, un identicador de conguracin regional
consiste como mnimo de un identicador de idioma y un
identicador de regin. Este concepto es de fundamental
importancia en el campo de la localizacin de idiomas.

40.1 Vase tambin


Internacionalizacin y localizacin

40.2 Referencias
[1] Microsoft Corporation. Traduccin del trmino en el
Portal de idiomas de Microsoft. Consultado el 1 de noviembre de 2014.

40.3 Enlaces externos


Esta obra deriva de la traduccin de Locale de
Wikipedia en ingls, publicada por sus editores bajo la Licencia de documentacin libre de
GNU y la Licencia Creative Commons AtribucinCompartirIgual 3.0 Unported.
Unicode Common Locale Data Repository
Language Subtag Registry

74

Captulo 41

Conteo de referencias
Conteo de referencias, en ingls Reference counting, es
una tcnica para contabilizar las veces que un determinado recurso est siendo referido. Por lo general ese recurso
son bloques de memoria y la tcnica permite establecer
cuando no existe ninguna referencia a ese bloque y ste
puede ser liberado. Es una tcnica de muy fcil implementacin, pero tiene una importante desventaja: Si las
referencias forman un ciclo los objetos involucrados no
se liberarn nunca. Otra tcnica ms efectiva es el uso de
un recolector de basura.

41.1 Vase tambin


Recolector de basura
Fuga de memoria

75

Captulo 42

Convencin de Nombres (Programacin)


para mejorar la apariencia esttica y profesional de
producto de trabajo (por ejemplo, al no permitir
nombres excesivamente largos nombres lindo,
cmico o, o las abreviaturas);

En Programacin, una convencin de nombres es un


conjunto de reglas para la eleccin de la secuencia de caracteres que se utilizar para un identicador s que denotan variables, tipos, funciones y otras entidades en el
cdigo fuente y la documentacin.

para ayudar a evitar conictos de nombresque


podran ocurrir cuando se combina el producto del
trabajo de diferentes organizaciones (vase tambin:
espacios de nombres);

Razones para utilizar una convencin de nombres (en lugar de permitir a los programadores elegir cualquier secuencia de caracteres) incluyen los siguientes:

para proporcionar datos signicativos que se utilizarn en los traspasos de proyectos que requieren la
presentacin de cdigo fuente del programa y toda
la documentacin pertinente

para reducir el esfuerzo necesario para leer y entender el cdigo fuente;* [1]
para mejorar la apariencia del cdigo fuente (por
ejemplo, al no permitir nombres excesivamente largos o abreviaturas poco claras).

para proporcionar una mejor comprensin en el caso de la reutilizacin de cdigo despus de un largo
intervalo de tiempo.

La eleccin de las convenciones de nombres puede ser


un problema de enorme polmica, con los partidarios
considerar su tendencia mejor y las dems inferiores.
Coloquialmente, este se dice que es una cuestin de 42.2 Desafos
dogma.* [2] Muchas empresas tambin han establecido su
propio conjunto de convenciones para satisfacer mejor La eleccin de las convenciones de nombres (y la medida
sus intereses.
en que se hacen cumplir) es a menudo un tema polmico,
con partidarios considerando su punto de vista para ser el
mejor y los dems como inferiores. Adems, incluso con
las convenciones de nombres conocidos y bien denidos
42.1 Benecios potenciales
en el lugar, algunas organizaciones pueden no adherirse
constantemente a ellos, haciendo que la incoherencia y
Algunos de los benecios potenciales que se pueden obteconfusin. Estos retos pueden ser exacerbadas si las reglas
ner mediante la adopcin de una convencin de nombres
de la convencin de nomenclatura no tienen coherencia
incluyen los siguientes:
interna, arbitraria, difciles de recordar, o percibida de
otra manera como ms gravosas de lo benecioso.
para proporcionar informacin adicional (es decir,
los metadatos) sobre el uso que se hace de un identicador;

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 mayora de
los usuarios de negocios, identicadores bien escogidos
para permitir el uso de refactorizacin automatizado hacen que sea mucho ms fcil para las siguientes generao buscar y reemplazar herramientas con un potencial ciones de analistas y desarrolladores para entender lo que
mnimo para el error;
hace el sistema y cmo solucionarlo o ampliar el cdigo
para mejorar la claridad en los casos de ambigedad fuente para las nuevas necesidades del negocio.
potencial;

Por ejemplo, aunque la siguiente:


76

42.4. ELEMENTOS COMUNES


a = b * c;
es sintcticamente correcta, su propsito no es evidente.
Contraste esto con:
WEEKLY_PAY = hours_worked * pay_rate;
lo que implica la intencin y el signicado del cdigo
fuente, por lo menos para aquellos que estn familiarizados con el contexto subyacente de la aplicacin.

42.4 Elementos comunes


Las reglas exactas de una convencin de nombres dependen del contexto en que se emplean. Sin embargo, hay
varios elementos comunes que ms inuyen en si no todos los convenios de denominacin de uso comn hoy en
da.

42.4.1

Longitud de identicadores

Un elemento fundamental de todas las convenciones de


nomenclatura son las reglas relacionadas con identicadora longitud (es decir, el nmero nito de caracteres
individuales permitidos en un identicador). Algunas reglas dictan un numrico jo atado, mientras que otros especican heurstica o directrices menos precisos.

77
primeros enlazadores que requeran nombres de variables que se limitan a 6 caracteres para ahorrar
memoria. Un avancems adelante permiti que
los nombres de variables ya que se utilizarn para
la comprensin humana, pero donde slo los primeros caracteres fueron signicativas. En algunas versiones de BASIC como TRS-80 Nivel Bsico 2, los
nombres largos se les permiti, pero slo las dos primeras letras fueron signicativas. Esta caracterstica
permitir el comportamiento errneo de que podra
ser difcil de depurar, por ejemplo, cuando fueron
utilizados y destinados a ser distinto nombres como
VALORy VAI.
editor de cdigo fuente temprana s autocompletar
careciendo
monitores tempranas de baja resolucin con longitud
de lnea limitada (por ejemplo, slo 80 caracteres)
gran parte de la informtica procedentes de las matemticas, donde los nombres de variables son, tradicionalmente, slo una sola letra

42.4.2 Maysculas, minsculas y nmeros

Algunas convenciones de nomenclatura si limitan letras


pueden aparecer en maysculas o minsculas. Otro convenios no restrinjan caso carta, pero conceden una interpretacin bien denido basado en maysculas y minscuReglas de longitud de identicador son impugnadas de
las. Algunas convenciones de nombres especican si alfaforma rutinaria en la prctica, y sujeto a mucho debate
bticos, numricos o alfanumricos caracteres se pueden
acadmico.
usar, y si es as, en qu secuencia.
Algunas consideraciones:
identicadores ms cortos pueden ser preferidos co- 42.4.3 Identicadores de varias palabras
mo ms conveniente, ya que son ms fciles de escribir
Una recomendacin comn es Utilizar identicadores
signicativos.Una sola palabra puede no ser tan signi extremadamente identicadores cortos (por ejemcativa, o especcas, como varias palabras. En conseplo, 'i' o 'j') son muy difciles de distinguir de forma
cuencia, algunas convenciones de nombres especican las
nica mediante la bsqueda automtica y reemplareglas para el tratamiento de identicadores compueszar herramientas
tosque contienen ms de una palabra.
identicadores ms largos pueden ser preferidos Como en la mayora de los lenguajes de programacin no
porque identicadores cortos no pueden codicar la estn permitidos los espacios en blanco en los identiinformacin suciente o parecer demasiado crptico cadores, se necesita un mtodo de delimitacin de cada
identicadores ms largos pueden ser desfavorecido palabra (para que sea ms fcil para los lectores posteriores para interpretar personajes que pertenecen a cada
debido a la confusin visual
palabra).
Es un tema de investigacin abierto si algunos programadores preeren identicadores ms cortos porque son ms
fciles de escribir, o inventan, de los identicadores ms
largos, o porque en muchas situaciones un identicador
ya simplemente estorba el cdigo visible y proporciona
no perciben benecio adicional.

Palabras delimitadores separados

Un enfoque consiste en delimitar palabras separadas con


un carcter no alfanumrico. Los dos caracteres ms usados para este n son el guin ("-") y el guin bajo ("_);
La brevedad en la programacin podra ser en parte atri- por ejemplo, el nombre de dos palabras two wordsse
representara como two-wordso two_words. El
buido a:

78

CAPTULO 42. CONVENCIN DE NOMBRES (PROGRAMACIN)

guin es usado por casi todos los programadores que es- ve en los 8,3 (mximo 8 caracteres con periodo separador
criben COBOL, Forth, y Lisp; tambin es comn que los seguido de 3 caracteres tipo de archivo) estilo MS-DOS.
nombres de selector en Cascading Style Sheets. La mayora de los otros idiomas (por ejemplo, las lenguas en las
familias C y Pascal) se reservan el guin para su uso como el operador injo resta, por lo que no est disponible 42.5.3 Esquema de palabra compuesta (del
lenguaje)
para su uso en los identicadores y por lo tanto se utilizan
en lugar de subrayado. Vase el caso de serpientes.
Uno de los sistemas de convenciones publicadas primeros fue de IBM del lenguajedocumentada en un IMS
Carta de los casos separados palabras
(Information Management System) 1980 Manual * [cita
requerida].
Otro enfoque consiste en indicar los lmites de palabra utilizando capitalizacin medial (tambin llamado Se detalla el esquema de palabra PRIME-MODIFIER"CamelCase" y muchos otros nombres), haciendo as CLASS, que consista en nombres como MEM-ACTtwo wordsya sea comotwoWordsoTwoWords NOpara indicar nmero de cuenta del cliente.
. Esta convencin se utiliza comnmente en Java, C# y PRIME palabras estaban destinadas a indicar las princiVisual Basic. Tratamiento de las siglas en identicadores pales entidadesde inters para un sistema.
(por ejemplo, elXMLyHTTPen XMLHttpRequest
) vara. Algunos dictan que sean en minsculas (por Palabras MODIFIER fueron utilizados para el renaejemplo XmlHttpRequest ) para facilitar la mecanogra- miento adicional, la cualicacin y la legibilidad.
fa y la lectura, mientras que otros los dejan upperca- Palabras CLASS ideal sera una lista muy corta de los
sed (por ejemplo XMLHTTPRequest ) para la exacti- tipos de datos relevantes para una aplicacin particular.
tud. Una opcin menos popular es ampliar siempre las Clase de palabras comunes pueden ser: NO (nmero),
siglas (por ejemplo ExtensibleMarkupLanguageHyper- ID (identicador), TXT (texto), AMT (cantidad), CANT
TextTransferProtocolRequest ).
(cantidad), FL (bandera), CD (cdigo), W (trabajo) y as
sucesivamente. En la prctica, la clase de palabras disponibles sera una lista de menos de dos docenas de trmi42.5 Metadatos y convenciones h- nos.

bridas
Algunas convenciones de nombres representan normas o
requisitos que van ms all de los requisitos de un proyecto especco o dominio del problema, y en lugar de
reejar una mayor conjunto general de principios denidos por la arquitectura de software, lenguaje de programacin subyacente u otro tipo de metodologa entre
proyectos.

42.5.1

Notacin hngara

Palabras CLASS, normalmente situados a la derecha (sujo), sirven el mismo propsito como prejos de notacin
hngara.
El propsito de la clase de palabras, adems de la consistencia, era especicar al programador el tipo de datos de
un campo de datos particular. Antes de la aceptacin de
BOOLEAN (dos valores nicos) Campos, FL (bandera)
indicaran un campo con slo dos valores posibles.

42.6 Convenciones especcas del


lenguaje

Tal vez la ms conocida es la notacin hngara, que codica ya sea el propsito (Aplicaciones de Hungra)
o el tipo (Sistemas de Hungra) de una variable en su 42.6.1 ActionScript
nombre.* [3] Por ejemplo, el prejoszpara el szName
variable indica que la variable es una cadena de cero (es
Las convenciones y las mejores prcticas de codicadecir null-) terminado.
cin de Adobe sugieren estndares de nomenclatura para
ActionScript que en su mayora son consistentes con los
de ECMAScript. * [cita requerida] El estilo de identica42.5.2 Notacin posicional
dores es similar a la de Java.
Un estilo utilizado para muy cortas (8 caracteres y menos)
podra ser: LCCIIL01, donde LC sera la aplicacin (cartas de crdito), C para COBOL, IIL para el subconjunto 42.6.2
proceso en particular, y el 01 un nmero de secuencia.

Ada

Este tipo de convenciones se encuentra todava en uso En Ada, el nico estilo recomendado de identicadores
activo en mainframes que dependen de JCL y tambin se es Mixed_Case_With_Underscores.* [4]

42.6. CONVENCIONES ESPECFICAS DEL LENGUAJE

42.6.3

79

C y C++

lugar de parseDBMXMLFromIPAddress ). Tambin se


puede establecer el lmite en dos o ms letras (por ejemEn C y C++, las palabras clave e identicadores de la bi- plo parseDbmXmlFromIpAddress ).
blioteca estndar son en su mayora en minsculas. En
la biblioteca estndar de C, los nombres abreviados son
los ms comunes (por ejemplo isalnum para una prueba 42.6.5 JavaScript
de la funcin si un carcter es alfanumrico), mientras
que la biblioteca estndar C++ menudo utiliza un guin Las bibliotecas incorporadas de JavaScript utilizan las
como separador de palabra (por ejemplo out_of_range ). mismas convenciones de nomenclatura como Java. Las
Identicadores representan macros son, por convencin, clases utilizan camel case superior (RegExp, TypeError,
escrito usando slo letras maysculas y guiones bajos (es- XMLHttpRequest, DOMObject) y mtodos utilizar loto est relacionado con la convencin en muchos lengua- wer camel case (getElementById, getElementsByTagNajes de programacin de la utilizacin de todo mayscu- meNS, createCDATASection). Con el n de ser consislas identicadores de constantes). Nombres que contie- tentes desarrolladores ms de JavaScript siguen estas con*
nen doble guin o que comienzan con un guin bajo y venciones. [cita requerida] Ver tambin: convenciones
una letra mayscula se reservan para la implementacin de Douglas Crockford
(compilador, biblioteca estndar) y no deben ser usados
(por ejemplo reserved__ o _Reserved ).* [5]* [6] Esto es
supercialmente similar a alar, pero la semntica die- 42.6.6 Lisp
re: los subrayados son parte del valor del identicador, en
lugar de ser carcter delimitador (como se ala): el valor La prctica comn en la mayora de los dialectos de Lisp
de __foo es __foo (que est reservado), no foo (pero en es utilizar guiones para separar las palabras en los identicadores, como en with-open-le y make-hash-table.
un espacio de nombres diferente).
Nombres de variables globales convencionalmente comienzan y terminan con asteriscos: *map-walls*. Nombres Constantes estn marcadas por signos de suma:
42.6.4 Java
+map-size+.* [10]
En Java, las convenciones de nombres para los identicadores se han establecido y propuesto por varias comunidades de Java como Sun Microsystems,* [7] Netscape,* [8] AmbySoft,* [9] etc Una muestra de las convenciones de nomenclatura establecidas por Sun Microsystems se enumeran a continuacin, donde un nombre en
"CamelCase" es un compuesto de un nmero de palabras
unidas sin espacios, con letra inicial de cada palabra en
maysculas - por ejemplo CamelCase.

42.6.7 .NET

Microsoft NET recomienda UpperCamelCase para la


mayora de los identicadores. (LowerCamelCase se recomienda para los parmetros y variables) y es una convencin comn para los lenguajes.NET.* [11] Microsoft
recomienda tambin que no se utilicen pistas de tipo prejo (tambin conocido como notacin hngara).* [12] En
Compiladores Java no hacen cumplir estas reglas, pe- lugar de utilizar la notacin hngara se recomienda terro no seguir las mismas pueden dar lugar a confusin minar el identicador con el nombre de la clase base; Lo*
y cdigo errneo. Por ejemplo, widget.expand() y Wid- ginButton en lugar de BtnLogin. [13]
get.expand() implica signicativamente diferentes comportamientos: widget.expand() implica una invocacin al
mtodo expand() en una instancia con nombre widget, 42.6.8 Objective-C
mientras que Widget.expand() implica una invocacin al
Objective-C tiene un estilo comn de codicacin que
mtodo esttico expand() en la clase Widget.
tiene sus races en Apple ejemplo de cdigo.
Un estilo de programacin Java ampliamente utilizado dicta que UpperCamelCase ser utilizado para Entidades de primer nivel, incluyendo clases, protocolos,
clases y lowerCamelCase utilizarse para instancias y categoras, as como construcciones de C que se utilizan
mtodos.* [7] Reconociendo este uso, algunos IDE como en los programas de Objective-C como variables y funEclipse, implementar atajos basados en CamelCase. Por ciones globales, estn en UpperCamelCase con una breve
ejemplo, en el contenido de Eclipse funcin de asisten- maysculas-espacio de nombres que denota prejo, como
cia, escribiendo nicamente las letras maysculas de una NSString, UIAppDelegate, NSApp o CGRectMake. Las
palabra CamelCase sugerir ningn nombre de la clase constantes pueden ser opcionalmente precedidos por una
a juego o mtodo (por ejemplo, al escribir NPEy letra minscula kcomo kCFBooleanTrue.
activando ayuda de contenido podra sugerir NullPointe- variables de instancia de un uso objeto lowerCamelCase
rException ).
precedidos por un guin, como _delegate y _tableView.
Siglas de tres o ms letras se camelCase en lugar de Nombres de los mtodos utilizan mltiples partes lowermaysculas (por ejemplo, parseDbmXmlFromIPAddress CamelCase separados por dos puntos que delimitan argu-

80

CAPTULO 42. CONVENCIN DE NOMBRES (PROGRAMACIN)

mentos, como: aplicacin: didFinishLaunchingWithOp- [11] Microsoft NET Framework Estilos de Capitalizacin
tions:, stringWithFormat: y IsRunning.

[12] Gua de NET Framework Developer - Convenciones de


nomenclatura general

42.6.9

Perl

[13] [Framework Instrucciones de diseo, Krzysztof Cwalina,


Brad Abrams Pgina 62]

Perl toma algunas seales de su patrimonio C para convenciones. A nivel local ambito de variables y nombres [14] Perl style guide.
de subrutinas son minsculas con guiones bajos injos. [15] perlmodlib - constructing new Perl modules and nding
Subrutinas y variables con la intencin de ser tratado coexisting ones.
mo privado estn prejadas con un guin bajo. Las variables del paquete son ttulo entubado. Constantes de- [16] [Gua de Estilo https://www.python.org/dev/peps/
pep-0008/ de cdigo Python PEP8]
claradas son maysculas. Los nombres de paquetes son
camel case-exceptuando prgmata por ejemplo, strict y
mro -que son minsculas. * [14] * [15]

42.9 Enlaces externos

42.6.10

Python y Ruby

Python y Ruby tanto recomiendan UpperCamelCase para nombres de clases, CAPITALIZED_WITH_UNDERSCORES para las constantes
y lowercase_separated_by_underscores para otros
nombres. En Python, si un nombre est destinado a ser
privado, que est precedido de un guin bajo.* [16]

42.7 Vase tambin


42.8 Referencias
[1] Derek M. Jonesnombres operando la inuencia del operador decisiones de precedenciaUn experimento que investiga el efecto de los nombres de variables de seleccin
de prioridad de operador
[2] Raymond, Eric S. (1 de octubre de 2004), religious
issues, The Jargon File (version 4.4.8 edicin), http://
www.catb.org/jargon/html/R/religious-issues.html, consultado el 7 de noviembre de 2011
[3] http://www.joelonsoftware.com/articles/Wrong.html
[4] http://www.adaic.org/resources/add_content/docs/
95style/html/sec_3/3-2-1.html
[5] ISO/IEC 9899:1999 Programming languages -- C. ISO.
[6] ISO/IEC 14882:2011 Information technology -- Programming languages -- C++. ISO.
[7]Convenciones de cdigo para el lenguaje de programacin Java, Seccin 9:Convenciones de nomenclatura
[8]SOFTWARE DE NETSCAPE Normas de codicacin
GUA PARA JAVA, Collab Software Codicacin Gua
de Normas para Java
[9] AmbySoft Inc. Estndares de Codicacin para v17.01d
Java
[10] http://www.gigamonkeys.com/book/variables.html

Americana Name Society - Promueve la onomstica, el estudio de los nombres y las prcticas de asignacin de nombres, tanto en Estados Unidos como
en el extranjero.
Codicacin-guidelines.com tiene una de 100 pginas pdf que usa la lingstica y la psicologa para
intentar un anlisis de costo / benecio de las cuestiones de nomenclatura de identicadores
Convenciones de nomenclatura de Ontologa La
aplicacin de etiquetado o las convenciones de nomenclatura unicadas en la ingeniera de la ontologa ayudarn a armonizar la apariencia y aumentar
la robustez de las unidades de representacin ontolgica, como nombres de clases y relaciones dentro
del conjunto ortogonal de ontologas OBO Foundry.

Captulo 43

Cracking (software)
El cracking es la modicacin del software con la intencin de eliminar los mtodos de proteccin de los cuales
este disponga: proteccin de copias, versiones de prueba, nmeros de serie, claves de hardware, vericacin de
fechas, vericacin de CD o publicidad y adware.
La distribucin y uso de copias modicadas es ilegal en
casi todos los pases desarrollados. Muchos juicios se han
llevado a cabo debido al cracking de software; sin embargo, la mayora de estos han tenido que ver con la distribucin de copias duplicadas en vez de con el proceso de quebrantar la proteccin, debido a la dicultdad de construir
pruebas vlidas de culpabilidad individual en el segundo caso. En Estados Unidos, la aprobacin de la Digital
Millennium Copyright Act (DMCA) declar a la modicacin de software, as como a la distribucin de informacin que habilita el cracking de software, ilegal. Sin
embargo, la ley ha sido apenas probada en el poder judicial de EE. UU. en casos de ingeniera inversa para nico uso personal. La Unin Europea aprob la Directiva
de la Unin Europea sobre derecho de autor en mayo de
2001, haciendo la infraccin de los derechos de autor de
software ilegal en los estados miembros, una vez que la
legislacin nacional fuera promulgada en favor de la directiva.

43.1 Vase tambin


Crack informtico
Cracker
Password cracking
Razor 1911

81

Captulo 44

Cuaderno de carga
El cuaderno de carga es, dentro de la terminologa
informtica, el modo de comunicacin ms frecuente entre el analista y el programador de un proyecto. En l el
analista detalla las especicaciones que el programador
debe seguir para desarrollar un programa informtico.

82

Captulo 45

Curricacin
En la ciencia de la computacin, curricar es la tcnica inventada por Moses Schnnkel y Gottlob Frege que
consiste en transformar una funcin que utiliza mltiples
argumentos (o ms especcamente una n-tupla como argumento) en una funcin que utiliza un nico argumento.

45.4 Enlaces externos

Wikcionario tiene deniciones y otra informacin sobre curricar.Wikcionario

Currying in Python
Implicit currying in Scheme

45.1 Nomenclatura

Currying in Ruby

El nombre curricar, acuado por Christopher Strachey en 1967, es una referencia al lgico Haskell Curry.
Un nombre alternativo, Schnnkelisation, ha sido propuesto.* [1]

Currying in Smalltalk
Currying in Algol68G
Currying != Generalized Partial Application! - post
at Lambda-the-Ultimate.org
Currying in Scala

45.2 Denicin

Currying in Perl

Dada una funcin f del tipo f : (X Y ) Z , curricndola sera una funcin del tipo curry(f ) : X
(Y Z) . En otras palabras, curry(f ) toma un argumento del tipo X y retorna una funcin del tipo Y Z
. Descurricar es la transformacin inversa.
Intuitivamente, la curricacin expone queSi jas algunos argumentos, tendrs una funcin de los argumentos
restantes. Por ejemplo, si la funcin div signica la versin curricada de la operacin x / y, entonces div con
el parmetro x jado en 1 es otra funcin: igual que la
funcin inv que devuelve la inversa multiplicativa de sus
argumentos, denida por inv(y) = 1 / y.
La motivacin prctica para curricar es que en ocasiones, muy seguidas, las funciones obtenidas al utilizar algunos, pero no todos, los argumentos en una funcin curricada pueden resultar tiles; por ejemplo, muchos lenguajes tienen una funcin o un operador similar
a plus_one. Curricar hace fcil denir dichas funciones.

45.3 Referencias
[1] I. Heim and A. Kratzer (1998). Semantics in Generative
Grammar. Blackwell.

83

Captulo 46

Cdigo enhebrado
En ciencias de la computacin, el trmino cdigo enhebrado se reere a una tcnica de implementacin
del compilador donde el cdigo generado tiene una forma que esencialmente consiste enteramente en llamadas a subrutinas. El cdigo puede ser procesado por un
intrprete, o simplemente puede ser una secuencia de instrucciones de llamadas a cdigo de mquina.
Una de las principales ventajas del cdigo enhebrado es
que es muy compacto, comparado al cdigo generado
por tcnicas alternativas de generacin del cdigo y de
convencin de llamadas. Esta ventaja usualmente viene a
expensas de una velocidad de ejecucin ligeramente ms
lenta (usualmente apenas una sola instruccin de mquina). Sin embargo, a veces hay un efecto sinergtico - a
veces un cdigo ms compacto es ms pequeo y signicativamente ms rpido que el cdigo no enhebrado.* [1] Un programa sucientemente pequeo para caber enteramente en la memoria de acceso aleatorio puede correr ms rpido que un programa menos compacto
en el espacio de intercambio que requiere un constante
acceso mecnico de la unidad de disco, aunque sufra de
la sobrecarga en la interpretacin del cdigo enhebrado.
Similarmente, un programa lo sucientemente pequeo
para caber enteramente en el cach del procesador de la
computadora puede correr ms rpido que un programa
menos compacto que sufra fallas de cach constantes.

plataforma de hardware especca. Un acercamiento diferente usa un conjunto de instrucciones de una mquina
virtual - que no tiene un destino particular de hardware.
Un intrprete lo ejecuta en cada nuevo hardware de destino.
Los computadores tempranos tenan relativamente poca
memoria. Por ejemplo, la mayora de los Data General
Nova, IBM 1130, y muchas computadores Apple II tenan solamente 4 k palabras de memoria RAM instalada.
Consecuentemente se pasaba mucho tiempo intentando
encontrar formas de reducir el tamao de los programas
de tal manera que pudieran caber en la memoria disponible. Al mismo tiempo, los computadores eran relativamente lentos, as que la interpretacin simple era perceptiblemente mucho ms lenta que ejecutar el cdigo de
mquina.
En vez de escribir cada paso de una operacin en cada
parte del programa donde era necesaria, los programadores ahorraban memoria escribiendo cada paso de tales
operaciones una sola vez y ponindolo en una subrutina
(ver "no te repitas").

Este proceso - la refactorizacin de cdigo - es usado hoy,


aunque por diversas razones. En estos programas, la aplicacin del nivel superior puede consistir de nada ms que
llamadas a subrutinas. A su vez, muchas de estas subrutinas, tambin no consisten nada ms que llamadas a suEl cdigo enhebrado es bien conocido como la tcnica brutinas de nivel inferior.
de implementacin comnmente usada en el lenguaje de
programacin Forth. Tambin fue usado en las versiones Los mainframes y algunos microprocesadores tempranos
tempranas del lenguaje de programacin B, as como en tales como el RCA 1802 requeran varias instrucciones
muchas implementaciones de BASIC, y algunas imple- para llamar a una subrutina. En la aplicacin de nivel sumentaciones de COBOL y de otros lenguajes para pe- perior y en muchas subrutinas, esa secuencia es constantemente repetida, slo cambiando la direccin de la suqueos microcomputadores.
brutina desde una llamada a la siguiente. Usando la memoria para almacenar las mismas instrucciones repetidamente era un desperdicio.

46.1 Historia que llev al cdigo


enhebrado

La manera comn de hacer programas de computadora es


usando un compilador paratraducirun programa escrito en una cierto lenguaje simblico al cdigo de mquina.
El cdigo es tpicamente rpido pero no es portable puesto que el cdigo binario ejecutable es diseado para una

La respuesta simple fue una tabla de saltos (es decir una


tabla consistiendo solo en las direcciones contiguas de las
subrutinas - usualmente extradas usando un ndice, un
registro de propsitos generales o un puntero). Las direcciones pueden ser directas o indirectas, contiguas o no
contiguas (encadenadas por punteros), relativas o absolutas, resueltas en de tiempo de compilacin o construidas
dinmicamente - pero el programa se convierte en una

84

46.3. MODELOS DE ENHEBRADO


lista de puntos de entrada al cdigo real a ser ejecutado.
Esta tcnica se ha reinventadocon los nombres de
cdigo enhebrado, tabla de despachoo tabla de
mtodo virtual- todas estas tcnicas llenan propsitos
similares.

46.2 Desarrollo del cdigo enhebrado

85
*tp++
Esto se llama cdigo enhebrado directo (DTC). Aunque
la tcnica sea ms vieja, el primer uso extensamente circulado del trminocdigo enhebradoes probablemente
el artculo cdigo enhebradode Bell de 1973.* [2]
En 1970, Charles H. Moore invent una notacin ms
compacta para su mquina virtual Forth: el cdigo enhebrado indirecto (ITC). Originalmente, Moore invent esto porque era fcil y rpido en los minicomputadores de NOVA, que tenan un bit de indireccin en cada
direccin. Moore dijo (en comentarios publicados en la
edicin de la revista Byte sobre Forth) que l encontr
esto tan conveniente que lo propag en todos los diseos
Forth posteriores.

Para ahorrar espacio, los programadores exprimieron las


listas cdigos de llamadas a subrutinas y las convirtieron
en simples listas con solo las direcciones de las subrutinas,
y usaron un pequeo loop para llamar a cada subrutina
una por una. Por ejemplo:
Algunos compiladores Forth compilan los programas
start: thread: pushA: *sp++ = A tp = &thread &pushA Forth en cdigo enhebrado directo, mientras que otros
jump top top: &pushB pushB: *sp++ = B jump *tp++ hacen cdigo enhebrado indirecto. Los programas actan
&add jump top ... add: *sp++ = *--sp + *--sp jump top igual de cualquier manera.
En este caso, la decodicacin de los bytecodes se realiza
una sola vez, durante la compilacin o la carga de programa, as que no es repetida cada vez que una instruccin
es ejecutada. Esto puede ahorrar mucho tiempo y espacio cuando la sobrecarga por la decodicacin (decode)
y el enviar (dispath) es grande comparado al costo de la
ejecucin.
Observe, sin embargo, que las direcciones en thread para
&pushA, &pushB, etc., tienen dos o ms bytes, comparados a tpicamente un byte, para el intrprete de decodicar (decode) y enviar (dispath) descrito arriba. En general
las instrucciones para un intrprete de decodicar y enviar pueden ser de cualquier tamao. Como ejemplo, un
intrprete de decodicar y enviar para simular un Intel
Pentium decodica las instrucciones con un rango de 1
a 16 bytes. Sin embargo, los sistemas de bytecode eligen
tpicamente cdigos de 1 byte para las operaciones ms
comunes. As, el enhebrado a menudo tiene un costo de
espacio ms alto que los bytecodes. En la mayora de los
usos, la reduccin en costo de decodicar compensa el
aumento en costo de espacio.

46.3 Modelos de enhebrado


Prcticamente todo el cdigo enhebrado ejecutable usa
uno u otro de estos mtodos para invocar subrutinas (cada
mtodo es llamado un modelo de enhebrado).

46.3.1 Enhebrado directo

Las direcciones en el enhebrado son las direcciones del


lenguaje de mquina. Esta forma es simple, pero puede
tener sobrecargas porque el enhebrado consiste solo de
direcciones de mquina, as que todos los otros parmetros deben ser cargados indirectamente desde la memoria. Algunos sistemas Forth producen cdigo enhebrado
Observe tambin que mientras que los bytecodes son no- directo. En muchas mquinas el enhebrado directo es ms
minalmente independientes de la mquina, el formato y rpido que el enhebrado de subrutina (ver la referencia
el valor de los punteros en el enhebrado generalmente abajo).
dependen de la mquina destino que est ejecutando al
intrprete. As, un intrprete puede cargar un programa Como ejemplo, una mquina de pila puede ejecutar la secuenciapush A, push B, add. Eso puede ser traducido
bytecode portable, decodicar los bytecodes para generar
cdigo enhebrado independiente de la plataforma, luego al enhebrado y rutinas siguientes, donde el tp es inicializado apuntando hacia la direccin de &thread.
ejecutar el cdigo enhebrado sin referencia adicional a los
thread: pushA: *sp++ = A pushB: *sp++ = B add: *sp++
bytecodes.
El loop es simple, as que est duplicado en cada hand- = *--sp + *--sp &pushA jump *tp++ jump *tp++ jump
ler, removiendo jump top de la lista de instrucciones de *tp++ &pushB &add ...
mquina necesarias para ejecutar cada instruccin del in- Alternativamente, los operandos pueden estar incluidos
trprete. Como ejemplo:
en el enhebrado. Esto puede remover alguna indireccin
start: thread: pushA: *sp++ = A tp = thread &pushA necesaria arriba, pero hace el enhebrado ms grande:
jump *tp++ jump *tp++ &pushB pushB: *sp++ = B thread: push: *sp++ = *tp++ add: *sp++ = *--sp + *--sp
&add jump *tp++ ... add: *sp++ = *--sp + *--sp jump &push jump *tp++ jump *tp++ &A &push &B &add

86

46.3.2

CAPTULO 46. CDIGO ENHEBRADO

Enhebrado indirecto

El enhebrado indirecto usa punteros que apuntan hacia


localizaciones que a su vez apuntan al cdigo de mquina. El puntero indirecto puede ser seguido por los operandos que son almacenados en elbloqueindirecto en
vez de estar almacenados repetidamente en el enhebrado. As, el cdigo indirecto es a menudo ms compacto
que el cdigo enhebrado directo, pero la indireccin tpicamente tambin lo hace ms lenta, aunque usualmente
todava ms rpida que los intrpretes de bytecode. Donde los operandos del handler incluyen tanto valores como
tipos, los ahorros de espacio sobre el cdigo enhebrado
directo pueden ser signicativos. Los sistemas Forth ms
antiguos producan tpicamente cdigo enhebrado indirecto.

thread: pushA: pushB: add: call pushA *sp++ = A *sp++


= B *sp++ = *--sp + *--sp call pushB ret ret ret call add

46.3.4 Enhebrado de token

El cdigo enhebrado de token usa listas de ndices de 8


12 bits a una tabla de punteros. El cdigo enhebrado
de token es notablemente compacto, sin mucho esfuerzo especial por un programador. Tiene usualmente entre
la mitad y tres cuartas partes el tamao de otros cdigos enhebrados, los cuales a su vez tienen entre la cuarta
y la octava parte del tamao del cdigo compilado. Los
punteros de la tabla pueden ser tanto indirectos como directos. Algunos compiladores Forth producen cdigo enhebrado de token. Algunos programadores consideran al
p-codegenerado por algunos compiladores de Pascal,
Como ejemplo, si la meta es ejecutar elpsuh A, push B,
al igual que los bytecodes usados por .NET, Java, BASIC,
add, lo siguiente puede ser usado. Aqu, el tp es iniciay algunos compiladores C, como enhebrado de token.
lizado apuntando a la direccin &thread, cada fragmento
del cdigo (push, add) es encontrado por doble indirec- Histricamente, un acercamiento comn es el bytecode,
cin por medio del tp; y los operandos para cada frag- que utiliza opcodes de 8 bits y, a menudo, una mquina
mento de cdigo son encontrados en el primer nivel de virtual basada en pila. Un interpretador tpico es conocido
como "decode and dispatch interpreter" y sigue la forma:
indireccin siguiendo la direccin del fragmento.
thread: i_pushA: push: add: &i_pushA &push *sp++ =
*(*tp + 1) *sp++ = *--sp + *--sp &i_pushB &A jump
*(*tp++) jump *(*tp++) &i_add i_pushB: &push &B
i_add: &add

46.3.3

Enhebrado de subrutina

El cdigo enhebrado de subrutina(tambin llamado


cdigo enhebrado de llamada) consiste en una serie
de instrucciones callen lenguaje de mquina (o solo
las direcciones de las funciones call, en oposicin el
enhebrado directo el cual usajump). Los compiladores tempranos para el ALGOL, FORTRAN, COBOL y
algunos sistemas Forth produjeron a menudo cdigo enhebrado de subrutina. El cdigo en muchos de estos sistemas operaba una pila de operandos LIFO (last-in-rsout), que tena una bien desarrollada teora del compilador. La mayora de los procesadores modernos tienen
soporte especial del hardware para las subrutinas con las
instrucciones cally return, as que la sobrecarga de una instruccin de mquina adicional por envo es
disminuida; pero segn mediciones de Antn Ertl, en
contraste con los mitos populares, el enhebrado de subrutina es usualmente ms lento que el enhebrado directo.
[3] Pruebas ms recientes de Ertl demuestran que el enhebrado directo es el modelo de enhebrado ms rpido
en los procesadores Xeon, Opteron, y Athlon, mientras
que el enhebrado indirecto es el modelo de enhebrado
ms rpido en procesadores Pentium M, y el enhebrado
de subrutina es el modelo de enhebrado ms rpido en el
Pentium 4, el Pentium III, y procesadores PPC.
Como un ejemplo de enhebrado de llamada, elpush A,
push B, add":

bytecode: top: pushA: pushB: add: 0 /*pushA*/ i = decode(vpc++) *sp++ = A *sp++ = B *sp++ = *--sp + *--sp
1 /*pushB*/ addr = table[i] jump top jump top jump top
2 /*add*/ jump *addr
Si la mquina virtual usa solamente instrucciones del tamao de un byte, el decode() es simplemente un ferch
desde el bytecode, pero a menudo hay instrucciones comunes de 1 byte ms instrucciones menos comunes de
mltiples bytes (ver CISC), en este caso, decode() es ms
complejo. La decodicacin de opcodes de un solo byte puede ser muy simple y ecientemente manejado por
una tabla de saltos usando el opcode directamente como
un ndice.
Para, en las instrucciones donde las operaciones individuales son simples, por ejemplo pushy add, la
sobrecarga implicada en decidir lo que se debe ejecutar
es ms grande que el costo real de la ejecucin, tales intrpretes son a menudo mucho ms lentos que el cdigo de
mquina. Sin embargo para instrucciones (compuestas
) ms complejas, el porcentaje de sobrecarga es proporcionalmente menos signicativo.

46.3.5 Enhebrado de Human


El cdigo enhebrado de Human consiste en listas de
cdigos Human. Un cdigo de Human es una cadena de bits de longitud variable usada para identicar un
elemento nico. Un intrprete de enhebrado de Human
localiza las subrutinas usando una tabla de ndice o un rbol de punteros que pueden ser navagados por el cdigo
Human. El cdigo enhebrado de Human es una de las
ms compactas representaciones conocidas para un programa de computadora. Bsicamente el ndice y los cdi-

46.6. REFERENCIAS
gos estn organizados midiendo la frecuencia en que cada
subrutina ocurre en el cdigo. A las llamadas frecuentes se le dan los cdigos ms cortos. Las operaciones con
frecuencias aproximadamente iguales se le dan cdigos
con longitudes de bits casi iguales. La mayora de los sistemas enhebrados de Human han sido implementados
como sistemas Forth de enhebrado directo, y son usados
para grandes cantidades de paquetes de cdigo corriendo
lentamente dentro de pequeos y baratos [[microcontrolador}}es. La mayora de las aplicaciones publicadas han
estado en juguetes, calculadoras o relojes.

87
SP o s (puntero de pila de parmetros, usado para
pasar parmetros entre las palabras)
A menudo, las mquinas virtuales enhebradas tales como
las implementaciones de Forth tienen una mquina virtual
simple en su corazn, consistiendo en tres primitivas. sas
son:
nest, tambin llamado docol
unnest, o semi_s (; s)

46.3.6

Enhebrados menos usados

Enhebrado de cadena, donde las operaciones son


identicadas por cadenas, usualmente buscados en
una tabla hash. Esto fue usado por Charles H. Moore en las implementaciones ms tempranas de Forth
y en el lenguaje de computadora experimental interpretado por hardware de la Universidad Illinois.
Tambin se utiliza en Bashforth.

46.4 Bifurcaciones
Los ejemplos de arriba no muestran bifurcaciones. Para
todos los intrpretes, una bifurcacin cambia el puntero
del enhebrado (arriba indicado como tp). Como ejemplo,
una bifurcacin condicional cuando el valor tope de la pila es cero puede ser codicada como sigue. Observe que
el &thread[123] es la localizacin a saltar (jump), no la
direccin de un handler, y as que debe ser saltada (tp++)
independientemente de si la bifurcacin es tomada.
thread: brz: ... tmp = *tp++ &brz if (*sp++ == 0) &thread[123] tp = tmp ... jump *tp++

46.5 Amenidades comunes


En una mquina, la separacin de las pilas de datos y de
retorno elimina mucho del cdigo para el manejo de la
pila, reduciendo substancialmente el tamao del cdigo
enhebrado. El principio de la doble pila fue originado tres
veces independientemente: para los grandes sistemas de
Burroughs, el Forth y el PostScript, y es usado en algunas
mquinas virtuales de Java.
Tres registros estn a menudo presentes en una mquina
virtual enhebrada. Otro existe para pasar datos entre las
subrutinas (palabras). stos son:
IP o i (puntero de instruccin); llamado tp en los
ejemplos de arriba

next
En una mquina virtual de enhebrado indirecto, la que
est dada aqu, las operaciones es:
next: (ip)+ -> w ; jmp (w)+ nest: ip -> -(rp) ; w -> ip ;
next unnest: (rp)+ -> ip ; next
ste es quizs el intrprete ms simple y ms rpido o
mquina virtual.

46.6 Referencias
[1] Speed of various interpreter dispatch techniques V2
[2] James R. Bell, Threaded Code, CACM, 1973, 16, 6,
pp 370372

46.7 Lectura adicional


Anton Ertl's explanatory page What is Threaded
Code? describes dierent threading techniques and
provides further references.
The Development of the C Language by Dennis M.
Ritchie describes B (a precursor of C) as implemented using threaded code.
Thinking Forth Project includes the seminal (but out
of print) book Thinking Forth by Leo Brodie published in 1984.
Starting FORTH online version of the book Starting
FORTH by Leo Brodie published in 1981.
Brad Rodriguez's Moving FORTH: Part 1: Design
Decisions in the Forth Kernel covers threading techniques in depth.

w (puntero de trabajo)

Historia de los CPU de propsito general

rp o r (puntero de pila de retorno)

GCC extensions. Labels as Values

88

46.8 Vase tambin


Compilacin en tiempo de ejecucin
Tabla de saltos
Forth

CAPTULO 46. CDIGO ENHEBRADO

Captulo 47

Cdigo inalcanzable
En programacin, el cdigo inalcanzable es una parte
del cdigo fuente que nunca podr ser ejecutado porque
no existe ningn camino dentro de las estructuras de control en el resto del programa para llegar a este cdigo.* [1]

Cdigo complejo obsoleto que se retuvo intencionalmente, pero se dej inalcanzable para que pueda
ser utilizado ms adelante en el desarrollo si es necesario.

Suele referirse a este tipo de cdigo como cdigo muerto,


aunque entre ellos hay una diferencia (el cdigo muerto
se ejecuta pero no produce cambios en la salida del programa).* [2]

Construcciones de depuracin y vestigios de cdigo


durante el desarrollo que an no se han retirado del
programa.

El cdigo inalcanzable generalmente se considera indeEn los ltimos cinco casos, el cdigo que es inalcanzaseable por las siguiente razones:
ble, a menudo existe como parte de un legado, es decir,
cdigo que una vez fue til, pero ya no se utiliza o no
1. Ocupa memoria innecesaria.
se requiere. Sin embargo, el cdigo inalcanzable tambin
2. Genera almacenamiento innecesario en la cach de puede ser parte de un componente complejo (biblioteca,
instrucciones de la CPU - lo que tambin disminuye mdulo o rutina), donde el cdigo sigue siendo til en
la localidad de datos.
conjuncin con diferentes datos de entrada (nunca gene3. Desde la perspectiva de mantenimiento de soft- rada por la aplicacin actual) o en condiciones que no se
ware, se pierde tiempo y esfuerzo en mantener y cumplen en el entorno de ejecucin actual, haciendo el
documentar una pieza de cdigo que nunca se eje- cdigo correspondiente inalcanzable, pero puede ocurrir
en otros entornos de ejecucin, para que el componente
cuta.
no ha sido desarrollado.
Un ejemplo de tal cdigo condicionalmente inalcanzable
puede ser la implementacin de una funcin printf() en
la biblioteca de tiempo de ejecucin de un compilador, el
La existencia de cdigo inalcanzable puede ser debido a cual contiene el cdigo complejo para procesar todos los
argumentos de cadenas posibles, de los que en realidad
varios factores, tales como:
es slo un pequeo subconjunto utilizados en el progra Errores de programacin en situaciones complejas ma. Sin tener que recompilar la biblioteca de ejecucin,
los compiladores normalmente no sern capaces de elide saltos condicionales.
minar las secciones de cdigo no utilizadas en tiempo de
Consecuencia de las transformaciones internas rea- compilacin.
lizadas por un compilador optimizador.

47.1 Causas

Pruebas de software incompletas que no se pudo detectar cdigo inalcanzable.

47.2 Ejemplo

Cdigo obsoleto que un programador se haya olvidado de borrar.


Considerando el siguiente cdigo en C:
Cdigo no utilizado que un programador haya deci- int foo (int X, int Y) { return X + Y; int Z = X*Y; }
dido no suprimir, ya que estaba entremezclado con
el cdigo funcional.
La denicin de Z = X*Y nunca es alcanzada debido a
Cdigo condicionalmente til que nunca ser alcan- que la funcin retorna el ujo del programa a la parte que
zado, dado que los datos de entrada nunca causar la llamo antes, de esta manera dicha denicin puede ser
que el cdigo va a ser ejecutado.
descartada.
89

90

CAPTULO 47. CDIGO INALCANZABLE

47.3 Anlisis
La deteccin de cdigo inalcanzable es una forma de
anlisis esttico y consiste en realizar un anlisis de control de ujo para encontrar el cdigo que nunca se ejecutar independientemente de los valores de las variables y otras condiciones en tiempo de ejecucin. En algunos lenguajes (como Java* [3]) algunas formas de cdigo inalcanzable no estn permitidas y no es posible compilar el programa con este tipo de cdigo. Se conoce a
la optimizacin que remueve cdigo inalcanzable como
eliminacin de cdigo muerto (que es la misma para el
cdigo muerto y cdigo redundante).
A veces el cdigo puede volverse inalcanzable por alguna optimizacin introducida por el compilador como por
ejemplo: eliminacin de subexpresiones comunes.
En la prctica la sosticacin del anlisis realizado tiene
un impacto signicativo en la cantidad de cdigo inalcanzable que se detecta. Por ejemplo, el plegamiento de
constantes y un simple anlisis de control de ujo muestra que la declaracin a = 2 en el siguiente cdigo no se
puede alcanzar:
int N = 2 + 1; if (N == 4) { a = 2; }
Sin embargo se necesita mas sosticacin para determinar si esta declaracin a = 2 es o no inalcanzable debido
que con un mtodo tradicional habra que calcular la raz
cuadrada en tiempo de compilacin:
double d = sqrt(2); if (d > 5) { a = 2; }

47.3.1

Proling

A veces se pueden utilizar prolers para detectar cdigo


inalcanzable, un proler no prueba nada acerca de si el
cdigo realmente es o no inalcanzable pero es una buena heurstica para buscar cdigo potencialmente inalcanzable. Una vez detectado las partes potenciales se puede
llevar a cabo en las mismas un anlisis ms profundo.

47.4 Vase tambin


Cdigo muerto
Cdigo redundante
Cobertura de cdigo

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 ingls). New York, USA:

ACM Transactions on Programming Languages & Systems (TOPLAS). Bibcode:378-415. |autor= y |apellido=
redundantes (ayuda)
[2] Eliminacin de Cdigo Inalcanzable y Cdigo Muerto.
[3] Java Language Specication.

47.6 Bibliografa
Muchnick S. S. 1997 Advanced Compiler Design
and Implementation. Morgan Kaufmann.
Appel, A. W. 1998 Modern Compiler Implementation in Java. Cambridge University Press.

47.7 Enlaces externos


Cdigo inalcanzable java

Captulo 48

Cdigo muerto
En programacin, se conoce como cdigo muerto a una
parte del cdigo fuente que se ejecuta pero sus resultados
nunca se usan.* [1]* [2] La ejecucin de este tipo de cdigo
consume tiempo de computo en algo que jams se utiliza.
Es frecuente confundirlo con el cdigo inalcanzable aunque conservan una diferencia (este jams se ejecuta, y si
bien los dos son indeseables el cdigo muerto es ms grave que el inalcanzable).
Adems de consumir tiempo de computo el cdigo muerto puede arrojar excepciones o afectar un estado global
del programa. por lo tanto si bien los resultados jams
se utilizan remover este cdigo puede cambiar la salida
del programa y evitar bugs innecesarios. Esta es una razn por la cual el cdigo muerto es menos deseado que el
cdigo inalcanzable.

mente cuando algn mdulo entero quede muerto.* [3]


Algunos IDE (como Visual Studio 2010* [4] y
Eclipse* [5]) poseen la habilidad de detectar cdigo
muerto durante tiempo de compilacin.

48.3 Vase tambin


Cdigo inalcanzable
Cdigo redundante

48.4 Referencias

48.1 Ejemplo

[1] Debray, S. K., Evans, W., Muth, R., and De Sutter, B.


2000. Compiler techniques for code compaction. ACM
Trans. Program. Lang. Syst. 22, 2 (Mar. 2000), 378-415.

int foo (int X, int Y) { int Z = X/Y; return X*Y; }

[2] Appel, A. W. 1998 Modern Compiler Implementation in


Java. Cambridge University Press.
[3] Douglas W. Jones Dead Code Maintenance, Risks 8.19
(Feb. 1, 1989)

En el cdigo anterior la divisin entre X e Y se calcula pero jams se utiliza, adems, en el caso que Y sea 0
el programa arrojara una excepcin con posibilidad de
abortar la ejecucin, por lo tanto la salida del programa
se ve afectada por esta lnea.

[4] Habib Heydarian, Microsoft Corp.


[5] Eclipse Developer Guide

48.5 Bibliografa

48.2 Anlisis
Se puede utilizar una optimizacin de compilador llamada eliminacin de cdigo muerto para eliminar este
cdigo. Este anlisis se puede llevar a cabo mediante el
anlisis de variable viva, que es una forma de anlisis esttico de software y anlisis de ujo de datos. Esta tambin
es una diferencia con respecto al cdigo inalcanzable que
se descubre mediante un anlisis de control del ujo.

Muchnick S. S. 1997 Advanced Compiler Design


and Implementation. Morgan Kaufmann.
Appel, A. W. 1998 Modern Compiler Implementation in Java. Cambridge University Press.

48.6 Enlaces externos

La eliminacin de cdigo en general es la misma tcnica


que se usa para eliminar el cdigo inalcanzable y el cdigo
redundante.
En los proyectos de programacin grandes, a veces es
difcil de reconocer y eliminar cdigo muerto, especial91

Optimizacin de cdigo
Dead Code Detector (DCD) Java/JEE
Comparacin de DCD para Java

92
UCDetector Plugin Eclipse para encontrar cdigo
muerto Java

CAPTULO 48. CDIGO MUERTO

Captulo 49

Cdigo redundante
En programacin, se conoce como cdigo redundante 49.2 Eliminacin
a cualquier parte del cdigo fuente que tenga algn tipo
de redundancia tales como recalcular un valor que ha sido Existen tcnicas de optimizacin de software comnmencalculado previamente y todava esta disponible.* [1]
te llevadas a cabo por un compilador optimizador para
Una instruccin NOP podra ser considerado como cdi- eliminar el cdigo redundante del cdigo fuente. La ms
go redundante que ha sido explcitamente insertado para comn es la eliminacin de cdigo muerto.
rellenar el ujo de instrucciones o introducir un retardo
de tiempo, por ejemplo para crear un bucle de temporizacin paraperder el tiempo. Los identicadores que se 49.3 Vase tambin
declaran, pero nunca se les hace referencia, se denominan
declaraciones redundantes.
Cdigo muerto
Cdigo 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
Trans. Program. Lang. Syst. 22, 2 (Mar. 2000), 378415.

int foo(int X) { int Y = X*2; return X*2; }


En este ejemplo la instruccin int Y = X*2; puede ser removida para evitar calcular el valor dos veces, o tambin
se puede retornar el valor de la variable Y (aunque particularmente este mtodo consume mas memoria).
Considerando:
#dene min(A,B) ((A)<(B)?(A):(B)) int magnitud_mas_corta(int u1, int v1, int u2, int v2) { /* retorna
la magnitud mas corta entre (u1,v1) y (u2,v2) */ return
sqrt(min(u1*u1 + v1*v1, u2*u2 + v2*v2)); }
Como consecuencia de usar el preprocesador de C el
compilador escribir la forma expandida:
int magnitud_mas_corta(int u1, int v1, int u2, int v2) {
int temp; if (u1*u1 + v1*v1 < u2*u2 + v2*v2) temp =
u1*u1 + v1*v1; /* Redundante */ else temp = u2*u2 +
v2*v2; /* Redundante */ return sqrt(temp); }
Provocando un cdigo totalmente redundante e ineciente, sin embargo debido a que los macros de mximo y
mnimo son muy utilizados los compiladores modernos
detectan estas situaciones y corrigen el cdigo generado.
93

Captulo 50

Dato
Un dato es una representacin simblica (numrica, alfabtica, algortmica, espacial, etc.) de un atributo o variable cuantitativa o cualitativa. Los datos describen hechos
empricos, sucesos y entidades. Es un valor o referente
que recibe el computador por diferentes medios, los datos
representan la informacin que el programador manipula
en la construccin de una solucin o en el desarrollo de
un algoritmo.

Dato experimental

50.2 Enlaces externos

Los datos aisladamente pueden no contener informacin


humanamente relevante. Slo cuando un conjunto de datos se examina conjuntamente a la luz de un enfoque,
hiptesis o teora se puede apreciar la informacin contenida en dichos datos. Los datos pueden consistir en nmeros, estadsticas o proposiciones descriptivas. Los datos convenientemente agrupados, estructurados e interpretados se consideran que son la base de la informacin
humanamente relevante que se pueden utilizar en la toma de decisiones, la reduccin de la incertidumbre o la
realizacin de clculos. Es de empleo muy comn en el
mbito informtico y, en general, prcticamente en cualquier investigacin cientca.
En programacin, un dato es la expresin general que describe las caractersticas de las entidades sobre las cuales
opera un algoritmo.
En estructura de datos, es la parte mnima de la informacin.
Datos

Procesamiento

Informacin

Un dato por s mismo no constituye informacin, es el procesamiento de los datos lo que nos proporciona informacin.

50.1 Vase tambin


Informacin
Conocimiento
Sabidura
Metadato
Estadstica
94

Wikcionario tiene deniciones y otra informacin sobre dato.Wikcionario

Datos Grcos: Web que permite generar grcos a


partir de datos del Instituto Nacional de Estadstica.
GracandoDatos.com: Tienda on-line de grcas
para uso digital e impreso. Servicio de produccin
de grcas a la medida para empresas y particulares.
Stat4You: En stat4you tienes todas las estadsticas
del INE y del ISTAC para que crees tus grcos fcilmente.
Centro de datos - Lanzarote: La mayor coleccin de
datos y estadsticas de la Isla de Lanzarote en Internet.

Captulo 51

Depuracin de programas
51.1 Origen

Una fotografa del supuestamente primer bug(bicho) real, el


cual fue depurado (debugged) en 1947.

Existe una controversia acerca del origen del trmino depuracin o debuggingen ingls. Los trminos bug
y debuggingson atribuidos popularmente a la almirante Grace Murray Hopper por los aos 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 coment que cuando se sac aquella polilla le haban hecho
debuggingal sistema. Sin embargo el trmino bug
cmo signicado de error tcnico data cerca de 1878, y
el trmino debuggingo depuracin ha sido usado en
aeronutica antes de entrar al mundo de las computadoras.

51.2 Aplicacin
Como el software y los sistemas electrnicos se vuelven
generalmente ms complejos, se han desarrollado varias
tcnicas comunes de depuracin para detectar anomalas,
corregir funcionalidades y optimizar cdigo fuente. ExisDepuracin de programas es el proceso de identicar y
ten algunos acionados que consideran la depuracin cocorregir errores de programacin. En ingls se le conoce
mo una forma de arte.
como debugging, es que se asemeja a la eliminacin de
bichos (bugs), manera en que se conoce informalmente a
los errores de programacin. Se dice que el trmino bug
proviene de la poca de los ordenadores de vlvula ter- 51.3 Vase tambin
moinica, en los cuales los problemas se generaban por
Depurador
los insectos que eran atrados por las luces y estropeaban
el equipo. Si bien existen tcnicas para la revisin siste Error de software
mtica del cdigo fuente y se cuenta con medios computacionales para la deteccin 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 desafa la paciencia,
la imaginacin y la intuicin del programador. Muchas
veces se requiere incluir en el cdigo fuente instrucciones auxiliares que permitan el seguimiento de la ejecucin del programa, presentando los valores de variables
y direcciones de memoria y ralentizando la salida de datos (modo de depuracin). Dentro de un proceso formal
de aseguramiento de la calidad, puede ser asimilado al
concepto de prueba unitaria.
95

Captulo 52

Desarrollador de software
El desarrollador de software es una persona
programadora que se dedica a uno o ms aspectos
del proceso de desarrollo de software. Se trata de un
mbito ms amplio de la programacin.
El desarrollador puede contribuir a la visin general del
proyecto ms a nivel de aplicacin que a nivel de componentes o en las tareas de programacin individuales.
Conforme pasa el tiempo, las diferencias entre el diseo
de sistemas informticos, el desarrollo de software y la
programacin se van haciendo ms claras. En el nicho de
mercado puede encontrarse una separacin entre programadores y desarrolladores, siendo estos ltimos los que
disean la estructura o jerarqua de clases. Incluso esos
desarrolladores se convierten en arquitectos de sistemas
informticos, aquellos que disean la arquitectura a varios niveles o las interacciones entre componentes de un
proyecto de software grande.
El concepto de desarrollo de software incluye:
trabajo en equipo: los proyectos son en general una
colaboracin entre varios desarrolladores, que tratan cada uno una parte del programa, y tambin de
otros colaboradores como los comerciales, que denen con el cliente la nalidad del producto, diseadores grcos que denen el aspecto y la ergonoma,
entre otros temas.
concepcin o diseo: a partir de un pliego de condiciones (user requirement specications), denir las
especicaciones tcnicas (estructura de los datos,
comunicacin entre los mdulos, etctera).
pruebas: que sirven para detectar las disconformidades y los errores
mantenimiento: la correccin de los errores despus
de la salida del programa informtico, y la mejora
para hacer evolucionar el producto.

52.1 Vase tambin


Ambiente de desarrollo integrado
Desarrollador de videojuegos
96

Ingeniera del software


Interfaz de programacin de aplicaciones
Programacin
Software

Captulo 53

Desarrollo en cascada
En Ingeniera de software el desarrollo en cascada, tambin llamado modelo en cascada (denominado as por la
posicin de las fases en el desarrollo de esta, que parecen caer en cascada por gravedad hacia las siguientes fases), es el enfoque metodolgico que ordena rigurosamente las etapas del proceso para el desarrollo de
software, de tal forma que el inicio de cada etapa debe
esperar al trmino de la etapa anterior.* [1] Al nal de cada etapa, el modelo est diseado para llevar a cabo una
revisin nal, que se encarga de determinar si el proyecto
est listo para avanzar a la siguiente fase. Este modelo fue
el primero en originarse y es la base de todos los dems
modelos de ciclo de vida.

Requisitos
Diseo

Implementacin
Vericacin

Maintenimiento

Un ejemplo de una metodologa de desarrollo en cascada


El modelo cascadasin modicar. El progreso uye de arriba
es:
haca abajo, como una cascada.

1. Anlisis de requisitos.
qu objetivos debe cubrir. De esta fase surge
una memoria llamada SRD (documento de especicacin de requisitos), que contiene la especicacin completa de lo que debe hacer el
sistema sin entrar en detalles internos.

2. Diseo del Sistema.


3. Segregacin del programa.
4. Diversicacin.
5. Vericacin integral.

Es importante sealar que en esta etapa se debe


consensuar todo lo que se requiere del sistema
y ser aquello lo que seguir en las siguientes
etapas, no pudindose requerir nuevos resultados a mitad del proceso de elaboracin del software de una manera.

6. Ordeado del programa.

De esta forma, cualquier error de diseo detectado en


la etapa de prueba conduce necesariamente al rediseo
y nueva programacin del cdigo afectado, aumentando
los costos del desarrollo. La palabra cascada sugiere, mediante la metfora de la fuerza de la gravedad, el esfuerzo necesario para introducir un cambio en las fases ms 53.1.2 Diseo del Sistema
avanzadas de un proyecto.
Descompone y organiza el sistema en elemenSi bien ha sido ampliamente criticado desde el mbito
tos que puedan elaborarse por separado, aproacadmico y la industria* [cita requerida], sigue siendo el
vechando las ventajas del desarrollo en equipo.
paradigma ms seguido al da de hoy* [cita requerida].
Como resultado surge el SDD (Documento de
Diseo del Software), que contiene la descripcin de la estructura relacional global del sis53.1 Fases del modelo
tema y la especicacin de lo que debe hacer
cada una de sus partes, as como la manera en
que se combinan unas con otras.
53.1.1 Anlisis de requisitos
En esta fase se analizan las necesidades de los
usuarios nales del software para determinar

Es conveniente distinguir entre diseo de alto nivel o arquitectnico y diseo detallado. El


97

98

CAPTULO 53. DESARROLLO EN CASCADA


primero de ellos tiene como objetivo denir la
estructura de la solucin (una vez que la fase de
anlisis ha descrito el problema) identicando
grandes mdulos (conjuntos de funciones que
van a estar asociadas) y sus relaciones. Con ello
se dene la arquitectura de la solucin elegida. El segundo dene los algoritmos empleados
y la organizacin del cdigo para comenzar la
implementacin.

53.1.3

Diseo del Programa

Es la fase en donde se realizan los algoritmos


necesarios para el cumplimiento de los requerimientos del usuario as como tambin los anlisis necesarios para saber qu herramientas usar
en la etapa de Codicacin

53.1.4

Codicacin

Es la fase en donde se implementa el cdigo


fuente, haciendo uso de prototipos as como de
pruebas y ensayos para corregir errores.
Dependiendo del lenguaje de programacin y
su versin se crean las bibliotecas y componentes reutilizables dentro del mismo proyecto para hacer que la programacin sea un proceso
mucho ms rpido.

53.2 Variantes
Existen variantes de este modelo; especialmente destacamos la que hace uso de prototipos y
en la que se establece un ciclo antes de llegar
a la fase de mantenimiento, vericando que el
sistema nal este libre de fallos.
Otros ejemplos de variantes del modelo en cascada son el modelo en cascada con fases solapadas, cascada con subproyectos, y cascada
con reduccin de riesgos.* [2]

53.3 Ventajas
Realiza un buen funcionamiento en equipos
dbiles y productos maduros, por lo que se requiere de menos capital y herramientas para
hacerlo funcionar de manera ptima.
Es un modelo fcil de implementar y entender.
Est orientado a documentos.
Es un modelo conocido y utilizado con frecuencia.
Promueve una metodologa de trabajo efectiva: Denir antes que disear, disear antes que
codicar.* [3]

53.4 Desventajas
53.1.5

Pruebas

Los elementos, ya programados, se ensamblan


para componer el sistema y se comprueba que
funciona correctamente y que cumple con los
requisitos, antes de ser entregado al usuario nal.

53.1.6

Vericacin

En la vida real, un proyecto rara vez sigue una


secuencia lineal, esto crea una mala implementacin del modelo, lo cual hace que lo lleve al
fracaso.
El proceso de creacin del software tarda mucho tiempo ya que debe pasar por el proceso de
prueba y hasta que el software no est completo
no se opera. Esto es la base para que funcione
bien.

Es la fase en donde el usuario nal ejecuta el


sistema, para ello el o los programadores ya
realizaron exhaustivas pruebas para comprobar
que el sistema no falle.

Cualquier error de diseo detectado en la etapa


de prueba conduce necesariamente al rediseo
y nueva programacin del cdigo afectado, aumentando los costos del desarrollo.

En la creacin de desarrollo de cascada se implementa los cdigos de investigacin y pruebas del mismo.

Una etapa determinada del proyecto no se puede llevar a cabo a menos de que se haya culminado la etapa anterior.

53.1.7

Mantenimiento

Una de las etapas ms crticas, ya que se destina


un 75 % de los recursos, es el mantenimiento
del Software ya que al utilizarlo como usuario
nal puede ser que no cumpla con todas nuestras expectativas.

53.5 Vase tambin


Ingeniera de software
Desarrollo en espiral
Modelos de desarrollo de software: Cascada vs V

53.7. ENLACES EXTERNOS

53.6 Referencias
[1] S. Pressman, Roger. Ingeniera del Software: Un enfoque
prctico, 3. Edicin, Pag. 26-30.
[2] , Patricia Arieta Melgarejo, Modelos del ciclo de vida de
software.
[3] , Ruby Casallas, Andrs Yie, Ingeniera de Software: Ciclos de Vida y Metodologas.

53.7 Enlaces externos


Ciclo de vida del software

99

Captulo 54

Desarrollo en espiral
El desarrollo en espiral es un modelo de ciclo de vida
del software denido por primera vez por Barry Boehm
en 1986,* [1] utilizado generalmente en la Ingeniera de
software. Las actividades de este modelo se conforman en
una espiral, en la que cada bucle o iteracin representa un
conjunto de actividades. Las actividades no estn jadas
a ninguna prioridad, sino que las siguientes se eligen en
funcin del anlisis de riesgo, comenzando por el bucle
interior.

54.1 Introduccin

Enhancement.* [1] En 1988, Boehm public un artculo


similar* [2] destinado a una audiencia ms ampla. Bsicamente consiste en una serie de ciclos que se repiten en
forma de espiral, comenzando desde el centro. Se suele
interpretar como que dentro de cada ciclo de la espiral se
sigue un Modelo Cascada, pero no necesariamente debe
ser as. El Espiral puede verse como un modelo evolutivo que conjuga la naturaleza iterativa del modelo MCP
con los aspectos controlados y sistemticos del Modelo
Cascada, con el agregado de gestin de riesgo.

54.2 Ciclos o Iteraciones

La Ingeniera de software, se vale y establece a partir de En cada vuelta o iteracin hay que tener en cuenta:
una serie de modelos que establecen y muestran las distintas etapas y estados por los que pasa un producto soft Los Objetivos: qu necesidad debe cubrir el proware, desde su concepcin inicial, pasando por su desaducto.
rrollo, puesta en marcha y posterior mantenimiento, hasta
la retirada del producto. A estos modelos se les denomina
Alternativas: las diferentes formas de conseguir los
modelos de ciclo de vida del software. El primer modeobjetivos de forma exitosa, desde diferentes puntos
lo concebido fue el de Royce, ms comnmente conocido
de vista como pueden ser:
como desarrollo en cascada o desarrollo lineal secuencial.
Este modelo establece que las diversas actividades que se
1. Caractersticas: experiencia del personal, requisivan realizando al desarrollar un producto software sucetos a cumplir, etc.
den de forma lineal.
Boehm, autor de diversos artculos de ingeniera del soft2. Formas de gestin del sistema.
ware; modelos de estimacin de esfuerzo y tiempo que
se consume en hacer productos software; y Modelos de
3. Riesgo asumido con cada alternativa.
Ciclo de Vida; ide y promulg un modelo desde un enfoque distinto al tradicional en Cascada: El Modelo Evo Desarrollar y Vericar: Programar y probar el
lutivo Espiral. Su Modelo de Ciclo de Vida en Espiral tiesoftware.
ne en cuenta fuertemente el riesgo que aparece a la hora
de desarrollar software. Para ello, se comienza mirando
las posibles alternativas de desarrollo, se opta por la de Si el resultado no es el adecuado o se necesita implemenriesgo ms asumible y se hace un ciclo de la espiral. Si el tar mejoras o funcionalidades:
cliente quiere seguir haciendo mejoras en el software, se
vuelve a evaluar las distintas nuevas alternativas y riesgos
Se planicaran los siguientes pasos y se comienza un
y se realiza otra vuelta de la espiral, as hasta que llegue
nuevo ciclo de la espiral. La espiral tiene una forma
un momento en el que el producto software desarrollado
de caracola y se dice que mantiene dos dimensiones,
sea aceptado y no necesite seguir mejorndose con otro
la radial y la angular:
nuevo ciclo.
Este modelo fue propuesto por Boehm en 1986 en su artculo A Spiral Model of Software Development and
100

1. Angular: Indica el avance del proyecto del software


dentro de un ciclo.

54.3. MECANISMOS DE CONTROL


2. Radial: Indica el aumento del coste del proyecto,
ya que con cada nueva iteracin se pasa ms tiempo
desarrollando.
Este sistema es muy utilizado en proyectos grandes y
complejos como puede ser, por ejemplo, la creacin de
un Sistema Operativo.

101
Dependiendo del resultado de la evaluacin de los
riesgos, se elige un modelo para el desarrollo, el que
puede ser cualquiera de los otros existentes, como
formal, evolutivo, cascada, etc. As si por ejemplo
si los riesgos en la interfaz de usuario son dominantes, un modelo de desarrollo apropiado podra ser
la construccin de prototipos evolutivos. Si lo riesgos de proteccin son la principal consideracin, un
desarrollo basado en transformaciones formales podra ser el ms apropiado.

Al ser un modelo de Ciclo de Vida orientado a la gestin


de riesgo se dice que uno de los aspectos fundamentales
de su xito radica en que el equipo que lo aplique tenga
la necesaria experiencia y habilidad para detectar y cataAnlisis del riesgo
logar correctamente los riesgos.

54.2.1

Tareas

Para cada ciclo habr cuatro actividades:

Se lleva a cabo el estudio de las causas de las posibles amenazas y probables eventos no deseados y los
daos y consecuencias que stas puedan producir.
Se evalan alternativas. Se debe tener un prototipo
antes de comenzar a desarrollar y probar.

1. Determinar Objetivos.
En resumen, es para tener en cuenta los riesgos de cada
uno de los ambitos

2. Anlisis del riesgo.


3. Desarrollar y probar.

54.3 Mecanismos de control

4. 'Planicacin.'

La dimensin radial mide el coste.


Determinar objetivos

Anlisis del riesgo

La dimensin angular mide el grado de avance del


proyecto.

54.4 Variaciones del Modelo En


Espiral
Planicacin

Desarrollar y probar

Modelo en Espiral Tpico de seis regiones


Modelo en espiral(Boehm, 1986).

Determinar o jar objetivos

El modelo en espiral puede adaptarse y aplicarse a lo largo


de la vida del software de computadora, a diferencia del
modelo de proceso clsico que termina cuando se entrega
el software.

Fijar tambin los productos denidos a obtener: re- Las 6 regiones que componen este modelo son las siguienquisitos, especicacin, manual de usuario.
tes:
Fijar las restricciones.
Identicacin de riesgos del proyecto y estrategias
alternativas para evitarlos.
Hay una cosa que solo se hace una vez: planicacin
inicial.

Comunicacin con el cliente - Tareas necesarias para plantear la comunicacin entre el desarrollador y
el cliente.
Planicacin - Tareas inherentes a la denicin de
recursos, el tiempo y otras informaciones relacionadas con el proyecto. Son todos los requerimientos.

Tareas de la actividad propia y de prueba.

Anlisis de riesgos Tareas para evaluar riesgos tcnicos y otras informaciones relacionadas con el proyecto.

Anlisis de alternativas e identicacin resolucin


de riesgos.

Ingeniera - Tareas para construir una o ms representaciones de la aplicacin.

Desarrollar, vericar y validar(probar)

102
Construccin y adaptacin - Tareas requeridas para
construir, probar, instalar y proporcionar soporte a
los usuarios.

CAPTULO 54. DESARROLLO EN ESPIRAL

54.7 Inconvenientes

Planicar un proyecto con esta metodologa es a menudo


imposible, debido a la incertidumbre en el nmero de ite Evaluacin del cliente - Tareas requeridas para ob- raciones que sern necesarias. En este contexto la evaluatener la reaccin del cliente segn la evaluacin de cin de riesgos es de la mayor importancia y, para granlas representaciones del software creadas durante la des proyectos, dicha evaluacin requiere la intervencin
etapa de ingeniera e implementacin durante la eta- de profesionales de gran experiencia.
pa de instalacin.* [3]
El IEEE clasica al desarrollo en espiral como modelo no
operativo en sus clasicaciones de MCV.* [5]
Modelo en espiral WIN WIN
El modelo Win-Win es una adaptacin del modelo espiral
que se enfatiza en la participacin del cliente en el proceso de desarrollo de un producto de software. En un caso ideal, el desarrollador simplemente pregunta al cliente
lo que se requiere y el cliente proporciona suciente informacin y detalles para proceder. Sin embargo esto no
suele ocurrir en la mayora de los casos y es necesario
que se establezcan negociaciones signicativas entre ambas partes para equilibrar la funcionalidad y rendimiento
con los costos y tiempo de salida al mercado del producto. El modelo Win-Win deriva su nombre del objetivo de
estas negociaciones, es decir, ganar-ganar. El cliente
recibe el producto que satisface la mayora de sus necesidades, y el desarrollador trabaja para alcanzar presupuestos y fechas de entrega. Para lograr este objetivo, se
realizan varias actividades de negociacin al principio de
cada paso alrededor de la espiral.* [4]

54.5 Ventajas
El anlisis del riesgo se hace de forma explcita y clara.
Une los mejores elementos de los restantes modelos.
Reduce riesgos del proyecto
Incorpora objetivos de calidad
Integra el desarrollo con el mantenimiento, etc.
Adems es posible tener en cuenta mejoras y nuevos requerimientos sin romper con la metodologa, ya que este
ciclo de vida no es rgido ni esttico.

54.6 Desventajas
Genera mucho tiempo en el desarrollo del sistema
Modelo costoso
Requiere experiencia en la identicacin de riesgos

54.8 Vase tambin


Ingeniera de Software
Desarrollo de Software
Modelo en Cascada o Secuencial
Modelo Iterativo Incremental
Modelo por Prototipos
Modelo de Desarrollo Rpido

54.9 Referencias
[1] Boehm B, A Spiral Model of Software Development
and Enhancement, ACM SIGSOFT Software Engineering Notes, ACM, 11(4):14-24, Agosto 1986.
[2] Boehm B, A Spiral Model of Software Development
and Enhancement", IEEE Computer, IEEE, 21(5):61-72,
May 1988
[3] http://modeloespiral.blogspot.com/2009/08/
modelo-tipico-de-seis-regiones.html
[4] http://www.hanantek.com/win-win
[5] Developing a Software Project Life Cycle Process (IEEE
1074), 30 de marzo de 2006.

54.10 Enlaces externos


A Spiral Model of Software Development and Enhancement. artculo original de Barry Boehm en el
que propona el modelo de desarrollo en espiral (en
ingls)

Captulo 55

Desarrollo iterativo y creciente


Desarrollo iterativo y creciente (o incremental) es un ed Process y el Dynamic Systems Development Metproceso de desarrollo de software creado en respuesta a hod. El desarrollo incremental e iterativo es tambin una
las debilidades del modelo tradicional de cascada.
parte esencial de un tipo de programacin conocido coBsicamente este modelo de desarrollo, que no es ms mo Extreme Programming y los dems frameworks de
desarrollo rpido de software.
que un conjunto de tareas agrupadas en pequeas etapas
*
repetitivas (iteraciones), [1] es uno de los ms utilizados
en los ltimos tiempos ya que, como se relaciona con novedosas estrategias de desarrollo de software y una pro- 55.2 Ciclo de vida
gramacin extrema, es empleado en metodologas diversas.
La idea principal detrs de mejoramiento iterativo es
El modelo consta de diversas etapas de desarrollo en cada desarrollar un sistema de programas de manera increincremento, las cuales inician con el anlisis y nalizan mental, permitindole al desarrollador sacar ventaja de lo
que se ha aprendido a lo largo del desarrollo anterior, incon la instauracin y aprobacin del sistema.* [2]
crementando, versiones entregables del sistema. El aprendizaje viene de dos vertientes: el desarrollo del sistema,
y su uso (mientras sea posible). Los pasos claves en el
55.1 Concepto de desarrollo itera- proceso son comenzar con una implementacin simple de
los requerimientos del sistema, e iterativamente mejorar
tivo y creciente
la secuencia evolutiva de versiones hasta que el sistema
completo est implementado. En cada iteracin, se realiSe planica un proyecto en distintos bloques temporales zan cambios en el diseo y se agregan nuevas funcionalique se le denominan iteracin. En una iteracin se repite dades y capacidades al sistema.
un determinado proceso de trabajo que brinda un resul- Bsicamente este modelo se basa en dos premisas:
tado ms completo para un producto nal, de forma que
quien lo utilice reciba benecios de este proyecto de ma Los usuarios nunca saben bien que es lo que necesinera creciente.
tan para satisfacer sus necesidades.
Para llegar a lograr esto, cada requerimiento debe tener
En el desarrollo, los procesos tienden a cambiar.* [4]
un completo desarrollo en una nica iteracin que debe de
incluir pruebas y una documentacin para que el equipo
pueda cumplir con todos los objetivos que sean necesa- El proceso en s mismo consiste de:
rios y est listo para ser dado al cliente. As se evita tener
arriesgadas actividades en el proyecto nalizado.
Etapa de inicializacin
Lo que se busca es que en cada iteracin los componentes
logren evolucionar el producto dependiendo de los completados de las iteraciones antecesoras, agregando ms
opciones de requisitos y logrando as un mejoramiento
mucho ms completo.

Etapa de iteracin
Lista de control de proyecto

55.2.1 Consideraciones sobre el momento

Una manera muy primordial para dirigir al proceso iterade aplicacin


tivo incremental es la de priorizar los objetivos y requerimientos en funcin del valor que ofrece el cliente.* [3] Para integrar la usabilidad en un proceso de desarrollo,
Para apoyar el desarrollo de proyectos por medio de este no es suciente con asignar tcnicas de usabilidad a acmodelo se han creado frameworks (entornos de trabajo), tividades de desarrollo, puesto que no todas las tcnicas
de los cuales los dos ms famosos son el Rational Uni- de usabilidad son aplicables en cualquier momento de un
103

104

CAPTULO 55. DESARROLLO ITERATIVO Y CRECIENTE

desarrollo iterativo. Por ejemplo, las tcnicas para desarrollar el concepto del producto estn concebidas para su
aplicacin en los primeros esfuerzos del desarrollo, cuando las necesidades se identican y el esquema general del
sistema se establece. Aunque es aconsejable aplicarlas
tambin ms tarde, para renar el concepto, su principal esfuerzo de aplicacin esta en las tareas iniciales de
desarrollo.* [5]

55.2.2

Etapa de inicializacin

Se crea una versin del sistema. La meta de esta etapa


es crear un producto con el que el usuario pueda interactuar, y por ende retroalimentar el proceso. Debe ofrecer una muestra de los aspectos claves del problema y
proveer una solucin lo sucientemente simple para ser
comprendida e implementada fcilmente. Para guiar el
proceso de iteracin se crea una lista de control de proyecto, que contiene un historial de todas las tareas que
necesitan ser realizadas. Incluye cosas como nuevas funcionalidades para ser implementadas, y areas de rediseo
de la solucin ya existente. Esta lista de control se revisa
peridica y constantemente como resultado de la fase de
anlisis.

55.2.3

Etapa de iteracin

Esta etapa involucra el rediseo e implementacin de una


tarea de la lista de control de proyecto, y el anlisis de la
versin ms reciente del sistema. La meta del diseo e
implementacin de cualquier iteracin es ser simple, directa y modular, para poder soportar el rediseo de la
etapa o como una tarea aadida a la lista de control de
proyecto. El cdigo puede, en ciertos casos, representar
la mayor fuente de documentacin del sistema. El anlisis de una iteracin se basa en la retroalimentacin del
usuario y en el anlisis de las funcionalidades disponibles
del programa. Involucra el anlisis de la estructura, modularidad, usabilidad, conabilidad, eciencia y ecacia
(alcanzar las metas). La lista de control del proyecto se
modica bajo la luz de los resultados del anlisis.
Las guas primarias que guan la implementacin y el anlisis incluyen:
Cualquier dicultad en el diseo, codicacin y
prueba de una modicacin debera apuntar a la necesidad de redisear o recodicar.

Las modicaciones deben ser ms fciles de hacer


conforme avanzan las iteraciones. Si no es as, hay un
problema primordial usualmente encontrado en un
diseo dbil o en la proliferacin excesiva de parches
al sistema.
Los parches normalmente deben permanecer solo
por una o dos iteraciones. Se hacen necesarios para
evitar el rediseo durante una fase de implementacin.
La implementacin existente debe ser analizada frecuentemente para determinar qu tal se ajusta a las
metas del proyecto.
Las facilidades para analizar el programa deben ser
utilizadas cada vez para ayudar en el anlisis de implementaciones parciales.
La opinin del usuario debe ser solicitada y analizada para indicar deciencias en la implementacin
referida por l.

55.3 Caso prctico


La mejora iterativa fue exitosamente aplicada al desarrollo de una familia extensa de compiladores para una familia de lenguajes de programacin en una gama de arquitecturas de hardware. Un conjunto de 17 versiones del
sistema se desarrollaron en un lugar, generando 17 mil lneas de cdigo fuente de lenguaje de alto nivel (6500 de
cdigo ejecutable). El sistema posteriormente fue desarrollado en dos sitios diferentes, llegando a dos versiones
diferentes del lenguaje base: una versin esencialmente
se enfocaba en aplicaciones matemticas, aadiendo nmeros reales y varias funciones matemticas, y la otra se
centr en aadir capacidades para escribir del compilador. Cada iteracin fue analizada del punto de vista de
los usuarios (las capacidades del lenguaje fueron determinadas en parte por las necesidades del usuario) y el
punto de vista del desarrollador (el diseo del compilador evolucion para ser ms fcilmente modicable, por
ejemplo, para aadir nuevos tipos de datos). Mediciones
tales como acoplamiento y modularizacin fueron seguidas sobre mltiples versiones.

55.4 Caractersticas

Las modicaciones deben ajustarse fcilmente a los


Usando anlisis y mediciones como guas para el procemdulos fciles de encontrar y a los aislados. Si no
so de mejora es una diferencia mayor entre las mejoras
es as, entonces se requiere algn grado de rediseo.
iterativas y el desarrollo rpido de aplicaciones, princi Las modicaciones a las tablas deben ser especial- palmente por dos razones:
mente fciles de realizar. Si dicha modicacin no
ocurre rpidamente, se debe aplicar algo de rediseo.

Provee de soporte para determinar la efectividad de


los procesos y de la calidad del producto.

55.7. DEBILIDADES DE ESTE MODELO DE DESARROLLO


Permite estudiar y despus mejorar y ajustar el proceso para el ambiente en particular.
Estas mediciones y actividades de anlisis pueden ser
aadidas a los mtodos de desarrollo rpido existentes.
De hecho, el contexto de iteraciones mltiples conlleva
ventajas en el uso de mediciones. Las medidas a veces
son difciles de comprender en lo absoluto, aunque en los
cambios relativos en las medidas a travs de la evolucin
del sistema puede ser muy informativo porque proveen
una base de comparacin. Por ejemplo, un vector de medidas m1, m2,..., mn puede ser denido para caracterizar
varios aspectos del producto en cierto punto, como pueden ser el esfuerzo total realizado, los cambios, los defectos, los atributos lgico, fsico y dinmico, consideraciones del entorno, etctera. As el observador puede decir
como las caractersticas del producto como el tamao, la
complejidad, el acoplamiento y la cohesin incrementan
o disminuyen en el tiempo. Tambin puede monitorearse el cambio relativo de varios aspectos de un producto o
pueden proveer los lmites de las medidas para apuntar a
problemas potenciales y anomalas.

55.5 Ventajas del desarrollo incremental


En este modelo los usuarios no tienen que esperar
hasta que el sistema completo se entregue para hacer
uso de l. El primer incremento cumple los requerimientos ms importantes de tal forma que pueden
utilizar el software al instante.
Los usuarios pueden utilizar los incrementos iniciales como prototipos y obtener experiencia sobre los
requerimientos de los incrementos posteriores del
sistema.
Existe muy pocas probabilidades de riesgo en el sistema. Aunque se pueden encontrar problemas en algunos incrementos, lo normal es que el sistema se
entregue sin inconvenientes al usuario.
Ya que los sistemas de ms alta prioridad se entregan primero, y los incrementos posteriores se integran entre ellos, es muy poco probable que los sistemas ms importantes sean a los que se les hagan
ms pruebas. Esto quiere decir que es menos probable que los usuarios encuentren fallas de funcionamiento del software en las partes ms importantes
del sistema.* [6]

55.6 Ventajas del desarrollo iterativo


En el desarrollo de este modelo se da la retroalimentacin muy temprano a los usuarios.

105

Permite separar la complejidad del proyecto, gracias


a su desarrollo por parte de cada iteracin o bloque.
El producto es consistente y puntual en el desarrollo.
Los productos desarrollados con este modelo tienen
una menor probabilidad de fallar.
Se obtiene un aprendizaje en cada iteracin que es
aplicado en el desarrollo del producto y aumenta las
experiencias para prximos proyectos.* [7]

55.7 Debilidades de este modelo de


desarrollo
La entrega temprana de los proyectos produce la
creacin de sistemas demasiados simples que a veces se ven un poco montonos a los ojos del personal
que lo recibe.* [6]
La mayora de los incrementos se harn en base de
las necesidades de los usuarios. Los incrementos en
si ya son estipulados desde antes de la entrega del
proyecto, sin embargo hay que ver cmo se maneja
el producto para ver si necesita otros cambios adems de los estipulados antes de la entrega del proyecto. Este problema no se ve frecuentemente ya
que la mayora de las veces los incrementos estipulados suplen satisfactoriamente al usuario.* [6]
Los incrementos no deben constar de muchas lneas
de cdigo ya que la idea de los incrementos es agregar accesorios al programa principal (o funcional),
para que este tenga una y mil formas de desenvolverse en su tarea; llenar los incrementos de muchas
lneas de cdigo provocara que se perdiera la objetividad o base de lo que se trata el desarrollo incremental.* [6]
Requiere de un cliente involucrado durante todo el
curso del proyecto. Hay clientes que simplemente no
estarn dispuestos a invertir el tiempo necesario.
El trato con el cliente debe basarse en principios
ticos y colaboracin mutua, ms que trabajar cada parte independientemente, defendiendo slo su
propio benecio.* [8]
La entrega de un programa que es parcial pero funcional puede hacer vulnerable al programa debido
a la falta de robustez en su sistema, provocando que
agentes ajenos puedan interferir con el correcto funcionamiento del programa en s.* [6]
Infunde responsabilidad en el equipo de desarrollo
al trabajar directamente con el cliente, requiriendo
de profesionales sobre el promedio.

106

CAPTULO 55. DESARROLLO ITERATIVO Y CRECIENTE

Sufre fuertes penalizaciones en proyectos en los cuales los requerimientos estn previamente denidos,
o para proyectostodo/nadaen los cuales se requiere que se completen en un 100% el producto para ser
implementado (por ejemplo, licitaciones) otro punto muy importante es asegurarnos de que el trabajo
se pueda cumplir tomando en cuenta los costos que
podamos usar en nuestros propios recursos.

55.8 Vase tambin


Scrum
Iteracin
Desarrollo en cascada
Ingeniera de software
Desarrollo de software

55.9 Referencias
[1] |Proceso de Desarrollo Iterativo| http://fernandosoriano.
com.ar/?p=13
[2] |Desarrollo de software. Ciclo de vida iterativo incremental| https://jummp.wordpress.com/2011/03/31/
desarrollo-de-software-ciclo-de-vida-iterativo-incremental/
[3] |Desarrollo iterativo e incremental| http://www.
proyectosagiles.org/desarrollo-iterativo-incremental
[4] |Modelo Iterativo| http://procesosoftware.wikispaces.
com/Modelo+Iterativo
[5] Constantine, L. L., Lockwood, L. A. D.: Software for Use:
A Practical Guide to the Models and Methods of Usage Centred Design. Addison - Wesley ( 1999)
[6] Ian Sommerville (2005). Entrega Incremental. Ingeniera del Software, Sptima edicin edicin... Espaa: Pearson.
[7] |Proceso de Desarrollo Iterativo| http://fernandosoriano.
com.ar/?p=13
[8] |Desarrollo iterativo e incremental| http://www.
proyectosagiles.org/desarrollo-iterativo-incremental

Captulo 56

Deteccin dinmica de invariantes


La generacin dinmica de invarianteses una tcnica dinmica para el anlisis informtico, normalmente
orientado a la prueba y monitorizacin de software

56.1 Implementaciones
La implementacin ms famosa es Daikon

107

Captulo 57

Diagrama de colaboracin
Un diagrama de colaboracin en las versiones de UML
1.x es esencialmente un diagrama que muestra interacciones organizadas alrededor de los roles. A diferencia de los
diagramas de secuencia, los diagramas de colaboracin,
tambin llamados diagramas de comunicacin, muestran
explcitamente las relaciones de los roles. Por otra parte, un diagrama de comunicacin no muestra el tiempo
como una dimensin aparte, por lo que resulta necesario
etiquetar con nmeros de secuencia tanto la secuencia de
mensajes como los hilos concurrentes.

implcitas. Un diagrama de comunicacin muestra relaciones entre roles geomtricamente y relaciona los mensajes con las relaciones, pero las secuencias temporales
estn menos claras.

57.2 Tipos

Es til marcar los objetos en cuatro grupos: los que exis Muestra cmo las instancias especcas de las clases
ten con la interaccin entera; los creados durante la intrabajan juntas para conseguir un objetivo comn.
teraccin (restriccin {new}); los destruidos durante la
Implementa las asociaciones del diagrama de clases interaccin (restriccin {destroyed}); y los que se crean
mediante el paso de mensajes de un objeto a otro. y se destruyen durante la interaccin (restriccin {transient}).
Dicha implementacin es llamada enlace.
Un diagrama de comunicacin es tambin un diagrama
de clases que contiene roles de clasicador y roles de asociacin en lugar de slo clasicadores y asociaciones. Los
roles de clasicador y los de asociacin describen la conguracin de los objetos y de los enlaces que pueden ocurrir cuando se ejecuta una instancia de la comunicacin.
Cuando se instancia una comunicacin, los objetos estn
ligados a los roles de clasicador y los enlaces a los roles
de asociacin. El rol de asociacin puede ser desempeado por varios tipos de enlaces temporales, tales como
argumentos de procedimiento o variables locales del procedimiento. Los smbolos de enlace pueden llevar estereotipos para indicar enlaces temporales.

Aunque las comunicaciones muestran directamente la


implementacin de una operacin, pueden tambin mostrar la realizacin de una clase entera. En este uso, muestran el contexto necesario para implementar todas las
operaciones de una clase. Esto permite que el modelador
vea los roles mltiples que los objetos pueden desempear en varias operaciones.
No hay ejemplos de los diagramas, diferentes casos o sistemas, ya que con UML se modelan reas de un negocio
as como los sistemas que estos requieren

57.3 Mensajes
57.1 Usos
Un uso de un diagrama de colaboracin es mostrar la implementacin de una operacin. La comunicacin muestra los parmetros y las variables locales de la operacin,
as como asociaciones ms permanentes. Cuando se implementa el comportamiento, la secuencia de los mensajes corresponde a la estructura de llamadas anidadas y el
paso de seales del programa.
Un diagrama de secuencia muestra secuencias en el tiempo como dimensin geomtrica, pero las relaciones son

Los mensajes se muestran como echas etiquetadas unidas a los enlaces. Cada mensaje tiene un nmero de secuencia, una lista opcional de mensajes precedentes, una
condicin opcional de guarda, un nombre, una lista de
argumentos y un nombre de valor de retorno opcional.
El nombre de serie incluye el nombre (opcional) de un
hilo. Todos los mensajes del mismo hilo se ordenan secuencialmente. Los mensajes de diversos hilos son concurrentes a menos que haya una dependencia secuencial
explcita. En conclusin en un diagrama muy sencillo de
hacer.

108

57.5. CAMBIOS EN VERSIONES RECIENTES DE UML

57.4 Flujos
Generalmente, un diagrama de comunicacin contiene un
smbolo para un objeto durante una operacin completa.
Sin embargo, a veces, un objeto contiene diferentes estados que se deban hacer explcitos. Por ejemplo, un objeto
pudo cambiar de localizacin o sus asociaciones pudieron
diferenciarse.
Los diferentes smbolos de objeto que representan un objeto se pueden conectar usando ujosbecomeoconversin. Un ujobecomees una transicin, a partir
de un estado de un objeto a otro. Se dibuja como una echa de lnea discontinua con el estereotipo becomeo
conversiny puede ser etiquetado con un nmero de
serie para mostrar cuando ocurre. Un ujo de conversin
tambin se utiliza para mostrar la migracin de un objeto
a partir de una localizacin a otra distinta para otro lugar
tambin se deben marcar con el nmero en secuencias.

57.5 Cambios en versiones recientes de UML


En versiones recientes de UML este diagrama ha sido reemplazado por el diagrama de comunicacin.

109

Captulo 58

Diagrama de ujo
La lmpara no
funciona

Est
enchufada
la lmpara?

No

Enchufar
la lmpara

Est
quemada la
ampolleta?

Cambiar la
ampolleta

No
Comprar
nueva lmpara
Diagrama de ujo sencillo con los pasos a seguir si una lmpara
no funciona.

El diagrama de ujo o diagrama de actividades es la


representacin grca del algoritmo o proceso. Se utiliza
en disciplinas como programacin, economa, procesos
industriales y psicologa cognitiva.
En Lenguaje Unicado de Modelado (UML), un diagrama de actividades representa los ujos de trabajo paso a
paso de negocio y operacionales de los componentes en
un sistema. Un diagrama de actividades muestra el ujo
de control general.
En SysML el diagrama ha sido extendido para indicar ujos entre pasos que mueven elementos fsicos (p. ej., ga- Diagrama de actividades para un loop a(bucle
solina) o energa (p. ej., presin). Los cambios adicionales
permiten al diagrama soportar mejor ujos de comportamiento y datos continuos.
Estos diagramas utilizan smbolos con signicados deni- tan el ujo de ejecucin mediante echas que conectan
dos que representan los pasos del algoritmo, y represen- los puntos de inicio y de n del proceso.
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 tomaUn diagrama de ujo presenta generalmente un nico das dentro de un proceso.
punto de inicio y un nico punto de cierre, aunque puede La especicacin del Lenguaje de Noticacin Unicado
tener ms, siempre que cumpla con la lgica requerida.
(UNL) dene un diagrama de actividad como:
Las siguientes son acciones previas a la realizacin del una variacin de los estados de una mquina, los cuales
diagrama de ujo:
representan el rendimiento de las acciones o subactividades y las transiciones se provocan por la realizacin de las
*
Identicar las ideas principales al ser incluidas en el acciones o subactividades. [1]
diagrama de ujo. Deben estar presentes el autor o El propsito del diagrama de actividad es modelar un proresponsable del proceso, los autores o responsables ceso de ujo de trabajo (workow) y/o modelar operaciodel proceso anterior y posterior y de otros proce- nes.
sos interrelacionados, as como las terceras partes
Una Operacin es un servicio proporcionado por un obinteresadas.
jeto, que est disponible a travs de una interfaz.
Denir qu se espera obtener del diagrama de ujo.
Una Interfaz es un grupo de operaciones relacionadas con
la semntica.
Identicar quin lo emplear y cmo.
Establecer el nivel de detalle requerido.
Determinar los lmites del proceso a describir.
Los pasos a seguir para construir el diagrama de ujo son:
Establecer el alcance del proceso a describir. De esta manera quedar jado el comienzo y el nal del
diagrama. Frecuentemente el comienzo es la salida
del proceso previo y el nal la entrada al proceso
siguiente.
Identicar y listar las principales actividades/subprocesos que estn incluidos en el proceso a
describir y su orden cronolgico.
Si el nivel de detalle denido incluye actividades
menores, listarlas tambin.
Identicar y listar los puntos de decisin.
Construir el diagrama respetando la secuencia cronolgica y asignando los correspondientes smbolos.
Asignar un ttulo al diagrama y vericar que est
completo y describa con exactitud el proceso elegido.

58.3 Tipos de diagramas de ujo


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
la informacin que se considere necesaria, segn su
propsito.
Formato horizontal: En l, el ujo o la secuencia de
las operaciones, va de izquierda a derecha.
Formato panormico: El proceso entero est representado en una sola carta y puede apreciarse de una
sola mirada mucho ms rpido que leyendo el texto, lo que facilita su comprensin, aun para personas
no familiarizadas. Registra no solo en lnea vertical,
sino tambin horizontal, distintas acciones simultneas y la participacin de ms de un puesto o departamento que el formato vertical no registra.
Formato Arquitectnico: Describe el itinerario de
ruta de una forma o persona sobre el plano arquitectnico del rea de trabajo. El primero de los ujogramas es eminentemente descriptivo, mientras que
los utilizados son fundamentalmente representativos.

58.2 Descripcin
En UML 1.x, un diagrama de actividades es una variacin
del diagrama de estado UNL donde los estadosrepresentan operaciones, y las transiciones representan las
actividades que ocurren cuando la operacin se completa.
El diagrama de mensajes de UML 2.0, mientras que es
similar en aspecto al diagrama de actividades UML 1.x,
ahora tiene semnticas basadas en redes de Petri. En
UML 2.0, el diagrama general de interaccin est basado
en el diagrama de actividades. El diagrama de actividad

58.4 Simbologa y signicado


valo o Elipse: Inicio y Final (Abre y cierra el diagrama).
Rectngulo: Actividad (Representa la ejecucin de
una o ms actividades o procedimientos).
Rombo: Decisin (Formula una pregunta o cuestin).

112
Crculo: Conector (Representa el enlace de actividades con otra dentro de un procedimiento).

CAPTULO 58. DIAGRAMA DE FLUJO

58.6 Historia

Tringulo boca abajo: Archivo denitivo (Guarda


un documento en forma permanente).
Tringulo boca arriba: Archivo temporal (Proporciona un tiempo para el almacenamiento del docuLa paternidad del diagrama de ujo es en principio algo
mento).
difusa. El mtodo estructurado para documentar grcamente un proceso como un ujo de pasos sucesivo y alternativos, elproceso de diagrama de ujo, fue expuesto
58.5 Cursograma
por Frank Gilbreth, en la Sociedad Americana de Ingenieros Mecnicos (ASME), en 1921, bajo el enunciado
Se trata de la ms comn y prctica entre todas las clases de Proceso de Grcas-Primeros pasos para encontrar
de diagramas de ujo. Describe el ujo de informacin el mejor modo. Estas herramientas de Gilbreth rpidaen un ente u organizacin, sus procesos, sistemas admi- mente encontraron sitio en los programas de ingeniera
nistrativos y de control. Permite la impresin visual de los industrial.
procedimientos y una clara y lgica interpretacin.
Al principio de los 30, un ingeniero industrial, Allan H.
Mogensen comenz la formacin de personas de nego58.5.1 Simbologa y normas del cursogra- cios en Lake Placid, Nueva York, incluyendo el uso del
diagrama de ujo. Art Spinanger, asistente a las clases de
ma
Mogesen, utiliz las herramientas en su trabajo en Procter & Gamble, donde desarroll suPrograma Metdico
Crculo: Procedimiento estandarizado.
de Cambios por Etapas. Otro asistente al grupo de gra Cuadrado: Proceso de control.
duados en 1944, Ben S. Graham, director de ingeniera
Lnea continua: Flujo de informacin va formula- de Formcraft Standard Register Corporation, adapt la
grca de ujo de procesos al tratamiento de la informario o documentacin en soporte de papel escrito.
cin en su empresa. Y desarroll la grca del proceso
Lnea interrumpida: Flujo de informacin va for- de mltiples ujos en mltiples pantallas, documentos, y
mulario digital.
sus relaciones. En 1947, ASME adopt un conjunto de
smbolos derivados de la obra original de Gilbreth como
Rectngulo: Formulario o documentacin. Se graNorma ASME para los grcos de procesos (preparada
fca con el doble de ancho que su altura.
Mishad, Ramsan y Raiaan).
Rectngulo Pequeo: Valor o medio de pago (che- Sin embargo, segn explica Douglas Hartree fueron orique, pagar, etc.). Se grafca con el cudruple de an- ginalmente Herman Goldstine y John von Neumann quiecho que su altura, siendo su ancho igual al de los for- nes desarrollaron el diagrama de ujo (inicialmente llamularios.
madodiagrama) para planicar los programas de ordenador. Las tablas de programacin original de ujo de
Goldstine y von Neumann, aparecen en un informe no pu Tringulo Invertido (base superior): Archivo blicado, Planicacin y codicacin de los problemas
Transitorio.
de un instrumento de computacin electrnica, la Parte
II, Volumen 1 "(1947), reproducido en las obras comple Semivalo: Demora.
tas de von Neumann.
Rombo: Divisin entre opciones.
Inicialmente los diagramas de ujo resultaron un medio
popular para describir algoritmos de computadora, y an
Trapezoide: Carga de datos al sistema.
se utilizan con este n. Herramientas como los diagra Elipsoide: Acceso por pantalla.
mas de actividad UML, pueden ser considerados como
evoluciones del diagrama de ujo.
Hexgono: Proceso no representado.
En la dcada de 1970 la popularidad de los diagramas de
Pentgono: Conector.
ujo como mtodo propio de la informtica disminuy,
Cruz de Diagonales: Destruccin de Formularios. con el nuevo hardware y los nuevos lenguajes de programacin de tercera generacin. Y por otra parte se conSegn la normativa, el ujo presupuesto es de izquierda virtieron en instrumentos comunes en el mundo emprea derecha y de arriba hacia abajo, siendo optativo el uso sarial. Son una expresin concisa, legible y prctica de
de echas. Cuando el sentido es invertido (de derecha a algoritmos. Actualmente se aplican en muchos campos
izquierda o de abajo hacia arriba), es obligatorio el uso de del conocimiento, especialmente como simplicacin y
la echa.
expresin lgica de procesos, etc.
Tringulo (base inferior): Archivo denitivo.

58.9. VASE TAMBIN

113

58.7 Ventajas de los diagramas de 58.9 Vase tambin


ujo
58.10 Referencias
Favorecen la comprensin del proceso al mostrarlo
como un dibujo. El cerebro humano reconoce muy
fcilmente los dibujos. Un buen diagrama de ujo
reemplaza varias pginas de texto.
Permiten identicar los problemas y las oportunidades de mejora del proceso. Se identican los pasos,
los ujos de los reprocesos, los conictos de autoridad, las responsabilidades, los cuellos de botella, y
los puntos de decisin.
Muestran las interfaces cliente-proveedor y las
transacciones que en ellas se realizan, facilitando a
los empleados el anlisis de las mismas.
Son una excelente herramienta para capacitar a los
nuevos empleados y tambin a los que desarrollan la
tarea, cuando se realizan mejoras en el proceso.
Al igual que el pseudocdigo, el diagrama de ujo
con nes de anlisis de algoritmos de programacin
puede ser ejecutado en un ordenador, con un IDE
como Free DFD.

58.8 Software para diseo de diagramas de ujo


Actualmente existe una gran cantidad de software para la
elaboracin de diagramas de ujo. A continuacin se listan los programas ms comunes para elaborar diagramas
de ujo.
Microsoft Oce ofrece 3 herramientas tiles para
la elaboracin de diagramas. Uno de ellos es Microsoft Oce Word, que nos permite crear diagramas
de ujo bsicos a travs de la opcinFormasque
tiene un apartado especial para diagramas de ujo.
De igual manera Microsoft Oce Power Point ofrece las mismas opciones para crear los diseos de diagramas de ujo. Otra herramienta un poco ms sosticada es Microsoft Oce Visio, que adems de
la simbologa bsica de los diagramas de ujo cuenta con una variedad de herramientas para elaborar
otros tipos de diagramas como es el caso diagramas
UML entre otros tipos de diagramas de ujo.
Otro programa eciente y muy fcil de usar es el programa Diaque brinda una solucin rpida para
la creacin de diagramas de ujo adems de otro tipo de diagramas usados en el ambiente informtico.
Es considerado la versin no comercial de Microsoft
Visio.

[1] Bellows, Jeannie, Castek (2000). Activity Diagrams and


Operation Architecture. Technologies Group Inc.

58.11 Enlaces externos

Wikimedia Commons alberga contenido multimedia sobre Diagrama de ujoCommons.

Wikimedia Commons alberga contenido multimedia sobre diagrama de actividadesCommons.

Documentos de la Especicacin UML 2.0


Introduccin a los Diagramas de Actividades UML
2
Microsoft Oce Visio Tutorial
PSeInt herramienta para asistir a un estudiante en
sus primeros pasos en programacin.

Captulo 59

Diagrama Nassi-Shneiderman
En programacin de computadores un diagrama NassiShneiderman (o NSD por sus siglas en ingls), tambin
conocido como diagrama de Chapin* [1]* [2] es una representacin grca que muestra el diseo de un programa
estructurado.

do lo que se puede representar con un diagrama NassiShneiderman se puede representar con un diagrama de
ujo. Las nicas excepciones se dan en las instrucciones
GOTO, break y continue.

59.2 Referencias
[1] Molina Marco, A.; Letelier Torres, P.; Snchez Palma, P.;
Snchez Daz, J. (1997). Mtodos para especicacin
de mdulos. Metodologa y tecnologa de la programacin. Valencia: Universidad Politcnica de Valencia. p. 50.
ISBN 8477215197. Consultado el 26 de agosto de 2013.
[2] Eslava Muoz, V.J. (2012). Diseo de algoritmos.
Aprendiendo a programar paso a paso con C. Bubok Publishing. p. 42. ISBN 9788468610610. Consultado el 26
de agosto de 2013.

Ejemplo de un diagrama Nassi-Shneiderman.

Fue desarrollado en 1972 por Isaac Nassi y Ben Shneiderman. Este diagrama tambin es conocido como estructograma, ya que sirve para representar la estructura de los
programas. Combina la descripcin textual del pseudocdigo con la representacin grca del diagrama de ujo.

59.1 Descripcin

Nassi, I.; Shneiderman, B.: Tcnicas de diagramas


de ujo para programacin estructurada, SIGPLAN
Notices XII, Agosto 1973.

59.3 Enlaces externos

Wikimedia Commons alberga contenido mulBasado en un diseo top-down (de lo complejo a lo simtimedia sobre Diagrama Nassi-Shneiderman.
ple), el problema que se debe resolver se divide en subCommons
problemas cada vez ms pequeos - y simples - hasta que
solo queden instrucciones simples y construcciones para
A short history of structured owcharts (Nassiel control de ujo. El diagrama Nassi-Shneiderman reShneiderman Diagrams), por Ben Shneiderman
eja la descomposicin del problema en una forma simple usando cajas anidadas para representar cada uno de
los subproblemas. Para mantener una consistencia con los
59.3.1 Software
fundamentos de la programacin estructurada, los diagramas Nassi-Shneiderman no tienen representacin para las
Structorizer Editor de diagramas Nassiinstrucciones GOTO.
Shneiderman para Linux, Mac OS X & Microsoft
Windows, distribuido bajo GNU General Public
Los diagramas Nassi-Shneiderman se utilizan muy raraLicense
mente en las tareas de programacin formal. Su nivel de
abstraccin es muy cercano al cdigo de la programacin
Nessi Editor e intrprete de diagramas Nassiestructurada y ciertas modicaciones requieren que se reShneiderman, multiplataforma (Java), distribuido
dibuje todo el diagrama.
bajo GNU General Public License
Los diagramas Nassi-Shneiderman son (la mayora de
las veces) isomrcos con los diagramas de ujo. To114

Captulo 60

di
En informtica, di es una utilidad para la comparacin
de archivos que genera las diferencias entre dos archivos o los cambios realizados en un archivo determinado
comparndolo con una versin anterior del mismo archivo. Di expone los cambios realizados por lnea en los
archivos de texto. Las implementaciones modernas tambin soportan archivos binarios.* [1] El resultado se conoce como di o patch ya que el mismo puede ser aplicado
con el programa Unix patch. El resultado de la comparacin de un archivo similar tambin se llama di.
De la misma manera que se usa la palabra "grep" para
describir la accin de buscar, la palabra di se usa en la
jerga como un verbo que se reere al clculo de cualquier
diferencia. Un ejemplo de di.

60.1 Historia
La utilidad di fue desarrollada a comienzos de los aos
setenta en el sistema operativo Unix que estaba crendose en AT&T Bell Labs en Murray Hill, Nueva Jersey. La
versin nal, que apareci por primera vez con la 5 edicin de Unix en 1974, fue toda ella escrita por Douglas
McIlroy. Este trabajo fue publicado en un artculo de
1976 co-escrito con James W. Hunt que desarroll un
prototipo inicial de di.* [2]
El trabajo de McIlroy fue precedido e inuido por el programa comparison de Steve Johnson en GECOS y por
el programa proof de Mike Lesk tambin originado en
Unix y, como di, produca cambios lnea a lnea e incluso utilizaba parntesis angulares (">" y "<") para presentar las inserciones y borrados de lnea en el resultado
del programa. Las heursticas utilizadas en estas primeras aplicaciones fueron, sin embargo, juzgadas como no
ables. La utilidad potencial de la herramienta di provoc que McIlroy acometiese la investigacin y diseo
de una herramienta ms robusta que poda usarse en una
gran variedad de tareas pero que al tiempo se condujese
bien en los procesos y con las limitaciones de tamao del
hardware de PDP-11. Su anlisis del problema lo llev
a cabo con la colaboracin de distintas personas de Bell
Labs como Alfred Aho, Elliot Pinson, Jerey Ullman y
Harold S. Stone.

vea di con la habilidad natural para crear rdenes de


edicin tiles. Estas rdenes de edicin, cuando se grababan en un archivo, podan, junto con el archivo original, ser reconstituidas completamente por ed en el archivo modicado. Esto reduca enormemente el necesario
almacenamiento secundario para mantener las distintas
versiones de un archivo. McIlroy consider escribir un
post-procesador para di donde una variedad de formatos de resultados pudiesen ser diseados e implementados, pero encontr que era ms frugal y sencillo hacer
que di fuese el responsable de generar la sintaxis y la informacin de entrada de orden contrario aceptada por el
comando ed. En 1985, Larry Wall compuso una utilidad
separada, patch, que generaliz y extendi la habilidad
para modicar archivos con resultado di. Los modos de
Emacs permiten tambin convertir el formato de patches
e incluso editar patches interactivamente.
En los primeros aos de di, los usos habituales eran la
comparacin de cambios en la fuente del cdigo del software y el marcado de documentos tcnicos, la vericacin de la salida de errores de programa, la comparacin
de listados de sistemas de archivos y el anlisis del cdigo del montaje del ordenador. La salida apuntada por ed
fue modicada para proporcionar compresin a una secuencia de modicaciones hecha a un archivo. La Source
Code Control System (SCCS) y su habilidad para archivar revisiones apareci a nales de los aos setenta como
consecuencia de almacenar rdenes de edicin de di.
El Project Xanadu es un predecesor conceptual de di.
Era un proyecto de hipertexto concebido por primera vez
en 1960 que deba incluir una versin de un sistema de seguimiento necesario para su caracterstica detranspointing windows. La caracterstica subsuma las diferencias
de archivos en el trmino expansivo "transclusin", en el
que un documento inclua en l partes de otros documentos o revisiones.

60.2 Algoritmo
La operacin de di se basa en resolver el problema
Problema de Subsecuencia Comn mas Larga (LCS).

En el contexto de Unix, el uso del editor de lnea ed pro- En el problema LCS, se tienen dos secuencias de tems:
115

116
abcdfghjqzabcdefgijkrxyz

CAPTULO 60. DIFF

60.4 Variantes

y se desea encontrar la secuencia ms larga de tems que


se presenta las dos secuencias originales en el mismo orden. Esto es, se quiere encontrar una nueva secuencia que
pueda obtenerse de la primera secuencia eliminando algunos tems, y de la segunda secuencia eliminando otros
tems. Se quiere tambin que esta secuencia sea tan larga
como sea posible. En este caso es:

La mayora de las implementaciones de di se han mantenido aparentemente sin cambios desde 1975. Las modicaciones consisten en mejoras en el algoritmo base,
la adicin de caractersticas tiles al comando y el diseo de un nuevos formatos de salida. El algoritmo bsico
se describe en el artculo An O(ND) Dierence Algorithm
and its Variations de Eugene W. Myers* [4] y en A File
abcdfgjz
Comparison Program de Webb Miller and Myers.* [5] El
De la subsecuencia comn ms larga solo hay un pequeo algoritmo fue descubierto independientemente y descripaso para conseguir un resultado del tipo de di:
to en Algorithms for Approximate String Matching, de E.
Ukkonen.* [6] Las primeras ediciones del programa di
ehiqkrxy+-+-++++
fueron diseadas para la comparacin de lneas de archivos de texto dejando que el carcter newline delimitase
las lneas. En los aos ochenta, la ayuda para los archivos
binarios dio lugar a un cambio en el diseo y la implementacin de la aplicacin.

60.3 Uso
Es invocado desde la lnea de comando con los nombres
de dos archivos: di original new. El resultado del comando representa los cambios requeridos para hacer que
el archivo original se convierta en el nuevo archivo.

60.4.1 Edit script


Un edit script puede generarse por medio de versiones
modernas de di con la opcin -e. option. El edit script
resultante para el ejemplo anterior es el siguiente:

24a Este prrafo contiene importantes nuevas adiciones


a este documento. . 17c detenidamente este documento.
Si original y nuevo son directorios, entonces di se ejecu- Por . 8,14c comprimir nada. . 0a Esta es una importante
tar sobre cada archivo que exista en ambos directorios. noticia! Debera por lo tanto ser situada al comienzo de
Una opcin, -r, har que cualesquiera subdirectorios em- este documento! .
parejados comparen archivos entre directorios.
Todos los ejemplos en el artculo usan los archivos original y nuevo:
El comando di original nuevo produce el siguiente resultado di normal:
0a1,6 > Esta es una importante > noticia. Debera > por
lo tanto situarse al > comienzo de este > documento! >
8,14c14 < comprimir el tamao de los < cambios. < <
Este prrafo contiene < texto que est anticuado. < Ser
borrado en < breve. --- > comprimir nada. 17c17 < deternidamente este documento. Por --- > detenidamente
este documento. Por 24a25,28 > > Este prrafo contiene
> importantes nuevas adiciones > a este documento.

En este formato de salida tradicional, a sustituye a aadido, d a borrado (deleted) y c a cambiado. Los nmeros
de lnea del archivo original aparecen antes de a/d/c y los
del archivo modicado despus. Los parntesis angulares
aparecen al comienzo de las lneas que son aadidas, borradas o cambiadas. Las lneas aadidas se incluyen en el
archivo original para aparecer en el archivo nuevo. Las
lneas borradas se eliminan del archivo original para ser
borradas en el archivo nuevo.
Por defecto, las lneas comunes a los dos archivos no se
muestran. Las lneas que se han movido se muestran como aadidas en su nuevo lugar y como borradas en su
antiguo lugar.* [3]

60.5 Referencias
[1] MacKenzie et al. Binary Files and Forcing Text Comparisonin Comparing and Merging Files with GNU Di
and Patch. Descargado el 28 de abril de 2007.
[2] James W. Hunt and M. Douglas McIlroy (June 1976).
An Algorithm for Dierential File Comparison. Computing Science Technical Report, Bell Laboratories 41.
[3] David MacKenzie, Paul Eggert, and Richard Stallman
(1997). Comparing and Merging Files with GNU Di and
Patch. ISBN 0-9541617-5-0.
[4] E. Myers (1986). An O(ND) Dierence Algorithm and
Its Variations. Algorithmica 1 (2): 251266.
[5] Webb Miller and Eugene W. Myers (1985). A File Comparison Program. Software Practice and Experience 15
(11): 10251040. doi:10.1002/spe.4380151102.
[6] E. Ukkonen (1985). Algorithms for Approximate
String Matching. Information and Control 64: 100118.
doi:10.1016/S0019-9958(85)80046-2.

60.6 Vase tambin


Distancia de Levenshtein

60.7. ENLACES EXTERNOS

60.7 Enlaces externos


Sitio ocial (en ingls)

117

Captulo 61

Direccin de retorno
Direccin de retorno es un trmino de programacin
informtica con el que se reere a un dato almacenado
dentro de la pila, dato que le indica al programa en qu
lnea situarse luego de nalizar una funcin.

118

Captulo 62

Diseo estructurado
En programacin y diseo de algoritmos, el diseo estructurado persigue elaborar algoritmos que cumplan la
propiedad de modularidad, para ello, dado un problema
que se pretende resolver mediante la elaboracin de un
programa de ordenador, se busca dividir dicho programa
en mdulos siguiendo los principios de diseo de Descomposicin por renamientos sucesivos, creacin de
una Jerarqua modular y elaboracin de mdulos Independientes.

Ciencias de la Computacin Niklaus Wirth, que consiste precisamente en volver a aplicar el estudio descendente
Top-Down a cada subproblema una y otra vez hasta obtener subproblemas sucientemente pequeos, que puedan
ser resueltos por mdulos que cumplan, en la medida de
lo posible, las caractersticas deseables en un mdulo en
el mbito de la programacin. En palabras del propio Niklaus Wirth:
En cada paso (del renamiento), una o varias instrucciones del programa dado, se descomponen en
instrucciones ms detalladas. Esta descomposicin
sucesiva o renamiento de especicaciones termina
cuanto todas las instrucciones estn expresadas en
trminos de la computadora usada o del lenguaje de
programacin...

62.1 Etapas del Diseo estructurado


62.1.1

Descomposicin

Conforme se renan las tareas, tambin los datos


pueden ser renados, descompuestos o estructurados, siendo lo natural renar las especicaciones del
programa y de los datos en paralelo.

Para ello se requiere un adecuado anlisis de dicho problema, siendo necesario denir primeramente el problema, para lo cual deber de contener una detallada pero
concisa descripcin del mismo, un problema bien denido es aquel que lleva implcitas tanto una situacin inicial
como nal claras

Cada paso de renamiento implica algunas decisiones de diseo. Es importante que el programador sea
consciente de los criterios subyacentes (en las decisiones de diseo adoptadas) y de la existencia de
soluciones alternativas...

Por qu descomponer un problema en partes? Experimentalmente est comprobado que:

Un problema complejo cuesta ms de resolver que


Problema del renamiento sucesivo
otro ms sencillo (de Perogrullo).
La complejidad de un problema global es mayor que Cundo parar el renamiento?. Un renamiento excesiel valor de las complejidades de cada una de sus par- vo podra dar lugar a un nmero tan grande de mdulos
que hara poco prctica la descomposicin. Se tendrn en
tes por separado.
cuenta estos criterios para dejar de descomponer:
Segn esto, merece la pena el esfuerzo de dividir un problema grande en subproblemas ms pequeos. Si el objetivo es elaborar un programa para resolver dicho problema grande, cada subproblema (menos complejo) podr
ser resuelto por un mdulo (subalgoritmo) relativamente fcil de implementar (ms que el programa global No
dividido). Ahora la cuestin es cmo realizar la descomposicin?; realizando un estudio descendente Top-Down
que nos lleve desde la concepcin del problema (programa o algoritmo) global hasta identicar sus partes (mdulos). Esta tcnica se repite aplicando una estrategia llamada de renamiento sucesivo propuesta por el experto en

Cuando no haya tareas bien denidas.


Cuando la interfaz de un mdulo sea tan complicada
como el propio mdulo

62.1.2 Jerarqua de mdulos


sta es una consecuencia directa de la descomposicin
del problema mediante renamientos sucesivos, el resultado ser un conjunto de mdulos estraticados en capas a modo de pirmide donde en la cima habr un nico

119

120

CAPTULO 62. DISEO ESTRUCTURADO

mdulo que representar al programa global y en los niveles inferiores aparecern los mdulos resultantes de las
sucesivas divisiones.
Al nal, debe obtenerse una estructura piramidal donde
los mdulos de los niveles superiores se encargan de las
tareas de coordinacin, lgica de la aplicacin y manipulacin de los mdulos inferiores; estos otros debern
realizar tareas de clculo, tratamiento y entrada/salida de
informacin.

62.1.3

Independencia

Acoplamiento Comn.- Dos mdulos acceden a un


mismo recurso comn, tpicamente memoria compartida, una variable global o un chero. Una variante de este tipo de acoplamiento es el acoplamiento
externo:
Acoplamiento externo.- Los mdulos estn
ligados a componentes externos. Por ejemplo,
dispositivos de E/S, protocolos de comunicaciones... etc.
Acoplamiento de contenido.- Ocurre cuando un
mdulo necesita acceder a una parte de otro mdulo.

Ver 'Independencia en Caractersticas de un mdulo.

62.2.2 Cohesin
Se dene como la medida de fuerza o relacin funcional existente entre las sentencias o grupos de sentencias de un mismo mdulo. Un mdulo cohesionado
Para evaluar o determinar cmo es de bueno un diseo ejecutar una nica tarea sencilla interactuando muy poco
estructurado se utilizan los conceptos de acoplamiento o nada con el resto de mdulos del programa. Se persigue
y cohesin; stos estn muy relacionados entre s, tanto que los mdulos tengan una alta cohesin.
que difcilmente se puede variar uno sin que eso afecte
al otro. Tambin cabe decir que estos conceptos no son En el diseo estructurado podemos encontrarnos con los
medidas que se puedan cuanticar numricamente, son siguientes 7 tipos de cohesin (de la mejor o ms deseable
ms bien magnitudes cualitativas. Tambin se tienen en a la menos recomendable):
consideracin los conceptos de fan-in y fan-out.
Cohesin funcional: Los elementos del mdulo estn relacionados en el desarrollo de una nica fun62.2.1 Acoplamiento
cin.

62.2 Evaluando el diseo

Se dene como el grado de interdependencia que hay


entre los distintos mdulos de un programa; lo deseable es que esta interdependencia sea lo menor posible, es
decir, un bajo acoplamiento. Los niveles de acoplamiento, ordenados de menor (ms deseable) a mayor (menos
deseable) son:
Acoplamiento normal.- Un mdulo llama a otro de
un nivel inferior y tan solo intercambian datos (parmetros de entrada/salida). Dentro de este tipo de
acoplamiento podemos encontrarnos 3 subtipos, dependiendo de los datos que intercambien los mdulos:
Acoplamiento de datos: Los mdulos se comunican mediante parmetros.
Acoplamiento de marca o por estampado: Los
mdulos se pasan datos con estructura de registro. No es muy deseable si el mdulo receptor slo requiere parte de los datos que se le
pasan.
Acoplamiento de control: Los datos que se intercambian entre los mdulos son controles.
Debido a que en este subtipo un mdulo controla la ejecucin del otro, no es un buen acoplamiento, ya que impide que sean totalmente
independientes.

Cohesin secuencial: Un mdulo realiza distintas


tareas en secuencia, de forma que las entradas de
cada tarea son las salidas de la tarea anterior. No es
una mala cohesin si las tareas implicadas no son
muy complejas y requieren pocas lneas de cdigo.
Cohesin comunicacional: El mdulo realiza actividades paralelas usando los mismos datos de entrada y salida. Como en el caso anterior, tampoco
se trata de un mal tipo de cohesin si las tareas son
relativamente sencillas.
Cohesin procedimental: El mdulo tiene una serie de funciones relacionadas por un procedimiento
efectuado por el cdigo (a modo de biblioteca). Es
similar a la secuencial, pero puede incluir el paso de
controles. Ser deseable que las funciones estn relacionadas o realicen tareas dentro del mismo mbito
(p.e. la biblioteca string.h de C contienen funciones
para operar con cadenas de caracteres).
Cohesin temporal: Los elementos del mdulo estn implicados en actividades relacionadas con el
tiempo.
Cohesin lgica: Las actividades que realiza el mdulo tienen la misma categora. Esto es, es como si
se tuvieran partes independientes dentro del mismo
mdulo.

62.3. VASE TAMBIN


Cohesin casual o coincidente: Los elementos del
mdulo contribuyen a las actividades relacionndose
mutuamente de una manera poco signicativa. Este
tipo de cohesin viola el principio de independencia
y de caja negra de los mdulos.

62.2.3

Fan-In y Fan-Out

Adems de los dos conceptos anteriores, se deben tener en


cuenta el grado de absorcin (fan-in) y la diseminacin
del control (fan-out) de los mdulos para garantizar la
calidad del diseo.
Fan-In: Tambin llamado grado de absorcin. Es
el nmero de superordinados inmediatos que tiene
el mdulo en cuestin. Es conveniente maximizar el
fan-in durante el proceso de diseo, ya que cada instancia de fan-in mltiple indica que se ha evitado la
duplicacin de cdigo.
Fan-Out: Tambin llamado diseminacin del control. Es el nmero de subordinados inmediatos que
tiene el mdulo en cuestin. Conviene no tener un
fan-out ni muy alto ni muy bajo, ya que eso es un
posible indicador de un diseo pobre. Si no es posible evitarlo, es preferible un fan-out bajo antes que
uno alto.

62.3 Vase tambin


Diseo orientado a objetos
Programacin estructurada
Programacin modular
Dinmica de sistemas
Sistema complejo
Sistema dinmico
Encapsulamiento (programacin orientada a objetos)
Abstraccin (programacin orientada a objetos)

121

Captulo 63

Distancia de Damerau-Levenshtein
En la teora de la informacin y en la ciencia de computadores, se llama distancia de Damerau-Levenshtein o
distancia de edicin al nmero mnimo de operaciones
requeridas para transformar una cadena de caracteres en
otra. Se entiende por operacin, bien una insercin, eliminacin, sustitucin o transposicin de dos caracteres.
Lo que la distingue de la distancia de Levenshtein es que
esta ltima cuenta como una sola operacin de edicin a
cualquiera de las tres primeras, pero cuenta la transposicin como dos operaciones de edicin.

63.1 Vase tambin


Ispell

63.2 Enlaces externos


Implementacin en C++ de la distancia de
Damerau-Levenshtein como UDF para MySQL

63.3 Referencias

122

Captulo 64

Distancia de Levenshtein
La distancia de Levenshtein, distancia de edicin o
distancia entre palabras es el nmero mnimo de operaciones requeridas para transformar una cadena de caracteres en otra, se usa ampliamente en teora de la informacin y ciencias de la computacin. Se entiende por
operacin, bien una insercin, eliminacin o la sustitucin de un carcter. Esta distancia recibe ese nombre en
honor al cientco ruso Vladimir Levenshtein, quien se
ocup de esta distancia en 1965. Es til en programas que
determinan cun similares son dos cadenas de caracteres,
como es el caso de los correctores de ortografa.

lenStr2+1 columns declare int d[0..lenStr1, 0..lenStr2]


// i and j are used to iterate over str1 and str2 declare int
i, j, cost for i from 0 to lenStr1 d[i, 0] := i for j from 0
to lenStr2 d[0, j] := j for i from 1 to lenStr1 for j from
1 to lenStr2 if str1[i] = str2[j] then cost := 0 else cost :=
1 d[i, j] := minimum( d[i-1, j] + 1, // deletion d[i, j-1]
+ 1, // insertion d[i-1, j-1] + cost // substitution ) return
d[lenStr1, lenStr2]

El invariante mantenido a travs del algortmo es que pueda transformar el segmento inicial str1[1..i] en str2[1..j]
empleando un mnimo de d[i,j] operaciones. Al nal, el
Por ejemplo, la distancia de Levenshtein entre casay elemento ubicado en la parte INFERIOR derecha de la
callees de 3 porque se necesitan al menos tres ediciones matriz contiene la respuesta.
elementales para cambiar uno en el otro.
1. casa cala (sustitucin de 's' por 'l')

64.2 Implementacin

2. cala calla (insercin de 'l' entre 'l' y 'a')


A continuacin se puede ver la implementacin de la funcin para varios lenguajes de programacin. Otros lenSe le considera una generalizacin de la distancia de guajes de ms alto nvel, como php o la funciones de
Hamming, que se usa para cadenas de la misma longitud usuario de MySQL, las incorporan ya, sin necesidad de
y que solo considera como operacin la sustitucin. Hay implementarla para ser usada.
otras generalizaciones de la distancia de Levenshtein, como la distancia de Damerau-Levenshtein, que consideran
el intercambio de dos caracteres como una operacin.
64.2.1 C
3. calla calle (sustitucin de 'a' por 'e')

Como buenadistancia, cumple (aunque es complicado


int
Levenshtein(char
*s1,char
*s2)
{
int
demostrarlo formalmente), que:
t1,t2,i,j,*m,costo,res,ancho; // Calcula tamanios
Dist(A,B) == Dist(B,A)
strings t1=strlen(s1); t2=strlen(s2); // Verica
que exista algo que comparar if (t1==0) reDist(A,B) + Dist(B,C) >= Dist(A,C)
turn(t2); if (t2==0) return(t1); ancho=t1+1; // Reserva matriz con malloc m[i,j] = m[j*ancho+i]
!!
m=(int*)malloc(sizeof(int)*(t1+1)*(t2+1));
if
64.1 El algoritmo
(m==NULL) return(1); // ERROR!! // Rellena primera la y primera columna for (i=0;i<=t1;i++) m[i]=i;
Se trata de un algoritmo de tipo bottom-up, comn en for (j=0;j<=t2;j++) m[j*ancho]=j; // Recorremos resto
programacin dinmica. Se apoya en el uso de una ma- de la matriz llenando pesos for (i=1;i<=t1;i++) for
triz (n + 1) (m + 1), donde n y m son las longitudes de (j=1;j<=t2;j++) { if (s1[i-1]==s2[j-1]) costo=0; else
las cadenas. Aqu se indica el algoritmo en pseudocdigo costo=1; m[j*ancho+i]=Minimo(Minimo(m[j*ancho+ipara una funcin LevenshteinDistance que toma dos ca- 1]+1, // Eliminacion m[(j-1)*ancho+i]+1), // Insercion
denas, str1 de longitud lenStr1, y str2 de longitud lenStr2, m[(j-1)*ancho+i-1]+costo); } // Sustitucion // Devoly calcula la distancia Levenshtein entre ellos:
vemos esquina nal de la matriz res=m[t2*ancho+t1];
int LevenshteinDistance(char str1[1..lenStr1], char free(m); return(res); }
str2[1..lenStr2]) // d is a table with lenStr1+1 rows and
123

124

64.2.2

CAPTULO 64. DISTANCIA DE LEVENSHTEIN

C++

#include <string> #include <vector> #include <algorithm> using namespace std; int levenshtein(const string
&s1, const string &s2) { int N1 = s1.size(); int N2 =
s2.size(); int i, j; vector<int> T(N2+1); for ( i = 0; i <=
N2; i++ ) T[i] = i; for ( i = 0; i < N1; i++ ) { T[0] = i+1;
int corner = i; for ( j = 0; j < N2; j++ ) { int upper =
T[j+1]; if ( s1[i] == s2[j] ) T[j+1] = corner; else T[j+1]
= min(T[j], min(upper, corner)) + 1; corner = upper; } }
return T[N2]; }

64.2.5 Perl

sub fastdistance { my $word1 = shift; my $word2 = shift;


return 0 if $word1 eq $word2; my @d; my $len1 = length
$word1; my $len2 = length $word2; $d[0][0] = 0; for
(1.. $len1) { $d[$_][0] = $_; return $_ if $_!=$len1
&& substr($word1,$_) eq substr($word2,$_); } for (1..
$len2) { $d[0][$_] = $_; return $_ if $_!=$len2 &&
substr($word1,$_) eq substr($word2,$_); } for my $i
(1.. $len1) { my $w1 = substr($word1,$i-1,1); for (1..
$len2) { $d[$i][$_] = _min($d[$i-1][$_]+1, $d[$i][$_1]+1, $d[$i-1][$_-1]+($w1 eq substr($word2,$_-1,1) ? 0
64.2.3 C#
: 1)); } } return $d[$len1][$len2]; } sub _min { return
public int LevenshteinDistance(string s, string t, out $_[0] < $_[1] ? $_[0] < $_[2] ? $_[0] : $_[2] : $_[1] <
double porcentaje) { porcentaje = 0; // d es una tabla $_[2] ? $_[1] : $_[2]; }
con m+1 renglones y n+1 columnas int costo = 0; int m
= s.Length; int n = t.Length; int[,] d = new int[m + 1, n
+ 1]; // Verica que exista algo que comparar if (n == 64.2.6 Python
0) return m; if (m == 0) return n; // Llena la primera
columna y la primera la. for (int i = 0; i <= m; d[i, 0] = def distance(str1, str2): d=dict() for i in rani++) ; for (int j = 0; j <= n; d[0, j] = j++) ; /// recorre la ge(len(str1)+1): d[i]=dict() d[i][0]=i for i in ranmatriz llenando cada unos de los pesos. /// i columnas, ge(len(str2)+1): d[0][i] = i for i in range(1, len(str1)+1):
j renglones for (int i = 1; i <= m; i++) { // recorre for j in range(1, len(str2)+1): d[i][j] = min(d[i][j-1]+1,
para j for (int j = 1; j <= n; j++) { /// si son iguales en d[i-1][j]+1, d[i-1][j-1]+(not str1[i-1] == str2[j-1]))
posiciones equidistantes el peso es 0 /// de lo contrario el return d[len(str1)][len(str2)]
peso suma a uno. costo = (s[i - 1] == t[j - 1]) ? 0 : 1; d[i,
j] = System.Math.Min(System.Math.Min(d[i - 1, j] + 1,
//Eliminacion d[i, j - 1] + 1), //Inserccion d[i - 1, j - 1] 64.2.7 Ruby
+ costo); //Sustitucion } } /// Calculamos el porcentaje
de cambios en la palabra. if (s.Length > t.Length) class String def levenshtein(other) other = other.to_s disporcentaje = ((double)d[m, n] / (double)s.Length); tance = Array.new(self.size + 1, 0) (0..self.size).each do
else porcentaje = ((double)d[m, n] / (double)t.Length); |i| distance[i] = Array.new(other.size + 1) distance[i][0]
= i end (0..other.size).each do |j| distance[0][j] = j end
return d[m, n]; }
(1..self.size).each do |i| (1..other.size).each do |j| distance[i][j] = [distance[i - 1][j] + 1, distance[i][j - 1] + 1,
distance[i - 1][j - 1] + ((self[i - 1] == other[j - 1]) ? 0
: 1)].min end end distance[self.size][other.size] end end
64.2.4 Java
puts casa.levenshtein calle#=> 3
Implementado como una clase esttica.
public class LevenshteinDistance { private static int
minimum(int a, int b, int c) { if(a<=b && a<=c) { return
a; } if(b<=a && b<=c) { return b; } return c; } public static int computeLevenshteinDistance(String
str1, String str2) { return computeLevenshteinDistance(str1.toCharArray(),
str2.toCharArray());
} private static int computeLevenshteinDistance(char [] str1, char [] str2) { int [][]distance
= new int[str1.length+1][str2.length+1]; for(int
i=0;i<=str1.length;i++) { distance[i][0]=i; } for(int
j=0;j<=str2.length;j++) { distance[0][j]=j; } for(int
i=1;i<=str1.length;i++) { for(int j=1;j<=str2.length;j++)
{ distance[i][j]= minimum(distance[i-1][j]+1, distance[i][j-1]+1, distance[i-1][j-1]+ ((str1[i-1]==str2[j1])?0:1)); } } return distance[str1.length][str2.length]; }
}

64.2.8 PHP
<?php $lev = levenshtein($input, $word); ?>

64.2.9 Delphi
function LevenshteinDistance(Str1, Str2: String): Integer; var d : array of array of Integer; Len1, Len2
: Integer; i,j,cost:Integer; begin Len1:=Length(Str1);
Len2:=Length(Str2); SetLength(d,Len1+1); for i :=
Low(d) to High(d) do SetLength(d[i],Len2+1); for i := 0
to Len1 do d[i,0]:=i; for j := 0 to Len2 do d[0,j]:=j; for i:=
1 to Len1 do for j:= 1 to Len2 do begin if Str1[i]=Str2[j]
then cost:=0 else cost:=1; d[i,j]:= Min(d[i-1, j] + 1, //

64.3. APLICACIONES

125

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] = Math.min(Math.min(r, s), t); } }
return(d[l2 * a + l1]); }

64.2.10

VB.NET

Public Function Levenshtein(ByVal s1 As String, ByVal


s2 As String) As Integer Dim coste As Integer = 0
Dim n1 As Integer = s1.Length Dim n2 As Integer =
s2.Length Dim m As Integer(,) = New Integer(n1, n2)
{} For i As Integer = 0 To n1 m(i, 0) = i Next For i As
Integer = 1 To n2 m(0, i) = i Next For i1 As Integer = 1
To n1 For i2 As Integer = 1 To n2 coste = If((s1(i1 - 1) =
s2(i2 - 1)), 0, 1) m(i1, i2) = Math.Min(Math.Min(m(i1
- 1, i2) + 1, m(i1, i2 - 1) + 1), m(i1 - 1, i2 - 1) + coste)
Next Next Return m(n1, n2) End Function

64.2.11

ActionScript 3.0

public class StringUtils { public static function


levenshtein(s1:String, s2:String):int { if (s1.length
== 0 || s2.length == 0) return 0; var m:uint = s1.length
+ 1; var n:uint = s2.length + 1; var i:uint, j:uint,
cost:uint; var d:Vector.<Vector.<int>> = new Vector.<Vector.<int>>(); for (i = 0; i < m; i++) { d[i] =
new Vector.<int>(); for (j = 0; j < n; j++) d[i][j] = 0;
} 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 <
n; j++) { cost = (s1.charAt(i - 1) == s2.charAt(j - 1)) ?
0 : 1; d[i][j] = Math.min(Math.min(d[i - 1][j] + 1, d[i][j
- 1] + 1), d[i - 1][j - 1] + cost); } } return d[m-1][n-1]; } }

64.3 Aplicaciones
El proyecto ASJP usa la distancia de Levenshtein
total en una lista de palabras en diferentes lenguas
del mundo, para medir la similaridado cercanade las mismas, esa distancia calculada puede
emplearse para proponer una clasicacin logentica tentativa de las lenguas del mundo.* [1]
La distancia de Damerau-Levenshtein es una generalizacin de la distancia de Levenshtein usada
por los correctores ortogrcos y en la deteccin de
fraudes en listas de datos.

64.4 Vase tambin


Distancia de Damerau-Levenshtein
Algoritmo Needleman-Wunsch
Algoritmo Smith-Waterman
Algoritmo Bitap
Autmata de Levenshtein
Espacio mtrico
Agrep

64.2.12 ColdFusion
<cfscript> function levDistance(s,t) { var d = ArrayNew(2); var i = 1; var j = 1; var s_i = A"; var t_j =
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
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,j1,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[i1][j-1] + cost); } } return d[n][m]; } </cfscript>

64.2.13

JavaScript (NodeJS)

function levenshtein(s1, s2) { var l1 = s1.length; var l2


= s2.length; var d = []; var c = 0; var a = 0; if(l1 == 0)
return l2; if(l2 == 0) return l1; var d = new Buer((l1
+ 1) * (l2 + 1)); a = l1 + 1; for(var i = 0; i <= l1; d[i] =
i++); for(var j = 0; j <= l2; d[j * a] = j++); for(var i = 1;
i <= l1; i++) { for(var j = 1; j <= l2; j++) { if(s1[i - 1]

Ratcli/Obershelp
Dynamic time warping
Distancia de Jaro-Winkler

64.5 Referencias
[1] ASJP - World Language Tree

Captulo 65

DLO
La expresin DLO (Document Like Object) est ampliamente reconocida en la literatura sobre metadatos para
aludir a los documentos de Internet (texto, imagen, audio, video, etc.) y se utiliza para referirse a una unidad
documental o al documento digital mnimo, que forma parte de una coleccin digital, al cual se le aplican
metadatos para su descripcin y recuperacin.
El acrnimo DLO surge en el desarrollo de metadatos
del Dublin Core, concretamente en el primer taller que
se llev a cabo en Ohio (Estados Unidos), donde empez a utilizarse para diferenciar nociones individuales que
constituyen un objeto discreto, digno de una descripcin
individual a travs de metadatos.
En el tercer taller que se realiz se ampli su signicado
para referirse a cualquier recurso de informacin especco que se caracterizase por ser estable (es decir,
que tena un contenido idntico para cada usuario).

65.1 Enlaces externos


Glosario web y proyecto de investigacin de efectividad
de metadatos
Pgina ocial de Dublin Core

126

Captulo 66

Driver Chain Manager


Driver Chain Manager (DCM) es una tecnologa de 66.1.2 Capacidades de DCM
Microsoft que facilita instalar y trabajar con mltiples
1. Cuando mltiples drivers estn instalados y solo se
tecnologas de asistencia que utilizan la interfaz del driest ejecutando uno, los dems no interferirn en sver de la pantalla (Display Driver Interface o DDI) en un
ta independientemente de su posicin.
mismo equipo.
DCM permite a un programa tener conocimiento de la
existencia de las otras aplicaciones de asistencia. Permite evitar que se produzcan problemas entre ellas., como
fallos, mal funcionamiento, que se corrompan o incluso
que no funcionen.

2. Un usuario puede instalar o desinstalar un driver en


cualquier momento sin afectar a los dems.

La tecnologa DCM viene instalada en Windows. La


biblioteca se actualiza cuando se actualizan las ayudas.
Un programador puede utilizar DCM en sus aplicaciones
programando desde Microsoft Visual Studio empleando
la biblioteca MSDN.

4. Todos los drivers de la cadena usarn el mismo cdigo de escape para controlar la comunicacin entre
los usuarios y los controladores.

3. Existen aplicaciones de control remoto que tambin


se basan en este encadenamiento.

5. En caso de que se cambie el adaptador de la pantalla


se detectar si el ajuste de la cadena puede llevarse
a cabo.
6. Los drivers instalados no interferirn con los nuevos.

66.1 Qu hace?
DCM es un conjunto de rutinas de la biblioteca MSDN
usada por la tecnologa de asistencia de Windows. Permite la instalacin, desinstalacin y mantenimiento de interceptadores del driver grco.

66.1.3 Cuestiones fuera del alcance de


DCM
1. DCM no garantiza que 2 drivers se puedan ejecutar al mismo tiempo. Esto queda en manos de los
desarrolladores de stos.

Las aplicaciones de asistencia utilizan stas rutinas para


saber en que posicin de la cadena de drivers deben colocar el suyo, de manera que no intereran con las dems
aplicaciones y stas con ella

66.1.1

2. Para los vendedores que soportan DCM, Los drivers instalados pueden permanecer despus de los
que usan DCM. Sin embargo DCM no tendr conocimiento de ellos.
3. Puede haber otros driver que no usen DCM, pero
DCM no tendr conocimiento de ellos.

Objetivos

4. DCM no soporta usuarios con mltiples monitores.

1. Proporcionar suciente informacin sobre los objetos en la pantalla.

66.2 Sotrware que utiliza DCM


2. Asegurarse de que otras aplicaciones de asistencia
instaladas en el sistema no intereran con las que ya
66.2.1
se estn ejecutando.

Aplicaciones que utilizan DCM

Las siguientes aplicaciones ya utilizan esta tecnologa.


3. Asegurarse de que varias aplicaciones de asistencia
pueden ejecutarse simultneamente.
127

Dolphin Computer Access:

128

CAPTULO 66. DRIVER CHAIN MANAGER


Hal 5.20 y superior,
Lunar 5.20 y superior,
Lunar Plus 5.20 y superior,
Supernova 5.20 y superior.

Freedom Scientic:
JAWS 4.51 y superior,
Magic 8.1 y superior.
GW Micro:
Window-Eyes 4.21 y superior.
Ai Squared:

haya eliminado la informacin que el segundo necesita,


imposibilitando su funcionamiento.
Actualmente no existe ninguna regla que diga en que orden se ejecutan los controladores, eso sin tener en cuenta
que puede haber ms de un lector o magnicador instalados en la misma mquina. En caso de haber 2 magnicadores surgira el problema de cual magnca la pantalla o
si se ampla 2 veces consecutivas (ampliacin de la ampliacin).
Adems las dos aplicaciones no tienen conocimiento una
de la otra, por lo que no pueden solucionar el problema.
El problema se agrava si son software de diferentes compaas.

Otro problema se crea al desinstalar uno de los drivers,


ZoomText 7,11 con el programa de utilidad pudindose producir que se rompa la cadena y por ello
que se pierda el controlador nal.
del driver.
ZoomText 8.0 o superior (DCM built-in).

66.3.2 Forma de solucionarlo


66.2.2

Empresas desarrolladoras

66.2.3

Sistemas operativos que soportan 66.4


DCM

DCM aporta a los desarrolladores de estas aplicaciones


DCM es el resultado de un esfuerzo comn de Microsoft una aplicacin llamadaDCMUtilque les permite may de las empresas asociadas Ai Squared, Dolphin Com- nejar el orden de los drivers y ajustarlos para un correcto
funcionamiento.
puter Access, GW Micro, y Freedom Scientic.

DCM 1.0 es compatible con Windows NT versin 4,


Windows 2000 y Windows XP.

66.3 Funcionamiento de la cadena


de drivers

Otras aplicaciones que utilizan DCM

Existen otras aplicaciones, de distintas tipologas, 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.5 Vase tambin


El sistema operativo Windows permite instalar una cadena de drivers para la generacin de la imagen de la pantalla. El primer driver obtendr la informacin de las aplicaciones y se la pasar al siguiente driver y as sucesivamente con el resto de los drivers, esta cadena acabar en
el driver de la tarjeta grca. Al colocar otros drivers lo
que se pretende es capturar y/o modicar la informacin.
Por ejemplo, un lector de pantalla no modicar la informacin que reciba, pero capturar los datos necesarios
que requiera para poder leer por el altavoz. Por el contrario un magnicador de pantalla recortar un rectngulo
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 aleatorio. Algunas aplicaciones deben ejecutar sus rutinas antes que otras. Por ejemplo, si ejecutamos el magnicador
antes que un lector de pantalla, es posible que el primero

Tiotecnologa.
Windows.
MSDN.

66.6 Fuentes y referencias


1. biblioteca MSDN: DCM (en ingls).

Captulo 67

Dublin Core
Dublin Core es un modelo de metadatos elaborado y auspiciado por la DCMI (Dublin Core Metadata Initiative),
una organizacin dedicada a fomentar la adopcin extensa de los estndares interoperables de los metadatos y a
promover el desarrollo de los vocabularios especializados
de metadatos para describir recursos para permitir sistemas ms inteligentes el descubrimiento del recurso.

Elementos relacionados principalmente con el contenido del recurso.


Elementos relacionados principalmente con el recurso cuando es visto como una propiedad intelectual.

Elementos relacionados principalmente con la instanciacin del recurso.


Las implementaciones de Dublin Core usan generalmente
XML y se basan en el Resource Description Framework.
Dublin Core se dene por ISO en su norma ISO 15836 Dentro de cada clasicacin encontramos los siguientes
del ao 2003, y la norma NISO Z39.85-2007.
elementos:
El nombre viene por Dublin, Ohio, Estados Unidos, ciu- Contenido:
dad que en 1995 alberg la primera reunin a nivel mundial de muchos de los especialistas en metadatos y Web
Ttulo: el nombre dado a un recurso, habitualmente
de la poca.
por el autor.
Etiqueta: DC.Title

67.1 Descripcin general


Dublin Core es un sistema de 15 deniciones semnticas descriptivas que pretenden transmitir un signicado
semntico a las mismas.
Estas deniciones:
Son opcionales

Claves: los temas del recurso. Tpicamente, Subject


expresar las claves o frases que describen el ttulo o
el contenido del recurso. Se fomentar el uso de vocabularios controlados y de sistemas de clasicacin
formales.
Etiqueta: DC.Subject

Se pueden repetir
Pueden aparecer en cualquier orden
Este sistema de deniciones fue diseado especcamente para proporcionar un vocabulario de caractersticas
base, capaces de proporcionar la informacin descriptiva bsica sobre cualquier recurso, sin que importe el formato de origen, el rea de especializacin o el origen cultural.

67.2 Clasicacin y elementos

Descripcin: una descripcin textual del recurso.


Puede ser un resumen en el caso de un documento o una descripcin del contenido en el caso de un
documento visual.
Etiqueta: DC.Description
Fuente: secuencia de caracteres usados para identicar unvocamente un trabajo a partir del cual proviene el recurso actual.
Etiqueta: DC.Source

En general, podemos clasicar estos elementos en tres


grupos que indican la clase o el mbito de la informacin
que se guarda en ellos:
129

Tipo del Recurso: la categora del recurso. Por


ejemplo, pgina personal, romance, poema, diccionario, etc.

130

CAPTULO 67. DUBLIN CORE


Etiqueta: DC.Type

Relacin: es un identicador de un segundo recurso y su relacin con el recurso actual. Este elemento
permite enlazar los recursos relacionados y las descripciones de los recursos.
Etiqueta: DC.Relation
Cobertura: es la caracterstica de cobertura espacial y/o temporal del contenido intelectual del recurso.
La cobertura espacial se reere a una regin fsica, utilizando por ejemplo coordenadas.
La cobertura temporal se reere al contenido
del recurso, no a cundo fue creado (que ya lo
encontramos en el elemento Date).
Etiqueta: DC.Coverage
Propiedad Intelectual:
Autor o Creador: la persona u organizacin responsable de la creacin del contenido intelectual del
recurso. Por ejemplo, los autores en el caso de documentos escritos; artistas, fotgrafos e ilustradores
en el caso de recursos visuales.
Etiqueta: DC.Creator
Editor: la entidad responsable de hacer que el recurso se encuentre disponible en la red en su formato actual.

Fecha: una fecha en la cual el recurso se puso a disposicin del usuario en su forma actual. Esta fecha
no se tiene que confundir con la que pertenece al
elemento Coverage, que estara asociada con el recurso en la medida que el contenido intelectual est
de alguna manera relacionado con aquella fecha.
Etiqueta: DC.Date
Formato: es el formato de datos de un recurso, usado para identicar el software y, posiblemente, el
hardware que se necesitara para mostrar el recurso.
Etiqueta: DC.Format
Identicador del Recurso: secuencia de caracteres
utilizados para identicar unvocamente un recurso.
Ejemplos para recursos en lnea pueden ser URLs
y URNs. Para otros recursos pueden ser usados
otros formatos de identicadores, como por ejemplo ISBN (International Standard Book Number
).
Etiqueta: DC.Identier
Lengua: lengua/s del contenido intelectual del recurso.
Etiqueta: DC.Language

67.3 Usos

Cualquier persona puede utilizar los metadatos de Dublin


Core para describir los recursos de un sistema de inforEtiqueta: DC.Publisher
macin. Las pginas Web son uno de los tipos ms comunes de recursos que utilizan las descripciones de Dublin
Otros Colaboradores: una persona u organizacin Core.
que haya tenido una contribucin intelectual signicativa, pero que esta sea secundaria en comparacin Los metadatos de Dublin Core estn siendo utilizados cocon las de las personas u organizaciones especi- mo la base para los sistemas descriptivos para varios grucadas en el elemento Creator. (por ejemplo: editor, pos de inters como por ejemplo:
ilustrador y traductor).
Organizaciones educativas
Etiqueta: DC.Contributor
Bibliotecas
Derechos: son una referencia (por ejemplo, una
URL) para una nota sobre derechos de autor, para
un servicio de gestin de derechos o para un servicio
que dar informacin sobre trminos y condiciones
de acceso a un recurso.
Etiqueta: DC.Rights
Instanciacin:

Instituciones del gobierno.


Sector cientco de la investigacin.
Autores de pginas Web.
Negocios que requieren lugares ms investigables.
Corporaciones con sistemas de gerencia extensos en
conocimiento

67.5. ENLACES EXTERNOS

67.4 Ventajas
La simplicidad
La exibilidad
La independencia sintctica
La interoperabilidad semntica
Alto nivel de normalizacin formal
Crecimiento y evolucin del estndar a travs de una
institucin formal consorciada: la DCMI.
Consenso internacional
Modularidad de Metadatos en la Web
Arquitectura de Metadatos para la Web

67.5 Enlaces externos

Pgina web ocial (en ingls)


SEDIC
y documentos XML/RDF para Recuperacin

131

Captulo 68

eAthena
eAthena es emulador de cdigo abierto de Ragnarok Online. Est escrito en C, aunque se est trabajando en una
versin en C++ llamada eApp(eA++). eAthena soporta
Linux 32bit y 64bit y Win32/64, aunque se recomienda
el uso de Linux para su mejor desempeo y seguridad.
eAthena est bajo licencia GPL. eAthena posee 2 versiones, TXT y SQL. Como sus nombres lo dicen SQL trabaja con bases de datos MySQL mientras que txt trabaja
con archivos de texto. Se recomienda utilizar SQL para un mejor desempeo. Est actualizado segn el cliente
coreano de Ragnarok Online (kRO) ya que es el que tiene
las ltimas novedades de Ragnarok Online.
Muchos de los servidores Ragnarok Online son creados
sobre la base de eAthena ya que estos son muy modicables y no son el juego en si, es solo una emulacin a
diferencia de los servidores basados en el mismo cdigo de Ragnarok Online que son ilegales ya que violan los
Derechos de autor que impone Gravity Corp..
Algunos de los servidores ms populares funcionan bajo
eAthena, debido a ser normalmente gratuitos
Cabe resaltar que todo el material que se encuentra en la
parte del cliente, es el que se distribuye sin costo alguno
en los ociales y que Gravity Corp, solamente exime a
Gravity de toda responsabilidad por ello, incluido su servidor gratuito de prueba.

68.1 Enlaces externos


Foro ocial de eAthena
Foro ocial de Soporte en Espaol de eAthena
Repositorio SVN ocial de eAthena

132

Captulo 69

Efecto Hover
El efecto Hover consiste en la alteracin del aspecto de
un elemento de la interfaz grca* [1] cuando se sita
el puntero sobre el mismo, pero no se ha seleccionado
an.* [2]

69.1 Referencias
[1] Ejemplo de efecto Hover sobre un enlace.
[2] Blog de Andrs Nieto

69.2 Enlaces de inters


Efecto Hover segn W3C. (en ingls)
Programacin de efecto Hover en JavaScript.
Ms ejemplos de programacin.
Efecto Hover en Microsoft.
Efecto Hover en Developing Webs dot Net (en ingls)
Tutorial de Efecto Hover en Texto

133

Captulo 70

Emtp
EMTP es un programa de computadora destinado al an- sistema simulado.
lisis de circuitos elctricos, especialmente en rgimen
transitorio. El programa permite modelar matemticamente sistemas elctricos, mecnicos y de control, mo- 70.4 Distribucin de EMTP-ATP
nofsicos y polifsicos. Su nombre proviene del acrnimo
ingls ElectroMagnetic Transients Program.
El ATP se distribuye por medio de los grupos de usuarios
existentes en varias regiones del mundo. Cualquier persona puede solicitar los materiales del programa siempre
70.1 Historia
que est de acuerdo con la licencia y que sea aprobado
por el grupo de usuarios.
El programa EMTP fue desarrollado como contrapar- Algunos grupos de usuarios son:
te del Transient Network Analyzer (TNA, Analizador de
transitorios en redes) en los aos nales de la dcada de
Canadian/American EMTP User Group
1960 por Hermann W. Dommel. Aos ms tarde l cede European EMTP-ATP Users Group Assoc.
ra los derechos de autor sobre el programa a la Bonneville
(EEUG)
Power Administration (BPA) de los Estados Unidos.
Japanese ATP User Group (JAUG)
Latin American EMTP User Group (CAUE)

70.2 ATP

Argentinian EMTP User Group (CAUE)


El programa ATP, Alternative Transients Program surge
del ao 1984 cuando los Drs. W. Scott Meyer y Tsu-huei
Liu no aprobaron la comercializacin del EMTP por parte
de DCG (EMTP Development Coordination Group de la
BPA) y EPRI (Electric Power Research Institute). Los Drs.
Meyer y Liu empezaron el desarrollo del ATP como una
alternativa no comercializada del EMTP, pero basado en
una copia de ste colocada en el dominio pblico.

Australian EMTP User Group (AEUG)


Korean EMTP User Group
Republic of China EMTP User Group
Indian EMTP User Group
South African ATP User Group

Aunque el programa puede ser adquirido sin costo, ATP


no es del dominio pblico, se requiere una licencia antes 70.5 Enlaces externos
que los materiales puedan ser recibidos por el interesado. Los requerimientos para usar el ATP son honestidad
en su manejo y el compromiso de no participacin en la Pgina principal de EMTP-ATP con historia e informacomercializacin de EMTP o de otros programas de si- cin de contacto de los grupos de usuarios
mulacin de transitorios.* [1]
Grupo de usuarios de EMPT-ATP de Europa
En trminos generales, el programa es el mismo y suele
mencionarse como EMTP, ATP o bien EMTP-ATP.

70.3 Mtodo de solucin

SIMULACIN DE SISTEMAS ELCTRICOS


CON ATP-EMTP APLICACIONES

70.6 Referencias

El programa EMTP-ATP utiliza el mtodo de integracin


trapezoidal para resolver las ecuaciones diferenciales del
134

[1] Historia y licencia del programa ATP

Captulo 71

Enlace dinmico
Un enlace dinmico es aquel en el cual una biblioteca de
cdigo es enlazada cuando un determinado programa se
ejecuta (en oposicin a un enlace esttico, que se produce en tiempo de compilacin). La ventaja de este tipo de
enlace es que el programa es ms liviano, y que evita la
duplicacin de cdigo (por ejemplo, cuando dos programas requieren usar la misma biblioteca, se necesita slo
una copia de sta).
Las bibliotecas de enlace dinmico, o bibliotecas compartidas, suelen encontrarse en directorios especcos del
sistema operativo, de forma que, cada vez que un programa necesite usar alguna, el sistema operativo conozca el
lugar en el que se encuentra, para as poder enlazarla. Esto
ocasiona algunos problemas de dependencias, principalmente entre diferentes versiones de una misma biblioteca.
Muchos programas tienen procedimientos a los que no
llaman, salvo en circunstancias excepcionales. Haciendo
uso de bibliotecas de enlace dinmico, despus del ensamblaje, podemos enlazar cada procedimiento en el momento en que es llamado.

135

Captulo 72

Enlace esttico
Una biblioteca esttica es aquella que se enlaza en tiempo
de compilacin (en oposicin a una de enlace dinmico,
que se enlaza en tiempo de ejecucin). La ventaja de este
tipo de enlace es que hace que un programa no dependa
de ninguna biblioteca (puesto que las enlaz al compilar),
haciendo ms fcil su distribucin.
El enlazado permite al programador y al propio sistema
operativo dividir un programa en varios archivos llamados mdulos, que pueden ensamblarse por separado y enlazarse en una ocasin posterior, el enlace puede ser de
naturaleza esttica o dinmica. El enlace esttico da como
resultado, un archivo ejecutable con todos los smbolos y
mdulos respectivos incluidos en dicho archivo.

136

Captulo 73

Enlazado
Enlazado, es un proceso que une el cdigo de los mdulos y bibliotecas que forman un programa para generar el
ejecutable nal.
Este proceso es realizado muchas veces directamente por
el compilador y coloca las referencias externas (como a
las DLL) de manera que funcionen directamente, como
puede ser la situacin de las funciones de manera numrica. En algunos compiladores viene un ejecutable especco link.exe para esta funcin.

137

Captulo 74

Entrada chapuza
En computacin el antipatrn de diseo Chapuza de entrada ocurre cuando la entrada de datos de un programa
especco no se maneja adecuadamente. Por ejemplo, si
un programa acepta la entrada de cualquier texto por parte del usuario nal y se utiliza un algoritmo que manipule
mediante muchas combinaciones todas las cadenas posibles tanto si son vlidas como si no lo son.
Por lo general es difcil para un programador detectar, en
una prueba de unidad, todas las posibles combinaciones
errneas de una entrada de datos. Sin embargo es muy
fcil para el usuario nal reconocer que la cadena de entrada es incorrecta y as bloquear el programa. De hecho,
el Desbordamiento de bfer es un ejemplo de agujero de
seguridad provocado por los problemas que causa un mal
manejo de los datos de entrada.
Para evitar la Chapuza de entrada se pueden utilizar algoritmos de validacin que determinen que datos deben
ser vlidos y evitar el tratamiento de los datos no vlidos. Por ejemplo, realizar el anlisis lxico y/o sintctico
utilizando software especco tales como la Herramienta
de programacin lex, Yacc y GNU_Bison que permiten
obtener un control robusto de texto compuesto por expresiones regulares y gramticas libres de contexto del lenguaje. Se recomienda el empleo de estas tecnologas para
asegurar el manejo adecuado de entradas inesperadas.

74.1 Vase tambin


Antipatrn de diseo
Patrn de diseo
Herramienta de programacin lex
GNU Bison
Yacc

74.2 Enlaces externos


Input Kludge AntiPattern Problem by Sourcemaking Teaching IT Professionals

138

Captulo 75

Error de software
realidad, el trmino bugya formaba parte del idioma, al menos desde que Thomas Alva Edison lo utiliz en
1889 rerindose a interferencias y mal funcionamiento.
Es posible que Hopper lo haya asociado por primera vez a
la informtica, en este caso, relacionado a un insecto real.
Por otra parte, aunque durante los aos 50 del siglo XX,
Hopper tambin emple el trminodebugal hablar de
la depuracin de errores en los cdigos de programacin,
el primer uso registrado del trmino se encuentra en la
Journal of the Royal Aeronautical Society de 1945.* [7]

Foto del origen de la leyenda acerca del primerbuginformtico


conocido.

75.2 Defectos de diseo de programas


Diseos con colores inapropiados para las personas
que padecen daltonismo

Un error de software, comnmente conocido como bug


(bicho), es un error o fallo en un programa de computador o sistema de software que desencadena un resultado indeseado. Los programas que ayudan a la deteccin y
eliminacin de errores de programacin de software son
denominados depuradores (debuggers).

Diseos que usan textos con tipografas de difcil


lectura por su tamao o diseo
Diseos que fuerzan el uso del ratn o mouse sin
dejar alternativas de teclado para personas con disfunciones motrices

Entre las numerosas incidencias notables causadas por este tipo de error se incluyen la destruccin, en 1962, de
la sonda espacial Mariner 1,* [1] en 1996, del Ariane 5
501.* [2] y, en 2015, el Airbus A400M* [3]

Diseos con implicaciones culturales, por ejemplo


usando partes del cuerpo que en una determinada
cultura sean objeto de vergenza o burla o smbolos
con caractersticas de identidad cultural o religiosa
Estimar que el equipo donde se instalar tiene determinadas caractersticas (como la resolucin de la
pantalla, la velocidad del procesador, la cantidad de
memoria o conectividad a internet) propias de un
equipo de gama alta, en vez de disear el software
para su ejecucin en equipos normales

75.1 Orgenes del trmino


En 1967, los creadores de Mark III informaron del primer caso de error en un ordenador causado por un bug.
El Mark II, ordenador sucesor de ASCC Mark II, construido en 1944, sufri un fallo en un rel electromagntico. Cuando se investig ese rel, se encontr una polilla
(bug) que provoc que el rel quedase abierto. Grace Murray Hopper, licenciada en fsica y destacada matemtica
que trabaj como programadora en el Mark II, peg el
insecto con cinta adhesiva en la bitcora.* [4]

75.3 Errores de programacin comunes

Este incidente es errneamente referido como el origen


de la utilizacin del trmino ingls bug (bicho) para
indicar un problema en un aparato o sistema.* [5]* [6] En
139

Divisin por cero


Ciclo innito

140

CAPTULO 75. ERROR DE SOFTWARE

Problemas aritmticos como desbordamientos Abre el archivo miarchivopara escritura comienza a


(overow) o subdesbordamientos (underow).
escribir datos en mi archivo cierra el archivo
Si miarchivono existe (o el programa o el usuario
no tienen privilegios sucientes para abrirlo), el sistema
Utilizar una variable no inicializada
operativo regresar un error que el programa no atrapar
y tendremos un mensaje como El archivo miarchiAcceder a memoria no permitida (Violacin de ac- vono puede ser abierto para escrituray botones paceso)
ra reintentar, cancelar y abortar (en el sistema operativo
Windows), que no tendrn otra accin que repetirse inPrdida de memoria (memory leak)
denidamente sin posibilidad de salir de ese ciclo como
Desbordamiento o subdesbordamiento de la pila (es- no sea dando por terminado violentamente el programa.
tructura de datos)
Un cdigo que permitiese atrapar el error en tiempo de
ejecucin sera:
Desbordamiento de bfer (buer overow)
Abre el archivomiarchivopara escritura Si el sistema
Bloqueo mutuo (deadlock)
operativo lo permite comienza a escribir datos enmiarchivosi no lo permiti informa al usuario de lo que suceIndizado inadecuado de tablas en bases de datos.
de regresa al usuario a un punto donde no haya conicto
Desbordamiento de la pila de recursin, cuando se (el men principal, por ejemplo) Contina operando normalmente
dejan demasiadas llamadas en espera.

Exceder el tamao del array

75.4 Defectos de instalacin o programacin


Eliminacin o sustitucin de bibliotecas comunes a
ms de un programa o del sistema (DLC Hell).
Reiniciar arbitrariamente la sesin de un usuario para que la instalacin tenga efecto.

Los diferentes lenguajes de programacin permiten diferentes construcciones lgicas a los programadores para
atrapar y resolver errores en tiempo de ejecucin, como
pueden ser las sentencias assert, try y on error en diferentes lenguajes de programacin.

75.6 Vase tambin


Last Error

Suponer que el usuario tiene una conexin permanente a internet.

Agujero de seguridad

Utilizar como fuente enlaces simblicos a cheros


que pueden cambiar de ubicacin.

Hotx

Bugzilla

Depurador

75.5 Cdigos de errores de lenguajes de programacin


La mayor parte de los lenguajes de programacin presentan al menos dos tipos de errores que permiten a los programadores manejar las fallas de los programas de una
manera eciente y que no resulte agresiva con el usuario nal. Dichos errores son de compilacin y errores en
tiempo de ejecucin.
Los errores de compilacin normalmente inhiben que el
cdigo fuente derive en un programa ejecutable, mientras que los errores en tiempo de ejecucin son situaciones especcas en las que un evento externo al programa
impide su ejecucin. Regularmente un programador eciente debe intentar imaginar como debe responder ante
esos eventos de manera que sea el programa y no el usuario o el sistema operativo los que resuelvan el problema.
As por ejemplo un bloque de error no manejado podra
hacer lo siguiente:

Depuracin de programas
Ingeniera de software

75.7 Referencias
[1] (en ingls) History's Worst Software Bugs., p. 1. Wired.
Consultado el 20 de marzo de 2014.
[2] (en ingls) History's Worst Software Bugs., p. 2. Wired.
Consultado el 20 de marzo de 2014.
[3] (en ingls) Airbus Cites Assembly Problem in A400M
Crash. Consultado el 22 de junio de 2015
[4] (en ingls) Rear Admiral Grace Murray Hopper, USNR,
(1906-1992): imagen: Photo #: NH 96566-KN. Naval
History and Heritage Command. Consultado el 20 de marzo de 2014.
[5] bug

75.8. ENLACES EXTERNOS

[6] La polilla que vol dentro de un ordenador y el origen de


bug informtico | Microsiervos (Leyendas Urbanas)
[7] (en ingls) bug. World Wide Words. Consultado el 20
de marzo de 2014.

75.8 Enlaces externos


Buscador de Vulnerabilidades por productos de
INTECO-CERT

141

Captulo 76

Estilo de programacin
Estilo de programacin (tambin llamado estndares de o bien:
cdigo o convencin de cdigo) es un trmino que des- if(horas < 24 && minutos < 60 && segundos < 60) {
cribe convenciones para escribir cdigo fuente en ciertos return true; } else { return false; }
lenguajes de programacin.
El estilo de programacin es frecuentemente dependien- con algo como:
te del lenguaje de programacin que se haya elegido para
escribir. Por ejemplo el estilo del lenguaje de programa- if(horas<24&&minutos<60&&segundos<60){return
true;} else{return false;}
cin C variar con respecto al del lenguaje BASIC.

76.1 Caractersticas del estilo


76.1.1

Nombres de variable apropiadas

Los primeros dos ejemplos son mucho ms fciles de leer


porque estn bien indentados, y los bloques lgicos de
cdigo se agrupan y se representan juntos de forma ms
clara.

Una piedra clave para un buen estilo es la eleccin


apropiada de nombres de variable. Variables pobremen- 76.1.3 Valores booleanos en estructuras de
te nombradas dicultan la lectura del cdigo fuente y su
decisin
comprensin.
Como ejemplo, considrese el siguiente extracto de Algunos programadores piensan que las estructuras de
decisin como las anteriores, donde el resultado de la depseudocdigo:
cisin es meramente una computacin de un valor booget a b c if a < 24 and b < 60 and c < 60 return true leano, son demasiado prolijos e incluso propensos al
else return false
error. Preeren hacer la decisin en la computacin por
Debido a la eleccin de nombres de variable, es difcil s mismo, como esto:
darse cuenta de la funcin del cdigo. Comprese ahora return horas < 12 && minutos < 60 && segundos < 60;
con la siguiente versin:
La diferencia es, con frecuencia, puramente estilstica y
get horas minutos segundos if horas < 24 and minutos < sintctica, ya que los compiladores modernos producirn
60 and segundos < 60 return true else return false
cdigo objeto idntico en las dos formas.
La intencin el cdigo es ahora ms sencilla de discernir,
dado una hora en 24 horas, se devolver true si es vlida
y false si no.
76.1.4 Bucles y estructuras de control
El uso de estructuras de control lgicas para bucles tambin es parte de un buen estilo de programacin. Ayuda a
Estilo de indentacin, en lenguajes de programacin que alguien que est leyendo el cdigo a entender la secuencia
usan llaves para indentar o delimitar bloques lgicos de de ejecucin (en programacin imperativa). Por ejemplo,
cdigo, como por ejemplo C, es tambin un punto clave el siguiente pseudocdigo:
el buen estilo. Usando un estilo lgico y consistente hace cuenta = 0 while cuenta < 5 print cuenta * 2 cuenta =
el cdigo de uno ms legible. Comprese:
cuenta + 1 endwhile

76.1.2

Estilo de indentacin

if(horas < 24 && minutos < 60 && segundos < 60){ El extracto anterior cumple con las dos recomendaciones
return true; }else{ return false; }
de estilo anteriores, pero el siguiente uso de la construccin for hace el cdigo mucho ms fcil de leer:
142

76.3. ENLACES EXTERNOS


for cuenta = 0, cuenta < 5, cuenta=cuenta+1 print cuenta
*2
En muchos lenguajes, el patrn frecuentemente usado
por cada elemento en un rangopuede ser acortado a:
for cuenta = 0 to 5 print cuenta * 2

143
(traduccin al espaol)
Gua de estilo para cdigo Python (traduccin al espaol)
Estndar de cdigo: C# (Philips Medical Systems)
Estilo de programacin para Mono

76.1.5

Espaciado

Los lenguajes de formato libre ignoran frecuentemente


los espacios en blanco. El buen uso del espaciado en la
disposicin del cdigo de uno es, por tanto, considerado
un buen estilo de programacin.
Comprese el siguiente extracto de cdigo C:

Gua de calidad y estilo Ada 95: Directrices para


programadores profesionales
Gua de estilo programacin Java
Estndares de cdigo Java de Ambysoft
Estndares de cdigo de PHP::Pear

int cuenta; for(cuenta=0;cuenta<10;cuenta++){printf("%d Estndares de cdigo Symbian OS C++


,cuenta*cuenta+cuenta);}
con:

76.3.3 Convenciones de cdigo de proyecint cuenta; for (cuenta = 0; cuenta < 10; cuenta++) {
tos
printf("%d, cuenta * cuenta + cuenta); }
En los lenguajes de programacin de la familia C se recomienda tambin evitar el uso de caracteres tabulador en
medio de una lnea, ya que diferentes editores de textos
muestran su anchura de forma diferente.
El lenguaje de programacin Python usa indentacin para
indicar estructuras de control, por tanto se requiere obligatoriamente una buena indentacin. Haciendo esto, la
necesidad de marcar con llaves ({ y }) es eliminada, y la
legibilidad es mejorada sin interferir con los estilos de codicacin comunes. Con todo, esto lleva frecuentemente
a problemas donde el cdigo es copiado y pegado dentro de un programa Python, requiriendo un tedioso reformateado. Adicionalmente, el cdigo Python se vuelve
inusable cuando es publicado en un foro o pgina web que
elimine el espacio en blanco.

76.2 Vase tambin


Estilo de indentacin
Bug

76.3 Enlaces externos


76.3.1

Convenciones de cdigo en castellano

Manual de Estilo de programacin, en formato PDF


y licencia CreativeCommons

76.3.2

Convenciones de cdigo en ingls

Convenciones de cdigo para el lenguaje Java

Estndares de codicacin de GNU


Gua de estilo para codicacin en Mozilla
Gua de estilo para el ncleo Linux
Gua de estilo para el cdigo de NetBSD

Captulo 77

Eventos del ratn


Un evento del ratn es una accin realizada por el usuario de una interfaz de usuario utilizando el ratn de
computadora (mouse). La interpretacin de estas acciones mediante software desarrollado para ello, permite
ejecutar una funcin asociada a dicha accin.
Algunos ejemplos de eventos de ratn son:
mouse over: se produce cuando el cursor o puntero
del ratn se encuentra por encima de una determinada zona.
mouse out: se produce cuando el cursor abandona
una determinada zona.
mouse clicked: se produce cuando se pulsa un botn
del ratn.
mouse double-clicked: se produce cuando se pulsa
dos veces en un intervalo pequeo de tiempo un mismo botn del ratn.
La programacin de los eventos del mouse se lleva a cabo
mediante llamadas a rutinas especcas que se ejecutan
cuando se produce una accin. Adems, la accin que se
llevar a cabo ser diferente dependiendo de en qu parte de la pantalla se site este, por ejemplo, si se pulsa el
botn izquierdo y el puntero est en una parte externa a
una aplicacin, no ocurrir nada, pero si por el contrario,
en puntero se encuentra sobre un rea que contiene un
botn, al pulsar sobre el ratn se deber ejecutar la rutina
asociada a ese botn.

77.1 Vase tambin


Clic (informtica)
Doble clic

144

Captulo 78

Exclusin mutua (informtica)


Los algoritmos de exclusin mutua (comnmente abreviada como mutex por mutual exclusion) se usan en
programacin concurrente para evitar el ingreso a sus secciones crticas por ms de un proceso a la vez. La seccin
crtica es el fragmento de cdigo donde puede modicarse un recurso compartido.

semforo y ambos se quedan a la espera de que el otro


proceso libere el semforo. Otros efectos comunes incluyen la Inanicin, en el cual un proceso esencial no se ejecuta durante el tiempo deseado, y la inversin de prioridades, en el que una tarea de prioridad elevada espera por
otra tarea de menor prioridad, as como la latencia alta en
La mayor parte de estos recursos son las seales, 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 investigacin actual en este campo,
cacin entre el cdigo que se ejecuta cuando se da servi- pretende eliminar los efectos anteriormente descritos. Si
cio a una interrupcin y el cdigo que se ejecuta el resto bien no hay un esquema perfecto conocido, hay un indel tiempo. Se trata de un problema de vital importan- teresante esquema no clsico de envo de mensajes entre
cia porque, si no se toman las precauciones debidas, una fragmentos de cdigo que, aunque permite inversiones de
interrupcin puede ocurrir entre dos instrucciones cua- prioridad y produce una mayor latencia, impide los interlesquiera del cdigo normal y esto puede provocar graves bloqueos.
fallos.
Algunos ejemplos de algoritmos clsicos de exclusin
La tcnica que se emplea por lo comn para conseguir la mutua son:
exclusin mutua es inhabilitar las interrupciones durante
el conjunto de instrucciones ms pequeo que impedi El algoritmo de Dekker.
r la corrupcin de la estructura compartida (la seccin
El algoritmo de Peterson.
crtica). Esto impide que el cdigo de la interrupcin se
ejecute en mitad de la seccin crtica.
En un sistema multiprocesador de memoria compartida,
se usa la operacin indivisible test-and-set sobre una bandera, para esperar hasta que el otro procesador la despeje.
La operacin test-and-set realiza ambas operaciones sin
liberar el bus de memoria a otro procesador. As, cuando
el cdigo deja la seccin crtica, se despeja la bandera.
Esto se conoce como spin lock o espera activa.

78.1 Vase tambin

Algunos sistemas tienen instrucciones multioperacin indivisibles similares a las anteriormente descritas para manipular las listas enlazadas que se utilizan para las colas
de eventos y otras estructuras de datos que los sistemas
operativos usan comnmente.
La mayora de los mtodos de exclusin mutua clsicos
intentan reducir la latencia y espera activa mediante las
colas y cambios de contexto. Algunos investigadores arman que las pruebas indican que estos algoritmos especiales pierden ms tiempo del que ahorran.
A pesar de todo lo dicho, muchas tcnicas de exclusin mutua tienen efectos colaterales. Por ejemplo, los
semforos permiten interbloqueos (deadlocks) en los que
un proceso obtiene un semforo, otro proceso obtiene el

145

Cierre de exclusin mutua o locks


Semforo (inventado por Edsger Dijkstra)
Monitor (concurrencia)(inventado por C. A. R.
Hoare) (sin interbloqueos)

Captulo 79

Expresin regular
Una expresin regular, a menudo llamada tambin re- Agrupacin Los parntesis pueden usarse para denir
gex, es una secuencia de caracteres que forma un patrn
el mbito y precedencia de los dems operadores.
de bsqueda, principalmente utilizada para la bsqueda
Por ejemplo, "(p|m)adrees lo mismo que pade patrones de cadenas de caracteres u operaciones de
dre|madre, y "(des)?amorse corresponde con
sustituciones. Por ejemplo, el grupo formado por las caamor y con desamor.
denas Handel, Hndel y Haendel se describe con el patrn
H(a||ae)ndel. La mayora de las formalizaciones proporcionan los siguientes constructores: una expresin regular es una forma de representar a los lenguajes regulares (nitos o innitos) y se construye utilizando caracteres Los constructores pueden combinarse libremente dentro
de la misma expresin, por lo queH(ae?|)ndelequivale
del alfabeto sobre el cual se dene el lenguaje.
a H(a|ae|)ndel.
En informtica, las expresiones regulares proveen una
manera muy exible de buscar o reconocer cadenas de La sintaxis precisa de las expresiones regulares cambia
segn las herramientas y aplicaciones consideradas, y se
texto.
describe con ms detalle a continuacin.

79.1 Construccin de expresiones


regulares
Especcamente, las expresiones regulares se construyen
utilizando los operadores unin, concatenacin y clausura
de Kleene. Toda expresin regular tiene algn autmata
nito asociado.

79.2 Aplicaciones

Su utilidad ms obvia es la de describir un conjunto de


Alternacin Una barra vertical separa las alternativas. cadenas para una determinada funcin, resultando de utiPor ejemplo,marrn|castaose corresponde con lidad en editores de texto y otras aplicaciones informticas para buscar y manipular textos.
marrn o castao.
Cuanticacin Un cuanticador tras un carcter espe- Numerosos editores de texto y otras herramientas utilizan
cica la frecuencia con la que ste puede ocurrir. expresiones regulares para buscar y reemplazar patrones
en un texto. Por ejemplo, las herramientas proporcionaLos cuanticadores ms comunes son ?, + y *:
das por las distribuciones de Unix (incluyendo el editor
? El signo de interrogacin indica que el carcter sed y el ltro grep) popularizaron el concepto de expreque le precede puede aparecer como mucho sin regular entre usuarios no programadores, aunque ya
una vez. Por ejemplo, ob?scurose corres- era familiar entre los programadores.
ponde con oscuro y obscuro.
Inicialmente, este reconocimiento de cadenas se progra+ El signo ms indica que el carcter que le prece- maba para cada aplicacin sin mecanismo alguno inhede debe aparecer al menos una vez. Por ejem- rente al lenguaje de programacin pero, con el tiempo, se
plo,ho+ladescribe el conjunto innito hola, ha ido incorporado el uso de expresiones regulares para
hoola, hooola, hoooola, etctera.
facilitar programar la deteccin de ciertas cadenas. Por
* El asterisco indica que el carcter que le prece- ejemplo, Perl tiene un potente motor de expresiones rede puede aparecer cero, una, o ms veces. Por gulares directamente incluido en su sintaxis. Otros lenejemplo,0*42se corresponde con 42, 042, guajes lo han incorporado como funciones especcas sin
0042, 00042, etctera.
incorporarlo a su sintaxis.
146

79.3. LAS EXPRESIONES REGULARES EN PROGRAMACIN

147

79.3 Las expresiones regulares en


programacin

C++: Desde su versin C++11 es posible utilizar expresiones regulares mediante la biblioteca estndar,
usando la cabecera <regex>.

Nota: Para el entendimiento completo de esta


seccin es necesario poseer conocimientos generales acerca de lenguajes de programacin o
programacin en general.

Java: existen varias bibliotecas hechas para java que


permiten el uso de RegEx, y Sun planea dar soporte
a estas desde el SDK

En el rea de la programacin las expresiones regulares


son un mtodo por medio del cual se pueden realizar bsquedas dentro de cadenas de caracteres. Sin importar la
amplitud de la bsqueda requerida de un patrn denido de caracteres, las expresiones regulares proporcionan
una solucin prctica al problema. Adicionalmente, un
uso derivado de la bsqueda de patrones es la validacin
de un formato especco en una cadena de caracteres dada, como por ejemplo fechas o identicadores.
Para poder utilizar las expresiones regulares al programar
es necesario tener acceso a un motor de bsqueda con la
capacidad de utilizarlas. Es posible clasicar los motores
disponibles en dos tipos segn su uso: motores para el
programador y motores para el usuario nal.
Motores para el usuario nal: son programas que permiten realizar bsquedas sobre el contenido de un archivo
o sobre un texto extrado y colocado en el programa. Estn diseados para permitir al usuario realizar bsquedas
avanzadas usando este mecanismo, sin embargo es necesario aprender a redactar expresiones regulares adecuadas
para poder utilizarlos ecientemente. Algunos programas
disponibles de este tipo son:

Perl: es el lenguaje que hizo crecer a las expresiones regulares en el mbito de la programacin hasta
llegar a lo que son hoy en da.
PCRE: biblioteca de ExReg para C, C++ y otros
lenguajes que puedan utilizar bibliotecas dll (Visual
Basic 6 por ejemplo).
PHP: tiene dos tipos diferentes de expresiones regulares disponibles para el programador, aunque la
variante POSIX (ereg) va a ser desechada en PHP
6.
Python: lenguaje de scripting con soporte de expresiones regulares mediante su librera <regex>.
.Net Framework: provee un conjunto de clases mediante las cuales es posible utilizar expresiones regulares para hacer bsquedas, reemplazar cadenas y
validar patrones.

Nota: de las herramientas mencionadas con anterioridad


operativos se utilizan el EditPad Pro y el .Net Framework para dar
ejemplos, aunque es posible utilizar las expresiones resed: programa de los sistemas operativos gulares con cualquier combinacin de las herramientas
Unix/Linux que permite la modicacin de la mencionadas. Aunque en general las Expresiones Regulares utilizan un lenguaje comn en todas las herramiensalida.
tas, las explicaciones prcticas acerca de la utilizacin de
PowerGrep: versin de grep para los sistemas ope- las herramientas y los ejemplos de cdigo deben ser interrativos Windows.
pretados de forma diferente. Tambin es necesario hacer
RegexBuddy: ayuda a crear las expresiones regulares notar que existen algunos detalles de sintaxis de las expreen forma interactiva y luego le permite al usuario siones regulares que son propios del .Net Framework que
se utilizan en forma diferente en las dems herramienusarlas y guardarlas.
tas de programacin. Cuando estos casos se den se har
EditPad Pro: permite realizar bsquedas con expre- notar en forma explcita para que el lector pueda buscar
siones regulares sobre archivos y las muestra por informacin respecto a estos detalles en fuentes adiciomedio de cdigo de colores para facilitar su lectu- nales. En el futuro se incluirn adicionalmente ejemplos
ra y comprensin.
de otras herramientas y lenguajes de programacin.

grep: programa
Unix/Linux.

JavaScript: a partir de la versin 1.2 (ie4+, ns4+)


JavaScript tiene soporte integrado para expresiones
regulares.

de

los

sistemas

Motores para el programador: permiten automatizar el


proceso de bsqueda de modo que sea posible utilizarlo
muchas veces para un propsito especco. Estas son algunas de las herramientas de programacin disponibles
que ofrecen motores de bsqueda con soporte a expresiones regulares:

Expresiones regulares como motor de bsqueda

Las expresiones regulares permiten encontrar porciones


especcas de texto dentro de una cadena ms grande de
caracteres. As, si es necesario encontrar el textoloteen
la expresinel ocelote salt al lote contiguocualquier
motor de bsqueda sera capaz de efectuar esta labor. Sin
embargo, la mayora de los motores de bsqueda encon AWK: Forma una parte esencial del lenguaje y por traran tambin el fragmentolotede la palabraoceloextensin de la herramienta awk de Unix/Linux
te, lo cual podra no ser el resultado esperado. Algunos

148

CAPTULO 79. EXPRESIN REGULAR

motores de bsqueda permiten adicionalmente especicar que se desea encontrar solamente palabras completas, solucionando este problema. Las expresiones regulares permiten especicar todas estas opciones adicionales y muchas otras sin necesidad de congurar opciones
adicionales, sino utilizando el mismo texto de bsqueda
como un lenguaje que permite enviarle al motor de bsqueda exactamente lo que deseamos encontrar en todos
los casos, sin necesidad de activar opciones adicionales al
realizar la bsqueda.

79.4.2 La admiracin "!"

Expresiones regulares como lenguaje

79.4.3 La barra inversa o antibarra "\"

Para especicar opciones dentro del texto a buscar se utiliza un lenguaje o convencin mediante el cual se le transmite al motor de bsqueda el resultado que se desea obtener. Este lenguaje le da un signicado especial a una serie
de caracteres. Por lo tanto cuando el motor de bsqueda
de expresiones regulares encuentre estos caracteres no los
buscar en el texto en forma literal, sino que buscar lo
que los caracteres signican. A estos caracteres se les llama algunas vecesmeta-caracteres. A continuacin se
listan los principales meta-caracteres y su funcin y cmo
los interpreta el motor de expresiones regulares.

79.4 Descripcin de las expresiones


regulares
79.4.1

El punto ".

El punto se interpreta por el motor de bsqueda como


cualquier carcter, es decir, busca cualquier carcter
SIN incluir los saltos de lnea. Los motores de Expresiones regulares tienen una opcin de conguracin que
permite modicar este comportamiento. En .Net Framework se utiliza la opcin RegexOptions.Singleline para
especicar la opcin de que busque todos los caracteres
incluidos el salto de lnea (\n).
El punto se utiliza de la siguiente forma: Si se le dice al
motor de RegEx que busqueg.ten la cadenael gato
de piedra en la gtica puerta de getisboro gootel motor de bsqueda encontrar gat, gty por ltimo
get. Ntese que el motor de bsqueda no encuentra
goot"; esto es porque el punto representa un solo carcter
y nicamente uno. Si es necesario que el motor encuentre tambin la expresin goot, ser necesario utilizar
repeticiones, las cuales se explican ms adelante.
Aunque el punto es muy til para encontrar caracteres que
no conocemos, es necesario recordar que corresponde a
cualquier carcter y que muchas veces esto no es lo que
se requiere. Es muy diferente buscar cualquier carcter
que buscar cualquier carcter alfanumrico o cualquier
dgito o cualquier no-dgito o cualquier no-alfanumrico.
Se debe tomar esto en cuenta antes de utilizar el punto y
obtener resultados no deseados.

Se utiliza para realizar una bsqueda anticipada negativa. La construccin de la expresin regular es con el
par de parntesis, el parntesis de apertura seguida de un
signo de interrogacin y un signo de exclamacin. Dentro
de la bsqueda tenemos la expresin regular. Por ejemplo, para excluir exactamente una palabra, habr que utilizar "^(palabra.+|(?!palabra).*)$"

Se utiliza para escapar el siguiente carcter de la expresin de bsqueda de forma que este adquiera un signicado especial o deje de tenerlo. O sea, la barra inversa no se
utiliza nunca por s sola, sino en combinacin con otros
caracteres. Al utilizarlo por ejemplo en combinacin con
el punto "\.este deja de tener su signicado normal y se
comporta como un carcter literal.
De la misma forma, cuando se coloca la barra inversa seguida de cualquiera de los caracteres especiales que discutiremos a continuacin, estos dejan de tener su signicado especial y se convierten en caracteres de bsqueda
literal.
Como ya se mencion con anterioridad, la barra inversa
tambin puede darle signicado especial a caracteres que
no lo tienen. A continuacin hay una lista de algunas de
estas combinaciones:
\t Representa un tabulador.
\r Representa elretorno de carrooregreso al
inicioo sea el lugar en que la lnea vuelve a iniciar.
\n Representa lanueva lneael carcter por medio del cual una lnea da inicio. Es necesario recordar que en Windows es necesaria una combinacin
de \r\n para comenzar una nueva lnea, mientras que
en Unix solamente se usa \n y en Mac_OS clsico se
usa solamente \r.
\a Representa una campanao beepque se
produce al imprimir este carcter.
\e Representa la tecla Esco Escape
\f Representa un salto de pgina
\v Representa un tabulador vertical
\x Se utiliza para representar caracteres ASCII o
ANSI si conoce su cdigo. De esta forma, si se busca
el smbolo de derechos de autor y la fuente en la que
se busca utiliza el conjunto de caracteres Latin-1 es
posible encontrarlo utilizando "\xA9.
\u Se utiliza para representar caracteres Unicode
si se conoce su cdigo. "\u00A2representa el smbolo de centavos. No todos los motores de Expresiones Regulares soportan Unicode. El .Net Framework lo hace, pero el EditPad Pro no, por ejemplo.

79.4. DESCRIPCIN DE LAS EXPRESIONES REGULARES

149

\d Representa un dgito del 0 al 9.

con la barra inversa dentro de los corchetes es la propia


barra inversa. La expresin regular "[\dA-Fa-f]" nos per\w Representa cualquier carcter alfanumrico.
mite encontrar dgitos hexadecimales. Los corchetes nos
permiten tambin encontrar palabras an si estn escri\s Representa un espacio en blanco.
tas de forma errnea, por ejemplo, la expresin regular
\D Representa cualquier carcter que no sea un expresi[o]npermite encontrar en un texto la palabra
dgito del 0 al 9.
expresinaunque se haya escrito con o sin tilde. Es
necesario aclarar que sin importar cuantos caracteres se
\W Representa cualquier carcter no alfanumriintroduzcan dentro del grupo por medio de los corchetes,
co.
el grupo slo le dice al motor de bsqueda que encuentre
\S Representa cualquier carcter que no sea un es- un solo carcter a la vez, es decir, queexpresi[o]nno
encontrar expresiono expresin.
pacio en blanco.

\A Representa el inicio de la cadena. No un carcter sino una posicin.


79.4.5

La barra "|"

\Z Representa el nal de la cadena. No un carcter


Sirve para indicar una de varias opciones. Por ejemplo,
sino una posicin.
la expresin regular a|eencontrar cualquier a
\b Marca la posicin de una palabra limitada por o edentro del texto. La expresin regular esespacios en blanco, puntuacin o el inicio/nal de te|oeste|norte|surpermitir encontrar cualquiera de los
nombres de los puntos cardinales. La barra se utiliza couna cadena.
mnmente en conjunto con otros caracteres especiales.
\B Marca la posicin entre dos caracteres alfanumricos o dos no-alfanumricos.

79.4.6 El signo de dlar "$"


Notas:
Utilidades como Charmap.exe de Windows o gucharmap de GNOME permiten encontrar los cdigos ASCII/ANSI/UNICODE para utilizarlos en Expresiones Regulares.

Representa el nal de la cadena de caracteres o el nal de


la lnea, si se utiliza el modo multi-lnea. No representa
un carcter en especial sino una posicin. Si se utiliza la
expresin regular "\.$" el motor encontrar todos los lugares donde un punto nalice la lnea, lo que es til para
avanzar entre prrafos.

Algunos lenguajes, como Java, asignan su propio


signicado a la barra invertida, por lo que deber
repetirse para que sea considerada una expresin re- 79.4.7 El acento circunejo "^"
gular (ej. String expresion="\\d.\\dpara indicar el
patrn \d.\d).
Este carcter tiene una doble funcionalidad, que diere
cuando se utiliza individualmente y cuando se utiliza en
conjunto con otros caracteres especiales. En primer lugar
79.4.4 Los corchetes "[ ]"
su funcionalidad como carcter individual: el carcter "^"
La funcin de los corchetes en el lenguaje de las expre- representa el inicio de la cadena (de la misma forma que
siones regulares es representar clases de caracteres, el signo de dlar "$" representa el nal de la cadena). Por
o sea, agrupar caracteres en grupos o clases. Son tiles tanto, si se utiliza la expresin regular "^[a-z]" el motor
cuando es necesario buscar uno de un grupo de caracte- encontrar todos los prrafos que den inicio con una leres. Dentro de los corchetes es posible utilizar el guion "- tra minscula. Cuando se utiliza en conjunto con los cor" para especicar rangos de caracteres. Adicionalmente, chetes de la siguiente forma "[^\w ]" permite encontrar
los metacaracteres pierden su signicado y se convierten cualquier carcter que NO se encuentre dentro del grupo
en literales cuando se encuentran dentro de los corche- indicado. La expresin indicada permite encontrar, por
tes. Por ejemplo, como vimos en la entrega anterior "\d ejemplo, cualquier carcter que no sea alfanumrico o un
nos es til para buscar cualquier carcter que represente espacio, es decir, busca todos los smbolos de puntuacin
un dgito. Sin embargo esta denominacin no incluye el y dems caracteres especiales.
punto ".que divide la parte decimal de un nmero. Para
buscar cualquier carcter que representa un dgito o un
punto podemos utilizar la expresin regular "[\d.]". Como se hizo notar anteriormente, dentro de los corchetes,
el punto representa un carcter literal y no un metacarcter, por lo que no es necesario antecederlo con la barra inversa. El nico carcter que es necesario anteceder

La utilizacin en conjunto de los caracteres especiales "^"


y "$" permite realizar validaciones en forma sencilla. Por
ejemplo "^\d$" permite asegurar que la cadena a vericar
representa un nico dgito "^\d\d/\d\d/\d\d\d\d$" permite validar una fecha en formato corto, aunque no permite
vericar si es una fecha vlida, ya que 99/99/9999 tambin sera vlido en este formato; la validacin completa

150

CAPTULO 79. EXPRESIN REGULAR

de una fecha tambin es posible mediante expresiones re- denen grupos annimos, sin embargo el signo de
gulares, como se ejemplica ms adelante.
pregunta en conjunto con los parntesis triangulares "<>"
permite nombrarestos grupos de la siguiente forma:
"^(?<Da>\d\d)\/(?<Mes>\d\d)\/(?<Ao>\d\d\d\d)$";
79.4.8 Los parntesis "()"
Con lo cual se le especica al motor de bsqueda que
los primeros dos dgitos encontrados llevarn la etiqueta
De forma similar que los corchetes, los parntesis sirven Da, los segundos la etiqueta Mesy los ltimos
para agrupar caracteres, sin embargo existen varias dife- cuatro dgitos llevarn la etiqueta Ao.
rencias fundamentales entre los grupos establecidos por
medio de corchetes y los grupos establecidos por parn- NOTA: a pesar de la complejidad y exibilidad dada por
los caracteres especiales estudiados hasta ahora, en su
tesis:
mayora nos permiten encontrar solamente un carcter
a la vez, o un grupo de caracteres a la vez. Los meta Los caracteres especiales conservan su signicado
caracteres enumerados en adelante permiten establecer
dentro de los parntesis.
repeticiones.
Los grupos establecidos con parntesis establecen
una etiquetao punto de referenciapara el
motor de bsqueda que puede ser utilizada poste- 79.4.10 Las llaves "{}"
riormente como se denota ms adelante.
Comnmente las llaves son caracteres literales cuando se
Utilizados en conjunto con la barra "|" permite ha- utilizan por separado en una expresin regular. Para que
cer bsquedas opcionales. Por ejemplo la expresin adquieran su funcin de metacaracteres es necesario que
regular al (este|oeste|norte|sur) depermite bus- encierren uno o varios nmeros separados por coma y que
car textos que den indicaciones por medio de puntos estn colocados a la derecha de otra expresin regular
cardinales, mientras que la expresin regular es- de la siguiente forma: "\d{2}" Esta expresin le dice al
te|oeste|norte|surencontraraesteen la palabra motor de bsqueda que encuentre dos dgitos contiguos.
esteban, no pudiendo cumplir con este propsito. Utilizando esta frmula podramos convertir el ejemplo
"^\d\d/\d\d/\d\d\d\d$" que serva para validar un formato
Utilizados en conjunto con otros caracteres especiade fecha en "^\d{2}/\d{2}/\d{4}$" para una mayor clales que se detallan posteriormente, ofrece funcionaridad en la lectura de la expresin.
lidad adicional.
"\d{2,4}" Esta forma aade un segundo nmero separado
por una coma, el cul indica al motor de bsqueda que
79.4.9 El signo de interrogacin "?"
como mximo debe aparecer 4 veces la expresin regular
\d. Los posibles valores son:
El signo de interrogacin tiene varias funciones dentro
del lenguaje de las expresiones regulares. La primera de
"^\d\d$" (mnimo 2 repeticiones)
ellas es especicar que una parte de la bsqueda es opcional. Por ejemplo, la expresin regular ob?scuridad "^\d\d\d$"(tiene 3 repeticiones, por lo tanto entra en
permite encontrar tanto oscuridadcomo obscuriel rango 2-4)
dad. En conjunto con los parntesis redondos permite
"^\d\d\d\d$" (mximo 4 repeticiones)
especicar que un conjunto mayor de caracteres es
opcional; por ejemploNov(\.|iembre|ember)?" permite
encontrar tanto Novcomo Nov., Noviembre Nota: aunque esta forma de encontrar elementos repetiy November. Como se mencion anteriormente, los dos es muy til, algunas veces no se conoce con claridad
parntesis nos permiten establecer un punto de refe- cuantas veces se repite lo que se busca o su grado de rerenciapara el motor de bsqueda. Sin embargo, algunas peticin es variable. En estos casos los siguientes metaveces, no se desea utilizarlos con este propsito, como caracteres son tiles.
en el ejemplo anterior Nov(\.|iembre|ember)?". En
este caso el establecimiento de este punto de referencia
(que se detalla ms adelante) representa una inversin 79.4.11 El asterisco "*"
intil de recursos por parte del motor de bsqueda.
Para evitarlo se puede utilizar el signo de pregunta El asterisco sirve para encontrar algo que se encuentra rede la siguiente forma: Nov(?:\.|iembre|ember)?". petido 0 o ms veces. Por ejemplo, utilizando la expresin
Aunque el resultado obtenido ser el mismo, el motor "[a-zA-Z]\d*" ser posible encontrar tanto Hcomo
de bsqueda no realizar una inversin intil de recursos H1,H01,H100yH1000, es decir, una letra
en este grupo, sino que lo ignorar. Cuando no sea seguida de un nmero indenido de dgitos. 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 posigno de pregunta con otro signicado: Los parntesis sible de caracteres que correspondan con el patrn que se

79.4. DESCRIPCIN DE LAS EXPRESIONES REGULARES


busca. De esta forma si se utiliza "\(.*\)" para encontrar
cualquier cadena que se encuentre entre parntesis y se lo
aplica sobre el textoVer (Fig. 1) y (Fig. 2)" se esperara
que el motor de bsqueda encuentre los textos "(Fig. 1)" y
"(Fig. 2)", sin embargo, debido a esta caracterstica, en su
lugar encontrar el texto "(Fig. 1) y (Fig. 2)". Esto sucede
porque el asterisco le dice al motor de bsqueda que llene
todos los espacios posibles entre los dos parntesis. Para
obtener el resultado deseado se debe utilizar el asterisco
en conjunto con el signo de interrogacin de la siguiente forma: "\(.*?\)" Esto es equivalente a decirle al motor
de bsqueda que Encuentre un parntesis de apertura
y luego encuentre cualquier secuencia de caracteres hasta
que encuentre un parntesis de cierre.

79.4.12

151

Luego asumiendo que el texto que se desea examinar con


la expresin regular se encuentra en la variable sText
podemos recorrer todas las instancias encontradas de la
siguiente forma:
foreach(Match
CurrentMatch
in
_TagParser.Matches(sText)){ // ----- Cdigo extra aqu ----}
Luego se puede utilizar la propiedad Groups de la clase
Match para traer el resultado de la bsqueda:
foreach(Match
CurrentMatch
in
_TagParser.Matches(sText)){ String sTagName = CurrentMatch.
Groups[1].Value; }

El signo de suma "+"


Grupos nominales

Se utiliza para encontrar una cadena que se encuentre repetida una o ms veces. A diferencia del asterisco, la expresin "[a-zA-Z]\d+" encontrarH1pero no encontrar H. Tambin es posible utilizar este metacarcter en conjunto con el signo de interrogacin para limitar
hasta donde se efecta la repeticin.

Los grupos nominales son aquellos a los que se les asigna


un nombre, dentro de la expresin regular para poder utilizarlos posteriormente. Esto se hace de forma diferente
en los distintos motores de bsqueda, a continuacin se
explica como hacerlo en el motor del .Net Framework.

Utilizando el ejemplo anterior es posible convertir "<([azA-Z]\w*?)>" en "<(?<TagName>[a-zA-Z]\w*?)>" Pa79.4.13 Grupos annimos
ra encontrar etiquetas HTML. Ntese el signo de pregunta y el textoTagNameencerrado entre parntesis trianLos grupos annimos se establecen cada vez que se en- gulares, seguido de ste. Para utilizar este ejemplo en el
cierra una expresin regular en parntesis, por lo que la .Net Framework es posible utilizar el siguiente cdigo:
expresin "<([a-zA-Z]\w*?)>" dene un grupo annimo.
Regex _TagParser = new Regex("<(?<TagName>[aEl motor de bsqueda almacenar una referencia al grupo
zA-Z]\w*?)>"); foreach(Match CurrentMatch in
annimo que corresponda a la expresin encerrada entre
_TagParser.Matches(sText)){ String sTagName = Culos parntesis.
rrentMatch. Groups["TagName"]. Value; }
La forma ms inmediata de utilizar los grupos que se
denen, es dentro de la misma expresin regular, lo
Es posible denir tantos grupos como sea nececual se realiza utilizando la barra inversa "\" seguida
sario, de esta forma se puede denir algo como:
del nmero del grupo al que se desea hacer referen"<(?<TagName>[a-zA-Z]\w*?) ?(?<Attributes>.*?)>"
cia de la siguiente forma: "<([a-zA-Z]\w*?)>.*?</\1>"
para encontrar no solo el nombre del tag HTML sino
Esta expresin regular encontrar tanto la cadena
tambin sus atributos de la siguiente forma:
"<font>Esta</font>" como la cadena "<b>prueba</b>"
en el texto "<font>Esta</font> es una <b>prueba</b>" a Regex _TagParser = new Regex("<(?<TagName>[apesar de que la expresin no contiene los literalesfont zA-Z]\w*?) ?(?<Attributes>.*?)>"); foreach(Match
CurrentMatch in _TagParser.Matches(sText)){ String
y B.
sTagName = CurrentMatch. Groups["TagName"].
Otra forma de utilizar los grupos es en el lenguaje de proValue;
String
sAttributes
=
CurrentMatch.
gramacin que se est utilizando. Cada lenguaje tiene una
Groups["Attributes"]. Value; }
forma distinta de acceder a los grupos. Los ejemplos enumerados a continuacin utilizan las clases del .Net Framework, usando la sintxis de C# (la cual puede fcil- Pero es posible ir mucho ms all de la siguiente forma:
mente adaptarse a VB .Net o cualquier otro lenguaje del "<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<AttribuFramework o incluso Java o JavaScript).
te>[\w-\r\n]*?)='?"?(?<Value>[\w-:;,\./=
\r\n]*?)'?"?
Para utilizar el motor de bsqueda del .Net Framework ?)>"
es necesario en primer lugar hacer referencia al espacio
de nombres System.Text.RegularExpressions. Luego es Esta expresin permite encontrar el nombre de la etiquenecesario declarar una instancia de la clase Regex de la ta, el nombre del atributo y su valor.
siguiente forma:
Sin embargo, una etiqueta HTML puede tener ms de un
Regex _TagParser = new Regex("<([a-zA-Z]\w*?)>");

152
atributo. Este puede resolverse utilizando repeticiones de
la siguiente forma:
"<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?<Value>[\w-:;,\./=
\r\n]*?)'?"?
?)*?>"
Y en el cdigo puede utilizarse de la siguiente forma:
Regex _TagParser = new Regex("<?(?<TagName>[azA-Z][\w\r\n]*?)?
(?:(?<Attribute>[\w-\r\n]*?)='?"?
(?<Value>[\w-:;,\./= \r\n]*?)'?"? ?)*?>"); foreach(Match
CurrentMatch in _TagParser.Matches(sText)){ String
sTagName = CurrentMatch. Groups["TagName"]. Value; foreach(Capture CurrentCapture in CurrentMatch.
Groups["Attribute"]. Captures){ AttributesCollection.
Add(CurrentCapture. Value) } foreach(Capture CurrentCapture in CurrentMatch. Groups["value"]. Captures){
ValuesCollection. Add(CurrentCapture. Value) } }
Es posible profundizar utilizando una expresin regular
como esta:
"<?(?<TagName>[a-zA-Z][\w\r\n]*?) ?(?:(?<Attribute>[\w-\r\n]*?)='?"?(?<Value>[\w-:;,\./=
\r\n]*?)'?"?
?)*?>(?<Content>.*?)</\1>"
La cual permitira encontrar el nombre de la etiqueta, sus
atributos, valores y el contenido de esta, todo con una sola
expresin regular.

79.5 Enlaces externos


Editor regex en lnea (en ingls)
Tutorial Expresiones Regulares en Python (en ingls)
Expresiones Regulares en Perl
Manual sobre Expresiones Regulares
Portal de Informacin Expresiones Regulares en
General (en ingls)

CAPTULO 79. EXPRESIN REGULAR

Captulo 80

Flag
En programacin, la bandera o ag se reere a uno o
ms bits que se utilizan para almacenar un valor binario
o cdigo que tiene asignado un signicado. Las banderas
normalmente forman parte de una determinada estructura de datos, como un registro de una base de datos, y el
signicado del valor que gura en una bandera tpicamente se denir en relacin a la estructura de datos de la que
forma parte. En muchos casos el valor binario de la bandera se entender como la representacin de uno de los
posibles estados. En otras ocasiones, los valores binarios
pueden representar uno o ms atributos de un campo de
bits, a menudo relacionados con habilidades o permisos,
como se puede escribiro puede ser borrado. De
todos modos, hay muchos otros posibles signicados que
pueden asignarse a los valores de la bandera. Un uso comn de las banderas es marcar o designar estructuras de
datos para un posterior tratamiento.
Dentro de los microprocesadores y otros dispositivos
lgicos, las banderas se utilizan mayoritariamente para
controlar o indicar el estado intermedio o nal o el resultado de diferentes operaciones. Por ejemplo, los microprocesadores suelen tener un registro de estado que se
compone de varias de estas banderas que se usarn para
indicar varias condiciones establecidas como resultado de
una operacin, como podra ser hacer notar que ha habido un desbordamiento en una operacin aritmtica. Una
vez establecidas, las banderas pueden utilizarse en operaciones posteriores como el control de ujo en una operacin de salto condicional. Por ejemplo, la instruccin
en lenguaje ensamblador de Intel x86 je (salta si igual)
comprobar el ag Z (cero) del registro de estado y si est establecido (por una operacin anterior) ejecutar un
salto a la direccin indicada.
A los diferentes parmetros de control de una shell de
lnea de comandos tambin se les suele llamar banderas.
Estas shells utilizan un analizador sintctico para traducir
los parmetros pasados en banderas al uso de las vistas en
este artculo.

80.1 Vase tambin


Registro de estado

153

Captulo 81

Front-end y back-end
Front-end y back-end son trminos que se reeren a la
separacin de intereses entre una capa de presentacin y
una capa de acceso a datos, respectivamente. Pueden traducirse al espaol el primero como interfaz, nal frontal o frontal y el segundo como motor, dorsal nal* [1]o
zaga,* [2] aunque es comn dejar estos trminos en ingls.

presentacin simblico-fontica y el back-end convierte


la representacin fontica y simblica en el sonido.

Muchos programas tienen su concepto de diseo dividido en front-ends y back-ends, pero en la mayora de los
casos, el back-end est oculto del usuario nal y solo pueden utilizarlo el cliente intermedio o el administrador que
se encargar de gestionar el sistema de informacin. Sin
embargo, muchos programas estn escritos para servir de
simple front-end para otros que ya existen, como es el ca81.1 Informtica
so de las interfaces grcas construidas sobre una interfaz
de lnea de rdenes. Este tipo de front-end es comn en
En diseo de software el front-end es la parte del software entornos de escritorio Unix (como los GUI), donde los
que interacta con el o los usuarios y el back-end es la programas son desarrollados siguiendo la losofa de diparte que procesa la entrada desde el front-end. La se- seo de muchos programas pequeos capaces de ejecutarparacin del sistema en front-ends y back-ends es un tipo se independientemente o combinados.
de abstraccin 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
81.2 Tecnologa
usuario, que pueden ser de muchas y variadas formas, y
los transforma ajustndolos a las especicaciones que demanda el back-end para poder procesarlos, devolviendo En radiotelescopios y antenas parablicas, el front-end
generalmente una respuesta que el front-end recibe y ex- consiste en un paquete que contiene a la antena de bopone al usuario de una forma entendible para este. La co- cina y a la gua de ondas, como un requisito para que las
nexin del front-end y el back-end es un tipo de interfaz. antenas detecten la seal de radio. El back end se reere
al amplicador y al ltro que rena y modica la seal
En diseo web (o desarrollo web) hace referencia a la vi- antes de presentarla al usuario.
sualizacin del usuario navegante por un lado (front-end),
y del administrador del sitio con sus respectivos sistemas En la automatizacin de diseo electrnico, el ciclo del
diseo, que es el front-end, equivale al diseo lgico y
por el otro (back-end).
elctrico (ej. captura esquemtica, sntesis lgica). A veMuchos mtodos conocidos para interactuar con ordenaces el boceto de una estructura (del ingls oorplanning),
dores pueden ser conceptualizados en trminos de front- es considerado como un front-end. Un place and route
end y back-end. Por ejemplo, un administrador de archi- (del idioma ingls, un lugar y ruta) o un diseo personavos grco como Windows Explorer, Dolphin, Nautilus lizado de la capa de vericacin fsica (design rule checy Finder puede ser considerado como un front-end para king), o una disposicin (layout) versus esquemtica, 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 ncleo del sistema En diseo de circuitos integrados de radiofrecuencia el
front-end hace referencia a los bloques de la cadena de
operativo que cumple el rol back-end.
recepcin que se encargan de ltrar, amplicar y traslaEn un compilador el front-end traslada el lenguaje del c- dar la seal de RF a banda base. Generalmente los blodigo fuente a una representacin intermedia que a su vez ques comprendidos son balun, amplicador de bajo ruido
funciona con el back-end para producir en la salida el c- (LNA), ltros y mezcladores de seal. Por otro lado, acdigo.
tualmente las tecnologas de radio denida por software
En sintetizadores del habla, el front-end se reere 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 blo154

81.4. REFERENCIAS
ques anteriormente citados.

81.3 Vase tambin


Arquitectura de software
Cliente-servidor
Programacin por capas

81.4 Referencias
[1] http://forum.wordreference.com/showthread.php?t=
215444
[2] http://es.bab.la/diccionario/ingles-espanol/back-end

155

Captulo 82

Fuga de memoria
Una fuga de memoria (ms conocido por el trmino
ingls memory leak) es un error de software que ocurre
cuando un bloque de memoria reservada no es liberada en
un programa de computacin. Comnmente ocurre porque se pierden todas las referencias a esa rea de memoria
antes de haberse liberado.

tos terminan su vida. A diferencia de la recoleccin de


basura, RAII tiene las ventajas de: saber cundo los objetos existen y saber cundo no. Se puede comparar los
siguientes ejemplos en C y C++:

/* Versin en C */ #include <stdlib.h> void f(int


n) { int* array = calloc(n, sizeof(int)); realiDependiendo de la cantidad de memoria perdida y el zar_otras_operaciones(); free(array); }
tiempo que el programa siga en ejecucin, este proble- // Versin 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 programacin en los que el manejo de memoria es
manual (C o C++ principalmente), y por lo tanto es el
programador el que debe saber en qu momento exacto puede liberar la memoria. Otros lenguajes utilizan un
recolector de basura o conteo de referencias que automticamente efecta esta liberacin. Sin embargo todava es
posible la existencia de fugas en estos lenguajes si el programa acumula referencias a objetos, impidiendo as que
el recolector llegue a considerarlos en desuso.

La versin en C requiere que el desarrollador haga la liberacin de memoria, a diferencia de la versin en C++.
Esto evita la sobrecarga de los esquemas de la recoleccin
de basura, e incluso puede ser aplicado a otros recursos
como:

Existen varias formas de luchar contra este problema.


Una forma es el uso de un recolector de basura incluso
en el caso en el que ste no sea parte estndar del lenguaje. El ms conocido recolector de basura usado de esta
manera es el Boehm-Demers-Weiser conservative garbage collector. Otras tcnicas utilizadas son la adopcin de
esquemas de conteo de referencias o el uso de pools de
memoria (tcnica menos popular, utilizada en el servidor
Apache y en el sistema de versiones Subversion).
Tambin hay herramientas paraauscultarun programa
y detectar las fugas. Una de las herramientas ms conocidas es Valgrind.

82.1 RAII

Handlesa archivos, que la recoleccin de basura


mark-and-sweepno maneja tan efectivamente
Ventanas que han de ser cerradas
Iconos en el rea de noticacin que han de ser ocultados
Cdigo de sincronizacin como monitores, secciones crticas, etc. que deben ser liberados para permitir que otros hilos de ejecucin(threads) los
obtengan
Handlesal registro de Windows que estn abiertos
Conexiones de red
Objetos GDI de Windows
Acciones a realizar cuando se termina una funcin
(o bloque de cdigo) en cualquier punto posible (la
accin la realiza el destructor de un objeto creado
cuando empieza la funcin)

"Adquirir Recursos es Inicializar", a menudo referido


por sus siglas en ingls RAII (de Resource Acquisi- 82.2 Fugas de memoria en lenguation Is Initialization), es un popular patrn de diseo
jes con recolector de basura
en varios lenguajes de programacin orientados a objetos
como C++, y Ada. RAII soluciona las fugas de memoria relacionando objetos con los recursos adquiridos, y Las fugas de memoria en lenguajes como JavaScript tamautomticamente liberando los recursos cuando los obje- bin son comunes, por ejemplo pueden ocurrir cuando
156

82.3. VASE TAMBIN


hay referencias circulares entre los objetos. Por ejemplo
un objeto ventana tiene una referencia a cada uno de sus
controles (botones, imgenes, etc), a su vez cada control
tiene una referencia a la ventana que lo contiene. Los
recolectores de memoria que usan conteo de referencias
pueden no darse cuenta que una ventana ya no es usada
porque sigue habiendo referencia a ella (de sus controles).
Estas fugas de memoria son muy comunes cuando se programa en forma despreocupada. Hay tcnicas para evitarlas (por ejemplo eliminar alguna de las referencias para
cortar el crculo).
En JavaScript ocurren tambin referencias circulares
cuando se escriben funciones dentro de otras, porque
cuando una funcin es escrita dentro de otra se mantiene una referencia a la que la incluye (para poder usar sus
variables). El concepto de clausura explica estos comportamientos.

82.3 Vase tambin


Memoria dinmica
Conteo de referencias
Recolector de basura

157

Captulo 83

Generacin de cdigo
En programacin, la generacin de cdigo es una de
las fases mediante el cual un compilador convierte un
programa sintcticamente correcto en una serie de instrucciones a ser interpretadas por una mquina. La entrada en esta fase viene representada, tpicamente, por
un rbol Sintctico, un rbol de Sintaxis Abstracta, o
una Representacin Intermedia; la mquina destino puede ser un microprocesador o una mquina abstracta tal
como una mquina virtual o un lenguaje intermedio, legible por un humano. Compiladores ms sosticados realizan mltiples traducciones en cadena (pipelining) con el
n de poder construir cdigo para mltiples plataformas y
evitar tener que construir todas las capas del compilador.
En trminos ms generales, la generacin de cdigo: es
usada para construir programas de una manera automtica evitando que los programadores tengan que escribir el
cdigo a mano. La generacin de cdigo puede realizarse en tiempo de ejecucin, Tiempo de carga, o Tiempo
de compilacin. Los compiladores JIT son un ejemplo de
generadores de cdigo.

83.1 Enlaces externos


FRAWA Framework for Web Applications development
Frawa

158

Captulo 84

Generador de nmeros aleatorios


internamente) un valor x0 , que llamaremos semilla, y, a
partir de l, se van generando x1 , x2 , x3 , ...
Siempre que se parta de la misma semilla, se obtendr la
misma secuencia de valores.
Por la condicin anterior, es evidente que todos los valores generados por este procedimiento son nmeros enteros entre 0 y m1 . El nmero mximo de cifras distintas
que pueden obtenerse con el procedimiento descrito es m
, as que llegar un momento en que el primer nmero generado se repetir producindose un ciclo.
El ciclo dnde inevitablemente caer el generador interesa que sea de la mayor longitud posible (como mximo m
Un generador de nmeros aleatorios es un dispositivo ), para evitar que se repitan pronto los valores aleatorios.
informtico o fsico diseado para producir secuencias de Por ejemplo, para los valores a = 3 , c = 5 , x0 = 2 y
m = 32 se obtiene la siguiente secuencia de valores:
nmeros sin un orden aparente.
211-6-23-10-3-14-15-18-27-22-7-26-19-30-31211-6

84.1 Algoritmos

La secuencia generada tiene como longitud 16 nmeros


(el nmero generado en la decimosptima posicin es el
Los algoritmos para la generacin de valores uni- 2 inicial, por lo que toda la secuencia se repite a partir de
formemente distribuidos estn presentes en todas las ah), muy inferior a la longitud mxima que podra tener
calculadoras y lenguajes de programacin, y suelen estar ( m =32). Determinadas elecciones de parmetros del gebasados en congruencias numricas del tipo:
nerador ( x0 , a , c y m ) conducen a ciclos de amplitud
mxima.
x
(ax + c) (mod m)
n+1

El xito de este tipo de generadores de valores de una


variable aleatoria depende de la eleccin de los cuatro
parmetros que intervienen inicialmente en la expresin
anterior:

Si c0:
m.c.d.(c, m) = 1
a 1 (mod p) para cada primo p de m
a 1 (mod 4) si 4 es divisor de m

El valor inicial o semilla: x0

Si c=0:

La constante multiplicativa: a

m es primo

La constante aditiva: c
El nmero m respecto al cual se calculan los restos

am1/p 1 (mod m) La condicin es que


NO SEA congruente para cada factor primo p
de m-1.

Estos cuatro valores deben ser nmeros enteros no nega- Por ejemplo, tomando como valores m = 25 = 32 ,
tivos y que cumplan la siguiente condicin: x0 , a, c < m a = 5 , x0 = 1 y c = 3 se obtiene la siguiente secuencia
.
de nmeros, que tiene longitud mxima:
La mayor parte de los generadores de nmeros aleatorios 18-11-26-5-28-15-14-9-16-19-2-13-4-23-22-17-24son, en realidad, pseudoaleatorios; se calcula (o introduce 27-10-21-12-31-30-25-0-3-18-29-20-7-6-1
159

160

CAPTULO 84. GENERADOR DE NMEROS ALEATORIOS

El standard POSIX C dene para la funcin de generacin


de nmeros seudoaleatorios los valores de c = 12345 ,
m = 32768 y a = 1103515245 .
Recientemente se ha descubierto que es posible generar verdaderos nmeros aleatorios mediante software.* [1]* [2]* [3]

84.2 Bibliografa
Alberto, Marva; Schwer, Ingrid; Cmara, Viviana; Fumero, Yanina (2005). Matemtica Discreta. Universidad Nac. del Litoral. p. 295. ISBN
9789875084315.
Blanco Castaeda, Liliana (2004). Probabilidad.
textos. Univ. Nacional de Colombia. p. 295. ISBN
9789587014495.

84.3 Enlaces externos


Generador de nmeros aleatorios on-line
Generador simple de nmeros aleatorios on-line
[1] True random numbers generator C++
[2] CPU Time Jitter Based Non-Physical True Random
Number Generator
[3] Software Random Number Generation Based on Race
Conditions

Captulo 85

Gledplay
GledPlay es un SDK para desarrollar juegos para cepto de Sprite. Las caractersticas principales de Gleddispositivos mviles. Los juegos construidos con Gled- Draw son:
Play corren sobre PC de escritorio con Microsoft Windows, PocketPC and Smartphones.
copiado rpido de supercies, con transparencia
alpha blending o color clave.
GledPlay contiene 4 mdulos de desarrollo:
GledDraw: Un framework de grcos 2D orientado
a Supercies, basado en DirectDraw.
GledVideo: Un reproductor de video integrado con
GledDraw.
GledSave: Un mdulo de abstraccin del Sistema de
archivos, que permita la lectura y escritura de archivos en paquetes.
GledApplication: Un mdulo especco para manejar los detalles de programacin no relacionados con
la lgica del juego.

Cambio de tamao, rotacin, e inversin de supercies.


Carga de archivos JPG, GIF, PNG y BMP.
Escritura de archivos PNG y BMP.
Supercies de 3 o 4 canales para simplicar las operaciones con transparencia.
Escritura de texto, con fuentes normales o con alpha
blended.
Manejo de animaciones
Clipping opcional

85.1 Dispositivos Soportados

Utilizacin de Shaders del sistema o personalizados,


para personalizar los efectos del copiado de supercies.

'GledPlay est construido para:


Microsoft Windows para computadores personales
de escritorio.
Pocket PC

Traduccin de Surface desde o hacia un HDC, para


permitir el uso de la librera estandard de windows
GDI sobre las supercies.
Puntos, lneas, y rectngulos, con manejo de transparencia.

Smartphones
GledPlay fomenta el desarrollo sobre PC de escritorio,
sin utilizar emuladores o dispositivos mviles reales. Una
vez nalizado el desarrollo con GledPlay para computadores de escritorio, la aplicacin se compila para las
plataformas deseadas utilizando el mismo cdigo. De esta manera se reduce el tiempo de desarrollo.

85.2 GledDraw
GledDraw es un framework de grcos 2D orientado a
Supercies, basado en DirectDraw. Se maneja con entidades llamadas supercies, que seran similares al con161

Clase panel, para utilizar coordenadas relativas en


los mtodos de dibujo, y facilitar la modularizacin.
Fullscreen en PC. (Los modos soportados son:
320X240, 640X480, 800X600, 1024X768)
Zoom X2 opcional en desktop PC para facilitar la
deteccin de errores.
Soporte para Dispositivos de Altas Resoluciones
(VGA en PPC, QVGA en SP, y dispositivos de pantallas cuadradas).
Soporte para Pocket Pcs y Smartphones con pantallas cuadradas.

162

85.3 GledVideo
Las principales funcionalidades de GledVideo son:
reproduccin de videos OGG Theora
Manejo de subtitulos, utilizando an archivo de subtitulos SubRip

85.4 GledSave
GledSave provee un API comn para acceder a diferentes sistemas de archivo, basado en Jakarta's Common Virtual File System. Es una interfaz simple que permite acceder a diferentes sistemas de la misma manera. Funciona
para:
Computadores de escritorio con MS Windows.
Pocket PC
Smartphones
Archivos ZIP

85.5 GledApplication
GledApplication maneja los detalles especcos de la
programacin que no estn relacionadas con la lgica del
juego como la inicializacin de threads, el manejo de
eventos, el ciclo del juego, los estados del juego, etc.
Manejo de la aplicacin como inicio y n.
Conguracin de la mquina de estados para usar
diferentes ciclos.
Manipulacin de los fps.

85.6 Enlaces externos


GledPlay site(en ingls)
GledPlay source code
Wiki de GledPlay con tutoriales y artculos(en ingls)
Foro de GledPlay Forum en PocketMatrix

CAPTULO 85. GLEDPLAY

Captulo 86

GPGPU
GPGPU o General-Purpose Computing on Graphics Processing Units es un concepto reciente dentro de
informtica que trata de estudiar y aprovechar las capacidades de cmputo de una GPU.

que generalmente no se puede leer y escribir en la misma


textura, si esta operacin es imprescindible para el desarrollo del algoritmo, ste se debe dividir en varias pasadas.

Una GPU es un procesador diseado para los cmputos


implicados en la generacin de grcos 3D interactivos.
Algunas de sus caractersticas (bajo precio en relacin
a su potencia de clculo, gran paralelismo, optimizacin
para clculos en coma otante), se consideran atractivas para su uso en aplicaciones fuera de los grcos por
computadora, especialmente en el mbito cientco y de
simulacin. As, se han desarrollado tcnicas para la implementacin de simulaciones de uidos, bases de datos,
algoritmos de clustering, etc.

Pese a que cualquier algoritmo que sea implementable en


una CPU lo es tambin en una GPU, esas implementaciones no sern igual de ecientes en las dos arquitecturas.
En concreto, los algoritmos con un alto grado de paralelismo, sin necesidad de estructuras de datos complejas
y con una alta intensidad aritmtica son los que mayores
benecios obtienen de su implementacin en la GPU.

86.1 Modelo
GPU

de

programacin

Debido a las diferencias fundamentales entre las arquitecturas de la GPU y la CPU, no cualquier problema se
puede beneciar de una implementacin en la GPU. En
concreto, el acceso a memoria plantea las mayores dicultades. Las CPU estn diseadas para el acceso aleatorio a memoria. Esto favorece la creacin de estructuras
de datos complejas, con punteros a posiciones arbitrarias en memoria. En cambio, en una GPU, el acceso a
memoria est mucho ms restringido. Por ejemplo, en un
procesador de vrtices (la parte de una GPU diseada para transformar vrtice en aplicaciones 3D), se favorece el
modelo scatter, en el que el programa lee en una posicin
predeterminada de la memoria, pero escribe en una o varias posiciones arbitrarias. En cambio, un procesador de
pxeles, o fragmentos, favorece el modelo gather, pudiendo el programa leer de varias posiciones arbitrarias, pero
escribir en slo una posicin predeterminada.
La tarea del diseador de algoritmos GPGPU consiste
principalmente en adaptar los accesos a memoria y las
estructuras de datos a las caractersticas de la GPU. Generalmente, la forma de almacenar datos es en un buer
2D, en lugar de lo que normalmente sera una textura. El
acceso a esas estructuras de datos es el equivalente a una
lectura o escritura de una posicin en la textura. Puesto

86.2 Herramientas
Tradicionalmente, el desarrollo de software GPGPU se
haba hecho bien en lenguaje ensamblador, o bien en alguno de los lenguajes especcos para aplicaciones grcas usando la GPU, como GLSL, Cg o HLSL. Pero
recientemente han surgido herramientas para facilitar el
desarrollo de aplicaciones GPGPU, al abstraer muchos de
los detalles relacionados con los grcos, y presentar una
interfaz de ms alto nivel. Una de ellas es BrookGPU,
desarrollada en la Universidad de Stanford, consistente
en una extensin a ANSI C que proporciona nuevos tipos
de datos y operaciones (stream, kernel, reduction, etc.) automticamente convertidos a una implementacin que aprovecha la GPU sin intervencin explcita por parte del programador. Otra herramienta con
objetivos similares es Sh, una extensin de C++ para
metaprogramacin con una implementacin automtica
en la GPU. La opcin ms extendida en la actualidad es
CUDA, de NVidia, una extensin de C que permite la codicacin de algoritmos en GPU de NVidia. Por ltimo,
podemos incluir en esta discusin a OpenCL, una combinacin de interfaz y lenguaje de programacin para el
desarrollo de aplicaciones paralelas que puedan ser ejecutadas, de forma transparente, en diversas unidades de
procesamiento (CPU multincleo, GPU, etc.).

163

164

86.3 Crticas
Pese a que las ventajas del uso de la GPU para ciertas
aplicaciones es evidente, no faltan las crticas, generalmente referidas a la inconveniencia de usar un procesador
para nes completamente diferentes a lo que se pensaba
al disearlos. Un argumento comn es la falta de continuidad de las arquitecturas usadas. Debido a la rpida
evolucin del hardware grco, implementaciones de algoritmos que funcionaban ptimamente en un modelo de
GPU, dejan de hacerlo, o lo hacen subptimamente en
un modelo posterior. Otra crtica es la falta de precisin
de los registros de coma otante presentes en las GPU.
Generalmente, se utilizan 2 o 4 bytes para representar un
nmero real en una GPU, que en comparacin con los 4,
8 o ms usados en las CPU modernas, no es suciente
para muchas aplicaciones cientcas.

86.4 Otros
Microsoft ha terminado de desarrollar la nueva versin 11
de su API Direct3D. A pesar de que la anterior versin,
Direct3D 10, es relativamente nueva, debido a la cantidad de novedades que estn apareciendo ltimamente en
el mundo de las tarjetas grcas, entre ellas el teselado,
Microsoft desarroll esta nueva versin, en la que cabe
destacar la nueva tecnologa de computacin de shaderspara permitir que la GPU no sea solamente usada
para grcos 3D y as puedan los desarrolladores tomar
ventaja de las tarjetas grcas como procesadores en paralelo.
El proyecto de computacin distribuida Folding@home,
creado por la Universidad de Stanford, ha dado soporte
para utilizar la potencia computacional de la GPU, adems de la CPU. Pruebas recientes hablan de que son posibles ganancias de rendimiento de hasta 40 veces una CPU
Intel Pentium 4, aunque claro, todo esto depende de la
GPU utilizada.

86.5 Vase tambin


CUDA
Close to Metal
Graphics Processing Unit
Larrabee (GPU)
OpenCL
Intel MIC
Direct Rendering Manager

CAPTULO 86. GPGPU

86.6 Enlaces externos


Portal que aglomera noticias, publicaciones y enlaces sobre el avance de, GPGPU (en ingls).
Pgina del proyecto BrookGPU (en ingls).
Pgina de soporte GPU para Folding@home (en ingls).
Pgina del proyecto Sh (en ingls).
Explicacin sobre sus posibilidades (en espaol).
Artculo que explica algunos benecios (en ingls).

Captulo 87

Hackathon
Un hackathon o hackatn, es un trmino usado en las
comunidades hacker para referirse a un encuentro de
programadores cuyo objetivo es el desarrollo colaborativo de software, aunque en ocasiones puede haber tambin
un componente de hardware. Estos eventos pueden durar
entre dos das y una semana. El objetivo es doble: por un
lado hacer aportes al proyecto de software libre que se
desee y, por otro, aprender sin prisas.* [1]

[2] Caldeiro, Graciela; Merpert, Ariel y Odetti, Valeria.


Nuestro primer Hackaton (2013). PENT, Flacso Argentina, Disponible en: http://www.pent.org.ar/publicaciones/
nuestro-primer-hackaton

87.2 Enlaces externos

El trmino integra los conceptos de maratn y hacker,


aludiendo a un experiencia colectiva que persigue la meta comn de desarrollar aplicaciones de forma colaborativa en un lapso corto. Se cree que el trmino fue creado
en 1999 de forma independiente por los desarrolladores
de OpenBSD y el equipo de marketing de Sun Microsystems.
Algunos hackatons tienen propsitos educativos o sociales, aunque en muchos casos el objetivo es crear un software utilizable. Los Hackatons tienden a tener un enfoque
especco, que puede incluir el lenguaje de programacin
utilizado, el sistema operativo, una aplicacin, una API,
el destinatario o el grupo demogrco de los programadores. En otros casos, no hay ninguna restriccin sobre el
tipo de software que est siendo creado en el evento.
El hackatn, desde el punto de vista organizativo, supone
una dinmica horizontal e intensiva en donde los participantes complementan experiencias y habilidades individuales con el propsito de desarrollar soluciones concretas. De all que para los especialistas en educacin, el
hackatn posea ciertas caractersticas propias de un dispositivo pedaggico en tanto promueve el trabajo colaborativo entre pares orientado a la resolucin de problemas, hace foco sobre el proceso de trabajo como instancia de aprendizaje y favorece la motivacin intrnseca de
los participantes. En 2015, en el campeonato de hackathon internacional en Barcelona, Pablo Pardo Alccer, el
representante de Bolivia, gan el primer puesto.* [2]

87.1 Referencias
[1] Harn una hackatn para promover alternativas a los
problemas porteos. diario La nacin. Consultado
el 13 de mayo de 2013.

165

CyberCamp Hackathon organizado por el INCIBE


Hackathon en la Universidad de Granada
HackathonExpress en la Ciudad de Corrientes
El Club de Emprendedores de la CEU-UAO organiza el maratn BCN Thinking Challenge

Captulo 88

Hacker
El trmino hacker tiene diferentes signicados. Segn el
diccionario de los hackers,* [1] es todo individuo que se
dedica a programar de forma entusiasta, o sea un experto entusiasta de cualquier tipo, que considera que poner
la informacin al alcance de todos constituye un extraordinario bien.* [2] De acuerdo a Eric Raymond el motivo
principal que tienen estas personas para crear software en
su tiempo libre, y despus distribuirlos de manera gratuita, es el de ser reconocidos por sus iguales.* [3]El trmino
hacker nace en la segunda mitad del siglo XX y su origen
est ligado con los clubes y laboratorios del MIT.

depuran y arreglan errores en los sistemas (White


hats) y a los de moral ambigua como son losGrey
hats.
Una comunidad de entusiastas programadores y
diseadores de sistemas originada en los sesenta alrededor del Instituto Tecnolgico de Massachusetts (MIT), el Tech Model Railroad Club
(TMRC) y el Laboratorio de Inteligencia Articial del MIT.* [5]Esta comunidad se caracteriza
por el lanzamiento del movimiento de software libre.How To Become A Hacker.El [[Request for

88.1 Otros signicados

comments|RFC]] 1392* [6] amplia este signicado como


persona que se disfruta de un conocimiento profundo del
En informtica, un hacker,* [4] es una persona que perte- funcionamiento interno de un sistema, en particular de
nece a una de estas comunidades o subculturas distintas, computadoras y redes informticas Leer historia del
pero no completamente independientes:
trmino
La comunidad de acionados a la informtica domstica, centrada en el hardware posterior a los setenta y en el software (juegos de computadora, crackeo de software, la demoscene) de entre los ochenta/noventa.
Se utiliza la palabra Hacker, para describir a una
persona que practica la programacin informtica,
con una especie de pasin artstica, o que forma parte de la cultura de los hackers, es decir al grupo de
programadores que histricamente estn en los orgenes de Internet, en Linux y en la World Wide Web.

El emblema hacker, un proyecto para crear un smbolo reconocible para la percepcin de la cultura hacker.

Desde que se us por primera vez la palabra Hacker


sta ha sido mal utilizada, mal interpretada y encasillada en un contexto errado, antes que nada, aclaremos que el trmino Hacker no tiene nada que ver
con actividades delictivas, si bien muchos Hackers
cometen errores, la denicin no tiene nada que ver
con ello.

En seguridad informtica este trmino concierne


principalmente a entradas remotas no autorizadas
por medio de redes de comunicacin como Internet

( Black hats). Pero tambin incluye a aquellos que

Denicin 1: Trmino para designar a alguien con


talento, conocimiento, inteligencia e ingenio, especialmente relacionadas con las operaciones de
computadora, redes, seguridad, etc.

166

88.2. HISTORIA

167

Denicin 2: Persona que disfruta aprendiendo de- Los hackers de MIT crearon su propio sistema operativo,
talles de los sistemas de programacin y cmo ex- el ITS que usaba el lenguaje LISP.* [10]
tender sus capacidades, tan intensamente como, al
contrario, muchos usuarios preeren aprender slo
88.2.2 UNIX
el mnimo necesario.
No obstante, ms all de las deniciones del trmino
Hackervinculadas al mundo informtico o tecnolgico, cabe destacar el uso de esta palabra por extensin (y
de hecho as fue en sus inicios el origen de la misma) a
toda persona que implementa soluciones para cualquier
sistema, sea informtico o no, de manera que ste pueda emplearse de formas no pensadas por quienes crearon
dichos sistemas. As mismo, el trmino Hacker est indisolublemente unido a toda persona que manipula o que
posee conocimientos prcticos que modican los usos de
Placa que dicevive libre o muere UNIX* *marca registrada de
las cosas de modo que stas puedan emplearse para nes
laboratorios Bell
no previstos en su origen. De ah el uso de los trminos
dehackeadocomo sinnimo dealterado en su nes
Al mismo tiempo que ARPANET naca, tambin era
para cumplir otras funciones.
creado el sistema

88.2 Historia
En 1961 el MIT, el Massachusetts Institute of Technology, adquiri la microcomputadora PDP-1, lo que atrajo la curiosidad de un grupo de estudiantes que formaban parte del Tech Model Railroad Club, TMRC, ya que
podran interactuar directamente con ella mediante cdigos de programacin. Debido a que la microcomputadora
tardaba mucho en encender, se quedaba prendida toda la
noche haciendo que los miembros del TMRC tuvieran acceso a ella y pudieran empezar a experimentar, uno de los
logros ms famosos de estos experimentos fue la creacin
del videojuego Spacewar. Tiempo despus algunos miembros del TMRC se volvieron miembros del Laboratorio
de Inteligencia Articial del MIT y se llevaron con ellos
la tradicin de jugarse bromas inocentes entre ellos, a las
cuales llamaban hacks. Fueron los miembros de este laboratorio los primeros en autonombrarse hackers.* [7] Esta
comunidad se caracteriza por el lanzamiento del movimiento de software libre. La World Wide Web e Internet
en s misma son creaciones de hackers.* [8]

88.2.1

ARPANET

Despus de 1969 el laboratorio de Inteligencia Articial


del MIT fue conectado a la ARPANET desde donde pudo
tener contacto con otros departamentos de investigacin
informtica de otras universidades como Stanford y Bolt
Beranek & Newman. Con sta nueva forma de comunicacin los estudiantes empezaron a colaborar con otros a
pesar de la distancia. A partir de este momento se empez a formar una cultura y naci el Jargon le, documento
que tena una lista de trminos que se usaban en su jerga coloquial y que se origin en Standford en 1987..* [9]

operativo UNIX en los laboratorios bell. UNIX, junto con


el lenguaje C eran muy portables y compatibles con las
mquinas, de hecho UNIX tena incluso su propia conexin con otras mquinas que tuvieran UNIX y el cual
recibi el nombre de Usenet. Para 1980 los primeros sitios en Usenet empezaban a transmitir noticias, formando
una gran red de distribucin que crecera ms que ARPANET.* [11]
Ambos grupos de hackers estaban divididos y era poco
comn que alguien que usara UNIX tambin usara ARPANET. En 1983 se cancel la distribucin de la PDP10, la cual fuera una de las microcomputadoras favoritas
de los hackers y en la cual se construy el ITS. Despus de
la cancelacin de esta microcomputadora por parte de la
Digital Equipment Corporation la variante de UNIX creada en Berkeley se convirti en el sistema hacker por excelencia,* [12] y fue por esa poca que Richard M. Stallman,
inventor del editor Emacs, cre la Free Software Foundation

88.2.3 GNU
En 1983 Stallman buscaba crear un propio sistema operativo de tipo UNIX que estuviese disponible de forma
libre* [13], y fund el proyecto GNU (acrnimo de GNU
No es UNIX). Stallman sustituy el copyright o todos los
derechos reservados, por el copyleft o todos los derechos
reversados, con lo que buscaba que cualquier programa
publicado en la red por la FSF pudiera ser utilizado y
modicado bajo una licencia de la Fundacin y con la
condicin de difundir las modicaciones que se llegasen
a hacer al programa tambin respetando las libertades del
usuario. Otro de sus logros fue haber popularizado el trmino "software libre" en un intento de conseguir su objetivo y ponerle nombre al producto de toda cultura hacker.* [14]

168

88.2.4

CAPTULO 88. HACKER

LINUX

muy poca ticay la catalogan comoun grito de batalla


-que- no pone lmites a los hackers* [18] Sin embargo,
para otras personas, como Linus Torvalds sta tica va de
acuerdo al trabajo del hacker que es interesante, emocionante y algo que se goza, adjetivos que en ocasiones
son usados por los mismos hackers para describir su trabajo, lo que tambin limita la restriccin que tienen sobre
la libertad de usar informacin.* [19]

En 1991, un estudiante de la Universidad de Helsinki,


Linus Torvalds diseaba su propio UNIX sobre la base
de la fundacin y public la fuente de su cdigo en la red
pidiendo ayuda para perfeccionarlo. Con ayuda de cientos de programadores que se pusieron a la tarea de ayudar
a Linux con el cdigo, se desarrolla el sistema operativo
Linux, que originalmente tena el nombre de Freix. Hoy
De acuerdo a Raymond, la tica social del hacker se basa
en da es promocionado por diferentes gobiernos, como
en tres principios:
el de Francia, y siempre est en cdigo abierto y sin derechos de propiedad sobre l.* [15]
1. La creencia de que compartir informacin es bueno

88.3 tica hacker

2. Que los hackers tienen una responsabilidad tica de


compartir la informacin con la que trabajan
3. Que los hackers deberan facilitar el acceso a
computadoras cuando sea posible* [20]

88.4 Controversia

Steven Levy, autor de Hackers: heroes of the computer revolution

En 1984, Steven Levy publica el libro Hackers: heroes of


the computer revolution en el cual se ve por primera ocasin la idea de la tica hacker, donde se maniesta una
tica de libre acceso a la informacin y cdigo fuente del
software. Levy se bas en entrevistas para poder identicar seis principios bsicos relacionados con las creencias
y operaciones de hackers para hacer sta tica.* [16] De
acuerdo a Levy los seis fundamentos del hacker son:

En la actualidad se usa de forma corriente para referirse mayormente a los criminales informticos, debido a su
utilizacin masiva por parte de los medios de comunicacin desde la dcada de 1980.* [21] Segn Helen Nissenbaum que los hackers sean mal vistos ayuda al gobierno
y a los poderes privados con dos cosas: 1) a denir lo que
es normal en el mundo computacional haciendo creer que
un buen ciudadano es todo lo que el hacker no es; 2) a justicar la seguridad, la vigilancia y el castigo.* [22]
A los criminales se le pueden sumar los llamados "script
kiddies", gente que invade computadoras, usando programas escritos por otros, y que tiene muy poco conocimiento sobre cmo funcionan. Este uso parcialmente incorrecto se ha vuelto tan predominante que, en general, un gran
segmento de la poblacin no es consciente de que existen
diferentes signicados.

Mientras que los hackers acionados reconocen los tres


1. El acceso a los computadores debe ser ilimitado y tipos de hackers y los hackers de la seguridad informtica aceptan todos los usos del trmino, los hackers del
total.
software libre consideran la referencia a intrusin informtica como un uso incorrecto de la palabra, y se re2. Toda informacin debera ser libre
eren a los que rompen los sistemas de seguridad como
3. Es necesario promover la descentralizacin y des- "crackers" (analoga de safecracker, que en espaol
conar de las autoridades
se traduce como un ladrn de cajas fuertes).
4. Los hackers deberan ser juzgados por su labor y no
por cosas como su raza, edad o posicin social

88.4.1 Ambigedad y debate

5. Se puede crear arte y belleza en un computador


Los trminos hacker y hack pueden tener connotaciones
6. Las computadoras pueden cambiar tu vida para me- positivas y negativas. Los programadores informticos
jor* [17][www.hackerethic.org]
suelen usar las palabras hacking y hacker para expresar
admiracin por el trabajo de un desarrollador cualicado
Sin embargo, la tica hacker genera controversia y hay de soporte lgico, pero tambin se puede utilizar en un
personas, como el estudiante de derecho Patrick S. Ryan sentido negativo (delincuentes informticos) para descrique critican que la [[tica hacker]] y consideran quehay bir una solucin rpida pero poco elegante a un problema.

88.6. TERMINOLOGA
Algunos* [quin?] desaprueban el uso del hacking como
un sinnimo de cracker, en marcado contraste con el resto
del mundo,* [dnde?] en el que la palabra hacker se utiliza normalmente para describir a alguien que se inltra
en un sistema informtico con el n de eludir o desactivar
las medidas de seguridad.* [23]

169
clasicada que se considera debe estar, por denicin, a
disposicin de la sociedad (casos de WikiLeaks o las ltraciones de Snowden sobre las actividades militares y
casos de espionaje gubernamentales).

Por tanto, el fenmeno hacker tiene un importante componente de aperturismo y liberacin de conocimientos e
En un principio se utilizaba hackcomo verbo para informacin que, a travs del activismo de estos especiaexpresar perder el tiempo(e.j. Puedo hackear con listas, benecian a la sociedad en general.
el computador), el signicado del trmino ha cambiado En este caso, los roles de un hacker pueden entenderse en
a lo largo de dcadas desde que empez a utilizarse en un cuatro aspectos:
contexto informtico. Como su uso se ha extendido ms
ampliamente, el signicado primario de la palabra, por
Apoyar procesos de apropiacin social o comunitaparte de los nuevos usuarios, ha pasado a uno que entra
ria de las tecnologas.
en conicto con el nfasis original.

88.5 Activismo

Poner a disposicin del dominio pblico el manejo tcnico y destrezas alcanzadas personal o grupalmente.
Crear nuevos sistemas, herramientas y aplicaciones
tcnicas y tecnolgicas para ponerlas a disposicin
del dominio pblico.
Realizar acciones de hacktivismo tecnolgico con el
n de liberar espacios y defender el conocimiento
comn y abierto.

88.6 Terminologa
En sentido amplio el trmino Hacker o Hacking se puede asociar
a movimientos sociales que promueven cambios en los modos de
vida.

Desde el ao 2002-2003, se ha ido congurando una perspectiva ms amplia del hacker, pero con una orientacin a su integracin al hacktivismo en tanto movimiento. Aparecen espacios autnomos denominados hacklab
o hackerspace y los hackmeeting como instancias de dilogo de hackers. Desde esta perspectiva, se entiende al
hacker como una persona que es parte de una conciencia
colectiva que promueve la libertad del conocimiento y la
justicia social.
Se entiende, por tanto, el Hacktivismo como el empleo de
las destrezas tcnicas ms diversas, en pro de nes sociales, ecolgicos, humanitarios o de cualquier otra ndole
con repercusin o tendente a la defensa de los derechos
humanos.
As, el Hacktivismo debe ser entendido no desde un prisma reduccionista como equivalente siempre al desarrollo
de actividades subversivas. Encontramos ramicaciones
del hacktivismo en la liberacin de conocimiento (como
puede ser la misma Wikipedia, en la que los conocimientos informticos y tcnicos de sus creadores dieron lugar
a toda una revolucin en el modo de crear y compartirse el conocimiento humano ms all de barreras acadmicas o comerciales); O en la liberacin de informacin

88.6.1 OverHat
Un trmino acuado a mediados del ao 2014 por
un Hacker de la comunidad Underground llamado
T4r4t3uX* [24], quien deni como sobre el sombreroa todos los profesionales vinculados con las artes Hacking. En un corto escrito, explica como a travs del tiempo deben comprender y aprender todas las formas existentes deHackeo. Lo cual causa una doble moral, por
un lado existe la tica a la cual han sido eles y por ello
prestan servicios profesionales a miles de empresas en el
mundo asegurando su infraestructura; por otro, conocer
y usar mtodos propios de los BlackHat que incluyen ataques de denegacin de servicio e ingeniera social agresiva entre otros. Segn el escrito, estn por encima del bien
y del mal electrnico, lo cual concluye que solo una amplia capacidad moral autodeterminada por ellos mismos
los convierte en profesionales con la capacidad de determinar adecuadamente y con las regulaciones de la actual
sociedad.

88.6.2 White hat y black hat


Un hacker de sombrero blanco (del ingls, white hat),
en jerga informtica, se reere a una tica hacker que se
centra en asegurar y proteger los sistemas de tecnologas

170

CAPTULO 88. HACKER

de la informacin y la comunicacin.* [25] Estas perso- 88.6.5 Lamer o script-kiddie


nas suelen trabajar para empresas de seguridad informtica las cuales los denominan, en ocasiones, zapatillas o Es un trmino coloquial ingls aplicado a una persona falequipos tigre.* [26]
ta de habilidades tcnicas, generalmente no competente
Por el contrario, los hackers de sombrero negro (del en la materia, que pretende obtener benecio del hacingls, black hat), tambin conocidos como "crackers" king sin tener los conocimientos necesarios. Su alcance
muestran sus habilidades en informtica rompiendo sis- se basa en a buscar y descargar programas y herramientas
temas de seguridad de computadoras, colapsando servi- de intrusin informtica, cibervandalismo, propagacin
dores, entrando a zonas restringidas, infectando redes o de software malicioso para luego ejecutarlo como simple
apoderndose de ellas, entre otras muchas cosas utilizan- usuario, sin preocuparse del funcionamiento interno de
estos ni de los sistemas sobre los que funcionan. En mudo sus destrezas en mtodos hacking.
chos casos presume de conocimientos o habilidades que
En los ltimos aos, los trminos sombrero blanco y no posee.
sombrero negro han sido aplicados a la industria del
posicionamiento en buscadores (search engine optimization, SEO), originando la denominacin black hat SEO. 88.6.6 Newbie
Las tcticas de posicionamiento en buscadores de los hackers de sombrero negro, tambin llamada spamdexing, in- Newbie es un alguien nuevo al hacking o al phreaking
tento de redireccionar los resultados de la bsqueda a p- y que no posee casi nada de conocimiento o experienginas de destino particular, son una moda que est en con- cia en el manejo de tecnologa y hacking. El origen del
tra de los trminos de servicio de los motores de busque- trmino es incierto. Usos ms tempranos probablemente
da, mientras que los hackers de sombrero blanco, utilizan datan de nales del siglo XX Estados Unidos Fuerzas Armtodos que son generalmente aprobados por los motores madas jerga , aunque posibles trminos precursoras son
de bsqueda.
mucho ms temprano. Formas variantes del nombre incluyen Newby y newbee, mientras que el trmino relacionado novato (n00b menudo deletreado) se utiliza a menudo en los juegos en lnea.

88.6.3

Samuri

Normalmente es alguien contratado para investigar fallos


de seguridad, que investiga casos de derechos de privacidad, est amparado por la primera enmienda estadounidense o cualquier otra razn de peso que legitime acciones semejantes. Los samuris desdean a los crackers y a
todo tipo de vndalos electrnicos. Tambin se dedican a
hacer y decir cmo saber sobre la seguridad con sistemas
en redes* [27]

88.6.4

Phreaker

De phone freak (monstruo telefnico). Son personas


con conocimientos amplios tanto en telfonos modulares
(TM) como en telfonos mviles.
La meta de los phreakers es generalmente superar retos
intelectuales de complejidad creciente, relacionados con
incidencias de seguridad o fallas en los sistemas telefnicos, que les permitan obtener privilegios no accesibles de
forma legal.
El trmino Phreakes una conjuncin de las palabras
phone (telfono en ingls), hack y freak (monstruo en ingls). Tambin se reere al uso de varias frecuencias de
audio para manipular un sistema telefnico, ya que la palabra phreak se pronuncia de forma similar a frequency
(frecuencia).

88.7 Vase tambin


88.8 Referencias
[1] Jargon le, The Jargon File, version 4.4.8, sitio digital
'Catb'.
[2] {{cita libro|apellidos1=Himanen|nombre1=Peka|ttulo=La
tica del hacker y el espritu de la era de la
informacin|fecha=2002|pginas=5-11|fechaacceso=9 de
febrero de 2015}}
[3] {{cita libro|apellidos1=Raymond|nombre1=Eric|ttulo=The
Art of Unix Programming|fecha=2003|pginas=8791|url=http://www.catb.org/esr/writings/taoup/
html/|fechaacceso=9 de febrero de 2015}}
[4] Hacker culture(s): Origins. Archivado desde el original
el 30 de noviembre de 2015.
[5] http://www.catb.org/~{}esr/writings/cathedral-bazaar/
hacker-history/ar01s02.html
[6] RFC 1392 - Internet Users\x27 Glossary.
[7] Raymond, Eric (2003). The Art of Unix Programming. pp.
8791. Consultado el 9 de febrero de 2015.
[8] {{cita web | url =http://catb.org/~{}esr/faqs/
hacker-howto.html#what_is | ttulo =How To Become A Hacker }}

88.9. DESCRIPCIN

171

[9] {{cita libro|apellidos1=Raymond|nombre1=Eric|ttulo=The [23] {{cita


publicacin|apellido=Rodrguez|nombre=Pablo
Art of Unix Programming|fecha=2003|pginas=87Gustavo|ttulo=La criminalizacin discursiva de los
91|url=http://www.catb.org/esr/writings/taoup/
hackers en los medios de prensa|publicacin=VII
html/|fechaacceso=9 de febrero de 2015}}
Jornadas Nacionales de Investigadores en Comunicacin|fecha=18 de septiembre de 2004|ao=2004|url=http:
[10] Raymond, Eric Steven (2000). A Brief History of Hacker//sedici.unlp.edu.ar/handle/10915/5347|fechaacceso=19
dom.
de junio de 2014}}
[11] Raymond, Eric Steven (2000). A Brief History of Hackerdom.
[12] {{cita
libro|apellidos1=Raymond|nombre1=Eric
Steven|ttulo=A
Brief
History
of
Hackerdom|fecha=2000|fechaacceso=12 de febrero de 2015}}
[13] {{cita web|url=http://gnu.org

[24]
[25] [http://searchsecurity.techtarget.com/sDefinition/0,
,sid14_gci550882,00.html Qu es sombrero blanco? una denicin de Whatis.com (en ingls)]
[26] [http://www.catb.org/jargon/html/T/tiger-team.html
tiger team (en ingls)]

[14] {{cita libro|apellidos1=Raymond|nombre1=Eric|ttulo=The [27] Delitos Informaticos - Hacking. Consultado el 2009.


Art of Unix Programming|fecha=2003|pginas=8791|url=http://www.catb.org/esr/writings/taoup/
html/|fechaacceso=9 de febrero de 2015}}

88.9 Descripcin

[15] Castells, Manuel (2003). Internet, libertady sociedad:


una perspectiva analtica. Polis.Revista Latinoamericana.
Consultado el 8 de febrero de 2015.

Denicin de hacker en el Jargon File (ingls)

[16] {{cita publicacin|apellidos1=Greenhill|nombre1=Kathryn|ttulo=Transformando


la biblioteca pblica: de conservadores de ediciones impresas a creadores de contenido digital|publicacin=Congreso Nacional de Bibliotecas Pbli
Wikimedia Commons alberga contenido multicas|fecha=2010|url=http://www.mcu.es/bibliotecas/
media sobre HackerCommons.
docs/MC/2010/CongresoBP/KathrynGreenhill.
pdf|fechaacceso=9 de febrero de 2015}}
Ocina Federal de Investigaciones (en ingls) y (en

88.10 Enlaces externos

[17] {{cita libro|apellidos1=Levy|nombre1=Steven|ttulo=Hackers:


heroes
of
the
computer
revolution|fecha=1984|fechaacceso=12 de febrero de 2015}}

espaol)

Contact Us En Espaol (Sic)


[18] {{cita publicacin|apellidos1=Ryan|nombre1=Patrick|ttulo=War,
Peace, or Stalemate: Wargames, Wardialing,
Wardriving and the Emergint Market for Hacker
Ethics.|publicacin=Papers.ssrn.com|url=http:
//papers.ssrn.com/sol3/papers.cfm?abstract_id=
585867|fechaacceso=5 de febrero de 2015}}
[19] {{cita publicacin|apellidos1=Chance|nombre1=Tom|ttulo=The
Hacker Ethic and Meaningful Work|fecha=2005|url=http:
//flosshub.org/system/files/chance.pdf|fechaacceso=12
de febrero de 2015}}
[20] {{cita publicacin|apellidos1=Chance|nombre1=Tom|ttulo=The
Hacker Ethic and Meaningful Work|fecha=2005|url=http:
//flosshub.org/system/files/chance.pdf|fechaacceso=12
de febrero de 2015}}
[21] {{cita libro|apellidos1=Himanen|nombre1=Peka|ttulo=La
tica del hacker y el espritu de la era de la
informacin|fecha=2002|pginas=5-11|fechaacceso=9 de
febrero de 2015}}
[22] {{cita publicacin|apellidos1=Nissenbaum|nombre1=Helen|ttulo=Hackers
and
the
contested
ontology
of
cyberspace|publicacin=New
Media
&
Society|fecha=2004|volumen=6|nmero=2|pginas=195217|doi=10.1177/1461444804041445|fechaacceso=12
de febrero de 2015}}

Captulo 89

Heisenbug
En jerga de programacin, un heisenbug es un tipo de
bug que parece desaparecer o comportarse de otro modo
al intentar ser observado en detalle.* [1] El trmino es un
juego de palabras a partir del nombre de Werner Heisenberg, el fsico que dedujo el efecto de observacin de la
mecnica cuntica, segn el cual el mero hecho de observar un sistema de una manera determinada altera el
estado de este.

89.2 Enlaces externos

Trminos similares como bohrbug, mandelbug,* [2]* [3]* [4] y schrdinbug* [5]* [6] han sido
propuestos ocasionalmente para otro tipo de bugs
inusuales;* [7]* [8] de todos modos, no son tan conocidos
ni empleados como el heisenbug.* [9]

89.1 Referencias
[1] The Jargon File: heisenbug.
[2] The Jargon File: Mandelbug. Catb.org. Consultado el 5
de septiembre de 2013.
[3] Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996
[4] Clarke, Arthur C., The Ghost from the Grand Banks, Bantam Books, 1990
[5] The Jargon File: Schroedinbug. Catb.org. Consultado el
5 de septiembre de 2013.
[6] Raymond, Eric S.; The New Hacker's Dictionary, 3rd edition, 1996
[7] The following article investigates the various denitions
of bohrbug, mandelbug and heisenbug proposed in the literature, as well as the statements made about the relationships between these fault types: Grottke, Michael; and
Trivedi, Kishor S.; Software Faults, Software Aging and
Software Rejuvenation, Journal of the Reliability Engineering Association of Japan, Vol. 27, No. 7, pp. 425-438,
2005.
[8] Grottke, Michael; and Trivedi, Kishor S.; Fighting Bugs:
Remove, Retry, Replicate, and Rejuvenate, IEEE Computer
vol. 40, no. 2 (February 2007), pp. 107-109
[9] A February 2012 Google Books search returns about 70
hits for schroedinbug, 100 for mandelbug, 400
for bohrbugor heisenbug.

172

The Heisenberg Debugging Technology


A Story About Magic

Captulo 90

Hoja de estilo
Las hojas de estilo (style sheets) son conjuntos de instrucciones, a veces en forma de archivo anexo, que se asocian a los archivos de texto y se ocupan de los aspectos de
formato y de presentacin de los contenidos: tipo, fuente y tamao de letras, alineacin y posicionamiento del
texto, colores y fondos, etc. Las hojas de estilo permiten
liberar la composicin del texto de los aspectos visuales
y favorecen que se estructure y anote mediante cdigos
que permiten un tratamiento ms ecaz de los contenidos.
El uso adecuado de las hojas de estilo es uno de los aspectos clave de la edicin digital. Las hojas de estilo son
una herramienta de gran utilidad de los programas de
tratamiento de textos, como OpenOce.org o Microsoft
Word. Asimismo, constituyen una parte esencial de los
lenguajes de marcas para edicin digital: LaTeX, XML
y XHTML. Dos lenguajes de hojas de estilo son CSS y
XSL.

Hojas de estilo para la Web: Trucos y sugerencias


para CSS (Este documento es una traduccin del tutorial CSS tips & trickspropiedad de Bert Bos
publicado en el sitio de W3C.)

90.3 Referencias

90.1 Vase tambin


Em (tipografa)
LaTeX
XML
XHTML
CSS
XSL
CMS

90.2 Enlaces externos


Ejercicios de Hojas de Estilo, preparados para un
curso de edicin digital de la Universidad de Deusto.
Tutorial de Hojas de Estilo, con ejemplos y el listado
de las propiedades reconocidas.
Hojas de Estilo Web (Este documento es una traduccin del documentoWeb Style Sheetspropiedad
de Bert Bos publicado en el sitio de W3C.)
173

Captulo 91

Hola mundo
91.2 Enlaces externos
Hello World! Ms de 200 ejemplos de Hola Mundo
(en ingls). Versin del sitio guardada en el Internet
Archive.
The Hello World Collection Otra extenssima lista
de ejemplos (en ingls).
Resultado de la ejecucin de un programa Hola mundo en una
Interfaz grca de usuario.

91.3 Referencias

En informtica, un programa Hola mundo es el que imprime el texto Hola, mundo! en un dispositivo de visualizacin, en la mayora de los casos una pantalla de
monitor. Este programa suele ser usado como introduccin al estudio de un lenguaje de programacin, siendo
un primer ejercicio tpico, y se lo considera fundamental
desde el punto de vista didctico.
El programa Hola Mundo tambin puede ser til como
prueba de conguracin para asegurar que el compilador,
el entorno de desarrollo y el entorno de ejecucin estn
instalados correctamente y funcionando. En algunos lenguajes, congurar un conjunto de herramientas bsicas
completo desde cero hasta el punto en que los programas triviales puedan ser compilados y ejecutados involucra una cantidad de trabajo sustancial. Por esta razn,
generalmente es usado un programa muy simple para probar un nuevo conjunto de herramientas.
En los sistemas basados en microcontroladores empleados para el aprendizaje, se suele considerar Hola mundoal programa que permite poner en modo intermitente
un led.* [1] El programa consiste en mandar alternativamente un nivel alto y uno bajo por uno de los puertos del
sistema, dando a cada uno de dichos niveles un valor de
retardo.

91.1 Vase tambin


Ejemplos de implementacin del Hola mundo
174

[1] Gonzlez, Juan (2008). Taller de Robtica Bsico - Skybot v1.4. - SESION 3 - Hola mundoen Linux. Consultado el 12 de abril de 2009.

Captulo 92

Homebrew
alterar el normal funcionamiento del ordenador en forma
de virus informtico son en su mayora programas homebrew tambin. Este amplio colectivo ha dedicado su esfuerzo en forma de trabajo individual o en proyectos comunes que van acumulando en internet funcionalidades y
libreras de cdigo abierto que son utilizadas y ampliadas
por nuevos programadores autodidactas.
El homebrew es importante porque: abre las puertas a que
muchos de los acionados a desarrollarlo puedan conseguir un empleo remunerado y, adems, a que otros desarrolladores continen ampliando el uso comercial de nuevos y viejos productos, a que surja la posibilidad profeCaptura de pantalla de Duck Attack!, homebrew para Atari
sional de nuevos sistemas operativos, se ample la oferta
2600.
de aplicaciones... etc. Lo que conlleva a la evolucin tecnolgica de la sociedad y al abaratamiento de recursos
Se suele denominar homebrew (software casero no oque de otra manera solo estaran disponibles para unos
cial) a las aplicaciones y juegos creados por programapocos privilegiados.
dores -acionados y expertos- para cualquier plataforma,
*
generalmente videoconsolas propietarias. [1] Reciente- Aunque su uso ms conocido es la creacin de softwamente, se han desarrollado consolas diseadas espec- re para videoconsolas recreativas porttiles o de sobrecamente para la ejecucin de software homebrew, el cual mesa, se ha adaptado software desarrollado para cualquier tipo de aparato; como software original libre en prose caracteriza por ser gratuito y en su mayora abierto.
gramas operativos para maquinaria computerizada industrial, diccionarios y agendas electrnicas, telfonos, emisores o receptores de gps, maquinaria de uso mdico y
92.1 Generalidades
ordenadores actuales o antiguos de los 80 y 90, que ya no
estn a la venta por lo sencillo de su interfaz. El softwaHomebrew consiste en software de todo tipo creado por re nuevo original se ha desarrollado muchas veces como
programadores acionados o expertos. Ya los primeros prcticas en lenguajes informticos relativamente poco
programas desarrollados por la industria privada en los conocidos como C++, LUA, Palib, etc, o por otros moinicios de la informtica, eran juegos y, poco ms tar- tivos. Son muy conocidos por ser noticia desarrollos de
de, aplicaciones de omtica hechas en casa por acio- lenguajes de programacin cuyo uso afecta a millones de
nados. Hoy en da, en la mayora de los casos conocidos, personas o algoritmos con aplicaciones homebrew destilos programas homebrew son versiones de prueba com- nadas a la industria, agricultura, banca, tratamiento mpartidas como freeware o shareware que se distribuyen dico, lectura, enseanza... y que vuelven millonarios a sus
libremente por internet. Muchas veces, estas herramien- creadores. Algunos autores incluso han realizado su softtas han sido desarrolladas en importantes universidades ware para optar a premios de entidades pblicas o privapor grupos de estudiantes que distribuyen versiones de das, obtener becas de especializacin o conseguir un emprueba de su software bajo licencias de uso pblico y sin pleo remunerado. Aparte de la tradicional forma de pago,
afn de lucro, aunque tambin hay programadores a ni- existen otros autores que se conforman con menos, desde
vel individual que desarrollan interesantes aplicaciones los que llegan al presupuesto insertando publicidad en su
autodidactas que desde su domicilio particular llegan a software o los que se ven recompensados por el reconodiversas partes del mundo y de este modo le dan a co- cimiento del pblico, como ocurri en el caso del autor
nocer como autor creativo o prestigian el nivel tecnol- de Facebook. Muchas de las licencias empleadas por los
gico del autor o de su pas. Ejemplos muy conocidos son creadores permiten el uso gratuito de su software, siemAudacity y Emule. Los malwares que tienen por objeto
175

176
pre y cuando se respeten sus derechos y se les acredite
como autores del mismo. Muchas veces podemos mandar
un mensaje de felicitacin si nos ha gustado su trabajo o
ponernos en contacto con el autor o los autores o con sus
representantes para nes particulares o comerciales. Muchas empresas privadas han comercializado legalmente el
software creado en un principio como homebrew.

CAPTULO 92. HOMEBREW

integrados para el usuario se utilizan dentro de los cartuchos de NES para ampliar las capacidades del sistema,
la mayora son difciles de replicar, excepto al eliminar
cartuchos usados. El mecanismo de bloqueo de hardware
de la NES complica an ms la construccin de cartuchos
fsicos utilizables. Sin embargo, la NES-101 elimina el
chip de cierre 10NES para cualquier juego, ya sea homeLa palabra homebrew tiene relacin con el Homebrew brew, sin licencia, o de otra regin de un partido ocial,
se reproduce. El chip 10NES nalmente se puede desacComputer Club, aunque se desconoce si fue ste el origen. En Japn estos juegos son llamados Dojin Soft, que tivar de forma permanente mediante la realizacin de un
pequeo 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. Suele cuestionarse la legalidad del homebrew; sin embargo,
su uso est muy extendido entre los usuarios avanzados. 92.2.3 Super Nintendo Entertainment
Adems, su uso, excluyendo las copias de seguridad no
System (SNES)
propietarias, es completamente legal.
Despus de la interrupcin de los juegos en 1998, y la
produccin en 1999, los fans de la Super Nintendo En92.2 Homebrew en diferentes con- tertainment System hicieron imgenes ROM homebrew,
incluso sin el apoyo de Nintendo para la consola. Dessolas
pus del lanzamiento de la SNES haba un gran inters
en la ingeniera inversa del sistema para permitir jugar
homebrew y copias de seguridad. Nintendo equipado la
92.2.1 Sega Dreamcast
mquina con varias medidas de seguridad, tales como el
La Sega Dreamcast (DC) es, en muchos aspectos, una de chip de bloqueo para evitar que cdigo no autorizado que
las pioneras en incorporar homebrew. Para lograr correr se ejecuta en la mquina. Finalmente, la comunidad hoeste tipo de software era necesario utilizar una puerta tra- mebrew descubierto cmo los juegos corran en el hardsera que permita 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 TAPN plugins hardware liberados como la serie SF doctor Game. Los usuarios que
llamado GD-ROM).
pueden no solo los juegos de copia, sino tambin para eje Aplicaciones: Reproductores de MP3 y de video, cutar juegos caseros elaborados en el hardware de SNES.
ROMs Homebrew se podran convertir en el formato SF
visores de Flash, y versiones de Linux entre otras.
Mdico juego y poner en un 3 1/2 disquete. Juegos tan
grandes como 12 Mbits (1.5 megabytes) podran poner Emuladores: Con el tiempo, la consola ha llegado se en disquetes formateados de 1.6 megabytes. Un disa ejecutar emuladores de SNES, Genesis, NES, Neo positivo alternativo fue el Super Flash, por Tototek, que
Geo y Neo Geo CD, entre otros.
permita mltiples juegos para quemarla en un chip de
memoria ash de cartucho (que permite hasta 48Mbits).
Juegos: Se han realizado ports del clsico Doom y Este chip es el rom mscara para el cartucho ash Sper
de la primera y segunda versin de Quake entre otras desarrollo. El dispositivo es fcil de usar y tiene una inadaptaciones. Adems, se ha desarrollado un sinn- terfaz de usuario en el extremo del ordenador. Conectar
mero de juegos freeware y de cdigo abierto, des- el cartucho de Super Flash y cargar los juegos que quieras
tacndose 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 dis92.2.2 Nintendo Entertainment System cutible si o no pasar por sus medidas de seguridad caera
en conicto con las leyes modernas de ingeniera inver(NES)
sa. Presumiblemente juegos caseros se pueden producir
Varios compiladores estn disponibles para la Nintendo legalmente los SNES, siempre y cuando se incluye ninEntertainment System, pero como el Atari 2600, la mayo- gn material con derechos de autor. Anteriormente, en la
ra del desarrollo se aplica directamente en lenguaje en- dcada de 1990, Nintendo demand Color Dreams para
samblador. Un impedimento para la NES desarrollo ho- producir juegos de NES sin licencia ocial. El resultado
mebrew es la relativa dicultad involucrada con la pro- fue un acuerdo no revelado, pero los sueos de color siduccin de cartuchos fsicos, aunque cartuchos ash de gui produciendo juegos sin licencia. La fuerza del color
terceros existen, haciendo posible homebrew en el hard- de la posicin de los sueos se encuentra con que trabaware original de NES. Muchas variedades de circuitos jaron todo el cdigo de chip de cierre 10NES en lugar de

92.2. HOMEBREW EN DIFERENTES CONSOLAS


duplicar ilegalmente.

92.2.4

Nintendo DS

Para ejecutar homebrew en la Nintendo DS se necesita


una tarjeta o cartucho ash como M3 DS Real, Supercard,
acekard, ez-ash, R4DS o anlogas.* [2] Dicha tarjeta se
usa como medio de almacenamiento para los programas,
los archivos multimedia y los juegos.
Existen muchos sitios en Internet dedicados a la distribucin y difusin del homebrew.

177
Versiones: Han surgido innidad de versiones
para este sistema PSP entre las que se incluyen el primer homebrew que surgi llamado
DevHook, seguido ya de otras generaciones y
los llamados CFW(Custom Firmwares), que han
tenido un gran desarrollo gracias a hackers como
Dark_Alex, Total Noob, Virtuous Flame, Coolbird, Neur0n y Lktd9 los cuales actualmente
han sacado CFW rmados como por ejemplo:
PRO-(A,A1,A2,A3..B,1,2,3,4,5,6,7,8,9,10
,TN-HEN/-A-B... , ME 1,2,3..(6.39), CLFW
1,2,3..(6.39),LK-A,LK-II v1,Lk-B,etc

Aplicaciones: Reproductores de msica, Repro92.2.6 Microsoft Xbox


ductores de videos en muchos formatos, incluyendo
Avi, calculadoras gracadoras, diccionarios interacXbox ha sido una de las plataformas ms prolcas en mativos, lectores de libros electrnicos como DS Libris
teria de homebrew, dada su versatilidad y su arquitectura
para EPUB, linux, voip, aplicaciones...
x86. Se logra ejecutar este tipo de software ya sea con un
modchip o aprovechando un agujero de seguridad. Se ha
Emuladores: Emuladores de NES, Sega Megadri- desarrollado un kit de programacin completamente libre
ve, Gameboy Color, Gameboy Advance, Amiga, llamado OpenXDK, para uso exclusivo con la consola.
NeoGeo, Master System, SuperNintendo, Amstrad,
Comodore, MAME, Scumm, Spectrum
Aplicaciones: Reproductores de msica y videos en
diversos formatos incluyendo DVD; administrado Juegos: Muchos ttulos caseros
res de archivos y, ms notoriamente, distribuciones
de Linux.

92.2.5

Sony PSP

Para ejecutar homebrew en la PSP es necesario tener un


rmware alternativo llamado Custom Firmware.

Emuladores: Emuladores de todo tipo han sido


programados para esta consola, entre los que se destacan PCSX y Surreal, de PSX y Nintendo 64 respectivamente.

Downgrades: Se llamadowngradeal mecanismo


para bajar de versin a una PSP para as llegar a una
versin con menores restricciones, pudiendo de esta manera instalar un rmware alternativo (Custom
Firmware) que sea capaz de hacer funcionar homebrew y copias de seguridad, entre otras funciones.

Juegos: Una serie de ports han sido adaptados para


Xbox, generalmente han sido ms sencillos de desarrollar dada la mencionada potencia y versatilidad
de la consola.

Aplicaciones: Pequeos reproductores multimedia,


exploradores, programas de informacin, plugins
con diferentes funciones (como visualizar la pantalla de la PSP en el PC, etc) aunque tambin dispone
-entre otras cosas- de completos shells que disponen
de una gran variedad de funciones.
Emuladores: Los emuladores ms importantes son
los de Game Boy Advance, Play Station, SNES ,
Genesis, Nintendo 64 entre otros.
Plugins: Los plugins son pequeas aplicaciones con
una funcin especca, en la PSP se ejecutan a travs
del Recovery Mode (modo de recuperacin). Su funcin en esta plataforma es bastante interesante, algunos plugins pueden, por ejemplo, permitir la ejecucin de cdigos gameshark, hacer capturas de pantalla o ampliar las funciones del rmware en general.

92.2.7 Microsoft Xbox 360


Xbox 360, la sucesora directa de la Xbox, tena un fallo
en el rmware ocial, que se solucion con una posterior
actualizacin y que permite tener acceso a todo el hardware. La explotacin por parte de hackers de este fallo
pas a conocerse como el hack Jtag.* [3]
Emuladores: Emuladores de todo tipo han sido
programados para esta consola, entre los pocos que
hay algunos son de Gameboy, Snes, NES, Sega, Etc.
Copias de seguridad: Existen aplicaciones que nos
permiten cargar copias de seguridad desde algn
disco duro externo, o desde el mismo disco duro de
la consola, no est de ms decir que cambiando el
rmware del lector de la Xbox 360 tambin podremos cargar backups grabados en DVD doble capa.

178

92.2.8

CAPTULO 92. HOMEBREW

Nintendo Wii

La Wii permite la incorporacin de homebrew mediante


la explotacin de diversos fallos, de acuerdo a la versin
del software ocial que se posea.* [4] La ejecucin de las
diversas aplicaciones se realiza por medio del Homebrew
Channel, programa que se puede instalar y ejecutar desde
el men principal de la consola.* [5]
Aplicaciones: Reproductores de MP3 y de vdeo
(desde SD, USB o DVD), editores de texto o utilidades que utilizan las caractersticas especiales del
mando wii (tales como un mdulo que permite dibujar en la pantalla utilizando el mando como pincel.
Emuladores: Existen emuladores de consolas como NES, SNES, Sega Genesis, Sega Master System, MSX, Game Boy Color, Game Boy Advance,
MAME, Neo Geo Pocket, Nintendo 64, PC Engine, PSX, SCUMM, ZX Spectrum, Chip-8, Amstrad
CPC, Atari 2600 y Neo Geo.
Juegos: Entre los juegos, nos encontramos desde
clsicos como Pong, Asteroides o Tetris hasta otros
ms modernos como Quake. Destacar el GuitarFun,
versin del Guitar Hero realizada por un espaol.
Copias de seguridad: Adems el Homebrew se
puede utilizar para que la consola cargue copias
de seguridad, sistema popularmente conocido como piratear sin chip. O incluso instalar juegos de la
Consola Virtual y WiiWare.

92.2.9

PlayStation 3

PlayStation 3 puede ser utilizada para homebrew mediante la utilizacin del dispositivo PS Jailbreak o sus derivados clnicos o de cdigo abierto, nicamente con el rmware 3.41 o anteriores.* [6]* [7] Adicionalmente, es posible realizar un downgrade desde las versiones 3.42 y 3.50.
En este caso, se estara ejecutando software no rmado.
Tambin es posible instalar y ejecutar homebrew hasta
la versin de rmware 3.55, a partir del descubrimiento
de las claves privadas de la consola que el hacker George
Hotz sac a la luz con su rmware personalizado. versin
3.55 GeoHot* [8] En este caso, se estara ejecutando software rmado.
Aplicaciones: Servidores FTP, cargadores de rmwares modicados, y cargadores de juegos (Backup
Manager y Open Manager inicialmente; luego Multiman, Gaia y Rogero).
Emuladores: han sido lanzados emuladores de
NES, SNES, Sega Genesis, Game Boy Advance,
PSX, SCUMM, as como versiones del emulador

multiarcade Final Burn Arcade y del emulador multisistema Mednafen.


Juegos: Existen ports del videojuego Doom, adems
de versiones de reconocidos juegos como Tetris, entre otros.

92.3 Vase tambin


Homebrew Computer Club
Sega Dreamcast
PlayStation Portable
Anexo:Modchips para Wii

92.4 Referencias
[1] The Complete Guide to Whats Needed for Homebrew
on Each Console. (en ingls). DC Emu UK. Archivado
desde el original el 28 de noviembre de 2015. Consultado
el 12 de enero de 2011.
[2] Homebrew de NDS. El Otro Lado. 3 de abril de 2010.
Consultado el 12 de enero de 2011.
[3] Homebrew Xbox 360. El Otro Lado. 30 de diciembre
de 2010. Consultado el 12 de enero de 2011.
[4] Cargar Homebrew en Wii. El Otro Lado. 18 de diciembre de 2010. Consultado el 12 de enero de 2011.
[5] Homebrew Channel. El Otro Lado. 9 de enero de 2011.
Consultado el 12 de enero de 2011.
[6] PS3 Jailbreak: un pendrive para hackear la PlayStation
3. Red Users. 21 de agosto de 2010. Consultado el 25 de
octubre de 2010.
[7] PlayStation 3 ha sido hackeada. Meristation. 20 de
agosto de 2010. Consultado el 25 de octubre de 2010.
[8] Hackers se hacen con las claves de seguridad secretas de
PlayStation 3. Meristation. 3 de enero de 2011. Consultado el 6 de enero de 2011.

Captulo 93

ICONIX
ICONIX es una metodologa pesada-ligera de desarrollo
Modelo de casos de usos
del Software que se halla a medio camino entre un RUP
(Rational Unied Process) y un XP (eXtreme Program93.2.2 Fase 2: Anlisis y diseo preliminar
ming).
Iconix deriva directamente del RUP y su fundamento es
Dentro de esta fase se realizan las siguientes tareas:
el hecho de que un 80% de los casos pueden ser resueltos
tan solo con un uso del 20% del UML, con lo cual se sim Descripcin de los casos de uso
plica muchsimo el proceso sin perder documentacin al
dejar solo aquello que es necesario. Esto implica un uso
Diagramas de robustez
dinmico del UML de tal forma que siempre se pueden
utilizar otros diagramas adems de los ya estipulados si
se cree conveniente. Iconix se gua a travs de casos de
uso y sigue un ciclo de vida iterativo e incremental. El 93.2.3 Fase 3: Diseo
objetivo es que a partir de los casos de uso se obtenga el
Dentro de esta fase se realiza la siguiente tarea:
sistema nal.
Diagramas de secuencia

93.1 Ventajas de Iconix

93.2.4 Fase 4: Implementacin

Proceso gil para obtener un sistema informtico.

Dedicada a la construccin de sistemas de gestin de Dentro de esta fase se realiza la siguiente tarea:
pequea y mediana complejidad con la participacin
de los usuarios nales.
Escribir y generar cdigo
Tareas de la metodologa Iconix =
La metodologa est formada por cuatro fases principales
que son:

93.3 Referencias
1. Rosenberg, Doug; Stephens, Matt (2007). Use Case Driven Object Modeling with UML: Theory and
Practice. Apress. ISBN 1590597745.

93.2 Tareas de la metodologa Iconix

2. Rosenberg, Doug; Stephens, Matt; Collins-Cope,


Mark (2005). Agile Development with ICONIX Process. Apress. ISBN 1590594649.

La metodologa est formada por cuatro fases principales


que son:

93.2.1

Fase 1: Anlisis de requisitos

93.4 Conceptos Relacionados

Dentro de esta fase se realizan las siguientes tareas:

Dynamic Systems Development Method (DSDM)

Modelo del dominio

Extreme Programming

Elaboracin rpida de prototipos

Rational Unied Process


179

180

CAPTULO 93. ICONIX

URDAD, the Use Case Driven Analysis and Design


methodology is a methodology for technology neutral design.
RATF, using Robustness Analysis in combination
with Technology Forecasting, to further investigate
future software evolution alternatives.

93.5 Enlaces externos


Pgina ocial ICONIX
Pgina de la ICONIX Process
ICONIX UML and SysML Jumpstart Training
Introduccin a los Procesos ICONIX
Robustness Diagrams
Metodologa ICONIX
Uso de la metodologa ICONIX

93.5.1

Fase 2: Anlisis y diseo preliminar

Dentro de esta fase se realizan las siguientes tareas:

93.7 Conceptos Relacionados


Dynamic Systems Development Method (DSDM)
Extreme Programming
Rational Unied Process
URDAD, the Use Case Driven Analysis and Design
methodology is a methodology for technology neutral design.
RATF, using Robustness Analysis in combination
with Technology Forecasting, to further investigate
future software evolution alternatives.

93.8 Enlaces externos


Pgina ocial ICONIX
Pgina de la ICONIX Process
ICONIX UML and SysML Jumpstart Training
Introduccin a los Procesos ICONIX
Robustness Diagrams
Metodologa ICONIX
Uso de la metodologa ICONIX

Descripcin de los casos de uso


Diagramas de robustez

93.5.2

Fase 3: Diseo

Dentro de esta fase se realiza la siguiente tarea:


Diagramas de secuencia

93.5.3

Fase 4: Implementacin

Dentro de esta fase se realiza la siguiente tarea:


Escribir y generar cdigo

93.6 Referencias
1. Rosenberg, Doug; Stephens, Matt (2007). Use Case Driven Object Modeling with UML: Theory and
Practice. Apress. ISBN 1590597745.
2. Rosenberg, Doug; Stephens, Matt; Collins-Cope,
Mark (2005). Agile Development with ICONIX Process. Apress. ISBN 1590594649.

Captulo 94

Anexo:Implementaciones de Smalltalk
En informtica, el lenguaje de programacin Smalltalk,
est normalizado desde 1998 en el estndar ANSI NCITS
319-1998. Una implementacin de Smalltalk es un sistema de programacin que conforma al estndar si implementa todas las caractersticas denidas tal como estn
especicadas en ese documento.
Cada implementacin de Smalltalk, suele incluir como
propias:
Una Mquina virtual.
Un archivo llamado 'Archivo de imagen virtual' que
sirve como contenedor de objetos.
Un Entorno de desarrollo que funciona como un
sistema en tiempo de ejecucin, por ello de dice que
es interactivo. En el caso de no poseer un entorno interactivo orientado a controles visuales, es llamado
de scripting.
Una biblioteca de clases.
Esta pgina incluye un listado de implementaciones conocidas del lenguaje de programacin Smalltalk, y una tabla comparativa de algunas caractersticas relevantes para
cada implementacin:

181

Captulo 95

Anexo:Implementaciones para algoritmo


de rut
A continuacin se presentan diversas implementaciones
de algoritmos validadores de RUN/RUT en algunos de
los ms populares lenguajes de programacin:

95.1 Objective-C
//validation with parse logic from RUT string format
XX.XXX.XXX-Y + (BOOL)validRUT:(NSString*)rut{
//remove any dots or signs from RUT string with format
XX.XXX.XXX-Y //http://es.wikipedia.org/wiki/Rol_
%C3%9Anico_Tributario rut = [rut stringByReplacingOccurrencesOfString:@".withString:@""];
rut
= [rut stringByReplacingOccurrencesOfString:@"-"
withString:@""]; //get rut validator digit (Y) char dv =
[rut characterAtIndex:[rut length]1]; NSLog(@"DV:
%c, dv); //get rut numeric value from (XX.XXX.XXX)
int rutnumber = [[rut substringToIndex:[rut length]1]
integerValue]; NSLog(@"RUT NUMBER: %d, rutnumber); //check valid RUT number (XX.XXX.XXX)
with validator digit (Y) return [self validRUT:rutnumber
with:dv]; } //algorithm module 11 based on the Java
version + (BOOL)validRUT:(int)rut with:(char)dv { //to
accept 'k' lowercase to avoid issues with Kclients dv
= (dv == 'k')?'K':dv; NSLog(@"RUT DV: %c, dv); int
m = 0, s = 1; for (; rut != 0; rut /= 10) { s = (s + rut % 10
* (9 - m++ % 6)) % 11; } //generate DV to check char
dvcheck = (char) (s != 0 ? s + 47 : 75); NSLog(@"RUT
DV: %c, dv); NSLog(@"GEN DV: %c, dvcheck);
return dv == dvcheck; }

95.2 C++
char digito_vericador_rut(unsigned rut) { unsigned sum
= 0, factor = 2; while(rut) { sum += (rut%10)*factor;
rut/=10; factor = factor==7 ? 2 : factor+1; } const
unsigned res = 11 - sum%11; return res == 11? '0' : res
== 10? 'k' : res+'0'; }

95.3 Visual Basic MS Excel


Public Function RutDigito(ByVal Rut As Long) As
String Dim Digito As Integer Dim Contador As Integer Dim Multiplo As Integer Dim Acumulador As
Integer Contador = 2 Acumulador = 0 While Rut <>
0 Multiplo = (Rut Mod 10) * Contador Acumulador
= Acumulador + Multiplo Rut = Rut \ 10 Contador
= Contador + 1 If Contador > 7 Then Contador = 2
End If Wend Digito = 11 - (Acumulador Mod 11)
RutDigito = CStr(Digito) If Digito = 10 Then RutDigito
=KIf Digito = 11 Then RutDigito =0End Function

95.4 C#
private string digitoVericador(int rut) { int Digito;
int Contador; int Multiplo; int Acumulador; string
RutDigito; Contador = 2; Acumulador = 0; while (rut
!= 0) { Multiplo = (rut % 10) * Contador; Acumulador
= Acumulador + Multiplo; rut = rut/10; Contador
= Contador + 1; if (Contador == 8) { Contador =
2; } } Digito = 11 - (Acumulador % 11); RutDigito = Digito.ToString().Trim(); if (Digito == 10 ) {
RutDigito = K"; } if (Digito == 11) { RutDigito
= 0"; } return (RutDigito); } } } /// Una versin
mas corta public static string Dv(string r) { int suma
= 0; for (int x = r.Length - 1; x >= 0; x--) suma
+= int.Parse(char.IsDigit(r[x])?r[x].ToString():"0) *
(((r.Length - (x + 1)) % 6) + 2); int numericDigito = (11 suma % 11); string digito = numericDigito == 11 ?0:
numericDigito == 10 ?K: numericDigito.ToString();
return digito; } /// Una versin funcional public static
char GenerarDV (int num) { return 0K987654321
[ Enumerable.Range (0, (int) Math.Floor (Math.Log10
(num)) + 2) .Select (i => ((i % 6) + 2) * ((num / (int)
Math.Pow (10, i)) % 10)) .Sum () % 11]; }

182

95.10. PSEINT

183

95.5 Perl 6

h=r-(10^7*a+10^6*b+10^5*c+10^4*d+10^3*e+100*f+10*g);
sum=h*2+g*3+f*4+e*5+d*6+c*7+b*2+a*3;
#!/usr/bin/perl6 my ($RUT, @RUT, $digito); $RUT = resto=sum-oor(sum/11)*11; verif=11-resto; disp('El
@*ARGS; # leemos el argumento pasado al programa numero vericador es:') if (verif<10) disp(verif) end if
@RUT = $RUT.split('').reverse; # lo pasamos a array y (verif==11) disp('0') end if (verif==10) disp('K') end
le damos la vuelta $digito = [+](@RUT <<*>> (2..7)); #
clculo del dgito vericador $digito = 11 - $digito % 11;
$digito = ( 0 .. 9, 'K', 0 )[$digito]; say "$RUT-$digito";
95.10 PSeInt
# salida
Proceso digito_vericador Denir rut, a1, pa, c, sum,
di, digi Como Enteros; Escribir Este programa dene
su dgito vericador "; Escribir Ingrese su rut sin el
95.6 Javascript
dgito vericador "; Leer rut; pa<-rut; c<2; sum<0;
dv
=
function(T)
{
var
M=0,S=1; Mientras rut>0 Hacer a1<-rut%10; rut<-trunc(rut/10);
for(;T;T=Math.oor(T/10))
S=(S+T%10*(9- sum<-sum+(a1*c); c<-c+1; Si c=8 Entonces c<2; FinM++%6))%11; return S?S-1:'K'; } alert('El digito Si FinMientras di<-sum%11; digi<11-di; Si digi=11
vericador del rut ingresado es '+ dv(prompt('Ingrese rut Entonces Escribir El dgito vericador es 0"; Escribir
pa,"0"; Sino Si digi=10 Entonces Escribir El dgito
para mostrar su digito vericador:')));
vericador es K"; Escribir pa,"-K"; Sino Escribir El
dgito vericador es ",digi; Escribir pa,"-",digi; FinSi
FinSi FinProceso

95.7 PHP
function dv($r){ $s=1; for($m=0;$r!=0;$r/=10)
$s=($s+$r%10*(9-$m++%6))%11; echo 'El digito
vericador del rut ingresado es ',chr($s?$s+47:75); }

95.8 Transact-SQL
CREATE FUNCTION RutDigito (@Rut as integer)
RETURNS varchar(1) AS BEGIN declare @Digito as
integer declare @Contador as integer declare @Multiplo
as integer declare @Acumulador as integer declare @retorno as varchar(1) set @Contador = 2 set @Acumulador
= 0 WHILE @Rut <> 0 BEGIN set @Multiplo = (@Rut
% 10) * @Contador set @Acumulador = @Acumulador
+ @Multiplo set @Rut = @Rut / 10 set @Contador =
@Contador + 1 If @Contador > 7 set @Contador = 2
END set @Digito = 11 - (@Acumulador % 11) select
@retorno = case when @Digito = 10 then 'K' when
@Digito = 11 then '0' else cast(@Digito as varchar(1))
end return @retorno END

95.9 MATLAB

95.11 Python
def digito_vericador(rut): value = 11 - sum([
int(a)*int(b)
for
a,b
in
zip(str(rut).zll(8),
'32765432')])%11 return {10: 'K', 11: '0'}.get(value,
str(value))

95.12 Ruby
def
digito_vericador(rut)
dv
=
(11(rut.split('').map(&:to_i).reverse.each_with_index.map
{ |e, i| e*(2+i%6) }).inject(:+))%11 if dv < 10 then
dv.to_s else 'k' end end

95.13 Java
public static boolean ValidarRut(int rut, char dv) { int m
= 0, s = 1; for (; rut != 0; rut /= 10) { s = (s + rut % 10 *
(9 - m++ % 6)) % 11; } return dv == (char) (s != 0 ? s +
47 : 75); }

r=input('Ingrese rut:'); a=oor(r/10^7); b=oor(r/10^6)(10*a); c=oor(r/10^5)-(100*a+10*b); d=oor(r/10^4)(10^3*a+100*b+10*c);


e=oor(r/10^3)- 95.14 Pl/pgsql de PostgreSql
(10^4*a+10^3*b+100*c+10*d);
f=oor(r/10^2)CREATE OR REPLACE FUNCTION sp_rut_cl(
(10^5*a+10^4*b+10^3*c+100*d+10*e);
rut VARCHAR ) RETURNS CHARACTER(1) AS
g=oor(r/10^1)-(10^6*a+10^5*b+10^4*c+10^3*d+100*e+10*f);

184

CAPTULO 95. ANEXO:IMPLEMENTACIONES PARA ALGORITMO DE RUT

$BODY$ DECLARE rec record; suma INTEGER :=


0; serie INTEGER := 2; resto INTEGER; dv CHARACTER(1); BEGIN --raise notice 'rut: %',rut; if (rut
is null) then return null; end if; rut := btrim(rut); rut :=
replace(rut, '.', ''); if (rut is null) then return null; end
if; rut := btrim(rut); for rec in select * from ( select
substring(rut from i for 1)::char as bit from generate_series(length(rut),1,1) as i --where bit = '1' ) q1
LOOP --raise notice '1'; --raise notice 'rec.bit: %',rec.bit;
--raise notice '2'; if rec.bit is not null and rec.bit ~ '[0-9]+'
then suma := suma + rec.bit::INTEGER * serie; end if;
--raise notice '3'; --raise notice 'serie: %',serie; if serie
= 7 then serie := 1; end if; serie := serie + 1; end loop;
--raise notice 'suma: %',suma; resto := 11 - suma % 11;
--raise notice 'resto: %',resto; dv := case resto when 11
then '0' when 10 then 'K' else resto::CHARACTER end;
return dv; end; $BODY$ LANGUAGE 'plpgsql' volatile;

Captulo 96

Inanicin (informtica)
En informtica, inanicin (starvation en ingls) es un
problema relacionado con los sistemas multitarea, donde
a un proceso o un hilo de ejecucin se le deniega siempre
el acceso a un recurso compartido. Sin este recurso, la
tarea a ejecutar no puede ser nunca nalizada.
La inanicin es una situacin similar al interbloqueo, pero
las causas son diferentes. En el interbloqueo, dos procesos
o dos hilos de ejecucin llegan a un punto muerto cuando
cada uno de ellos necesita un recurso que es ocupado por
el otro. En cambio, en este caso, uno o ms procesos estn
esperando recursos ocupados por otros procesos que no
se encuentran necesariamente en ningn punto muerto.
Un caso de inanicin la ilustra perfectamente la paradoja
conocida como la cena de los lsofos de Edsger Dijkstra
cuando se da el caso de que todos los lsofos cogen el
tenedor a la vez.
La utilizacin de prioridades en muchos sistemas operativos multitarea podra causar que procesos de alta prioridad estuvieran ejecutndose siempre y no permitieran
la ejecucin de procesos de baja prioridad, causando inanicin en estos. Es ms, si un proceso de alta prioridad
est pendiente del resultado de un proceso de baja prioridad que no se ejecuta nunca, entonces este proceso de alta
prioridad tambin experimenta inanicin (esta situacin
se conoce como inversin de prioridades). Para evitar estas situaciones los planicadores modernos incorporan algoritmos para asegurar que todos los procesos reciben un
mnimo de tiempo de CPU para ejecutarse.

185

Captulo 97

Indireccin
La in-direccin es una tcnica de programacin. El concepto se basa en hacer referencia indirecta a los datos
usando las direcciones de memoria que los contienen o
mediante punteros que sealan hacia esos datos o a las
direcciones que los contienen.
En la memoria no slo se almacenan datos de los
programas (como letras, caracteres grcos, nmeros naturales, nmeros enteros, coma otante, etc.) sino tambin direcciones de memoria, que al n y al cabo tambin
son datos.
Para efectos de almacenamiento y manipulacin por
el microprocesador, todos estos datos no son ms que
una secuencia de bytes en diferentes celdas. El que una
secuencia de bits determinada se intrprete como un
nmero o como una direccin depende del programador.
El mecanismo de in-direccin se puede encadenar de manera arbitrariamente larga. La direccin que contiene la
direccin de un dato, a su vez se puede almacenar de nuevo en memoria. Es posible almacenar las direcciones de
tal forma que haya que seguir un encadenamiento de indirecciones para llegar nalmente a acceder al dato.
En el siguiente ejemplo, lacelda(direccin de memoria
0x00000100) contiene el dato 0x00000200 que a su vez
representa la direccin de la nuevaceldaque contiene
el dato que corresponde a una direccin que contiene un
dato que representa la direccin 0x00000400 que nalmente contiene el dato que nos interesa. Y as podemos
denir a voluntad o conveniencia los diferentes niveles de
in-direccin que necesitemos.

186

Captulo 98

Infraestructura de lenguaje comn


2001. En abril del ao 2003 ISO ratic este estndar con
el denominacin ISO/IEC 23271:2003 .
Para comprender mejor la inclusin de cada una de las
partes principales de la arquitectura de CLI es interesante
analizar los objetivos de diseo que se plantearon desde
su concepcin. Segn su especicacin, la arquitectura de
CLI debe:
Permitir escribir componentes nteroperables independientemente de la plataforma subyacente y del
lenguaje de programacin utilizado.
Exponer todas las entidades programticas a travs
de un nico sistema unicado de tipos (en la especicacin, este sistema es conocido como CTS, o
Common Type System).
Empaquetar todos los tipos en unidades completamente auto descriptivas y portables.

Representacin visual, en ingls, de la infraestructura de lenguaje


comn.

La infraestructura de lenguaje comn (en ingls Common Language Infrastructure o CLI) es una especicacin estandarizada que describe un entorno virtual para
la ejecucin de aplicaciones, cuya principal caracterstica es la de permitir que aplicaciones escritas en distintos
lenguajes de alto nivel puedan luego ejecutarse en mltiples plataformas tanto de hardware como de software sin
necesidad de reescribir o recompilar su cdigo fuente.
Si bien el CLI tuvo sus orgenes en Microsoft (en principio se pensaba desarrollar un entorno de ejecucin compartido para COM con el nombre de Common Object
Runtime, que luego se extendi y generaliz para dar
lugar a CLI), sus especicaciones fueron llevadas ante ECMA (European Computer Manufacturers Association), una importante organizacin europea de estndares, para su estandarizacin en el ao 2000. Luego de un
ao de trabajo conjunto entre ECMA, Microsoft y otras
empresas que co-patrocinaron el proceso (Intel, HP, IBM
y Fujitsu entre otras), el estndar ECMA-335 que dene el entorno CLI nalmente vio la luz en diciembre de
187

Cargar los tipos de forma tal que se encuentren aislados unos de otros en tiempo de ejecucin, pero que
puedan a su vez compartir recursos.
Resolver dependencias entre tipos en tiempo de ejecucin usando una poltica exible que pueda tener
en cuenta la versin, atributos de localizacin y polticas administrativas.
Ejecutar aplicaciones bajo la supervisin de un entorno privilegiado que permita controlar y hacer
cumplir polticas en tiempo de ejecucin.
Disear toda la infraestructura y servicios basndose
en metadatos extensibles, de manera tal que toda la
arquitectura pueda acomodarse con poco impacto a
nuevas incorporaciones y cambios.
Poder realizar tareas de bajo nivel, como carga de
tipos en memoria, enlace con libreras y compilacin a cdigo nativo slo cuando sea necesario (este
enfoque se conoce tpicamente comoon demand
, o just in time).
Proveer una serie de funcionalidades comunes mediante un grupo de libreras de programacin que
los desarrolladores puedan utilizar para construir sus
aplicaciones.

188

CAPTULO 98. INFRAESTRUCTURA DE LENGUAJE COMN

Microsoft .NET de hecho es un sper conjunto de esta especicacin, es decir, provee todo lo necesario para
cumplir con la misma y adems agrega una serie de herramientas, libreras y funcionalidades no contempladas
por ella originalmente y que proveen una enorme utilidad y exibilidad a los desarrolladores (por ejemplo, libreras para la creacin de aplicaciones y servicios web,
acceso a motores de bases de datos, controles grcos,
herramientas para desensamblar assemblies, debuggers,
etc.). Si bien es gratuito, su cdigo fuente no es abierto,
y es distribuido por Microsoft en versiones para sistemas
operativos Windows 98 y sus sucesores nicamente.
La especicacin del CLI est formada por cuatro partes:
Sistema comn de tipos, en ingls Common Type
System (CTS).
Metadatos.
Especicaciones de lenguaje comn, en ingls Common Language Specication (CLS).
Sistema de ejecucin virtual, del ingls Virtual Execution System (VES).

98.1 Vase tambin


Microsoft .NET
ECMA

Captulo 99

Ingeniera de software
Ingeniera de software es la aplicacin de un enfoque sistemtico, disciplinado y cuanticable al desarrollo,
operacin y mantenimiento de software,* [1] y el estudio
de estos enfoques, es decir, la aplicacin de la ingeniera al software.* [2] Integra matemticas, ciencias de la
computacin y prcticas cuyos orgenes se encuentran en
la ingeniera.* [3]

Indistintamente se utilizan los trminos ingeniera de


softwareo ingeniera del software"; aunque menos
comn tambin se suele referenciar comoingeniera en
software.* [5]* [6]* [7] En Hispanoamrica los trminos
ms comnmente usados son los dos primeros.

La creacin del software es un proceso intrnsecamente


creativo y la ingeniera del software trata de sistematizar
Se citan las deniciones ms reconocidas, formuladas por este proceso con el n de acotar el riesgo del fracaso en
prestigiosos autores:
la consecucin del objetivo, por medio de diversas tcnicas que se han demostrado adecuadas sobre la base de la
Ingeniera de software es el estudio de los principios experiencia previa.
y metodologas para el desarrollo y mantenimiento
La IS se puede considerar como la ingeniera aplicada al
de sistemas software (Zelkovitz, 1978).
software, esto es, por medios sistematizados y con herra Ingeniera de software es la aplicacin prctica del mientas preestablecidas, la aplicacin de ellos de la maneconocimiento cientco al diseo y construccin de ra ms eciente para la obtencin de resultados ptimos;
programas de computadora y a la documentacin objetivos que siempre busca la ingeniera. No es slo de la
asociada requerida para desarrollar, operar y mante- resolucin de problemas, sino ms bien teniendo en cuennerlos. Se conoce tambin como desarrollo de soft- ta las diferentes soluciones, elegir la ms apropiada.
ware o produccin de software (Bohem, 1976).
La ingeniera de software trata del establecimiento
de los principios y mtodos de la ingeniera a n de 99.1 Historia
obtener software de modo rentable, que sea able y
trabaje en mquinas reales (Bauer, 1972).
Cuando aparecieron las primeras computadoras digitales
en la dcada de 1940,* [8]el desarrollo de software era
La ingeniera de software es la aplicacin de un
algo tan nuevo que era casi imposible hacer prediccioenfoque sistemtico, disciplinado y cuanticable al
nes de las fechas estimadas de nalizacin del proyecto y
desarrollo, operacin, y mantenimiento del softwamuchos de ellos sobrepasaban los presupuestos y tiempo
*
re. [1]
estimados.. Los desarrolladores tenan que volver a escribir todos sus programas para correr en mquinas nuevas
En 2004, la U. S. Bureau of Labor Statistics (Ocina de
Estadsticas del Trabajo de Estados Unidos) cont 760 que salan cada uno o dos aos, haciendo obsoletas las ya
840 ingenieros de software de computadora.* [4] El tr- existentes.
mino ingeniero de software, sin embargo, se utiliza
de manera genrica en el ambiente empresarial, y no todos los que se desempean en el puesto de ingeniero de
software poseen realmente ttulos de ingeniera de universidades reconocidas.

El trmino Ingeniera del software apareci por primera


vez en a nales de la dcada de 1950. La Ingeniera de
software fue estimulada por la crisis del software de las
dcadas de entre 1960 y 1980. La Ingeniera del software
viene a ayudar a identicar y corregir mediante princiAlgunos autores consideran quedesarrollo de software pios y metodologas los procesos de desarrollo y mantees un trmino ms apropiado queingeniera de softwa- nimiento de sistemas de software.
repara el proceso de crear software. Personas como Pete Aparte de la crisis del software de las dcadas de entre
McBreen (autor deSoftware Craftmanship) cree que 1960 y 1980, la ingeniera de software se ve afectada por
el trmino IS implica niveles de rigor y prueba de proce- accidentes que conllevaron a la muerte de tres personas;
sos que no son apropiados para todo tipo de desarrollo de esto sucedi cuando la mquina de radioterapia Therac25 emite una sobredosis masiva de radiacin y afecto consoftware.
189

190

CAPTULO 99. INGENIERA DE SOFTWARE

tra la vida de estas personas.* [9] Esto remarca los riesgos ternet; esto hace que los desarrolladores tuviesen que made control por software,* [10] afectando directamente al nejar imgenes mapas y animaciones para optimizar la
nombre de la ingeniera de software.
visualizacin/almacenamiento de imgenes (como el uso
*
A principios de los 1980, [11] la ingeniera del software de imgenes en miniatura). El uso de los navegadores y
ya haba surgido como una genuina profesin, para estar utilizacin de lenguaje HTML cambia drsticamente la
al lado de las ciencias de la computacin y la ingeniera visin y recepcin de la informacin.
tradicional. Antes de esto, las tareas eran corridas poniendo tarjetas perforadas como entrada en el lector de tarjetas de la mquina y se esperaban los resultados devueltos
por la impresora.

Las amplias conexiones de red crea la proliferacin de


virus informticos y la basura en los correos electrnicos
(E-mail) esto pone en una carrera contra el tiempo los
desarrolladores para crear nuevos sistemas de bloqueo o
Debido a la necesidad de traducir frecuentemente el soft- seguridad de estas anomalas en la informtica ya *que se
ware viejo para atender las necesidades de las nuevas m- volvan sumamente tediosas y difciles de arreglar [10]
quinas, se desarrollaron lenguajes de orden superior. A Despus 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 comnmente lo liberaban.
esto conlleva al uso de metodologas ms simples y
Durante mucho tiempo, solucionar la crisis del software rpidas que desarrollan software funcional. Cabe sealar
fue de suma importancia para investigadores y empresas que los sistemas ms pequeos tenan un enfoque ms
simple y rpido para poder administrar el desarrollo de
que se dedicaban a producir herramientas de software.
clculos y algoritmos de software.
Para la dcada de 1980, el costo de propiedad y mantenimiento del software fue dos veces ms caro que el propio desarrollo del software, y durante la dcada de 1990,
el costo de propiedad y mantenimiento aument 30 %
con respecto a la dcada anterior. En 1995, muchos de 99.2 Objetivos
los proyectos de desarrollo estaban operacionales, pero
no eran considerados exitosos. El proyecto de software La ingeniera de software aplica diferentes normas y mmedio sobrepasaba en un 50 % la estimacin de tiempo todos que permiten obtener mejores resultados, en cuanpreviamente realizada, adems, el 75 % de todos los gran- to al desarrollo y uso del software, mediante la aplicacin
des productos de software que eran entregados al cliente correcta de estos procedimientos se puede llegar a cumtenan fallas tan graves, que no eran usados en lo absolu- plir de manera satisfactoria con los objetivos fundamento o simplemente no cumplan con los requerimientos del tales de la ingeniera de software.
cliente.* [10]
Entre los objetivos de la ingeniera de software estn:
Algunos expertos argumentaron que la crisis del software
era debido a la falta de disciplina de los programadores.
Mejorar el diseo de aplicaciones o software de tal
Cada nueva tecnologa y prctica de la dcada de 1970 a
modo que se adapten de mejor manera a las necela de 1990 fue pregonada como la nica solucin 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 bsqueda de una nica clave para el
xito nunca funcion. El campo de la ingeniera de soft Promover mayor calidad al desarrollar aplicaciones
ware parece un campo demasiado complejo y amplio pacomplejas.
ra una nica solucin que sirva para mejorar la mayora
de los problemas, y cada problema representa slo una
Brindar mayor exactitud en los costos de proyectos
pequea porcin de todos los problemas de software.
y tiempo de desarrollo de los mismos.
El auge del uso del Internet llev a un vertiginoso crecimiento en la demanda de sistemas internacionales de des Aumentar la eciencia de los sistemas al introducir
pliegue de informacin en la World Wide Web. Los desaprocesos que permitan medir mediante normas esrrolladores se vieron en la tarea de manejar ilustraciones,
peccas, la calidad del software desarrollado, busmapas, fotografas y animaciones, a un ritmo nunca antes
cando siempre la mejor calidad posible segn las nevisto, con casi ningn mtodo para optimizar la visualicesidades y resultados que se quieren generar.
zacin y almacenamiento de imgenes. Tambin fueron
necesarios sistemas para traducir el ujo de informacin
Una mejor organizacin de equipos de trabajo, en el
en mltiples idiomas extranjeros a lenguaje natural hurea de desarrollo y mantenimiento de software.
mano, con muchos sistemas de software diseados para
uso multilenguaje, basado en traductores humanos.
Detectar a travs de pruebas, posibles mejoras paLa ingeniera de software contribuyo alrededor de 90,000
ra un mejor funcionamiento del software desarrollamillones de dlares por ao ya que entra en juego el Indo.* [12]

99.5. NOTACIONES

99.3 Recursos
99.3.1

Recurso humano

191
proyectos exitosos donde se han usado mtodos de ingeniera de software incluyen a GNU/Linux, el software del
transbordador espacial, los cajeros automticos y muchos
otros.

Son todas aquellas personas que intervienen en la planicacin de cualquier instancias de software (por ejemplo:
gestor, ingeniero de software experimentado, etc.), El n- 99.5
mero de personas requerido para un proyecto de software
slo puede ser determinado despus de hacer una estima- 99.5.1
cin del esfuerzo de desarrollo...

Notaciones
LUM (lenguaje unicado de modelado) o UML

Es un lenguaje de modelado muy reconocido y utilizado actualmente que se utiliza para describir o especicar
mtodos. Tambin es aplicable en el desarrollo de softSon aquellos componentes de un software que son usa- ware.
dos en otras aplicaciones de la misma ndole, ya sea para
Las siglas UML signican lenguaje unicado de modereducir costos o tiempo.
lado esto quiere decir que no pretende denir un modelo
estndar de desarrollo, sino nicamente un lenguaje de
modelado.* [14]
99.3.3 Recursos de entorno

99.3.2

Recursos de software reutilizables

Un lenguaje de modelado consiste de vistas, elementos de


Es el entorno de las aplicaciones (software y hardware) modelo y un conjunto de reglas: sintcticas, semnticas y
el hardware proporciona el medio fsico para desarrollar pragmticas que indican cmo utilizar los elementos.
las aplicaciones (software), este recurso es indispensable.* [13]

99.5.2 BPMN (notacin para el modelado


de procesos de negocios)

99.4 Implicaciones socioeconmicas

El objetivo de la notacin para el modelado de procesos de negocios es proporcionar de una manera fcil de
denir y analizar los procesos de negocios pblicos y privados simulando un diagrama de ujo. La notacin ha
99.4.1 Econmicamente
sido diseada especcamente para coordinar la secuencia de los procesos y los mensajes que uyen entre los
En los Estados Unidos, el software contribuy a una ocparticipantes del mismo, con un conjunto de actividades
tava parte de todo el incremento del PIB durante la drelacionadas. Caractersticas bsicas de los elementos de
cada de 1990 (alrededor de 90,000 millones de dlares
BPMN
por ao), y un noveno de todo el crecimiento de productividad durante los ltimos aos de la dcada (alrededor
Objetos de ujo: eventos, actividades, rombos de
de 33.000 millones de dlares estadounidenses por ao).
control de ujo (gateways).
La ingeniera de software contribuy a US$ 1 billn de
crecimiento econmico y productividad en esa dcada.
Objetos de conexin: ujo de secuencia, ujo de
Alrededor del globo, el software contribuye al crecimienmensaje, asociacin.
to econmico de maneras similares, aunque es difcil de
Swimlanes (carriles de piscina): pool, lane.
encontrar estadsticas ables. * [cita requerida]
Adems, con la industria del lenguaje est hallando cada
vez ms campos de aplicacin a escala global.

Artefactos: objetos de datos, grupo, anotacin.* [14]

99.5.3 Diagrama de ujo de datos (DFD)


99.4.2

Socialmente

Un diagrama de ujo de datos permite representar el movimiento de datos a travs de un sistema por medio de
modelos que describen los ujos de datos, los procesos
que tranforman o cambian los datos, los destinos de datos y los almacenamientos de datos a la cual tiene acceso
el sistema.

La ingeniera de software cambia la cultura del mundo


debido al extendido uso de la computadora. El correo
electrnico (e-mail), la WWW y la mensajera instantnea permiten a la gente interactuar de nuevas maneras.
El software baja el costo y mejora la calidad de los servicios 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 computacin de Martin y Estrin: ujo grco de datos.

192

CAPTULO 99. INGENIERA DE SOFTWARE

Con los diagramas de ujo de datos determina la manera


en que cualquier sistema puede desarrollarse, ayuda en la
identicacin de los datos de la transaccin en el modelo
de datos y proporciona al usuario una idea fsica de cmo
resultarn los datos a ltima instancia.* [14]

presentan, los motivos que crean insatisfaccin y aquellos que deben ser cubiertos a plenitud. Por ejemplo: El
contenido de los reportes generados, satisface realmente
las necesidades del usuario? Los tiempos de respuesta
ofrecidos, son oportunos?, etc.

99.6 Herramienta CASE

Hay que denir las funciones que realizara el software ya


que estas ayudan al usuario nal y al funcionamiento del
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 estn 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 produccin o una gran cantidad de datos entre otros.
del software, varias se basan principalmente en la idea de
un modelo grco.* [15]
Anlisis de requisitos

99.7 Metodologa
Un objetivo de dcadas ha sido el encontrar procesos y
metodologas, que sean sistemticas, predecibles y repetibles, a n de mejorar la productividad en el desarrollo y
la calidad del producto software, en pocas palabras, determina los pasos a seguir y como realizarlos para nalizar
una tarea.

Extraer los requisitos de un producto software es la primera etapa para crearlo. Durante la fase de anlisis, el
cliente plantea las necesidades que se presenta e intenta
explicar lo que debera hacer el software o producto nal para satisfacer dicha necesidad mientras que el desarrollador acta como interrogador, como la persona que
resuelve problemas. Con este anlisis, el ingeniero de sistemas puede elegir la funcin que debe realizar el software y establecer o indicar cual es la interfaz ms adecuada
para el mismo.* [16]

El anlisis de requisitos puede parecer una tarea sencilla, pero no lo es debido a que muchas veces los clientes
piensan que saben todo lo que el software necesita para
La ingeniera de software requiere llevar a cabo numero- su buen funcionamiento, sin embargo se requiere la habisas tareas agrupadas en etapas, al conjunto de estas etapas lidad y experiencia de algn especialista para reconocer
se le denomina ciclo de vida. Las etapas comunes a casi requisitos incompletos, ambiguos o contradictorios. Estodos los modelos de ciclo de vida son las siguientes:
tos requisitos se determinan tomando en cuenta las necesidades del usuario nal, introduciendo tcnicas que nos
permitan mejorar la calidad de los sistemas sobre los que
Obtencin de los requisitos
se trabaja.* [17]

99.7.1

Etapas del proceso

Se debe identicar sobre que se est trabajando, es decir,


el tema principal que motiva el inicio del estudio y creacin del nuevo software o modicacin de uno ya existente. A su vez identicar los recursos que se tienen, en
esto entra el conocer los recursos humanos y materiales
que participan en el desarrollo de las actividades. Es importante entender el contexto del negocio para identicar
adecuadamente los requisitos.

El resultado del anlisis de requisitos con el cliente se


plasma en el documento ERS (especicacin de requisitos del sistema), cuya estructura puede venir denida por
varios estndares, tales como CMMI. Asimismo, se dene un diagrama de entidad/relacin, en el que se plasman
las principales entidades que participarn en el desarrollo
del software.
La captura, anlisis y especicacin de requisitos (incluso pruebas de ellos), es una parte crucial; de esta etapa
depende en gran medida el logro de los objetivos nales.
Se han ideado modelos y diversos procesos metdicos de
trabajo para estos nes. Aunque an no est formalizada,
ya se habla de la ingeniera de requisitos.

Se tiene que tener dominio de la informacin de un


problema, lo cual incluye los datos fuera del software(usuarios nales, otros sistemas o dispositivos externos), los datos que salen del sistema (por la interfaz de
usuario, interfaces de red, reportes, grcas y otros medios) y los almacenamientos de datos que recaban y orga- La IEEE Std. 830-1998 normaliza la creacin de las esnizan objetos persistentes de datos (por ejemplo, aquellos pecicaciones de requisitos de software (Software Requirements Specication).
que se conservan de manera permanente).
Tambin hay que ver los puntos crticos, lo que signi- Finalidades del anlisis de requisitos:
ca tener de una manera clara los aspectos que entorpecen
Brindar al usuario todo lo necesario para que puey limitan el buen funcionamiento de los procedimientos
da trabajar en conjunto con el software desarrollado
actuales, los problemas ms comunes y relevantes que se

99.7. METODOLOGA
obteniendo los mejores resultados posibles.

193
Arquitectura

Tener un control ms completo en la etapa creacin La integracin de infraestructura, desarrollo de aplicaciodel software, en cuanto a tiempo de desarrollo y cos- nes, bases de datos y herramientas gerenciales, requieren
de capacidad y liderazgo para poder ser conceptualizatos.
dos y proyectados a futuro, solucionando los problemas
Utilizacin de mtodos ms ecientes que permitan de hoy. El rol en el cual se delegan todas estas actividades
el mejor aprovechamiento del software segn sea la es el del Arquitecto.
nalidad de uso del mismo.
El arquitecto de software es la persona que aade valor
a los procesos de negocios gracias a su valioso aporte de
Aumentar la calidad del software desarrollado al dis- soluciones tecnolgicas.
minuir los riesgos de mal funcionamiento.* [18]
La arquitectura de sistemas en general, es una actividad
de planeacin, ya sea a nivel de infraestructura de red y
No siempre en la etapa de anlisis de requisitoslas hardware, o de software.
distintas metodologas de desarrollo llevan asociado un
estudio de viabilidad y/o estimacin de costes. El ms co- Lo principal en este punto es poner en claro los aspectos
nocido de los modelos de estimacin de coste del software lgicos y fsicos de las salidas, modelos de organizacin y
representacin de datos, entradas y procesos que compoes el modelo COCOMO
nen el sistema, considerando las bondades y limitaciones
de los recursos disponibles en la satisfaccin de las pacicaciones brindadas para el anlisis.
Limitaciones* [14]
Los software tienen la capacidad de emular inteligencia
creando un modelo de ciertas caractersticas de la inteligencia humana pero slo posee funciones predenidas
que abarcan un conjunto de soluciones que en algunos
campos llega a ser limitado. Aun cuando tiene la capacidad de imitar ciertos comportamientos humanos no es
capaz de emular el pensamiento humano porque acta bajo condiciones.
Otro aspecto limitante de los software proviene del proceso totalmente mecnico que requiere de un mayor esfuerzo y tiempos elevados de ejecucin lo que lleva a tener
que implementar el software en una mquina de mayor
capacidad.

Especicacin
La especicacin de requisitos describe el comportamiento esperado en el software una vez desarrollado.
Gran parte del xito de un proyecto de software radicar
en la identicacin de las necesidades del negocio (denidas por la alta direccin), as como la interaccin con
los usuarios funcionales para la recoleccin, clasicacin,
identicacin, priorizacin y especicacin de los requisitos del software.

Hay que tener en consideracin la arquitectura del sistema en la cual se va a trabajar, elaborar un plan de trabajo
viendo la prioridad de tiempo y recursos disponibles. En
los diseos de salidas entra los que es la interpretacin de
requerimientos lo cual es el dominio de informacin del
problema, las funciones visibles para el usuario, el comportamiento del sistema y un conjunto de clases de requerimientos que agrupa los objetos del negocio con los
mtodos que les dan servicio.
La arquitectura de software consiste en el diseo de componentes de una aplicacin (entidades del negocio), generalmente utilizando patrones de arquitectura. El diseo arquitectnico debe permitir visualizar la interaccin
entre las entidades del negocio y adems poder ser validado, por ejemplo por medio de diagramas de secuencia.
Un diseo arquitectnico describe en general el cmo se
construir una aplicacin de software. Para ello se documenta utilizando diagramas, por ejemplo:
Diagramas de clases
Diagramas de base de datos
Diagrama de despliegue
Diagrama de secuencia

Siendo los dos primeros los mnimos necesarios para desEntre las tcnicas utilizadas para la especicacin de recribir la arquitectura de un proyecto que iniciar a ser
quisitos se encuentran:
codicado. Dependiendo del alcance del proyecto, complejidad y necesidades, el arquitecto elegir cuales de los
Caso de uso
diagramas se requiere elaborar.
Historias de usuario
Siendo los primeros ms rigurosas y formales, los segundas ms giles e informales.

Las herramientas para el diseo y modelado de software


se denominan CASE (Computer Aided Software Engineering) entre las cuales se encuentran:
Enterprise Architect

194
Microsoft Visio for Enterprise Architects
Programacin
Implementar un diseo en cdigo puede ser la parte ms
obvia del trabajo de ingeniera de software, pero no necesariamente es la que demanda mayor trabajo y ni la ms
complicada. La complejidad y la duracin de esta etapa est ntimamente relacionada al o a los lenguajes de
programacin utilizados, as como al diseo previamente
realizado.
Desarrollo de la aplicacin
Para el desarrollo de la aplicacin es necesario considerar
cinco fases para tener una aplicacin o programa eciente, estas son:
Desarrollo de la infraestructura: Esta fase permite el desarrollo y la organizacin de los elementos
que formaran la infraestructura de la aplicacin, con
el propsito de nalizar la aplicacin ecientemente.
Adaptacin del paquete: El objetivo principal de
esta fase es entender de una manera detallada el funcionamiento del paquete, esto tiene como nalidad
garantizar que el paquete pueda ser utilizado en su
mximo rendimiento, tanto para negocios o recursos. Todos los elementos que componen el paquete
son inspeccionados de manera detallada para evitar
errores y entender mejor todas las caractersticas del
paquete.
Desarrollo de unidades de diseo de interactivas: En esta fase se realizan los procedimientos que
se ejecutan por un dilogo usuario-sistema. Los procedimientos de esta fase tienen como objetivo principal:
1. Establecer especcamente las acciones que debe
efectuar la unidad de diseo.

CAPTULO 99. INGENIERA DE SOFTWARE


Desarrollo de unidades de diseo manuales:
En esta fase el objetivo central es proyectar todos
los procedimientos administrativos que desarrollarn en torno a la utilizacin de los componentes
computarizados.* [19]
Pruebas de software
Consiste en comprobar que el software realice correctamente las tareas indicadas en la especicacin del problema. Una tcnica es probar por separado cada mdulo del
software, y luego probarlo de manera integral, para as
llegar al objetivo. Se considera una buena prctica el que
las pruebas sean efectuadas por alguien distinto al desarrollador que la program, idealmente un rea de pruebas;
sin perjuicio de lo anterior el programador debe hacer sus
propias pruebas. En general hay dos grandes maneras de
organizar un rea de pruebas, la primera es que est compuesta por personal inexperto y que desconozca el tema
de pruebas, de esta manera se evala que la documentacin entregada sea de calidad, que los procesos descritos son tan claros que cualquiera puede entenderlos y el
software hace las cosas tal y como estn descritas. El segundo enfoque es tener un rea de pruebas conformada
por programadores con experiencia, personas que saben
sin mayores indicaciones en qu condiciones puede fallar
una aplicacin y que pueden poner atencin en detalles
que personal inexperto no considerara.
De acuerdo con Roger S. Pressman, el proceso de pruebas
se centra en los procesos lgicos internos del software,
asegurando que todas las sentencias se han comprobado,
y en los procesos externos funcionales, es decir, la realizacin de pruebas para la deteccin de errores. Se requiere
poder probar el software con sujetos reales que puedan
evaluar el comportamiento del software con el n de proporcionar realimentacin a los desarrolladores. Es importante que durante el proceso de desarrollo del software
no se pierda contacto con los interesados o solicitantes
del desarrollo de Software, de esta manera los objetivos
del proyecto se mantendrn vigentes y se tendr una idea
clara de los aspectos que tienen que probarse durante el
perodo de pruebas.* [20]

2. La creacin de componentes para sus procedimien- Implementacin


tos.
Una Implementacin es la realizacin de una especica3. Ejecutar pruebas unitarias y de integracin en la uni- cin tcnica o algoritmos con un programa, componente
dad de diseo.
software, u otro sistema de cmputo. Muchas especicaciones son dadas segn a su especicacin o un estn Desarrollo de unidades de diseo batch: En esta dar. Las especicaciones recomendadas segn el World
fase se utilizan una serie de combinacin de tcnicas, Wide Web Consortium, y las herramientas de desarrollo
como diagrama de ujo, diagramas de estructuras, del software contienen implementaciones de lenguajes de
tablas de decisiones, etc. Cualquiera a utilizar ser programacin. El modelo de implementacin es una cobenecioso para plasmar de manera clara y objetiva leccin de componentes y los subsitemas que contienen.
las especicaciones y que as el programador tenga Componentes tales como: cheros ejecutables, cheros
mayor comprensin a la hora de programar y probar de cdigo fuente y todo otro tipo de cheros que sean nelos programas que le corresponden.
cesarios para la implementacin y despliegue del sistema.

99.8. MODELOS Y CICLOS DE VIDA DEL DESARROLLO DE SOFTWARE


Documentacin
Es todo lo concerniente a la documentacin del propio
desarrollo del software y de la gestin del proyecto, pasando por modelaciones (UML), diagramas de casos de
uso, pruebas, manuales de usuario, manuales tcnicos,
etc; todo con el propsito de eventuales correcciones, usabilidad, mantenimiento futuro y ampliaciones al sistema.

195

99.8 Modelos y Ciclos de Vida del


Desarrollo de Software

La ingeniera de software, con el n de ordenar el caos


que era anteriormente el desarrollo de software, dispone de varios modelos, paradigmas y losofas de desarrollo, estos los conocemos principalmente como modelos
o ciclos de vida del desarrollo de software, esto incluye
el proceso que se sigue para construir, entregar y hacer
evolucionar el software, desde la concepcin de una idea
Mantenimiento
hasta la entrega y el retiro del sistema y representa todas
Fase dedicada a mantener y mejorar el software para co- las actividades y artefactos (productos intermedios) ne*
rregir errores descubiertos e incorporar nuevos requisi- cesarios para desarrollar una aplicacin, [23] entre ellos
tos. Esto puede llevar ms tiempo incluso que el desarro- se puede citar:
llo del software inicial. Alrededor de 2/3 del tiempo de
ciclo de vida de un proyecto* [21] est dedicado a su mantenimiento. Una pequea parte de este trabajo consiste
99.8.1 Modelo en cascada o clsico
eliminar errores (bugs); siendo que la mayor parte reside
en extender el sistema para incorporarle nuevas funcioEn ingeniera de software el modelo en cascada tamnalidades y hacer frente a su evolucin.
bin llamado desarrollo en cascada o ciclo de vida clsico
se basa en un enfoque metodolgico que ordena rigurosamente las etapas del ciclo de vida del software, esto
*
99.7.2 Ventajas [22]
sugiere una aproximacin sistemtica secuencial hacia el
proceso de desarrollo del software, que se inicia con la esDesde el punto de vista de gestin
pecicacin de requisitos del cliente y contina con la planicacin, el modelado, la construccin y el despliegue
Facilitar la tarea de seguimiento del proyecto
para culminar en el soporte del software terminado.* [24]
Optimizar el uso de recursos
Facilitar la comunicacin entre usuarios y desarro- 99.8.2
lladores

Modelo de prototipos

En ingeniera de software, el modelo de prototipos perte Facilitar la evaluacin de resultados y cumplimiento nece a los modelos de desarrollo evolutivo. Este permite
de objetivos
que todo el sistema, o algunos de sus partes, se construyan rpidamente para comprender con facilidad y aclarar
ciertos aspectos en los que se aseguren que el desarrollaDesde el punto de vista de los ingenieros de Software dor, el usuario, el cliente estn de acuerdo en lo que se
necesita as como tambin la solucin que se propone pa Ayudar a comprender el problema
ra dicha necesidad y de esta manera minimizar el riesgo y
la incertidumbre en el desarrollo, este modelo se encarga
Permitir la reutilizacin
del desarrollo de diseos para que estos sean analizados y
prescindir de ellos a medida que se adhieran nuevas espe Facilitar el mantenimiento del producto nal
cicaciones, es ideal para medir el alcance del producto,
pero no se asegura su uso real.
Optimizar el conjunto y cada una de las fases del
Este modelo principalmente se aplica cuando un cliente
proceso de desarrollo
dene un conjunto de objetivos generales para el software a desarrollarse sin delimitar detalladamente los requisitos de entrada procesamiento y salida, es decir cuando
Desde el punto de vista de cliente o usuario nal
el responsable no est seguro de la ecacia de un algoritmo, de la adaptabilidad del sistema o de la manera en que
Garantizar el nivel de calidad del producto nal
interacta el hombre y la mquina.
Obtener el ciclo de vida adecuado para el proyecto
Conanza en los plazos del tiempo mostrados en la
denicin del proyecto

Este modelo se encarga principalmente de ayudar al ingeniero de sistemas y al cliente a entender de mejor manera
cul ser el resultado de la construccin cuando los requisitos estn satisfechos.* [25]

196

99.8.3

CAPTULO 99. INGENIERA DE SOFTWARE

Modelo en espiral

El modelo en espiral, que Barry Boehm propuso originalmente en 1986, es un modelo de proceso de software
evolutivo que conjuga la naturaleza iterativa de la construccin de prototipos con los aspectos controlados y sistemticos del modelo en cascada, es decir, cuando se aplica este modelo, el software se desarrolla en una serie de
entregas evolutivas (ciclos o iteraciones), cada una de estas entregando prototipos ms completas que el anterior,
todo esto en funcin del anlisis de riesgo y las necesidades del cliente. Aunque el modelo espiral representa
ventajas por sobre el desarrollo lineal, el clculo de los
riesgos puede ser muy complicado y por lo cual su uso en
el mbito real es muy escaso.* [26]

99.8.4

Modelo de desarrollo por etapas

99.8.5 Modelo Incremental o Iterativo


Desarrollo iterativo y creciente (o incremental) es un proceso de desarrollo de software, creado en respuesta a las
debilidades del modelo tradicional de cascada, es decir,
este modelo aplica secuencias lineales como el modelo en
cascada, pero de una manera iterativa o escalada segn
como avance el proceso de desarrollo y con cada una de
estas secuencias lineales se producen incrementos (mejoras) del software.* [27]
Se debe tener en cuenta que el ujo del proceso de cualquier incremento puede incorporar el paradigma de construccin de prototipos, ya que como se mencion anteriormente, este tipo de modelo es iterativo por naturaleza, sin embargo se diferencia en que este busca la entrega
de un producto operacional con cada incremento que se
le realice al software.

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 implementacin completa
etapas renadas sucesivamente. Con esta metodologa se no est disponible.
desarrollan las capacidades ms importantes reduciendo
el tiempo necesario para la construccin de un producto; Modelo estructurado
el modelo de entrega por etapas es til para el desarrollo 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 descomponin- tcnicas del diseo estructurado o de la programacin
dolos en problemas ms pequeos y se caracteriza princi- estructurada para su desarrollo, tambin se utiliza en la
palmente en que las especicaciones no son conocidas en creacin de los algoritmos del programa. Este formato
detalle al inicio del proyecto y por tanto se van desarro- facilita la comprensin de la estructura de datos y su conllando simultneamente con las diferentes versiones del trol.* [28] Entre las principales caractersticas de este mocdigo.
delo se encuentan las siguientes:
En este modelo pueden distinguirse las siguientes fases:
Especicacin conceptual.
Anlisis de requisitos.

Generalmente se puede diferenciar de una manera


ms clara los procesos y las estructuras de datos.
Existen mtodos que se enfocan principalmente en
ciertos datos.

Diseo inicial.

La abstraccin del programa es de un nivel mucho


mayor.

Diseo detallado (codicacin, depuracin, prueba


y liberacin).

Los procesos y estructuras de datos son representados jerrquicamente.* [28]

Cuando es por etapas, en el diseo global estas fases pue- Este modelo tambin presenta sus desventajas entre las
den repetirse segn la cantidad de etapas que sean reque- cuales podemos mencionar algunas:
ridas.
Se poda encontrar datos repetidos en diferentes
Entre sus ventajas tenemos:
partes del programa.* [28]
Deteccin de problemas antes y no hasta la nica
entrega nal del proyecto.

Cuando el cdigo se hace muy extenso o grande su


manejo se complica demasiado.* [29]

En el modelo estructurado las tcnicas que comnmente


Eliminacin del tiempo en informes debido a que se utilizan son:
cada versin es un avance.
Estimacin de tiempo por versin, evitando errores
en la estimacin del proyecto general.
Cumplimiento a la fecha por los desarrolladores.

El modelo entidad-relacin, esta tcnica se relaciona


principalmente con los datos.
El diagrama de ujo de datos, esta es utilizada principalmente para los procesos.* [30]

99.8. MODELOS Y CICLOS DE VIDA DEL DESARROLLO DE SOFTWARE


Modelo orientado a objetos
Estos modelos tienen sus races en la programacin orientada a objetos y como consecuencia de ella gira entorno al
concepto de clase, tambin lo hacen el anlisis de requisitos y el diseo. Esto adems de introducir nuevas tcnicas, tambin aprovecha las tcnicas y conceptos del desarrollo estructurado, como diagramas de estado y transiciones. El modelo orientado a objetos tiene dos caractersticas principales, las cuales ha favorecido su expansin:
Permite la reutilizacin de software en un grado signicativo.
Su simplicidad facilita el desarrollo de herramientas informticas de ayuda al desarrollo, el cual es fcilmente implementada en una notacin orientada a
objetos llamado UML.* [31]

99.8.6

197

estado hecho al estado cambios en espera. Este modelo de desarrollo se utiliza a menudo como el paradigma
de desarrollo de aplicaciones cliente/servidor. Un sistema
cliente/servidor se compone de un conjunto de componentes funcionales. Cuando se aplica a cliente/servidor,
el modelo de proceso concurrente dene actividades en
dos dimensiones: una divisin de sistemas y una divisin
de componentes. Los aspectos del nivel de sistemas se
afrontan mediante dos actividades: diseo y realizacin.
La concurrencia se logra de dos maneras:
Las actividades del sistema y de componente ocurren simultneamente y pueden modelarse con el enfoque orientado a objetos descrito anteriormente;
Una aplicacin cliente/servidor tpica se implementa
con muchos componentes, cada uno de los cuales se
pueden disear y realizar concurrentemente.

Modelo RAD (rapid application de- En realidad, el modelo de desarrollo concurrente es aplivelopment)
cable a todo tipo de desarrollo de software y proporciona

una imagen exacta del estado actual de un proyecto. En


vez de connar actividades de ingeniera de software a
una secuencia de sucesos, dene una red de actividades,
todas las actividades de la red existen simultneamente
con otras. Los sucesos generados dentro de una actividad
dada o algn otro lado de la red de actividad inicia las
Esta es una metodologa que posibilita la construccin de transiciones entre los estados de una actividad.
sistemas computacionales que combinen tcnicas y utilidades CASE (Computer Aided Software Engineering),
99.8.8 Proceso unicado del desarrollo de
la construccin de prototipos centrados en el usuario y el
software
seguimiento lineal y sistemtico de objetivos, incrementando la rapidez con la que se producen los sistemas meEl proceso unicado es un proceso de software genrico
diante la utilizacin 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 aplicacin,
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 tamaos de proyectos.
de desarrollo cree un producto completamente funcional
Provee un enfoque disciplinado en la asignacin de tadentro de un periodo muy limitado de tiempo sin reducir
reas y responsabilidades dentro de una organizacin de
en lo ms mnimo la calidad del mismo.* [33]
desarrollo. Su meta es asegurar la produccin de software de muy alta calidad que satisfaga las necesidades de
los usuarios nales, dentro de un calendario y presupues99.8.7 Modelo de desarrollo concurrente
to predecible.* [34]
El modelo de desarrollo concurrente es un modelo de tipo El proceso unicado tiene dos dimensiones:
de red donde todas las personas actan simultneamente
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 activilos aspectos del ciclo de vida del proceso a lo largo
dades tcnicas importantes, tareas y estados asociados a
de su desenvolvimiento
ellas.
Un eje vertical que representa las disciplinas, las
El modelo de proceso concurrente dene una serie de
cuales agrupan actividades de una manera lgica de
acontecimientos que dispararan transiciones de estado a
acuerdo a su naturaleza.
estado para cada una de las actividades de la ingeniera
El RAD (rapid application development:desarrollo rpido de aplicaciones), es un modelo de proceso de software incremental, desarrollado inicialmente por James Maslow en 1980, que resalta principalmente un ciclo corto de
desarrollo.

del software. Por ejemplo, durante las primeras etapas del


diseo, no se contempla una inconsistencia del modelo de La primera dimensin representa el aspecto dinmico del
anlisis. Esto genera la correccin del modelo de anli- proceso conforme se va desarrollando, se expresa en trsis de sucesos, que disparara la actividad de anlisis del minos de fases, iteraciones e hitos (milestones).

198

CAPTULO 99. INGENIERA DE SOFTWARE

La segunda dimensin representa el aspecto esttico del para el usuario el producto nal es la informacin que de
proceso: cmo es descrito en trminos de componentes cierto modo soluciona el problema planteado por el usuadel proceso, disciplinas, actividades, ujos de trabajo, ar- rio.
tefactos y roles.
El renamiento ms conocido y documentado del proceso
unicado es el RUP (proceso unicado racional).
El proceso unicado no es simplemente un proceso, sino
un marco de trabajo extensible que puede ser adaptado a
organizaciones o proyectos especcos. De la misma manera, el proceso unicado de rational, tambin es un marco de trabajo extensible, por lo que muchas veces resulta
imposible decir si un renamiento particular del proceso
ha sido derivado del proceso unicado o del RUP. Por
dicho motivo, los dos nombres suelen utilizarse para referirse a un mismo concepto.* [35]

99.10 Naturaleza de la Ingeniera


de Software
La ingeniera de software es una disciplina que est orientada a aplicar conceptos y mtodos de ingeniera al desarrollo de software de calidad.
Matemticas

Los programas tienen muchas propiedades matemticas.


Por ejemplo la correccin y la complejidad de muchos algoritmos son conceptos matemticos que pueden ser ri99.9 Producto
gurosamente probados. El uso de matemticas en la IS es
El software se ha convertido en algo muy necesario en llamado mtodos formales.
nuestra sociedad actual, es la mquina que conduce a la
toma de decisiones comerciales, sirve para la investiga- Creacin
cin cientca 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 pasoftware est inmerso en sistemas de todo tipo alrededor sos. El hecho de denir propiamente y llevar a cabo esde nosotros.
tos pasos, como en una lnea de ensamblaje, es necesario
El software de computadora es el producto que disean
y construyen los ingenieros de software. Esto abarca programas que se ejecutan dentro de una computadora de
cualquier tamao y arquitectura, despus de estar construido casi cualquier persona en el mundo industrializado,
ya sea directa o indirectamente.
Los productos se pueden clasicar en:

para mejorar la productividad de los desarrolladores y la


calidad nal de los programas. Este punto de vista inspira
los diferentes procesos y metodologas que se encuentran
en la IS.
Gestin de Proyecto

El desarrollo de software de gran porte requiere una ade Productos genricos: Son los producidos por una or- cuada gestin del proyecto. Hay presupuestos, estableciganizacin 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 ocina, insumos, equirrollados bajo pedido a un desarrollador especco. pamiento) por adquirir. Para su administracin se debe
tener una clara visin y capacitacin en gestin de proEstos productos deben cumplir varias caractersticas al yectos.
ser entregados, estas son:
Mantenibles: El software debe poder evolucionar
mientras cumple con sus funciones.

99.11 Participantes y papeles

Conabilidad: No debe producir daos en caso de Para el desarrollo de un sistema de software es necesaria
la colaboracin de muchas personas con diversas compeerrores.
tencias, capacidades e intereses. Al conjunto de personas
Eciencia: El software no debe desperdiciar los re- involucradas en el proyecto se les conoce como particicursos.
pantes.
Utilizacin adecuada: Debe contar con una interfaz Al conjunto de funciones y responsabilidades que hay
de usuario adecuada y su documentacin.
dentro del proyecto o sistema se le conoce como roles
o papeles. Los roles estn asociados a las tareas que son
Lo que constituye el producto nal es diferente para el asignadas a los participantes, en consecuencia, una persoingeniero y los usuarios, para el ingeniero son los progra- na puede desempear uno o mltiples roles, as tambin
mas, datos y documentos que conguran el software pero un mismo rol puede ser representado por un equipo.* [36]

99.11. PARTICIPANTES Y PAPELES

99.11.1

Cliente

Es frecuente el uso de los trminosusuarios,usuarios nalesy clientescomo sinnimos, lo cual puede provocar confusin; estrictamente, el cliente (persona,
empresa u organizacin) es quin especica los requisitos
del sistema,* [37] en tanto que el usuario es quien utiliza
u opera nalmente el producto software, pudiendo ser o
no el cliente.

99.11.2

Desarrolladores

Esta clase de participantes estn relacionados con todas


las facetas del proceso de desarrollo del software. Su trabajo incluye la investigacin, diseo, implementacin,
pruebas y depuracin del software.* [38]

99.11.3

Gestores

En el contexto de ingeniera de software, el gestor de


desarrollo de software es un participante, que reporta al
director ejecutivo de la empresa que presta el servicio de
desarrollo. Es responsable del manejo y coordinacin de
los recursos y procesos para la correcta entrega de productos de software, mientras participa en la denicin de
la estrategia para el equipo de desarrolladores, dando iniciativas que promuevan la visin de la empresa.* [39]

99.11.4

Usuarios nales

El usuario nal es quien interacta con el producto de


software una vez es entregado.* [40] Generalmente son
los usuarios los que conocen el problema, ya que da a
da operan los sistemas.

99.11.5

Cdigo tico de un ingeniero de


software

Un ingeniero de software debe tener un cdigo donde asegura, en la medida posible, que los esfuerzos realizados
se utilizarn para realizar el bien y deben comprometerse
para que la ingeniera de software sea una profesin benca y respetada. Para el cumplimiento de esta norma,
se toman en cuenta ocho principios relacionados con la
conducta y las decisiones tomadas por el ingeniero; donde estos principios identican las relaciones ticamente
responsables de los individuos, grupos y organizaciones
donde participen. Los principios a los que deben sujetarse son sobre la sociedad, cliente y empresario, producto,
juicio, administracin, profesin, colegas y por ltimo el
personal.
Sociedad: Los ingenieros de software deben actuar
de manera congruente con el inters social, aceptando la responsabilidad total de su trabajo, moderan-

199
do los intereses con el bienestar social, aprobando
el software solamente si se tiene una creencia bien
fundamentada, cooperando en los esfuerzos para solucionar asuntos importantes de inters social, ser
justo y veraz en todas las armaciones relativas al
software o documentos asociados.
Cliente y empresario: Se debe actuar de manera tal
que se llegue a conciliar los mejores intereses de los
clientes y empresarios, congruentemente con el inters social. Estos debern prestar servicios en sus
reas de competencia, siendo honestos y francos sobre las limitaciones, no utilizar un software que se
obtenga ilegalmente o sin tica, usar la propiedad
de los clientes o empresarios de manera autorizada,
mantener secreto cualquier documento de informacin condencial.
Producto: Hay que asegurarse que los productos y
sus modicaciones cumplan con los estndares profesionales ms altos posibles, procurando la alta calidad, costos aceptables y una agenda razonable asegurando que los costos y benecios sean claros y
aceptados por el empresario y el cliente. Asegurar
que las metas y objetivos de cualquier proyecto sean
adecuados y alcanzables.
Juicio: Se debe mantener una integridad e independencia en el juicio profesional, moderando todo juicio tcnico por la necesidad de apoyar y mantener
los valores humanos, mantener la objetividad profesional con respecto a cualquier software o documento relacionado, no involucrarse en prcticas nancieras fraudulentas.
Administracin: Se deber asegurar una buena administracin para cualquier proyecto en el cual se
trabaje, utilizando procedimientos efectivos para
promover la calidad y reducir riesgos, asegurndose tambin que se conozcan las polticas y procedimientos del empresario para proteger contraseas,
archivos e informacin condencial.
Profesin: Se debe incrementar la integridad y reputacin de la profesin en conjunto con el inters social, ayudando al desarrollo de un ambiente organizacional favorable para actuar, promoviendo el conocimiento pblico de la ingeniera de software, extendiendo el conocimiento de la ingeniera de software por medio de participaciones en organizaciones, reuniones y publicaciones profesionales.
Colegas: Cada ingeniero deber apoyar y ser justos
con los colegas, motivando a sus colegas sujetndose
al cdigo, ayudando tambin a su desarrollo profesional, reconocer los trabajos de otros y abstenerse
a atribuirse de mritos indebidos, revisar los trabajos de manera objetiva, sincera y propiamente documentada.

200

CAPTULO 99. INGENIERA DE SOFTWARE

Personal: Los ingenieros de software participaran


toda su vida en el aprendizaje con la prctica y promovern un enfoque tico de la profesin, mejorando su conocimiento de los avances en el anlisis, especicacin, diseo, desarrollo, mantenimiento, pruebas del software y documentos relacionados
en conjunto con administracin del proceso de desarrollo.* [41]

99.12 Educacin tica


99.12.1

Organizaciones

IEEE Computer Society


Association for Computing Machinery (ACM).
Software Engineering Institute (SEI).
British Computer Society (BCS).
RUSSOFT Association
Society of Software Engineers

99.13 Vase tambin


Anexo:Filosofas del desarrollo de software
Ingeniera informtica
Gestin de la conguracin
Proceso para el desarrollo de software
Mantenimiento de software
Fragilidad del software
Error de software

[3] ACM (2006). Computing Degrees & Careers. ACM.


Consultado el 23 de noviembre de 2010.
[4] Bureau of Labor Statistics, U.S. Department of Labor,
USDL 05-2145: Occupational Employment and Wages,
November 2004, Table 1.
[5] Universidad Siglo XXI,Argentina,
[6] Universidad Autnoma de Guadalajara, Mxico,
[7] Tecnolgico de Antioqua, Colombia,
[8] Leondes (2002). intelligent systems: technology and applications. CRC Press. ISBN 978-0-8493-1121-5.
[9] An Investigation of Therac-25 Accidents
[10] Computer Risks
[11]Software engineering... has recently emerged as
a discipline in its own right.cita libro | apellidos=Sommerville|
nombre=Ian|
ttulo=Software
Engineering| editorial=Addison-Wesley| ao=1985|
ao-original=1982| isbn = 0-201-14229-5| postscript=
[12] Universidad Politcnica de Madrid. Objetivos de ingeniera del software.
[13] Pressman, Roger S. (2003). El proceso. Ingeniera del
software, un enfoque prctico. Mxico: Mc Graw Hill,
quinta edicin.
[14] Ingenieria de SoftwareUML, artculo en el sitio web Monografas.
[15] Monograas.com Ingeniera del software
[16] [http://yaqui.mxl.uabc.mx/~{}molguin/as/IngReq.htm
[17] [http://www.slideshare.net/marfonline/
analisis-de-requerimientos-ingenieria-de-software
[18] [http://www.slideshare.net/marfonline/
analisis-de-requerimientos-ingenieria-de-software

Usabilidad

[19] Unidad 2: Fundamentos de la ingeniera del software,


artculo en el sitio web Ing Software.

MTRICA

[20]

Historia de la ingeniera del software


Crisis del software
No hay balas de plata

99.14 Referencias
[1]IEEE Standard Glossary of Software Engineering
Terminology,IEEE std 610.12-1990, 1990. ISBN
155937067X.
[2] SWEBOK executive editors, Alain Abran, James W.
Moore; editors, Pierre Bourque, Robert Dupuis. (2004).
Pierre Bourque and Robert Dupuis, ed. Guide to the Software Engineering Body of Knowledge - 2004 Version.
IEEE Computer Society. pp. 11. ISBN 0-7695-2330-7.

[21] Pressman, Roger S. (2003). El proceso. Ingeniera del


software, un enfoque prctico. Mxico: Mc Graw Hill,
quinta edicin.
[22] Metodologia de ingeniera de software, artculo en el sitio
web Slide Share.
[23] Ingeniera de software: ciclos de vida y metodologas, artculo publicado en el sitio web de la Facultad de Ingeniera de la Universidad de Los Andes.
[24] Pressman, Roger S.: Ingeniera del software: un enfoque
prctico. Sexta edicin, pg. 50-51.
[25] Lawrence Peleeger, Shari: Ingeniera de software: modelo
de prototipos. Universidad Estatal de Milagro.
[26] Pressman, Roger S.: Ingeniera del software: un enfoque
prctico. Sexta edicin, pg. 58-60.

99.16. ENLACES EXTERNOS

[27] Pressman, Roger S.: Ingeniera del software: un enfoque


prctico. Sexta edicin, pg. 52-53.
[28] Diseo estructurado, artculo en el sitio web Slide Share.
[29] , cuadro comparativo de programacin estructurada y programacin orientada objeto .
[30] , Benet Campderrich Falgueras, Editorial UOC, 2002 320 pginas.
[31] Campderrich Falgueras, Benet (2002): Ingeniera de software. Barcelona: Editorial UOC, 2002. 320 pginas.
[32] , What is Rapid Application Development?
[33] Pressman, Roger S.: Ingeniera del software: un enfoque
prctico. Sexta edicin, pg. 53-54.
[34] Proceso unicado del desarrollo de software, artculo
en el sitio web Yaqui.
[35] Pressman, Roger S.: Ingeniera del software: un enfoque
prctico. Sexta edicin, pg. 67-72.
[36] Bernd Bruegge & Allen H.Dutoit. Object-Oriented Software Engineering, Prentice Hall, Pag. 11.
[37] Pressman, 2002, p. 39
[38] O*NET Code Connector - Software Developers, Systems Software - 15-1133.00. Onetcodeconnector.org.
Consultado el 4 de agosto de 2014.
[39] Software Development Manager Position Description.
interfacing.com. Consultado el 4 de agosto de 2014.
[40] Pressman, 2002, p. 39
[41] Ingeniera de Software Cdigo de tica y Prctica Profesional. SEERI, East Tennessee State University. 1999.

99.15 Bibliografa
Ingeniera de software (sexta edicin), Ian Sommerville. Addison Wesley. Sitio en Ingls
Pressman, Roger S.: Ingeniera del software: un enfoque prctico (informacin en ingls). McGraw Hill
Higher Education, sexta edicin, pg. 50-51.</ref>

99.16 Enlaces externos

Wikiversidad alberga proyectos de aprendizaje


sobre Ingeniera de software.Wikiversidad

Is software engineering actually engineering?, artculo publicado en The Iron Warrior, publicacin
de la University of Waterloo Engineering Society.

201

Captulo 100

Instancia (informtica)
En el paradigma de la orientacin a objetos, una instancia la que pertenece y, por tanto, puede llamar a los mtodos
(en ingls, instance) se reere a una realizacin especca 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 jerarqua de herencia esttica entre clases.
tador, se dice que ste se instancia. En lenguajes que crean
objetos a partir de clases, un objeto es una instancia de
una clase. Esto es, un miembro de una clase que tiene
atributos en lugar de variables. En un contexto del mundo real, podramos pensar en Perrocomo 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
de nuestro inters modelarla, y diferencisemos entre un
dberman y un chihuahua, no solo cada instancia sera
diferente, sino que perteneceran a clases o prototipos diferentes, c.f. herencia (informtica).

100.1 Etimologa
El trmino en informtica procede del ingls, en donde
instance viene del signicado que podra traducirse por
caso o ejemplo en castellano. Aunque la palabra existe
en el idioma ingls por incorporacin desde el latn como instantia (que es de donde lo hace tambin la palabra en castellano), pero posteriormente tambin adquiri
(del latn tambin) parte de la semntica de instns, que
en nuestro caso deriv nicamente en instante.* [2] Esta
incorporacin desde el ingls tendra la consideracin de
prstamo semntico, aunque esta acepcin no est contemplada todava por la Real Academia Espaola.* [3]

100.2 Programacin basada en clases

Ciertos lenguajes de programacin permiten utilizar clases mixin, que permiten adems realizar asociaciones entre instancias de objetos para establecer relaciones similares a la herencia en tiempo de ejecucin.

100.2.1 Clases como objetos


Multitud de lenguajes de programacin basados en clases proporcionan mecanismos de reexin o introspeccin, esto es, permiten que el programa pueda observar
(e incluso modicar) su propia estructura de alto nivel. Si
estos mecanismos siguen el paradigma de orientacin a
objetos tambin, entonces las clases sern representadas
tambin como instancias de objetos. En particular, si el
lenguaje no permite dos deniciones de una misma clase (puede hacerlo para permitir ejecuciones concurrentes de distintas versiones de una clase)* [Nota 1] entonces
las clases sern representadas utilizando un Singleton. En
Java, por ejemplo, si tenemos una clase denida como:
public class Perro {}
Podremos acceder a la instancia que representa la clase
(y es una instancia de la clasejava.lang.Class<Perro>), en
un programa principal de clase Main, del siguiente modo:
public class Main { public static void main(String...
args) { Class<?> perroClass = Perro.class; System.out.println(perroClass); } }

En este apartado hablaremos de la programacin orienta100.3 Programacin basada en


da a objetos basada en clases, que es la que implementa la
mayora de lenguajes de programacin orientados a obprototipos
jetos. En el modelo basado en prototipos, que es el de
lenguajes como JavaScript, los trminos que se reeren a En el estilo de programacin 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 dems, son de aplicacin similar.
de los prototipos. En general, los prototipos tambin 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
las propiedades y mtodos se heredan en la profundidad
completa del rbol de herencia de prototipados.
En el caso particular de JavaScript, aunque no se puede
cambiar el prototipo de un objeto una vez instanciado, s
se pueden cambiar las propiedades y mtodos que tiene
el prototipo, afectando a todas las instancias (en profundidad) de ese prototipo. En el caso particular de este lenguaje, en el que todos los objetos son instancias de Object, modicar o aadir mtodos a Object tendr como
consecuencia la modicacin de esos mtodos u objetos
entodos los dems objetos que no los hayan redenido
posteriormente, incluyendo los ya instanciados. Este es
el mecanismo que utilizan algunas bibliotecas de JavaScript* [Nota 2] para proporcionar funciones que no hayan
implementado ciertos motores a ciertos objetos del lenguaje.

100.4 Notas
[1] Erlang, por ejemplo, permite la ejecucin concurrente de varias versiones de un mismo programa,
vase change-3 http://www.erlang.org/doc/man/gen server.html#Module:code change-3, y CLOS.
[2] http://augmentjs.com, por ejemplo, proporciona mtodos
al objeto Array.prototype, cambiando todos los Array del
programa.

100.5 Referencias
[1] http://whatis.techtarget.com/definition/instance (en ingls)
[2] Vase Etymology en http://www.wordreference.com/
definition/instance
[3] http://lema.rae.es/drae/?val=instancia

203

Captulo 101

Instruccin (informtica)
Se denomina instruccin en informtica al conjunto de
datos insertados en una secuencia estructurada o especca que el procesador interpreta y ejecuta.

101.2 Tipos

Los tipos de instruccin permitidos estn denidos y determinados dentro de cada plataforma en el conjunto de
instrucciones (en ingls ISA, instruction set architecture),
que tambin determina los registros de origen y destino
de la CPU, y en ocasiones un dato inmediato (aquellos
que son especicados explcitamente en la instruccin).
Estas instrucciones del computador son las que determinan el funcionamiento de la CPU que las ejecuta. La CPU
puede realizar una diversidad de funciones, que son el reejo de la variedad de las instrucciones denidas para dicha CPU. El programador tiene un repertorio de instrucciones como medio para controlar la CPU.

Instrucciones de transferencia de datos: en este


tipo de instrucciones, se transeren datos desde una
localizacin a otra. Los pasos que se siguen para realizarlo son:
1. Determinacin de las direcciones de origen y destino
de memoria.
2. Realizacin de la transformacin de memoria virtual
a memoria real.
3. Comprobacin de la cach.
4. Inicio del proceso de lectura/escritura en la memoria.
Instrucciones aritmticas: pueden implicar transferencia de datos antes y/o despus. Realizan operaciones aritmticas de las que se encarga la ALU. Se
pueden clasicar en de 1 operando (valor absoluto,
negacin) y 2 operandos (suma, resta).

101.1 Campos
Normalmente una instruccin se divide en dos campos:

Cdigo de operacin: Designa la operacin que va


a ser realizada. En lenguaje ensamblador, se asigna
a su valor numrico un mnemnico. Por ejemplo,
en el MIPS tenemos una instruccin con el cdigo
de operacin 0224x en lenguaje ensamblador es la
operacin add.
Datos de la operacin: Dependiendo del tipo de
instruccin, este campo puede estar dividido en
otros o ser nico, incluso no existir. En l se suelen
indicar los registros y datos con los que trabajar.

Instrucciones lgicas: al igual que las aritmticas,


la ALU se encarga de realizar estas operaciones, que
en este caso son de tipo lgico.
Instrucciones de conversin: similares a las aritmticas y lgicas. Pueden implicar lgica especial
para realizar la conversin.
Instrucciones de transferencia de control: actualizan el contador de programa (PC). Administran
las llamadas/retornos a las subrutinas, el paso de
parmetros y el enlazado.
Instrucciones de E/S (entrada/salida): administran
los comandos de entrada/salida. Si hay un mapa de
memoria de entrada/salida, determina la direccin
de este mapa.

El tamao (longitud en bits) de la instruccin depende de


cada arquitectura, pudiendo variar de 4 hasta 128 bits.
La instruccin debe almacenarse temporalmente (en el 101.3 Repertorio
registro de instruccin, RI) para que la CPU analice su
contenido y extraiga los datos que la forman. A este paso Las instrucciones de un lenguaje de programacin se pueden clasicar en 4 grupos:
se le llama decodicacin.
204

101.4. VASE TAMBIN


Instrucciones de transferencias de datos: Son
aquellas de entrada o lectura y de salida o escritura.
En el caso de las instrucciones de entrada o lectura,
se lleva el dato de entrada o lectura desde la unidad
de entrada a la memoria. Si por el contrario es una
instruccin de salida o escritura, se lleva el dato de
la memoria a la unidad de salida.
Instrucciones de tratamiento: Se trata de las instrucciones aritmtico-lgicas y las de desplazamientos. As como suma de datos o comparaciones.
Instrucciones de ujo de control o de bifurcacin y salto: Las instrucciones de ujo de control
son aquellas instrucciones que alteran el orden secuencial de la ejecucin de un programa. Tambin
hay instrucciones que posibilitan la interrupcin de
la ejecucin o saltar a ejecutar otro programa. Cuando termina cualquiera de estas instrucciones, el programa contina ejecutndose desde el punto en el
que se interrumpi.
Otras instrucciones: Por ejemplo, la detencin del
funcionamiento del computador a la espera de una
accin del usuario.

101.4 Vase tambin


Lenguaje de mquina.
Comando.

205

Captulo 102

Interfaz binaria de aplicaciones


Linux kernel-to-userspace

La adhesin a las ABIs (las cuales pueden o no estar ocialmente estandarizadas) es normalmente trabajo
del compilador, sistema operativo o de la librera, pero los programadores de aplicaciones pueden tratar con
las ABIs directamente cuando escriben las aplicaciones
en una mezcla de lenguajes de programacin, utilizando
interfaces de funciones forneas entre ellas.

Linux kernel-internal

API stability is guaranteed, source code


is portable!

API stability is not guaranteed,


source code portability is not a given
Linux
memory
manager
Virtual
file
system

API

I/O
interface

Network
interface

no stable ABI over Linux kernel releases,

compatible ABI can be guaranteed,

Las ABIs dieren de las interfaces de programacin de


aplicaciones (APIs) en que ambas denen interfaces entre
componentes de programa pero las API a nivel de cdigo
fuente.

binaries are not portable

binaries are portable

Linux OS
"Alpha"

DRM

in Linux kernel 3.14

MotionBuilder
Siemens NX
BricsCAD
CATIA5
Maya
et al.

ABI

IPC
manager

Linux
process
scheduler

binary
device
driver

Linux OS
"Bravo"

Linux OS
"Charlie"

compiled against
LSB 5.0 for x86-64

DRM

in Linux kernel 3.7

compiled for
Linux kernel 3.0

compiled against
LSB 5.0 for x86-64

DRM

in Linux kernel 3.0

Compilando los sistemas operativos y software comercial conforme a Linux Standard Base, resultar en una Interfaz Binaria de
Aplicacin (ABI) y por ello en portabilidad binaria.
static int collect(const char *root) {
enum {
FD_FANOTIFY, /* Get the actual fs events */
FD_SIGNAL,
/* We get notifications to quit early via this fd */
FD_INOTIFY,
_FD_MAX
};
struct pollfd pollfd[_FD_MAX] = {};
int fanotify_fd = -1, signal_fd = -1, inotify_fd = -1, r = 0;
pid_t my_pid;
Hashmap *files = NULL;
Iterator i;
char *p, *q;
sigsdet_t mask;
FILE *pack = NULL;
char *pack_fn_new = NULL, *pack_fn = NULL;
bool on_ssd, on_btrfs;
struct statfs sfs;
usec_t not_after;
uint64_t previous_block_readahead;
bool previous_block_readahead_set = false;

static int collect(const char *root) {


enum {
FD_FANOTIFY, /* Get the actual fs events */
FD_SIGNAL,
/* We get notifications to quit early via this fd */
FD_INOTIFY,
_FD_MAX
};
struct pollfd pollfd[_FD_MAX] = {};
int fanotify_fd = -1, signal_fd = -1, inotify_fd = -1, r = 0;
pid_t my_pid;
Hashmap *files = NULL;
Iterator i;
char *p, *q;
sigsdet_t mask;
FILE *pack = NULL;
char *pack_fn_new = NULL, *pack_fn = NULL;
bool on_ssd, on_btrfs;
struct statfs sfs;
usec_t not_after;
uint64_t previous_block_readahead;
bool previous_block_readahead_set = false;

assert(root);

assert(root);

assert(root);

if (asprintf(&pack_fn, "%s/.readahead", root) < 0) {


r = log_oom();
goto finish;
}

if (asprintf(&pack_fn, "%s/.readahead", root) < 0) {


r = log_oom();
goto finish;
}

Linux kernel & GNU C Library


(source code)

API

78
D2
03
DE
2A
D1
9D
68
5D
35
5C
0B
BF
CA
B7
7D
DB
75
7E
C7
1F
5E
F8

3C
89
F7
B2
56
E3
18
1E
77
E4
6E
8D
B3
CA
47
D9
DC
FA
EA
F3
7E
B0
51

1E
B3
B3
6D
AC
4C
63
7B
1D
71
02
71
63
16
F9
76
F7
EE
29
FC
FC
7F
E0

A6
98
65
5B
5A
4D
D5
F8
BD
8E
1F
78
D7
DB
F2
21
D0
CE
6C
8B
31
FD
AB

4F
76
EB
B8
C5
49
AA
21
7A
50
AF
31
6E
4F
EB
84
C3
CF
F8
2F
00
6B
6F

3D
CC
56
7D
CE
E1
D5
34
F6
20
0F
5B
B2
83
6F
E8
75
A7
E5
B1
83
ED
BE

06
14
56
F2
BC
C2
AC
5D
24
E8
05
53
32
25
28
48
02
5B
11
76
06
F6
05

80
12
AE
A4
3C
0B
5D
E7
3E
09
EA
EF
D2
2B
2F
0C
D9
D7
E6
FD
0C
D2
E0

E9
12
5A
89
8E
2E
B7
83
3E
18
31
37
C9
87
2F
C3
6D
AE
CD
7A
08
D2
CC

D3
42
5D
8C
9B
E0
8E
FF
8E
07
76
67
CA
BB
E7
A0
DB
E1
9F
96
8F
BD
73

A6
97
6F
19
39
ED
BB
7D
EE
B5
85
DC
48
EC
F6
7F
77
F7
CF
FD
D1
6C
CE

B2
30
FF
3D
83
F7
6E
C4
5D
ED
69
48
27
E1
9B
BF
00
C0
A2
FC
AF
DC
AB

A7
9F
8B
8A
F2
DE
BF
9A
BB
71
BD
D7
2F
D4
6F
BE
F0
60
C5
33
5F
B4
BB

A8
32
FE
AC
8A
E7
8D
B5
86
87
6D
90
BF
29
C2
9C
C3
30
4B
C3
5F
19
FD

88
79
70
CC
0A
91
19
EB
FB
3E
E1
57
80
53
66
7F
BC
88
C8
87
00
80
DB

55
12
01
4C
34
C7
D3
D8
1F
44
FD
54
39
70
B3
EE
1F
CF
CA
0D
76
59
6F

AB
93
93
26
5D
1F
A6
B2
C9
99
29
BA
4F
39
35
39
F9
E7
CC
25
EC
C7
19

compatible ABI can be guaranteed,


machine code becomes portable

Compilation
Linux kernel & GNU C Library
(machine code)

ABI
D7
26
27
4F
A3
27
32
75
FC
55
4A
B9
FE
5D
DE
BC
61
0B
64
2B
CC
1F
36

la convencin de llamada, que controla cmo se pasan los argumentos de las funciones y se recuperan
los valores devueltos; por ejemplo, si todos los parmetros se pasan a la pila o si algunos parmetros
pasan a los registros, qu registros se utilizan para qu parmetros de una funcin, y qu parmetro
pasa primero a la pila, si pasa el primero o el ltimo

Siemens NX
(source code)

API

binary compatible
(same instruction set,
same compilation environment)

ABI

Available cross-distribution ABIs, e.g.:


LSB (Linux Standard Base)

systemd
not
(machine code) binary compatible
45
71
C8
F9
AA
B8
5D
CC
37
69
35
FB
A9
F2
F8
46
D6
8F
9F
09
13
53
C1

tamaos, disposicin y alineamiento de los tipos de


datos

Available documentation, e.g.:


Linux manual pages: system calls
The GNU C Library Reference Manual
The Linux Programming Interface, Michael Kerrisk (2010, No Starch Press)
etc.

stable API is guaranteed,


source code remains portable

binary compatible
(same instruction set,
same compilation environment)

Las ABIs cubren aspectos como:

static int collect(const char *root) {


enum {
FD_FANOTIFY, /* Get the actual fs events */
FD_SIGNAL,
/* We get notifications to quit early via this fd */
FD_INOTIFY,
_FD_MAX
};
struct pollfd pollfd[_FD_MAX] = {};
int fanotify_fd = -1, signal_fd = -1, inotify_fd = -1, r = 0;
pid_t my_pid;
Hashmap *files = NULL;
Iterator i;
char *p, *q;
sigsdet_t mask;
FILE *pack = NULL;
char *pack_fn_new = NULL, *pack_fn = NULL;
bool on_ssd, on_btrfs;
struct statfs sfs;
usec_t not_after;
uint64_t previous_block_readahead;
bool previous_block_readahead_set = false;

if (asprintf(&pack_fn, "%s/.readahead", root) < 0) {


r = log_oom();
goto finish;
}

systemd
(source code)

102.1 Descripcin

Siemens NX
not
binary compatible (machine code)
34
4C
4E
9C
6F
39
76
2B
A0
05
E3
EF
9D
3C
B9
F1
DE
B7
F6
B3
AB
27
74

45
71
C8
F9
AA
B8
5D
CC
37
69
35
FB
A9
F2
F8
46
D6
8F
9F
09
13
53
C1

78
D2
03
DE
2A
D1
9D
68
5D
35
5C
0B
BF
CA
B7
7D
DB
75
7E
C7
1F
5E
F8

3C
89
F7
B2
56
E3
18
1E
77
E4
6E
8D
B3
CA
47
D9
DC
FA
EA
F3
7E
B0
51

1E
B3
B3
6D
AC
4C
63
7B
1D
71
02
71
63
16
F9
76
F7
EE
29
FC
FC
7F
E0

A6
98
65
5B
5A
4D
D5
F8
BD
8E
1F
78
D7
DB
F2
21
D0
CE
6C
8B
31
FD
AB

4F
76
EB
B8
C5
49
AA
21
7A
50
AF
31
6E
4F
EB
84
C3
CF
F8
2F
00
6B
6F

3D
CC
56
7D
CE
E1
D5
34
F6
20
0F
5B
B2
83
6F
E8
75
A7
E5
B1
83
ED
BE

06
14
56
F2
BC
C2
AC
5D
24
E8
05
53
32
25
28
48
02
5B
11
76
06
F6
05

80
12
AE
A4
3C
0B
5D
E7
3E
09
EA
EF
D2
2B
2F
0C
D9
D7
E6
FD
0C
D2
E0

E9
12
5A
89
8E
2E
B7
83
3E
18
31
37
C9
87
2F
C3
6D
AE
CD
7A
08
D2
CC

D3
42
5D
8C
9B
E0
8E
FF
8E
07
76
67
CA
BB
E7
A0
DB
E1
9F
96
8F
BD
73

A6
97
6F
19
39
ED
BB
7D
EE
B5
85
DC
48
EC
F6
7F
77
F7
CF
FD
D1
6C
CE

B2
30
FF
3D
83
F7
6E
C4
5D
ED
69
48
27
E1
9B
BF
00
C0
A2
FC
AF
DC
AB

A7
9F
8B
8A
F2
DE
BF
9A
BB
71
BD
D7
2F
D4
6F
BE
F0
60
C5
33
5F
B4
BB

A8
32
FE
AC
8A
E7
8D
B5
86
87
6D
90
BF
29
C2
9C
C3
30
4B
C3
5F
19
FD

88
79
70
CC
0A
91
19
EB
FB
3E
E1
57
80
53
66
7F
BC
88
C8
87
00
80
DB

55
12
01
4C
34
C7
D3
D8
1F
44
FD
54
39
70
B3
EE
1F
CF
CA
0D
76
59
6F

AB
93
93
26
5D
1F
A6
B2
C9
99
29
BA
4F
39
35
39
F9
E7
CC
25
EC
C7
19

D7
26
27
4F
A3
27
32
75
FC
55
4A
B9
FE
5D
DE
BC
61
0B
64
2B
CC
1F
36

34
4C
4E
9C
6F
39
76
2B
A0
05
E3
EF
9D
3C
B9
F1
DE
B7
F6
B3
AB
27
74

45
71
C8
F9
AA
B8
5D
CC
37
69
35
FB
A9
F2
F8
46
D6
8F
9F
09
13
53
C1

78
D2
03
DE
2A
D1
9D
68
5D
35
5C
0B
BF
CA
B7
7D
DB
75
7E
C7
1F
5E
F8

3C
89
F7
B2
56
E3
18
1E
77
E4
6E
8D
B3
CA
47
D9
DC
FA
EA
F3
7E
B0
51

1E
B3
B3
6D
AC
4C
63
7B
1D
71
02
71
63
16
F9
76
F7
EE
29
FC
FC
7F
E0

A6
98
65
5B
5A
4D
D5
F8
BD
8E
1F
78
D7
DB
F2
21
D0
CE
6C
8B
31
FD
AB

4F
76
EB
B8
C5
49
AA
21
7A
50
AF
31
6E
4F
EB
84
C3
CF
F8
2F
00
6B
6F

3D
CC
56
7D
CE
E1
D5
34
F6
20
0F
5B
B2
83
6F
E8
75
A7
E5
B1
83
ED
BE

06
14
56
F2
BC
C2
AC
5D
24
E8
05
53
32
25
28
48
02
5B
11
76
06
F6
05

80
12
AE
A4
3C
0B
5D
E7
3E
09
EA
EF
D2
2B
2F
0C
D9
D7
E6
FD
0C
D2
E0

E9
12
5A
89
8E
2E
B7
83
3E
18
31
37
C9
87
2F
C3
6D
AE
CD
7A
08
D2
CC

D3
42
5D
8C
9B
E0
8E
FF
8E
07
76
67
CA
BB
E7
A0
DB
E1
9F
96
8F
BD
73

A6
97
6F
19
39
ED
BB
7D
EE
B5
85
DC
48
EC
F6
7F
77
F7
CF
FD
D1
6C
CE

B2
30
FF
3D
83
F7
6E
C4
5D
ED
69
48
27
E1
9B
BF
00
C0
A2
FC
AF
DC
AB

A7
9F
8B
8A
F2
DE
BF
9A
BB
71
BD
D7
2F
D4
6F
BE
F0
60
C5
33
5F
B4
BB

A8
32
FE
AC
8A
E7
8D
B5
86
87
6D
90
BF
29
C2
9C
C3
30
4B
C3
5F
19
FD

88
79
70
CC
0A
91
19
EB
FB
3E
E1
57
80
53
66
7F
BC
88
C8
87
00
80
DB

55
12
01
4C
34
C7
D3
D8
1F
44
FD
54
39
70
B3
EE
1F
CF
CA
0D
76
59
6F

AB
93
93
26
5D
1F
A6
B2
C9
99
29
BA
4F
39
35
39
F9
E7
CC
25
EC
C7
19

D7
26
27
4F
A3
27
32
75
FC
55
4A
B9
FE
5D
DE
BC
61
0B
64
2B
CC
1F
36

34
4C
4E
9C
6F
39
76
2B
A0
05
E3
EF
9D
3C
B9
F1
DE
B7
F6
B3
AB
27
74

cmo una aplicacin debera realizar llamadas al sistema del sistema operativo y, si la ABI especica
llamadas directas al sistema en vez de llamadas de
procedimiento, las direcciones de llamada

Linux kernel y GNU C Library denen el Linux API. Tras la


compilacin, los binarios ofrecen una ABI; manteniendo esta ABI
estable a lo largo del tiempo es importante para el vendedor independiente de software.

En software de ordenador, una interfaz binaria de aplicacin (ABI) es la interfaz entre dos mdulos de programa, uno de los cuales es, a menudo, una librera o sistema
operativo, a nivel de lenguaje de mquina. Una ABI determina detalles como la forma de llamar a las funciones,
en qu formato binario se debera pasar la informacin
de un componente de programa al siguiente, o al sistema
operativo en el caso de una llamada al sistema.

y en el caso de un ABI de sistema operativo completo, el formato binario de los archivos objeto de las
libreras de programa, etc.
Un ABI completo, como el Estndar de Compatibilidad
Binaria de Intel (iBCS),* [1] permite a un programa de
un sistema operativo soportar dicho ABI para ejecutarse
sin modicaciones en cualquier otro sistema al que se le
provean de las libreras compartidas necesarias y tenga
los mismos pre-requisitos.

206

102.5. ENLACES EXTERNOS


Otras ABIs estandarizan detalles como la convencin de
nombres de funciones en C++,* [2] manejo de excepciones, propagacin,* [3] y convencin sobre llamadas entre
compiladores de la misma plataforma que no requieren
compatibilidad con otras plataformas.

102.2 EABI
Una interfaz binaria de aplicacin embebida (EABI) especica convenciones estandarizadas para los formatos
de archivo, tipos de datos, uso de registros, organizacin
de la pila y paso de parmetros en funciones de una aplicacin de un sistema embebido.
Los compiladores que soportan EABI crean cdigo objeto compatible con el cdigo generado por otros compiladores, permitiendo a los desarrolladores enlazar libreras
generadas con otros compiladores. Los desarrolladores
que escriben su propio cdigo en lenguaje ensamblador
pueden usar EABI para interactuar con el ensamblador
generado por otro compilador.

207

[4] EABI Summary. PowerPC Embedded Application Binary Interface: 32-Bit Implementation (Version 1.0 edicin). Freescale Semiconductor, Inc. 01-10-1995. pp. 28
30.
[5] Debian ARM accelerates via EABI port. Linuxdevices.com. 19-01-2007. Archivado desde el original el 21
de enero 2007. Consultado el 11-10-2007.
[6] Andrs Caldern and Nelson Castillo (14-03-2007).
Why ARM's EABI matters. Linuxdevices.com.
Archivado desde el original el 31 de marzo 2007.
Consultado el 11-10-2007.
[7] PowerPC Embedded Processors Application Note
[8] ARM Information Center. Infocenter.arm.com. Consultado el 27-02-2014.
[9] Eric Christopher - mips eabi documentation. Cygwin.com. 11-06-2003. Consultado el 27-02-2014.

102.5 Enlaces externos

Las diferencias principales entre EABI y ABI para sistemas operativos de propsito general son que se permiten
instrucciones privilegiadas en el cdigo de la aplicacin
sin necesidad de enlazado dinmico y se utiliza un marco de pila ms compacto para ahorrar memoria.* [4] La
eleccin de EABi puede afectar al rendimiento.* [5]* [6]

KDE Techbase Policies - Buen compendio de reglas


de desarrollo (con algunos ejemplos) para no romper
la compatibilidad binaria entre diferentes versiones
de tu librera.

Ejemplos de EABIs ampliamente utilizadas:


PowerPC,* [7] ARM EABI2* [8] y MIPS EABI.* [9]

Debian ARM EABI port

Mac OS X ABI Function Call Guide

Clib: Motorola 8/16-bit embedded ABI


AMD64 (x86-64) Application Binary Interface

102.3 Vase tambin


Compatibilidad de cdigo binario
Comparacin entre aplicaciones de virtualizacin de
mquinas
Interfaz de funciones forneas
Binding
Puntero opaco
SWIG

102.4 Referencias
[1] Intel Binary Compatibility Standard (iBCS)
[2] Itanium C++ ABI (compatible con mltiples arquitecturas)
[3] Itanium C++ ABI: Exception Handling (compatible con
mltiples arquitecturas)

Application Binary Interface (ABI) para la arquitectura ARM


Documentacin sobre EABI de MIPS
Sun Studio 10 Compilers and the AMD64 ABI Buen sumario y comparacin entre algunas ABIs
populares
MCORE Applications Binary Interface Standards
Manual for the Freescale MCORE processors

Captulo 103

Interfaz uida
En ingeniera de software, una interfaz uida (trmino
acuado por primera vez por Eric Evans y Martin Fowler) es una construccin orientada a objeto que dene un
comportamiento capaz de retransmitir el contexto de la
instruccin de una llamada subsecuente. Generalmente,
el contexto es

ICongurationFluent { string color; int height; int length;


int width; ICongurationFluent SetColor(string color)
{ this.color = color; return this; } ICongurationFluent
SetHeight(int height) { this.height = height; return this; }
ICongurationFluent SetLength(int length) { this.length
= length; return this; } ICongurationFluent SetDepth(int
depth) { this.depth = depth; return this; } } public class
denido a travs del valor de retorno de un mtodo ExampleProgram { [STAThread] public static void
Main(string[] args) { //Ejemplo estndar ICongurallamado
tion cong = new Conguration(); cong.SetColor(
autoreferencial, donde el nuevo contexto es equiva- blue); cong.SetHeight(1); cong.SetLength(2); conlente al contexto anterior
g.SetDepth(3); //Ejemplo uido ICongurationFluent
cong = new CongurationFluent().SetColor(blue)
terminado por medio del retorno de un contexto va.SetHeight(1) .SetLength(2) .SetDepth(3); } } }
co (void context).

Este estilo es benecioso debido a su capacidad de proporcionar una sensacin ms uida al cdigo, aunque algunos ingenieros encuentran el estilo difcil de leer. Una
segunda crtica es que generalmente, las necesidades de
programacin son demasiado dinmicas para conar en
la denicin esttica de contacto ofrecida por una interfaz uida.

103.1 Ejemplos
El siguiente ejemplo muestra una clase implementando
una interfaz no uida, y otra implementando una contraparte uida, junto con las diferencias en el uso. El ejemplo se escribe en C #:
namespace Example.FluentInterfaces { using System;
public interface IConguration { void SetColor(string
color); void SetHeight(int height); void SetLength(int
length); void SetDepth(int depth); } public interface
ICongurationFluent { ICongurationFluent SetColor(string color); ICongurationFluent SetHeight(int
height); ICongurationFluent SetLength(int length);
ICongurationFluent SetDepth(int depth); } public
class Conguration : IConguration { string color;
int height; int length; int width; void SetColor(string
color) { this.color = color; } void SetHeight(int height)
{ this.height = height; } void SetLength(int length)
{ this.length = length; } void SetDepth(int depth) {
this.depth = depth; } } public class CongurationFluent :

El siguiente es un ejemplo en C++ de cmo proveer una


envoltura de una interfaz uida arriba de una interfaz ms
tradicional:

// denicin bsica class GlutApp { private: int w_,


h_, x_, y_, argc_, display_mode_; char **argv_; char
*title_; public: GlutApp(int argc, char** argv) { argc_
= argc; argv_ = argv; } void setDisplayMode(int mode)
{ display_mode_ = mode; } void getDisplayMode() {
return display_mode_; } void setWindowSize(int w,
int h) { w_ = w; h_ = h; } void setWindowPosition(int
x, int y) { x_ = x; y_ = y; } void setTitle(const char
*title) { title_ = title; } void create(); }; // uso bsico int
main(int argc, char **argv) { GlutApp app(argc, argv);
app.setDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_ALPHA|GL
//
Ajusta
los
parmetros
del
framebuer
app.setWindowSize(500, 500); // Ajusta los parmetros de la ventana app.setWindowPosition(200, 200);
app.setTitle(My OpenGL/GLUT App); app.create();
} // Envoltorio uido class FluentGlutApp : private
GlutApp { public: FluentGlutApp(int argc, char **argv)
: GlutApp(argc, argv) {} // hereda el constructor del
pariente FluentGlutApp &withDoubleBuer() { setDisplayMode(getDisplayMode() | GLUT_DOUBLE);
return *this; } FluentGlutApp &withRGBA() { setDisplayMode(getDisplayMode() | GLUT_RGBA); return
*this; } FluentGlutApp &withAlpha() { setDisplayMode(getDisplayMode() | GLUT_ALPHA); return
*this; } FluentGlutApp &withDepth() { setDisplayMode(getDisplayMode() | GLUT_DEPTH); return *this;

208

103.2. ENLACES EXTERNOS


} FluentGlutApp &across(int w, int h) { setWindowSize(int w, int h) { return *this; } FluentGlutApp &at(int x,
int y) { setWindowPosition(x, y); return *this; } FluentGlutApp &named(const char *title) { setTitle(title);
return *this; } // no tiene sentido encadenar despus
de create(), as que se retorna *this void create() {
GlutApp::create(); } }; // uso bsico int main(int argc,
char **argv) { FluentGlutApp app(argc, argv) .withDouble().withRGBA().withAlpha().withDepth()
.at(200,
200).across(500, 500) .named(My OpenGL/GLUT
App); app.create(); }

103.2 Enlaces externos


Martin Fowler's original bliki entry coining the term

209

Captulo 104

Invariante (informtica)
En la informtica se conoce como invariante a una condicin que se sigue cumpliendo despus de la ejecucin
de determinados comandos. Se cumple tanto antes como despus de estos comandos, permaneciendo sin variacin, por ello se denomina invariante. Las invariantes se pueden utilizar para demostrar el buen funcionamiento de algoritmos y cumplen con un papel importante en el diseo por contrato. En estos casos se describen
las precondiciones, postcondiciones e invariantes para un
mtodo de un interfaz. Este concepto se puede implementar con la ayuda de aserciones, siempre y cuando el
lenguaje de programacin o la API los soporte.

104.1 Enlaces externos


Programm zur automatischen Verikation (en alemn)

210

Captulo 105

Jframe
JFrame es una clase utilizada en Swing (biblioteca grca) para generar ventanas sobre las cuales aadir distintos
objetos con los que podr interactuar o no el usuario. A
diferencia de JPanel, JFrame posee algunas nociones tpicas de una ventana como minimizar, cerrar, maximizar
y poder moverla.

addImpl(Component comp, Object constraints, int index): Aade el componente especicado al JFrame.

105.1 Herencia

frameInit(): Llama a los constructores para inicializar el JFrame correctamente.

JFrame es una subclase que extiende de la clase


Frame y que implementa WindowConstants, Accessible
y RootPaneContainer.

createRootPane(): Crea un Panel por defecto por


medio de una llamada al constructor.

getAccessibleContext():
Obtiene
AccessibleContext asociado a dicho JFrame.

el

getContentPane(): Devuelve el contenido del JFrame.

105.2 Constructores
Existen 4 tipos de constructores para inicializar un objeto
JFrame:
JFrame(): Construye un nuevo marco que es
inicialmente invisible.
JFrame(GraphicsConguration): Crea una ventana
con la conguracin grca especicada en el
objeto GraphicsConguration.
JFrame(Cadena de texto): Crea una nueva ventana
a la que se le pone por ttulo la cadena de texto que
se le indique.
JFrame(Cadena de texto, GraphicsConguration):
Crea una nueva ventana con el ttulo y la conguracin grca especicados.

getDefaultCloseOperation(): Devuelve la operacin


por defecto cuando se cierra el JFrame.
getGlassPane(): Devuelve el objeto glassPane que
corresponde a este JFrame.
getGraphics(): Obtiene las caractersticas grcas
del JFrame.
getJMenuBar(): Devuelve la barra de men del
JFrame.
getLayeredPane(): Obtiene el objeto layeredPane
del JFrame.
getRootPane(): Obtiene el objeto rootPane del
JFrame.

105.3 Mtodos propios de la clase


Adems de los mtodos heredados, JFrame implementa
una serie de mtodos propios de esta, que se describen a
continuacin:
211

getTransferHandler():
Devuelve
transferHandler del JFrame.

el

objeto

212
isDefaultLookAndFeelDecorated(): Comprueba si
la apariencia de la ventana JFrame es la apariencia
por defecto; en caso armativo ser cierto.
isRootPaneCheckingEnabled(): Devuelve un valor
de cierto si las llamadas add y setLayout se remiten
a la contentPane.
paramString(): Devuelve una representacin en
cadena de texto del JFrame.
processWindowEvent(WindowEvent e): Procesa los
eventos que se producen en el JFrame.

CAPTULO 105. JFRAME


setRootPane(JRootPane root): Establece el rootPane
de la ventana .
setRootPaneCheckingEnabled(boolean
enabled):
Establece si las llamadas add y setLayout se remiten
o no a la contentPane.
setTransferHandler(TransferHandler newHandler):
Dene el transferHandler, que es un mecanismo
de soporte de transferencia de datos dentro del
JFrame.
update(Graphics g): Hace una llamada al mtodo
paint(g).

remove(Component comp): Elimina el componente


que se especica de la ventana JFrame.

105.4 Enlaces externos


repaint(long time, int x, int y, int width, int height):
Redibuja el rectngulo especicado del JFrame en
el tiempo indicado en milisegundos.
setContentPane(Container contentPane): Establece
el contentPane especicado en JFrame.
setDefaultCloseOperation(int operation): Especica
la operacin por defecto al cerrar el JFrame.
setDefaultLookAndFeelDecorated(boolean
defaultLookAndFeelDecorated): Establece la apariencia que debe tener el JFrame, como bordes,
botones para distintos usos, ttulo...
setGlassPane(Component glassPane): Establece las
propiedades del objeto glassPane.
setIconImage(Image image): Dene el icono que se
mostrar en la parte superior izquierda del marco
del JFrame.
setJMenuBar(JMenuBar menubar): Establece la
barra de men del JFrame.
setLayeredPane(JLayeredPane layeredPane): Dene el objeto layeredPane del JFrame.
setLayout(LayoutManager manager): Establece la
forma en que se mostrarn los distintos objetos
aadidos al JFrame.

http://docs.oracle.com/javase/7/docs/api/javax/
swing/JFrame.html

Captulo 106

Usuario discusin:Juliasocorro
Hola, Julia. Olvid introducir el aviso en obras. Por ello
hubo un conicto de edicin. Si te convencen los cambios,
mi versin era sta:

3. Conocimiento de los CMS.


4. Dominio de las API de las redes sociales importantes: Facebook, Twitter, LinkedIn, Instagram, Youtube, Google Plus... otras.

Agente SEO es un profesional que gestiona el


posicionamiento SEO de los sitios web y blogs en
los motores de bsqueda de Internet, tales como Google,
Bing y Yahoo.

5. Programador Web.
Personal:

Si se considera una puesta en comn de las ofertas generales recientes a nivel nacional, el perl laboral del Agente
SEO, segn la demanda de empleabilidad actual de las
empresas en cuanto a conocimientos, habilidades y destrezas, es el siguiente:

1. Positivo, creativo, estratega.


2. Metdico, ordenado, esquemtico.
3. Proactivo, que asista a congresos SEO, Analytic, Social Media, Adwords.

Experto en Marketing online y en Analtica Web:

4. Dominio del estrs y de la presin de trabajo, ya que


muchas veces se labora contra el paso del robot de
Google y de otros buscadores.

1. Anlisis e investigacin de las palabras claves: Marketing online & SEO.

5. Capacidad de aprendizaje continuo, pasin por el


trabajo, sin lmite de horario.

2. Experiencia demostrable con SEMrush, Webmaster


Tools, Google Analytics, Ahref y otras herramientas
de auditora y gestin SEO.

6. Trabajo por resultados.

3. Diseo de estrategias de enlaces linkbuilding.


El Agente SEO puede ser:

4. Testeo de la web, mantenimiento de backlinks.


5. Previsor de penalizaciones.

Contratado:

6. Estratega y Auditor.

1. Freelance, con herramientas propias para trabajar


por nichos de mercado y empresas.

7. Dominio de:

2. Por una empresa de alto nivel que empiece a expandir sus departamentos porque debe atender un alto
porcentaje de marketing digital.

(a) Robots y algoritmos de buscadores tales como


Google, Bing y Yahoo.
(b) Tcnicas White Hat SEO y Black Hat SEO.
8. Experiencia SEO acreditada en Google y en otros
motores de bsqueda.
Webmaster:

Parte de una Agencia.


Es una profesin nueva. Muchas empresas solicitan que
el Agente SEO sepa tambin de PPC (presupuesto por
campaa). En ese caso el perl laboral sera de Agente
SEM.

1. SEO on page, optimizacin de la web, Web performance (HTML, PCHP, CCS, Bootstrap y Respon- El Agente SEO es un perl profesional novel. Data de pocos aos en el mercado nacional. Su demanda empieza a
sive Design).
aorar ahora mismo. En el transcurso del tiempo surgi2. Bases de datos, MysQL.
rn muchos cambios y especialidades. Porque, si bien en
213

214
SEO estamos en la etapa de madurez, en un momento que
el SEO participa de un porcentaje del trabajo webmaster,
con una porcin del marketing digital, tambin es cierto
que en Espaa comienza a aorar en Internet en cuanto a
subida de los negocios al mundo online y ms con sitios
web con Diseo Web adaptado a dispositivos mviles.
A medida que se implemente este perl profesional se
conrmar cada una de sus aptitudes. Una faceta positiva
adicional de Wikipedia es su apertura a la visin y a valores a nivel nacional de todos y cada uno de nosotros. Por
otra parte, no necesariamente el perl del Agente SEO
ha de ser equiparable con el inherente al Agente SEM.
Es positivo comenzar a disear las lneas que los cruzan
y de otras que los separan.
Esta es una propuesta para empezar a disear el perl laboral del Agente SEO, que no se imparte en las escuelas,
sino en los negocios.

CAPTULO 106. USUARIO DISCUSIN:JULIASOCORRO

Captulo 107

Kanban (desarrollo)
Este artculo se reere a la gestin de procesos y mtodo
de mejora. Para el proceso de manufactura esbelta, consulte Kanban.

107.2 Los principios del mtodo


Kanban

Kanban es un mtodo para gestionar el trabajo intelecEl mtodo Kanban tiene sus races en cuatro principios
tual, con nfasis en la entrega justo a tiempo, mientras no
bsicos:
se sobrecargan a los miembros del equipo. En este enfoque, el proceso, desde la denicin de una tarea hasta su
1. Comience con lo que hace ahora
entrega al cliente, se muestra para que los participantes lo
vean y los miembros del equipo tomen el trabajo de una
El mtodo Kanban se inicia con las funcola.
ciones y procesos que ya se tienen y estiKanban se puede dividir en dos partes:
mula cambios continuos, incrementales
y evolutivos a su sistema.
Kanban - Un sistema de gestin de proceso visual
2. Se acuerda perseguir el cambio incremental y evoque le indica qu producir, cundo producirlo, y
lutivo
cunto producir.
El mtodo Kanban - Una aproximacin a la mejora
del proceso evolutivo e incremental para las organizaciones.

107.1 El mtodo Kanban


En el desarrollo de software, utilizamos un sistema Kanban virtual para limitar el trabajo en curso. A pesar de
que el nombre se origina del idioma japonsKanban,
y se traduce aproximadamente comotarjeta de seal,
y hay tarjetas utilizadas en la mayora de las implementaciones de Kanban en desarrollo de software, estas tarjetas
no funcionan en realidad como seales para realizar ms
trabajo. Representan los elementos de trabajo. De ah el
trmino virtualporque no existe una tarjeta fsica.
El mtodo Kanban formulado por David J. Anderson* [1]* [2] es una aproximacin al proceso gradual, evolutivo y al cambio de sistemas para las organizaciones.
Utiliza un sistema de extraccin limitada del trabajo en
curso como mecanismo bsico para exponer los problemas de funcionamiento del sistema (o proceso) y estimular la colaboracin para la mejora continua del sistema.
Un ejemplo del sistema de extraccin es el sistema Kanban, y es despus de esta popular forma de trabajo en
curso, que se ha denominado el mtodo.
215

La organizacin (o equipo) deben estar


de acuerdo que el cambio continuo, gradual y evolutivo es la manera de hacer
mejoras en el sistema y debe apegarse a
ello. Los cambios radicales pueden parecer ms ecaces, pero tienen una mayor
tasa de fracaso debido a la resistencia y
el miedo en la organizacin. El mtodo
Kanban anima a los pequeos y continuos cambios incrementales y evolutivos
a su sistema actual.
3. Respetar el proceso actual, los roles, las responsabilidades y los cargos
Tenemos que facilitar el cambio futuro; acordando respetar los roles actuales,
responsabilidades y cargos, eliminamos
los temores iniciales. Esto nos debera
permitir obtener un mayor apoyo a nuestra iniciativa Kanban.
4. Liderazgo en todos los niveles
Se debe alentar hechos de liderazgo en
todos los niveles de la organizacin de
los contribuyentes individuales a la alta
direccin.

216

CAPTULO 107. KANBAN (DESARROLLO)

107.3 Cinco prcticas centrales del


mtodo Kanban

consenso. El mtodo Kanban sugiere que


un enfoque cientco sea utilizado para
implementar los cambios continuos, graduales y evolutivos. El mtodo no prescribe un mtodo cientco especco para utilizarlo.

Anderson identic cinco caractersticas bsicas que haban sido observadas en cada implementacin correcta
del mtodo Kanban. Posteriormente fueron etiquetadas
como prcticas y se ampliaron con la adicin de una sexta caracterstica.* [3]
1. Visualizar
Visualizar el ujo de trabajo y hacerlo
visible es la base para comprender cmo
avanza el trabajo. Sin comprender el ujo de trabajo, realizar los cambios adecuados es ms difcil. Una forma comn
de visualizar el ujo de trabajo es el uso
de columnas. Las columnas representan
los diferentes estados o pasos en el ujo
de trabajo.
2. Limitar el trabajo en curso
Limitar el trabajo en curso implica que
un sistema de extraccin se aplica en la
totalidad o parte del ujo de trabajo. El
sistema de extraccin acta como uno de
los principales estmulos para los cambios continuos, incrementales y evolutivos en el sistema.
3. Dirigir y gestionar el ujo
Se debe supervisar, medir y reportar el
ujo de trabajo a travs de cada estado. Al gestionar activamente el ujo, los
cambios continuos, graduales y evolutivos del sistema pueden ser evaluados para tener efectos positivos o negativos.
4. Hacer las Polticas de Proceso Explcitas
Congure las reglas y directrices de su
trabajo. Entienda las necesidades y asegrese de seguir las reglas. Las polticas
denirn cundo y por qu una tarjeta
debe pasar de una columna a otra. Escrbalas. Cambie las reglas cuando la realidad cambie.
5. Utilizar modelos para reconocer oportunidades de
mejora
Cuando los equipos tienen un entendimiento comn de las teoras sobre el trabajo, el ujo de trabajo, el proceso y el
riesgo, es ms probable que sea capaz
de construir una comprensin compartida de un problema y proponer acciones
de mejora que puedan ser aprobadas por

107.4 Comportamiento emergente


con Kanban
Hay una creciente lista de comportamientos emergentes
que hemos llegado a esperar de la implementacin de
Kanban, tales como* [4]
Proceso nico a la medida de cada cadena de valor
Cadencias desacopladas
Trabajo programado por el costo de la demora
Valor optimizado con clases de servicio
Gestin de riesgo con asignacin de capacidad
Tolerancia en la experimentacin de procesos
Gestin cuantitativa
Propagacin viral de Kanban en toda la organizacin
Pequeos equipos fusionados para crear bolsas de
trabajo ms uidas.

107.5 La implementacin del mtodo Kanban


Algunos profesionales han implementado Kanban en fsico utilizando notas adhesivas, o tableros con ranuras.
Ms a menudo la seal es generada por un software de
seguimiento de trabajos especiales, tales como:* [5]
Kanban Tool
JIRA Greenhopper
Cardmapping
Tablero Kanban online
Targetprocess

107.6 Referencias
[1] Anderson, David (septiembre de 2003). Agile Management for Software Engineering: Applying the Theory of
Constraints for Business Results. Prentice Hall. ISBN 013-142460-2.

107.7. VASE TAMBIN

[2] Anderson, David (abril de 2010). Kanban - Successful


Evolutionary Change for your Technology Business. Blue
Hole Press. ISBN 0-9845214-0-2.
[3] http://web.archive.org/web/http://www.djaa.com/
principles-kanban-method David Anderson The
principles of the Kanban methodDecember 10, 2010
[4] Anderson, David (septiembre de 2010). Kanban - Successful Evolutionary Change for your Technology Business.
Blue Hole Press. ISBN 978-0-9845214-0-1.
[5] Robson, Sean (enero de 2013). Agile SAP: Introducing Flexibility, Transparency and Speed to SAP Implementations.
IT Governance Ltd. ISBN 978-1-84928-446-2.

107.7 Vase tambin


Kanban
Sistema de produccin Toyota
Desarrollo gil de software
Proceso para el desarrollo de software
Metodologa de desarrollo de software
Scrum

217

Captulo 108

Kit de desarrollo de software


SDKredirige aqu.
Un kit de desarrollo de software o SDK (siglas en ingls de software development kit) es generalmente un conjunto de herramientas de desarrollo de software que le
permite al programador o desarrollador de software crear
aplicaciones para un sistema concreto, por ejemplo ciertos paquetes de software, frameworks, plataformas de
hardware, computadoras, videoconsolas, sistemas operativos, etctera.
Es algo tan sencillo como una interfaz de programacin
de aplicaciones o API (del ingls application programing
interface) creada para permitir el uso de cierto lenguaje
de programacin, o puede, tambin, incluir hardware sosticado para comunicarse con un determinado sistema
embebido. Las herramientas de desarrollo de software
ms comunes incluyen soporte para la deteccin de errores de programacin como un entorno de desarrollo integrado o IDE (del ingls Integrated Development Environment) y otras utilidades. Los SDK frecuentemente tambin incluyen cdigos de ejemplo y notas tcnicas de soporte u otra documentacin de soporte para ayudar a claricar ciertos puntos del material de referencia primario.

puede incluir tambin el software aadido en s para ser


usado para el desarrollo pero no necesariamente para la
redistribucin. Una situacin interesante surge aqu entre plataformas donde es posible desarrollar aplicaciones
que pueden iniciar la conguracin de un sistema sin que
est instalado el add-on, y usar una rutina de peticin de
entorno de tipo Gestalt (de Mac OS) para determinar si
dicho add-on est instalado, y otros donde la aplicacin
simplemente fallar al iniciarse. En otras palabras, es posible construir un nico binario que funcione en conguraciones donde el add-on est presente o no, con una
funcionalidad reducida en este ltimo caso.

108.3 Trminos ms especcos


Los proveedores de SDK para ciertos sistemas o subsistemas pueden utilizar un trmino ms especco que el de
software. Por ejemplo, tanto Microsoft como Apple
proveen Driver Development Kits (DDK) o kits para el
desarrollo de drivers o controladores de dispositivos para
desarrollar drivers para dispositivos, y PalmSource distribuye su propio kit de desarrollo como el PalmOS Development Kit (PDK) o kit de desarrollo para PalmOS.

108.1 Incompatibilidad de licen108.4 Ejemplos


cias
Los SDK pueden incluir licencia de software que los hacen incompatibles para crear software que se pretenda
hacer para una licencia no compatible. Por ejemplo: un
SDK propietario probablemente ser incompatible para
el desarrollo de software gratuito. Y un SDK bajo la licencia GPL posiblemente ser incompatible con el desarrollo de software propietario. Sin embargo, los SDK bajo la licencia LGPL suelen ser seguros para el desarrollo
de software propietario.

108.2 SDK para aadidos


Un SDK para un aadido (add-on) de un determinado sistema operativo (por ejemplo, QuickTime para Mac OS)
218

El SDK de Virtual Earth de Microsoft.* [1]


El SDK de DirectX de Microsoft, en el que se basan,
por ejemplo, la mayora de juegos para Windows actuales.
EL .Net Framework de Microsoft, en el que se basan
muchas aplicaciones basadas en formularios.
El 'SDK Java* [2] de Sun Microsystems, en el que se
basa, por ejemplo, la herramienta de lucha contra el
vandalismo de CryptoDerk.
Los kits de herramientas de Widgets, en los que se
basan muchas utilidades desarrolladas con lenguajes
de programacin orientados a objetos.
Turbo Pascal.

108.7. ENLACES EXTERNOS


Clipper.
Delphi.
El Source SDK, una herramienta diseada por Valve
en el que se puede disear 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 homnimo.

108.5 Referencias
[1] http://dev.live.com/virtualearth/sdk/
[2] Java 2 Software Development Kit.

108.6 Vase tambin


Ambiente de desarrollo integrado
Interfaz de programacin de aplicaciones

108.7 Enlaces externos


DirectX SDK de Microsoft.
Framework SDK para sistemas X86 Framework
SDK para sistemas X86 a 64 bits y Framework SDK
para sistemas IA64 de Microsoft.
Java 2 SDK de Sun Microsystems.
Software Development Kits de ABBYY para Captura de Datos y Conversin de Documentos.
SDKs para Cmaras y voz de Olympus.
SDK para emuladores de terminales de Cybele Software.

219

Captulo 109

Kommander
Kommander es denido con un conjunto de herramientas que permite la construccin de interfaces para scripts.
Estos scripts pueden tener interaccin con aplicaciones
propias del entorno de KDE y programas compilados en
algn lenguaje como por ejemplo C, C++, Phyton, etc.
Estas propiedades lo hacen ser muy til al momento de
integrar soluciones.

Tambin hay un pgina de fans de Kommander


http://www.kommander-fanpage.de.vu/
Y ahora se une Famelix, con un wiki especial para Kommander en espaol
http://wiki.famelix.cl/es/Kommander

Ahora Kommander, en trminos ms tcnicos, 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 dilogo. Dentro de los
cuadros de dilogo se pueden insertar controles o widget,
tales como barras de progreso, botones, cuadros de imagen, etc.

109.2 El ejecutor
Es simplemente el motor que ejecuta el cdigo generado
por el editor.

109.3 Direcciones de Kommander


El paquete que contiene a Kommander es kdewebdev
(web development apps from the ocial KDE release)
http://kommander.kdewebdev.org/
La ltima versin est disponible en:
http://sourceforge.net/projects/kommander/
Lista de correos para usuarios y desarrolladores
http://mail.kdewebdev.org/mailman/listinfo/
kommander
http://mail.kdewebdev.org/mailman/listinfo/
kommander-devel
Un listado de muchas aplicaciones de Kommander en:
http://kde-apps.org/index.php?xcontentmode=288
220

Captulo 110

Last Error (informtica)


Last Error en computacin, especcamente en el cam- 110.2 En DELPHI
po de la programacin en Windows se conoce como Last
Error al ltimo error sucedido al utilizar una de las API de function MuestraError(error: DWORD): String; var
Windows. Los cdigos de error son particulares de cada pString: array[0..MAX_PATH] of char; begin FormatThread que est en ejecucin.
Message(FORMAT_MESSAGE_FROM_SYSTEM,
Cuando una Api falla, es muy comn que devuelva los Nil, error, 0, pString, MAX_PATH, Nil); Result :=
valores NULL o 1. Adems puede registrar el error pa- pString; end;
ra ser identicado por el programa que la utiliza. Este se
obtiene haciendo una llamada a la API GetLastError, la
cual devuelve el cdigo de error. Otra forma es usando
directamente el TIB, aunque este mtodo puede ser en- 110.3 Enlaces externos
gorroso o incluso imposible en algunos lenguajes de alto
nivel.
Last Error explicacin
Winerror.h
Listado de Errores
Ejemplo de FormatMessage en Delphi

110.1 Errores personalizados


Una funcin propia o de un programa por defecto de Windows puede hacer uso de la Api SetLastError para informar que error ha ocurrido o en el caso de no haber error
puede usarse para poner en cero el ltimo error ocurrido.
Una vez hecho esto, el error de la funcin anteriormente
utilizada no se podr determinar.
Estos errores son enteros de 32 bits. Si se quiere usar
SetLastError para nuevoserrores propios de la aplicacin se debe de activar el bit 29 ya que el sistema no
usa errores con ese bit activado.
Bit 29 00100000 00000000 00000000 00000000
Bit 31, el ms signicativo Bit 0, el menos signicativo
Una vez activado los nmeros sern mayores o iguales que
20000000H (en hexadecimal) o 536870912D (en decimal).
El ltimo error provocado por el sistema es un nmero
entero que esta en el rango de (0 a 15999) segn la lista
publicada en Microsoft
El cdigo de error obtenido por cualquiera de las dos vas
puede ser mostrado al usuario usando la API FormatMessage la cual nos da un texto explicando el error.
221

Captulo 111

Lnea de cdigo fuente


La denicin de lnea de cdigo fuente es esencialmente for (i=0; i<100; ++i) {printf(hola);} /* Cuntas
ambigua para la mayor parte del software. Su signicado lneas tiene este programa? */
vara de un lenguaje de programacin a otro, pero tambin dentro de un mismo lenguaje de programacin.
Proviene de las siglas en ingls de Source Lines of Code
Una lnea de cdigo fuente es cada una de las lneas de (SLC), en espaol, Lneas de Cdigo Fuente(LCF)
un archivo de cdigo fuente de un programa informtico. o Lneas de Cdigo Fuente nicas(LCFU).
Habitualmente en cada lnea se ejecuta una instruccin
que tiene que ejecutar el programa. Tambin es habitual
tabular las estructuras de control del programa en cuestin 111.1 El uso de medidas de LCF
para una lectura ms fcil. Viene a ser como la oracin en
libros y textos escritos en general.
De acuerdo a Andrew Tanenbaum, los valores de lneas
En ocasiones los programadores hablan del nmero de de cdigo fuente para diferentes sistemas operativos de
lneas de cdigoque tiene cierto programa para hablar la lnea de productos de Microsoft Windows NT son las
de la magnitud o complejidad de este.
siguientes:
En computacin, el nmero de lnea de una instruccin es
un punto bastante til a la hora de compilar el programa
porque habitualmente los compiladores detectan errores
de programacin mostrando el nmero de lnea donde se
ha encontrado el error que el programador deber corregir
para una compilacin satisfactoria.
Como curiosidad, algunos programadores se divierten
complicando la forma de programar, bien por diversin,
como reto entre programadores, o para que sea imposible
de entender para un programador poco experimentado.
A este pasatiempo se le denomina programacin ofuscada y uno de los puntos ms habituales para programar
ofuscadamente es no escribir una instruccin por lnea
y no hacer tabulaciones, en ocasiones se escriben varias
instrucciones por lnea o a veces se corta una instruccin
en varias lneas. Los ms experimentados en este tipo de
pasatiempos, se atreven incluso a realizar obras de Ascii
art con las lneas de su cdigo fuente.

David A. Wheeler ha estudiado el sistema operativo Red


Hat (distribucin de los sistemas operativos de Linux) e
inform que Red Hat versin 7.1 (lanzado en abril de
2001) contiene cerca de 30 millones de LCFU fsicos.
Tambin extrapol que, de haber sido desarrollado por
medios convencionales de propiedad (medida de tiempopersona) habra requerido de unos 8.000 aos/persona de
esfuerzo y desarrollo y hubiesen costado ms de mil millones de dlares (cotizados en el ao 2000).

Un estudio similar, revel que Debian versin 2.2 (conocido por su nombre clave Potato) contiene unos 55
millones de LCFU y de haber sido realizado mediante las
propiedades convencionales, hubiese tardado unos 14005
aos/persona y costado unos 1900 millones de dlares.
Ms tarde se ejecut una de las herramientas utilizadas
en el informe para la siguiente versin y se report que
En el lenguaje de programacin C, por ejemplo, una lnea Debian posee 104 millones de LCFU, y a partir del ao
2005, las siguientes versiones poseern, al menos, ms de
de cdigo puede ser:
213 millones de LCFU.
1. una instruccin acabada en un salto de lnea,

Se pueden encontrar las cifras de los principales sistemas


operativos (las distintas versiones de Windows se han presentado en una tabla de arriba).

2. una instruccin acabada en un punto y coma,


3. cualquier lnea del programa que acabe en un salto
de lnea (comentarios incluidos).
Por ejemplo:

En comparacin, las cifras de algunas herramientas grcas.


222

111.3. VASE TAMBIN

223
Get-ChildItem -recurse -include *.cxx,*.cpp,*.h,*.c
| Get-Content | Measure-Object -line ls -r -i
*.cxx,*.cpp,*.h,*.c | gc | measure-object -l

111.2 Programas para contar lneas de cdigo


111.2.3 Comerciales
Existen diversas tipos y aplicaciones disponibles con el
propsito de contar y expresarlas lneas de cdigo contenidas en el cdigo fuente en forma automtica. Entre los
requerimientos necesarios para una herramienta mtrica
de este tipo, debera incluir la habilidad necesaria para
procesar varios lenguajes de cdigo fuente y no depender de un sistema operativo especco.
Las compaas que usan una herramienta en C para Windows, otra en C para UNIX y una tercera en Java para
Linux, no desarrollan una estimacin bsica para sus medidas del CMMI.

111.2.1

Software Libre/Open Source

EZ-Metrix is a commercial web-based source code


counting utility that measures more than 75 dierent languages, and compares two le lists to quantify dierences (i.e., new, modied, deleted, unmodied).
Resource Standard Metrics is a commercial tool designed to process ANSI C, ANSI C++, C#, and Java 2.0+ while operating on Windows, UNIX, Linux
and Mac OS X.
Another program for Windows, Code Counter Pro,
which counts physical KLOCs and supports languages like C, C++, C#, Java, Cobol, Delphi, VB, ASP,
PHP and Fortran.

La orden ms simple en UNIX para contar las lneas


de cdigo es wc. Por ejemplo, para contar el nmero de lneas en todos los archivos .cxx, .cpp, .h y .c 111.2.4 Basados en web
dentro y debajo del directorio actual, se pueden usar
Ohloh extracts LOC and other software metrics
los comandos POSIX: nd y wc
of open source projects from publicly accessible
revision control repositories. It generates analyses
nd . \( -name '*.[ch]' -o -name '*.cxx' -o -name '*.cpp'
and reports of development activity available as
\) | xargs wc -l
graphs and API-based web-services.

111.2.2

Freeware (software no libre)

K-LOC Calculator* [5] es una herramienta para


Windows para contar lneas de cdigo fsicas.
Code Analyzer* [6] es una herramienta escrita en Java para contar lneas de cdigo. Para varios lenguajes.
LinesOfCodeWichtel* [7] es una herramienta escrita en java para contar LoC. Para varios lenguajes
LocMetrics* [8] es una herramienta gratuita para
LoC en Windows en los lenguajes C#, Java, o C++
code.
Source Line of Code Counter* [9] es una herramienta
para contar LoC basada en .net, admite concordancias en expresiones, trae un navegador de directorio.

111.3 Vase tambin


Cdigo fuente

111.4 Referencias
[1] How Many Lines of Code in Windows?, Knowing.NET,
6 de diciembre de 2005, archivado del original
el 23 de noviembre de 2015, http://web.archive.
org/web/http://www.knowing.net/PermaLink,guid,
c4bdc793-bbcf-4fff-8167-3eb1f4f4ef99.aspx, consultado el 18 de octubre de 2007
This in turn cites Vincent Maraia's The Build Master as
the source of the information.

Source Monitor [10] es una herramienta gratuita para Windows que cuenta las lneas de cdigo y medidas derivadas de los lenguajes C++, C, C#, Java, y
de otro cdigo fuente

[2] Gonzlez-Barahona, Jess M., Miguel A. Ortuo Prez,


Pedro de las Heras Quirs, Jos Centeno Gonzlez, and
Vicente Matelln Olivera. Counting potatoes: the size of
Debian 2.2. debian.org. Archivado desde el original el
23 de noviembre de 2015. Consultado el 12 de agosto de
2003.

Dos maneras de contar LCFU en Windows PowerShell en todos los archivos .cxx, .cpp, .h, and .c dentro
y debajo del directorio.

[3] Robles, Gregorio. Debian Counting. Archivado desde


el original el 23 de noviembre de 2015. Consultado el 16
de febrero de 2007.

224

[4] Jobs, Steve (agosto de 2006). Live from WWDC 2006:


Steve Jobs Keynote. Consultado el 16 de febrero de 2007.
86 million lines of source code that was ported to run on
an entirely new architecture with zero hiccups. Possibly including the whole iLife suite, not just the operating system
and usually bundled applications.
[5] http://web.archive.org/web/http://www.analogx.com/
contents/download/program/kloc.htm
[6] http://web.archive.org/20080302195407/www.geocities.
com/sivaram_subr/codeanalyzer/description.htm
[7] http://www.andreas-berl.de/linesofcodewichtel/en/
index.html
[8] http://www.locmetrics.com
[9] http://web.archive.org/web/http://thecodecentral.com/
2007/12/26/source-line-of-code-counter
[10] http://www.campwoodsw.com/sourcemonitor.html

111.5 Enlaces externos


Deniciones tiles sobre cdigo fuente Recurse
Standard Metrics (RSM) dene lneas de cdigo
fuente ecacescon un realista medida, independientemente del estilo de programacin.
Lneas de cdigo fuente efectivas de eLOC Metrics para el popular software libre Linux Kernel 2.6.17, Firefox, Apache HPPD, MySQL, PHP
usando RSM.
Wheeler, David A. LCFUCount. Consultado el
12 de agosto de 2003.
Wheeler, David A. (junio de 2001). Contando lneas de cdigo fuente. (LCFU). Consultado el 12
de agosto de 2003.
Tanenbaum, Andrew S. Sistemas operativos modernos (segunda edicin). Prentice Hall. ISBN 0-13092641-8.
Howard Dahdah (24 de enero de 2007).
Tanenbaum outlines his vision for a grandma-proof
OS. Consultado el 29 de enero de 2007.
C. M. Lott: Herramientas de coleccin mtrica para
cdigos fuente para C y C++

CAPTULO 111. LNEA DE CDIGO FUENTE

Captulo 112

Macintosh Toolbox
El Macintosh Toolbox es un conjunto de APIs con un
mecanismo de acceso particular. Estas APIs implementan
varias de las caractersticas de alto nivel de Mac OS.
El Toolbox consiste en una serie de gestoresresponsables de generar los grcos en pantalla (componentes
de software como QuickDraw), y el Gestor de Men, que
mantiene las estructuras de datos que describen la barra
de men.

225

Captulo 113

Macro
Para la fotografa, vase Macrofotografa.

113.2 Macros en programacin

Para el museo, vase Museo de Arte Contemporneo de Rosario.

113.3 Macros ocultas

Una macro (del griego , makro, que signica


grande) abreviatura de macroinstruccines una
serie de instrucciones que se almacenan para que se puedan ejecutar de manera secuencial mediante una sola llamada u orden de ejecucin. Dicho de otra manera, una
macroinstruccin es una instruccin compleja, formada
por otras instrucciones ms sencillas. Esto permite la automatizacin de tareas repetitivas.

Las macros ocultas son rdenes complejas de tipo macro


que se han declarado en el cdigo fuente pero que permanecen ocultas por motivos de seguridad, por acceso
restringido, etc.

Este trmino ha sido popularizado por la pelcula de ccin Tron, ambientada en un mundo informtico virtual,
en la que se puede escuchar una voz fuera de campo
(probablemente de un programa dependiente del Control
Central) que advierte a los habitantes de ese mundo que
Las macros tienden a almacenarse en el mbito del pro- tengan cuidado con las macros ocultas.
pio programa que las utiliza y se ejecutan pulsando una
combinacin especial de teclas o un botn especialmente
creado y asignado para tal efecto.
La diferencia entre una macroinstruccin y un programa
es que en las macroinstrucciones la ejecucin es secuencial y no existe otro concepto del ujo de programa.

113.4 Vase tambin


Script
Macro ensamblador
Microsoft Macro Assembler

113.1 Macros de aplicaciones

Visual Basic for Applications

Son un grupo de instrucciones que se ejecutan secuencial- Ejemplos de Macros


mente y se utilizan para economizar tareas. Una macro no
es ms que un conjunto de instrucciones (tales como borrar archivo, aadir registro, etc.), y que se almacenan
en una ubicacin especial. Por ejemplo, en Microsoft Access se observa que hay una zona para crear macros. Una
macro en Access trabajando para una base de datos podra ser un archivo que, al llamarse desde otra instruccin,
borrara los registros de un cliente o accionista, luego borrara ciertos registros en otras tablas.
Excel tiene incorporado el editor de VBA, se pueden
crear macros con la grabadora de macros o escribiendo
directamente los cdigos en el Editor de VBA, esta ltima opcin es ms potente, ya que la grabadora de macros
se limita a grabar cosas repetitivas que se hacen con el teclado, al escribir el cdigo nos permite hacer otras cosas
conviertiendo a Excel en una aplicacin super potente al
permitir programar macros mediante vba.
226

Captulo 114

Malla de tringulos 3D
La Malla de tringulos 3D es una coleccin de DirectX, no son compatibles con las mallas arbitrarias de
tringulos y vrtices que aproximan una supercie en 3D. tringulos. Sin embargo, estructuras como tiras de trinAunque el campo de aplicacin de la generacin auto- gulos - (donde cada tringulo, comparte un vrtice con un
mtica de una malla triangular, ha sido tradicionalmen- vecino y otro con el prximo) y el abanicos de tringulos
te la obtencin de modelos digitales de elevaciones del (un conjunto de tringulos conectados por un vrtice central) se tratan de manera eciente con la necesidad de slo
terreno, su aplicacin es mucho ms amplia. Cualquier
variable espacial relacionada con una cierta tipologa, es procesar N+2 vrtices para dibujar N tringulos.
susceptible de ser modelizada como una supercie tridi- Una malla de tringulos, construida a partir de tiras, en
mensional, en la que la cota de cada punto es el valor de abanico y posiblemente tringulos independientes, genela variable a estudiar.
ralmente se obtienen mediante un mosaico de objetos poPara saber cmo podramos descomponer un objeto con ligonales.
todas sus partes, la mnima regla es la teora del sistema
de visin humano. Para interpretar cmo los seres humanos pueden descomponer un objeto en mallas, podramos
desarrollar un algoritmo de segmentacin de malla ya que
adems ste nos permite obtener un nivel superior de descripciones del objeto en cuestin.

Otra forma de evitar la redundancia de procesamiento de


vrtices es compartiendo vrtices explcitos. La denicin de los vrtices est separada de la descripcin tringulo. Todo el conjunto de tringulos se dene por un conjunto de ndices en una matriz de vrtices. El sistema grco procesa los vrtices primero y hace el render de los
tringulos despus, utilizando el conjunto de ndices trabajando sobre la transformacin de datos.

114.1 Aplicaciones
114.2 Obtencin de las mallas

Una utilidad de las mallas de tringulos podra ser para


sistemas de reconocimiento de objetos, la comprensin
Para la generacin automtica de una malla triangular
de una escena, y las caractersticas del modelado.
existen distintos estudios y algoritmos. Por ejemplo, hay
Los grcos por ordenador tambin utilizan mallas de algoritmos que parten de una nube de puntos irregulartringulos. Se componen de un conjunto de tringulos
mente distribuidos y procurando denir cada tringulo lo
(normalmente en tres dimensiones) que estn conectados ms regular posible (el caso ptimo, tringuos equiltepor sus vrtices.
ros) permiten la creacin de una malla de tringulos.
Muchos paquetes de software de grcos y dispositivos Partiendo de una distribucin irregular de puntos a los
de hardware puede funcionar de manera ms eciente que se les ha asociado una cierta variable, por ejemplo su
en tringulos que se agrupan en mallas que en un gru- cota, si estamos hablando de un terreno o el valor de la
po de tringulos que se presentan individualmente. Esto contaminacin acstica en una cierta zona urbana, exises porque normalmente los grcos por ordenador hacen ten tcnicas para interpolar dicha variable en cualquier
operaciones sobre los vrtices (en las esquinas de trin- otro punto de la zona en la que no disponemos de su vagulos). Con cada uno de los tringulos, el sistema tiene lor mediante un proceso de medicin directo. Mientras
que funcionar en tres vrtices de cada tringulo. En una que algunos de estos mtodos estn desarrollados a pargran malla, puede haber ocho o ms tringulos reunidos tir de una interpolacin que utiliza algoritmos de paten un nico vrtice. As, procesando los vrtices una sola ches, supercies cuadrticas, interpolaciones polinmivez, es posible hacer una fraccin del trabajo y lograr un cas, etc.; la tcnica habitualmente utilizada es la basada
efecto idntico.
en los polgonos de Voronoi y la triangulacin de DelauLas dos interfaces de programacin de aplicaciones nay para as obtener una malla triangular, lo ms regular
(APIs) ms importantes del mercado grco, OpenGL y posible, tal que los vrtices de los tringulos que confor227

228
man la malla sean los puntos inicialmente dados.

114.3 Compresin
Un mtodo de compresin de una malla con pluralidad
de vrtices, es decir, que cada vrtice se caracteriza por
un grado igual al nmero de bordes incidentes y con la
casi totalidad de vrtices en un orden consecutivo. As
generamos una lista con la tipologa de los grados de los
vrtices en orden consecutivo y el cdigo de secuencia de
seales con la tipologa de la lista.

CAPTULO 114. MALLA DE TRINGULOS 3D

Captulo 115

Mapeo objeto-relacional
El mapeo objeto-relacional (ms conocido por su nombre en ingls, Object-Relational mapping, o sus siglas
O/RM, ORM, y O/R mapping) es una tcnica de programacin para convertir datos entre el sistema de tipos
utilizado en un lenguaje de programacin orientado a objetos y la utilizacin de una base de datos relacional como
motor de persistencia. En la prctica esto crea una base
de datos orientada a objetos virtual, sobre la base de datos relacional. Esto posibilita el uso de las caractersticas
propias de la orientacin a objetos (bsicamente herencia
y polimorsmo). Hay paquetes comerciales y de uso libre
disponibles que desarrollan el mapeo relacional de objetos, aunque algunos programadores preeren crear sus
propias herramientas ORM.

lares simples en el programa. El mapeo objeto-relacional


es utilizado para implementar la primera aproximacin.
El ncleo del problema reside en traducir estos objetos a
formas que puedan ser almacenadas en la base de datos
para recuperarlas fcilmente, mientras se preservan las
propiedades de los objetos y sus relaciones; estos objetos
se dice entonces que son persistentes.

115.2 Implementaciones

Los tipos de bases de datos usados mayoritariamente son


las bases de datos SQL, cuya aparicin precedi al crecimiento de la programacin 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 estn
asociados a travs del uso de restricciones declarativas en
En la programacin orientada a objetos, las tareas de lugar de punteros o enlaces explcitos. Los mismos dagestin de datos son implementadas generalmente por la tos que pueden almacenarse en un solo objeto podran
manipulacin de objetos, los cuales son casi siempre va- requerir ser almacenados a travs de varias tablas.
lores no escalares. Para ilustrarlo, considere el ejemplo de Una implementacin del mapeo relacional de objetos pouna entrada en una libreta de direcciones, que representa dra necesitar elegir de manera sistemtica y predictiva
a una sola persona con cero o ms nmeros telefnicos qu tablas usar y generar las sentencias SQL necesarias.
y cero o ms direcciones. En una implementacin orienMuchos paquetes han sido desarrollados para reducir el
tada a objetos, esto puede ser modelado por un objeto personacon camposque almacenan los datos de tedioso proceso de desarrollo de sistemas de mapeo relacional de objetos proveyendo bibliotecas de clases que
dicha entrada: el nombre de la persona, una lista de nmeros telefnicos y una lista de direcciones. La lista de son capaces de realizar mapeos automticamente. Dada
una lista de tablas en la base de datos, y objetos en el pronmeros telefnicos estara compuesta por objetos de
nmeros telefnicosy as sucesivamente. La entrada de grama, ellos pueden automticamente 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 programacin (puede ser referenciada sus nmeros telefnicos resultar en la creacin y envo
por una sola variable, por ejemplo). Se pueden asociar va- de la consulta apropiada a la base de datos, y los resultarios mtodos al objeto, como uno que devuelva el nmero dos son traducidos directamente en objetos de nmeros
telefnicos dentro del programa.
telefnico preferido, la direccin de su casa, etc..
Sin embargo, muchos productos populares de base de da- Desde el punto de vista de un programador, el sistema
tos, como los Sistemas de Gestin de Bases de Datos debe lucir como un almacn 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 terminarn siendo reejados en la banormalizadas. El programador debe convertir los valores se de datos.
de los objetos en grupos de valores simples para almace- Sin embargo, en la prctica 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 forrecuperarlos de la base de datos), o usar slo valores esca- mas, reduciendo en cierto grado la capacidad de ignorar
229

230

CAPTULO 115. MAPEO OBJETO-RELACIONAL

la base de datos. Peor an, la capa de traduccin puede ser 115.3 Bases de datos distintas a
lenta e ineciente (comparada en trminos de las sentenSQL
cias SQL que escribe), provocando que el programa sea
ms lento y utilice ms memoria que el cdigo escrito
Las bases de datos como Cach no necesitan mapeo
a mano.
objeto-relacional manual. El acceso del SQL a los valoUn buen nmero de sistemas de mapeo objeto-relacional res no escalares ya ha sido construido. Cach permite a
se han desarrollado a lo largo de los aos, pero su efec- los desarrolladores disear cualquier combinacin de protividad en el mercado ha sido diversa. NeXT's Enter- gramacin orientada a objetos y almacenamiento estrucprise 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 ms tarde en Otra solucin puede ser el uso de un sistema de adminisNeXT's WebObjects, el primer servidor web de apli- tracin 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 1997, EOF provey la tecnologa detrs de los como el nombre lo sugiere, es una base de datos diseasitios web de comercio electrnico de Apple: los servicios da especcamente para trabajar con valores orientados a
.Mac y la tienda de msica iTunes. Apple provee EOF en objetos. Usar un OODBMS puede eliminar la necesidad
dos implementaciones: la implementacin en Objective- de convertir datos desde y hacia su forma SQL, y los daC que viene con Apple Developers Tools y la implemen- tos pueden ser almacenados en su representacin original
tacin Pure Java que viene en WebObjects 5.2. Inspirado como objetos.
por EOF es el open source Apache Cayenne. Cayenne Las bases de datos orientadas a objetos an no han contiene metas similares a las de EOF e intenta estar acorde seguido una alta aceptacin y uso. Una de las principales
a los estndares JPA.
limitaciones reside en que, cambiar de un sistema de adUna aproximacin alternativa ha sido tomada por tecno- ministracin de base de datos SQL a un sistema orientalogas como RDF y SPARQL, y el concepto detriplesto- do totalmente a objetos implica que se pierde la capacire. RDF es una serializacin del concepto objeto-sujeto- dad de crear sentencias SQL, un mtodo ya probado para
predicado, RDF/XML es una representacin en XML de obtener combinaciones especcas de datos. Por esta raaquello, SPARQL es un lenguaje de consulta similar al zn, muchos programadores se encuentran ms a gusto
SQL, y un triplestorees una descripcin general de trabajando con un sistema de mapeo de objetos y SQL,
una base de datos que trabaja con un tercer componente. an cuando la mayora de las bases de datos comerciales
orientadas a objetos son capaces de procesar consultas
Ms recientemente, un sistema similar ha comenzado a SQL de manera limitada.
evolucionar en el mundo Java, conocido como Java Data Objects (JDO). A diferencia de EOF, JDO es un estndar, y muchas implementaciones estn disponibles por
parte de distintos distribuidores de software. La especi- 115.4 Vase tambin
cacin 3.0 de Enterprise Java Beans (EJB) tambin cubre
Propel (PHP)
la misma rea. Han existido algunos conictos de estndares entre ambas especicaciones en trminos de pre Doctrine (PHP)
eminencia. JDO tiene muchas implementaciones comerciales, mientras que EJB 3.0 est an en desarrollo. Sin
JPA (Java)
embargo, recientemente otro estndar ha sido anuncia Hibernate (Java)
do por JCP para abarcar estos dos estndares de manera
conjunta y lograr que el futuro estndar trabaje en diver ADO.NET Entity Framework (C#)
sas arquitecturas de Java. Otro ejemplo a mencionar es
Hibernate, el framework de mapeo objeto-relacional ms
LINQ to SQL (C# slo para SQL Server) su sintaxis
usado en Java que inspir la especicacin EJB 3.
es similar a JPA
En el framework de desarrollo web Ruby on Rails, el mapeo objeto-relacional juega un rol preponderante y es manejado por la herramienta ActiveRecord. Un rol similar
es el que tiene el mdulo DBIx::Class para el framework
basado en Perl Catalyst, aunque otras elecciones tambin
son posibles.

NHibernate (C#)
peewee (Python)

115.5 Enlaces relacionados


Patrn de diseo Association Table Mapping:
Introduccin a JPA

Captulo 116

Mquina de estados
Se denomina mquina de estados a un modelo de comportamiento de un sistema con entradas y salidas, en donde las salidas dependen no slo de las seales de entradas
actuales sino tambin de las anteriores.

compleja, depender de la entrada actual (no slo del


estado) y pudiendo tambin prescindirse de un estado inicial.

Las mquinas de estados se denen como un conjunto de


estados que sirve de intermediario en esta relacin de entradas y salidas, haciendo que el historial de seales de
entrada determine, para cada instante, un estado para la
mquina, de forma tal que la salida depende nicamente
del estado y las entradas actuales.

La bibliografa a veces llama autmata nito a las aceptoras, mientras que en otros casos se emplea autmata
como sinnimo de mquina de estados sin importar su
tipo.

Una mquina de estados se denomina mquina de estados nitos (FSM por nite state machine) si el conjunto
de estados de la mquina es nito, este es el nico tipo de
mquinas de estados que podemos modelar en un computador en la actualidad; debido a esto se suelen utilizar los
trminos mquina de estados y mquina de estados nitos de forma intercambiable. Sin embargo un ejemplo de
una mquina de estados innitos sera un computador
cuntico esto es debido a que los Qubit que utilizara este tipo de computadores toma valores continuos, en contraposicin los bits toman valores discretos (0 1). Otro
buen ejemplo de una mquina de estados innitos es una
Mquina universal de Turing la cual se puede denir tericamente con una cintao memoria innita.

Las aceptoras son los de mayor inters en la Teora de


la Computacin, ms precisamente en la Teora de autmatas, siendo stas ramas de la matemtica. Las transductoras, en cambio, lo son en la electrnica digital y la
computacin prctica. Es por eso que, por lo general, en
los textos sobre matemtica y ciencias de la computacin
se suele hablar de autmatas (y se reeren a las aceptoras) mientras que los de electrnica y computacin prctica hablan de mquinas de estados (y se reeren a los
transductoras).
En UML (Lenguaje Unicado de Modelado), dice que
una mquina de estado es aquel comportamiento que permite hacer un seguimiento de la vida de un objeto en el
transcurso de un tiempo nito.

La representacin de una mquina de estados se realiza


mediante un Diagrama de estados, sin embargo tambin
es posible utilizar un Diagrama de ujo.
Es posible clasicar las mquinas de estados en aceptoras
o transductoras:
Aceptoras (tambin llamadas reconocedoras o
discriminadoras): Son aquellas en donde la salida
es binaria (s/no), depende nicamente del estado y
existe un estado inicial. Puede decirse, entonces, que
cuando la mquina produce una salidapositiva(es
decir, unsi), es porque hareconocidooaceptadola secuencia de entrada. En las mquinas de
estados aceptoras, los estados con salida positiva
se denominan estados nales.
Transductoras: Son las ms generales, que convierten una secuencia de seales de entrada en una secuencia de salida, pudiendo sta ser binaria o ms
231

Captulo 117

Mquina desnuda
En informtica, cuando no hay un ncleo (S.O.) instalado
en el hardware, se suele decir que es una mquina desnuda. Suelen ser sistemas sencillos, que ejecutan alguna
tarea cuando se produce una interrupcin, y que el resto
del tiempo ejecutan una tarea idle muy bsica, normalmente que no hace nada.
Suelen usarse en los sistemas en tiempo real, cuando el
nmero y complejidad de las tareas es pequeo.
En las mquinas desnudas suelen usarse las mquinas de
estados. Es decir, se supone que el comportamiento de
nuestra mquina puede modelarse como una mquina de
estados. La rutina de interrupcin lo que nos dara es el
estado al que tiene que cambiar. Esto fue muy popular,
incluso hay herramientas que generan automticamente
el cdigo de cambios entre estados. Pero no es buena idea
para las aplicaciones complejas.

232

Captulo 118

MCML
MCML (acrnimo del ingls Media Center Markup
Language, Lenguaje de Formato para Centro de Multimedios en espaol) es el lenguaje de formato para la interfaz
de usuario para el centro de Multimedios (Media Center)
de Windows Vista, el cual es la forma nativa en la cual
se crean las interfaces de usuarios en este ambiente de
desarrollo.
MCML es un lenguaje declarativo basado en XML, optimizado para describir grcamente interfaces de usuarios visuales ricas desde el punto de vista grco, tales como las creadas por medio de Macromedia Flash. XAML,
XUL y UIML son otros ejemplos de lenguajes de interfaz
basados en XML.
En su uso tpico, los archivos tipo MCML seran producidos por una herramienta de desarrollo, como Microsoft
Visual Studio. El XML resultante es interpretado en
forma instantnea por un sub-sistema de despliegue de
Windows Vista denominado Windows Media Center, el
cual est orientado a la visualizacin del contenido del
computador a mayor distancia que la normal, similar a la
que se acostumbra para un aparato de televisin y utilizando un control remoto en lugar de un teclado y un mouse. Debido a esto las interfaces de usuario para Media
Center estn construidas bajo premisa diferentes, pues
deben tomar en cuenta el hecho de que sus usuarios estarn utlizndolas a una distancia mayor y por medio de dispositivos de control no convencionales. Los elementos de
XAML se interconectan con objetos del Entorno Comn
de Ejecucin para Lenguajes. Los atributos se conectan
con propiedades o eventos de esos objetos.
MCML fue diseado para soportar las clases y mtodos
de la plataforma de desarrollo .NET que tienen relacin
con la interaccin con el usuario, en especial el despliegue
en pantalla.

118.1 Vase tambin


Media Center
Xbox 360
XAML

233

Captulo 119

Metaprogramacin
La metaprogramacin consiste en escribir programas
que escriben o manipulan otros programas (o a s mismos) como datos, o que hacen en tiempo de compilacin
parte del trabajo que, de otra forma, se hara en tiempo
de ejecucin. Esto permite al programador ahorrar tiempo en la produccin de cdigo.
Un ejemplo sencillo de un metaprograma sera este script
de Bash:
#!/bin/bash # metaprogram echo '#!/bin/bash' >program
for ((I=1; I<=992; I++)); do echoecho $I>>program
done chmod +x program
Este script genera un nuevo programa que imprime por
pantalla los nmeros 1 a 992. Esto es slo una muestra de
cmo usar cdigo para escribir ms cdigo, no la forma
ms eciente de imprimir una lista de nmeros. En cualquier caso, un buen programador puede escribir y ejecutar este metaprogama en apenas un par de minutos, y
habr generado exactamente 1000 lneas de cdigo en esa
cantidad de tiempo.
La herramienta de metaprogramacin ms comn es el
compilador, el cual permite al programador escribir un
programa relativamente corto en un lenguaje de alto nivel para, posteriormente, escribir un programa equivalente en lenguaje ensamblador o lenguaje mquina. Esto, por
lo general, signica un buen ahorro de tiempo si se compara con la posibilidad de escribir el programa en lenguaje mquina de forma directa.
Otro ejemplo bastante comn de metaprogramacin se
puede encontrar en el uso de Lex (vase tambin: Flex) y
Yacc (vase tambin: bison), que son usados para generar
compiladores e intrpretes.

119.1 Enlaces externos

234

Captulo 120

Microformatos Dublin Core


Microformatos Dublin Core, es un proyecto cuyo objetivo es usar los elementos de la Iniciativa de Metadatos
de Dublin Core, con la sintaxis de los microformatos, con
el propsito general de describir recursos, especialmente
recursos bibliogrcos.
Para codicar un Microformato Dublin Core, debemos
crear un elemento de [X]HTML contenedor (por ejemplo
el elemento DL) de la clase dublincore.
Dentro de este elemento contenedor, debemos indicar de
forma inequvoca el concepto que se va a expresar a travs
del microformato (por ejemplo, ttulo).
Por ltimo, debemos usar una etiqueta de [X]HTML con
una clase cuyo valor sea uno de los elementos de la Iniciativa de Metadatos de Dublin Core, y son los siguientes:
- Elementos del conjunto de metadatos de Dublin Core: contributor, coverage, creator, date, description, format, identier, language, publisher, relation, rights, source, subject, title y type.
- Otros elementos y elementos renados de Dublin Core:
abstract, accessRights, accrualMethod, accrualPolicy, alternative, audience, avaliable, bibliographicCitation, conformsTo, created, dateAccepted, dateCopyrighted, dateSubmited, educationLevel, extent, hasFormat, hasPart,
hasVersion, instructionalMethod, isFormatOf, isPartOf,
isReferencedBy, isReplacedBy, isRequiredBy, issued, isVersionOf, license, mediator, medium, modied, provenance, references, replaces, requires, rightsHolder, spatial, tableOfContents, temporal y valid.

235

Captulo 121

Modelo de prototipos
El Modelo de prototipos, en Ingeniera de software, pertenece a los modelos de desarrollo evolutivo. El prototipo
debe ser construido en poco tiempo, usando los programas adecuados y no se debe utilizar muchos recursos.
El diseo rpido se centra en una representacin de aquellos aspectos del software que sern visibles para el cliente
o el usuario nal. Este diseo conduce a la construccin
de un prototipo, el cual es evaluado por el cliente para una
retroalimentacin; gracias a sta se renan los requisitos
del software que se desarrollar. La interaccin ocurre
cuando el prototipo se ajusta para satisfacer las necesidades 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.

La construccin de prototipos se puede utilizar como un


modelo del proceso independiente, se emplea ms comnmente como una tcnica susceptible de implementarse dentro del contexto de cualquiera de los modelos
del proceso expuestos. Sin importar la forma en que ste se aplique, el paradigma de construccin de prototipos
ayuda al desarrollado de software y al cliente a entender
de mejor manera cul ser el resultado de la construccin
cuando los requisitos estn satisfechos. De esta manera,
este ciclo de vida en particular, involucra al cliente ms
profundamente para adquirir el producto.

121.3 Inconvenientes
El usuario tiende a crearse unas expectativas cuando
ve el prototipo de cara al sistema nal. A causa de la
intencin de crear un prototipo de forma rpida, se
suelen desatender aspectos importantes, tales como
la calidad y el mantenimiento a largo plazo, lo que
obliga en la mayor parte de los casos a reconstruirlo
una vez que el prototipo ha cumplido su funcin. Es
frecuente que el usuario se muestre reaccin a ello y
pida que sobre ese prototipo se construya el sistema
nal, lo que lo convertira en un prototipo evolutivo, pero partiendo de un estado poco recomendado.

121.1 Etapas
Plan rpido.
Modelado, diseo rpido
Construccin del Prototipo
Desarrollo, entrega y retroalimentacin
Comunicacin

En aras de desarrollar rpidamente el prototipo, el


desarrollador suele tomar algunas decisiones de implementacin poco convenientes (por ejemplo, elegir un lenguaje de programacin incorrecto porque
proporcione un desarrollo ms rpido). Con el paso
del tiempo, el desarrollador puede olvidarse de la razn que le llev a tomar tales decisiones, con lo que
se corre el riesgo de que dichas elecciones pasen a
formar parte del sistema nal...

Entrega del desarrollo nal

121.2 Ventajas
Este modelo es til cuando el cliente conoce los objetivos generales para el software, pero no identica
los requisitos detallados de entrada, procesamiento
o salida.

121.4 Conclusiones

Tambin ofrece un mejor enfoque cuando el responsable del desarrollo del software est inseguro de la
ecacia de un algoritmo, de la adaptabilidad de un A pesar de que tal vez surjan problemas, la construccin
sistema operativo o de la forma que debera tomar de prototipos puede ser un paradigma efectivo para la ingeniera del software. La clave es denir las reglas del
la interaccin humano-mquina
juego desde el principio; es decir, el cliente y el desarro Se puede reutilizar el codigo
llador se deben poner de acuerdo en:
236

121.5. VASE TAMBIN


Que el prototipo se construya y sirva como un mecanismo para la denicin de requisitos.
Que el prototipo se descarte, al menos en parte.
Que despus se desarrolle el software real con un
enfoque hacia la calidad.

121.5 Vase tambin


Ingeniera de software
Ingenieras del software

237

Captulo 122

Modicador
Un modicador es un conjunto de funciones de
programacin del lenguaje C que se aplican a las variables
dentro de la estructura de un programa antes de que ste
sea mostrado.
Los modicadores pueden ir encadenados, y son rutinas
que distorsionan la forma de los objetos de una manera
determinada, sin cambiar su naturaleza. As por ejemplo
CALIF_FINAL es una variable numrica y su modicador informar si se utilizar en todo el programa o solo
en parte de l.

122.1 Enlaces externos


Lenguaje C: mbito de funciones y variables, Richard A. Sequera.

238

Captulo 123

Modularidad
La modularidad es la capacidad que tiene un sistema 123.3 Modularidad en Economa y
de ser estudiado, visto o entendido como la unin de vaen la Empresa
rias partes que interactan entre s y que trabajan para
alcanzar un objetivo comn, realizando cada una de ellas
una tarea necesaria para la consecucin de dicho objeti- En economa y en la empresa, la modularidad de los provo. Cada una de esas partes en que se encuentre dividido ductos, servicios y procesos es un factor clave en el desa*
*
el sistema recibe el nombre de mdulo. Idealmente un rrollo tecnolgico, econmico y social. [1] [2]
mdulo debe poder cumplir las condiciones de caja negra, es decir, ser independiente del resto de los mdulos
y comunicarse con ellos (con todos o slo con una parte) 123.4 Modularidad en el diseo
a travs de unas entradas y salidas bien denidas.

123.1 Modularidad en Ciencias de


la Computacin
Modularidad en Ciencias de la computacin es la caracterstica por la cual un programa de computador
est compuesto de porciones que se conocen como
mdulos. El diseo estructurado es la tcnica de diseo
El llamado Phonebloks es un buen ejemplo de un diseo modude algoritmos en que se basa la programacin modular,
lar.
paradigma de programacin que persigue desarrollar programas modulares
La modularidad en el diseo permite disear bienes basados en la modulacin reticular de espacios que permitan optimizar el tiempo de construccin y debido a que
son transportables, desarmables y reorganizables permiten impulsar mltiples funcionalidades y su reutilizacin
al generar un nuevo uso diferente al que fueron fabrica123.2 Modularidad en Biologa
dos. Un ejemplo podra ser el proyecto Phonebloks, que
permitira disear un telfono mvil en piezas separadas
que el usuario podra intencambiar entre s.
En biologa, la modularidad es una propiedad de los organismos (y de sus partes) por la cual estos pueden descomponerse en mdulos. Los mdulos son unidades coherentes que a su vez forman parte de unidades ms amplias: las 123.5 Referencias
clulas son parte de los tejidos, que a su vez son partes de
los rganos, que a su vez son partes de los organismos. La [1] Baldwin, Carliss (2000) Design Rules, Vol. 1: The Power
modularidad aparece tambin en el desarrollo; son mduof Modularity
los los campos morfogenticos, los patrones de desarrollo, los discos imaginales, los linajes celulares o los para- [2] Carliss Y. Baldwin Home Page en la Harvard Business
segmentos de los insectos.
School http://www.people.hbs.edu/cbaldwin
239

240

123.6 Vase tambin


Mdulo
Programacin modular
Morfologa (biologa)
Diseo modular

CAPTULO 123. MODULARIDAD

Captulo 124

Mdulo (informtica)
En programacin un mdulo es una porcin de un
programa de ordenador. De las varias tareas que debe
realizar un programa para cumplir con su funcin u objetivos, un mdulo realizar, comnmente, una de dichas
tareas (o varias, en algn caso).

lles internos de otros mdulos. Como consecuencia


de la independencia modular un mdulo cumplir:
Caractersticas de caja negra, es decir
abstraccin (ver abstraccin en programacin orientada a objetos).

En general (no necesariamente relacionado con la programacin), un mdulo recibe como entrada la salida que
haya proporcionado otro mdulo o los datos de entrada al
sistema (programa) si se trata del mdulo principal de ste; y proporcionar una salida que, a su vez, podr ser utilizada como entrada de otro un mdulo o bien contribuir
directamente a la salida nal del sistema (programa), si
se retorna al mdulo principal.
Particularmente, en el caso de la programacin, los mdulos suelen estar (no necesariamente) organizados jerrquicamente en niveles, de forma que hay un mdulo principal que realiza las llamadas oportunas a los mdulos de
nivel inferior.

Aislamiento de los detalles mediante encapsulamiento (ver encapsulamiento en


programacin orientada a objetos).
La independencia modular mejora el rendimiento humano, pudiendo realizarse programacin en equipo y desarrollar mdulos paralelamente. Tambin contribuye a la
reutilizacin de software.

124.2 Vase tambin

Cuando un mdulo es convocado, recibe como entrada


los datos proporcionados por otro del mismo o superior
nivel, el que ha hecho la llamada; luego realiza su tarea.
A su vez este mdulo convocado puede llamar a otro u
otros mdulos de nivel inferior si fuera necesario; cuando
ellos nalizan sus tareas, devuelven la salida pertinente al
mdulo inmediato llamador, en secuencia reversa, nalmente se contina con la ejecucin del mdulo principal.

124.1 Caractersticas de un mdulo


Cada uno de los mdulos de un programa idealmente debera cumplir las siguientes caractersticas:
Tamao relativamente pequeo.- Esto facilita
aislar el impacto que pueda tener la realizacin de un
cambio en el programa, bien para corregir un error,
o bien por rediseo del algoritmo correspondiente.
Independencia modular.- Cuanto ms independientes son los mdulos entre s ms fcil y exiblemente se trabajar con ellos, esto implica que para
desarrollar un mdulo no es necesario conocer deta241

Algoritmo
Programa
Modularidad
Diseo estructurado
Programacin modular

Captulo 125

Monitor (concurrencia)
En la programacin paralela, los monitores son objetos
destinados a ser usados sin peligro por ms de un hilo de
ejecucin. La caracterstica que principalmente los dene
es que sus mtodos son ejecutados con exclusin mutua.
Lo que signica, que en cada momento en el tiempo, un
hilo como mximo puede estar ejecutando cualquiera de
sus mtodos. Esta exclusin mutua simplica el razonamiento de implementar monitores en lugar de cdigo a
ser ejecutado en paralelo.
En el estudio y uso de los semforos se puede ver que las
llamadas a las funciones necesarias para utilizarlos quedan repartidas en el cdigo del programa, haciendo difcil
corregir errores y asegurar el buen funcionamiento de los
algoritmos. Para evitar estos inconvenientes se desarrollaron los monitores. El concepto de monitor fue denido
por primera vez por Charles Antony Richard Hoare en un
artculo del ao 1974.* [1] La estructura de los monitores
se ha implementado en varios lenguajes de programacin,
incluido Pascal concurrente, Modula-2, Modula-3 y Java,
y como biblioteca de programas.

125.1 Componentes
Un monitor tiene cuatro componentes: inicializacin, datos privados, mtodos del monitor y cola de entrada.
Inicializacin: contiene el cdigo a ser ejecutado
cuando el monitor es creado
Datos privados: contiene los procedimientos privados, que slo pueden ser usados desde dentro del
monitor y no son visibles desde fuera

125.2 Exclusin mutua en un monitor


Los monitores estn pensados para ser usados en entornos multiproceso o multihilo, y por lo tanto muchos procesos o threads pueden llamar a la vez a un procedimiento
del monitor. Los monitores garantizan que en cualquier
momento, a lo sumo un thread puede estar ejecutando
dentro de un monitor. Ejecutar dentro de un monitor signica que slo un thread estar en estado de ejecucin
mientras dura la llamada a un procedimiento del monitor. El problema de que dos threads ejecuten un mismo
procedimiento dentro del monitor es que se pueden dar
condiciones de carrera, perjudicando el resultado de los
clculos. Para evitar esto y garantizar la integridad de los
datos privados, el monitor hace cumplir la exclusin mutua implcitamente, de modo que slo un procedimiento
est siendo ejecutado a la vez. De esta forma, si un thread
llama a un procedimiento mientras otro thread est dentro
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 debera suponerse ninguna
poltica de encolado.
Para que resulten tiles en un entorno de concurrencia, los
monitores deben incluir algn tipo de forma de sincronizacin. Por ejemplo, supngase un thread que est dentro
del monitor y necesita que se cumpla una condicin para
poder continuar la ejecucin. En ese caso, se debe contar
con un mecanismo de bloqueo del thread, a la vez que se
debe liberar el monitor para ser usado por otro hilo. Ms
tarde, cuando la condicin permita al thread bloqueado
continuar ejecutando, debe poder ingresar en el monitor
en el mismo lugar donde fue suspendido. Para esto los
monitores poseen variables de condicin que son accesibles slo desde adentro. Existen dos funciones para operar con las variables de condicin:

Mtodos del monitor: son los procedimientos que


pueden ser llamados desde fuera del monitor.
Cola de entrada: contiene a los hilos que han llamado a algn mtodo del monitor pero no han podido
adquirir permiso para ejecutarlos an.
242

cond_wait(c): suspende la ejecucin del proceso que


la llama con la condicin c. El monitor se convierte
en el dueo del lock y queda disponible para que otro
proceso pueda entrar.
cond_signal(c): reanuda la ejecucin de algn proceso suspendido con cond_wait bajo la misma con-

125.4. VERIFICACIN DE MONITORES


dicin c. Si hay varios procesos con esas caractersticas elige uno. Si no hay ninguno, no hace nada.
Ntese que, al contrario que los semforos, la llamada a
cond_signal(c) se pierde si no hay tareas esperando en la
variable de condicin c.
Las variables de condicin indican eventos, y no poseen
ningn valor. Si un thread tiene que esperar que ocurra
un evento, se dice espera por (o en) la variable de condicin correspondiente. Si otro thread provoca un evento,
simplemente utiliza la funcin cond_signal con esa condicin como parmetro. De este modo, cada variable de
condicin tiene una cola asociada para los threads que estn esperando que ocurra el evento correspondiente. Las
colas se ubican en el sector de datos privados visto anteriormente.
La poltica de insercin de procesos en las colas de las
variables condicin es la FIFO, ya que asegura que ningn
proceso caiga en la espera indenida, cosa que s ocurre
con la poltica LIFO (puede que los procesos de la base
de la pila nunca sean despertados) o con una poltica en
la que se desbloquea a un proceso aleatorio.

125.3 Tipos de monitores

243
ejecutarlo a seguir con el proceso despertante.
Desventajas:
Si el proceso que ejecuta cond_signal no termin
con su ejecucin se necesitarn dos cambios de contexto para que vuelva a tomar el lock del monitor.
Al despertar a un thread que espera en una variable
de condicin, se debe asegurar que reanude su ejecucin inmediatamente. De otra forma, algn otro thread podra cambiar la condicin. Esto implica que
la planicacin debe ser muy able, y diculta la implementacin.

125.3.2 Tipo Mesa


Butler W. Lampson y David D. Redell en 1980 desarrollaron una denicin diferente de monitores para el lenguaje Mesa que lidia con las desventajas de los monitores
de tipo Hoare y aade algunas caractersticas.
En los monitores de Lampson y Redell el thread que ejecuta cond_signal sobre una variable de condicin contina con su ejecucin dentro del monitor. Si hay otro thread esperando en esa variable de condicin, se lo despierta y deja como listo. Podr intentar entrar el monitor
cuando ste quede libre, aunque puede suceder que otro
thread logre entrar antes. Este nuevo thread puede cambiar la condicin por la cual el primer thread estaba durmiendo. Cuando reanude la ejecucin el durmiente, debera vericar que la condicin efectivamente es la que necesita para seguir ejecutando. En el proceso que durmi,
por lo tanto, es necesario cambiar la instruccin if por
while, para que al despertar compruebe nuevamente la
condicin, y de no ser cierta vuelva a llamar a cond_wait.

Antes se dijo que una llamada a la funcin cond_signal


con una variable de condicin haca que un proceso que
estaba esperando por esa condicin reanudara su ejecucin. Ntese que el thread que reanuda su ejecucin necesitar obtener nuevamente el lock del monitor. Surgen las
siguientes preguntas: Qu sucede con el thread que hizo
el cond_signal? Pierde el lock para drselo al thread que
esperaba? Qu thread contina con su ejecucin? Cualquier solucin debe garantizar la exclusin mutua. Segn
quin contina con la ejecucin, se diferencian dos tipos
Adems de las dos primitivas cond_wait(c) y
de monitores: Hoare y Mesa.
cond_signal(c), los monitores de Lampson y Redell
poseen la funcin cond_broadcast(c), que notica a los
125.3.1 Tipo Hoare
threads que estn esperando en la variable de condicin
c y los pone en estado listo. Al entrar al monitor,
En la denicin original de Hoare, el thread que ejecuta cada thread vericar la condicin 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 errodurmiente, que reanuda la ejecucin. Ms tarde cuando
res, ya que un thread podra 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 vericar la condicin y seguir durmiendo
Ventajas:
si no fuera la esperada.
El thread que reanuda la ejecucin puede hacerlo
inmediatamente sin jarse si la condicin se cum- 125.4 Vericacin de monitores
ple, porque desde que se ejecut cond_signal hasta
que lleg su turno de ejecutar ningn proceso puede
La correccin parcial de un monitor se puede demostrar
cambiarla.
vericando que los invariantes de representacin del mo El thread despertado ya estaba esperando desde an- nitor se cumplen en cualquier caso. El Invariante de retes, por lo que podra suponerse que es ms urgente presentacin es el conjunto de estados del monitor que lo

244

CAPTULO 125. MONITOR (CONCURRENCIA)

hacen correcto. Dicha vericacin 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 vlido.
los propuestos por la Lgica de Hoare.
{IM L}wait(){IM L}

125.4.1

Los

procesos

bloqueados,

se

desbloquean

con

Inicializacin de las variables del cond_signal o con cond_broadcast pero, esta vez,
el proceso que llama a cond_signal sigue ejecutndose y
monitor

utilizando el monitor. Es decir, en ste tipo de monitores,


El cdigo de inicializacin debe incluir la asignacin de sealar 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 inicializacin de stas variables del monitor. * [2]
variables debe estar acorde al Invariante de representacin del monitor.
{V }inicializacion{IM }
Donde IM es el invariante del monitor.

125.4.2

Monitores tipo Hoare

En monitores con seales desplazantes, cond_signal y


cond_wait hacen referencia a estados visibles del programa. cond_wait implica la cesin de la exclusin mtua
del monitor. Por lo tanto, debe vericar el Invariante del
monitor antes de que pueda ejecutarse.
{IM L}wait(){C L}
Donde:
L son el invariante del conjunto de variables locales
del procedimiento.
C es la condicin de desbloqueo, que se hace cierta
tras terminar la ejecucin de cond_wait.
En cuanto a la operacin signal en seales desplazantes.
Cuando se llama a cond_signal, se produce la interrupcin inmediata del procedimiento sealador y la reanudacin de un proceso bloqueado en la cola de condicin.
Por lo tanto, todos los invariantes que eran ciertos antes
de la ejecucin de signal, se mantendrn, igualmente, como ciertos en el proceso sealado, tras la ejecucin de
cond_wait.
{vacio(colaCondicion) L C}signal(){IM L}
Ntese que la precondicin de cond_signal coincide con
la postcondicin de wait, as como la precondicin de
cond_wait coincide con la postcondicin de signal.
La razn por la cual la condicin de desbloqueo, c, no
forma parte de la postcondicin de signal es que, una vez
que el proceso sealado ha reanudado su ejecucin, puede
hacer falsa sta condicin. Luego, no es posible garantizar que el invariante de la condicin de desbloqueo sea
cierto.* [1]

125.4.3

Monitores tipo Mesa

cond_wait, al igual que con seales desplazantes, bloquea


el proceso y cede el uso del monitor. Cuando el proceso

125.5 Vase tambin


Semforos
Cierres de exclusin mutua (Locks)

125.6 Referencias
[1] Hoare, Charles Antony (octubre de 1974). Monitors: An
Operating System Structuring Concept. ACM 17: 549
57. Consultado el 9 de diciembre de 2012.
[2] Capel Tun, Rodrguez Valenzuela (2012). Sistemas
Concurrentes y Distribudos. Copicentro. pp. 8992. ISBN
978-84-15536-68-0.

Captulo 126

Anexo:Motores de persistencia
Esta es una lista alfabtica de los principales motores
de mapeo objeto relacional, indicando si son libres o
comerciales.

Ebean
Enterprise Objects Framework
FireStorm/DAO

126.0.1

ColdFusion

Hibernate, , muy usado.

Arf ARF - Active Record Factory

Hydrate

CFCPowerTools Generacin Batch de tu capa de


datos en pocos minutos.

iBATIS

Reactor Reactor es un sencillo API para ColdFusion que abstrae la base de datos al vuelo segn se
necesite.
objectBreeze objectBreeze crea objetos directamente desde tu capa de persistencia.
Transfer Transfer es una librera para generar objetos de negocio al vuelo y abstraer las transacciones
sobre ellos.

intelliBO de Signsoft , implementacin de JDO.


Java Data Objects (JDO)
JDBCPersistence
JDX
JPOX
Kd
Lychee

126.0.2

Common Lisp

OpenAccess

CLSQL

OJB,

cl-perec

OpenJPA,

elephant

POEM,

postmodern

PriDE

submarine

126.0.3

SavePoint
SimpleORM

Java

Speedo

BuzzSQL

TopLink de Oracle

Carbonado

Torque de ASF

Castor

WebObjects de Apple.

Cayenne

CocoBase PURE POJO V5 For JPA Primera he126.0.4


rramienta ORM Java (1997)
CrossDB

JavaScript

GearsORM
245

246

126.0.5

CAPTULO 126. ANEXO:MOTORES DE PERSISTENCIA

.NET

ORM.NET (open source)

.netTiers

Persistor.NET

Briyante Integration Environment

Puzzle.NPersist (open source)

Business Logic Toolkit for .NET (open source)

Signum Framework (open source)

Castle ActiveRecord (open source)

Sooda (open source)

CodeFluent Entities

Subsonic (DAL) (open source)

Data Tier Modeler , reemplazado por Euss.

Wilson ORMapper for .NET

DataBlock (open source)


DataObjects.Net
dOOdads , (freeware)
EasyObjects.NET (open source)
EntitySpaces
eXpress Persistent Objects for .NET
Euss (Evaluant Universal Storage Services) (open
source)
Genom-e

126.0.6 Perl
Class::DBI (open source)
Rose::DB::Object (open source)
OOPS (open source)
ORM (open source)
DBIx::Class (open source)
Alzabo (open source)
Tangram (Perl) (open source)

Gentle.NET (open source)


GenWise Studio

126.0.7 PHP

GURA

ADOdb Active Record , (open source)

Habanero

CakePHP (open source)

iBATIS.NET

Doctrine (open source)

IdeaBlade DevForce

DB DataObject (open source)

Lattice.DataMapper

EZPDO (open source)

LightSpeed

Junction PHP (open source)

LLBLGen Pro

KohanaPHP (open source)

LLBLGen (open source)

Metastorage (open source)

NConstruct

PhpMyObject (open source)

Neo (open source)

PHP Object Generator (POG) (open source)

NHibernate (open source)

pork.dbObject (open source)

NJDX

Propel (open source)

Nolics

QCodo (open source)

Opf3

Symfony (open source)

ObjectMagix

Syrius (open source)

ObjectMapper .NET (open source)

xPDO (open source)

ODX.NET (open source)

Xyster Framework (open source)

OpenAccess

Yupp PHP Framework (open source)

247

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 source)


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)

Captulo 127

Mtodo de depuracin del patito de goma


Revision estructurada
Programacin en pareja

127.2 Referencias
[1] The Pragmatic Programmer: From Journeyman to Master.
Addison Wesley. ISBN 978-0201616224. p. 95, footnote.
[2] Baker, SJ, The Contribution of the Cardboard Cutout Dog
to Software Reliability and Maintainability, http://www.
sjbaker.org/humor/cardboard_dog.html.

127.3 Enlaces externos

El patito de goma es usado por un desarrollador para ayudar en


la revisin de cdigo

El mtodo de depuracin del patito de goma es un trmino informal utilizado en ingeniera de software para
describir un mtodo de revisin de cdigo. El nombre es
una referencia a una historia del libro The Pragmatic Programmer en donde un programador toma un patito de goma y revisa su cdigo forzndose a s mismo a explicarlo,
lnea por lnea, al pato.* [1] Existen otros muchos trminos para esta tcnica, que a menudo tienen que ver con
objetos inanimados.
Muchos programadores han tenido una experiencia de
explicar un problema de programacin a alguien ms,
posiblemente a alguien que no sabe nada sobre programacin, y luego encuentran la solucin en el proceso de
explicar el problema. Al comparar lo que supuestamente hace el cdigo con lo que hace en realidad, cualquier
incongruencia resulta ntida.* [2] Usando un objeto inanimado, el programador puede tratar de completar esto sin
tener que involucrar adems a otra persona.

127.1 Vase tambin


Revisin de cdigo
248

Description of the method, Cant LUG, Ethernal,


http://lists.ethernal.org/oldarchives/cantlug-0211/
msg00174.html.
Rubber
duck
debugging,
http://www.
rubberduckdebugging.com/: site honoring the
method.
Rubber
Duck
Problem
Solving,
http:
//www.codinghorror.com/blog/2012/03/
rubber-duck-problem-solving.html:
Coding
Horror blog.

Captulo 128

Net Yaroze
La Net Yaroze ( netto yarze* ?) era
un kit de desarrollo de software de Sony Computer Entertainment creado en 1997 para juegos de PlayStation.
Estaba enfocado a los desarrolladores acionados. Yaroze signica Vamos a hacerlo juntos.* [1]
Costaba alrededor de los $750 USD. El pack inclua, adems de la consola, que era idntica a la Playstation pero
en negro, documentacin y software. No inclua bloqueo
regional.* [2] Para usarla, el usuario necesitaba tener un
ordenador personal IBM, Macintosh o NEC PC-9801.
As, el usuario, en el propio ordenador escriba el cdigo del juego, lo compilaba y lo enviaba a la Net Yaroze
para probarlo.

1 cable de comunicacin, para conectar la consola al


PC mediante tipo serie
1 gua de iniciacin
1 manual de bibliotecas
1 gua de usuario

A pesar de ser un kit de desarrollo para juegos de PlayStation, la Net Yaroze careca de varias caractersticas
que s tenan los desarrolladores de PlayStation. No tena
hardware avanzado, software, bibliotecas, herramientas
varias y una amplia asistencia tcnica de Sony. Adems,
A pesar de no tener bloqueo regional, existan 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 colaboLa principal diferencia entre ellas era que, las versiones racin entre usuarios fuese poco prctica.
europea/australiana era en modo Pal mientras que la ver- La memoria principal de la Net Yaroze era la misma que
sin japonesa y americana tena modo NTSC. Entre la la de la PlayStation, de 2 Megabytes. Sin embargo, la Net
versin japonesa y americana, la diferencia estaba en el Yaroze tena una memoria secundaria extra que ofreca
idioma del manual, el software para PC japoneses, discos 1,5 megabytes ms a la consola. As pues, contaba con
y los diferentes dibujos en las calcomanas. Extraocial- un total de 3,5 megabytes de memoria RAM. Esta capamente, la versin japonesa es llamada DTL-3000 en lugar cidad era la que marcaba el espacio total del juego, es dede DTL-H3000.
cir, lo que tena que ocupar como mucho su cdigo fuenLa Net Yaroze estaba slo disponible a travs de pedido te, grcos, msica y bibliotecas, pues todo esto deba
por correo. No obstante, Sony, proporcion este kit a al- de instalarse para poder ser probado. No obstante, exisgunas universidades del Reino Unido, Francia (Epita) y ten muchos ttulos comerciales que estn completamente
instalados en la RAM, a excepcin del sonido, y podran
Japn.* [3]
haber sido desarrollados complemente con la Net Yaroze.
El kit europeo de la Net yaroze contena:
Muchos ttulos desarrollados por acionados con la Net
Yaroze fueron distribuidos con la PlayStation: The O 1 Net Yaroze (textura negro mate)
cial Magazine en Europa desde diciembre de 1997 hasta
2 controladores de PlayStation (textura negro mate) marzo de 2004. El ltimo nmero ocial revista PlayStation del Reino Unido, la nmero 108, present una re Un cable de alimentacin de corriente alterna (con copilacin con muchos juegos de la Net Yaroze. Algunos
enchufe para Reino Unido y adaptador para Francia) ttulos que salieron con la revista fueron:
Un conector AV

Haunted maze

1 disco de arranque (un CD de PlayStation verde)

Terra Incognita

1 CD con el software de desarrollo de Net Yaroze


para PC

Blitter Boy

1 tarjeta de acceso negra, necesaria para el modo


control remoto
249

The Incredible CONEMAN


Hover car racing

250
A dog tale
Adventure game
Rocksn'Gems
Psychon
Pushy II
Between the eyes
Super bub
Clone
Gravitation
Mah Jongg
No fueron muchos, pero algunos de estos juegos prosperaron a nivel comercial, siendo el ms famoso de ellos
Devil Dice (Xi en Japn), que entonces llevaba el nombre
de Para-Dice.

128.1 Vase tambin


PlayStation

128.2 Enlaces externos


Sitio de desarrollo no ocial de PlayStation 1
Sitio no ocial de desarrollo de Net Yaroze
Net Yaroze (FAQ) Document
Video mostrando el contenido del kit Net Yaroze

128.3 Referencias
[1] Absolute PlayStation, Section I. PlayStation FAQ. Archivado desde el original el 23 de noviembre de 2015.
Consultado el 15 de Junio, 2012.
[2] IGN UK. NET Yaroze. Archivado desde el original el
23 de noviembre de 2015. Consultado el 15 de Junio,
2012.
[3] IGN UK. NET Yaroze. Consultado el 15 de Junio,
2012.

CAPTULO 128. NET YAROZE

Captulo 129

Nodo (informtica)
En informtica y en telecomunicacin, de forma muy general, un nodo es un punto de interseccin, conexin o
unin de varios elementos que conuyen en el mismo lugar. Ahora bien, dentro de la informtica la palabra nodo
puede referirse a conceptos diferentes segn el mbito en
el que nos movamos:
En redes de computadoras cada una de las mquinas es un nodo, y si la red es Internet, cada servidor
constituye tambin un nodo. El concepto de red puede denirse como:
En estructuras de datos dinmicas un nodo es un
registro que contiene un dato de inters y al menos
un puntero para referenciar (apuntar) a otro nodo. Si
la estructura tiene slo un puntero, la nica estructura que se puede construir con l es una lista, si el
nodo tiene ms de un puntero ya se pueden construir
estructuras ms complejas como rboles o grafos.

129.1 Referencias
[1] Castells, Manuel (1997). La era de la informacin. Economa, sociedad y cultura. Vol I: La sociedad red. Madrid:
Alianza Editorial. ISBN 84-206-4247-9.

129.2 Enlaces externos


Nodo

251

Captulo 130

Notacin Reddick
La notacin Reddick en programacin informtica, es
un sistema usado normalmente para crear los nombres
de variables e identicar rpidamente su tipo de dato. El
nombre de la notacin proviene de su inventor Greg Reddick.
Esta convencin es muy utilizada en las nuevas versiones
de Visual Basic y Visual Basic 2005. Tambin es muy utilizada por los programadores de Microsoft y en tecnologas .NET. Consiste entagsde tres letras en minsculas
que se aaden a los nombres de las variables, y que indican su tipo. El resto del nombre indica, lo ms claramente
posible, la funcin que realiza la variable.

130.1 Ejemplo
intContador: una variable del tipo INTEGER que se
usa como un contador.
strNombre: variable del tipo STRING que se usa para almacenar un nombre.

130.2 Notacin para objetos


Esta notacin se ha expandido para ser usadas por tipos
de objetos:
En Visual Basic, la notacin se ha adaptado a la siguiente:
Object Tag Example Chart (graph) cht chtSales Check
box chk chkReadOnly Combo box cbo cboIndustry
Command button cmd cmdCancel Frame (object) fra
fraPhoto Label lbl lblHelpMessage Line lin linVertical
List box lst lstPolicyCode Option button opt optFrench
Option group grp grpLanguage Page break brk brkPage1
Shape shp shpNamePanel Subform/report sub subContact Text box txt txtLoginName Toggle button tgl tglForm

130.3 Enlaces externos


Convenciones RVBA

252

Captulo 131

Notacin hngara
En programacin informtica, la notacin hngara es
un sistema usado normalmente para crear los nombres de
variables. Tambin se utiliza para nombrar las instancias
de objetos en lenguajes de programacin visuales, como
por ejemplo Delphi. El nombre de la notacin proviene
del hecho de que su inventor, Charles Simonyi, naci en
Hungra.
Esta convencin es muy poco utilizada en las viejas versiones de Delphi pero es muy utilizada por los programadores de Microsoft y, en particular, en la programacin
del sistema operativo Windows.

editores de cdigo inteligente que utilicemos, la mayora de proyectos siempre acaban teniendo ciertas partes
escritas en lenguajes dinmicamente tipados, en especial JavaScript, el nico implementado por la mayora de
navegadores web para ejecutar cdigo en cliente
Puesto que a la hora de realizar proyectos se suelen establecer previamente unas Coding Style Guidelines (Guas
de estilo de programacin), no conviene hacerlas distintas para cada lenguaje y se podra denir un estndar de
notacin hngara que tenga un ligero compromiso con
la facilidad de reconocimiento de tipos, sin que llegue a
suponer un inerno sobre la complejidad de lectura de
cdigo.

Consiste en prejos en minsculas que se aaden a los


nombres de las variables y que indican su tipo. El resto
del nombre indica, lo ms claramente posible, la funcin
que realiza la variable.
131.2.1

Ejemplo notaciones de 1 carcter

Este ejemplo de notacin hngara no parecer tan crtico


y extrao como el que se ha puesto de ejemplo al principio
del artculo, 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.

131.1 Ejemplos

szNombre: una cadena terminada con cero la cual


almacena un nombre.

131.3 Vase tambin

bRespuesta: una variable booleana que almacena


una respuesta.
txtHora: una instancia de un objeto textbox que almacena la hora.

131.2 Situacin actual


Hoy da existen ms detractores que impulsores de la notacin hngara. De hecho, se suele calicar de una tcnica que a la larga provoca ms complejidad que ayuda a la mantenibilidad. Mxime cuando la mayora de
entornos de desarrollo actuales, en particular los que se
usan con lenguajes estticamente tipados, ofrecen mecanismos sencillos para averiguar el tipo de las variables sin
recurrir a la bsqueda de su declaracin.
Sin embargo, parece que, como en la mayora de las situaciones, en el medio est la virtud, pues por muchos
253

Programacin
Sistema operativo

Captulo 132

Null
El trmino null o nulo o DG es a menudo utilizado en la
computacin, haciendo referencia a la nada.
En programacin, null resulta ser un valor especial aplicado a un puntero (o referencia) usado para indicar que el
puntero no apunta a un objeto o dato vlido. Usualmente
se utiliza el valor 0 (cero) para signicar null, debido a que
muchos sistemas operativos consideran el intentar acceder a una direccin de memoria tan baja como un error.
Null es tambin utilizado en varias otras disciplinas y no
nicamente en programacin.
En contexto de bases de datos null se utiliza para indicar
la ausencia de valor asociado a un campo para un determinado registro.
As mismo se denen los resultados para null en operaciones lgicas:
Operacin O Verdadero O null = Verdadero
Falso O null = null
Operacin Y Verdadero Y null = null
Falso Y null = Falso

254

Captulo 133

NWNScript
NWNScript es el lenguaje interpretado empleado en el
videojuego Neverwinter Nights y Neverwinter Nights 2.

133.1 Enlaces externos


NWN Lexicon Referencia online ocial.

255

Captulo 134

Objeto todopoderoso
En programacin orientada a objetos, un objeto todopoderoso (en ingls God Object) es un objeto que conoce
demasiado o hace demasiado. El objeto todopoderoso es
un ejemplo de un anti-patrn.

134.2 Referencias
Ravioli code, patrones opuestos.

134.3 Enlaces externos


134.1 Historia
La idea bsica detrs de la Programacin Estructurada es:
un gran problema se divide en muchos pequeos problemas (estrategia Divide y Vencers) y las soluciones son
creadas para cada uno de ellos. Una vez que los pequeos
problemas han sido resueltos, el gran problema ha sido
resuelto como un todo. Sin embargo hay un solo objeto
el cual necesita saber todo: el objeto en s. De esta manera, hay un solo grupo de problemas que el objeto debe
resolver: sus propios problemas.
El Cdigo del Objeto todopoderoso no sigue esta regla.
En su lugar, la funcionalidad entera del programa est codicada en un solo objeto que hace todo, el cual mantiene
toda la informacin del programa entero y contiene todos
los mtodos y subrutinas para manipular los datos. Como
el objeto contiene muchos datos y requiere muchos mtodos, su rol en el programa se convierte en Objeto Todopoderoso (Abarca todo). En lugar de objetos comunicndose entre ellos directamente, los objetos en el programa
se cuelgan del Objeto Todopoderoso para manejar su informacin e interaccin. Como el Objeto Todopoderoso
es referenciado por casi todo el cdigo, el mantenimiento
se vuelve mucho ms difcil, que el diseo del cdigo de
un programa mejor dividido
El objeto todopoderoso es el fallo de usar subrutinas de
lenguajes procedurales en orientacin a objetos o de usar
demasiadas variables globales para almacenar informacin de estados
Crear un Objeto todopoderoso es tpicamente considerado una mala prctica de programacin, esta tcnica
es usada ocasionalmente para entornos de programacin
ajustados, donde el aumento de rendimiento ligero y la
centralizacin es ms importante que el mantenimiento y
la elegancia de programacin.
256

Riel, Arthur J. (1996). Chapter 3: Topologies


of Action-Oriented Vs. Object-Oriented Applications. Object-Oriented Design Heuristics. Boston,
MA: Addison-Wesley. ISBN 020163385X. 3.2: Do
not create god classes/objects in your system. Be
very suspicious of an abstraction whose name contains Driver, Manager, System, or Subsystem.
Anti-Patterns and Worst Practices Monster Objects

Captulo 135

Oday
Oday fue un descomunal bug que afect a los sistemas
operativos Windows XP y que permita a quien lo aprovechaba escalar privilegios y acceder como SYSTEM en su
ordenador (SYSTEM es la cuenta de Windows que ms
privilegios tiene, y que no pertenece a ningn usuario sino
al sistema). El bug ya fue arreglado, pero en su da poda
aprovecharse con un exploit llamado AT-EXPLOIT, con
un programa en batch especco o con el modo manual
echando mano del cmd.exe.

257

Captulo 136

Oset (informtica)
En informtica, un oset dentro de un array u otra
estructura de datos es un entero que indica la distancia
(desplazamiento) desde el inicio del objeto hasta un punto o elemento dado, presumiblemente dentro del mismo
objeto. El concepto de distancia es solamente vlido si
todos los elementos del objeto son del mismo tamao (tpicamente dados en bytes o palabras).
Por ejemplo, dado un array de caracteresAque contengaabcdef, se puede decir que el elemento que contiene
la letra ctiene un oset de 2 desde el comienzo de A.
En ingeniera informtica y programacin de bajo nivel
(como el lenguaje ensamblador), un oset normalmente
indica el nmero de posiciones de memoria sumadas a
una direccin base para conseguir una direccin absoluta especca. Con este signicado (que es el original) de
oset, slo se usa la unidad bsica de direccionamiento,
normalmente el byte de 8 bits, para especicar el tamao del oset. En este contexto se puede llamar a veces
direccin relativa.

136.1 Vase tambin


Oset

136.2 Referencias

258

Captulo 137

OGNL
Object-Graph Navigation Language (OGNL), creado
por OGNL Technology, es un Lenguaje de Expresiones
de cdigo abierto para Java,el cual, mediante el uso de expresiones ms simples que el amplio espectro que soporta
Java, permite obtener y establecer propiedades (a travs
de mtodos ya denidos getProperty y setProperty similares a los presentes en todos los JavaBeans) y la ejecucin
de mtodos de clases Java.

137.3 Proyectos que usan OGNL


WebWork
Struts 2 (sucesor del anterior)
Tapestry
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 (extensin op4j-ognl) - implementacin de interfaz uida de Java.

Las transformaciones entre tipos son ms sencillas.

MyBatis - framework de mapeo SQL

Es un lenguaje de fuente de datos til para mapear


columnas de una tabla con su TableModel en Swing.

The Thymeleaf Template Engine - motor de plantillas Java XML/XHTML/HTML5

Es un sustituto del lenguaje de obtencin de propiedades usado en el paquete BeanUtils.

137.2 Cadenas (chains)

Unitils - marco (framework) de testeo modular para


Java

137.4 Enlaces externos

Son la unidad fundamental de navegacin. [Pueden contener:

(en ingls) Pgina principal de OGNL


(en ingls) WebWork (usando OGNL)

Nombres de propiedades.
encabezado.texto
Llamadas a mtodos.
hashCode()
ndices de Array.
listeners[0]
Ejemplo:
name.toCharArray()[0].numericValue.toString()
Se pasa a String la propiedad namede la que se toma
el carcter de la posicin 0 y se obtiene su valor numrico
que se pasa a String nuevamente.
259

Captulo 138

OpenACS
OpenACS del ingls 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 mantenimiendes) es un kit de herramientas libre (de cdigo abierto) to del cdigo escrito en Tcl.
para el desarrollo rpido de aplicaciones web, con licencia GPL.

138.3 Vase tambin


138.1 Arquitectura

Sistema de gestin de contenido (en ingls CMS:


Content Management System)

OpenACS utiliza el servidor web AOLserver y como base


de datos tanto Oracle como PostgreSQL.

138.4 Enlaces externos

OpenACS proporciona:
Un gran conjunto de aplicaciones que pueden ser
usadas para desarrollar sitios web, siendo especialmente til para aquellos que son colaborativos.
Algunas de las aplicaciones ms importantes son
.LRN, dotFolio, WorkFlow, CMS, blogger, comercio electrnico, foros.
Un sosticado kit de herramientas que proporciona
un gran conjunto de APIs y servicios para el desarrollo rpido de nuevas aplicaciones.
Un modelo de datos que escribe la losofa de
orientacin a objetos desde SQL estndar y mtodos PL/SQL, haciendo elegante el soporte a distintas
bases de datos (actualmente PostgreSQL y Oracle).
Un sistema robusto con capacidad de soportar una
gran cantidad de trco sin una baja considerable de
desempeo gracias a ser un sistema multi-thread.
Un sistema de documentacin integrado que permite buscar fcilmente sobre el cdigo existente en el
sistema.

138.2 Historia
OpenACS era originalmente desarrollado con el ArsDigita Community System, teniendo como base de datos
Oracle. ACS fue la razn por la que AOLServer fue liberado. OpenACS surgi como un fork para soportar ACS
con PostgreSQL. Despus RedHat compr ArsDigita y
260

openacs.org

Captulo 139

Operaciones con archivos (informtica)


Los archivos informticos son el medio de que disponemos para almacenar informacin no voltil en un
dispositivo de almacenamiento. Los Sistemas de archivos de que disponen los sistemas operativos disponen de
mecanismos para que un usuario pueda manipular los archivos (seleccionar, editar, ejecutar, borrar, ...). Desde el
punto de vista de un programador un archivo es un medio para poder leer datos de entrada para su programa o
donde poder guardar los resultados de su ejecucin. Todo
lenguaje de programacin debe disponer de algn mecanismo para que el programador pueda manipular archivos
desde un programa. Estos mecanismos pueden ser ms o
menos sosticados o verstiles dependiendo del lenguaje
de programacin que estemos considerando, pero deben
haber unas funciones bsicas para poder acceder a un archivo, estas son:
Lectura (consulta).- Esta operacin consiste el leer
la informacin contenida en chero sin alterarla.
Escritura (modicacin).- Consiste en actualizar
el contenido del chero bien aadindole nuevos datos o borrando parte de los que contena.
Apertura.- Antes de acceder a un chero, tanto para consultar como para actualizar su informacin,
es necesario abrirlo. Esta operacin se debe realizar
previamente a las operaciones de lectura o escritura.
Cierre.- Cuando se ha terminado de consultar o modicar un chero, por lo general, del mismo modo
que se tuvo que abrir para realizar alguna operacin
de lectura/escritura sobre l, ste deber ser cerrado.

139.1 Vase tambin


Programacin
Lenguajes de programacin
Archivo informtico
Sistema de archivos

261

Captulo 140

Operador
rs en un espacio de Banach. En este espacio, existe una
norma y podemos denir una esfera de radio unidad. Se
llama operador lineal acotado al operador lineal que est
acotado en esta esfera. Los operadores lineales acotados
entre dos espacios de Banach forman a su vez un espacio
de Banach cuyo estudio es bastante interesante. Una extensin de la derivada real a los operadores es la derivada
de Frechet que es un operador lineal acotado.
No todos los operadores lineales interesantes son acotados: hay muchos ejemplos de operadores importantes en
mecnica cuntica que no son acotados.
El ejemplo ms tpico de operador lineal no acotado es
la derivada -considerada como una aplicacin entre dos
d
espacios de funciones reales-. El operador diferencial, dx
, acta sobre la funcin f (x) que se escribe a su derecha,
produciendo una nueva funcin derivada: f (x)
Si un operador est denido entre dos espacios vectoriales de funciones, acta transformando unas funciones en
otras.

Operadores suma,resta, multiplicacin y divisin

En matemticas, el trmino operador puede emplearse


con diversas acepciones .
Algunas veces, un operador es un smbolo matemtico
que indica que debe ser llevada a cabo una operacin
especicada* [1] sobre un cierto nmero de operandos
(nmero, funcin, vector, etc.).

140.2 Operadores bilineales o bivariantes

(Para deniciones ms estrictas sobre linealidad y


Los operadores suelen interpretarse como funciones, por bilinealidad, vanse los temas relacionados)
ejemplo la suma + o el producto pueden ser entendidas
como funciones de dos argumentos.O una aplicacin de Su nombre depende del autor, son los operadores que
actan sobre dos objetos (escritos, generalmente, a amCxC en C.
bos lados del operador) produciendo un nico resultado.
Vanse los casos siguientes.

140.1 Operadores en un espacio


vectorial
140.3 Tipos generales de operadores
Un uso frecuente del trmino operador es aplicacin entre dos espacios vectoriales. Se usa con ms frecuencia
cuando alguno de ellos tiene dimensin innita. Este sue- 140.3.1 Operadores de condicin
le ser el caso de un espacio vectorial cuyos elementos son
funciones. Si se trata de una aplicacin lineal, podemos Relacionan un trmino A con otro B estableciendo su
llamarle operador lineal.
igualdad, jerarqua o cualquier otra relacin posible, coEl estudio de los operadores lineales es de particular inte- mo ejemplos tenemos:
262

140.4. OTROS OPERADORES


A = B establece que A es igual que B.
En este caso hay que distinguir entre operador = de asignacin y el
operador = de comparacin. El primero toma el valor de B y se lo asigna a A; el segundo solamente compara los valores de A y B sin modicarlos y devuelve un valor lgico o de verdad verdadero si ambos
valores son iguales o falso si dichos
valores no son iguales.
A B o desigualdad.
Este caso es justamente el opuesto al anterior, aunque aqu no podemos hablar de asignacin, pero si
de comparacin. Ahora el resultado de esta operacin ser F si los
valores A y B son iguales y V si son
distintos.

140.3.2

Operadores de orden

Los operadores de orden establecen o verican clasicaciones entre nmeros (A < B, A > B, etc.) u otro tipo de
valores (caracteres, cadenas, ...).
Todo tipo de dato susceptible de
ser ordenado por cualquier criterio puede ser comparado con estos
operadores; como los anteriores devuelven un valor de verdad en funcin del resultado que tenga la comparacin en cada caso.
A > B Devuelve V si A es estrictamente mayor que B y F
en caso contrario
A < B Devuelve V si A es estrictamente menor que B y F
en caso contrario
A B Devuelve V si A es mayor o igual que B y F en caso
contrario
A B Devuelve V si A es menor o igual que B y F en caso
contrario

263
lgicos nos proporcionan un resultado a partir de que se
cumpla o no una cierta condicin. Esto genera una serie de valores que, en los casos ms sencillos, pueden ser
parametrizados con los valores numricos 0 y 1, como se
puede apreciar en los ejemplos de abajo. La combinacin
de dos o ms operadores lgicos conforma una funcin
lgica.
Los ms sencillos son (ntese su relacin con los
operadores relacionales):
Operador NO-lgico: 'A' signica todo lo
que no es A'
Operador Y-lgico: 'A B' signica 'A y B a
la vez'; resultando FALSO (0) si no se cumple
y VERDADERO (1) si lo hace.
Operador O-lgico: 'A B' signica 'O bien
A, o bien B, o bien los dos'; resultando FALSO
(0) si no se dan ni A ni B y VERDADERO (1)
si se da alguno de los dos o los dos a la vez.
Operador =: 'A = B' signica 'A debe ser igual
a B'; resultando FALSO (0) si esto no es as y
VERDADERO (1) en caso contrario.
Operador <: 'A < B' signica 'A debe ser menor que B'; resultando FALSO (0) si no se satisface y VERDADERO (1) en caso contrario.
Operador >: 'A > B' signica 'A debe ser mayor que B'; resultando FALSO (0) si no se satisface y VERDADERO (1) en caso contrario.
Los operadores ms complejos se construyen a
partir de los anteriores (podra incluirse alguno
ms) y ya entran dentro de lo que sera una
funcin lgica. Un ejemplo muy utilizado sera
'SI(condicin;A;B)' ('IF condicin THEN A ELSE
B' en la mayora de los lenguajes de programacin)
cuyo resultado sera A si se satisface la 'condicin' o
B en caso contrario.

140.3.4 Operaciones aritmticas


Las operaciones aritmticas pueden ser entendidas, desde un punto de vista operacional, como operadores bivariantes o como operadores a derecha. Por ejemplo, '2
3' puede ser el operador bivariante de la multiplicacin
actuando sobre los nmeros 2 y 3, o el operador '2 ' que
acta sobre 3. En este grupo se encuentran la adicin, la
sustraccin, multiplicacin y la divisin.

Otros operadores relacionales menos usuales son los Otras operaciones, derivadas de las operaciones aritllamados operadores geomtricos: paralelismo (A || mticas usuales son la potenciacin, radicacin y
B), perpendicularidad y otros
logaritmacin.

140.3.3

Operadores lgicos

Muy utilizados en Informtica, lgica proposicional y


lgebra booleana, entre otras disciplinas. Los operadores

140.4 Otros operadores


Operador autoadjunto

264
Operador diferencial
Operador hermtico
Operador cuntico
Operador lineal
Operador norma
Operador nabla
Gradiente
Divergencia
Rotacional
Laplaciano
Transformada integral
Sumatorio
Productorio

140.5 Temas relacionados


Aplicacin lineal
Forma bilineal denida
Clculo
Clculo lgico

140.6 Referencias
[1] Domingo Agustn Vzquez. Diccionario de ciencias.

CAPTULO 140. OPERADOR

Captulo 141

Operando
En matemticas, un operando es una de las entradas (ar- 141.2.2 Informtica
gumentos o variables) de un operador. Por ejemplo, en
Expresiones y Atribuies Escales - Fortran en
UFPEL. Acessado en 23 de febrero de 2008.
3+6=9
" + " es el operador, " 3 " y " 6 " son los operandos. Si
el operando va acompaado de un signo menos (" ") se
considera que es un operando negativo, en caso contrario
se considera operando positivo o simplemente operando.
La cantidad de operandos de un operador es denominada
aridad. Basndose en la aridad, los operadores son clasicados como unarios, binarios, ternarios etc.

141.1 En informtica
En los lenguajes de programacin de computadora, las
deniciones de operador y operando son casi las mismas
que las de matemticas.
Adicionalmente, en lenguaje mquina, un operando es
un valor (un argumento) con el cual la instruccin, nombrada por un mnemnico, opera. El operando puede ser
un registro, una direccin de memoria, una constante literal, o una etiqueta. Un ejemplo simple en la arquitectura
PC es
MOV DS, AX
donde el valor en el operando del registro AX debe ser
movido al registro DS. Dependiendo de la instruccin,
puede haber cero, uno, dos o ms operandos.

141.2 Conexiones externas


141.2.1

Matemtica

Otvio N. Cipriani; Jos Monserrat N.; Ila M. S. de


Souza. Construyendo un Juego Para Uso en la Educacin Matemtica en UFLA. Accedido el 23 de febrero de 2008.
265

Lenguaje Java en SENAC - Ro Grande del Sur.


Acedido el 23 de febrero de 2008.

Captulo 142

Paquetes en PL/SQL
Los paquetes en PL/SQL tienen el objetivo de agrupar procedimientos y funciones de forma lgica. De esta manera, se consigue agrupar en un nico objeto, toda la casustica asociada a un determinado tipo de tarea.
Por ejemplo, si tenemos un conjunto de procedimientos y
funciones para realizar clculos matemticos complejos,
los podemos poner en un paquete.

sores... subprogramas en PLSQL END nombre_paquete


Para realizar llamadas a objetos dentro de un paquete, habra que diferenciar si la llamada es desde un subprograma dentro del mismo paquete o si la llamada es externa
al paquete:

La ventaja de los paquetes es que la primera vez que se


invoca, es cargado en memoria, por lo que las siguientes veces ya no ser necesario hacerlo de nuevo. Adems,
el paquete mantiene una copia en memoria para todos
los usuarios. Otra ventaja, es que podemos encapsular
procedimientos y funciones que no forman parte de la interfaz de usuario. Podemos ocultar ciertos objetos y solo
hacer pblicos los que se necesiten. Tambin se permite
la sobrecarga dentro de los paquetes. El paquete se divide
en especicacin y cuerpo.

142.1 Especicacin
Es obligatorio en la creacin de un paquete (PACKAGE).
Se declaran todos los subprogramas pblicos. Lo lgico
es declarar en esta seccin aquellos procedimientos o funciones que actan como interfaz. Tambin se declaran las
variables o constantes que se quieren tratar como globales
y que se puedan cambiar o referenciar fuera del paquete.

Llamada interna
Se pone el nombre del subprograma y entre parntesis los parmetros que se deben pasar.
Por ej. para llamar a la funcin Multiplica(real r1, real r2)" desde la funcin CalculaBenecios, se pondra r3:= Multiplica(2.5,3.5)"
Llamada externa
Hay que preceder el nombre del paquete al
nombre del procedimiento o funcin. Adems,
el subprograma llamado debe ser pblico para
que pueda ser referenciado.
Por ejemplo para llamar a la funcin Multiplica
que se encuentra en el paqueteOperacionesMatematicasdesde un procedimiento externo
al paquete sera r3:= OperacionesMatematicas.Multiplica(2.5,3.5)"

La sintaxis sera la siguiente:

Para eliminar un paquete de la base de datos tanto la esCREATE [OR REPLACE] PACKAGE nom- pecicacin como el cuerpo:
bre_paquete IS | AS declaraciones de variables,
DROP PACKAGE nombre_paquete
cursores... subprogramas en PLSQL END nombre_paquete
Oracle proporciona algunos paquetes que permiten la realizacin de distintas tareas muy comunes al desarrollar o
administrar la base de datos. Entre estos paquetes se pueden destacar:
142.2 Cuerpo
En el cuerpo es donde se denen los procedimientos y
funciones pblicos y privados.
La sintaxis sera:
CREATE [OR REPLACE] PACKAGE BODY
nombre_paquete IS | AS declaraciones de variables, cur266

DBMS_SQL: para acceder a la base de datos con


SQL dinmico.
DBMS_UTILITY: para el anlisis de objetos. Por
ejemplo se pueden compilar todos los objetos que
se encuentran en un determinado esquema de base
de datos.

142.2. CUERPO
UTL_FILE: aade capacidades de entrada/salida a
cheros.

267

Captulo 143

Pascal Casing
Pascal Casing es un procedimiento de programacin comn en el lenguaje Java y .Net. Es parecido al Camel casing con la excepcin que la letra inicial del identicador
debe estar en mayscula.
La nomenclatura est compuesta por tantas palabras como sean necesarias. La primera letra de cada una de las
palabras ir siempre en maysculas. Tanto para Pascal
Casing como para Camel casing, se obvia el uso de artculos. Un uso correcto de nomenclatura sera WriteInformation y no WriteTheInformation, WriteInformation y
no writeInformation o Writeinformation.

143.1 Enlaces externos


History around Pascal Casing and Camel Casing

268

Captulo 144

Patch (Unix)
Patch es un comando de Unix y Unix-like que actualiza
cheros de texto de acuerdo a las instrucciones contenidas en un archivo separado, llamado archivo de parche.
Este archivo (denominado patch) es un archivo de texto
que consiste en una lista de las diferencias entre cheros y
se produce mediante la ejecucin del comando di comparando con el chero original y actualizndolo con los
argumentos de di.
El programa original fue escrito por Larry Wall (creador
del lenguaje de programacin Perl) en mayo de 1985. Una
nueva versin del programa es parte del proyecto GNU y
es mantenido por la FSF.

144.1 Contexto de uso


El comando se utiliza con frecuencia para la actualizacin
del cdigo fuente a una versin ms reciente. Debido a
esto es utilizado frecuentemente en sistemas de control de
cdigo fuente como CVS. El programa no solo es capaz
de aadir texto como puede intuirse, tambin es capaz de
eliminarlo.
Ejemplo de uso:
Creacin del chero:
$ di -u oldFile newFile > mods.di
Aplicacin del parche:
$ patch < mods.di

144.2 Enlaces externos


Man linux
Cdigo fuente en GNU

269

Captulo 145

Phrogram
Phrogram (anteriormente Kid's Programming Language, or KPL) es un lenguaje de programacin diseado para ser inteligible y fcil para los nios. La versin
1 (KPL) fue nalizada en Agosto de 2005, y la versin 2
(Phrogram) es ahora mismo la versin ms actual.

mado el ncleo del Phrogram Team (Equipo Phrogram),


trabajando en el producto (como extensiones llamadas
add-in libraries) como un programa comercial destinado
a la enseanza del software y para dar valor a Phrogram
con respecto a lenguaje de programacin.

El principal objetivo de The Phrogram Company es distribuir un simple pero poderoso grupo de herramientas
145.1 Detalles tcnicos
que hacen del aprender a programar algo fcil y divertido. Phrogram (KPL) se ha convertido en una gran herraPhrogram es un lenguaje de programacin 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, msica,
porta un nmero de datos complejos, incluyendo estruc- efectos sonoros, animaciones y algunas opciones ms.
turas.
El objetivo secundario de Phrogram es proveer un lenguaje moderno con algunas opciones de lenguajes avanzados como C++, Java, Visual Basic y C#, y la sintaxis
de Visual Basic, para hacer la transicin entre estos lenguajes lo ms sencilla posible. Phrogram (KPL) soporta programacin orientada a objetos (OOP) y permite la
denicin de clases y de sus propiedades y mtodos asoUn programa de Phrogram es una coleccin de bloques
ciados, los cual provee a los programadores principiantes
anidados. En el nivel mayor hay un bloque Program, y
una introduccin a la programacin OOP.
dentro de este, otros bloques Method y Function son denidos. Las funciones y los mtodos (functions y methods) Para lograr estos objetivos, los desarrolladores de Phroson ambos un conjunto de acciones reusables, pero exis- gram construyeron la Versin 2 sobre el reciente .NET
te una diferencia: las funciones devuleven un valor y los Framework Version 2 (Noviembre de 2005). Phrogram
mtodos no tienen esa obligacin. Las estructuras (struc- intenta ser completamente compatible con otros lenguatures) son declaradas fuera de mtodos y funciones. Las jes que usen.NET Framework, por lo que esasruntime
variables deben ser declaradas en el momento de decla- librariespueden ser redistribuidas donde o a quien se
quiera.
racin.
Phrogram depende de Microsoft .NET Framework y provee muchas funciones y mtodos para interactuar con esa
plataforma. Por esto, Phrogram actualmente slo puede
usarse en la serie de sistemas operativos Microsoft Windows que soporten.NET Framework.

145.2 Hola, Mundo! en KPL

145.4 Otra informacin

Program Hello_World Method Main() PrintLineHello,


(
Phrogram es un software comercial con 30 das de prueWorld) End Method End Program
ba. La interfaz de usuario de Phrogram est disponible
en 18 idiomas entre ellos ingls, espaol, ruso, chino y
cataln. La web de KPL est actualmente disponible en
ingls, espaol, francs, portugus y otros 5 idiomas. To145.3 Filosofa
das las traducciones (menos ingls, que no es traduccin)
Jonah Stagner comenz a desarrollar Phrogram (KPL) han sido creadas por una comunidad global de voluntacuando quiso ensear a sus hijos a programar. Descubri rios, y la compaa anima a los usuarios a traducir.
que las herramientas y tecnologas no son en absoluto f- A pesar de que KPL fue diseada originalmente para niciles de usar para los principiantes. Desde entonces Jo- os de entre 10 y 14 aos (de ah su nombre, Lenguaje
nah, Jon Schwartz, Walt Morrison y David Witus han for- de Programacin para Nios), es apropiado para pro270

145.6. ENLACES EXTERNOS


gramadores principiantes de cualquier edad, y de ah el
cambio de nombre. Es usado por mucha gente adulta que
lo han descargado para aprender, o para sus hijos o estudiantes. Phrogram puede ser usado como lenguaje de
programacin a aprender en la escuela, en cualquier nivel de educacin, desde primaria y secundaria hasta la
Universidad. Actualmente es usado en las universidades
de muchos pases como Estados Unidos, Gran Bretaa,
Canad, Mxico, Colombia, Rusia, Japn, Islandia, Suecia, Repblica Checa, Eslovaquia, Portugal, Brasil, China, Guam, las Filipinas y Nueva Zelanda.* [cita requerida]

145.5 The Phrogram Company


KPL versin 2 fue liberada, renombrada como Phrogram. La nueva web de la comunidad es The Phrogram
Company.

145.6 Enlaces externos


The Phrogram Company, website ocial de Phrogram y la Comunidad Phrogram
La antigua website de KPL
Morrison Schwartz Inc
Diapositivas introductorias a KPL para profesores y
padres (<1 MB)
Diapositivas introductorias a KPL para programadores (1.7 MB)
KPL podcast by ComputerWorld
Video de KPL en Channel 9 (Requiere Windows
Media Player)

271

Captulo 146

Plataforma de desarrollo
En informtica, una plataforma de desarrollo es el
ambiente o entorno de software comn en el cual se
desenvuelve la programacin de un grupo denido de
aplicaciones. Comnmente se encuentra relacionada directamente a un sistema operativo; sin embargo, tambin
es posible encontrarla ligada a una familia de lenguajes de
programacin o a una interfaz de programacin de aplicaciones (API, por las siglas en ingls: Application Programming Interface). Cabe recordar que funciona como
sistema plataforma o multiusuario.

146.1 Vase tambin


Multiplataforma
Entorno de desarrollo integrado

272

Captulo 147

Plataforma virtual didctica


Las plataformas virtuales se reeren a la tecnologa uti- 147.4 Autores y contribuyentes
lizada para la creacin y desarrollo de cursos o mdulos
didcticos en la Web (sibal) que se usan de manera ms Muchas organizaciones para el desarrollo colaboran con
amplia en la Web 2.0 mejora de la comunicacin apren- voluntarios en lnea para desarrollar plataformas de capadizaje y enseanza.
citacin en un intento por aumentar la capacidad de las
comunidades locales, instructores y personas responsables de la toma de decisiones de pases en desarrollo para
147.1 Historia
ayudar a enfrentar los desafos de desarrollo.* [1]
Con la llegada de Internet se produce un importante abaratamiento de los costos de desarrollo de programas, por
lo que resulta ms sencilla la creacin de materiales cuyo
objetivo es ser utilizados en lnea. Sin embargo se siguen
necesitando conocimientos avanzados de programacin
para crear un curso o un mdulo didctico, y por tanto
estos cursos no son accesibles a todo el mundo. Desde
mediados de los aos 90 empiezan a surgir plataformas
didcticas que permiten la creacin y la gestin de cursos
completos para la web sin que sean necesarios conocimientos profundos de programacin o de diseo grco.

147.5 Ventajas
1. Ahorro en gastos de libros, libretas y material para
escribir
2. Se disminuyen los tiempos de transporte de los usuarios que utilizan las plataformas virtuales didcticas
3. Posibilidad de utilizar los dispositivos digitales para
acceder a las plataformas
4. Uso de diferentes recursos didcticos, tales como:
videos, audios, libros electrnicos, pruebas digitales, que permitirn realizar un seguimiento a los
alumnos que utilizan las plataformas.

147.2 Herramientas que las componen


1. Herramientas de comunicacin, como foros, chats,
correo electrnico.

147.6 Enlaces externos


Plataforma virtual didctica para instituciones

2. Herramientas de los estudiantes, como autoevaluaciones, zonas de trabajo en grupo, perles.


3. Herramientas de productividad, como calendario,
marcadores, ayuda.

147.7 Bibliografa

4. Herramientas de administracin, como autorizacin.


5. Herramientas del curso, como tabln de anuncios,
evaluaciones.

DILLENBOUG, P (2000) Virtual learning environments pdf


GMEZ, F (2005) Plataformas Virtuales y Diseo
De Cursos, Chile, Universidad Ponticia Catlica de
Valparaso: Online
MOLIST, M. (13-4-2006) " Institutos y universidades apuestan por la plataforma libre de e-learning
Moodle " en CiberP@s.Online

147.3 Para que sirven

Sirven para acortar distancias y prolongar la comunicaoiutk.uvu.kuk


cin sin necesidad de estar presencialmente.
273

274

147.8 Vase tambin


Comunidad de aprendizaje de idiomas
[1] Boletn del Servicio Voluntariado en Lnea

CAPTULO 147. PLATAFORMA VIRTUAL DIDCTICA

Captulo 148

Polling
Polling en computacin hace referencia a una operacin 148.2 Polling del registro de Winde consulta constante, generalmente hacia un dispositivo
dows
de hardware, para crear una actividad sincrnica sin el
uso de interrupciones, aunque tambin puede suceder lo
En cualquier versin del sistema operativo Microsoft
mismo para recursos de software.
Windows desde la versin 3.11 podemos encontrar apliEsto, aplicado a programacin puede ser visto como una caciones pobremente desarrolladas que consultan repepobre implementacin en bsqueda del sincronismo de titivamente llaves del registro de Windows en busca de
procesos. Por ejemplo, se podra 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 implementacin era
usuario cuando lleguen nuevos contenidos a la misma sin la nica alternativa, pero ahora en versiones modernas de
embargo estas constantes consultas degradaran el rendi- Windows desde NT 3.1 o Windows 98 en adelante exismiento del equipo y probablemente sera mejor imple- te la funcin RegNotifyChangeKeyValue* [1] dentro de
mentar la solucin por otro medio, en particular, pidin- la biblioteca Advapi32, la cual forma parte de la API de
dole al sistema operativo que informe de transferencias a Windows. Esta funcin permite hacer una especie deinese directorio en particular.
terrupcin de softwarela cual nos avisar ante cambios
en el contenido de una clave de registro sin tener que consultarla directamente ni peridicamente.
A pesar de la funcin comentada anteriormente hay aplicaciones 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 computacin cuando una
aplicacin necesitaba leer la pulsacin de una tecla, interrogaba continuamente al teclado esperando hasta que la
tecla fuera presionada. Debido a la ausencia de sistemas
multitarea, mientras se esperaba una tecla, no se podan
ejecutar otras tareas.
La solucin a este problema apareci con la llamada
interrupcin de teclado en donde el controlador del dispositivo, en este caso el teclado, es quien genera una
interrupcin slo cuando el dispositivo est listo para
transferir datos. La CPU maneja estas interrupciones que
el sistema operativo sabe como priorizar y obtener informacin de ellas.
Estas mltiples consultas pueden referirse a uso excesivo
de recursos de red, registros o cheros, aunque tambin
pueden relacionarse con actividades de ms bajo nivel del
equipo.

En sistemas de cdigo abierto la solucin simplemente abarca la correccin sobre el cdigo de las funciones
que generen el problema, empleando funciones como las
nombradas anteriormente o en su defecto las apropiadas
segn la plataforma utilizada.
El problema se torna ms interesante en aplicaciones de
cdigo cerrado, en este caso la solucin generalmente est
en manos de la empresa desarrolladora, sin embargo, es
posible aplicar prcticas de ingeniera inversa para lograr
cambiar el comportamiento que causa el problema.

148.4 Referencias

275

[1] RegNotifyChangeKeyValue Function (Windows)


[2] Mark's Blog : Polling and MSN Desktop Search

276

148.5 Enlaces externos


Demostracin de cmo solucionar el polling en aplicaciones de Windows

CAPTULO 148. POLLING

Captulo 149

Poltergeist (informtica)
Anlisis y diseo de modelo inestables.

En Programacin orientada a objetos el antipatrn de diseo poltergeist es una clase de objetos de corta duracin, normalmente sin estado, que se utiliza para realizar la inicializacin o para invocar a los mtodos de otras
clases. La denicin original es de Michael Akroyd en la
Object World West Conference de 1996:
Como un poltergeist que aparece y desaparece
misteriosamente, lo mismo ocurre con el objeto de breve duracin. Como consecuencia, el
cdigo es ms difcil de mantener y hay un desperdicio de recursos innecesario. La causa habitual de este antipatrn es un pobre diseo de
objetos.

Pobre funcionamiento del sistema. Se generan instancias y se realizan llamadas innecesarias.


Dicultad de ampliar el programa y de realizar un
buen mantenimiento.

149.2 Solucin
Eliminar clases externas, que no tengan relevancia,
clases transitorias y operacionales (Init, Manager,
Controller, etc).

Las clases poltergeist se pueden identicar por su nombre. A menudo se llaman manager_, controller_
, start_process, etctera.
A veces, las clases poltergeist demuestran la necesidad de
una arquitectura ms compleja. Por ejemplo, un poltergeist surge si el mismo mtodo acta como el cliente y
el invocador en un patrn de comando, y el programador
separa las dos fases. Sin embargo, esta arquitectura ms
compleja puede que nunca llegue a materializarse.
No se debe confundir con objetos de larga duracin que
almacenan el estado de un patrn como es el caso de
Modelo-vista-controlador, que traspasa el ujo de informacin entre las tres clases principales.

Eliminar otras clases con poco tiempo de vida y carencia de responsabilidades.

149.3 Vase tambin


Antipatrn de diseo
Patrn de diseo
Modelo-vista-controlador

149.4 Enlaces externos

Para eliminar un poltergeist, se debe de eliminar la clase


llamadora y tratar de insertar su funcionalidad dentro de
la clase invocada mediante herencia.

149.1 Consecuencias
Proliferacin de clases.
Clases con poca duracin, sin estados y pocas responsabilidades.
Complejidad excesiva. Difcultad de comprender la
arquitectura del programa, las asociaciones de clases
y las llamadas que se realizan entre ellas.
277

Antipattern poltergeists by Sourcemaking Teaching


IT Professionals
Development Antipatterns poltergeists

Captulo 150

Portabilidad
La portabilidad (en ingls portability) es uno de los conceptos clave en la programacin de alto nivel.
Se dene como la caracterstica que posee un software
para ejecutarse en diferentes plataformas, el cdigo fuente del software es capaz de reutilizarse en vez de crearse
un nuevo cdigo cuando el software pasa de una plataforma a otra (ver la nota, a continuacin de este prrafo). A
mayor portabilidad menor es la dependencia del software
con respecto a la plataforma.

150.1 Vase tambin


Interoperatividad.

150.2 Referencias

(Nota: la portabilidad no tiene relacin directa con el cdigo fuente de una aplicacin y, por eso, tampoco tiene
relacin directa con la reutilizacin del mismo. En cambio, la portabilidad se reere exclusivamente a la propiedad que posee un software que le permite ser ejecutado
en diferentes plataformas y/o sistemas operativos. De este modo, si un determinado software compilado pudiere ser ejecutado en cualquier sistema operativo, diramos
que ese software es 100% portable. ste es el ncleo del
concepto de portabilidad. En este sentido, la armacin
precedente: el cdigo fuente del software es capaz de
reutilizarse en vez de crearse un nuevo cdigo cuando el
software pasa de una plataforma a otra, tiene como supuesto errneo que tenemos acceso al cdigo fuente, el
cual podra reutilizarse (como es la meta que buscan los
diseadores de los lenguajes cuyos cdigos corren sobre
mquinas virtuales, como es el caso de Java y la familia
DOT NET). Esto es incorrecto: la portabilidad es un concepto que se reere exclusivamente a la relacin software
<-> plataforma).
El prerrequisito para la portabilidad es la abstraccin generalizada entre la aplicacin lgica y las interfaces del
sistema. Cuando un software se puede compilar en diversas plataformas (x86, IA64, amd64, etc.), se dice que es
multiplataforma. Esta caracterstica es importante para
el desarrollo de reduccin costos, cuando se quiere hacer
una misma aplicacin.
En algunos casos el software es independientede
la plataforma y puede ejecutarse en plataformas diversas sin necesidad de ser compilado especcamente para cada una de ellas, a este tipo de software se le llama
interpretado, donde un "intrprete" traduce (propiamente
interpreta) las instrucciones en tiempo de ejecucin para
que sean entendidas por diferentes plataformas.

278

Diccionario de Informtica. Portabilidad. Pgina 254. Editorial Cultural. 1999. Madrid, Espaa.
ISBN 84-8055-256-5
Mooney (1997). "Bringing Portability to the Software Process" (PDF). West Virginia University. Dept.
of Statistics and Computer Science. Revisado el 17
de marzo de 2008.
Garey (2007),Software Portability: Weighing Options, Making Choices, The CPA Journal 77(11):
3

Captulo 151

Postcondicin
En programacin, una postcondicin es una condicin o
predicado lgico que siempre debe cumplirse justamente despus de la ejecucin de una seccin de cdigo o
de una operacin (especicacin formal). Las postcondiciones se prueban a veces mediante aserciones incluidas
en el cdigo. A menudo, las postcondiciones se incluyen
simplemente en la documentacin de la correspondiente
seccin de cdigo.
Por ejemplo: el resultado de un factorial es siempre un
entero mayor o igual que 1. De este modo un programa
que calcula el factorial de un nmero dado tendra como
postcondiciones que el resultado debe ser un entero y que
ste debe ser mayor o igual que 1.

151.1 Vase tambin


Precondicin
Diseo por Contrato
Lgica de Hoare
Invariantes mantenidas por condiciones
Disparador (Bases de datos)

279

Captulo 152

Pragma
La palabra griega pragma (), pragmata en plural (), que signica: 'lo que ha sido hecho', un
acto, un hecho, y cuyas connotaciones y los sentidos ms
ampliados cubren una riqueza de sentidos a este signicado, incluso: accin, asunto, negocio, circunstancia, preocupacin, conveniencia, innovacin, trabajo, necesidad,
objeto, objetivo, ocupacin, ocina, papel, o trabajo de
vida, asuntos privados, cosa, problema.
Tambin el pragma es un tipo de Arquetipos amatorios.

152.1 Programacin
Los pragmas son sentencias especiales que controlan el
comportamiento del compilador, es decir son directivas
de compilador. Tienen esta forma estndar:
pragma Nombre (lista_de_argumentos);
La lista_de_argumentos es opcional, no todos los pragmas
necesitan argumentos.

152.2 Vase tambin


Resultado
Efecto
Pragmatismo

152.3 Enlaces externos

Wikcionario tiene deniciones y otra informacin sobre pragma.Wikcionario

280

Captulo 153

Precondicin
Una precondicin es una condicin que ha de satisfacerse
justo antes del comienzo de la ejecucin de una porcin
de cdigo (normalmente un subprograma o mtodo).
Por ejemplo: el factorial de un nmero slo est denido
para valores positivos (o cero). Por tanto, un subprograma
que calcule el factorial de un nmero exigir que dicho
nmero sea mayor o igual que cero.
Existen lenguajes de programacin que incorporan construcciones sintcticas para reejar las precondiciones de
sus subprogramas o mtodos. El clculo del factorial en
el lenguaje Eiel, por ejemplo, quedara as:
factorial(n: INTEGER): INTEGER -- Calcula el factorial
de un nmero. No est denido para cantidades negativas.
require no_negativo: n >= 0 do if n = 0 then Result := 1
else Result := n * factorial(n - 1) end end
En donde la palabra require introduce la precondicin del
mtodo factorial.

153.1 Vase tambin


Postcondicin
Diseo por Contrato
Lgica de Hoare
Invariantes mantenidas por condiciones
Disparador (Bases de datos)

281

Captulo 154

Primitiva de sincronizacin rendezvous


Rendezvous es una primitiva de sincronizacin asimtrica que permite a dos procesos concurrentes, el solicitante
y el llamado, intercambiar datos de forma coordinada. El
proceso que solicita el rendezvous debe esperar en el punto de reencuentro hasta que el proceso llamado llegue all.
Igualmente el proceso llamado puede llegar al rendezvous
antes que el solicitante y debe esperar que l llegue al
punto de encuentro para poder continuar procesando. La
imagen de esperar en el punto de encuentro corresponde
a colocar un proceso en espera inactiva hasta que la cita se cumpla. Durante el rendezvous los procesos pueden
intercambiar datos.
Los datos intercambiados corresponden a parmetros de
una llamada (desde el solicitante hacia el proceso llamado) y a resultados de una llamada (desde el proceso llamado hacia el solicitante), sin necesidad de almacenamiento
intermediario.
La desventaja de la abstraccin rendezvous es que no
contempla pasaje de mensajes de forma asncrona, como
en el caso de las colas. En el lenguaje de programacin
Ada es preciso implementar comunicacin asncrona y
otras abstracciones de comunicacin a partir de rendevouz combinados con procesos intermedios y encapsulamiento.

154.1 Ejemplo
Ejemplo en Ada donde el proceso Cola acepta un rendevouz de nombre agregar:
task type Cola is entry agregar(n: in Integer); entry eliminar(x: out Integer); ... end Cola -- Implementacin de
Cola task body Cola is begin ... accept agregar(n: in Integer) do ... -- Cuerpo de la operacin end agregar; ...
end Cola; --LLamada desde otro proceso: begin ... Cola.agregar(n) end

154.2 Enlaces externos


RendezVous, Portland Pattern Repository's Wiki

282

Captulo 155

Proceso (informtica)
Este artculo se reere al proceso
informtico, para otros usos vase
Proceso.

Un proceso se rige en pequeas porciones, conocidas como pginas, y cada proceso tiene su propia tabla de paginacin, fungiendo como una optimizacin del sistema
operativo ante los fallos de pgina.

Un proceso puede informalmente entenderse como un


programa en ejecucin. Formalmente un proceso esUna
unidad de actividad que se caracteriza por la ejecucin
de una secuencia de instrucciones, un estado actual, y un
conjunto de recursos del sistema asociados.* [1]

Esta denicin vara ligeramente en el caso de sistemas


operativos multihilo, donde un proceso consta de uno o
ms hilos, la memoria de trabajo (compartida por todos
los hilos) y la informacin de planicacin. Cada hilo
consta de instrucciones y estado de ejecucin.

Para entender lo que es un proceso y la diferencia entre


un programa y un proceso, A. S. Tanenbaum propone la
analoga Un cientco computacional con mente culinaria hornea un pastel de cumpleaos para su hija; tiene
la receta para un pastel de cumpleaos y una cocina bien
equipada con todos los ingredientes necesarios, harina,
huevo, azcar, leche, etctera.Situando cada parte de la
analoga se puede decir que la receta representa el programa (el algoritmo), el cientco computacional es el procesador y los ingredientes son las entradas del programa.
El proceso es la actividad que consiste en que el cientco computacional vaya leyendo la receta, obteniendo los
ingredientes y horneando el pastel.

Los procesos son creados y eliminados por el sistema


operativo, as como tambin ste se debe hacer cargo
de la comunicacin entre procesos, pero lo hace a peticin de otros procesos (interrupcin o tiempo de reloj).
El mecanismo por el cual un proceso crea otro proceso
se denomina bifurcacin (fork). El proceso de arranque
de GNU/Linux inicia con un slo proceso (init) y despus
comienza a crear los hilos necesarios para tener el sistema
listo para su uso. Los nuevos procesos pueden ser independientes y no compartir el espacio de memoria con el
proceso que los ha creado o ser creados en el mismo espacio de memoria.

Cada proceso tiene su contador de programa, registros


y variables, aislados de otros procesos, incluso siendo el
mismo programa en ejecucin 2 veces. Cuando este ltimo caso sucede, el sistema operativo usa la misma regin de memoria de cdigo, debido a que dicho cdigo
no cambiar, a menos que se ejecute una versin distinta
del programa.
Los procesos son gestionados por el sistema operativo y
estn formados por:

En los sistemas operativos multihilo es posible crear tanto hilos como procesos. La diferencia estriba en que un
proceso solamente puede crear hilos para s mismo y en
que dichos hilos comparten toda la memoria reservada
para el proceso.
Los procesos pueden ser cooperativos o independientes.
Dos o ms procesos pueden cooperar mediante seales
de forma que uno obliga a detenerse a los otros hasta que
reciban una seal para continuar.

Las instrucciones de un programa destinadas a ser


ejecutadas por el microprocesador.
Su estado de ejecucin en un momento dado, esto
es, los valores de los registros de la unidad central
de procesamiento para dicho programa.
Su memoria de trabajo (memoria crtica), es decir,
la memoria que ha reservado y sus contenidos.

Se usa una variable de tipo semforo para sincronizar los procesos.


Si un proceso est esperando una seal, se suspende
hasta que la seal se enve.
Se mantiene una cola de procesos en espera en el
semforo.
La forma de elegir los procesos de la cola en espera
es mediante una poltica rst in rst out.

Otra informacin que permite al sistema operativo La sincronizacin explcita entre procesos es un caso parsu planicacin.
ticular del estado bloqueado. En este caso, el suceso
283

284

CAPTULO 155. PROCESO (INFORMTICA)

que permite desbloquear un proceso no es una operacin Salida normal, sta se presenta cuando el proceso termide entrada/salida, sino una seal generada a propsito 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 creacin Salida por error, sta se presenta cuando el proceso tiede procesos:
ne que salir debido a insuciencia 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 ejecucin, desde un proceso, de una llamada al cesible.
sistema para la creacin de otro proceso.
Eliminado por otro proceso, ste es sumamente til cuan Una peticin 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 abruptamente.
Los procesos pueden contener uno o ms hilos, haciendo ms eciente las tareas, asimismo la complejidad de
los algoritmos de sincronizacin, ya que podra ocurrir la
155.3 Estados de un proceso
condicin de carrera muy a menudo, inclusive los indeseados interbloqueos.
Los estados de un proceso obedecen a su participacin y
disponibilidad dentro del sistema operativo y surgen de la
necesidad de controlar la ejecucin de cada proceso. Los
155.1 Creacin de un proceso
procesadores slo pueden ejecutar un solo proceso a la
vez, turnndolos para el uso de ste. Existen procesos no
Bsicamente hasta el da de hoy existen slo 4 formas de apropiativos o cooperativos que bsicamente 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 perodo de tiempo el procesador hasta que una interrupcin o seal llega al procesador para hacer el cambio
En la ejecucin, desde un proceso, de una llamada de proceso, a esto se le conoce como cambio de contexto.
al sistema para la creacin del proceso.
Los posibles estados que puede tener un proceso son eje Una peticin deliberada del usuario para crear un cucin, bloqueado y listo:
proceso.
El inicio de un trabajo por lotes.
La forma de creacin de procesos en Unix es a travs de
una llamada al sistema fork la cual crear un proceso hijo
en total semejanza al padre, hasta que el recin proceso
decida cambiar su imagen en memoria, incluso obtener
sus propios descriptores de archivos abiertos.

Ejecucin, es un proceso que est haciendo uso del


procesador.
Bloqueado, No puede ejecutarse hasta que un evento
externo sea llevado a cabo.
Listo, ha dejado disponible al procesador para que
otro proceso pueda ocuparlo.

Las posibles transiciones son 4. La primera se realiza


cuando el sistema operativo determina que el proceso no
puede continuar justo en ese momento, en algunos sisteEl ciclo de vida de un proceso es sencillo, consta de la mas se puede hacer una llamada al sistemapausepara
creacin, la ejecucin de instrucciones y la terminacin. pasar al estado bloqueado, en Unix cuando el proceso est
Cabe sealar que un proceso en el transcurso de su ciclo leyendo datos provenientes de una canalizacin o de un
puede estar en diferentes estados.
archivo especial (terminal) y no hay entrada disponible,
el proceso se bloquea de forma automtica.
Salida normal.
Las transiciones 2 y 3 son llevadas a cabo por el planicador de procesos, siendo que el proceso no tiene conoci Salida por error.
miento de ste. La transicin 2 se da cuando el planicador de procesos decide que el proceso ya estuvo el tiem Error fatal.
po suciente en ejecucin y debe dar paso a la ejecucin
Eliminado por otro proceso.
de otros procesos (adquieran tiempo del procesador). La

155.2 Terminacin de un proceso

155.7. BIBLIOGRAFA
transicin 3 se realiza cuando todos los procesos han ocupado tiempo del procesador y debe retomarse el primer
proceso.
La transicin 4 ocurre cuando se produce un evento externo por el que un proceso estaba en espera, por ejemplos, introducir datos desde la terminal. Si no hay otro
proceso en ejecucin en ese instante, la transicin 3 se
activa y el proceso comienza a ejecutarse; tambin podra pasar al estado de listoy esperar un momento
para iniciar la ejecucin.

155.4 Tipos de procesos


Existen dos tipos de procesos, aquellos que se ejecutan en
modo kernel y aquellos que se ejecutan en modo usuario.
Los primeros son ms lentos por las llamadas al sistema
que realizan, sin embargo, son ms seguros por la integridad que representan. Cuando hablamos de los procesos de usuario, podemos decir que el sistema operativo
podra no ser multiproceso, ya que se vale de libreras
(como pthread) para hacer un multiplexado y dar la apariencia de trabajar como multiproceso.
Podra pensarse en otra clasicacin, como son los procesos en primer plano y procesos en segundo plano. Los
primeros interactan con el usuario, es decir, el usuario
proporciona los datos que el proceso utilizar. Los segundos, son creados para tareas bien denidas y no necesitan
la intervencin del usuario, por ejemplo, se puede tener
un proceso en segundo plano para revisar la temperatura
el disco duro constantemente, stos tambin son conocidos como demonios.

155.5 Vase tambin


Memoria virtual
Multiproceso
Unix
Paginacin

155.6 Referencias
[1] Stallings 5 edicin pag. 109

155.7 Bibliografa
Tanenbaum, Andrew S. (2009). 2 Procesos e hilos. Sistemas operativos modernos (3 edicin). Prentice Hall. p.
1076.

285

Captulo 156

Proceso para el desarrollo de software


El Proceso para el desarrollo de software, tambin denominado ciclo de vida del desarrollo de software es
una estructura aplicada al desarrollo de un producto de
software. Hay varios modelos a seguir para el establecimiento de un proceso para el desarrollo de software, cada
uno de los cuales describe un enfoque diferente para diferentes actividades que tienen lugar durante el proceso.
Algunos autores consideran un modelo de ciclo de vida
un trmino ms general que un determinado proceso para
el desarrollo de software. Por ejemplo, hay varios procesos de desarrollo de software especcos que se ajustan a
un modelo de ciclo de vida de espiral.

156.2 Actividades del desarrollo de


software

156.1 Generalidades
La gran cantidad de organizaciones de desarrollo de software implementan metodologas para el proceso de desarrollo. Muchas de estas organizaciones pertenecen a la industria armamentstica, que en los Estados Unidos necesita un certicado basado en su modelo de procesos para
poder obtener un contrato.

Actividades del proceso de desarrollo de software representados


en el desarrollo en cascada. Hay algunos modelos ms para representar este proceso.

156.2.1 Planicacin

El estndar internacional que regula el mtodo de seleccin, implementacin y monitoreo del ciclo de vida del La importante tarea a la hora de crear un producto de
software es obtener los requisitos o el anlisis de los resoftware es ISO 12207.
quisitos. Los clientes suelen tener una idea ms bien absDurante dcadas se ha perseguido la meta de encontrar
tracta del resultado nal, pero no sobre las funciones que
procesos reproducibles y predecibles que mejoren la prodebera cumplir el software.
ductividad y la calidad. Algunas de estas soluciones intentan sistematizar o formalizar la aparentemente desorgani- Una vez que se hayan recopilado los requisitos del cliente,
zada tarea de desarrollar software. Otros aplican tcnicas se debe realizar un anlisis del mbito del desarrollo. Este
de gestin de proyectos para la creacin del software. Sin documento se conoce como especicacin funcional.
una gestin del proyecto, los proyectos de software corren el riesgo de demorarse o consumir un presupuesto
mayor que el planeado. Dada la cantidad de proyectos 156.2.2 Implementacin, pruebas y documentacin
de software que no cumplen sus metas en trminos de
funcionalidad, costes o tiempo de entrega, una gestin de
La implementacin es parte del proceso en el que los
proyectos efectiva es algo que a menudo falta.
Algunas organizaciones crean un grupo propio (Software ingenieros de software programan el cdigo para el proEngineering 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
de desarrollo del software. Esta parte del proceso tiene la
la organizacin.
286

156.3. MODELOS DE DESARROLLO DE SOFTWARE

287

funcin de detectar los errores de software lo antes posible.


La documentacin del diseo interno del software con el
objetivo de facilitar su mejora y su mantenimiento se realiza a lo largo del proyecto. Esto puede incluir la documentacin de un API, tanto interior como exterior.

156.2.3

Despliegue y mantenimiento

El despliegue comienza cuando el cdigo ha sido sucientemente probado, ha sido aprobado para su liberacin y
ha sido distribuido en el entorno de produccin.
Entrenamiento y soporte para el software es de suma importancia y algo que muchos desarrolladores de software descuidan. Los usuarios, por naturaleza, se oponen al
cambio porque conlleva una cierta inseguridad, es por Si se aplica este paradigma, unos de los principales proello que es fundamental instruir de forma adecuada a los blemas , es que las etapas realizadas no son autnomas de
futuros usuarios del software.
las siguientes, creando una dependencia estructural y en
El mantenimiento o mejora del software de un software el acaso de un error atrasara todo el proyecto. Se tiene
con problemas recientemente desplegado, puede requerir que tener pautas bien denidas, y que no se incurra a moms tiempo que el desarrollo inicial del software. Es po- dicacin porque implicara en que el software no cumpla
que el cliente no se
sible que haya que incorporar cdigo que no se ajusta al con su ciclo de vida. Tener en cuenta
*
vea
afectado
por
la
impaciencia.
[3]
diseo original con el objetivo de solucionar un problema
o ampliar la funcionalidad para un cliente. Si los costes
de mantenimiento son muy elevados puede que sea oportuno redisear el sistema para poder contener los costes
de mantenimiento.

2. Paradigma Orientado a Objetos: Estos modelos se basan en la Programacin orientada a objetos; por lo tanto,
se reere al concepto de clase, el anlisis de requisitos y el
diseo. El modelo o paradigma orientado a objetos posee
dos caractersticas principales, las cuales son:
Permite la re-utilizacin de software.

156.3 Modelos de Desarrollo de


Software
Los modelos de desarrollo de software son una representacin abstracta de una manera en particular. Realmente
no representa cmo se debe desarrollar el software, sino
de un enfoque comn. Puede ser modicado y adaptado
de acuerdo a las necesidades del software en proceso de
desarrollo. * [1] Hay varios modelos para perlar el proceso de desarrollo, cada uno de las cuales cuenta con pros
y contras. El proyecto debera escoger el ms apropiado
para sus necesidades. En ocasiones puede que una combinacin de varios modelos sea apropiado. Existen tres
paradigmas de los modelos de desarrollo de software:
1. Paradigma Tradicional:
Es uno de los paradigmas ms antiguo, se invent durante
la creacin del mtodo estructurado. Si se elige un proyecto, el mtodo varia en etapas.* [2] Como todo modelo,
existen sus pros y contras al usar este paradigmas:

Facilita el desarrollo de herramientas informticas


de apoyo al desarrollo, el cual es simple al implementarla en una notacin orientado a objetos llamado UML.* [4]
3. Paradigma de Desarrollo gil: Es un paradigma de las
Metodologas De Desarrollo basado en procesos giles.
Estos intentan evitar los tediosos caminos de las metodologas tradicionales enfocndose en las personas y los
resultados. Usa un enfoque basado en el Valor para construir software, colaborando con el cliente e incorporando
los cambios continuamente.* [5]

156.3.1 Modelo de cascada


El modelo de cascada dene las siguientes etapas que deben cumplirse de forma sucesiva:
1. Especicacin de requisitos
2. Diseo del software

288

CAPTULO 156. PROCESO PARA EL DESARROLLO DE SOFTWARE

3. Construccin o Implementacin del software


4. Integracin
5. Pruebas (o validacin)
6. Despliegue (o instalacin)

1. El nfasis se sita en el anlisis de riesgo, y por lo


tanto requiere de clientes que acepten este anlisis y
acten en consecuencia. Para ello es necesaria conanza en los desarrolladores as como la predisposicin a gastar ms para solventar los temas, por lo
cual este modelo se utiliza frecuentemente en desarrollo interno de software a gran escala.

7. Mantenimiento
Siguiendo el modelo de cascada de forma estricta, slo
cuando se naliza una fase, comienza la otra. En ocasiones se realiza una revisin antes de iniciar la siguiente
fase, lo que permite la posibilidad de cambios (lo que
puede incluir un proceso de control formal de cambio).
Las revisiones tambin se utilizan para asegurar que la
fase anterior ha sido totalmente nalizada; los criterios
para completar una fase se conocen frecuentemente con
el trmino inglsgate(puerta). Este modelo desaconseja revisitar y revisar fases que ya se han completado.
Esta falta de exibilidad en un modelo de cascada puro
ha sido fuente de crtica de los defensores de modelos
ms exibles.

156.3.2

Modelo de espiral

La principal caracterstica del modelo en espiral es la gestin de riesgos de forma peridica en el ciclo de desarrollo. Este modelo fue creado en 1988 por Barry Boehm,
combinando algunos aspectos clave de las metodologas
del modelo de cascada y del desarrollo rpido de aplicaciones, pero dando nfasis en un rea que para muchos no
jug el papel que requiere en otros modelos: un anlisis
iterativo y concienzudo de los riesgos, especialmente en
el caso de sistema complejos de gran escala.

2. Si la implementacin del riesgo de anlisis afectar de forma esencial los benecios del proyecto, no
debera utilizarse este modelo.
3. Los desarrolladores de software han de buscar de
forma explcita riesgos y analizarlos de forma exhaustiva para que este modelo funcione.
La primera fase es la bsqueda de un plan para conseguir
los objetivos con las limitaciones del proyecto para as
buscar y eliminar todos los riesgos potenciales por medio
de un cuidadoso anlisis, y si fuera necesario incluyendo
la fabricacin de un prototipo. Si es imposible descartar
algunos riesgos, el cliente ha de decidir si es conveniente terminar el proyecto o seguir adelante ignorando los
riesgos. Por ltimo, se evalan los resultados y se inicia
el diseo de la siguiente fase.

156.3.3 Desarrollo iterativo e incremental


El desarrollo iterativo recomienda la construccin de secciones reducidas de software que irn ganando en tamao
para facilitar as la deteccin de problemas de importancia antes de que sea demasiado tarde. Los procesos iterativos pueden ayudar a desvelar metas del diseo en el caso
de clientes que no saben cmo denir lo que quieren.* [6]

La espiral se visualiza como un proceso que pasa a travs de algunas interaciones con el diagrama de los cuatro 156.3.4
cuadrantes representativos de las siguientes actividades:

Desarrollo gil

El desarrollo gil de software utiliza un desarrollo iterativo como base para abogar por un punto de vista ms ligero y ms centrado en las personas que en el caso de las
soluciones tradicionales. Los procesos giles utilizan retroalimentacin en lugar de planicacin, como principal
mecanismo de control. La retroalimentacin se canaliza
2. Anlisis de riesgos: una evaluacin analtica de pro- por medio de pruebas peridicas y frecuentes versiones
gramas seleccionados, para evaluar como identicar del software.
y eliminar el riesgo;
Hay muchas variantes de los procesos giles:
3. la implementacin del proyecto: implementacin del
desarrollo del software y su pertinente vericacin;
En el caso de la programacin extrema (XP), las fa1. crear planes con el propsito de identicar los objetivos del software, seleccionados para implementar
el programa y claricar las restricciones en el desarrollo del software;

Modelo de espiral con nfasis en los riesgos, haciendo


hincapi en las condiciones de las opciones y limitaciones para facilitar la reutilizacin de software, la calidad
del software puede ayudar como una meta propia en la
integracin en el desarrollo del producto. Sin embargo,
el modelo en espiral tiene algunas limitaciones, entre las
que destacan:

ses se realizan en pasos muy cortos (o continuos


) con respecto al anterior. El primer paso (intencionalmente incompleto) por los pasos puede ocurrir
en un da o en una semana, en lugar de los meses o
aos de cada paso completo en el modelo en cascada. En primer lugar, se crean pruebas automatizadas
para proveer metas concretas al desarrollo. Despus
se programa el cdigo, que ser completo cuando

156.4. MODELOS DE MEJORA DE PROCESOS

289

todas las pruebas se superan sin errores, y los desa- 156.4 Modelos de mejora de procerrolladores ya no sabran como mejorar el conjunsos
to de pruebas necesario. El diseo y la arquitectura
emergen a partir de la refactorizacin del cdigo, y
se da despus de programar. El diseo lo realizan Capability Maturity Model Integration El Capability
Maturity Model Integration (CMMI), en espaol
los propios desarrolladores del cdigo. El sistema,
Integracin
de Modelos de Madurez de Capaciincompleto, pero funcional se despliega para su dedades
es
uno
de los modelos lderes basados en
mostracin a los usuarios (al menos uno de los cuamejores
prcticas.
Son evaluaciones independientes
les pertenece al equipo de desarrollo). Llegado eslas
que
conrman
el grado con el que una organite punto, los profesionales comienzan a escribir las
zacin
siguen
sus
propios
procesos, que no evala
pruebas para la siguiente parte del sistema de ms
la
calidad
de
los
procesos
o del software que se
importancia.
produce. CMMI ha reemplazado a CMM y tiene
un mbito global, no slo en procesos destinados al
desarrollo del software.

156.3.5

Codicacin y correccin

ISO 9000 ISO 9000 describe estndares para un proceso organizado formalmente para resultar en un producto y los mtodos de gestin y monitoreo del progreso. Aunque este estndar se cre inicialmente para el sector de produccin, los estndares de ISO
9000 tambin se han aplicado al desarrollo del software. Al igual que CMMI, que una organizacin est
certicada con el ISO 9000 no garantiza la calidad
del resultado nal, slo conrma que se ha seguido
los procesos establecidos.

El desarrollo de codicacin y correccin (en inglsCode and x) es, ms que una estrategia predeterminada,
el resultado de una falta de experiencia o presin que se
ejerce sobre los desarrolladores para cumplir con una fecha de entrega.* [7] Sin dedicar tiempo de forma explcita
para el diseo, los programadores comienzan de forma inmediata a producir cdigo. Antes o despus comienza la
fase de pruebas de software (a menudo de forma tarda)
y los inevitables errores que se encuentran han de eliminarse antes de poder entregar el software.
ISO 15504 ISO 15504, tambin conocido como Software Process Improvement Capability Determination
(SPICE), en espaol Determinacin de la Capacidad de Mejora del Proceso de Software es un marco para la evaluacin de procesos de software. Este
156.3.6 Orientado a la Reutilizacin
estndar tiene como objetivo un modelo claro para poder comparar procesos. SPICE se utiliza como
en el caso de CMMI. Modela procesos para gestioLa reutilizacin de software es un proceso donde se recunar, controlar, guiar y monitorear el desarrollo del
rre al uso de activos de software en las especicaciones de
software. Este modelo se utiliza entonces para meanlisis, diseos, implementacin y pruebas de una aplidir lo que una organizacin o proyecto hace durante
cacin o sistemas de software.* [8]
el desarrollo del software. Esta informacin se anaLa reutilizacin tiene ciertos Indicadores por ejemplo:
liza para identicar puntos dbiles y denir acciones
para subsanarlos. Tambin identica puntos fuertes
1. Entre el 40% y 60% de una aplicacin es re-utilizable
que pueden adoptarse en el resto de la organizacin.
en otra.
2. Aproximadamente el 60% de una aplicacin administrativa es re-utilizable.
3. Aproximadamente el 75% de las funciones son comunes a ms de un programa.

156.5 Mtodos formales

Los mtodos formales son soluciones matemticas pa4. Solo el 15% del cdigo encontrado en muchos sistemas ra resolver problemas de software y hardware a nivel de
es nico y novedoso a una aplicacin especica.
requisitos, especicacin y diseo. Ejemplos de mtoEl rango general de uso recurrente esta entre el 15% y dos formales incluyen el Mtodo B, la red de Petri, la
demostracin automtica de teoremas, RAISE y el VDM.
85%.* [9]
La reutilizacin tiene Principios como la existencia de Hay varias notaciones de especicaciones formales, taparecidos en distintos sistemas de un mismo dominio, les como el lenguaje Z. Ms generalmente, se puede utidonde el software puede representarse como una com- lizar la teora de autmatas para aumentar y validar el
binacin de mdulos y los sistemas nuevos se puede ca- comportamiento de la aplicacin diseando un sistema
racterizar por diferencias respecto a los antiguos siste- de autmata nito.
mas.* [10]

Las metodologas basadas en los autmatas nitos permi-

290

CAPTULO 156. PROCESO PARA EL DESARROLLO DE SOFTWARE

ten especicacin de software ejecutable y evitar la creacin convencional de cdigo.

[7] McConnell, Steve. 7: Lifecycle Planning. Rapid Development. Redmond, Washington: Microsoft Press. p. 140.

Los mtodos formales se suelen aplicar en software de


aviacin, especialmente si es software de seguridad crtico. Los estndares de aseguramiento del software de seguridad, tales como DO178B demandan mtodos formales en el nivel ms alto de categorizacin (Nivel A).

[8] J.Sametinger.Software engineering with reusable components. Springer Verlag, Agosto 1997
[9] Jonas A. Montilva, Nelson Arape y Juan Andres Colmenares. (14 de noviembre de2003). Desarrollo de software basado en componentes. Consultado el 2 de abril de
2014.

La formalizacin del desarrollo de software est ganando


en fuerza poco a poco, en otros mbitos, con la aplica[10] Ciclo de vida del Software. Archivado desde el original
cin del lenguaje de especicacin OCL2.0 (y especialiel 28 de noviembre de 2015. Consultado el 2 de abril de
zaciones tales como Java Modeling Language) y particu2014.
larmente con Model-driven Architecture, que permite la
ejecucin de diseos, incluso especicaciones.
Otra tendencia que est surgiendo en el desarrollo de software es la redaccin de especicaciones en algn tipo de
lgica (normalmente una variacin de FOL), para acto
seguido ejecutar esa lgica como si se tratase de un programa. El lenguaje OWL, basado en lgica descriptiva,
es un buen ejemplo. Tambin se est trabajando en enlazar un idioma natural de forma automtica con lgica,
lgica que puede ejecutarse. Ejemplo en este campo es
el Attempto Controlled English, una lgica de negocios de
Internet, que no busca controlar el vocabulario o la sintaxis. Una caractersticas de los sistemas que apoyan el
vnculo bidireccional ingls-lgica y ejecucin directa de
la lgica es que pueden explicar sus resultados en ingls
en un nivel de negocios o cientco.

156.6 Vase tambin


Ingeniera de software
Anexo:Filosofas del desarrollo de software
Scrum
Metodologa de desarrollo de software
Desarrollo gil de software
Programacin extrema
Prototipo
Desarrollo de software

156.7 Referencias
[1]
[2] [https://owned030.blogspot.com/
[3]
[4] Ingeniera de software
[5] Ingeniera de software
[6] ieeecomputersociety.org

156.8 Enlaces externos


No Silver Bullet: Essence and Accidents of Software
Engineering", 1986
Gerhard Fischer,The Software Technology of the
21st Century: From Software Reuse to Collaborative Software Design, 2001
Lydia Ash: The Web Testing Companion: The Insider's Guide to Ecient and Eective Tests, Wiley,
May 2, 2003. ISBN 0-471-43021-8
SaaSSDLC.com Software as a Service Systems
Development Life Cycle Project
Software development life cycle (SDLC) [visual
image], software development life cycle

Captulo 157

Programa informtico
den ejecutar con la ayuda de un intrprete, o pueden ser
empotrados directamente en hardware.
De acuerdo a sus funciones, los programas informticos se clasican en software de sistema y software de aplicacin. En las computadoras de 2015, al hecho de ejecutar varios programas de forma simultnea y eciente, se
lo conoce como multitarea.

157.1 Programacin
La programacin de computadoras es el proceso iterativo de escribir o editar cdigo fuente. Dicha edicin de
cdigo 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 tcnica se le conoce como programador
de computadoras, desarrollador de software, o codicaUn programa informtico escrito en un estilo orientado a objetos. dor. El proceso, a veces a largo plazo, de programacin de
computadoras normalmente se lo conoce como desarrollo
Un programa informtico o programa de computado- de software. El trmino ingeniera de software se est
ra es una secuencia de instrucciones, escritas para rea- convirtiendo en muy popular, ya que esta actividad es vislizar una tarea especca en una computadora.* [1] Es- ta como una disciplina de ingeniera.
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 directamente para ejecutar las instrucciones. El mismo programa Los programas de ordenador se pueden clasicar segn
en su formato de cdigo fuente legible para humanos, el paradigma del lenguaje de programacin utilizado padel 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 coleccin de programas Los programas escritos con un lenguaje imperativo espede computadora y datos relacionados se conoce como cican un algoritmo utilizando declaraciones, expresiosoftware.
nes e informes.* [4] Una declaracin asocia un nombre de
Generalmente, el cdigo fuente lo escriben profesionales
conocidos como programadores de computadora.* [3] Este cdigo se escribe en un lenguaje de programacin que
sigue uno de los siguientes dos paradigmas: imperativo
o declarativo, y que posteriormente puede ser convertido en un archivo ejecutable (usualmente llamado un programa ejecutable o un binario) por un compilador y ms
tarde ejecutado por una unidad central de procesamiento. Por otra parte, los programas de computadora se pue-

variable a un tipo de datos. Por ejemplo: var x: integer; .


Una expresin produce un valor. Por ejemplo: 2 + 2 produce 4. Por ltimo, una declaracin puede asignar una
expresin a una variable o usar el valor de una variable
para alterar las estructuras de control del programa. Por
ejemplo: x := 2 + 2; if x = 4 then hacer_algo(); Una crtica de los lenguajes imperativos es el efecto secundario
de una sentencia de asignacin en una clase de variables
llamadas variables no locales.* [5]

291

292

CAPTULO 157. PROGRAMA INFORMTICO

Los programas escritos en un lenguaje declarativo especican las propiedades que tienen o que deben cumplirse para la salida. No especican detalles expresados en
trminos de ujo de control de la mquina de ejecucin
pero s de las relaciones matemticas entre los objetos
declarados y sus propiedades. Los lenguajes funcionales
y lgicos son dos amplias categoras de lenguajes declarativos. El principio detrs de los lenguajes funcionales (como Haskell) es el de no permitir efectos secundarios, lo
que hace que sea ms fcil para razonar sobre los programas como si se tratasen de funciones matemticas.* [5] El
principio detrs de los lenguajes lgicos (como Prolog) es
denir el problema a ser resuelto - la meta - y dejar la solucin detallada al propio sistema Prolog.* [6] El objetivo
se dene proporcionando la lista de sub-objetivos. Luego,
cada subobjetivo se dene ms arriba, proporcionando la
lista de sus sub-objetivos, etc. Si la ruta de sub-objetivos
no encuentra una solucin, entonces ese subobjetivo se
retrocede y otra va se intenta sistemticamente.

representacin intermedia eciente para la ejecucin futura. BASIC, Perl y Python son ejemplos de programas de
computadora ejecutados inmediatamente. Por otra parte,
los programas de computadora de Java se compilan antes
de tiempo y se almacena como un cdigo independiente de la mquina llamado bytecode. Entonces, dicho bytecode es ejecutado a peticin de un intrprete llamado
mquina virtual.

La principal desventaja de los intrpretes es que los programas de computadora corren ms lento que cuando son
compilados. La interpretacin de cdigo resulta ms lenta
que la ejecucin de la versin compilada porque el intrprete debe decodicar cada declaracin cada vez que se
carga y luego realizar la accin deseada. Sin embargo, el
desarrollo de software puede ser ms rpido usando un intrprete porque la prueba es inmediata cuando se omite el
paso de la compilacin. Otra desventaja de los intrpretes
es que debe estar presente al menos uno en la computadora durante la ejecucin 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 ejecucin.
en vez de ser textualmente especicados son manipulados No se requieren propiedades de un lenguaje de progragrcamente.
macin si se est compilado exclusivamente o interpre-

157.1.2

Compilado o interpretando

Un programa de computadora bajo la forma de lenguaje de programacin de computadoras legible por un humano, se lo llama cdigo fuente. Dicho cdigo fuente se puede convertir en una imagen ejecutable por un
compilador o ejecutarse inmediatamente con la ayuda de
un intrprete.
Cualquiera de los programas compilados o interpretados
pueden ser ejecutados en un proceso por lotes sin intervencin humana, pero los programas interpretados le permiten al usuario escribir comandos en una sesin interactiva. En este caso, los programas son los comandos separados, cuya ejecucin se produce secuencialmente, y por
lo tanto simultneamente. Cuando se utiliza un lenguaje
para dar rdenes a una aplicacin de software (como un
shell de Unix u otra interfaz de lnea de comandos), se le
llama un lenguaje de scripts.

tndose exclusivamente. Por lo general, la clasicacin


reeja el mtodo ms popular de ejecucin del lenguaje.
Por ejemplo, BASIC se considera un lenguaje interpretado y C un lenguaje compilado, a pesar de la existencia de
compiladores de BASIC e intrpretes de C. Algunos sistemas utilizan compilacin en tiempo de ejecucin (JIT)
mediante la cual las secciones de la fuente se compilan
'sobre la marcha' y se almacenan para ejecuciones posteriores.

157.1.3 Programas que se auto-modican

Un programa informtico en ejecucin normalmente es


tratado como algo diferente de los datos con los cuales
opera. Sin embargo, en algunos casos sta distincin es
ambigua, especialmente cuando un programa se modica
a s mismo. El programa modicado es ejecutado secuencialmente como parte del mismo programa. En el caso de
programas escritos en cdigo mquina, lenguaje ensamLos compiladores se utilizan para traducir el cdigo fuen- blador, Lisp, C, COBOL, PL/1 y Prolog y JavaScript (la
te de un lenguaje de programacin, ya sea en cdigo ob- funcin eval), entre otros, es posible tener cdigo que se
jeto o cdigo mquina.* [7] El cdigo objeto de objeto auto-modica.
necesita procesamiento adicional para convertirse en cdigo mquina, y el cdigo mquina es el cdigo nativo de
la unidad central de procesamiento, listo para su ejecu157.2 Ejecucin y almacenamiento
cin. Los programas de computadora compilados se conocen comnmente como ejecutables, imgenes binarias,
de los programas
o simplemente como binarios una referencia al formato
de archivo binario utilizado para almacenar el cdigo eje- Tpicamente, los programas se almacenan en una
cutable.
memoria no voltil (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 sesin interactiva o bien se descodican y lue- solicite su ejecucin. Al momento de dicha solicitud, el
go ejecutados inmediatamente o se decodican en alguna programa es cargado en la memoria de acceso aleatorio

157.2. EJECUCIN Y ALMACENAMIENTO DE LOS PROGRAMAS

293

o RAM del equipo, bajo el control del software llamado sistema operativo, el cual puede acceder directamente
al procesador. El procesador ejecuta (corre) el programa,
instruccin por instruccin hasta que termina. A un programa en ejecucin se le suele llamar tambin proceso.
Un programa puede terminar su ejecucin en forma normal o por causa de un error, dicho error puede ser de
software o de hardware.

157.2.1

Programas empotrados en hardware


Interruptores para la carga manual en una Data General Nova
3.

programa, se estableca la direccin de inicio mediante


interruptores y se presionaba el botn de ejecucin.* [10]

157.2.3 Programas generados automticamente


La programacin automtica es un estilo de
programacin que crea cdigo fuente mediante
clases genricas, prototipos, plantillas, aspectos, y
generadores de cdigo para aumentar la productiviEl microcontrolador a la derecha de la Memoria USB est con- dad del programador. El cdigo fuente se genera con
herramientas de programacin tal como un procesador
trolada por un rmware empotrado.
de plantilla o un IDE. La forma ms simple de un
Algunos programas estn empotrados en el hardware. generador de cdigo fuente es un procesador macro, tal
Una computadora con arquitectura de programas alma- como el preprocesador de C, que reemplaza patrones de
cenados requiere un programa inicial almacenado en su cdigo fuente de acuerdo a reglas relativamente simples.
ROM para arrancar. El proceso de arranque es para iden- Un motor de software da de salida cdigo fuente o
ticar e inicializar todos los aspectos del sistema, desde lenguaje de marcado que simultneamente se vuelve
los registros del procesador, controladores de dispositi- la entrada de otro proceso informtico. Podemos penvos hasta el contenido de la memoria RAM.* [8] Seguido sar como analoga un proceso manejando a otro siendel proceso de inicializacin, este programa inicial carga do el cdigo mquina quemado como combustible. Los
al sistema operativo e inicializa al contador de programa servidores de aplicaciones son motores de software que
para empezar las operaciones normales. Independiente de entregan aplicaciones a computadoras cliente. Por ejemla computadora, un dispositivo de hardware podra tener plo, un software para wikis es un sevidor de aplicaciormware empotrado para el control de sus operaciones. nes que permite a los usuarios desarrollar contenido diEl rmware se utiliza cuando se espera que el programa nmico ensamblado a partir de artculos. Las Wikis gecambie en raras ocasiones o nunca, o cuando el programa neran HTML, CSS, Java, y Javascript los cuales son
no debe perderse cuando haya ausencia de energa.* [9]
interpretados por un navegador web.

157.2.2

Programas cargados manualmen- 157.2.4 Ejecucin simultnea


te

Histricamente, los programas eran cargados al procesador central de forma manual mediante interruptores. Una
instruccin se representaba por una conguracin de estados de interruptores de abierto o cerrados. Despus de
establecer la conguracin, se ejecutaba un botn de ejecucin. Este proceso era repetitivo. Asimismo, los programas se cargaban manualmente mediante una cinta de
papel o tarjetas perforadas. Despus de que se cargaba el

Muchos programas pueden ejecutarse simultneamente


en la misma computadora, hecho al cual se lo conoce
como multitarea, pudindose lograr mediante mecanismos de software o de hardware. Los sistemas operativos
modernos pueden ejecutar varios programas a travs del
planicador de procesos un mecanismo de software para conmutar con frecuencia la cantidad de procesos del
procesador de modo que los usuarios puedan interactuar
con cada programa mientras estos estn corriendo.* [11]

294
Tambin se puede lograr la multitarea por medio del
hardware; las computadoras modernas que usan varios
procesadores o procesadores con varios ncleos pueden
correr muchos programas a la vez.* [12]

157.3 Categoras funcionales

CAPTULO 157. PROGRAMA INFORMTICO

[4] Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition (en ingls). Addison-Wesley. p. 75.
ISBN 0-201-56885-3.
[5] Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition (en ingls). Addison-Wesley. p.
213. ISBN 0-201-56885-3.
[6] Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition (en ingls). Addison-Wesley. p.
244. ISBN 0-201-56885-3.

Los programas se pueden categorizar aplicando criterios


funcionales. Estas categoras funcionales son software de
sistema y software de aplicacin. El software de sistema [7] What is a Compiler? (en ingls). Consultado el 10 de
incluye al sistema operativo el cual acopla el hardware
enero de 2012.
con el software de aplicacin.* [13] El propsito del sistema operativo es proveer un ambiente en el cual el softwa- [8] Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition (en ingls). Addison-Wesley. p. 30.
re de aplicacin se ejecuta de una manera conveniente y
*
ISBN 0-201-50480-4.
eciente. [13] Adems del sistema operativo, el software de sistema incluye programas utilitarios que ayudan a
[9] Tanenbaum, Andrew S. (1990). Structured Computer Ormanejar y congurar la computadora. Si un programa no
ganization, Third Edition. Prentice Hall. p. 11. ISBN 0es software de sistema entonces es software de aplicacin.
13-854662-2. (en ingls).
El middleware tambin es un software de aplicacin que
acopla el software de sistema con la interfaz de usuario. [10] Silberschatz, Abraham (1994). Operating System ConTambin son software de aplicacin los programas utilicepts, Fourth Edition (en ingls). Addison-Wesley. p. 6.
tarios que ayudan a los usuarios a resolver problemas de
ISBN 0-201-50480-4.
aplicaciones, como por ejemplo la necesidad de ordena[11] Silberschatz, Abraham (1994). Operating System Conmiento.
cepts, Fourth Edition (en ingls). Addison-Wesley. p. 100.
ISBN 0-201-50480-4.

157.4 Vase tambin


Algoritmo para la relacin entre los programas informticos y algoritmos
Aplicacin informtica
Archivo cabra para un tipo especco de programa
informtico utilizado solo para liberar y estudiar los
efectos de virus informticos en los sistemas fsicos
y virtuales
Estructura de datos
Inteligencia articial
Sistema multi-agente
Software

157.5 Referencias
[1] Stair, Ralph M., et al. (2003). Principles of Information
Systems, Sixth Edition (en ingls). Thomson Learning, Inc.
p. 132. ISBN 0-619-06489-7.
[2] Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition (en ingls). Addison-Wesley. p. 58.
ISBN 0-201-50480-4.
[3] Algorithms and Computer Programming (en ingls).
Consultado el 8 de setiembre de 2014.

[12] Akhter, Shameem (2006). Multi-Core Programming (en


ingls). Richard Bowles (Intel Press). pp. 1113. ISBN 09764832-4-6..
[13] Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition (en ingls). Addison-Wesley. p. 1.
ISBN 0-201-50480-4.

157.6 Bibliografa
Knuth, Donald E. (1997). The Art of Computer Programming, Volume 1, 3rd Edition (en ingls). Boston: Addison-Wesley. ISBN 0-201-89683-4.
Knuth, Donald E. (1997). The Art of Computer Programming, Volume 2, 3rd Edition (en ingls). Boston: Addison-Wesley. ISBN 0-201-89684-2.
Knuth, Donald E. (1997). The Art of Computer Programming, Volume 3, 3rd Edition (en ingls). Boston: Addison-Wesley. ISBN 0-201-89685-0.

157.7 Enlaces externos


Denicin deProgramaen Webopedia (en ingls)
Denicin de Computer Program en dictionary.com (en ingls)

157.7. ENLACES EXTERNOS


Esta obra deriva de la traduccin total de Computer
program de Wikipedia en ingls, concretamente
de esta versin, publicada por sus editores bajo la Licencia de documentacin libre de GNU
y la Licencia Creative Commons AtribucinCompartirIgual 3.0 Unported.

295

Captulo 158

Programa interactivo
Un programa interactivo aqul que necesita la
realimentacin contina del usuario para poder ejecutarse. 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 mquina. Sin embargo esto ltimo
requiere mayor planicacin.

158.1 Frente a Procesamiento por


lotes
158.1.1

Ventajas

No es necesario conocer todas las opciones, ya que


las distintas interfaces grcas irn preguntando todo. Luego es adecuado para tareas que no se van a
ejecutar muy a menudo y no merece la pena perder
mucho tiempo en aprenderlas.

158.1.2

Inconvenientes

Requieren una mayor velocidad, ya que hay que evitar el cansancio del usuario.
Obliga a hacer tareas repetitivas al usuario.

158.2 Ejemplos
158.2.1

Cajero automtico

Un sistema de men gua al usuario para conseguir


distintos propsitos: Cargar el mvil, sacar dinero,
transferencia...

158.2.2

Compresor de archivos

Se le dir al programa qu debe comprimir, cul es


el archivo de salida, tasa de compresin y algunos
parmetros extra.
296

Como programa interactivo, se irn solicitando al


usuario los distintos parmetros en distintos mens.

Captulo 159

Programacin lineal paramtrica


Programacin lineal paramtrica, el anlisis de sensibilidad requiere el cambio de un parmetro a la vez en
el modelo original para examinar su efecto sobre la solucin ptima. Por el contrario, la programacin lineal
paramtrica (o programacin paramtrica en forma ms
corta) se reere al estudio sistemtico de los cambios en
la solucin ptima cuando cambia el valor de muchos parmetros al mismo tiempo, dentro de un intervalo. Este
estudio proporciona una extensin muy til al anlisis de
sensibilidad; por ejemplo, se puede vericar el efecto de
cambios simultneos en parmetroscorrelacionados,
causados por factores exgenos tales como el estado de la
economa. sin embargo, una aplicacin ms importante
es la investigacin de los trueques entre los valores de los
parmetros. por ejemplo, si los valores de cj representan
la ganancia unitaria de las actividades respectivas, es posible aumentar el valor de alguna cj a costa de disminuir
el de otras mediante un intercambio apropiado de personal y equipo entre las actividades. De manera parecida,
si los valores de bi representan las cantidades disponibles
de los respectivos recursos, es imposible aumentar alguna
bi si se est de acuerdo en disminuir algunas otras.
En algunos casos, el propsito del estudio es determinar
el trueque ms apropiado entre dos factores bsicos como
costos y benecios. la forma usual de hacerlo es expresar
uno de estos factores en funcinobjetivo (como minimizar
el costo total) e incorporar el otro a las restricciones (por
ejemplo, benecio >= nivel mnimo aceptable).
La tcnica algortmica para programacin lineal paramtrica es una extensin natural del anlisis de sensibilidad,
por lo que tambin est basada en el mtodo simplex.

159.1 Referencias
HILLER - LIEBERMAN. INVESTIGACIN DE
OPERACIONES. Mc Graw Hill Interamericana Editores S.A. OCLC 16822487. Texto edicin: Sptima
ignorado (ayuda)

297

Captulo 160

Programacin visual
La programacin visual brinda los conocimientos nece- la programacin orientada a objetos y permiten aprovesarios para disear y desarrollar aplicaciones con un en- char al mximo toda la funcionalidad que ofrecen estos
torno visual amigable y fcil de utilizar para el usuario.
lenguajes para el desarrollo de aplicaciones de gestin.
Los lenguajes de programacin visual tienden a facilitar
la tarea de los programadores, dado que con los primeros
lenguajes de programacin crear una ventana era tarea de
meses de desarrollo y de un equipo de trabajo.

160.2 Vase tambin


Diagrama de ujo

160.1 Programacin orientada a


objetos
Dene los programas en trminos de "clases de objetos, objetos que son entidades que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o mtodos) e identidad (propiedad del
objeto que lo diferencia del resto). La programacin
orientada a objetos expresa un programa como un
conjunto de estos objetos, que colaboran entre ellos
para realizar tareas.
La tcnica de programacin orientada a objetos, se
basa en fundamentos de diseo, tcnicas y metodologas unicadas (UML).
Lenguajes visuales como Visual Basic.Net, Borland
Delphi, incorporan una completa implementacin
de la programacin orientada a objetos y permiten aprovechar al mximo toda la funcionalidad que
ofrecen estos lenguajes para el desarrollo de aplicaciones de gestin.
Dene los programas en trminos de clases de objetos, objetos que son entidades que combinan estado (es
decir, datos), comportamiento (esto es, procedimientos
o mtodos) e identidad (propiedad del objeto que lo diferencia del resto). La programacin orientada a objetos
expresa un programa como un conjunto de estos objetos,
que colaboran entre ellos para realizar tareas. La tcnica de programacin orientada a objetos, se basa en fundamentos de diseo, tcnicas y metodologas unicadas
(UML). Lenguajes visuales como Visual Basic.Net, Borland Delphi, incorporan una completa implementacin de
298

Gambas lenguaje de programacin visual libre derivado de Basic


Lenguaje Unicado de Modelado
snapp es un sistema de programacin visual derivado
de Google Blockly
VisSim es un lenguaje de programacin visual.

Captulo 161

Programador
Un programador o una programadora es aquella persona que escribe, depura y mantiene el cdigo fuente de
un programa informtico, es decir, el conjunto de instrucciones que ejecuta el hardware de una computadora, para
realizar una tarea determinada.
Un programador o programadora, es la persona que elabora programas de computadora.* [1]
Los programadores tambin son denominados
desarrolladores de software, aunque estrictamente forman parte de un equipo de personas de distintas
especialidades (mayormente informticas), y siendo que
el equipo es propiamente el desarrollador.
La programacin es una de las principales disciplinas
dentro de la informtica.
En muchos pases, el/la programador/a es tambin una
categora profesional reconocida.

161.1 Resea histrica


Ada Lovelace, hija del prestigioso poeta Lord Byron, es
considerada la primera programadora de la historia. Su Retrato de Ada Lovelace.
contribucin ms notable consisti en elaborar un mtodo para calcular los nmeros de Bernoulli en la mquina
blema y describirlo con el propsito de ser solucioanaltica de Charles Babbage. En homenaje a Ada Lovenado mediante un sistema de informacin.
lace, fue puesto el nombre al lenguaje de programacin
El programador, cuya nica funcin consista en
Ada.
trasladar las especicaciones del analista en cdigo
ejecutable para la computadora. Dichas especicaciones
se recogen en un documento denominado
161.2 Funciones del programador
cuaderno de carga, medio de comunicacin entre
ambos.
El programador se encarga de la implementacin de
prototipos mediante un lenguaje de programacin, que
Hoy da se reconoce que este enfoque no es vlido para
compilados pueda entender la computadora.
organizar tareas de tipo intelectual, como es el desarroInicialmente, la profesin se formaliz desde el enfoque llo de software. De manera que la profesin de progratayloriano de la especializacin de funciones en la em- mador ha ido evolucionando. Las dicultades de comupresa. As, el proceso de produccin de software se con- nicacin entre analistas y programadores (un mero docucibe como un conjunto de tareas altamente especializadas mento no basta para describir lo que se quiere hacer) dio
donde est claramente denido el papel de cada categora origen a una categora de profesional intermedia, denoprofesional:
minada analista-programador. La concepcin original
del programador ha desaparecido siendo sustituida por la
El analista, tiene como cometido analizar un pro- de un profesional mucho ms formado y con unas funcio299

300
nes menos mecnicas.
La profesin de analista tambin ha evolucionado, surgiendo el concepto diseador (de software). Esto se debe
a los avances de la ingeniera del software donde se reconoce que el anlisis es una actividad compleja y distinta
del diseo. Escuetamente, el anlisis describe el problema
(es decir, quhacer) mientras que el diseo describe
la solucin (cmohacerlo).
En la mayora de pases industrializados esto ha dado lugar a la categora diseador o arquitecto del software.

CAPTULO 161. PROGRAMADOR

161.4 Notas y referencias


[1] Real Academia Espaola (2014), programador,
Diccionario de la lengua espaola (23. edicin), Madrid:
Espasa, http://dle.rae.es/?w=programador&o=h

161.5 Vase tambin


Ambiente de desarrollo integrado
Cdigo fuente

161.3 Especialidades
Estrictamente hablando, la profesin de programador si
conoce especialidades. No obstante, existen diversas ramas por las que se decantan los propios profesionales y
que se ven reejadas en la oferta de empleo. As, es posible mencionar algunas:
Programadores de mainframe: aunque se cree extinta la actividad en los viejos grandes sistemas informticos, lo cierto es que an existen muchos en funcionamiento que requieren mantenimiento. La tecnologa que manejan estos programadores es radicalmente distinta a la del resto, motivo por el que
se puede considerar esta como la rama ms especializada. Entre sus conocimientos se cuenta COBOL,
RPG, JCL, base de datos jerrquicas, etc.
Programadores denuevas tecnologas": esta es una
rama que gira en torno a Internet, los nuevos servicios como la Web 2.0 y los negocios por medios
electrnicos o e-commerce. Entre sus conocimientos
destacan lenguajes del lado del servidor como Java,
ASP, .NET, JSP, PHP, Ruby, Python o Perl, y lenguajes del lado de cliente como HTML, XHTML,
CSS, Javascript AJAX (conjunto de tecnologas
existentes como XML y Javascript).
Programadores de rmware y videojuegos, o
desarrollador de videojuegos: destacan sus conocimientos de hardware, microprocesadores,
ensamblador y C.
Programadores de sistemas abiertos": rama asociada a la Arquitectura Cliente-Servidor. Requiere conocimientos de lenguaje de programacin C,
lenguaje de programacin Pascal, etc.
Programadores de sistemas de control y adquisicin
de datos: adems de conocimientos de hardware,
microprocesadores, ensamblador y algunos otros
lenguajes, requieren formacin especca de fsica
e ingeniera de control.

Ingeniera del software


Interfaz de programacin de aplicaciones
Lenguaje de programacin
Programacin
Software

Captulo 162

Pseudocdigo
En ciencias de la computacin, y anlisis numrico, el
pseudocdigo (o falso lenguaje) es una descripcin de
alto nivel compacta e informal* [1] del principio operativo de un programa informtico u otro algoritmo.

introduccin y que explica las convenciones particulares


en uso. El nivel de detalle del pseudocdigo puede, en algunos casos, acercarse a la de formalizar los idiomas de
propsito general.

Utiliza las convenciones estructurales de un lenguaje de


programacin real,* [2] pero est diseado para la lectura
humana en lugar de la lectura mediante mquina, y con
independencia de cualquier otro lenguaje de programacin. Normalmente, el pseudocdigo omite detalles que
no son esenciales para la comprensin humana del algoritmo, tales como declaraciones de variables, cdigo especco del sistema y algunas subrutinas. El lenguaje de programacin se complementa, donde sea conveniente, con
descripciones detalladas en lenguaje natural, o con notacin matemtica compacta. Se utiliza pseudocdigo pues
este es ms fcil de entender para las personas que el cdigo del lenguaje de programacin convencional, ya que
es una descripcin eciente y con un entorno independiente de los principios fundamentales de un algoritmo.
Se utiliza comnmente en los libros de texto y publicaciones cientcas que se documentan varios algoritmos,
y tambin en la planicacin del desarrollo de programas
informticos, para esbozar la estructura del programa antes de realizar la efectiva codicacin.

Un programador que tiene que aplicar un algoritmo especco, sobre todo uno desfamiliarizado, generalmente
comienza con una descripcin en pseudocdigo, y luego
traduceesa descripcin en el lenguaje de programacin
meta y lo modica para que interacte correctamente con
el resto del programa. Los programadores tambin pueden iniciar un proyecto describiendo la forma del cdigo
en pseudocdigo en el papel antes de escribirlo en su lenguaje de programacin, como ocurre en la estructuracin
de un enfoque de Top-down y Bottom-up arriba hacia
abajo.

No existe una sintaxis estndar para el pseudocdigo,


aunque los ocho IDE's que manejan pseudocdigo tengan
su sintaxis propia. Aunque sea parecido, el pseudocdigo no debe confundirse con los programas esqueleto que
incluyen cdigo cticio, que pueden ser compilados sin
errores. Los diagramas de ujo y UML pueden ser considerados como una alternativa grca al pseudocdigo,
aunque sean ms amplios en papel.

162.1 Aplicaciones
Generalmente se utiliza pseudocdigo en los libros de
texto y publicaciones cientcas relacionadas con la informtica y la computacin numrica, para la descripcin
de algoritmos, de manera que todos los programadores
puedan entenderlo, aunque no todos conozcan el mismo
lenguaje de programacin. Generalmente, en los libros
de texto se adjunta una explicacin que acompaa a la

162.2 Sintaxis
En la actualidad y por lo general, el pseudocdigo, como
su nombre lo indica, no obedece a las reglas de sintaxis de
ningn idioma en particular ni es de forma estndar sistemtica, a pesar de que cualquier escritor en particular
vaya a pedir prestado las estructuras de control general,
la sintaxis y el estilo, por ejemplo, de algn lenguaje de
programacin convencional. Pero en caso de que se quiera ejecutar, se debe llevar a forma tipo, para que no genere
mensajes de error. Las fuentes populares incluyen la sintaxis 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 cdigo
y el cdigo contenido dentro de un loop se remplazan por
una sentencia de una lnea en lenguaje natural.
Dependiendo del escritor, el pseudocdigo puede variar
mucho en su estilo, yendo desde en un extremo, una imitacin casi exacta de un lenguaje de programacin real,
hasta al acercarse a una descripcin en prosa de formato
de pseudocdigo en el otro extremo.
Este es un ejemplo de pseudocdigo (para el juego matemtico bizz buzz):

301

302

CAPTULO 162. PSEUDOCDIGO

162.3 Denicin de datos del pseudocdigo


La denicin de datos se da por supuesta, sobre todo en
las variables sencillas, si se emplea formaciones: pilas, colas, vectores o registros, se pueden denir en la cabecera
del algoritmo, y naturalmente cuando empleemos el pseudocdigo para denir estructuras de datos, esta parte la
desarrollaremos adecuadamente.

162.4 Funciones y operaciones


Cada autor usa su propio pseudocdigo con sus respectivas convenciones. Por ejemplo, la instruccinreemplace el valor de la variable x por el valor de la variable y "
puede ser representado como:
asigne a x el valor de y
Diagrama de ujo que muestra el funcionamiento de la instruc-

Las operaciones aritmticas se representan de la forma


cin condicional.
usual en matemticas.

162.5 Estructuras de control


En la redaccin del pseudocdigo se utiliza tres tipos de
estructuras de control: las secuenciales, las selectivas y las
iterativas.

162.5.1

Estructuras secuenciales

Las instrucciones se siguen en una secuencia ja que normalmente viene dada por el nmero de rengln. Es decir
que las instrucciones se ejecutan de arriba hacia abajo.

162.5.2

Estructuras selectivas

Las instrucciones selectivas representan instrucciones que


pueden o no ejecutarse, segn el cumplimiento de una
condicin.
La condicin es una expresin booleana. Instrucciones es Diagrama de ujo que muestra el funcionamiento de la instrucejecutada slo si la condicin es verdadera.
cin condicional.
Selectiva doble (alternativa)

Selectiva mltiple

La instruccin alternativa realiza una instruccin de dos Tambin es comn el uso de una seleccin mltiple que
posibles, segn el cumplimiento de una condicin.
equivaldra a anidar varias funciones de seleccin.
La condicin es una variable booleana o una funcin reducible a booleana (lgica, Verdadero/Falso). Si esta condicin es cierta se ejecuta Instrucciones1 , si no es as, entonces se ejecuta Instrucciones2 .

En este caso hay una serie de condiciones que tienen que


ser mutuamente excluyentes, si una de ellas se cumple las
dems tienen que ser falsas necesariamente, hay un caso
si no que ser cierto cuando las dems condiciones sean

162.6. DESARROLLO DE ALGORITMOS


falsas.

303
Bucle hacer

En esta estructura si Condicin1 es cierta, entonces se ejecuta slo Instrucciones1 . En general, si Condicin es ver- El Bucle hacer se utiliza para repetir un bloque de cdigo
mientras se cumpla cierta condicin.
dadera, entonces slo se ejecuta Instrucciones
Selectiva mltiple-Casos

Bucle para

Una construccin similar a la anterior (equivalente en al- Una estructura de control muy comn es el ciclo para,
la cual se usa cuando se desea iterar un nmero conocigunos casos) es la que se muestra a continuacin.
do de veces, empleando como ndice una variable que se
En este caso hay un Indicador es una variable o una funincrementa (o decrementa): Plantilla:Definiciones
cin cuyo valor es comparado en cada caso con los valores "Valor", si en algn caso coinciden ambos valores, la cual se dene como:
entonces se ejecutarn las Instrucciones correspondientes. La seccin en otro caso es anloga a la seccin si no
Bucle para cada
del ejemplo anterior.
Por ltimo, tambin es comn usar la estructura de control para cada. Esta sentencia se usa cuando se tiene una
lista o un conjunto L y se quiere iterar por cada uno de
Las instrucciones iterativas representan la ejecucin de sus elementos:
instrucciones en ms de una vez.
Si asumimos que los elementos de L son L0 , L1 , . . . , Ln
, entonces esta sentencia equivaldra a:
Bucle mientras
Que es lo mismo que:

162.5.3

Estructuras iterativas

El bucle se repite mientras la condicin sea cierta, si al Sin embargo, en la prctica existen mejores formas de
llegar por primera vez al bucle mientras la condicin es implementar esta instruccin dependiendo del problema.
falsa, el cuerpo del bucle no se ejecuta ninguna vez.
Es importante recalcar que el pseudocdigo no es un lenguaje estandarizado. Eso signica que diferentes autores
podran dar otras estructuras de control o bien usar estas
mismas estructuras, pero con una notacin diferente. Sin
embargo, las funciones matemticas y lgicas toman el
signicado usual que tienen en matemtica y lgica, con
las mismas expresiones.

162.5.4 El anidamiento
Cualquier instruccin puede ser sustituida por una estructura de control. El siguiente ejemplo muestra el pseudocdigo del ordenamiento de burbuja, que tiene varias estructuras anidadas. Este algoritmo ordena de menor a mayor los elementos de una lista L .

Diagrama de ujo que muestra el funcionamiento de la instruccin mientras

Bucle repetir

En general, las estructuras anidadas se muestran indentadas, para hacer ms sencilla su identicacin a simple
vista. En el ejemplo, adems de la indentacin, se ha conectado con echas los pares de delimitadores de cada
nivel de anidamiento.

162.6 Desarrollo de algoritmos

Existen otras variantes que se derivan a partir de la anterior. La estructura de control repetir se utiliza cuando Con este pseudocdigo se puede desarrollar cualquier ales necesario que el cuerpo del bucle se ejecuten al menos goritmo que:
una vez y hasta que se cumpla la condicin:
La estructura anterior equivaldra a escribir:

Tenga un nico punto de inicio.

304
Tenga un nmero nito de posibles puntos de trmino.
Haya un nmero nito de caminos, entre el punto de
inicio y los posibles puntos de trmino.

CAPTULO 162. PSEUDOCDIGO

162.9 Enlaces externos


Pseudocdigo - Diagramas de ujo, programacin
bsica
Sintaxis del pseudocdigo CEE (C en espaol)

162.7 Funciones y procedimientos

Foro Programacin, tutoriales y ejemplos


PSEINT - PIPEH pseudointrprete

Muchas personas preeren distinguir entre funciones y


procedimientos. Una funcin, al igual que una funcin matemtica, recibe uno o varios valores de entrada y regresa
una salida mientras que un procedimiento recibe una entrada y no genera ninguna salida aunque en algn caso podra devolver resultados a travs de sus parmetros de entrada si estos se han declarado por referencia (ver formas
de pasar argumentos a una funcin o procedimiento).
En ambos casos es necesario dejar en claro cules son
las entradas para el algoritmo, esto se hace comnmente colocando estos valores entre parntesis al principio o
bien declarndolo explcitamente con un enunciado. En
el caso de las funciones, es necesario colocar una palabra
como regresar o devolver para indicar cul es la salida
generada por el algoritmo. Por ejemplo, el pseudocdigo de una funcin que permite calcular an (un nmero a
elevado a potencia n ).
Un ejemplo de procedimiento seria el algoritmo de
Ordenamiento de burbuja, por el que partiendo de una
lista de valores estos se ordenan, ntese que en un procedimiento, no se calcula el valor de una funcin, sino que
se realiza una accin, en este caso ordenar la lista.

162.8 Ventajas del pseudocdigo


sobre los diagramas de ujo
Los pseudocdigos presentan los siguientes benecios:
1. Ocupan mucho menos espacio en el desarrollo del
problema.
2. Permite representar de forma fcil operaciones repetitivas complejas.
3. Es ms sencilla la tarea de pasar de pseudocdigo a
un lenguaje de programacin formal.
4. Si se siguen las reglas de identacin se puede observar claramente los niveles en la estructura del programa.
5. En los procesos de aprendizaje de los alumnos de
programacin, stos estn ms cerca del paso siguiente (codicacin en un lenguaje determinado,
que los que se inician en esto con la modalidad Diagramas de Flujo).
6. Mejora la claridad de la solucin de un problema.

Ejercicios de programacin en peseudocdigo


Intrprete de algoritmos en espaol

162.10 Referencias
[1] Pseudocdigo - Estructuras condicionales. Consultado
el 7 de diciembre de 2012.
[2] Instroduccin al PseudoCdigo. Consultado el 7 de diciembre de 2012.

162.11 Bibliografa
1. Pea Mar, Ricardo (2005). Diseo de programas:
formalismo y abstraccin (3 edicin). Pearson Alhambra. p. 488. ISBN 978-84-205-4191-4.
2. Pseudocdigos y programacin estructurada (1 edicin). Centro Tcnico Europeo de Enseanzas Profesionales. 2 de 1997. ISBN 978-84-8199-065-2.
3. Brassard, Gilles; Bratley, Paul (1996). Algortmica:
concepcin y anlisis. Pea Mari, Ricardo Tr. (1 edicin). Masson, S.A. p. 384. ISBN 978-84-458-0535-0.
4. Rodeira, ed. (6 de 1994). Pseudocdigos e programacin estructurada (en gallego) (1 edicin). ISBN
978-84-8116-287-5.
5. Edeb, ed. (8 de 1993). Pseudocdigos y programacin estructurada (1 edicin). ISBN 978-84-236-31261.

162.12 Vase tambin

Captulo 163

Puente de aplicacin
En informtica, un puente de aplicacin o application
bridge es el cdigo que conecta diferentes entornos de un
lenguaje con otros lenguajes.
Los puentes, delimitan el trco entre redes a las redes
que tiene acceso directo y deben preservar las caractersticas de las LANs que interconectan (retardo de transmisin, capacidad de transmisin, probabilidad de prdida,
etc.).
La conexin es utilizada exclusivamente para transmitir
llamadas a mtodos con sus propios parmetros y retornar
los valores de un entorno de lenguaje a otro. Por ejemplo,
se necesita un puente para acceder desde Delphi a la API
de OpenOce.org.

305

Captulo 164

Puntero inteligente
En programacin, un puntero inteligente (o smart pointer) es un tipo abstracto de datos que simula el comportamiento de un puntero corriente pero aadiendo nuevas
caractersticas adicionales, como recolector de basura automtico y comprobador de lmites. Estas caractersticas
adicionales tienen como objetivo reducir errores causados por el mal uso de punteros, manteniendo la eciencia.
Los punteros inteligentes suelen llevar un registro de los
objetos a los que apunta con el prposito de gestionar la
memoria.

auto_ptr<algun_tipo> funcion_obvia1();
La funcin hace explcitamente que elllamadortenga
la propiedad del resultado y, adems, si no se hace nada,
no se ltrar memoria. Del mismo modo, si la intencin
es devolver un puntero a un objeto gestionado en otros
lugares, la funcin podra devolver una referencia:
algun_tipo& funcion_obvia2();

El mal uso de los punteros suele ser la mayor fuente de


errores: asignaciones constantes, liberacin de memoria
inteligentes en
y la referencia, que debe ser realizada por un progra- 164.1 Punteros
ma usando punteros, introduce el riesgo de prdidas de
Boost
memoria. Los punteros inteligentes intentan prevenir las
prdidas de memoria, liberando automticamente los re- La biblioteca Boost de C++ nos ofrece varios tipos de
cursos: cuando un puntero (o el ltimo de una serie de punteros inteligentes, los ms importantes son:
punteros) a un objeto es destruido, porque por ejemplo
se sale del mbito, el objeto apuntado tambin se elimi Scoped Pointer: Puntero no copiable
na.
Shared Pointer: Puntero copiable
Existen varios tipos de punteros inteligentes. Algunos trabajan llevando la cuenta de referencias, otros mediante
asignacin de un objeto a un nico puntero. Si el lengua- 164.1.1 Scoped pointer
je soporta recolector de basura automtico (por ejemplo,
Java), el uso de los punteros inteligentes es innecesario.
Un scoped pointer es una clase de puntero inteligente que
En C++, los punteros inteligentes pueden ser implementados como unatemplate classque imita, mediante sobrecarga de operadores, el comportamiento de los punteros tradicionales, pero proporcionando algoritmos de administacin de memoria.
Los punteros inteligentes pueden facilitar la programacin internacional expresando el uso de un puntero en su
propio tipo. Por ejemplo, si una funcin de C++ devuelve
un puntero, no hay forma de saber cuando se debe liberar la memoria, cuando se ha terminado con el uso de la
informacin.

no puede copiarse, por lo que solo puede existir un punto


de acceso al objeto que apunta. Cuando el puntero sale
del mbito, el objeto se destruye y la memoria se libera.
Sintaxis:
boost::scoped_ptr<MiClase> MiPuntero (new MiClase(1)); MiPuntero.reset(new MiClase(2));
Se puede acceder al contenido usando el operador *, acceder a la direccin con & y acceder al puntero en bruto
con el metodo get().

algun_tipo* function_ambigua(); // Qu se debera Ejemplo:


hacer con el resultado?
#include <iostream> using namespace std; #include
<boost/scoped_ptr.hpp> /* Vamos a crear una clase
Tradicionalmente, esto se habra resuelto con comenta- que informe de cundo se crea y cuando se destruye,
rios, pero esto puede ser propenso a errores. Devolviendo y lleve un contador de elementos creados. */ class
Elemento { static int counter; int n; public: Elemenun auto_pr de C++:
to():n(++counter){ cout << "* Creando Elemento " <<
306

164.2. ENLACES EXTERNOS


n << endl; }; void lanzar(const char * msg){ cout << "*
Elemento " << n << " says: " << msg << endl; }; virtual
~Elemento(){ cout << "* So Long, Elemento " << n <<
endl; }; }; int Elemento::counter = 0; int main(int argc,
char *argv[]) { /* Utilizamos corchetes para abrir un
nuevo entorno (scope) Vemos que al terminar el scope, el
scoped pointer se libera automticamente, mientras que
en el caso del puntero clsico, si no liberamos manulmente se producira una fuga de memoria. */ cout <<Inicio
del scope<< endl; { boost::scoped_ptr<Elemento>
miElemento(new Elemento()); miElemento -> lanzar(
Mensaje desde myFun_1); Elemento * classicPointer = new Elemento(); classicPointer -> lanzar (
Mensaje del elemento con puntero clsico); delete
classicPointer; // Necesario borrarlo manualmente! }
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 mtodo reset, que borrar lo que estuviera contenido
en el puntero previamente. */ boost::scoped_ptr<string>
ptrCadena; ptrCadena.reset(new string(Hola)); /*
Los operadores habituales se conservan. En el caso del
*, se devuelve una referencia &. Para acceder al puntero
en bruto se utiliza el mtodo get(), aunque NO SE RECOMIENDA, ya que hacer modicaciones o borrar el
objeto apuntado a travs de get() puede producir errores.
*/ cout << Longitud de cadena: " << ptrCadena ->
length() << endl; cout << *ptrCadena << endl; return 0; }

307
boost::shared_ptr<Observado> fan; Mirador(){ cout <<
tab() << "+ Creando Mirador<< endl; } ~Mirador(){
cout << tab() << "- Borrando Mirador<< endl; } }; /*
La funcin popular rellena el atributo del Mirador con
un shared pointer a Observado. */ void popular(Mirador
& m1, Mirador & m2){ boost::shared_ptr<Observado>
O(new Observado); m1.fan = O; m2.fan = O; } int
main(int argc, char *argv[]) { tabulados = 0; cout <<
"-- Inicio<< endl; { tabulados ++; cout << tab() <<
"-- Inicio del primer scope<< endl; Mirador M1; {
tabulados ++; cout << tab() << "-- Inicio del segundo
scope<< endl; Mirador M2; popular(M1, M2); cout <<
tab() << "-- Fin del segundo scope<< endl; } tabulados
--; cout << tab() << "-- Final del primer scope<< endl;
} tabulados--; cout << "-- Fin<< endl; return 0; }

164.2 Enlaces externos


Captulo de muestra "Smart Pointers" del libro
Modern C++ Design: Generic Programming and
Design Patterns Applied por Andrei Alexandrescu,
Addison-Wesley, 2001.
Cdigo de ejemplo "countptr.hpp" del libro The
C++ Standard Library - A Tutorial and Reference
por Nicolai M. Josuttis
Artculo "Smart Pointers in Boost"

164.1.2

Shared pointer

Un shared pointer es un tipo de puntero inteligente que


guarda un contador de referencias al objeto al que apunta.
Cada vez que se hace una copia del puntero, se aumenta el
contador. Cuando se destruye uno de los shared pointer,
el contador disminuye.
Cuando el contador llega a cero, quiere decir que no hay
ms punteros apuntando al objeto, por lo que este puede
destruirse y liberar la memoria que ocupa. Todo esto se
hace de forma transparente al usuario.
Sintaxis:
boost::shared_ptr<MiClase> MiPuntero (new MiClase(1)); boost::shared_ptr<MiClase> OtroPuntero =
MiPuntero; MiPuntero.reset(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{ Observado(){ cout << tab() << "+ Creando Observado
<< endl; } ~Observado(){ cout << tab() << "- Borrando Observado<< endl; } }; struct Mirador{

Artculo "The New C++: Smart(er) Pointers" por


Herb Sutter
"Smart Pointers - What, Why, Which?" por Yonat
Sharon
"Smart Pointers Overview" por John M. Dlugosz
YASPER library otra implementacin de punteros
inteligentes en C++
Smart Pointers en Delphi

Captulo 165

Pure data
construccin para programas escritos en el software. Esto hace el programa arbitrariamente extensible a travs de
una API pblica, y alienta a los desarrolladores a aadir
sus propias rutinas de audio y control, ya sea en el lenguaje de programacin C o, con la ayuda de otros externos,
en Python, Javascript, Ruby, y potencialmente otros lenguajes tambin. Sin embargo, Pd es un lenguaje de programacin en s mismo. Unidades de cdigo modulares
y reusables, escritas nativamente en Pd, llamadas parcheso abstracciones, son usadas como programas
independientes y compartidas libremente entre la comunidad de usuarios de Pd, y ninguna otra habilidad de programacin es requerida para usar Pd pero ayuda.
Con la adicin del externoEntorno Grco para Multimedia(GEM, por su nombre en ingls), y otros externos
diseados para trabajar con l (como Pure Data Packet,
PiDiP para Linux, framestein para Windows, GridFlow
Captura de pantalla de Pure Data.
para proceso de matrices n-dimensionales que integra PuPure Data (o Pd) es un lenguaje de programacin gr- re Data con el lenguaje de programacin Ruby, etc.), es
co desarrollado por Miller Puckette durante los aos 90 posible crear y manipular vdeo, grcos OpenGL, impara la creacin de msica por ordenador interactiva y genes, etc, en tiempo real con aparentemente innitas poobras multimedia. Aunque Puckette es el principal autor sibilidades de interactividad con audio, sensores exterdel software, Pd es un proyecto de cdigo abierto y tie- nos, etc.
ne una gran base de desarrolladores trabajando en nuevas Adicionalmente, Pd est diseado nativamente para perextensiones al programa. Est publicado bajo una licen- mitir colaboracin en vivo a travs de redes o de Internet,
cia similar a la licencia BSD.
permitiendo a msicos conectados va LAN, o incluso en
Pd es muy similar en alcance y diseo al programa ori- distintas partes del mundo, hacer msica juntos en tiemginal de Puckette, Max(desarrollado cuando l estaba po real.
en IRCAM), y es hasta cierto grado interoperable con
Max/MSP, el sucesor comercial del lenguaje Max. Ambos Pd y Max son ejemplos discutibles de lenguajes de
programacin de ujo de datos. En este tipo de lenguajes, funciones uobjetosson conectados oparcheadosunos con otros en un ambiente grco que modela
el ujo del control y el audio. A diferencia de la versin
original de Max, sin embargo, Pd siempre fue diseado
para hacer procesado de seales y tasas de control en la
CPU nativa, en vez de descargar la sntesis y el proceso
de seales a un tablero de PDS (como el Ariel ISPW que
era usado para Max/FTS). El cdigo de Pd es la base de
las extensiones MSP de David Zicarelli al lenguaje Max
para hacer proceso de audio en software.

Las unidades donde se programa el cdigo se llaman


patcho abstracciones, son utilizadas como programas
independientes y compartidos libremente entre la comunidad de usuarios de Pd. Los patchs constan de diferentes
objetos interconectados entre ellos. En su parte superior
encontraremos las entradas, donde se les enviaran valores
numricos u otros tipos de datos, y en la inferior la salida
de estos.

Tambin existe la posibilidad de crear patchs secundarios


conocidos como subpatchs. Estn dentro del patch principal. Se crean escribiendo en un objeto las letras pd
seguidas de un espacio y el nombre que se le quiera dar a
ese subpatch, como se muestra en la gura. Clicando encima se nos abre la ventana donde encontramos el cdigo
Como Max, Pd tiene una base modular de cdigo con de nuestro subpatch.
externos u objetos que son utilizados como bloques de
308

165.2. OBJETOS MS IMPORTANTES

309
Objeto: Su comportamiento depender del texto que tenga introducido en l mismo. El programa tiene unos objetos predenidos, programados por terceras personas en
diferentes lenguajes como puede ser C. El Pd reconoce
el tipo de objeto y esa caja ya se comporta como tal.

Subpatch.

Nmeros: Su utilidad puede ser diversa, desde la de controlar el valor que tiene la seal en diferentes puntos del
patch, hasta la de inicializar valores que se pasan a objetos que controlan, por ejemplo, un nivel de opacidad de
una imagen.

Mensajes: Estn provistos de informacin que se pasa a


El programa tiene dos estados en los que se puede en- los objetos.
contrar el usuario. En modo de edicin o en modo de Smbolo: Este objeto guarda un smbolo hasta que recibe
ejecucin. Para cambiar de un estado a otro teclearemos un [bang] u otro smbolo. Es entonces cuando este smCtrl+E. Cuando estamos en el modo edicin, podemos bolo sale del objeto, por la parte inferior de la caja. Estos
modicar el contenido de las cajas, o la conexin entre objetos se ofrecen solo en Pd si tienes descargada y coellas. En el modo de ejecucin tenemos la posibilidad de rrectamente instalada la biblioteca apropiada. No tienen
poner en marcha todo el patch, e ir modicando valores porqu existir en las bibliotecas sencillas, aunque acosdurante su reproduccin o cuando este, est parado. Po- tumbran a estar incluidas en los archivos de instalacin.
demos enviar bangs, modicar valor de variables dentro
de los objetosnmeros, o activar y desactivar sectores Comentario: lo utilizaremos para incluir aclaraciones
del cdigo con el objeto [toggle], activado cuando tiene dentro de los diferentes pasos que sigue nuestro cdigo.
una cruz y desactivado cuando no.

165.1 Tipos de objetos

165.2 Objetos ms importantes

Oscilador.

El objeto [osc~] nos genera una seal sinusoidal. La frecuencia de oscilacin depender del valor que se introduzca en la entrada que tiene el objeto en la parte superior izquierda. Siempre que coloquemos un oscilador,
tenemos que colocar tambin un multiplicador y un convertidor digital analgico(dac~). Esto se hace porque el
osc~por defecto posee la amplitud mxima en 1, por
eso la multiplicamos por 0.01 para reducir su amplitud y
luego enviarla al dac~. El objeto dac~tiene dos
entradas que hacen referencia a los dos canales de salida
de la tarjeta de sonido de tu mquina.
Un [bang] tiene como funcin la activacin de la accin
que tiene inmediatamente conectada despus.

Objetos de Pd.

Metro: Enva series de [bang] peridicamente. Lo crearemos escribiendo la palabra metrodentro de un objeto. Este objeto tiene dos entradas, la de la izquierda

310

CAPTULO 165. PURE DATA


mrica dada inicialmente. Lo creamos introduciendo la
palabra select (espacio)condicin. De esta manera
cuando el valor de entrada sea igual a la condicin, por la
salida de la izquierda se enviar un bang. Si no coinciden
el bang ser enviado por la salida de la derecha. Se pueden introducir varias condiciones simultneas separadas
por espacios. Se crearan tantas salidas como condiciones
ms una nal. Cuando el valor coincida con una de las
condiciones, el bang ser enviado por la salida que corresponda con dicho valor. Si no coincide, el [bang] siempre
ser enviado por la ltima salida, la de ms a la derecha.

Bang.

metro_pd.

acepta [bangs]. Hace que el metro empiece a funcionar;


asimismo acepta mensajes con el texto stops, deteniendo el funcionamiento del metro. Tambin podemos
enviarle cualquier nmero diferente de cero para activarlo. Si se le enva un cero el metro deja de enviar [bangs].
En la entrada de la derecha le introducimos el nmero
que rige la periodicidad del envo de bangs, la unidad de
este valor son los milisegundos. Dentro de la misma caja de [metro], despus de la palabra metro y seguido de
un espacio se introduce un nmero que el objeto ya lo
entiende como el periodo.

Start

Start: Ejecuta los objetos del patch que tiene conectado


a l mismo. El objeto [start] lo crearemos escribiendo la
palabra startdentro de un mensaje.
Stop: Detiene la ejecucin del patch que est en funcionamiento. Lo crearemos escribiendo la palabra stop
dentro de un mensaje.

Selector.

Moses: Escribiremos la palabramosesdentro de un objeto para poder tenerlo operativo. Contiene dos entradas
y dos salidas. En la entrada de la izquierda conectamos el
valor que est en el proceso y en la derecha el valor que
queremos que acte de frontera. Si el valor del proceso
es inferior a la frontera, nos saca el valor de entrada por
la salida de la izquierda. En cambio, si el valor es igual o
superior al valor que acta de frontera, nos sacar el nmero por la salida de la derecha. Podramos asemejar el
[moses] a un ltro paso bajo y paso alto simultneo.

165.3 Instalacin en GNU posibles


problemas y soluciones
Para instalar Pd en GNU deberemos descomprimir el paquete descargado con el programa y ejecutar el archivo
con extensin.deb. El primer posible problema con el
que nos podemos encontrar, es que la distribucin Ubuntu Studio ya lleva un Pure Data instalado de serie. Debido a que es recomendable utilizar la versin Pd_extended
(aunque esto es algo que varia muy a menudo) tendremos
que desinstalar el Pure Data de GNU/linux Ubuntu, para
que, al instalar el nuevo, no tengamos problemas con el
hecho de compartir de carpetas. Otro factor muy comn e
importante cuando instalemos programas en GNU son las
dependencias de bibliotecas secundarias que puedan existir. Es necesario instalarlas para el buen funcionamiento
del programa. En el caso de Pure Data y de algunas bibliotecas externas (externals), se tienen que instalar algunas dependencias mediante el gestor de paquetes llamado
Synaptic. Ah podemos buscar cuales son las que necesitamos.
Una vez probado el correcto funcionamiento del Pd, para optimizar los recursos del programa, cargamos, en el
start up, las bibliotecas ms comunes que se usaran, para
evitar tener que importarlas cada vez que se quieran usar.
De este modo al arrancar Pd en tu mquina ya se cargan
automticamente.

Select: Nos acta de selector segn una condicin nu- Linux

165.6. PATCH PATRONES

Test audio/MIDI.

165.4 Introduccin rpida

311

Objeto de PDP que te crea una cuadrcula que divide la imagen.

comandos, quedando as lista para su uso.

Una vez ya tenemos el Pd estable en nuestra mquina se


procede a hacer un primer test del programa para comprobar que la conexin con nuestra tarjeta de sonido es
correcta. Este lo encontraremos en Media>test audio and
MIDI. Ah podemos generar una seal de test (un tono,
ruido rosa,) escuchndola por nuestros altavoces, comprobando as que todo funciona correctamente.
Para empezar a conocer el entorno de Pd, podemos empezar abriendo ejemplos que encontraremos en los archivos de documentacin que hay dentro de la carpeta de Pd.
All hay patchs de audio y de vdeo que sirven para familiarizarse con el programa. Cuando queramos crear nuestro propio patch, en la ventana de Pd vamos a File>New
y se nos abre la ventana donde introduciremos nuestros
objetos que conectaremos entre ellos creando as nuestra
pdp_opencv distrains.
aplicacin.

165.5 Bibliotecas pdp, pidip y


opencv
La biblioteca PDP es una coleccin de objetos que se utiliza para procesar numerosos datos. Funciona en Linux
y la mayora de objetos tambin trabajan en Mac OSX.
Una vez descargado, la instalacin en Linux se hace a travs del terminal, compilando y ejecutando el archivo de
instalacin que viene adjuntado, de la siguiente manera:
./congure
sudo make

Tambin existe otra biblioteca referente al video llamada OpenCV. Es una biblioteca abierta desarrollada por
Intel. Esta biblioteca proporciona un alto nivel de funciones de procesado de imgenes. Permite al programador crear aplicaciones en el dominio de la visin digital.
OpenCV es Open Source permitiendo as poder funcionar en muchas plataformas. Esta biblioteca nos permite
hacer operaciones bsicas, procesado de imgenes, anlisis de reconocimiento del modelo, anlisis estructural,
reconstruccin 3D, calibracin de la cmara, anlisis de
movimiento, interfaz grca y adquisicin, etc. Implementa una gran variedad de herramientas para la interpretacin de la imagen, como por ejemplo, deteccin de
facciones o anlisis de la forma (geometra, contorno que
procesa en ese instante), entre otras.

sudo make install


Cuando los datos ya estn representados como un paquete dentro de Pd, es posible empezar a manipularlos. La 165.6 Patch patrones
biblioteca PiDiP son objetos de video que completan la
coleccin de objetos de PDP. La instalacin es idntica Una buena primera toma de contacto con Pd puede ser
a la de PDP, desde el terminal ejecutamos los mismos la generacin de un tono sinusoidal. Para esto utilizare-

312

CAPTULO 165. PURE DATA


jeto que nos permite visualizar la imagen segn nuestro
sistema operativo, en Linux sera pdp_v4l (video for Linux). A este objeto tambin le conectamos otro mensaje
donde le indicamos el canal por el que queremos enviar la
informacin. Finalmente le conectaremos a [pdp_v4l] un
[metro] dndole la informacin de la periodicidad con la
que queremos que nos muestre las imgenes que la cmara est captando. Para tener continuidad de movimiento le daremos un valor estndar de 100ms. A gusto del
usuario tambin podemos girar la imagen en sentido horizontal para que el efecto generado al ver la imagen sea
de espejo. Para conseguir esto conectaremos la salida de
[pdp_v4l] al objeto [pdp_ip_lr]. Con esto ya tenemos,
en una ventana a parte, la imagen que la cmara est captando.

165.7 Vase tambin


Miller Puckette
Lenguaje de programacin visual

165.8 Material en espaol


Sistemas musicales interactivos Documentos de curso de sistemas musicales interactivos por Sergi Jord
Taller de msica electrnica Documentos del curso
de Taller de msica electrnica por Sergi Jord
Ejemplo de oscilador.

mos el objeto [osc~]. En la entrada izquierda le conectaremos un mensaje con un nmero dentro que actuar
de frecuencia de oscilacin. Su salida la enviaremos a un
multiplicador que nos convertir esta frecuencia en audible y nalmente esto lo enviamos a un convertidor digital
analgico [dac~] para poder reproducirlo por los altavoces de nuestra mquina. Una vez ya hemos creado este
patch, podemos modicar la frecuencia clicando y manteniendo pulsado el ratn encima del mensaje del nmero
y desplazando el cursor arriba abajo, aumentando y disminuyendo as el valor de la frecuencia.

Curso de introduccin a GEM Introduccin a GEM


y al live cinema por Carles Sora

165.9 Enlaces externos


puredata.info Portal ocial sobre PureData.
puredata-es Comunidad de Puredata en Castellano
IEM Institute of Electronic Music and Acoustics,
Graz. Muchos enlaces tiles (en ingls)
Miller S. Puckette homepage con una nota biogrca
y sus ocupaciones actuales (en ingls).
Pure DataBase, pdb Aqu puedes buscar objetos de
pure data (en ingls)
Footils.org Sitio muy completo con prcticas abstracciones (en ingls).

Abrir dispositivo externo. Cmara web.

Para abrir un dispositivo externo, como por ejemplo una


cmara web, deberemos escribir en un mensaje la palabra openseguido de un espacio y la ruta de donde se
encuentra este dispositivo. Este, lo conectaremos al ob-

3 Convencin Internacionale de Pd (en portugus).

Captulo 166

QuadTIN
QuadTIN es una estructura de datos en forma de rbol
ideada por Renato Pajarola, Roberto Lario y Marc Antonijuan. Dicha estructura de datos se basa en la estructura
del quadtree, pero, a diferencia de ste, los hijos de un
nodo no han de ser del mismo tamao, y ni siquiera ser
cuadrados. De esta forma, el quadTIN permite almacenar
de forma jerrquica triangulaciones irregulares.

313

Captulo 167

Query string
Query string, en espaol: cadena de consulta, este trmino generalmente se utiliza para hacer referencia a una
interaccin con una base de datos. Es la parte de una URL
que contiene los datos que deben pasar a aplicaciones web
como los programas CGI.

el valor se obtiene trs aplicar una separacin de la query


string mediante el smbolo /. De sta forma se puede trabajar con Friendly Urls siguiendo las recomendaciones
de los principales motores de bsqueda, sin necesidad de
crear una estructura de directorios en el servidor. Una
gran cantidad de sitios web utilizan esta forma de interEn los comienzos de la web las direcciones de las pginas
contenan la estructura jerrquica de los directorios del pretacin de la query string.
sitio. Por ejemplo:
www.sitiodeejemplo.net/paginaprincipal/
paginasecundaria/contenido.html

167.1 Vase tambin

Estos sitios eran estticos: a menos que el administrador


modique las pginas siempre mostraran el mismo contenido a los visitantes.
Ms tarde aparecieron los sitios dinmicos. En este caso, el servidor crea automticamente la pgina cuando el
navegante la solicita. Para ello se vale de una serie de parmetros o datos que se incluyen en la URL. stos normalmente estn compuestos por un nombre y un valor
separados por el signo igual. Un ejemplo de direccin dinmica sera:
www.sitiodeejemplo.net/pagina.php?nombredevalor1=
valor1&nombredevalor2=valor2
Otro ejemplo comn de direccin dinmica consistira en
congurar el servidor para que asigne automticamente a
un conjunto de variables predenidas los valores resultantes de la separacin de la query string usando como
smbolo de separacin de la cadena el caracter /.
www.sitiodeejemplo.net/paginaprincipal/
paginasecundaria/contenido
De esta forma y mediante la conguracin del servidor(ej.
mod rewrite en servidores web apache) se podra acceder a las tres subcadenas resultantes en nuestro ejemplo,
esto es, paginaprincipal, paginasecundaria y contenido
accediendo mediante GET a los sendos nombres de variable que se denieron en la conguracin del servidor
web. Se trata de una segunda opcin simplicada de pares
variable-valor, con la peculiraridad de que los nombres de
variable se sobreentienden y predenen en el servidor y

314

Pgina web
Web 2.0
HTML dinmico

Captulo 168

Quest3D
Quest3D es la conjuncin de un motor de videojuego con
una plataforma de desarrollo. Generalmente se usa para
arquitectura, diseo de producto, videojuegos, software
de entrenamiento y simuladores. Los datos y animaciones
son importados de paquetes CAD tales como Maya, 3D
Studio Max y AutoCAD, a Quest3D donde son utilizados
para la creacin de aplicaciones interactivas 3D en tiempo
real. Quest3D es un producto desarrollado por Act-3D
B.V. en Holanda. Su primera versin fue publicada en
septiembre del 2001.

168.1.2 Orientacin a objetos

168.1 Entorno de desarrollo

168.1.3 Editores

Una de las caractersticas ms importantantes de


Quest3D es la metodologa de programacin. De una forma totalmente diferente a la de los habituales lenguajes
de programacin, tales como el C++, el entorno de desarrollo de Quest3D es casi por completo visual. Otra caracterstica destacable es el hecho de que el programador
puede modicar la aplicacin mientras esta se ejecuta.
Esto signica que no existe compilacin de cdigo como
en los entornos de programacin habituales.

Quest3D ha evolucionado en su versin 4.0 y posteriores, permitiendo implementar aplicaciones siguiendo un


paradigma de diseo orientado a objetos.
Haciendo uso de su nuevo editor de interfaces y clases,
permite de una manera bastante intuituva el encapsulamiento de subrboles dechannelsenObjetos, que
contienen mtodos y propiedades. Esta caracterstica aumenta la potencia del entorno, permitiendo aplicaciones
mucho ms dinmicas.

El entorno de Quest3D consiste en diferentes editores especializados en la creacin de la aplicacin: Editor de


"rbol de Channels, modicacin de caractersticas de
los objetos 3D (modelos 3D), animaciones, programacin High Level Shading Language (HLSL) y programacin LUA Script entre otros.

168.1.4 Publicacin

Las aplicaciones nalizadas pueden ser publicadas en diferentes formatos, para permitir su visualizacin en diferentes medios: Fichero ejecutable standalone(plata168.1.1 Lgica de las aplicaciones
forma Microsoft Windows) y visor WEB basado en control ActiveX. Los navegadores soportados en la actualiLas aplicaciones Quest3D se desarrollan conectando dad son Internet Explorer y FireFox.
componentes funcionales (cajas negras), denominadas
Channels. LosChannelsvinculados componen una
estructura de rbol, que representa la estructura del pro- 168.2 Requerimientos del sistema
grama que se implementa. El rbol de cajas negras se ejecuta por completo una vez (al menos) por frame, invocanAlgunas funcionalidades del motor 3D requieren hardwado a cadachannel. Lo que se obtiene como resultado
re ms especco.
es una aplicacin 3D en tiempo real.
Como no hay fase de compilacin, o interpretacin de un
lenguaje de scripting, ya que los Channelsson cajas
con su cdigo precompilado (implementadas en Dynamic
Link Libraries), el rendimiento de las aplicaciones es el
mismo en fase de diseo que en ejecucin, caracterstica muy apreciada cuando se desarrollan aplicaciones en
tiempo real.
315

Windows 2000, Windows XP, Windows Vista (64


or 32 bit) y DirectX 9
256 MB RAM
Procesador de 1Ghz
Tarjeta grca compatible con DirectX

316
32 MB de memoria grca
400MB de espacio en disco duro

168.3 Licencias
Se pueden adquirir diferentes licencias para el uso tanto
comercial como educacional.

168.4 Aplicaciones
Realidad virtual, Videojuegos, visualizacin arquitectnica, serious games, simuladores, TV y cine.

168.5 Referencias
DevMaster.net Quest3D specications
Gamasutra Rapid gameplay iterations are crucial
to me, so I use Quest3D for everything else., Dylan
Fitterer in The road to IGF

168.6 Enlaces externos


Quest3D website

CAPTULO 168. QUEST3D

Captulo 169

Quine (programa)
En informtica, un quine (pronunciado kwain) es
un programa (un tipo de Metaprogramacin) que produce su cdigo fuente como su salida nica. Para diversin,
algunos hackers intentan desarrollar el quine ms corto
posible en cualquier lenguaje de programacin.

args) { string s = using System;{0}namespace


quine{0}{2}{0}{1}class
Program{0}
{1}{2}{0}{1}{1}[STAThread]{0}{1}{1}static void
Main(string[]
args){0}{1}{1}{2}{0}{1}{1}{1}
string s = {4}{6}{4};{0}{1}{1}{1}Console.Write(s,
Environment.NewLine,
{4}{5}t{4},
{4}{2}
Nota: simplemente abriendo el archivo fuente del progra{4},
{4}{3}{4},
{4}{5}{4}{4},
{4}{5}{5}{4},
ma e imprimiendo el contenido se considera hacer trams);{0}{1}{1}{3}{0}{1}{3}{0}{3}"; Console.Write(s,
pa.
Environment.NewLine, "\t, "{", "}", "\"", "\\", s); } } }
Los quines se llaman as por Willard Van Orman Quine,
que hizo un estudio extensivo de autoreferencia indirecta
y sugiri un caso famoso de paradoja sin autoreferencia 169.1.3 Scheme
directa:Da como resultado un enunciado falso si es precedido por su citada como resultado un enunciado falso ((lambda (x) (list x (list (quote quote) x))) (quote (lambda
si es precedido por su cita.
(x) (list x (list (quote quote) x)))))

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 -> Printf.printf "%s %Ss s) "(fun s -> Printf.printf
Otro (este debe ser una sola lnea, y supone que el compi- \"%s %S\" s s)"
lador ejecuta en una mquina que usa el cdigo 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 an ms corto (aunque no es cdigo C99 de ISO correcto):
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)

169.1.2 C#

Y otro que comparte los caracteres ltimos con la anterior (solamente para mostrar que asignaciones mltiples
Nota: Debe ser una sola lnea. Los saltos de lnea se agre- no salva mecanografa):
garon para hacerlo ms fcil de leer.
b,g,p,s='\\','"','%',"b,g,p,s='%s%s','%s','%s',%s%s%s;print
using
gram

System; namespace quine { class Pro- s%s(b,b,g,p,g,s,g,p)";print s%(b,b,g,p,g,s,g,p)


{ [STAThread] static void Main(string[]
317

318

CAPTULO 169. QUINE (PROGRAMA)

169.1.7 JavaScript

169.1.11

Brainfuck

Nota: Debe ser una sola lnea. Los cortes de lnea se agreunescape(q="unescape(q=%22*%22).replace('*',q)").replace('*',q)
garon para hacerlo ms fcil de leer.

->+>+++>>+>++>+>+++>>+>++>>>+>+>+>++>+>>>>+++>+>>++>+
+>>>>+++>+>>>>++>++>>>>+>>++>+>+++>>>++>>++++++>>+>>+
169.1.8 Perl
>>>++>>++>>+>>++>+>+++>>>++>>+++++++++++++>>+>>++>+>+
++>+>>>>+++>>+++++>>>>++>>>>+>+>++>>+++>+>>>>+++>+>>>
$_=q{$_=q{Q};s/Q/$_/;print};s/Q/$_/;print
++>+>++>++>>>>>>++>+>+++>>>>>+++>>>++>+>+++>+>+>++>>>
+>>>+>>++>+>++++++++++++++++++>>>>+>+>>>+>>++>+>+++>>
El ms corto conocido:
>>+++>>++++++>>>+>++>>+++>+>+>++>+>+++>>>>>+++>>>+>+>
>>+>>++>+>>>>+++>>++++>>+>+++>>>>>>++>+>+++>>+>++>>>>
open+0;print<0>
[[->>+<<]]<+]+++++[>+++++++++<]>.[+]>>[<<+++++++[Y una combinacin de Perl y script de shell:
>+++++++++<]>.------------------->-[perl
-le
'$n=q{perl
-le <.<+>>]<[+]<+>>>]<<<[-[-[-[>>+<++++++[a$n=q{$x};($_=$n)=~s/\141/\47/g;s/\$x/$n/;printa};($_=$n)=~s/\141/\47/g;s/\$x/$n/;print'
>+++++<]]>++++ ++++++++++<]>+++<]++++++[>+++++++<]>+<<<-[->>>++<<<]>[->>.<<]<<]

169.1.9 BASIC

169.1.12

10 LIST

169.1.10

Pascal

const
a='const
a=';b='begin
write(a,#39,a,#39#59#98#61#39,b,#39#59#10,b)
end.';
begin write(a,#39,a,#39#59#98#61#39,b,#39#59#10,b)
end.

169.1.13

HQ9+

DOS Batch

@echo o %1 %2 call %0 goto e %% call %0 goto


e %%3 echo.%%4 echo :f goto f :e echo.%4@echo
o echo.%4%31 %32 echo.%4call %30 goto e
%3%3 echo.%4call %30 goto e %3%33 echo.%3%34
echo.%4echo :f echo.%4goto f echo.%4:e :f

Comentario 1: En el caso de una implementacin DOS


de Pascal, la salida de la pantalla puede parecer bastante desorientadora. En ese caso, sera apropiado sustituir 169.1.14 PHP
ambas instancias de "#10con "#13#10e insertar un
<? $a='chr(60).chr(63).chr(10).chr(36).chr(97).chr(61).chr(39).$a.chr(39).
CR antes del LF al n de la primera lnea.
$a;".chr(10).chr(63).chr(62)';
echo
Comentario 2: El programa se puede hace todava ms
chr(60).chr(63).chr(10).chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59)
corto porque ambas instancias de ") end.se pueden sus$a;".chr(10).chr(63).chr(62); ?> <? $a='<? $a=2; echo
tituir con ")end.(aunque le hace difcil de leer). Se puede
str_replace(1+1,chr(39).$a.chr(39),$a);
?>';
echo
acortar ms por borrar ambas instancias de "#10y escristr_replace(1+1,chr(39).$a.chr(39),$a); ?>
biendo el programa en una sola lnea en vez de dos lneas.
Despus de los cambios, el programa parecer como sigue:
const
a='const
a=';b='begin
wri- 169.1.15 PL/I
te(a,#39,a,#39#59#98#61#39,b,#39#59,b)end.';begin
write(a,#39,a,#39#59#98#61#39,b,#39#59,b)end.
Nota: Este es el quine de PL/I ms pequeo posible que
compila usando el compilador OS PL/I V2.3.0, pero reOtro (Borland Pascal and Free Pascal):
quiere un margen izquierdo de 1 y la opcin COMPILE
const
a='const
a=;begin
wri- para parar una cantidad signicativo de errores):
te(copy(a,1,8),#39,a,#39,copy(a,9,99))
end.';begin
%dcl z%z='put edit';proc options(main;q=''''put list(m;do
write(copy(a,1,8),#39,a,#39,copy(a,9,99)) end.
i=1,2;z(q)skip;do j= 1to 78c=substr(m(i),j;if c=q
Otro (Borland Pascal and Free Pascal):
z(c;z(c;end;z(q',';dcl(c,q)char,m(2)char(99)init( '%dcl
const
a:string='const
a:string=;begin
in- z%z=''put edit'';proc options(main;q=''''''''put list(m;do
sert(#39+a+#39,a,16);write(a)
end.';begin
in- i=1,2;z(q)skip;do j=', '1to 78c=substr(m(i),j;if c=q
sert(#39+a+#39,a,16);write(a) end.
z(c;z(c;end;z(q'','';dcl(c,q)char,m(2)char(99)init(',

169.2. ENLACES EXTERNOS

169.1.16

PostScript

(dup == {dup cvx exec} pop 8 12 getinterval =) dup cvx


exec

169.1.17

Visual FoxPro

CLEAR SET TALK OFF SET TEXTMERGE ON


\CLEAR \SET TALK OFF \SET TEXTMERGE ON

169.2 Enlaces externos


La pgina de los quines (por Gary P. Thompson)
Los programas quine al wiki del Portland Pattern
Repository
Una pgina sobre los quines
Unos participantes en un concurso de hacer quines
en JavaScript
Un quine HTML con uso de CSS apegado a la norma, incluyendo resaltado de la sintaxis
Palndromo quine": una pgina web que es lo mismo que su cdigo fuente, lo mismo de izquierda a
derecha que de derecha a izquierda, los mismo de
arriba para abajo que de abajo para arriba.

319

Captulo 170

Rebanamiento esttico
El rebanamiento esttico es una tcnica en el rea de
programacin de computadoras conocida como mantenimiento de software. Es usada para identicar todo el
cdigo de programa que puede afectar de algn modo el
valor de una variable dada.
Una descripcin breve de su clculo es el siguiente: Basado en la denicin original de Mark Weiser una rebanada
esttica de programa (S) consiste de todas las sentencias
en un programa P que pueden afectar el valor de la variable v en algn punto p. La rebanada es denida por un
criterio de rebanamiento C=(x,V), donde x es una sentencia en un programa P y V es un subconjunto de variables
en P. Una rebanada esttica incluye todas las sentencias
que afectan la variable v para un conjunto de todos los
posibles inputs en el punto de inters. Las rebanadas estticas son computadas encontrando conjuntos consecutivos de sentencias indirectamente relevantes, de acuerdo
a los datos y dependencias de control.

170.3 Referencias
Meilir Page-Jones, "The Practical Guide to Structured Systems Design", Yourdon Press,1980, ISBN 0917072-17-0

170.4 Enlaces externos

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);
El siguiente programa es un rebanamiento vlido del anterior, respecto al criterio (write(suma),{suma}):
int i; int suma = 0; for(i = 0; i < N; ++i) { suma = suma
+ i; } write(suma);
De hecho, la mayora de tcnicas de rebanamiento esttico, incluida la propia tcnica de Weiser, tampoco incluiran la sentencia write(suma), ya que en la sentencia
write(suma), el valor de suma no es afectado por la sentencia en s.

170.2 Vase tambin


Software
CMM
320

Tufts University: Ensayo sobre Mantenimiento como parte del Ciclo de Vida del Software (en ingls)

Captulo 171

Recolector de basura
Compactar espacios de memoria libres y consecutivos entre s.
Llevar cuenta de qu espacios estn libres y cules
no.
Generalmente, el programador dispone de una biblioteca
de cdigo que se encarga de estas tareas. No obstante, el
propio programador es responsable de utilizar adecuadamente esta biblioteca.
Esto tiene la ventaja de que se hace un uso eciente de la
memoria, es decir, los espacios de memoria quedan libres
cuando ya no son necesarios. No obstante, este mecanismo explcito de gestin de memoria es propenso a errores. Por ejemplo, un programador puede olvidar liberar
la memoria de manera que, tarde o temprano, no quede
memoria disponible, abortando la ejecucin del programa.

Recoleccin de basura informtica. El espacio de memoria se va


llenando con diferentes objetos(representados con colores),
tambin pueden destruirse algunos de ellos, dejando huecos
en el espacio de memoria. Cuando ya no queda espacio disponible, o cuando lo decide la rutina de recoleccin de basura, la
memoria escompactada, colocando todos losobjetosque
se estn usando al principio, y consolidando todos los huecos
de memoria al nal, quedando as una gran rea de memoria
Como alternativa es necesaria una gestin implcita de
disponible para la futura creacin de objetos.

memoria, con lo que el programador no es consciente de


Un recolector de basura (del ingls garbage collector) es la reserva y liberacin de memoria. Esto es obligado en
un mecanismo implcito de gestin de memoria imple- algunos lenguajes de programacin en los que no se mamentado en algunos lenguajes de programacin de tipo neja el concepto de memoria. Por ejemplo, en lenguajes
declarativos como Lisp o Prolog.
interpretado o semiinterpretado.

171.1 Breve resea histrica

171.3 Cmo funciona

El concepto de recoleccin de basura fue inventado por Cuando un lenguaje dispone de recoleccin de basura, el
John McCarthy en 1958 para evitar la gestin manual de programador no tiene que invocar a una subrutina para
memoria en el lenguaje Lisp.
liberar memoria. La reserva de memoria tambin es ms
o menos automtica sin la intervencin del programador.
Por ejemplo:

171.2 Contexto

Cualquier programa informtico hace uso de una cierta


cantidad de memoria de trabajo puesta a su disposicin
por el sistema operativo. Esta memoria tiene que ser gestionada por el propio programa para:
Reservar espacios de memoria para su uso.
Liberar espacios de memoria previamente reservados.
321

En los lenguajes orientados a objetos: se reserva memoria cada vez que el programador crea un objeto,
pero ste no tiene que saber cunta memoria se reserva ni cmo se hace esto.
En los lenguajes declarativos: cada vez que se construye una expresin se reserva memoria (de una manera inteligente), pero el programador no es consciente de ello.

322

CAPTULO 171. RECOLECTOR DE BASURA

Cuando se compila el programa, automticamente se in- 171.5 Cmo se implementa


cluye en ste una subrutina correspondiente al recolector
de basura. Esta subrutina tambin es invocada peridica- Existe la posibilidad de implementar la recoleccin de bamente sin la intervencin del programador.
sura como una biblioteca de cdigo ms, pero por norma
El recolector de basura es informado de todas las reservas general no es as. El propio diseo de ciertos lenguajes de
de memoria que se producen en el programa. Adems, el programacin hace necesaria la existencia del recolector
compilador colabora para que sea posible llevar una cuen- de basura. Para poder implementar estos lenguajes se reta de todas las referencias que existen a un determinado quieren dos actuaciones:
espacio de memoria reservado.
Que el compilador proporcione la informacin neCuando se invoca el recolector de basura, recorre la lista
cesaria para el recolector de basura (el contador de
de espacios reservados observando el contador de refereferencias).
rencias de cada espacio. Si un contador ha llegado a cero
signica que ese espacio de memoria ya no se usa y, por
tanto, puede ser liberado.
Naturalmente, este proceso consume un cierto tiempo en
el que no se hace nada verdaderamente til para el propsito del programa. Por tanto, no puede ser invocado con
demasiada frecuencia.
En consecuencia, el nico inconveniente a este mecanismo es determinar cundo se tiene que ejecutar el recolector de basura. Existen varios algoritmos para hacerlo,
pero el ms eciente es el primero de ellos:

Que el entorno de ejecucin o mquina virtual implemente la subrutina del recolector de basura.

171.6 Ejemplos de lenguajes con


recolector de basura
171.7 Vase tambin
Conteo de referencias

Esperar a que no quede memoria libre, y entonces,


ejecutar el recolector de basura.
Fijar un umbral de ocupacin de la memoria libre
y ejecutar el recolector de basura cuando se supere
dicho umbral.
Ejecutar el recolector de basura a intervalos regulares (no siempre es posible).
Ejecutar el recolector de basura justo antes de cada
reserva de memoria.
Permitir al programador que invoque explcitamente
al recolector de basura cuando quiera.

171.4 Ventajas y desventajas


Las ventajas y desventajas de este mecanismo de gestin
de memoria son las opuestas al mecanismo explcito:
El programador no puede cometer errores y queda
liberado de la tediosa tarea de gestionar la memoria.
La memoria permanece retenida durante ms tiempo del estrictamente necesario.
El recolector de basura tarda cierto tiempo en hacer su tarea y produce pausas que pueden hacer la
tcnica incompatible con sistemas de tiempo real.

Fuga de memoria

171.8 Enlaces externos


The Memory Management Reference (en ingls)
Recolector de basura para C y C++ (en ingls)

Captulo 172

Recursin

Imagen recursiva formada por un tringulo. Cada tringulo est compuesto de otros ms pequeos, compuestos a su vez de la
misma estructura recursiva.

Para que se entienda mejor a continuacin se exponen


algunos ejemplos:
Factorial: Se desea calcular n! (el factorial de n ,
que se dene como el producto de todos los enteros
positivos de 1 a n ). Se puede denir el problema de
forma recurrente como n(n1)! ; como (n1)! es
menor que n! podemos aplicar induccin por lo que
disponemos del resultado. El caso base es 0! que es
1 .

Anuncio de cacao con una imagen recursiva. La mujer muestra


un paquete idntico al del propio anuncio, conteniendo as a otra
mujer que muestra otro paquete ms pequeo, de forma recursiva.

Algoritmo de ordenacin por fusin: Sea v un vector


de n elementos, podemos separar el vector en dos
mitades. Estas dos mitades tienen tamao n/2 por
lo que por induccin podemos aplicar la ordenacin
en estos dos subproblemas. Una vez tenemos ambas
mitades ordenadas simplemente debemos fusionarlas. El caso base es ordenar un vector de cero o un
elemento, que est trivialmente ordenado y no hay
que hacer nada.

Recurrencia, recursin o recursividad es la forma en


la cual se especica un proceso basado en su propia denicin. Siendo un poco ms precisos, y para evitar el
aparente crculo sin n en esta denicin:
Un problema que pueda ser denido en funcin de su tamao, sea este N, pueda ser dividido en instancias ms
pequeas (< N) del mismo problema y se conozca la solucin explcita a las instancias ms simples, lo que se conoce como casos base, se puede aplicar induccin sobre
las llamadas ms pequeas y suponer que estas quedan
resueltas.

En estos ejemplos podemos observar como un problema


se divide en varias (una o ms) instancias del mismo problema, pero de tamao menor gracias a lo cual se puede
aplicar induccin, llegando a un punto donde se conoce
el resultado (el caso base).

323

324

CAPTULO 172. RECURSIN

Nota: aunque los trminosrecursinyrecursividad 172.1.3 Constantes


son ampliamente empleados en el campo de la informtica, el trmino correcto en castellano es recurrencia * [cita La razn urea se puede denir como sigue: = 1+ 1 =
1
requerida]. Sin embargo este ltimo trmino es algo ms 1 +
, como una fraccin continua en que todos
1
1+
1+ 1
especco. Vase relacin de recurrencia.
1+...
los nmeros son unos.

x1
da lugar
De forma similar, la identidad x = 1 + 1+
x
172.1 Recursin en matemticas
a una denicin como fraccin continua de cualquier raz
x1

cuadrada:* [3] x = 1 +
x1
172.1.1 Conjuntos denidos de forma re2+
x1
currente
2+
.
2 + ..
Un ejemplo de conjunto denido de forma recurrente es
el de los nmeros naturales, es decir, el conjunto de los
nmeros enteros no negativos:* [1]

172.1.4 Resolucin de problemas

1. 0 pertenece a .
2. Si n pertenece a , entonces n + 1 pertenece a .
3. Si x verica las anteriores condiciones, entonces x
est incluido en * [cita requerida].

172.1.2

Resolucin de ecuaciones homogneas de primer grado,


segundo orden:
a) Se pasan al primer miembro los trminos an , an1
, an2 , los cuales tambin podran gurar como an+2 ,
an+1 , an
2

Funciones denidas de forma re- b) Se reemplaza an por r , an1 por r y an2 por 1
, quedando una ecuacin de segundo grado con races
currente
reales y distintas r1 y r2 .

Aquellas funciones cuyo dominio es un conjunto a lo ms c) Se plantea a = u r1 n + v r2 n


enumerable * [2] pueden ser denidas de forma recurren- d) Debemos tener como dato los valores de los dos prite.
meros trminos de la sucesin: A0 = k y A1 = k .
Un ejemplo conocido es la denicin recurrente de la fun- Utilizando estos datos ordenamos el sistema de 2x2:
cin factorial n!:
{
n! =

si n = 0 1
si n 1 n (n 1)!

{
u+v =k
u r1 + u r2 = k

Veamos cmo se usa esta denicin para hallar el valor La resolucin de este sistema nos da como resultado los
valores u0 y v0 , que son nmeros reales conocidos.
del factorial de 3:
e) La solucin general es:
3! = 3 (3 1)!
= 3 2!
= 3 2 (2 1)!
= 3 2 1!
= 3 2 1 (1 1)!
= 3 2 1 0!
=3211

an = u0 r1 n + v0 r2 n

172.2 Recursin en informtica

En programacin, un mtodo usual de simplicacin de


un problema complejo es la divisin de este en subproblemas del mismo tipo. Esta tcnica de programacin se
Otros ejemplos de funciones y sucesiones matemticas
conoce como divide y vencers y es el ncleo en el didenidas de forma recursiva son:
seo de numerosos algoritmos de gran importancia, as
Sucesin de Fibonacci f(0)= 1, f(1) = 1; f(n) = como tambin es parte fundamental de la programacin
dinmica.
f(n1) + f(n2) para n 2.
=6

Nmeros de Catalan C(2n, n)/(n+1)


Funcin de Ackermann

El ejemplo del clculo recursivo del factorial de un nmero llevado al campo de la programacin, en este ejemplo
C++:

172.5. REFERENCIAS
int factorial(int x) { if (x > 1 && x < 2) return 1; //
Cuando 1 < x < 2 devolvemos 1 puesto que 0! = 1 y 1!
= 1 else if (x < 0) return 0; // Error no existe factorial de
nmeros negativos return x * factorial(x - 1); // Si x >= 2
devolvemos el producto de x por el factorial de x - 1 }
Este ejemplo est basado en el lenguaje de programacin
Pascal:
Proc Factorial(x:Entero):Entero Si (x > 1 Y x < 2)
Devolver 1 ' Cuando x sea mayor que 1 y menor que 2
Devolver 1. Si (x < 0) Devolver 0 ' Cuando x sea menor
a 0, devolver 0 Devolver x * Factorial(x - 1) ' Si x igual o
mayor que 2 devolvemos el producto de x por el factorial
de x - 1 FinProc
El seguimiento de la recursividad programada es casi
exactamente igual al ejemplo antes dado, para intentar
ayudar a que se entienda mejor se ha acompaado con
muchas explicaciones y con colores que diferencia los
distintos sub-procesos de la recursividad.
X = 3 //Queremos 3!, por lo tanto X inicial es 3 X >= 2
-> return 3*factorial(2); X = 2 //Ahora estamos solicitando el factorial de 2 X >= 2 -> return 2*factorial(1);
X = 1 // Ahora estamos solicitando el factorial de 1 X <
2 -> return 1; [En este punto tenemos el factorial de 1
por lo que volvemos marcha atrs resolviendo todos los
resultados] return 2 [es decir: return 2*1 = return 2*factorial(1)] return 6 [es decir: return 3*2 = return 3*factorial(2)*factorial(1)] // El resultado devuelto es 6

325
Algoritmo recursivo
Fractal
Sistema-L
Torres de Hani
Relacin de recurrencia

172.5 Referencias
[1] Algunos autores consideran que los nmeros naturales son
los nmeros enteros positivos, es decir, excluyen el 0 de
este conjunto. En ese caso, basta sustituir la lnea que dice
0 pertenece a por 1 pertenece a .
[2] Nociones de espacios normados , Cotlar y Cignoli, Eudeba, Buenos Aires
[3] Ben Thurston,Estimating square roots, generalized continued fraction expression for every square root, The Ben
Paul Thurston Blog
[4] Hunter, David (2011). Essentials of Discrete Mathematics.
Jones and Bartlett. p. 494.
[5] Daniel Rodrguez Herrera (29 de julio de 2009). Qu es
la recursividad? Qu es la recursividad? Qu es la recursividad?.... Libertad Digital. Consultado el 20 de enero
de 2013.

Algoritmo implementado en el lenguaje Prolog:


fact(0,1):-!. fact(N,F):-N1 is N-1,fact(N1,F1),F is N*F1.

172.6 Enlaces externos


Ejemplo de curvas recursivas fractales

172.3 Humor recursivo


La recursividad se emplea a menudo de forma humorstica en textos informticos, loscos o matemticos. No
es raro que un libro de texto de estas disciplinas incluya
en su glosario una entrada similar a esta:
Recursividad, vase Recursividad.* [4]
En el buscador Google, al buscar recursion, el sitio sugiere Quiz quisiste decir: recursion.* [5]
Un chiste informtico dice as: Para entender la recursividad, debes entender la recursividad.* [4] En la informtica tambin es comn la eleccin de acrnimos recursivos. PHP son las iniciales de PHP Hypertext Preprocessor (Preprocesador de Hipertexto PHP), WINE son las
de WINE Is Not an Emulator (WINE no es un emulador)
y GNU signica GNU's Not Unix (GNU no es Unix).

172.4 Vase tambin


Recursin (ciencias de computacin)

Captulo 173

Refactorizacin
La refactorizacin (del ingls refactoring) es una tcnica de la ingeniera de software para reestructurar un
cdigo fuente, alterando su estructura interna sin cambiar
su comportamiento externo.

nombre de una variable para que sea ms signicativo,


como una sola letra 't' a 'tiempo'. Una refactorizacin
ms compleja es transformar el trozo dentro de un bloque en una subrutina. Una refactorizacin todava ms
compleja es remplazar una sentencia condicional if por
polimorsmo.

173.1 Refactorizacin de cdigo

Aunque la limpieza de cdigo se lleva realizando desde


hace dcadas, el factor clave de la refactorizacin es realizar de manera intencionada la limpieza separndola de
la adicin de funcionalidad nueva, usando un catlogo conocido de mtodos tiles de refactorizacin, para despus
comprobar el cdigo ejecutando las pruebas unitarias, sabiendo que cualquier cambio en el comportamiento signica que se ha introducido un error.

En ingeniera del software, el trmino refactorizacin se


usa a menudo para describir la modicacin del cdigo
fuente sin cambiar su comportamiento, lo que se conoce
informalmente por limpiar el cdigo. La refactorizacin
se realiza a menudo como parte del proceso de desarrollo
del software: los desarrolladores alternan la insercin de
nuevas funcionalidades y casos de prueba con la refactorizacin del cdigo para mejorar su consistencia interna
y su claridad. Los tests aseguran que la refactorizacin no
cambia el comportamiento del cdigo.

La refactorizacin es un aspecto importante de la


programacin extrema.
El libro de Martin Fowler Refactoring es la referencia clsica. Aunque la refactorizacin de cdigo se ha llevado a
cabo de manera informal durante aos, la tesis doctoral
de William F. Opdyke (1993) es el primer trabajo conocido que examina especcamente esta tcnica. Todos
estos recursos proporcionan un catlogo de mtodos habituales de refactorizacin. Un mtodo de refactorizacin
tiene una descripcin de cmo aplicar el mtodo e indicaciones sobre cundo debera (o no debera) aplicarse.

La refactorizacin es la parte del mantenimiento del cdigo que no arregla errores ni aade funcionalidad. El objetivo, por el contrario, es mejorar la facilidad de comprensin del cdigo o cambiar su estructura y diseo y
eliminar cdigo muerto, para facilitar el mantenimiento
en el futuro. Aadir nuevo comportamiento a un programa puede ser difcil con la estructura dada del programa,
as que un desarrollador puede refactorizarlo primero pa- La refactorizacin es un concepto tan importante que ha
ra facilitar esta tarea y luego aadir el nuevo comporta- sido identicado por David A. Wheeler como una de
miento.
las ms importantes innovaciones en el campo del softEl trmino se cre como analoga con la factorizacin de ware.* [1]
nmeros y polinomios. Por ejemplo, x2 1 puede ser factorizado como (x + 1)(x 1) , revelando una estructura
interna que no era visible previamente (como las dos ra173.2 Refactorizacin de otros texces en 1 y +1). De manera similar, en la refactorizacin
del software, el cambio en la estructura visible puede fretos
cuentemente revelar la estructura interna ocultadel
cdigo original.
El trmino refactorizacin se origin en el mbito de la
La refactorizacin debe ser realizada como un paso separado, para poder comprobar con mayor facilidad que no
se han introducido errores al llevarla a cabo. Al nal de
la refactorizacin, cualquier cambio en el comportamiento es claramente un bug y puede ser arreglado de manera
separada a la depuracin de la nueva funcionalidad.

programacin de ordenadores, pero el concepto se ha


aplicado a la modicacin de cualquier texto.

En los sitios Wiki, la refactorizacin se reere al proceso


de reescribir y reorganizar el texto para abreviarlo preservando su contenido. Se aplica en especial en las discusiones, que de esta manera pueden ser hechas accesibles para
Un ejemplo de una refactorizacin trivial es cambiar el personas que estn interesadas en los argumentos ofreci326

173.5. ENLACES EXTERNOS


dos en la discusin y en la informacin que se obtiene de
ella, ms que en la propia historia de la discusin. Puede
ser difcil refactorizar de tal manera que estn de acuerdo
todos los participantes de la discusin.

173.3 Etimologa
El primer uso conocido del trmino refactorizacin en
la literatura publicada se encuentra en el artculo Refactoring: An Aid in Designing Application Frameworks
and Evolving Object-Oriented Systems, Proceedings of the
Symposium on Object Oriented Programming Emphasizing 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 trmino refactorizacin como la tcnica que dene se usaban ya con toda seguridad
antes.

173.4 Referencias
[1]
[2]
[3]

173.5 Enlaces externos


Libro de Martin Fowler' sobre refactorizacin

327

Captulo 174

Reexin (informtica)
En informtica, reexin (o reexin computacional) es
la capacidad que tiene un programa para observar y opcionalmente modicar su estructura de alto nivel.

174.2 Ejemplos
174.2.1

Python

Normalmente, la reexin es dinmica o en tiempo de


ejecucin, aunque algunos lenguajes de programacin # sin reexin Foo().bar() # usando reexin. gepermiten reexin esttica o en tiempo de compilacin. tattr(globals()['Foo'](), 'bar')()
Es ms comn en lenguajes de programacin de alto nivel
ejecutndose sobre una mquina virtual, como Smalltalk
o Java, y menos comn en lenguajes como C.

174.2.2

C#

En un sentido ms amplio, la reexin es una actividad


computacional que razona sobre su propia computacin. // Con reexin // Usando GetType para obtener
Cuando el cdigo fuente de un programa se compila, nor- informacin del tipo: int i = 24; System.Type tipo
malmente se pierde la informacin sobre la estructura = i.GetType(); System.Console.WriteLine(tipo); El
del programa conforme se genera el cdigo de bajo nivel resultado sera: System.Int32
(normalmente lenguaje ensamblador). Si un sistema permite reexin, se preserva la estructura como metadatos
en el cdigo generado. Dependiendo de la implementacin, el cdigo con reexin tiende a ser ms lento que el 174.3 Vase tambin
que no lo tiene.
En los lenguajes que no distinguen entre tiempo de ejecucin y tiempo de compilacin (como las distintas variantes de Lisp), no hay diferencia entre compilacin o
interpretacin de cdigo y reexin.

174.1 Implementacin
Un lenguaje con reexin proporciona un conjunto de caractersticas disponibles en tiempo de ejecucin que, de
otro modo, seran muy difcilmente realizables en un lenguaje de ms bajo nivel. Algunas de estas caractersticas
son las habilidades para:
Descubrir y modicar construcciones de cdigo
fuente (tales como bloques de cdigo, clases, mtodos, protocolos, etc.) como objetos decategora
superioren tiempo de ejecucin.
Convertir una cadena que corresponde al nombre
simblico de una clase o funcin en una referencia
o invocacin a esa clase o funcin.
Evaluar una cadena como si fuera una sentencia de
cdigo fuente en tiempo de ejecucin.
328

Lenguajes de programacin con tipos dinmicos


Metaprogramacin

Captulo 175

Relacin de compresin (informtica)


En la compresin digital, la relacin de compresin
(RC) indica en qu proporcin ha sido reducida la informacin. Por ejemplo, un RC de 10:1 indica que por cada
10 bits del archivo informtico original solamente tenemos 1 bit en el chero comprimido, es decir, el tamao
del chero se habr reducido en 10 veces.

175.0.1

Vase tambin

Compresor digital

329

Captulo 176

Resolucin de problemas de programacin


La resolucin de un problema mediante un ordenador periencia del experto del dominio para entender el probleconsiste en el proceso que a partir de la descripcin de un ma. Al nal, si se quiere llegar a una solucin satisfactoria
problema, expresado habitualmente en lenguaje natural y es necesario que:
en trminos propios del dominio del problema, permite
desarrollar un programa que resuelva dicho problema.
El problema est bien denido con el mximo deEste proceso exige los siguientes pasos:
talle
Las especicaciones de las entradas y salidas del
problema, deben ser descritas tambin en detalle:

Anlisis del problema.


Diseo o desarrollo de un algoritmo.
Transformacin del algoritmo en un programa (codicacin).

Qu datos son necesarios para resolver el problema?

Ejecucin y validacin del programa.

Qu informacin debe proporcionar la resolucin del problema?

Los dos primeros pasos son los ms difciles del proceso.


Una vez analizado el problema y obtenido un algoritmo
que lo resuelva, su transformacin a un programa de ordenador es una tarea de mera traduccin al lenguaje de
programacin deseado.

176.1 Anlisis del problema informtico

176.2 Diseo del algoritmo


Un algoritmo consiste en una especicacin clara y concisa de los pasos necesarios para resolver un determinado
problema, pero para poder disear algoritmos es necesario disponer de una notacin, que llamaremosnotacin
algortmica, que permita:

Cuando un usuario plantea a un programador un problema que resolver mediante su ordenador, por lo general
ese usuario tendr conocimientos ms o menos amplios
sobre el dominio del problema, pero no es habitual que
tenga conocimientos de informtica. Por ejemplo, un contable que necesita un programa para llevar la contabilidad
de una empresa ser un experto en contabilidad (dominio del problema), pero no tiene por qu ser experto en
programacin.
Del mismo modo, el informtico que va a resolver un determinado problema puede ser un experto programador,
pero en principio no tiene por qu conocer el dominio
del problema; siguiendo el ejemplo anterior, el informtico que hace un programa no tiene por qu ser un experto
en contabilidad.

Describir las operaciones puestas en juego (acciones, instrucciones, comandos,...)


Describir los objetos manipulados por el algoritmo
(datos/informaciones)
Controlar la realizacin de las acciones descritas, indicando la forma en que estas se organizan en el
tiempo

Para poder describir cualquier tipo de accin de las que


intervienen en un algoritmo, diversos autores proponen el
uso de un conjunto de construcciones lgicas (secuencia,
decisin e iteracin) con las que es posible escribir cualquier programa. Lo que sigue a continuacin es la desPor ello, al abordar un problema que se quiere resolver cripcin de las diferentes construcciones disponibles para
mediante un ordenador, el programador necesita de la ex- el diseo de algoritmos.
330

176.2. DISEO DEL ALGORITMO

176.2.1

Acciones elementales

331

176.2.5 Composicin condicional mltiple

Se entiende por acciones elementales aquellas que el or- Tambin es posible que a la hora de especicar la ejecucin de una accin haya que escoger sta entre varias
denador es capaz de realizar y que sern de dos tipos:
dependiendo del valor de una determinada variable (o indicador). Este caso se expresa del siguiente modo:
Aritmtico lgicas: Operaciones que, a partir de
unos determinados datos, realizan un clculo arit- Segn Indicador Hacer Caso Valor 1: Accin 1; Caso
mtico (suma, resta, multiplicacin,...) o un clculo Valor 2: Accin 2; ... Caso Valor n: Accin n; [De Otro
lgico (mayor que, menor que, igual que,...).Las pri- Modo: Accin X;] FinSegun
meras devuelven un valor numrico (4, 5.67,...) y En esta construccin Indicador debe tener un determilas segundas un valor lgico (verdadero o falso).
nado valor que en caso de coincidir con alguno de los
n valores provocar la ejecucin de la accin 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 especicados se ejecutar la Accin X. No
trada) y guardar los resultados de dicho tratamiento tiene por qu haber una Accin X para cuando el Indicador' no coincida con ninguno de los n valores; en ese
(las de salida).
caso, si el Indicador' no coincide con ningn valor no se
ejecutara ninguna accin.

176.2.2

Secuencia de acciones elementales

Al igual que en los casos anteriores, todas las acciones que


aparecen en esta estructura (Accin 1, Accin 2,..., Accin
Cuando en un algoritmo se deben ejecutar varias accio- n y Accin X) pueden referirse a una nica accin o a un
nes sucesivamente, stas se describen una detrs de otra conjunto de ellas.
segn el orden en que deban ejecutarse. Si se desea se
puede emplear algn tipo de smbolo para separar dos acciones consecutivas. En el siguiente ejemplo se muestra 176.2.6 Composicin iterativa o bucle
la descripcin de n acciones separadas por punto y coma
(smbolo que habitualmente se emplea como separador). Cuando una accin o conjunto de acciones debe ejecutarse varias veces se recurre a una estructura iterativa o
Accin 1; Accin 2; ... Accin n;
bucle. En este tipo de estructuras se necesita una condicin que determine cuando terminan las iteraciones. Dependiendo de si esa condicin se evala al principio o al
nal de la estructura y de si la condicin para que las ite176.2.3 Composicin condicional
raciones continen debe ser verdadera o falsa, se pueden
Cuando en un algoritmo se quiere indicar que cierta ac- denir cuatro construcciones iterativas distintas:
cin solo se debe ejecutar bajo cierta condicin se indica Sobre las cuatro construcciones que se acaban de presendel siguiente modo:
tar cabe hacer las siguientes observaciones:
Si Condicin Entonces Accin; FinSi
Solo si la Condicin (operacin lgica) es verdadera se
ejecutar la Accin. En este caso, la Accin puede referirse tanto a una accin elemental como a un conjunto de
ellas.

176.2.4

Composicin condicional doble


(alternativa)

En ocasiones, se deben ejecutar unas acciones u otras dependiendo de la ocurrencia de una determinada condicin. Esta especicacin se realiza del siguiente modo:
Si Condicin Entonces Accin A; SiNo Accin B; FinSi
Dependiendo de si la Condicin es verdadera o falsa se
ejecutar la Accin A o la Accin B respectivamente. De
forma anloga a como ocurra en el caso anterior, tanto la
Accin A como la Accin B pueden referirse a una accin
elemental o a un conjunto de ellas.

Si en las estructuras 1 y 2, cuando se evala laCondicin, sta toma por primera vez un valor tal que
no permita ejecutar laAccin(FALSO en la 1 y
VERDADERO en la 2), sta no se ejecutar ninguna vez. Es decir, puede ocurrir que la Accin,
en las estructuras 1 y 2, no se ejecute nunca.
En las estructuras 3 y 4, al estar laCondicinde
terminacin al nal, laAccinse ejecutar antes
de que la condicin se evale por primera vez, por
lo que aunque laCondicintome un valor tal que
no se permita realizar ms iteraciones, la Accin
se ejecutar al menos una vez.
Si las Condicionesde las estructuras 1 y 2 son
complementarias, es decir, que siempre que una es
verdadera la otra es falsa y viceversa (ejemplo: [a
> b] y [a b] son condiciones complementarias),
entonces ambas estructuras son equivalentes ya que
en ambas laAccinse ejecutar el mismo nmero
de veces.

332

CAPTULO 176. RESOLUCIN DE PROBLEMAS DE PROGRAMACIN

De forma anloga, si las Condicionesde las estructuras 3 y 4 son complementarias tambin ambas
estructuras sern equivalentes.
Existe una construccin especial para indicar una repeticin de acciones que se suele emplear cuando se quiere
que dicha repeticin se realice un nmero determinado
de veces:
Para i = 1 Hasta n Hacer Accin; FinPara
En este caso laAccinse repetir n veces eiser una
variable que tomar todos los valores entre 1 y n (ambos
inclusive) en cada una de las sucesivas repeticiones. Esta
construccin, aunque de apariencia diferente a las anteriores, se podra expresar como un caso particular de la
estructura 1 del siguiente modo:
i = 1; Mientras i <= n Hacer Accin; i = i + 1; FinMientras
En este caso la condicin de nalizacin del bucle es que
la variableisea mayor queny siempre, al nalizar
la ejecucin de laAccin,ise incrementa en una
unidad antes de volver a evaluar la Condicinpara el
nuevo valor de i.

176.3 Vase tambin


Algoritmo
Programacin
Pseudocdigo
Diagrama de ujo
Estructuras de control
Bucle (programacin)
Bucle for
Bucle while
Bucle repetir
Bucle innito
Programacin estructurada
Lenguaje de programacin
Resolucin de problemas

Captulo 177

Instancia (programacin)
En el paradigma de la orientacin a objetos, una instan- se (puede hacerlo para permitir ejecuciones concurrencia se reere a una realizacin especca de una clase o tes de distintas versiones de una clase)* [Nota 1] entonces
prototipo determinados.
las clases sern representadas utilizando un Singleton. En
En general, cuando se ejecuta un programa en un compu- Java, por ejemplo, si tenemos una clase denida como:
tador, se dice que ste se instancia. En lenguajes que crean
objetos a partir de clases, un objeto es una instancia de
una clase. Esto es, es un miembro de una clase que tiene
atributos en lugar de variables. En un contexto del mundo
real, podramos pensar en Perrocomo una clase y en
un perro conreto en una instancia de esta clase.* [1]

177.1 Programacin basada en clases


En este apartado hablaremos de la programacin orientada a objetos basada en clases, que es la que implementa la
mayora de lenguajes de programacin orientados a objetos. En el modelo basado en prototipos, que es el de
lenguajes como JavaScript, los trminos que se reeren a
clases han de sustituirse por los prototipos de los objetos,
pero por lo dems, son de aplicacin similar.

public class Perro {}


Podremos acceder a la instancia que representa la clase
(y es una instancia de la clase java.lang.Class<Perro>), en
un programa principal de clase Main, del siguiente modo:
public class Main { public static void main(String...
args) { Class<?> perroClass = Perro.class; System.out.println(perroClass); } }

177.2 Programacin
prototipos

En este modelo, un objeto tiene una referencia a la clase a


la que pertenece y, por tanto, puede llamar a los mtodos
de instancia que hayan sido declarados como de instancia,
as como a todos aquellos que hayan sido heredados por
la jerarqua de herencia esttica entre clases.

basada

en

En el estilo de programacin orientada a objetos basada


en prototipos las instancias son los objetos creados a partir
de los prototipos. En general, los prototipos tambin son
objetos creados a partir de otros prototipos, con lo que
las propiedades y mtodos se heredan en la profundidad
Ciertos lenguajes de programacin permiten utilizar clacompleta del rbol de herencia de prototipado.
ses mixin, que permiten adems realizar asociaciones entre instancias de objetos para establecer relaciones simi- En el caso particular de JavaScript, aunque no se puede
cambiar el prototipo de un objeto una vez instanciado, s
lares a la herencia en tiempo de ejecucin.
se pueden cambiar las propiedades y mtodos que tiene
el prototipo, afectando a todas las instancias (en profundidad) de ese prototipo. En el caso particular de este len177.1.1 Clases como objetos
guaje, en el que todos los objetos son instancias de ObMultitud de lenguajes de programacin basados en cla- ject, modicar o aadir mtodos a Object tendr como
ses proporcionan mecanismos de reexin o introspec- consecuencia la modicacin de esos mtodos u objetos
cin, esto es, permiten que el programa pueda observar en todos los dems objetos que no los hayan redenido
(e incluso modicar) su propia estructura de alto nivel. Si posteriormente, incluyendo los ya instanciados. Este es
estos mecanismos siguen el paradigma de orientacin a el mecanismo que utilizan algunas bibliotecas de JavaSobjetos tambin, entonces las clases sern representadas cript* [Nota 2] para proporcionar funciones que no hayan
tambin como instancias de objetos. En particular, si el implementado ciertos motores a ciertos objetos del lenlenguaje no permite dos deniciones de una misma cla- guaje.
333

334

177.3 Notas
[1] Erlang, por ejemplo, permite la ejecucin concurrente de varias versiones de un mismo programa, vase
[server.html#Module:code change-3 http://www.erlang.
org/doc/man/gen server.html#Module:code change-3], y
CLOS.
[2] http://augmentjs.com, por ejemplo, proporciona mtodos
al objeto Array.prototype, cambiando todos los Array del
programa.

177.4 Referencias
[1] http://whatis.techtarget.com/definition/instance (en ingls)

CAPTULO 177. INSTANCIA (PROGRAMACIN)

Captulo 178

Anexo:Scan code
Son los cdigos que enva el teclado al ordenador para
indicar la tecla pulsada o soltada. Su valor no depende
de la tecla, sino de su posicin, as se consigue que sea
independiente del idioma del teclado.
Para el teclado QWERTY (PS/2) y cdigos ASCII los
scan codes son:

335

Captulo 179

scanf
En C, la funcin scanf() (scan-format, analizar con formato), en realidad representa a una familia de funciones
que analizan una entrada de datos con formato y cargan el
resultado en los argumentos que se pasan por referencia
a dicha funcin o funciones:
La funcin scanf() lee los datos de entrada en el stdin (ujo de entrada estndar).

ll (codo-codo) - Especica que especicador una d, un i,


un o, un u, un x, de una conversin siguiente de X, o de
n se aplica a un argumento con el tipo indicador a largo
largo largo o sin rmar largo.
j - Especica que especicador una d, un i, un o, un u,
un x, de una conversin siguiente de X, o de n se aplica a un argumento con el tipo indicador al intmax_t o al
uintmax_t.

La funcin fscanf() (le-scanf) lee en un


ujo de entrada dado, por lo general un
chero (le) abierto para lectura.
La funcin sscanf() (string-scanf) obtiene la entrada que se va a analizar de una
cadena de caracteres dada (string).

z - Especica que especicador una d, un i, un o, un u,


un x, de una conversin siguiente de X, o de n se aplica
a un argumento con el tipo indicador al size_t o al tipo
correspondiente del entero con signo.

Todas ellas leen caracteres, los interpretan segn un formato, y almacenan los resultados en sus argumentos. Cada uno cuenta con varios argumentos: por un lado, un formato de la secuencia del control (se describe ms abajo),
por otro, un sistema de argumentos del indicador que seala dnde la entrada convertida debe ser almacenada.
El resultado es indenido si hay escasos argumentos para dar formato. Si se agota el formato mientras que sigue
habiendo las argumentos, los argumentos sobrantes son
evaluados pero no procesados de ninguna otra manera.

179.0.1

mento con el tipo indicador al doble; o que una c siguiente, s, o [el especicador de la conversin se aplica a una
argumento con el tipo indicador al wchar_t.

t - Especica que especicador una d, un i, un o, un u, un


x, de una conversin siguiente de X, o de n se aplica a un
argumento con el tipo indicador al ptrdi_t o al tipo sin
rmar correspondiente.
L - Especica que una a siguiente, A, e, E, f, F, g, o especicador de la conversin de G se aplica a un argumento
con el tipo indicador al doble largo.
Si un modicante de la longitud aparece con cualquier
especicador de la conversin con excepcin de segn lo
especicado arriba, el comportamiento es indenido.

Modicantes de longitud

Los modicantes de la longitud y sus signicados son:

Los especicadores siguientes de la conversin que


son vlidos

hh - Especca que especicador una d, un i, un o, un u,


un x, de una conversin siguiente de X, o de n se aplica d - Empareja un nmero entero decimal opcionalmente
a un argumento con el tipo indicador al carbn rmado o con signo, que formato es igual segn lo esperado para la
al carbn sin rmar.
secuencia sujeta del strtol() con el valor 10 para el arguh - Especca que especicador una d, un i, un o, un u, mento bajo. En ausencia de un modicante del tamao,
un x, de una conversin siguiente de X, o de n se aplica a el uso se asegurar de que el argumento correspondiente
un argumento con el tipo indicador al cortocircuito corto sea un indicador a interno.
o sin rmar.

i - Empareja un entero con signo opcionalmente, que formato es igual segn lo esperado para la secuencia sujeta
del strtol() con 0 para el argumento bajo. En ausencia de
un modicante del tamao, el uso se asegurar de que el
argumento correspondiente sea un indicador a interno.

l (codo) - Especca que especicador una d, un i, un o,


un u, un x, de una conversin siguiente de X, o de n se
aplica a un argumento con el tipo indicador para desear
o largo sin rmar; que una a siguiente, A, e, E, f, F, g, o
especicador de la conversin de G se aplica a una argu- o - Empareja un nmero entero octal opcionalmente con
336

337
signo, que formato es igual segn lo esperado para la secuencia sujeta del strtoul() con el valor 8 para el argumento bajo. En ausencia de un modicante del tamao,
el uso se asegurar de que el argumento correspondiente
sea un indicador a sin rmar.
u - Empareja un nmero entero decimal opcionalmente
con signo, que formato es igual segn lo esperado para la
secuencia sujeta del strtoul() con el valor 10 para el argumento bajo. En ausencia de un modicante del tamao,
el uso se asegurar de que el argumento correspondiente
sea un indicador a sin rmar.
x - Empareja un nmero entero hexadecimal opcionalmente con signo, que formato es igual segn lo esperado
para la secuencia sujeta del strtoul() con el valor 16 para el argumento bajo. En ausencia de un modicante del
tamao, el uso se asegurar de que el argumento correspondiente sea un indicador a sin rmar.
a, e, f, g - Empareja un nmero, un innito, o un NaN
oating-point opcionalmente con signo, que formato es
igual segn lo esperado para la secuencia sujeta del strtod
(). En ausencia de un modicante del tamao, el uso se
asegurar de que el argumento correspondiente sea un indicador a otar.
>>>Si la familia del fprintf() de funciones genera las representaciones de la cadena de caracteres para el innito y NaN (una entidad simblica codicada en formato
oating-point) para apoyar IEEE Std 754-1985, la familia
del fscanf () de funciones las reconocer como entrada. s
- Empareja una secuencia de los octetos que no son caracteres del blanco-espacio. El uso se asegurar de que
el argumento correspondiente sea un indicador al octeto
inicial de un arsenal del carbn, del carbn rmado, o
del carbn sin rmar bastante grande aceptar la secuencia y un cdigo de carcter nulo que termina, que sern
agregados automticamente.

>>>Si un l (codo) calicador est presente, la entrada es


una secuencia de caracteres que comienza en el estado
inicial de la cambio. Cada carcter en la secuencia ser
convertido a un carcter ancho como si por una llamada a
la funcin del mbrtowc (), con el estado de la conversin
descrito por un objeto del mbstate_t inicializado a cero
antes del primer carcter sea convertido. El uso se asegurar de que el argumento correspondiente sea un indicador a un arsenal de wchar_t bastante grande para aceptar
la secuencia y el carcter ancho nulo que termina, que
sern agregados automticamente.
>>>La especicacin de la conversin incluye todos los
octetos subsecuentes en la secuencia del formato hasta e
incluir el corchete derecho que empareja (]). Los octetos entre los corchetes (el scanlist) abarcan el scanset, a
menos que el octeto despus de que el corchete izquierdo
sea un circunejo (^), en este caso el scanset contiene
todos los octetos que no aparezcan en el scanlist entre el
circunejo y el corchete derecho. Si la especicacin de
la conversin comienza con[] o[^] , el corchete derecho se incluye en el scanlist y el corchete derecho
siguiente es el corchete derecho que empareja que termina la especicacin de la conversin; si no, el primer
corchete derecho es el que termina la especicacin de
la conversin. Si -es en el scanlist y no es el primer
carcter, ni el segundo donde est un^, ni el carcter
el primer carcter pasado, puesta en prctica-se dene el
comportamiento.

c - Empareja una secuencia de los octetos del nmero especicado por la anchura del campo (1 si no hay anchura
del campo presente en la especicacin de la conversin).
El uso se asegurar de que el argumento correspondiente
sea un indicador al octeto inicial de un arsenal del carbn, del carbn rmado, o del carbn sin rmar bastante
grande aceptar la secuencia. No se agrega ningn octeto nulo. Los caracteres excesivos del blanco-espacio del
>>>Si un l (codo) calicador est presente, la entrada es salto normal sern suprimidos en este caso.
una secuencia de caracteres que comienza en el estado >>>Si un l (codo) calicador est presente, la entrada seinicial de la cambio. Cada carcter ser convertido a un r una secuencia de caracteres que comienza en el estado
carcter ancho como si por una llamada a la funcin del inicial de la cambio. Cada carcter en la secuencia se conmbrtowc (), con el estado de la conversin descrito por vierte a un carcter ancho como si por una llamada a la
un objeto del mbstate_t inicializado a cero antes del pri- funcin del mbrtowc (), con el estado de la conversin
mer carcter 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 carcter sea convertido. El uso se asegude wchar_t bastante grande para aceptar la secuencia y rar de que el argumento correspondiente sea un indicael carcter ancho nulo que termina, que sern agregados dor a un arsenal de wchar_t bastante grande para aceptar
automticamente.
la secuencia que resulta de caracteres anchos. No se agre[ - Empareja una secuencia no vaca de octetos de un sis- ga ningn carcter ancho nulo.
tema de los octetos previstos (el scanset). Los caracteres s - Indica que es una cadena de caracteres (string). La enexcesivos del blanco-espacio del salto normal sern 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 signica que el buer utilizado debe ser por lo menos un
de un arsenal del carbn, del carbn rmado, o del car- caracter ms grande que la longitud de entrada especicabn sin rmar bastante grande aceptar la secuencia y un da. De no ser as podra darse el caso que se sobrescriban
octeto nulo que termina, que sern agregados automti- porciones de memorias adyacentes, generando resultados
camente.
inesperados.

338
/*Posibles resultados no deseados al leer un solo caracter*/ char a; scanf("%s,&a); /*Una forma non-sancta
de evitarlo usando arreglos el caracter quedara en a[0] */
char a[2]; scanf("%s,a);

CAPTULO 179. SCANF


introducidos por teclado, de tipos int, oat y char //Si se
introduce un dato errneo se interrumpe la lectura del
resto. int validos; printf(Introduce un entero, un real, y
un caracter:"); validos=scanf("%i%f%c,&a,&b,&c);
//Entrada: 5 1.2 J | Salida: 3 //Lectura de una cadenas de caracteres printf(Introduce una palabra: ");
scanf("%10s,cad); // lee mximo 10 caracteres y le
concatena el caracter cero.

p - Empareja un sistema puesta en prctica-denido de las


secuencias, que sern iguales que el sistema de secuencias
que es producido por la especicacin de la conversin
de %p de las funciones correspondientes del fprintf (). El
uso se asegurar de que el argumento correspondiente sea
un indicador a un indicador a anular. La interpretacin
del artculo de la entrada puesta en prctica-se dene. Si
el artculo de la entrada es un valor convertido anterior 179.3 Funciones derivadas
durante la misma ejecucin de programa, el indicador que
los resultados compararn el igual a ese valor; si no, el
comportamiento de la especicacin de la conversin de 179.3.1 fscanf
%p es indenido.
La funcin fscanf lee datos de entrada desde un chero,
n - No se consume ninguna entrada. El uso se asegurar
en lugar de utilizar la entrada estndar.
de que el argumento correspondiente sea un indicador al
nmero entero en el cual ser escrito el nmero de los oc- (C o C++)
tetos ledos en la entrada hasta ahora por esta llamada a int fscanf (FILE *le, const char *format,...);
las funciones del fscanf (). La ejecucin de una especicacin de la conversin de %n no incrementar la cuenta (PHP)
de la asignacin vuelta en la terminacin de la ejecucin int fscanf (resource le, const string format [, mixed
de la funcin. No se convertir ningn argumento, pero args...]);
una ser consumido. Si la especicacin de la conversin
incluye un carcter asignacin-que suprime o una anchu- fscanf trabaja igual que la funcin scanf original; las entradas una vez ledas no sern ledas otra vez hasta que el
ra del campo, el comportamiento es indenido.
archivo sea cerrado y abierto de nuevo.

179.1 Sintaxis
valor_devuelto=scanf(tipo, &var);

179.3.2 sscanf
La funcin sscanf lee datos de entrada desde un buer,
en lugar de utilizar la entrada estndar.

valor_devuelto: representa el nmero datos ledos


Sus prototipos son los siguientes:
correctamente. Devuelve distinto de 0 si lee al(C o C++)
guno.[Opcional]
tipo: Tipo de dato a almacenar

int sscanf (char *buer, const char *format,...);

Retorna la cantidad de datos que pudo leer.


ampersand (&) se utiliza para indicar una direccin
de memoria de la variable donde se almacenar el Recuerda que los parmetros despus de *format deben
dato. Cuando se guardan de cadenas de caracteres, ser punteros a variables donde la funcin dejar lo que
lee. Estas variables deben tener el espacio suciente.
al tratarse de un array de tipo char, el & se omite.
var: variable para almacenar el dato.

179.4 Vase tambin


179.2 Ejemplo
// Este ejemplo guarda un nmero en n. #include
<stdio.h> int n; printf(Introduce un numero: ");
scanf("%d,&n); // Este ejemplo guarda en una variable
en num. char num; printf(Introduce un caracter: ");
scanf("%c,&num); // Este ejemplo guarda una cadena
de caracteres (solamente una palabra) en cad. // Notese
la ausencia de & char cad[20]; printf(Introduce una
palabra: "); scanf("%s,cad); //Lectura de varios datos

scanf_s
printf
stdio.h
Lenguaje de programacin C
PHP

179.5. ENLACES EXTERNOS

179.5 Enlaces externos


scanf(3): conversin de la entrada con formato Subrutinas en el Manual de Debian

339

Captulo 180

SCons
SCons es una herramienta de cdigo abierto para la construccin e instalacin de software a travs de scripts hechos en Python, para los sistemas operativos basados en
Unix. Su objetivo es ser una variante al mtodo de compilacin tradicional de fuentes. Entre sus ventajas se encuentra el anlisis de dependencias.
Scons utiliza el lenguaje de programacin Python de propsitos generales como fundacin, para que todas las de
proyectos de conguraciones software y construccin de
procesos implementarios sean los scripts de Python.

180.1 Vase tambin


Make
Autoconf

180.2 Enlaces externos


Pgina ocial de SCons

340

Captulo 181

Screen scraping
Screen scraping es el nombre en ingls de una tcnica
de programacin que consiste en tomar una presentacin
de una informacin (normalmente texto, aunque puede
incluir informacin grca) para, mediante ingeniera inversa, extraer los datos que dieron lugar a esa presentacin. Por ejemplo:
Extraer de la pgina web de un diario el tiempo meteorolgico previsto.
Extraer los datos originales a partir de la imagen de
una grca elaborada.
Hacer una consulta automtica a la pgina de gestin
de nuestro banco para vericar si el saldo es inferior
a un umbral.
Extraer los datos de un informe en PDF para verterlos en una hoja de clculo.
En general, hay que destacar que los sistemas de los que
se extrae la informacin no estn diseados para extraer
dicha informacin (en algunos casos, es al contrario, como en los sistemas de captcha).
La traduccin aproximada de screen scraping es raspado
de pantalla.

181.1 Vase tambin


Web scraping

341

Captulo 182

Seccin crtica
Se denomina seccin crtica, en programacin concurrente, a la porcin de cdigo de un programa de ordenador en la que se accede a un recurso compartido (estructura de datos o dispositivo) que no debe ser accedido
por ms de un proceso o hilo en ejecucin. La seccin
crtica por lo general termina en un tiempo determinado
y el hilo, proceso o tarea slo tendr que esperar un perodo determinado de tiempo para entrar. Se necesita un
mecanismo de sincronizacin en la entrada y salida de la
seccin crtica para asegurar la utilizacin en exclusiva
del recurso, por ejemplo un semforo.
El acceso concurrente se controla teniendo cuidado de las
variables que se modican dentro y fuera de la seccin
crtica. La seccin crtica se utiliza por lo general cuando
un programa multihilo actualiza mltiples variables sin
un hilo de ejecucin separado que lleve los cambios conictivos a esos datos. Una situacin similar, la seccin
crtica puede ser utilizada para asegurarse de que un recurso compartido, por ejemplo, una impresora, pueda ser
accedida por un solo proceso a la vez.
La manera en cmo se implementan las secciones puede
variar dependiendo de los diversos sistemas operativos.
Slo un proceso puede estar en una seccin crtica a la
vez.
El mtodo ms comn para evitar que dos procesos accedan al mismo tiempo a un recurso es el de la exclusin
mutua.

182.1 Vase tambin


Cierre de exclusin mutua

342

Captulo 183

Serializacin
En ciencias de la computacin, la serializacin (o mars- 183.3 Enlaces externos
halling en ingls) consiste en un proceso de codicacin
de un objeto en un medio de almacenamiento (como pue- Para Java:
de ser un archivo, o un buer de memoria) con el n de
transmitirlo a travs de una conexin en red como una
XML Data Binding
serie de bytes o en un formato humanamente ms legible como XML o JSON, entre otros. La serie de bytes o
Generar el serialVersionUID de una clase
el formato pueden ser usados para crear un nuevo objeto
que es idntico en todo al original, incluido su estado inPara C#:
terno (por tanto, el nuevo objeto es un clon del original).
La serializacin es un mecanismo ampliamente usado
Serializacin XML de objetos en .net con C# (en
para transportar objetos a travs de una red, para hacer
espaol)
persistente un objeto en un archivo o base de datos, o
para distribuir objetos idnticos a varias aplicaciones o
localizaciones.

183.1 Usos
Serializacin tiene una serie de ventajas:
Un mtodo de persistencia de objetos que es ms
conveniente que escribir sus propiedades a un archivo de texto en disco.
Un mtodo de emisin de llamadas a procedimiento
remoto, por ejemplo, como en SOAP.
Un mtodo para la distribucin de objetos, especialmente en los componentes software, tales como
COM, CORBA, etc.
Un mtodo para detectar cambios en variables en el
tiempo.

183.2 Soporte en los lenguajes de


programacin
Varios lenguajes de programacin orientados a objeto soportan la serializacin de forma directa. Algunos de ellos
son Objective-C, Java, Delphi, C#, Visual Basic .NET,
ColdFusion, Ocaml, Perl, Python, PHP y Ruby
343

Captulo 184

Sigil
En programacin y sistemas de informacin, un sigil
(pronunciado/sdl/ o /sl/; plural sigilia o sigiles) o
sigilo es un smbolo agregado al nombre de una variable,
especicando el tipo o alcance de la misma. Este trmino,
basado en la palabra inglesa para sello mgico, fue usado
por Philip Gwyn en 1999 para designar el extrao carcter inicial en el nombre de una variable de Perl".

344

Captulo 185

Signatura (informtica)
La signatura o rma de un mtodo o una funcin dene
su entrada y su salida. Incluye por lo menos el nombre de
la funcin o mtodo y el nmero de sus parmetros. En
algunos lenguajes de programacin, puede incluir el tipo
que devuelve la funcin o el tipo de sus parmetros.
En el caso de un tipo de dato abstracto (TDA), se dene
signatura como los tipos que utiliza junto con los nombres
y perles de las operaciones.
Por ejemplo, para especicar el TDA de los booleanos se
utiliza la siguiente signatura:
1. tipos bool
2. operaciones
3. verdadero : bool
4. falso : bool
5. And : bool x bool -> bool
6. Or : bool x bool -> bool
7. Not : bool -> bool

345

Captulo 186

Signum Framework
Signum Framework es un framework ORM Open Source creado por una empresa espaola en C# orientado
al desarrollo de aplicaciones sobre la tecnologa .Net de
Microsoft, con un visin centrada en las entidades, de manera que es el modelo de datos el que determina el esquema de la base de datos. Como base de datos slo est
soportado MS SQL Server.
Signum Framework se distribuye bajo licencia LGPL.

186.1 Caractersticas
186.1.1

de otros frameworks, la base de datos se genera a partir


del cdigo y no a la inversa.
Dada la importancia que se concede a las entidades como
ncleo de las aplicaciones, Signum Framework provee un
pequeo grupo de clases base y primitivas que permiten
modelar los objetos de una manera modular y reusable,
evitando la redundancia y asegurando la integridad de los
objetos, tanto en lgica 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 Framework no soporte POCO (Plain Old C# Object).

Elementos de Signum Framework

Signum Framework est compuesto por los siguientes ensamblados:

186.1.3 Generacin del esquema

La base de datos relacional se genera automticamente a


partir de las entidades utilizando un mapeado 1 a 1 des Signum.Entities - Las clases base necesarias para gede las entidades a las tablas, de manera que cada entidad
nerar las entidades de datos.
independiente tiene su propia tabla y cada campo de la
Signum.Engine - El motor ORM con un proveedor entidad su propia columna. Las entidades que son embebidas (EmbeddedEntity) no tienen una tabla propia, sino
LINQ completo.
que sus campos se guardan como columnas en la tabla de
Signum.Utilities - Conjunto de utilidades y herra- la entidad a la que pertenecen. Se utilizan tablas relacionales para las colecciones, lo que permite las relaciones
mientas.
N a N.
Signum.Services - Interfaces base del servicio WCF
Para permitir realizar modicaciones sobre los datos sin
Signum.Windows - Controles base para manipular tener que regenerar la base de datos cada vez, se puede
realizar una sincronizacin entre las entidades y la base
entidades
de datos existente, en la que el motor generar un archivo de script SQL con las modicaciones necesarias para
actualizar el esquema.
186.1.2 Entidades primero
La losofa centrada en las entidades propicia que el esquema de datos se genere automticamente a partir de los
objetos de cdigo, evitando mapear los campos entre la
base de datos y las entidades a travs de archivos de conguracin. De esta manera se trata de que se detecten las
posibles incidencias en tiempo de compilacin para todas
las clases (tanto de datos como de lgica).

186.1.4 Herencia de entidades

Aunque Signum Framework utiliza un sistema detabla


por clase concreta, en el que se crea una tabla una por
cada uno de los tipos concretos, permite implementar el
Por otro lado, esto mismo impide que Signum Framework concepto de herencia utilizando relaciones polimrcas,
se adapte bien a proyectos en los que existe una base de que cuentan con una clave externa que admite valores nudatos anterior que se debe preservar, ya que, a diferencia los por cada posible implementacin.
346

186.2. HISTORIA

186.1.5

Interfaz de usuario y WCF

Signum.Windows ofrece controles WPF bsicos que


aprovechan la homogeneidad de las entidades para implementar un comportamiento automtico. Estos controles simplican el desarrollo de las vistas de las entidades
de una aplicacin.
Para la comunicacin entre los clientes y el servidor se
utilizan contratos WCF que permiten la comparticin de
tipos. Esto facilita reutilizar las reglas de validacin de las
entidades en el cliente, eliminando la redundancia.
La utilizacin de objetos Lazy permite trabajar conhuellasde una entidad, conociendo su ToString y su identicador, pero sin recuperar la entidad completa hasta que
sea necesario, minimizando as la carga de trabajo y la
transferencia de datos, aumentando considerablemente el
rendimiento de las aplicaciones.

186.1.6

LINQ

Signum Framework tiene un proveedor LINQ completo, de manera que todas las operaciones se ejecutan en
LINQ, e internamente el motor las traduce a SQL. Algunas de las caractersticas del proveedor de LINQ son las
siguientes:

347

186.2 Historia
2004 - Primera versin de un motor ORM basado
en los principios de reutilizacin y centrado en entidades.
2007 - Segunda versin del motor ORM, incluyendo
el Gestor de Operaciones y Procesos.
2008 - Signum Framework 1.0 Beta 1, incluyendo
las funcionalidades de ORM, WPF y LINQ.
2009 - Release de Signum Framework 1.0 en Codeplex.
2010 - Signum Framework 2.0 Beta 1, con soporte
para .Net Framework 4 y ASP.Net MVC 2.0 (versin interna).
2011 - Signum Framework 2.0 Beta 2, con soporte
para ASP.Net MVC 3.0 (versin interna).
2011 - Release de Signum Framework 2.0, incluyendo soporte para .Net Framework 4 y ASP.Net
MVC 3.0

186.3 Enlaces externos

Soporta joins.

Pgina ocial de Signum Framework.

Soporta valores booleanos en cualquier parte de la


consulta.

Cdigo fuente de Signum Framework.

Soporta GroupJoin y DefaultIfEmpty.


Soporta Group By en C# y VB.NET con agregados
mltiples.
Soporta el uso de let en las consultas.
Maneja la construccin de objetos en memoria dentro de consultas, as como llamadas a mtodos en
memoria.
Soporta tipos nulables y conversiones implcitas.
Ofrece emulacin nativa de funciones SQL.
Soporta operaciones de tipo SelectMany.
Debido a algunas de las funcionalidades que soporta
(en concreto las funciones CROSS APPLY / OUTER
APPLY), actualmente las bases de datos soportadas por
Signum Framework se limitan a SQL Server 2005 y SQL
Server 2008 (tanto en las versiones Express como en las
versiones de pago).
La principal diferencia entre el proveedor de LINQ de
Signum Framework y otros proveedores es que no depende de un contexto explcito que depende del esquema
actual de la base de datos, lo que permite escribir lgica
de negocio reutilizable.

Canal de Youtube con tutoriales sobre Signum Framework.


Sitio web de Signum Software.

Captulo 187

Simple Network Library


Simple Network Library (SNL) es una biblioteca in- 187.2 Desarrollo
formtica desarrollada con el lenguaje C que proporciona
funciones para realizar operaciones de comunicacin en El sistema de control de versiones usado en el desarrollo
red. La primera versin de esta biblioteca fue acabada el de SNL es Darcs por ser distribuido y no depender sus
5 de abril de 2009.
repositorios de un servidor. El repositorio ocial es acceProporciona herramientas para el desarrollo de sible desde internet y los parches son enviados al mantevideojuegos y cualquier otra aplicacin que necesi- nedor por correo electrnico para ser aplicados al reposite comunicacin a travs de una red informtica. Una torio ocial. Todo aquel que quiere colaborar en el desade sus grandes virtudes es el tratarse de una biblioteca rrollo de SNL nicamente tiene que obtener una copia de
multiplataforma, soportando ocialmente los sistemas trabajo desde el repositorio ocial y realizar los cambios
GNU/Linux y OpenSolaris, adems de otras arquitectu- que desee, enviando despus los parches resultantes para
ras/sistemas como windows, MacOS, etc. Las siglas le que puedan ser aplicados al repositorio ocial.
vienen de Simple Network Library que se traduce como En la pgina web ocial de SNL se indica la localizacin
biblioteca de red simple. Desarrollada inicialmente por del repositorio ocial as como documentacin que pueJess Hernndez Gormaz.
den consultar todos aquellos que quieran participar en el
Soporta los protocolos de IP tanto de IPv4 como de IPv6 hacking de SNL y no conozcan el uso de Darcs.
adems de los protocolos de comunicacin TCP y UDP.
La biblioteca se distribuye bajo la licencia GPL.

187.3 Vase tambin


Simple DirectMedia Layer

187.4 Referencias
187.1 Origen del nombre

187.5 Bibliografa

El origen del nombre, Simple Network Library, puede 187.5.1 Documentacin de SNL
considerarse como un guio a la biblioteca Simple DirectMedia Layer, SDL, ya que como se puede observar
Jess Hernndez Gormaz (2009). Documentacion de
las siglas solo varan 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 videojuegos que sean software libre, SNL se cre con la
187.6 Enlaces externos
intencin de facilitar el desarrollo y programacin de videojuegos multijugador en red an ms de lo que pueda
www.snl.ya.st - Pgina ocial de SNL (en esperanto,
facilitarlo otras bibliotecas como SDL Net, de forma que
espaol e ingles).
el trabajo de el programador con los sockets y la labor
de conseguir Multiplexacin, para que un servidor pueda atender a varios clientes de forma no bloqueante, sea
lo sucientemente sencillo para que el programador no
pierda tiempo en la comunicacin que podra invertir en
el juego en si.
348

Captulo 188

Smarty
Smarty es un motor de plantillas para PHP, es decir, separa el cdigo PHP, como lgica de negocios, del cdigo
HTML, como lgica de presentacin, y genera contenidos web mediante la colocacin de etiquetas Smarty en un
documento. Se encuentra bajo la Licencia Pblica General Reducida de GNU.

medida van surgiendo sistemas de separacin en capas


que intentan disciplinar un poco las metodologas de programacin envueltas en el desarrollo con PHP, pero que
no hacen otra cosa que acercarse ms y ms a otras herramientas ya existentes en otros entornos de desarrollo ms
complejos y pensados desde sus orgenes para proyectos
ms grandes, como pueden ser J2EE (Java), .NET (C#)
Es comn que en grandes proyectos el rol de diseador
grco y el de programador sean cubiertos por personas o Django (Python).
distintas, sin embargo la programacin en PHP tiene la
tendencia de combinar estas dos labores en una persona
y dentro del mismo cdigo, lo que trae consigo grandes 188.3 Ejemplo
dicultades a la hora de cambiar alguna parte del diseo
de la pgina, pues se tiene que escarbar entre los scripts index.php
para modicar la presentacin del contenido, Smarty tiene como objetivo solucionar este problema.
require_once(smarty/Smarty.class.php); // Instanciar
la clase de Smarty $smarty = new Smarty(); // Congurar Smarty $smarty->template_dir = "./templates/";
$smarty->compile_dir = "./templates_c/"; $smarty188.1 Caractersticas
>cong_dir = "./congs/"; $smarty->cache_dir =
"./cache/"; // Establecer variables que se usarn en la
Expresiones regulares
plantilla $smarty->assign(nombre, Jos Manuel
Pardo Prez); $smarty->assign(direccion, C/
Bucles foreach, while
Alpes, 992); // Mostrar la plantilla $smarty->display(
Sentencias condicionales if, elseif, else
index.tpl);
Modicadores de variables (por ejemplo: {$variable|nl2br})

index.tpl

Funciones creadas por el usuario

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML


Evaluacin de expresiones matemticas en la plan- 4.01//EN"http://www.w3.org/TR/html4/strict.dtd">
tilla
<html lang="es"> <head> <title>Informacin del
Usuario</title> </head> <body> <p>Informacin del
Usuario:</p> <p> Nombre: {$nombre}<br /> Direccin: {$direccion} </p> </body> </html>
188.2 Crticas
Existen ms sistemas de plantillas para PHP, pero ste
parece ser el ms avanzado y con ms frecuencia de desarrollo. Tambin hay detractores de estas tcnicas que alegan que las mismas hacen en cierta medida un grado ms
complejo el desarrollo web, por la necesidad de aprender
un (pseudo) lenguaje ms.

Salida HTML generada

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML


4.01//EN"http://www.w3.org/TR/html4/strict.dtd">
<html lang="es"> <head> <title>Informacin del
Usuario</title> </head> <body> <p>Informacin del
Los detractores de esta idea se basan en el hecho de que, Usuario:</p> <p> Nombre: Jos Manuel Pardo Prez<br
precisamente, el lenguaje PHP naci como un lenguaje /> Direccin: C/ Alpes, 992 </p> </body> </html>
rpido para hacer desarrollos web a pequea escala. A
349

350

188.4 Referencias
188.5 Enlaces externos
Sitio web ocial
Documentacin en espaol
Problemas con Smarty

CAPTULO 188. SMARTY

Captulo 189

Snippet
Snippet es un trmino del idioma ingls utilizado en programacin para referirse a pequeas partes reusables de
cdigo fuente, cdigo binario o texto. Comnmente son
denidas como unidades o mtodos funcionales que se
pueden integrar fcilmente en mdulos mucho ms grandes, aportando funcionalidad. Tambin se utiliza la palabra para referirse a la prctica de minimizar el uso de
cdigo repetido que es comn en muchas funciones, por
medio del uso de un solo mtodo que pueda ser reutilizado. (No te repitas).

189.1

Rich snippets

Los rich snippets son etiquetas de cdigo HTML utilizados por los programadores web para facilitar mayor informacin acerca del contenido de una web a los buscadores. La relacin de etiquetas existentes en la actualidad,
se puede encontrar en Schema.org.

189.2 Enlaces externos


Listado de tags o etiquetas enriquecidas o Rich Snippets

351

Captulo 190

Stack Overow
Stack Overow es un sitio web desarrollado por Je Att- 190.3 Moderacin
wood, este sitio web es utilizado por una comunidad de
desarrolladores informticos, en la cual otros desarrolla- Hasta enero del 2012, Stack Overow tena un registro de
dores pueden encontrar soluciones a problemas de pro- 771.000 usuarios registrados, y 12 moderadores, en programacin en diferentes lenguajes.* [2]
medio, cada moderador tena gestionar 64250 usuarios y
sus actividades.

190.1 Funcionamiento de Stack


Overow
1. El usuario se suscribe al sitio web.
2. El usuario hace pblica su pregunta.
3. El usuario recibe las respuestas.
Las respuestas son publicadas por los miembros de una
comunidad determinada o por otros usuarios con las mismas experiencias que encontraron solucin al problema
planteado.
Todos los usuarios pueden votar por las preguntas y por
sus respuestas, cuando se vota por una pregunta, el usuario puede calicarlas como ms relevante o menos relevante; por otra parte, cuando se vota por las respuestas,
stas pueden ser ms acertadas o menos acertadas.

190.2 Reputacin
Stack Overow posee un aspecto interesante, la reputacin, este trmino es destacado de acuerdo a la cantidad de votos que poseen las preguntas y las respuestas,
a mayor cantidad de votos relevantes o aciertos, mayor
es la reputacin en el sitio web. De hecho, el nmero de
votos es un indicador para muchos aspectos, entre estos
tenemos:
1. Conanza de los usuarios.

El sistema de moderacin est basado en la reputacin.


Los 12 moderadores iniciales son los moderadores generales del sitio web, pero todos los usuarios pueden alcanzar cierto poder de moderacin en funcin de su reputacin. Cuantos ms puntos tenga el usuario, ms cosas
puede hacer. De esa manera se divide el coste de la moderacin entre toda la comunidad: si cada uno modera un
poco, entre todos moderan todo; pero siempre basado en
la habilidad individual que permite ese privilegio.

190.4 Estadsticas
Un estudio en 2013 encontr que el 77% de los usuarios
slo hacen una pregunta, el 65% solamente responden a
una pregunta, y slo el 8% de los usuarios responden a
ms de 5 preguntas.* [3] A partir de 2011, el 92% de las
preguntas fueron contestadas en un tiempo medio de 11
minutos.* [4] Desde 2013, el software de red Stack Exchange elimina automticamente las preguntas que cumplen con ciertos criterios, entre ellos el no tener respuestas
en una cierta cantidad de tiempo.* [5]
A partir de agosto de 2012, 443.000 de los 1,3 millones
de usuarios registrados haban respondido al menos una
pregunta, y de ellos, unos 6.000 (0,46% del nmero total de usuarios) se haba ganado una puntuacin de reputacin superior a 5000.* [6]La Reputacin se puede ganar
ms rpido contestando a preguntas relacionadas con las
etiquetas con menor densidad de conocimientos, el hacerlo con prontitud (en particular, siendo la primera persona
en contestar una pregunta), estar activo durante las horas
de menor uso, y contribuyendo a diversas reas.* [7]

2. Habilidades de comunicacin.
[1] Stack Overow ranking alexa.com.

3. Calidad y relevancia en preguntas y Respuestas.

[2] Stack Overow informacin sobre la compaa.

4. Manejo de los temas.

[3] An Empirical Study on Developer Interactions in StackOverow

5. Nivel de experiencia y participacin.


352

190.4. ESTADSTICAS

[4] Mamykina, Lena; Bella Manoim; Manas Mittal; George


Hripcsak; Bjrn Hartmann (2011).Design lessons from
the fastest q&a site in the west
[5] Turbocharging the Roomba: solutions for premature deletion. stackexchange.com.
[6] Bosu, Amiangshu; Christopher S. Corley; Dustin Heaton;
Debarshi Chatterji; Jerey C. Carver; Nicholas A. Kraft
(2013).Building Reputation in StackOverow: An Empirical Investigation
[7] What posts get deleted, and why?". Meta.StackOverow.
10 June 2015.

353

Captulo 191

StarBasic
StarOce Basic, tambin conocido como StarBasic, es
un dialecto de Basic que Soporta Unicode, incluido en las
Suites de Ocina OpenOce.org y StarOce.

191.1 Primer virus para OpenOce


El 30 de mayo de 2006 fue detectado el primer virus conceptual para OpenOce. Fue desarrollado con el slo
objetivo de demostrar que es posible crear este tipo de
software usando el lenguaje de macros de esta suite de
aplicaciones libre. Escrito en StarBasic, el virus es capaz
de infectar las versiones de OpenOce y StarOce en
cualquier plataforma.

191.2 Enlaces externos


Ms informacin

354

Captulo 192

Stub
Un stub es, en el contexto del testeo del software, un trozo de cdigo usado como sustituto de alguna otra funcionalidad. Un stub puede simular el comportamiento de
cdigo existente (tal como un procedimiento en una mquina remota) o ser el sustituto temporal para un cdigo
an no desarrollado. Los stubs son, por tanto, muy tiles para porting, computacin distribuida as como en el
desarrollo y pruebas de software en general.
Un ejemplo de stub en pseudocdigo podra ser como ste:
INICIO Temperatura = LeerTermometro(Afuera) SI
Temperatura > 40 ENTONCES ESCRIBIR Hace calor!" FIN SI FIN INICIO LeerTermometro(Fuente adentroOafuera) RETORNAR 28 FIN LeerTermometro
El pseudocdigo de arriba utiliza la funcin LeerTermometro, que devuelve la temperatura. Aunque se pretende que LeerTermometro obtenga la temperatura de algn dispositivo, la funcin en este momento no contiene el cdigo necesario. LeerTermometro, en esencia, no
simula ningn proceso aunque devuelve un valor legal,
permitiendo as probar aunque sea en parte el programa
principal. Hay que notar tambin que aunque acepta un
parmetro 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 parmetros que acepta
y que devuelve un valor habitual dentro de los 'escenarios felices' del que llama al stub. Los stubs se usan habitualmente como sustitutos de la implementacin an no
nalizada de una interfaz ya denida. El stub contendra
slo el cdigo necesario para que compile y enlace con el
resto del programa.

192.1 Referencias
[1] http://www.webopedia.com/

192.2 Enlaces externos


A Stub Generation System For C++ (PDF)
355

Stub/mock frameworks for Java Review and comparison of stub & mock frameworks for Java

Captulo 193

Subalgoritmo
Se llama subalgoritmo a cada una de las partes de un
algoritmo ms general que resuelve cada una de las tareas particulares necesarias para que dicho algoritmo general alcance el objetivo para el que fue diseado, es decir resolver un problema. Este concepto est vinculado al
diseo estructurado de algoritmos, en el cual un problema
se divide en partes que posteriormente son resueltas por
un mdulo. Cada mdulo coincidir con un subalgoritmo.

nes en su funcionamiento. Este paso de argumentos se


puede hacer por valor o por referencia.
Ver Paso de argumentos en Argumento (Ciencias de la
computacin)'

193.4 Vase tambin


Programacin estructurada

193.1 Tipos de subalgoritmos

Programacin modular

Funciones: devuelven un valor.

Subrutina

Procedimientos: cambian un valor.

Encapsulamiento (programacin orientada a objetos)


Abstraccin (programacin orientada a objetos)

193.2 mbito de las variables

Recursin y Algoritmo recursivo

Desde el punto de un subalgoritmo las variables pueden


ser locales o globales:
Las variables locales se declaran dentro de un mdulo o subalgoritmo y slo tienen utilidad dentro de
ese mdulo, no se podr acceder a ellas desde otros
mdulos. Pueden existir variables locales con el mismo nombre siempre que estn en mdulos diferentes.
Las variables globales son declaradas de forma que
puedan ser utilizadas (consultada y/o modicada)
desde cualquiera de los mdulos que forman el programa. En este caso, no puede haber dos variables
globales con el mismo nombre, ya que esto producira una ambigedad que el compilador no podra
resolver. En el diseo estructurado de algoritmos se
desaconseja el uso de variables globales ya que este
producira acoplamiento comn.

193.3 Paso de argumentos


Cuando se hace una llamada a un subalgoritmo, se le pueden pasar argumentos para determinar ciertas condicio356

Captulo 194

Tabla de saltos
En programacin, se denomina tabla de saltos a un m- funciones por su nmero (el ndice en la tabla) pueden
todo eciente de transferencia de control de programas ser tiles en ciertos programas.
saltando a otra parte del cdigo mediante una tabla de
instrucciones de salto. Este sistema es utilizado normalmente en la programacin en ensamblador aunque estas 194.1 Ejemplo
tablas tambin pueden ser generadas por un compilador.
Una tabla de saltos consiste en una lista de instrucciones
de salto incondicional que se ejecutan utilizando un oset
creado mediante la multiplicacin de un ndice secuencial
por la longitud de la instruccin (los bytes que ocupa en
memoria cada instruccin). Se basa en el hecho de que
las instrucciones de salto en cdigo mquina tienen una
longitud ja y pueden ser ejecutadas de forma extremadamente eciente por la mayora del hardware, adems
de ser ms til cuando se trabaja con datos sin formato
fcilmente convertibles a valores secuenciales de ndice.
Dados estos datos, una tabla de saltos suele ser bastante
eciente, siguiendo normalmente estos pasos: validacin
opcional de los datos de entrada, transformacin de los
mismos en un oset dentro de la tabla de saltos (esto suele necesitar multiplicarlos o desplazarlos para su longitud
coincida con las instrucciones de salto) y salto a una direccin obtenida a partir de la base de la tabla y el oset
generado (esta operacin suele incluir la suma del oset
al registro del contador de programa).

Un ejemplo simple del uso de tablas de saltos en ensamblador del microcontrolador PIC de 8 bits es:

Otro mtodo de implementacin de las tablas de saltos


consiste en un array de direcciones desde las cuales es
capturada la direccin necesaria para saltar. Este mtodo
suele implicar un menor tamao del cdigo y evita los
saltos indirectos. Normalmente el mtodo empleado para
construir la tabla de saltos suele venir determinada por la
arquitectura del procesador en el cual va a ser ejecutado
el cdigo.

194.2 Historia

Las tablas de saltos suelen usarse en el desarrollo de


sistemas operativos. Tanto las llamadas al sistema como
las funciones de biblioteca pueden ser referenciadas mediante un ndice entero de una tabla de saltos. Con esto se
consigue una mejora de la compatibilidad con las versiones siguientes: si el cdigo de una funcin y la direccin
de su destino de salto son modicados, solamente har
falta reajustar la instruccin de salto en la tabla, de este
modo todas las aplicaciones compiladas utilizando cdigo de la biblioteca y/o sistema operativo en cuestin no
necesitan modicacin alguna. Adems, las llamadas a

movf INDEX, W ; mover el valor de ndice al registro


W (registro de trabajo) desde la direccin de memoria
INDEX addwf PCL, F ; sumarlo al registro de contador
de programa (PCL). Cada instruccin PIC ocupa 1 byte
; de modo que no es necesario realizar ninguna multiplicacin. La mayora de las arquitecturas transformaran ;
el ndice de alguna manera antes de sumarlo al contador
de programa table ; esta etiqueta marca el comienzo de
la tabla de salto goto index_zero ; cada una de estas instrucciones goto es un salto incondicional a diferentes secciones goto index_one ; del cdigo goto index_two goto
index_three index_zero ; en esta parte se aadira el cdigo necesario para realizar cualquier accin que requiera
que el valor de INDEX sea igual a cero return index_one
...

El uso de las tablas de saltos y de la representacin de


los datos sin formato mediante ndices era comn en los
inicios de la informtica cuando las memorias eran caras
y los procesadores lentos, siendo la representacin compacta de los datos y la eleccin eciente de las alternativas
de almacenamiento dos factores importantes. Tambin se
ven con frecuencia en los sistemas empotrados modernos,
donde suele hacer falta que el cdigo quepa en espacios
realmente mnimos y que a la vez opere de manera eciente. La principal ventaja de tal conversin es que una
vez que un valor ha sido convertido a un ndice, puede
ser utilizado para saltar o para recuperar algn dato de
una tabla de bsqueda de forma eciente y en cualquier
momento sin necesidad de ser convertido de nuevo. Por
ejemplo, se podra decir que, relativamente, hay pocos
pases en el mundo; de forma que stos podran ser representados de manera sencilla mediante un cdigo de pas

357

358
en lugar de por una cadena de texto. Esto evita almacenamientos masivos de datos y por consiguientes grandes
tiempos de procesado. Las comparaciones numricas son
signicativamente ms rpidas que las de cadenas de texto, y las bsquedas indexadas son tambin notablemente
ms rpidas que las de cadenas. Sin embargo, entre las
desventajas se incluye la aparicin de un nivel ms de
indireccin. Esto es de poca importancia para los ordenadores, pero supone mayor complejidad de cdigo y de
datos para el programador. Adems, tal y como se pudo ver en el Efecto 2000, esta aproximacin al problema
puede llevar posteriormente a problemas si los requisitos
de espacio para el ndice o la representacin superan a los
reservados para la tarea.

194.3 Enlaces externos


HOWTO sobre la implementacin de tablas de saltos en C

CAPTULO 194. TABLA DE SALTOS

Captulo 195

Tabla de verdad
Una tabla de verdad, o tabla de valores de verdad, Negacin La negacin es un operador que se ejecues una tabla que muestra el valor de verdad de una ta, sobre un nico valor de verdad, devolviendo el valor
proposicin compuesta, para cada combinacin de ver- contradictorio de la proposicin considerada.
dad que se pueda asignar.* [1]
Fue desarrollada por Charles Sanders Peirce por los
aos 1880, pero el formato ms popular es el que introdujo Ludwig Wittgenstein en su Tractatus logicophilosophicus, publicado en 1921.

A
V
F

A
F
V

Conjuncin La conjuncin es un operador que acta


dos valores de verdad, tpicamente los valores de
195.1 Deniciones en el clculo l- sobre
verdad de dos proposiciones, devolviendo el valor de vergico
dad verdadero cuando ambas proposiciones son verdaderas, y falso en cualquier otro caso. Es decir es verdadera
Para establecer un Sistema formal se establecen las de- cuando ambas son verdaderas
niciones de los operadores. Las deniciones se harn en La tabla de verdad de la conjuncin es la siguiente:
funcin del n que se pretenda al construir el sistema que
haga posible la formalizacin de argumentos:
A B AB
V
V
V
Como razonamientos deductivos lgico-lingsticos
V F
F
F V
F
Como construccin de un sistema matemtico puro
F F
F
Como una aplicacin lgica en un Circuito de conQue se corresponde con la columna 8 del algoritmo funmutacin.
damental.
en simbologia "^" hace referencia a el conector y
Verdadero El valor verdadero se representa con la letra V; si se emplea notacin numrica se expresa con un
Disyuncin La disyuncin es un operador que acta
uno: 1; en un circuito elctrico, el circuito est cerrado.
sobre dos valores de verdad, tpicamente los valores de
verdad de dos proposiciones, devolviendo el valor de verFalso El valor falso se representa con la letra F; si se dad verdadero cuando una de las proposiciones es verdaemplea notacin numrica se expresa con un cero: 0; en dera, o cuando ambas lo son, y falso cuando ambas son
un circuito elctrico, el circuito est abierto.
falsas.
La tabla de verdad de la disyuncin es la siguiente:
Variable Para una variable lgica A, B, C, ... que pueden ser verdaderas V, o falsas F, los operadores fundamentales se denen as:

A
V
F

A
V
F

A
V
V
F
F

B
V
F
V
F

AB
V
V
V
F

Que se corresponde con la columna 2 del algoritmo fundamental.


359

360

CAPTULO 195. TABLA DE VERDAD

Implicacin o Condicional El condicional material es


un operador que acta sobre dos valores de verdad, tpicamente los valores de verdad de dos proposiciones, devolviendo el valor de falso slo cuando la primera proposicin es verdadera y la segunda falsa, y verdadero en
cualquier otro caso.
La tabla de verdad del condicional material es la siguiente:

A
V
V
F
F

B
V
F
V
F

AB
V
F
V
V

n
0
1
2
3
4
5
...
n

Nc
1
2
4
8
16
32
...
2n

Si consideramos que un sistema combinacional de n variables binarias, puede presentar un resultado verdadero:
V, o falso: F, para cada una de las posibles combinaciones
de entrada tenemos que se pueden construir Cp circuitos
posibles con n variables de entrada, donde:

Que se corresponde con la columna 5 del algoritmo fundamental.


n

Cp = 22
Equivalencia, doble implicacin o Bicondicional El
bicondicional o doble implicacin es un operador que
funciona sobre dos valores de verdad, tpicamente los valores de verdad de dos proposiciones, devolviendo el valor
de verdad verdadero cuando ambas proposiciones tienen
el mismo valor de verdad, y falso cuando sus valores de
verdad son diferentes.
La tabla de verdad del bicondicional es la siguiente:

A
V
V
F
F

B
V
F
V
F

AB
V
F
F
V

Que da como resultado la siguiente tabla:

n
0
1
2
3
4
5
...
n

Cp
2
4
16
256
65. 536
4. 294.967.296
...
n
22

Para componer una tabla de verdad, pondremos las n variables en una lnea horizontal, debajo de estas variables
desarrollamos las distintas combinaciones que se pueden
formar con V y F, dando lugar a la distintas Nc, nmero de combinaciones. Normalmente solo se representa la
Que se corresponde con la columna 7 del algoritmo fun- funcin para la que se confecciona la tabla de verdad, y en
damental.
todo caso funciones parciales que ayuden en su clculo,
en la gura, se pueden ver todas las combinaciones posibles Cp, que pueden darse para el nmero de variables
dado.

195.2 Nmero de combinaciones

Partiendo de un nmero n de variables, cada una de las


cuales puede tomar el valor verdadero: V, o falso: F,
por Combinatoria, podemos saber que el nmero total de
combinaciones: Nc, que se pueden presentar es:

N c = 2n
el nmero de combinaciones que se pueden dar con n variable, cada una de las cuales puede tomar uno entre dos
valores lgicos es de dos elevado a n, esto es, el nmero de combinaciones: Nc, tiene crecimiento exponencial
respecto al nmero de variable n:

Nc

A B

1 2 3 4 5 6 7

V
V
F
F

V
V
V
V

V
F
V
F

V
V
V
F

V
V
F
V

V
V
F
F

V
F
V
V

V
F
V
F

V
F
F
V

195.3. TABLAS DE VERDAD


As podemos ver que para dos variables binarias: A y B,
n= 2 , que pueden tomar los valores V y F, se pueden
desarrollar cuatro combinaciones: Nc= 4, con estos valores se pueden denir diecisis resultados distintos, Cp=
16, cada una de las cuales seria una funcin de dos variables binarias. Para otro nmero de variables se obtendrn los resultados correspondientes, dado el crecimiento exponencial de Nc, cuando n toma valores mayores
de cuatro o cinco, la representacin en un cuadro resulta compleja, y si se quiere representar las combinaciones
posibles Cp, resulta ya complejo para n= 3.

361
Considrese adems a "" como una operacin o funcin
lgica que realiza una funcin de verdad al tomar los valores de verdad de A y de B, y devolver un nico valor de
verdad. Entonces, existen 16 funciones distintas posibles,
y es fcil construir una tabla que muestre qu devuelve cada funcin frente a las distintas combinaciones de valores
de verdad de A y de B.

Las dos primeras columnas de la tabla muestran las cuatro


combinaciones posibles de valores de verdad de A y de
B. Hay por lo tanto 4 lneas, y las 16 columnas despliegan
195.2.1 Para cero variables
todos los posibles valores que puede devolver una funcin
Un circuito sin variables, puede presentar una combina- "".
cin posible: Nc=1, con dos circuitos posibles: Cp=2. De esta forma podemos conocer mecnicamente, meQue seran el circuito cerrado permanentemente, y el cir- diante algoritmo, los posibles valores de verdad de cualcuito abierto permanentemente.
quier conexin lgica interpretada como funcin, siempre
y cuando denamos los valores que devuelva la funcin.
Se hace necesario, pues, denir las funciones que se utilizan en la confeccin de un sistema lgico.
En este caso se puede ver que no interviene ninguna vaDe especial relevancia se consideran las deniciones para
riable.
el Clculo de deduccin natural y las puertas lgicas
Cada uno de estos circuitos admite una nica posicin y en los circuitos electrnicos.
hay dos circuitos posibles.

195.2.2

Para una variable

195.3 Tablas de verdad

El caso de una variable binaria, que puede presentar dos Las tablas nos maniestan los posibles valores de verdad
combinaciones posibles: Nc=2, con 4 circuitos posibles: de cualquier proposicin molecular, as como el anlisis
de la misma en funcin de las proposicones que la inteCp=4.
gran, encontrndonos con los siguientes casos:

195.3.1 Verdad Indeterminada o Contin-

Los casos 1 y 4 coinciden con los de cero variables, el


gencia
caso 2 la salida es la de la variable y el caso 3 la negacin
de la variable.
Se entiende por verdad contingente, o verdad de hecho,
aquella proposicin que puede ser verdadera o falsa, segn los valores de las proposiciones que la integran. Sea
195.2.3 Para dos variables
el caso: A (B C) .
Considrese dos variables proposicionales A y B.* [2] Cada una puede tomar uno de dos valores de verdad: o V
(verdadero), o F (falso). Por lo tanto, los valores de verdad de A y de B pueden combinarse de cuatro maneras
distintas: o ambas son verdaderas; o A es verdadera y B
falsa, o A es falsa y B verdadera, o ambas son falsas. Esto
puede expresarse con una tabla simple:

Su tabla de verdad se construye de la siguiente manera:


Ocho las que responden a los casos posibles que pueden
darse segn el valor V o F de cada una de las proposiciones A, B, C. (Columnas 1, 2, 3)
Una columna (Columna 4) en la que se establecen los valores de B C aplicando la denicin del disyuntor a los
valores de B y de C en cada una de las las.(Columnas 2,3
4)

A
V
V
F
F

B
V
F
V
F

Una columna (columna 5) en la que se establecen los valores resultantes de aplicar la denicin de la conjuncin
entre los valores de A (columna 1) y valores de la columna
B C , (columna 4) que representarn los valores de la
proposicin completa A (B C) , cuyo valor de ver-

362

CAPTULO 195. TABLA DE VERDAD

dad es V o F segn la la de los valores de A, B, y C que No obstante la sencillez del algoritmo, aparecen dos diconsideremos. (Columnas 1,4 5)
cultades.
Donde podemos comprobar cundo y por qu la proposicin A (B C) es V y cundo es F.

195.3.2

Contradiccin

La gran cantidad de operaciones que hay que hacer


para una proposicin con ms de 4 variables.
Esta dicultad ha sido magncamente superada por la
rapidez de los ordenadores, y no presenta dicultad alguna.

Se entiende por proposicin contradictoria, o contradic Que nicamente ser aplicable a un esquema de incin, aquella proposicin que en todos los casos posibles
ferencia, o argumento cuando la proposicin condide su tabla de verdad su valor siempre es F. Dicho de otra
cionada, como conclusin, sea previamente conociforma, su valor F no depende de los valores de verdad de
da, al menos como hiptesis, hasta comprobar que
las proposiciones que la forman, sino de la forma en que
su tabla de verdad maniesta una tautologa.
estn establecidas las relaciones sintcticas de unas con
otras. Sea el caso:
Por ello se construye un clculo mediante cadenas deductivas:
Las proposiciones que constituyen el antecedente del esquema de inferencia, se toman como premisas de un arProcederemos de manera similar al caso anterior. Par- gumento.
tiendo de la variable A y su contradiccin, la conjuncin Se establecen como reglas de clculo algunas tautologas
de ambos siempre es falso, dado que si A es verdad su como tales leyes lgicas, (pues garantizan, por su carcter
contradiccin es falsa, y si A es falsa su contradiccin es tautolgico, el valor V).
verdad, la conjuncin de ambas da falso en todos los caSe permite la aplicacin de dichas reglas como reglas de
sos.
sustitucin de frmulas bien formadas en las relaciones
que puedan establecerse entre dichas premisas.
A A

195.3.3

Tautologas

Deduciendo mediante su aplicacin, como teoremas, todas las conclusiones posibles que haya contenidas en las
Se entiende por proposicin tautolgica, o tautologa, premisas.
aquella proposicin que en todos los casos posibles de su
tabla de verdad su valor siempre es V. Dicho de otra for- Cuando en un clculo se establecen algunas leyes como
ma, su valor V no depende de los valores de verdad de principios o axiomas, el clculo se dice que es axiomtico.
las proposiciones que la forman, sino de la forma en que El clculo lgico as puede utilizarse como demostracin
estn establecidas las relaciones sintcticas de unas con argumentativa.
otras. Sea el caso:

A A
Siguiendo la mecnica algortmica de la tabla anterior
construiremos su tabla de verdad, tenemos la variable A
en disyuncin con su contradiccin, si A es verdad, su negacin es falsa y si A es falsa su negacin es verdad, en
cualquier caso una de las dos alternativas es cierta, y su
disyuncin es cierta en todos los casos.

195.5 Aplicaciones
195.5.1 Clculo lgico
La aplicacin fundamental se hace cuando se construye
un sistema lgico que modeliza el lenguaje natural sometindolo a unas reglas de formalizacin del lenguaje. Su
aplicacin puede verse en el clculo lgico.

195.4 Tablas de verdad, proposi- 195.5.2 Lgica de circuitos


ciones lgicas y argumentos Una aplicacin importante de las tablas de verdad procede del hecho de que, interpretando los valores lgicos de
deductivos
verdad como 1 y 0 (lgica positiva) en el sentido que
En realidad toda la lgica est contenida en las tablas de
verdad, en ellas se nos manifesta todo lo que implican las
relaciones sintcticas entre las diversas proposiciones.

valor 1permite el paso de corriente elctrica; y


valor 0corta el paso de dicha corriente.

195.5. APLICACIONES

363
El primer caso en una funcin lgica que para todas las
posibles combinaciones de A y B, el resultado siempre es
verdadero, es un caso de tautologa, su implementacin
en un circuito es una conexin ja.

V
Caso 2

Puertas lgicas para circuitos elctricos

En este segundo caso el resultado solo es falso si A y B son


falsos, si una de las dos variables es verdad el resultado es
verdad.
La funcin seria:

Los valores de entrada o no entrada de corriente a travs de un diodo pueden producir una salida 0 1 segn
las condiciones denidas como funcin segn las tablas A B
mostradas anteriormente.
Caso 3
As se establecen las algunas funciones bsicas: AND,
NAND, OR, NOR, XOR, XNOR (o NXOR), que se coEn el tercer caso es verdad si A es verdad y cuando A y
rresponden con las funciones denidas en las columnas 8,
B son falsos el resultado tambin es verdad.
9, 2, 15, 10 y 7 respectivamente, y la funcin NOT.
Su funcin seria:
En lugar de variables proposicionales, considerando las
posibles entradas como EA y EB, podemos armar una
tabla anloga de 16 funciones como la presentada arriba,
A B
con sus equivalentes en lgica de circuitos.
Esta aplicacin hace posible la construccin de aparatos
Caso 4
capaces de realizar estas computaciones a alta velocidad,
y la construccin de circuitos que utilizan este tipo de En el cuarto caso la funcin es cierta si A es cierta, los
anlisis se hace por medio de puertas lgicas.
posibles valores de B no inuyen en el resultado.
La Tabla de la verdad es una herramienta imprescindible La funcin solo depende de A:
en la recuperacin de datos en las bases de datos como
Internet con los motores de bsqueda o en una biblioteca
con sus cheros informatizados. As mismo se utilizan
para programar simulaciones lgicas de inteligencia arti- A
cial con lenguajes propios. Tambin en modelos mate Caso 5
mticos predictores: meteorologa, marketing y otros muchos.
En el quinto caso si A es falso el resultado es verdadero,
y si A y B son verdaderos el resultado tambin es verdadero, puede verse que este caso es idntico al tercero
195.5.3 Desarrollo del algoritmo funda- permutando A por B.

mental en lgica de circuitos


La denicin de la tabla de verdad corresponde a funciones concretas, en cada caso, as como a implementaciones en cada una de las tecnologas que pueden representar
funciones lgicas en binario, como las puertas lgicas o
los circuitos de conmutacin. Se entender como verdad
la conexin que da paso a la corriente; en caso contrario
se entender como falso. Veamos la presentacin de los
diecisis casos que se presentan con dos variables binarias
A y B:
Caso 1

Y si funcin es:

AB =AB
Caso 6
En el sexto caso la funcin es cierta si B es cierta, los
valores de A no inuyen en el resultado.
La funcin solo depende de B:

364
Caso 7

CAPTULO 195. TABLA DE VERDAD


Caso 13

El sptimo caso corresponde a la relacin 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 B) ( A B) = A B
Caso 8

A
Caso 14

En el octavo caso el resultado es verdad si A y B son verdad, en el resto de los valores de A y B el resultado es
falso, corresponde a la conjuncin de A y B, equivalente
a un circuito en serie.

Caso decimocuarto, el resultado de la funcin solo es verdad si A es falso y B verdadero, luego es equivalente a un
circuito en serie de A en conexin inversa y de B en conexin directa.

AB

AB

Caso 9

Caso 15

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 disyuncin de la negacin 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 16

Caso 10

Por ltimo en el caso decimosexto, tenemos que el resultado siempre es falso independientemente de los valores
Podemos ver que el dcimo caso es lo opuesto a la bide 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)
Caso 11
En este caso podemos ver que cuando B es verdad el resultado es falso y que cuando B es falso el resultado es
verdadero, independientemente del valor de A, luego la
funcin solo depende de B, en sentido inverso.

195.6 Vase tambin


Operador lgico
Anexo:Tabla de smbolos matemticos
Lenguaje formalizado
lgebra de Boole

B
Caso 12
En el caso doce, vemos que solo hay un combinacin de
A y B con resultado verdadero, que es A y la negacin de
B.

Clculo lgico
Lgica binaria
Lgica proposicional
Puerta lgica
Funcin lgica

A B

Funcin de verdad

195.8. ENLACES EXTERNOS

195.7 Notas y referencias


[1] truth table (en ingls), The Concise Oxford Dictionary of Mathematics, Oxford University Press,
http://www.oxfordreference.com/views/ENTRY.html?
subview=Main&entry=t82.e2895, consultado el 8 de
octubre de 2009
[2] Las letras A y B son metavariables, es decir pertenecen
a un metalenguaje respecto a un lenguaje-objeto; por ello
simbolizan cualquier proposicin, atmica o no, del lenguaje de la lgica proposicional.

195.8 Enlaces externos


TABLAS DE VERDAD
Tablas De Verdad
Tablas de Verdad
Lgica matemtica

365

Captulo 196

Thunk
Thunk es un trmino usado en la jerga del desarrollo de
software que designa la llamada o invocacin a un cdigo
que pertenece a otra plataforma o a otro Framework. En
el paso de 16 a 32 bit por ejemplo, los sistemas operativos
(OS/2, Windows NT etc.) podan resolver cdigo de 16
bit a travs de la transformacin de los parmetros de llamadas y direcciones, de modo tal que fue posible seguir
utilizando los programas de 16 bit.

public ref class CManagedClass { private: System::Int32


m_i; public: void SetValue( int i ) { m_i = i; // Implementacin del tipo de datos } };

Las clases nativas C++ en un proyecto C++/CLI. Aqu se


puede ver que tambin el camino inverso es posible, es
decir, instanciar el cdigo gestionado dentro de una clase
no gestionada. La condicin es, sin embargo, que se trate
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 apamada del cdigo nativo desde el cdigo gestionado y vi- rece en la instruccin gcnew, ya que aqu se invoca al
ceversa (vase 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 =
sicin, en la que las convenciones y/o parmetros de in- 42; CManagedClass^ pManagedClass = gcnew CManavocacin tienen que transformarse correspondientemente gedClass(); pManagedClass->SetValue( i ); } };
(Marshalling). El lenguaje de programacin C++/CLI del
.NET-Framework de Microsoft fue concebido especialmente para posibilitar tales thunks en ambas direcciones:

196.3 Bibliografa

196.1 Invocacin por gestionada


a no gestionada
Sea dada una clase nativa en C++, por ejemplo un proyecto C++ o como parte integrante de un proyecto C++/CLI,
que se utilizar ms abajo en cdigo gestionado:
public class CNativeClass { private: int m_i; public: void
SetValue( int i ) { m_i = i; } };
La clase gestionada C++/CLI (que en esta forma puede
ser directamente instanciada, por ejemplo, en C#), la cual
utiliza la clase nativa mostrada anteriormente:
public ref class CManagedClass { public: CManagedClass() { System::Int32 i = 42; CNativeClass* pNativeClass = new CNativeClass(); pNativeClass->SetValue( i
); // Implementacin del tipo de datos delete pNativeClass; } };

196.2 Invocacin por no gestionada a gestionada


La clase gestionada C++/CLI :
366

Marcus Heege: Expert C++/CLI. Apress Verlag,


Berkeley 2007, ISBN 978-1-59059-756-9, Captulo
9, p. 203 y siguientes.

Captulo 197

Tipo de dato elemental


Se llama tipo primitivo o tipo elemental a los tipos de
datos originales de un lenguaje de programacin, esto es,
aquellos que nos proporciona el lenguaje y con los que
podemos (en ocasiones) construir tipos de datos abstractos y estructuras de datos.
Generalmente ejemplos de tipos primitivos son:
Char (Carcter)
Int (Entero)
Float (Real - Coma otante)
Otros tipos de datos que pueden ser considerados primitivos ya que la mayora de lenguajes de programacin as
los proporcionan (aunque no todos) son:
Booleano (Lgico: Verdadero, Falso)
String (Cadena de caracteres)
Puntero (Direccin de memoria - Int)

367

Captulo 198

Tringulo de Floyd
El Tringulo de Floyd, llamado as en honor a Robert
Floyd, es un tringulo rectngulo formado con nmeros
naturales. Para crear un tringulo de Floyd, se comienza con un 1 en la esquina superior izquierda, y se contina escribiendo la secuencia de los nmeros naturales de
manera que cada lnea contenga un nmero ms que la
anterior:

198.3 Referencias

Una de los ejercicios ms comunes en los cursos de introduccin a la programacin de ordenadores consiste en
escribir un pequeo programa que produzca este tringulo.* [1]* [2] El tringulo de Floyd tiene varias propiedades
matemticas interesantes. Los nmeros del cateto de la
parte izquierda forman la secuencia de los nmeros poligonales centrales, mientras que los de la hipotenusa nos
dan el conjunto de los nmeros triangulares. La suma de
los nmeros de la lnea n equivale a n(n2 + 1)/2 (sucesin
A006003 en OEIS).

198.1 Algoritmo computacional


En PSeInt es:
Denir TAMANIO Como Entero; TAMANIO <- 10;
Denir i, j, t Como Enteros; t <- 1; Escribir Tringulo
Floyd"; Para i <- 1 Hasta TAMANIO Con Paso 1 Hacer
Para j <- t Hasta t + i - 1 Con Paso 1 Hacer Escribir
j, " " Sin Bajar; FinPara Escribir ""; t <- t + i; FinPara
FinProceso
En Java es:
public class TrianguloFloyd { public static void
main(String[] args) { nal int TAMANO = 10; int t = 1;
System.out.println("\nTringulo Floyd\n); for (int i =
1; i <= TAMANO; ++i) { for (int j = t; j <= t + i - 1; ++j)
{ System.out.print(j + "\t); } System.out.println("\n
); t += i; } } }

198.2 Vase tambin


Tringulo de Pascal
368

[1] Keller, Arthur M. (1982), A rst course in computer programming using PASCAL, McGraw-Hill, p. 39.
[2] Peters, James F. (1986), Pascal with program design, Holt,
Rinehart and Winston, pp. 137, 154.

Captulo 199

Tubera (informtica)

La comunicacin por medio de tuberas se basa en la interaccin productor/consumidor, los procesos productores (aquellos que envan 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 tubera.

Las tuberas (pipes) estn implementadas en forma muy


eciente en los sistemas operativos multitarea, iniciando
todos los procesos al mismo tiempo, y atendiendo automticamente los requerimientos de lectura de datos para
cada proceso cuando los datos son escritos por el proceso anterior. De esta manera el planicador 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 mayora de los sistemas
operativos implementan las tuberas usando buers, lo
que permite al proceso proveedor generar ms datos que
lo que el proceso consumidor puede atender inmediatamente.
Podemos distinguir dos tipos de tuberas:
Tubera sin nombre Las tuberas sin nombre tienen
asociado un chero en memoria principal, por lo
tanto, son temporales y se eliminan cuando no estn
siendo usados ni por productores ni por consumidores. Permiten la comunicacin entre el proceso que
crea un cauce y procesos hijos tras la creacin de la
tubera.
Tubera con nombre Su diferencia respecto a las tuberas sin nombre radica en que el cauce se crea en el
sistema de archivos, y por lo tanto no tienen carcter
temporal. Se manejan mediante llamadas al sistema
(open, close, read y write) como el resto de cheros
del sistema. Permiten la comunicacin entre los procesos que usen dicha tubera, aunque no exista una
conexin jerrquica entre ellos.

Tubera y barra partida.

En informtica, una tubera (pipe, cauce o '|') consiste


en una cadena de procesos conectados de forma tal que
la salida de cada elemento de la cadena es la entrada del
prximo. Permiten la comunicacin y sincronizacin entre procesos. Es comn el uso de buer de datos entre
elementos consecutivos.

199.1 Vase tambin

369

Arquitectura en pipeline (informtica)


Tubera (Unix)

370

CAPTULO 199. TUBERA (INFORMTICA)

Pleca

Wikcionario tiene deniciones y otra informacin sobre tubera (informtica).Wikcionario

Captulo 200

Violacin de acceso
Se dene como violacin de acceso (violacin del segmento o access violation y segmentation fault en Ingls)
al intento fallido de acceso a informacin o a programas
a los que no se tiene autorizacin para ver o modicar.
Este mensaje puede ser causado por la conguracin de
software, por los programadores o por falla de hardware,
siendo los ms comunes los 2 primeros.
Con los sistemas operativos actuales, cada proceso tiene
uno o ms segmentos de la memoria del sistema donde
puede almacenar y recuperar la informacin. Cada proceso puede solicitar ms o menos memoria (segn lo necesitado), y la peticin ser reconocida por el sistema operativo y comparada con la seccin de memoria concedida
para el proceso. Generalmente, el proceso que solicit la
memoria es el nico que puede leerla o modicarla.
Una violacin de acceso ocurre cuando un proceso trata
de acceder a una parte de la memoria asignada a otra aplicacin, o a una rea no usada de la memoria, no teniendo los permisos para hacerlo. Normalmente se produce
como resultado de un error de programacin, por ejemplo, un puntero descarriado. Otra forma en que podra
producirse unsegmentation faultes con una memoria
daada fsicamente, puesto que algn programa escribir
en la memoria, luego intentar acceder a esos datos, pero al tener una falla la memoria, es posible que los datos
se hayan borrado, por ende el programa considerar esa
direccin de memoria como vaca, o sea no usada, con lo
que arrojar el error.

200.1 Vase tambin


Error de software.
Agujero de seguridad.

371

Captulo 201

Waf
Waf es una herramienta que ayuda a congurar automticamente la compilacin y la instalacin de otros programas o bibliotecas (build).

Informacin en pantalla colorida y barra de progreso.


Los scripts son mdulos de Python.

201.1 Funciones

Esquema modular de conguracin con anlisis personalizable en lnea de comandos.

General

Modo demonio para el historial de recompilacin.

Es portable a sistemas Unix y no-Unix.


Es ligero.

Busca archivos fuente de forma inteligente para facilitar el mantenimiento del script .

Ofrece un lenguaje de programacin real (similar a


SCons).

Soporta cach de objetos global para evitar compilaciones innecesarias.

Soporta objetivos estndar: congurar, compilar,


limpiar, instalar y desinstalar.

Soporta la ejecucin de pruebas(test) en los programas al nal de la compilacin.

Requerimientos
No requiere instalacin: el script WAF (menos de 201.2 Historia
100KB) puede ser distribuido y utilizado directamente.
Era alrededor del ao 2005, el proyecto KDE us durante mucho tiempo el Autotools como su principal sistema
Slo necesita a Python como dependencia externa.
de construccin. Autotools tiene una arquitectura que es
difcil de comprender, y ha sido apodadoauto-inerno
No requiere sh (a diferencia de GNU Autotools).
.,* [1] en KDE estaban considerando la posibilidad de pa No requiere de conocimientos acerca de M4 (a di- sar de Autotools a SCons.
ferencia de GNU Autotools).
Thomas Nagy haba creado una herramienta de construccin automatizada llamada BKsys que fue diseada para
Soporte de lenguajes:
colocarse encima de SCons, proporcionando mayor nivel
de funcionalidad similar a la de autotools. Cuando Thomas Nagy decide que los problemas fundamentales de
Preprocesador de dependencias C/C++.
SCons (sobre todo la mala escalabilidad) eran demasia Soporte para programas hbridos en OCaml, en pro- do complejos y requeran mucho tiempo para arreglarse,
gramas de GNOME.
comienza una reescritura completa llamada Waf.
Soporte para el lenguaje de programacin D (tanto Waf fue objeto de un poco de atencin cuando el proyecto en KDE decidieron utilizar BKsys (y ms tarde WAF)
GDC y dmd son compatibles).
como su principal sistema de construccin, aunque ms
Proyectos escritos en vala son soportados ( como tarde, esa decisin fue revocada en favor de CMake porVal(a)IDE ).
que BKsys no pudo resolver los problemas de SCons, y
Waf todava estaba en una fase muy temprana de desaOtros:
rrollo (pre-alfa) en ese momento.* [1]
372

201.6. ENLACES EXTERNOS

201.3 Ejemplo Waf archivo


A continuacin se muestra una wscript muy simple, que
incluir una fuente llamada hola-mundo.cusando el
compilador C por defecto.
top = '.' out = 'build' def set_options(opt):
opt.tool_options('compiler_cc') def congure(conf):
conf.check_tool('compiler_cc')
def
build(bld):
bld(source = 'hello-world.c', target = 'hello-world',
features = 'cc cprogram')
El proyecto se construye con el siguiente comando:
waf congure build

201.4 Vase tambin


CMake
GNU build system
SCons

201.5 Referencias
[1] Por qu el proyecto KDE cambi a CMake(ingles)

201.6 Enlaces externos


Waf pgina de inicio
GNOME, usado WAF?
Proyectos de Uso Waf

373

Captulo 202

Win32 Thread Information Block


En computacin, el Win32 Thread Information Block
(TIB) es una estructura de datos en los sistemas Win32,
especcamente en la arquitectura x86, que almacena informacin acerca del hilo que se est ejecutando. Tambin es conocido como el Thread Environment Block
(TEB).* [1]

Ejemplos en C inlined-assembly para x86 de 32 bits:

// gcc (AT&T-style inline assembly). void *getTIB() {


void *pTib; __asm__(movl %%fs:0x18, %0: "=r
(pTib) : : ); return pTib; }
// Microsoft C void *getTib() { void *pTib; __asm {
mov EAX, FS:[18h] mov [pTib], EAX } return pTib; }
El TIB no est documentado ocialmente 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( 0x18 ); return pTib; }
dependiente de subsistema. El emulador Wine incluye declaraciones para el TIB extendido (una parte especica
del subsistema). Todava 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 cdigo producido por el
Under The Hood - MSJ, May 1996
propio compilador de Microsoft.* [1]
Wine HQ
El TIB puede ser usado para obtener una buena cantidad de informacin sobre el proceso sin tener que llamar
a ninguna API de Win32 (por ejemplo, emulaciones de
GetLastError() , GetVersion() ). A travs del puntero al
PEB se puede obtener acceso a las tablas de importacin
(IAT), los argumentos de inicio pasados al proceso, nombre de la imagen, etc.

202.1 Contenido del TIB


FS conduce a un TIB que est incorporado en un bloque
de datos conocido como el TDB (Thread Data Base). El
TIB contiene la cadena de manejo de excepciones especco a cada hilo y punteros al TLS (Thread Local Storage).
El TLS no es lo mismo que el C local storage.

202.2 Acceso al TIB


El TIB se puede acceder como un desplazamiento del segmento de registro FS.
No es comn acceder a campos del TIB por medio de un
desplazamiento desde FS:[0], sino que primero se obtiene
un puntero de auto-referencia lineal a ste, almacenado en
FS:[0x18]. Este puntero se puede usar con aritmtica de
punteros o se puede transformar a un puntero struct.
374

[1]

Captulo 203

Wrapper

Wikcionario tiene deniciones y otra informacin sobre wrapper.Wikcionario

Wrapper (en castellano empaquetador), es un trmino


ingls que generalmente se reere a un tipo de embalaje,
tal como una hoja plana de papel, celofn o plstico para
envolver un objeto.

203.1 Computacin
Funcin wrapper, una funcin cuyo principal propsito es llamar a otra funcin.
Biblioteca wrapper
Driver wrapper, software que funciona como
un adaptador entre un sistema operativo y un
driver.
Patrn Wrapper, donde algunos cdigos de
programacin permiten que ciertas clases trabajen juntas, lo que no sera posible de otra
forma.
Clase wrapper, trmino de computacin que se reere a una clase Java en programacin orientada a
objetos.
TCP Wrapper, software usado para ltrar el acceso
a la red.
Wrapper (Minera de datos), tcnica usada en la minera de datos.

203.2 Vase tambin


Framework

203.3 Referencias
Esta obra deriva de la traduccin parcial de Wrapper
de Wikipedia en ingls, concretamente de esta versin del 15 de mayo de 2014, publicada por sus editores bajo la Licencia de documentacin libre de
375

GNU y la Licencia Creative Commons AtribucinCompartirIgual 3.0 Unported.


Esta obra deriva de la traduccin parcial de Wrapper
de Wikipedia en portugus, publicada por sus editores bajo la Licencia de documentacin libre de
GNU y la Licencia Creative Commons AtribucinCompartirIgual 3.0 Unported.

Captulo 204

XAML
XAML (acrnimo pronunciado xammel del ingls
eXtensible Application Markup Language, Lenguaje Extensible de Formato para Aplicaciones en espaol) es el
lenguaje de formato para la interfaz de usuario para la
Base de Presentacin de Windows (WPF por sus siglas en
ingls) y Silverlight(wpf/e), el cual es uno de lospilares
de la interfaz de programacin de aplicaciones .NET en
su versin 3.0 (conocida con anterioridad con el nombre
clave WinFX).

como un recurso en un ensamblado de Framework .NET.


En el momento de ejecucin, el motor del Framework extrae el archivo .baml de los recursos del ensamblado, se
analiza sintcticamente, y crea el correspondiente rbol
visual WPF o Workow.

En su uso tpico, los archivos tipo XAML seran producidos por una herramienta de diseo visual, como
Microsoft Visual Studio o Microsoft Blend. El XML resultante es interpretado en forma instantnea por un subsistema de despliegue de Windows que reemplaza al GDI
de las versiones anteriores de Windows. Los elementos de
XAML se interconectan con objetos del Entorno Comn
de Ejecucin para Lenguajes. Los atributos se conectan
con propiedades o eventos de esos objetos.

de workow es todava XOML. [4][5]

Cuando se use en Windows Presentation Foundation,


XAML es usado para describir interfaces visuales para
usuarios. WPF permite la denicin de objetos en 2D y
3D, rotaciones, animaciones y otra variedad de caracteXAML es un lenguaje declarativo basado en XML, opti- rsticas y efectos.
mizado para describir grcamente interfaces de usuarios
Cuando es usado en el contexto de Windows Workow
visuales ricas desde el punto de vista grco, tales co- Foundation, XAML es usado para describir lgica demo 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 estndar de la organizacin W3C, el de sistemas de modelado y herramientas. El formato de
cual soporta grcos, animaciones, audio y video inte- serializacin para WorkFlows haba sido llamado previagrados, 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 diferenciacin ya no existe. Sin embarbasado en XML.
go las extensiones de los archivos que contienen marcado

XAML fue diseado para soportar las clases y mtodos


de la plataforma de desarrollo .NET que tienen relacin
con la interaccin con el usuario, en especial el despliegue
en pantalla. El acrnimo XAML originalmente signicaba Extensible Avalon Markup Language, Lenguaje
Extensible de Formato de Avalon; habiendo sido Avalon el nombre clave original de la Base de Presentacin
de Windows, nombre que engloba a este grupo de clases
de .NET.

204.2 Ejemplos
Este ejemplo en XAML muestra un textoHola Mundo!"
dentro de un contenedor del tipo Canvas.
<Canvas
xmlns="http://web.archive.org/web/http:
//schemas.microsoft.com/client/2007"
xmlns:x=\_
_xunadd_text_character:nN{\textquotedbl}{"}{}http:
//web.archive.org/web/http://schemas.microsoft.
com/winfx/2006/xaml">
<TextBlock>Hola
Mundo!</TextBlock> </Canvas>

204.3 Vase tambin


Microsoft Expression Blend (Herramienta de Microsoft que utiliza XAML)

204.1 Tecnologa
Un archivo XAML puede ser compilado para obtener un
archivo binario XAML .baml, el cual puede ser insertado
376

Adobe Flex
JavaFX

204.5. ENLACES EXTERNOS


OpenLaszlo
XUL
ZUL

204.4 Referencias
204.5 Enlaces externos
Microsoft Expression
Blog del Equipo de Silverlight (espaol)
Blog del Equipo de Expression(espaol)
Informacin general sobre XAML
United XAML Initiative - Alternativas a XAML de
cdigo libre.
Editor XAML gratuito - Aurora

377

Captulo 205

Zenphp
205.1 Qu es zenphp?
zenphp es un completo framework con cdigo fuente,
comentarios y documentacin en espaol. Hace las tareas de creacin de aplicaciones, no slo para la web,
ms sencillas gracias al patrn MVC modicado, y una
jerarqua que conecta los componentes de forma que cada parte es accesible mediante variables "$padre. Est
desarrollado en PHP 4 y 5, de forma que es compatible
con la mayor parte de los servidores web. Ha sido probado en numerosos proyectos reales. Es posible usarlo para
conectar con sistemas gestores de bases de datos como
MySQL, PostgreSQL, Oracle o Microsoft SQL Server.
Se puede ejecutar por tanto en plataformas *nix (Unix,
Linux, etc.) como en plataformas Windows. Hace uso
de varios lenguajes de programacin:HTML, XHTML,
CSS, JavaScript, PERL(CGI), AJAX, PHP, Gtk y XML
Se llama zen PHP porque no slo simplicamucho
el cdigo sino que es llevado con la mxima concentracin y poco a poco, cada vez ms lejos, en cada versin,automticamente, instantneamente se van generando nuevas lneas de trabajo...

205.2 Qu
ventajas
zenphp?

ofrece

Separacin de las capas de informacin en 3 fases


bien distinguidas: diseo de la aplicacin, comunicacin con el sistema y resultados visibles.
Sencillez yluminosidaddel cdigo, comprensible
de un vistazo y simple.
Realizacin de tareas complejas,pretratamiento de
datos de entrada/salida,etc.
Posibilidad de automatizacin para AJAX
Generadores de cdigo, formularios, plantillas, consultas,etc.

378

205.3. ORIGEN DEL TEXTO Y LAS IMGENES, COLABORADORES Y LICENCIAS

379

205.3 Origen del texto y las imgenes, colaboradores y licencias


205.3.1

Texto

Programacin Fuente: https://es.wikipedia.org/wiki/Programaci%C3%B3n?oldid=87243057 Colaboradores: Youssefsan, EL Willy, Soniautn, Sabbut, Moriel, Josmanbernal, Sauron, ManuelGR, Sanbec, Javier Carro, Dodo, Ejmeza, Fortran~eswiki, Ascnder, Rsg, Tostadora,
Tano4595, Fernandomirandamuro, Jecanre, Pablomdo, Cinabrium, Porao, Elsenyor, Renabot, Richy, FAR, Mejiad, Mendocino, Digigalos,
Sicarul, Airunp, Edub, Emijrp, Magister Mathematicae, Viko~eswiki, Guanxito, Murven, Unf, Mikel Gmez, Dromero, Yrbot, Vitamine,
BOTijo, Ivancp, GermanX, Jyon, Gaijin, Quiron, The Photographer, Lucascr, Jesuja, Tigerfenix, Eduardo Lima, Gtz, Morza, Ciencia Al
Poder, Cheveri, Chlewbot, Tomatejc, Zanaqo, Rbonvall, Electrican MV, Jstitch, BOTpolicia, Qwertyytrewqqwerty, CEM-bot, Jorgelrm,
Krli2s, Laura Fiorucci, Chabacano, X.Cyclop, Retama, Rosarinagazo, Antur, Dorieo, Thijs!bot, Esoya, Alvaro qc, Jonpagecr, RoyFocker,
Isha, Rrmsjp, JAnDbot, Jugones55, Cmontero, Kved, Pmisiones, Mansoncc, Bboccioz, NaBUru38, Humberto, Netito777, Xsm34, Marvelshine, Nioger, Chabbot, Plux, Biasoli, AchedDamiman, Snakeyes, Technopat, Matdrodes, Autonomia, Fernando Estel, Elabra sanchez, Lic.
Armando, BlackBeast, Shooke, Lucien leGrey, Sdfk, Dinopmi, Gerakibot, SieBot, Ctrl Z, Cousteau, Ortellado, Manw, Correogsk, 3xxx,
Mafores, Yonseca, Tirithel, Jarisleif, Javierito92, Amorde2, Eduardosalg, Leonpolanco, Botito777, Petruss, Aliuk, Moucaisius, JMDC,
UA31, SergioN, AVBOT, David0811, Diegusjaimes, IATG, Jjorescueto, CarsracBot, HerculeBot, Arjuno3, Andreasmperu, Luckas-bot,
Jaromero, Cata11, Roinpa, Bifus, Jotterbot, Vitucho3005, ArthurBot, SuperBraulio13, Xqbot, Jkbw, NeoTommy, Serolillo, Pedrovicenterosero, Voetius, Chester269, Albertochoa, Torrente, Botarel, BenzolBot, Stuy, MauritsBot, TigreVMMM, MAfotBOT, Gusbelluwiki,
Linux65, RedBot, KamikazeBot, Slashcsc, Dinamik-bot, Angelito7, Ripchip Bot, Tarawa1943, GrouchoBot, EmausBot, Savh, HRoestBot,
Sergio Andres Segovia, Fabian Rod, Rubpe19, Jcaraballo, ChuispastonBot, Merryt, Waka Waka, WikitanvirBot, Upc, RobotEducativo,
Renly, Communities, AvicBot, Sebrev, Travelour, Acratta, Brainup, LlamaAl, EnzaiBot, Helmy oved, DavidUlquiorra, MaKiNeoH, Ovallesoft, Xx.the.samuel.xx, Ivanretro, Addbot, Balles2601, Advarg, Tenganmemiedo, Qwerty asdfg zxcvb, Eliazibh Bojorquez, MrCharro,
Jarould, Eurodyne, Sapristi1000, Castillo.melanii y Annimos: 437
Portal:Programacin Fuente: https://es.wikipedia.org/wiki/Portal%3AProgramaci%C3%B3n?oldid=68731535 Colaboradores: Emijrp,
Jesuja, Bienchido, AchedDamiman, VolkovBot, Shooke, PaintBot, KLBot2, MetroBot, Addbot y Annimos: 1
& Fuente: https://es.wikipedia.org/wiki/%26?oldid=87472056 Colaboradores: Josemoya, Rosarino, Cookie, Tano4595, Rodrigouf,
M3c4n0, Edupedro, Jo-Con-El, Taichi, Emijrp, LP, Kenedhor, Orgullobot~eswiki, RobotQuistnix, Platonides, Caiserbot, Amads, BOTSuperzerocool, YurikBot, Martingala, Armin76, KnightRider, Kazahana, No s qu nick poner, Ephraim33, DivByZ, Faelomx, Futbolero, Cerato, SaulPerdomo, Qwertyytrewqqwerty, Nethac DIU, CEM-bot, Jorgelrm, Al2, Corbu, Araltor, Penquista, Rastrojo, Antur, D.o,
Thijs!bot, Zigurat, JAnDbot, Mansoncc, TXiKiBoT, Aalvarez12, Humberto, Guillermo D.~eswiki, Rei-bot, Chabbot, Plux, Bucephala,
Aibot, Vicdesan, Technopat, Lahi, DRMProd, Matdrodes, RandomJambo, Muro Bot, Edmenb, SieBot, Bigsus-bot, BOTarate, Ceat 700,
Greek, Tirithel, Farisori, Eduardosalg, TronaBot, Petruss, Osado, Purbo T, Abajo estaba el pez, AVBOT, LucienBOT, Marifernan, Lampsako, Luckas-bot, 67wkii, Almabot, Jkbw, Cally Berry, TobeBot, Alph Bot, GrouchoBot, AVIADOR, WikitanvirBot, Serlack, KLBot2,
Bibliolotranstornado, Stramin, Ralgisbot, Thegastiinthedark, Jarould, ~Expresses life y Annimos: 68
Acoplamiento secuencial Fuente: https://es.wikipedia.org/wiki/Acoplamiento_secuencial?oldid=65390358 Colaboradores: Kavanagh,
Hctor Guido Calvo, Invadibot, Dalbela y Addbot
Adobe Director Fuente: https://es.wikipedia.org/wiki/Adobe_Director?oldid=79460596 Colaboradores: BOT-Superzerocool, BOTijo,
FedericoMP, Sinopsis, Boja, Faelomx, BOTpolicia, Mampato, CEM-bot, Laura Fiorucci, Muro de Aguas, JoseA, Rei-bot, Plux, VolkovBot, Muro Bot, SieBot, Pedro Felipe, Ivgarci, Mit3d, Alecs.bot, Alexbot, Orgullo Illustrator, Spider pig, BotSottile, AVBOT, Diegusjaimes, MelancholieBot, Luckas-bot, Wikisilki, Dangelin5, Ortisa, AstaBOTh15, EmausBot, Grillitus, Ruos, MerlIwBot, KLBot2,
Elvisor, Helmy oved, Ralgisbot, Digmin3 y Annimos: 19
Anidamiento (informtica) Fuente: https://es.wikipedia.org/wiki/Anidamiento_(inform%C3%A1tica)?oldid=72430597 Colaboradores:
Muro Bot, Poco a poco, Dangelin5, MaxBech1975, Patasik, EmausBot, KLBot2, Gins90, Harpagornis y Annimos: 3
Antipatrn de diseo Fuente: https://es.wikipedia.org/wiki/Antipatr%C3%B3n_de_dise%C3%B1o?oldid=87450852 Colaboradores: Pacoqueen, Vanbasten 23, Rosarino, Fortran~eswiki, Ascnder, Tostadora, Porao, Benjavalero, Renabot, RobotQuistnix, YurikBot, GermanX, KnightRider, Dmlambea~eswiki, Cad, Zoid, CEM-bot, Davius, Thijs!bot, Yeza, Kavanagh, Gitano.canalla, Pvent, Kijote, PJTraill,
VolkovBot, Jarm.yo, Technopat, Lauramcastro, SieBot, Ozewi, Pablo323, BetoCG, Zeliq, BotSottile, Diegusjaimes, Amirobot, Ptbotgourou, Vic Fede, Xqbot, Silvioq, AstaBOTh15, Enrique Cordero, ArwinJ, Xiidarkevil, EmausBot, ZroBot, WikitanvirBot, MovGP0,
KLBot2, MetroBot, Addbot y Annimos: 44
Archivo de cabecera Fuente: https://es.wikipedia.org/wiki/Archivo_de_cabecera?oldid=84684202 Colaboradores: Sabbut, Basquetteur,
CEM-bot, BlackSalamander, Cratn, Isha, JAnDbot, TXiKiBoT, Phirosiberia, Muro Bot, MaSt, Poco a poco, Kroji, MastiBot, Angel GN,
DumZiBoT, Luckas-bot, Marioxcc, SuperBraulio13, Xqbot, Jkbw, Panderine!, KamikazeBot, Mr.Ajedrez, Sergio Andres Segovia, Grillitus,
Hoo man, MerlIwBot, Elvisor, Addbot y Annimos: 15
Asercin (informtica) Fuente: https://es.wikipedia.org/wiki/Aserci%C3%B3n_(inform%C3%A1tica)?oldid=87499440 Colaboradores:
Robbot, BOT-Superzerocool, GermanX, Escarbot, Fabeirojorge, Carmin, Poco a poco, MystBot, Alph Bot, Waeswaes, EmausBot, ZroBot,
KLBot2, Bibliolotranstornado, Elvisor y Annimos: 5
Automatizacin de tareas Fuente: https://es.wikipedia.org/wiki/Automatizaci%C3%B3n_de_tareas?oldid=74686365 Colaboradores:
CF, Walking Mind, Technopat, BlackBeast, PaintBot, M S, Farisori, Diegusjaimes, DiegoFb, Victor carmonag, Jkbw, Khavas, RodolfoLay
y Annimos: 5
Base de cdigo Fuente: https://es.wikipedia.org/wiki/Base_de_c%C3%B3digo?oldid=86838733 Colaboradores: GermanX, CEM-bot y
KLBot2
Bean Fuente: https://es.wikipedia.org/wiki/Bean?oldid=84356720 Colaboradores: Pilaf, Sunsinron, Robotico, Soulreaper, Taichi, FlaBot,
Rosarinagazo, Desert69, Kved, VolkovBot, Carmin, Umondri, PatruBOT, Canyq, Goica, Dark Bane, HRoestBot, ChuispastonBot, Addbot
y Annimos: 26
Beta tester Fuente: https://es.wikipedia.org/wiki/Beta_tester?oldid=77021285 Colaboradores: SimnK, Digigalos, FlaBot, Varano, Vitamine, GermanX, Smrolando, Nethac DIU, CEM-bot, Marianov, Madoks, JAnDbot, TXiKiBoT, Krun00, Mstreet linux, Muro Bot, Fadesga,
UA31, AVBOT, MastiBot, Ezarate, Arjuno3, Hoenheim, SuperBraulio13, Jkbw, Ignasi Gorina, Irak Gaitn, Addbot, BOTito y Annimos:
10

380

CAPTULO 205. ZENPHP

Bifurcacin (sistema operativo) Fuente: https://es.wikipedia.org/wiki/Bifurcaci%C3%B3n_(sistema_operativo)?oldid=83423061 Colaboradores: Yearofthedragon, Niqueco, Chobot, FlaBot, Qwertyytrewqqwerty, TXiKiBoT, VolkovBot, Shooke, PaintBot, Diegusjaimes,
Ptbotgourou, DiegoFb, Kizar, ZroBot, ChessBOT, MerlIwBot, KLBot2, Martin Ariel Ramirez, Porrasporrasporras y Annimos: 11
Binding Fuente: https://es.wikipedia.org/wiki/Binding?oldid=79485676 Colaboradores: Robbot, Loco085, Airunp, Genba, Yrbot, Beto29,
CEM-bot, Thijs!bot, Gusgus, Segedano, Aika~eswiki, Synthebot, Muro Bot, Farisori, Jerowiki, Diamondland, MerlIwBot, KLBot2, Elvisor,
Addbot, Hipocamp15 y Annimos: 8
Bloqueo mutuo Fuente: https://es.wikipedia.org/wiki/Bloqueo_mutuo?oldid=74685861 Colaboradores: Sabbut, Moriel, Sauron, Vanbasten 23, Dodo, Sms, Niqueco, Hari Seldon, Rembiapo pohyiete (bot), RobotQuistnix, Francosrodriguez, Superzerocool, Caiserbot, Yucon, Yrbot, BOT-Superzerocool, Martincarr, YurikBot, GermanX, Gothmog, Tigerfenix, Eskimbot, CEM-bot, Isha, Dogor, JAnDbot,
TXiKiBoT, Rei-bot, NaSz, VolkovBot, Matdrodes, Estirabot, Leonpolanco, Alexbot, BotSottile, AVBOT, Luckas-bot, Amirobot, Jkbw,
AstaBOTh15, D'ohBot, PatruBOT, Waeswaes, EmausBot, ZroBot, Elvisor, Legobot, Ideator 2.0 y Annimos: 21
Bodyshopping Fuente: https://es.wikipedia.org/wiki/Bodyshopping?oldid=80659893 Colaboradores: SimnK, Yrbot, Varano, Olea,
CEM-bot, Tortillovsky, Isha, Phirosiberia, Rolloqui, Muro Bot, Diegusjaimes, Marcomogollon, Caritdf, Grillitus, Johnbot, Elvisor y Annimos: 12
BrookGPU Fuente: https://es.wikipedia.org/wiki/BrookGPU?oldid=68993723 Colaboradores: Boticario, CEM-bot, Montgomery, Filiprino, VolkovBot, Alexbot, Krysthyan, AVBOT, Bethan 182, InaBOT, MerlIwBot, KLBot2, Elvisor, EduLeo y Annimos: 3
Caja blanca (sistemas) Fuente: https://es.wikipedia.org/wiki/Caja_blanca_(sistemas)?oldid=85453584 Colaboradores: Carutsu, Xexito,
Cinevoro, Robertorp, Espilas, Nicop, Farisori, VkN, UA31, AVBOT, Angel GN, KLBot, MerlIwBot, KLBot2, YeltFlor y Annimos: 11
Caja negra (sistemas) Fuente: https://es.wikipedia.org/wiki/Caja_negra_(sistemas)?oldid=85423326 Colaboradores: Oblongo, Jesuja,
Davius, Tortillovsky, Amire80, JAnDbot, VolkovBot, Synthebot, Muro Bot, Feministo, Loveless, David.Horat, XalD, Cyborg ar, Alejandro
Lodes, UA31, AVBOT, Diegusjaimes, CarsracBot, Luckas-bot, Ptbotgourou, DiegoFb, Botarel, MondalorBot, PatruBOT, Dinamik-bot,
Angelito7, Foundling, Wikilptico, EmausBot, HRoestBot, WikitanvirBot, MerlIwBot, KLBot2, TeleMania, Elvisor, MahdiBot, AS-W,
BOTito, Jarould, Crystallizedcarbon y Annimos: 33
CamelCase Fuente: https://es.wikipedia.org/wiki/CamelCase?oldid=80299007 Colaboradores: Robbot, Miuler, Ascnder, Fernandomirandamuro, Fleam, Emijrp, Rembiapo pohyiete (bot), Aadrover, RobotQuistnix, Maquiavelo, Yrbot, Baito, BOT-Superzerocool, FlaBot,
BOTijo, Eskimbot, Floppy3, Rei-bot, Biasoli, VolkovBot, Technopat, Chechurisk, Muro Bot, SieBot, Loveless, Mrfoxtalbot, Jaontiveros,
Alexbot, MastiBot, Luckas-bot, MystBot, Marioxcc, Vivaelcelta, Invelg, Yago AB, EmausBot, David camelo, Grillitus, Albertojuanse,
WikitanvirBot, KLBot2, Allan Aguilar, Makecat-bot, Addbot y Annimos: 28
Caml Fuente: https://es.wikipedia.org/wiki/Caml?oldid=86731214 Colaboradores: UAwiki y Brivadeneira
Cierre de exclusin mutua Fuente: https://es.wikipedia.org/wiki/Cierre_de_exclusi%C3%B3n_mutua?oldid=77602139 Colaboradores:
Periku, Boticario, Yrbot, Martincarr, YurikBot, GermanX, CEM-bot, Thijs!bot, Dogor, CommonsDelinker, VolkovBot, Muro Bot, Racso,
STBot~eswiki, Luckas-bot, Amirobot, Diogeneselcinico42, EmausBot, WikitanvirBot, Dexbot, Legobot y Annimos: 3
Clase utilidad Fuente: https://es.wikipedia.org/wiki/Clase_utilidad?oldid=22946124 Colaboradores: Matiasmoreno, Muro Bot, Gizbot y
Annimos: 1
Clear.gif Fuente: https://es.wikipedia.org/wiki/Clear.gif?oldid=35650490 Colaboradores: Eloy, CEM-bot, Beaire1 y Annimos: 1
CMake Fuente: https://es.wikipedia.org/wiki/CMake?oldid=87507838 Colaboradores: Emijrp, Anonimato1990, El Pantera, Menthalo,
UA31, Billinghurst, Monkey.libre, Paroga, KLBot2, Conopo, Silentter y Annimos: 8
Codecademy Fuente: https://es.wikipedia.org/wiki/Codecademy?oldid=85518557 Colaboradores: Eloy, CEM-bot, CommonsDelinker,
Fremen, TheDarkFear, EmausBot, Grillitus, Invadibot, Flashlack, Harry Canyon, Quethzel, Jaod98 y Annimos: 4
Cdigo cerrado Fuente: https://es.wikipedia.org/wiki/C%C3%B3digo_cerrado?oldid=85015301 Colaboradores: Pino, Joseaperez, Dodo,
Ejrrjs, Ascnder, Sms, Yakoo, JCCO, Digigalos, Hari Seldon, RobotQuistnix, FlaBot, Usrwp, AtilaElHuno, Gabriel Acquistapace, Thijs!bot,
JAnDbot, TXiKiBoT, Rei-bot, AlnoktaBOT, Shooke, Muro Bot, SieBot, PaintBot, Javierito92, Marcecoro, UA31, X-DNA-X, DiegoFb,
MerlIwBot, Addbot, Balles2601 y Annimos: 12
Cdigo compilado Fuente: https://es.wikipedia.org/wiki/C%C3%B3digo_compilado?oldid=83041666 Colaboradores: CEM-bot, Netito777, AchedDamiman, Muro Bot, PaintBot, Farisori, DiegoFb, Jarould, Ivan santillo y Annimos: 1
Cdigo mutante Fuente: https://es.wikipedia.org/wiki/C%C3%B3digo_mutante?oldid=65069407 Colaboradores: Hari Seldon, Tomatejc,
Sirpuppet, AchedDamiman, VolkovBot, Muro Bot, PaintBot, BOTarate, Farisori, DiegoFb, Jorge c2010, Addbot y Annimos: 2
Cdigo objeto Fuente: https://es.wikipedia.org/wiki/C%C3%B3digo_objeto?oldid=84835561 Colaboradores: Oblongo, Moriel, ManuelGR, Sms, Rsg, Rembiapo pohyiete (bot), RobotQuistnix, Yrbot, Baito, Icvav, GermanX, Jesuja, Aleator, Chabacano, Escarlati,
Thijs!bot, TXiKiBoT, Gacq, Rei-bot, Biasoli, Shooke, AlleborgoBot, Muro Bot, Loveless, BOTarate, Marodok, AVBOT, Arjuno3, Luckasbot, Kender00, RedBot, PatruBOT, KamikazeBot, GrouchoBot, EmausBot, Grillitus, ChuispastonBot, Legobot, DarkBlueZV, Jarould y
Annimos: 21
Ofuscacin Fuente: https://es.wikipedia.org/wiki/Ofuscaci%C3%B3n?oldid=86976670 Colaboradores: JMPerez, Nuen, Thijs!bot, Matdrodes, Alejandroadan, BenzolBot, Gusbelluwiki, Acastiello, Elvisor, Addbot, Comnetgt y Annimos: 14
ColdFusion Fuente: https://es.wikipedia.org/wiki/ColdFusion?oldid=84655763 Colaboradores: Pino, Tostadora, Benjavalero, Boticario,
Yrithinnd, Taichi, RobotQuistnix, Yrbot, FlaBot, GermanX, The Photographer, Aladiah, FedericoMP, Kekkyojin, Mrpollo, Faelomx,
CEM-bot, Thijs!bot, Ernesto r., JAnDbot, C4rlitoz, Tuliopa, Spa karmona, TXiKiBoT, AlnoktaBOT, Shinji14, AlleborgoBot, Muro Bot,
Bucho, Rrrafa, BotMultichill, SieBot, Loveless, Abrenoite, WikiBotas, Alexbot, LucienBOT, Emiliot11, HerculeBot, Nallimbot, Cristianpark, Ptbotgourou, Xqbot, TiriBOT, Alph Bot, EmausBot, KLBot2, LlamaAl, Elvisor, Legobot y Annimos: 23
Coloreado de sintaxis Fuente: https://es.wikipedia.org/wiki/Coloreado_de_sintaxis?oldid=77127817 Colaboradores: Oblongo, Murphy
era un optimista, Barcex, Ictlogist, RobotQuistnix, Icvav, Eloy, Antur, Diosa, Isha, JAnDbot, Humberto, Biasoli, Dusan, VolkovBot, AlleborgoBot, Muro Bot, SieBot, Pan con queso, MenoBot, Heallo, AVBOT, MastiBot, Luckas-bot, WikiDreamer Bot, Xqbot, Josemiguel93,
Adryitan, EmausBot, Guarddon, Grillitus, Diego Moya, Gcosta87, Draug, Legobot y Annimos: 16

205.3. ORIGEN DEL TEXTO Y LAS IMGENES, COLABORADORES Y LICENCIAS

381

Comentario (informtica) Fuente: https://es.wikipedia.org/wiki/Comentario_(inform%C3%A1tica)?oldid=86674487 Colaboradores:


Joseaperez, Corso, Jachguate, Emijrp, Adrruiz, Gtz, Faelomx, CEM-bot, Isha, Gaius iulius caesar, Xosema, Netito777, VolkovBot, Matdrodes, Drinibot, BOTarate, Eduardosalg, Poco a poco, Ucevista, LucienBOT, MastiBot, TheDarkFear, Diegusjaimes, MelancholieBot,
Luckas-bot, Gperaltascura, SuperBraulio13, Jkbw, Kyng, Rubinbot, Desiben, Waeswaes, Edslov, EmausBot, Adri128, Grillitus, WikitanvirBot, Metrnomo, KLBot2, Invadibot, Elvisor, DarkBlueZV y Annimos: 15
Compatibilidad (informtica) Fuente: https://es.wikipedia.org/wiki/Compatibilidad_(inform%C3%A1tica)?oldid=85054771 Colaboradores: Elwikipedista, Emijrp, Yrbot, BOTijo, Gejotape, Dmitri Lytov, Isha, Plux, AchedDamiman, Technopat, Elabra sanchez, Shooke,
Muro Bot, Fadesga, Farisori, Botito777, Jcaraballo, MerlIwBot, Elvisor, Addbot y Annimos: 12
Competicin Internacional Universitaria ACM de Programacin Fuente: https://es.wikipedia.org/wiki/Competici%C3%B3n_
Internacional_Universitaria_ACM_de_Programaci%C3%B3n?oldid=87462212 Colaboradores: Sabbut, Sanbec, Boticario, BOTSuperzerocool, Jgaray, Banderas, CEM-bot, Ingenioso Hidalgo, Xxim, Xavigivax, Plux, Atomic 007, AlleborgoBot, Loblesa, BOTarate,
Botito777, MastiBot, Diegusjaimes, Luckas-bot, MystBot, Xqbot, TobeBot, ZroBot, Elvisor, ShersonLazaro, Legobot, Cbretana,
LucasMCG y Annimos: 31
Computacin parasitaria Fuente: https://es.wikipedia.org/wiki/Computaci%C3%B3n_parasitaria?oldid=65029794 Colaboradores: Aeveraal, CEM-bot, Argaldo, Muro Bot, KLBot2 y Annimos: 1
Conectiva lgica Fuente: https://es.wikipedia.org/wiki/Conectiva_l%C3%B3gica?oldid=87466604 Colaboradores: Niceforo, Dodo, Ascnder, Julian Colina, Xenoforme, Superzerocool, Caiserbot, Memiux, Yrbot, GermanX, JAGT, Jesuja, Er Komandante, Rdds, Ivan romero, CEM-bot, Damifb, Davius, Julian Mendez, Zufs, TXiKiBoT, MONIMINO, Snakeyes, Matdrodes, Elabra sanchez, Mary dream,
Edmenb, SieBot, Francisco Mochis, Drinibot, Jarisleif, Dnu72, Alejandrocaro35, AVBOT, Cegik, Diegusjaimes, Davidgutierrezalvarez,
Arjuno3, Dangelin5, Equiman, Luis Felipe Schenone, ArthurBot, SuperBraulio13, Xqbot, Jkbw, GNM, Danke7, Igna, Foundling, Grillitus,
Gusama Romero, Acratta, Addbot, Anderper, Jarould, TheGamerSexy y Annimos: 64
Conguracin regional Fuente: https://es.wikipedia.org/wiki/Configuraci%C3%B3n_regional?oldid=77882164 Colaboradores: Faelomx, Thijs!bot, Biasoli, Fadesga, Nallimbot, ArthurBot, Xqbot, Born2bgratis, Dinamik-bot, EmausBot, Grillitus, JackieBot, WikitanvirBot, Makecat-bot y Addbot
Conteo de referencias Fuente: https://es.wikipedia.org/wiki/Conteo_de_referencias?oldid=65063546 Colaboradores: Niqueco, Pinar~eswiki, Thijs!bot, Muro Bot, SieBot, Luckas-bot, DiegoFb, Hoenheim, D'ohBot, Hprmedina, Dinamik-bot, EmausBot y KLBot2
Convencin de Nombres (Programacin) Fuente: https://es.wikipedia.org/wiki/Convenci%C3%B3n_de_Nombres_(Programaci%C3%
B3n)?oldid=87413749 Colaboradores: BOT-Superzerocool, Bngs, FrescoBot, Grillitus, KLBot2, MetroBot, Elvisor, Omixam, JSuarezB,
BenjaBot y Annimos: 4
Cracking (software) Fuente: https://es.wikipedia.org/wiki/Cracking_(software)?oldid=73824018 Colaboradores: Robbot, Alakasam,
JAnDbot, ARNT, TXiKiBoT, ColdWind, Xvazquez, Biasoli, Poco a poco, MystBot, Jotterbot, Xqbot, Kizar, Sermed, Alph Bot, ChessBOT,
Grillitus, WikitanvirBot, KLBot2 y Damianiencowiki
Cuaderno de carga Fuente: https://es.wikipedia.org/wiki/Cuaderno_de_carga?oldid=66426276 Colaboradores: Tomatejc, Boja, CEMbot, Montgomery, Resped, Muro Bot, HUB y Annimos: 3
Curricacin Fuente: https://es.wikipedia.org/wiki/Currificaci%C3%B3n?oldid=86841892 Colaboradores: Rbonvall, Rosarinagazo, SITOMON, Nolaiz, VolkovBot, Loveless, BOTarate, Poco a poco, OMFGROFLMAO, Angelito7, ChuispastonBot, Elvisor, Addbot y Annimos: 1
Cdigo enhebrado Fuente: https://es.wikipedia.org/wiki/C%C3%B3digo_enhebrado?oldid=87343406 Colaboradores: GermanX, Cinevoro, Shooke, Muro Bot, ZroBot, Elvisor, Addbot y Annimos: 1
Cdigo inalcanzable Fuente: https://es.wikipedia.org/wiki/C%C3%B3digo_inalcanzable?oldid=79130740 Colaboradores: CEM-bot, Cinevoro, Waeswaes, Grillitus, Invadibot, Rotlink y Addbot
Cdigo muerto Fuente: https://es.wikipedia.org/wiki/C%C3%B3digo_muerto?oldid=80068437 Colaboradores: Sabbut, GermanX, CEMbot, Angelito7, Waeswaes, Invadibot, Addbot y Annimos: 1
Cdigo redundante Fuente: https://es.wikipedia.org/wiki/C%C3%B3digo_redundante?oldid=79134303 Colaboradores: CEM-bot,
Waeswaes, Grillitus, Invadibot y Addbot
Dato Fuente: https://es.wikipedia.org/wiki/Dato?oldid=87217423 Colaboradores: PACO, Moriel, Sauron, JorgeGG, Pilaf, Angus, Wiki Wikardo~eswiki, Bigsus, Interwiki, Cookie, Tano4595, Robotito, Dianai, Jpodjarny, Porao, Alphabravotango, Digigalos, Soulreaper,
Hispa, Airunp, Taichi, Emijrp, RobotQuistnix, Alhen, Chobot, Yrbot, Baito, Vitamine, .Sergio, YurikBot, Icvav, KnightRider, The Photographer, Jesuja, Maldoror, Er Komandante, Filipo, Siabef, Alexquendi, Locutus Borg, BOTpolicia, Klondike, Damifb, Laura Fiorucci,
-jem-, Davius, Antur, Montgomery, Escarbot, CED, RoyFocker, IrwinSantos, Isha, Egaida, Dogor, Gusgus, JAnDbot, Ana wiki, TXiKiBoT, Humberto, Idioma-bot, Plux, Biasoli, AchedDamiman, Cinevoro, VolkovBot, Technopat, Mr. Benq, Matdrodes, Lucien leGrey,
Edmenb, Racso, Dodecaedro, SieBot, Manw, Correogsk, Aleposta, Tirithel, Jarisleif, Javierito92, Marcecoro, HUB, Nicop, Farisori,
Eduardosalg, Leonpolanco, Alejandrocaro35, Furti, Aipni-Lovrij, UA31, AVBOT, David0811, Alejandro bera, MastiBot, MarcoAurelio, NjardarBot, Diegusjaimes, CarsracBot, HerculeBot, Arjuno3, Andreasmperu, Luckas-bot, SuperBraulio13, Jkbw, Igna, Botarel, SUL,
MondalorBot, TobeBot, Vubo, Leugim1972, PatruBOT, Dinamik-bot, Duuk-Tsarith, Tarawa1943, Foundling, Edslov, EmausBot, Savh,
AVIADOR, MercurioMT, Jcaraballo, Waka Waka, WikitanvirBot, Richardedu, Rezabot, MerlIwBot, JABO, Laencilclopedialibre, Deivis,
Travelour, Vichock, Gusama Romero, Hcurti, Acratta, Mega-buses, rico, Santga, Helmy oved, Syum90, Faustinogay, Addbot, Balles2601,
Chivogay, Edergay, Rancho gudy, JacobRodrigues, CamiloBer04, Joyaso123, Jarould, Matiia, Raelth, Fearinghealer, Gaby Medina Murillo,
JuanCalamidad, Ariel0345, Losperritos, Fernando2812l y Annimos: 286
Depuracin de programas Fuente: https://es.wikipedia.org/wiki/Depuraci%C3%B3n_de_programas?oldid=81463985 Colaboradores:
Kristobal, Ejrrjs, Sms, Rsg, Felipealvarez, Renabot, Rembiapo pohyiete (bot), Wastingmytime, OMenda, Orgullobot~eswiki, Chobot,
Yrbot, Baito, YurikBot, GermanX, KnightRider, CEM-bot, ARHEKI, Thijs!bot, JAnDbot, Gsrdzl, Guirrohl, Biasoli, Gmarinp, Muro
Bot, J.M.Domingo, SieBot, PaintBot, Djblack!, Facucario, Alejandrocaro35, Pedromanchon, Diegusjaimes, Luckas-bot, Amirobot, Xqbot,
Jkbw, Rocafort8, BOTirithel, Kizar, Waeswaes, EmausBot, HRoestBot, Grillitus, WikitanvirBot, Lexinerus, MerlIwBot, Erick Capslock,
Legobot, Addbot, Jarould, Gregory serrata y Annimos: 23

382

CAPTULO 205. ZENPHP

Desarrollador de software Fuente: https://es.wikipedia.org/wiki/Desarrollador_de_software?oldid=86789961 Colaboradores: SimnK,


Herenvardo, Vitamine, BOTijo, CEM-bot, Thijs!bot, JAnDbot, Antipatico, TXiKiBoT, Rei-bot, VolkovBot, Shooke, Lucien leGrey, BotMultichill, Loveless, Marcecoro, DragonBot, BetoCG, Nallimbot, DiegoFb, ArthurBot, Xqbot, AnselmiJuan, PatruBOT, EmausBot, CocuBot, MerlIwBot, KLBot2, Wrotetool, Legobot, Hazel.rojas96, Jarould y Annimos: 11
Desarrollo en cascada Fuente: https://es.wikipedia.org/wiki/Desarrollo_en_cascada?oldid=87023744 Colaboradores: Ejmeza, Ejrrjs,
Richy, FAR, Edub, Yrithinnd, Orgullobot~eswiki, Penyaskito, Unf, Alhen, Superzerocool, Yrbot, Vitamine, Icvav, GermanX, JRGL, Kepler Oort, Axxgreazz, CEM-bot, Osepu, Fsd141, Thijs!bot, Jonpagecr, Mahadeva, Isha, Ppedrodom, Infovoro, TXiKiBoT, Humberto,
Decorrea, Plux, VolkovBot, WarddrBOT, Technopat, Jose gueredo, Matdrodes, DJ Nietzsche, SieBot, Irtusb, Greek, Jossue130987,
Marcecoro, Feperozpo, Nicop, UA31, AVBOT, SpBot, Diegusjaimes, Bethan 182, MelancholieBot, Luckas Blade, Tremal Naik, Arjuno3,
Luckas-bot, Nallimbot, Roinpa, Markoszarrate, Barteik, Gacpro, ArthurBot, SuperBraulio13, Jkbw, Torrente, Jesua3005, PatruBOT, Tarawa1943, GrouchoBot, EmausBot, Africanus, Grillitus, Almogo, Alexandermark, WikitanvirBot, Lcsrns, MerlIwBot, Ayaita, Renciw,
Adribeex, Harpagornis, Elvisor, Asqueladd, Bolivarista, Rotlink, Legobot, Melgar22, Bordierrez, Jedijor14, Julianromera, IsaacReal, Jonxa22, Ikeri122 y Annimos: 206
Desarrollo en espiral Fuente: https://es.wikipedia.org/wiki/Desarrollo_en_espiral?oldid=85593490 Colaboradores: PACO, Vanbasten 23,
Sanbec, Dodo, Rikaaii, Cookie, Murphy era un optimista, Msxgopr, Cinabrium, Balderai, Kordas, Taragui, Pezezin~eswiki, Airunp, Rembiapo pohyiete (bot), Orgullobot~eswiki, RobotQuistnix, LarA, Caiserbot, Yrbot, Oscar ., BOTijo, Martingala, GermanX, The Photographer, Galle, Siabef, Tamorlan, CEM-bot, Meltryth, Ignacio Icke, Rafa sanz, GuiXu, Retama, Osepu, EcLiB, Thijs!bot, Escarbot, RoyFocker,
Isha, Kved, Yamaneko, Infovoro, Muro de Aguas, Netito777, Xsm34, Plux, Javierxar, VolkovBot, Technopat, Jose gueredo, Matdrodes,
Shooke, Muro Bot, Bucho, Jmvgpartner, SieBot, PaintBot, Gospelepsog, Cumanacr, Leonpolanco, Caucas, SergioN, AVBOT, Adelpine,
Diegusjaimes, Arjuno3, Kmilovc, Xqbot, Jkbw, Botarel, Ereguero, ErikvanB, Jorge c2010, Savh, Grillitus, Bpk, MerlIwBot, Thehelpfulbot,
Gins90, Adribeex, Johnbot, MarioCar88, Legobot, Nito18, Thawk101, Jarould y Annimos: 142
Desarrollo iterativo y creciente Fuente: https://es.wikipedia.org/wiki/Desarrollo_iterativo_y_creciente?oldid=81974918 Colaboradores:
Vanbasten 23, Yrbot, Varano, Martingala, CEM-bot, Osepu, Isha, Corvocativo, LeinaD natipaC, Redjhawk, Technopat, Jose gueredo,
BlackBeast, Muro Bot, Botito777, UA31, Diegusjaimes, Bloomy, DixonDBot, Foundling, Grillitus, Davidarturo21, MerlIwBot, AvicBot,
Addbot, Farnhey, Nathy2893, Dominic1593, LinkYanela, Elnico2787, Gustavosanais y Annimos: 28
Deteccin dinmica de invariantes Fuente: https://es.wikipedia.org/wiki/Detecci%C3%B3n_din%C3%A1mica_de_invariantes?oldid=
50060317 Colaboradores: El Pantera
Diagrama de colaboracin Fuente: https://es.wikipedia.org/wiki/Diagrama_de_colaboraci%C3%B3n?oldid=85275446 Colaboradores:
Tano4595, Santiperez, Er Komandante, Dhidalgo, PaintBot, Tirithel, Mutari, Javierito92, Kikobot, Alejandro Lodes, AVBOT, Ialad, DiegoFb, Wikante, Hoenheim, Botarel, Allforrous, EduLeo y Annimos: 38
Diagrama de ujo Fuente: https://es.wikipedia.org/wiki/Diagrama_de_flujo?oldid=87525997 Colaboradores: JIPumarino, JorgeGG, Wesisnay, Angus, Comae, Rosarino, Dodo, SimnK, Rsg, Cookie, Tostadora, Julian Colina, Barcex, DanielCardaci, Gengiskanhg, Porao,
Schummy, Fmariluis, Chewie, FAR, Digigalos, Boticario, Soulreaper, Petronas, Hispa, Airunp, JMPerez, Edub, Taichi, LeCire, Magister
Mathematicae, Dem, Murven, RobotQuistnix, Unf, Alhen, Akhram, Ryavara, Jomra, Caiserbot, Yrbot, Amads, BOT-Superzerocool, Vitamine, BOTijo, .Sergio, Mortadelo2005, Beto29, Armin76, Quiron, The Photographer, Jesuja, Santiperez, Baneld, Jmencisom, Morza,
Er Komandante, Tomatejc, Filipo, The worst user, Rbonvall, Faelomx, Kn, Aleator, BOTpolicia, CEM-bot, Jorgelrm, Cantero, Laura Fiorucci, Ignacio Icke, Xexito, Baiji, Rastrojo, Antur, Dorieo, Montgomery, Resped, Thijs!bot, Alvaro qc, Tortillovsky, Hygiliak, Carlos t,
Diosa, Olaf Emmanuel Vargas Ramrez, RoyFocker, Gabrielmt, IrwinSantos, Ninovolador, Cratn, Isha, Gusgus, Gngora, Mpeinadopa,
Niko guti2006, Jurgens~eswiki, JAnDbot, Ncespedes, Maria angelica, Mansoncc, Muro de Aguas, Zufs, Gsrdzl, Hidoy kukyo, Elisardojm,
Humberto, Netito777, Jvlivs, Plux, Rovnet, Manuel Trujillo Berges, Bucephala, AlnoktaBOT, Cipin, Cinevoro, Aibot, VolkovBot, Technopat, Jose gueredo, Galandil, Queninosta, Erl, Matdrodes, Fernando Estel, Synthebot, BlackBeast, Lucien leGrey, Luis1970, Vatelys,
Muro Bot, J.M.Domingo, Numbo3, Comu nacho, YonaBot, Sealight, Jmvgpartner, SieBot, Mushii, Carmin, Dars666, Cyberkender, Gurgut, OboeCrack, Manw, Greek, BuenaGente, Belb, Mafores, PipepBot, Ivanics, Xqno, Tirithel, XalD, HUB, Antn Francho, Nicop,
Farisori, Eduardosalg, Leonpolanco, Pan con queso, Alejandrocaro35, TronaBot, Petruss, Vctor Barbero, BetoCG, PetrohsW, Toolserver,
Aipni-Lovrij, Osado, Camilo, UA31, CRISPIS, AVBOT, Ellinik, JAQG, David0811, Yoprideone, LucienBOT, Juanjo.it.ab, MastiBot,
Angel GN, MarcoAurelio, Speedplus, Ezarate, Diegusjaimes, Davidgutierrezalvarez, DumZiBoT, Arjuno3, Lampsako, Luckas-bot, SpiritBlack-Wikipedista, M411045, Vic Fede, Dangelin5, Kevinprado, Nixn, MaBy25, ArthurBot, SuperBraulio13, Xqbot, Jkbw, Rubinbot,
Dreitmen, Plasmoid, AssassinR15, Annabrinn, NONYTO P8a, FrescoBot, Ricardogpn, Janiyi, Xalox~eswiki, Igna, Botarel, Hprmedina, Guillermo Axel, TobeBot, Halfdrag, RedBot, Alonsosm, Abece, Leugim1972, Elchelemanda, PatruBOT, KamikazeBot, Angelito7,
Zpu,portaynach, Tarawa1943, Foundling, Miss Manzana, Axvolution, Edslov, EmausBot, Savh, AVIADOR, Edgarga, ZroBot, HRoestBot, Allforrous, Sergio Andres Segovia, Africanus, J. A. Glvez, SAMTODOPODEROSO, Rubpe19, Emiduronte, MadriCR, Fjmejor,
Waka Waka, Banck, Movses-bot, Wednom, Antonorsi, MerlIwBot, KLBot2, TeleMania, Firewalldefender, Vagobot, AvocatoBot, Travelour, Gins90, Jhselings, Carliitaeliza, Vetranio, LlamaAl, rico, Elvisor, DanielithoMoya, AGEchacky, Jlurbe, Flashlack, Armonizador,
Juanitorreslp, 2rombos, Lfe-2, Leitoxx, Oscar.gasca7, Lautaro 97, Tushu89, Richard Lyon, Sanperni, Jean70000, Addbot, Balles2601,
Kamarori, Zamaconas, Omelgarejo, Luiggypozo7, Henrikhwolf, Jarould, Matiia, Egis57, Crystallizedcarbon, Berruguin, Rodsg, Sfr570,
Fernando2812l, Axel froylan, Pikamas y Annimos: 993
Diagrama Nassi-Shneiderman Fuente: https://es.wikipedia.org/wiki/Diagrama_Nassi-Shneiderman?oldid=85505196 Colaboradores:
Magister Mathematicae, Jesuja, Folkvanger, VolkovBot, Urdangaray, DJ Nietzsche, Muro Bot, Anoryat, Ezarate, Arjuno3, Luckas-bot,
Ortisa, Xqbot, Jkbw, D'ohBot, MAfotBOT, PatruBOT, EmausBot, ZroBot, Iwr, KLBot2, Rotlink, Addbot, Marcelita torres y Annimos: 14
Di Fuente: https://es.wikipedia.org/wiki/Diff?oldid=87086482 Colaboradores: Ascnder, FlaBot, The Photographer, Camima, Jarke,
CEM-bot, Penquista, Rastrojo, TXiKiBoT, Mercenario97, Muro Bot, PaintBot, Brayan Habid, Bigsus-bot, BOTarate, Desmond, Botelln,
AVBOT, David0811, LucienBOT, Luckas-bot, Xqbot, EmausBot, ZroBot, Hiperfelix, Kasirbot, MetroBot, Invadibot, Ninrouter, Dexbot,
Zerabat, Addbot, Jarould y Annimos: 6
Direccin de retorno Fuente: https://es.wikipedia.org/wiki/Direcci%C3%B3n_de_retorno?oldid=65083372 Colaboradores: GermanX,
Resped, AchedDamiman, Farisori, DiegoFb y Addbot
Diseo estructurado Fuente: https://es.wikipedia.org/wiki/Dise%C3%B1o_estructurado?oldid=85114290 Colaboradores: GermanX, Jesuja, CEM-bot, Jorgelrm, Developer, Jkarretero, David.rgh, Farisori, AVBOT, Andreasmperu, SuperBraulio13, Jarould y Annimos: 24

205.3. ORIGEN DEL TEXTO Y LAS IMGENES, COLABORADORES Y LICENCIAS

383

Distancia de Damerau-Levenshtein Fuente: https://es.wikipedia.org/wiki/Distancia_de_Damerau-Levenshtein?oldid=86009827 Colaboradores: Sabbut, RobotQuistnix, Pinar~eswiki, Muro de Aguas, Rapid2k1, VolkovBot, Cibi3d, CiaPan, Luckas-bot, Ptbotgourou, DiegoFb, Addbot, Fivestarts y Annimos: 2
Distancia de Levenshtein Fuente: https://es.wikipedia.org/wiki/Distancia_de_Levenshtein?oldid=87168183 Colaboradores: Sabbut, Dodo, Chewie, LeonardoRob0t, Orgullobot~eswiki, RobotQuistnix, Yrbot, FlaBot, YurikBot, Gaeddal, KnightRider, Tamorlan, Pinar~eswiki,
Davius, RoyFocker, Rei-bot, Dante Alighieri 1975, AlleborgoBot, Luigli, Oncina, DragonBot, Amsantosr, Botito777, DumZiBoT, Luckasbot, ArthurBot, Sharop, Halfdrag, Tomasdev, Sigifredo89, MerlIwBot, Elvisor, Addbot, Juankmx y Annimos: 44
DLO Fuente: https://es.wikipedia.org/wiki/DLO?oldid=85277666 Colaboradores: BOTijo, Gusgus, Anna Montull~eswiki, Elvisor y Addbot
Driver Chain Manager Fuente: https://es.wikipedia.org/wiki/Driver_Chain_Manager?oldid=77766026 Colaboradores: BOTSuperzerocool, CEM-bot, Shooke, LucienBOT, Abece y Siwel
Dublin Core Fuente: https://es.wikipedia.org/wiki/Dublin_Core?oldid=85005569 Colaboradores: RGLago, JosebaAbaitua, Ecemaml, Niqueco, Wikier~eswiki, RobotQuistnix, Chobot, Yrbot, FlaBot, BOTijo, Fariel, CEM-bot, Laura Fiorucci, Rosarinagazo, Thijs!bot, Esenabre, Gusgus, Humberto, Rei-bot, Amisadai, Anna Montull~eswiki, Zesar88, SieBot, Francisco Mochis, Wekeland, DragonBot, Alejandrocaro35, Webposible, Luckas-bot, Gallega61, Abece, Jorge c2010, Kasirbot, Senator2029, MetroBot, Legobot, Ramonjeria y Annimos:
21
EAthena Fuente: https://es.wikipedia.org/wiki/EAthena?oldid=86400364 Colaboradores: Joseaperez, Taichi, Lord cradet, Rastrojo, Kamen~eswiki, Muro Bot, PaintBot, BOTarate, Manw, Revealer, Lockalbot, Remember the dot, DumZiBoT, Streiker~eswiki, Diego Plaza,
0scar0nOjeda, MetroBot, Elvisor, Addbot y Annimos: 10
Efecto Hover Fuente: https://es.wikipedia.org/wiki/Efecto_Hover?oldid=85911552 Colaboradores: Akhram, Muro Bot, FBaena, Botelln,
Fidelbotquegua, DiegoFb, Marsal20, Elvisor y Annimos: 2
Emtp Fuente: https://es.wikipedia.org/wiki/Emtp?oldid=65129941 Colaboradores: Akhram, FlaBot, CEM-bot, Ernesto Genis, Muro Bot,
Bigsus-bot, DoN vErDuGo, DiegoFb, Addbot y Annimos: 3
Enlace dinmico Fuente: https://es.wikipedia.org/wiki/Enlace_din%C3%A1mico?oldid=67606875 Colaboradores: Ecemaml, Digigalos,
Genba, GermanX, Lobillo, CEM-bot, Shooke, Muro Bot, PaintBot y Annimos: 3
Enlace esttico Fuente: https://es.wikipedia.org/wiki/Enlace_est%C3%A1tico?oldid=60295530 Colaboradores: Digigalos, Yrbot, GermanX, Jesuja, CEM-bot, Technopat, Shooke, Muro Bot, PaintBot, Omegakent y Annimos: 3
Enlazado Fuente: https://es.wikipedia.org/wiki/Enlazado?oldid=57226529 Colaboradores: Zuirdj, Digigalos, Zeioth, Platonides, Caiserbot, EL WIKIPEDIA ES COMUNISMO!, Yrbot, GermanX, Lobillo, X.Cyclop, Muro Bot, PaintBot, Leonpolanco, AVBOT, PatruBOT
y Annimos: 2
Entrada chapuza Fuente: https://es.wikipedia.org/wiki/Entrada_chapuza?oldid=65375984 Colaboradores: Kavanagh, Waeswaes, Dalbela,
Addbot y Annimos: 1
Error de software Fuente: https://es.wikipedia.org/wiki/Error_de_software?oldid=87138345 Colaboradores: 4lex, Neodraco, Moriel,
Sauron, Wiki Wikardo~eswiki, Comae, Stoni, Sms, Robotito, Sonett72~eswiki, Carnendil, Edub, Rembiapo pohyiete (bot), OMenda, Orgullobot~eswiki, RobotQuistnix, Adept~eswiki, Superzerocool, Yrbot, Baito, Vitamine, YurikBot, GermanX, Quiron, Eskimbot, Kuanto,
Sking, Linus~eswiki, CEM-bot, CF, Thijs!bot, Bark~eswiki, Escarbot, Hanjin, JAnDbot, Jugones55, Cuate77, Zyder, AchedDamiman,
Aibot, Technopat, Matdrodes, ElVaka, DJ Nietzsche, BlackBeast, Gmarinp, Muro Bot, Gerakibot, SieBot, Wilfreddehelm, Bigsus-bot,
Xqno, Helenio, Poco a poco, UA31, AVBOT, MastiBot, Joaferna2008, Diegusjaimes, DumZiBoT, Eldelgas, Arjuno3, Luckas-bot, Nallimbot, Markoszarrate, Yuri Grille Orce, Feedehh, Obersachsebot, Xqbot, Jkbw, Rubinbot, Josemiguel93, ChenzwBot, Igna, BenzolBot,
Alfre204, TobeBot, RedBot, PatruBOT, Alph Bot, Waeswaes, EmausBot, ZroBot, JackieBot, ChuispastonBot, Albertojuanse, HarrySanti,
VR0, MetroBot, Invadibot, Lfgg2608, LSonico2012, Bibliolotranstornado, Minsbot, Salvador85, Elvisor, Rotlink, Legobot, Addbot, Roger de Lauria, JacobRodrigues, DarkBlueZV, Das MiMaMi, Pololo gibby, Eschweiler-1964, Jarould, GTX-TTT, GanksLocos y Annimos:
76
Estilo de programacin Fuente: https://es.wikipedia.org/wiki/Estilo_de_programaci%C3%B3n?oldid=87423753 Colaboradores: Grstain~eswiki, GermanX, CEM-bot, Thijs!bot, Alvaro qc, JAnDbot, TXiKiBoT, Barri, SieBot, Jpereza, AVBOT, Luckas-bot, ArthurBot,
Jkbw, EmausBot, ChuispastonBot, WikitanvirBot, Bibliolotranstornado, Elvisor, Addbot y Annimos: 14
Eventos del ratn Fuente: https://es.wikipedia.org/wiki/Eventos_del_rat%C3%B3n?oldid=83714919 Colaboradores: Pino, Pertile, GermanX, Manolo456, No s qu nick poner, Guialven, Dani26, Filipo, CEM-bot, NickelSpider, Educhip, Satin, Muro de Aguas, Gustronico,
PaintBot, Marcecoro, Machucho2007, AVBOT, DiegoFb, Elvisor, Jarould, Aramiza y Annimos: 7
Exclusin mutua (informtica) Fuente: https://es.wikipedia.org/wiki/Exclusi%C3%B3n_mutua_(inform%C3%A1tica)?oldid=
72980957 Colaboradores: PACO, Pantulis, Ascnder, Robotito, Niqueco, Emijrp, RobotQuistnix, Yrbot, Martincarr, GermanX,
KnightRider, Chlewbot, Xibranc, CEM-bot, AugustoIturri, Thijs!bot, Dogor, JAnDbot, Plux, VolkovBot, Muro Bot, SieBot, Mcapdevila,
Almabot, Rubinbot, EmausBot, ChuispastonBot, WikitanvirBot, BendelacBOT, Addbot y Annimos: 9
Expresin regular Fuente: https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular?oldid=87549861 Colaboradores: Moriel, JorgeGG,
Pilaf, SpeedyGonzalez, ManuelGR, Diegojc, Bigsus, Dodo, Crescent Moon, Triku, Ascnder, Sms, Tano4595, SantiagoGala, Periku,
Toto~eswiki, Digigalos, Boticario, Hari Seldon, Silvestre, Korg, Viko~eswiki, Murven, RobotQuistnix, Caiserbot, Yrbot, GermanX,
M4r10c354r, George McFinnigan, Maldoror, Er Komandante, Chlewbot, UberKaeL, CEM-bot, 333, Rbrena, Damifb, Laura Fiorucci,
Alexav8, Exos, Lcmarzulli, Resped, Cfvergara, TXiKi, JoaquinFerrero, Botones, JAnDbot, Muro de Aguas, Erwin, TXiKiBoT, Luis junco, ColdWind, Humberto, Luisgulo, Rlizarralde, Vector Mike Bravo Sierra, NaSz, Fixertool, Nioger, Mcanto, Feandir, Technopat, Alvlin,
Matdrodes, Muro Bot, SieBot, Loveless, BOTarate, Macarse, Cristhiangr, Arafael, MetsBot~eswiki, Borja Snchez, Eduardosalg, Leonpolanco, Alecs.bot, Hernaldo, SilvonenBot, AVBOT, Antolingarcia, Dermot, LucienBOT, Vituzzu, Diegusjaimes, CarsracBot, Andreasmperu, Luckas-bot, QuBote, Nixn, ArthurBot, Ee, 0x~eswiki, Xqbot, Igna, Botarel, Joaquin medina, Jomabeal, Foundling, GrouchoBot,
Savh, ChuispastonBot, Albertojuanse, Waka Waka, Hiperfelix, KLBot2, Angelgonzg, John plaut, scar Becerril, Bibliolotranstornado,
Elvisor, Legobot, Francisco2289, Addbot, Paconaranjo, Jarould, Matiia, Egis57, Enxaneta y Annimos: 147
Flag Fuente: https://es.wikipedia.org/wiki/Flag?oldid=72869566 Colaboradores: Sabbut, BOT-Superzerocool, GermanX, VolkovBot, Aleposta, Ptbotgourou, Rubinbot, Puck2099, ZroBot, Grillitus, KLBot2, Addbot, JacobRodrigues, Giliofelix y Annimos: 3

384

CAPTULO 205. ZENPHP

Front-end y back-end Fuente: https://es.wikipedia.org/wiki/Front-end_y_back-end?oldid=87272243 Colaboradores: Sabbut, Robbot,


Dodo, Sms, Julgon, Elwikipedista, Armonth, Periku, MatiasBellone, Morgul~eswiki, Soulreaper, Edub, Emijrp, AlexGalisteo, RobotQuistnix, Caiserbot, Sotomayor, Yrbot, Baito, FlaBot, BOTijo, YurikBot, LoquBot, C-3POrao, Gtz, CEM-bot, Damifb, Thijs!bot,
VARGUX, Crates, ColdWind, Carlesius~eswiki, VolkovBot, Technopat, BlackBeast, Shooke, SieBot, Pablo323, LordT, Yorulito 89, Hoenheim, Bot0811, Hprmedina, Born2bgratis, PatruBOT, Waeswaes, Grillitus, Ser malvado, MerlIwBot, Invadibot, MadonnaFan, Legobot,
Deimagjas, Addbot, Lagoset, BenjaBot y Annimos: 35
Fuga de memoria Fuente: https://es.wikipedia.org/wiki/Fuga_de_memoria?oldid=87116558 Colaboradores: Pino, Moriel, Sauron, ManuelGR, Triku, Niqueco, Rembiapo pohyiete (bot), Further (bot), RobotQuistnix, Chobot, Baito, FlaBot, YurikBot, GermanX, CEM-bot,
Tute, Ignacio Icke, Thijs!bot, Botones, JAnDbot, ColdWind, Galaxy4, AlnoktaBOT, Gmarinp, Muro Bot, YonaBot, BotMultichill, Alexbot,
Luckas-bot, Amirobot, Wikante, Hprmedina, Ripchip Bot, Waeswaes, EmausBot, Grillitus, WikitanvirBot, MetroBot, Elvisor, Legobot y
Annimos: 7
Generacin de cdigo Fuente: https://es.wikipedia.org/wiki/Generaci%C3%B3n_de_c%C3%B3digo?oldid=64767313 Colaboradores:
Edub, Superzerocool, GermanX, Equi, Lobillo, Gabriel.arias, Eduardo Lima, CEM-bot, Joseanquiles, VolkovBot, PaintBot, Loveless, Leonpolanco, Luckas-bot, DiegoFb, Xqbot, GrouchoBot, Legobot y Annimos: 4
Generador de nmeros aleatorios Fuente: https://es.wikipedia.org/wiki/Generador_de_n%C3%BAmeros_aleatorios?oldid=84075873
Colaboradores: Pino, Joseaperez, Th3j0ker, Julian Colina, Anv, Pati, Airunp, Orgullobot~eswiki, LuchoX, GermanX, JRGL, Emilio.carrizosa, Siabef, Qwertyytrewqqwerty, CEM-bot, Thanos, Alexav8, Pevica, FrancoGG, TXiKiBoT, Aibot, Muro Bot, Pacomegia,
Pascow, Kalverseihn, LordT, Juan Mayordomo, Raulshc, MystBot, Billinghurst, ArthurBot, Xqbot, Jkbw, Hprmedina, Ganmedes, EmausBot, ZroBot, Esaintpierre, ChuispastonBot, Ricardo IV, Bibliolotranstornado, JYBot, Legobot, Wilson Pinto Romero, Ncomputersorg y
Annimos: 20
Gledplay Fuente: https://es.wikipedia.org/wiki/Gledplay?oldid=86942139 Colaboradores: Superzerocool, BOT-Superzerocool, Gaeddal,
JorSol, CEM-bot, Sergio.erens~eswiki, Mahadeva, Matias.saguir, Plux, Zyder, Botelln, LucienBOT, KLBot2, Elvisor y Annimos: 5
GPGPU Fuente: https://es.wikipedia.org/wiki/GPGPU?oldid=70422721 Colaboradores: Riviera, Rondador, Yrithinnd, RobotQuistnix,
Yrbot, GermanX, CEM-bot, Thijs!bot, CommonsDelinker, TXiKiBoT, Filiprino, VolkovBot, PolarBot, Alexaltea, DragonBot, Alexbot,
LucienBOT, Cibi3d, Luckas-bot, MKDrDre, Xqbot, SassoBot, Mctpyt, ZroBot, Alecm88, KLBot2, Elvisor, Legobot, ScotXW y Annimos: 10
Hackathon Fuente: https://es.wikipedia.org/wiki/Hackathon?oldid=86943923 Colaboradores: Luisrull, Itnas19, Graciela Caldeiro, El Pantera, Luckas-bot, MystBot, MartinDM, Xqbot, EmausBot, ZroBot, HRoestBot, Sergio Andres Segovia, Grillitus, WikitanvirBot, KLBot2,
ShakMR, Cleibenzon y Annimos: 10
Hacker Fuente: https://es.wikipedia.org/wiki/Hacker?oldid=87426282 Colaboradores: Sabbut, Lourdes Cardenal, Gmagno, SimnK, Petronas, Patricio.lorente, Superzerocool, Vitamine, Olea, Baronti, The Photographer, Er Komandante, Fercufer, CEM-bot, Laura Fiorucci,
IvanStepaniuk, Montgomery, Resped, PabloCastellano, RoyFocker, JoaquinFerrero, Alakasam, Isha, JAnDbot, Mansoncc, Tucto, Cristianuz12, L0biz0n, Gustronico, Humberto, Nioger, Biasoli, Technopat, BlackBeast, Muro Bot, El Pantera, Loveless, Bigsus-bot, Marcelo,
Pascow, McOil, Tirithel, Javierito92, Leonpolanco, Pan con queso, PetrohsW, Rge, Frei sein, Osado, UA31, AVBOT, DayL6, TheDarkFear, Diegusjaimes, Davidgutierrezalvarez, Malacitano, Arjuno3, Gacpro, Bloomy, Nixn, Jkbw, Rubinbot, Cybermaniac, FrescoBot, Surfaz, Igna, BenzolBot, AstaBOTh15, RubiksMaster110, Panderine!, Jakeukalane, Halfdrag, Omerta-ve, AnselmiJuan, Lustar, PatruBOT,
Ganmedes, ArwinJ, Hack txus, Isi viki, Tarawa1943, Nachosan, Foundling, Edslov, EmausBot, Savh, AVIADOR, ChessBOT, Internetsinacoso, Mescaicedo, Grillitus, FL0per, Waka Waka, Warairarepano&Guaicaipuro, EdgarFabiano, Metrnomo, MerlIwBot, KLBot2, TeleMania, Luisllamas, UAwiki, Damianiencowiki, Frank sin Otra, Allan Aguilar, Nernix1, LlamaAl, Elvisor, Santga, ElGatoSaez, Syum90,
Leitoxx, Alberto Elvira, NeftaliYagua, Chmarkine, Balles2601, Romuant, Paolaricaurte, Saectar, 19Tarrestnom65, Henrikhwolf, Laberinto16, Juancastellar1, Gonzalo.villarreal, Majlis99, Shernandezrg, ComaHermosa, PabloYglesias, Joeldavid rodriguez hernandez, Jarould,
Otup, FedeNab PB, SAHIBORFIRE001, Lioemiliorodriguez, MoonLeech, Hacker1234567890123, Randomediterhahatroll, Hola ke azse,
Rulax Nada, Andrea.merelo, Condoruser, Daniel Justiniani, Cristiantamara1999, Vladernn, Nada Nada01, YerayJackson, Juliana colorado,
Hackersjorge, Alquimista Kvothe, Ana Lucia-es genial y Annimos: 219
Heisenbug Fuente: https://es.wikipedia.org/wiki/Heisenbug?oldid=83785803 Colaboradores: JKD, Yeza, Invadibot, BenjaBot y Cecetaca
Hoja de estilo Fuente: https://es.wikipedia.org/wiki/Hoja_de_estilo?oldid=86504408 Colaboradores: Pilaf, Daniel G., JosebaAbaitua,
Kokoo, Tomatejc, Alexquendi, Gizmo II, Especiales, Locovich, Gaius iulius caesar, Osado, Linfocito B, Jkbw, PatruBOT, Semensoy,
Diamondland, Johnbot, Elvisor, Addbot, Jarould y Annimos: 15
Hola mundo Fuente: https://es.wikipedia.org/wiki/Hola_mundo?oldid=87221037 Colaboradores: Sabbut, Pilaf, Angus, Zwobot, Comae,
Janus~eswiki, Dodo, Sms, Rsg, Opinador, Robotito, Jag2k4, Xenoforme, Jecanre, Hildergarn, Porao, Ivan.Romero, Steve-o, Robotico,
Adrianbs, Kordas, Niqueco, FAR, Lmsilva, Digigalos, Quemasda~eswiki, Soulreaper, RobotJcb, JMPerez, Edub, Yrithinnd, Emijrp, Rembiapo pohyiete (bot), Johnbojaen, Ppfk~eswiki, Orgullobot~eswiki, RobotQuistnix, Platonides, Unf, Superzerocool, BillGatos, Chobot,
Warmize, Yrbot, Amads, BOT-Superzerocool, Oscar ., Davidsevilla, Vitamine, Laban~eswiki, Gaeddal, Museo8bits, Icvav, Martingala,
Zelkova~eswiki, Unaiaia, KnightRider, Acalpixca, Baneld, Kenshin 85, Aenima~eswiki, Gtz, Skirmish~eswiki, Er Komandante, Leonardocaballero, Touareg, Spc, Tomatejc, EOZyo, Siabef, Bernethe, BOTpolicia, CEM-bot, Guzman622, Voragine, Efeg, Xexito, Davius,
Antur, Yuanga, Programador, Thijs!bot, Nabrozidhs, Alvaro qc, RoyFocker, JoaquinFerrero, Locovich, Ninovolador, Egaida, Gusgus,
JAnDbot, Mansoncc, Muro de Aguas, Iulius1973, TXiKiBoT, Humberto, Infjms00, Sirpuppet, Plux, Snakefang, Developer, Swicher, Wutores, Garaizar, VolkovBot, Technopat, Zurtitto, Mstreet linux, Matdrodes, Elabra sanchez, Synthebot, ElVaka, BlackBeast, Lucien leGrey,
Will.ruiz, Muro Bot, Srbanana, BotMultichill, Zydeco, Gmol, Gerakibot, SieBot, Tucapl, Nachet70, Cousteau, Jjcc, Manw, Dmontero7,
Joelperez, Tomyleeswf, PipepBot, Tirithel, Javierito92, Beby.akselrad, Socram8888, Minterior, Nicop, PixelBot, Leonpolanco, Sunopen,
TuEresTu, Gxlalesca, LordT, Alexbot, Manco Capac, Darkicebot, Miguelusque, Osado, Jofegibo, Mr freeze360, SilvonenBot, Camilo, AVBOT, Louperibot, NicolasAlejandro, Carlitos.dll, Diegusjaimes, Fguillen, Amirobot, Nallimbot, Didoco, Ptbotgourou, Jotterbot, LyingB,
Cplusplus~eswiki, Byrito, Barteik, Yonidebot, Edutecno, Hytac, Ezarate73, DSisyphBot, Clablues, SuperBraulio13, Xqbot, Jkbw, Es carva,
Dreitmen, Helloworldextremadura, Ferbrunnen, Adryitan, Botarel, TiriBOT, Hprmedina, Halfdrag, Edgardo C, PatruBOT, KamikazeBot,
TheOrlSan, EmausBot, Sergio Andres Segovia, Bazookao, ChuispastonBot, Jereees, Antonorsi, MerlIwBot, KLBot2, AvocatoBot, MetroBot, Rafael.Todresak, Fontedoso, Lautaro 97, Coins, Jarould, Pedrov857 y Annimos: 395
Homebrew Fuente: https://es.wikipedia.org/wiki/Homebrew?oldid=87338482 Colaboradores: Aloriel, FlaBot, Eloy, Elrond 3, CEM-bot,
Laura Fiorucci, Twisen, Mapep, Bernard, JAnDbot, Rtalaman, TXiKiBoT, Wikiangeld, Biasoli, Technopat, AlleborgoBot, SieBot, PaintBot,
Ensada, Bigsus-bot, El bot de la dieta, Javierito92, Eduardosalg, Sidcc, Alexbot, AVBOT, SpBot, Vic Fede, DSisyphBot, Xqbot, Irbian,

205.3. ORIGEN DEL TEXTO Y LAS IMGENES, COLABORADORES Y LICENCIAS

385

Doble, BOTirithel, Kizar, Ravmn, PatruBOT, Sergi70, Nanopulga, Gerda Arendt, ASTUR2000, EmausBot, Yayolas, KLBot2, Gusama
Romero, Elvisor, Daltreck, BenjaBot y Annimos: 62
ICONIX Fuente: https://es.wikipedia.org/wiki/ICONIX?oldid=86024206 Colaboradores: BOT-Superzerocool, CEM-bot, CommonsDelinker, Technopat, Rwheimle, Ortisa, Marsal20, PatruBOT, Angelito7, KLBot2, Invadibot, Arvelo592, Jarould y Annimos: 12
Anexo:Implementaciones de Smalltalk Fuente: https://es.wikipedia.org/wiki/Anexo%3AImplementaciones_de_Smalltalk?oldid=
70775907 Colaboradores: Sabbut, Tano4595, Dusan, Stickel, Shooke, Muro Bot, Carmin, MiguelAngelCaballero, Alelapenya, Lividiniski,
Elvisor y Annimos: 1
Anexo:Implementaciones para algoritmo de rut Fuente: https://es.wikipedia.org/wiki/Anexo%3AImplementaciones_para_algoritmo_
de_rut?oldid=87166683 Colaboradores: Josemoya, Isha, Terinchu y Annimos: 1
Inanicin (informtica) Fuente: https://es.wikipedia.org/wiki/Inanici%C3%B3n_(inform%C3%A1tica)?oldid=79794169 Colaboradores: Sabbut, GermanX, Thijs!bot, Mcapdevila, Angelito7, Ripchip Bot, EmausBot, KLBot2, Nejnadusho, Angeldefuego22 y Annimos:
2
Indireccin Fuente: https://es.wikipedia.org/wiki/Indirecci%C3%B3n?oldid=77015655 Colaboradores: DMG, Glia, Muro de Aguas, Biasoli, Elabra sanchez, Xqbot, KLBot2, Lizbeth Melissa Appleton Tavarez y Sociologiaipa
Infraestructura de lenguaje comn Fuente: https://es.wikipedia.org/wiki/Infraestructura_de_lenguaje_com%C3%BAn?oldid=
70047167 Colaboradores: Pino, Wikier~eswiki, Yrbot, BOTijo, Dangertn, Biasoli, Muro Bot, Bcnbits.com, XalD, Leonpolanco,
Luckas-bot, SuperBraulio13, Canyq, Waeswaes, EmausBot, Javiermarinros, MerlIwBot, KLBot2, Dexbot y Annimos: 6
Ingeniera de software Fuente: https://es.wikipedia.org/wiki/Ingenier%C3%ADa_de_software?oldid=87347378 Colaboradores: Zeno
Gantner, 4lex, Caligari~eswiki, Soniautn, Sabbut, Moriel, Sauron, JorgeGG, Lourdes Cardenal, ManuelGR, Head, Lsanabria, Rosarino,
Dodo, Jonik, Jynus, Ascnder, Sms, Rsg, Cookie, Tano4595, Robotito, JavierCantero, Amana, Ograma, Rodrigouf, Cinabrium, Porao, Loco085, Jabernal, Renabot, Richy, Robotkarel, Chlewey, Soulreaper, Petronas, Airunp, JMPerez, Edub, Taichi, Emijrp, Rembiapo pohyiete
(bot), Magister Mathematicae, RobotQuistnix, Platonides, Chobot, Afpineda, Yrbot, Baito, BOT-Superzerocool, Adrruiz, Mortadelo2005,
Martingala, GermanX, The Photographer, Tigerfenix, Ppja, Maldoror, Covi, BOTpolicia, CEM-bot, Jorgelrm, Laura Fiorucci, Eneaslabra,
Ignacio Icke, Osepu, Dou1985, Davius, Govelamo, Antur, Juan.palacio, Julian Mendez, Gafotas, Genaro Rafael, Fsd141, Jonpagecr, Diosa, Bot que revierte, Eidansoft, Ninovolador, Botones, Isha, Arcibel, Migp~eswiki, JAnDbot, Jugones55, Antipatico, Xavigivax, Gsrdzl,
Fugarte, Humberto, Netito777, Fixertool, Nioger, Plux, Developer, Manuel Trujillo Berges, Biasoli, Bucephala, VolkovBot, Drever, Technopat, Jose gueredo, Galandil, Queninosta, Raystorm, MasterNoX, Belgrano, Matdrodes, Autonomia, Gmarinp, Muro Bot, Jmvgpartner,
SieBot, Ctrl Z, Carmin, Hompis, Bigsus-bot, Alben9586, Switcher6746, Navarroaxel, Greek, BuenaGente, Mafores, Fadesga, Arnombela,
Tirithel, Javierito92, Marcecoro, Antn Francho, Nicop, Brayan Jaimes, Eduardosalg, Qwertymith, Graimito, Leonpolanco, Pan con queso,
Alejandrocaro35, LordT, Furti, Poco a poco, Rge, Camilo, UA31, SergioN, Climens, Andres romeroc, AVBOT, Flakinho, Diegusjaimes,
Davidgutierrezalvarez, CarsracBot, Arjuno3, Saloca, Andreasmperu, Luckas-bot, Jaromero, Nallimbot, Sergiportero, Vic Fede, Dangelin5,
ArthurBot, Usuwiki, Txangu22, Jefrcast, Angelux3000, SuperBraulio13, Xqbot, Jkbw, FrescoBot, Josemariasaldana, Igna, Botarel, Kraixx,
Ochonueve98, Yabama, BOTirithel, Maria.Jose.Garcia.UEM, Brian26, Luysys, RedBot, Fidelleandro, Abece, Leugim1972, PatruBOT,
Dinamik-bot, Jpussacq, Axvolution, EmausBot, Burny~eswiki, Savh, ZroBot, Joinsolutions, Hdavila1, Grillitus, Cris Dav CDVS, Kasirbot, MerlIwBot, JABO, KLBot2, Ayaita, Thehelpfulbot, Iranvaur, AvocatoBot, Sebrev, MetroBot, Diegosangz, TQLEOFULL, Raes123,
Aine Takarai, Elvisor, Felener, Makecat-bot, Ralgisbot, Withsell, Legobot, Ssamuel, Addbot, Balles2601, MarielCB, Guilberth, Ricardo
concepcion, DianaJMZr18, Isaacjuc, Bryanro, Franklin.ayarza, Starmird, FlareXIII, Abdiel Williams, LisleidysDominguez, Joseline Jaramillo, Neogeo02, RicardoFong, Albert-507, Joxeph18, Javrro, Alecjz, Jarould, Lomejordejr, Miranda23~eswiki, BenjaBot, Jos Toms
reyes rodriguez, FidiasX y Annimos: 403
Instancia (informtica) Fuente: https://es.wikipedia.org/wiki/Instancia_(inform%C3%A1tica)?oldid=86236359 Colaboradores: Carlos
Castaeda Girn, Ascnder, BOT-Superzerocool, Varano, CEM-bot, Laura Fiorucci, Santhy, Nightwish, Isha, Netito777, Technopat, Carmin, Javierito92, Poco a poco, AVBOT, Msanguino, David0811, Diegusjaimes, Bethan 182, Boto a Boto, SuperBraulio13, Jkbw, FrescoBot,
Botarel, Grillitus, Balles2601, Jarould, Unmanitito y Annimos: 28
Instruccin (informtica) Fuente: https://es.wikipedia.org/wiki/Instrucci%C3%B3n_(inform%C3%A1tica)?oldid=84858207 Colaboradores: Vanbasten 23, Dodo, Airunp, RobotQuistnix, Joanfusan, Yrbot, Amads, BOT-Superzerocool, GermanX, Jesuja, Maldoror, Cheveri,
Folkvanger, Feiri25, BOTpolicia, CEM-bot, Rastrojo, Fsd141, Tortillovsky, ngel Luis Alfaro, Dogor, JAnDbot, Netito777, Bedwyr, Biasoli, Cinevoro, Rmarcel, Muro Bot, SieBot, PaintBot, Loveless, LordT, Al Lemos, Juan Mayordomo, Diegusjaimes, DumZiBoT, Arjuno3,
Kavor, Txangu22, Ortisa, Jkbw, Botarel, Pablotol, AnselmiJuan, Grillitus, Elas, MerlIwBot, JABO, Matiia y Annimos: 34
Interfaz binaria de aplicaciones Fuente: https://es.wikipedia.org/wiki/Interfaz_binaria_de_aplicaciones?oldid=83104096 Colaboradores: JKD, Lobillo, Hprmedina, Invadibot y Korislife
Interfaz uida Fuente: https://es.wikipedia.org/wiki/Interfaz_fluida?oldid=64499560 Colaboradores: GermanX, TXiKiBoT, Shooke, LucienBOT, Luckas-bot, ZroBot, KLBot2 y Annimos: 1
Invariante (informtica) Fuente: https://es.wikipedia.org/wiki/Invariante_(inform%C3%A1tica)?oldid=64502259 Colaboradores: Poco
a poco, Waeswaes, EmausBot y KLBot2
Jframe Fuente: https://es.wikipedia.org/wiki/Jframe?oldid=77831062 Colaboradores: Ivordro UV
Usuario discusin:Juliasocorro Fuente: https://es.wikipedia.org/wiki/Usuario_discusi%C3%B3n%3AJuliasocorro?oldid=80551923
Colaboradores: Frank sin Otra
Kanban (desarrollo) Fuente: https://es.wikipedia.org/wiki/Kanban_(desarrollo)?oldid=87051531 Colaboradores: Lourdes Cardenal, Invadibot, Elvisor, Marco.unno, Jarould, Bossarro, Galo Jerez y Annimos: 9
Kit de desarrollo de software Fuente: https://es.wikipedia.org/wiki/Kit_de_desarrollo_de_software?oldid=87227842 Colaboradores:
Aleator, Laura Fiorucci, Bryant1410, TXiKiBoT, Humberto, Biasoli, Shooke, Marcecoro, Quijav, LucienBOT, MastiBot, Ambil, Diegusjaimes, MystBot, Gua-naiko-che, SuperBraulio13, Xqbot, Rubinbot, RedBot, MarioGL, PatruBOT, Cifz, EmausBot, ZroBot, ChuispastonBot, Cybelmar, KLBot2, Minsbot, Elvisor, Javier casas sevilla, BOTito y Annimos: 18
Kommander Fuente: https://es.wikipedia.org/wiki/Kommander?oldid=64677101 Colaboradores: CEM-bot, Phirosiberia, Moises.coronado, Loveless, StarBOT, KLBot2 y Annimos: 3

386

CAPTULO 205. ZENPHP

Last Error (informtica) Fuente: https://es.wikipedia.org/wiki/Last_Error_(inform%C3%A1tica)?oldid=71687590 Colaboradores:


CEM-bot, Muro de Aguas, Dangelin5, Yuri Grille Orce, Mister Roboto, Waeswaes, Grillitus, Fle3tw00d, Mastervick18 y Annimos:
2
Lnea de cdigo fuente Fuente: https://es.wikipedia.org/wiki/L%C3%ADnea_de_c%C3%B3digo_fuente?oldid=87548009 Colaboradores: Pieter, Mnts, Boticario, Yrithinnd, Rembiapo pohyiete (bot), Johnbojaen, Magnus Colossus, Yrbot, YurikBot, GermanX, Lucascr,
Gtz, CEM-bot, Jorgelrm, Thijs!bot, Isha, Muro de Aguas, ColdWind, Biasoli, VolkovBot, Elabra sanchez, BlackBeast, Shooke, Muro Bot,
PaintBot, Drinibot, Ignacio javier igjav, Bigsus-bot, Marcecoro, Poco a poco, Juan Mayordomo, BotSottile, MastiBot, Luckas-bot, Boto a
Boto, DiegoFb, Vivaelcelta, Mr. Geek, Locobot, Jkbw, Bodigami, GrouchoBot, Adri128, Grillitus, MerlIwBot, Invadibot, Acratta, Elvisor,
Rotlink, Legobot, BenjaBot y Annimos: 18
Macintosh Toolbox Fuente: https://es.wikipedia.org/wiki/Macintosh_Toolbox?oldid=75150746 Colaboradores: Baneld, Jago84, ZroBot, Grillitus y KLBot2
Macro Fuente: https://es.wikipedia.org/wiki/Macro?oldid=86728967 Colaboradores: Aloriel, Rosarino, Dodo, Richy, Pati, Petronas, Airunp, Taichi, Rembiapo pohyiete (bot), NekroByte, Magister Mathematicae, RobotQuistnix, Javialacarga, Pla, YurikBot, GermanX, Gaijin, SidV, C-3POrao, Lasneyx, BOTpolicia, CEM-bot, Alexav8, Retama, FrancoGG, Thijs!bot, Srengel, Jorgebarrios, Will vm, Isha, Kved,
Mansoncc, Muro de Aguas, TXiKiBoT, Aalvarez12, Humberto, Netito777, Biasoli, AlnoktaBOT, Technopat, Queninosta, Matdrodes, DJ
Nietzsche, BlackBeast, 3coma14, SieBot, Mushii, Hispalis, Loveless, Carmin, BOTarate, Manw, Ugly, BuenaGente, Fadesga, Pla y Grande
Covin, Jarisleif, Nicop, Eduardosalg, Leonpolanco, Drlogo, Aipni-Lovrij, UA31, AVBOT, David0811, NicolasAlejandro, Diegusjaimes,
Arjuno3, Andreasmperu, Luckas-bot, Macrorosario, Billinghurst, Wikiwikifan, Nixn, Billyrobshaw, SuperBraulio13, Manuelt15, Xqbot,
Jkbw, Ricardogpn, Igna, BOTirithel, Hprmedina, Xlsexcel, Oxilium, Ferrnandosantosf, Lungo, PatruBOT, AldanaN, Dinamik-bot, Foundling, Edslov, EmausBot, Savh, AVIADOR, ZroBot, HRoestBot, Grillitus, JackieBot, FL0per, Waka Waka, WikitanvirBot, Antonorsi,
Maquedasahag, Helmy oved, FMQ, Addbot, DJ WARMIN, Marcrodos, Jarould, Fenadez24 y Annimos: 204
Malla de tringulos 3D Fuente: https://es.wikipedia.org/wiki/Malla_de_tri%C3%A1ngulos_3D?oldid=85348681 Colaboradores: Sabbut,
Baneld, Tomatejc, Folkvanger, CommonsDelinker, BlackBeast, Mafores, Ravave, Martabosch, KLBot2, Elvisor y Balles2601
Mapeo objeto-relacional Fuente: https://es.wikipedia.org/wiki/Mapeo_objeto-relacional?oldid=85517312 Colaboradores: Dapasa, Niqueco, Petronas, Magister Mathematicae, BOT-Superzerocool, Cad, CEM-bot, Pete~eswiki, Thijs!bot, RoyFocker, Zufs, Hidoy kukyo,
Rei-bot, Manuel Trujillo Berges, Muro Bot, Globalpegasus, Loveless, Abel.orian, SPZ, Broda Noel, Robertmacias, Estirabot, Adelpine,
DumZiBoT, Trimax, Mrbaltus, DiegoFb, ArthurBot, Denniscm20, Xqbot, Jkbw, Ppazos, Davidmarco, Silvioq, HoLiC, TiriBOT, LoliBot,
Rro4785, Diego.sarmentero, GrouchoBot, ElTeq, WikitanvirBot, KLBot2, Thehelpfulbot, AvocatoBot, HiW-Bot, Makecat-bot y Annimos: 38
Mquina de estados Fuente: https://es.wikipedia.org/wiki/M%C3%A1quina_de_estados?oldid=83627948 Colaboradores: Mikelo, Orgullomoore, Airunp, BOT-Superzerocool, GermanX, Beto29, JRGL, Andrs Djordjalian, Isarmien, Muro Bot, PaintBot, Cegik, Jagp0004,
Balles2601, Guapote69rafa y Annimos: 10
Mquina desnuda Fuente: https://es.wikipedia.org/wiki/M%C3%A1quina_desnuda?oldid=26913093 Colaboradores: Tano4595, Sebastiancruz, Tortillovsky, Dlawen, Shooke, Muro Bot, PaintBot y Annimos: 1
MCML Fuente: https://es.wikipedia.org/wiki/MCML?oldid=65805016 Colaboradores: Murven, FlaBot, Jjvaca, Muro Bot, PaintBot, LucienBOT, DiegoFb, EmausBot y Annimos: 2
Metaprogramacin Fuente: https://es.wikipedia.org/wiki/Metaprogramaci%C3%B3n?oldid=78306463 Colaboradores: Triku, Dianai,
YurikBot, Jgaray, KnightRider, Gothmog, Eskimbot, CEM-bot, TXiKiBoT, VolkovBot, Shooke, Muro Bot, SieBot, LordT, Alexbot,
Luckas-bot, Codename, EmausBot, Invadibot, Legobot y Annimos: 7
Microformatos Dublin Core Fuente: https://es.wikipedia.org/wiki/Microformatos_Dublin_Core?oldid=22604847 Colaboradores: Muro
Bot, Mutari, HUB y Webposible
Modelo de prototipos Fuente: https://es.wikipedia.org/wiki/Modelo_de_prototipos?oldid=84552079 Colaboradores: Taichi, Rakela, BOTijo, Filipo, Alfredobi, Rosarinagazo, Hanjin, Netito777, Scap2000, Plux, Alexhd, Jose gueredo, Matdrodes, Racso, Manw, Javierito92,
David.rgh, Caucas, Diegusjaimes, Jkbw, PatruBOT, Foundling, Alexandermark, Adribeex, BenjaBot y Annimos: 58
Modicador Fuente: https://es.wikipedia.org/wiki/Modificador?oldid=84562935 Colaboradores: CEM-bot, Ismaelivan, Gusgus, Jatrobat, Technopat, Galandil, Queninosta, Leonpolanco, AVBOT, Angel GN, DiegoFb, SuperBraulio13, Jkbw, Pitufo.Budista, Wikielwikingo,
Rubpe19, Elvisor, Osiris, Jarould y Annimos: 11
Modularidad Fuente: https://es.wikipedia.org/wiki/Modularidad?oldid=70539491 Colaboradores: Jesuja, Davius, Lauranrg, Millars, Developer, VolkovBot, Matdrodes, SieBot, BOTarate, Poco a poco, SergioN, AVBOT, J.delanoy, Luckas-bot, FariBOT, SuperBraulio13,
Jkbw, Jorge c2010, Albertojuanse, WikitanvirBot, KLBot2 y Annimos: 12
Mdulo (informtica) Fuente: https://es.wikipedia.org/wiki/M%C3%B3dulo_(inform%C3%A1tica)?oldid=86721547 Colaboradores:
Jesuja, Mpeinadopa, Cinevoro, Elabra sanchez, Muro Bot, Poco a poco, SergioN, AVBOT, Arjuno3, Jkbw, Googolplanck, Angelito7,
Jarould y Annimos: 12
Monitor (concurrencia) Fuente: https://es.wikipedia.org/wiki/Monitor_(concurrencia)?oldid=85923415 Colaboradores: Dianai, Chobot,
Yrbot, Martincarr, BOTijo, YurikBot, GermanX, Tomatejc, Jorgechp, BOTpolicia, CEM-bot, Thijs!bot, Bryant1410, Dogor, JAnDbot,
CommonsDelinker, Netito777, BOTarate, Danilindo, AVBOT, DumZiBoT, Luckas-bot, Nixn, SuperBraulio13, Xqbot, NewBlood7, Diegodm, BOTirithel, Hprmedina, MaschioAlfonso, Daniville7, Grillitus, Dr Doofenshmirtz, MerlIwBot, JABO, Sebrev, Invadibot, Helmy
oved, Legobot, Jarould y Annimos: 40
Anexo:Motores de persistencia Fuente: https://es.wikipedia.org/wiki/Anexo%3AMotores_de_persistencia?oldid=81100261 Colaboradores: JMPerez, Filipo, Cad, CEM-bot, Mercenario97, 3coma14, Hu12, Luckas-bot, DiegoFb, Mangel2050, AldanaN, Khiari, Elvisor,
Addbot y Annimos: 4
Mtodo de depuracin del patito de goma Fuente: https://es.wikipedia.org/wiki/M%C3%A9todo_de_depuraci%C3%B3n_del_patito_
de_goma?oldid=86909428 Colaboradores: Sabbut, Poramo, Marcelo, Sergio Andres Segovia, Grillitus, Invadibot, Tuareg50 y Annimos:
1
Net Yaroze Fuente: https://es.wikipedia.org/wiki/Net_Yaroze?oldid=87149619 Colaboradores: Sabbut, CEM-bot, Diablo Cris, CommonsDelinker, FrescoBot, KLBot2, Invadibot, Elvisor, Helmy oved, Excalibra, Victoria216 y Annimos: 4

205.3. ORIGEN DEL TEXTO Y LAS IMGENES, COLABORADORES Y LICENCIAS

387

Nodo (informtica) Fuente: https://es.wikipedia.org/wiki/Nodo_(inform%C3%A1tica)?oldid=86760466 Colaboradores: Rosarino, Magister Mathematicae, Echani, Jesuja, Gtz, Tomatejc, Nihilo, CEM-bot, Jorgelrm, Antur, Ggenellina, Alvaro qc, Technopat, Lucien leGrey,
Farisori, Alejandrocaro35, Gomariles, AVBOT, Diegusjaimes, Arjuno3, DiegoFb, SuperBraulio13, Jkbw, Botarel, PatruBOT, EmausBot,
Waka Waka, Hiperfelix, Bibliolotranstornado, Helmy oved, Jean70000, Addbot, The$oul, Jarould, Matiia y Annimos: 44
Notacin Reddick Fuente: https://es.wikipedia.org/wiki/Notaci%C3%B3n_Reddick?oldid=21138085 Colaboradores: Vanbasten 23, Airunp, Vitamine, Jesuja, Folkvanger, CEM-bot, StarBOT, LordT y Annimos: 3
Notacin hngara Fuente: https://es.wikipedia.org/wiki/Notaci%C3%B3n_h%C3%BAngara?oldid=75873474 Colaboradores: Pjimenez,
Moriel, Pablo.cl, Sauron, SpeedyGonzalez, Angus, Elwikipedista, Airunp, Rembiapo pohyiete (bot), RobotQuistnix, Mortadelo, Yrbot,
BOTijo, YurikBot, Beto29, CEM-bot, Thijs!bot, Knocte~eswiki, Snakefang, Aibot, Loveless, BOTarate, Locos epraix, Reyiyo, Luckasbot, MerlIwBot, Ni.cero, Elvisor, Ralgisbot, Addbot y Annimos: 21
Null Fuente: https://es.wikipedia.org/wiki/Null?oldid=85452031 Colaboradores: Moriel, Pilaf, Sms, B1mbo, Tano4595, Renabot, Orgullobot~eswiki, RobotQuistnix, Superzerocool, Chobot, Caiserbot, Yrbot, FlaBot, YurikBot, Qwertyytrewqqwerty, CEM-bot, Thijs!bot, JAnDbot, Camahuetos, Muro de Aguas, Plux, VolkovBot, Technopat, Jos Daniel, Matdrodes, Carcediano, Gabo rage, Cebrianm, Nullsound,
SilvonenBot, CarsracBot, LyingB, Secdio, Manuelt15, Xqbot, Rubinbot, PatruBOT, Dinamik-bot, EmausBot, MerlIwBot, BendelacBOT,
Elvisor, Addbot, Jarould y Annimos: 23
NWNScript Fuente: https://es.wikipedia.org/wiki/NWNScript?oldid=75144330 Colaboradores: Emijrp, Muro Bot, PaintBot, Akhran,
Mctpyt, Grillitus y Annimos: 1
Objeto todopoderoso Fuente: https://es.wikipedia.org/wiki/Objeto_todopoderoso?oldid=86476755 Colaboradores: CEM-bot, Poco a poco, Luckas-bot, MartinDM, TiriBOT, EmausBot, KLBot2, Igorov87, AxVirus, Addbot, Jarould y Annimos: 1
Oday Fuente: https://es.wikipedia.org/wiki/Oday?oldid=69581302 Colaboradores: CF, Gusgus y Cinevoro
Oset (informtica) Fuente: https://es.wikipedia.org/wiki/Offset_(inform%C3%A1tica)?oldid=84332849 Colaboradores: El Moska, Digigalos, Deividmeil, GermanX, Eskimbot, Calsbert, CEM-bot, Thijs!bot, TXiKiBoT, Jmvgpartner, PaintBot, Loveless, El bot de la dieta,
Marcecoro, Jost Riedel, MystBot, DiegoFb, ArthurBot, SuperBraulio13, Xqbot, Isseu, Vascodecai, EmausBot, Grillitus, Addbot y Annimos: 11
OGNL Fuente: https://es.wikipedia.org/wiki/OGNL?oldid=86821108 Colaboradores: Cinabrium, Benjavalero, Isha, DragonBot, UA31,
Luckas-bot, Rodamaker, EmausBot, KLBot2, MetroBot, Elvisor, Addbot y Annimos: 3
OpenACS Fuente: https://es.wikipedia.org/wiki/OpenACS?oldid=78499694 Colaboradores: Barcex, Dianai, Halcn, GermanX, Lobillo,
KnightRider, Davidam, Ca in, Thijs!bot, Cinevoro, Matdrodes, Muro Bot, Obelix83, Mcordova, Cjervis, PixelBot, LordboT, Salva84,
Javiertoledos, Chemaur, Legobot, Ashaverus y Annimos: 6
Operaciones con archivos (informtica) Fuente: https://es.wikipedia.org/wiki/Operaciones_con_archivos_(inform%C3%A1tica)
?oldid=85017788 Colaboradores: Jesuja, CEM-bot, PaintBot, Poco a poco, DiegoFb, LordboT, Jkbw, Grillitus, Elas, rico y Annimos:
2
Operador Fuente: https://es.wikipedia.org/wiki/Operador?oldid=87368515 Colaboradores: 4lex, Yrbot, Jesuja, Gtz, ManuelMore, Marianov, Mister, Davius, Julian Mendez, Ingenioso Hidalgo, Thijs!bot, IrwinSantos, Isha, JAnDbot, Gaius iulius caesar, MONIMINO, Nioger,
Jmvkrecords, VolkovBot, Matdrodes, 3coma14, Ctrl Z, Mel 23, Greek, Mafores, Farisori, ElMeBot, Alejandrocaro35, Juan Mayordomo,
Raulshc, SilvonenBot, AVBOT, Diegusjaimes, Luckas-bot, LordboT, CayoMarcio, ArthurBot, SuperBraulio13, Jkbw, Botarel, Adriana03,
PatruBOT, KamikazeBot, Jorge c2010, EmausBot, TuHan-Bot, Rubpe19, Kallikanzarid, Rezabot, Abin, Travelour, Acratta, Fer13413,
Legobot, Balles2601, Jarould, Lectorina y Annimos: 73
Operando Fuente: https://es.wikipedia.org/wiki/Operando?oldid=86610212 Colaboradores: Gtz, JAnDbot, VolkovBot, Muro Bot, SieBot, Eduardosalg, Poco a poco, AVBOT, LucienBOT, Luckas-bot, Xqbot, PatruBOT, Foundling, EmausBot, HRoestBot, JackieBot, MerlIwBot, Acratta, Elvisor, Dexbot, Addbot y Annimos: 11
Paquetes en PL/SQL Fuente: https://es.wikipedia.org/wiki/Paquetes_en_PL/SQL?oldid=86909034 Colaboradores: Sabbut, Vanbasten
23, Dodo, Platonides, Baito, GermanX, Lobillo, Nicop, Botito777, LordT, PatruBOT y Annimos: 6
Pascal Casing Fuente: https://es.wikipedia.org/wiki/Pascal_Casing?oldid=60127173 Colaboradores: BOT-Superzerocool, Galandil, Ezarate y Annimos: 2
Patch (Unix) Fuente: https://es.wikipedia.org/wiki/Patch_(Unix)?oldid=86042448 Colaboradores: Alejandrocaro35, UA31, Esceptic0,
JackieBot, KLBot2, Elvisor, Zerabat y Annimos: 1
Phrogram Fuente: https://es.wikipedia.org/wiki/Phrogram?oldid=87258582 Colaboradores: Airunp, GermanX, Suomi 1973, CEM-bot,
Rastrojo, Hymake, STBot~eswiki, Botito777, Boto a Boto, PatruBOT, TONYKRAZY, KLBot2, Elvisor y Annimos: 12
Plataforma de desarrollo Fuente: https://es.wikipedia.org/wiki/Plataforma_de_desarrollo?oldid=82814138 Colaboradores: Digigalos,
Airunp, Murven, Gustronico, Shooke, Muro Bot, PaintBot, Marcecoro y Annimos: 4
Plataforma virtual didctica Fuente: https://es.wikipedia.org/wiki/Plataforma_virtual_did%C3%A1ctica?oldid=86908914 Colaboradores: Sabbut, FAR, Airunp, Taichi, Lestaire~eswiki, CEM-bot, Rosarinagazo, Damelac, Netito777, Amanuense, Matdrodes, Bigsus-bot,
Eduardosalg, BetoCG, UA31, AVBOT, David0811, Diegusjaimes, Arjuno3, Mindsociety, Andreasmperu, SuperBraulio13, Jkbw, Figaronline, Ganmedes, Savh, Waka Waka, Palissy, Invadibot, Nescalab, Elvisor, Helmy oved, Josgarfel, Jean70000, JuanG83, Jarould, Worldwriter3, Kintsugi, Oaxaco3293 y Annimos: 65
Polling Fuente: https://es.wikipedia.org/wiki/Polling?oldid=64497459 Colaboradores: Zyder, VolkovBot, FBaena, Eried, Alexbot, LucienBOT, DumZiBoT, Ykhwong, KLBot2 y Annimos: 10
Poltergeist (informtica) Fuente: https://es.wikipedia.org/wiki/Poltergeist_(inform%C3%A1tica)?oldid=65390382 Colaboradores: Kavanagh, Hctor Guido Calvo, ZroBot, Dalbela y Addbot
Portabilidad Fuente: https://es.wikipedia.org/wiki/Portabilidad?oldid=70481568 Colaboradores: Joseaperez, Dodo, Cookie, Daniel G.,
Jag2k4, Renabot, Digigalos, Taichi, Rembiapo pohyiete (bot), RobotQuistnix, Yrbot, YurikBot, Glia, GermanX, KnightRider, Eskimbot,
Siabef, CEM-bot, Spazer, Sir Magician, Karshan, Thijs!bot, Mapep, JAnDbot, TXiKiBoT, Aibot, VolkovBot, Oxigenia, SieBot, Armando.Mejia, Ugly, Jkbw, Marsal20, PatruBOT, ErikvanB, Jef.smets, KLBot2, Leojd88 y Annimos: 23

388

CAPTULO 205. ZENPHP

Postcondicin Fuente: https://es.wikipedia.org/wiki/Postcondici%C3%B3n?oldid=75146898 Colaboradores: Fabeirojorge, Carmin,


Nano412, Waeswaes, ZroBot, Grillitus y KLBot2
Pragma Fuente: https://es.wikipedia.org/wiki/Pragma?oldid=78457101 Colaboradores: SimnK, Airunp, Equi, Martinmartin, Resped,
Xoneca, Fitmoos, Biasoli, VolkovBot, Muro Bot, Loveless, Farisori, PixelBot, Botito777, Luis Felipe Schenone, Roberto Parrillas, Xqbot,
Igna, Pragma~eswiki, KLBot2 y Annimos: 2
Precondicin Fuente: https://es.wikipedia.org/wiki/Precondici%C3%B3n?oldid=74642503 Colaboradores: Ricpelo, Yardcock, Dianai,
Yrbot, Lobillo, Chlewbot, Muro Bot, DSisyphBot, Waeswaes, Sfvier, HRoestBot, Grillitus, KLBot2, Bibliolotranstornado y Annimos: 1
Primitiva de sincronizacin rendezvous Fuente: https://es.wikipedia.org/wiki/Primitiva_de_sincronizaci%C3%B3n_rendezvous?oldid=
54347703 Colaboradores: Sabbut, Ascnder, Dianai, Lobillo, Botito777, MarcoAurelio, Marsal20 y Annimos: 3
Proceso (informtica) Fuente: https://es.wikipedia.org/wiki/Proceso_(inform%C3%A1tica)?oldid=86704547 Colaboradores: Lourdes
Cardenal, ManuelGR, Robbot, Ecelan, Triku, Renacimiento, Jsanchezes, Yakoo, Rodrigouf, Emijrp, Magister Mathematicae, Afpineda,
Yrbot, Martincarr, Wewe, Mriosriquelme, Tomatejc, BOTpolicia, CEM-bot, GoyoToscano, Thijs!bot, RoyFocker, Isha, Dogor, Gusgus,
JAnDbot, Jugones55, Achata, CommonsDelinker, Humberto, Idioma-bot, Sebado, Biasoli, Cipin, Cinevoro, VolkovBot, Technopat, Raystorm, Matdrodes, Elabra sanchez, Shooke, Muro Bot, SieBot, Furado, Tirithel, Jarisleif, Javierito92, MetsBot~eswiki, Lyonn, Aleix87,
PixelBot, Leonpolanco, Netito, VanBot, UA31, AVBOT, Hemingway10, Diegusjaimes, Whibla, Andreasmperu, Luckas-bot, Servando
rivera, SuperBraulio13, Jkbw, S3rg10p3l1gr0, Ricardogpn, Botarel, BOTirithel, Lanreload, EmausBot, Savh, Ebrambot, Jcaraballo, WikitanvirBot, Movses-bot, Heradiom, MerlIwBot, Gohst~eswiki, Acratta, Creosota, Rauletemunoz, Legobot, Hans Topo1993, Oscawilma,
Jarould, Kperdomo1 y Annimos: 145
Proceso para el desarrollo de software Fuente: https://es.wikipedia.org/wiki/Proceso_para_el_desarrollo_de_software?oldid=87352718
Colaboradores: Sabbut, CEM-bot, Osepu, Jgomo3, JAnDbot, Cmontero, Nioger, Leonpolanco, Poco a poco, Greenny, Arjuno3, Jkbw, FrescoBot, TiriBOT, PatruBOT, Waeswaes, ChuispastonBot, MerlIwBot, Travelour, Invadibot, Acratta, Vetranio, Elvisor, 2rombos, Addbot,
ARLIAM, Arisneth, Jyee16, Gys21, Cesarh19, Lagr.0494, Crystallizedcarbon y Annimos: 40
Programa informtico Fuente: https://es.wikipedia.org/wiki/Programa_inform%C3%A1tico?oldid=87352611 Colaboradores: Ejmeza,
Taichi, Magister Mathematicae, Chobot, Vitamine, GermanX, Gaijin, The Photographer, Baneld, CEM-bot, Jorgelrm, Nagul, Baiji,
Jgomo3, Dorieo, Escarbot, RoyFocker, Cratn, Isha, JAnDbot, Jugones55, Gsrdzl, CommonsDelinker, Vsuarezp, Gacq, Humberto, Amanuense, Idioma-bot, Plux, Biasoli, Cinevoro, VolkovBot, Technopat, Queninosta, Matdrodes, Elabra sanchez, Shooke, Lucien leGrey,
Gerakibot, SieBot, PaintBot, Rigenea, Bigsus-bot, BOTarate, Mel 23, Tirithel, Javierito92, Marcecoro, HUB, Estirabot, Eduardosalg, Botelln, Leonpolanco, Alejandrocaro35, Botito777, Petruss, Aipni-Lovrij, UA31, SergioN, MARC912374, AVBOT, David0811, Angel
GN, SubSevenMoRpHeEuS, MarcoAurelio, NjardarBot, Diegusjaimes, Mikiguti, CarsracBot, Arjuno3, Saloca, Luckas-bot, Spirit-BlackWikipedista, Roinpa, Dangelin5, Axel.axel, Nixn, ArthurBot, SuperBraulio13, Xqbot, Jkbw, Igna, Botarel, D'ohBot, BOTirithel, Vubo,
AnselmiJuan, PatruBOT, KamikazeBot, Rudol0075, Foundling, EmausBot, Bachi 2805, Savh, ZroBot, HRoestBot, Grillitus, Rubpe19,
Jcaraballo, MadriCR, AStarBot, MerlIwBot, Vagobot, MetroBot, BiTAlejandro, Elvisor, Helmy oved, Makecat-bot, Addbot, Balles2601,
Amautita12, AVIADOR-bot, Jarould, Kevin15jdr, Beromawiki y Annimos: 180
Programa interactivo Fuente: https://es.wikipedia.org/wiki/Programa_interactivo?oldid=76595564 Colaboradores: BOT-Superzerocool,
Ombresaco, Ignacio Icke, Miik Ezdanitof, Elvisor y Annimos: 8
Programacin lineal paramtrica Fuente: https://es.wikipedia.org/wiki/Programaci%C3%B3n_lineal_param%C3%A9trica?oldid=
76695344 Colaboradores: Dangelin5, Paolahlopez, Nibb10 y Annimos: 1
Programacin visual Fuente: https://es.wikipedia.org/wiki/Programaci%C3%B3n_visual?oldid=82252981 Colaboradores: Vanbasten
23, Airunp, TXiKiBoT, VolkovBot, Matdrodes, Shooke, Muro Bot, NapoliAzzurro, Rgimenez, PipepBot, Eduardosalg, Botito777, LordT,
Aipni-Lovrij, Ellinik, Luckas-bot, Amirobot, DiegoFb, DirlBot, Jkbw, DSP-user, EmausBot, ChuispastonBot, KLBot2, Baute2010, Jarould y Annimos: 21
Programador Fuente: https://es.wikipedia.org/wiki/Programador?oldid=86535702 Colaboradores: Moriel, Vanbasten 23, Robbot, Comae, Rbidegain, Avm, SimnK, Tostadora, Elwikipedista, Mig29x, Edmont, Rapomon, Petronas, Edub, Emijrp, Rembiapo pohyiete (bot),
Magister Mathematicae, Alhen, Chobot, Afpineda, Yrbot, Baito, BOT-Superzerocool, Vitamine, Jhony192, GermanX, KnightRider, Tomatejc, Zalovitch, CEM-bot, Marianov, Roberpl, Mister, Alvaro qc, Tyrannosaurusreex, Srengel, Un Mercenario, RoyFocker, Isha, Imakuni, Jugones55, LogC, Netito777, NaSz, Plux, Developer, NpR.Soft, VolkovBot, Queninosta, Matdrodes, Elabra sanchez, Vladimir138,
3coma14, Muro Bot, Dinopmi, SieBot, Manw, Edans, Jsainz, Tirithel, Marcecoro, HUB, MetsBot~eswiki, Craneorojo, Mawitolope, Chococob, Petto, Poco a poco, Toolserver, UA31, SergioN, AVBOT, David0811, Mizukane203, Quique24, Juanpablovelezlopez, Luckas-bot,
Jaka14, ChristianH, Xqbot, Jkbw, Dreitmen, D'ohBot, Betomorales, Halfdrag, PatruBOT, Humbefa, Guikipedia, Dark Bane, GrouchoBot,
EmausBot, AVIADOR, Sergio Andres Segovia, Mecamtico, Solde9, Iannabir, EmiOk, Waka Waka, WikitanvirBot, MerlIwBot, KLBot2,
Thehelpfulbot, LlamaAl, Carlosierra96, Addbot, Masterchief12345678, MarioFinale y Annimos: 114
Pseudocdigo Fuente: https://es.wikipedia.org/wiki/Pseudoc%C3%B3digo?oldid=87176241 Colaboradores: Pino, JorgeGG, Lourdes
Cardenal, Julie, Rumpelstiltskin, Bigsus, Jynus, Elwikipedista, Lanjoe9, Robotico, Skiel85, Soulreaper, Petronas, Airunp, Edub, Taichi,
Emijrp, RobotQuistnix, Yrbot, Amads, BOTijo, YurikBot, Gaeddal, GermanX, Beto29, Jesuja, Santiperez, Maldoror, Er Komandante, Chlewbot, Transon, Tomatejc, Siabef, Rbonvall, Kn, BOTpolicia, CEM-bot, Jorgelrm, Baiji, Antur, Gafotas, Roslopez, FrancoGG,
Fsd141, Thijs!bot, Leandroidecba, Isha, JAnDbot, Muro de Aguas, Iulius1973, Xavigivax, Netito777, Rei-bot, Nioger, Plux, Jatrobat,
Manuel Trujillo Berges, Almendro, AchedDamiman, VolkovBot, Snakeyes, Technopat, Raystorm, Matdrodes, DJ Nietzsche, BlackBeast,
Carmel2007, Muro Bot, BotMultichill, Ctrl Z, Loveless, Housjdhfjk, Cousteau, Dark, BOTarate, BuenaGente, EdoS, Tirithel, Dnu72, HUB,
Rolocha, Estirabot, Eduardosalg, Leonpolanco, Pan con queso, Alejandrocaro35, BetoCG, Aipni-Lovrij, Osado, UA31, AVBOT, MastiBot, Speedplus, Enramos, Diegusjaimes, Davidgutierrezalvarez, MelancholieBot, Arjuno3, Luckas-bot, Eduenas, Luzbelito92, WikiIgnacioJavier, Nixn, ArthurBot, SuperBraulio13, ChristianH, Manuelt15, Xqbot, Jkbw, Jjuanchojp, Igna, Botarel, Panderine!, Manito777,
E404, BOTirithel, Hprmedina, PatruBOT, Ganmedes, Mr.Ajedrez, Tarawa1943, Waeswaes, Sakura 3, Miss Manzana, Edslov, Derrypr,
Savh, AVIADOR, Sergio Andres Segovia, Africanus, Grillitus, MercurioMT, Mecamtico, Emiduronte, Obeyjuan, MA LpezMolina,
Bien claro, Antonorsi, KLBot2, Gins90, Kepnesro, Henry bedon, Vetranio, Mowgli.solis, Elvisor, Badgov, Helmy oved, VanesaQuintero',
Oscar.gasca7, Ndz17, BOTito, Chico raul, Jarould, Matiia, Ehhhmaincraa, Fernando2812l y Annimos: 369
Puente de aplicacin Fuente: https://es.wikipedia.org/wiki/Puente_de_aplicaci%C3%B3n?oldid=74642668 Colaboradores: Pilaf, Dianai,
Baito, GermanX, Lobillo, -jem-, Especiales, Muro Bot, PaintBot, LucienBOT, Grillitus, Beherith y Annimos: 4
Puntero inteligente Fuente: https://es.wikipedia.org/wiki/Puntero_inteligente?oldid=87179431 Colaboradores: CEM-bot, JoseTomasTocino, El Pantera, Luckas-bot, MystBot, Pepe3r, EmausBot, Josemarente, KLBot2, Johnbot, Elvisor y Annimos: 1

205.3. ORIGEN DEL TEXTO Y LAS IMGENES, COLABORADORES Y LICENCIAS

389

Pure data Fuente: https://es.wikipedia.org/wiki/Pure_data?oldid=87336476 Colaboradores: Aloriel, Dodo, Ejmeza, Jarl, Cinabrium,
Mescalier, Edub, Taichi, Orgullobot~eswiki, Jose.zapata, Yucon, Dibujon, Deprieto, Yrbot, Acracia, FlaBot, YurikBot, GermanX, Marb,
l, Gizmo II, CEM-bot, DierentSmoke~eswiki, Mpeinadopa, Sergeeo, VolkovBot, Jarm.yo, Shooke, Muro Bot, Dinopmi, Loveless,
Drinibot, Botelln, LordT, LucienBOT, Angel GN, Luckas-bot, MystBot, Angelalg, DanielrocaES, ArthurBot, KLBot, KLBot2, El erno,
DerProspekt, Elvisor y Annimos: 27
QuadTIN Fuente: https://es.wikipedia.org/wiki/QuadTIN?oldid=22507224 Colaboradores: Lobillo, Alex15090, Tito HX, PaintBot y DiegoFb
Query string Fuente: https://es.wikipedia.org/wiki/Query_string?oldid=81380457 Colaboradores: Taichi, Rembiapo pohyiete (bot), Varano, GermanX, Lobillo, The Photographer, CEM-bot, Resped, PaintBot, BOTarate, Ortellado, MystBot, DiegoFb, Xqbot, D'ohBot,
KLBot2, Vichock, Ytotrip, Elvisor y Annimos: 5
Quest3D Fuente: https://es.wikipedia.org/wiki/Quest3D?oldid=83296729 Colaboradores: Vanbasten 23, Benjavalero, BOTijo, GermanX,
Thijs!bot, Calapito, Biasoli, Loveless, Tirithel, Alexaltea, Kroji, MastiBot, Sbarrera, MystBot, KLBot2 y Annimos: 3
Quine (programa) Fuente: https://es.wikipedia.org/wiki/Quine_(programa)?oldid=78055735 Colaboradores: Pieter, Robbot, Zwobot,
Renabot, OMenda, RobotQuistnix, Chobot, Yrbot, BOTijo, YurikBot, YoungSpinoza, C-3POrao, Eskimbot, Spc, BOTpolicia, CEM-bot,
JoaquinFerrero, Ajavier, Rulo86, Dusan, Matdrodes, Elabra sanchez, Valenluis, Armando.Mejia, El bot de la dieta, Amoceann~eswiki,
MastiBot, Luckas-bot, Kizar, Abece, KamikazeBot, GrouchoBot, Addbot y Annimos: 11
Rebanamiento esttico Fuente: https://es.wikipedia.org/wiki/Rebanamiento_est%C3%A1tico?oldid=77066202 Colaboradores: Kiekvogel, Airunp, Orgullobot~eswiki, Yrbot, Baito, Lobillo, SieBot, BOTarate, Obersachsebot, BenzolBot, Angelito7, Ll0l00l, KLBot2 y Annimos: 2
Recolector de basura Fuente: https://es.wikipedia.org/wiki/Recolector_de_basura?oldid=87391272 Colaboradores: Comae, Dodo, Opinador, Niqueco, LeonardoRob0t, Gelo71, Yrithinnd, Emijrp, Rembiapo pohyiete (bot), Orgullobot~eswiki, Unf, Afpineda, Yrbot, FlaBot,
YurikBot, GermanX, Beto29, KnightRider, Baneld, BOTpolicia, Qwertyytrewqqwerty, Chguer, CEM-bot, Thijs!bot, uo Martnez,
JAnDbot, ColdWind, Rei-bot, Biasoli, AlnoktaBOT, Technopat, AlleborgoBot, SieBot, Loveless, Mutari, XalD, Rizziac, Louperibot, MastiBot, Diegusjaimes, Victormoz, Luckas-bot, Nallimbot, Xqbot, Hprmedina, RedBot, PatruBOT, TjBot, GrouchoBot, EmausBot, Savh,
WikitanvirBot, MerlIwBot, Elvisor, Addbot y Annimos: 33
Recursin Fuente: https://es.wikipedia.org/wiki/Recursi%C3%B3n?oldid=82777675 Colaboradores: Sabbut, Pablo.cl, JorgeGG, Cdlfd,
Zwobot, Triku, Sms, Pabloa, Rembiapo pohyiete (bot), Magister Mathematicae, Orgullobot~eswiki, RobotQuistnix, Yrbot, Baito, Dagavi,
BOTijo, Equi, CarCar, Jesuja, Baneld, Jos., Jarke, Paintman, Calsbert, CEM-bot, -jem-, Davius, Ingenioso Hidalgo, Escarbot, JAnDbot,
Soulbot, Kakico, TXiKiBoT, HiTe, Humberto, Netito777, Amanuense, Miguelmrm, Matdrodes, Amitie 10g, Peregring-lk, Ensada, Daniel
Ajoy, Farisori, Eduardosalg, Alejandrocaro35, Poco a poco, BodhisattvaBot, Raulshc, AVBOT, Diegusjaimes, MelancholieBot, CarsracBot, Arjuno3, Luckas-bot, Fabiocalde, ArthurBot, Secdio, Xqbot, Bitarray, Ricardogpn, Carlospretelt, TiriBOT, KamikazeBot, EmausBot,
MerlIwBot, Jnjnjn, Acratta, Addbot, DarkBlueZV, BenjaBot, Joseph.skater y Annimos: 62
Refactorizacin Fuente: https://es.wikipedia.org/wiki/Refactorizaci%C3%B3n?oldid=76830519 Colaboradores: Sabbut, Pilaf, Rsg, Wikier~eswiki, LeonardoRob0t, Guille.hoardings, Taichi, RobotQuistnix, Platonides, Yrbot, YurikBot, Wiki-Bot, GermanX, Eskimbot, Calsbert, JAnDbot, TXiKiBoT, Rei-bot, Idioma-bot, Aibot, VolkovBot, Muro Bot, BotMultichill, El bot de la dieta, PipepBot, Amischol,
Alecs.bot, UA31, MastiBot, ArthurBot, SuperBraulio13, Xqbot, Kismalac, EmausBot, ZroBot, ChuispastonBot, KLBot2 y Annimos: 4
Reexin (informtica) Fuente: https://es.wikipedia.org/wiki/Reflexi%C3%B3n_(inform%C3%A1tica)?oldid=75475919 Colaboradores: Fibonacci, Pilaf, Yrithinnd, Chobot, GermanX, KnightRider, Moiwiki, CEM-bot, Santhy, Thijs!bot, JoaquinFerrero, Gusgus, Biasoli, Dusan, VolkovBot, Elabra sanchez, Gerakibot, SieBot, Asclepios~eswiki, Arjuno3, Felipe Raimann, Francisco.cifuentes, JackieBot,
KLBot2, Makecat-bot y Annimos: 11
Relacin de compresin (informtica) Fuente: https://es.wikipedia.org/wiki/Relaci%C3%B3n_de_compresi%C3%B3n_(inform%C3%
A1tica)?oldid=34972408 Colaboradores: Neurotronix
Resolucin de problemas de programacin Fuente: https://es.wikipedia.org/wiki/Resoluci%C3%B3n_de_problemas_de_programaci%
C3%B3n?oldid=84827790 Colaboradores: Vivero, Jesuja, CEM-bot, LMLM, Queninosta, Edmenb, Alejandrocaro35, Botito777, Camilo,
AVBOT, Angel GN, Botarel, AstaBOTh15, BOTirithel, Hprmedina, Iwr, MercurioMT, Helmy oved, Jarould y Annimos: 23
Usuario:Santhy/En edicin/Instancia (programacin) Fuente: https://es.wikipedia.org/wiki/Usuario%3ASanthy/En_edici%C3%B3n/
Instancia_(programaci%C3%B3n)?oldid=67398481 Colaboradores: Santhy
Anexo:Scan code Fuente: https://es.wikipedia.org/wiki/Anexo%3AScan_code?oldid=64546479 Colaboradores: Murphy era un optimista,
Rembiapo pohyiete (bot), GermanX, Ciencia Al Poder, CEM-bot, R2D2!, Snakeyes, Muro Bot, Xqbot, EmausBot, WikitanvirBot, Addbot
y Annimos: 2
Scanf Fuente: https://es.wikipedia.org/wiki/Scanf?oldid=87399727 Colaboradores: Dodo, Ascnder, Jesuja, Faelomx, Nelson.cruz, CEMbot, Jorgelrm, RoyFocker, Hameryko, VolkovBot, Shooke, Muro Bot, Loveless, MacaBot, AntonCampos, Botito777, AVBOT, Luckas-bot,
Kurt86, Ee, Dreitmen, WikitanvirBot, KLBot2, Pccoronado, JacobRodrigues, Monty programador y Annimos: 22
SCons Fuente: https://es.wikipedia.org/wiki/SCons?oldid=77306026 Colaboradores: Hari Seldon, Lin linao, Paintman, Anonimato1990,
Dalacost, Thijs!bot, Muro Bot, LordT, UA31, Amirobot, Nallimbot, Xqbot, D'ohBot, KLBot, FranKapranos, KLBot2, Invadibot, Osorambolo y Annimos: 1
Screen scraping Fuente: https://es.wikipedia.org/wiki/Screen_scraping?oldid=77149450 Colaboradores: RobotQuistnix, Cacique500,
Teufelskerl, VolkovBot, Rapto, Leonpolanco, Alecs.bot, UA31, DiegoFb, Ortisa, Grillitus, Mentibot, KLBot2, Bibliolotranstornado, ProfesorFavalli y Annimos: 1
Seccin crtica Fuente: https://es.wikipedia.org/wiki/Secci%C3%B3n_cr%C3%ADtica?oldid=78884564 Colaboradores: ManuelGR, Comae, 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, Cousteau, Alexbot, MastiBot, MelancholieBot, Luckas-bot, Xqbot, WikitanvirBot, Elvisor, Addbot y Annimos: 8
Serializacin Fuente: https://es.wikipedia.org/wiki/Serializaci%C3%B3n?oldid=87539851 Colaboradores: Angus, Boticario, Rembiapo
pohyiete (bot), Viko~eswiki, RobotQuistnix, Yrbot, YurikBot, GermanX, The Photographer, Baneld, Cad, Qwertyytrewqqwerty, Chguer, CEM-bot, Byzs, BotMultichill, SieBot, Inuyasha1111, R.factorial, HUB, AVBOT, Luckas-bot, Jackie, Almabot, Jkbw, MauritsBot,
BOTirithel, JackieBot, KLBot2, Victorvic1 y Annimos: 20

390

CAPTULO 205. ZENPHP

Sigil Fuente: https://es.wikipedia.org/wiki/Sigil?oldid=75149926 Colaboradores: Sabbut, Mr. Moonlight, JoaquinFerrero, Technopat,


Waeswaes, Grillitus, KLBot2 y Annimos: 1
Signatura (informtica) Fuente: https://es.wikipedia.org/wiki/Signatura_(inform%C3%A1tica)?oldid=79576682 Colaboradores: Beagle~eswiki, Alejolp, Humberto, Muro Bot, Hoenheim, KLBot2, ElGatoSaez, SteenthIWbot y Annimos: 2
Signum Framework Fuente: https://es.wikipedia.org/wiki/Signum_Framework?oldid=64829284 Colaboradores: Sabbut, JMPerez, Cad,
Grillitus, KLBot2 y Annimos: 1
Simple Network Library Fuente: https://es.wikipedia.org/wiki/Simple_Network_Library?oldid=85753665 Colaboradores: CEM-bot,
Shooke, Barri, Muro Bot, Antn Francho, Lacabra25, Rge, KLBot, MerlIwBot y Annimos: 10
Smarty Fuente: https://es.wikipedia.org/wiki/Smarty?oldid=77195456 Colaboradores: Comae, Levhita, Sms, Cinabrium, Boticario, Petronas, Orgullomoore, Rembiapo pohyiete (bot), RobotQuistnix, Superzerocool, Caiserbot, Yrbot, YurikBot, Gpayo, Peperoni, Tomatejc,
Nethac DIU, CEM-bot, Thijs!bot, Escarbot, Botones, VolkovBot, Chusete, Muro Bot, FBaena, Loveless, Obelix83, BOTarate, Machucho2007, Artistadelpecado, PixelBot, Oriol Jimenez, Alexbot, DumZiBoT, Luckas-bot, LordboT, Wikiniel, Crisanto82, XZeroBot, Lalo0002, Xqbot, Adryitan, Apgew, Addbot, BOTito y Annimos: 23
Snippet Fuente: https://es.wikipedia.org/wiki/Snippet?oldid=85722369 Colaboradores: Wolkmx, GermanX, Covi, Drinibot, Louperibot,
Ezarate, Billinghurst, HRoestBot, Albertojuanse, KLBot2, Elvisor, Barkfox y Annimos: 5
Stack Overow Fuente: https://es.wikipedia.org/wiki/Stack_Overflow?oldid=87516998 Colaboradores: Erik Streb, Djcandido, MastiBot,
Grillitus, Kasirbot, MerlIwBot, KLBot2, UAwiki, SantyXDz, Invadibot, Gaaplex, Jarould, Davilajhon98 y Annimos: 8
StarBasic Fuente: https://es.wikipedia.org/wiki/StarBasic?oldid=85575218 Colaboradores: Yrithinnd, FlaBot, Equi, Lobillo, PaintBot,
DiegoFb, KLBot2, Invadibot, Elvisor y Annimos: 2
Stub Fuente: https://es.wikipedia.org/wiki/Stub?oldid=77522196 Colaboradores: Sunsinron, Dasoman, KLBot2, Ni.cero, Harpagornis y
Annimos: 2
Subalgoritmo Fuente: https://es.wikipedia.org/wiki/Subalgoritmo?oldid=75146615 Colaboradores: Jesuja, Pinar~eswiki, Biasoli, Fran
Ara, Technopat, Grillitus y Annimos: 2
Tabla de saltos Fuente: https://es.wikipedia.org/wiki/Tabla_de_saltos?oldid=64505443 Colaboradores: CEM-bot, Fabeirojorge, Muro
Bot, Mafores, KLBot2, Elvisor y Annimos: 1
Tabla de verdad Fuente: https://es.wikipedia.org/wiki/Tabla_de_verdad?oldid=87508038 Colaboradores: Sabbut, Vivero, Dodo, Julian
Colina, Robotje, Melocoton, Dianai, Xenoforme, Elsenyor, FAR, LeonardoRob0t, Xuankar, Yrithinnd, Taichi, Rembiapo pohyiete (bot),
Caiser, Gabri-gr-es, Magister Mathematicae, Kokoo, Orgullobot~eswiki, RobotQuistnix, JKD, Caiserbot, FlaBot, Vitamine, .Sergio, YurikBot, GermanX, The Photographer, No s qu nick poner, Baneld, Chlewbot, Filipo, Lagarto, BOTpolicia, CEM-bot, Laura Fiorucci,
Arctosouros, -jem-, L30nc1t0, Davius, Antur, Lauranrg, Mario modesto, Isha, JAnDbot, Mansoncc, Muro de Aguas, Gsrdzl, Alephcero~eswiki, Amdkde, Pabloallo, MONIMINO, VolkovBot, Technopat, C'est moi, Matdrodes, AlleborgoBot, Muro Bot, Edmenb, SieBot,
Loveless, Drinibot, Mel 23, Belb, Fortefranco, Tirithel, XalD, Jarisleif, Dnu72, Nicop, Farisori, Eduardosalg, Dansanti, Leonpolanco,
Alejandrocaro35, BetoCG, Cebrianm, Angel verde, Aipni-Lovrij, Camilo, UA31, AVBOT, Ellinik, Xenocrates, MastiBot, Diegusjaimes, Luckas-bot, Nallimbot, Dangelin5, Luis Felipe Schenone, ArthurBot, SuperBraulio13, Xqbot, Jkbw, GNM, Kevinar12, Ricardogpn,
Bot0811, Kismalac, Igna, MAfotBOT, Hprmedina, Danie1996, Omerta-ve, PatruBOT, Ripchip Bot, Tarawa1943, Wikilptico, Miss Manzana, Edslov, Jhon97, ZroBot, MercurioMT, Mecamtico, ChuispastonBot, MadriCR, Desdeluego, Waka Waka, Antonorsi, Acratta, Elvisor, JYBot, Helmy oved, Addbot, Balles2601, Juan paul toledo rivera, Veloniel, Lopenovi, XVRT, Joanmiguel1998, Jarould, Kenia Marcela
y Annimos: 342
Thunk Fuente: https://es.wikipedia.org/wiki/Thunk?oldid=64588015 Colaboradores: Mar del Sur, KLBot2 y Annimos: 1
Tipo de dato elemental Fuente: https://es.wikipedia.org/wiki/Tipo_de_dato_elemental?oldid=77059484 Colaboradores: Emijrp, Jesuja,
Asocall, Loveless, Juan Mayordomo, Waeswaes, Grillitus, MerlIwBot, Addbot y DarkBlueZV
Tringulo de Floyd Fuente: https://es.wikipedia.org/wiki/Tri%C3%A1ngulo_de_Floyd?oldid=73932861 Colaboradores: Urdangaray,
Koldito, Drinibot, Alejandrocaro35, Raulshc, LucienBOT, WikitanvirBot, KLBot2, Invadibot y Annimos: 1
Tubera (informtica) Fuente: https://es.wikipedia.org/wiki/Tuber%C3%ADa_(inform%C3%A1tica)?oldid=80896342 Colaboradores:
4lex, Elwikipedista, FlaBot, GermanX, Nihilo, Jorgechp, CEM-bot, Dogor, JAnDbot, NaBUru38, Penarc, PaintBot, Piware, LordT, Arjuno3, DiegoFb, Vivaelcelta, EmausBot, ZroBot, Mentibot, Bibliolotranstornado, Elvisor, Xbosch, Ralgisbot, Addbot y Annimos: 4
Violacin de acceso Fuente: https://es.wikipedia.org/wiki/Violaci%C3%B3n_de_acceso?oldid=72535485 Colaboradores: LeCire, RobotQuistnix, Chobot, Yrbot, YurikBot, Siabef, Raulul, Electrican MV, Thijs!bot, TXiKiBoT, PetrohsW, MastiBot, TobeBot, Waeswaes,
GrouchoBot, Grillitus, KLBot2 y Annimos: 8
Waf Fuente: https://es.wikipedia.org/wiki/Waf?oldid=87092956 Colaboradores: Jcarlos77, Anonimato1990, Muro Bot, LordT, UA31,
Luckas-bot, MystBot, AstaBOTh15, ZroBot, MerlIwBot, KLBot2, NyappyBOT, Elvisor y Annimos: 1
Win32 Thread Information Block Fuente: https://es.wikipedia.org/wiki/Win32_Thread_Information_Block?oldid=67493984 Colaboradores: CEM-bot, Especiales, Luiswtc73, LucienBOT, Mizukane203, Yuri Grille Orce, TiriBOT, DarAR92 y Addbot
Wrapper Fuente: https://es.wikipedia.org/wiki/Wrapper?oldid=75067340 Colaboradores: Kirtash006, Totemkin, VictorPines y Niniahormona
XAML Fuente: https://es.wikipedia.org/wiki/XAML?oldid=87128772 Colaboradores: Zwobot, Sampler, Wikier~eswiki, Aliman5040,
Viko~eswiki, Murven, RobotQuistnix, Yrbot, BOTijo, GermanX, KnightRider, Jesuja, Edanielc, CEM-bot, Jjvaca, Thijs!bot, Locovich,
Nahog, Rei-bot, Jarm.yo, Muro Bot, SieBot, PaintBot, Rv53705, BenjaminZepeda, OssDev~eswiki, Jmmuguerza, DragonBot, Pablo323,
Alexbot, UA31, AVBOT, LucienBOT, Whibla, Bethan 182, Linfocito B, DiegoFb, ArthurBot, Abcpaem, Xqbot, EmausBot, WikitanvirBot, Diamondland, KLBot2, Elvisor y Annimos: 20
Zenphp Fuente: https://es.wikipedia.org/wiki/Zenphp?oldid=77226374 Colaboradores: Muro Bot, Poco a poco, UA31, Juaxix, LordboT,
Jllopezpino, FrescoBot, MerlIwBot, Elvisor, BOTito y Annimos: 2

205.3. ORIGEN DEL TEXTO Y LAS IMGENES, COLABORADORES Y LICENCIAS

205.3.2

391

Imgenes

Archivo:Actual_DEC_UNIX_License_Plate_DSC_0317.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/c/c0/Actual_


DEC_UNIX_License_Plate_DSC_0317.jpg Licencia: CC BY-SA 3.0 Colaboradores: Trabajo propio Artista original: Armandops
Archivo:Ada_Lovelace_1838.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/2/2e/Ada_Lovelace_1838.jpg Licencia:
Public domain Colaboradores:
From The Ada Picture Gallery.
Evelyn Silva scanned this from a picture she found in the trashin 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.
Artista original: William Henry Mote
Archivo:Adobe_Director_v11_icon.png Fuente: https://upload.wikimedia.org/wikipedia/commons/e/ee/Adobe_Director_v11_icon.
png Licencia: Public domain Colaboradores: This image is from roaringapps.com/app:413 (Direct link) It matches the smaller sized one
available on adobe.com at [1] and [2]; therefore, it is believed to be the genuine icon. Artista original: Adobe Systems
Archivo:Ampersand.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/1/1b/Ampersand.svg Licencia: CC-BY-SA-3.0 Colaboradores: ? Artista original: ?
Archivo:Bang.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/e/e6/Bang.jpg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:Begriffsschrift_connective1.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/6/67/Begriffsschrift_connective1.
svg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Guus Hoekman
Archivo:Blackbox3D.png Fuente: https://upload.wikimedia.org/wikipedia/commons/4/44/Blackbox3D.png Licencia: CC BY-SA 4.0 Colaboradores: Trabajo propio Artista original: Krauss
Archivo:Blueduck.png Fuente: https://upload.wikimedia.org/wikipedia/commons/c/c8/Blueduck.png Licencia: CC BY-SA 3.0 Colaboradores: http://willnicholes.com/duck/screenshots.htm Artista original: Will Nicholes
Archivo:Broom_icon.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/2/2c/Broom_icon.svg Licencia: GPL Colaboradores: http://www.kde-look.org/content/show.php?content=29699 Artista original: gg3po (Tony Tony), SVG version by User:Booyabazooka
Archivo:CamelCase_sign.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/6/6d/CamelCase_sign.jpg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Camera_web.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/f/f4/Camera_web.jpg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:Check_mark.png Fuente: https://upload.wikimedia.org/wikipedia/commons/f/f0/Check_mark.png Licencia: CC BY-SA 3.0
Colaboradores: Wikipedia Artista original: Wikipedia
Archivo:Ciclo_mientras.png Fuente: https://upload.wikimedia.org/wikipedia/commons/a/a1/Ciclo_mientras.png Licencia: CC-BY-SA3.0 Colaboradores: Trabajo propio (Hecho con OpenOce.org Draw) Artista original: kn
Archivo:Cmake.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/1/13/Cmake.svg Licencia: CC BY 2.0 Colaboradores:
File:Cmake.jpg Artista original: Cmake team. The original uploader was Francesco Betti Sorbelli de Wikipedia en italiano. Vectorized
by Magasjukur2
Archivo:CodeCmmt002.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/7/75/CodeCmmt002.svg Licencia: CC BY 2.5
Colaboradores: Transferido desde en.wikipedia a Commons.28041964 Artista original: The original uploader was Dreftymac de Wikipedia
en ingls
Archivo:Commons-emblem-copyedit.svg
Fuente:
Commons-emblem-copyedit.svg Licencia: CC BY-SA 3.0 Colaboradores:

https://upload.wikimedia.org/wikipedia/commons/e/e8/

File:Gnome-emblem-important.svg Artista original: GNOME icon artists, Fitoschido


Archivo:Commons-emblem-disambig-notice.svg
Fuente:
Commons-emblem-disambig-notice.svg Licencia: GPL Colaboradores:

https://upload.wikimedia.org/wikipedia/commons/5/58/

Commons-emblem-notice.svg Artista original: GNOME icon artists, Fitoschido


Archivo:Commons-emblem-issue.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/b/bc/Commons-emblem-issue.svg
Licencia: GPL Colaboradores: File:Gnome-emblem-important.svg Artista original: GNOME icon artists and User:ViperSnake151
Archivo:Commons-emblem-merge.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/8/8b/Commons-emblem-merge.svg
Licencia: CC BY-SA 3.0 Colaboradores:
File:Gnome-emblem-important.svg Artista original: GNOME icon artists, Fitoschido
Archivo:Commons-emblem-question_book_orange.svg
Fuente:
https://upload.wikimedia.org/wikipedia/commons/1/1f/
Commons-emblem-question_book_orange.svg Licencia: CC BY-SA 3.0 Colaboradores: <a href='//commons.wikimedia.org/wiki/File:
Commons-emblem-issue.svg' class='image'><img alt='Commons-emblem-issue.svg' src='https://upload.wikimedia.org/wikipedia/
commons/thumb/b/bc/Commons-emblem-issue.svg/25px-Commons-emblem-issue.svg.png' width='25' height='25' srcset='https:
//upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/38px-Commons-emblem-issue.svg.png
1.5x,
https://upload.wikimedia.org/wikipedia/commons/thumb/b/bc/Commons-emblem-issue.svg/50px-Commons-emblem-issue.svg.png 2x'
data-le-width='48' data-le-height='48' /></a> + <a href='//commons.wikimedia.org/wiki/File:Question_book.svg' class='image'><img
alt='Question
book.svg'
src='https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/25px-Question_
book.svg.png' width='25' height='20' srcset='https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/
38px-Question_book.svg.png 1.5x, https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.svg/50px-Question_
book.svg.png 2x' data-le-width='252' data-le-height='199' /></a> Artista original: GNOME icon artists, Jorge 2701

392

CAPTULO 205. ZENPHP

Archivo:Commons-emblem-question_book_yellow.svg
Fuente:
https://upload.wikimedia.org/wikipedia/commons/d/dd/
Commons-emblem-question_book_yellow.svg Licencia: CC BY-SA 3.0 Colaboradores: <a href='//commons.wikimedia.org/wiki/File:
Commons-emblem-query.svg' class='image'><img alt='Commons-emblem-query.svg' src='https://upload.wikimedia.org/wikipedia/
commons/thumb/c/c5/Commons-emblem-query.svg/25px-Commons-emblem-query.svg.png' width='25' height='25' srcset='https:
//upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Commons-emblem-query.svg/38px-Commons-emblem-query.svg.png 1.5x,
https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Commons-emblem-query.svg/50px-Commons-emblem-query.svg.png
2x' data-le-width='48' data-le-height='48' /></a> + <a href='//commons.wikimedia.org/wiki/File:Question_book.svg'
class='image'><img alt='Question book.svg' src='https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.
svg/25px-Question_book.svg.png' width='25' height='20' srcset='https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/
Question_book.svg/38px-Question_book.svg.png 1.5x, https://upload.wikimedia.org/wikipedia/commons/thumb/9/97/Question_book.
svg/50px-Question_book.svg.png 2x' data-le-width='252' data-le-height='199' /></a> Artista original: GNOME icon artists, Linfocito
B
Archivo:Commons-logo.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/4/4a/Commons-logo.svg Licencia: Public domain Colaboradores: This version created by Pumbaa, using a proper partial circle and SVG geometry features. (Former versions used
to be slightly warped.) Artista original: SVG version was created by User:Grunt and cleaned up by 3247, based on the earlier PNG version,
created by Reidab.
Archivo:Computer-aj_aj_ashton_01.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/d/d7/Desktop_computer_clipart_
-_Yellow_theme.svg Licencia: CC0 Colaboradores: https://openclipart.org/detail/105871/computeraj-aj-ashton-01 Artista original: AJ
from openclipart.org
Archivo:Condicional.png Fuente: https://upload.wikimedia.org/wikipedia/commons/0/0e/Condicional.png Licencia: CC-BY-SA-3.0
Colaboradores: Trabajo propio (Hecho con OpenOce.org Draw) Artista original: kn
Archivo:Condicional1.png Fuente: https://upload.wikimedia.org/wikipedia/commons/f/f8/Condicional1.png Licencia: CC-BY-SA-3.0
Colaboradores: Trabajo propio Artista original: Jesuja
Archivo:Crystal_Clear_action_edit_add.png Fuente: https://upload.wikimedia.org/wikipedia/commons/e/e2/Crystal_Clear_action_
edit_add.png Licencia: LGPL Colaboradores: All Crystal Clear icons were posted by the author as LGPL on kde-look; Artista original:
Everaldo Coelho and YellowIcon;
Archivo:Crystal_Clear_app_kcoloredit.png Fuente: https://upload.wikimedia.org/wikipedia/commons/7/70/Crystal_Clear_app_
kcoloredit.png Licencia: LGPL Colaboradores: All Crystal Clear icons were posted by the author as LGPL on kde-look; Artista original:
Everaldo Coelho and YellowIcon;
Archivo:Cscr-featured.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/e/e7/Cscr-featured.svg Licencia: LGPL Colaboradores: Wikipedia until June, 2006 Artista original: Wikimedia users ClockworkSoul, CyberSkull, Optimager, White Cat, Erina, AzaToth,
Pbroks13.
Archivo:Cuadro_de_ventajas_y_desventajas_del_uso_del_Paradigma_tradicional.JPG Fuente: https://upload.wikimedia.org/
wikipedia/commons/2/21/Cuadro_de_ventajas_y_desventajas_del_uso_del_Paradigma_tradicional.JPG Licencia: CC BY-SA 3.0
Colaboradores: Trabajo propio Artista original: Arisneth Chanapi
Archivo:DeadlockGraph.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/9/99/DeadlockGraph.svg Licencia: CC0 Colaboradores: Trabajo propio Artista original: Niqueco
Archivo:Dg-nova3.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/9/99/Dg-nova3.jpg Licencia: Copyrighted free use Colaboradores: Photograph taken by Qu1j0t3. Artista original: User Qu1j0t3 on en.wikipedia
Archivo:DiagramaFlujoLampara.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/7/76/DiagramaFlujoLampara.svg
Licencia: CC-BY-SA-3.0 Colaboradores: versin en espaol de w:Image:LampFlowchart.svg Artista original: svg en espaol por Jipumarino
Archivo:Distrains.png Fuente: https://upload.wikimedia.org/wikipedia/commons/0/05/Distrains.png Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:Droste.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/6/62/Droste.jpg Licencia: Public domain Colaboradores:
[4] [5] Artista original: Jan (Johannes) Misset?
Archivo:Ejemplo_de_JFrame.png Fuente: https://upload.wikimedia.org/wikipedia/commons/5/5e/Ejemplo_de_JFrame.png Licencia:
CC BY-SA 4.0 Colaboradores: Trabajo propio Artista original: Ivordro UV
Archivo:El_modelo_de_desarrollo_en_cascada.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/2/2e/El_modelo_de_
desarrollo_en_cascada.svg Licencia: CC BY 3.0 Colaboradores: http://en.wikipedia.org/wiki/File:Waterfall_model_%281%29.svg Artista
original: Paulsmith99
Archivo:Esoteric_Taijitu.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/2/21/Esoteric_Taijitu.svg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Kenny Shen
Archivo:Esperluette.png Fuente: https://upload.wikimedia.org/wikipedia/commons/8/8f/Esperluette.png Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:For-loop-diagram.png Fuente: https://upload.wikimedia.org/wikipedia/commons/0/06/For-loop-diagram.png Licencia: CC
BY-SA 2.5 Colaboradores: No machine-readable source provided. Own work assumed (based on copyright claims). Artista original: No
machine-readable author provided. Faxe assumed (based on copyright claims).
Archivo:Fuente.png Fuente: https://upload.wikimedia.org/wikipedia/commons/e/e2/Fuente.png Licencia: Public domain Colaboradores:
? Artista original: ?
Archivo:Garbage_collection.gif Fuente: https://upload.wikimedia.org/wikipedia/commons/3/3b/Garbage_collection.gif Licencia: Public domain Colaboradores: Trabajo propio Artista original: German
Archivo:Glider.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/4/45/Glider.svg Licencia: Public domain Colaboradores:
Hacker Emblem Artista original: Eric S. Raymond

205.3. ORIGEN DEL TEXTO Y LAS IMGENES, COLABORADORES Y LICENCIAS

393

Archivo:Gnome-globe.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/f/f3/Gnome-globe.svg Licencia: LGPL Colaboradores: http://ftp.gnome.org/pub/GNOME/sources/gnome-themes-extras/0.9/gnome-themes-extras-0.9.0.tar.gz Artista original: David
Vignoni
Archivo:Grid.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/4/47/Grid.jpg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:H96566k.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/8/8a/H96566k.jpg Licencia: Public domain Colaboradores: U.S. Naval Historical Center Online Library Photograph NH 96566-KN Artista original: Courtesy of the Naval Surface Warfare
Center, Dahlgren, VA., 1988.
Archivo:HappyHackingBicicleta.png Fuente: https://upload.wikimedia.org/wikipedia/commons/5/59/HappyHackingBicicleta.png Licencia: CC BY-SA 3.0 Colaboradores: Trabajo propio Artista original: Omerta-ve
Archivo:Heckert_GNU_white.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/2/22/Heckert_GNU_white.svg Licencia:
CC BY-SA 2.0 Colaboradores: gnu.org Artista original: Aurelio A. Heckert <aurium@gmail.com>
Archivo:Historical_ampersand_evolution.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/1/1c/Historical_ampersand_
evolution.svg Licencia: CC BY-SA 3.0 Colaboradores: Trabajo propio Artista original: Alatius
Archivo:History.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/d/d2/History.svg Licencia: CC BY-SA 3.0 Colaboradores: http://darkobra.deviantart.com/art/Tango-History-Icon-163719409 Artista original: ~DarKobra at Deviantart
Archivo:Hola_Mundo_AppleScript.png Fuente: https://upload.wikimedia.org/wikipedia/commons/3/3b/Hola_Mundo_AppleScript.
png Licencia: CC BY-SA 3.0 Colaboradores: Trabajo propio Artista original: Jaimemf
Archivo:Html-source-code3.png Fuente: https://upload.wikimedia.org/wikipedia/commons/3/3d/Html-source-code3.png Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Icon_tools.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/8/8e/Icon_tools.svg Licencia: CC BY 2.5 Colaboradores: File:Icon tools.png: http://www.icon-king.com/projects/nuvola/ Artista original: David Vignoni, STyx
Archivo:Indireccion.gif Fuente: https://upload.wikimedia.org/wikipedia/commons/7/7b/Indireccion.gif Licencia: Public domain Colaboradores: No machine-readable source provided. Own work assumed (based on copyright claims). Artista original: No machine-readable
author provided. Glioma assumed (based on copyright claims).
Archivo:Linux_API_and_Linux_ABI.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/b/bb/Linux_API_and_Linux_
ABI.svg Licencia: CC BY-SA 4.0 Colaboradores: Trabajo propio Artista original: ScotXW
Archivo:Linux_kernel_interfaces.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/6/68/Linux_kernel_interfaces.svg Licencia: CC BY-SA 3.0 Colaboradores: Esta imagen incluye elementos que han sido tomados o adaptados de esta: <a
href='//commons.wikimedia.org/wiki/File:Tux-shaded.svg' class='image'><img alt='Tux-shaded.svg' src='https://upload.wikimedia.org/
wikipedia/commons/thumb/0/0a/Tux-shaded.svg/17px-Tux-shaded.svg.png' width='17' height='20' srcset='https://upload.wikimedia.
org/wikipedia/commons/thumb/0/0a/Tux-shaded.svg/25px-Tux-shaded.svg.png 1.5x, https://upload.wikimedia.org/wikipedia/commons/
thumb/0/0a/Tux-shaded.svg/33px-Tux-shaded.svg.png 2x' data-le-width='249' data-le-height='297' /></a> Tux-shaded.svg. Artista original: ScotXW
Archivo:Logical_connectives_Hasse_diagram.svg
Fuente:
https://upload.wikimedia.org/wikipedia/commons/3/3e/Logical_
connectives_Hasse_diagram.svg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Watchduck (a.k.a. Tilman
Piesk)

Archivo:Mergefrom.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/0/0f/Mergefrom.svg Licencia: Public domain Colaboradores: ? Artista original: ?


Archivo:Metro_pd.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/a/a8/Metro_pd.jpg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:ModeloEspiral.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/3/39/ModeloEspiral.svg Licencia: Public domain
Colaboradores: ? Artista original: Chabacano
Archivo:Multiple_Branching.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/e/ef/Multiple_Branching.jpg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Ben Honan
Archivo:NewTux.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/b/b0/NewTux.svg Licencia: Attribution Colaboradores:
Based on original image by Larry Ewing, created using Sodipodi Artista original: gg3po (kde-look.org source)
Archivo:Nuvola_apps_edu_science.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/5/59/Nuvola_apps_edu_science.svg
Licencia: LGPL Colaboradores: http://ftp.gnome.org/pub/GNOME/sources/gnome-themes-extras/0.9/gnome-themes-extras-0.9.0.tar.gz
Artista original: David Vignoni / ICON KING
Archivo:Nuvola_apps_konsole.png Fuente: https://upload.wikimedia.org/wikipedia/commons/2/24/Nuvola_apps_konsole.png Licencia: LGPL Colaboradores: http://icon-king.com Artista original: David Vignoni / ICON KING
Archivo:Nuvola_devices_cdrom_unmount.png Fuente: https://upload.wikimedia.org/wikipedia/commons/9/9d/Nuvola_devices_
cdrom_unmount.png Licencia: LGPL Colaboradores: http://icon-king.com Artista original: David Vignoni / ICON KING
Archivo:Nuvola_mimetypes_template_source.png
Fuente:
https://upload.wikimedia.org/wikipedia/commons/1/1c/Nuvola_
mimetypes_template_source.png Licencia: LGPL Colaboradores: http://icon-king.com Artista original: David Vignoni / ICON
KING
Archivo:Object-Oriented-Programming-Methods-And-Classes-with-Inheritance.png Fuente:
wikipedia/commons/3/37/Object-Oriented-Programming-Methods-And-Classes-with-Inheritance.png
Colaboradores: Taking a screenshot, then editing using Paint.NET Artista original: Carrot Lord

https://upload.wikimedia.org/
Licencia: CC BY-SA 3.0

Archivo:Objetos.png Fuente: https://upload.wikimedia.org/wikipedia/commons/8/8f/Objetos.png Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:Osc.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/3/36/Osc.jpg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg

394

CAPTULO 205. ZENPHP

Archivo:Oscilador.png Fuente: https://upload.wikimedia.org/wikipedia/commons/5/51/Oscilador.png Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:Overview_of_the_Common_Language_Infrastructure.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/8/85/
Overview_of_the_Common_Language_Infrastructure.svg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Jarkko
Piiroinen
Archivo:Phonebloks_open.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/6/6a/Phonebloks_open.jpg Licencia: CC BYSA 3.0 Colaboradores: Provided by email Artista original: Dave Hakkens
Archivo:Pipe_and_broken_bar.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/6/6f/Pipe_and_broken_bar.svg Licencia: Public domain Colaboradores: Trabajo propio Artista original: GJo
Archivo:PlusMinusTimesDivide.png Fuente: https://upload.wikimedia.org/wikipedia/commons/5/59/PlusMinusTimesDivide.png Licencia: Public domain Colaboradores: Trabajo propio Artista original: Theodoric Stier
Archivo:ProcesamientoDatos.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/e/e6/ProcesamientoDatos.svg Licencia:
Public domain Colaboradores:
ProcesamientoDatos.png Artista original: ProcesamientoDatos.png: Moriel
Archivo:Puertas_lgicas_de_circuitos.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/5/5a/Puertas_l%C3%B3gicas_
de_circuitos.jpg Licencia: CC BY-SA 3.0 Colaboradores: Trabajo propio Artista original: MONIMINO
Archivo:Pure_data_screen_capture.png Fuente: https://upload.wikimedia.org/wikipedia/commons/e/ed/Pure_data_screen_capture.
png Licencia: CC-BY-SA-3.0 Colaboradores: ? Artista original: ?
Archivo:Rubber_duck_assisting_with_debugging.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/d/d5/Rubber_duck_
assisting_with_debugging.jpg Licencia: CC BY-SA 3.0 Colaboradores: Trabajo propio Artista original: Tom Morris
Archivo:SNL_Logo.png Fuente: https://upload.wikimedia.org/wikipedia/commons/4/4b/SNL_Logo.png Licencia: CC BY-SA 3.0 Colaboradores: Trabajo propio Artista original: Lacabra25
Archivo:SO_Home_Page.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/e/e7/SO_Home_Page.jpg Licencia: Public domain Colaboradores: Trabajo propio Artista original: George Edison
Archivo:Sciences_humaines.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/3/3f/Sciences_humaines.svg Licencia:
LGPL Colaboradores: eriollsdesigns - Lanthys Icon Set (for KDE) Artista original: Adrien Faclina
Archivo:Select-object_Pure_Data.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/c/cf/Select-object_Pure_Data.svg Licencia: BSD Colaboradores: SVG converted from the PostScript output of the software Artista original: Miller-Puckette
Archivo:SierpinskiTriangle.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/8/80/SierpinskiTriangle.svg Licencia: Public
domain Colaboradores: Trabajo propio Artista original: PiAndWhippedCream
Archivo:Spanish_Language_Wiki.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/2/2a/Spanish_Language_Wiki.svg
Licencia: CC BY-SA 3.0 Colaboradores: Derived from Wiki puzzle.svg by user:Kimbar Artista original: James.mcd.nz
Archivo:Spanish_Wikiquote.SVG Fuente: https://upload.wikimedia.org/wikipedia/commons/1/13/Spanish_Wikiquote.SVG Licencia:
CC BY-SA 3.0 Colaboradores: derived from Wikiquote-logo.svg Artista original: James.mcd.nz
Archivo:Sports_icon.png Fuente: https://upload.wikimedia.org/wikipedia/commons/9/95/Sports_icon.png Licencia: Public domain Colaboradores: made by myself Artista original: Pepetps
Archivo:Start_pd.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/a/a1/Start_pd.jpg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:Steven_Levy_(1).jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/a/ac/Steven_Levy_%281%29.jpg Licencia:
CC BY 2.0 Colaboradores: http://www.flickr.com/photos/joi/2939357516/sizes/o/in/photostream/ Artista original: Joi
Archivo:Subpatch.jpg Fuente: https://upload.wikimedia.org/wikipedia/commons/9/98/Subpatch.jpg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:TE_Conex_00.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/3/3c/TE_Conex_00.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Conex_05.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/8/81/TE_Conex_05.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Conex_09.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/a/ae/TE_Conex_09.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Conex_10.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/5/51/TE_Conex_10.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Conex_12.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/4/4b/TE_Conex_12.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Conex_14.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/9/92/TE_Conex_14.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_05.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/c/cd/TE_Interu_05.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_06.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/e/e3/TE_Interu_06.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_07.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/5/5d/TE_Interu_07.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_08.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/0/0a/TE_Interu_08.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72

205.3. ORIGEN DEL TEXTO Y LAS IMGENES, COLABORADORES Y LICENCIAS

395

Archivo:TE_Interu_1A.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/6/6c/TE_Interu_1A.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_1B.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/7/72/TE_Interu_1B.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_1C.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/a/aa/TE_Interu_1C.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_2A.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/f/f1/TE_Interu_2A.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_2B.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/2/28/TE_Interu_2B.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_3A.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/0/02/TE_Interu_3A.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_3B.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/f/f0/TE_Interu_3B.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:TE_Interu_4B.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/a/ae/TE_Interu_4B.svg Licencia: GFDL Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:Tabla_de_verdad.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/6/60/Tabla_de_verdad.svg Licencia: CC BYSA 3.0 Colaboradores: Trabajo propio Artista original: Dnu72
Archivo:Tecno-rueda.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/1/1f/Tecno-rueda.svg Licencia: CC BY-SA 2.5
Colaboradores: <a href='//commons.wikimedia.org/wiki/File:Start-here.svg' class='image'><img alt='Start-here.svg' src='https://upload.
wikimedia.org/wikipedia/commons/thumb/5/57/Start-here.svg/32px-Start-here.svg.png' width='32' height='32' srcset='https://upload.
wikimedia.org/wikipedia/commons/thumb/5/57/Start-here.svg/48px-Start-here.svg.png 1.5x, https://upload.wikimedia.org/wikipedia/
commons/thumb/5/57/Start-here.svg/64px-Start-here.svg.png 2x' data-le-width='48' data-le-height='48' /></a> The Tango! Desktop
Project. Artista original: The people from the Tango! project.
Archivo:Test_pd.png Fuente: https://upload.wikimedia.org/wikipedia/commons/c/c2/Test_pd.png Licencia: Public domain Colaboradores: Trabajo propio Artista original: Angelalg
Archivo:Translation_arrow.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/2/2a/Translation_arrow.svg Licencia: CCBY-SA-3.0 Colaboradores: grco vectorial con Inkscape.
Artista original: Jesse Burgheimer
Archivo:Two_red_dice_01.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/3/36/Two_red_dice_01.svg Licencia: CC0
Colaboradores: Open Clip Art Library Artista original: Stephen Silver
Archivo:USB_flash_drive.JPG Fuente: https://upload.wikimedia.org/wikipedia/commons/2/2c/USB_flash_drive.JPG Licencia: CCBY-SA-3.0 Colaboradores: ? Artista original: ?
Archivo:Venn00.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/5/5c/Venn00.svg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Lipedia
Archivo:Venn0001.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/9/99/Venn0001.svg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Venn0011.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/7/76/Venn0011.svg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Venn01.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/0/06/Venn01.svg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Lipedia
Archivo:Venn0101.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/1/10/Venn0101.svg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Venn0110.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/4/46/Venn0110.svg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Venn0111.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/3/30/Venn0111.svg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Venn10.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/7/73/Venn10.svg Licencia: Public domain Colaboradores: Trabajo propio Artista original: Watchduck (a.k.a. Tilman Piesk)
Archivo:Venn1000.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/3/3c/Venn1000.svg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Venn1001.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/4/47/Venn1001.svg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Venn1011.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/1/1e/Venn1011.svg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Venn11.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/3/3f/Venn11.svg Licencia: Public domain Colaboradores:
Trabajo propio Artista original: Lipedia
Archivo:Venn1101.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/3/35/Venn1101.svg Licencia: Public domain Colaboradores: ? Artista original: ?
Archivo:Venn1110.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/c/cb/Venn1110.svg Licencia: Public domain Colaboradores: ? Artista original: ?

396

CAPTULO 205. ZENPHP

Archivo:Waterfall_model.png Fuente: https://upload.wikimedia.org/wikipedia/commons/5/51/Waterfall_model.png Licencia: CC BYSA 2.5 Colaboradores: Transferido desde en.wikipedia a Commons. Artista original: The original uploader was PaulHoadley de Wikipedia
en ingls
Archivo:Wikibooks-logo.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/f/fa/Wikibooks-logo.svg Licencia: CC BY-SA
3.0 Colaboradores: Trabajo propio Artista original: User:Bastique, User:Ramac et al.
Archivo:Wikinews-logo.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/2/24/Wikinews-logo.svg Licencia: CC BY-SA
3.0 Colaboradores: This is a cropped version of Image:Wikinews-logo-en.png. Artista original: Vectorized by Simon 01:05, 2 August
2006 (UTC) Updated by Time3000 17 April 2007 to use ocial Wikinews colours and appear correctly on dark backgrounds. Originally
uploaded by Simon.
Archivo:Wikiversity-logo-Snorky.svg Fuente: https://upload.wikimedia.org/wikipedia/commons/1/1b/Wikiversity-logo-en.svg Licencia: CC BY-SA 3.0 Colaboradores: Trabajo propio Artista original: Snorky
Archivo:Wiktionary-logo-es.png Fuente: https://upload.wikimedia.org/wikipedia/commons/0/06/Wiktionary-logo-es.png Licencia: CC
BY-SA 3.0 Colaboradores: originally uploaded there by author, self-made by author Artista original: es:Usuario:Pybalo

205.3.3

Licencia del contenido

Creative Commons Attribution-Share Alike 3.0

Você também pode gostar