469

Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación
Page 2: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Antonio Carrillo Ledesma y Karla Ivonne González RosasFacultad de Ciencias, UNAM

http://academicos.fciencias.unam.mx/antoniocarrillo

Una copia de este trabajo se puede descargar de la página:http://132.248.182.159/acl/Textos/

Verano 2019, Versión 1.0�1

1El presente trabajo está licenciado bajo un esquema Creative CommonsAtribución CompartirIgual (CC-BY-SA) 4.0 Internacional. Los textos que compo-nen el presente trabajo se publican bajo formas de licenciamiento que permiten lacopia, la redistribución y la realización de obras derivadas siempre y cuando éstasse distribuyan bajo las mismas licencias libres y se cite la fuente. ¡Copia este libro!... Compartir no es delito.

Page 3: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Índice

1 Introducción 5

2 Sistemas Operativos 132.1 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.2 Mac OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162.3 Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.4 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212.5 Chrome OS y las Chromebook . . . . . . . . . . . . . . . . . . 272.6 Otros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3 Trabajando con Debian GNU/Linux y sus Derivados 323.1 Sistema de Archivos y Estructura de Directorios . . . . . . . . 323.2 Trabajando en Línea de Comandos . . . . . . . . . . . . . . . 373.3 Cómo buscar archivos . . . . . . . . . . . . . . . . . . . . . . . 583.4 Monitorear el Desempeño . . . . . . . . . . . . . . . . . . . . 653.5 Compresores y Descompresores de Archivos . . . . . . . . . . 673.6 Copiar Archivos entre Equipos . . . . . . . . . . . . . . . . . . 733.7 ¿Qué hacer para que mi GNU/Linux sea más seguro? . . . . . 773.8 VNC y el Acceso a Escritorios Remotos y Máquinas Virtuales 813.9 Desde la Nube . . . . . . . . . . . . . . . . . . . . . . . . . . . 853.10 Interprete de Órdenes de Consola BASH . . . . . . . . . . . . 883.11 Instalar Debian GNU/Linux . . . . . . . . . . . . . . . . . . . 96

4 Lenguajes de Programación y Entornos de Desarrollo 1074.1 Conceptos Transversales . . . . . . . . . . . . . . . . . . . . . 1194.2 Algo de Programación . . . . . . . . . . . . . . . . . . . . . . 1254.3 Introducción a los Paradigmas de Programación . . . . . . . . 1374.4 Errores de Redondeo y de Aritmética en la Programación . . 1464.5 Lenguajes y Entornos de Desarrollo . . . . . . . . . . . . . . . 1574.6 Documentación del Código Fuente . . . . . . . . . . . . . . . . 167

4.6.1 Documentar en C, C++ y Java . . . . . . . . . . . . . 1684.6.2 Documentar en Python . . . . . . . . . . . . . . . . . . 177

4.7 Herramientas de Programación . . . . . . . . . . . . . . . . . 1814.8 Programando Desde la Nube . . . . . . . . . . . . . . . . . . . 196

[email protected] 1 Antonio Carrillo Ledesma, Et alii

Page 4: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

5 Programación Orientada a Objetos 1995.1 Herencia y Composición . . . . . . . . . . . . . . . . . . . . . 2055.2 Clase Abstracta . . . . . . . . . . . . . . . . . . . . . . . . . . 2185.3 Polimor�smo y Programación Genérica . . . . . . . . . . . . . 2275.4 Excepciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2325.5 Ejemplo de Altas, Bajas y Cambios . . . . . . . . . . . . . . . 239

6 Ejemplitos 2536.1 Sistemas Dinámicos Discretos . . . . . . . . . . . . . . . . . . 2566.2 Fractales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2586.3 Derivadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2656.4 Integrales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2726.5 Matrices y Vectores . . . . . . . . . . . . . . . . . . . . . . . . 2806.6 Resolución de Sistemas Lineales . . . . . . . . . . . . . . . . . 2886.7 Ecuaciones Diferenciales Ordinarias . . . . . . . . . . . . . . . 3106.8 Ecuaciones Diferenciales Parciales . . . . . . . . . . . . . . . . 315

7 El Cómputo en Paralelo 3217.1 Arquitecturas de Software y Hardware . . . . . . . . . . . . . 321

7.1.1 Clasi�cación de Flynn . . . . . . . . . . . . . . . . . . 3217.2 Categorías de Computadoras Paralelas . . . . . . . . . . . . . 325

7.2.1 Equipo Paralelo de Memoria Compartida . . . . . . . . 3257.2.2 Equipo Paralelo de Memoria Distribuida . . . . . . . . 3287.2.3 Equipo Paralelo de Memoria Compartida-Distribuida . 3297.2.4 Cómputo Paralelo en Multihilos . . . . . . . . . . . . . 3337.2.5 Cómputo Paralelo en CUDA . . . . . . . . . . . . . . . 334

7.3 Escalabilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . 3397.4 Métricas de Desempeño . . . . . . . . . . . . . . . . . . . . . . 3437.5 Programación de Cómputo de Alto Rendimiento . . . . . . . . 347

7.5.1 Programando con OpenMP para Memoria Compartida 3497.5.2 Programando con MPI para Memoria Distribuida . . . 3537.5.3 Esquema de Paralelización Maestro-Esclavo . . . . . . 3587.5.4 Opciones de Paralelización Híbridas . . . . . . . . . . . 360

8 Programación en Paquetes de Cálculo Numérico 3628.1 Cálculo Numérico con Octave . . . . . . . . . . . . . . . . . . 3658.2 Trabajando con Octave . . . . . . . . . . . . . . . . . . . . . . 3668.3 Desde la Nube . . . . . . . . . . . . . . . . . . . . . . . . . . . 375

[email protected] 2 Antonio Carrillo Ledesma, Et alii

Page 5: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

9 Programación en Paquetes de Cálculo Simbólico 3769.1 Cálculo Simbólico con Maxima . . . . . . . . . . . . . . . . . 3789.2 Trabajando con Maxima . . . . . . . . . . . . . . . . . . . . . 3809.3 Desde la Nube . . . . . . . . . . . . . . . . . . . . . . . . . . . 386

10 Programación en Paquetes Estadísticos 38710.1 Cálculo Estadístico con R . . . . . . . . . . . . . . . . . . . . 38910.2 Trabajando con R . . . . . . . . . . . . . . . . . . . . . . . . . 390

10.2.1 R y Python . . . . . . . . . . . . . . . . . . . . . . . . 39410.3 Desde la Nube . . . . . . . . . . . . . . . . . . . . . . . . . . . 395

11 Apéndice A: Software Libre y Propietario 39611.1 Software Libre . . . . . . . . . . . . . . . . . . . . . . . . . . . 396

11.1.1 Tipos de Licencias . . . . . . . . . . . . . . . . . . . . 39911.2 Software Propietario . . . . . . . . . . . . . . . . . . . . . . . 40111.3 Implicaciones Económico-Políticas . . . . . . . . . . . . . . . . 403

12 Apéndice B: Máquinas Virtuales 40712.1 Tipos de Máquinas Virtuales . . . . . . . . . . . . . . . . . . . 40812.2 Técnicas de Virtualización . . . . . . . . . . . . . . . . . . . . 40812.3 ¿Qué Necesito para Crear y Usar una Máquina Virtual? . . . . 40912.4 ¿Cómo Funciona una Máquina Virtual? . . . . . . . . . . . . . 41012.5 Aplicaciones de las Máquinas Virtuales de Sistema . . . . . . . 41412.6 Ventajas y Desventajas . . . . . . . . . . . . . . . . . . . . . . 415

12.6.1 Ventajas . . . . . . . . . . . . . . . . . . . . . . . . . . 41612.6.2 Desventajas . . . . . . . . . . . . . . . . . . . . . . . . 41812.6.3 Consideraciones Técnicas y Legales de la Virtualización 419

12.7 Máquinas Virtuales en la Educación, Ciencias e Ingeniería . . 420

13 Apéndice C: Creación, Uso y Optimización de Máquinas Vir-tuales Usando QEMU/KVM 42313.1 Tipo de Virtualización Soportado por la Máquina Huésped . . 42613.2 Salida Grá�ca de la Virtualización Usando VNC . . . . . . . . 43013.3 Usando un Sistema Operativo Live como una Máquina Virtual 43213.4 Usando un Archivo ISO como una Máquina Virtual . . . . . . 43313.5 Creación de Máquinas Virtuales . . . . . . . . . . . . . . . . . 43313.6 Uso de Virtualización Dentro de Otra Virtualización . . . . . . 43713.7 Manipulación del Estado de la Máquina Virtual . . . . . . . . 438

[email protected] 3 Antonio Carrillo Ledesma, Et alii

Page 6: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

13.8 Optimización de Imágenes . . . . . . . . . . . . . . . . . . . . 43813.8.1 Trabajar con una Imagen Virtual sin que se Altere . . 43913.8.2 Aumento de Desempeño . . . . . . . . . . . . . . . . . 439

13.9 Uso de Máquinas Virtuales de VirtualBox en KVM/QEMU . . 44313.10Conversión de Máquinas Virtuales a KVM/QEMU . . . . . . 44413.11Comunicación de las Máquinas Virtuales con el Sistema An-

�trión e Internet . . . . . . . . . . . . . . . . . . . . . . . . . 44813.12Signi�cado de las Banderas de /proc/cpuinfo . . . . . . . . . . 452

14 Apéndice D: Cómputo en Instituciones Educativas 458

15 Bibliografía 462

[email protected] 4 Antonio Carrillo Ledesma, Et alii

Page 7: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

1 Introducción

A lo largo de la historia de las Ciencias de la Computación han ido surgiendoherramientas, reglas, conceptos y otros elementos que permitieron la creaciónde los más variados lenguajes de programación.Algunos nacieron y al poco tiempo desaparecieron, mientras que otros

hace años ya que se diseñaron y siguen vigentes. Muchos se fueron adaptandoy renovándose para subsistir tanto que sus orígenes son casi irreconociblesy en cambio otros permanecen �eles a sus principios fundamentales y casiinalterables, más allá de ciertos cambios super�ciales.Si algo caracteriza al panorama actual del desarrollo de sistemas de cóm-

puto es su complejidad y heterogeneidad. No existe una sola forma de pensary encarar las soluciones, los conceptos que fundamentan los lenguajes no sonuniformes, no es única la manera de programar. Los modelos de datos, estruc-turas de control, mecanismos de evaluación, sentencias, enlaces, expresiones,declaraciones y otros tantos elementos que conforman los lenguajes de progra-mación actuales son muy diferentes entre unos y otros, hasta opuestos, peroes posible detectar cuáles son los conceptos que marcan diferencias mayores omenores, muestran puntos de contacto o de in�exión, establecen criterios declasi�caciones, y así, aportan elementos teóricos para sistematizar el análisisde la programación.De esta manera, tiene sentido hablar de la existencia de diferentes "para-

digmas" de programación que aportan los fundamentos teóricos y concep-tuales para desarrollar sistemas de una manera en particular, incluso po-dríamos decir con una "�losofía" especial, que los caracterizan, identi�can ya la vez diferencian de los otros paradigmas.La materia "Programación" brinda, para la formación de estudiantes uni-

versitarios, un conjunto de conceptos fundamentales de la programación que,relacionados entre sí, con sus diferencias, similitudes e in�uencias recípro-cas, conforman paradigmas de programación. El objetivo es dar un marcoteórico conceptual que permita analizar y construir soluciones informáticas,y la práctica de analizar una herramienta técnica o conceptual, ya sea unlenguaje de programación u otro producto, a la luz de estos conceptos.Se vislumbran los principales paradigmas de programación, recuperando

los conceptos principales que los asemejan y distinguen entre sí, el sentido yutilidad de cada uno y el impacto que generan en la con�guración y uso de loslenguajes de programación. El conocimiento de la sintaxis y herramientaspropias de cada lenguaje no es el foco, sino un medio para comprender el

[email protected] 5 Antonio Carrillo Ledesma, Et alii

Page 8: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

paradigma y un caso particular de aplicación que se pueden trasladar a lamayoría de los otros lenguajes de cada paradigma.Se analiza la pertinencia de situarse en el marco conceptual de un para-

digma si se decide utilizarlo para la construcción de una pieza de Software.Este texto aborda una serie de conceptos que son transversales a los diferentesparadigmas y propone una organización de los paradigmas. El objetivo prin-cipal de este trabajo, es que en sus manos se convierta en una herramientade utilidad para su formación permanente y su ejercicio profesional.

Paradigmas de programación Un paradigma de programación es unmodelo básico de diseño e implementación de programas, que permite desa-rrollar Software conforme a ciertos principios o fundamentos especí�cos que seaceptan como válidos, un marco conceptual que determina los bloques básicosde construcción de Software y los criterios para su uso y combinación. Enotras palabras, es una colección de modelos conceptuales que juntos modelanel proceso de diseño, orientan la forma de de�nir los problemas y, por lotanto, determinan la estructura �nal de un programa.Desde una mirada más amplia, los paradigmas son la forma de pensar y

entender un problema y su solución, y por lo tanto, de enfocar la tarea de laprogramación.En cada paradigma hay conceptos especí�cos que son diferentes, y a la

vez, muchos elementos en común que son medulares de la programación.También existen conceptos que si bien reciben un mismo nombre para todos,tienen diferentes implicaciones en cada paradigma.Estos conceptos, según la forma en que se presentan y articulan, consti-

tuyen las características que permiten de�nir cada paradigma (y también loslenguajes) y a la vez poder relacionarlos, ya sea por similitud u oposición.Hay conceptos originarios de ciertos paradigmas que se pueden aplicar enotros o ser combinados de múltiples formas. Son herramientas conceptualescuya importancia es de primera magnitud para poder encarar con posibili-dades de éxito proyectos de desarrollo de Software de mediana o gran escala.

Programación La existencia de diferentes paradigmas de programación,implica que también haya diversos conceptos de "programa". Por lo tanto, seles puede comparar para descubrir su especi�cidad, su dominio de aplicación,sus ventajas y limitaciones, tanto para poder elegir la mejor solución comopara combinarlos.

[email protected] 6 Antonio Carrillo Ledesma, Et alii

Page 9: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Sin embargo, es importante remarcar que también son muchos los puntosde contacto en la formas de construcción de soluciones y principalmente enlos objetivos que persiguen y en los criterios de lo que se puede denominaruna buena programación:

� Plantear modelos cercanos a la realidad que permitan abstraerse delas especi�caciones computacionales y lograr una relación lo más �uidaposible entre el dominio de aplicación y el programa.

� Diseñar implementaciones de manera que puedan ser extendidas y modi-�cadas con el mínimo impacto en el resto de su estructura, ante cambiosen la realidad o nuevos requerimientos.

� Dar �exibilidad a las soluciones para que puedan ser reutilizadas enmúltiples contextos, incluso diferentes a los que les dieron origen.

� Diseñar una articulación funcional adecuada de las diferentes entidadesque conforman el sistema.

� Desarrollar un código claro, simple y compacto.

� Construir soluciones genéricas que permitan abstraerse de las particu-laridades propias de cada tipo de entidad de Software y a la vez atendera la especi�cidad de cada una de ellas.

� Focalización de las funcionalidades y componentes del sistema parapoder trabajar sobre e�ciencia.

Los diferentes paradigmas En la actualidad, los principales paradigmasque tienen vigencia, tanto por su desarrollo conceptual y su lugar importanteen las ciencias de la computación, como por su presencia signi�cativa en elmercado, son los siguientes:

� Paradigma Lógico

� Paradigma Funcional

� Paradigma Imperativo o Procedural

� Paradigma de Objetos

[email protected] 7 Antonio Carrillo Ledesma, Et alii

Page 10: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Clasi�cación y Evolución Histórica A los paradigmas se les puede clasi-�car conceptualmente de diversas maneras según los criterios que se prioricen.Partiendo de los principios fundamentales de cada paradigma, en cuanto alas orientaciones sobre la forma de construir las soluciones y teniendo encuenta su evolución histórica, se pueden distinguir mayores o menores simi-litudes entre los paradigmas que permiten organizarlos esquemáticamente ensubgrupos y relacionarlos entre sí.

Los Orígenes Imperativos Los primeros lenguajes de programaciónse basaron sobre un conjunto de premisas de funcionamiento que luego, conel paso de los años, se fueron robusteciendo y ampliando, pero compartensu�cientes características en común para considerarlas parte de un mismoparadigma que se denomina imperativo o procedural, según el énfasis que sehaga en un aspecto u otro. En un programa tienen un papel dominante losprocedimientos compuestos por sentencias imperativas, es decir aquellas queindican realizar una determinada operación que modi�ca los datos guarda-dos en memoria, mediante un algoritmo en el que se detalla la secuencia deejecución mediante estructuras de control. Utiliza variables y estructuras dedatos, vinculados a celdas de memoria, sobre las que se realizan asignacionesdestructivas, provocando efecto de lado. Un programa realiza su tarea ejecu-tando una secuencia de pasos elementales regida por instrucciones de controlexpresamente indicadas en el programa que marcan el �ujo de ejecución deoperaciones para resolver un problema especí�co. Siendo muy variados ynumerosos, sus lenguajes cuentan con herramientas que permiten organizarlos programas en diversos módulos o procedimientos que se distribuyen lasresponsabilidades, generan unidades de Software genéricas, utilizan tipos dedatos simples y estructuras de datos, entre otras características. En otraspalabras, un programa detalla una secuencia o algoritmo que indica "cómo"se va procesando paso a paso la información necesaria.Los lenguajes de este paradigma que siguen vigentes en la actualidad,

lo han logrado por su simplicidad, su versatilidad y robustez. Además, suselementos característicos siguen siendo retomados por numerosos lenguajesde otros paradigmas, por lo que tiene una gran importancia dentro de lasciencias de la computación.

La Ruptura Declarativa Posteriormente, surgieron diferentes corrien-tes que objetaron los fundamentos de la programación del momento y plantea-

[email protected] 8 Antonio Carrillo Ledesma, Et alii

Page 11: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

ron otras premisas desde las cuales se desarrollan los programas. En conse-cuencia, se crearon nuevos lenguajes de programación, que en la actualidadse les puede conceptualizar en el marco de los paradigmas declarativos, in-cluyendo al paradigma lógico y al paradigma funcional.Lo que los diferenció de los otros lenguajes de la época, y que constituye

hoy su principal propiedad, es poder desentenderse de los detalles de su imple-mentación un programa en cuanto al control de ejecución, las asignaciones dememoria y la secuencia de sentencias imperativas, o sea todo lo que implique"cómo" se resuelve el problema, y concentrarse en la declaración o descrip-ción de "qué" es la solución de un problema, creando programas de un nivelmás alto. Por lo tanto, su principal característica es la declaratividad, porla que sus programas especi�can un conjunto de declaraciones, que puedenser proposiciones, condiciones, restricciones, a�rmaciones, o ecuaciones, quecaracterizan al problema y describen su solución. A partir de esta informa-ción el sistema utiliza mecanismos internos de control, comúnmente llamado"motores", que evalúan y relacionan adecuadamente dichas especi�caciones,en la manera de obtener la solución. En general, las variables son usadas enexpresiones, funciones o procedimientos, en los que se uni�can con diferentesvalores mediante el "encaje de patrones" (Pattern Matching) manteniendo latransparencia referencial. En ellas no se actualizan los estados de informaciónni se realizan asignaciones destructivas.Que se denomine a algunos paradigmas como declarativos, no implica

que no exista declaratividad en lo demás paradigmas, como tampoco que nohaya ningún rasgo procedural o imperativo en estos. Signi�ca que dichosconceptos son característicos, identi�cadores y que se presentan con mayorclaridad en los respectivos lenguajes. Tampoco quiere decir que sea esa laúnica diferencia.Simplemente es un modelo teórico para relacionar los grupos de paradig-

mas que tienen mayor a�nidad conceptual entre ellos. La noción de declara-tividad en mayor o menor medida está presente en cualquier paradigma, porlo que se pueden construir soluciones muy diferentes que la apliquen a sumanera.

El Mundo de Objetos Más recientemente, surgieron nuevos lenguajesde programación que, sin dejar de lado las premisas del paradigma impera-tivo, incorporaron nuevos elementos que fueron adquiriendo una importanciacreciente y un impacto tal en la forma de desarrollar soluciones, que pueden

[email protected] 9 Antonio Carrillo Ledesma, Et alii

Page 12: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

conceptualizarse como otro paradigma: "objetos".Un programa hecho en objetos incluye sentencias imperativas, requiere

de la implementación de procedimientos en los que se indica la secuencia depasos de un algoritmo y hay asignaciones destructivas con efecto de lado,pero son herramientas que se utilizan en un contexto caracterizado por lapresencia de objetos que interactúan entre sí enviándose mensajes, que dejaen un segundo plano a las otras propiedades. Es una perspectiva y una com-prensión del sistema diferente, más integrales, más cercanas al dominio realdel problema que a las características de la arquitectura de la computadora,que se traduce en un diseño y una programación con estilo propio.Se fundamenta en concebir a un sistema como un conjunto de entidades

que representan al mundo real, los "objetos", que tienen distribuida la fun-cionalidad e información necesaria y que cooperan entre sí para el logro deun objetivo común.Cuenta con una estructura de desarrollo modular basada en objetos, que

son de�nidos a partir de clases, como implementación de tipos abstractos dedatos.Utiliza el encapsulamiento como forma de abstracción que separa las in-

terfaces de las implementaciones de la funcionalidad del sistema (métodos)y oculta la información (variables); y un mecanismo de envío de mensajes,que posibilita la interacción entre los objetos y permite la delegación de res-ponsabilidades entre los objetos. Para realizar código genérico y extensiblese tiene el polimor�smo, basado en el enlace dinámico, que permite que a en-tidades del programa interactuar indistintamente con otras y a la herencia,que permite que los objetos sean de�nidos como extensión o modi�cación deotros.

Otras Formas de Desarrollar Programas Existen también otrosmodelos de programación, cuya conceptualización como paradigmas es dis-cutida, como el heurístico y el concurrente.El proceso de generación de lenguajes y demás herramientas de progra-

mación es dinámico, cambiante y con velocidades diferentes en el mercadoque en las ciencias de la computación, por lo que surgen constantementeotras formas de programación, que tienen puntos en común con alguno delos paradigmas mencionados y a la vez introducen otros elementos o acen-túan algunas características, pero que es difícil de sostenerse conceptualmentecomo paradigmas, como por ejemplo, la programación orientada a eventos,

[email protected] 10 Antonio Carrillo Ledesma, Et alii

Page 13: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

a aspectos, etc.

Heurísticas La programación heurística se basa en una forma de mo-delar el problema, en lo que respecta a la representación de su estructura,estrategias de búsqueda y métodos de resolución, mediante reglas de "buenalógica" o de "sentido común", relacionadas con el razonamiento humano,que son denominadas heurísticas. Estas reglas proporcionan, entre varioscursos de acción, uno que presenta visos de ser el más "prometedor", perono garantiza necesariamente el curso de acción más efectivo.El entorno de programación heurístico es un entorno basado en el conoci-

miento humano (la experiencia), adaptativo, incremental y simbólico, y aplica-ble a dominios especí�cos en los que una buena heurística guía un procesoalgorítmico o proporciona resultados superiores a éste.Las especi�caciones más relevantes del tratamiento heurístico deben tener

en cuenta las características de la heurística, de la información y de la de�ni-ción del problema:

� Una buena heurística debe ser simple, con velocidad de búsqueda queno se incremente exponencialmente, precisa y robusta.

� La información a tratar es fundamentalmente inexacta, simbólica olimitada, como también los resultados obtenidos, en los que no se puedegarantizar un 100% de exactitud.

� La información utilizada como criterio para decidir entre los distintoscursos de acción está basada en el conocimiento previo sobre el dominiodel problema, y tiene un crecimiento "incremental" a medida que seavanza en la ejecución, incorporando el conocimiento obtenido durantela búsqueda.

� Las especi�caciones del problema deben ser claras y pueden ser de op-timización de soluciones previas o de satisfacción de nuevos problemas,y por otro lado, pueden producir una o múltiples soluciones.

No se ha desarrollado un lenguaje de programación que sea en sí "heurís-tico", sino que en la práctica se implementan soluciones o se construyenherramientas particulares con las características mencionadas en diferenteslenguajes de programación de diferentes paradigmas.

[email protected] 11 Antonio Carrillo Ledesma, Et alii

Page 14: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Concurrencia La concurrencia se ha convertido en una herramientacompartida por la mayoría de los lenguajes actuales de programación delos diferentes paradigmas. Si bien en sus orígenes surgió como un conceptodistintivo con características propias que justi�caron su catalogación comoparadigma, en la actualidad está totalmente integrado dentro de la dinámicade funcionamiento de cualquier lenguaje de programación de alto nivel.El concepto fundamental de la programación concurrente es la noción de

proceso, entendido como una unidad de Software con su propia secuenciay su seguimiento de control. La ejecución simultánea de más de un pro-ceso permite que cooperen para resolver un mismo problema y, a la vez,requiere necesariamente que compartan los recursos del sistema y compitanpor acceder a ellos. Para lograrlo, se implementan distintas estrategias deinteracción entre los procesos, tales como mecanismos de comunicación ysincronización.La concurrencia en un lenguaje de programación y el paralelismo en el

Hardware son dos conceptos independientes. Las operaciones de Hardwareocurren en paralelo si ocurren al mismo tiempo. Las operaciones en el Soft-ware son concurrentes si pueden ejecutarse en paralelo, aunque no necesa-riamente deben ejecutarse así. Podemos tener concurrencia en un lenguajesin Hardware paralelo, así como ejecución en paralelo sin concurrencia en ellenguaje.

[email protected] 12 Antonio Carrillo Ledesma, Et alii

Page 15: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

2 Sistemas Operativos

El conjunto de programas informáticos que permiten la administración e�cazde los recursos de una computadora es conocido como sistema operativo oSoftware de sistema. Estos programas comienzan a trabajar apenas se en-ciende el equipo, ya que gestionan el Hardware desde los niveles más básicosy permiten además la interacción con el usuario. Cabe destacar que los sis-temas operativos no funcionan sólo en las computadoras. Por el contrario,este tipo de sistemas se encuentran en la mayoría de los dispositivos electróni-cos que utilizan microprocesadores: el Software de sistema posibilita que eldispositivo cumpla con sus funciones � por ejemplo, un teléfono móvil o unreproductor de DVD� .

El sistema operativo cumple con cinco funciones básicas:

� El suministro de interfaz del usuario

� La administración de recursos

� La administración de archivos

� La administración de tareas

� El servicio de soporte y utilidades

En cuanto a la interfaz del usuario, el sistema se encarga de que el usuariopueda ejecutar programas, acceder a archivos y realizar otras tareas con lacomputadora. La administración de recursos permite la dirección del Hard-ware, incluyendo los periféricos y la red. El Software de sistema también seencarga de la gestión de archivos, al controlar la creación, la eliminación yel acceso a los mismos, y de la administración de las tareas informáticas queejecutan los usuarios �nales. Por último, podemos mencionar que el servi-cio de soporte se encarga de actualizar las versiones, mejorar la seguridaddel sistema, agregar nuevas utilidades, controlar los nuevos periféricos que seagregan a la computadora y corregir los errores del Software.

Tipos de sistemas operativos en función de la administración de lastareas Podemos distinguir dos clases de sistemas operativos en función decómo administran sus tareas, pueden ser:

[email protected] 13 Antonio Carrillo Ledesma, Et alii

Page 16: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Sistemas Operativos Monotarea: Son sistemas operativos que úni-camente cuentan con la capacidad para realizar una tarea al mismo tiempo.Son los sistemas más antiguos, que también llevan aparejado un CPU demenor capacidad. En estos casos, si la PC esta imprimiendo, no atenderáa las nuevas órdenes, ni será capaz de iniciar un nuevo proceso hasta que elanterior haya �nalizado.

Sistemas Operativos Multitarea: Son los sistemas operativos másmodernos, con capacidad para el procesamiento de varias tareas al mismotiempo. Además, también cuentan con la capacidad para ejecutar variosprocesos desde varias computadoras, por lo que existe la posibilidad de quesean utilizados por varios usuarios al mismo tiempo, realizándose la conexióna través de dispo-sitivos conectados a un ordenador o a través de sesionesremotas.

Tipos de Sistemas Operativos en Función de la Administraciónde los Usuarios También es posible realizar una división de los sistemasoperativos en función de la forma en la que administran los usuarios, comovemos a continuación:

Sistema de administración Monousuario: Sólo pueden gestionarun usuario al mismo tiempo. Así, a pesar de que varios usuarios pueden teneracceso al sistema, únicamente un usuario puede acceder por vez, realizar yejecutar operaciones y programas.

Sistemas de administración Multiusuario: Se re�ere a todos aque-llos sistemas operativos que permiten el empleo de sus procesamientos yservicios al mismo tiempo. Así, el sistema operativo cuenta con la capacidadde satisfacer las necesidades de varios usuarios al mismo tiempo, siendo capazde gestionar y compartir sus recursos en función del número de usuarios queesten conectados a la vez.

[email protected] 14 Antonio Carrillo Ledesma, Et alii

Page 17: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

2.1 Windows

Microsoft Windows (véase [3]), conocido generalmente como Windows o MSWindows es el nombre de una familia de Software propietario (véase apéndice11.2) de distribuciones de Software para PC, smartphone, servidores y sis-temas empotrados, desarrollados y vendidos por Microsoft y disponibles paramúltiples arquitecturas, tales como x86, x86-64 y ARM .Desde un punto de vista técnico, no son sistemas operativos, sino que

contienen uno (tradicionalmente MS-DOS, o el más actual, cuyo núcleo esWindows NT) junto con una amplia variedad de Software; no obstante, esusual (aunque no necesariamente correcto) denominar al conjunto como sis-tema operativo en lugar de distribución.La versión más reciente de Windows es Windows 10 para equipos de es-

critorio, Windows Server 2016 para servidores y Windows 10 Mobile paradispositivos móviles. Esta nueva versión del sistema operativo que llegó deforma o�cial y gratuita a usuarios con licencia genuina de Windows 7, Win-dows 8 y Windows 8.1 así como a Insiders el 29 de julio de 2015, siendo laprimera versión que busca la uni�cación de dispositivos (escritorio, portátiles,teléfonos inteligentes, tabletas y videoconsolas) bajo una experiencia común,con lo que se espera eliminar algunos problemas que se presentaron con Win-dows 8.1.

Seguridad Una de las principales críticas que reciben los sistemas opera-tivos Windows es la debilidad del sistema en lo que a seguridad se re�ere yel alto índice de vulnerabilidades críticas. El propio Bill Gates, fundador deMicrosoft, ha asegurado en repetidas ocasiones que la seguridad es objetivoprimordial para su empresa.Partiendo de la base de que no existe un sistema completamente libre de

errores, las críticas se centran en la lentitud con la que la empresa reaccionaante un problema de seguridad que pueden llegar a meses o incluso años dediferencia desde que se avisa de la vulnerabilidad hasta que se publica laactualización que corrija dicha vulnerabilidad (parche). En algunos casos lafalta de respuesta por parte de Microsoft ha provocado que se desarrollenparches que arreglan problemas de seguridad hechos por terceros.Uno de los pilares en que se basa la seguridad de los productos Windows es

la seguridad por ocultación, en general, un aspecto característico del Softwarepropietario que sin embargo parece ser uno de los responsables de la debi-lidad de este sistema operativo ya que, la propia seguridad por ocultación,

[email protected] 15 Antonio Carrillo Ledesma, Et alii

Page 18: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

constituye una infracción del principio de Kerckho¤, el cual a�rma que laseguridad de un sistema reside en su diseño y no en una supuesta ignoranciadel diseño por parte del atacante.

Linux Dentro de Windows Desde el 2018 la integración total de Linuxen Windows 10 se ha dado, con la actualización de Windows 10 Fall Crea-tor Update se permite instalar distribuciones completas de Linux como unprograma más � sin hacer uso de programas de virtualización� , incluso esposible ejecutar varias distribuciones de Linux al mismo tiempo en pantalla.Para usarlo hay que tener todas las actualizaciones de Windows y activar

el WSL, para ello hay que ir al botón de Inicio en el escritorio de Windows,y elige el ícono de Con�guración, y en Aplicaciones seleccionar Aplicacionesy Características, en la columna derecha hay una opción llamada Opcionesde Con�guración Relacionadas, activar en Programas y Características. Seabrirá una nueva ventana, en la columna de la izquierda activamos la ca-racterística de Windows donde este: Subsistema de Windows para Linux.Reiniciando el sistema, ya podemos usar distribuciones de Linux desde Mi-crosoft Store.

2.2 Mac OS

Mac OS (véase [5]) � del inglés Macintosh Operating System, en españolSistema Operativo de Macintosh� es el nombre del sistema operativo propie-tario (véase apéndice 11.2) creado por Apple para su línea de computadorasMacintosh, también aplicado retroactivamente a las versiones anteriores aSystem 7.6, y que apareció por primera vez en System 7.5.1. Es conocidopor haber sido uno de los primeros sistemas dirigidos al gran público encontar con una interfaz grá�ca compuesta por la interacción del mouse conventanas, íconos y menús.Deliberada a la existencia del sistema operativo en los primeros años de

su línea Macintosh en favor de que la máquina resultara más agradable alusuario, diferenciándolo de otros sistemas contemporáneos, como MS-DOS,que eran un desafío técnico. El equipo de desarrollo del Mac OS originalincluía a Bill Atkinson, Jef Raskin y Andy Hertzfeld.Este fue el comienzo del Mac OS clásico, desarrollado íntegramente por

Apple, cuya primera versión vio la luz en 1985. Su desarrollo se extenderíahasta la versión 9 del sistema, lanzada en 1999. A partir de la versión 10(Mac OS X), el sistema cambió su arquitectura totalmente y pasó a basarse

[email protected] 16 Antonio Carrillo Ledesma, Et alii

Page 19: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

en Unix, sin embargo su interfaz grá�ca mantiene muchos elementos de lasversiones anteriores.Hay una gran variedad de versiones sobre cómo fue desarrollado el Mac

OS original y dónde se originaron las ideas subyacentes. Pese a esto, docu-mentos históricos prueban la existencia de una relación, en sus inicios, entreel proyecto Macintosh y el proyecto Alto de Xerox PARC. Las contribucionesiniciales del Sketchpad de Ivan Sutherland y el On-Line System de Doug En-gelbart también fueron signi�cativas.

Versiones Antes de la introducción de los últimos sistemas basados en elmicroprocesador PowerPC G3, partes signi�cativas del sistema se almace-naban en la memoria física de sólo lectura de la placa base. El propósitoinicial de esto fue evitar el uso de la capacidad de almacenamiento limitadade los disquetes de apoyo al sistema, dado que los primeros equipos Macintoshno tenían disco duro. Sólo el modelo Macintosh Classic de 1991, podía seriniciado desde la memoria ROM. Esta arquitectura también permitió unainterfaz de sistema operativo totalmente grá�ca en el nivel más bajo, sin lanecesidad de una consola de sólo texto o el modo de comandos de línea. Loserrores en tiempo de arranque, como la búsqueda de unidades de disco queno funcionaban, se comunicaron al usuario de manera grá�ca, generalmentecon un ícono o con mensajes con el tipo de letra Chicago y un timbre de lamuerte o una serie de pitidos. Esto contrastaba con los PCs de la época,que mostraban tales mensajes con un tipo de letra mono-espaciada sobreun fondo negro, y que requerían el uso del teclado y no de un ratón, parala entrada. Para proporcionar tales detalles en un nivel bajo, el Mac OSdependía de Software de la base del sistema grabado en la ROM de la placabase, lo que más tarde ayudó a garantizar que sólo los equipos de Apple olos clones bajo licencia (con el contenido de la memoria ROM protegido porderechos de autor de Apple, pudieran ejecutar el Mac OS).El Mac OS puede ser dividido en dos familias:

� La familia Mac OS Classic, basada en el código propio de Apple Com-puter.

� El Sistema Operativo Mac OS X, desarrollado a partir de la familiaMac OS Classic y NeXTSTEP, el cual estaba basado en UNIX.

[email protected] 17 Antonio Carrillo Ledesma, Et alii

Page 20: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

2.3 Android

Android (véase [6]) es un sistema operativo basado en el núcleo Linux (véaseapéndice 11.1). Fue diseñado principalmente para dispositivos móviles conpantalla táctil, como teléfonos inteligentes, tabletas y también para relojesinteligentes, televisores y automóviles. Inicialmente fue desarrollado por An-droid Inc., empresa que Google respaldó económicamente y más tarde, en2005, compró. Android fue presentado en 2007 junto la fundación del OpenHandset Alliance (un consorcio de compañías de Hardware, Software y tele-comunicaciones) para avanzar en los estandares abiertos de los dispositivosmóviles. El primer móvil con el sistema operativo Android fue el HTC Dreamy se vendió en octubre de 2008. Android es el sistema operativo móvil másutilizado del mundo, con una cuota de mercado superior al 80% al año 2017,muy por encima de IOS.El éxito del sistema operativo lo ha convertido en objeto de litigios sobre

patentes en el marco de las llamadas guerras de patentes entre las empresas deteléfonos inteligentes. Según los documentos secretos �ltrados en 2013 y 2014,el sistema operativo es uno de los objetivos de las agencias de inteligenciainternacionales.La versión básica de Android es conocida como Android Open Source

Project (AOSP). El 25 de junio de 2014 en la Conferencia de DesarrolladoresGoogle I/O, Google mostró una evolución de la marca Android, con el �n deuni�car tanto el Hardware como el Software y ampliar mercados. El 17 demayo de 2017, se presentó Android Go. Una versión más ligera del sistemaoperativo para ayudar a que la mitad del mundo sin smartphone consigauno en menos de cinco años. Incluye versiones especiales de sus aplicacionesdonde el consumo de datos se reduce al máximo.

Arquitectura del Sistema Android Los componentes principales delsistema operativo de Android (cada sección se describe en detalle):

Aplicaciones: las aplicaciones base incluyen un cliente de correo elec-trónico, programa de SMS, calendario, mapas, navegador, contactos y otros.Todas las aplicaciones estan escritas en lenguaje de programación Java.

Marco de trabajo de aplicaciones: los desarrolladores tienen accesocompleto a los mismas API del entorno de trabajo usados por las aplicaciones

[email protected] 18 Antonio Carrillo Ledesma, Et alii

Page 21: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

base. La arquitectura esta diseñada para simpli�car la reutilización de com-ponentes; cualquier aplicación puede publicar sus capacidades y cualquierotra aplicación puede luego hacer uso de esas capacidades (sujeto a reglas deseguridad del framework). Este mismo mecanismo permite que los compo-nentes sean reemplazados por el usuario.

Bibliotecas: Android incluye un conjunto de bibliotecas de C/C++usadas por varios componentes del sistema. Estas características se expo-nen a los desarrolladores a través del marco de trabajo de aplicaciones deAndroid. Algunas son: System C library (implementación biblioteca C es-tandar), bibliotecas de medios, bibliotecas de grá�cos, 3D y SQLite, entreotras.

Runtime de Android: Android incluye un set de bibliotecas base queproporcionan la mayor parte de las funciones disponibles en las bibliotecasbase del lenguaje Java. Cada aplicación Android ejecuta su propio proceso,con su propia instancia de la máquina virtual Dalvik. Dalvik ha sido escritode forma que un dispositivo puede ejecutar múltiples máquinas virtuales deforma e�ciente. Dalvik ejecutaba hasta la versión 5.0 archivos en el formatode ejecutable Dalvik (.dex), el cual esta optimizado para memoria mínima.La Máquina Virtual esta basada en registros y corre clases compiladas porel compilador de Java que han sido transformadas al formato .dex por laherramienta incluida DX. Desde la versión 5.0 utiliza el ART, que compilatotalmente al momento de instalación de la aplicación.

Núcleo Linux: Android depende de Linux para los servicios base delsistema como seguridad, gestión de memoria, gestión de procesos, pila dered y modelo de controladores. El núcleo también actúa como una capa deabstracción entre el Hardware y el resto de la pila de Software.

Seguridad, Privacidad y Vigilancia Según un estudio de Symantec de2013, demuestra que en comparación con iOS, Android es un sistema explíci-tamente menos vulnerable. El estudio en cuestión habla de 13 vulnerabili-dades graves para Android y 387 vulnerabilidades graves para iOS. El estudiotambién habla de los ataques en ambas plataformas, en este caso Androidse queda con 113 ataques nuevos en 2012 a diferencia de iOS que se quedaen 1 solo ataque. Incluso así Google y Apple se empeñan cada vez más en

[email protected] 19 Antonio Carrillo Ledesma, Et alii

Page 22: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

hacer sus sistemas operativos más seguros incorporando más seguridad tantoen sus sistemas operativos como en sus mercados o�ciales.Se han descubierto ciertos comportamientos en algunos dispositivos que

limitan la privacidad de los usuarios, de modo similar a iPhone, pero ocurreal activar la opción: Usar redes inalámbricas, en el menú: Ubicación y se-guridad, avisando que se guardarán estos datos, y borrándose al desactivaresta opción, pues se usan como una caché y no como un registro tal comohace iPhone.Como parte de las amplias revelaciones sobre vigilancia masiva �ltradas

en 2013 y 2014, se descubrió que las agencias de inteligencia estadounidensesy británicas, la Agencia de Seguridad Nacional (NSA) y el Cuartel General deComunicaciones del Gobierno (GCHQ), respectivamente, tienen acceso a losdatos de los usuarios de dispositivos Android. Estas agencias son capaces deleer casi toda la información del teléfono como SMS, geolocalización, correos,notas o mensajes. Documentos �ltrados en enero de 2014, revelaron que lasagencias interceptan información personal a través de Internet, redes socialesy aplicaciones populares, como Angry Birds, que recopilan información paratemas comerciales y de publicidad. Además, según The Guardian, el GCHQtiene una wiki con guías de las diferentes aplicaciones y redes de publicidadpara saber los diferentes datos que pueden ser interceptados. Una semanadespués de salir esta información a la luz, el desarrollador �nlandés Rovio,anunció que estaba reconsiderando sus relaciones con las distintas platafor-mas publicitarias y exhortó a la industria en general a hacer lo mismo.Las informaciones revelaron que las agencias realizan un esfuerzo adi-

cional para interceptar búsquedas en Google Maps desde Android y otrosteléfonos inteligentes para recopilar ubicaciones de forma masiva. La NSAy el GCHQ insistieron en que estas actividades cumplen con las leyes na-cionales e internacionales, aunque The Guardian a�rmó que «las últimasrevelaciones podrían sumarse a la creciente preocupación pública acerca decómo se acumula y utiliza la información, especialmente para aquellos fuerade los EE.UU. que gozan de menos protección en temas de privacidad quelos estadounidenses» .

[email protected] 20 Antonio Carrillo Ledesma, Et alii

Page 23: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

2.4 Linux

GNU/Linux (véase [4]) también conocido como Linux, es un sistema ope-rativo libre (véase 11.1) tipo Unix; multiplataforma, multiusuario y mul-titarea. El sistema es la combinación de varios proyectos, entre los cualesdestacan GNU (encabezado por Richard Stallman y la Free Software Foun-dation) y el núcleo Linux (encabezado por Linus Torvalds). Su desa-rrollo esuno de los ejemplos más prominentes de Software libre: todo su código fuentepuede ser utilizado, modi�cado y redistribuido libremente por cualquiera,bajo los términos de la GPL (Licencia Pública General de GNU) y otra seriede licencias libres.A pesar de que «Linux» denomina en la jerga cotidiana al sistema ope-

rativo, éste es en realidad solo el Kernel (núcleo) del sistema. La idea dehacer un sistema completo se remonta a mediados de la década de 1980 conel proyecto GNU, así como una gran cantidad de los componentes que se usanhoy en día � además del núcleo� , que van desde los compiladores de GNUhasta entornos de escritorio. Sin embargo, tras la aparición de Linux en ladécada de 1990 una parte signi�cativa de los medios generales y especializadoshan utilizado el término «Linux» para referirse al todo. Esto ha sido motivode polémicas.Cabe señalar que existen derivados de Linux que no tienen componentes

GNU� por ejemplo Android� , así como distribuciones de GNU donde Linuxesta ausente � por ejemplo Debian GNU/Hurd� .A GNU/Linux se le encuentra normalmente en forma de compendios

conocidos como distribuciones o distros, a las cuales se les ha adicionadoselecciones de aplicaciones y programas para descargar e instalar las mismas.El propósito de una distribución es ofrecer GNU/Linux como un producto�nal que el usuario pueda instalar, cumpliendo con las necesidades de ungrupo de usuarios o bien del público general.Algunas de ellas son especialmente conocidas por su uso en servidores

de Internet y supercomputadoras, donde GNU/Linux tiene la cuota más im-portante del mercado. Según un informe de International Data Corporation(IDC), GNU/Linux es utilizado por el 78% de los principales 500 servidoresdel mundo1. Con menor participación, el sistema GNU/Linux también seusa en el segmento de las computadoras de escritorio, portátiles, computado-ras de bolsillo, teléfonos móviles, sistemas embebidos, videoconsolas y otros

1Top500.org informó, en su lista de noviembre de 2017, que las 500 supercomputadorasmás potentes del mundo utilizan Linux.

[email protected] 21 Antonio Carrillo Ledesma, Et alii

Page 24: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

dispositivos.

Creación El proyecto GNU, iniciado en 1983 por Richard Stallman, tieneel objetivo de crear un «sistema de Software compatible con Unix compuestoenteramente de Software libre» . El trabajo comenzó en el año 1984. Mástarde, en 1985, Stallman fundó la Free Software Foundation para �nanciarel desarrollo de GNU, y escribió la Licencia Pública General de GNU (GNUGPL) en 1989. A principios de la década de 1990, muchos de los programasque se requieren en un sistema operativo � como bibliotecas, compiladores,editores de texto, el shell Unix, y un sistema de ventanas� ya se encontra-ban en operación. Sin embargo otros elementos como los controladores dedispositivos y los servicios estaban incompletos.Linus Torvalds ha declarado que si el núcleo de GNU hubiera estado

disponible en el momento (1991), no se habría decidido a escribir su pro-pio núcleo. Aunque no es liberado hasta 1992 debido a complicacioneslegales, el desarrollo de BSD � de los cuales NetBSD, OpenBSD y FreeBSDdescienden� es anterior al de Linux. Torvalds también ha declarado que siBSD hubiera estado disponible en ese momento, probablemente no habríacreado Linux.En 1991 Torvalds asistía a la Universidad de Helsinki. Usuario de MINIX

y de los programas provenientes de GNU, se mostraba interesado por lossistemas operativos. Comenzó a trabajar en su propio núcleo en ese año,frustrado por la concesión de licencias que utilizaba MINIX, que en ese mo-mento se limitaba a uso educativo.El núcleo Linux maduró hasta superar a los otros núcleos en desa-rrollo.

Las aplicaciones GNU también reemplazaron todos los componentes de MINIX,porque era ventajoso utilizar el código libre del proyecto GNU con el nuevosistema operativo. El código GNU con licencia bajo la GPL puede ser re-utilizado en otros programas de computadora, siempre y cuando tambiénse liberen bajo la misma licencia o una licencia compatible. Torvalds inicióun cambio de su licencia original, que prohibía la redistribución comercial ala GPL. Los desarrolladores de ambas partes trabajaron para integrar com-ponentes de GNU con el núcleo Linux, consiguiendo un sistema operativocompletamente funcional.Para darnos una idea del frenético crecimiento del Kernel de Linux, por

ejemplo, en la versión 4.10 se añadieron 632,782 líneas de código nuevo yen el Kernel 4.12 se añadieron más 1.2 millones de líneas de código nuevas,

[email protected] 22 Antonio Carrillo Ledesma, Et alii

Page 25: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

teniendo un total de 24,170,860 líneas de código. El número de desarro-lladores involucrados fue de 1821 colaboradores y 220 empleados hicieron unpromedio de 231 cambios por día, casi 10 cambios por hora, diariamente seañadieron casi 20 mil líneas de código, y casi 800 líneas por hora en dichaversión.GNU/Linux puede funcionar tanto en entorno grá�co como en modo con-

sola. La consola es común en distribuciones para servidores, mientras que lainterfaz grá�ca esta orientada al usuario �nal del hogar como empresarial.Así mismo, también existen los entornos de escritorio, que son un conjuntode programas conformado por ventanas, íconos y muchas aplicaciones que fa-cilitan el uso de la computadora. Los entornos de escritorio más populares enGNU/Linux son: GNOME, KDE, LXDE, Xfce, Unity, MATE y Cinnamon,Pantheon, LXQt, Budgie, PIXEL, Enlightenment, etc.

Linux «Seguros» Para muchos, Linux y Mac OS son dos sistemas opera-tivos más seguros que Windows de Microsoft, pero con todo, hay algunas dis-tribuciones especia-lizadas de Linux que satisfacen las necesidades de temasrelacionados con la seguridad, estos sistemas operativos intentan preservarla privacidad y el anonimato, ayudan a utilizar internet de forma anónimay evitar la censura en practicamente cualquier lugar y cualquier ordenador,pero sin dejar rastro a menos que lo solicites explícitamente.Algunos son sistemas operativos Live diseñados para ser usados desde

una memoria USB o un DVD independientemente del sistema operativooriginal de la computadora. Además, mediante el uso de tecnologías como

[email protected] 23 Antonio Carrillo Ledesma, Et alii

Page 26: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

TOR2, Sandbox3, Firewall4, herramientas criptográ�cas5, etc., las distribu-ciones anónimas ofrecen niveles adicionales de privacidad y seguridad. Haymuchas alternativas diferentes de este tipo en el mercado, por lo que decidirsepor una u otra, en ocasiones puede ser una tarea un tanto complicada. Es porello que aquí listamos algunas de las distribuciones de Linux más seguras enla actualidad, apartado con el que cada vez debemos prestar más atención.

Tails (https://tails.boum.org/)Para muchos esta es la primera opción a la hora de buscar una solución

de seguridad en Linux. También conocida como «The Amnesic IncognitoLive System» , esta es una distribución basada en Debian. Es un proyecto decódigo abierto que se publicó por primera vez hace 8 años y que redirige todoel trá�co web a través de Tor logrando la privacidad a través del anonimato.Además, almacena todo en la RAM y evita el uso del disco duro, por lo queborra todo una vez se apaga. La imagen tiene un tamaño menor de 1.2 GB

2Tor es una red abierta y distribuida que te ayuda a defenderte de una forma devigilancia en la red que amenaza tu libertad y privacidad, tus actividades comercialescon�denciales y relaciones, además de la seguridad gubernamental. Además, te protegeredirigiendo tus comunicaciones alrededor de una red distribuida de retransmisores rea-lizados por voluntarios alrededor del mundo: lo cual previene que alguien observe tuscomunicaciones a partir de los sitios que visitas, también evita que los sitios que navegasobtengan tu ubicación física.

3Sandbox es un mecanismo para ejecutar programas con seguridad y de manera sepa-rada. A menudo se utiliza para ejecutar código nuevo, o Software de dudosa con�abilidadproveniente de terceros. Ese entorno aislado permite controlar de cerca los recursos pro-porcionados a los programas cliente a ejecutarse, tales como espacio temporal en discos ymemoria. Habitualmente se restringen las capacidades de acceso a redes, la habilidad deinspeccionar la máquina an�trión y dispositivos de entrada entre otros. En este sentido,el aislamiento de procesos es un ejemplo especí�co de virtualización.

4Un cortafuegos (Firewall) es una parte de un sistema o una red que está diseñadapara bloquear el acceso no autorizado, permitiendo al mismo tiempo comunicaciones au-torizadas. Se trata de un dispositivo o conjunto de dispositivos con�gurados para permitir,limitar, cifrar o descifrar el trá�co entre los diferentes ámbitos sobre la base de un conjuntode normas y otros criterios. Los cortafuegos se utilizan con frecuencia para evitar que losusuarios de Internet no autorizados tengan acceso a redes privadas conectadas a Internet,especialmente intranets.

5El surgimiento de redes de comunicación, en particular de Internet, ha abierto nuevasposibilidades para el intercambio de información. Al mismo tiempo, son cada vez mayoreslas amenazas a la seguridad de la información que se transmite. Es necesario entonces,crear diferentes mecanismos, dirigidos a garantizar la con�dencialidad y autenticidad delos documentos electrónicos, todo ello es parte de la Criptografía.

[email protected] 24 Antonio Carrillo Ledesma, Et alii

Page 27: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

y necesita al menos 2 GB de RAM en un equipo de 64 bits, se puede usaren formato Live, como máquina Vitual o bien instalarse en una USB, DVDo en el disco duro del equipo.

Whonix (https://www.whonix.org/)Es una distribución que se basa en Debian y consta de dos máquinas

virtuales, una es Tor Gateway que se ejecuta en Debian, mientras que laotra es una Workstation. Whonix se instala en un sistema operativo hostproporcionado por el usuario que puede ser Linux, Windows, MacOS o QubesOS. Así al utilizar la red abierta y distribuida de transmisión de Tor, Whonixecha abajo las posibilidades de vigilancia de la Red. Además, y por motivosde seguridad, hace todo lo posible para ocultar nuestra dirección IP real.

Qubes OS (https://www.qubes-os.org/)Se conoce como uno de los sistemas operativos más seguros del mundo

y se basa en realizar la virtualización mediante el «hipervisor Xen» � unhipervisor imita el Hardware y permite ejecutar varias máquinas virtualessimultáneamente� . El entorno de usuario de Qubes OS podría ser Fedora,Debian, Whoix o Windows y, al igual que Tails. Así mismo utiliza diferentesdominios para separar los niveles de con�anza, por ejemplo, un dominio detrabajo, un dominio para el ocio, etc.; los cuales se ejecutan en diferentesmáquinas virtuales, esta versión requiere un mínimo de 16 GB de RAM.

Subgraph OS (https://subgraph.com/)Nos encontramos con un sistema operativo seguro basado en Debian que

promete proporcionar una experiencia digital anónima. Ha sido diseñadopara evitar diferentes ataques de malware, es capaz de ser una plataformade comunicación segura además de proporcionar una interfaz de usuario muysencilla.

Discreete Linux (https://www.privacy-cd.org/)En este caso nos encontramos con un proyecto de Software libre que

puede ser utilizado por cualquier persona que desee llevar una vida digitalanónima también basado en Debian. Además, protege a sus usuarios contralos ataques de vigilancia accionados por troyanos y hoy día esta en fase Beta.Es una de las alternativas más adecuadas para los usuarios que no tienenun conocimiento muy profundo de estos sistemas pero que consideran la

[email protected] 25 Antonio Carrillo Ledesma, Et alii

Page 28: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

seguridad en Internet como su principal preocupación. Hace uso de cifradosy entornos aislados para proporcionar un entorno de trabajo seguro. Asímismo no utiliza los discos duros internos del equipo, ya que almacena todossus datos en la memoria RAM o en una unidad de disco USB externa.

Kodachi (https://www.digi77.com/linux-kodachi/)Es un sistema operativo centrado en la seguridad y basado en Debian

cuyo objetivo es proporcionar una experiencia informática segura. Ponerloen marcha es muy sencillo y no necesita demasiado tiempo, ya que permitela opción de arrancar desde el Hardware del PC, o desde una unidad USBexterna para mayor seguridad. Hace uso de elementos tales como una cone-xión VPN activa, el servicio TOR y DNScrypt con el que garantiza un buennivel de privacidad. Además, todo el sistema operativo se ejecuta desde lamemoria RAM del equipo, por lo que después de apagado no queda ningúnrastro de actividad.

Tens (https://www.spi.dod.mil/lipose.htm)También conocido como Trusted End Node Security, este sistema es

distribuido y desarrollado por el Departamento de Defensa de los EstadosUnidos. Se basa en Arch Linux y puede ejecutarse en cualquier equipo contecnología Intel. Sólo arranca desde la RAM y viene cargado con un asis-tente de encriptación, un Software de encriptación simple y potente para laprotección de nuestra información con�dencial.

Tin Hat (https://sourceforge.net/projects/tinhat/)Esta propuesta es una derivación de Gentoo y es un sistema operativo

seguro que se ejecuta en su totalidad en la RAM del equipo, por lo que nomonta ningún sistema de archivos directamente en el dispositivo de arranque,evitando así la posibilidad de dejar expuesto cualquier dato. Como era deesperar, podremos arrancarlo desde un CD o desde una unidad �ash USB.Puede ejecutarse tanto en arquitecturas de Hardware de 32 como de 64 bitsy es recomendable tener conocimientos previos de Gentoo Linux.

IprediaOS (https://www.ipredia.org/os/)Para empezar diremos que I2P es una capa de comunicación P2P anónima

que se crea utilizando herramientas de código abierto, algo en lo que se basaIprediaOS, ya que orienta todo su trá�co a través de I2P y se asegura de que

[email protected] 26 Antonio Carrillo Ledesma, Et alii

Page 29: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

toda su actividad on-line no pueda ser interceptada por terceros. Así haceuso de múltiples capas de cifrado y cabe mencionar que la red I2P es una reddinámica y distribuida.

Alpine Linux (https://alpinelinux.org/)Es una distribución diseñada principalmente para los usuarios avanzados

que valoran la seguridad, la e�ciencia de recursos y la simplicidad. En unprincipio parte como bifurcación del proyecto LEAF aunque, a diferencia deeste, Alpine mejora las características de seguridad y cuenta con un Kernelmás actual. Su funcionamiento se centra en la privacidad, por lo que utilizasu propio sistema de gestión de paquetes.

Aprender a Usar Linux En la red existen múltiples sitios especializadosy una amplia bibliografía para aprender a usar, administrar y optimizar cadauno de los distintos aspectos de Linux, nosotros hemos seleccionado diversostextos que ponemos a su disposición en:

http://mmc.geo�sica.unam.mx/acl/Herramientas/SistemasOperativos/Linux/

2.5 Chrome OS y las Chromebook

Para entender la razón de ser de los Chromebooks, primero tienemos que en-tender qué es Chrome OS. Se trata de un sistema operativo creado por Googley diferente a Android. Está basado en el kernel de Linux, y utiliza Chromecomo su interfaz de usuario principal. Esto quiere decir que su aspecto esprácticamente idéntico al de Chrome, pero con algunos añadidos como unabarra de tareas, un explorador de archivos y otros elementos presentes encualquier sistema operativo.Fue anunciado a mediados del 2009 como un intento de crear un sistema

basado en la nube y en aplicaciones web. Esto hacía que, cuando se estabaconectado a Internet pudieses hacer muchas cosas gracias a herramientascomo Google Drive o las aplicaciones de la Chrome Web Store, pero quecuando dejaba de tener Internet se limitasen mucho sus funciones.En cualquier caso, y pese a lo limitado que era en sus primeros años, poco

a poco Google lo ha ido haciendo evolucionar. Primero se empezaron a añadiropciones a las aplicaciones de Google para poderse utilizar sin conexión, algoque también bene�ció a los usuarios que utilizasen Chrome en otros sistemasoperativos.

[email protected] 27 Antonio Carrillo Ledesma, Et alii

Page 30: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Pero la evolución más grande fue llegando después. El primer gran pasofue el anuncio de la compatibilidad para ejecutar aplicaciones de Android, yse fue implementando directamente la tienda de aplicaciones Google Play deAndroid para hacer que la experiencia de instalarlas fuera tan nativa como enAndroid. Aun así, hay que decir que la llegada de Android a Chrome OS hasido lenta, y han tardado algunos años en hacer que todo vaya funcionandocomo debería.Y a mediados de 2018 se anunció que Google Chrome también podrá uti-

lizar aplicaciones creadas para los sistemas GNU/Linux. Con ello, el catálogode aplicaciones diseñadas para funcionar sin conexión se multiplica abrazandoa la comunidad de desarrolladores libres, aunque también es de esperar quetarde algunos años en estar todo perfectamente integrado, ya que todavía seestán lanzando poco a poco mejoras.Chrome OS es hoy en día un sistema operativo completo. Tiene lo básico,

aplicaciones nativas y compatibilidad con Android, que se une a reproductorde medios, gestor de archivos, con�guración de impresoras, etcétera. Además,al igual que el navegador, Chrome OS tiene también una versión libre llamadaChromium OS, que pese a no tener la tecnología nativa de Google sirvepara que la comunidad de desarrolladores independientes pueda ayudar amejorarlo.Ahora bien, los Chromebook son ordenadores personales que utilizan

como sistema operativo Chrome OS, desarrollado por Google y que, a dife-rencia de Windows, OS X y Linux, están pensados para utilizarse perma-nentemente conectados a Internet, ya que se basan casi al completo en lanube.

Chromebook Apps También se incluye un reproductor multimedia,y todo se sincroniza permanentemente en la nube. Por ello, si pretendemosutilizar un Chromebook sin conexión a Internet, su funcionalidad es máslimitada que la de otros ordenadores. De hecho, las aplicaciones se instalan através de Chrome Web Store, la tienda de aplicaciones integrada en GoogleChrome, con lo que algunas de las herramientas más habituales (como O¢ ceo Skype, por ejemplo) tendrían que verse reemplazadas por Google Drive yGoogle Hangouts, sin ir más lejos.

Chrome Web Store No obstante, también se pueden utilizar de formalocal sin recurrir a la Red, ya que muchos de los servicios de Google disponen

[email protected] 28 Antonio Carrillo Ledesma, Et alii

Page 31: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

de un modo sin conexión que, una vez volvemos a disponer de Internet, sesincronizarán sin problemas.

¿Cómo es un Chromebook? En un Chromebook podemos utilizardispositivos USB sin problemas, como memorias y discos externos, webcams,teclados y ratones, y por lo general suelen venir con una cantidad de almace-namiento inferior a lo que estamos acostumbrados (ya que lo que se pretendees que todo esté en la nube, y no en nuestro disco duro local). De hecho, aladquirir uno se nos obsequia con 100 Gbytes de espacio en Google Drive.Igualmente, su precio suele ser bastante asequible (desde 179 dólares o

130 euros) y no requieren de un hardware potente para funcionar, siendo laligereza de recursos una de sus mayores bondades. Por su parte, los orde-nadores portátiles con Chrome OS son lo que llamamos Chromebook, mien-tras que si preferimos el formato Mini PC, estaremos ante un Chromebox.El inicio del sistema es prácticamente instantáneo y todo está listo para

funcionar en cuestión de segundos, y dadas sus características, un Chrome-book es un equipo ideal para navegar por Internet ante todo.A las aplicaciones que tengamos instaladas se accede desde la barra de

herramientas en la parte inferior de la pantalla, que en realidad se trata deun atajo a las apps que tengamos instaladas en Google Chrome.

Chromebook Integración Por supuesto, los Chromebook tambiénson multiusuario, con la ventaja de que con simplemente loguearnos conotra cuenta de Gmail todo estará tal y como lo hubiésemos con�gurado conella (aplicaciones, servicios, historial y demás), y por este mismo motivo secomplementan a la perfección con otros dispositivos (ya sean ordenadores,smartphones o tablets) en los que utilicemos los servicios de Google, graciasa la sincronización en la nube.Además, los Chromebook también presumen de no necesitar antivirus,

pues al almacenarse todo en la nube la seguridad está integrada por defectoy corre de parte de Google.

2.6 Otros

Sistemas Operativos para PC

1.- Windows.- El sistema operativo de las ventanas es el másusado en el mundo entre sus versiones estan: Windows XP, Win-

[email protected] 29 Antonio Carrillo Ledesma, Et alii

Page 32: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

dows Vista, Windows 7, Windows 8, y su última versión Windows10.

2.- Linux.- Se puede instalar en casi cualquier plataforma, inclusoalgunas que se consideran cerradas, es el favorito de muchos por lasolidez, con�abilidad y seguridad que ofrece a los usuarios, y sobretodo porque es gratis, de aquí parten muchos sistemas operativosbasados en Linux incluyendo Android que es para móviles, paraPCs la distribución más popular es UBUNTU (Ubuntu 18.04).

3.- Mac OS.- Es el sistema operativo de Apple con su últimaversión Mac OS High Sierra, fácil de usar, muy sólido y seguro,un derivado de Unix. La elegancia de este sistema reside en suinterfaz grá�ca, intuitiva y la facilidad con que se realizan lasoperaciones.

4.- Unix.- Es un sistema sólido, seguro y con�able, por lo que esmuy usado en servidores de internet y en centros de datos. No esmuy conocido por el público, este sistema operativo data de losaños 80. En este sistema se basan tanto Linux, Mac OS, BSD yotros.

5.- BSD.- Distribución que se deriva de Unix, con la misma solidez,con�abilidad y seguridad de su ancestro. Es la base del Mac OS,a partir de la versión 10.

Sistemas Operativos para móviles

1.- Android.- Es un sistema operativo móvil basado en Linux, fuedesarrollado inicialmente por Android Inc., una �rma compradapor Google en 2005, actualmente en su versión Android 8.0 Oreo,con la pronta llegada de Android P.

2.- iOS.- Es un sistema operativo móvil de Apple (Anteriormentedenominado iPhone OS). Originalmente desarrollado para los pro-ductos iPhone, siendo después usado en dispositivos como el iPodTouch, iPad y el Apple TV. Apple, no permite la instalación deiOS en Hardware de terceros, su última versión iOS 11.

3.- Windows Phone.- Es un sistema operativo móvil desarrolladopor Microsoft, como sucesor de Windows Mobile. A diferencia de

[email protected] 30 Antonio Carrillo Ledesma, Et alii

Page 33: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

su predecesor fue enfocado en el mercado de consumo en lugardel mercado empresarial.

4.- Symbian OS.- Es un sistema operativo que fue producto dela alianza de varias empresas de telefonía móvil, entre las que seencuentran Nokia, Sony Ericsson y otros, el objetivo de Symbianfue crear un sistema operativo para terminales móviles.

5.- BlackBerry OS.- Es un sistema operativo móvil desarrolladopor Research In Motion para sus dispositivos BlackBerry. Elsistema es multitarea y tiene soporte para diferentes métodosde entrada adoptados por RIM para su uso en computadorasde mano, particularmente la trackwheel, trackball, touchpad ypantallas táctiles.

6.- HPWebOS.- Es un sistema operativo multitarea para sistemasembebidos basado en Linux, desarrollado por Palm Inc., ahorapropiedad de Hewlett-Packard Company.

7.- Bada.- Es un sistema operativo para teléfonos móviles desa-rrollado por Samsung (Bada «océano» o «mar» en coreano).esta diseñado para cubrir tanto los teléfonos inteligentes de gamaalta como los de gama baja.

[email protected] 31 Antonio Carrillo Ledesma, Et alii

Page 34: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

3 Trabajando con Debian GNU/Linux y susDerivados

Existen distintas distribuciones de Linux6 para instalar, una de las más am-pliamente usadas es Debian GNU/Linux y sus derivados como Ubuntu. De-bian7.

Aprender a Usar Linux En la red existen múltiples sitios especializadosy una amplia bibliografía para aprender a usar, administrar y optimizar cadauno de los distintos aspectos de Linux, nosotros hemos seleccionado diversostextos que ponemos a su disposición en:

http://mmc.geo�sica.unam.mx/acl/Herramientas/SistemasOperativos/Linux/

3.1 Sistema de Archivos y Estructura de Directorios

El Sistema de Archivos de Linux o cualquier sistema de archivos, general-mente es una capa bajo el sistema operativo la cual maneja el posicionamientode tus datos en el almacenamiento, sin este el sistema no puede saber dóndeempieza y termina un archivo.

Tipos de Sistema de Archivos de Linux Cuando intentas instalarLinux, ves que Linux ofrece distintos sistemas de archivos como los siguien-tes:

Ext, Ext2, Ext3, Ext4, JFS, XFS, Btrfs y Swap

Así que, ¿que son estos sistemas de archivos que ofrece Linux?

� Ext: Antiguo y descontinuado debido a sus limitaciones.

� Ext2: Primer sistema de archivos de Linux que permite 2 terabytes dedatos.

6Una lista de las distribuciones de Linux y su árbol de vida puede verse en la páginaWeb http://futurist.se/gldt/

7Algunas de las razones para instalar GNU/Linux Debian están detalladas en su páginaWeb https://www.debian.org/intro/why_debian.es.html

[email protected] 32 Antonio Carrillo Ledesma, Et alii

Page 35: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Ext3: Evolución del Ext2, con actualizaciones y retrocompatibilidad8.

� Ext4: Es mas rápido y permite archivos mucho más grandes con unavelocidad signi�cativa9.

� JFS: Sistemas de archivos antiguos hechos por IBM. Funcionan biencon archivos grandes y pequeños, pero falla y los archivos se corrompendespués de un largo tiempo de utilización, según los reportes.

� XFS: Sistema de archivos antiguo que funciona lento con archivos pe-queños.

� Btrfs: Hecho por Oracle. No ese estable como Ext en algunas distribu-ciones, pero se puedes decir que es buen reemplazo, si es necesario.Tiene buen rendimiento.

� Swap: Es un espacio de intercambio que es utilizado para almacenardatos temporales, reduciendo así el uso de la RAM, normalmente esdel doble del tamaño de la RAM del equipo.

En el sistema de archivos de Linux, se tiene asociado un elemento en latabla que guarda a los archivos y directorios dentro del sistema de archivos,que contiene un número. Este número identi�ca la ubicación del archivodentro del área de datos llamado inodo.Cada inodo contiene información de un �chero o directorio. En concreto,

en un inodo se guarda la siguiente información:

� El identi�cador de dispositivo del dispositivo que alberga al sistema dearchivos.

� El número de inodo que identi�ca al archivo dentro del sistema dearchivos.

� La longitud del archivo en bytes.8El único problema que tiene es que los servidores no utilizan este tipo de sistema de

archivos debido a que no soporta recuperación de archivos o Snapshots del disco.9Es una muy buena opción para discos SSD, además puedes darte cuenta que cuando

intentas instalar cualquier distribución de Linux este es el sistema de archivo por defectoque sigiere Linux.

[email protected] 33 Antonio Carrillo Ledesma, Et alii

Page 36: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� El identi�cador de usuario del creador o un propietario del archivo conderechos diferenciados.

� El identi�cador de grupo de un grupo de usuarios con derechos dife-renciados.

� El modo de acceso: capacidad de leer, escribir, y ejecutar el archivopor parte del propietario, del grupo y de otros usuarios.

� Las marcas de tiempo con las fechas de última modi�cación (mtime),acceso (atime) y de alteración del propio inodo (ctime).

� El número de enlaces (hard links), esto es, el número de nombres (en-tradas de directorio) asociados con este inodo.

� El área de datos ocupa el resto del disco y es equivalente a la zona dedatos en FAT. En esta zona, como su nombre indica, están almacenadoslos �cheros y directorios de nuestro sistema.

Estructura de Directorios en Linux Además de los sistemas de archivosque di�ere de la de Windows, la estructura de directorios en Linux es distinta,y es necesario conocerla para encontrar �cheros de con�guración, instalarciertos paquetes en el lugar adecuado, localizar las fuentes del Kernel, o laimagen de este, nuestros �cheros personales, etc.:

/ es el directorio principal, la raíz o root. Contiene el resto de directo-rios, es decir, todos los demás serían subdirectorios de este (incluso si estánen particiones o discos diferentes). Sin duda es el más importante.

/bin es el directorio donde se almacenan los binarios, es decir, los pro-gramas que emplea el sistema para labores administrativas como los coman-dos cp, echo, grep, mv, rm, ls, kill, ps, su, tar, etc.

/sbin la S es de System, y como su nombre indica, aquí se almacenan losbinarios o programas que emplea el propio sistema operativo para tareas dearranque, restauración, etc. Por ejemplo, fsck, mount, mkfs, reboot, swapon.

[email protected] 34 Antonio Carrillo Ledesma, Et alii

Page 37: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

/boot es el directorio de arranque, donde está la o las imágenes delKernel Linux que se cargarían durante el arranque, y también directorios ycon�guración del propio gestor de arranque.

/etc muy importante para el administrador, ya que aquí residen los�cheros de con�guración de los componentes del sistema y otros programasinstalados.

/dev es un directorio muy especial donde se encuentran los dispositivosde bloques o carácteres, es decir, �cheros que representan la memoria, par-ticiones, discos, dispositivos de hardware, etc. Ya sabes que en LINUX yUNIX todo es un archivo, y no unidades como en Windows. Por ejemplo, eldisco duro o particiones serían /dev/sda1, /dev/sda2, /dev/sdb1, etc.

/proc es otro directorio muy especial, más que un directorio es unainterfaz por decirlo de un modo sencillo. Y aquí el sistema nos presenta losprocesos como directorios numerados con el identi�cador de procesos PID(Process ID). Dentro de cada uno de ellos estaría toda la información nece-saria para la ejecución de cada proceso en marcha. Además, encontrarías�cheros de los que extraer información importante, como cpuinfo, meminfo,etc. Es precisamente de estos �cheros de los que extraen información algunoscomandos que usamos habitualmente, como por ejemplo, cuando hacemosuso de free para consultar la memoria disponible, este comando realmenteestaría mostrando el contenido de /proc/meminfo de una forma ordenada.

/media o /mnt son los directorios donde se establecen generalmentelos puntos de montaje. Es decir, cuando insertamos algún medio extraíbleo recurso de red compartido, etc., que hayamos montado, estaría aquí si lohemos puesto como punto de montaje. El primero es más especí�co paramedios que se montan de una forma temporal.

/home es el directorio para los usuarios estándar. Por ejemplo, aquíse almacenan dentro de directorios separados (uno para cada usuario consu nombre), los �cheros personales. Por ejemplo, /home/antonio sería midirectorio personal.

[email protected] 35 Antonio Carrillo Ledesma, Et alii

Page 38: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

/lib o /lib64 es donde se alojan las bibliotecas necesarias para losbinarios presentes en el sistema. En /lib64 estarían las de las aplicaciones de64 bits y en /lib estarían las aplicaciones de 32 bits.

/opt es un directorio que almacenarán los paquetes o programas ins-talados en el sistema que son de terceros. Por ejemplo, si instalamos algúnantivirus, Chrome, Arduino IDE o ciertos paquetes grandes, suelen instalarseaquí.

/root no hay que confundirlo con /, una cosa es el directorio raíz o rooty otra muy diferente /root. En este caso, se puede asemejar a un /home peroes exclusivo para el usuario root o usuario administrador.

/svr almacena �cheros y directorios relativos a servidores que tienesinstalados en el sistema, como Web, FTP, CVS, etc.

/sys junto con /dev y /proc, es otro de los especiales. Y como /proc,realmente no almacena nada, sino que es una interfaz también. En este caso,son �cheros virtuales con información del Kernel e incluso, se pueden emplearalgunos de sus �cheros para con�gurar ciertos parámetros del Kernel.

/tmp es el directorio para �cheros temporales de todo tipo. Es em-pleado por los usuarios para almacenar de forma temporal ciertos �cheros oincluso para almacenar cache o ciertos �cheros volátiles de navegadores Web,etc. No obstante, hay otro directorio para lo mismo en /var/tmp.

/var se trata de un directorio con directorios y �cheros que suelen cre-cer de tamaño, como bases de datos, logs, etc. Es precisamente los logs oregistros del sistema por lo que es más popular este directorio, y allí encon-trarás muchísima información de todo lo que ocurre en el sistema: /var/logs/.Dentro de dicho directorio encontrarás separados por directorios, los logs demultitud de Software, incluido el sistema.

/usr son las siglas de User System Resources, y actualmente almacena�cheros de solo lectura relativos a utilidades del usuario, como los paquetesque instalamos mediante el gestor de paquetes en nuestra distribución. Den-tro hay como una jerarquía de árbol de directorios vistos hasta ahora (casi

[email protected] 36 Antonio Carrillo Ledesma, Et alii

Page 39: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

todos) como si de un segundo nivel se tratase. Vas a encontrar /usr/bin,/usr/lib, /usr/sbin, /usr/src, etc., que por lo dicho anteriormente y susnombres, es intuitivo saber lo que almacenan que almacenan. Solo decirque /usr/src es donde permanecerán los �cheros de código fuente.

Ten en cuenta que no todas las distribuciones de Linux siguen este es-quema y puede haber pequeñas variaciones, pero si se adaptan al estándar,no tendrás problemas al navegar por la estructura de archivos.

3.2 Trabajando en Línea de Comandos

Linux es un potente sistema operativo visual y de línea de comandos10. Enesta última se tiene una potente herramienta, en ella se encuentran desde loscomandos básicos hasta los más avanzados11, algunos de ellos son:

Manipulación de archivos y directorios

ls, pwd, cd, mkdir, rmdir, cp, mv, rm, ln, cat, touch,cmp, di¤, wc, tail, head, more, less, nano

Comandos generales

man, help, info, whatis, which, whereis, clear, w, time,whoami, date, uptime, uname, df, du, free, bc, history

Redirección y pipes

standard input y output, error, pipe

Permisos10Android tiene la base de Linux, por ello en cualquier dispositivo que soporte dicho

sistema operativo es posible instalar una aplicación para acceder a la terminal de líneade comandos � por ejemplo ConnectBot� , y en ella podemos correr los comandos quemostramos en esta sección.11En la Web se puede obtener acceso a diversos proyectos que ponen a disposición del

usuario la documentación de una gran variedad de comandos de Linux, algunos de estosproyectos son:http://man7.org/linux/man-pages/https://linux.die.net/man/https://www.kernel.org/doc/man-pages/

[email protected] 37 Antonio Carrillo Ledesma, Et alii

Page 40: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

chmod, chown, chgrp, su, useradd, usermod, deluser, passwd

Búsqueda

�nd, grep, locate

Respaldo

tar, gzip, bzip2, zip, unp

Varios

�le, cal, ps, top, kill, killall, dstat, lsusb, awk, sort, sed

A continuación detallamos el uso de varios de estos comandos que seejecutan en la línea de comandos de GNU/Linux o Terminal12. Hay querecalcar que cada comando tiene una gran variedad de opciones, pero la des-cripción completa de cada comando y opciones de este, se escapa de nuestros�nes, por ello si se necesita conocer la referencia completa de dichos comandoshay varias maneras de obtenerla, entre otras haciendo uso de man, help, infoo whatis aplicado al comando de nuestro interés.

12Existen varios atajos de teclado que facilitan el navegar en la terminal de comandos,entre los que destacan:CTRL L Limpia el contenido de la terminalCTRL D Concluye la sesión en la terminal cerrando estaSHIFT Page Up/Down Navega en la terminal una página arriba o abajoCTRL A Posiciona el cursor al inicio de la líneaCTRL E Posiciona el cursor al �nal de la líneaCTRL U Borra lo que esta a la izquierda del cursorCTRL K Borra lo que esta a la derecha del cursorCTRL Y Pega lo que se quito con CTRL U, K, WTAB Autocompletar el nombre de archivo o comandoCTRL R Permite buscar dentro del historial de comandos!! Permite repetir el último comandoCTRL Z Detiene la ejecución del comando actual (permite continuar la ejecución con

fg en primer plano o bg en segundo plano)

[email protected] 38 Antonio Carrillo Ledesma, Et alii

Page 41: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

ls (de listar), permite listar el contenido de un directorio o �chero. Lasintaxis es:

$13 ls /home/directorio

el comando ls tiene varias opciones que permiten organizar la salida, loque resulta particularmente útil cuando es muy grande. Por ejemplo, puedesusar -a para mostrar los archivos ocultos y -l para mostrar los usuarios,permisos, tamaño en Bytes y la fecha de los archivos; -h muestra el tamañoen unidades fáciles de leer � como KB, MB o GB� . Así como para todoslos comandos Linux, estas opciones pueden combinarse, terminando en algocomo:

$ ls -lha /home/directorio

Rutas Absolutas o Relativas Cuando se empieza a manejar un intér-prete de comandos, una de las cosas que más cuesta es acostumbrarte aencontrar y hacer referencia a elementos del sistema de �cheros. Mientrasque en un entorno grá�co tenemos que hacer click en carpetas y subcarpetashasta llegar al elemento deseado, en el intérprete de comandos tendremos queconseguir lo mismo, pero indicando el lugar mediante una cadena de textocompuesta por los nombres de las carpetas que hay que recorrer hasta ellugar donde se encuentra el elemento deseado. Según el sistema cada nombrede carpeta se separa por un carácter especial, que en Linux será la diagonal( / ).Estas rutas serán usadas por los comandos para saber dónde encontrar

los elementos sobre los que tienen que realizar la acción correspondiente14.Hay dos formas de utilizar rutas, una es de forma absoluta y la otra de formarelativa. Vamos a explicar la diferencia a continuación:13En el Bourne Shell y sus derivados como BASH el prompt que nos permite escribir los

diferentes comandos, generalmente termina con el caracter:

� $ para usuario sin privilegios� # para el administrador, conocido como root

14Por ejemplo, si quiero posicionarme en un directorio determinado, utilizaré el comandocd y para indicar el sitio adonde quiero ir usaré una ruta, por ejemplo cd /home/. Elcomando cp copia elementos, en este caso necesitaremos dos rutas una para el origen(elemento que quiero copias) y otra para el destino (elemento nuevo que voy a crear olugar donde voy a dejar las copias). Por lo tanto podría poner:cp /etc/passwd /home/copia_passwd.

[email protected] 39 Antonio Carrillo Ledesma, Et alii

Page 42: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Rutas Absolutas El sistema de �cheros es una estructura jerárquicaque en el caso de Linux tiene una raíz que se indica cuando se pone solamenteel carácter diagonal / . En la raíz estan los directorios principales del sistemaque a su vez tendrán subdirectorios en su interior. Cuando quiero indicardónde se encuentra un elemento usando una ruta absoluta, tendré que indi-carle todos los directorios por los que hay que pasar empezando desde la raízdel sistema. O lo que es lo mismo, siempre empezarán por /. Ejemplos:

/etc/apt/sources.list/var/log/syslog/home/alumno/.bashrc/usr/bin/

estas rutas suelen ser bastante largas, pero tiene como ventaja que funcio-nan siempre, independientemente del lugar desde el que ejecute la orden15.

Rutas Relativas Las rutas relativas indican el camino para encontrarun elemento, pero basándonos en el directorio desde el que se ejecuta la orden.Son mucho más cortas que las absolutas, pero para saber si son correctas ono, tenemos que saber siempre desde dónde se han utilizado.Un atajo fundamental para la construcción de rutas relativas es conocer

que al escribir .. en la ruta hace referencia al directorio padre. Por lo tantosi ejecuto:

$ cd ..

estoy dando la orden de cambiar de directorio al padre del actual, es decir,al que esta justo antes en la estructura jerárquica. El único elemento que notiene padre es la propia raíz del sistema ( / ).Las rutas relativas harán referencia a un elemento que se encuentre en

el directorio desde el que ejecutamos la orden, o usará los dos puntos paraascender a directorios superiores. Siempre que sean correctos, podemos com-binarlos de la forma que necesitemos separando cada directorio por una dia-gonal. Por ejemplo una ruta correcta podría ser: ../../fotos/personales/

15Es muy recomendable utilizar la facilidad que brinda el BASH de completar el nombrede un elemento del sistema de �cheros pulsando la tecla tabulador. Ahorrará mucho tiempoy errores.

[email protected] 40 Antonio Carrillo Ledesma, Et alii

Page 43: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Metacarácter o Shell Globbing: Los metacarácteres son caracteres quetienen un signi�cado especial en la línea de comandos, estos son comodinesque el sistema permite usar para especi�car los archivos que satisfacen el�ltro especi�cado a la hora de buscar, eliminar o �ltrar nombres de archivo,estos metacarácteres son: *, ?, [ ] y [^]16.

� * Se utiliza para reemplazar cero o más caracteres. Puede ser sustituidopor cualquier cadena de caracteres, ejemplos:

Muestra el contenido de las carpetas que contengan archivos deextensión txt :

$ ls *.txt

Lista todos los archivos que se llamen archivo sin importar suextensión:

$ ls archivo.*

Muestra todos los archivos con extensión jpg y que su nombretenga al �nal "chivo":

$ ls *chivo.jpg

� ? Sustituye un carácter cualquiera, ejemplos:

Muestra todos los archivos empiecen con letras o números peroque luego de ellos tengan los valores "b4ts.txt":

$ ls ?b4ts.txt

Muestra todos los archivos que inicien con ab, siga cualquier letra,número o carácter y �nalice con ts.txt :

$ ls ab?ts.txt

Muestra todos los archivos de tres letras que en medio tenga unaletra i :

16Vease también el uso de las secuencias (véase 3.10).

[email protected] 41 Antonio Carrillo Ledesma, Et alii

Page 44: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ ls ?i?

� [ ] Se usa para de�nir rangos o conjuntos de caracteres a localizar, parade�nir los rangos se debe usar el guión -, si son varios caracteres seseparan por coma, ejemplos:

Muestra todos los archivos que comiencen por z o v sin importarla extensión:

$ ls [zv]*

Muestra todos los archivos que comiencen por z o v y terminencon la extensión .txt :

$ ls [zv]*.txt

Lista todos los archivos de cualquier extensión que tengan losrangos establecidos entre los corchetes:

$ ls archivo[12].*

Muestra la lista de todos los archivos que cumplan con el rangode "a-f" sin importar la extensión o el nombre:

$ ls [a-f]*

Muestra la lista de todos los archivos que inicien con cualquiercosa, pero que terminen con una letra mayúscula:

$ ls *[A-Z]

Muestra la lista de todos los archivos que inicien con una le-tra minúscula, tenga después una letra mayúscula, continue concualquier carácter, después tenga una letra a, b, c-f, z y siga concualquier cantidad de caracteres:

$ ls [a-z][A-Z]?[a,b,c-f,z]*

� [^] Este caso es contrario al anterior, este representa que se busque algoexceptuando lo que se encuentra entre los corchetes, también trabajacon rangos.

Muestra los archivos que no empiecen con una letra minúsculapero que tengan extensión .txt :

$ ls [^a-z]*.txt

[email protected] 42 Antonio Carrillo Ledesma, Et alii

Page 45: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

pwd (de print working directory o imprimir directorio de trabajo), esun comando que imprime nuestra ruta o ubicación al momento de ejecutarlo,así evitamos perdernos si estamos trabajando con múltiples directorios ycarpetas. Su sintaxis sería:

$ pwd

cd (de change directory o cambiar directorio), es como su nombre loindica el comando que necesitarás para acceder a una ruta distinta de la quete encuentras. Por ejemplo, si estas en el directorio /home y deseas accedera /home/ejercicios, sería:

$ cd /home/ejercicios

teclear el comando cd solo regresa al directorio home del usuario (lo mismohace al teclear cd ~), teclear el comando cd - retorna al último directorio antesde hacer cambio de directorio, si estas en /home/ejercicios y deseas subir unnivel (es decir ir al directorio /home), ejecutas:

$ cd ..

mkdir (de make directory o crear directorio), crea un directorio nuevotomando en cuenta la ubicación actual. Por ejemplo, si estas en /home ydeseas crear el directorio ejercicios, sería:

$ mkdir /home/ejercicios

mkdir tiene una opción bastante útil que permite crear un árbol de di-rectorios completo que no existe. Para eso usamos la opción -p:

$ mkdir -p /home/ejercicios/prueba/uno/dos/tres

rmdir (de remove directory o borrar directorio), borra un directoriovacio

$ rmdir /home/ejercicios

[email protected] 43 Antonio Carrillo Ledesma, Et alii

Page 46: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

cp (de copy o copiar), copia un archivo o directorio origen a un archivoo directorio destino. Por ejemplo, para copiar el archivo prueba.txt ubicadoen /home a un directorio de respaldo, podemos usar:

$ cp /home/prueba.txt /home/respaldo/prueba.txt

en la sintaxis siempre se especi�ca primero el origen y luego el destino. Siindicamos un nombre de destino diferente, cp copiará el archivo o directoriocon el nuevo nombre. El comando también cuenta con la opción -r quecopia no sólo el directorio especi�cado sino todos sus directorios internos deforma recursiva. Suponiendo que deseamos hacer una copia del directorio/home/ejercicios que a su vez tiene las carpetas ejercicio1 y ejercicio2 ensu interior, en lugar de ejecutar un comando para cada carpeta, ejecutamos:

$ cp -r /home/ejercicios /home/respaldos/

mv (de move o mover), mueve un archivo a una ruta especí�ca, y adiferencia de cp, lo elimina del origen �nalizada la operación. Por ejemplo:

$ mv /home/prueba.txt /home/respaldos/prueba2.txt

al igual que cp, en la sintaxis se especi�ca primero el origen y luego eldestino. Si indicamos un nombre de destino diferente, mv moverá el archivoo directorio con el nuevo nombre.

rm (de remove o remover), es el comando necesario para borrar unarchivo o directorio. Para borrar el archivo prueba.txt ubicado en /home,ejecutamos:

$ rm /home/prueba.txt

este comando también presenta varias opciones. La opción -r borra todoslos archivos y directorios de forma recursiva. Por otra parte, -f borra todo sinpedir con�rmación. Estas opciones pueden combinarse causando un borradorecursivo y sin con�rmación del directorio que se especi�que. Para realizaresto en el directorio respaldos ubicado en el /home, usamos:

$ rm -fr /home/respaldos

Este comando es muy peligroso, por lo tanto es importante que nos docu-mentemos bien acerca de los efectos de estas opciones en nuestro sistemapara así evitar consecuencias nefastas.

[email protected] 44 Antonio Carrillo Ledesma, Et alii

Page 47: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

ln permite crear enlaces a los archivos, tanto físicos (hard links) comosimbólicos -s ( soft links). En pocas palabras, un enlace simbólico es comoun acceso directo en Windows o un alias en OSX mientras que un enlacefísico es un nombre diferente para la misma información en disco.Para crear un enlace físico ejecutamos:

$ ln archivo_origen nombre_enlace

Y para crear un enlace simbólico:

$ ln -s archivo_origen nombre_enlace

cat (de concatenar), Nos permite visualizar el contenido de un archivode texto sin la necesidad de un editor. Para utilizarlo solo debemos men-cionarlo junto al archivo que deseamos visualizar:

$ cat prueba.txt

touch crea un archivo vacío, si el archivo existe actualiza la hora demodi�cación. Para crear el archivo prueba1.txt en /home, sería:

$ touch /home/prueba1.txt

cmp compara el contenido de dos archivos y devuelve 0 si los archivosson idénticos ó 1 si los archivos tienen diferencias. En caso de error devuelve-1.

$ cmp -s archivo1 archivo2

también puede mostrar algo de información sobre las diferencias pero paraun reporte más detallado tenemos el siguiente comando:

di¤ al igual que cmp, compara el contenido de dos archivos pero enlugar de devolver un valor imprime en pantalla un resumen detallado línea alínea de las diferencias. Ejecutarlo es tan simple como:

$ di¤ archivo1.txt archivo2.txt

también puede usarse con directorios. En este caso comparará los nombresde los archivos correspondientes en cada directorio por orden alfabético eimprimirá en pantalla los archivos que esten en un directorio pero no estenen el otro.

[email protected] 45 Antonio Carrillo Ledesma, Et alii

Page 48: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

wc imprime en pantalla la cantidad de saltos de línea, palabras y bytestotales que contenga un archivo. Para usarlo con un archivo cualquiera eje-cutamos:

$ wc archivo.txt

tail muestra en pantalla las últimas líneas de un archivo.

$ tail archivo.txt

por defecto siempre muestra 10 pero podemos indicarle un número dife-rente de líneas a visualizar usando el parámetro -n:

$ tail -n 50 archivo.txt

head es el comando opuesto a tail, muestra las primeras líneas de unarchivo.

$ head archivo.txt

al igual que tail, muestra por defecto las 10 primeras líneas pero podemosindicarle un número diferente usando el parámetro -n:

$ head -n 50 archivo.txt

more es un �ltro que permite paginar el contenido de un archivo paraque se vea a razón de una pantalla a la vez. Para utilizarlo simplementeejecutamos:

$ more archivo.txt

permite navegar a través del contenido del archivo usando las �echasdireccionales Arriba y Abajo, Espacio o la tecla Enter. Para salir de moreusamos la tecla Q.

[email protected] 46 Antonio Carrillo Ledesma, Et alii

Page 49: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

less Aunque su nombre es lo opuesto de more es realmente una versiónmejorada de éste último. Es otro �ltro que permite paginar el contenido deun archivo pero que además de permitir la navegación hacia adelante y haciaatrás, esta optimizado para trabajar con archivos muy grandes. Ejecutarloes tan simple como escribir:

$ less archivo.txt

permite navegar a través del contenido del archivo usando las �echasdireccionales arriba y abajo, Espacio o la tecla Enter. Para salir de lesstambién usamos la tecla Q.

nano Es un pequeño editor de texto que esta disponible en casi todaslas distribuciones actuales de Linux, funciona con un menú en la parte deinferior que se activa con la tecla Ctrl.

$ nano archivo.txt

man muestra la documentación completa de todos los comandos. Porejemplo, para clear :

$ man clear

help proporciona ayuda de los comandos, con frecuencia puede sustituiral comandoman. Por ejemplo, para conocer la lista de comandos que soporta:

$ help

info proporciona ayuda de los comando al igual que man y help, su usoes similar:

$ info mkdir

whatis proporciona una ayuda breve de lo que hacen los comandos, sinmostrar opciones del comando, ejemplo:

$ whatis ls

[email protected] 47 Antonio Carrillo Ledesma, Et alii

Page 50: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

clear (de limpiar), es un sencillo comando que limpiará nuestra terminalpor completo dejándola como recién abierta. Para ello ejecutamos:

$ clear

w nos proporciona la lista de los usuarios activos en la computadora� recordemos que Linux es un sistema multiusuario� , su uso es:

$ w

time proporciona el tiempo de ejecución, que es dividido en real, usuarioy del sistema, muestra de su uso es la siguiente:

$ time ls

whoami (del inglés Who Am I o Quien Soy Yo en español) muestra elidenti�cador del usuario actual. Para ejecutarlo solo basta con invocarlo:

$ whoami

date nos muestra la fecha y hora que tiene actualmente la computadora,ejemplo:

$ date

uptime muestra el tiempo que el ordenador ha pasado encendido sinser reiniciado, así como el load average o carga promedio del sistema que esel número de trabajos que se han realizado en los últimos 1, 5 y 15 minutos.Para ver su salida, solo escribimos en la terminal:

$ uptime

uname es un programa de sistemas operativos de tipo Unix que im-prime detalles de la máquina y del sistema operativo que se esta ejecutando.Su salida es diferente dependiendo de las opciones, por ejemplo, uname solomuestra el nombre del sistema operativo pero cuando le pasamos la opción-r muestra la versión del kernel y con -a de all, su salida es mucho mascompleta. Se ejecuta de la siguiente forma:

$ uname -a

[email protected] 48 Antonio Carrillo Ledesma, Et alii

Page 51: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

df nos muestra información de los discos y particiones en ellos, ademásde cuanto esta usado y libre en cada una de las particiones, ejemplo:

$ df

du nos muestra en bytes cuanto ocupan los directorios de nuestra actualtrayectoria de archivos, para ver las unidades más legibles usamos la opción-h, -a para conocer el tamaño de archivos y directorios y -s para el total dela trayectoria, ejemplo:

$ du -sh

free nos muestra la cantidad de memoria y Swap usada y libre del sis-tema, ejemplo:

$ free

bc es un lenguaje que soporta números de precisión arbitraria con eje-cución interactiva, ejemplo:

$ bc -l

escribir, por ejemplo:

scale = 1001/3quit

mostrará el resultado con 100 dígitos de precisión.

history muestra el historial de comandos ejecutados en la terminal,ejemplo:

$ history

para borrar dicho historial usar la opción -c, ejemplo:

$ history -c

[email protected] 49 Antonio Carrillo Ledesma, Et alii

Page 52: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

standard input la Entrada estandar, en inglés standard input (mejorconocido como stdin) es el mecanismo por el cual un usuario le indica a losprogramas la información que estos deben procesar. Por omisión, el tecladoes la entrada estandar. La entrada estandar representa los datos que nece-sita una aplicación para funcionar, como por ejemplo un archivo de datoso información ingresada desde la terminal y es representado en la terminalcomo el tipo 0.

standard output la Salida estandar, en inglés standard output (mejorconocido como stdout) es el método por el cual el programa puede comuni-carse con el usuario. Por omisión, la salida estandar es la pantalla dondese ejecutaron las instrucciones. La salida estandar es la vía que utilizanlas aplicaciones para mostrarte información, allí podemos ver el progresoo simplemente los mensajes que la aplicación quiera darte en determinadomomento y es representado en la terminal como el tipo 1.

standard error por último existe un �ujo conocido como Error es-tandar, en inglés standard error output (mejor conocido como stderr) que esutilizado por las instrucciones para desplegar mensajes de error que surjandurante el transcurso de su ejecución. Al igual que stdout, el error estandarserá la pantalla donde se procesaron las instrucciones. El error estandar esla forma en que los programas te informan sobre los problemas que puedenencontrarse al momento de la ejecución y es representado en la terminal comoel tipo 2.

Todos estos tipos son representados físicamente como archivos en el sis-tema, todo en Linux son archivos. Así, una redirección consiste en trasladarla información de un tipo a otro, por ejemplo de la salida estandar a la en-trada estandar o del error estandar a la salida estandar. Esto lo logramosusando el símbolo>. Por ejemplo, para redireccionar la salida de un comandoy volcarla a un archivo bastaría con ejecutar:

$ ls -la > archivo.txt

Sin embargo, cada vez que ejecutemos ese comando el contenido de archivo.txtserá reemplazado por la salida del comando ls. Si queremos agregar la salidadel comando al archivo, en lugar de reemplazarla, entonces ejecutamos:

$ ls -la >> archivo.txt

[email protected] 50 Antonio Carrillo Ledesma, Et alii

Page 53: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Lo interesante es que, además de la salida estandar, también podemosredireccionar el error estandar y la entrada estandar. Si queremos forzar aque un programa nos imprima en pantalla los errores que consiga durante suejecución podemos redireccionar el error estandar hacia la salida estandar.Eso lo logramos ejecutando:

$ programa 2>&1

¿Recuerdan que más arriba se comento que Linux identi�ca a cada tipocon un número? Bueno, aquí es donde esos números cobran sentido. El tipo2 es el error estandar y el tipo 1 es la salida estandar. En los ejemplos previosno tuvimos la necesidad de especi�car el tipo 1 porque la terminal lo asumepero pudimos expresarlos explícitamente de la siguiente manera:

$ ls -la 1> archivo.txt$ ls -la 1>> archivo.txt

Podemos, por ejemplo, contar las líneas que tiene un archivo redireccio-nando la entrada estandar de wc hacia un archivo de texto. Así:

$ wc < archivo.txt

También podemos hacer algo muy común en la administración de sis-temas, descartar el error estandar de un proceso. Para eso ejecutamos:

$ programa 2> /dev/null

O incluso descartar su salida estandar:

$ programa > /dev/null

En Linux, /dev/null es un archivo especial al que se envía cualquier in-formación que quiera ser descartada.

pipe permite redireccionar la salida de un comando hacia la entrada deotro, por ejemplo:$ ls j more

[email protected] 51 Antonio Carrillo Ledesma, Et alii

Page 54: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

chmod (del inglés change mode) es un comando que permite cambiarlos permisos de acceso de un directorio o archivo. Su sintaxis es:

$ chmod [opciones] <modo> <archivo>

donde opciones nos permite entre otras cosas, cambiar los permisos re-cursivamente para un directorio con -R, modo son los permisos de lectura,escritura y ejecución representados en notación octal17 y archivo es el nombredel directorio o archivo que queremos modi�car.Por ejemplo, para asignar permisos de lectura, escritura y ejecución para

el dueño, el grupo y remover los permisos para el resto de los usuarios alarchivo prueba.txt, sería:

$ chmod 770 prueba.txt

chown (del inglés change owner) nos permite cambiar el propietario deun archivo o directorio. Su sintaxis es:

$ chown [opciones] <nuevo-propietario> <archivo>

donde opciones son las opciones del comando, como -R para cambiarrecursivamente el propietario de un directorio y todo su contenido, nuevo-propietario será el nuevo propietario y archivo es el nombre del directorio oarchivo que queremos modi�car.Por ejemplo, para cambiarle el propietario del directorio /home/ejercicios

y todo su contenido y asignarlo al usuario pedro, hacemos:

$ chown -R pedro /home/ejercicios

17Octal Binario Modo Archivo

0 000 - - -1 001 - - x2 010 - w -3 011 - w x4 100 r - -5 101 r w -6 110 r w -7 111 r w x

[email protected] 52 Antonio Carrillo Ledesma, Et alii

Page 55: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

chgrp (del inglés change group) nos permite cambiar el grupo de unarchivo o directorio. Su sintaxis es:

$ chgrp [opciones] <nuevo-grupo> <archivo>

donde opciones son las opciones del comando, como -R para cambiar re-cursivamente el grupo de un directorio y todo su contenido, nuevo-grupo seráel nuevo grupo y archivo es el nombre del directorio o archivo que queremosmodi�car.Por ejemplo, para cambiarle el grupo del directorio /home/ejercicios y

todo su contenido y asignarlo al usuario pedro, hacemos:

$ chgrp -R pedro /home/ejercicios

su permite cambiar las credenciales del usuario, es decir ser otro usuario,el usuario del que comúnmente se desea adquirir sus credenciales es el de root,ejemplo:

$ su

useradd (de agregar usuario) se utiliza para crear nuevos usuarios entu sistema Linux. Su sintaxis es:

$ useradd [opciones] <nombre-usuario>

donde opciones nos permite asignar un grupo al usuario con -g, asignar eldirectorio /home con -d, crearlo con -m si no existía previamente y -s paraasignarle un intérprete de comandos o shell, entre otras.Así, para crear el usuario andrea cuyo grupo principal será editores, eje-

cutamos:

$ useradd -g editores -d /home/andrea -m -s /bin/bash andrea

usermod (de modi�car usuario) modi�ca algunos parámetros de unusuario existente, como el nombre, su directorio /home y los grupos a losque pertenece, entre otros. Su sintaxis es:

$ usermod [opciones] <nombre-usuario>

donde opciones cambia el directorio home con -d, mueve todo el contenidodel directorio anterior con -m y cambia el nombre de usuario con -l, entreotras. Para cambiar el nombre al usuario andrea por violeta, sería:

$ usermod -l violeta andrea

[email protected] 53 Antonio Carrillo Ledesma, Et alii

Page 56: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

deluser (del inglés delete user) es un sencillo comando para borrarusuarios. Tiene la opción -r que adicionalmente borra su directorio /home.Para borrar el usuario violeta con su /home, ejecutamos:

$ deluser -r violeta

passwd (del inglés password) es una utilidad que se usa para cambiaro generar la contraseña de un usuario existente. Al invocarlo, pedirá lacontraseña actual (si existe) y luego que la contraseña nueva sea introducidados veces para veri�car que fue escrita correctamente. Por ejemplo paraasignar una contraseña al usuario violeta, sería:

$ passwd violeta

�nd permite buscar dentro del sistema de archivos un directorio o archivosque concuerden con el patrón dado, por ejemplo:$ �nd /home -name a*.pdfbusca desde la trayectoria /home, todos los archivos que concluyan con

.pdf y nos muestra las trayectorias a los archivos que concuerdan con losolicitado.Este comando tiene una gran gama de opciones para buscar lo que se

desee en un sistema de archivos, para ver las diversas opciones consulte elmanual del comando.

grep permite buscar en archivos un determinado patrón, mostrando lalínea que lo contiene, por ejemplo:

$ grep chmod *.txt

locate permite buscar archivos o directorios cuyo nombre coincida conel patrón dado, por ejemplo:

$ locate *dir2*

tar permite respaladar en un solo archivo un grupo de archivos y/odirectorios sin compactarlos, para ello usar:

$ tar -cvf nombre.tar directorio

para restaurar usar:

$ tar -xvf nombre.tar

[email protected] 54 Antonio Carrillo Ledesma, Et alii

Page 57: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

gzip permite respaladar en un solo archivo un grupo de archivos y/odirectorios compactandolos usando gzip, para ello usar:

$ tar -cvf nombre.tar directorio$ gzip �best nombre.tar

o usar:

$ tar -zcvf nombre.tar.gz directorio

para restaurar usar:

$ gunzip nombre.tar.gz$ tar -xvf nombre.tar

o usar:

$ tar -zxvf nombre.tar.gz

con GZIP comprimir y descomprimir respectivamente:

$ gzip �chero$ gzip -d �chero.gz

bzip2 permite respaladar en un solo archivo un grupo de archivos y/odirectorios compactándolos usando bzip2, para ello usar:

$ bzip �chero$ bzip -d �chero.bz2

zip permite respaladar en un solo archivo un grupo de archivos y/odirectorios compactándolos usando zip, para ello usar:

$ zip archivo.zip �cheros$ unzip archivo.zip

si al descompactar existe algún error, es posible recuperar parte de losarchivos mediante:

$ zip -F archive.zip -O archive-�xed.zip

o usar -FF, después usar:

$ jar xvf archive-�xed.zip

otra alternativa es usar:

$ bsdtar xf archivo.zip

[email protected] 55 Antonio Carrillo Ledesma, Et alii

Page 58: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

unp permite descomprimir de casi cualquier formato de respaldo, suuso es de lo más sencillo, a saber:

$ unp archivo.compactado

�le determina el tipo de un archivo y te imprime en pantalla el re-sultado. No hace falta que el archivo tenga una extensión para que Filedetermine su tipo, pues la aplicación ejecuta una serie de pruebas sobre elmismo para tratar de clasi�carlo.

$ �le un_archivo_de_texto.txt

cal nos muestra el calendario del mes actual, ejemplo:

$ cal

ps nos muestra los procesos activos del sistema junto con informaciónde la ejecución de los mismos, ejemplo:

$ ps

top nos muestra en tiempo real los procesos activos del sistema juntocon información como el número de cores, memoria real, usada y libre entreotra información importante del sistema, ejemplo:

$ ps

para salir del comando, es necesario teclear la letra q.

kill es un comando utilizado para enviar mensajes sencillos a los proce-sos ejecutándose en segundo plano en el sistema. Por defecto el mensaje quese envía es la señal de terminación. Su sintaxis más sencilla es:

$ kill [-s] <pid>

[email protected] 56 Antonio Carrillo Ledesma, Et alii

Page 59: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

donde -s es la señal a enviar, de no ser especi�cada ninguna se manda laseñal por defecto y pid es el identi�cador del proceso. Otra de sus opcioneses -9 que fuerza la terminación de un proceso.En Linux cada comando, proceso o ventana grá�ca tiene un número de

proceso (PID), este se puede obtener mediante el comando ps o top, y elcomando kill puede concluir con la ejecución del PID indicado y todos sussubprocesos � el usuario sólo puede matar sus propios procesos, root puede�nanizar (matar) los procesos de cualquier usuario� , ejemplo:Por ejemplo, para terminar un proceso cuyo PID es 3477, ejecutamos:

$ kill 3477

killall permite �nalizar (matar) todas las instancias de ejecución de uncomando, por ejemplo:

$ killall �refox-esr

dstat muestra información segundo a segundo del uso del procesador,disco, red entre otros, ejemplo:

$ dstst

lsusb lista los dispositivos usb del sistema además información del fa-bricante del mismo, ejemplo:

$ lsusb

awk permite procesar, analizar archivos de texto que esten organizadospor �las y columnas, ejemplo:$ awk -F�:��{ print $1 }�/etc/passwdnos mostrarán todos los usuarios que tiene el sistema, los cuales estan

dados de alta en el archivo del sistema /etc/passwd

sort imprime en pantalla las líneas de un archivo ordenadas alfabética-mente. Para ejecutarlo basta con:

$ sort archivo.txt

[email protected] 57 Antonio Carrillo Ledesma, Et alii

Page 60: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

sed es considerado un editor de texto orientado a "�ujo" � en contra-posición a los clásicos editores «interactivos» � el cual acepta como entradaun archivo o entrada estandar; cada línea es procesada y el resultado esenviado a la salida estandard, ejemplo:

$ sed �3,5d��chero.txt

borrará las líneas tres a cinco de archivo �chero.txt, otro ejemplo:

$ sed �/^$/d��chero.txt

borra todas las líneas en blanco del archivo �chero.txt.

Aprender a Trabajar con Linux En la red existen múltiples sitios espe-cializados y una amplia bibliografía para aprender a trabajar en cada uno delos distintos aspectos de Linux, nosotros hemos seleccionado diversos textosque ponemos a su disposición en:

http://mmc.geo�sica.unam.mx/acl/Herramientas/SistemasOperativos/

3.3 Cómo buscar archivos

La búsqueda de archivos de GNU/Linux se puede hacer con por lo menosdos comandos diferentes para buscar archivos: �nd (que traduce encontrar)y locate (que traduce ubicar).

Usando el comando �nd El comando más común utilizado para encon-trar y �ltrar archivos es a través del comando �nd. El diseño básico de estecomando es el siguiente:

�nd <directorio inicio> <opciones> <termino búsqueda>

El argumento <directorio inicio> es el punto de origen de donde deseasiniciar la búsqueda. Esto es útil si tienes una idea aproximada de dónde po-dría estar ubicado el archivo deseado, ya que hace más especí�ca la búsqueda.La mayoría de las veces, sin embargo, querrás buscar el archivo en todo elsistema. Puedes hacer esto reemplazando tu ruta con una barra " / ", que

[email protected] 58 Antonio Carrillo Ledesma, Et alii

Page 61: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

es el símbolo del directorio raíz. A veces es posible que quieras iniciar labúsqueda desde el directorio de trabajo actual, es decir, el directorio dondeestá abierto el terminal. Esto se puede hacer con el argumento punto " . ".Para averiguar tu directorio actual, usa el comando pwd. Finalmente, paracomenzar la búsqueda de archivos desde tu carpeta de inicio, usa el símbolo" ~".El segundo argumento es el �ltro que deseas usar para buscar tu archivo.

Este podría ser el nombre, tipo, fecha de creación o de modi�cación delarchivo, etc. El tercer argumento es una continuación del segundo, donde seespeci�cará el término de búsqueda relevante.

Búsqueda por Nombre Por supuesto, el método más común y obviopara buscar un archivo es usar su nombre. Para ejecutar una consulta debúsqueda simple usando el nombre del archivo, usa el comando �nd de lasiguiente manera:

$ �nd . -name "archivo"

En el comando anterior, usamos la opción -name y buscamos un archivollamado archivo. Ten presente que comenzamos la búsqueda en nuestro di-rectorio actual.Una cosa importante para recordar cuando se utiliza el estándar es el ar-

gumento -name, que busca términos distinguiendo entre mayúsculas y minús-culas en GNU/Linux. Por lo tanto, si conoces el nombre del archivo, perono estás seguro de su las mayúsculas y minúsculas, usa el comando �nd deesta manera:

$ �nd . -iname "archivo"

Otra forma de utilizar la opción name es buscar todos los archivos sinuna palabra clave en el nombre. En GNU/Linux, puedes hacer esto de dosmaneras. El primer método implica el uso de la palabra clave -not de lasiguiente manera:

$ �nd . -not -name "archivo"

También podemos usar " ! ", aunque debe estar precedido por el identi-�cador de escape para que GNU/Linux sepa que esta es parte del comandode búsqueda y no una independiente.

[email protected] 59 Antonio Carrillo Ledesma, Et alii

Page 62: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ �nd . n! -name "archivo"

También puede buscar varios archivos con un formato común como .txt,lo cual podría ser útil en algunos casos:

$ �nd . -name "*.txt"

Esto listará todos los archivos de texto conmenzando con la carpeta ac-tual.Finalmente, si deseas buscar un determinado archivo por nombre y elim-

inarlo, usa el argumento -delete después del nombre del archivo:

�nd . -name "archivo" -delete

Otra forma es usar:

$ �nd . -name "archivo" j xargs rm -f

Búsqueda por Tipo Para la mayoría de los usuarios, basta con sabercómo encontrar archivos por sus nombres. Sin embargo, siempre es útilconocer todas las herramientas que se ofrecen para aprovechar GNU/Linuxal máximo.Aquí es donde entra en juego el argumento -type. GNU/Linux ofrece a

los usuarios las siguientes opciones para buscar archivos por tipo:

f - archivo normal

d - directorio o carpeta

l - enlace simbólico

c - dispositivos de caracteres

b - dispositivos de bloque

Un ejemplo simple del uso del tipo de archivo para la búsqueda se puedever a continuación:

$ �nd / -type d

[email protected] 60 Antonio Carrillo Ledesma, Et alii

Page 63: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Esto mostrará una lista de todos los directorios presentes en el sistema dearchivos, al haber comenzado la búsqueda desde nuestro directorio raíz conel símbolo de barra inclinada.También puedes concatenar las opciones -type y -name para hacer tus

búsquedas aún más especí�cas:

$ �nd / -type f -name "archivo"

Esto buscará archivos llamados archivo, excluyendo directorios o enlaces.Algunas veces es necesario acotar la profundidad de la búsqueda y limi-

tarla, digamos al actual directorio, por ejemplo:

$ �nd . -maxdepth 1 -type f -newer archivo

Búsqueda por Fecha Si quieres buscar archivos en función de su fechade acceso y las registros de fecha de modi�cación, GNU/Linux te ofrece lasherramientas para hacerlo. Hay 3 registros de tiempo de los cuales Linuxrealiza seguimiento en los archivos:

� Tiempo de acceso (-atime) - Fecha más reciente en que el archivo fueleído o escrito.

� Tiempo de modi�cación (-mtime) - Fecha más reciente en que se mod-i�có el archivo.

� Hora de cambio (-ctime) - Fecha más reciente en que se actualizaronlos metadatos del archivo.

Esta opción debe usarse con un número. Este número especi�ca el númerode días desde que se accedió, modi�có o cambió el archivo. La forma mássencilla de buscar archivos por tiempo es:

$ �nd / -atime 1

Esto encontrará todos los archivos a los que se accedió hace un día desdeel momento actual. Esto signi�ca que se listarán todos los archivos que fueronleídos y/o escritos desde el día anterior.Podemos hacer que nuestras consultas sean más precisas con los signos

más (+) y menos (-) precediendo al número de días. Por ejemplo:

[email protected] 61 Antonio Carrillo Ledesma, Et alii

Page 64: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ �nd / -mtime +2

Esto listará todos los archivos que tienen un tiempo de modi�cación demás de dos días.Para buscar todos los archivos cuyos metadatos de inodo se actualizaron

hace menos de un día, ejecuta lo siguiente:

$�nd / -ctime -1

Finalmente, hay algunos argumentos adicionales además de estos 3 quetambién están relacionados con las búsquedas por fecha. El argumento -<time-descriptor>min busca cuántos minutos han pasado. Se puede usarasí:

$�nd / -mmin -1

Esto buscará archivos que se modi�caron hace menos de un minuto.Además, el argumento -newer se puede usar para comparar la antigüedad dedos archivos y encontrar el más reciente.Búsqueda por tamañoAl igual que GNU/Linux te brinda la opción de buscar archivos basados

en registros de tiempo, también te permite hacer lo mismo con los tamaños.La sintaxis básica para buscar archivos por tamaño es:

$ �nd<directorio inicio> -size<tamaño> <unidad tamaño>

Puedes especi�car las siguientes unidades de tamaño:

c - bytes

k - kilobytes

M - megabytes

G - gigabytes

b - trozos de 512 bytes

Un ejemplo simple de cómo usar el comando �nd para los tamaños dearchivo es el siguiente:

$ �nd / -size 10M

[email protected] 62 Antonio Carrillo Ledesma, Et alii

Page 65: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Esto buscará en tu sistema archivos que tengan exactamente 10 megabytesde tamaño. Al igual que cuando buscaste en función del tiempo, puedes �l-trar aún más tus búsquedas con los signos más y menos:

$ �nd / -size +5G

El comando anterior listará todos los archivos de tu disco que tengan másde 5 Gigabytes de tamaño. De manera similar, puede lograr esto con el signomenos para indicar "menor que" en tus consultas.Además podemos pedir que la búsqueda nos entregue los datos de los

archivos encontrados usando el comando ls -l, por ejemplo:

�nd . -size +1000c -exec ls -l {} n;

Búsqueda por Propiedad La jerarquía de privilegios de Linux tam-bién se puede utilizar al buscar archivos. GNU/Linux te da la capacidadde especi�car tus búsquedas según la propiedad del archivo, así como lospermisos otorgados a diferentes usuarios.Para buscar archivos de un determinado propietario, se debe ejecutar el

siguiente comando:

$ �nd / -user usr

Esto devolverá una lista de todos los archivos que posee el usuario llamadousr. Similar a los nombres de usuario, también podemos buscar archivos através de nombres de grupo:

$ �nd / -group otro

Esto buscará aquellos archivos que son propiedad del grupo llamado otro.

Búsqueda por permisos Los usuarios que desean buscar archivosbasados en los permisos de los archivos18 pueden hacerlo usando la opción-perm del comando �nd. Por ejemplo:18Octal Binario Modo Archivo0 000 - - -1 001 - - x2 010 - w -3 011 - w x4 100 r - -5 101 r w -6 110 r w -7 111 r w x

[email protected] 63 Antonio Carrillo Ledesma, Et alii

Page 66: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ �nd / -perm 644

En GNU/Linux, 644 corresponde a permisos de lectura y escritura. Loque signi�ca que este comando buscará todos los archivos que solo tienenpermisos de lectura y escritura. Puedes jugar con esta opción un poco más,así:

$ �nd / -perm -644

Esto mostrará todos los archivos que tengan al menos el permiso 644.

Otras opciones útiles Además de todos estos métodos de búsquedade archivos, hay otras opciones útiles que uno debería recordar. Por ejemplo,para buscar archivos y carpetas vacíos en tu sistema, usa lo siguiente:

$ �nd / -empty

Del mismo modo, para buscar todos los ejecutables guardados en tu disco,utiliza la opción -exec:

$ �nd / -exec

Para buscar archivos legibles, puedes ejecutar el siguiente comando:

$ �nd / -read

Usando el comando Locate En este punto, podrías cuestionar la necesi-dad de tener una alternativa para el comando �nd. Después de todo, hacetodo lo necesario para buscar archivos. Sin embargo, locate es una alternativaútil, ya que es más rápido que �nd para buscar en todo el sistema.Por defecto, GNU/Linux no viene con el comando locate preinstalado.

Para obtener el paquete, ejecuta los siguientes comandos en tu terminal:

# apt install mlocate

Ahora que has adquirido locate, puedes usarlo para buscar archivos así:

$ locate archivo

[email protected] 64 Antonio Carrillo Ledesma, Et alii

Page 67: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Puedes usar el argumento -b para una búsqueda más especí�ca. Solobuscará el "nombre base" del archivo, enumerando efectivamente solo losarchivos que tienen el término de búsqueda en lugar de devolver los directoriosque conducen a los archivos.

$ locate -b archivo

Otros argumentos disponibles incluyen:

-e muestra entradas de archivos existentes en el momento en quese ejecuta el comando locate.

-q inhabilita la visualización de errores encontrados en el procesode búsqueda.

-c muestra la cantidad de archivos que coinciden, en lugar de losnombres de los archivos

El comando locate estándar a veces puede mostrar archivos que han sidoeliminados. Esto se debe a que el comando locate busca en la base de datosprincipal del sistema operativo GNU/Linux. Si esa base de datos no seactualiza, incluso los archivos eliminados pueden aparecer en los resultadosde búsqueda. Puedes actualizar manualmente la base de datos ejecutando losiguiente:# updatedb

3.4 Monitorear el Desempeño

Existen múltiples herramientas para ser usadas en línea de comandos y am-biente grá�co que permiten monitorear el desempeño y uso de una computa-dora con GNU/Linux, estas se pueden usar para administrar el sistema ylas comunicaciones por red, estos comandos están disponibles en todas lasdistribuciones de GNU/Linux y son normalmente usados para determinarproblemas de desempeño en nuestro sistema de cómputo. Algunos comandosson utilizados por cualquier usuario y otros solo por el administrador.

lscpu Para conocer el tipo de CPU y sus características podemos usartambién cat /proc/cpuinfo, si deseamos un análisis más detallado están loscomandos:

lscpi, cpuid, dmidecode, inxi, hardinfo, lshw, hwinfo, nproc

[email protected] 65 Antonio Carrillo Ledesma, Et alii

Page 68: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

free Despliega la memoria total, usada, compartida, en Cache y libredel sistema.

df Despliega las particiones reales y lógicas, tamaño, espacio disponible,usado y punto de montaje de los discos en el sistema. Otra variante es:

dfc

du Despliega el uso de disco de la carpeta actual y sus subcarpetas.

top Muestra el desempeño de nuestro equipo actualizando cada segundoel uso del CPU, Memoria, Swap, Cache, Bu¤er y los procesos que estáncorriendo en el sistema actualmente y en cada proceso que corre, se muestrael identi�cador, el porcentaje de CPU y memoria usada. Otras variantes son:

htop, glances, conky, nmon, atop, gtop, ps, mpstat, collectl,sar, pstree, killall, Linux Process Viewer, etc.

dstat Muestra las estadísticas de recursos de todo el sistema de formaversátil en tiempo real, combina la capacidad de comandos como iostat, vm-stat, netstat e ifstat. Otras opciones son:

dstat, nload, collectl, iptraf, iftop, mtr, bmon, slurn, tcptrack,nethogs, monitorix, nmon, glances

vmstat Muestra las estadísticas de la memoria virtual, hilos del Kernel,uso de discos, procesos del sistema, entradas y salidas de bloque, interruptoresy actividad del CPU, entre otras opciones, este comando esta contenido enel paquete systat. Otras opciones son:

dstat, sar, vnstat, mpstat, iostat, iotop, top, collectl, nmon,glances

netstat Permite monitorizar los paquetes de red que entran y salen,genera estadísticas de su uso, es un paquete que permite encontrar problemasde desempeño en las comunicaciones de red. Otras opciones son:

dstat, collectl, iptraf, iftop, ifstat, mtr, nethogs, monitorix,nmon, bwm-ng, cbm, speedometer, pkstat, netwatch, trafshow,netload, glances

[email protected] 66 Antonio Carrillo Ledesma, Et alii

Page 69: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

iotop Permite conocer qué procesos están generando actividades de lec-tura y grabación en los discos del sistema, así es posible conocer qué procesosestán sobrecargando el sistema. Otras opciones son:

iostat, vmstat, htop, glances, netdata, netstat, nmon, collectl,glances

iostat Este permite conocer estadísticas de uso del sistema de entrada/salidaincluyendo dispositivos, discos locales, discos remotos tales como NFS ySAMBA. Otras opciones son:

iotop, dstat, nfsstat, ifstat, atop, nmon, collectl, glances

lsof Permite conocer la lista de archivos abiertos además de SocketsNetwork, Pipes, Dispositivos y procesos. Su principal uso es conocer quéproceso tiene un disco que no se puede desmontar y manda un error de queun archivo esta siendo usado o está abierto.

tcpdump Es uno de los comando más usados para analizar paquetesde red y es usado para capturar o �ltrar paquetes TCP/IP que se reciben ose trans�eren en una interfaz de red especi�ca. También permite grabar lospaquetes capturados para un análisis posterior. Otras opciones son:

arpwatch, suricata, wireshark, vnstat, negios, collectl, glances

3.5 Compresores y Descompresores de Archivos

Para manejar de manera óptima y fácil un conjunto de archivos es necesarioagruparlos y/o compactarlos, existen múltiples programas para tal efectocomo tar, gzip, bz2, zip, lha, arj, zoo, rar y su uso básico es el siguiente:Para instalar los programas más comunes en Debian GNU/Linux usar:

# apt install gzip unzip zip pbzip2 bzip2 lbzip2 arj zoo unrarlhasa ncompress p7zip p7zip-full p7zip-rar unace-nonfree unacezutils cpio pax unp lzma xz-utils pxz pixz kgb rar rarcrack zpaqbsdtar zstd

[email protected] 67 Antonio Carrillo Ledesma, Et alii

Page 70: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Para respaldar un grupo de archivos y/o directorios en formato tar, usa-mos:

$ tar -cvf nombre.tar directorio

para restaurar, usamos:

$ tar -xvf nombre.tar

también podemos integrarlo en un programa BASH como el mostrado en(véase 3.10).

Para respaldar y compactar un grupo de archivos y/o directorios en for-mato tar.gz, usamos:

$ tar -cvf nombre.tar directorio$ gzip �best nombre.tar

o usamos:

$ tar -zcvf nombre.tar.gz directorio

o usamos:

$ tar -jcvf nombre.tar.bz2 directorio

para restaurar, usamos:

$ gunzip nombre.tar.gz$ tar -xvf nombre.tar

o usamos:

$ tar -zxvf nombre.tar.gz

o usamos:

$ tar -jxvf nombre.tar.bz2

Para compactar archivos y/o directorios al formato gzip, usamos:

[email protected] 68 Antonio Carrillo Ledesma, Et alii

Page 71: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ gzip �cheros

y para descompactarlo usamos:

$ gzip -d �chero.gz

o

$gunzip �chero.gz

Para compactar archivos y/o directorios al formato bz2, bz, tbz2 tbz obzip2, usamos:

$ bzip2 �cheros

y para descompactarlo usamos:

$ bzip2 -d �chero.bz2

podemos descomprimir usando el comando bzcat mediante:

bzcat -dc �chero.bz2

o bien descomprimir usando el comando bunzip2 mediante:

bunzip2 �chero.bz2

Para respaldar y compactar un grupo de archivos y/o directorios al for-mato zip, usamos:

$ zip -r archivo.zip �cheros

para descompactar el contenido, usamos:

$ unzip archivo.zip

si deseamos conocer los archivos y directorios que contiene un archivo.zipsin descomprimir, usamos:

$ zipinfo archivo.zip

[email protected] 69 Antonio Carrillo Ledesma, Et alii

Page 72: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

si al descompactar existe algún error, es posible recuperar parte de losarchivos mediante:

$ zip -F archive.zip -O archive-�xed.zip

o usar -FF, después usar:

$ jar xvf archive-�xed.zip

otra alternativa es usar:

$ bsdtar xf archivo.zip

Para respaldar y compactar un grupo de archivos y/o directorios en for-mato 7-zip, usamos:

$ 7z a archivo.7z �cheros

para restaurar usamos:

$ 7z e archivo.7z

Para respaldar y compactar un grupo de archivos y/o directorios en for-mato zst, usamos:

$ zstd �cheros -o archivo.zst

para restaurar usamos:

$ zstd -d archivo.zst

o usamos:

unzstd archivo.zst

Para respaldar y compactar un grupo de archivos y/o directorios en for-mato lha, usamos:

$ lha a archivo.lha �cheros

[email protected] 70 Antonio Carrillo Ledesma, Et alii

Page 73: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

para restaurar usamos:

$ lha x archivo.lha

Para respaldar y compactar un grupo de archivos y/o directorios en for-mato arj, usamos:

$ arj a archivo.arj �cheros

para restaurar usamos:

$ arj x archivo.arj$ unarj archivo.arj

Para respaldar y compactar un grupo de archivos y/o directorios en for-mato zoo, usamos:

$ zoo a archivo.zoo �cheros

para restaurar usamos:

$ zoo x archivo.zoo

Para respaldar y compactar un grupo de archivos y/o directorios al for-mato rar, usamos:

$ rar a archivo.rar �cheros

para restaurar usamos:

$ rar x archivo.rar$ unrar archivo.rar

En algunos casos, archivos rar de Windows no es posible descomprimirloscorrectamente en Linux, para descomprimirlos podemos descargar utileríasGNU para Win32 de:

[email protected] 71 Antonio Carrillo Ledesma, Et alii

Page 74: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

http://unxutils.sourceforge.net/

entre ellas, descargar unrar (es un sólo archivo zip) de la direccion:

http://sourceforge.net/projects/unxutils/

ahora usando Wine es posible descomprimir los archivos desde Linux me-diante:

$ wine unrar.exe e archivo.rar

Para descomprimir archivos rar o zip rotos, usar:

$ unrar e -kb -y nombreArchivo.rar

o usamos:

$ bsdtar xf nombreArchivo.zip

Existe un programa llamado unp que permite descomprimir de casi cual-quier formato, su uso es de lo más sencillo, a saber:

$ unp archivoCompactado

Cuando se tiene una lista de archivos de distintas trayectorias o es re-sultado de una búsqueda, para compactar es preferible usar a�o. Podemosinstalarlo usando:

# apt install a�o

Para compactar, digamos todos los archivos *.?pp (programas de C++)usar:

$ �nd . -name *.?pp j a�o -o -Z fuentes

para descompactarlos, usar:

$ a�o -i -Z fuentes

[email protected] 72 Antonio Carrillo Ledesma, Et alii

Page 75: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Si se desea compactar usando GZIP, usar:

$ cat lista j a�o -o -Z -G 9 fuentes

Si se desea ver el listado de archivos que contiene fuentes, usar:

$ a�o -t fuentes

Si se desea compactar y mandar a otra máquina usar:

$ �nd . -name *.?pp j a�o -o -Z user@servidor%ssh:fuentes

Como el uso de a�o no necesita extensión en el archivo, para descom-pactarlo de cualquier formato es recomendable usar unp, este escoge el mejormétodo para el archivo en cuestión:

$ unp archivoCompactado

3.6 Copiar Archivos entre Equipos

Para transmitir archivos y/o directorios de una máquina a otra es recomen-dable usar el comando scp de Linux que trabaja con SSH, este tiene unasintaxis similar al del comando cp, con la salvedad que es necesario indicar elusuario, la máquina y el subdirectorio de trabajo del archivo y/o directoriopara el destino, fuente o ambos.

Por ejemplo, si se desea transmitir un archivo a una máquina HOST conusuario usr, en el directorio ~/Datos/ estando en sesión en otra máquina, seusa la siguiente sintaxis:

$ scp archivo.dat usr@HOST:~/Datos/

Si se desea transmitir un subdirectorio a la máquina HOST, en el direc-torio home del usuario (denotado con .), se usa la siguiente sintaxis:

$ scp -r Directorio usr@HOST:.

[email protected] 73 Antonio Carrillo Ledesma, Et alii

Page 76: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Si se desea copiar un archivo de una máquina remota a nuestra máquina,usamos:

$ scp usr@HOST:/home/user/archivo /home/local-username/carpeta

o de forma alternativa usamos (. indica el directorio donde el usuario seencuentra):

$ scp user@HOST:/home/user/archivo .

Si se desea copiar de una máquina remota a otra máquina remota, usamos:

$ scp user1@HOST1:/home/user1/archivo user2@HOST2:/home/user2/

Si se desea transferir multiples archivos podemos usar:

$ scp �le1.txt �le2.txt user@HOST:/home/user/

o de forma alternativa usamos (. indica el directorio donde el usuario seencuentra):

$ scp user@host:/home/user/n{�le1.txt,�le2.txtn} .

En el caso que se quiera limitar el ancho de banda en la transmisión dearchivos por scp, usar:

$ scp -l 400 user@server:/home/user/* .

En el caso de que se desee usar otro puerto distinto al de imisión (22)usar:

$ scp -P 4455 �le.txt user@HOST:/home/user/�le.txt

En el caso de querer incrementar la velocidad de transferencia en el usode scp, la opción más viable es el cambiar la encriptación usada por omisiónpor otras como 3des-cbc, aes128-cbc, aes192-cbc, aes256-cbc, aes-128-ctr,aes192-ctr, eas256-ctr, arcfour256, arcfour, blow�sh-cbc y cast128-cbc medi-ante:

[email protected] 74 Antonio Carrillo Ledesma, Et alii

Page 77: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ scp -c blow�sh user@server:/home/user/�le .

o de forma alternativa usamos:

$ scp -c arcfour256 user@HOST:/home/user/�le .

Si se desea que no se muestre información de la transferencia de losarchivos al usar scp usar:

$ scp -q SourceFile user@HOST:/home/user/TargetFile

o si desea ver más información en la transferencia usar:

$ scp -v SourceFile user@HOST:/home/user/TargetFile

Si se instala sshpass, entonces hacemos:

$ sshpass -p "your_password" scp -r backup_user@target_ip:/home//backup/$name

Si se trabaja en varias máquinas y se desea tener sincronizada una omás carpetas, una opcion es usar rsync conjuntamente con ssh, este permitetrasmitir solo aquello que ha cambiado, minimizando las comunicaciones,esto se puede hacer mediante el comando ssh, por ejemplo, supongamos quese esta en la máquina y quiere tener sincronizada la carpeta <carpeta> conmas de un equipo, mediante ssh usando un puerto <puerto>, en la máquinay usario, usar:

$ rsync �partial �recursive �links �hard-links �times �verbose�delete �stats <carpeta> -e �ssh -p <puerto>�usr@maquina:.

por supuesto esto puede hacerse en cualquier dirección, i.e. de la máquinaremota a nuestra máquina o viceversa. Además de poder usar rsync de ma-nera local, por ejemplo para hacer respaldos de una parte o todos nuestrosarchivos en nuestra cuenta y solo actualizar aquellos archivos que han cam-biado desde la última actualización, usamos:

[email protected] 75 Antonio Carrillo Ledesma, Et alii

Page 78: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ rsync �partial �recursive �links �hard-links �times �verbose�delete �stats <carpeta> .

en este caso se sincronizaría el contenido de la carpeta <carpeta> ennuestra trayectoria actual.

Además existe pssh que permite transferir o copiar archivos a múltiplesservidores en Linux con un mismo comando:

� pscp - es una utilería para copiar archivos en paralelo a múltiplesequipos

� prsync - es una utilería para transferir de forma e�ciente archivos entremúltiples equipos en paralelo

� pnuke - permite concluir procesos en múltiples equipos en paralelo

� pslurp - permite copiar archivos de múltiples equipos a un equipo cen-tral en paralelo

Si creamos un archivo hosts.txt, con los IPs como el siguiente:

192.168.0.3:22192.168.0.9:22

podemos usar para copiar un archivo a múltiples servidores:

$ pscp -h hosts.txt -l USR -Av wine-1.7.55.tar.bz2 /tmp/

o de forma alternativa usamos:

$ pscp.pssh -h hosts.txt -l USR -Av wine-1.7.55.tar.bz2 /tmp/

donde:

-h indica que se lean los IPs del archivo indicado-l se indica el usuario a usar en todos los equipos.-A solicita el password para ser enviado a ssh-v visualiza las operaciones y mensajes que genera el comando

[email protected] 76 Antonio Carrillo Ledesma, Et alii

Page 79: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Podemos copiar directorios a múltiples servidores, usando:

$ pscp -h myscphosts.txt -l USR -Av -r Androidn Games//tmp/

o de forma alternativa:

$ pscp.pssh -h myscphosts.txt -l USR -Av -r AndroidnGames//tmp/

3.7 ¿Qué hacer para que mi GNU/Linux sea más se-guro?

La mejor opción, es elegir una distribución de Linux que nos permita man-tener el sistema actualizado, instalar sólo los paquetes que necesitamos yque estos provengan de una fuente con�able, además de encriptar las par-ticiones del sistema operativo y de datos del usuario. Varias versiones deLinux satisfacen los requerimientos anteriores, nosotros preferimos usar De-bian GNU/Linux en su versión estable.También, podemos tratar de mantener nuestros datos fuera de miradas

indiscretas usando gocryptfs en las máquina a las que tengamos acceso (in-cluso del super usuario root)19. Además, podemos respaldarlos y transportar-los manteniendo estos siempre encriptados y que sea casi transparente paranosotros el uso de dicho programa, para ello es necesario instalarlo, medianteel uso de:

# apt install gocryptfs

Después, es necesario crear los directorios para guardar los datos encrip-tados (por ejemplo en el directorio ~/.encriptados) y los desencriptados (porejemplo en el directorio ~/desencriptados), mediante:

$ mkdir -p ~/.encriptados ~/desencriptados

19Existen múltiples proyectos � algunos multiplataforma� que permiten hacer lo mismoque gocryptfs como son: encfs, ecrptfs, cryptomator, securefs y CryFS, entre otros.

[email protected] 77 Antonio Carrillo Ledesma, Et alii

Page 80: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Para inicializar y montar el directorio20 para guardar datos encriptados(en el directorio ~/.encriptados) y los desencriptados (en el directorio ~/des-encriptados), lo hacemos mediante:

$ gocryptfs ~/.encriptados ~/desencriptados

Desmontamos al terminar de usar la carpeta, usando:

$ fusermount -u ~/desencriptados

De esta forma, la carpeta virtual ~/desencriptados mostrará nuestrosdatos desencriptados, solo visibles para el usuario que monta la carpeta (nopara root) y la carpeta ~/.encriptados, contendrá nuestros datos de formaencriptada21, esta carpeta puede ser copiada, respaldada y restaurada aúnestando montada, manteniendo el anonimato de nuestros archivos.

Encriptar con GnuPG GnuPG es una herramienta en linea de co-mandos de seguridad en comunicaciones electrónicas en donde se utilizacriptografía de clave pública para que los usuarios puedan comunicarse deun modo seguro. En un sistema de claves públicas cada usuario posee unpar de claves, compuesto por una clave privada y una clave pública. Cadausuario debe mantener su clave privada secreta; no debe ser revelada nunca.La clave pública se puede entregar a cualquier persona con la que el usuariodesee comunicarse. GnuPG implementa un esquema algo más so�sticado enel que un usuario tiene un par de claves primario, y ninguno o más de un parde claves adicionales subordinadas. Los pares de claves primarios y subordi-nados se encuentran agrupados para facilitar la gestión de claves, y el grupopuede ser considerado como un sólo par de claves.Dentro de las funciones de GnuPG se incluyen generar un par de claves,

intercambiar y comprobar la autenticidad de claves, cifrar y descifrar docu-mentos, etc. Para instalar el paquete GnuPG, usamos:

# apt install gnupg

20La primera vez pedirá la clave y su con�rmación, las demás veces sólo la clave. Sepueden crear tantas carpetas independientes con gocyptfs como se requieran y el cualquierparte del sistema de archivos al que tengamos acceso.21El nombre de los archivos tienen un límite, por ello hay que tenerlo en cuenta si se

usan nombre largos en el sistema de archivos (el límite aproximado es 255 caracteres),pero no importa el número de archivos o carpetas almacenadas internamente.

[email protected] 78 Antonio Carrillo Ledesma, Et alii

Page 81: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

La opción de la línea de comandos --gen-key se usa para generar un nuevopar de claves primario, mediante:

$ gpg --gen-key

GnuPG es capaz de crear varios tipos diferentes de pares de claves, perodebe existir una clave primaria capaz de generar �rmas. Al momento deejecutar el programa, este pide22 nombre, correo del usuario y contraseña23,para después generar la clave.

Para poder comunicarse con otros, el usuario debe intercambiar las clavespúblicas. Para obtener una lista de las claves en el �chero («anillo» ) declaves públicas, se puede usar la opción de la línea de comandos --list-keys,mediante:

$ gpg --list-keys

Para poder enviar una clave pública a un interlocutor, antes hay queexportarla. Para ello se usará la opción de la línea de comandos --export. Esnecesario un argumento adicional para poder identi�car la clave pública quese va a exportar, por ejemplo:

$ gpg --output antonio.gpg --export [email protected]

La clave se exporta en formato binario, y esto puede no ser convenientecuando se envía la clave por correo electrónico o se publica en una páginaWeb. Por tanto, GnuPG ofrece una opción de la línea de comandos --armorque fuerza que la salida de la orden sea generada en formato armadura-ASCII,parecido a los documentos codi�cados con UUEncode. Por regla general,cualquier salida de una orden de GnuPG, v.g. claves, documentos cifrados y�rmas, pueden ir en formato armadura-ASCII añadiendo a la orden la opción--armor, por ejemplo:22Según la versión de GnuPG puede solicitar otros datos como: el tipo de clave, longitud,

cuando expira esta, entre otros posibles datos de con�guración.23Cuanto más larga sea la contraseña, más segura será contra ataques de «fuerza bruta» .

No hay límite para la longitud de una contraseña, y esta debe ser escogida con sumocuidado. Desde un punto de vista de seguridad, la contraseña que desbloquea la claveprivada es uno de los puntos más débiles en GnuPG (y en otros sistemas de cifrado declave pública), ya que es la única protección que tiene el usuario si alguien se apoderarade su clave privada. Para una contraseña lo ideal es que no se usen palabras de undiccionario, y que se mezclen mayúsculas y minúsculas, dígitos, y otros caracteres. Unabuena contraseña es crucial para el uso seguro de GnuPG.

[email protected] 79 Antonio Carrillo Ledesma, Et alii

Page 82: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ gpg --armor --output antonio.gpg --export [email protected]

Cada clave pública y privada tiene un papel especí�co en el cifrado ydescifrado de documentos. Se puede pensar en una clave pública como enuna caja fuerte de seguridad. Cuando un remitente cifra un documentousando una clave pública, ese documento se pone en la caja fuerte, la caja secierra, y el bloqueo de la combinación de esta se gira varias veces. La partecorrespondiente a la clave privada, esto es, el destinatario, es la combinaciónque puede volver a abrir la caja y retirar el documento. Dicho de otro modo,sólo la persona que posee la clave privada puede recuperar un documentocifrado usando la clave pública asociada al cifrado.Con este modelo mental se ha mostrado el procedimiento de cifrar y

descifrar documentos de un modo muy simple. Si el usuario quisiera cifrarun mensaje para Javier, lo haría usando la clave pública de Javier, y lodescifraría con su propia clave privada. Si Javier quisiera enviar un mensajeal usuario, lo haría con la clave pública del usuario, y este lo descifraría consu propia clave privada.

Para cifrar un archivo se usa la opción --encrypt. El usuario debe tener lasclaves públicas de los pretendidos destinatarios. El programa espera recibircomo entrada el nombre del archivo que se desea cifrar o, si este se omite, unaentrada estándar. El resultado cifrado se coloca en la salida estándar o dondese haya especi�cado mediante la opción --output. El archivo se comprimecomo medida adicional de seguridad, aparte de cifrarlo, por ejemplo:

$ gpg --output doc.gpg --encrypt --recipient [email protected] doc

La opción --recipient se usa una vez para cada destinatario, y lleva unargumento extra que especí�ca la clave pública con la que sería cifrado elarchivo. El archivo cifrado sólo puede ser descifrado por alguien con unaclave privada que complemente una de las claves públicas de los destinatarios.El usuario, en este caso el remitente, no podría descifrar un archivo cifradopor sí mismo a menos que haya incluido su propia clave pública en la listade destinatarios.

Para descifrar un archivo se usa la opción --decrypt. Para ello es necesarioposeer la clave privada para la que el archivo ha sido cifrado. De igual modoque en el proceso de cifrado, el archivo a descifrar es la entrada, y el resultadodescifrado la salida, por ejemplo:

[email protected] 80 Antonio Carrillo Ledesma, Et alii

Page 83: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ gpg --output doc --decrypt doc.gpg

También es posible cifrar archivos sin usar criptografía de clave pública.En su lugar, se puede usar sólo una clave de cifrado simétrico para cifrar elarchivo. La clave que se usa para el cifrado simétrico deriva de la contraseñadada en el momento de cifrar el documento, y por razones de seguridad,no debe ser la misma contraseña que se esta usando para proteger la claveprivada. El cifrado simétrico es útil para asegurar archivos cuando no seanecesario dar la contraseña a otros. Un archivo puede ser cifrado con unaclave simétrica usando la opción --symmetric, por ejemplo:

$ gpg --output doc.gpg --symmetric doc

3.8 VNC y el Acceso a Escritorios Remotos yMáquinasVirtuales

Con el propósito de que el usuario que tengan acceso a un equipo de cómputo,tableta, teléfono inteligente, Chromebook o dispositivo con red, puedan usarlos ambientes computacionales que se tienen instalados en un equipo deter-minado, se ha desarrollado el servidor de computación virtual en red VNC(Virtual Network Computing) que permite visualizar la salida grá�ca (deun sistema operativo en múltiples equipos o diversos sistemas operativos enun mismo equipo) por medio de red (aún si la velocidad es baja) usando elinternet.VNC es un programa de Software libre basado en una estructura cliente-

servidor que permite interactuar con el servidor remotamente a través deun dispositivo que disponga de un cliente VNC (Windows, Linux, MacOS,Android, Raspberry PI, IOS, Chrome, Solaris, HP-UX, AIX) compartiendola pantalla, teclado y ratón, sin imponer restricciones del equipo servidor conrespecto al del cliente (también conocido como Computación en la Nube).Para poder interactuar con el escritorio remoto o máquina virtual medi-

ante VNC en cualquier sistema operativo es necesario instalar algún clientegrá�co de VNC, por ejemplo:En Windows, bajar e instalar el paquete24:

https://www.realvnc.com/es/connect/download/vnc/windows/

24Otra opción es: https://www.tightvnc.com/

[email protected] 81 Antonio Carrillo Ledesma, Et alii

Page 84: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

En Debian GNU/Linux (Ubuntu), para instalar usar25:

# apt install xtightvncviewer

no se requiere ninguna con�guración adicional para su uso.

¿Qué se puede o no se puede hacer en VNC? Puede hacer desdeun equipo remoto cualquier cosa (salvo escuchar el audio, aunque hay proyec-tos trabajando en ello) que sea posible hacer sentado delante de un equipo,así como utilizar el teclado y el ratón. No se pueden controlar de forma re-mota dispositivos Apple iOS y Android desde un equipo de escritorio, aunquesí lo contrario.En el eqipo Linux se pueden crear cuentas individuales, compartidas y

para grupos de trabajo. Además de emular diversas arquitecturas (x86_64,PowerPC, Sparc32 y 64, MIPS, ARM, ColdFire, Cris, MicroBlaze, SH4,Xtensa, entre otros) y sus respectivos procesadores; permitiendo la ejecuciónde máquinas virtuales para ser usadas en forma monousuario o multiusuario.Para proporcionar el servicio de VNC usamos TigerVNC (tightvncserver),

es una implementación de VNC neutra, independiente, de alto rendimientoy de código abierto. Es una aplicación cliente-servidor que permite a losusuarios iniciar e interactuar con aplicaciones grá�cas en máquinas remotasy/o máquinas virtuales basadas en QEMU/KVM.A diferencia de otros servidores VNC como VNCX o Vino que se conectan

directamente con el escritorio en tiempo de ejecución, tigervnc-vncserver uti-liza un mecanismo diferente que con�gura un escritorio virtual independi-ente para cada usuario. Es capaz de ejecutar aplicaciones de vídeo y 3D,tratando de mantener una interfaz de usuario coherente y reutilizar compo-nentes, donde sea posible, a través de las diversas plataformas que admite.Además, ofrece seguridad a través de una serie de extensiones que implemen-tan métodos avanzados de autenticación y cifrado TLS.Por ejemplo, cada usuario que disponga de una cuenta en algún servidor

puede usar máquinas virtuales y compartir su escritorio de forma remota sinencriptación. Para ello hay que acceder al servidor usando SSH (Secure Shell,suponiendo la dirección 192.168.13.230)26, mediante:

25Otras opciones son: tigervnc-viewer, krdc para KDE, vinagre para GNOME26O si lo desea, puede usar MOSH (Mobile Shell) como medio de conexión (no corta la

comunicación por inactividad, en SSH), usar:

[email protected] 82 Antonio Carrillo Ledesma, Et alii

Page 85: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ ssh [email protected]

Una vez iniciada la sesión, es necesario levantar el servidor de VNC (enalgún puerto del rango 20 en adelante -equivalente al puerto 5920-), usandopor ejemplo:

$ vncserver :3027

la primera vez pedirá la clave de acceso (de 8 caracteres) y su con�rmación(en caso de que el puerto este ocupado, use otro e intente nuevamente levantarel servidor). Es posible lanzar tantos escritorios remotos como sea necesariousando distintos puertos en el servidor de VNC, en cada uno de ellos verá unescritorio propio, pero compartirán el directorio de trabajo así como la clavede acceso.Después de seguir estos pasos, ya es posible conectarse desde cualquier

equipo con algún cliente de VNC, usando por ejemplo el puerto 30 (equiva-lente a 5930):

$ vncviewer :30

Cuando ya no se requiera el servidor de VNC, hay que conectarse denuevo al servidor mediante SSH o MOSH y �nalizar el servidor de VNC delpuerto o puertos levantados, mediante:

$ vncserver -kill :30

Si requiere hacer uso de encriptación en la comunicación del servidorVNC con su equipo, es necesario hacer algunos pasos adicionales. Primerodebemos lanzar el servidor VNC, pero este debe ser sólo local al servidor,mediante:

$ vncviewer -localhost :30

$ mosh [email protected]

27Por omisión se usan 32 bits por cada pixel, esto puede resultar muy pesado paraconexiones de internet lentas, por ello se suguiere usar 24,16 u 8 bits por pixel, medianteel uso de:

$ vncserver -depth 16 :30

[email protected] 83 Antonio Carrillo Ledesma, Et alii

Page 86: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

En la máquina en la que se usará el cliente de VNC, lanzar la tunelizacióndel cliente usando SSH, mediante:

$ ssh -L 5930:localhost:30 -N -f -l usuario 132.248.181.216

y lanzar el visualizador de VNC, mediante:

$ vncviewer localhost:3028

Cuando ya no se requiera el servidor de VNC, hay que conectarse denuevo al servidor mediante SSH o MOSH y terminar el servidor de VNC,mediante:

$ vncserver -kill :30

Si requiere de información adicional de algunos clientes de VNC (paraWindows, Linux, MacOS, Android, Raspberry PI, IOS, Chrome, Solaris,HP-UX, AIX) puede consultarlos en:https://www.realvnc.com/es/connect/download/vnc/https://www.geckoand�y.com/23203/vnc-client-viewer-windows-mac-linux/https://lifehacker.com/the-best-vnc-client-for-android-5838717https://www.tecmint.com/best-remote-linux-desktop-sharing-software/https://www.lifewire.com/vnc-free-software-downloads-818116https://thelinuxcode.com/vnc-viewer-client/https://www.howtogeek.com/142146/how-to-use-google-chrome-to-remotely-

access-your-computer/

28Por omisión se usan 32 bits por cada pixel, esto puede resultar muy pesado paraconexiones de internet lentas, por ello se suguiere usar 24,16 u 8 bits por pixel, medianteel uso de:

$ vncserver -depth 16 localhost:30

[email protected] 84 Antonio Carrillo Ledesma, Et alii

Page 87: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

3.9 Desde la Nube

Existen diferentes servicios Web29 que permiten instalar, con�gurar y usarcientos de sistemas operativos Linux y Unix � máquinas virtuales usandoservicios Web en Debian GNU/Linux y QEMU (véase sección 13)� desde elnavegador, esto en aras de que los usuarios que cuenten con algún sistema deacceso a red y un navegador puedan usar, con�gurar e instalar algún sistemaoperativo y su respectiva paquetería sin hacer instalación alguna en su equipode cómputo, tableta o teléfono celular30.Una muestra de estos proyectos son: Distrotest (https://distrotest.net) y

JSLinux (https://bellard.org/jslinux).

Algunas versiones listas para usar son:4mLinux, AbsoluteL inux, Academ ix, A lp ineL inux, Antergos, antiX Linux, Aptosid , A rchBang, A rchLabs, A rch linux,

A rchman, ArchStrike, A rcoL inux, A rtixL inux, A ryaL inux, AV Linux, BackBoxLinux, B igL inux, B io-L inux, B lackArch ,

B lackLab, B lackPantherOS, B lackSlash , b lag, B lankOn, B luestar, Bodhi, BunsenLabs, ByzantineOS, Caine, Calcu late

L inux Desktop , CentOS, Chakra, ChaletOS, C learOS, C lonezilla , ConnochaetOS, Cucumber, Damn Small L inux, Damn

Small L inux Not, Debian , DebianEdu, deep in , DEFT , Devil-L inux, Devuan, D ragonF ly BSD , Dragora, DuZeru , Dyne:b olic ,

Edubuntu , elem entaryOS, E live L inux, Emmabuntüs, Emm i OS, Endless OS, EnsoOS, Exe GNU/Linux, ExT iX , Fat-

dog64, Fedora Atom ic, Fedora Server, Fedora Workstation , FerenOS, FreeBSD , FreeDOS, Frugalware, G4L, G eckoL inux,

G entoo, GNewSense, GoboL inux, Gparted , G reen ieL inux, GRML, GuixSD , Haiku , Heads, Kali L inux, Kanotix , KaOS,

Knoppix , Kodach i, KolibriOS, Korora, Kubuntu , Kwort, L inux L ite, L inux M int, L iveRaizo, LMDE, Lubuntu , LXLE

OS, Macpup, M ageia , M akuluL inux, M anjaro, M atriux, M auiL inux, M enuetOS, M inerOS, M in iNo, M odicia , Musix , MX

Linux, Nas4Free, Neptune, NetBSD , Netrunner, N ixO s, NST , NuTyX , OpenInd iana, Op enMandriva, op enSUSE , O ra-

cleL inux, OSGeo live, OviOS, Parab ola CLI, Parab ola LXDE, Pardus, Parrot Home, Parrot Security, Parrot Studio , Par-

six , PCLinuxOS, PeachOSI, Pentoo, Pepp erm int, Pepp erm intOS, P inguy, P inguyOS, p lopL inux, PointL inux, Pop!_OS,

PORTEUS, Puppy Linux, PureOS, Q4OS, Qub esOS, Quirky, Raspb erry P i Desktop , ReactOS, Redcore, Rescatux, Reven-

geOS, RoboL inux, Rockstor, ROSA FRESH , Runtu , Sabayon, SalentOS, Salix , Scienti�cL inux, S iduction , S lackware, S lax ,

S liTaz, Solus, SolydK , SolydX , SparkyL inux, Springdale, Stresslinux, SubgraphOS, SwagArch , Tails, Tanglu , T iny Core,

Trisquel, TrueOS, TurnKey Linux, Ubuntu , Ubuntu Budgie, Ubuntu Studio , UbuntuKylin , U ruk, VectorL inux, V ineL inux,

VoidL inux, Voyager, VyOS, WattO s, Xubuntu , Zentyal, Zenwalk , Zevenet, Zorin OS

29Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnitopara no guardar el historial de navegación, información introducida en los formularios yborrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitiosWeb que visitamos sí guardan información de nuestra visita, nuestro proveedor de internettambién guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igualque el historial de descargas, además de las marcas de páginas o favoritos se conservaránal cerrar el navegador.30Estos servicios son conocidos como computación en la nube (Cloud Computing).

[email protected] 85 Antonio Carrillo Ledesma, Et alii

Page 88: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Terminales de Linux en la Web

� https://www.tutorialspoint.com/execute_bash_online.php

� http://www.webminal.org/

� https://bellard.org/jslinux/

� https://codeanywhere.com/

� https://copy.sh/v86/

� https://www.masswerk.at/jsuix/

� https://linuxcontainers.org/lxd/try-it/

� http://cb.vu/

Editores BAHS en la Web

� https://www.shellcheck.net/

� https://www.learnshell.org/

� https://www.tutorialspoint.com/execute_bash_online.php

� https://paiza.io/en/projects/new?language=bash

� https://www.jdoodle.com/test-bash-shell-script-online

� http://rextester.com/l/bash_online_compiler

Usar Linux en Dispositivos Android En los dispositivos Android esposible usar un simulador de la línea de comandos del Shell usado en Linux, deforma que podremos introducir todos los comandos habituales para trabajardesde ahí en la comunidad de nuestra terminal Android. Uno de los paquetesmás completo es:

https://termux.com

El paquete cuenta con una página Wiki en:

https://wiki.termux.com

[email protected] 86 Antonio Carrillo Ledesma, Et alii

Page 89: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Usando este paquete, las aplicaciones instaladas disponen de varias mejo-ras respecto al clásico Android Terminal Emulator, como el hecho de teneracceso a una gran biblioteca de paquetes de Linux para instalar desde la ter-minal (usando el comando apt (véase sección 3.11)), así como algunos atajosde teclado transformados en combinaciones con los botones físicos de volu-men y apagado de la terminal. Igualmente, es compatible con todo tipo deteclados físicos externos. Siendo posible trabajar con lenguajes como NodeJ,Rubi, Python, C y paquetes como Nano, Vi, SSH, Git, Subversion, zsh Shell,etc.

Usar Linux en Formato Live Linux es uno de los sistemas operativospioneros en ejecutar de forma autónoma o sin instalar en la computadora,existen diferentes distribuciones Live � descargables para formato CD, DVD,USB� de sistemas operativos y múltiples aplicaciones almacenados en unmedio extraíble, que pueden ejecutarse directamente en una computadora,estos se descargan de la Web generalmente en formato ISO31, una de las listasmás completas de versiones Live esta en:

https://livecdlist.com

En el caso de tener un archivo ISO de algún sistema operativo (por ejem-plo ubuntu-11.10-desktop-i386.iso) y se quiere ejecutar su contenido desdeuna máquina virtual con QEMU/KVM sólo es necesario usar:

$ kvm -m 512 -cdrom ubuntu-11.10-desktop-i386.iso

en este ejemplo usamos en KVM la arquitectura por omisión y memoriade 512 MB (-m 512).

Knoppix es una versión Live ampliamente conocida y completa, esta sepuede descargar de:

http://mmc.geo�sica.unam.mx/Replicas/knoppix/

y usar mediante:

$ kvm -m 1024 -cdrom KNOPPIX_V8.2-2018-05-10-EN.iso

aquí se usa la arquitectura por omisión y memoria de 1024 MB.31Una imagen ISO es un archivo informático donde se almacena una copia exacta de un

sistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB.

[email protected] 87 Antonio Carrillo Ledesma, Et alii

Page 90: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Usar Máquinas Virtuales de Linux Existen diversos proyectos que per-miten descargar decenas de máquinas virtuales listas para ser usadas, paralos proyectos VirtualBox y VMWare (y por ende para KVM/QEMU), estasse pueden descargar de múltiples ligas, algunas de ellas son:

https://www.osboxes.orghttps://virtualboxes.org/images/

Si desargamos y descomprimimos el archivo lubuntu1210.7z (véase sec-ción 13.9), esto dejará la imagen de VirtualBox de LUBUNTU cuyo nom-bre es lubuntu1210.vdi. Entonces esta imagen la usaremos directamente enKVM/QEMU, mediante:

$ kvm -m 2000 -hda lubuntu1210.vdi

Nota: esta imagen usa como usuario y clave de acceso: lubuntu/lubuntu

Distribuciones de Sistemas Operativos Existen diversos sitios Webque están enfocados a explorar detalladamente cada distribución actual oantigua, a un nivel técnico acompañado de grandes y útiles análisis técnicossobre los mismos, lo que facilita el aprendizaje puntual sobre que distribuciónusar o empezar a usar sin tanta incertidumbre.

� ArchiveOS https://archiveos.org

� Distro Chooser https://distrochooser.de/es/

� Distro Watch https://distrowatch.com

� Linux Distribution List https://lwn.net/Distributions/

3.10 Interprete de Órdenes de Consola BASH

Bash32 es un programa informático, cuya función consiste en interpretar ór-denes, y un lenguaje de consola. Es una shell de Unix compatible con POSIXy el intérprete de comandos por defecto en la mayoría de las distribuciones

32Su nombre es un acrónimo de Bourne-again shell ("shell Bourne otra vez"), haciendoun juego de palabras (born-again signi�ca "nacido de nuevo") sobre la Bourne shell (sh),que fue uno de los primeros intérpretes importantes de Unix.

[email protected] 88 Antonio Carrillo Ledesma, Et alii

Page 91: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

GNU/Linux, además de Mac OS. También se ha llevado a otros sistemascomo Windows y Android.La sintaxis de órdenes de Bash es un superconjunto de instrucciones

basadas en la sintaxis del intérprete Bourne. La especi�cación de�nitivade la sintaxis de órdenes de Bash, puede encontrarse en el Bash ReferenceManual distribuido por el proyecto GNU. Esta sección destaca algunas desus características únicas.La mayoría de los shell scripts33 (guiones de intérprete de órdenes) Bourne

pueden ejecutarse por Bash sin ningún cambio, con la excepción de aquellosscripts del intérprete de órdenes o consola Bourne que hacen referencia avariables especiales de Bourne o que utilizan una orden interna de Bourne.La sintaxis de órdenes de Bash incluye ideas tomadas desde los intérpretesKorn shell (ksh) y C shell (csh), como la edición de la línea de órdenes, elhistorial de órdenes, la pila de directorios, las variables $RANDOM y $PPID,y la sintaxis de substitución de órdenes POSIX : $(...). Cuando se utilizacomo un intérprete de órdenes interactivo, Bash proporciona autocompletadode nombres de programas, nombres de archivos, nombres de variables, etc.,cuando el usuario pulsa la tecla TAB.La sintaxis de Bash tiene muchas extensiones que no proporciona el in-

térprete Bourne. Varias de las extensiones mencionadas se enumeran a con-tinuación:

� Los guiones o scripts de Bash reciben los argumentos que se le pasaal shell como $1, $2, ..., $n. Se puede obtener el número total deargumentos con el símbolo: $#

� Usando $# es posible comprobar el número de argumentos entregadosal guion antes de realizar alguna acción con ellos:

if [ $# -lt 2 ]; thenecho "Necesitas pasar dos argumentos."exit 1

�33Para generar un archivo de BASH o Script, usemos cualquier editor de texto, por

ejemplo nano miScript. En el, la primera línea se acostumbra poner:#"/bin/bashya creado el Script, es necesario hacerlo ejecutable, para ello usamos:$ chmod 755y lo ejecutamos mediante:$ ./miScript

[email protected] 89 Antonio Carrillo Ledesma, Et alii

Page 92: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Otra forma de acceder a los argumentos es a través del array: $@, pormedio del cual se puede iterar sobre todos los argumentos dados:

for arg in "$@"doecho "$arg"

done

� Una gran limitación del intérprete Bourne es que no puede realizarcálculos con enteros sin lanzar un proceso externo. En cambio, unproceso Bash puede realizar cálculos con enteros utilizando la orden((...)) y la sintaxis de variables $[...] de la siguiente manera:

Asigna el valor entero 55 a la variable VAR.

VAR=55

Suma uno a la variable VAR. Observe la ausencia del carácter �$�:

((VAR = VAR + 1))

Otra forma de sumar uno a VAR. Preincremento estilo C:

((++VAR))

Otra forma de sumar uno a VAR. Postincremento estilo C:

((VAR++))

Multiplica la variable VAR por 22 y sustituye la orden por elresultado:

echo $[VAR * 22]

Otra forma de realizar lo mismo:

echo $((VAR * 22))

� La orden: ((...)) también se puede utilizar en sentencias condicionales,ya que su código de retorno es 0 ó 1 dependiendo de si la condición escierta o falsa:

if ((VAR == Y * 3 + X * 2))thenecho Si

�((Z > 23)) && echo Si

[email protected] 90 Antonio Carrillo Ledesma, Et alii

Page 93: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� La orden ((...)) soporta los siguientes operadores relacionales:�==�, �!=�, �>�, �<�, �>=�, y �<=�.

� Manejo de ciclos con el contenido arrojado por algún comando, ejemplo:

for i in $( ls ); doecho item: $i

done

� Manejo de ciclos con una secuencia numérica, ejemplo:

for i in �seq 1 10�;doecho $i

done

� Manejo de ciclos con while, ejemplo:

COUNTER=0while [ $COUNTER -lt 10 ]; doecho The counter is $COUNTERlet COUNTER=COUNTER+1

done

� Manejo de ciclos con until, ejemplo:

COUNTER=20until [ $COUNTER -lt 10 ]; doecho COUNTER $COUNTERlet COUNTER-=1

done

Observación 1 Un proceso Bash no puede realizar cálculos en coma �otante.Las únicas shell Unix capaces de esto son Korn Shell (versión de 1993) y zsh(a partir de la versión 4.0).

[email protected] 91 Antonio Carrillo Ledesma, Et alii

Page 94: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Redirecciones de entrada/salida la sintaxis de Bash permite diferentesformas de redirección de entrada/salida de las que la shell Bourne tradicionalcarece. Bash puede redirigir la salida estandar y los �ujos de error estandara la vez utilizando la sintaxis:

orden >& archivo

que es más simple que teclear la orden Bourne equivalente: "orden >archivo 2>&1". Desde la versión 2.05b, Bash puede redirigir la entradaestandar desde una cadena utilizando la siguiente sintaxis (denominada "herestrings"):

orden <<< "cadena a leer como entrada estandar"

si la cadena contiene espacios en blanco, deben utilizarse comillas.

Funciones como en casi todo lenguaje de programación, puede utilizarfunciones para agrupar trozos de código de una manera más lógica, o practicarel divino arte de la recursión.Declarar una función es sólo cuestión de escribir function mi_func {

mi_código }.Llamar a la función es como llamar a otro programa, sólo hay que escribir

su nombre.

#!/bin/bashfunction salir {exit

}function hola {echo ¡Hola!

}holasalirecho algo

Ejemplo de funciones con parámetros

[email protected] 92 Antonio Carrillo Ledesma, Et alii

Page 95: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

#!/bin/bashfunction salir {exit

}function e {echo $1

}e Holae Mundosalirecho algo

Este script es casi idéntico al anterior. La diferencia principal es la función�e�. Esta función imprime el primer argumento que recibe. Los argumentos,dentro de las funciones, son tratados de la misma manera que los argumentosproporcionados al script.

Algunos ejemplos Programa BASH34 llamado Buscar para encontrar losarchivos y directorios modi�cados en una determinada trayectoria [$1] en losúltimos días [$2]:

#!/bin/bash# Encuentra los archivos modi�cados en los ultimos $2 diasif [ -z "$1" ]; thenecho uso: $0 [directorio] [dias]exit

��nd $1 -type f -mtime -$2 -exec ls -gGh �full-time �{}�n; j cut

-d ��-f 4,5,7

por ejemplo, para buscar desde /home los archivos modi�cados desde elúltimo día, usamos:

$ ./Buscar /home 1

Programa BASH llamado Diferencia para encontrar la diferencia entrelos archivos y directorios de dos trayectorias [$1] y [$2]:

34Estos y otros ejemplos de BASH se pueden descargar de:http://mmc.geo�sica.unam.mx/acl/Herramientas/SistemasOperativos/Bash/

[email protected] 93 Antonio Carrillo Ledesma, Et alii

Page 96: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

#!/bin/bash# Encuentra las diferencias entre dos directorios y subdirec-

toriosif [ -z "$1" ]; thenecho uso: $0 [directorio1] [directorio2]exit

�di¤<(cd $1 && �nd j sort) <(cd $2 && �nd j sort)

por ejemplo, buscar la diferencia de contenido entre /home/user/a1 y/home/user/b3, usamos:

$ ./Diferencia /home/user/a1 /home/user/b3

Programa para compactar Programa BASH llamadoRespalda para generarel respaldo de la trayectoria indicada [$2] con el nombre [$1] (véase 3.5):

#!/bin/bash#Respalda el contenido dado $2 con el nombre $1if [ -z "$1" ]; thenecho uso: $0 [Archivo].tar [Archivo o Directorio]exit

�# Variables de trabajoA=$1B=$(date +%Y%m%d)# Genera el archivo TARecho Generando el archivo TAR ...shift 1tar -zcvpf $A-$B.tar.gz $*# Visualiza el nuevo contenido/bin/ls -al �color=tty

por ejemplo, para respaldar el contenido de /home con el nombre respaldo,usamos:

$ ./Respalda respaldo /home

[email protected] 94 Antonio Carrillo Ledesma, Et alii

Page 97: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Secuencias Como parte del BASH podemos usar el generador de secuen-cias, como por ejemplo:

$ echo {1..10}

que muestra la secuencia de los números de 1 a 10, si ahora probamos:

$ echo {1..10..2}

visualizará los números 1; 3; 5; 7; 9. Es decir, iniciará con el primer númeroen la secuencia y terminará en el segundo de la secuencia con incrementos delúltimo número de la secuencia. También podemos hacerlo en orden inversomediante:

$ echo {10..1..2}

que nos entregará los números 10; 8; 6; 4; 2. También podemos usar rellenocon ceros, por ejemplo:

$ echo {000..121..2}

el cual imprimirá los números de 0 a 121 con saltos de dos en dos, como:000 002 004 006 ... 050 052 054 ... 116 118 120. Con este generador de se-cuencias numéricas podemos aplicar a comando vistos en la sección anterior,como por ejemplo:

$ mkdir {2009..2019}_Facturas

que creará los directorios de 2009_Facturas, hasta 2019_Facturas. Tam-bién lo podemos usar para borrar archivos, como por ejemplo:

$ rm cuadros_{043..61..3}

Este generador de secuencias podemos usarlo también en modo texto, porejemplo:

$ touch archivo_{a..z}.txt

creará el archivo archivo_a.txt hasta archivo_z.txt. También es posibleusar algo como {Z..a} pero generará caracteres no alfanuméricos. Otros usosson:

$ touch {blahg, splurg, mmmf}_�le.txt

creará los archivos blahg_�le.txt, splurg_�le.txt y mmmf_�le.txt.

[email protected] 95 Antonio Carrillo Ledesma, Et alii

Page 98: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Aprender a Trabajar con BASH En la red existen múltiples sitios espe-cializados y una amplia bibliografía para aprender a programar cada uno delos distintos aspectos de BASH, nosotros hemos seleccionado diversos textosque ponemos a su disposición en:

http://mmc.geo�sica.unam.mx/acl/Herramientas/SistemasOperativos/

3.11 Instalar Debian GNU/Linux

Existen distintas distribuciones de Linux35 para instalar, una de las másampliamente usadas es Debian GNU/Linux y sus derivados como Ubuntu.Debian36 se puede descargar de múltiples ligas, una de ellas es:

http://mmc.geo�sica.unam.mx/Replicas/debianInstall

y los paquetes se pueden descargar desde México en:

http://mmc.geo�sica.unam.mx/Replicas/debian

Por omisión en Debian sólo se instalan paquetes libres, pero hay otro tipode paquetes útiles que no son libres o que tienen licencia distinta a la usadapor Debian GNU/Linux, para poder tener acceso a ellos hay que modi�carel archivo /etc/apt/sources.list, mediante:

#37 nano /etc/apt/sources.list

En México hay una replica de Debian en la UNAM, en el Instituto deGeofísica, para acceder a ella, agregar:

35Una lista de las distribuciones de Linux y su árbol de vida puede verse en la páginaWeb http://futurist.se/gldt/36Algunas de las razones para instalar GNU/Linux Debian están detalladas en su página

Web https://www.debian.org/intro/why_debian.es.html37En el Bourne Shell y sus derivados como BASH el prompt que nos permite escribir los

diferentes comandos, generalmente termina con el caracter:

� $ para usuario sin privilegios� # para el administrador, conocido como root

[email protected] 96 Antonio Carrillo Ledesma, Et alii

Page 99: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

deb http://www.mmc.geo�sica.unam.mx/debian/ buster nmain contrib non-freedeb-src http://www.mmc.geo�sica.unam.mx/debian/ nbuster main contrib non-free

Esto permite tener acceso a paquetes libres (main) y no libres o con li-cencias distintas a Debian GLP de Linux (contrib y non-free). Una vez agre-gadas las replicas hay que actualizar las de�niciones de paquetes disponiblesen Debian, usando:

# apt update# apt safe-upgrade# apt clean

Ahora el sistema esta listo para poder instalar los paquetes que el usuariode la máquina requiere (hay más de 59,000 disponibles en la versión 10.3).Algunas veces es necesario instalar en la versión estable algún paquete

de la versión testing pero que no rompa la estabilidad del sistema, para ellose desarrollo Backports. Para usarlo, lo primero es agregar en el archivosources.list la línea:

deb http://ftp.debian.org/debian/ buster-backports main

también existen para los paquetes contrib y non-free, después de agregarla línea, es necesario ejecutar:

# apt update

Para instalar algún paquete, usar:

# apt -t buster-backports install package

Para eliminar las versiones locales de documentación no usadas instalamosel paquete:

# apt install localepurge# localepurge

Paquetes de administración y utilerias

[email protected] 97 Antonio Carrillo Ledesma, Et alii

Page 100: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

# apt install rcconf ntpdate netstat-nat sysstat htop natop deborphan powertop iotop iftop ifstat procinfo lsof nlshw dvtm screen dstat sysbench dnsutils traceroute sysstat nglances nmap iptraf iptraf-ng wget most fslint gcp mc tmux ngrsync tasque clusterssh jnettop nload pwgen ifstat nmon nhwinfo parallel wipe bleachbit dfc gcp tcpdump gddrescue nlftp conky-all bmon iptables iptables-persistent collectl npssh inxi tomboy ranger fping cpulimit uget itop vnstat njigdo-�le apg# apt install linuxlogo screenfetch nethogs# apt install tilda yakuake terminator screenfetch nterminix guake roxterm terminology lilyterm sakura tilix# apt install �rmware-linux �rmware-linux-free n�rmware-linux-nonfree# apt install rednotebook cherrytree zim focuswriter

Búsqueda de archivos duplicados

# apt install fslint fdupes jdupes �ndimagedupes ndu¤ rd�nd hardlink

Paquete para monitoreo de múltiples equipos

# apt install sinfo

Paquetes de navegadores de red

# apt install �ashplugin-nonfree chimera2 chromium nconkeror dillo edbrowse epiphany-browser iceweasel nkonqueror midori netrik netsurf netsurf-fb netsurf-gtk nsurf uzbl t�refox-esr qupzilla arora hv3# apt install elinks elvis-tiny links links2 lynx-cur w3m#Actualizar el navegador por omisión en modo grá�co y texto# update-alternatives �con�g x-www-browser# update-alternatives �con�g www-browser

[email protected] 98 Antonio Carrillo Ledesma, Et alii

Page 101: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Instalar paquetes de KDE

# apt install kde-full kdevelop kdeadmin kdeartwork nkdegames junior-kde kdemultimedia kdesdk kdeWebdev nkdenetwork kdesdk kdeutils kdevelop kdetoys neducation-desktop-kde

Manejo de particiones NTFS

# apt install ntfs-3g ntfsprogs scrounge-ntfs

Manejo de SAMBA

# apt install samba smbclient cifs-utils

Manejo de particiones

# apt install parted partimage gparted testdisk ngenisoimage

Servidor y cliente de SSH

# apt install openssh-server openssh-client �lezilla

Utilerias de compactación

# apt install pigz gzip unzip zip pbzip2 bzip2 lbzip2 arj nzoo unrar lhasa ncompress p7zip p7zip-full p7zip-rar nunace unace-nonfree zutils cpio pax unp lzma xz-utils pxz npixz kgb rar rarcrack zpaq bsdtar dtrx lzop

Manejo de documentos

[email protected] 99 Antonio Carrillo Ledesma, Et alii

Page 102: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

# apt install science-typesetting texlive-science ntexstudio pandoc texmaker inkscape kile gummi texstudionenchant texlive-latex-base texlive-latex-recommended nlatexila lyx medit texworks texlive-full latexila libreo¢ ce ncalligra abiword evince gnumeric kexi texlive-extra-utils# apt install pdf-viewer msttcorefonts djview4 okular ngv zathura di¤pdf mupdf pdf-presenter-console evince xpdf nokular poppler-utils atril pdftk pdfgrep xpdf-utils pdfcrack nqpdf pdfsam pdfshu­ er htmldoc pdf2svg pdfmod pdfposter npdfchain pdf2djvu gpdftext catdoc chktex cxref cxref-doc nlatex2rtf antiword unoconv a2ps bookletimposer qpdfview nrst2pdf xchm chm2pdf archmage qpdfview-ps-plugin nqpdfview qpdfview-djvu-plugin kchmviewer# apt install ispanish wspanish texlive-lang-spanish nmyspell-es myspell-en-us translate-shell

Editores de grá�cos

# apt install gpaint gimp inkscape imagemagick dia nx�g scribus blender calibre kdenlive kazam pinta krita npencil2d graphviz textdraw calligra blender feh

Paquetes para generar vídeos a partir de imágenes

# apt install openshot imagination photo�lmstrip

Paquetes para tomar vídeos o imágenes del escritorio

# apt install gtk-recordmydesktop recordmydesktop nshutter byzanz kazam simplescreenrecorder scrot ngtk-vector-screenshot gnome-screenshot

Messenger

[email protected] 100 Antonio Carrillo Ledesma, Et alii

Page 103: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

# apt install pidgin pidgin-gui�cations �nch kmess npidgin-plugin-pack pidgin-themes skype4pidgin kopete nempathy telegram-desktop

Multimedia y conversión de formatos de audio y vídeo

# apt install vlc amarok mplayer ¤mpeg mpg123 nclementine audacity xbmc# apt install libxine2-bin libxine2-¤mpeg libxine2-x nlibxine2-plugins ¤mpeg libavcodec-extra vorbis-tools ngstreamer1.0-�uendo-mp3 gstreamer1.0-plugins-ugly ngstreamer1.0-plugins-bad gstreamer1.0-pulseaudio

Reproducir DVDs

# apt install libdvd-pkg# dpkg-recon�gure libdvd-pkg

Tipografías

# apt install fonts-freefont-ttf fonts-freefont-otf nttf-mscorefonts-installer

Paquetes Matemáticos

# apt install science-statistics science-mathematics neducation-mathematics science-viewing gretl lybniz nscience-numericalcomputation xabacus euler geogebra-kde nmathomatic pari-gp qliss3d rkward xaos yacas bliss ngeogebra mumps-test nauty netgen netgen-doc eukleides ngenius pspp pdl yorick gnuplot freemat octave scilab nmaxima wxmaxima xmaxima mathomatic-primes nopen-axiom julia sagemath# apt -y install �r-cran*��r-bioc*�

Lenguajes de programación

[email protected] 101 Antonio Carrillo Ledesma, Et alii

Page 104: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

# apt install gfortran gfortran-doc fortran77-compiler nfortran95-compiler fortran-compiler cfortran# apt install mono-complete# apt install build-essential manpages-dev glibc-doc nglibc-doc-reference gcc-doc-base gcc-doc c++-compiler nc++-annotations-pdf c-compiler g++ cppcheck splint cccc nautoconf automake make cmake scons jam ohcount# apt install haskell-platform# apt install scala# apt install ghc ghc-prof ghc-doc ghc-mod# apt install swi-prolog swi-prolog-doc swi-prolog-java nswi-prolog-x# apt install coq coq-doc coq-theories

Lenguaje de programación JAVA# apt install openjdk-8-jre openjdk-8-jdk openjdk-8-docActualizar la versión por omisión de JAVA$ update-java-alternatives -l# update-java-alternatives -s java-1.8.0-openjdk-amd64

Lenguaje de Programación Python# apt install ipython python-matplotlib python-nose npython-scipy python-pandas python-sympy python-numpynpython-dev spyder python-rpy2 python-rpy python-axiom npython-pip python python-tk idle python-pmwpython-pip nbpython python-imaging python-pandas python-sklearn npython-sklearn-doc wxglade python-rpy2 pypy pypy-tk npython-gnuplot pypy-six jython boa-constructor pyragua ndreampie winpdb mypy python-mpi4py# apt install ipython3 python3 idle3 python3-pip npython3-matplotlib python3-rpy2 python3-numpy spyder3 npython3-scipy bpython3 python3-pandas python-sklearn npython-sklearn-doc pyzo pyzo-doc spe eric python-wxgtk3.0 npython-wxgtk3.0-dev python3-mpi4py# apt install jupyter-console jupyter-notebookJupiter (instalar despues de python 3)# pip3 install jupyter# pip3 install matplotlib

[email protected] 102 Antonio Carrillo Ledesma, Et alii

Page 105: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

# pip3 install ipywidgets# jupyter nbextension enable �py �sys-pre�x nwidgetsnbextension

Editores, IDEs, Debugers y herramientas para programación

# apt install scite jedit kate gedit nedit emacs medit nkscope geany geany-plugins editra qtcreator anjuta codelite ncodelite-plugins tea vim-gtk mousepad eric anjuta-extras# apt install eclipse eclipse-cdt eclipse-pydev netbeans nblue�sh codeblocks codeblocks-contrib# apt install fte fte-console fte-terminal nano joe vim nvim-python-jedi vim-tlib vim-latexsuite vim-nox# apt install kdi¤3 meld di¤use dirdi¤ kompare wdi¤ nnumdi¤ colordi¤ xxdi¤ tkdi¤ ndi¤# apt install ddd-doc ddd gdb xxgdb kdbg valgrind nvalgrind-mpi kcachegrind cppcheck time nemiver# apt install ggcov lcov gcov# apt install alleyoop astyle c2html java2html autodia ncode2html c2html txt2html html2text

Generador de documentación

# apt install doxygen graphviz

Control de cambios en un proyecto

# apt install git git-all gitk gitg git-cola git-gui qgit ntig lighttpd vim-fugitive# apt install mercurial# apt install subversion rapidsvn# apt install cvs

Manejo de UML

# apt install umbrello dia

[email protected] 103 Antonio Carrillo Ledesma, Et alii

Page 106: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Librerías matemáticas

# apt install gsl-bin libgsl0-dev gsl-ref-html

Remplazo de grep para proyectos grandes ack-grep

# apt install ack-grep# dpkg-divert �local �divert /usr/bin/ack �rename n�add /usr/bin/ack-grep

Cómputo en paralelo usando MPI ( es necesario instalar ssh cliente yservidor)

# apt install lam-runtime xmpi libmpich-dev mpich nmpi-default-dev mpi-default-bin openmpi-bin valgrind-mpiEn Debian testing primero quitar estos paquetes:# apt �purge remove openmpi-bin openmpi-common nlibopenmpi1.3Para que en la ejecución de MPI no pida la clave de usuario:$ ssh-keygen -t rsaEn cada pregunta responder con ENTER, para después copiar

usando:$ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keysNota: Si continua pidiendo clave es que también esta insta-

lando rsh o lsh

Cómputo distribuido

# apt install pvm pvm-dev# apt install perl python-mpi

Explorador de Datos de Visualización OpenDx

# apt install dx dx-dox dxsample

[email protected] 104 Antonio Carrillo Ledesma, Et alii

Page 107: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Librería para manejo de modelos de datos y formato para almacenar ymanejar datos HDF5

# apt install hdfview hdf5-tools

Generador de mallas en 3D

# apt install gmsh

Servidor de Web Apache, PHP, Mysql y postgresql

# apt install apache2 libapache2-mod-evasive apachetop# apt install php libapache2-mod-php phpmyadmin nphp-mysql php-gd# apt install mysql-common mysql-client mysql-server nferret mysql-workbench mysql-workbench-data mycli nmytop mysql-admin# apt install postgresql postgresql-client pgcli npostgresql-doc postgresql-contrib# apt install sqlite3 sqlite3-doc sqlitebrowser# apt install mongodb mongodb-clients mongodb-server

Paquetes para notebook

# apt install wireless-tools acpi-support cpufrequtils nacpi wpasupplicant powertop vbetool acpid no�ushd nwicd-curses apmd pcmciautils pm-utils radeontool nanacron avahi-autoipd bluetooth iban kmilo nlaptop-detect laptop-mode-tools laptop-net guessnet nbluez-utils bluez-pcmcia-support

Máquinas virtuales

# apt install qemu# apt install kvm

[email protected] 105 Antonio Carrillo Ledesma, Et alii

Page 108: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Paquetes para wireless

# apt install wireless-tools wireshark kismet nkwavecontrol wicd-curses aircrack-ng macchanger nprismstumbler swscanner wavemon wmwave ifrename nndisgtk ndiswrapper-common ndiswrapper-dkms

Para correr aplicaciones de Windows mediante WINE

# apt install wine# dpkg �add-architecture i386 && apt update n&& apt install wine32

Paquetes para instalar impresoras locales y remotas

# apt install system-con�g-printer cups nsystem-con�g-printer-udev cups-pk-helper

Para usar un escaner

# apt install gscan2pdf tesseract-ocr eikazo xsane ntesseract-ocr-spa tesseract-ocr-eng simple-scan

[email protected] 106 Antonio Carrillo Ledesma, Et alii

Page 109: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

4 Lenguajes de Programación y Entornos deDesarrollo

Hay muchas aplicaciones a las herramientas computacionales, pero nos in-teresan aquellas que permitan resolver problemas concomitantes en Cienciae Ingeniería. Muchas de estas aplicaciones caen en lo que comúnmente sellama cómputo cientí�co. La computación cientí�ca es el campo de estudiorelacionado con la construcción de modelos matemáticos, técnicas numéricaspara resolver problemas cientí�cos y de ingeniería; y su respectiva imple-mentación computacional.Este campo es distinto a las ciencias de la computación y el procesamiento

de información, también es diferente a la teoría y experimentación, que sonlas formas tradicionales de la ciencia y la ingeniería. El enfoque de la com-putación cientí�ca es para ganar entendimiento, principalmente a través delanálisis de modelos matemáticos implementados en computadoras.Los programas de aplicación de la computación cientí�ca a menudo mode-

lan cambios en las condiciones del mundo real, tales como el tiempo atmos-férico, el �ujo de aire alrededor de un avión, el movimiento de las estre-llas en una galaxia, el comportamiento de un dispositivo explosivo, entreotros. Estos programas deberían crear una �malla lógica�en la memoria dela computadora, donde cada ítem corresponda a un área en el espacio y con-tenga información acerca del espacio relevante para el modelo. Por ejemplo,en modelos para el tiempo atmosférico, cada ítem podría ser un kilómetrocuadrado, con la altitud del suelo, dirección actual del viento, humedad am-biental, temperatura, presión, etc. El programa debería calcular el siguienteestado probable basado en el estado actual, simulado en medidas de tiempo,resolviendo ecuaciones que describen cómo operan los sistemas mediante eluso de un algoritmo38, y repetir el proceso para calcular el siguiente estado.Este código o programa se escribe en un lenguaje de programación que siguealgún paradigma de programación39, que posteriormente puede ser ejecutadopor una unidad central de procesamiento � computadora� .

38Un algoritmo es un conjunto preescrito de instrucciones o reglas bien de�nidas, orde-nadas y �nitas que permiten llevar a cabo una actividad mediante pasos sucesivos que nogeneren dudas a quien deba hacer dicha actividad. Dados un estado inicial y una entrada,siguiendo los pasos sucesivos se llega a un estado �nal y se obtiene una solución.39Este representa un enfoque particular o �losofía para diseñar soluciones e implemen-

tarlas en algún lenguaje de programación.

[email protected] 107 Antonio Carrillo Ledesma, Et alii

Page 110: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Así, una parte importante de la programación es el hecho de conocer yusar uno o más paradigmas de programación. Entonces iniciemos delineandolo que es un paradigma de programación. Los paradigmas di�eren unos deotros, en los conceptos y la forma de abstraer los elementos involucrados enun problema, así como en los pasos que integran la solución del problema,en otras palabras, el cómputo. Tiene una estrecha relación con la forma-lización de determinados lenguajes al momento de de�nirlos � es el estilo deprogramación empleado� .

Los Tipos más comunes de paradigmas de programación son40:

� Programación imperativa o por procedimientos: es el más usado engeneral, se basa en dar instrucciones a la computadora de como hacerlas cosas en forma de algoritmos. La programación imperativa es lamás usada y la más antigua, el ejemplo principal es el lenguaje demáquina. Ejemplos de lenguajes puros de este paradigma serían C,BASIC o Pascal.

� Programación orientada a objetos: esta basado en el imperativo, peroencapsula elementos denominados objetos que incluyen tanto variablescomo funciones. Esta representado por C++, C#, Java o Python entreotros, pero el más representativo sería el Smalltalk que esta completa-mente orientado a objetos.

� Programación dinámica: esta de�nido como el proceso de romper pro-blemas en partes pequeñas para analizarlos y resolverlos de forma lomás cercana al óptimo, busca resolver problemas en O(n) sin usarpor tanto métodos recursivos. Este paradigma está más basado en elmodo de realizar los algoritmos, por lo que se puede usar con cualquierlenguaje imperativo como C, C++, Java o Python.

� Programación dirigida por eventos: la programación dirigida por even-tos es un paradigma de programación en el que tanto la estructuracomo la ejecución de los programas van determinados por los sucesosque ocurran en el sistema, de�nidos por el usuario o que ellos mismosdiseñen, por ejemplo en las interfaces grá�cas de usuarios o en la Web.

40En general la mayoría son variantes de los dos tipos principales: imperativa y decla-rativa.

[email protected] 108 Antonio Carrillo Ledesma, Et alii

Page 111: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Programación declarativa: esta basado en describir el problema declaran-do propiedades y reglas que deben cumplirse, en lugar de instrucciones.Hay lenguajes para la programación funcional, la programación lógica,o la combinación lógico-funcional. Unos de los primeros lenguajes fun-cionales fueron Lisp y Prolog.

� Programación funcional: basada en la de�nición los predicados y es decorte más matemático, está representado por Scheme (una variante deLisp) o Haskell. Python también representa este paradigma.

� Programación lógica: basado en la de�nición de relaciones lógicas, estárepresentado por Prolog.

� Programación con restricciones: similar a la lógica usando ecuaciones.Casi todos los lenguajes son variantes del Prolog.

� Programación multiparadigma: es el uso de dos o más paradigmasdentro de un programa. El lenguaje Lisp se considera multiparadigma.Al igual que Python, que es orientado a objetos, re�exivo, imperativoy funcional.

� Programación reactiva: este paradigma se basa en la declaración de unaserie de objetos emisores de eventos asíncronos y otra serie de objetosque se «suscriben» a los primeros � es decir, quedan a la escucha de laemisión de eventos de estos� y "reaccionan" a los valores que reciben.Es muy común usar la librería Rx de Microsoft (Acrónimo de ReactiveExtensions), disponible para múltiples lenguajes de programación.

El paradigma de programación más utilizado en la actualidad, es el de«orientación a objetos» . El núcleo central de este paradigma es la unión dedatos y procesamiento en una entidad llamada «objeto» , relacionable a suvez con otras entidades «objeto» .Tradicionalmente, datos y procesamiento se han separado en diferentes

áreas del diseño y la implementación de Software. Esto provocó que grandesdesarrollos tuvieran problemas de �abilidad, mantenimiento, adaptación a loscambios y escalabilidad. Con la orientación a objetos y características comoel encapsulado, polimor�smo o la herencia, se permitió un avance signi�cativoen el desarrollo de Software a cualquier escala de producción.

[email protected] 109 Antonio Carrillo Ledesma, Et alii

Page 112: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Otra parte importante de la programación tiene que ver con el algoritmoa implementar y las estructuras de datos necesarias para soportar los datosdel problema, así como su e�ciencia. Entonces entenderemos por e�cienciaalgorítmica para describir aquellas propiedades de los algoritmos que estánrelacionadas con la cantidad de recursos utilizados por el algoritmo. Un al-goritmo debe ser analizado para determinar el uso de los recursos que realiza.La e�ciencia algorítmica puede ser vista como análogo a la ingeniería de pro-ductividad de un proceso repetitivo o continuo. Con el objetivo de lograruna e�ciencia máxima se quiere minimizar el uso de recursos. Sin embargo,varias medidas (e.g. complejidad temporal, complejidad espacial) no puedenser comparadas directamente, luego, cual de los algoritmos es consideradomás e�ciente, depende de cual medida de e�ciencia se está considerandocomo prioridad, e.g. la prioridad podría ser obtener la salida del algoritmolo más rápido posible, o que minimice el uso de la memoria, o alguna otramedida particular.

Entonces, ¿cómo determinar si un algoritmo es mejor que otro?. Algunaspautas pueden ser:

� Facilidad de implementar

� Facilidad de entender

� Facilidad de modi�car

� Usa menos memoria

� Menor tiempo de ejecución

Tomando en cuenta todo lo anterior, ¿cómo se hace un pro-grama?

� Hay que tener claro el problema a resolver (formalización)

� Se debe planear cómo se quiere resolver o abordar el problema (análisisy diseño)

� Se elige uno o más lenguajes de programación y se escriben las instruc-ciones en ese lenguaje para llevar a cabo esa tarea (codi�cación)

[email protected] 110 Antonio Carrillo Ledesma, Et alii

Page 113: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� El texto se compila o interpreta para detectar errores sintácticos ysemánticos (depuración)

� El programa revisado se prueba con los distintos datos de entrada (eje-cución)

� Se evalúan los resultados, y de ser necesario se regresa a cualquiera delos pasos anteriores para completar el proceso de corrección (validación)

Así, para dar solución a algún problema de nuestro interés, debemoselegir el mejor algoritmo a nuestra disposición, seleccionar41 el paradigma deprogramación que nos ofrezca ventajas según su e�ciencia algorítmica y conello usar el lenguaje que nos permita implementar dicho programa usandolas técnicas de análisis y diseño que garanticen la calidad de un producto deSoftware42.

Lenguaje de Programación Entenderemos por un lenguaje de pro-gramación, a un lenguaje formal que especi�ca una serie de instruccionespara que una computadora produzca diversas clases de datos. Los lenguajesde programación pueden usarse para crear programas que pongan en prácticaalgoritmos especí�cos que controlen el comportamiento físico y lógico de unacomputadora. Esta formado por un conjunto de símbolos y reglas sintácticasy semánticas que de�nen su estructura y el signi�cado de sus elementos y ex-presiones. Al proceso por el cual se escribe, se prueba, se depura, se compila(de ser necesario) y se mantiene el código fuente de un programa informáticose le llama programación.Un programa permite especi�car de manera precisa sobre qué datos debe

operar una computadora, cómo deben ser almacenados o transmitidos y quéacciones debe tomar bajo una variada gama de circunstancias. Todo esto,a través de un lenguaje que intenta estar relativamente próximo al lenguaje

41Si bien puede seleccionarse la forma pura de estos paradigmas al momento de progra-mar, en la práctica es habitual que se mezclen, dando lugar a la programación multipara-digma o lenguajes de programación multiparadigma.42La ingeniería de Software es la aplicación de un enfoque sistemático, disciplinado y

cuanti�cable al desarrollo, operación y mantenimiento de Software y el estudio de estosenfoques, es decir, el estudio de las aplicaciones de la ingeniería al Software. Integramatemáticas, ciencias de la computación y prácticas cuyos orígenes se encuentran en laingeniería.

[email protected] 111 Antonio Carrillo Ledesma, Et alii

Page 114: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

humano o natural. Una característica relevante de los lenguajes de progra-mación es precisamente que más de un programador pueda usar un conjuntocomún de instrucciones que sean comprendidas entre ellos para realizar laconstrucción de un programa de forma colaborativa.

Variables son títulos asignados a espacios en memoria para almacenardatos especí�cos. Son contenedores de datos y por ello se diferencian segúnel tipo de dato que son capaces de almacenar. En la mayoría de lenguajesde programación se requiere especi�car un tipo de variable concreto paraguardar un dato especí�co. A continuación, un listado con los tipos de varia-bles más comunes:

Tipo de dato Breve descripciónChar Contienen un único carácterInt Contienen un número enteroFloat Contienen un número decimalString Contienen cadenas de textoBoolean Solo pueden contener43verdadero o falso

Condicionales son estructuras de código que indican que, para quecierta parte del programa se ejecute, deben cumplirse ciertas premisas; porejemplo: que dos valores sean iguales, que un valor exista, que un valor seamayor que otro. Estos condicionantes por lo general solo se ejecutan una veza lo largo del programa. Los condicionantes más conocidos y empleados enprogramación son:

� If: Indica una condición para que se ejecute una parte del programa.

� Else if: Siempre va precedido de un "If" e indica una condición para quese ejecute una parte del programa siempre que no cumpla la condicióndel if previo y sí se cumpla con la que el "else if" especi�que.

� Else: Siempre precedido de "If" y en ocasiones de "Else If". Indica quedebe ejecutarse cuando no se cumplan las condiciones previas.

43 En el caso de variables booleanas, el cero es considerado para muchos lenguajes comoel literal falso ("False"), mientras que el uno se considera verdadero ("True").

[email protected] 112 Antonio Carrillo Ledesma, Et alii

Page 115: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Bucles son parientes cercanos de los condicionantes, pero ejecutan cons-tantemente un código mientras se cumpla una determinada condición. Losmás frecuentes son:

� For: Ejecuta un código mientras una variable se encuentre entre 2determinados parámetros.

� While: Ejecuta un código mientras que se cumpla la condición quesolicita.

Hay que decir que a pesar de que existan distintos tipos de bucles, todosson capaces de realizar exactamente las mismas funciones. El empleo de unou otro depende, por lo general, del gusto del programador.

Funciones estas se crearon para evitar tener que repetir constante-mente fragmentos de código. Una función podría considerarse como unavariable que encierra código dentro de sí. Por lo tanto cuando accedemos adicha variable (la función), en realidad lo que estamos haciendo es ordenaral programa que ejecute un determinado código prede�nido anteriormente.Todos los lenguajes de programación tienen algunos elementos de forma-

ción primitivos para la descripción de los datos y de los procesos o transfor-maciones aplicadas a estos datos � tal como la suma de dos números o laselección de un elemento que forma parte de una colección� . Estos elemen-tos primitivos son de�nidos por reglas sintácticas y semánticas que describensu estructura y signi�cado respectivamente.

Implementación de un Lenguaje de Programación Es la queprovee una manera de que se ejecute un programa para una determinadacombinación de Software y Hardware. Existen básicamente dos maneras deimplementar un lenguaje:

� Compilación: es el proceso que traduce un programa escrito en unlenguaje de programación a otro lenguaje de programación, generandoun programa equivalente que la máquina será capaz interpretar. Losprogramas traductores que pueden realizar esta operación se llamancompiladores. Estos, como los programas ensambladores avanzados,pueden generar muchas líneas de código de máquina por cada proposi-ción del programa fuente.

[email protected] 113 Antonio Carrillo Ledesma, Et alii

Page 116: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Interpretación: es una asignación de signi�cados a las fórmulas bienformadas de un lenguaje formal. Como los lenguajes formales44 puedende�nirse en términos puramente sintácticos, sus fórmulas bien formadaspueden no ser más que cadenas de símbolos sin ningún signi�cado. Unainterpretación otorga signi�cado a esas fórmulas.

Para ayudar al programador es común el uso de editores de texto o am-bientes integrados de desarrollo que permiten resaltar los elementos de lasintaxis con colores diferentes para facilitar su lectura. A la forma visiblede un lenguaje de programación se le conoce como sintaxis. La mayoría delos lenguajes de programación son puramente textuales, es decir, utilizansecuencias de texto que incluyen palabras, números y puntuación, de ma-nera similar a los lenguajes naturales escritos. Por otra parte, hay algunoslenguajes de programación que son más grá�cos en su naturaleza, utilizandorelaciones visuales entre símbolos para especi�car un programa.La sintaxis de un lenguaje de programación describe las combinaciones

posibles de los símbolos que forman un programa sintácticamente correcto.El signi�cado que se le da a una combinación de símbolos es manejado porsu semántica � ya sea formal o como parte del código duro45 de la referenciade implementación� .La sintaxis de los lenguajes de programación es de�nida generalmente

utilizando una combinación de expresiones regulares � para la estructuraléxica� y la Notación de Backus-Naur46 para la estructura gramática.44En matemáticas, lógica y ciencias de la computación, un lenguaje formal es un lenguaje

cuyos símbolos primitivos y reglas para unir esos símbolos están formalmente especi�cados.Al conjunto de los símbolos primitivos se le llama alfabeto (o vocabulario) del lenguaje,y al conjunto de las reglas se le llama gramática formal (o sintaxis). A una cadena desímbolos formada de acuerdo a la gramática se le llama fórmula bien formada (o palabra)del lenguaje. Estrictamente hablando, un lenguaje formal es idéntico al conjunto de todassus fórmulas bien formadas. A diferencia de lo que ocurre con el alfabeto (que debe ser unconjunto �nito) y con cada fórmula bien formada (que debe tener una longitud también�nita), un lenguaje formal puede estar compuesto por un número in�nito de fórmulas bienformadas.45Hard-Code, término del mundo de la informática que hace referencia a una mala

práctica en el desarrollo de Software que consiste en incrustar datos directamente (a fuego)en el código fuente del programa, en lugar de obtener esos datos de una fuente externacomo un �chero de con�guración o parámetros de la línea de comandos, o un archivo derecursos.46La notación de Backus-Naur, también conocida por sus denominaciones inglesas

Backus-Naur form (BNF), Backus-Naur formalism o Backus normal form, es un meta-

[email protected] 114 Antonio Carrillo Ledesma, Et alii

Page 117: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Objetivos a Cumplir en el Código Generado Para escribir progra-mas que proporcionen los mejores resultados, cabe tener en cuenta una seriede objetivos, entre los que destacan:

� Corrección: Un programa es correcto si hace lo que debe hacer tal ycomo se estableció en las fases previas a su desarrollo. Para determi-nar si un programa hace lo que debe, es muy importante especi�carclaramente qué debe hacer el programa antes de desarrollarlo y, unavez acabado, compararlo con lo que realmente hace.

� Claridad: Es muy importante que el programa sea lo más claro y legi-ble posible, para facilitar así su desarrollo y posterior mantenimiento.Al elaborar un programa se debe intentar que su estructura sea sencillay coherente, así como cuidar el estilo en la edición; de esta forma seve facilitado el trabajo del programador, tanto en la fase de creacióncomo en las fases posteriores de corrección de errores, ampliaciones,modi�caciones, etc. Fases que pueden ser realizadas incluso por otroprogramador, con lo cual la claridad es aún más necesaria para queotros programadores puedan continuar el trabajo fácilmente.

� E�ciencia: Se trata de que el programa, además de realizar aquello paralo que fue creado � es decir, que sea correcto� , lo haga gestionando dela mejor forma posible los recursos que utiliza. Normalmente, al hablarde e�ciencia de un programa, se suele hacer referencia al tiempo quetarda en realizar la tarea para la que ha sido creado y a la cantidadde memoria que necesita, pero hay otros recursos que también puedenser de consideración al obtener la e�ciencia de un programa, depen-diendo de su naturaleza � espacio en disco que utiliza, trá�co de redque genera, etc.� .

� Portabilidad: Un programa es portable cuando tiene la capacidad depoder ejecutarse en una plataforma, ya sea Hardware o Software, dife-rente a aquella en la que se elaboró. La portabilidad es una caracterís-tica muy deseable para un programa, ya que permite, por ejemplo, a unprograma que se ha desarrollado para sistemas GNU/Linux ejecutarsetambién en la familia de sistemas operativos Windows. Esto permiteque el programa pueda llegar a más usuarios más fácilmente.

lenguaje usado para expresar gramáticas libres de contexto: es decir, una manera formalde describir lenguajes formales.

[email protected] 115 Antonio Carrillo Ledesma, Et alii

Page 118: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Integridad: Un programa tiene integridad si es posible controlar su uso,el grado con que se puede controlar el acceso al Software o a los datosa personas no autorizadas denotará su integridad.

� Facilidad de uso: Un programa tiene facilidad de uso si el esfuerzorequerido es mínimo o moderado para aprender el manejo de una apli-cación, trabajar con ella, introducir datos y conseguir resultados.

� Facilidad de mantenimiento: Un programa tiene facilidad de manteni-miento si el esfuerzo requerido para localizar y reparar errores es mode-rado o mínimo.

� Flexibilidad: Un programa tiene �exibilidad si el esfuerzo requeridopara modi�car y/o añadir funcionalidades a una aplicación en fun-cionamiento es moderado o mínimo.

� Reusabilidad: Es el grado en que un programa o porción de este esreusable en otras aplicaciones.

� Interoperatibilidad: Un programa debe poder comunicarse con otrasaplicaciones o sistemas informáticos, el esfuerzo necesario para ellomedirá su interoperatibilidad.

Existe una gran variedad de lenguajes de programación y su grado de usodepende de diversos factores, en la Facultad de Ciencias se estudian algunasdecenas de ellos, entre los que destacan: C, C++, Java y Python.

¿Qué es eso de ASCII, ISO-8859-1 y UTF-8? Los tres estándaresrepresentan el esfuerzo informático por brindar un sistema de codi�caciónque permita representar los caracteres que se usan en todos los idiomas. Elprimer esfuerzo lo hizo ASCII y fue para el idioma inglés (128 caracteres),luego ante su insu�ciencia para representar otros caracteres como los latinospor ejemplo, nace ISO-8859-1 (también llamado LATIN-1 ó ASCII extendido)pero debido a que no podía representar caracteres de otros idiomas apareceel estándar Unicode (del cual es parte UTF-8).Un buen detalle a saber es que mientras ISO-8859-1 usa un byte para

representar un carácter, no pasa lo mismo con UTF-8 que puede usar hasta4 bytes ya que es de longitud variable. Esto hace que una base de datos enUTF-8 sea un poco mas grande que una en ISO-8859-1. Esto sucede porque

[email protected] 116 Antonio Carrillo Ledesma, Et alii

Page 119: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� por ejemplo� mientras ISO-8859-1 usa un byte para representar la letrañ, UTF-8 usa dos bytes. Hay un tema más y es que muchas veces cuandovamos a migrar información nos encontramos con caracteres ISO-8859-1 (loscorrespondientes a los números 147, 148, 149, 150, 151 y 133) que no puedenverse en un editor UNIX/LINUX pero si en un navegador HTML.

Unicode es un set de caracteres universal, es decir, un estándar en elque se de�nen todos los caracteres necesarios para la escritura de la mayoríade los idiomas hablados en la actualidad que se usan en la computadora. Suobjetivo es ser, y, en gran medida, ya lo ha logrado, un superconjunto detodos los sets de caracteres que se hayan codi�cado. El texto que apareceen la computadora o en la Web se compone de caracteres. Los caracteresrepresentan letras del abecedario, signos de puntuación y otros símbolos.En el pasado, distintas organizaciones han recopilado diferentes sets de

caracteres y han creado codi�caciones especí�cas para ellos. Un set puedeabarcar tan sólo los idiomas de Europa occidental con base en el latín (sinincluir países de la Unión Europea como Bulgaria o Grecia), otro set puedecontemplar un idioma especí�co del Lejano Oriente (como el japonés), y otrospueden ser parte de distintos sets diseñados especialmente para representarotro idioma de algún lugar del mundo.Lamentablemente, no es posible garantizar que su aplicación particular

pueda soportar todas las codi�caciones, ni que una determinada codi�caciónpueda soportar todos sus requerimientos para la representación de un ciertoidioma. Además, generalmente resulta imposible combinar distintas codi�-caciones en la misma página Web o en una base de datos, por lo que siemprees muy difícil soportar páginas plurilingües si se aplican enfoques "antiguos"cuando se trata de tareas de codi�cación.El Consorcio Unicode proporciona un único y extenso set de caracteres

que pretende incluir todos los caracteres necesarios para cualquier sistema deescritura del mundo, incluyendo sistemas ancestrales (como el cuneiforme, elgótico y los jeroglí�cos egipcios). Hoy resulta fundamental para la arquitec-tura de la Web y de los sistemas operativos, y las principales aplicacionesy navegadores Web incluyen soporte para este elemento. En el EstándarUnicode también se describen las propiedades y algoritmos necesarios paratrabajar con caracteres. Este enfoque facilita mucho el trabajo con sistemaso páginas plurilingües y responde mucho mejor a las necesidades del usuarioque la mayoría de los sistemas de codi�cación tradicionales.

[email protected] 117 Antonio Carrillo Ledesma, Et alii

Page 120: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Sets de caracteres, sets de caracteres codi�cados y codi�cacionesun set de caracteres o repertorio comprende el grupo de caracteres que seutilizarían para una �nalidad especí�ca, ya sea los necesarios para el soportede los idiomas de Europa Occidental en la computadora.Un set de caracteres codi�cados es un grupo de caracteres en el que se

ha asignado un número exclusivo a cada carácter. Las unidades de un setde caracteres codi�cados se conocen como puntos de código. El valor de unpunto de código representa la ubicación de un carácter en el set de caracterescodi�cados. Por ejemplo, el punto de código para la letra á en el set decaracteres codi�cados Unicode es 225 en notación decimal, o E1 en notaciónhexadecimal.La codi�cación de caracteres re�eja la manera en la que el set de caracteres

codi�cados se convierte a bytes para su procesamiento en la computadora.Además, en Unicode existen distintas formas de codi�car el mismo carácter.Por ejemplo, la letra á se puede representar mediante dos bytes en una co-di�cación y con cuatro bytes, en otra. Los formatos de codi�cación que sepueden usar con Unicode se denominan UTF-8, UTF-16 y UTF-32.Por todo lo anterior, al programar es necesario tener en cuenta la co-

di�cación usada por el editor o IDE que se use para ello y que no todos loseditores soportan las mismas codi�caciones47, además puede haber problemasde portabilidad en los archivos entre distintos sistemas operativos. En elcódigo fuente (las instrucciones del programa) no se suele usar caracteresdistintos al ASCII, pero en las cadenas de visualización o en la documentaciónes común el uso de caracteres acentuados, es aquí donde hay que tomar unadecisón sobre el usar o no dichos caracteres, siempre y cuando el compiladorlos soporte.Si siempre se usa el mismo editor y la misma plataforma de desarrollo,

no hay razón para no usar caracteres extendidos como los acentos. Pero si seusarán múltiples sistemas operativos y no hay garantía de usar editores quesoporten dichos caracteres, entonces existe la posibilidad de perder dichoscaracteres o bien pueden generar errores al compilar los archivos por no sersoportados. Por ello una opción para evitar problemas es sólo usar caracteresASCII o tener el cuidado de usar editores que no pierdan dichos caracteres.

47Dado que los archivos fuente se intercambian entre usuarios y es común el uso de dife-rentes sistemas operativos, la conversiones de los caracteres entre diferentes formatos puedeser causa de problemas de codi�cación, perdiéndose dichos caracteres en la conversión.

[email protected] 118 Antonio Carrillo Ledesma, Et alii

Page 121: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

4.1 Conceptos Transversales

En esta sección comentaremos algunos conceptos transversales a los distintosparadigmas de programación y a los lenguajes que los implementan.

Abstracción Entendiendo un sistema como una abstracción de la realidad,los datos son las entidades que representan cada uno de los aspectos dela realidad que son signi�cativos para el funcionamiento del sistema. Paraque tenga sentido como abstracción de la realidad, cada dato implica undeterminado valor y requiere de una convención que permita representarlosin ambigüedad y procesarlo de una manera con�able.En la misma línea, la lógica del procesamiento de los datos es también

una abstracción de los procesos que suceden en la realidad que conforma eldominio de la aplicación. El proceso de abstraerse progresivamente de losdetalles y así manejar niveles de abstracción, es el que permite construirsistemas complejos.Las unidades de Software que realizan la funcionalidad del sistema re-

quieren también de convenciones y criterios de ordenamiento y articulacióninterna tanto para un funcionamiento con�able y e�ciente del sistema, comopara que el proceso de construcción y mantenimiento del Software sea de laforma más simple posible.

Modularización, Encapsulamiento y Delegación Una estrategia cen-tral de la programación es buscar la manera de organizar y distribuir lafuncionalidad de un sistema complejo en unidades más pequeñas de Softwarecon que se responsabilizan de tareas especí�cas y que interactúan entre ellas.Estas unidades reciben nombres diferentes según cada lenguaje de progra-mación, como rutinas, funciones, procedimientos, métodos, predicados, sub-programas, bloques, entidades, siendo "módulos" una de las más frecuentesy que dan origen al término.La clave de cada módulo es no conocer el funcionamiento interno de los

demás módulos con los que interactúa, sino sólo su interfaz, es decir, la formaen que debe enviarle información adicional en forma de parámetros y cómova a recibir las respuestas. Esta propiedad recibe diversos nombres, comoel de encapsulamiento, ocultación de información o "caja negra". Ante lamodi�cación de una funcionalidad en particular del sistema, en la medida quesu implementación esté encapsulada en un módulo, el impacto que producesu cambio no afectará a los otros módulos que interactúan con el.

[email protected] 119 Antonio Carrillo Ledesma, Et alii

Page 122: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

En concordancia con la distribución de responsabilidades entre las dife-rentes unidades de Software, la delegación consiste en la invocación que desdeun módulo se efectúa a otro módulo, de manera que el que invoca indica deforma explicita qué es lo que pretende y el que es invocado se ocupa de todo lonecesario para realizarlo. Puede realizarse de numerosas maneras, variandoel criterio de distribución de responsabilidades, el modo de evaluación, laforma de paso de parámetros, los tipos de datos que utiliza, de acuerdo a lasposibilidades y restricciones de cada lenguaje y paradigma.

Declaratividad La declaratividad, en términos generales, se basa en laseparación del conocimiento sobre la de�nición del problema con la forma debuscar su solución, una separación entre la lógica y el control.En un programa declarativo se especi�can un conjunto de declaraciones,

que pueden ser proposiciones, condiciones, restricciones, a�rmaciones, o ecua-ciones, que caracterizan al problema y describen su solución. A partir de estainformación el sistema utiliza mecanismos internos de control, comúnmentellamado "motores", que evalúan y relacionan adecuadamente dichas especi-�caciones, la manera de obtener la solución. De esta forma, en vez de seruna secuencia de órdenes, un programa es un conjunto de de�niciones sobreel dominio del problema.Basándose en la noción de delegación, la declaratividad plantea como

criterio para distribuir las responsabilidades, separar las relacionadas conmodelar o de�nir el conocimiento del problema de aquellas de manipularese conocimiento para alcanzar un objetivo concreto. En otras palabras,distinguir el "qué" del "cómo".La declaratividad brinda la posibilidad de usar una misma descripción en

múltiples contextos en forma independiente de los motores que se utilicen.Permite focalizar por un lado en las cuestiones algorítmicas del motor,

por ejemplo para trabajar en forma uni�cada sobre e�ciencia, y por otro enla de�nición del dominio del problema y la funcionalidad de la aplicación ensí.La noción opuesta, aunque en cierta medida complementaria, de la decla-

ratividad, puede denominarse "proceduralidad". Los programas proceduralesse construyen indicando explícitamente la secuencia de ejecución en la que seprocesan los datos y obtienen los resultados. Para ello se detalla un conjuntode sentencias, ordenadas mediante estructuras de control como decisiones,iteraciones y secuencias, que conforman "algoritmos".

[email protected] 120 Antonio Carrillo Ledesma, Et alii

Page 123: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

En un sistema complejo, no se puede hablar de declaratividad o proce-duralidad como conceptos excluyentes o totalizantes, sino que coexisten y serelacionan en una permanente tensión. Dependiendo de los lenguajes y delas herramientas que se utilicen, y en particular del diseño del sistema, habrápartes del sistema que por su sentido o ubicación dentro del sistema globalserán más declarativas o procedurales que otras, logrando con ello aprovecharlas ventajas respectivas.

Tipos de Datos Un tipo de dato, o como también es llamado, un tipo abs-tracto de dato, es un conjunto de valores y de operaciones asociadas a ellos.La utilización de diversos tipos de datos permite la agrupación o clasi�cacióndel gran volumen y variedad de valores que es necesario representar y operaren un sistema, según sus semejanzas y diferencias.Tomando como criterio las similitudes en cuanto al contenido de lo que

representan, una primera condición es la existencia de un conjunto de valoreso entidades homogéneos en su representación. Otra condición es que loselementos del mencionado conjunto se comporten en forma uniforme respectoa una serie de operaciones.Cada paradigma de programación, y en particular cada lenguaje, tiene su

forma de determinar tanto la conformación de cada tipo de dato, con sus va-lores y operaciones, como la forma en que se relacionan entre sí conformandoun sistema de tipo de datos.En un lenguaje fuertemente tipado, toda variable y parámetro deben

ser de�nidos de un tipo de dato en particular que se mantiene sin cambiosdurante la ejecución del programa, mientras que en uno débilmente tipadono, sino que pueden asumir valores y tipos de datos diferentes durante laejecución del programa.El tipo de dato al que pertenece una entidad determina la operatoria que

se puede realizar con el. Una tarea que realizan muchos de los lenguajes deprogramación como forma de su mecanismo interno es el chequeo del tipode dato de las entidades del programa. Esta acción se realiza de diferentesmaneras, con mayor o menor �exibilidad, y en diferentes momentos, como lacompilación o la ejecución del programa, y en otros no se realiza.De todas maneras, el tipo de datos permite entender qué entidades tienen

sentido en un contexto, independientemente de la forma de chequeo o si eltipado es débil o fuerte. Por ejemplo, a un bloque de Software que recibecomo argumento una variable, conocer de qué tipo de dato es, le permite

[email protected] 121 Antonio Carrillo Ledesma, Et alii

Page 124: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

saber qué puede hacer con ella.

Estructuras de Datos Los valores atómicos, es decir, aquellos que nopueden ser descompuestos en otros valores, se representan mediante tipos dedatos simples.En contrapartida, en un tipo de dato compuesto los valores están com-

puestos a su vez por otros valores, de manera que conforma una estructura dedatos. Cada uno de los valores que forman la estructura de datos correspondea algún tipo de dato que puede ser tanto simple como compuesto.Su utilidad consiste en que se pueden procesar en su conjunto como una

unidad o se pueden descomponer en sus partes y tratarlas en forma indepen-diente. En otras palabras, las estructuras de datos son conjuntos de valores.

Polimor�smo y Software Genérico El polimor�smo es un concepto parael que se pueden encontrar numerosas y diferentes de�niciones. En un sentidoamplio, más allá de las especi�cidades de cada paradigma y del alcance que sele dé a la de�nición del concepto desde la perspectiva teórica desde la que sele aborde, el objetivo general del polimor�smo es construir piezas de Softwaregenéricas que trabajen indistintamente con diferentes tipos de entidades, paraotra entidad que requiere interactuar con ellas; en otras palabras, que dichasentidades puedan ser intercambiables. Mirando con mayor detenimiento losmecanismos que se activan y sus consecuencias para el desarrollo de sistemas,se pueden distinguir dos grandes situaciones.Hay polimor�smo cuando, ante la existencia de dos o más bloques de

Software con una misma interfaz, otro bloque de Software cualquiera puedetrabajar indistintamente con ellos. Esta noción rescata la existencia de tantasimplementaciones como diferentes tipos de entidades con que se interactúe.Una entidad emisora puede interactuar con cualquiera de las otras en-

tidades de acuerdo a las características de la interfaz común, y la entidadreceptora realizará la tarea solicitada de acuerdo a la propia implementaciónque tenga de�nida, independientemente de las otras implementaciones quetengan las otras entidades. Consistentemente con la noción de delegación,la entidad emisora se desentiende de la forma en que las otras entidadesimplementaron sus respuestas, ya sea igual, parecida o totalmente diferente.Analizando el concepto desde el punto de vista de las entidades que res-

ponden a la invocación, el proceso de desarrollo debe contemplar la variedady especi�cidad de cada una para responder adecuadamente a lo que se les

[email protected] 122 Antonio Carrillo Ledesma, Et alii

Page 125: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

solicita. Desde el punto de vista de la entidad que invoca, el proceso estransparente, y es en de�nitiva esta, la que se ve bene�ciada por el uso delconcepto.Otra forma de obtener un bloque de Software genérico es ante el caso en

que las entidades con las que el bloque quiere comunicarse, en vez de tenerdiferentes implementaciones, aún siendo de diferente tipo, sean lo su�ciente-mente similares para compartir una misma y única implementación.Desde el punto de vista de la entidad que invoca, el proceso continúa

siendo transparente y sigue aprovechando los bene�cios de haber delegado latarea y haberse despreocupado de qué tipo de entidad es la receptora. En estecaso, el concepto de polimor�smo se relaciona o se basa en la coexistencia deherencia, de variables de tipo de dato o en las formas débiles de declaracióny chequeo de tipos de datos, dependiendo de las diferentes herramientas decada paradigma.

Asignación y Uni�cación La asignación destructiva es una operación queconsiste en cambiar la información representada por una variable, de formatal que si se consulta su valor antes y después de dicha operación, se obtieneun resultado distinto. Estas asignaciones se realizan repetitivamente sobrela misma celda de memoria, remplazando los valores anteriores.La asignación determina el estado de una variable, que consiste en el

valor que contiene en un momento en particular. La asignación destructivaes la forma más usual de provocar efecto de lado, pero no la única, ya que,dependiendo de los lenguajes, hay otro tipo de instrucciones que tambiénpermiten modi�car el estado de información de un sistema.La uni�cación es un mecanismo por el cual una variable que no tiene

valor, asume un valor. Una vez uni�cada, o "ligada", como también se ledice, una variable no cambia su valor, por lo que no existe la noción de es-tado. La duración de la uni�cación está condicionado por el alcance quetienen las variables en cada lenguaje en particular, pudiendo una variableuni�carse con varios valores alternativos en diferentes momentos de la eje-cución del bloque de Software en el que se encuentran. Se suele denominarcomo "indeterminada" a una variable sin ligar o no uni�cada.

Modo de Evaluación Los parámetros que se utilizan en la invocación deun bloque de Software cualquiera pueden ser evaluados en diferentes momen-tos de acuerdo al modo de evaluación que utilice el lenguaje de programación.

[email protected] 123 Antonio Carrillo Ledesma, Et alii

Page 126: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

La evaluación ansiosa consiste en que los argumentos son evaluados antesde invocar al bloque de Software y es responsabilidad de la entidad que losinvoca.La evaluación diferida plantea que la evaluación de los argumentos es res-

ponsabilidad del bloque de Software invocado, quien decide el momento enque lo hará. Provoca que se di�era la evaluación de una expresión, permi-tiendo que en algunos casos, de acuerdo a cómo sea la implementación, nosea necesario evaluarla nunca, con el consiguiente bene�cio en términos dee�ciencia.La evaluación diferida es utilizada en cierto tipo de situaciones que serían

consideradas erróneas o imposibles de resolver con la evaluación ansiosa,como por ejemplo los bucles o las listas in�nitas.

Orden Superior Asumiendo un esquema de un único orden, en un pro-grama existen por un lado datos y por otro los procedimientos � y todobloque de Software� que trabajan con ellos, de manera tal que los proce-dimientos reciben datos como parámetros y devuelven datos como resulta-dos. La noción de orden superior plantea que los procedimientos son tratadoscomo datos y en consecuencia pueden ser utilizados como parámetros, repre-sentados en variables, devueltas como resultados u operados en cálculos máscomplejos con otros datos. Se denomina de orden superior a los procedimien-tos que reciben como argumentos a otros procedimientos.

Recursividad La recursividad, entendida como iteración con asignaciónno destructiva, está relacionada con el principio de inducción. En general,un bloque de Software recursivo se de�ne con al menos un término recursivo,en el que se vuelve a invocar el bloque que se está de�niendo, y algún términono recursivo como caso base para detener la recursividad.

[email protected] 124 Antonio Carrillo Ledesma, Et alii

Page 127: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

4.2 Algo de Programación

Tipos de datos Dependiendo del lenguaje (véase [7], [8], [9] y [10]), laimplementación del mismo y la arquitectura en la que se compile/ejecute elprograma, se tienen distintos tipos de datos, pero los básicos son48:

� char, 8 bits, rango de -128 a 127

� unsigned char, 8 bits, rago de 0 a 255

� int, 16 bits, rango de -32,768 a 32,767

� unsigned int, 16 bits, rango de 0 a 65,535

� long int, 32 bits, rango de -2,147,483,648 a 2,147,483,647

� long, 64 bits, rango de -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807

� �oat, 32 bits, rango de -3.4x1038 a 3.4x1038, con 14 dígitos de precisión

� double, 64 bits, rango de -1.7x10308 a 1.7x10308, con 16 dígitos de precisión

� long double, 80 bits, 3.4x10�4932 a 3.4x104932, con 18 dígitos de precisión

� boolean, 1 bit, rango de True o False

La conversión entre los diferentes tipos de datos esta en función dellenguaje y existe una perdida de datos si se hace de un tipo de dato queno "quepa" en el rango del otro; estos y otros errores de programación hangenerado graves errores en el sistema automatizado de control que han de-sembocado por ejemplo en, misiones fallidas de cohetes espaciales y su cargaen numerosas ocasiones49, la quiebra de la empresa Knight Capital 2012,sobredosis de radioterapia en 1985 a 1987, la desactivación de servidores deAmazon en el 2012, el apagón en el noreste de EE.UU. en el 2003, fallo enel sistema de reserva de vuelos de American Airlines en el 2013, fallo en elsistema de misiles estadounidense Patriot en Dhahran en el 1991, etc.

48La precedencia de los operadores básicos son: = el de mayor procedencia, siguen � y+ unario, luego �; =;% y �nalmente los operadores + y �.49Una de las pérdidas, fue el satélite mexicano Centenario en mayo del 2015.

[email protected] 125 Antonio Carrillo Ledesma, Et alii

Page 128: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Condicionales El �ujo de programas a menudo tiene que dividirse. Esdecir, si una condición se cumple, se hace algo, y si no, se hace otra cosa. Losenunciados condicionales permiten cambiar el comportamiento del programade acuerdo a una condición dada, la estructura básica de un condicional es:Pseudocódigo:

Si <condición> entonces<acción>

Ejemplo en C, C++ y Java50:

if (x > 0) x*= 10;

if (x > 0) {x *= 10;

}

Ejemplo en Python:

if x > 0:x = x * 10

La estructura completa del condicional es:Pseudocódigo:

Si <condición> entonces<acción>

else<acción>

Ejemplo en C, C++ y Java:

if (x % 2 == 0) x = x * x;else x = x * 2;

if (x % 2 == 0) {x = x * x;

} else {x = x * 2;

}

50En condicionales, tienen mayor precedencia <;>;>=; <=, luego están == y ! =,�nalmente && (AND) y jj (OR).

[email protected] 126 Antonio Carrillo Ledesma, Et alii

Page 129: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ejemplo en Python:

if x % 2 == 0:x = x * x

else:x = x * 2

La estructura condicional encadenada es:Pseudocódigo:

Si <condición> entonces<acción>

else if<acción>

else<acción>

Ejemplo en C, C++ y Java:

if (x < y) {z = x;

} else if (x > y) {z = y;

} else {z = 0;

}

Ejemplo en Python:

if x < y:z = x

elif51 x > y:z = y

else:z = 0

51elif es una contracción de "else if", sirve para enlazar varios "else if", sin tener queaumentar las tabulaciones en cada nueva comparación.

[email protected] 127 Antonio Carrillo Ledesma, Et alii

Page 130: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Condicionales con operadores lógicos, tenemos dos operadores lógicos elAND (&&) y el OR (jj), ejemplos:Pseudocódigo:

Si <condición operador condición> entonces<acción>

else<acción>

Ejemplo en C, C++ y Java:

if (x % 2 == 0 jj x > 0) x = x * x;else x = x * 2;

if (x % 2 == 0 && x > 0) {x = x * x;

} else {x = x * 2;

}

Ejemplo en Python:

if x % 2 == 0 and x > 0:x = x * x

else:x = x * 2

Bucle for La implementación de bucles mediante el comando for per-mite ejecutar el código que se encuentre entre su cuerpo mientras una variablese encuentre entre 2 determinados parámetros, la estructura básica es:Pseudocódigo:

for <inicio; mientras; incremento/decremento> entonces<acción>

Ejemplo en C, C++ y Java:

for (x = 0; x < 21; x++) {z = z + x;

}

[email protected] 128 Antonio Carrillo Ledesma, Et alii

Page 131: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ejemplo en Python:

for x in range(0, 21)z = z + x

Bucle while La implementación de bucles mediante el comando whilepermite ejecutar el código que se encuentre entre su cuerpo mientras unacondición se cumple, la estructura básica es:Pseudocódigo:

while <condición> entonces<acción>

Ejemplo en C, C++ y Java:

while (z < 20) {z = z + x;

}

Ejemplo en Python:

while z < 20:z = z + x

Bucle do-while La implementación de bucles mediante el comando do-while permite ejecutar el código que se encuentre entre su cuerpo y despuésrevisa si se cumple la condición para continuar el ciclo, se puede usar do-whileen C, C++ y Java, pero no esta presente en Python. La estructura básicaes:Pseudocódigo:

do<acción>

while <condición>

Ejemplo en C, C++ y Java:

do {z = z + x;

} while (z < 20);

[email protected] 129 Antonio Carrillo Ledesma, Et alii

Page 132: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Condicional switch Cuando se requiere hacer un condicional sobreuna variable y que esta tenga varias alternativas, una opción para evitar unacadena de sentencias if-else, se puede usar switch en C, C++ y Java, perono esta presente en Python. La estructura básica es:Pseudocódigo:

switch(expresion) {case constante:<acción>break;

case constante:<acción>break;

.

.

.default:<acción>

}

son opcionales los break y el default.

Ejemplo en C, C++ y Java:

switch(i) {case 1:x=23;

case 2:x ++;break;

default:x=0;

}

[email protected] 130 Antonio Carrillo Ledesma, Et alii

Page 133: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Primer ejemplo Como ya se ha hecho costumbre, el primer ejemplo deun programa es: Hola Mundo, así que iniciemos con ello creando el archivocorrespondiente hola.ext52 en cualquier editor de texto o en un IDE, entonces:Ejemplo en C:

#include <stdio.h>int main(void) {printf("Hello Worldnn");return 0;

}

para compilarlo usamos gcc en línea de comandos (véase 3.2) mediante:

$ gcc hola.c -o hola

y lo ejecutamos con:

$ ./hola

Ejemplo en C++:

#include <iostream>int main() {std::cout << "Hello World!nn";

}

para compilarlo usamos g++ en línea de comandos mediante:

$ g++ hola.cpp -o hola

y lo ejecutamos con:

$ ./hola

52La extensión depende del lenguaje de programación, para el lenguaje C la extensiónes .c, para el lenguaje C++ la extensión es .cpp, para el lenguaje Java la extensión es.java, para el lenguaje Python la extensión es .py.

[email protected] 131 Antonio Carrillo Ledesma, Et alii

Page 134: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ejemplo en Java:

class hola {public static void main(String[] args) {System.out.println("Hello world!");

}}

para compilarlo usamos javac en línea de comandos mediante:

$ javac hola.java

y lo ejecutamos con:

$ java hola

Ejemplo en Python 2:

print "Hello Worldnn"

para compilarlo y ejecutarlo usamos python2 en línea de comandos me-diante:

$ python2 hola.py

Ejemplo en Python 3:

print ("Hello Worldnn")

para compilarlo y ejecutarlo usamos python3 en línea de comandos me-diante:

$ python3 hola.py

[email protected] 132 Antonio Carrillo Ledesma, Et alii

Page 135: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Un Ejemplo de Cálculo de Primos El algoritmo más simple, para de-terminar si un número es primo o compuesto, es hacer una serie de divisionessucesivas del número, con todos los números primos menores que él, si algunadivisión da como residuo 0 o es divisible con el número entonces es compuestoen caso contrario es primo.

� Iniciamos con el número 4

� Veri�camos si es divisible con los primos almacenados (iniciamos con 2y 3)

� Si es divisible con algún número primo entonces es compuesto, en casocontrario es primo y este se guarda como un nuevo primo

� se incrementa uno al número y se regresa a veri�car si es divisibleentre los números primos almacenados, hasta encontrar por ejemplolos primeros mil primos

Ejemplo en C y C++:

#include <stdio.h>// NPB Numero de primos a buscar#de�ne NPB 1000int main (){int n, i, np;int p[NPB];// Guarda los primeros 2 primosp[0] = 2;p[1] = 3;np = 2;// Empieza la busqueda de primos a partir del numero 4n = 4;// Ciclo para buscar los primeros NPB primoswhile (np < NPB){for (i = 0; i < np; i++){if((n % p[i]) == 0) break;

[email protected] 133 Antonio Carrillo Ledesma, Et alii

Page 136: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

}if(i == np){p[i] = n;np++;

}n++;

}// Visualiza los primos encontradosprintf("nnVisualiza los primeros %d primosnn", NPB);for (i = 0; i < NPB; i++)printf("%dnn", p[i]);

return 0;}

Ejemplo en Java:

public class CalPrimos {public static void main(String[] args) {// NPB Numero de primos a buscarint NPB = 1000;int n, i, np;int p[] = new int[NPB];// Guarda los primeros 2 primosp[0] = 2;p[1] = 3;np = 2;// Empieza la busqueda de primos a partir del numero 4n = 4;// Ciclo para buscar los primeros NPB primoswhile (np < NPB) {for (i = 0; i < np; i++) {if((n % p[i]) == 0) break;

}if (i == np) {p[i] = n;np++;

}

[email protected] 134 Antonio Carrillo Ledesma, Et alii

Page 137: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

n++;}// Visualiza los primos encontradosSystem.out.println("Visualiza los primeros " + NPB + "

primos");for (i = 0; i < NPB; i++) System.out.println(p[i]);

}}

Nótese que el algoritmo para buscar primos de los lenguajes C, C++ yel de Java son muy similares salvo la declaración de la función inicial y elarreglo que contendrá a los primos. Esto deja patente la cercanía entre dichoslenguajes y por que en este trabajo los presentamos en forma conjunta.Ejemplo en Python:

def cribaEratostenes(N):p = [] # inicializa el arreglo de primos encontrados# Guarda los primeros 2 primosp.append(2)p.append(3)np = 2# Empieza la busqueda de primos a partir del numero 4n = 4#Ciclo para buscar los primeros N primoswhile np < N:xi = 0for i in p:53

xi = xi + 1if (n % i) == 0:break

if xi == np:p.append(n)np = np + 1

n = n + 1# Visualiza los primos encontrados

53En este código, al usar el for sobre los elementos del arreglo de primos, es necesariousar un contador para saber si ya se recorrieron todos los primos existentes y así determinarsi es un nuevo primo y agregarlo a la lista.

[email protected] 135 Antonio Carrillo Ledesma, Et alii

Page 138: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

print("Visualiza los primeros " + str(N) + " primos ")for i in range(np):print(p[i])

return p# Solicita el calculo de los primeros primosP = cribaEratostenes(1000)print(P)

Otro ejemplo en Python:

def cribaEratostenes(N):p = [] # inicializa el arreglo de primos encontrados# Guarda los primeros 2 primosp.append(2)p.append(3)np = 2# Empieza la busqueda de primos a partir del numero 4n = 4#Ciclo para buscar los primeros N primoswhile np < N:for i in range(np):54

if (n % p[i]) == 0:break

if i == np-1:p.append(n)np = np + 1

n = n + 1# Visualiza los primos encontradosprint("Visualiza los primeros " + str(N) + " primos ")for i in range(np):print(p[i])

return p# Solicita el calculo de los primeros primosP = cribaEratostenes(1000)print(P)

54Aquí, se hace el recorrido sobre el arreglo de primos usando la indexación sobre suselementos, usando el número de elementos que se tiene mediante el uso del for con unrange.

[email protected] 136 Antonio Carrillo Ledesma, Et alii

Page 139: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

4.3 Introducción a los Paradigmas de Programación

La construcción de programas de cómputo � Software� puede involucrarelementos de gran complejidad, que en muchos casos no son tan evidentescomo los que se pueden ver en otras Ciencias e Ingenierías. Un avión, unamina, un edi�cio, una red de ferrocarriles son ejemplos de sistemas complejosde otras Ingenierías, pero el programador construye sistemas cuya compleji-dad puede parecer que permanece oculta. El usuario siempre supone que eninformática todo es muy fácil � "apretar un botón y ya esta"� .Cuando se inicia uno en la programación, es común el uso de pequeños

ejemplos, generalmente se programa usando una estructura secuencial � unainstrucción sigue a la otra� en programas cortos55, cuando los ejemplos cre-cen se empieza a usar programación estructurada56 � que usa funciones�para después proseguir con ejemplos más complejos haciendo uso de la pro-gramación orientada a objetos � uso de clases y objetos� o formulacioneshíbridas de las anteriores57.A continuación delinearemos estos paradigmas de programación:

Programación Secuencial es un paradigma de programación en la queuna instrucción del código sigue a otra en secuencia también conocido comocódigo espagueti. Las tareas se suceden de tal modo que la salida de una esla entrada de la siguiente y así sucesivamente hasta el �n del programa.

55Los ejemplos no son complejos, suelen estar construidos y mantenidos por una o pocaspersonas, son códigos de cientos o miles de líneas y tienen un ciclo de vida corto. Además,se puede construir aplicaciones alternativas en un período razonable de tiempo y no senecesitan grandes esfuerzos en anális y diseño.56Al crecer la complejidad del Software a desarrollar, es muy difícil o imposible que un

desarrollador o un grupo pequeño de ellos pueda comprender todas las sutilidades de sudiseño, para paliar los problemas que conlleva el desarrollo de grandes y complejos sistemasinformáticos surge la programación orientada a objetos.57El surgimiento de la programación orientada objetos trata de lidiar con una gran canti-

dad de requisitos que compiten entre sí, incluso contradiciéndose, tienen desacoplamientosde impedancias entre usuarios del sistema y desarrolladores y es común la modi�caciónde los requisitos con el paso del tiempo pues los usuarios y desarrolladores comienzan acompenetrarse mejor. Así, la programación orientada a objetos permite dirigir un equipogrande de desarrolladores, manejar una gran cantidad de código, usar estándares de de-sarrollo � al igual que en otras ingenierías� y veri�car la �abilidad de los estándaresexistentes en el mercado.

[email protected] 137 Antonio Carrillo Ledesma, Et alii

Page 140: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Programación Estructurada también llamada Procedimental, es un pa-radigma de programación orientado a mejorar la claridad, calidad y tiempode desarrollo de un programa de computadora recurriendo únicamente a sub-rutinas y tres estructuras básicas: secuencia, selección (if y switch) e iteración(bucles for y while); así mismo, se considera innecesario y contraproducenteel uso de la instrucción de transferencia incondicional, que podría conducira código espagueti, mucho más difícil de seguir y de mantener, y fuente denumerosos errores de programación.Entre las ventajas de la programación estructurada sobre el modelo an-

terior � hoy llamado despectivamente código espagueti� , cabe citar las si-guientes:

� Los programas son más fáciles de entender, pueden ser leídos de formasecuencial y no hay necesidad de tener que rastrear saltos de líneasdentro de los bloques de código para intentar entender la lógica interna.

� La estructura de los programas es clara, puesto que las instruccionesestán más ligadas o relacionadas entre sí.

� Se optimiza el esfuerzo en las fases de pruebas y depuración. El segui-miento de los fallos o errores del programa (debugging), y con él sudetección y corrección se facilita enormemente.

� Se reducen los costos de mantenimiento. Análogamente a la depu-ración, durante la fase de mantenimiento, modi�car o extender los pro-gramas resulta más fácil.

� Los programas son más sencillos y más rápidos de confeccionar.

� Se incrementa el rendimiento de los programadores.

Programación Orientada a Objetos (POO, u OOP según sus siglasen inglés) es un paradigma de programación que viene a innovar la formade obtener resultados. El surgimiento de la programación orientada obje-tos trata de lidiar con una gran cantidad de requisitos que compiten entresí, incluso contradiciéndose, tienen desacoplamientos de impedancias entreusuarios del sistema y desarrolladores y es común la modi�cación de los re-quisitos con el paso del tiempo pues los usuarios y desarrolladores comienzana compenetrarse mejor. Así, la programación orientada a objetos permite

[email protected] 138 Antonio Carrillo Ledesma, Et alii

Page 141: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

dirigir un equipo grande de desarrolladores, manejar una gran cantidad decódigo, usar estándares de desarrollo � al igual que en otras ingenierías� yveri�car la �abilidad de los estándares existentes en el mercado.Los objetos manipulan los datos de entrada para la obtención de datos

de salida especí�cos, donde cada objeto ofrece una funcionalidad especial.Los objetos son entidades que tienen un determinado «estado» , «compor-tamiento (método)» e «identidad» :

� La identidad es una propiedad de un objeto que lo diferencia del resto;dicho con otras palabras, es su identi�cador � concepto análogo al deidenti�cador de una variable o una constante� .

� Un objeto contiene toda la información que permite de�nirlo e identi�-carlo frente a otros objetos pertenecientes a otras clases e incluso frentea objetos de una misma clase, al poder tener valores bien diferencia-dos en sus atributos. A su vez, los objetos disponen de mecanismosde interacción llamados métodos, que favorecen la comunicación entreellos. Esta comunicación favorece a su vez el cambio de estado en lospropios objetos. Esta característica lleva a tratarlos como unidadesindivisibles, en las que no se separa el estado y el comportamiento.

� Los métodos (comportamiento) y atributos (estado) están estrechamenterelacionados por la propiedad de conjunto. Esta propiedad destaca queuna clase requiere de métodos para poder tratar los atributos con losque cuenta. El programador debe pensar indistintamente en ambosconceptos, sin separar ni darle mayor importancia a alguno de ellos.Hacerlo podría producir el hábito erróneo de crear clases contenedo-ras de información por un lado y clases con métodos que manejen alas primeras por el otro. De esta manera se estaría realizando una«programación estructurada camu�ada» en un lenguaje de POO.

La programación orientada a objetos di�ere de la programación estruc-turada tradicional, en la que los datos y los procedimientos están separados ysin relación, ya que lo único que se busca es el procesamiento de unos datos deentrada para obtener otros de salida. La programación estructurada anima alprogramador a pensar sobre todo en términos de procedimientos o funciones,y en segundo lugar en las estructuras de datos que esos procedimientos mane-jan. En la programación estructurada solo se escriben funciones que procesan

[email protected] 139 Antonio Carrillo Ledesma, Et alii

Page 142: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

datos. Los programadores que emplean POO, en cambio, primero de�nen ob-jetos para luego enviarles mensajes solicitándoles que realicen sus métodospor sí mismos.

Conceptos fundamentales La programación orientada a objetos esuna forma de programar que trata de encontrar solución a los problemas quegenera el desarrollo de proyectos de tamaño mediano o grande y/o complejos.Introduce nuevos conceptos, que superan y amplían conceptos antiguos yaconocidos. Entre ellos destacan los siguientes:

� Clase: se puede de�nir de las propiedades y comportamiento de un tipode objeto concreto. La instanciación es la lectura de estas de�nicionesy la creación de un objeto a partir de ella.

� Herencia: Por ejemplo, la herencia de la clase C a la clase D, es la facili-dad mediante la cual la clase D hereda en ella cada uno de los atributosy operaciones de C, como si esos atributos y operaciones hubiesen sidode�nidos por la misma D. Por lo tanto, puede usar los mismos métodosy variables registrados como «públicos (public)» en C. Los compo-nentes registrados como «privados (private)» también se heredan perose mantienen escondidos al programador y sólo pueden ser accedidos através de otros métodos públicos. Para poder acceder a un atributo uoperación de una clase en cualquiera de sus subclases pero mantenerlaoculta para otras clases es necesario registrar los componentes como«protegidos (protected)» , de esta manera serán visibles en C y en Dpero no en otras clases.

� Objeto: La instancia de una clase. Entidad provista de un conjunto depropiedades o atributos (datos) y de comportamiento o funcionalidad(métodos), los mismos que consecuentemente reaccionan a eventos. Secorresponden con los objetos reales del mundo que nos rodea, o conobjetos internos del sistema (del programa).

� Método: Es un algoritmo asociado a un objeto (o a una clase de obje-tos), cuya ejecución se desencadena tras la recepción de un «mensaje» .Desde el punto de vista del comportamiento, es lo que el objeto puedehacer. Un método puede producir un cambio en las propiedades delobjeto, o la generación de un «evento» con un nuevo mensaje paraotro objeto del sistema.

[email protected] 140 Antonio Carrillo Ledesma, Et alii

Page 143: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Evento: Es un suceso en el sistema � tal como una interacción delusuario con la máquina, o un mensaje enviado por un objeto� . Elsistema maneja el evento enviando el mensaje adecuado al objeto per-tinente. También se puede de�nir como evento la reacción que puededesencadenar un objeto; es decir, la acción que genera.

� Atributos: Características que tiene la clase.

� Mensaje: Una comunicación dirigida a un objeto, que le ordena queejecute uno de sus métodos con ciertos parámetros asociados al eventoque lo generó.

� Propiedad o atributo: Contenedor de un tipo de datos asociados a unobjeto (o a una clase de objetos), que hace los datos visibles desde fueradel objeto y esto se de�ne como sus características predeterminadas, ycuyo valor puede ser alterado por la ejecución de algún método.

� Estado interno: Es una variable que se declara privada, que puede serúnicamente accedida y alterada por un método del objeto, y que seutiliza para indicar distintas situaciones posibles para el objeto (o clasede objetos). No es visible al programador que maneja una instancia dela clase.

� Componentes de un objeto: Atributos, identidad, relaciones y métodos.

� Identi�cación de un objeto: Un objeto se representa por medio deuna tabla o entidad que esté compuesta por sus atributos y funcionescorrespondientes.

Características de la POO Existe un acuerdo acerca de qué carac-terísticas contempla la «orientación a objetos» . Las características siguientesson las más importantes:

� Abstracción: Denota las características esenciales de un objeto, dondese capturan sus comportamientos. Cada objeto en el sistema sirvecomo modelo de un «agente» abstracto que puede realizar trabajo, in-formar y cambiar su estado, y «comunicarse» con otros objetos en elsistema sin revelar «cómo» se implementan estas características. Losprocesos, las funciones o los métodos pueden también ser abstraídos,

[email protected] 141 Antonio Carrillo Ledesma, Et alii

Page 144: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

y, cuando lo están, una variedad de técnicas son requeridas para am-pliar una abstracción. El proceso de abstracción permite seleccionar lascaracterísticas relevantes dentro de un conjunto e identi�car compor-tamientos comunes para de�nir nuevos tipos de entidades en el mundoreal. La abstracción es clave en el proceso de análisis y diseño orientadoa objetos, ya que mediante ella podemos llegar a armar un conjuntode clases que permitan modelar la realidad o el problema que se quiereatacar.

� Encapsulamiento: Signi�ca reunir todos los elementos que pueden con-siderarse pertenecientes a una misma entidad, al mismo nivel de abs-tracción. Esto permite aumentar la cohesión (diseño estructurado) delos componentes del sistema.

� Polimor�smo: Comportamientos diferentes, asociados a objetos distin-tos, pueden compartir el mismo nombre; al llamarlos por ese nombrese utilizará el comportamiento correspondiente al objeto que se estéusando. O, dicho de otro modo, las referencias y las colecciones deobjetos pueden contener objetos de diferentes tipos, y la invocación deun comportamiento en una referencia producirá el comportamiento co-rrecto para el tipo real del objeto referenciado. Cuando esto ocurre en«tiempo de ejecución» esta última característica se llama asignacióntardía o asignación dinámica.

� Herencia: Las clases no se encuentran aisladas, sino que se relacio-nan entre sí, formando una jerarquía de clasi�cación. Los objetosheredan las propiedades y el comportamiento de todas las clases a lasque pertenecen. La herencia organiza y facilita el polimor�smo y el en-capsulamiento, permitiendo a los objetos ser de�nidos y creados comotipos especializados de objetos preexistentes. Estos pueden compartir(y extender) su comportamiento sin tener que volver a implementarlo.Esto suele hacerse habitualmente agrupando los objetos en clases yestas en árboles o enrejados que re�ejan un comportamiento común.Cuando un objeto hereda de más de una clase se dice que hay herenciamúltiple; siendo de alta complejidad técnica por lo cual suele recurrirsea la herencia virtual para evitar la duplicación de datos.

� Modularidad: Se denomina «modularidad» a la propiedad que permitesubdividir una aplicación en partes más pequeñas (llamadas módulos),

[email protected] 142 Antonio Carrillo Ledesma, Et alii

Page 145: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

cada una de las cuales debe ser tan independiente como sea posible dela aplicación en sí y de las partes restantes. Estos módulos se puedencompilar por separado, pero tienen conexiones con otros módulos. Aligual que la encapsulación, los lenguajes soportan la modularidad dediversas formas.

� Principio de ocultación: Cada objeto está aislado del exterior, es unmódulo natural, y cada tipo de objeto expone una «interfaz» a otrosobjetos que especí�ca cómo pueden interactuar con los objetos de laclase. El aislamiento protege a las propiedades de un objeto contra sumodi�cación por quien no tenga derecho a acceder a ellas; solamentelos propios métodos internos del objeto pueden acceder a su estado.Esto asegura que otros objetos no puedan cambiar el estado internode un objeto de manera inesperada, eliminando efectos secundarios einteracciones inesperadas.

� Recolección de basura: La recolección de basura (garbage collection)es la técnica por la cual el entorno de objetos se encarga de destruirautomáticamente, y por tanto desvincular la memoria asociada, losobjetos que hayan quedado sin ninguna referencia a ellos. Esto signi�caque el programador no debe preocuparse por la asignación o liberaciónde memoria, ya que el entorno la asignará al crear un nuevo objeto yla liberará cuando nadie lo esté usando.

Muchos de los objetos prediseñados de los lenguajes de programación ac-tuales permiten la agrupación en bibliotecas o librerías, sin embargo, muchosde estos lenguajes permiten al usuario la creación de sus propias bibliotecas.Está basada en varias técnicas, incluyendo herencia, cohesión, abstracción,polimor�smo, acoplamiento y encapsulamiento.

Recursión o Recursividad Un concepto que siempre le cuesta bastantea los programadores que están empezando es el de recursión o recursividad(se puede decir de las dos maneras). La recursividad consiste en funcionesque se llaman a sí mismas, evitando el uso de bucles y otros iteradores.Uno ejemplo fácil de ver y que se usa a menudo es el cálculo del factorial

de un número entero. El factorial de un número se de�ne como ese númeromultiplicado por el anterior, éste por el anterior, y así sucesivamente hasta

[email protected] 143 Antonio Carrillo Ledesma, Et alii

Page 146: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

llegar a 1. Así, por ejemplo, el factorial del número 5 sería: 5x4x3x2x1 =120.Tomando el factorial como base para un ejemplo, ¿cómo podemos crear

una función que calcule el factorial de un número? Bueno, existen multitudde formas. La más obvia quizá sería simplemente usar un bucle determinadopara hacerlo, algo así en C:

long factorial(int n){long res = 1;for(int i=n; i>=1; i- -) res = res * i;return res;

}

Sin embargo hay otra forma de hacerlo sin necesidad de usar ningunaestructura de bucle que es mediante recursividad. Esta versión de la funciónhace exactamente lo mismo, pero es más corta, más simple y más elegante:

long factorial(int n){long fact;if (n <= 1) return 1;return n*factorial(n-1);

}

Aquí lo que se hace es que la función se llama a sí misma (eso es recur-sividad), y deja de llamarse cuando se cumple la condición de parada (eneste caso que el argumento sea menor o igual que 1 que es lo que hay en elcondicional).

Ventajas e inconvenientes ¿Ganamos algo al utilizar recursión enlugar de bucles/iteradores para casos como este?En este caso concreto del cálculo factorial no, y de hecho es una forma más

lenta de hacerlo y ocupa más memoria. Esto no es preocupante en la realidad,pero conviene saberlo. Lo del factorial es solo una forma de explicarlo conun ejemplo sencillo y que sea fácil de entender.Pero entonces, si no ganamos nada en este caso ¿para qué sirve realmente

la recursividad?Pues para resolver ciertos problemas de manera elegante y e�ciente. El

ejemplo típico sería el recorrer un árbol de elementos para hacer algo con

[email protected] 144 Antonio Carrillo Ledesma, Et alii

Page 147: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

todos ellos. Imagínate un sistema de archivos con carpetas y subcarpetasy archivos dentro de estas carpetas, o el árbol de elementos de una páginaWeb donde unos elementos incluyen a su vez otros y no sabes cuántos hay encada uno. En este tipo de situaciones la manera más e�ciente de hacer unafunción que recorra todos los elementos es mediante recursión. Es decir, secrea una función que recorra todos los elementos hijo del nodo que se le pasey que se llame a sí misma para hacer lo mismo con los subnodos que haya.En el caso del sistema de archivos se le pasaría una carpeta y se llamaríaa sí misma por cada subcarpeta que hubiese, y así sucesivamente con todaslas demás. Con una sola llamada inicial recorrerá automáticamente toda laestructura del sistema de archivos.Con eso, y sin necesidad de complicarse, de repente se tiene una función

muy poderosa capaz de enumerar cualquier estructura arbitraria por com-pleja que sea. Ahí es donde se ve el verdadero poder de la recursividad,aunque hay aplicaciones más potentes y más complejas todavía.

Detalles a Tener en Cuenta Otra cosa importante a tener en cuentaes que, cada vez que se hace una llamada a una función desde otra función(aunque sea a sí misma), se crea una nueva entrada en la pila de llamadasdel intérprete. Esta tiene un espacio limitado por lo que puede llegar unpunto en el que si se hacen demasiadas se sature y se produzca un error.A este error se le denomina "Desbordamiento de pila" o "Stack Over�ow".Ahora ya sabemos de donde viene el nombre del famoso sitio para dudas deprogramadores sin el que la programación moderna no sería posible.Además, hay que tener mucho cuidado con la condición de parada. Esta

se re�ere a la condición que se debe comprobar para determinar que ya nose harán más llamadas a la función. Es en ese momento en el que empiezana devolverse los valores hacia "arriba", retornando a la llamada original.Si no tienes la condición de parada controlada pueden pasar varias cosas

(todas malas), como por ejemplo:

� Que se sature la pila y se produzca un desbordamiento

� Que se ocupe cada vez más memoria

� Que se produzcan desbordamientos de variables al ir acumulando re-sultados.

[email protected] 145 Antonio Carrillo Ledesma, Et alii

Page 148: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

4.4 Errores de Redondeo y de Aritmética en la Pro-gramación

La aritmética que realiza una computadora es distinta de la aritmética denuestros cursos de álgebra o cálculo. En nuestro mundo matemático tradi-cional consideramos la existencia de números con una cantidad in�nita decifras, en la computadora cada número representable tienen sólo un número�nito, �jo de cifras (véase 4.2), los cuales en la mayoría de los casos es satis-factoria y se aprueba sin más, aunque a veces esta discrepancia puede generarproblemas.

Un ejemplo de este hecho lo tenemos en el cálculo de raíces de:

ax2 + bx+ c = 0

cuando a 6= 0, donde las raíces se calculan comunmente con el algoritmo:

x1 =�b+

pb2 � 4ac2a

y x2 =�b�

pb2 � 4ac2a

o de forma alternativa con el algoritmo que se obtiene mediante la raciona-lización del numerador:

x1 =�2c

b+pb2 � 4ac

y x2 =�2c

b�pb2 � 4ac

Otro algoritmo que implementaremos es el método de Newton-Raphsonen su forma iterativa:

xi+1 = xi �f(xi)

f 0(xi)

en el cual se usa x0 como una aproximación a la raíz buscada y xn es laaproximación a la raíz (sí se converge a ella).

Salida del Cálculo de Raíces La implementación computacional se mues-tra en los programas desarrollados en distintos lenguajes (C, C++, Java yPython) usando diferentes paradigmas de programación ( secuencial, proce-dimental y orientada a objetos), todos ellos generan la siguiente salida:

[email protected] 146 Antonio Carrillo Ledesma, Et alii

Page 149: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Polinomio (1.000000) X^2 + (4.000000 )X + (1.000000) = 0

Chicharronera 1Raiz (-0.2679491924311228), evaluacion raiz: -4.4408920985006262e-16Raiz (-3.7320508075688772), evaluacion raiz: 0.0000000000000000e+00

Chicharronera 2Raiz (-0.2679491924311227), evaluacion raiz: 0.0000000000000000e+00Raiz (-3.7320508075688759), evaluacion raiz: -5.3290705182007514e-15

Metodo Newton-RaphsonValor inicial aproximado de X1 = -1.2679491924311228Raiz (-0.2679491924311227), evaluacion raiz: 0.0000000000000000e+00Valor inicial aproximado de X2 = -4.7320508075688759Raiz (-3.7320508075688772), evaluacion raiz: 0.0000000000000000e+00

En esta salida se muestra la raíz calculada y su evaluación en la ecuacióncuadrática, la cual debería de ser cero al ser una raíz, pero esto no ocurre engeneral por los errores de redondeo. Además, nótese el impacto de seleccionarel algoritmo numérico adecuado a los objetivos que persigamos en la solucióndel problema planteado.

En cuanto a la implementación computacional, el paradigma de progra-mación seleccionado depende la complejidad del algoritmo a implementar ysi necesitamos reusar el código generado o no.Si lo que necesitamos implementar computacionalmente es una fórmula

o conjunto de ellas que generen un código de decenas de líneas, la imple-mentación secuencial es su�ciente, si es menor a una centena de líneas puedeser mejor opción la implementación procedimental y si el proyecto es grandeo complejo, seguramente se optará por la programación orientada a objetoso formulaciones híbridas de las anteriores.

En última instancia, lo que se persigue en la programación es generar uncódigo (véase 4): correcto, claro, e�ciente, de fácil uso y mantenimiento, quesea �exible, reusable y en su caso portable.

[email protected] 147 Antonio Carrillo Ledesma, Et alii

Page 150: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ejemplo en C Usando Programación Estructurada: Escribimos elcódigo siguiente en cualquier editor y lo llamamos cuadratica.c:

#include <stdio.h>#include <math.h>

// Funcion cuadraticadouble f(double x, double a, double b, double c) {return (x * x * a + x * b + c);

}

// Derivada de la funcion cuadraticadouble df(double x, double a, double b) {return (2.0 * x * a + b);

}

// Evalua el valor X en la función cuadraticavoid evalua(double x, double a, double b, double c) {printf("nnRaiz (%1.16f), evaluacion raiz: %1.16e", x, (a * x * x

+ b * x + c));}

// Metodo Newton-Raphson// x = x - f(x)/f�(x)double metodoNewtonRapson(double x, int ni, double a, double

b, double c) {int i;for (i = 0; i < ni; i++) {x = x - (f(x, a, b, c) / df(x, a, b));

}return x;

}

// Funcion Principal ....int main() {// Coe�cientes del polinomiodouble A = 1.0, B = 4.0, C = 1.0;// Raices del polinomio

[email protected] 148 Antonio Carrillo Ledesma, Et alii

Page 151: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

double X1, X2, x;// Calculo del discriminantedouble d = B * B - 4.0 * A * C;// Raices realesif (d >= 0.0) {printf("nnPolinomio (%f) X^2 + (%f )X + (%f) = 0nn", A,

B, C);printf("nnChicharronera 1");X1 = (-B + sqrt(d)) / (2.0 * A);X2 = (-B - sqrt(d)) / (2.0 * A);evalua(X1, A, B, C);evalua(X2, A, B, C);printf("nnnnChicharronera 2");X1 = (-2.0 * C) / (B + sqrt(d));X2 = (-2.0 * C) / (B - sqrt(d));;evalua(X1, A, B, C);evalua(X2, A, B, C);// Metodo Newton-Raphsonprintf("nnnnMetodo Newton-Raphson");x = X1 - 1.0;printf("nnValor inicial aproximado de X1 = %f", x);x = metodoNewtonRapson(x, 6, A, B, C);evalua(x, A, B, C);x = X2 - 1.0;printf("nnValor inicial aproximado de X2 = %f", x);x = metodoNewtonRapson(x, 6, A, B, C);evalua(x, A, B, C);printf("nn");

} else {// Raices complejasprintf("Raices Complejas ...");}return 0;

}

[email protected] 149 Antonio Carrillo Ledesma, Et alii

Page 152: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ejemplo en C++ Usando Programación Orientada a Objetos Es-cribimos el código siguiente en cualquier editor y lo llamamos cuadratica.cpp:

#include <stdio.h>#include <math.h>#include<iostream>using namespace std;class cuadratica {private:

// Coe�cientes del polinomiodouble A, B, C;

// Funcion cuadraticadouble f(double x, double a, double b, double c) {return (x * x * a + x * b + c);

}

// Derivada de la funcion cuadraticadouble df(double x, double a, double b) {return (2.0 * x * a + b);

}

// Evalua el valor X en la función cuadraticavoid evalua(double x, double a, double b, double c) {printf("nnRaiz (%1.16f), evaluacion raiz: %1.16e", x, (a * x

* x + b * x + c));}

// Metodo Newton-Raphson// x = x - f(x)/f�(x)double metodoNewtonRapson(double x, int ni, double a, double

b, double c) {int i;for (i = 0; i < ni; i++) {x = x - (f(x, a, b, c) / df(x, a, b));

}return x;

}

[email protected] 150 Antonio Carrillo Ledesma, Et alii

Page 153: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

public:// Constructor de la clasecuadratica(double a, double b, double c) {A = a;B = b;C = c;

}// calculo de raicesvoid raices() {// Raices del polinomiodouble X1, X2, x;// Calculo del discriminantedouble d = B * B - 4.0 * A * C;

// Raices realesif (d >= 0.0) {printf("nnPolinomio (%f) X^2 + (%f )X + (%f) = 0nn",

A, B, C);printf("nnChicharronera 1");X1 = (-B + sqrt(d)) / (2.0 * A);X2 = (-B - sqrt(d)) / (2.0 * A);evalua(X1, A, B, C);evalua(X2, A, B, C);

printf("nnnnChicharronera 2");X1 = (-2.0 * C) / (B + sqrt(d));X2 = (-2.0 * C) / (B - sqrt(d));;evalua(X1, A, B, C);evalua(X2, A, B, C);// Metodo Newton-Raphsonprintf("nnnnMetodo Newton-Raphson");x = X1 - 1.0;printf("nnValor inicial aproximado de X1 = %f", x);x = metodoNewtonRapson(x, 6, A, B, C);evalua(x, A, B, C);x = X2 - 1.0;printf("nnValor inicial aproximado de X2 = %f", x);

[email protected] 151 Antonio Carrillo Ledesma, Et alii

Page 154: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

x = metodoNewtonRapson(x, 6, A, B, C);evalua(x, A, B, C);printf("nn");

} else {// Raices complejasprintf("Raices Complejas ...");

}}

};

int main(void){cuadratica cu1 = cuadratica(1.0, 4.0, 1.0);cu1.raices();return 0;

}

Ejemplo en Java Usando Programación Orientada a Objetos Es-cribimos el código siguiente en cualquier editor y lo llamamos cuadratica.java:

import java.lang.Math;public class cuadratica {// Coe�cientes del polinomiodouble A, B, C, d;

// Constructor de la clasepublic cuadratica(double a, double b, double c) {A = a;B = b;C = c;

}

// Funcion cuadraticapublic double f(double x) {return (x * x * A + x * B + C);

}

[email protected] 152 Antonio Carrillo Ledesma, Et alii

Page 155: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

// Evalua el valor X en la función cuadraticapublic void evalua(double x) {System.out.println("Raiz (" + x + ") , evaluacion raiz:" +

(A * x * x + B * x + C));}

// Derivada de la funcion cuadraticapublic double df(double x) {return (2.0 * x * A + B);

}

// Metodo Newton-Raphson// x = x - f(x)/f�(x)public double metodoNewtonRapson(double x, int ni) {for (int i = 0; i < ni; i++) {x = x - (f(x) / df(x));

}return x;

}

public void raices() {// Raices del polinomiodouble X1, X2, x;// Calculo del discriminanted = B * B - 4.0 * A * C;// Raices realesif (d >= 0.0) {System.out.println("");System.out.println("Raices Reales (" + A + ")X^2 + ("

+ B + ")X + (" + C + ") = 0");System.out.println("Chicharronera 1");X1 = (-B + Math.sqrt(d)) / (2.0 * A);X2 = (-B - Math.sqrt(d)) / (2.0 * A);evalua(X1);evalua(X2);System.out.println("");System.out.println("Chicharronera 2");X1 = (-2.0 * C) / (B + Math.sqrt(d));

[email protected] 153 Antonio Carrillo Ledesma, Et alii

Page 156: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

X2 = (-2.0 * C) / (B - Math.sqrt(d));;evalua(X1);evalua(X2);System.out.println("");// Metodo Newton-RaphsonSystem.out.println("Newton-Rapson");X1 = Math.round(X1);System.out.print("Valor inicial aproximado de X1 = " +

X1);x = metodoNewtonRapson(X1, 8);evalua(x);X2 = Math.round(X2);System.out.print("Valor inicial aproximado de X2 = " +

X2);x = metodoNewtonRapson(X2, 8);evalua(x);

} else {// Raices complejasSystem.out.println("Raices Complejas ...");

}}

// Funcion Principal ....public static void main(String[] args) {cuadratica cu1 = new cuadratica(1.0, 4.0, 1.0);cu1.raices();

}}

[email protected] 154 Antonio Carrillo Ledesma, Et alii

Page 157: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ejemplo en Python Usando Programación Orientada a ObjetosEscribimos el código siguiente en cualquier editor y lo llamamos cuadra-tica.py:

#!/usr/bin/python3# -*- coding: utf-8 -*-import mathclass Ejemplo:# Constuctordef __init__(self, a, b ,c):self.A = a;self.B = b;self.C = c;

# Funcion cuadraticadef f(self, x, a, b, c):return (x * x * a + x * b + c);

# Derivada de la funcion cuadraticadef df(self, x, a, b):return (2.0 * x * a + b);

# Evalua el valor X en la funcion cuadraticadef evalua(self, x, a, b, c):print(�Raiz (%1.16f), evaluacion raiz: %1.16e�% (x, (a * x *

x + b * x + c)))# Metodo Newton-Raphson# x = x - f(x)/f�(x)def metodoNewtonRapson(self, x, ni, a, b, c):

for i in range(ni):x = x - (self.f(x, a, b, c) / self.df(x, a, b))

return x# Calculo de raicesdef raices(self):# Calculo del discriminanted = self.B * self.B - 4.0 * self.A * self.C

# Raices realesif d >= 0.0:

[email protected] 155 Antonio Carrillo Ledesma, Et alii

Page 158: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

print(�nnPolinomio (%f) X^2 + (%f )X + (%f) = 0nn�%(self.A, self.B, self.C))

print(�nnChicharronera 1�)X1 = (-self.B + math.sqrt(d)) / (2.0 * self.A)X2 = (-self.B - math.sqrt(d)) / (2.0 * self.A)self.evalua(X1, self.A, self.B, self.C)self.evalua(X2, self.A, self.B, self.C)print(�nnChicharronera 2�)X1 = (-2.0 * self.C) / (self.B + math.sqrt(d))X2 = (-2.0 * self.C) / (self.B - math.sqrt(d))self.evalua(X1, self.A, self.B, self.C)self.evalua(X2, self.A, self.B, self.C)# Metodo Newton-Raphsonprint("nnnnMetodo Newton-Raphson")x = X1 - 1.0;print("nnValor inicial aproximado de X1 = %1.16f" % x)x = self.metodoNewtonRapson(x, 6, self.A, self.B, self.C)self.evalua(x, self.A, self.B, self.C);x = X2 - 1.0;print("nnValor inicial aproximado de X2 = %1.16f" % x);x = self.metodoNewtonRapson(x, 6, self.A, self.B, self.C)self.evalua(x, self.A, self.B, self.C)print("nn")

else:# Raices complejasprint("Raices Complejas ...")

if __name__ == �__main__�:ej = Ejemplo(1.0, 4.0, 1.0)ej.raices()

[email protected] 156 Antonio Carrillo Ledesma, Et alii

Page 159: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

4.5 Lenguajes y Entornos de Desarrollo

Para programar, es necesario como mínimo contar con un editor de texto� como vi o nano� y acceso al compilador o intérprete del lenguaje que nosinterese. En Linux se tiene una gran variedad de lenguajes y herramientasde desarrollo � Linux fue hecho por programadores para programadores�que se pueden instalar. Pero, también están los entornos de desarrollo inte-grado o entorno de desarrollo interactivo � en inglés Integrated DevelopmentEnvironment (IDE)� , estas son aplicaciones informáticas que proporcionanservicios integrales para facilitarle al programador el desarrollo de Software.Normalmente, un IDE consiste de un editor de código fuente, herramien-

tas de construcción automáticas y un depurador. La mayoría de los IDEtienen auto-completado inteligente de código (IntelliSense). Algunos IDEcontienen un compilador, un intérprete, o ambos, tales como NetBeans yEclipse. El límite entre un IDE y otras partes del entorno de desarrollo deSoftware más amplio no está bien de�nido. Muchas veces, a los efectos desimpli�car la construcción de la interfaz grá�ca de usuario (GUI, por sussiglas en inglés) se integran un sistema controlador de versión y varias he-rramientas. Muchos IDE modernos también cuentan con un navegador declases, un buscador de objetos y un diagrama de jerarquía de clases, para suuso con el desarrollo de Software orientado a objetos.Los IDE están diseñados para maximizar la productividad del progra-

mador proporcionando componentes muy unidos con interfaces de usuariosimilares. Los IDE presentan un único programa en el que se lleva a cabotodo el desarrollo. Generalmente, este programa suele ofrecer muchas ca-racterísticas para la creación, modi�cación, compilación, implementación ydepuración de Software. Esto contrasta con el desarrollo de Software uti-lizando herramientas no relacionadas, como vi, GNU Compiler Collection(gcc) o make.Uno de los propósitos de los IDE es reducir la con�guración necesaria

para reconstruir múltiples utilidades de desarrollo, en vez de proveer el mismoconjunto de servicios como una unidad cohesiva. Reduciendo ese tiempo deajustes, se puede incrementar la productividad de desarrollo, en casos dondeaprender a usar un IDE es más rápido que integrar manualmente todas lasherramientas por separado.Una mejor integración de todos los procesos de desarrollo hace posi-

ble mejorar la productividad en general, que únicamente ayudando con losajustes de con�guración. Por ejemplo, el código puede ser continuamente

[email protected] 157 Antonio Carrillo Ledesma, Et alii

Page 160: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

armado, mientras es editado, previendo retroalimentación instantánea, comocuando hay errores de sintaxis. Esto puede ayudar a aprender un nuevolenguaje de programación de una manera más rápida, así como sus libreríasasociadas.Algunos IDE están dedicados especí�camente a un lenguaje de progra-

mación, permitiendo que las características sean lo más cercanas al para-digma de programación de dicho lenguaje. Por otro lado, existen muchosIDE de múltiples lenguajes tales como Eclipse, ActiveState Komodo, IntelliJIDEA, MyEclipse, Oracle JDeveloper, NetBeans, Codenvy y Microsoft VisualStudio. Por otro lado Xcode, Xojo y Delphi están dedicados a un lenguajecerrado o a un tipo de lenguajes de programación.Los IDE ofrecen un marco de trabajo amigable para la mayoría de los

lenguajes de programación tales como C++, Python, Java, C#, Delphi, Vi-sual Basic, etc. En algunos lenguajes, un IDE puede funcionar como unsistema en tiempo de ejecución, en donde se permite utilizar el lenguajede programación en forma interactiva, sin necesidad de trabajo orientado aarchivos de texto. Es deseable que un IDE cuente con las siguientes carac-terísticas:

� Multiplataforma

� Soporte para diversos lenguajes de programación

� Integración con Sistemas de Control de Versiones

� Reconocimiento de Sintaxis

� Extensiones y Componentes para el IDE

� Integración con Framework populares

� Depurador

� Importar y Exportar proyectos

� Múltiples idiomas

� Manual de Usuarios y Ayuda

� Componentes

� Editor de texto

[email protected] 158 Antonio Carrillo Ledesma, Et alii

Page 161: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Compilador.

� Intérprete

� Herramientas de automatización

� Depurador

� Posibilidad de ofrecer un sistema de control de versiones

� Factibilidad para ayudar en la construcción de interfaces grá�cas deusuarios

Algunos de los más usados son: Eclipse, Aptana, NetBeans, Sublime Text,Geany, Visual Studio, Brackets, Monodevelop, Komodo, Anjuta, CodeLite,Code::Blocks, PyDev, Eric, PyCharm, PTK, Spyder, Blue�sh, Glade, Kde-velop, Emacs, QtCreator, Android SDK, WxFormBuilder, etc.

Instalación de Java e IDEs en Debian GNU/Linux Existen diversasversiones de Java para Linux, la más usada es JDK de Oracle pero tam-bién esta una versión abierta llamada OpenJDK, para instalar por ejemploOpenJDK 8 en Debian GNU/Linux es necesario hacer:

# apt install openjdk-8-jre openjdk-8-jdk openjdk-8-doc

y después actualizar la versión por omisión de Java:

# update-java-alternatives -s java-1.8.0-openjdk-amd64

Además se pueden instalar diversas herramientas e IDEs para facilitar laprogramación en Java, para ello usar:

# apt install scite jedit kate gedit nedit emacs medit kscopegeany geany-plugins editra qtcreator anjuta anjuta-extras codelitecodelite-plugins tea vim-gtk mousepad eric# apt install eclipse eclipse-cdt eclipse-pydev netbeans blue-

�sh codeblocks codeblocks-contrib# apt install fte fte-console fte-terminal nano joe vim vim-

python-jedi vim-tlib vim-latexsuite vim-nox# apt install kdi¤3 meld di¤use dirdi¤ kompare numdi¤ col-

ordi¤ wdi¤ xxdi¤ tkdi¤ ndi¤# apt install alleyoop astyle c2html java2html code2html c2html

autodia txt2html html2text

[email protected] 159 Antonio Carrillo Ledesma, Et alii

Page 162: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Aprender a Programar en Java En la red existen múltiples sitios espe-cializados y una amplia bibliografía para aprender a programar cada uno delos distintos aspectos de Java, nosotros hemos seleccionado diversos textosque ponemos a su disposición en:

http://132.248.182.159/acl/Herramientas/Lenguajes/Java/

Instalación de C y C++ e IDEs en Debian GNU/Linux Exis-ten diversas versiones de C y C++ para Linux, para instalarlos en DebianGNU/Linux es necesario hacer:

# apt install build-essential manpages-dev glibc-doc glibc-doc-reference gcc-doc-base gcc-doc c++-annotations-pdf c++-compilerc-compiler g++ cppcheck splint cccc autoconf automake makecmake scons jam ohcount

Además se pueden instalar diversas herramientas e IDEs para facilitar laprogramación en C y C++, para ello usar:

# apt install scite jedit kate gedit nedit emacs medit kscopegeany geany-plugins editra qtcreator anjuta anjuta-extras codelitecodelite-plugins tea vim-gtk mousepad eric# apt install eclipse eclipse-cdt eclipse-pydev netbeans blue-

�sh codeblocks codeblocks-contrib# apt install fte fte-console fte-terminal nano joe vim vim-

python-jedi vim-tlib vim-latexsuite vim-nox# apt install kdi¤3 meld di¤use dirdi¤ kompare numdi¤ col-

ordi¤ wdi¤ xxdi¤ tkdi¤ ndi¤# apt install ddd-doc ddd gdb xxgdb kdbg valgrind valgrind-

mpi kcachegrind cppcheck time nemiver# apt install ggcov lcov gcov# apt install alleyoop astyle c2html java2html code2html c2html

autodia txt2html html2text

Aprender a Programar en C y C++ En la red existen múltiples sitiosespecializados y una amplia bibliografía para aprender a programar cada unode los distintos aspectos de C y C++, nosotros hemos seleccionado diversostextos que ponemos a su disposición en:

http://132.248.182.159/acl/Herramientas/Lenguajes/CyC++/

[email protected] 160 Antonio Carrillo Ledesma, Et alii

Page 163: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Instalación de Python e IDEs en Debian GNU/Linux Existen di-versas versiones de Python para Linux, para instalar Python 2 en DebianGNU/Linux es necesario hacer:

# apt install ipython python-matplotlib python-numpy python-scipy python-pandas python-sympy python-nose python-dev spy-der python-rpy2 python-rpy python-axiom python-pip python python-tk idle python-pmw python-imaging python-pip bpython python-pandas python-sklearn python-sklearn-doc wxglade python-rpy2pypy pypy-tk python-gnuplot pypy-six jython boa-constructorpyragua dreampie winpdb mypy python-mpi4py

para instalar Python 3 en Debian GNU/Linux es necesario hacer:

# apt install ipython3 python3 idle3 python3-pip python3-matplotlib python3-rpy2 python3-numpy python3-scipy spyder3bpython3 python3-pandas python-sklearn python-sklearn-doc pyzopyzo-doc spe eric python-wxgtk3.0 python-wxgtk3.0-dev python3-mpi4py

Para instalar Jupyter (entorno de trabajo orientado a cientí�cos que so-porta los lenguajes R y Python):

# apt install jupyter-console jupyter-notebook# pip3 install jupyter# pip3 install matplotlib# pip3 install ipywidgets# jupyter nbextension enable �py �sys-pre�x widgetsnbexten-

sion

Además se pueden instalar diversas herramientas e IDEs para facilitar laprogramación en Python, para ello usar:

# apt install scite jedit kate gedit nedit emacs medit kscopegeany geany-plugins editra qtcreator anjuta anjuta-extras codelitecodelite-plugins tea vim-gtk mousepad# apt install eclipse eclipse-cdt netbeans-platform netbeans-

ide codeblocks codeblocks-contrib# apt install fte fte-console fte-terminal nano joe

[email protected] 161 Antonio Carrillo Ledesma, Et alii

Page 164: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

# apt install kdi¤3 meld di¤use dirdi¤ kompare numdi¤ col-ordi¤ wdi¤ xxdi¤# apt install alleyoop astyle c2html java2html code2html c2html

autodia txt2html html2text

Por otro lado existe Anaconda, una Suite de código abierto que abarcauna serie de aplicaciones, librerías y conceptos diseñados para el desarrollode la Ciencia de datos con Python. En líneas generales Anaconda Distribu-tion es una distribucción de Python que funciona como un gestor de entorno,un gestor de paquetes y que posee una colección de más de 720 paquetes decódigo abierto. Anaconda Distribution se agrupa en 4 sectores o solucionestecnológicas; Anaconda Navigator, Anaconda Project, las librerías de Cienciade Datos y Conda. Todas estas se instalan de manera automática y en unprocedimiento muy sencillo.Para más información ver: https://www.anaconda.com/.

También esta SageMath, una Suite de código abierto bajo la licencia GPLde Software matemático como: NumPy, SciPy, matplotlib, Sympy, Maxi-ma, GAP, FLINT, R, entre otros. Además combina acceso a una poderosacombinación del lenguaje basada en Python o directamente vía interfaces oWrappers. La misión del proyecto es crear una alternativa de Software librea Magma, Maple, Mathematica y Matlab.Para más información ver: http://www.sagemath.org/.

Compiladores y Mejora del Rendimiento en Python Python es unlenguaje interpretado, pero es posible compilar el código (no aumenta lavelocidad de ejecución) para generar Byte Code para el interprete. Si senecesita crear un archivo .pyc para un módulo que no se importa, se puedeusar los módulos py_compile y compile_all desde el interprete de Python.El módulo py_compile puede compilar manualmente cualquier módulo.

Una forma de usaer la función py_compile.compile en ese modulo de formainteractiva es:

>>> import py_compile>>> py_compile.compile(�modulo.py�)

esto escribirá el archivo modulo.pyc.En la linea de comando de Linux es posible compilar todos los archivos

en un directorio utilizando el módulo compileall, para ello usar:

[email protected] 162 Antonio Carrillo Ledesma, Et alii

Page 165: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ python -m compileall *.py

y ejecutar mediante:

$ python modulo.pyc

También es posible hacer ligera optimización del código generado:

$ python �O -m compileall *.py

esto generará código bytecode con extensión .pyo, y ejecutar mediante:

$ python modulo.pyo

Python es un lenguaje razonablemente rápido, pero no es tan rápidocomo los programas compilados. Eso es porque se interpreta CPython, laimplementación estándar. Para ser más precisos, su código de Python secompila en un código de Bytes que luego se interpreta. Eso es bueno paraaprender, ya que puede ejecutar el código en el REPL de Python y ver losresultados de inmediato en lugar de tener que compilar y ejecutar. Pero comolos programas de Python no son tan rápidos, los desarrolladores han creadovarios compiladores de Python58 a lo largo de los años, incluidos59 Nuitka,PyPy, Cython, cx_FreezeIron, Pythran, Python y Jython.

Comparando Compiladores de Python Alguien ya ha hecho el trabajode crear un punto de referencia de Python. Opté por PyStone, una traduc-ción de un programa en C de Guido van Rossum, el creador de Python (elprograma en C era en sí mismo una traducción de un programa Ada). Encon-tré una versión convertida por el desarrollador Christopher Arndt en GitHubque era capaz de probar Python 3. Para dar un sentido de perspectiva, aquíestá el rendimiento de CPython (es decir, Python estándar) con Pystone:

58El rendimiento rápido no es la única razón para compilar; Posiblemente la mayordesventaja de los lenguajes de scripting como Python es que se proporciona de maneraimplícita su código fuente a los usuarios �nales.59Si está interesado en los compiladores de Python en general, tenga en cuenta que hay

mucho debate y controversia sobre los "mejores" compiladores y la rapidez general dellenguaje.

[email protected] 163 Antonio Carrillo Ledesma, Et alii

Page 166: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Python 2.7.15Rc1 2: 272.647 pystones / second.Python 3.6.5: 175,817

Como puede ver, hay una gran diferencia entre Python 2 y 3 (cuantomás Pystones por segundo, mejor). En los siguientes desgloses, todos loscompiladores de Python se compararon con Python 3.

Nuitka Aunque puede seguir las instrucciones en la página de descarga,lo siguiente en Debian funcionó bien para mí:$ apt install nuitkaadicionalmente Nuitka también puede usar otro compilador de C (además

del gcc), así que descargué clang. Puedes instalarlo con esto:$ apt install clangDe forma predeterminada, Nuitka usa gcc, pero un parámetro te permite

usar el clang, así que lo probé con ambos. El compilador clang es partede la familia llvm, y está pensado como un reemplazo moderno para gcc.Compilar pystone.py con gcc fue tan simple como esto (primera línea), o conclang (segunda línea), y con la optimización del tiempo de enlace para gcc(tercera línea):

$ nuitka pystone.py$ nuitka pystone.py �clang$ nuitka pystone.py �lto

Después de compilar, lo que tomó aproximadamente 10 segundos, ejecutéel pystone.exe desde la terminal con:

$ ./pystone.exe 500000

Hice 500,000 pases:

Tamaño Ejecución pystones / seg.

1. 223.176 Kb 597,000

2. 195,424 Kb 610,000

3. 194.2 kb 600,000

Estos fueron los promedios de más de 5 corridas. Había cerrado tantosprocesos como pude, pero tomo los tiempos con un poco de variación porquehabía un +/- 5% en los valores de tiempo.

[email protected] 164 Antonio Carrillo Ledesma, Et alii

Page 167: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

PyPy Guido van Rossum dijo una vez: "Si quieres que tu código seejecute más rápido, probablemente debas usar PyPy". Para instalarlo enDebian:$ apt install pypyEntonces lo corrí así:

$ pypy pystone.py

El resultado fue una asombrosa cantidad de 1,776,001 pystones por se-gundo, casi tres veces más rápido que Nuitka.PyPy usa un compilador justo a tiempo y hace algunas cosas muy in-

teligentes para alcanzar su velocidad. De acuerdo con los puntos de referen-cia reportados, es 7.6 veces más rápido que el CPython en promedio. Puedocreer eso fácilmente. La única (leve) desventaja es que siempre está un pocopor detrás de las versiones de Python (es decir, hasta 2.7.13 (no 2.7.15) y3.5.3 (no 3.6.5)). Producir un exe requiere un poco de trabajo. Tienes queescribir tu Python en un subconjunto llamado RPython.

Cython no es solo un compilador para Python; es para un supercon-junto de Python que admite la interoperabilidad con C / C ++. CPythonestá escrito en C, por lo que es un lenguaje que generalmente se combinabien con Python.Con�gurar las cosas con Cython es un poco complicado. No es como

Nuitka, que acaba de salir de la caja. Primero, debes comenzar con unarchivo de Python con una extensión .pyx; ejecuta Cython para crear unarchivo pystone.c a partir de eso:

$ cython pystone.pyx �embed

No omita el parámetro -embed. Se agrega en main y eso es necesario. Acontinuación, compila pystone.c con esta hermosa línea:

$ gcc $ (python3-con�g �includes) pystone.c -lpython3.6m -opystone.exe

Si recibe algún error, como "no se puede encontrar la versión -lpython",podría ser el resultado de su versión de Python. Para ver qué versión estáinstalada, ejecute este comando:

[email protected] 165 Antonio Carrillo Ledesma, Et alii

Page 168: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ pkg-con�g �c�ags python3

Después de todo eso, Cython solo dio 228,527 pystones / sec. Sin embargo,Cython necesita que hagas un poco de trabajo especi�cando los tipos devariables. Python es un lenguaje dinámico, por lo que no se especi�can lostipos; Cython utiliza la compilación estática y el uso de variables de tipo Cle permite producir un código mucho mejor optimizado. (La documentaciónes bastante extensa y requiere lectura).

Tamaño Ejecución pystones / seg.

1. 219.552 Kb 228.527

cx_freeze es un conjunto de scripts y módulos para "congelar" scriptsde Python en ejecutables, y se pueden encontrar en GitHub.Lo instalé y creé una carpeta congelada para administrar cosas en:

$ pip3 install cx_Freeze �upgrade

Un problema que encontré con el script de instalación fue un error quefalta "lz". Necesitas tener instalado zlib; ejecuta esto para instalarlo:

$ apt install zlib1g-dev

Después de eso, el comando cx_Freeze tomó el script pystone.py y creóuna carpeta dist que contenía una carpeta lib, un archivo lib de 5MB y elarchivo de aplicación pystone:

$ cxfreeze pystone.py �target-dir dist

Tamaño Ejecución pystones / seg.

1. 10,216 174,822

No es el rendimiento más rápido, porque es la misma velocidad queCPython. (La congelación de Python implica enviar su aplicación en unsolo archivo (o carpeta) con los elementos Python necesarios, en lugar decompilar; signi�ca que el destino no requiere Python).

[email protected] 166 Antonio Carrillo Ledesma, Et alii

Page 169: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Conclusión Una buena opción es PyPy por el rendimiento, la compi-lación fue muy rápida y produjo los resultados menos de un segundo despuésde presionar la tecla Intro. Si quieres un exe, sin embargo, te recomiendoNuitka; fue una compilación sin complicaciones y se ejecuta más rápido queCPython. Experimente con estos compiladores de Python y vea cuál funcionamejor para tus necesidades particulares.

Aprender a Programar en Python En la red existen múltiples sitiosespecializados y una amplia bibliografía para aprender a programar cada unode los distintos aspectos de Python, nosotros hemos seleccionado diversostextos que ponemos a su disposición en:

http://132.248.182.159/acl/Herramientas/Lenguajes/Python/.

4.6 Documentación del Código Fuente

La documentación dentro del código fuente (véase 4) tiene como objetivo quelos que lo lean, mantengan y reparen el código, lo entiendan.La documentación básica en C, C++ y Java se realiza usando:

� // para comentar dentro de una línea de código:

for (int i = 0; i < 10; i ++) // Este ciclo se realiza 10 veces

� /* y */ para comentar una o más líneas:

/*Este ciclo se realiza 10 veces

*/for (int i = 0; i < 10; i ++) xp += 10 + i;

La documentación básica en Python se realiza usando:

� # para comentar dentro de una línea de código:

for i in Array: # Este ciclo se realiza tantas veces como ele-mentos en Array

� """ y """ para comentar una o más líneas:

[email protected] 167 Antonio Carrillo Ledesma, Et alii

Page 170: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

"""Este ciclo se realiza tantas veces como elementos en Array

"""for i in Array:xp = xp + i

Además, si se realiza la documentación con cierta estructura, esta sepuede utilizar para generar un manual de referencia del código en formatos:HTML, PDF, PS, o XML a partir de los fuentes con unos cuantos comandosde texto en menos de un minuto, pues qué mejor.Existen varias herramientas para ello, una de ellas es DOXYGEN para

códigos de Java, Fortran, C y C++, en Python se puede usar Docstring ouna cadena de documentación como se verá a continuación.

4.6.1 Documentar en C, C++ y Java

Para instalar DOXYGEN usar:

# apt install doxygen graphviz

una vez instalada, hay que generar el archivo de con�guración de DOXY-GEN, para ello usar:

$ doxygen -g

de aquí podemos editar el archivo Doxy�le generado según las necesidadesde la documentación, un ejemplo de dicha con�guración para generar la salidaen HTML, LaTeX y XML esta en:http://132.248.182.159/Herramientas/Programacion/DOXYGEN/EjemploUso/JerarquiaDeClases-

doxygen/Para generar la documentación de los fuentes en la carpeta donde este el

archivo de con�guración y los archivos fuentes, usar:

$ doxygen

La documentación generada con DOXYGEN se mostrará en carpetas se-paradas para cada una de las salidas seleccionadas por ejemplo: HTML,LaTeX, XML, etc.Para ver la documentación generada, usar en la consola:

[email protected] 168 Antonio Carrillo Ledesma, Et alii

Page 171: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ cd html$ xpdf index.html

Para generar la documentación en formato PDF a partir de la salida deLaTeX usar:

$ cd latex$ make pdf$ xpdf refman.pdf

en este caso se supone que se tiene instalado LaTeX en la máquina, encaso contrario podemos instalar lo básico usando:

# apt install science-typesetting texlive-science

y adicionalmente, si se requieren otras opciones instalamos:

# apt install texmaker texmacs texmacs-extra-fonts texlive-latex-base texlive-latex-recommended myspell-en-us myspell-es

Hay varios estilos de documentación (véase 4), aquí ponemos una que esfácil de usar para códigos en C++, pero es lógicamente extensible a lenguajescomo Java.

#ifndef __test__#de�ne __test__/// Descripcion breve de la clase./*** Descripcion detallada de la clase ...** @author Antonio Carrillo* @date Winter 2010* @version 0.0.1* @bug No errors detected* @warning No warnings detected* @todo Exception handling*/class test

[email protected] 169 Antonio Carrillo Ledesma, Et alii

Page 172: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

{private:

/// Descripcion breve.const char *nmClass;/*** Descripcion corta.** Descripcion larga ...** 0 = Dirichlet, 1 = Neumann (or Robin)*/int bdType;

public:/*** Descipcion breve.** Descripcion detallada ...** Algo de LaTeX ...** nf[* jI_2j=nleftj nint_{0}^T npsi(t)* nleftn{* u(a,t)-* nint_{ngamma(t)}^a* nfrac{dntheta}{k(ntheta,t)}* nint_{a}^ntheta c(nxi)u_t(nxi,t)n,dnxi* nrightn} dt* nrightj* nf]*** @param[out] clas Descripcion del parametro de salida* @param[in] fun Descripcion del parametro de entrada

[email protected] 170 Antonio Carrillo Ledesma, Et alii

Page 173: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

*/test(const char *clas, const char *fun){nameClassFunct(clas, fun);}

/*** Descripcion breve.** Descripcion detallada** @param nVert Descripcion del parametro* @param[in] g Descripcion del parametro* @param[in] me Descripcion del parametro* @param[out] values Descripcion del parametro* @param z Descripcion del parametro* @return Descripcion de lo que regresa*/int eval(int nVert, double **g, StdElem *me, double ***values,

double *z);};/*** Descripcion breve de la clase.** Descripcion detallada de la clase** Otro parrafo de la descripcion ...** Algo de formulas con LaTeX** nf{eqnarray*}{* g &=& nfrac{Gm_2}{r^2} nn* &=& nfrac{(6.673 ntimes 10^{-11}n,nmbox{m}^3n,nmbox{kg}^{-

1}n,* nmbox{s}^{-2})(5.9736 ntimes 10^{24}n,nmbox{kg})}{(6371.01n,nmbox{km})^2}

nn* &=& 9.82066032n,nmbox{m/s}^2* nf}

[email protected] 171 Antonio Carrillo Ledesma, Et alii

Page 174: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

*** Documentacion sobre la cual se basa la clase o archivo(s) que

hagan una descripcion de la* misma: Archivo.doc** Descripcion breve del ejemplo de uso de esta clase (este archivo

se supone que estara en* una carpeta de nombre ./Examples en la posicion actual del

código)** Algo de LaTeX** La distancia entre nf$(x_1,y_1)nf$ and nf$(x_2,y_2)nf$ is

nf$nsqrt{(x_2-x_1)^2+(y_2-y_1)^2}nf$.** @example ExampleText.cpp*/#endif

Adicionalmente es deseable que algunos comportamientos o clases tenganinformación adicional como son: propósito, entradas, salidas, estructurasde datos usadas en entradas y salidas, dependencia de datos o ejecución,restricciones, etc., usando una estructura como la siguiente:

/*** Proposito y Metodo:* Entradas:* Salidas:* Entradas TDS:* Salidas TDS:* Dependencias:* Restricciones y advertencias"*/

Para controlar las versiones se podría usar algo como lo siguiente:

[email protected] 172 Antonio Carrillo Ledesma, Et alii

Page 175: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

/*** @�le release.notes* @brief Package TkrRecon* @verbatim* Coordinator: Leon Rochester** v4r4p8 09-Mar-2002 LSR Remove GFxxxxx and SiRecObjs,

no longer used* v4r4p7 07-Mar-2002 TU Mainly, add a combo vertexing to

the TkrRecon sequence* @endverbatim*/

Un ejemplo completo puede ser el siguiente:

#ifndef __ErrorControl__#de�ne __ErrorControl__#include <new>using namespace std;#include <stdlib.h>#include "Printf.hpp"#ifdef USE_HYPRE#include <mpi.h>#endif/// Error Control, this class handles errors for the system

RESSIM/*** @author Antonio Carrillo and Gerardo Cisneros* @date Winter 2010* @version 0.0.2* @verbatimCoordinator: Robert Yatesv0.0.1 Junuary 2011 Antonio Carrillo generates the �rst ver-

sion of the classv0.0.2 March 2011 Gerardo Cisneros add HYPRE errors con-

trolInputs: Name of class and functionOutputs: Exit of program

[email protected] 173 Antonio Carrillo Ledesma, Et alii

Page 176: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

TDS Inputs: noneTDS Outputs: noneDependencies: #ifdef USE_HYPRE, MPI packageRestrictions and Caveats: Non exception handling still@endverbatim* @bug No errors detected* @warning No warnings detected* @todo Exception handling*/class ErrorControl {private:/// Name of classconst char *nmClass;/// Name of function generating the errorconst char *nmFunction;public:/*** Class Constructor*/ErrorControl(void) {nameClassFunct(" ", " ");}/*** Class Constructor* @param clas Class name*/ErrorControl(const char *clas) {nameClassFunct(clas, " ");}/*** Class Constructor* @param clas Class name* @param fun Name of function generating the error*/ErrorControl(const char *clas, const char *fun) {nameClassFunct(clas, fun);}/**

[email protected] 174 Antonio Carrillo Ledesma, Et alii

Page 177: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

* Name of class and function* @param clas Class name* @param func Name of function generating the error*/void nameClassFunct(const char * clas, const char *func) {nameClass(clas);nameFunct(func);}/*** No memory for this request* @param var Var name*/void memoryError(const char * var) {Afprintf(stderr, "nnnnNo memory for %s request in %s of class

%snnnn", var, nmFunction, nmClass);fatalError(1);}/*** No memory for this request* @param var Var name* @param i Index number*/void memoryError(const char * var, int i) {Afprintf(stderr, "nnnnNo memory for %s request %d in %s of

class %snnnn", var, i, nmFunction, nmClass);fatalError(1);}/*** No memory for this request* @param var Var name* @param func Name of function generating the error*/void memoryError(const char * var, const char *func) {Afprintf(stderr, "nnnnNo memory for %s request in %s of class

%snnnn", var, func, nmClass);fatalError(1);}/**

[email protected] 175 Antonio Carrillo Ledesma, Et alii

Page 178: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

* Fatal error.* @param cod Error code*/void fatalError(int cod) {Afprintf(stderr, "nnFatal ErrornnEnd programnn");#ifdef USE_HYPREMPI_Abort(MPI_COMM_WORLD, cod);#elseexit(cod);#endif}/*** Fatal error.* @param cod Error code*/void fatalError(int cod, const char *txt) {Afprintf(stderr, txt);Afprintf(stderr, "nnFatal ErrornnEnd programnn");#ifdef USE_HYPREMPI_Abort(MPI_COMM_WORLD, cod);#elseexit(cod);#endif}/*** Set name of class* @param clas Class name*/void nameClass(const char *clas) {nmClass = clas;}/*** Set name of function* @param func Function name*/void nameFunct(const char *func) {nmFunction = func;}

[email protected] 176 Antonio Carrillo Ledesma, Et alii

Page 179: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

};/*** Error Control, this class handles errors for the systemRESSIM** Use of the class ErrorControl for error handling within the

system RESSIM,* for example in the error control of memory request** @example ExampleErrorControl.cpp*/#endif

Más detalles sobre los parámetros en la documentación del código fuentepara ser usada por DOXYGEN se pueden ver en:http://www.stack.nl/~dimitri/doxygen/commands.html#cmdparam

4.6.2 Documentar en Python

En Python el uso de acentos y caracteres extendidos esta soportado por lacodi�cación UTF-8 (véase 4), para ello en las primeras líneas de código esnecesario usar:

#!/usr/bin/env python# -*- coding: utf-8 -*-

siempre y cuando se use un editor o IDE que soporte dicha codi�cación,en caso contrario los caracteres se perderán.Para documentar en Python se usa un Docstring o cadena de docu-

mentación, esta es una cadena de caracteres que se coloca como primer enun-ciado de un módulo, clase, método o función, y cuyo propósito es explicar suintención. Un ejemplo sencillo (en Python 3), es:

def promedio(a, b):"""Calcula el promedio de dos numeros."""return (a + b) / 2

Un ejemplo más completo:

[email protected] 177 Antonio Carrillo Ledesma, Et alii

Page 180: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

def formula_cuadratica(a, b, c):"""Resuelve una ecuación cuadratica.Devuelve en una tupla las dos raices que resuelven laecuacion cuadratica:

ax^2 + bx + c = 0.Utiliza la formula general (tambien conocidacoloquialmente como el "chicharronero").Parametros:a �coe�ciente cuadratico (debe ser distinto de 0)b �coe�ciente linealc �termino independienteExcepciones:ValueError �Si (a == 0)"""

if a == 0:raise ValueError(�Coe�ciente cuadratico no debe ser 0.�)

from cmath import sqrtdiscriminante = b ** 2 - 4 * a * cx1 = (-b + sqrt(discriminante)) / (2 * a)x2 = (-b - sqrt(discriminante)) / (2 * a)return (x1, x2)

La cadena de documentación en el segundo ejemplo es una cadena multi-líneas, la cual comienza y termina con triples comillas ("""). Aquí se puedeobservar el uso de las convenciones establecidas en el PEP 257 (Python En-hancement Proposals):

� La primera línea de la cadena de documentación debe ser una línea deresumen terminada con un punto. Debe ser una breve descripción dela función que indica los efectos de esta como comando. La línea de re-sumen puede ser utilizada por herramientas automáticas de indexación;es importante que quepa en una sola línea y que este separada del restodel docstring por una línea en blanco.

� El resto de la cadena de documentación debe describir el compor-tamiento de la función, los valores que devuelve, las excepciones quearroja y cualquier otro detalle que consideremos relevante.

[email protected] 178 Antonio Carrillo Ledesma, Et alii

Page 181: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Se recomienda dejar una línea en blanco antes de las triples comillasque cierran la cadena de documentación.

Todos los objetos documentables (módulos, clases, métodos y funciones)cuentan con un atributo __doc__ el cual contiene su respectivo comentariode documentación. A partir de los ejemplos anteriores podemos inspeccionarla documentación de las funciones promedio y formula_cuadratica desde elshell de Python:

>>> promedio.__doc__�Calcula el promedio de dos numeros.�>>> formula_cuadratica.__doc__�Resuelve una ecuación cuadratica.nnnn Devuelve en unatupla las dos raices que resuelven lann ecuacioncuadratica:nn nn ax^2 + bx + c = 0.nnnnUtiliza la formula general (tambien conocidanncoloquialmente como el "chicharronero").nnnnParametros:nn a �coe�ciente cuadratico (debe serdistinto de 0)nn b �coe�ciente linealnnc �termino independientennnn Excepciones:nnValueError �Si (a == 0)nn nn �

Sin embargo, si se esta usando el shell de Python es mejor usar la funciónhelp(), dado que la salida producida queda formateada de manera más claray conveniente:

>>> help(promedio)Help on function promedio in module __main__:promedio(a, b)Calcula el promedio de dos numeros.>>> help(formula_cuadratica)Help on function formula_cuadratica in module __main__:formula_cuadratica(a, b, c)Resuelve una ecuacion cuadratica.Devuelve en una tupla las dos raices que resuelven laecuacion cuadratica:ax^2 + bx + c = 0.Utiliza la formula general (tambien conocida

[email protected] 179 Antonio Carrillo Ledesma, Et alii

Page 182: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

coloquialmente como el "chicharronero").Parametros:a �coe�ciente cuadratico (debe ser distinto de 0)b �coe�ciente linealc �termino independienteExcepciones:ValueError �Si (a == 0)

Ciertas herramientas, por ejemplo shells o editores de código, puedenayudar a visualizar de manera automática la información contenida en loscomentarios de documentación. De esta manera un usuario puede tener a sualcance de manera sencilla toda la información que necesita para poder usarnuestras funciones.

Generando documentación en páginas de HTML Los Docstringsse pueden usar también para producir documentación en páginas de HTMLque pueden ser consultadas usando un navegador de Web. Para ello se usa elcomando pydoc desde una terminal. Por ejemplo, si las dos funciones ante-riores (promedio y formula_cuadratica) se encuentran en un archivo fuentellamado ejemplos.py, podemos ejecutar el siguiente comando en una terminaldentro del mismo directorio donde esta el archivo fuente:

pydoc -w ejemplos

La salida queda en el archivo ejemplos.html, y así se visualiza desde unnavegador. La documentación de pydoc explica otros artilugios que puedehacer esta utilería de Python.

Docstrings vs. Comentarios Un comentario en Python inicia con elsímbolo de número (#) y se extiende hasta el �nal de la línea. En principiolos Docstrings pudieran parecer similares a los comentarios, pero hay unadiferencia pragmática importante: los comentarios son ignorados por el am-biente de ejecución de Python y por herramientas como pydoc; esto no es asíen el caso de los Docstrings.A un nivel más fundamental hay otra diferencia aún más grande entre los

Docstrings y los comentarios, y esta tiene que ver con la intención:

� Los Docstrings son documentación, y sirven para entender qué hace elcódigo.

[email protected] 180 Antonio Carrillo Ledesma, Et alii

Page 183: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Los comentarios sirven para explicar cómo lo hace.

La documentación es para la gente que usa tu código. Los comentarios sonpara la gente que necesita entender cómo funciona tu código, posiblementepara extenderlo o darle mantenimiento.

El uso de Docstrings en Python facilita la escritura de la documentacióntécnica de un programa. Escribir una buena documentación requiere de dis-ciplina y tiempo, pero sus bene�cios se cosechan cuando alguien � quizásmi futuro yo dentro de seis meses� necesita entender qué hacen nuestrosprogramas. Los Docstrings no sustituyen otras buenas prácticas de progra-mación, como son el uso apropiado de comentarios o el empleo de nombresdescriptivos para variables y funciones.

4.7 Herramientas de Programación

En Linux existe una gran variedad de herramientas para programación, yaque este sistema operativo fue hecho por programadores y para progra-madores, por ello entre las miles de herramientas, tenemos algunas que sonampliamente usadas, entre las que destacan:Depuradores de programas

� ddd https://www.gnu.org/software/ddd/

� gdb https://www.gnu.org/software/gdb/

� kdbg http://www.kdbg.org/

Programas para rastrear errores en la manipulación de memoriay punteros desbordados

� Valgrind http://valgrind.org/

� DUMA http://duma.sourceforge.net/

Programas para hacer análisis de rendimiento60

60Otras opciones son: Splint, cppcheck, Rough Auditing Tool for Security, C y C++Code Counter, CppNcss, Gnocchi, CUnit, CppUnit, OPro�le, Intel VTune, Nemiver, Mud-�ap, etc.

[email protected] 181 Antonio Carrillo Ledesma, Et alii

Page 184: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� gprof https://sourceware.org/binutils/docs/gprof/

� Callgrind http://valgrind.org/docs/manual/cl-manual.html

� kcachegrind http://kcachegrind.sourceforge.net/html/Home.html

� time https://www.cyberciti.biz/faq/unix-linux-time-command-examples-usage-syntax/

Programas para control de proyectos

� Git https://git-scm.com/

� Mercurial https://www.mercurial-scm.org/

� Subversion https://subversion.apache.org/

Generadores de documentación61

� Doxygen http://www.doxygen.org/

Formateador de código fuente para C, C++, Java y C#

� Astyle http://astyle.sourceforge.net/

Lenguaje uni�cado de modelado (Uni�ed Modeling LanguageUML)62

� UML http://www.uml.org/

En este apartado, solo tocaremos las más usadas, pero abunda la docu-mentación de estas y otras importantes herramientas en línea de comandos

61Otras opciones son: Natural Docs, ROBODoc, etc.62Otras opciones son: UML Diagram Generation, Code Generation, Document Genera-

tion and Reporting, Scaling, Database Schema Generation, Entity Relationship Diagrams,Data Flow Datagrams, StarUML BOUML, EclipseUML, UML Modeller, Papyrus, Nclass,PlantUML, UMLet, NetBeansIDE, Open ModelSphere, gModeler, RISE, Oracle jdevel-oper, Oracle SQL Developer, Dia, Kivio, ArgoUML, X�g, etc.

[email protected] 182 Antonio Carrillo Ledesma, Et alii

Page 185: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

(véase 3.2). Iniciaremos por las de compilar63 y depurar64 programas compi-lables en C, C++, Fortran, entre otros.

En Linux existe una gran variedad de herramientas para programación(por ejemplo para C, C++, Fortran, etc.), para instalar algunas de ellas enDebian GNU/Linux podemos usar en línea de comandos:

# apt install g++ valgrind valgrind-mpi kcachegrind cppcheckastyle

Para usar muchas de estas herramientas (en línea de comandos), primerodebemos conocer como compilar fuentes65, sin perdida de generalidad tra-bajaremos en C++ solicitando que el archivo ejecutable66 tenga el nombreejemp:

$ g++ *.cpp -o ejemp

para ejecutar el programa ya compilado:

$ ./ejemp

Compilar usando diversas optimizaciones67 (�O0, O1, -O2 o -O3) usar:

63Un compilador es un programa informático que traduce un programa que ha sidoescrito en un lenguaje de programación a un lenguaje común, usualmente lenguaje demáquina, aunque también puede ser traducido a un código intermedio (bytecode) o atexto y que reúne diversos elementos o fragmentos en una misma unidad, este proceso detraducción se conoce como compilación.64Un depurador (en inglés, debugger), es un programa usado para probar y depurar

(eliminar) los errores de el programa "objetivo". El código a ser examinado puede al-ternativamente estar corriendo en un simulador de conjunto de instrucciones (ISS), unatécnica que permite gran potencia en su capacidad de detenerse cuando son encontradascondiciones especí�cas pero será típicamente más lento que ejecutando el código directa-mente en el apropiado (o el mismo) procesador.65Compilador para C es gcc, para C++ es g++, para Java es javac, para Fortran es f77

o f95, en Python es py3compile o pycompile, etc.66Un archivo ejecutable es tradicionalmente un archivo binario con instrucciones en

codigo de máquina cuyo contenido se interpreta por el ordenador como un programa.Además, suele contener llamadas a funciones especí�cas de un sistemas operativo.67La optimización de código es el conjunto de fases de un compilador que transforma un

fragmento de código en otro fragmento con un comportamiento equivalente y se ejecuta deforma más e�ciente, es decir, usando menos recursos de cálculo como memoria o tiempode ejecución.

[email protected] 183 Antonio Carrillo Ledesma, Et alii

Page 186: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ g++ -O1 *.cpp

para ejecutar el programa ya compilado:

$ ./a.out

Para compilar y ver todos los avisos usar:

$ g++ -pedantic -Wall -Wextra -O *.cpp

o de forma alternativa:

$ g++ -We¤c++ *.cpp

Para hacer análisis de rendimiento, hacer:

$ g++ -g -pg -O0 *.cpp$ ./a.out$ gprof -c -z a.out gmon.out > sal.txt

el archivo sal.txt contiene el análisis de rendimiento detallado. Un ejemplode esta salida es:

Flat pro�le:Each sample counts as 0.01 seconds.% cumulative self self totaltime seconds seconds calls s/call s/call name23.25 0.60 0.60 40656734 0.00 0.00 retorna(int, int)

14.85 0.98 0.38 27627674 0.00 0.00 retoaNumColu(int, int)

12.89 1.31 0.33 91126931 0.00 0.00 Vector::retorna(int)

10.94 1.59 0.28 31 0.01 0.03 ResJacob i::resuelve()

.

.

.

que permite conocer en que parte del código se consume más tiempo deejecución.

[email protected] 184 Antonio Carrillo Ledesma, Et alii

Page 187: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Aprender a Usar GPROF En la red existen múltiples sitios especia-lizados y una amplia bibliografía para optimizar código, nosotros hemos se-leccionado diversos textos que ponemos a su disposición en:

http://132.248.182.159/acl/Herramientas/Programacion/GPROF/

Para conocer el tiempo de ejecución68 de un programa, podemos usar elcomando básico time, mediante:

$ time ejecutable

pero podemos instalar una versión optimizada de este comando que pro-porciona información adicional, para ello instalar:

# apt install time

y su ejecución mediante:

$ /usr/bin/time ejecutable

por ejemplo para el comando ls, entrega una salida del tipo:

$ /usr/bin/time -v lsCommand being timed: "ls"User time (seconds): 0.00System time (seconds): 0.00Percent of CPU this job got: 66%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 2360Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0

68El tiempo total de ejecución de un programa (tiempo real) es la suma del tiempo deejecución del programa del usuario (tiempo de usuario) más el tiempo de ejecución delsistema necesario para soportar la ejecución (tiempo de sistema).

[email protected] 185 Antonio Carrillo Ledesma, Et alii

Page 188: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Minor (reclaiming a frame) page faults: 110Voluntary context switches: 1Involuntary context switches: 1Swaps: 0File system inputs: 0File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0

Para hacer depuración del código mediante el depurador grá�co ddd usar:

$ g++ -g -O0 *.cpp$ ddd ./a.out

Puede usarse también los depuradores xxgdb, gdb, kdbg cada uno tienesus pros y contras, depende del usuario cual es el más adecuado para usar.

Para el rastreo de problemas con la manipulación de memoria y punterosdesbordados:

$ g++ -g -O0 *.cpp$ valgrind �tool=memcheck �leak-check=yes �show-reachable=yes

./a.out

o analizar la salida usando kcachegrind :

$ valgrind �tool=callgrind ./a.out$ kcachegrind pro�le.callgrind

Aprender a Usar VALGRIND En la red existen múltiples sitiosespecializados y una amplia bibliografía para depurar código, nosotros hemosseleccionado diversos textos que ponemos a su disposición en:

http://132.248.182.159/acl/Herramientas/Programacion/VALGRIND/

[email protected] 186 Antonio Carrillo Ledesma, Et alii

Page 189: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Existen varios paquetes de modo grá�co para valgrind, uno de ellos esalleyoop y se usa:

$ alleyoop ./a.out -v �arg1=foo

otro es kcachegrind, podemos ver más opciones en:

� http://valgrind.org/

� http://alleyoop.sourceforge.net/usage.html

� http://kcachegrind.sourceforge.net/html/Home.html

Para hacer una revisión estática del código en C++ usar:

$ cppcheck �enable=all *.?pp

mostrará los avisos de análisis estático del código indicado.

Astyle Para dar uniformidad a la codi�cación de los programas fuente, sepuede usar un formateador automático de código, Astyle soporta una granvariedad de lenguajes y opciones, para instalar en Debian GNU/Linux usar:

# apt install astyle

para formatear los archivos de C, C++, C# usar:

$ astyle -s3 -p �style=allman �lineend=linux *.?pp

para Java, una opción es

$ astyle -s3 -p �style=java �lineend=linux *.java

más opciones en:

� http://astyle.sourceforge.net/astyle.html

� https://en.wikipedia.org/wiki/Programming_style

� https://en.wikipedia.org/wiki/Indent_style

[email protected] 187 Antonio Carrillo Ledesma, Et alii

Page 190: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Aprender a Usar ASTYLE En la red existen múltiples sitios espe-cializados y una amplia bibliografía para formatear código nosotros hemosseleccionado diversos textos que ponemos a su disposición en:

http://132.248.182.159/acl/Herramientas/SistemasOperativos/Linux/

Git Git es un programa de control de versiones que sirve para la gestión delos diversos cambios que se realizan sobre los elementos de algún proyecto deSoftware y sus respectivos programas fuente o con�guración del mismo. Fuédiseñado por Linus Torvalds y es usado para controlar los cambios de diversosproyectos como los fuentes del Kernel de Linux (véase ??) que tiene decenasde millones de líneas de código (en la versión 4.12 cuenta con 24,170,860líneas de código repartidos en 59,806 archivos) y es trabajado por miles deprogramadores alrededor del mundo.

¿Qué es control de versiones? se de�ne como control de versionesa la gestión de los diversos cambios que se realizan sobre los elementos dealgún producto o una con�guración del mismo es decir a la gestión de losdiversos cambios que se realizan sobre los elementos de algún producto ouna con�guración, y para los que aún no les queda claro del todo, control deversiones es lo que se hace al momento de estar desarrollando un Software ouna página Web. Exactamente es eso que haces cuando subes y actualizastu código en la nube, o le añades alguna parte o simplemente editas cosasque no funcionan como deberían o al menos no como tú esperarías.

¿A que le llamamos sistema de control de versiones? son todaslas herramientas que nos permiten hacer todas esas modi�caciones antesmencionadas en nuestro código y hacen que sea más fácil la administraciónde las distintas versiones de cada producto desarrollado; es decir Git.

Git fue creado pensando en la e�ciencia y la con�abilidad del mante-nimiento de versiones de aplicaciones cuando estas tienen un gran númerode archivos de código fuente, es decir Git nos proporciona las herramientaspara desarrollar un trabajo en equipo de manera inteligente y rápida y portrabajo nos referimos a algún Software o página que implique código el cualnecesitemos hacerlo con un grupo de personas.Algunas de las características más importantes de Git son:

[email protected] 188 Antonio Carrillo Ledesma, Et alii

Page 191: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Rapidez en la gestión de ramas, debido a que Git nos dice que uncambio será fusionado mucho más frecuentemente de lo que se escribeoriginalmente

� Gestión distribuida: Los cambios se importan como ramas adicionalesy pueden ser fusionados de la misma manera como se hace en la ramalocal

� Gestión e�ciente de proyectos grandes

� Realmacenamiento periódico en paquetes

Para instalar Git completo en el servidor o en la máquina de trabajo:

# apt install git-all

Para instalar lo básico de Git, si no esta instalado:

# apt install git

Otras opciones para trabajar con Git son:

# apt install git git-all gitk gitg git-cola git-gui qgit tig lighttpdvim-fugitive# apt install mercurial# apt install subversion rapidsvn# apt install cvs

Con�guración: Si se quiere especi�car la identidad del que controla elrepositorio local en el equipo, debemos usar (por omisión toma la informaciónde la cuenta del usuario y máquina):

$ git con�g �global user.name "John Doe"$ git con�g �global user.email [email protected]

Si se desea con�gurar el editor de texto a usar por Git, usamos (poromisión es vim):

$ git con�g �global Core.editor scite

[email protected] 189 Antonio Carrillo Ledesma, Et alii

Page 192: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Si se desea con�gurar la herramienta de control de diferencias, usamos(por omisión vimdi¤ ):

$ git con�g �global merge.tool meld

Si lo que requiero es un control personal sin necesidad de compartir losarchivos con ningún otro usuario, puedo usar Git de forma local en cualquierdirectorio mediante:

$ git init

Si se desea agregar la identidad del que controla el repositorio en estedirectorio, se debe usar:

$ git con�g user.name "John Doe"$ git con�g user.email [email protected]

Ahora para agregar los archivos (todos los de este directorio), usar:

$ git add .

Así podemos hacer la con�rmación de los cambios, mediante:

$ git commit -m "Primer lanzamiento"

Ahora cada que lo requiera al hacer modi�caciones, puedo checar loscambios:

$ git status

o en forma grá�ca con gitk, mediante:

$ gitk

Para actualizar los cambios, usar:

$ git commit -a -m �Actualizacion�

La otra alternativa es preparar un directorio para el repositorio ya sea enel servidor o de forma local, mediante:

[email protected] 190 Antonio Carrillo Ledesma, Et alii

Page 193: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ mkdir example.git$ cd example.git

Para inicializar el repositorio:

$ git �bare init

Es buena opción limitar el acceso a la cuenta via ssh, por ello es mejorcambiar en /etc/passwd, la línea del usario predeterminada:

tlahuiz:x:1005:1005:Tlahuizcalpan�,:/home/tlahuiz:/bin/bash

a esta otra:

tlahuiz:x:1005:1005:Tlahuizcalpan�,:/home/tlahuiz:/usr/bin/git-shell

En la máquina de trabajo o en el servidor en cualquier carpeta se generala estructura del repositorio en un directorio temporal de trabajo para elrepositorio:

$ mkdir tmp$ cd tmp$ git init

Para generar la estructura de trabajo para el repositorio y los archivosnecesarios:

$ mkdir branches release trunk$ mkdir ...

Para adicionar todos y cada uno de los archivos y carpetas:

$ git add .

Para subir los cambios:

$ git commit -m "Texto"

[email protected] 191 Antonio Carrillo Ledesma, Et alii

Page 194: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Después debemos mandarlo al servidor:

$ git remote add origin ssh://usr@máquina/~/trayectoria

o mandarlo a un directorio local:

$ git remote add origin ~/trayectoria$ git push origin +master:refs/heads/master

Para usar el repositorio en cualquier otra máquina hay que bajar el repo-sitorio por primera vez del servidor:

$ git clone ssh://usr@máquina/~/trayectoria

o de una carpeta local:

$ git clone ~/trayectoria

Ahora, podemos con�gurar algunos datos usados en el control de cambios:

$ git con�g �global usr.name "Nombre"$ git con�g �global usr.email usr@direccion

cuando se requiera actualizar del repositorio los cambios:

$ git pull

para subir los cambios al repositorio:

$ git commit -a -m "mensaje"$ git push

Comando usados para el trabajo cotidiano en GitPara ver el estado de los archivos locales:

$ git status

Para generar una nueva rama y trabajar en ella:

[email protected] 192 Antonio Carrillo Ledesma, Et alii

Page 195: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ git branch MiIdea$ git checkout MiIdea

o en un solo paso:

$ git checkout -b MiIdea

Para uni�car las ramas generadas en el punto anterior:

$ git checkout master$ git merge MiIdea

Para borrar una rama:

$ git branch -d MiIdea

Para listar ramas:

$ git branch

Para listar ramas fusionadas:

$ git branch �merged

Para listar ramas sin fusionar:

$ branch �no-merged

Para ver los cambios en el repositorio:

$ git log

o verlos en forma acortada:

$ git log �pretty=oneline

Para recuperar un archivo de una actualización anterior:

$ git show a30ab2ca64d81876c939e16e9dac57c8db6fb103:ruta/al/archivo> ruta/al/archivo.bak

[email protected] 193 Antonio Carrillo Ledesma, Et alii

Page 196: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Para volver a una versión anterior:

$ git reset �hard 56f8fb550282f8dfaa75cd204d22413fa6081a11:

para regresar a la versión presente (cuidado con subir cambios en ramasanteriores):

$ git pull

Si en algún momento borramos algo o realizamos cambios en nuestramáquina y necesitamos regresar los archivos como estaban en nuestra últimaactualización, podemos usar:

$ git reset �hard HEAD

este trabaja con la información de nuestra copia local y no necesita cone-xión de red para la restitución. Eventualmente es necesario optimizar lacopia local de los archivos en Git, para ello podemos usar:

$ git gc

Visualizador grá�co para Git :

# apt install gitk

Git es un proyecto pujante, amplio y bien documentado, ejemplos y do-cumentación puede ser consultada en:

� https://git-scm.com/book/es/v1

� http://git-scm.com/documentation

� https://coderwall.com/p/kucyaw/protect-secret-data-in-git-repo

Git en Google Drive:

� http://www.iexplain.org/using-git-with-google-drive-a-tutorial/

� https://techstreams.github.io/2016/09/07/google-drive-as-simple-git-host/

[email protected] 194 Antonio Carrillo Ledesma, Et alii

Page 197: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Aprender a Usar Git En la red existen múltiples sitios especializadosy una amplia bibliografía para aprender a usar Git, nosotros hemos sele-ccionado diversos textos que ponemos a su disposición en:

http://132.248.182.159/acl/Herramientas/Programacion/Git/Ademásde Git usado de forma local, existen diversos servicios en la nube69

que permiten dar soporte a proyectos mediante Git, en los cualeses necesario crear una cuenta y subir los datos usando Git, al-gunos de estos servicios son:

GitLab https://about.gitlab.com/Para con�gurar:

git con�g �global user.name "Antonio Carrillo Ledesma"git con�g �global user.email "[email protected]"

Para crear nuevo repositorio:

git clone https://gitlab.com/antoniocarrillo69/MDF.gitcd MDFtouch README.mdgit add README.mdgit commit -m "add README"git push -u origin master

Para usar una carpeta existente:

cd existing_foldergit initgit remote add origin https://gitlab.com/antoniocarrillo69/MDF.gitgit add .git commit -m "Initial commit"git push -u origin master

Para usar un repositorio existente:

69Algunos de estos proyectos gratuitos son: Gitlab, Github, Bitbucket, Beanstalk,Launchpad, SourceForge, Phabricator, GitBucket, Gogs, Gitea, Apache Allura, entreotros.

[email protected] 195 Antonio Carrillo Ledesma, Et alii

Page 198: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

cd existing_repogit remote rename origin old-origingit remote add origin https://gitlab.com/antoniocarrillo69/MDF.gitgit push -u origin �allgit push -u origin �tags

GitHub https://github.com/Para con�gurar:

git con�g �global user.name "Antonio Carrillo Ledesma"git con�g �global user.email "[email protected]"

Para con�gurar un nuevo repositorio:

$ touch README.md$ git init$ git add .$ git commit -m "mi primer commit"$ git remote add origin https://github.com/antoniocarrillo69/ejemploPruebas.git$ git push -u origin master

4.8 Programando Desde la Nube

Existen diferentes servicios Web70 que permiten editar, compilar y ejecutarcódigo de diversos lenguajes y paquetes desde el navegador, esto en aras deque los estudiantes y profesores que cuenten con algún sistema de acceso ared y un navegador puedan programar en los más diversos lenguajes, IDEs yterminales sin hacer instalación alguna en su equipo de cómputo, tableta oteléfono celular.Algunos ejemplos de estos servicios son:

� https://www.jdoodle.com/70Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnito

para no guardar el historial de navegación, información introducida en los formularios yborrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitiosWeb que visitamos sí guardan información de nuestra visita, nuestro proveedor de Internettambién guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igualque el historial de descargas, además de las marcas de páginas o favoritos se conservaránal cerrar al navegador.

[email protected] 196 Antonio Carrillo Ledesma, Et alii

Page 199: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� https://repl.it/

� http://browxy.com

� https://jupyter.org/try

� https://tio.run/

� https://www.compilejava.net/

� http://codepad.org/

� https://code.hackerearth.com/

� https://www.remoteinterview.io/online-c-compiler

� https://ideone.com/

� https://hackide.herokuapp.com/

� https://www.codechef.com/ide

� http://cpp.sh/

� https://codebunk.com/

� https://rextester.com/

� https://www.tutorialspoint.com/codingground.htm

� https://www.compileonline.com

� http://python�ddle.com/

� https://trinket.io/python

� https://www.pythonanywhere.com/try-ipython/

� https://www.rollapp.com/

� https://godbolt.org/

� https://www.codiva.io/

� https://paiza.io/en

[email protected] 197 Antonio Carrillo Ledesma, Et alii

Page 200: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� https://wandbox.org/

� http://coliru.stacked-crooked.com/

� http://quick-bench.com/

� https://cppinsights.io/

� https://ideone.com/

� http://cpp.sh/

� https://ide.geeksforgeeks.org/

� https://www.codechef.com/ide

� https://visualstudio.microsoft.com/services/visual-studio-online/Algunas de las terminales soportados son para:

CentOS, IPython, Lua, Memcached, Mongo DB, MySQL,Node.js, Numpy, Oracle, Octave, PowerShell, PHP, R Progra-mming, Redis, Ruby, SciPy, SymPy, etc.

Algunos de los IDEs soportados son:

Ada (GNAT), Algol68, Angular JS, Assembly, AsciiDoc, AWK,Bash Shell, Befunge, Bootstrap, Brainf**k, C, CSS3, ChipmunkBASIC, Clojure, Cobol, Co¤eeScript, ColdFusion, C99 Strict,C++, C++ 0x, C++ 11, C#, Dart, D Programming Language,Embedded C, Erlang, Elixir, Factor, Fantom, Falcon, Fortran-95, Forth,F#, Free Basic, Groovy, GO, Haxe, Haskell, HTML,ilasm, Intercal, Icon, Java, Java 8, Java MySQL, Javascript,JSP, JQuery, Julia, Korn Shell (ksh), Latex, Lisp, LOLCODE,Lua, Matlab/Octave, Malbolge, Markdown, MathML, Mozart-Oz, Nimrod, Node.JS, Objective-C, OCaml, Pascal, PARI/GP,Pawn, Perl, Perl MySQL, PHP, PHP MySQL, WebView, Pike,Processing.js, p5.js, Prolog, Python-2, Python-3, PythonMySQL,Jupyter Notebook, Rexx, reStructure, Ruby, Rust, Scala, R Pro-gramming, Scheme, Smalltalk,SML/NJ, Simula, SQLite SQL, Tcl,TeX, Unlambda, VB.NET, Verilog, Whitespace, Ya Basic, etc.

[email protected] 198 Antonio Carrillo Ledesma, Et alii

Page 201: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

5 Programación Orientada a Objetos

Comencemos este camino interminable de aprendizaje acerca de la progra-mación orientada a objetos (POO) con los conceptos básicos de este tipo deprogramación, para ello iniciemos con lo que entendemos por un objeto.

¿Qué es un objeto? La de�nición más básica dice: "Es un ente computa-cional que puede contener datos y comportamientos".

Ejemplo: un polinomio, una matriz o un número complejo. Cadauno de estos objetos tiene un comportamiento propio.

Ejemplo: un polinomio puede sumar/integrar/derivar/evaluar.

Por lo tanto, un objeto lo podemos de�nir formalmente como: ente com-putacional que puede contener datos y exhibe comportamientos.

Mensaje Todos los objetos de los cuales hablamos tienen comportamien-tos y se relacionan con otros objetos (se piden cosas entre ellos). Por cualpodemos de�nir a un mensaje como: Interacción entre dos objetos: un emisorE y un receptor R. Un emisor le envía un mensaje a un receptor. El emisorpuede obtener o no una respuesta.

Ejemplo: evaluar/grado/integrar.

Ciclo de vida de un objeto Todos los objetos tienen una vida, se puededecir que nacen cuando son instanciados y mueren cuando se elimina de lamemoria. No obstante, existen dos formas de eliminar de memoria a unobjeto dependiendo del lenguaje de programación. Los mecanismos son:Recolector de Basura (Garbage Collector) y Destructores.

Recolector de Basura: Es un mecanismo que se encarga de borrar dela memoria las referencias a objetos y entidades que ya no se usan más, demanera que se pueda maximizar el uso del espacio en memoria.

Destructores: Son métodos que se de�nen para cada objeto y cuyoprincipal objetivo es liberar los recursos que fueron adquiridos por el objetoa lo largo de su ciclo de vida y romper vínculos con otras entidades quepuedan tener referencias a él.

[email protected] 199 Antonio Carrillo Ledesma, Et alii

Page 202: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Métodos ¿Que es un método? ¿En qué di�ere de un mensaje?Un método es la sección de código que se ejecuta al enviar un mensaje.

Se identi�ca con una �rma � el nombre y los parametros del método� , quees la misma �rma del mensaje enviado. Entonces, cuando un objeto recibeun mensaje, se ejecuta un método cuya �rma es la misma que la del mensaje.Método de la clase Polinomio:

// Evalua el polinomio en el valor pasado como parametropublic double evalua(double x) {int i;double p = 1.0, r = 0.0;for (i = 0; i < Dim; i++) {r += coe�ciente(i) * p;p *= x;

}return r;

}

La �rma de un objeto se de�ne con tres componentes:

1. El nombre del método.

2. Los parámetros que recibe el método.

3. Lo que devuelve el método (que puede ser nada u otro objeto).

Clases Es común que empezamos con la de�nición de "Clase" en los textos.Esto se debe a que las clases solo son una forma de implementar objetos, perono son la única manera de hacerlo (como veremos más adelante), por lo que esfundamental que no pensemos automáticamente en clases cuando hablamosde objetos. Sin embargo, la mayor parte de los lenguajes de programaciónque usamos � laboral y académicamente� usan clases.

¿Qué es una clase? Podemos de�nir a una clase utilizando dos de�ni-ciones complementarias: una clase es un molde, a partir del cual se creanlos objetos. Cuando instanciamos un objeto, el ambiente le pregunta a dichaclase que características y métodos debe tener el objeto. La otra de�niciónes: una clase es un ente que determina el comportamiento y el tipo al quepertenecen sus instancias.

[email protected] 200 Antonio Carrillo Ledesma, Et alii

Page 203: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Clase Persona:

public class Persona {private String nombre;private String apellidos;private int edad;//Constructorpublic Persona(String nombre, String apellidos, int edad) {this.nombre = nombre;this.apellidos = apellidos;this.edad = edad;

}public String getNombre () {return nombre;

}public String getApellidos () {return apellidos;

}public int getEdad () {return edad;}public void visualiza() {System.out.println ("Nombre: " + getNombre() + " " +getApellidos() + " edad: " + getEdad());

}public static void main (String [ ] Args) {Persona p = new Persona ("Mauro", "Ruiz perez", 36);p.visualiza();

}}

[email protected] 201 Antonio Carrillo Ledesma, Et alii

Page 204: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Características de la Programación Orientada a Objetos Los si-guientes conceptos que vamos a ver, son características que tiene un buendiseño71 orientado a objetos, si bien este paradigma no garantiza dichas ca-racterísticas, hacen mucho más fácil poder lograrlas y en cierta manera nosobliga a usarlas.

Abstracción La abstracción es la propiedad de los objetos que consisteen tener en cuenta sólo los aspectos más importantes desde un punto devista determinado y no tener en cuenta otros aspectos. Durante el procesode abstracción es cuando se decide qué características y comportamientosdebe tener el modelo para así reducir su complejidad. De este modo, lascaracterísticas complejas se hacen más manejables.

71El análisis orientado a objetos (Object-oriented Analysis OOA) es el proceso deanalizar un problema, un sistema o una tarea � que alguien quiere convertir en unaaplicación� e identi�car los objetos y las interacciones entre esos objetos. La etapa deanálisis tiene que ver con lo que se necesita hacer. La salida de la etapa de análisis es unconjunto de requisitos. Si tuviéramos que completar el análisis paso a paso, habríamosconvertido una tarea, en un conjunto de requisitos. En cierto modo, el análisis es unnombre inapropiado. En su lugar, explora su entorno, manipula formas y ve dónde sepodrían contener. Una mejor interpretación de la frase podría ser la exploración orientadaa objetos. En desarrollo de Software, las etapas iniciales de análisis incluyen entrevistar alos clientes, estudiando sus procesos, y eliminando posibilidades.El diseño orientado a objetos (Object-oriented Design OOD) es el proceso de convertir

tales requisitos en una especi�cación de implementación. El diseñador debe nombrar losobjetos, de�nir los comportamientos, y especi�car formalmente qué objetos pueden acti-var comportamientos especí�cos en otros objetos. La etapa de diseño tiene que ver concómo se deben hacer las cosas. La salida de la etapa de diseño es una especi�cación deimplementación. Si fuéramos a completar la etapa de diseño en un solo paso, habríamoscumplido los requisitos de�nidos durante análisis orientado a objetos en un conjunto declases e interfaces que podrían implementarse en (idealmente) cualquier lenguaje de pro-gramación orientado a objetos.La programación orientada a objetos (Object-oriented Programming OOP) es el pro-

ceso de conversión del diseño en un programa de trabajo que haga exactamente lo queel solicitante del mismo originalmente solicitó. ¡Sí claro!, sería encantador si el mundo seencontrara con este ideal y pudiéramos seguir estas etapas una por una, en perfecto orden,como todos los antiguos libros de texto nos decían. Como de costumbre, el mundo reales mucho mas turbio, no importa cuánto intentemos separar estas etapas, siempre encon-traremos cosas que necesitan más análisis mientras estamos diseñando. Cuando estamosprogramando, encontramos características que necesitan aclaración en el diseño.

[email protected] 202 Antonio Carrillo Ledesma, Et alii

Page 205: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ejemplo: En POO, podemos considerar una Persona como unobjeto que tiene propiedades (como nombre, altura, peso, colorde pelo, color de ojos, etcétera) y métodos (como hablar, mirar,andar, correr, parar, etcétera). Gracias a la abstracción, el ob-jeto Tren puede manipular objetos del tipo Persona sin tener encuenta sus propiedades ni métodos ya que sólo le interesa, porejemplo, calcular la cantidad de personas que están viajando enél en ese momento, sin tener en cuenta ninguna otra informaciónrelacionada con dichas personas, tales como la altura, el nombre,el color de ojos, etcétera. Nuestro objeto Tren se abstrae delobjeto del tipo Persona.

Ocultamiento de la información Este concepto hace referencia a quelos componentes se deben utilizar como si sólo se conociera su interfaz y nose tuviera conocimiento de su implementación. En otras palabras, un objetosabe que otro objeto entiende un determinado mensaje, el cual recibe ciertosparámetros y devuelve algo (o no).

Ejemplo: Yo como objeto Médico quiero saber cuantas cirugíastuvo un paciente, y entonces le envía un mensaje para que elPaciente me devuelva el número de cirugías que tuvo. El objetoMédico no sabe como devolvió ese número el Paciente, solo sabeque tiene que enviarle el mensaje y recibir un número.

Encapsulamiento Encapsulamiento es la capacidad de diferenciar quépartes de un objeto son parte de la interfaz y cuales permanecerán inaccesi-bles por el usuario. Son los lenguajes de programación los cuales, por mediode los modi�cadores de acceso, permiten indicar el modo de accesibilidad deun componente.En POO, a la conjunción de abstracción y ocultamiento de implementación

se le llama encapsulamiento.

Según Booch, encapsulamiento "... es el proceso de almacenaren un mismo comportamiento los elementos de una abstracciónque constituyen su estructura y su comportamiento; sirve paraseparar la interfaz contractual de una abstracción y su imple-mentación".

[email protected] 203 Antonio Carrillo Ledesma, Et alii

Page 206: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Veamos a traves de un ejemplo:

public class TestPersona {public static void main (String [ ] Args) {Persona p = new Persona ("Mauro", "Ruiz perez", 36);System.out.println (p.edad);

}}

En este caso, podemos acceder al valor de la edad del objeto p de la clasePersona, pero lo recomendable es mandar el mensaje que solicite dicho valormediante getEdad().Viéndolo desde el punto de vista de la escalabilidad y de un lenguaje de

programación, si el día de mañana tenemos diferentes objetos que tienen quemodi�car dicha propiedad, nuestro código se puede volver difícil de cambiardebido a que en varias partes se usa la propiedad edad, si tenemos encapsuladoese comportamiento, solo vamos a tener que hacer un cambio en un solo lugar.

Cohesión y Acoplamiento La cohesión mide la relación entre el con-cepto que deseamos modelar y las responsabilidades del componente quelo representan. El acoplamiento mide qué tan relacionados están los com-ponentes del sistema entre sí y cómo esa dependencia provoca un diseño.Siempre buscaremos tener un bajo acoplamiento y que los objetos sean lomás cohesivos posible.Claramente se puede ver que ambos conceptos están inversamente rela-

cionados, nuestros diseños deben tener una alta cohesión y un bajo acopla-miento. El paradigma de objetos se basa en esta regla para generar diseñosmás sencillos, y al mismo tiempo fáciles de programar, probar y mantener.

Declaratividad y Expresividad Estos conceptos no son particularesde POO, pero aun así se nos olvidan, por eso les vamos a hacer un repaso.La expresividad tiene que ver con qué tan claro es el código, qué tanto

expresa lo que tenía en en mente el programador cuando lo escribió, es decir,que tan bien expresadas están las ideas del programador. Usar variables ymétodos con nombres que representan lo que son o hacen, es una forma fácilde aplicar la expresividad, que no tiene nada que ver con el paradigma sinocon el programador.

[email protected] 204 Antonio Carrillo Ledesma, Et alii

Page 207: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Por lo general la declaratividad ayuda a que el código sea más expresivo,porque no se mezcla el algoritmo con lo que se quiere que haga más a altonivel. Cuando tenemos un código bien declarativo, podemos entender quees lo que hace sin ver en detalle el algoritmo implementado. Es importanterecalcar que la declaratividad es contraria a la imperatividad (o sea, detallarlínea a línea los pasos que hace el algoritmo).Entonces, la declaratividad indica qué se hace y la expresividad muestra

la intención de lo que va a hacer el código.Recordemos una frase de Martin Fowler que vale la pena comentar:

"Cuando sientas la necesidad de escribir un comentario, intentaprimero refactorizar el código de manera que cualquier comentariose convierte en innecesario."

La expresividad y declaratividad son muy importantes para poder generarun código autodocumentado, ya que nunca sabemos en el futuro quienes vana tener que revisar nuestro código. Si un compañero que tiene que modi�carnuestro código y no logra comprender fácilmente que quisimos hacer, te-nemos un problema. Si nosotros volvemos a un código que escribimos y nolo entendemos, tenemos un grave problema.

5.1 Herencia y Composición

Sobrecarga de métodos La sobrecarga es la capacidad de un lenguajede programación, que permite nombrar con el mismo identi�cador diferentesvariables u operaciones.La sobrecarga de métodos se re�ere a la posibilidad de tener dos o más

métodos con el mismo nombre pero diferentes parámetros. El compiladorusará una u otra dependiendo de los parámetros usados.El mismo método dentro de una clase permite hacer cosas distintas en

función de los parámetros.Clase Vector:

public class Vector {// Coe�cientes del vectorprivate double []C;// Guarda la dimension del arreglo de coe�cientesprivate int Dim;

[email protected] 205 Antonio Carrillo Ledesma, Et alii

Page 208: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

// Constructor de la clasepublic Vector() {Dim = 0;

}// Asigna coe�cientespublic Vector(double []coef) {int i, n = coef.length;C = new double[n];Dim = n;for (i = 0; i < n; i++) C[i] = coef[i];

}// Retorna los coe�cientesdouble coe�ciente(int i) {if (i >= Dim) {

System.out.print("Error");return 0;

}return C[i];

}// Retorna la dimension del arreglo de coe�cientesint dimension() {return Dim;

}// Visualiza el vectorpublic void visualiza() {int i;System.out.print("(");for (i = 0; i < Dim; i++) {System.out.print(C[i]);if(i < Dim-1) System.out.print(", ");

}System.out.print(")");

}// Visualiza el vectorpublic void visualizaLN() {visualiza();System.out.println("");

}

[email protected] 206 Antonio Carrillo Ledesma, Et alii

Page 209: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

// Suma con dos operandospublic void suma(Vector a, Vector b) {int i;Dim = 0;// Revisa el tamano de los vectores a sumarif(a.dimension() != b.dimension()) {System.out.println("Error, las dimensiones no son iguales");

} else {// Solicita memoria para los coe�cientes del vector

resultanteDim = a.dimension();C = new double[Dim];// Realiza la suma entre los coe�cientes comunesfor (i = 0; i < Dim; i++) C[i] = a.coe�ciente(i) +

b.coe�ciente(i);}

}// Suma con un operandopublic void suma(Vector a) {int i;// Revisa el tamano de los vectores a sumarif(dimension() != a.dimension()) {System.out.println("Error, las dimensiones no son iguales");

} else {// Realiza la suma entre los coe�cientes comunesfor (i = 0; i < Dim; i++) C[i] += a.coe�ciente(i);

}}// Funcion Principal ....public static void main(String[] args) {double a[] = {3.0, -4.0, 1.5};double b[] = {1.0, 1.0, 2.0};double c[] = {1.0, 3.0, -3.0};Vector A = new Vector(a);Vector B = new Vector(b);Vector C = new Vector(c);System.out.println("Suma con un operando:");C.visualizaLN();

[email protected] 207 Antonio Carrillo Ledesma, Et alii

Page 210: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

A.visualizaLN();C.suma(A);C.visualizaLN();System.out.println("Suma con dos operandos:");A.visualizaLN();B.visualizaLN();C.suma(A, B);C.visualizaLN();

}}

En este ejemplo que vemos, uno podría invocar al método "constructor" y"Suma" y según el número y tipo de parametros o sin ellos de como se invoqueen nuestro código, el compilador decidirá a cual llamar según corresponda.En tiempo de compilación, se buscan todas las llamadas a este método y

según el tipo de los parámetros con los que se esté invocando y el objeto quepuede o no devolver (necesariamente son lenguajes de chequeo estático), sedetermina a qué implementación llamará. Si la combinación de parámetrosno coincide, el compilador mandará mensaje de error.Los multimétodos, a diferencia de la sobrecarga, son un conjunto de méto-

dos con la misma �rma � el nombre y los parámetros del método� , pero quese pueden solapar, y se decide cuál ejecutar en tiempo de ejecución.

Composición La composición se re�ere a la combinación de objetos sim-ples para hacer objetos más complejos.Los objetos a menudo pueden dividirse en tipos compuestos y compo-

nentes, y la composición puede considerarse como una relación entre estostipos: un objeto de un tipo compuesto (ej.: auto) "tiene un" objeto de untipo simple (ej.: rueda).Considere la relación de un automóvil con sus partes: el automóvil tiene o

se compone de objetos como el volante, asientos, caja de cambios y el motor.Esta relación podría de�nirse como una relación de composición.Los objetos compuestos generalmente se expresan por medio de referen-

cias de un objeto a otro. Tales referencias pueden ser conocidas como atribu-tos, campos, miembros o propiedades y la composición resultante como tipocompuesto. Sin embargo, tener esas referencias no necesariamente signi�caque un objeto es compuesto. Sólo se llama compuesto, si los objetos de

[email protected] 208 Antonio Carrillo Ledesma, Et alii

Page 211: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

los que se compone son realmente sus partes, es decir, no tienen existenciaindependiente.

Herencia Es el mecanismo por el cual un objeto se basa en otro objeto oclase, extendiendo la implementación para reutilizar su comportamiento72.Supongamos que la clase Médico y Profesor, por ser Personas, comparten

datos personales, esto queda plasmado en la siguiente jerarquía de clases:Clase Medico:

public class Medico extends Persona {private String especialidad;private String cedula;//Constructor de la subclase: incluimos como parametros

al menos los del constructor de la superclasepublic Medico(String nombre, String apellidos, int edad,

String especialidad, String cedula) {super(nombre, apellidos, edad);this.especialidad = especialidad;this.cedula = cedula;

}public void setEspecialidad(String especialidad) {this.especialidad = especialidad;

}public String getEspecialidad() {return especialidad;

}public void setCedula(String cedula) {this.cedula = cedula;

}public String getCedula() {return cedula;

}public void visualiza() {System.out.println ("Nombre del medico: " + getNom-

bre() + " " + getApellidos() +

72En Java no se permite herencia múltiple, pero sí en Paython y C++, permitiendodiseños más complejos.

[email protected] 209 Antonio Carrillo Ledesma, Et alii

Page 212: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

" especialidad: " + getEspecialidad() + " cedula: " + getCedula());}

}

Clase Profesor:

public class Profesor extends Persona {private String idProfesor;//Constructor de la subclase: incluimos como parametros

al menos los del constructor de la superclasepublic Profesor(String nombre, String apellidos, int edad,

String idProfesor) {super(nombre, apellidos, edad);this.idProfesor = idProfesor;

}public void setIdProfesor (String idProfesor) {this.idProfesor = idProfesor;}public String getIdProfesor () {return idProfesor;

}public void visualiza() {System.out.println ("Nombre del profesor: " + getNom-

bre() + " " + getApellidos() +" Id de profesor: " + getIdProfesor() );}

}

¿Cómo funciona?

public class TestHerencia {public static void main (String [ ] Args) {Profesor p1 = new Profesor ("Juan", "Nadrie Garcia",

33, "Prof 22-387-11");Medico m1 = new Medico ("Roberto", "Gonzalez Gar-

cia", 33, "Cirujano", "328943784");Persona p = new Persona ("Mauro", "Ruiz perez", 36);p.visualiza();

[email protected] 210 Antonio Carrillo Ledesma, Et alii

Page 213: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

p1.visualiza();m1.visualiza();

}}

Cuando le llega un objeto, el compilador, hace lo siguiente:

1. Busca la implementación en la clase del objeto a la que le llega elmensaje

2. Si no la encontra, la busca en su padre

3. Repite el paso anterior hasta que no haya más padres.

4. Si no encuentra ninguna implementación en todos los niveles, lanza unerror.

A este mecanismo se lo conoce comoMethod LookUp. Algo a destacarde la herencia es que las clases hijas van a heredar lo que haya de�nido susuperclase, tanto atributos como métodos.Los motivaciones de utilizar herencia son:

� Reusa código.

� Genera una abstracción.

� Crea un Tipo (para lenguajes con tipado estático).

Prototipos La orientación a objetos basada en prototipos es un estilo dereutilización de comportamiento (herencia) que se logra por medio de laclonación de un objeto ya existente, que sirve como prototipo (Javascript, esel lenguaje orientado a objetos basado en prototipos más conocido).

Autoreferencia Así como un objeto puede conocer a otro objeto teniendouna referencia hacia este, también se puede conocer a sí mismo. Cualquierobjeto tiene una autoreferencia, denominada this o self (según el lenguaje)para poder mandarse algún mensaje a sí mismo.Así como el self, hay otra referencia, denominada super o parent la cual

es equivalente al this o self, con la particularidad de que le dice al Method

[email protected] 211 Antonio Carrillo Ledesma, Et alii

Page 214: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

LookUp "empieza desde uno más arriba". Es decir, que no busca la imple-mentación en la clase donde está ejecutando el método, sino en la inmediatasuperior (puede que eso desemboque en que siga subiendo niveles). En el 99%de los casos, sólo deberíamos llamar a super/parent para ejecutar el mismométodo que estamos ejecutando.Ejemplo de código:

public Profesor (String nombre, String apellidos, int edad, String idProfesor) {super(nombre, apellidos, edad);this.idProfesor = idProfesor;

}

Contratos

Diseño por contratos El diseño por contratos asume que todos loscomponentes del cliente que invocan una operación en un componente delservidor van a encontrar las precondiciones (y postcondiciones) especi�cadascomo obligatorias para esa operación.Muchas veces podemos tener algunas cosas para validar en nuestro sis-

tema. Esto es:

� Pre condiciones

� Post condiciones

� Condiciones "permanentes" o invariantes

Por ejemplo: yo siempre que alimente a mi mascota, debo garantizartenga hambre. Por lo que quisiera tener algo como:

public class Mascota implements Domesticable {public void alimentarse(){if( tengoHambre() == true) {//ejecutar método

}}

}

[email protected] 212 Antonio Carrillo Ledesma, Et alii

Page 215: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Lo mismo puede suceder con las post condiciones, o condiciones que sedeben dar en todo momento.

public class Mascota implements Domesticable {public void alimentarse(){if( tengoHambre() == true) {//ejecutar métodoestoyLleno()

}}

}

Para hacer cumplir estos contratos, hay 2 maneras:

1. Validación manual y lanzamiento de excepciones

2. Integrado por el lenguaje o algún Framework

Lo importante es que se entienda el concepto del contrato, para poderinteractuar de cierta manera con un componente, debo cumplir ciertos req-uisitos, tanto antes, durante o después de la interacción.

Contratos y Herencia Básicamente, aplican las mismas ideas y conceptosque en la herencia de comportamiento. Las precondiciones, postcondicionese invariantes se heredan de clases a subclases.Sin embargo existen algunos condicionamientos, para garantizar el prin-

cipio de intercambiabilidad. Que se pueden resumir en la siguiente frase:

Require no more, and promise no less

Relacionado con la L (Liskov Substitution Principle) de SOLID73, la cual

73SOLID Design Principles de Robert C. Martin�s:

� Single Responsibility Principle� Open/Closed Principle� Liskov Substitution Principle� Interface Segregation Principle� Dependency Inversion

https://es.wikipedia.org/wiki/SOLID

[email protected] 213 Antonio Carrillo Ledesma, Et alii

Page 216: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

plantea que donde uso una clase, debería poder usar cualquier subclase deella y que siga funcionando todo correctamente.

Tipos ¿Qué es un tipo? Un tipo describe un conjunto de valores.La idea de tipo nos permite relacionar:

� Un conjunto de valores que tienen ese tipo o son de ese tipo

� Las operaciones que pueden ser realizadas sobre esos valores.

Los objetivos de un sistema de tipos son:

� Ayudar a detectar errores al programar.

� Guiar al programador sobre las operaciones válidas en un determinadocontexto, tanto la documentación como en las ayudas automáticas quepuede proveer por ejemplo un IDE.

� En algunos casos el comportamiento de una operación puede variar enfunción del tipo de los elementos involucrados en la misma. Polimor-�smo, sobrecarga (los veremos más adelante), multimétodos, etc.

Podemos hacer 3 clasi�caciones de tipado:

� El Implícito o explícito. Un lenguaje va a tener tipado explícito sí:

Todos los elementos (variables, métodos, etc.) tienen un tipo de�nido.

Para que dos objetos sean polimór�cos, debo explicitarlos (por una interfazo por heredar de la misma clase).

� Chequeo dinámico o estático.

La diferencia está en el momento en que es ejecutado el chequeo de tipos.En los lenguajes de chequeo estático (como Java o C++) se veri�caen tiempo de compilación, mientras que en los de chequeo dinámico serealiza en tiempo de ejecución (como en Python).

[email protected] 214 Antonio Carrillo Ledesma, Et alii

Page 217: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

El chequeo dinámico da lugar a un concepto famoso denominado Duck Typ-ing. El cual se basa en que "si algo tiene pico de pato, camina comopato, y hace cuack, es un pato". Es decir, toma sentido el tipo alque pertenece un objeto según qué mensaje puedo mandarle y cómoresponde, no se me especi�ca desde antes.

� Estructural o nominal

Hace referencia a si se identi�ca un tipo por su nombre o por su estructura.Es muy común en los lenguajes del paradigma funcional.

Las combinaciones más frecuentes son:

� Explícito, estático y nominal

� Implícito y dinámico

Casting Es un mecanismo utilizado en los lenguajes de chequeo estático,mediante el cual le "aseguramos" al compilador que cierto objeto perteneceal tipo especi�cado.Ejemplo:

import java.util.*;public class TestHerencia {public static void main (String [ ] Args) {Profesor p1 = new Profesor ("Juan", "Nadrie Garcia",

33, "Prof 22-387-11");Medico m1 = new Medico ("Roberto", "Gonzalez Gar-

cia", 33, "Cirujano", "328943784");Persona p = new Persona ("Mauro", "Ruiz Perez", 36);List<Persona> tlist = new ArrayList<Persona>();tlist.add(p1);tlist.add(m2);tlist.add(p);for (int i = 0; i < tlist.size(); i++) tlist.get(i).visualiza();

}}

[email protected] 215 Antonio Carrillo Ledesma, Et alii

Page 218: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Hay que ser muy cuidadosos al usar el casteo, porque podría llevar a"confundir" al compilador y hacer que falle en tiempo de ejecución (perdiendoel bene�cio que nos da el chequeo estático), por ejemplo si en el objetotlist querecibe objetos de las clases Medico, Profesor y Persona, al llamar a métodosno comunes indicados en la clase base Persona nuestro programa lanzará unaexcepción.

Variables y Métodos de Clase También se denominan métodos y varia-bles estáticas. La implementación de los mismos varía dependiendo dellenguaje. En algunos las clases son objetos, en otros, las clases son entesparticulares con una instancia asociada, que se pueden utilizar de determi-nada forma y enviarles mensajes y en algunos no se utiliza ninguna de estasnociones, pero siguen teniendo el mismo concepto.Las variables de clase nos sirven cuando queremos que nuestros objetos

tengan alguna referencia a algún valor, que sea el mismo para todas lasinstancias de esa clase, y que además pueda cambiar (por eso usamos unavariable y no forzamos ese valor en el código del programa, asumiendo quees posible).Si usáramos una variable de instancia con la intención de de�nir el mismo

valor en todas las instancias de esa clase, y luego queremos cambiar dichovalor, debemos poder encontrar todas las instancias ya existentes para podermandarles el mensaje para que actualicen su referencia. Y si tenemos mu-chos objetos, podemos tener un gran problema, no sólo por la complejidadinnecesaria del problema, sino también porque el desempeño se vera afectado.Los métodos de clase, son métodos cuyo receptor / implementador va a

ser una clase en lugar de un objeto. El caso más común es el del constructor,donde la clase recibe el "New" y ella sabe generar una nueva instancia de laclase e incluso llama al constructor correspondiente.Otro caso recurrente es el de querer tener una sola instancia por clase.

Para profundizar más en este funcionamiento, ver el patrón de diseño Sin-gleton.

Herencia V.S. Composición Uno de los objetivos que buscamos cuandoprogramamos es reutilizar métodos y funcionalidades, para lograr una mayormantenibilidad. Dentro de los lenguajes convencionales orientados a objetosexisten varias formas de hacer esto, las dos más conocidas son: herencia declases y composición.

[email protected] 216 Antonio Carrillo Ledesma, Et alii

Page 219: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Herencia de clases También conocido como "reutilización de cajablanca", debido a la visibilidad que dan ya que mediante la herencia, lasimplementaciones de las clases padres se hacen visible a las clases hijas.Ventajas:

� Se de�ne en tiempo de compilación y no tiempo de ejecución, es decirque conocemos con seguridad que se va a ejecutar.

� Es más sencillo modi�car la implementación que está siendo reutilizada.

Desventajas:

� Como dijimos antes, se de�nen en tiempo de compilación, por lo queno se puede cambiar el comportamiento de un objeto en tiempo deejecución, lo cual puede ser un requisito de nuestro diseño.

� Se rompe el concepto de encapsulación al exponer los detalles de laimplementación en la clase padre.

Composición Conocida como "reutilización de caja negra", a diferen-cia del caso anterior nosotros no conocemos los detalles de la implementación,ya que la misma se encuentra encapsulada en el objeto al cual estamos invo-cando.Ventajas:

� Al tener objetos que hacen referencia a otros objetos, el vínculo se de�neen tiempo de ejecución y como a dichos objetos se accede mediante suinterfase no se rompe el principio de encapsulación (entonces podríamosreemplazar al objeto por otro cuando corre nuestro programa y tenerun comportamiento totalmente distinto).

� Permite tener clases más centradas y encapsuladas, haciendo que nues-tro diseño tenga más objetos (menos clases) de menor tamaño y conmenos responsabilidades.

Agregación Es cuando una o más clases son parte de otra clase. En estecaso el objeto no es creado dentro del objeto compuesto, es adherido mediantealgún método que lo permita.Diferencia entre Agregación y Composición

[email protected] 217 Antonio Carrillo Ledesma, Et alii

Page 220: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Las relaciones en una composición son requeridas, en la agregación sonopcionales.

� En la composición una clase particular no puede ser compartida porotras clases compuestas, en la agregación esto es posible.

� La relación de vida de la clase particular y la clase contenedora, es muyfuerte, de hecho es la relación más fuerte; tanto que si un objeto de laclase contenedora es destruido la clase particular también lo será. Estoen la agregación no ocurre.

Conclusión Se podría decir que conviene favorecer la composición so-bre la herencia, sin embargo esta respuesta no es de�nitiva, cada uno tieneque identi�car la necesidades y el dominio en el cual está trabajando paraidenti�car en que casos conviene usar cada metodología.Algunas recomendaciones:

� En lenguajes que no soportan herencia múltiple, puede resultar venta-josa la composición.

� La composición genera un diseño más desacoplado, que puede ayudara hacer pruebas individuales de las clases y de la interacción de losobjetos de una más fácil.

� Muchos patrones de diseño favorecen la composición.

5.2 Clase Abstracta

Las clases abstractas son aquellas que por sí mismas no se pueden identi�carcomo algo "concreto" (no existen como tal en el mundo real), pero si poseendeterminadas características que son comunes a otras clases que pueden sercreadas a partir de ellas.Clase Numero:

public abstract class Numero {// Genera un nuevo miembro de la claseabstract Numero nuevo();// Regresa verdadero si es ceroabstract boolean esCero();

[email protected] 218 Antonio Carrillo Ledesma, Et alii

Page 221: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

// Sumaabstract void suma(Numero a, Numero b);// Sumaabstract void suma(Numero a);// Visualiza sin cambiar de lineaabstract void visualiza();// Visualiza cambiando de lineavoid visualizaLN() {visualiza();System.out.println("");

}}

Con ella de�nimos la clase NumeroFraccionario:

public class Fraccion extends Numero {// Numerador de la fraccionprivate long P;// Denominador de la fraccionprivate long Q;// Arreglo que contendra a los primosstatic private long []Pr;// Numero de primos que contendra el arreglo de primosstatic �nal private int nPr = 1000;// Constructor nulo fraccion 0/1public Fraccion() {this(0,1);

}// Constructor con un objeto Fraccionpublic Fraccion (Fraccion a) {this(a.numerador(), a.denominador());

}// Constructor con entero P Fraccion P/1public Fraccion (long p) {this(p,1);

}// Costructor con la fraccion P/Qpublic Fraccion (long p, long q) {

[email protected] 219 Antonio Carrillo Ledesma, Et alii

Page 222: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

P = p;Q = q;calculaPrimos();

}// Genera un nuevo miembro de la clasepublic Numero nuevo() {Numero c = new Fraccion();return c;

}// Calcula los primeros nPr primosprivate void calculaPrimos() {int n, i, np;Pr = new long[nPr];// Guarda los primeros 2 primosPr[0] = 2;Pr[1] = 3;np = 2;// Empieza la busqueda de primos a partir de 4n = 4;// Ciclo para buscar los primeros NPB primoswhile (np < nPr) {for (i = 0; i < np; i++) {if((n % Pr[i]) == 0) break;

}if(i == np) {Pr[i] = n;np++;

}n++;

}}// Visualiza los primos encontradospublic void visArregloPrimos() {System.out.println("Visualiza los primeros " + nPr + "

primos");for (int i = 0; i < nPr; i++) System.out.println(Pr[i]);

}// Simpli�ca el numerador y denominador de la fraccion

[email protected] 220 Antonio Carrillo Ledesma, Et alii

Page 223: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

private void simpli�ca() {int i, sw;for (i = 0; i < nPr; i++) {do {sw = 0;if (Math.abs(P) < 2 jj Q < 2) return;if((P % Pr[i] == 0) && (Q % Pr[i] == 0)) {P /= Pr[i];Q /= Pr[i];sw = 1;

}} while(sw == 1);

}}// Retorna el Numeradorpublic long numerador() {return P;

}// Retorna el denominadorpublic long denominador() {return Q;

}// Regresa verdadero si la fraccion es ceropublic boolean esCero() {if (numerador() == 0) return true;return false;

}// Suma de fracciones con dos operandospublic void suma(Numero A, Numero B) {Fraccion a = new Fraccion( (Fraccion) A);Fraccion b = new Fraccion( (Fraccion) B);P = a.numerador() * b.denominador() + b.numerador()

* a.denominador();Q = a.denominador() * b.denominador();

}// Suma de fracciones con un operandopublic void suma(Numero A) {Fraccion a = new Fraccion( (Fraccion) A);

[email protected] 221 Antonio Carrillo Ledesma, Et alii

Page 224: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

P = numerador() * a.denominador() + a.numerador() *denominador();

Q = denominador() * a.denominador();}// Visualiza la Fraccionpublic void visualiza() {simpli�ca();System.out.print(P);System.out.print("/");System.out.print(Q);

}};

También de�nimos la clase NumeroComplejo:

public class Complejos extends Numero {// Parte real del complejoprivate double R;// Parte imaginaria del complejoprivate double I;// Constructorespublic Complejos() {R = 0;I = 0;

}// Constructorespublic Complejos(double r, double i) {R = r;I = i;

}// Constructorespublic Complejos(double r) {R = r;I = 0;

}// Constructorespublic Complejos(Complejos a) {R = a.parteReal();

[email protected] 222 Antonio Carrillo Ledesma, Et alii

Page 225: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

I = a.parteImaginaria();}// Genera un nuevo miembro de la clasepublic Numero nuevo() {Numero c = new Complejos();return c;

}// Retorna la parte real del complejopublic double parteReal() {return R;

}// Retorna la parte imaginaria del complejopublic double parteImaginaria() {return I;

}// Regresa verdadero si el complejo es ceropublic boolean esCero() {if (parteReal() == 0.0 && parteImaginaria() == 0.0)

return true;return false;

}// Suma con dos operandospublic void suma(Numero A, Numero B) {Complejos a = new Complejos( (Complejos) A);Complejos b = new Complejos( (Complejos) B);R = a.parteReal() + b.parteReal();I = a.parteImaginaria() + b.parteImaginaria();

}// Suma con un operandopublic void suma(Numero A) {Complejos a = new Complejos( (Complejos) A);R = parteReal() + a.parteReal();I = parteImaginaria() + a.parteImaginaria();

}// Visualiza el complejopublic void visualiza() {System.out.print(R + " + " + I + "i");

}

[email protected] 223 Antonio Carrillo Ledesma, Et alii

Page 226: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

};

Y tembién de�nimos la clase NumeroComplejoFraccionario:

public class ComplejoFraccionario extends Numero {// Parte real del complejoprivate Fraccion R;// Parte imaginaria del complejoprivate Fraccion I;// Constructorespublic ComplejoFraccionario() {R = new Fraccion();I = new Fraccion();

}// Constructorespublic ComplejoFraccionario(long r, long i) {R = new Fraccion(r);I = new Fraccion(i);

}// Constructorespublic ComplejoFraccionario(long r) {R = new Fraccion(r);I = new Fraccion();

}public ComplejoFraccionario(long rn, long rd, long in, long

id) {R = new Fraccion(rn, rd);I = new Fraccion(in, id);

}// Constructorespublic ComplejoFraccionario(ComplejoFraccionario a) {R = a.parteReal();I = a.parteImaginaria();

}// Genera un nuevo miembro de la clasepublic Numero nuevo() {Numero c = new ComplejoFraccionario();return c;

[email protected] 224 Antonio Carrillo Ledesma, Et alii

Page 227: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

}// Retorna la parte real del complejopublic Fraccion parteReal() {return R;

}// Retorna la parte imaginaria del complejopublic Fraccion parteImaginaria() {return I;

}// Regresa verdadero si el complejo es ceropublic boolean esCero() {if (parteReal().numerador() == 0.0 && parteImaginaria().numerador()

== 0.0) return true;return false;

}// Suma con dos operandospublic void suma(Numero A, Numero B) {ComplejoFraccionario a = new ComplejoFraccionario(

(ComplejoFraccionario) A);ComplejoFraccionario b = new ComplejoFraccionario(

(ComplejoFraccionario) B);R.suma(a.parteReal(), b.parteReal());I.suma(a.parteImaginaria(), b.parteImaginaria());

}// Suma con un operandopublic void suma(Numero A) {ComplejoFraccionario a = new ComplejoFraccionario(

(ComplejoFraccionario) A);R.suma(parteReal(), a.parteReal());I.suma(parteImaginaria(), a.parteImaginaria());

}// Visualiza el complejopublic void visualiza() {R.visualiza();System.out.print("+");I.visualiza();System.out.print("i");

}

[email protected] 225 Antonio Carrillo Ledesma, Et alii

Page 228: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

};

Pero, ¿podemos de�nir algún objeto Número o todos van a ser Frac-cionario/Complejo/ComplejoFraccionario/etc.?En este caso, la clase Número no debería ser instanciable, solo quiero

utilizarla para que las clases que heredan de esta puedan usar el códigode�nida en ella.A esto se lo llama una clase abstracta. Al contrario de las abstractas, las

clases que sí son instanciables, se les denomina concretas. Una clase abstractade�ne sólo la interfaz o �rma � el nombre, los parámetros del método y loque retorna� de algunos de sus métodos. Podemos tener:

� Clases abstractas puras, (véase ejemplo en 5.5).

� Clases parcialmente abstractas, (véase ejemplo en 5.2).

Manteniendo el concepto, una clase abstracta puede obligar a que sus sub-clases implementen cierto método, pero sin de�nir ningún comportamientopor omisión. A estos métodos, naturalmente, se los denomina métodos abs-tractos.Si una clase tiene al menos un método abstracto, entonces debe ser abs-

tracta, porque no tiene sentido que haya un objeto que sea instancia de ella.A �nes de comprensión de concepto, podría decirse que una interfaz es unaclase abstracta con todos sus métodos abstractos.

Interfaces Una interfaz de�ne un tipo y es una colección de métodos abs-tractos. De forma similar a una clase abstracta, obliga a quienes implementenla interfaz a implementar los métodos.Las interfaces no pueden de�nir la implementación de los métodos de los

objetos que las van a utilizar, pero si obligan a dichos objetos a de�nir esaimplementación.Las interfaces sirven para solventar la limitación de muchos lenguajes,

que no soportan la herencia múltiple.

Clases Abstractas Puras vs Interfaces

� Solo se puede extender de una clase abstracta, pero se pueden imple-mentar más de una interfaz en una clase.

[email protected] 226 Antonio Carrillo Ledesma, Et alii

Page 229: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Un interfaz no puede de�nir atributos.

� Así como no se puede crear instancias de clases abstractas, tampoco esposible crear instancias de interfaces.

5.3 Polimor�smo y Programación Genérica

Es la capacidad que tiene un objeto de poder tratar indistintamente a otrosque sean potencialmente distintos, es decir, es la capacidad que tienen dis-tintos objetos de entender un mismo mensaje.Clase Matriz:

public class Matriz <T extends Numero> {// Coe�cientes de la Matrizprivate Numero [][] M;// Numero de Renglonesprivate int ren;// Numero de Columnasprivate int col;// Constructor de la clasepublic Matriz() {col = 0;ren = 0;

}// Asigna coe�cientespublic void asignaCoe�cientes(Numero [][]coef) {int i,j;ren = coef.length;col = coef[0].length;M = new Numero[ren][col];for (i = 0; i < ren; i++) {for (j = 0; j < col; j++) {M[i][j] = coef[i][0].nuevo();M[i][j] = coef[i][j];

}}

}// Retorna los coe�cientes

[email protected] 227 Antonio Carrillo Ledesma, Et alii

Page 230: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Numero coe�ciente(int i, int j) {if (i< 0 jj i>= ren jj j< 0 jj j>= col) System.out.print("Error");return M[i][j];

}// Retorna el numero de renglonesint renglones() {return ren;

}// Retorna el numero de columnasint columnas() {return col;

}// Visualiza la Matrizpublic void visualiza() {int i, j;for (i = 0; i < ren; i++) {for (j = 0; j < col; j++) {M[i][j].visualiza();System.out.print(" ");

}System.out.println("");

}}// Visualiza la Matrizpublic void visualizaLN() {visualiza();System.out.println("");

}// Suma con dos operandospublic void suma(Matriz a, Matriz b) {int i, j;ren = 0;col = 0;// Revisa el tamano de las Matrices a sumarif(a.renglones() != b.renglones() jj a.columnas() != b.columnas())

{System.out.println("Error, las dimensiones no son iguales");

} else {

[email protected] 228 Antonio Carrillo Ledesma, Et alii

Page 231: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

// Solicita memoria para la Matriz resultanteren = a.renglones();col = a.columnas();M = new Numero[ren][col];for (i = 0; i < ren; i++) {for (j = 0; j < col; j++) {M[i][j] = a.coe�ciente(i,j).nuevo();M[i][j].suma(a.coe�ciente(i,j), b.coe�ciente(i,j));

}}

}}// Suma con un operandopublic void suma(Matriz a) {int i, j;ren = 0;col = 0;// Revisa el tamano de las Matrices a sumarif(renglones() != a.renglones() jj columnas() != a.columnas())

{System.out.println("Error, las dimensiones no son iguales");

} else {// Solicita memoria para la Matriz resultantefor (i = 0; i < ren; i++) {for (j = 0; j < col; j++) {M[i][j].suma(a.coe�ciente(i,j));

}}

}}// Funcion Principal ....public static void main(String[] args) {// Ejemplito de Matrices de coe�cientes ComplejosComplejos [][]x = new Complejos[2][2];x[0][0] = new Complejos(2, 3);x[1][0] = new Complejos(2, 2);x[0][1] = new Complejos(3, 2);x[1][1] = new Complejos(3, 2);

[email protected] 229 Antonio Carrillo Ledesma, Et alii

Page 232: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Complejos [][]y = new Complejos[2][2];y[0][0] = new Complejos(-2, -3);y[1][0] = new Complejos(2, 3);y[0][1] = new Complejos(3, 3);y[1][1] = new Complejos(3, 3);Matriz<Complejos> X = new Matriz<Complejos>();X.asignaCoe�cientes(x);Matriz<Complejos> Y = new Matriz<Complejos>();Y.asignaCoe�cientes(y);Matriz<Complejos> Z = new Matriz<Complejos>();System.out.println("Complejo");X.visualizaLN();System.out.println("+");Y.visualizaLN();Z.suma(X, Y);System.out.println("=====================");Z.visualizaLN();System.out.println("");System.out.println("");

// Ejemplito de Matrices de coe�cionets ComplejoFrac-cionario

ComplejoFraccionario [][]xx = new ComplejoFraccionario[2][2];xx[0][0] = new ComplejoFraccionario(2, 3, 4, 5);xx[1][0] = new ComplejoFraccionario(2, 2, 3, 7);xx[0][1] = new ComplejoFraccionario(3, 2);xx[1][1] = new ComplejoFraccionario(3, 2);ComplejoFraccionario [][]xy = new ComplejoFraccionario[2][2];xy[0][0] = new ComplejoFraccionario(-2, 3, 5, 6);xy[1][0] = new ComplejoFraccionario(2, 3, 7, 9);xy[0][1] = new ComplejoFraccionario(3, 3);xy[1][1] = new ComplejoFraccionario(3, 3);Matriz<ComplejoFraccionario> xX= newMatriz<ComplejoFraccionario>();xX.asignaCoe�cientes(xx);Matriz<ComplejoFraccionario> xY= newMatriz<ComplejoFraccionario>();xY.asignaCoe�cientes(xy);Matriz<ComplejoFraccionario> xZ = newMatriz<ComplejoFraccionario>();System.out.println("Complejo Fraccionario");

[email protected] 230 Antonio Carrillo Ledesma, Et alii

Page 233: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

xX.visualizaLN();System.out.println("+");xY.visualizaLN();xZ.suma(xX, xY);System.out.println("=====================");xZ.visualizaLN();System.out.println("");System.out.println("");

}}

Este concepto se conoce como polimor�smo. Es la capacidad de inter-cambiar un objeto con otro, abstrayendo al que se conoce desde su imple-mentación.

¿Por qué es importante diseñar polimór�camente? Para ganarextensibilidad. Así, al implementar otra clase que extienda a la de tipoNumero, no necesitaremos modi�car la clase Matriz, es su�ciente con crearleuna implementación y encajará perfectamente en el sistema.Entonces, para hacerlo genérico, se establece un contrato: "Todas las

clases de tipo Numero deben entender el mensaje de sumar".En general, un contrato establece un acuerdo entre dos (o más) partes.

Si lo cumplimos, el sistema va a tener una funcionalidad o comportamientode�nido. De alguna forma regula la interacción entre dos módulos de nues-tra aplicación. Entonces intercambiando un módulo por otro que cumple elmismo contrato debería ser transparente para el otro módulo.La parte del contrato más frecuentemente usada, va a ser lo que denomi-

namos interfaz. La interfaz de un objeto es el conjunto de mensajes queentiende.Adicionalmente, están las construcciones especí�cas denominadas inter-

faces. Estas, no son más que una especi�cación del conjunto de mensajes quetienen que cumplir aquellos que la implementen.Una buena regla para identi�car la necesidad de una interfaz es establecer

un adjetivo común a los objetos que quiero que la implementen (sumar/restar/ dividir/ multiplicar), a diferencia de una superclase, las cuales suelenser sustantivos (Animal/ Persona/ Auto).

Aprovechando todo lo desarrollado hasta aquí, mostramos un par de ejem-plos de programación genérica, mediante el ejemplo de la clase Vector y la

[email protected] 231 Antonio Carrillo Ledesma, Et alii

Page 234: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

clase Polinomio genérico y que soporta los tipos de números que extienden ala clase Numero desarrollados anteriormente y otros más.

5.4 Excepciones

¿Cuántas veces al trabajar con un programa de cómputo, este nos mandaalgún mensaje de error poco descriptivo?, esto probablemente se deba a unbajo nivel de detalle en el manejo de excepciones dentro de nuestro programa.El manejo de excepciones consiste en controlar los errores que surjan dentrode nuestro programa para poder tratarlos debidamente.Tratarlos debidamente implica:

� Mostrar un mensaje más amigable a los usuarios (la más común).

� Revertir (Rollback) alguna transacción.

� Escribir en un archivo tipo registro (Log) el error para analizarlo.

� Si el error no afecta el �ujo de trabajo: contenerlo para que el �ujosiga.

En Java los errores en tiempo de ejecución (cuando se esta ejecutando elprograma) se denominan excepciones, y esto ocurre cuando se produce unerror en alguna de las instrucciones de nuestro programa, como por ejemplocuando se hace una división entre cero, cuando un objeto es null y no puedeserlo, cuando no se abre correctamente un archivo, etc. Cuando se produceuna excepción se muestra en la pantalla un mensaje de error y �naliza laejecución del programa.En Java (al igual que en otros lenguajes de programación), existen mu-

cho tipos de excepciones. En lo referente a las excepciones hay que decirque se aprenden a base experiencia, de encontrarte con ellas y de saber solu-cionarlas. Cuando en Java se produce una excepción se crear un objeto deuna determina clase � dependiendo del tipo de error que se haya producido�, que mantendrá la información sobre el error producido y nos proporcionarálos métodos necesarios para obtener dicha información. Estas clases tienencomo clase padre la clase Throwable, por tanto se mantiene una jerarquía enlas excepciones.A continuación mostramos algunas de las clases para que nos hagamos

una idea de la jerarquía que siguen las excepciones, pero existen muchísimasmás excepciones que las que mostramos:

[email protected] 232 Antonio Carrillo Ledesma, Et alii

Page 235: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Figura 1: Jerarquía de clases para el manejo de excepciones en Java.

En Java, cuando se produce un error en un método, "se lanza" un objetoThrowable, cualquier método que haya llamado al método puede "capturar laexcepción" y tomar las medidas que estime oportunas. Tras capturar la ex-cepción, el control no vuelve al método en el que se produjo la excepción, sinoque la ejecución del programa continúa en el punto donde se haya capturadola excepción.Consecuencia:

Nunca más tendremos que preocuparnos de "diseñar" códigos deerror.

Throwable Clase base que representa todo lo que se puede "lanzar" enJava, contiene una instantánea del estado de la pila en el momento en elque se creó el objeto ( "Stack Trace" o "Call Chain"), también almacenaun mensaje (variable de instancia de tipo String) que podemos utilizar paradetallar qué error se produjo. Además puede tener una causa, también detipo Throwable, que permite representar el error que causó este error.

Error Subclase de Throwable que indica problemas graves que una apli-cación no debería intentar solucionar (documentación de Java), ejemplos:

Memoria agotada, error interno de la JVM, etc.

[email protected] 233 Antonio Carrillo Ledesma, Et alii

Page 236: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Exception Exception y sus subclases indican situaciones que una apli-cación debería tratar de forma razonable.Los dos tipos principales de excepciones son:

� RuntimeException, errores del programador, como una división por ceroo el acceso fuera de los límites de un array.

� IOException, errores que no puede evitar el programador, generalmenterelacionados con la entrada/salida del programa.

Captura de excepciones: Bloques try...catch Se utilizan en Java paracapturar las excepciones que se hayan podido producir en el bloque de códigodelimitado por try y catch. En cuanto se produce la excepción, la ejecucióndel bloque try termina y la cláusula catch recibe como argumento un objetoThrowable.Ejemplo básico:

// Bloque 1try {// Bloque 2

} catch (Exception error) {// Bloque 3

}// Bloque 4

Flujo de la ejecución en el programa:

Sin excepciones: 1 -> 2 -> 4

Con una excepción en el bloque 2: 1 -> 2(excepción) -> 3 -> 4

Con una excepción en el bloque 1: 1(excepción)

Otro ejemplo:

// Bloque 1try {// Bloque 2

} catch (ArithmeticException ae) {

[email protected] 234 Antonio Carrillo Ledesma, Et alii

Page 237: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

// Bloque 3} catch (NullPointerException ne) {// Bloque 4

}// Bloque 5

Flujo de la ejecución en el programa:

Sin excepciones: 1 -> 2 -> 5

Excepción de tipo aritmético: 1 -> 2(excepción) -> 3 -> 5

Acceso a un objeto nulo (null): 1 -> 2(excepción) -> 4 -> 5

Excepción de otro tipo diferente: 1 -> 2(excepción)

Un ejemplo más:

// Bloque1try {// Bloque 2

} catch (ArithmeticException ae) {// Bloque 3

} catch (Exception error) {// Bloque 4

}// Bloque 5

Flujo de la ejecución en el programa:

Sin excepciones: 1 -> 2 -> 5

Excepción de tipo aritmético: 1 -> 2(excepción) -> 3 -> 5

Excepción de otro tipo diferente: 1 -> 2(excepción) -> 4 -> 5

¡Ojo! Las cláusulas catch se comprueban en orden, ejemplo:

[email protected] 235 Antonio Carrillo Ledesma, Et alii

Page 238: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

// Bloque1try {// Bloque 2

} catch (Exception error) {// Bloque 3

} catch (ArithmeticException ae) {// Bloque 4

}// Bloque 5

Flujo de la ejecución en el programa:

Sin excepciones: 1 -> 2 -> 5

Excepción de tipo aritmético: 1 -> 2(excepción) -> 3 -> 5

Excepción de otro tipo diferente: 1 -> 2(excepción) -> 3 -> 5

¡El bloque 4 nunca se llegará a ejecutar !

La cláusula �nally En ocasiones, nos interesa ejecutar un fragmento decódigo independientemente de si se produce o no una excepción (por ejemplo,cerrar un archivo que estemos manipulando).Ejemplo:

// Bloque1try {// Bloque 2

} catch (ArithmeticException ae) {// Bloque 3

} �nally {// Bloque 4

}// Bloque 5

Flujo de la ejecución en el programa:

Sin excepciones: 1 -> 2 -> 4 -> 5

Excepción de tipo aritmético: 1 -> 2(excepción) -> 3 -> 4 -> 5

Excepción de otro tipo diferente: 1 -> 2(excepción) -> 4

[email protected] 236 Antonio Carrillo Ledesma, Et alii

Page 239: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Si el cuerpo del bloque try llega a comenzar su ejecución, el bloque �nallysiempre se ejecutará:

� Detrás del bloque try si no se producen excepciones

� Después de un bloque catch si este captura la excepción.

� Justo después de que se produzca la excepción si ninguna cláusulacatch captura la excepción y antes de que la excepción se propaguehacia arriba.

Lanzamiento de Excepciones La sentencia throw se utiliza en Java paralanzar objetos de tipo Throwable

throw new Exception("Mensaje de error...");

Cuando se lanza una excepción:

� Se sale inmediatamente del bloque de código actual.

� Si el bloque tiene asociada una cláusula catch adecuada para el tipo dela excepción generada, se ejecuta el cuerpo de la cláusula catch.

� Si no, se sale inmediatamente del bloque (o método) dentro del cualestá el bloque en el que se produjo la excepción y se busca una cláusulacatch apropiada.

� El proceso continúa hasta llegar al método main de la aplicación. Siahí tampoco existe una cláusula catch adecuada, la máquina virtualJava �naliza su ejecución con un mensaje de error.

Propagación de Excepciones (throws) Si en el cuerpo de un métodose lanza una excepción � de un tipo derivado de la clase Exception� , en lacabecera del método hay que añadir la cláusula throws que incluye una listade los tipos de excepciones que se pueden producir al invocar el método.Ejemplo:

public String leerFichero (String nombreFichero)throws IOException...

[email protected] 237 Antonio Carrillo Ledesma, Et alii

Page 240: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Las excepciones de tipo RuntimeException (que son muy comunes) noes necesario declararlas en la cláusula throws. Al implementar un método,hay que decidir si las excepciones se propagarán hacia arriba (throws) o secapturarán en el propio método (catch)1. Ejemplo de un método que propaga una excepción:

public void f() throws IOException {// Fragmento de codigo que puede// lanzar una excepción de tipo IOException

}

NOTA: Un método puede lanzar una excepción al crear explícitamenteun objeto Throwable y lanzarlo con throw, o bien porque llame a un métodoque genere la excepción y no la capture.2. Ejemplo de un método equivalente que no propaga la excepción:

public void f() {// Fragmento de código libre de excepcionestry {// Fragmento de codigo que puede// lanzar una excepcion de tipo IOException// (p.ej. Acceso a un archivo)

} catch (IOException error) {// Tratamiento de la excepcion

} �nally {// Liberar recursos (siempre se hace)

}}

Creación de nuevos tipos de excepciones Un nuevo tipo de excep-ción puede crearse fácilmente, basta con de�nir una subclase de un tipo deexcepción ya existente.

public DivideByZeroExceptionextends ArithmeticException {public DivideByZeroException(String Message) {super(message);

}}

[email protected] 238 Antonio Carrillo Ledesma, Et alii

Page 241: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Una excepción de este tipo puede entonces lanzarse como cualquier otraexcepción:

public double dividir(int num, int den)throws DivideByZeroException {if (den==0) throw new DivideByZeroException("Error!");return ((double) num/(double)den);

}

NOTA: Las aplicaciones suelen de�nir sus propias subclases de la claseException para representar situaciones excepcionales especí�cas de cada apli-cación.

5.5 Ejemplo de Altas, Bajas y Cambios

En programación, crear, leer, actualizar y borrar (con el acrónimo CRUD74)son las cuatro funciones básicas de la persistencia de Bases de Datos. Tér-minos alternativos son usados a veces cuando se de�nen las cuatro funcionesbásicas de CRUD, como "recuperar" en vez de "leer", "modi�car" en vezde "actualizar" o "destruir" en vez de "borrar". CRUD se usa también aveces para describir convenciones de interfaz de usuario que facilita la vista,búsqueda y modi�cación de la información; a menudo se usa en programaciónde formularios (Forms) e informes (Reports). El acrónimo puede extenderse aCRUDL75 para cubrir el listado de gran cantidad de datos que conllevan unacomplejidad tal como paginación cuando los registros de datos son demasiadograndes para alojarse fácilmente en memoria.En esta sección, desarrollaremos un sistema a modo de ejemplo de Al-

tas, Bajas y Cambios (ABC) además de Leer y Grabar los datos capturados

74En informática, CRUD es el acrónimo de "Crear, Leer, Actualizar y Borrar" (deloriginal en inglés: Create, Read, Update and Delete), que se usa para referirse a lasfunciones básicas en bases de datos o la capa de persistencia en un Software.En algunos lugares, se utilizan las siglas ABM para lo mismo ("Alta, Baja y Modi-

�cación"), obviando la operación de "obtener"; el acrónimo ABC para "Altas, Bajas yCambios"; ABML siendo la última letra (L) de "listar, listado o lectura"; ABMC siendola �C�de "Consulta"; o bien CLAB que sería la traducción literal del acrónimo ("Crear,Leer, Actualizar y Borrar") también se llega a usar el acrónimo ABCC ("Altas, Bajas,Cambios y Consultas").75El término fue popularizado por primera vez por James Martín en su libro del año

1980 Managing the Data-base Enviroment.

[email protected] 239 Antonio Carrillo Ledesma, Et alii

Page 242: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� para manipular la lista de los registros usaremos un ArrayList76� usandoprogramación genérica para desarrollar un par de ejemplos � Directorio Tele-fónico y Catálogo de CDs� que pueden ser usados por separado o comoademás se mostrará, en un arreglo de objetos que permite su manipulaciónde forma simultáneo, mediante un único sistema de cómputo que aprovechelas facilidades de la programación genérica mostrada en la siguiente jerarquíade clases.Para ello, primero desarrollamos una clase abstracta pura que de�na los

comportamientos que harán la manipulación de cada componente (registro)de nuestro sistema de Altas, Bajas y Cambios, mediante el siguiente código:

import java.io.Serializable;77

/// Clase Base para manipular registrospublic abstract class Registro implements Serializable {private static �nal long serialVersionUID = 1L;abstract int visualizaRegistro();abstract int modi�carRegistro();abstract int adicionaRegistro();

};

Para luego de�nir los comportamientos mediante la herencia, para el di-rectorio telefónico:

import java.util.Scanner;78

/// Clase para manipular registros telefonicospublic class RegTelefonico extends Registro {private String Nombre;private String Direccion;

76Para manipular estructuras de datos que nos permita añadir, eliminar y modi�carelementos � pueden ser objetos o elementos atómicos� de forma transparente para elprogramador en Java se desarrollo entre otras opciones al ArrayList. Esta clase permitealmacenar datos en memoria de forma similar a los Arrays, con la ventaja de que el númerode elementos que almacena, lo hace de forma dinámica.77Para usar ArrayList y que nos permite leer y grabar al conjunto de registros de forma

uni�cada, necesitamos usar java.io.Serializable. E implementar la clase Registro a partirde la clase Serializable, además de de�nir:private static �nal long serialVersionUID = 1L;78En nuestro ejemplo, usaremos la clase Scanner, para solicitar en consola la captura de

los datos en modo texto.

[email protected] 240 Antonio Carrillo Ledesma, Et alii

Page 243: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

private String Telefonos;/// Visualiza el contenido del registroint visualizaRegistro() {System.out.println("Nombre: " + Nombre);System.out.println("Direccion: " + Direccion);System.out.println("Telefonos: " + Telefonos);return 0; //Ok

}/// Adiciona un registroint adicionaRegistro() {Scanner teclado = new Scanner(System.in);System.out.print("Nombre: ");Nombre = teclado.nextLine();System.out.print("Direccion: ");Direccion = teclado.nextLine();System.out.print("Telefonos: ");Telefonos = teclado.nextLine();return 0; // Ok

}/// Modi�ca el contenido del registroint modi�carRegistro() {Scanner teclado = new Scanner(System.in);// Visualiza el nombre y permite su modi�cacionSystem.out.println("Nombre: " + Nombre);System.out.print("Nuevo Nombre: ");Nombre = teclado.nextLine();System.out.println("Direccion: " + Direccion);System.out.print("Nueva Direccion: ");Direccion = teclado.nextLine();System.out.println("Telefonos: " + Telefonos);System.out.print("Nuevos Telefonos: ");Telefonos = teclado.nextLine();return 0; // Ok

}};

O del catálogo de CDs, mediante:

[email protected] 241 Antonio Carrillo Ledesma, Et alii

Page 244: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

import java.util.Scanner;79

/// Clase para manipular registros de Cdspublic class RegCDs extends Registro {private String Titulo;private String Artista;private int NumCanciones;private String Canciones;/// Visualiza el contenido del registropublic int visualizaRegistro() {System.out.println("Titulo: " + Titulo);System.out.println("Artista: " + Artista);System.out.println("Numero de caciones: "

+ NumCanciones);System.out.println("Canciones: " + Canciones);return 0; //Ok

}/// Adiciona un registropublic int adicionaRegistro() {Scanner teclado = new Scanner(System.in);System.out.print("Titulo: ");Titulo = teclado.nextLine();System.out.print("Artista: ");Artista = teclado.nextLine();System.out.print("Numero de caciones: ");NumCanciones = teclado.nextInt();System.out.print("Canciones: ");Canciones = teclado.nextLine();Canciones = teclado.nextLine();return 0; // Ok

}/// Modi�ca el contenido del registroint modi�carRegistro() {Scanner teclado = new Scanner(System.in);// Visualiza el nombre y permite su modi�cacionSystem.out.println("Titulo: " + Titulo);

79En nuestro ejemplo, usaremos la clase Scanner, para solicitar en consola la captura delos datos en modo texto.

[email protected] 242 Antonio Carrillo Ledesma, Et alii

Page 245: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

System.out.print("Nuevo Titulo: ");Titulo = teclado.nextLine();System.out.println("Artista: " + Artista);System.out.print("Nuevo Artista: ");Artista = teclado.nextLine();System.out.println("Numero de caciones: "

+ NumCanciones);System.out.print("Nuevo Numero de caciones: ");NumCanciones = teclado.nextInt();System.out.println("Canciones: " + Canciones);System.out.print("Nuevas Canciones: ");Canciones = teclado.nextLine();Canciones = teclado.nextLine();return 0; // Ok

}};

Los códigos anteriores de�nen los comportamientos genéricos que son laimplementación de los comportamientos abstractos:

abstract int visualizaRegistro();abstract int modi�carRegistro();abstract int adicionaRegistro();

Ahora implementamos la clase abstracta que soportará los comportamien-tos que manipulen a las clases anteriores mediante un ArrayList y que per-mitan la implementación de las Altas, Bajas y Cambios, mediante:

import java.io.*;80

import java.util.*;81

/// Clase base para manipular Altas-Bajas-Cambios.public abstract class EstructuraABC {/// Listapublic ArrayList<Registro> lista;public EstructuraABC() {lista = new ArrayList<Registro>();

80Para permitir leer y grabar archivos.81Para de�nir ArrayList.

[email protected] 243 Antonio Carrillo Ledesma, Et alii

Page 246: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

}/// Borra todo el contenido de la listaprivate void borrarTodo() {lista.clear();

}/// Adiciona un registro al �nal de la listaabstract int adicionar();/// Visualiza el contenido del registro solicitadopublic int visualiza(int pos) {if (pos >= 0 && pos < lista.size()) {lista.get(pos).visualizaRegistro();return 0;

}return 1;

}/// Visualiza todo el contenido de la listapublic int visualizaTodos() {Iterator<Registro> iter = lista.iterator();while (iter.hasNext()) {iter.next().visualizaRegistro();

}return 0;

}/// Visualiza el registro de la lista solicitadoint borrar(int pos) {if (pos >= 0 && pos < lista.size()) {lista.remove(pos);return 0;

}return 1;

}/// Modi�ca el registro de la lista solicitadoint modi�car(int pos) {if (pos >= 0 && pos < lista.size()) {lista.get(pos).modi�carRegistro();return 0;

}return 1;

[email protected] 244 Antonio Carrillo Ledesma, Et alii

Page 247: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

}/// Leer una lista de disco@SuppressWarnings("unchecked")int leer(String arch) {try {FileInputStream �leIn = new FileInputStream(arch);ObjectInputStream in = newObjectInputStream(�leIn);Object obj = in.readObject();lista = (ArrayList<Registro>) obj;in.close();�leIn.close();visualizaTodos();

} catch(Exception e){e.printStackTrace();}return 0;

}/// Grabar una lista en discoint grabar(String arch) {try {FileOutputStream �leOut = new FileOutputStream(arch);ObjectOutputStream out = newObjectOutputStream(�leOut);out.writeObject(lista);out.close();�leOut.close();

} catch(Exception e){}return 0;

}/// Regresa el numero de registros en la listaint regresaNRegs() {return lista.size();

}};

Una vez de�nidos los códigos anteriores, podemos ya implementar la claseque permita de�nir mediante herencia la manipulación de los registros tele-fónicos haciendo uso de la herencia del código de Altas, Bajas y Cambios,mediante:

/// Clase para manipular directorio telefonicos

[email protected] 245 Antonio Carrillo Ledesma, Et alii

Page 248: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

class DirecTelefonico extends EstructuraABC {// Adiciona registro al �nal de la listapublic int adicionar() {RegTelefonico reg = new RegTelefonico();reg.adicionaRegistro();lista.add(reg);return 0; // Ok

}};

Y para el Catálogo de CDs, mediante:

/// Clase para manipular catalogos de CDspublic class CatalogoCDs extends EstructuraABC {// Adiciona registro al �nal de la listaint adicionar() {RegCDs reg = new RegCDs();reg.adicionaRegistro();lista.add(reg);return 0;

}};

Ahora de�niremos un menú para que el usuario manipule nuestros sis-temas de Altas, Bajas y Cambios, por ejemplo para el Directorio Telefónico,mediante:

import java.util.Scanner;82

public class Test {public static void limpiar() {for (int i = 0; i < 20; i++) System.out.println("");

}public static void visualizaMenu() {System.out.println("Menu");System.out.println("");System.out.println("1) Agregar");

82En nuestro ejemplo, usaremos la clase Scanner, para solicitar en consola la captura delos datos en modo texto.

[email protected] 246 Antonio Carrillo Ledesma, Et alii

Page 249: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

System.out.println("2) Modi�car");System.out.println("3) Borrar");System.out.println("4) Visualizar todos");System.out.println("8) Leer");System.out.println("9) Grabar");System.out.println("0) Salir");

}// Funcion Principal ....public static void main(String[] args) {Scanner teclado = new Scanner(System.in);// Manipulacion del directorio telefonicoDirecTelefonico man = new DirecTelefonico();limpiar();int op = 1, reg;do {System.out.println("Numero de registros: "

+ man.regresaNRegs());visualizaManu();System.out.println("");System.out.println("Opcion: ");op = teclado.nextInt();switch(op) {case 1:man.adicionar();break;

case 2:System.out.println("Registro: ");reg = teclado.nextInt();man.modi�car(reg);break;

case 3:System.out.println("Registro: ");reg = teclado.nextInt();man.borrar(reg);break;

case 4:man.visualizaTodos();break;

[email protected] 247 Antonio Carrillo Ledesma, Et alii

Page 250: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

case 8:man.leer("DirTelefonico.dat");break;

case 9:man.grabar("DirTelefonico.dat");break;

}} while(op != 0);

}}

Y para el Catálogo de CDs, mediante:

import java.util.Scanner;83

public class Test {public static void limpiar() {for (int i = 0; i < 20; i++) System.out.println("");

}public static void visualizaMenu() {System.out.println("Menu");System.out.println("");System.out.println("1) Agregar");System.out.println("2) Modi�car");System.out.println("3) Borrar");System.out.println("4) Visualizar todos");System.out.println("8) Leer");System.out.println("9) Grabar");System.out.println("0) Salir");

}// Funcion Principal ....public static void main(String[] args) {Scanner teclado = new Scanner(System.in);// Manipulacion del directorio telefonicoCatalogoCDs man = new CatalogoCDs();limpiar();int op = 1, reg;

83En nuestro ejemplo, usaremos la clase Scanner, para solicitar en consola la captura delos datos en modo texto.

[email protected] 248 Antonio Carrillo Ledesma, Et alii

Page 251: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

do {System.out.println("Numero de registros: "

+ man.regresaNRegs());visualizaManu();System.out.println("");System.out.println("Opcion: ");op = teclado.nextInt();switch(op) {case 1:man.adicionar();break;

case 2:System.out.println("Registro: ");reg = teclado.nextInt();man.modi�car(reg);break;

case 3:System.out.println("Registro: ");reg = teclado.nextInt();man.borrar(reg);break;

case 4:man.visualizaTodos();break;

case 8:man.leer("DirTelefonico.dat");break;

case 9:man.grabar("DirTelefonico.dat");break;

}} while(op != 0);

}}

Aún mejor, podemos usar el Directorio telefónico y el Catálogo de CDssimultáneamente, permitiendo al usuario cambiarse entre uno u otro segúnsea necesario, mediante:

[email protected] 249 Antonio Carrillo Ledesma, Et alii

Page 252: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

import java.util.Scanner;84

public class Test {public static String[] Archivo = {"DirTelefonico.dat", "Cat-

alogoCDs.dat"};public static void limpiar() {for (int i = 0; i < 20; i++) System.out.println("");

}public static void visualizaMenu() {System.out.println("Menu");System.out.println("");System.out.println("1) Agregar");System.out.println("2) Modi�car");System.out.println("3) Borrar");System.out.println("4) Visualizar todos");System.out.println("8) Leer");System.out.println("9) Grabar");System.out.println("nn10) Cambiar entre DirecTelefon-

ico y CatalogoCDs");System.out.println("0) Salir");

}// Funcion Principal ....public static void main(String[] args) {Scanner teclado = new Scanner(System.in);EstructuraABC []man= new EstructuraABC[2];man[0] = new DirecTelefonico();man[1] = new CatalogoCDs();limpiar();int op = 1, act = 0, reg;do {System.out.println("Numero de registros: "

+ man[act].regresaNRegs() + " en " + Archivo[act]);System.out.println("");visualizaMenu();System.out.println("Opcion: ");op = teclado.nextInt();

84En nuestro ejemplo, usaremos la clase Scanner, para solicitar en consola la captura delos datos en modo texto.

[email protected] 250 Antonio Carrillo Ledesma, Et alii

Page 253: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

switch(op) {case 1:man[act].adicionar();break;

case 2:System.out.println("Registro: ");reg = teclado.nextInt();man[act].modi�car(reg);break;

case 3:System.out.println("Registro: ");reg = teclado.nextInt();man[act].borrar(reg);break;

case 4:man[act].visualizaTodos();break;

case 8:man[act].leer(Archivo[act]);break;

case 9:man[act].grabar(Archivo[act]);break;

case 10:if (act == 0) act = 1;else act = 0;break;

default:System.out.println("Opcion no reconocidad");

}} while(op != 0);

}}

De esta forma, tenemos una clase genérica de Altas, Bajas y Cambios quenos permite manipular uno o múltiples ejemplos � Directorio Telefónico y elCatalogo de CDs� para hacer Altas, Bajas y Cambios en un solo sistema

[email protected] 251 Antonio Carrillo Ledesma, Et alii

Page 254: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

computacional que es �exible, extendible y de fácil mantenimiento, ademásde permitir el manejo simultáneo de múltiples sistemas de ABC.

[email protected] 252 Antonio Carrillo Ledesma, Et alii

Page 255: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

6 Ejemplitos

Hay muchas aplicaciones a las herramientas computacionales, pero nos in-teresan aquellas que permitan resolver problemas concomitantes en Cienciae Ingeniería. Muchas de estas aplicaciones caen en lo que comúnmente sellama cómputo cientí�co. La computación cientí�ca es el campo de estudiorelacionado con la construcción de modelos matemáticos, técnicas numéricaspara resolver problemas cientí�cos y de ingeniería; y su respectiva imple-mentación computacional.Este campo es distinto a las ciencias de la computación y el procesamiento

de información, también es diferente a la teoría y experimentación, que sonlas formas tradicionales de la ciencia y la ingeniería. El enfoque de la com-putación cientí�ca es para ganar entendimiento, principalmente a través delanálisis de modelos matemáticos implementados en computadoras.Los programas de aplicación de la computación cientí�ca a menudo mo-

delan cambios en las condiciones del mundo real, tales como el tiempo at-mosférico, el �ujo de aire alrededor de un avión, el movimiento de las es-trellas en una galaxia, el comportamiento de un dispositivo explosivo, entreotros. Estos programas deberían crear una �malla lógica�en la memoria dela computadora, donde cada ítem corresponda a un área en el espacio y con-tenga información acerca del espacio relevante para el modelo. Por ejemplo,en modelos para el tiempo atmosférico, cada ítem podría ser un kilómetrocuadrado, con la altitud del suelo, dirección actual del viento, humedad am-biental, temperatura, presión, etc. El programa debería calcular el probablesiguiente estado basado en el estado actual, simulado en medidas de tiempo,resolviendo ecuaciones que describen cómo operan los sistemas; y repetir elproceso para calcular el siguiente estado.El término cientí�co computacional es usado para describir a alguien

experto en computación cientí�ca. Esta persona es generalmente un cien-tí�co, un ingeniero o un matemático aplicado que aplica computación dealto rendimiento en diferentes formas para avanzar en el estado del arte desu respectiva disciplina de la física, química o ingeniería. Cientí�cos com-putacionales han impactado cada vez más en otras áreas como la economía,biología y medicina. La computación cientí�ca es hoy en día consideradacomo el tercer modo de ciencia, complementando y añadiendo a la experi-mentación/observación y teoría.La computación cientí�ca es más estudiada por medio de la matemática

aplicada o programas de las ciencias de la computación, o dentro de un

[email protected] 253 Antonio Carrillo Ledesma, Et alii

Page 256: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

estandar matemático, ciencias, o programas de ingeniería. En algunas ins-tituciones una especialización en computación cientí�ca puede ser obtenidacomo un "Minor" dentro de otro programa (el cual puede estar en muchosniveles). Sin embargo, hay cada vez más muchas maestrías y programas dedoctorado en computación cientí�ca. Algunas universidades también ofrecendoctorados en ciencias computacionales, ingeniería computacional, cienciascomputacionales e ingeniería o computación cientí�ca, también hay progra-mas como el de física computacional, química computacional, entre otros.Cientí�cos e Ingenieros desarrollan Software y aplicaciones informáticas

para modelar sistemas que estan siendo estudiados, para correr estos pro-gramas con diferentes conjuntos de entradas. Por lo general, estos modelosrequieren una gran cantidad de cálculos (usualmente de punto �otante) y engeneral para problemas de interés, a menudo son ejecutados en supercom-putadoras o plataformas de computación distribuida.

Simulaciones Numéricas Las simulaciones numéricas tienen diferentesobjetivos dependiendo de la naturaleza de la tarea a ser simulada:

� Reconstruir y comprender los eventos conocidos (e.g. terremotos, mare-motos y otros desastres naturales)

� Predecir el futuro o situaciones no observadas (e.g. tiempo atmosférico,comportamiento de partículas subatómicas)

Por Medio de Modelos Apropiados y Análisis de Datos se Busca

� Sintonizar apropiadamente los modelos o resolver ecuaciones para re-�ejar ciertas observaciones, sujetas a las restricciones del modelo (e.g.exploración geofísica de petróleo, lingüística computacional).

� Usar teoría de grafos para modelar redes, especialmente las conexionesindividuales, organizaciones y sitios Web.

Optimización Se busca optimizar escenarios conocidos (e.g. técnicas yprocesos de fabricación, interfaces de ingeniería).

Los algoritmos y métodos matemáticos usados en computación cientí�cason variados. Los métodos comúnmente aplicados son:

[email protected] 254 Antonio Carrillo Ledesma, Et alii

Page 257: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Análisis numérico

� Aplicación de series de Taylor como series convergentes y asintóticas

� Cálculo de derivadas mediante diferenciación automática

� Cálculo de derivadas mediante diferencias �nitas, elemento �nito, volumen�nito

� Métodos aproximados de diferencias de alto orden mediante series de Taylory la extrapolación de Richardson

� Métodos de integración sobre una malla uniforme: regla del rectángulo, regladel trapecio, regla del punto medio, regla de Simpson

� Método para resolver ecuaciones diferenciales ordinarias

� Método de Montecarlo

� Álgebra lineal numérica

� Cálculo de los factores LU vía eliminación Gaussiana

� Factorización de Cholesky

� Transformada de Fourier discreta y sus aplicaciones

� Método de Newton

� Métodos de time-stepping para sistemas dinámicos

Los lenguajes de programación comúnmente usados para los aspecto másmatemáticos de las aplicaciones de la computación cientí�ca incluyen a For-tran, MATLAB, Scilab, GNUOctave, COMSOLMultiphysics y PDL. Los as-pectos más computacionales son tratados a menudo con C y Fortran, aunqueexisten otros desarrollos importantes en lenguajes ahora poco conocidos comoPL/1. La implementación computacional pude ser implementada usandouno o más tipos de programación como son: programación secuencial, es-tructurada, funcional y orientada a objetos; tanto en ejecución secuencial,paralela o distribuida.

[email protected] 255 Antonio Carrillo Ledesma, Et alii

Page 258: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

6.1 Sistemas Dinámicos Discretos

Un sistema dinámico es un sistema cuyo estado evoluciona con el tiempo. Lossistemas físicos en situación no estacionaria son ejemplos de sistemas dinámi-cos, pero también existen modelos económicos, matemáticos y de otros tiposque son sistemas abstractos que son, además, sistemas dinámicos. El com-portamiento en dicho estado se puede caracterizar determinando los límitesdel sistema, los elementos y sus relaciones; de esta forma se pueden elaborarmodelos que buscan representar la estructura del mismo sistema.Al de�nir los límites del sistema se hace, en primer lugar, una selección

de aquellos componentes que contribuyan a generar los modos de compor-tamiento, y luego se determina el espacio donde se llevará a cabo el estudio,omitiendo toda clase de aspectos irrelevantes.

Tipos de Sistemas Dinámicos Los sistemas dinámicos se dividen ensistemas discretos en el tiempo y continuos en el tiempo. Un sistema dinámicose dice discreto si el tiempo se mide en pequeños lapsos; estos son modeladoscomo relaciones recursivas, tal como la ecuación Logística:

xn+1 = kxn (1� xn)donde n denota los pasos discretos del tiempo y x es la variable que cambiacon éste.Si el tiempo es medido en forma continua, el sistema dinámico continuo

resultante es expresado como una ecuación diferencial ordinaria; por ejemplo:

dx

dt= ax (1� x)

donde x es la variable que cambia con el tiempo t. La variable cambiante xes normalmente un número real, aunque también puede ser un vector en Rk.

La ecuación logística discreta Continuando con el ejemplo del crecimien-to de la población dada por la ecuación Logística, en este caso el crecimientode la población se expresa como la fracción de la población máxima admisibleexistente, en el paso del período n al período n + 1, dado por la diferenciaxn+1 - xn, resultando esta proporcional a la población existente al principiodel período temporal y a la diferencia entre el valor de saturación y dichapoblación.

[email protected] 256 Antonio Carrillo Ledesma, Et alii

Page 259: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

En la ecuación xn+1 = kxn (1� xn) podemos observar que, dada unacondición inicial x0, queda determinada una sucesión de valores x0; x1; x2:::; xn. Pero en el caso discreto � a diferencia del modelo continuo en el que sepuede hallar la población como función explícita del tiempo t� , es posibleobtener x como función explícita de n, esto signi�ca que no se puede resolveranalíticamente la ecuación en diferencias, de modo que si queremos obteneral valor de xn tendremos que calcularlo uno a uno.A diferencia de la ecuación logística continua, en la ecuación logística

discreta los procesos estudiados se observan en instantes puntuales distintosy los datos experimentales obtenidos de esta manera forman entonces unconjunto discreto y ordenado de valores. Para el modelo que tomamos paraeste trabajo son la cantidad de población tras el primer ciclo, el siguientenúmero tras el segundo ciclo, luego el tercer número, y así sucesivamente.A continuación mostraremos el programa en Octave para generar el dia-

grama de bifurcación de la ecuación logística discreta, este diagrama, cono-cido también como diagrama de Feigenbaum, al ejecutarlo podremos observarcómo el comportamiento del sistema pasa de ser ordenado a ser caótico:

hold on

N = 500

X = zeros(N,1);

Y = zeros(N,1);

for p=0:0.005:4

x=0.1;

for i=1:300

y = p*x*(1.0-x);

x = y;

end

for i=1:N

y = p*x*(1.0-x);

x = y;

X(i) = p;

Y(i) = x;

[email protected] 257 Antonio Carrillo Ledesma, Et alii

Page 260: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

end

plot(X,Y,�.�)

end

hold o¤

Algo más de Sistemas Dinámicos Discretos En la red existen múlti-ples sitios especializados y una amplia bibliografía para conocer sobre Sis-temas Dinámicos Discretos, nosotros hemos seleccionado diversos textos queponemos a su disposición en:

http://132.248.182.159/acl/SD/SDD/

6.2 Fractales

Un fractal es un objeto geométrico cuya estructura básica, fragmentada oaparentemente irregular, se repite a diferentes escalas. El término fue pro-puesto por el matemático Benoît Mandelbrot en 1975 y deriva del latín frac-tus, que signi�ca quebrado o fracturado. Muchas estructuras naturales sonde tipo fractal. La propiedad matemática clave de un objeto genuinamentefractal es que su dimensión métrica fractal es un número racional no entero.

Los ejemplos clásicos los primeros ejemplos de fractales surgen a �-nales del siglo XIX: en 1872 apareció la función de Weierstrass, cuyo grafohoy en día se considera fractal, como ejemplo de función continua pero nodiferenciable en ningún punto.

Curva de Koch en 1904, Helge von Koch de�nió una curva con propiedadessimilares a la de Weierstrass: el copo de nieve de Koch, también llamado es-trella de Koch, es una curva cerrada continua pero no diferenciable en ningúnpunto descrita por el matemático sueco Helge von Koch en 1904 en un artículotitulado "Acerca de una curva continua que no posee tangentes y obtenidapor los métodos de la geometría elemental".En lenguaje actual, diríamos que es una curva fractal. Su construcción

más simple se realiza mediante un proceso iterativo que se inicia partiendo entres un segmento de recta e insertando dos más en el tercero medio a manerade un triángulo equilátero, el proceso se repite in�nidad de veces. La curvade Koch es un caso particular de curva de De Rham.

[email protected] 258 Antonio Carrillo Ledesma, Et alii

Page 261: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Veamos el proceso que lleva a sustituir cada lado por la llamada curva deKoch: Se toma un segmento, se divide en tres partes iguales, se remplaza laparte central por dos partes de igual longitud haciendo un ángulo de 60 gra-dos. Luego, con los cuatro segmentos, se procede de la misma manera, lo queda lugar a 16 segmentos más pequeños en la segunda iteración. Y así suce-sivamente. La �gura representa las seis primeras etapas de la construcción.La última curva es una buena aproximación de la curva �nal.

Longitud Si se considera de nuevo la primera �gura, notamos que parapasar de una línea a la siguiente se remplaza tres segmentos por cuatro deigual longitud, o sea que la longitud total es multiplicada por 4=3. Despuésde n pasos iterativos en la construcción recursiva la longitud de la curvaes 3�(4=3)n, el límite de la sucesión geométrica anterior de razón 4=3 esobviamente in�nito, lo que signi�ca que la �gura �nal tiene una longitudin�nita (lo que Mandelbrot denomina in�nito interno). Esto esta relacionadocon el hecho de que la curva frontera del copo de Koch no es recti�cable ytiene una dimensión fractal d > 1.

Propiedades fractales Autosimilitud exacta del Copo de nieve deKoch a todas las escalas.La característica anterior, típica de muchas curvas fractales, añadida al

hecho que la curva da la impresión de tener cierto espesor a causa de susconstantes cambios de dirección, sugiere que esta �gura, en algún sentido,no es unidimensional. Para ello usaremos una generalización del concepto dedimensión: la dimensión fractal de Hausdor¤.La dimensión de Hausdor¤ tiene que estar entre 1, la de una recta, y 2, la

del plano. Para hallarla veamos la última curva: Si agrandamos (medianteuna homotecia) tres veces la sección A�B� obtenemos exactamente la secciónAB. En la curva �nal, obtendríamos la sección A�C, es decir cuatro veces lasección inicial.Se sabe que una homotecia de razón tres multiplica las longitudes por 3,

las super�cies por 32 = 9, los volúmenes por 33 = 27, y más generalmente, el"volumen" de objeto de dimensión d por 3d. Entonces tenemos 3d = 4 parael copo de Koch, lo que da:

d =ln 4

ln 3� 1:26186:::

[email protected] 259 Antonio Carrillo Ledesma, Et alii

Page 262: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

La dimensión de homotecia anterior coincide en este caso con la dimensiónfractal de Hausdor¤. La con�guración opuesta-complementaria de un copode nieve de Koch o copo de nieve fractal suele ser denominada anticopo denieve.A continuación mostramos el código en Python para generar la curva del

Copo de nieve de Koch:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

from math import sin, cos, pi

import matplotlib.pyplot as plt

import matplotlib

def kochSnowFlake(l, n):

x_vertex1 = 0

y_vertex1 = 0

x_vertex2 = l * cos ( 2 * pi/3)

y_vertex2 = l * sin(2 * pi/3)

x_vertex3 = l * cos (pi/3)

y_vertex3 = l * sin(pi/3)

kochCurve(x_vertex1, y_vertex1, x_vertex2, y_vertex2, n)

kochCurve(x_vertex2, y_vertex2, x_vertex3, y_vertex3, n)

kochCurve(x_vertex3, y_vertex3, x_vertex1, y_vertex1, n)

return

def kochCurve(xi, yi, xf, yf, n):

if n==0:

plt.plot([xi,xf],[yi,yf])

elif n>0:

x1 = xi + (xf - xi) / 3.0

[email protected] 260 Antonio Carrillo Ledesma, Et alii

Page 263: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

y1 = yi + (yf - yi) / 3.0

x3 = xf - (xf - xi) / 3.0

y3 = yf - (yf - yi) / 3.0

x2 = (x1 + x3) * cos (pi/3) - ( y3 - y1) * sin (pi/3)

y2 = (y1 + y3) * cos (pi/3) + ( x3 - x1) * sin (pi/3)

kochCurve(xi,yi,x1,y1,n-1)

kochCurve(x1,y1,x2,y2,n-1)

kochCurve(x2,y2,x3,y3,n-1)

kochCurve(x3,y3,xf,yf,n-1)

return

plt.�gure("Koch snow�ack")

kochSnowFlake(200,4) # range 1 -6

plt.show()

El conjunto de Mandelbrot La familia de conjuntos de Julia surgencomo resultado de la aplicación reiterada de funciones Holomorfas � estasse de�nen sobre un subconjunto abierto del plano complejo, además soncomplejo-diferenciables en cada punto�

z ! f(z)! f(f(z))! :::

asociadas a la reiteración de funciones de la forma

fc(z) = z2 + c

presenta conjuntos de una variedad sorprendente.Dicha familia tendrá especial relevancia al quedar parametrizada en un

mapa de fractales, popularizado en los años 1980, llamado conjunto de Man-delbrot. Este conjunto M representa un mapa en que cada pixel, correspon-diente a un valor del parámetro c. Todos los puntos del plano complejoC = (Cx; iCy) son iterados por adición a la función correspondiente. El frac-tal derivado de la función fc(z) = z2+c se denomina conjunto de Mandelbrot.

[email protected] 261 Antonio Carrillo Ledesma, Et alii

Page 264: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Figura 2: Ejemplo de un fractal en el que se muestra el Conjunto de Man-delbrot y algunos conjuntos de Julia asociados, imagen tomada del libro TheBeauty of Fractals de H.O. Peitgen y P.H. Richter.

[email protected] 262 Antonio Carrillo Ledesma, Et alii

Page 265: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

A continuación mostramos el código en Python para generar el conjuntode Mandelbrot:

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

import numpy as np

def mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter, hori-zon=2.0):

X = np.linspace(xmin, xmax, xn)

Y = np.linspace(ymin, ymax, yn)

C = X + Y[:, None]*1j

N = np.zeros(C.shape, dtype=int)

Z = np.zeros(C.shape, np.complex64)

for n in range(maxiter):

I = np.less(abs(Z), horizon)

N[I] = n

Z[I] = Z[I]**2 + C[I]

N[N == maxiter-1] = 0

return Z, N

if __name__ == �__main__�:

import time

import matplotlib

from matplotlib import colors

import matplotlib.pyplot as plt

xmin, xmax, xn = -2.25, +0.75, 3000/2

ymin, ymax, yn = -1.25, +1.25, 2500/2

maxiter = 200

horizon = 2.0 ** 40

log_horizon = np.log(np.log(horizon))/np.log(2)

[email protected] 263 Antonio Carrillo Ledesma, Et alii

Page 266: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Z, N = mandelbrot_set(xmin, xmax, ymin, ymax, xn, yn, maxiter,horizon)

with np.errstate(invalid=�ignore�):

M = np.nan_to_num(N + 1 -

np.log(np.log(abs(Z)))/np.log(2) +

log_horizon)

dpi = 72

width = 10

height = 10*yn/xn

�g = plt.�gure(�gsize=(width, height), dpi=dpi)

ax = �g.add_axes([0.0, 0.0, 1.0, 1.0], frameon=False, aspect=1)

light = colors.LightSource(azdeg=315, altdeg=10)

plt.imshow(M, extent=[xmin, xmax, ymin, ymax], interpolation="bicubic")

ax.set_xticks([])

ax.set_yticks([])

year = time.strftime("%Y")

major, minor, micro = matplotlib.__version__.split(�.�, 2)

text = ("The Mandelbrot fractal setnn""Rendered with matplotlib %s.%s, %s - http://matplotlib.org"

% (major, minor, year))

ax.text(xmin+.025, ymin+.025, text, color="white", fontsize=12,alpha=0.5)

plt.show()

Algo más de Fractales En la red existen múltiples sitios especializadosy una amplia bibliografía para conocer sobre fractales, nosotros hemos selec-cionado diversos textos que ponemos a su disposición en:

http://132.248.182.159/acl/fractal/

Además existe una diversidad de sitios con imágenes y videos de fractales,por ejemplo en:

[email protected] 264 Antonio Carrillo Ledesma, Et alii

Page 267: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

https://www.youtube.com/watch?v=pCpLWbHVNhk&app=desktop#menu

donde se muestra un acercamiento continuo dentro del fractal de Man-delbrot con una duración total de 1:10:59.

6.3 Derivadas

La derivación numérica es una técnica de análisis numérico para calcularuna aproximación a la derivada de una función en un punto utilizando losvalores y propiedades de la misma. Para ello usamos la expansión en Seriesde Taylor.

Expansión en Series de Taylor Sea f(x) una función de�nida en (a; b)que tiene hasta la k�ésima derivada, entonces la expansión de f(x) usandoseries de Taylor alrededor del punto xi contenido en el intervalo (a; b) será

f(x) = f(xi)+(x� xi)1!

df

dx

����xi

+(x� xi)2

2!

d2f

dx2

����xi

+:::+(x� xi)kk!

dkf

dxk

����"

(6.1)

donde " = xi + �(x� xi) y 0 < � < 1:

Aproximación de la Primera Derivada Existen distintas formas degenerar la aproximación a la primera derivada, nos interesa una que nos déla mejor precisión posible con el menor esfuerzo computacional.

Diferencias Progresivas Considerando la Ec.(6.1) con k = 2 y x =xi +�x; tenemos

f(xi +�x) = f(xi) + �xdf

dx

����xi

+�x2

2!

d2f

dx2

����"p

(6.2)

de esta ecuación obtenemos la siguiente expresión para la aproximación dela primera derivada

df

dx

����xi

=f(xi +�x)� f(xi)

�x� �x2!

d2f

dx2

����"p

(6.3)

[email protected] 265 Antonio Carrillo Ledesma, Et alii

Page 268: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

en este caso la aproximación de f 0(x) mediante diferencias progresivas es deprimer orden, es decir O(�x): Siendo Op(�x) el error local de truncamiento,de�nido como

Op(�x) = ��x

2!

d2f

dx2

����"p

: (6.4)

Es común escribir la expresión anterior como:

df

dx

����xi

=f(xi +�x)� f(xi)

�x�Op(�x) (6.5)

o

f 0(xi) =fi+1 � fi�x

(6.6)

para simpli�car la notación.

Diferencias Regresivas Considerando la Ec.(6.1) con k = 2 y x =xi ��x; tenemos

f(xi ��x) = f(xi)��xdf

dx

����xi

+�x2

2!

d2f

dx2

����"r

(6.7)

de esta ecuación obtenemos la siguiente expresión para la aproximación dela primera derivada

df

dx

����xi

=f(xi)� f(xi ��x)

�x� �x2!

d2f

dx2

����"r

(6.8)

en este caso la aproximación de f 0(x) mediante diferencias regresivas es deprimer orden, es decir O(�x): Siendo Or(�x) el error local de truncamiento,de�nido como

Or(�x) =�x

2!

d2f

dx2

����"r

: (6.9)

Es común escribir la expresión anterior como

df

dx

����xi

=f(xi)� f(xi ��x)

�x+Or(�x) (6.10)

o

f 0(xi) =fi � fi�1�x

(6.11)

para simpli�car la notación.

[email protected] 266 Antonio Carrillo Ledesma, Et alii

Page 269: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Diferencias Centradas Considerando la Ec.(6.1) con k = 3 y escribi-endo f(x) en x = xi +�x y x = xi ��x; tenemos

f(xi +�x) = f(xi) + �xdf

dx

����xi

+�x2

2!

d2f

dx2

����xi

+�x3

3!

d3f

dx3

����"p

(6.12)

y

f(xi ��x) = f(xi)��xdf

dx

����xi

+�x2

2!

d2f

dx2

����xi

� �x3

3!

d3f

dx3

����"r

(6.13)

restando la Ec.(6.12) de la Ec.(6.13), se tiene

f(xi +�x)� f(xi ��x) = 2�xdf

dx

����xi

+�x3

3!

"d3f

dx3

����"p

+d3f

dx3

����"r

#(6.14)

esta última expresión lleva a la siguiente aproximación de la primera derivadamediante diferencias centradas

df

dx

����xi

=f(xi +�x)� f(xi ��x)

2�x+Oc(�x

2) (6.15)

con un error local de truncamiento de segundo orden Oc(�x2); es decir

Oc(�x2) =

�x2

3!

"d3f

dx3

����"p

+d3f

dx3

����"r

#(6.16)

comparado el error local de truncamiento de la aproximación anteriorOc(�x2);con los obtenidos previamente para diferencias progresivas Op(�x) Ec.(6.5)y regresivas Or(�x) Ec.(6.10), se tiene que

lim�x!0

Oc(�x2) < lim

�x!0Op(�x): (6.17)

Es común encontrar expresada la derivada85

df

dx

����xi

=f(xi +�x)� f(xi ��x)

2�x(6.18)

como

f 0(xi) =fi+1 � fi�12�x

(6.19)

para simpli�car la notación.85En el caso de que la derivada sea usada en una malla no homogénea, es necesario

incluir en la derivada a que �x se re�ere, por ejemplo en cada punto i, tenemos la �xi�(por la izquierda) y la �xi+ (por la derecha), i.e.

dfdx

���xi= f(xi+�xi�)�f(xi��xi+)

(�xi�)+(�xi+):

[email protected] 267 Antonio Carrillo Ledesma, Et alii

Page 270: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Derivadas Usando Más Puntos Utilizando el valor de la función enmás puntos se construyen fórmulas más precisas para las derivadas86, algunosejemplos son

f 0 (xi) =�3fi + 4fi+1 � fi+2

2�x+O(�x2) (6.20)

f 0(xi) =3fi � 4fi�1 + fi�2

2�x+O(�x2)

f 0(xi) =2fi+1 + 3fi � 6fi�1 + fi�2

6�x+O(�x3)

f 0(xi) =fi�2 � 8fi�1 + 8fi+1 � fi+2

12�x+O(�x4)

f 0(xi) =�25fi + 48fi+1 � 36fi+2 + 16fi+3 � 3fi+4

12�x+O(�x4)

Derivadas de Ordenes Mayores De forma análoga se construyen aproxi-maciones en diferencias �nitas de orden mayor, aquí desarrollaremos la formade calcular la derivada de orden dos en diferencias centradas.

Derivada de Orden Dos Partiendo del desarrollo de Taylor

f(xi +�x) = f(xi) + �xf0(xi) +

�x2

2!f 00(xi) +

�x3

3!f 000(xi) +

�x4

4!f (4)(�p)

(6.21)y

f(xi ��x) = f(xi)��xf 0(xi) +�x2

2!f 00(xi)�

�x3

3!f 000(xi) +

�x4

4!f (4)(�r)

(6.22)eliminando las primeras derivadas, sumando las ecuaciones anteriores y des-pejando se encuentra que

f 00(xi) =f(xi ��x)� 2f(xi) + f(xi +�x)

�x2� �x

2

12f (4)(�c) (6.23)

86Al usar estas derivadas en el método de diferencias �nitas mostrado en la sección (6.8)las matrices generadas no serán tridiagonales.

[email protected] 268 Antonio Carrillo Ledesma, Et alii

Page 271: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

así, la aproximación a la segunda derivada usando diferencias centradas conun error de truncamiento Oc(�x2) es87

f 00(xi) =f(xi ��x)� 2f(xi) + f(xi +�x)

�x2(6.24)

Es común escribir la expresión anterior como

f 00(xi) =fi�1 � 2fi + fi+1

�x2

para simpli�car la notación.

Derivadas Usando Más Puntos Utilizando el valor de la función enmás puntos se construyen fórmulas más precisas para las derivadas, algunosejemplos son

f 00(xi) =fi+2 � 2fi+1 + fi

�x2+O(�x) (6.25)

f 00(xi) =�fi+3 + 4fi+2 � 5fi+1 + 2fi

�x2+O(�x2)

f 00(xi) =�fi+2 + 16fi+1 � 30fi + 16fi�1 � fi�2

12�x2+O(�x4)

Derivadas de Orden Tres y Cuatro De forma análoga se construyenderivadas de ordenes mayores utilizando el valor de la función en más puntos,algunos ejemplos para terceras derivadas son

f 000(xi) =fi+3 � 3fi+2 + 3fi+1 � fi

�x3+O(�x) (6.26)

f 000(xi) =fi+2 � 2fi+1 + 2fi�1 � fi�2

2�x3+O(�x2)

f 000(xi) =fi�3 � 8fi�2 + 13fi�1 � 13fi+1 + 8fi+2 � fi+3

8�x3+O(�x4)

87En el caso de que la derivada sea usada en una malla no homogénea, es necesarioincluir en la derivada a que �x se re�ere, por ejemplo en cada punto i, tenemos la �xi�(por la izquierda) y la �xi+ (por la derecha), i.e. f 00(xi) =

f(xi��xi�)�2f(xi)+f(xi+�xi+)(�xi�)(�xi+)

[email protected] 269 Antonio Carrillo Ledesma, Et alii

Page 272: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Algunos ejemplos para cuartas derivadas son

f 0000(xi) =fi+4 � 4fi+3 + 6fi+2 � 4fi+1 + fi

�x4+O(�x) (6.27)

f 0000(xi) =fi+2 � 4fi+1 + 6fi � 4fi�1 + fi�2

�x4+O(�x2)

f 0000(xi) =�fi+3 + 12fi+2 � 39fi+1 + 56fi � 39fi�1 + 12fi�2 � fi�3

6�x4+O(�x4)

Análisis de Convergencia En el siguiente ejemplo escrito en Octave semuestra la comparación de errores de truncamiento para los esquemas deaproximación de diferencias �nitas progresiva, regresiva y centrada. Ademásgrá�ca el error y el orden estimado de convergencia, para la función Seno ysu derivada exacta (Coseno) en el punto 1:

Ejemplo 1 % u(x) = sin(x) en x=1. Derivada exacta u�(1) = cos(1)clear; close allh=1.0;for k = 1:33,a(k,1) = h;a(k,2) = (sin(1 + h) - sin(1)) / h - cos(1);a(k,3) = (sin(1) - sin(1 - h)) / h - cos(1);a(k,4) = (sin(1 + h) - sin(1 - h)) / (2 * h) - cos(1);h = h / 2;end

format short ea % Visualiza el resultado

a = abs(a); % Toma el valor absolutoh1 = a(:,1); % Extrae la primer columna que es la de he1 = a(:,2); e2 = a(:,3); e3 = a(:,4);

loglog(h1, e1, h1, e2, h1, e3)axis(�square�)axis([1e-6 1e1 1e-6 1e1])gtext(�Esperada de adelante y atras =1�)gtext(�Esperada de central = 2�)

[email protected] 270 Antonio Carrillo Ledesma, Et alii

Page 273: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Generado la siguiente salida (la primera columna es h, las demás son loserrores para los esquemas de aproximación de diferencias �nitas progresiva,regresiva y centrada respectivamente):

1.0000e+00 -4.7248e-01 3.0117e-01 -8.5654e-025.0000e-01 -2.2825e-01 1.8379e-01 -2.2233e-022.5000e-01 -1.1025e-01 9.9027e-02 -5.6106e-031.2500e-01 -5.3929e-02 5.1118e-02 -1.4059e-036.2500e-02 -2.6639e-02 2.5936e-02 -3.5169e-043.1250e-02 -1.3235e-02 1.3059e-02 -8.7936e-051.5625e-02 -6.5958e-03 6.5519e-03 -2.1985e-057.8125e-03 -3.2925e-03 3.2815e-03 -5.4962e-063.9062e-03 -1.6449e-03 1.6421e-03 -1.3741e-061.9531e-03 -8.2209e-04 8.2141e-04 -3.4351e-079.7656e-04 -4.1096e-04 4.1079e-04 -8.5879e-084.8828e-04 -2.0546e-04 2.0542e-04 -2.1470e-082.4414e-04 -1.0272e-04 1.0271e-04 -5.3673e-091.2207e-04 -5.1361e-05 5.1358e-05 -1.3417e-096.1035e-05 -2.5680e-05 2.5679e-05 -3.3579e-103.0518e-05 -1.2840e-05 1.2840e-05 -8.3860e-111.5259e-05 -6.4199e-06 6.4199e-06 -2.2014e-117.6294e-06 -3.2100e-06 3.2100e-06 -1.8607e-133.8147e-06 -1.6050e-06 1.6050e-06 7.0899e-121.9073e-06 -8.0249e-07 8.0247e-07 -7.4620e-129.5367e-07 -4.0120e-07 4.0125e-07 2.1642e-114.7684e-07 -2.0062e-07 2.0055e-07 -3.6566e-112.3842e-07 -1.0050e-07 1.0020e-07 -1.5298e-101.1921e-07 -4.9746e-08 4.9906e-08 7.9849e-115.9605e-08 -2.5532e-08 2.4760e-08 -3.8581e-102.9802e-08 -1.0630e-08 1.1721e-08 5.4551e-101.4901e-08 -6.9051e-09 7.9961e-09 5.4551e-107.4506e-09 5.4551e-10 5.4551e-10 5.4551e-103.7253e-09 5.4551e-10 5.4551e-10 5.4551e-101.8626e-09 -2.9257e-08 -2.9257e-08 -2.9257e-089.3132e-10 -2.9257e-08 -2.9257e-08 -2.9257e-084.6566e-10 -2.9257e-08 -2.9257e-08 -2.9257e-082.3283e-10 -2.9257e-08 -2.9257e-08 -2.9257e-08

[email protected] 271 Antonio Carrillo Ledesma, Et alii

Page 274: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Cómo se nota en la salida anterior, la convergencia mejora conforme h sehace pequeña, hasta llegar a cierto valor en que por errores de truncamiento,el error en los esquemas de aproximación en la derivada comienza a incre-mentarse. Esto nos da una idea de los valores de h que podemos usar paralos esquemas de aproximación de diferencias �nitas progresiva, regresiva ycentrada respectivamente.

6.4 Integrales

En análisis numérico, la integración numérica constituye una amplia gamade algoritmos para calcular el valor numérico de una integral de�nida y, porextensión, el término se usa a veces para describir algoritmos numéricos pararesolver ecuaciones diferenciales. El término cuadratura numérica (a menudoabreviado a cuadratura) es más o menos sinónimo de integración numérica,especialmente si se aplica a integrales de una dimensión a pesar de que parael caso de dos o más dimensiones (integral múltiple) también se utiliza.El problema básico considerado por la integración numérica es calcular

una solución aproximada a la integral de�nida

bZa

f(x)dx

Este problema también puede ser enunciado como un problema de valorinicial para una ecuación diferencial ordinaria, como sigue

y0(x) = f(x); y(a) = 0

Encontrar y(b) es equivalente a calcular la integral. Los métodos desa-rrollados para ecuaciones diferenciales ordinarias, como el método de Runge-Kutta, pueden ser aplicados al problema reformulado.

Razones para la integración numérica Hay varias razones para llevara cabo la integración numérica. La principal puede ser la imposibilidad derealizar la integración de forma analítica. Es decir, integrales que requeriríande un gran conocimiento y manejo de matemática avanzada pueden ser re-sueltas de una manera más sencilla mediante métodos numéricos. Inclusoexisten funciones integrables pero cuya primitiva no puede ser calculada,siendo la integración numérica de vital importancia. La solución analítica

[email protected] 272 Antonio Carrillo Ledesma, Et alii

Page 275: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

de una integral nos arrojaría una solución exacta, mientras que la soluciónnumérica nos daría una solución aproximada. El error de la aproximación,que depende del método que se utilice y de qué tan �no sea, puede llegar aser tan pequeño que es posible obtener un resultado idéntico a la soluciónanalítica en las primeras cifras decimales.

Cuadratura de Gauss En análisis numérico un método de cuadraturaes una aproximación de una integral de�nida de una función. Una cuadraturade Gauss n, es una cuadratura que selecciona los puntos de la evaluación demanera óptima y no en una forma igualmente espaciada, construida paradar el resultado de un polinomio de grado 2n� 1 o menos, elegibles para lospuntos xi y los coe�cientes wi para i = 1; :::; n. El dominio de tal cuadraturapor regla es de [�1; 1] dada por:

1Z�1

f(x)dx �nXi=1

wif(xi)

la cuadratura dará resultados precisos solo sí f(x) es aproximado porun polinomio dentro del rango [�1; 1]. Si la función puede ser escrita comof(x) = W (x)g(x), donde g(x) es un polinomio aproximado y W (x) es cono-cido.

1Z�1

f(x)dx =

1Z�1

W (x)g(x)dx �nXi=1

wig(xi)

Formula para calcular wi también conocida como el método de Gauss-Legendre, los coe�cientes estan dados por

wi =2

(1� x2i ) [P0n(xi)]

2

donde Pn son los polinomios de Legendre en el intervalo [�1; 1]:

Polinomios de Legendre las funciones de Legendre son las solucionesde las ecuaciones diferenciales de Legendre:

d

dx

��1� x2

� ddxPn (x)

�+ n (n+ 1)Pn (x) = 0

[email protected] 273 Antonio Carrillo Ledesma, Et alii

Page 276: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

la ecuación diferencial de Legendre puede resolverse usando el método de se-ries de potencias. En general la serie de potencias obtenida converge cuandojxj < 1 y en el caso particular cuando n sea un entero no negativo las solu-ciones forman una familia de polinomios ortogonales llamados polinomios deLegendre. Cada polinomio de Legendre Pn (x) es un polinomio de grado n.Este se puede ser expresado usando la fórmula:

Pn (x) =1

2nn!

dn

dxn��x2 � 1

�n�desarrollando esta fórmula, se obtiene la siguiente expresión para los poli-nomios de Legendre

Pn (x) =1

2n

nXk=0

�n

k

�2(x+ 1)n�k (x� 1)k

esta última expresión es útil en caso de querer elaborar un programa quegra�que los polinomios de Legendre.Los primeros polinomios de Legendre se muestran en la siguiente tabla:

n Pn (x)0 11 x2 1

2(3x2 � 1)

3 12(5x3 � 3x)

4 18(35x4 � 30x2 + 3)

Así, la lista de coe�cientes de wi y puntos xi para n = 1; :::; 5 esta dadaen la siguiente tabla:

[email protected] 274 Antonio Carrillo Ledesma, Et alii

Page 277: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Número de puntos Puntos xi Pesos wi1 0 2

2 �q

13

1

30

�q

35

8959

4�r�

3� 2�q

65

��=7

�r�

3 + 2�q

65

��=7

18+p30

3618�

p30

36

5

0

�r5� 2

�q107

��r5 + 2

�q107

�128225

322+13p70

900322�13

p70

900

Cambio de Intervalos Los cambios de intervalos van de [�1; 1] des-pués de aplicar la cuadratura de Gauss:

bZa

f(x)dx =b� a2

1Z�1

f

�b� a2x+

a+ b

2

�dx

Después de aplicar la cuadratura la aproximación es:

bZa

f(x)dx � b� a2

nXi=1

wif

�b� a2xi +

a+ b

2

Ejemplo de Uso La integral

5Z1

(x3 + 2x2)dx = 238:66667

si se resuelve por cuadratura usando n = 2; entonces tenemos

b� a2

1Z�1

f

�b� a2x+

a+ b

2

�dx =

5� 12

1Z�1

f

�5� 12x+

5 + 1

2

�dx =

[email protected] 275 Antonio Carrillo Ledesma, Et alii

Page 278: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

2

1Z�1

f (2x+ 3) dx � 22Xi=1

wif (2x+ 3) =

2 (w1f (2x1 + 3) + w2f (2x2 + 3)) = 238:6667

Integrando en Dos o Más Dimensiones es posible hacer integracionesen dos o más dimensiones y sin perdida de generalidad, para dos dimensionestenemos:Los cambios de intervalos van de [�1; 1]� [�1; 1] después de aplicar la

cuadratura de Gauss:

bZa

dZc

f(x; y)dxdy =b� a2

d� c2

1Z�1

1Z�1

f

�b� a2x+

a+ b

2;d� c2x+

c+ d

2

�dxdy

Después de aplicar la cuadratura la aproximación es:

bZa

dZc

f(x; y)dxdy � b� a2

d� c2

nXi=1

nXj=1

wiwjf

�b� a2xi +

a+ b

2;d� c2yj +

c+ d

2

�De esta forma se puede extender la integración por cuadratura Gaussiana

para cualquier dimensión que se necesite, esto queda plasmado en el siguienteprograma en C:

#include<stdio.h>#include<math.h>// Arreglo para las Xistatic double PUNTOS[][10] = {{0.577350269189625764509148780502,-0.577350269189625764509148780502,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},{0.774596669241483377035853079956,0.0,-0.774596669241483377035853079956,0.0,0.0,0.0,0.0,0.0,0.0,0.0},{0.861136311594052575223946488893,0.339981043584856264802665759103,-0.339981043584856264802665759103,-0.861136311594052575223946488893,0.0,0.0,0.0,0.0,0.0,0.0},{0.906179845938663992797626878299,0.538469310105683091036314420700,0.0,-0.538469310105683091036314420700,-0.906179845938663992797626878299,0.0,0.0,0.0,0.0,0.0},

[email protected] 276 Antonio Carrillo Ledesma, Et alii

Page 279: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

{0.932469514203152027812301554494,0.661209386466264513661399595020,0.238619186083196908630501721681,-0.238619186083196908630501721681,-0.661209386466264513661399595020,-0.932469514203152027812301554494,0.0,0.0,0.0,0.0},{0.949107912342758524526189684048,0.741531185599394439863864773281,0.405845151377397166906606412077,0.0,-0.405845151377397166906606412077,-0.741531185599394439863864773281,-0.949107912342758524526189684048,0.0,0.0,0.0},{0.960289856497536231683560868569,0.796666477413626739591553936476,0.525532409916328985817739049189,0.183434642495649804939476142360,-0.183434642495649804939476142360,-0.525532409916328985817739049189,-0.796666477413626739591553936476,-0.960289856497536231683560868569,0.0,0.0},{0.968160239507626089835576202904,0.836031107326635794299429788070,0.613371432700590397308702039341,0.324253423403808929038538014643,0.0,-0.324253423403808929038538014643,-0.613371432700590397308702039341,-0.836031107326635794299429788070,-0.968160239507626089835576202904,0.0},{0.973906528517171720077964012084,0.865063366688984510732096688423,0.679409568299024406234327365115,0.433395394129247190799265943166,0.148874338981631210884626001130,-0.148874338981631210884626001130,-0.433395394129247190799265943166,-0.679409568299024406234327365115,-0.865063366688984510732096688423,-0.973906528517171720077964012084}};// Arreglo para los pesosstatic double PESOS[][10] = {{1.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0},{0.555555555555555555555555555556,0.888888888888888888888888888889,0.555555555555555555555555555556,0.0,0.0,0.0,0.0,0.0,0.0,0.0},{0.347854845137453857373063949222,0.652145154862546142626936050778,0.652145154862546142626936050778,0.347854845137453857373063949222,0.0,0.0,0.0,0.0,0.0,0.0},{0.236926885056189087514264040720,0.478628670499366468041291514836,0.568888888888888888888888888889,0.478628670499366468041291514836,0.236926885056189087514264040720,0.0,0.0,0.0,0.0,0.0},{0.171324492379170345040296142173,0.360761573048138607569833513838,0.467913934572691047389870343990,0.467913934572691047389870343990,0.360761573048138607569833513838,0.171324492379170345040296142173,0.0,0.0,0.0,0.0},

[email protected] 277 Antonio Carrillo Ledesma, Et alii

Page 280: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

{0.129484966168869693270611432679,0.279705391489276667901467771424,0.381830050505118944950369775489,0.417959183673469387755102040816,0.381830050505118944950369775489,0.279705391489276667901467771424,0.129484966168869693270611432679,0.0,0.0,0.0},{0.101228536290376259152531354310,0.222381034453374470544355994426,0.313706645877887287337962201987,0.36268378337836198297,0.362683783378361982965150449277,0.313706645877887287337962201987,0.222381034453374470544355994426,0.101228536290376259152531354310,0.0,0.0},{0.0812743883615744119718921581105,0.180648160694857404058472031243,0.260610696402935462318742869419,0.312347077040002840068630406584,0.330239355001259763164525069287,0.312347077040002840068630406584,0.260610696402935462318742869419,0.180648160694857404058472031243,0.0812743883615744119718921581105,0.0},{0.0666713443086881375935688098933,0.149451349150580593145776339658,0.219086362515982043995534934228,0.269266719309996355091226921569,0.295524224714752870173892994651,0.295524224714752870173892994651,0.269266719309996355091226921569,0.219086362515982043995534934228,0.149451349150580593145776339658,0.0666713443086881375935688098933}};// Funcion Principal ....int main(void){int k, P_I = 8;int j, i;double x = 0.0;

// Integral en una dimension f(x)= x*x - 3x + 7for (k = 0; k < P_I; k++){x += PESOS[P_I-2][k] * (PUNTOS[P_I-2][k] *PUNTOS[P_I-2][k] + 3.0 * PUNTOS[P_I-2][k] + 7.0);}printf("El resultado es %2.18lf, debe de ser 14.666667nn",x);

// Integral en una dimension f(x)= sin(x)x = 0.0;for (k = 0; k < P_I; k++)

[email protected] 278 Antonio Carrillo Ledesma, Et alii

Page 281: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

{x += PESOS[P_I-2][k] * (sinl(PUNTOS[P_I-2][k] ));}printf("El resultado es %2.18lf, debe de ser 0.0nn",x);

// Integral en dos dimensiones f(x,y)= (x*x*x - 1)(y - 1)(y - 1)x = 0.0;for (i = 0; i < P_I; i++){for (j = 0; j < P_I; j++){x += PESOS[P_I-2][i]*PESOS[P_I-2][j]*( (PUNTOS[P_I-2][j]*PUNTOS[P_I-2][j]*PUNTOS[P_I-2][j]-1.0)*((PUNTOS[P_I-2][i]-1.0)*(PUNTOS[P_I-2][i]-1.0)) );}}printf("El resultado es %2.18lf, debe de ser -5.333333nn",x);

// Integral en tres dimensiones f(x,y,z)=(x*x)(y*y - 1)(z*z*z*z - 2)x = 0.0;for (i = 0; i < P_I; i++){for (j = 0; j < P_I; j++){for (k = 0; k < P_I; k++){x += PESOS[P_I-2][i]*PESOS[P_I-2][j]*PESOS[P_I-2][k]*((PUNTOS[P_I-2][k]*PUNTOS[P_I-2][k])*(PUNTOS[P_I-2][j]*PUNTOS[P_I-2][j]-1.0)*(PUNTOS[P_I-2][i]*PUNTOS[P_I-2][i]*PUNTOS[P_I-2][i]*PUNTOS[P_I-2][i]-2.0) );}}}

printf("El resultado es %2.18lf, debe de ser 3.2nn",x);getchar();}

[email protected] 279 Antonio Carrillo Ledesma, Et alii

Page 282: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

6.5 Matrices y Vectores

Una parte fundamental de la implementación computacional de los métodosnuméricos de resolución de sistemas algebraicos, es utilizar una forma óptimade almacenar, recuperar y operar las matrices, tal que, facilite los cálculosque involucra la resolución de grandes sistemas de ecuaciones lineales cuyaimplementación puede ser secuencial o paralela (véase [55]).El sistema lineal puede ser expresado en la forma matricial Au = f ,

donde la matriz A � que puede ser real o virtual� es de tamaño n� n conbanda b, pero el número total de datos almacenados en ella es a los másn � b números de doble precisión, en el caso de ser simétrica la matriz, elnúmero de datos almacenados es menor a (n � b)=2. Además si el problemaque la originó es de coe�cientes constantes el número de valores almacenadosse reduce drásticamente a sólo el tamaño de la banda b.En el caso de que el método para la resolución del sistema lineal a usar

sea del tipo Factorización LU o Cholesky, la estructura de la matriz cambia,ampliándose el tamaño de la banda de b a 2 � b+ 1 en la factorización, en elcaso de usar métodos iterativos tipo CGM o GMRES la matriz se mantieneintacta con una banda b.Para la resolución del sistema lineal virtual asociada a los métodos de

descomposición de dominio, la operación básica que se realiza de manerareiterada, es la multiplicación de una matriz por un vector v = Cu; la cuales necesario realizar de la forma más e�ciente posible.Un factor determinante en la implementación computacional, para que

esta resulte e�ciente, es la forma de almacenar, recuperar y realizar las opera-ciones que involucren matrices y vectores, de tal forma que la multiplicaciónse realice en la menor cantidad de operaciones y que los valores necesariospara realizar dichas operaciones queden en la medida de lo posible contiguospara ser almacenados en el Cache88 del procesador.

88Nótese que la velocidad de acceso a la memoria principal (RAM) es relativamentelenta con respecto al Cache, este generalmente está dividido en subCaches L1 � de menortamaño y el más rápido� , L2 y hasta L3 � el más lento y de mayor tamaño� los cualesson de tamaño muy reducido con respecto a la RAM.Por ello, cada vez que las unidades funcionales de la Unidad de Aritmética y Lógica

requieren un conjunto de datos para implementar una determinada operación en los re-gistros, solicitan los datos primeramente a los Caches, estos consumen diversa cantidad deciclos de reloj para entregar el dato si lo tienen � pero siempre el tiempo es menor quesolicitarle el dato a la memoria principal� ; en caso de no tenerlo, se solicitan a la RAMpara ser cargados a los caches y poder implementar la operación solicitada.

[email protected] 280 Antonio Carrillo Ledesma, Et alii

Page 283: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Dado que la multiplicación de una matriz C por un vector u; dejando elresultado en v se realiza mediante el algoritmo.

for (i=0; i<ren; i++){s = 0.0;for (j=0; j < col; j++){s += C[i][j]*u[j];

}v[i] = s;

}

Para lograr una e�ciente implementación del algoritmo anterior, es nece-sario que el gran volumen de datos desplazados de la memoria al Cachey viceversa sea mínimo. Por ello, los datos se deben agrupar para que laoperación más usada � en este caso multiplicación matriz por vector� serealice con la menor solicitud de datos a la memoria principal, si los datosusados � renglón de la matriz� se ponen contiguos minimizará los accesosa la memoria principal, pues es más probable que estos estarán contiguos enel Cache al momento de realizar la multiplicación.Por ejemplo, en el caso de matrices bandadas de tamaño de banda b, el

algoritmo anterior se simpli�ca a:.

for (i=0; i<ren; i++){s= 0.0;for (k=0; k < ban; k++){if ((Ind[k] + i) >= 0 && (Ind[k]+i) < ren)s += Dat[i][k]*u[Ind[k]+i];

}v[i]=s;

}

Si, la solicitud de memoria para Dat[i] se hace de tal forma que los datosdel renglón esten continuos � son b números de punto �otante� , esto mi-nimizará los accesos a la memoria principal en cada una de las operacionesinvolucradas en el producto, como se explica en las siguientes secciones.

[email protected] 281 Antonio Carrillo Ledesma, Et alii

Page 284: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Matrices Bandadas En el caso de las matrices bandadas de banda b �sin pérdida de generalidad y para propósitos de ejempli�cación se suponepentadiagonal� típicamente tiene la siguiente forma:

A =

26666666666664

a1 b1 c1d2 a2 b2 c2

d3 a3 b3 c3d4 a4 b4 c4

e5 d5 a5 b5 c5e6 d6 a6 b6

e7 d7 a7 b7e8 d8 a8 b8

e9 d9 a9

37777777777775(6.28)

la cual puede ser almacenada usando el algoritmo (véase [55]) CompressedDiagonal Storage (CDS), optimizado para ser usado en C++, para su al-macenamiento y posterior recuperación. Para este ejemplo en particular, sehará uso de un vector de índices

Ind = [�5;�1; 0;+1;+5] (6.29)

y los datos serán almacenados usando la estructura

Dat =

26666666666664

0 0 a1 b1 c10 d2 a2 b2 c20 d3 a3 b3 c30 d4 a4 b4 c4e5 d5 a5 b5 c5e6 d6 a6 b6 0e7 d7 a7 b7 0e8 d8 a8 b8 0e9 d9 a9 0 0

37777777777775(6.30)

de tal forma que la matriz A puede ser reconstruida de forma e�ciente. Paraobtener el valor Ai;j; calculo ind = j � i; si el valor ind esta en la lista deíndices Ind � supóngase en la columna k� , entonces Ai;j = Datik; en otrocaso Ai;j = 0:

Casos Particulares de la Matriz Bandada A Básicamente dos casosparticulares surgen en el tratamiento de ecuaciones diferenciales parciales: El

[email protected] 282 Antonio Carrillo Ledesma, Et alii

Page 285: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

primer caso es cuando el operador diferencial parcial es simétrico y el otro,en el que los coe�cientes del operador sean constantes.Para el primer caso, al ser la matriz simétrica, sólo es necesario almacenar

la parte con índices mayores o iguales a cero, de tal forma que se buscara elíndice que satisfaga ind = jj � ij ; reduciendo el tamaño de la banda a b=2en la matriz A:Para el segundo caso, al tener coe�cientes constantes el operador dife-

rencial, los valores de los renglones dentro de cada columna de la matriz soniguales, y sólo es necesario almacenarlos una sola vez, reduciendo drástica-mente el tamaño de la matriz de datos.

Implementación de Matrices Bandadas Orientada a Objetos enC++ Una forma de implementar la matriz bandada A de banda b en C++es mediante:

// Creaciondouble **Dat;Dat = new double*[ren];for (i = 0; i < ren; i++) Dat[i] = new double[b];int *Ind;Ind = new int[b];// Inicializacionfor (i = 0; i < ren; i++)for (j = 0; j < b; j++) Dat[i][j] = 0.0;

for (i = 0; i < b; i++) Ind[i] = 0;

Matrices Dispersas Las matrices dispersas de a lo más b valores distintospor renglón � sin pérdida de generalidad y para propósitos de ejempli�caciónse supone b = 3� que surgen en métodos de descomposición de dominio para

[email protected] 283 Antonio Carrillo Ledesma, Et alii

Page 286: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

almacenar algunas matrices, típicamente tienen la siguiente forma

A =

26666666666664

a1 b1 c1a2 b2 c2

a3 b3 c3a4 b4

a5 b5 c5a6 b6 c6

a7 b7 c7a8 b8 c8

a9 b9

37777777777775(6.31)

la cual puede ser almacenada usando el algoritmo (véase [55]) Jagged Diag-onal Storage (JDC), optimizado para ser usado en C++. Para este ejemploen particular, se hará uso de una matriz de índices

Ind =

26666666666664

1 6 92 5 85 8 91 4 03 6 91 2 37 8 94 7 87 8 0

37777777777775(6.32)

y los datos serán almacenados usando la estructura

Dat =

26666666666664

a1 b1 c1a2 b2 c2a3 b3 c3a4 b4 0a5 b5 c5a6 b6 c6a7 b7 c7a8 b8 c8a9 b9 0

37777777777775(6.33)

de tal forma que la matriz A puede ser reconstruida de forma e�ciente.Para obtener el obtener el valor Ai;j; busco el valor j en la lista de índicesInd dentro del renglón i; si lo encuentro en la posición k; entonces Ai;j =Datik; en otro caso Ai;j = 0:

[email protected] 284 Antonio Carrillo Ledesma, Et alii

Page 287: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Casos Particulares de la Matriz Dispersa A Si la matriz A, queal ser almacenada, se observa que existen a lo más r diferentes renglones convalores distintos de los n con que cuenta la matriz y si r << n, entonces esposible sólo guardar los r renglones distintos y llevar un arreglo que contengala referencia al renglón almacenado.

Implementación de Matrices Dispersas Orientada a Objetos enC++ Una forma de implementar la matriz bandada A de banda b en C++es mediante:

// Creaciondouble **Dat;Dat = new double*[ren];for (i = 0; i < ren; i++) Dat[i] = new double[b];int **Ind;Ind = new int*[ren];for (i = 0; i < ren; i++) Ind[i] = new int[b];// Inicializacionfor (i = 0; i < ren; i++)for (j = 0; j < b; j++) Dat[i][j] = 0.0, Ind[i][j] = -1;

Multiplicación Matriz-Vector Los métodos de descomposición de do-minio requieren por un lado la resolución de al menos un sistema lineal ypor el otro lado requieren realizar la operación de multiplicación de matrizpor vector, i.e. Cu de la forma más e�ciente posible, por ello los datos sealmacenan de tal forma que la multiplicación se realice en la menor cantidadde operaciones.Dado que la multiplicación de una matriz C por un vector u; dejando el

resultado en v se realiza mediante el algoritmo:

for (i=0; i<ren; i++){s = 0.0;for (j=0; j < col; j++){s += C[i][j]*u[j];

}v[i] = s;

[email protected] 285 Antonio Carrillo Ledesma, Et alii

Page 288: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

}

En el caso de matrices bandadas, se simpli�ca a:

for (i=0; i<ren; i++){s= 0.0;for (k=0; k < ban; k++){if ((Ind[k] + i) >= 0 && (Ind[k]+i) < ren)s += Dat[i][k]*u[Ind[k]+i];

}v[i]=s;

}

De forma similar, en el caso de matrices dispersas, se simpli�ca a:

for (i=0; i<ren; i++){s = 0.0, k = 0while (Ind[i][k] != -1){s += Dat[i][k]*u[Ind[i][k]];k++;if (k >= b) break;

}v[i] = s;

}

De esta forma, al tomar en cuenta la operación de multiplicación de unamatriz por un vector, donde el renglón de la matriz involucrado en la mul-tiplicación queda generalmente en una región contigua del Cache, se haceóptima la operación de multiplicación de matriz por vector.

[email protected] 286 Antonio Carrillo Ledesma, Et alii

Page 289: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Implementación en C++ GMM++89 es una librería para C++ que per-mite de�nir diversos tipos de matrices y vectores además operaciones básicasde álgebra lineal. La facilidad de uso y la gran cantidad de opciones hacen queGMM++ sea una buena opción para trabajar con operaciones elementalesde álgebra lineal.Se instala en Debian Linux y/o Ubuntu como:# apt install libgmm++-dev

Para compilar el ejemplo usar:$ g++ ejemplito.cpp

Para ejecutar usar:$ ./a.out

Ejemplo 2 Un sencillo ejemplo de manejo de matrices y vectores en C++:#include <gmm/gmm.h>#include <math.h>int main(void){int N = 100;// Matriz densagmm::dense_matrix<double> AA(N, N);// Matriz dispersagmm::row_matrix< gmm::rsvector<double> > A(N, N);// Vectoresstd::vector<double> x(N), b(N);int i;double P = -2 ;double Q = 1;double R = 1;A(0, 0) = P; // Primer renglon de la matriz A y vector bA(0, 1) = Q;b[0] = P;// Renglones intermedios de la matriz A y vector bfor(i = 1; i < N - 1; i++){A(i, i - 1) = R;A(i, i) = P;

89GMM++ [http://getfem.org/gmm.html]

[email protected] 287 Antonio Carrillo Ledesma, Et alii

Page 290: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

A(i, i + 1) = Q;b[i] = P);}A(N - 1, N - 2) = R; // Renglon �nal de la matriz A y vector bA(N - 1, N - 1) = P;b[N - 1] = P;// Copia la matriz dispersa a la densa para usarla en LUgmm::copy(A,AA);// Visualiza la matriz y el vectorstd::cout << "Matriz A"<< AA << gmm::endl;std::cout << "Vector b"<< b << gmm::endl;return 0;}

6.6 Resolución de Sistemas Lineales

Los modelos matemáticos de muchos sistemas en Ciencia e Ingeniería y enparticular una gran cantidad de sistemas continuos geofísicos requieren elprocesamiento de sistemas algebraicos de gran escala. En este trabajo semuestra como proceder para transformar un problema de ecuaciones diferen-ciales parciales en un sistema algebraico virtual de ecuaciones lineales; y así,poder hallar la solución a dicho problema al resolver el sistema lineal asociadoal esquema DVS. La solución de este sistema virtual, involucra la soluciónacoplada de muchos sistemas lineales locales � uno por cada subdominio� ,cada uno de estos sistemas lineales puede ser expresado en la siguiente formamatricial

Au = f (6.34)

donde la matriz A es de tamaño n�n y generalmente bandada, cuyo tamañode banda es b.

Los métodos de resolución del sistema algebraico de ecuaciones Au = fse clasi�can en dos grandes grupos (véase [56]): los métodos directos y losmétodos iterativos. En los métodos directos la solución u se obtiene en unnúmero �jo de pasos y sólo estan sujetos a los errores de redondeo. En losmétodos iterativos, se realizan iteraciones para aproximarse a la solución uaprovechando las características propias de la matriz A; tratando de usar un

[email protected] 288 Antonio Carrillo Ledesma, Et alii

Page 291: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

menor número de pasos que en un método directo (véase [52], [53], [54] y[56]).Por lo general, es conveniente usar librerías90 para implementar de forma

e�ciente a los vectores, matrices � bandadas y dispersas� y resolver lossistemas lineales locales asociados a los métodos de resolución de ecuacionesdiferenciales parciales.

Métodos Directos En los métodos directos (véase [52] y [55]), la solu-ción u se obtiene en un número �jo de pasos y sólo estan sujetos a erroresde redondeo. Entre los métodos más importantes se puede considerar: Fac-torización LU � para matrices simétricas y no simétricas� y FactorizaciónCholesky � para matrices simétricas� . En todos los casos la matriz originalA es modi�cada y en caso de usar la Factorización LU el tamaño de la bandab crece a 2b+ 1 si la factorización se realiza en la misma matriz.

Factorización LU Sea U una matriz triangular superior obtenida deA por eliminación bandada. Entonces U = L�1A; donde L es una matriztriangular inferior con unos en la diagonal. Las entradas de L�1 puedenobtenerse de los coe�cientes L

ijy pueden ser almacenados estrictamente en

las entradas de la diagonal inferior de A ya que estas ya fueron eliminadas.Esto proporciona una Factorización LU deA en la misma matrizA ahorrandoespacio de memoria, donde el ancho de banda cambia de b a 2b+ 1.En el algoritmo de Factorización LU, se toma como datos de entrada del

sistema Au = f , a la matriz A; la cual será factorizada en la misma matriz,esta contendrá a las matrices L y U producto de la factorización, quedando

90Algunas de las librerías más usadas para resolver sistemas lineales usando matricesbandadas y dispersas son PETCs, HYPRE, ATLAS, LAPACK++, LAPACK, EISPACK,LINPACK, BLAS, entre muchas otras alternativas, tanto para implementaciones secuen-ciales como paralelas y más recientemente para hacer uso de los procesadores CUDA enlas GPU de nVidia.

[email protected] 289 Antonio Carrillo Ledesma, Et alii

Page 292: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

el método numérico esquemáticamente como:

Aii = 1; para i = 1; :::; NPara J = 1; 2; :::; N fPara i = 1; 2; :::; j

Aij = Aij �i�1Xk=1

AikAkj

Para i = j + 1; j + 2; :::; N

Aij =1Ajj

Aij �

j�1Xk=1

AikAkj

!g

(6.35)

El problema originalAu = f se escribe como LUu = f , donde la búsquedade la solución u se reduce a la solución sucesiva de los sistemas linealestriangulares

Ly = f y Uu = y: (6.36)

i,.e.

Ly = f ,8><>:y1 = f1=l11

yi =1Aii

fi �

i�1Xj=1

Aiiyi

!para toda i = 1; :::; n (6.37)

y

Uu = y ,8><>:xn = yn=unn

xi =1Aii

yi �

nXj=i+1

Aijxj

!para toda i = n� 1; :::; 1 :(6.38)

La descomposición LU requiere N3=3 operaciones aritméticas para la ma-triz llena, pero sólo Nb2 operaciones aritméticas para la matriz con un anchode banda de b siendo esto más económico computacionalmente.

Factorización Cholesky Cuando la matriz es simétrica y de�nida po-sitiva, se obtiene la descomposición LU de la matriz A = LDU = LDLT

donde D = diag(U) es la diagonal con entradas positivas.

[email protected] 290 Antonio Carrillo Ledesma, Et alii

Page 293: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

En el algoritmo de Factorización Cholesky, se toma como datos de entradadel sistema Au = f , a la matriz A; la cual será factorizada en la misma matrizy contendrá a las matrices L y LT producto de la factorización, quedando elmétodo numérico esquemáticamente como:

para i = 1; 2; :::; n y j = i+ 1; :::; n

Aii =

vuut Aii � i�1Xk=1

A2ik

!

Aji =

Aji �

i�1Xk=1

AjkAik

!=Aii

(6.39)

El problema original Au = f se escribe como LLTu = b, donde labúsqueda de la solución u se reduce a la solución sucesiva de los sistemaslineales triangulares

Ly = f y LTu = y (6.40)

usando la formulación equivalente dada por las Ec.(6.37) y (6.38) para ladescomposición LU.La mayor ventaja de esta descomposición es que, en el caso en que es

aplicable, el costo de cómputo es sustancialmente reducido, ya que requierede N3=6 multiplicaciones y N3=6 sumas.

Métodos Iterativos En los métodos iterativos, se realizan iteraciones paraaproximarse a la solución u aprovechando las características propias de lamatriz A; tratando de usar un menor número de pasos que en un métododirecto (véase [52] y [55]).En los métodos iterativos tales como Jacobi, Gauss-Seidel y de Relajación

Sucesiva (SOR) en el cual se resuelve el sistema lineal

Au = f (6.41)

comienza con una aproximación inicial u0 a la solución u y genera una suce-sión de vectores

�uk1k=1

que converge a u. Los métodos iterativos traenconsigo un proceso que convierte el sistema Au = f en otro equivalente me-diante la iteración de punto �jo de la forma u = Tu + c para alguna matriz�ja T y un vector c: Luego de seleccionar el vector inicial u0 la sucesión delos vectores de la solución aproximada se genera calculando

uk = Tuk�1 + c 8k = 1; 2; 3; ::: (6.42)

[email protected] 291 Antonio Carrillo Ledesma, Et alii

Page 294: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

La convergencia a la solución la garantiza el siguiente teorema (véase [56]).

Teorema 1 Si T < 1, entonces el sistema lineal u = Tu + c tiene una

solución única u� y las iteraciones uk de�nidas por la fórmula uk = Tuk�1+c 8k = 1; 2; 3; ::: convergen hacia la solución exacta u� para cualquier apro-ximación inicial u0:

Nótese que, mientras menor sea la norma de la matriz T ; más rápida es laconvergencia, en el caso cuando

T es menor que uno, pero cercano a uno,la convergencia es lenta y el número de iteraciones necesario para disminuirel error depende signi�cativamente del error inicial. En este caso, es deseableproponer al vector inicial u0 de forma tal que sea mínimo el error inicial.Sin embargo, la elección de dicho vector no tiene importancia si la

T espequeña, ya que la convergencia es rápida.Como es conocido, la velocidad de convergencia de los métodos itera-

tivos dependen de las propiedades espectrales de la matriz de coe�cientesdel sistema de ecuaciones, cuando el operador diferencial L de la ecuacióndel problema a resolver es auto adjunto se obtiene una matriz simétrica ypositiva de�nida y el número de condicionamiento de la matriz A, es porde�nición

cond(A) =�max�min

� 1 (6.43)

donde �max y �min es el máximo y mínimo de los eigen valores de la matrizA. Si el número de condicionamiento es cercano a 1 los métodos numéricosal solucionar el problema convergerá en pocas iteraciones, en caso contrariose requerirán muchas iteraciones.Frecuentemente al usar el método de Elemento Finito, Diferencias Fini-

tas, entre otros, se tiene una velocidad de convergencia de O�1h2

�y en el

caso de métodos de descomposición de dominio sin precondicionar se tieneuna velocidad de convergencia de O

�1h

�, donde h es la máxima distancia de

separación entre nodos continuos de la partición, es decir, que poseen unapobre velocidad de convergencia cuando h! 0 (véase [51], [52] y [56]).Los métodos Jacobi, Gauss-Seidel y de Relajación Sucesiva (SOR) son

usualmente menos e�cientes que los métodos discutidos en el resto de estasección basados en el espacio de Krylov (véase [61] y [55]). Estos métodosminimizan, en la k-ésima iteración alguna medida de error sobre el espacioafín x0 + Kk; donde x0 es la iteración inicial y Kk es el k-ésimo subespacio

[email protected] 292 Antonio Carrillo Ledesma, Et alii

Page 295: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

de Krylov

Kk = Generado�r0; Ar0; :::; A

k�1r0para k � 1: (6.44)

El residual es r = b� Ax; tal�rkk�0 denota la sucesión de residuales

rk = b� Axk: (6.45)

Entre los métodos más usados de�nidos en el espacio de Krylov parael tipo de problemas tratados en el presente trabajo se puede considerar:Método de Gradiente Conjugado � para matrices simétricas� y GMRES� para matrices no simétricas� .

Método de Gradiente Conjugado Si la matriz generada por la dis-cretización es simétrica � A = AT� y de�nida positiva � uTAu > 0 paratodo u 6= 0� , entonces es aplicable el método de Gradiente Conjugado �Conjugate Gradient Method (CGM)� . La idea básica en que descansa elmétodo del Gradiente Conjugado consiste en construir una base de vectoresortogonales en el espacio de Krylov Kn

�A; vn

�y utilizarla para realizar la

búsqueda de la solución en la forma lo más e�ciente posible.Tal forma de proceder generalmente no sería aconsejable porqué la cons-

trucción de una base ortogonal utilizando el procedimiento de Gram-Schmidtrequiere, al seleccionar cada nuevo elemento de la base, asegurar su ortogo-nalidad con respecto a cada uno de los vectores construidos previamente. Lagran ventaja del método de Gradiente Conjugado radica en que cuando seutiliza este procedimiento, basta con asegurar la ortogonalidad de un nuevomiembro con respecto al último que se ha construido, para que automática-mente esta condición se cumpla con respecto a todos los anteriores.En el algoritmo de Gradiente Conjugado, se toma a la matriz A como

simétrica y positiva de�nida, y como datos de entrada del sistema

Au = f (6.46)

el vector de búsqueda inicial u0 y se calcula r0 = f �Au0; p0 = r0; quedando

[email protected] 293 Antonio Carrillo Ledesma, Et alii

Page 296: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

el método numérico esquemáticamente como:

�n =hpn;pnihpn;Apni

un+1 = un + �npn

rn+1 = rn � �nApnPrueba de convergencia

�n =hrn+1;rn+1ihrn;rni

pn+1 = rn+1 + �npn

n = n+ 1

(6.47)

donde h�; �i = (�; �) será el producto interior adecuado al sistema lineal enparticular, la solución aproximada será un+1 y el vector residual será rn+1:En la implementación numérica y computacional del método es necesario

realizar la menor cantidad de operaciones posibles por iteración, en particularen Apn, una manera de hacerlo queda esquemáticamente como:Dado el vector de búsqueda inicial u; calcula r = f�Au; p = r y � = r �r:

Para n = 1; 2; :::;Mientras (� < ") fv = Ap� = �

p�vu = u+ �pr = r � �v�0 = r � r� = �0

p = r + �p� = �0

g

la solución aproximada será u y el vector residual será r:

Si se denota con f�i; VigNi=1 las eigen-soluciones de A; i.e. AVi = �iVi,i = 0; 1; 2; :::; N: Ya que la matriz A es simétrica, los eigen-valores son realesy se pueden ordenar �1 � �2 � ::: � �N : Se de�ne el número de condición porCond(A) = �N=�1 y la norma de la energía asociada a A por kuk2A = u �Auentonces u� uk

A� u� u0

A

241�qCond(A)

1 +qCond(A)

352k : (6.48)

[email protected] 294 Antonio Carrillo Ledesma, Et alii

Page 297: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

El siguiente teorema da idea del espectro de convergencia del sistemaAu = b para el método de Gradiente Conjugado.

Teorema 2 Sea � = cond(A) = �max�min

� 1, entonces el método de GradienteConjugado satisface la A�norma del error dado por

kenkke0k �

2��p�+1p��1

�n+�p

�+1p��1

��n� � 2�p�� 1p�+ 1

�n(6.49)

donde em = u� um del sistema Au = b:

Nótese que para � grande se tiene quep�� 1p�+ 1

' 1� 2p�

(6.50)

tal que

kenkA ' e0

Aexp

��2 np

�(6.51)

de lo anterior se puede esperar un espectro de convergencia del orden deO(p�) iteraciones (véase [56] y [61]).

Gradiente Conjugado Precondicionado Cuando la matrizA es simétricay de�nida positiva se puede escribir como

�1 �uA � uu � u � �n (6.52)

y tomando la matriz C�1 como un precondicionador de A con la condiciónde que

�1 �uC�1A � uu � u � �n (6.53)

entonces la Ec. (6.46) se pude escribir como

C�1Au = C�1b (6.54)

donde C�1A es también simétrica y de�nida positiva en el producto interiorhu; vi = u � Cv; porque

u;C�1Av�= u � C

�C�1Av

�(6.55)

= u � Av

[email protected] 295 Antonio Carrillo Ledesma, Et alii

Page 298: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

que por hipótesis es simétrica y de�nida positiva en ese producto interior.La elección del producto interior h�; �i quedará de�nido como

hu; vi = u � C�1Av (6.56)

por ello las Ecs. (6.47[1]) y (6.47[3]), se convierten en

�k+1 =rk � rk

pk+1 � C�1pk+1(6.57)

y

�k+1 =pk � C�1rk

pk � Apk (6.58)

generando el método de Gradiente Conjugado precondicionado con precondi-cionador C�1. Es necesario hacer notar que los métodos Gradiente Conju-gado y Gradiente Conjugado Precondicionado sólo di�eren en la elección delproducto interior.Para el método de Gradiente Conjugado Precondicionado, los datos de

entrada son un vector de búsqueda inicial u0 y el precondicionador C�1: Cal-culándose r0 = b� Au0; p = C�1r0; quedando el método esquemáticamentecomo:

�k+1 =pk � C�1rk

pk � Apk (6.59)

pk+1 = rk � �k+1pk

�k+1 =rk � rk

pk+1 � C�1pk+1

uk+1 = uk + �k+1pk+1

rk+1 = C�1rk � �k+1Apk+1:

Algoritmo Computacional del Método Dado el sistema Au = b,con la matriz A simétrica y de�nida positiva de dimensión n�n. La entradaal método será una elección de u0 como condición inicial, " > 0 como latolerancia del método; N como el número máximo de iteraciones y la matrizde precondicionamiento C�1 de dimensión n�n, el algoritmo del método deGradiente Conjugado Precondicionado queda como:r = b� Au

[email protected] 296 Antonio Carrillo Ledesma, Et alii

Page 299: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

w = C�1r

v = (C�1)Tw� =

Pnj=1w

2j

k = 1Mientras que k � NSi kvk1 < " Salir

x = Av

t =�Pn

j=1 vjxj

u = u+ tv

r = r � txw = C�1r

� =Pn

j=1w2j

Si krk1 < " Salir

s =�

v =�C�1

�Tw + sv

� = �

k = k + 1

la salida del método será la solución aproximada u = (u1; :::; un) y elresidual r = (r1; :::; rn).

En el caso del método sin precondicionamiento, C�1 es la matriz identi-dad, que para propósitos de optimización sólo es necesario hacer la asignaciónde vectores correspondiente en lugar del producto de la matriz por el vec-tor. En el caso de que la matriz A no sea simétrica, el método de GradienteConjugado puede extenderse para soportarlas, para más información sobrepruebas de convergencia, resultados numéricos entre los distintos métodos desolución del sistema algebraico Au = b generada por la discretización de unproblema elíptico y como extender estos para matrices no simétricas ver [57]y [58].

Teorema 3 Sean A;B y C tres matrices simétricas y positivas de�nidasentonces

��C�1A

�� �

�C�1B

���B�1A

�:

[email protected] 297 Antonio Carrillo Ledesma, Et alii

Page 300: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Método Residual Mínimo Generalizado Si la matriz generada porla discretización es no simétrica, entonces una opción, es el método ResidualMínimo Generalizado � GeneralizedMinimumResidual Method (GMRES)�, este representa una formulación iterativa común satisfaciendo una condiciónde optimización. La idea básica detrás del método se basa en construir unabase ortonormal �

v1; v2; :::; vn

(6.60)

para el espacio de KrylovKn�A; vn

�: Para hacer vn+1 ortogonal aKn

�A; vn

�,

es necesario usar todos los vectores previamente construidos fvn+1jgnj=1 � enla práctica sólo se guardan algunos vectores anteriores� en los cálculos. Yel algoritmo se basa en una modi�cación del método de Gram-Schmidt parala generación de una base ortonormal. Sea V

n= [v1; v2; :::; vn] la cual denota

la matriz conteniendo vj en la j-ésima columna, para j = 1; 2; :::; n; y seaHn= [hi;j] ; 1 � i; j � n; donde las entradas de H

nno especi�cadas en el

algoritmo son cero. Entonces, Hnes una matriz superior de Hessenberg. i.e.

hij = 0 para j < i� 1; y

AVn= V

nHn+ hn+1;n

�0; :::; 0; vn+1

�(6.61)

Hn= HT

nAV

n:

En el algoritmo del método Residual Mínimo Generalizado, la matriz Aes tomada como no simétrica, y como datos de entrada del sistema

Au = f (6.62)

el vector de búsqueda inicial u0 y se calcula r0 = f � Au0; �0 = kr0k ;v1 = r0=�0; quedando el método esquemáticamente como:

Para n = 1; 2; :::;Mientras �n < ��0 {wn+10 = Avn

Para l = 1 hasta n {hl;n =

wn+1l ; vl

�wn+1l+1 = w

n+1l � hl;nvl

}hn+1;n =

wn+1n+1

vn+1 = wn+1n+1=hn+1;n

Calcular yn tal que �n = �0e1 � Hn

yn es mínima

g

(6.63)

[email protected] 298 Antonio Carrillo Ledesma, Et alii

Page 301: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

donde Hn= [hij]1�i�n+1;1�j�n, la solución aproximada será u

n = u0 + Vnyn,

y el vector residual será

rn = r0 � AVnyn = V

n+1

��0e1 � Hn

yn�: (6.64)

Teorema 4 Sea uk la iteración generada después de k iteraciones de GM-RES, con residual rk: Si la matriz A es diagonalizable, i.e. A = V �V �1

donde � es una matriz diagonal de eigen-valores de A, y V es la matrizcuyas columnas son los eigen-vectores, entonces rk

kr0k � � (V ) minp�2��;pk(0)=1

max jp� (�j)j�j

(6.65)

donde � (V ) = kV kkV �1k es el número de condicionamiento de V :

Precondicionadores Una vía que permite mejorar la e�ciencia de losmétodos iterativos consiste en transformar al sistema de ecuaciones en otroequivalente, en el sentido de que posea la misma solución del sistema originalpero que a su vez tenga mejores condiciones espectrales. Esta transformaciónse conoce como precondicionamiento y consiste en aplicar al sistema de ecua-ciones una matriz conocida como precondicionador encargada de realizar elmejoramiento del número de condicionamiento.Una amplia clase de precondicionadores han sido propuestos basados en

las características algebraicas de la matriz del sistema de ecuaciones, mientrasque por otro lado también existen precondicionadores desarrollados a partirde las características propias del problema que lo origina, un estudio máscompleto puede encontrarse en [60] y [59].

¿Qué es un Precondicionador? De una manera formal podemos de-cir que un precondicionador consiste en construir una matriz C, la cuál esuna aproximación en algún sentido de la matriz A del sistema Au = b, demanera tal que si multiplicamos ambos miembros del sistema de ecuacionesoriginal por C�1 obtenemos el siguiente sistema

C�1Au = C�1b (6.66)

donde el número de condicionamiento de la matriz del sistema transformadoC�1A debe ser menor que el del sistema original, es decir

Cond(C�1A) < Cond(A); (6.67)

[email protected] 299 Antonio Carrillo Ledesma, Et alii

Page 302: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

dicho de otra forma un precondicionador es una inversa aproximada de lamatriz original

C�1 ' A�1 (6.68)

que en el caso ideal C�1 = A�1 el sistema convergería en una sola iteración,pero el coste computacional del cálculo de A�1 equivaldría a resolver el sis-tema por un método directo. Se sugiere que C sea una matriz lo más próximaa A sin que su determinación suponga un coste computacional elevado.Dependiendo de la forma de plantear el producto de C�1 por la matriz

del sistema obtendremos distintas formas de precondicionamiento, estas son:

C�1Au = C�1b Precondicionamiento por la izquierdaAC�1Cu = b Precondicionamiento por la derecha

C�11AC�1

2C2u = C�1

1b

Precondicionamiento por ambos ladossi C puede factorizarse como C = C

1C2:

El uso de un precondicionador en un método iterativo provoca que seincurra en un costo de cómputo extra debido a que inicialmente se construye yluego se debe aplicar en cada iteración. Teniéndose que encontrar un balanceentre el costo de construcción y aplicación del precondicionador versus laganancia en velocidad en convergencia del método.Ciertos precondicionadores necesitan poca o ninguna fase de construcción,

mientras que otros pueden requerir de un trabajo substancial en esta etapa.Por otra parte la mayoría de los precondicionadores requieren en su aplicaciónun monto de trabajo proporcional al número de variables; esto implica quese multiplica el trabajo por iteración en un factor constante.De manera resumida un buen precondicionador debe reunir las siguientes

características:

i) Al aplicar un precondicionador C al sistema original de ecua-ciones Au = b, se debe reducir el número de iteraciones necesariaspara que la solución aproximada tenga la convergencia a la solu-ción exacta con una exactitud " pre�jada.

ii) La matriz C debe ser fácil de calcular, es decir, el costo com-putacional de la construcción del precondicionador debe ser pe-queño comparado con el costo total de resolver el sistema de ecua-ciones Au = b.

[email protected] 300 Antonio Carrillo Ledesma, Et alii

Page 303: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

iii) El sistema Cz =r debe ser fácil de resolver. Esto debe inter-pretarse de dos maneras:

a) El monto de operaciones por iteración debido a la aplicacióndel precondicionador C debe ser pequeño o del mismo orden quelas que se requerirían sin precondicionamiento. Esto es impor-tante si se trabaja en máquinas secuenciales.

b) El tiempo requerido por iteración debido a la aplicación delprecondicionador debe ser pequeño.

En computadoras paralelas es importante que la aplicación del precondi-cionador sea paralelizable, lo cual eleva su e�ciencia, pero debe de existir unbalance entre la e�cacia de un precondicionador en el sentido clásico y su e�-ciencia en paralelo ya que la mayoría de los precondicionadores tradicionalestienen un componente secuencial grande.

Clasi�cación de los Precondicionadores En general se pueden clasi-�car en dos grandes grupos según su manera de construcción: los algebraicoso a posteriori y los a priori o directamente relacionados con el problemacontinuo que lo origina.

Precondicionador a Posteriori Los precondicionadores algebraicoso a posteriori son los más generales, ya que sólo dependen de la estructuraalgebraica de la matriz A, esto quiere decir que no tienen en cuenta losdetalles del proceso usado para construir el sistema de ecuaciones linealesAu = b. Entre estos podemos citar los métodos de precondicionamiento deltipo Jacobi, SSOR, factorización incompleta, inversa aproximada, diagonalóptimo y polinomial.

Precondicionador Jacobi El método precondicionador Jacobi es elprecondicionador más simple que existe y consiste en tomar en calidad deprecondicionador a los elementos de la diagonal de A

Cij =

8<:Aij si i = j

0 si i 6= j:(6.69)

Debido a que las operaciones de división son usualmente más costosas entiempo de cómputo, en la práctica se almacenan los recíprocos de la diagonalde A.

[email protected] 301 Antonio Carrillo Ledesma, Et alii

Page 304: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ventajas: No necesita trabajo para su construcción y puede mejo-rar la convergencia.

Desventajas: En problemas con número de condicionamiento muygrande, no es notoria la mejoría en el número de iteraciones.

Precondicionador SSOR Si la matriz original es simétrica, se puededescomponer como en el método de sobrerrelajamiento sucesivo simétrico(SSOR) de la siguiente manera

A = D + L+ LT (6.70)

donde D es la matriz de la diagonal principal y L es la matriz triangularinferior.La matriz en el método SSOR se de�ne como

C(!) =1

2� w

�1

!D + L

��1

!D

��1�1

!D + L

�T(6.71)

en la práctica la información espectral necesaria para hallar el valor óptimode ! es demasiado costoso para ser calculado.

Ventajas: No necesita trabajo para su construcción, puede mejo-rar la convergencia signi�cativamente.

Desventajas: Su paralelización depende fuertemente del orde-namiento de las variables.

Precondicionador de Factorización Incompleta Existe una ampliaclase de precondicionadores basados en factorizaciones incompletas. La ideaconsiste en que durante el proceso de factorización se ignoran ciertos elemen-tos diferentes de cero correspondientes a posiciones de la matriz original queson nulos. La matriz precondicionadora se expresa como C = LU , dondeL es la matriz triangular inferior y U la superior. La e�cacia del métododepende de cuán buena sea la aproximación de C�1 con respecto a A�1.El tipo más común de factorización incompleta se basa en seleccionar un

subconjunto S de las posiciones de los elementos de la matriz y durante elproceso de factorización considerar a cualquier posición fuera de éste iguala cero. Usualmente se toma como S al conjunto de todas las posiciones

[email protected] 302 Antonio Carrillo Ledesma, Et alii

Page 305: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

(i; j) para las que Aij 6= 0. Este tipo de factorización es conocido comofactorización incompleta LU de nivel cero, ILU(0).El proceso de factorización incompleta puede ser descrito formalmente

como sigue:Para cada k; si i; j > k:

Sij =

8<:Aij � AijA�1ij Akj Si (i; j) 2 S

Aij Si (i; j) =2 S:(6.72)

Una variante de la idea básica de las factorizaciones incompletas lo consti-tuye la factorización incompleta modi�cada que consiste en que si el producto

Aij � AijA�1ij Akj 6= 0 (6.73)

y el llenado no esta permitido en la posición (i; j), en lugar de simplementedescartarlo, esta cantidad se le substrae al elemento de la diagonal Aij.Matemáticamente esto corresponde a forzar a la matriz precondicionadoraa tener la misma suma por �las que la matriz original. Esta variante resultade interés puesto que se ha probado que para ciertos casos la aplicación dela factorización incompleta modi�cada combinada con pequeñas perturba-ciones hace que el número de condicionamiento espectral del sistema pre-condicionado sea de un orden inferior.

Ventaja: Puede mejorar el condicionamiento y la convergenciasigni�cativamente.

Desventaja: El proceso de factorización es costoso y difícil deparalelizar en general.

Precondicionador de Inversa Aproximada El uso del precondi-cionador de inversas aproximada se ha convertido en una buena alternativapara los precondicionadores implícitos debido a su naturaleza paralelizable.Aquí se construye una matriz inversa aproximada usando el producto escalarde Frobenius.Sea S � Cn; el subespacio de las matrices C donde se busca una inversa

aproximada explícita con un patrón de dispersión desconocido. La formu-lación del problema esta dada como:Encontrar C

02 S tal que

C0= argm�{nC2S

AC � I : (6.74)

[email protected] 303 Antonio Carrillo Ledesma, Et alii

Page 306: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Además, esta matriz inicial C0puede ser una inversa aproximada de A

en un sentido estricto, es decir, AC0� I = " < 1: (6.75)

Existen dos razones para esto, primero, la ecuación (6.75) permite ase-gurar que C

0no es singular (lema de Banach), y segundo, esta será la base

para construir un algoritmo explícito para mejorar C0y resolver la ecuación

Au = b:La construcción de C

0se realiza en paralelo, independizando el cálculo

de cada columna. El algoritmo permite comenzar desde cualquier entradade la columna k, se acepta comúnmente el uso de la diagonal como primeraaproximación. Sea rk el residuo correspondiente a la columna k-ésima, esdecir

rk = ACk � ek (6.76)

y sea Ik el conjunto de índices de las entradas no nulas en rk; es decir, Ik =fi = f1; 2; :::; ng j rik 6= 0g : Si Lk = fl = f1; 2; :::; ng j Clk 6= 0g ; entonces lanueva entrada se busca en el conjunto Jk = fj 2 Lck j Aij 6= 0;8i 2 Ikg : Enrealidad las únicas entradas consideradas en Ck son aquellas que afectanlas entradas no nulas de rk: En lo que sigue, asumimos que Lk [ fjg =�ik1; i

k2; :::; i

kpk

es no vacío, siendo pk el número actual de entradas no nulas

de Ck y que ikpk= j, para todo j 2 Jk: Para cada j, calculamos

ACk � ek 22 = 1� pkXl=1

hdet�Dk

l

�i2det�Gkl�2

�det�Gkl

� (6.77)

donde, para todo k; det�Gk0

�= 1 y Gk

les la matriz de Gram de las columnas

ik1; ik2; :::; i

kpkde la matriz A con respecto al producto escalar Euclidiano; Dk

l

es la matriz que resulta de remplazar la última �la de la matriz Gklpor

akik1 ;akik2 ;; :::; akikl ; con 1 � l � pk: Se selecciona el índice jk que minimiza elvalor de

ACk � ek 2 :Esta estrategia de�ne el nuevo índice seleccionado jk atendiendo sola-

mente al conjunto Lk; lo que nos lleva a un nuevo óptimo donde se actualizantodas las entradas correspondientes a los índices de Lk: Esto mejora el cri-terio de (6.74) donde el nuevo índice se selecciona manteniendo las entradas

[email protected] 304 Antonio Carrillo Ledesma, Et alii

Page 307: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

correspondientes a los índices de Lk: Así Ck se busca en el conjunto

Sk = fCk 2 Rn j Cik = 0;8i 2 Lk [ fjkgg ;

mk =

pkXl=1

det�Dk

l

�det�Gkl�2

�det�Gkl

� ~ml (6.78)

donde ~C l es el vector con entradas no nulas ikh (1 � h � l) : Cada una de

ellas se obtiene evaluando el determinante correspondiente que resulta deremplazar la última �la del det

�Gkl

�por eth; con 1 � l � pk:

Evidentemente, los cálculos de ACk � ek 22 y de Ck pueden actualizarse

añadiendo la contribución de la última entrada j 2 Jk a la suma previa de1 a pk � 1: En la práctica, det

�Gkl

�se calcula usando la descomposición de

Cholesky puesto que Gkles una matriz simétrica y de�nida positiva. Esto

sólo involucra la factorización de la última �la y columna si aprovechamosla descomposición de Gk

l�1: Por otra parte, det�Dk

l

�= det

�Gkl

�es el valor

de la última incógnita del sistema Gkldl =

�akik1 ;akik2 ;; :::; akikl

�Tnecesitándose

solamente una sustitución por descenso. Finalmente, para obtener ~C l deberesolverse el sistema Gk

lvl = el; con ~Cik1 l = vhl; (1 � h � l) :

Ventaja: Puede mejorar el condicionamiento y la convergenciasigni�cativamente y es fácilmente paralelizable.

Desventaja: El proceso construcción es algo laborioso.

Precondicionador a Priori Los precondicionadores a priori son másparticulares y dependen para su construcción del conocimiento del proceso dediscretización de la ecuación diferencial parcial, dicho de otro modo dependenmás del proceso de construcción de la matriz A que de la estructura de lamisma.Estos precondicionadores usualmente requieren de más trabajo que los del

tipo algebraico discutidos anteriormente, sin embargo permiten el desarrollode métodos de solución especializados más rápidos que los primeros.Veremos algunos de los métodos más usados relacionados con la solución

de ecuaciones diferenciales parciales en general y luego nos concentraremos

[email protected] 305 Antonio Carrillo Ledesma, Et alii

Page 308: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

en el caso de los métodos relacionados directamente con descomposición dedominio.En estos casos el precondicionador C no necesariamente toma la forma

simple de una matriz, sino que debe ser visto como un operador en general.De aquí que C podría representar al operador correspondiente a una versiónsimpli�cada del problema con valores en la frontera que deseamos resolver.Por ejemplo se podría emplear en calidad de precondicionador al ope-

rador original del problema con coe�cientes variables tomado con coe�cientesconstantes. En el caso del operador de Laplace se podría tomar como pre-condicionador a su discretización en diferencias �nitas centrales.Por lo general estos métodos alcanzan una mayor e�ciencia y una conver-

gencia óptima, es decir, para ese problema en particular el precondicionadorencontrado será el mejor precondicionador existente, llegando a disminuir elnúmero de iteraciones hasta en un orden de magnitud. Donde muchos deellos pueden ser paralelizados de forma efectiva.

El Uso de la Parte Simétrica como Precondicionador La apli-cación del método del Gradiente Conjugado en sistemas no auto-adjuntosrequiere del almacenamiento de los vectores previamente calculados. Si seusa como precondicionador la parte simétrica

(A+ AT )=2 (6.79)

de la matriz de coe�cientes A, entonces no se requiere de éste almacenamientoextra en algunos casos, resolver el sistema de la parte simétrica de la matrizA puede resultar más complicado que resolver el sistema completo.

El Uso de Métodos Directos Rápidos como PrecondicionadoresEn muchas aplicaciones la matriz de coe�cientes A es simétrica y positivode�nida, debido a que proviene de un operador diferencial auto-adjunto yacotado. Esto implica que se cumple la siguiente relación para cualquiermatriz B obtenida de una ecuación diferencial similar

c1 �xTAx

xTBx� c2 8x (6.80)

donde c1 y c2 no dependen del tamaño de la matriz. La importancia de estapropiedad es que del uso de B como precondicionador resulta un métodoiterativo cuyo número de iteraciones no depende del tamaño de la matriz.

[email protected] 306 Antonio Carrillo Ledesma, Et alii

Page 309: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

La elección más común para construir el precondicionador B es a partirde la ecuación diferencial parcial separable. El sistema resultante con lamatriz B puede ser resuelto usando uno de los métodos directos de soluciónrápida, como pueden ser por ejemplo los basados en la transformada rápidade Fourier.Como una ilustración simple del presente caso obtenemos que cualquier

operador elíptico puede ser precondicionado con el operador de Poisson.

Implementación en C++ GMM++91 es una librería para C++ que per-mite de�nir diversos tipos de matrices y vectores además operaciones básicasde algebra lineal. La facilidad de uso y la gran cantidad de opciones hacen queGMM++ sea una buena opción para trabajar con operaciones elementalesde algebra lineal.Se instala en Debian Linux y/o Ubuntu como:# apt install libgmm++-dev

Para compilar el ejemplo usar:$ g++ ejemplito.cpp

Para ejecutar usar:$ ./a.out

Ejemplo 3 Sea

�u00(x) + u(x) = 0; 0 � x � 1; u(0) = 0; u(1) = 1

entonces el programa queda implementado como:#include <gmm/gmm.h>#include <math.h>const double pi = 3.141592653589793;// Lado derechodouble LD(double x){return ( -pi * pi * cos(pi * x));}// Solucion analiticadouble SA(double x){return (cos(pi * x));

91GMM++ [http://getfem.org/gmm.html]

[email protected] 307 Antonio Carrillo Ledesma, Et alii

Page 310: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

}int main(void){int M=11; // Particionint N=M-2; // Nodos interioresdouble a=0; // Inicio dominiodouble c=1; // Fin dominiodouble h=(c-a)/(M-1); // Incremento en la malladouble Y0=1.0; // Condicion inicial en el inicio del dominiodouble Y1=-1.0; // Condicion inicial en el �n del dominio// Matriz densagmm::dense_matrix<double> AA(N, N);// Matriz dispersagmm::row_matrix< gmm::rsvector<double> > A(N, N);// Vectoresstd::vector<double> x(N), b(N);int i;double P = -2 / (h * h);double Q = 1 / (h * h);double R = 1 / (h * h);A(0, 0) = P; // Primer renglon de la matriz A y vector bA(0, 1) = Q;b[0] = LD(a + h) - (Y0 / (h * h));// Renglones intermedios de la matriz A y vector bfor(i = 1; i < N - 1; i++){A(i, i - 1) = R;A(i, i) = P;A(i, i + 1) = Q;b[i] = LD(a + (i + 1) * h);}A(N - 1, N - 2) = R; // Renglon �nal de la matriz A y vector bA(N - 1, N - 1) = P;b[N - 1] = LD(a + (i + 1) * h) - (Y1 / (h * h));// Copia la matriz dispersa a la densa para usarla en LUgmm::copy(A,AA);// Visualiza la matriz y el vectorstd::cout << "Matriz A"<< AA << gmm::endl;

[email protected] 308 Antonio Carrillo Ledesma, Et alii

Page 311: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

std::cout << "Vector b"<< b << gmm::endl;// LU para matrices densasgmm::lu_solve(AA, x, b);std::cout << "LU"<< x << gmm::endl;gmm::identity_matrix PS; // Optional scalar product for cggmm::identity_matrix PR; // Optional preconditionergmm::iteration iter(10E-6);// Iteration object with the max residusize_t restart = 50; // restart parameter for GMRES// Conjugate gradientgmm::cg(A, x, b, PS, PR, iter);std::cout << "CGM"<< x << std::endl;// BICGSTAB BiConjugate Gradient Stabilizedgmm::bicgstab(A, x, b, PR, iter);std::cout << "BICGSTAB"<< x << std::endl;// GMRES generalized minimum residualgmm::gmres(A, x, b, PR, restart, iter);std::cout << "GMRES"<< x << std::endl;// Quasi-Minimal Residual methodgmm::qmr(A, x, b, PR, iter);std::cout << "Quasi-Minimal"<< x << std::endl;// Visualiza la solucion numericastd::cout << "Solucion Numerica"<< std::endl;std::cout << a << " " << Y0 << gmm::endl;for(i = 0; i < N; i++){std::cout << (i + 1)*h << " " << x[i] << gmm::endl;}std::cout << c << " " << Y1 << gmm::endl;// Visualiza la solucion analiticastd::cout << "Solucion Analitica"<< std::endl;std::cout << a << " " << SA(a) << gmm::endl;for(i = 0; i < N; i++){std::cout << (i + 1)*h << " " << SA((a + (i + 1)*h)) << gmm::endl;}std::cout << c << " " << SA(c) << gmm::endl;// Visualiza el error en valor absoluto en cada nodostd::cout << "Error en el calculo"<< std::endl;

[email protected] 309 Antonio Carrillo Ledesma, Et alii

Page 312: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

std::cout << a << " " << abs(Y0 - SA(a)) << gmm::endl;for(i = 0; i < N; i++){std::cout << (i + 1)*h << " " << abs(x[i] - SA((a + (i + 1)*h))) <<

gmm::endl;}std::cout << c << " " << abs(Y1 - SA(c)) << gmm::endl;return 0;}

6.7 Ecuaciones Diferenciales Ordinarias

En matemáticas, una ecuación diferencial ordinaria (comúnmente abreviada"EDO") es la ecuación diferencial que relaciona una función desconocida deuna variable independiente con sus derivadas. Es decir, una sola variableindependiente (a diferencia de las ecuaciones diferenciales parciales que in-volucran derivadas parciales de varias variables), y una o más de sus derivadasrespecto de tal variable.Son recursos en física, la ingeniería, la economía, la meteorología, la bio-

logía, la química y en aplicaciones como las de modelado en ciencias, selas estudia en diversas áreas (como geometría, mecánica y astronomía) yperspectivas.Matemáticamente, es de conveniente interés, la obtención de una familia

de funciones que veri�can una ecuación y establecen la solución general.Sólo las ecuaciones diferenciales más sencillas admiten soluciones dadas porfórmulas explícitas (como las lineales asociadas a una teoría desarrolladaprácticamente por completo). No obstante, pueden determinarse algunaspropiedades de las soluciones de una ecuación diferencial sin requerirse suformulación exacta, clave para resolver la mayoría de las ecuaciones dife-renciales no lineales de sumo interés en numerosos casos. Casos carentes deuna fórmula autocontenida para su solución que se suple con la aproximadanuméricamente con el auxilio crucial de las computadoras.La matemática pura centra el foco formal en la solución, su existencia

y si es o no única. La aplicada controla la validez de los métodos para lasolución numéricamente aproximada y el rigor de las justi�caciones con quese los sustenta.La teoría de los sistemas dinámicos prioriza el análisis cualitativo de sis-

temas descritos por ecuaciones diferenciales mientras se han venido sumando

[email protected] 310 Antonio Carrillo Ledesma, Et alii

Page 313: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

numerosos métodos numéricos para determinar soluciones con un grado dadode precisión.En ingeniería, ciencias naturales y sociales hay muchos problemas de in-

terés que, cuando se plantean, exigen la determinación de una función la cualdebe veri�car una ecuación que involucra derivadas de la función descono-cida. Dichas ecuaciones se denominan ecuaciones diferenciales. Tal vez elejemplo más conocido es la ley de Newton.

Atractor de Lorenz es la representación de un sistema de ecuacionesdiferenciales autónomo (no depende explícitamente del tiempo), un sistemadinámico, que en principio su autor propuso para tratar de comprender losfenómenos meteorológicos. Se encontró con que a pesar de que los valoresgenerados nunca se repiten y de que las condiciones iniciales pueden hacervariar completamente los valores generados (de ahí su nombre de atractorextraño o caótico, y también que los que predicen el tiempo se equivoquentanto), el atractor toma una forma única y parece conservar cierto orden, susin�nitas trayectorias nunca se cortan (pues eso implicaría que entraríamos enun ciclo periódico en un sistema autónomo), y también podemos comprobarcómo este objeto presenta la autosimilitud característica de los fractales. Estaextrema sensibilidad a las condiciones iniciales fue lo que originó la frase delllamado Efecto Mariposa: "...el aleteo de una mariposa en Australia seríasu�ciente para provocar un tornado en Texas...". Conviene señalar que lascondiciones necesarias para que exista caos en un sistema de ecuaciones dife-renciales autónomo son: deben haber al menos tres ecuaciones diferencialesy al menos tres variables y al menos alguna no linealidad.El modelo atmosférico que utilizó Lorenz consiste en una atmósfera bidi-

mensional rectangular, cuyo extremo inferior esta a una temperatura mayorque el superior. De esta manera el aire caliente subirá y el aire frío bajarácreándose corrientes que harían un intercambio de calor por convección.Las ecuaciones que describen este proceso son

dx

dt= s(y � x)

dy

dt= rx� y � xz

dz

dt= xy � bz

en donde las variables, que únicamente dependen del tiempo son:

[email protected] 311 Antonio Carrillo Ledesma, Et alii

Page 314: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� "x" representa el �ujo convectivo

� "y" es la distribución de temperatura horizontal

� "z" es la distribución de temperatura vertical

Además tenemos de los tres parámetros que intervienen en las ecuaciones:

� "s" cociente entre la viscosidad y la conductividad térmica

� "r" la diferencia de temperatura entre la capa inferior y superior

� "b" el cociente entre la altura y el ancho de nuestro rectángulo

A continuación detallamos un programa en Octave que genera el grá�codel actractor de Lorenz:

% EQUATIONS

% x�=s*(y-x)

% y�=r*x-y-x*z

% z�=x*y-b*z

%

% s=10

% r=28

% b=2.666667

function xf1=f1(t,x,y,z)

% Parametros

s=10;

r=28;

b=2.666667;

% Ecuacion

xf1=s*(y-x);

endfunction

[email protected] 312 Antonio Carrillo Ledesma, Et alii

Page 315: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

function yf2=f2(t,x,y,z)

% Parametros

s=10;

r=28;

b=2.666667;

% Ecuacion

yf2=r*x-y-x*z;

endfunction

function zf3=f3(t,x,y,z)

% Parametros

s=10;

r=28;

b=2.666667;

% Ecuacion

zf3=x*y-b*z;

endfunction

N = 20000; % Particion

t0 = 0.0; % Tiempo inicial

t1 = 60.0; % Tiempo �nal

cix = 3.0; % Condicion inicial al tiempo t0

ciy = 3.0;

ciz = 3.0;

h = (t1 - t0) / N; % incremento en el tiempo

t = t0; % Asigna el tiempo inicial

% Asigna la condicion inicial

e1 = cix;

e2 = ciy;

e3 = ciz;

[email protected] 313 Antonio Carrillo Ledesma, Et alii

Page 316: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

% Solo para gra�car

xgrid

X = zeros(N+1,1);

Y = zeros(N+1,1);

Z = zeros(N+1,1);

X(1) = cix;

Y(1) = ciy;

Z(1) = ciz;

% Calculo de las soluciones

for i=1:N

tiempo = t+h; % Solo para la visualizacion

X(i+1) = e1 + h * f1(t,e1,e2,e3); % Euler

Y(i+1) = e2 + h * f2(t,e1,e2,e3);

Z(i+1) = e3 + h * f3(t,e1,e2,e3);

e1 = X(i+1); % evolucion para gra�car

e2 = Y(i+1);

e3 = Z(i+1);

t = t0 + i * h; % Calcula el paso en el tiempo

end

% Gra�ca la solucion

plot3(X,Y,Z) % Calculada

Algo más de Ecuaciones Diferenciales Ordinarias En la red existenmúltiples sitios especializados y una amplia bibliografía para conocer sobreEcuaciones Diferenciales Ordinarias, nosotros hemos seleccionado diversostextos que ponemos a su disposición en:

http://132.248.182.159/acl/SD/EDO/

[email protected] 314 Antonio Carrillo Ledesma, Et alii

Page 317: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

6.8 Ecuaciones Diferenciales Parciales

En la búsqueda de una descripción cualitativa de un determinado fenómeno,por lo general se plantea un sistema de ecuaciones diferenciales ordinarias oparciales, validas para cierto dominio y donde se imponen sobre este, una seriede condiciones en la frontera y en su caso de condiciones iniciales. Despuésde esto, el modelo matemático se considera completo, y es aquí donde laimplementación computacional entra a ayudar en la solución del problema, yaque sólo es posible resolver de forma exacta problemas simples y en fronterasgeométricas triviales con los métodos matemáticos que disponemos.En esta sección consideraremos como implementar la solución computa-

cional del Método de Diferencias Finitas, este método es de carácter generalque permite la resolución aproximada de ecuaciones diferenciales en derivadasparciales de�nidas en un dominio �nito. Es de una gran sencillez concep-tual y constituye un procedimiento muy adecuado para la resolución de unaecuación en una, dos o tres dimensiones.El método consiste en una aproximación de las derivadas parciales por ex-

presiones algebraicas con los valores de la variable dependiente en un número�nito de puntos seleccionados en el dominio92. Como resultado de la apro-ximación, la ecuación diferencial parcial que describe el problema es rem-plazada por un número �nito de ecuaciones algebraicas, en términos de losvalores de la variable dependiente en los puntos seleccionados. El valor de lospuntos seleccionados se convierten en las incógnitas. La solución del sistemade ecuaciones algebraico permite obtener la solución aproximada en cadapunto seleccionado de la malla.

Método de Diferencias Finitas en Una Dimensión Sin perdida degeneralidad, consideremos la ecuación diferencial parcial

(p (x)u0 (x))0+ q (x)u0 (x)� r (x)u (x) = f (x) (6.81)

en a � x � b donde: u (a) = u� y u (b) = u�

con condiciones de frontera Dirichlet, Neumann o Robin. Para usar el pro-cedimiento general de solución numérica mediante el método de diferencias�nitas, debemos de:92La técnica fundamental para los cálculos numéricos en diferencias �nitas se basa en

aproximar f(x)mediante un polinomio cerca de x = x0. Una de las aproximaciones clásicases mediante la serie de Taylor, la cual también nos permite, aparte de la aproximación delas derivadas, el cálculo del error en la aproximación mediante su fórmula del residuo.

[email protected] 315 Antonio Carrillo Ledesma, Et alii

Page 318: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

1. Generar una malla del dominio, i.e. una malla es un conjunto �nito depuntos en los cuales buscaremos la solución aproximada a la ecuacióndiferencial parcial.

2. Sustituir las derivadas correspondientes con alguna de las formulas dediferencias �nitas centradas (véase 6.3 y 6.3), en cada punto donde lasolución es desconocida para obtener un sistema lineal algebraico deecuaciones Au = f .

3. Resolver el sistema lineal algebraico de ecuaciones Au = f (véase 6.6),y así obtener la solución aproximada en cada punto de la malla.

Problema con Condiciones de Frontera Dirichlet Consideremosel caso particular de la Ec.(6.81) de�nido por la ecuación

u00(x) = f(x); 0 � x � 1; u(0) = u�; u(1) = u� (6.82)

con condiciones de frontera Dirichlet. Para usar el procedimiento general desolución numérica mediante el método de diferencias �nitas, debemos de:

1. Generar una malla homogénea del dominio93

xi = ih; i = 0; 1; :::; n; h =1

n= �x (6.83)

2. Sustituir la derivada con la Ec.(6.24) en cada punto donde la soluciónes desconocida para obtener un sistema algebraico de ecuaciones. Así,en cada punto xi de la malla aproximamos la ecuación diferencial por94

u00(xi) �u(xi � h)� 2u(x) + u(xi + h)

h2(6.84)

o en su forma simpli�cada

u00(xi) �ui�1 � 2ui + ui+1

h2(6.85)

93En el caso de que la malla no sea homogénea, es necesario incluir en la derivada a queh se re�ere, por ejemplo en cada punto i, tenemos la hi� (por la izquierda) y la hi+ (porla derecha), i.e. u00(xi) � u(xi�hi�)�2u(x)+u(xi+hi+)

(hi�)(hi+):

94Notemos que en cada punto de la malla, la aproximación por diferencias �nitas suponela solución de tres puntos de la malla xi�1; xi y xi+1: El conjunto de estos tres puntos dela malla es comúnmente llamado el esténcil de diferencias �nitas en una dimensión.

[email protected] 316 Antonio Carrillo Ledesma, Et alii

Page 319: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

de�niendo la solución aproximada de u(x) en xi como ui, entonces segenera el siguiente sistema lineal de ecuaciones

u� � 2u1 + u2h2

= f(x1)

u1 � 2u2 + u3h2

= f(x2)

...ui�1 � 2ui + ui+1

h2= f(xi) (6.86)

...un�3 � 2un�2 + un�1

h2= f(xn�2)

un�2 � 2un�1 + u�h2

= f(xn�1):

Este sistema de ecuaciones se puede escribir como la matriz A y losvectores u y f de la forma266666664

� 2h2

1h2

1h2

� 2h2

1h2

1h2

� 2h2

1h2

. . . . . . . . .1h2

� 2h2

1h2

1h2

� 2h2

377777775

266666664

u1u2u3...

un�2un�1

377777775=

266666664

f(x1)� u�h2

f(x2)f(x3)...

f(xn�2)f(xn�1)� u�

h2

377777775:

en este caso, podemos factorizar 1=h2 del sistema lineal Au = f ,quedando como

1

h2

266666664

�2 11 �2 1

1 �2 1. . . . . . . . .

1 �2 11 �2

377777775

266666664

u1u2u3...

un�2un�1

377777775=

266666664

f(x1)� u�h2

f(x2)f(x3)...

f(xn�2)f(xn�1)� u�

h2

377777775:

esta última forma de expresar el sistema lineal algebraico asociado espreferible para evitar problemas numéricos al momento de resolver el

[email protected] 317 Antonio Carrillo Ledesma, Et alii

Page 320: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

sistema lineal por métodos iterativos (véase 6.6) principalmente cuandoh! 0:

3. Resolver el sistema lineal algebraico de ecuaciones Au = f (véase 6.6),obtenemos la solución aproximada en cada punto interior de la malla.La solución completa al problema la obtenemos al formar el vector�

u� u1 u2 u3 � � � un�2 un�1 u��:

Uno de los paquetes más conocidos y usados para el cálculo numéricoes MatLab95 el cual tiene un alto costo monetario para los usuarios. Porello, una opción es usar alternativas desarrolladas usando licencia de códigoabierto, un par de estos paquetes son: GNU OCTAVE96 y SCILAB97.

Octave corre gran parte del código desarrollado para MatLab sin requerircambio alguno, en cuanto a SCILAB es requerido hacer algunos ajustes enla codi�cación y ejecución. En los siguientes ejemplos98 se mostrará comoimplementar la solución computacional.

Ejemplo 4 Sea

�u00(x) = ��2 cos(�x); xi � x � xf; u(xi) = vi; u(xf) = vf

95MatLab es un programa comercial para el cálculo numérico el cual proveeun poderoso ambiente de cálculo para aplicaciones Cientí�cas y de Ingeniería[https://www.mathworks.com].96GNU OCTAVE es un programa open source para el cálculo numérico el cual

provee un poderoso ambiente de cálculo para aplicaciones Cientí�cas y de Ingeniería[http://www.gnu.org/software/octave].97SCILAB es un programa open source para el cálculo numérico el cual provee

un poderoso ambiente de cálculo para aplicaciones Cientí�cas y de Ingeniería[http://www.scilab.org].98Los ejemplos que se muestran en el presente texto se pueden descargar de la página

Web:

http://132.248.182.159/acl/MDF/

o desde GitHub (https://github.com/antoniocarrillo69/MDF) mediante

git clone git://github.com/antoniocarrillo69/MDF.git

[email protected] 318 Antonio Carrillo Ledesma, Et alii

Page 321: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

El programa queda implementado en OCTAVE (MatLab) como:function [A,b,x] = fdm1d(xi,xf,vi,vf,n)N=n-2; % Nodos interioresh=(xf-xi)/(n-1); % Incremento en la malla%A = sparse(N,N); % Matriz SPARSEA=zeros(N,N); % Matriz Ab=zeros(N,1); % Vector bR=1/(h^2);P=-2/(h^2);Q=1/(h^2);% Primer renglon de la matriz A y vector bA(1,1)=P;A(1,2)=Q;b(1)=LadoDerecho(xi)-vi*R;% Renglones intermedios de la matriz A y vector bfor i=2:N-1A(i,i-1)=R;A(i,i)=P;A(i,i+1)=Q;b(i)=LadoDerecho(xi+h*(i-1));

end% Renglon �nal de la matriz A y vector bA(N,N-1)=R;A(N,N)=P;b(N)=LadoDerecho(xi+h*N)-vf*Q;% Resuleve el sistema lineal Ax=bx=inv(A)*b;% Prepara la gra�cacionxx=zeros(n,1);zz=zeros(n,1);for i=1:nxx(i)=xi+h*(i-1);zz(i)=SolucionAnalitica(xx(i));

endyy=zeros(n,1);yy(1)=vi; % Condicion inicialfor i=1:Nyy(i+1)=x(i);

[email protected] 319 Antonio Carrillo Ledesma, Et alii

Page 322: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

endyy(n)=vf; % Condicion inicial% Gra�ca la solucion de la Ecuacion Diferencial Parcial en 1Dplot(xx,[yy,zz]);

endfunctionfunction y=LadoDerecho(x)y=-pi*pi*cos(pi*x);

endfunctionfunction y=SolucionAnalitica(x)y=cos(pi*x);

endfunction

Si el programa lo grabamos en el directorio de trabajo con el nombrefdm1d.m, entonces se puede ejecutar en la consola de OCTAVE (MatLab)mediante

[A; b; x] = fdm1d(�1; 2;�1; 1; 30);donde es necesario indicar el inicio (�1) y �n (2) del dominio, el valor dela condición de frontera de inicio (�1) y �n (1), además de el número denodos (30) en la partición. La ejecución genera la grá�ca de la solucióncalculada por el método de diferencias �nitas y la solución analítica en losmismos puntos de la malla, además devuelve la matriz99 y los vectores A; b; xgenerados por la función.

Algo más de Ecuaciones Diferenciales Parciales En la red existenmúltiples sitios especializados y una amplia bibliografía para conocer sobreEcuaciones Diferenciales Parciales, nosotros hemos seleccionado diversos tex-tos que ponemos a su disposición en:

http://132.248.182.159/acl/SD/EDP/

99En Octave (MatLab) se de�ne a una matriz mediante A = zeros(N,N), este tipo dematriz no es adecuada para nuestros �nes (véase capítulo 6.6). Para ahorrar espacio yacelerar los cálculos numéricos que se requieren para resolver el sistema lineal asociadousamos un tipo de matriz que no guarda valores innecesarios (ceros), esto se hace mediantela declaración de la matriz como A = sparse(N,N).

[email protected] 320 Antonio Carrillo Ledesma, Et alii

Page 323: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

7 El Cómputo en Paralelo

Los sistemas de cómputo con procesamiento en paralelo surgen de la necesi-dad de resolver problemas complejos en un tiempo razonable, utilizando lasventajas de memoria, velocidad de los procesadores, formas de interconexiónde estos y distribución de la tarea, a los que en su conjunto denominamos ar-quitectura en paralelo. Entenderemos por una arquitectura en paralelo a unconjunto de procesadores interconectados capaces de cooperar en la soluciónde un problema.Así, para resolver un problema en particular, se usa una arquitectura o

combinación de múltiples arquitecturas (topologías), ya que cada una ofreceventajas y desventajas que tienen que ser sopesadas antes de implementarla solución del problema en una arquitectura en particular. También esnecesario conocer los problemas a los que se enfrenta un desarrollador deprogramas que se desean correr en paralelo, como son: el partir e�cientementeun problema en múltiples tareas y como distribuir estas según la arquitecturaen particular con que se trabaje.

7.1 Arquitecturas de Software y Hardware

En esta sección se explican en detalle las dos clasi�caciones de computadorasmás conocidas en la actualidad. La primera clasi�cación, es la clasi�caciónclásica de Flynn en dónde se tienen en cuenta sistemas con uno o variosprocesadores, la segunda clasi�cación es moderna en la que sólo se tienen encuenta los sistemas con más de un procesador.El objetivo de esta sección es presentar de una forma clara los tipos de

clasi�cación que existen en la actualidad desde el punto de vista de distintosautores, así como cuáles son las ventajas e inconvenientes que cada uno os-tenta, ya que es común que al resolver un problema particular se usen una omás arquitecturas de Hardware interconectadas generalmente por red.

7.1.1 Clasi�cación de Flynn

Clasi�cación clásica de arquitecturas de computadoras que hace alusión asistemas con uno o varios procesadores, Michael J. Flynn la publicó porprimera vez en 1966 y por segunda vez en 1970.Esta taxonomía se basa en el �ujo que siguen los datos dentro de la

máquina y de las instrucciones sobre esos datos. Se de�ne como �ujo de

[email protected] 321 Antonio Carrillo Ledesma, Et alii

Page 324: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

instrucciones al conjunto de instrucciones secuenciales que son ejecutadaspor un único procesador y como �ujo de datos al �ujo secuencial de datosrequeridos por el �ujo de instrucciones.Con estas consideraciones, Flynn clasi�ca los sistemas en cuatro cate-

gorías:

Single Instruction stream, Single Data stream (SISD) Los sistemasMonoprocesador de este tipo se caracterizan por tener un único �ujo de ins-trucciones sobre un único �ujo de datos, es decir, se ejecuta una instruccióndetrás de otra. Este es el concepto de arquitectura serie de Von Neumanndonde, en cualquier momento, sólo se ejecuta una única instrucción, un ejem-plo de estos sistemas son las máquinas secuenciales convencionales.

Figura 3: Ejemplo de máquina SISD

Single Instruction stream, Multiple Data stream (SIMD) Estos sis-temas de procesador Maticial tienen un único �ujo de instrucciones que ope-ran sobre múltiples �ujos de datos. Ejemplos de estos sistemas los tenemosen las máquinas vectoriales con Hardware escalar y vectorial.El procesamiento es síncrono, la ejecución de las instrucciones sigue siendo

secuencial como en el caso anterior, todos los elementos realizan una mismainstrucción pero sobre una gran cantidad de datos. Por este motivo exis-tirá concurrencia de operación, es decir, esta clasi�cación es el origen de lamáquina paralela.El funcionamiento de este tipo de sistemas es el siguiente. La unidad

de control manda una misma instrucción a todas las unidades de proceso(ALUs). Las unidades de proceso operan sobre datos diferentes pero con lamisma instrucción recibida.

[email protected] 322 Antonio Carrillo Ledesma, Et alii

Page 325: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Figura 4: Ejemplo de máquina SIMD

Existen dos alternativas distintas que aparecen después de realizarse estaclasi�cación:

� Arquitectura Vectorial con segmentación, una CPU única particionadaen unidades funcionales independientes trabajando sobre �ujos de datosconcretos.

� Arquitectura Matricial (matriz de procesadores), varias ALUs idénticasa las que el procesador da instrucciones, asigna una única instrucciónpero trabajando sobre diferentes partes del programa.

Multiple Instruction stream, Single Data stream (MISD) Sistemascon múltiples instrucciones Array Sistólico que operan sobre un único �ujode datos. Este tipo de sistemas no ha tenido implementación hasta hace pocotiempo.Los sistemas MISD se contemplan de dos maneras distintas:

� Varias instrucciones operando simultáneamente sobre un único dato.

� Varias instrucciones operando sobre un dato que se va convirtiendo enun resultado que será la entrada para la siguiente etapa. Se trabaja deforma segmentada, todas las unidades de proceso pueden trabajar deforma concurrente.

[email protected] 323 Antonio Carrillo Ledesma, Et alii

Page 326: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Figura 5: Ejemplo de máquina MISD

Multiple Instruction stream, Multiple Data stream (MIMD) Sis-temas con un �ujo de múltiples instrucciones Multiprocesador que operansobre múltiples datos. Estos sistemas empezaron a utilizarse antes de la dé-cada de los 80s. Son sistemas con memoria compartida que permiten ejecutarvarios procesos simultáneamente (sistema multiprocesador).

Figura 6: Ejemplo de máquina MIMD

Cuando las unidades de proceso reciben datos de una memoria no com-partida estos sistemas reciben el nombre de MULTIPLE SISD (MSISD). Enarquitecturas con varias unidades de control (MISD Y MIMD), existe otronivel superior con una unidad de control que se encarga de controlar todas las

[email protected] 324 Antonio Carrillo Ledesma, Et alii

Page 327: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

unidades de control del sistema � ejemplo de estos sistemas son las máquinasparalelas actuales� .

7.2 Categorías de Computadoras Paralelas

Clasi�cación moderna que hace alusión única y exclusivamente a los sistemasque tienen más de un procesador (i.e máquinas paralelas). Existen dos tiposde sistemas teniendo en cuenta su acoplamiento:

� Los sistemas fuertemente acoplados son aquellos en los que los proce-sadores dependen unos de otros.

� Los sistemas débilmente acoplados son aquellos en los que existe pocainteracción entre los diferentes procesadores que forman el sistema.

Atendiendo a esta y a otras características, la clasi�cación moderna dividea los sistemas en dos tipos: Sistemas multiprocesador (fuertemente acopla-dos) y sistemas multicomputadoras (débilmente acoplados).

7.2.1 Equipo Paralelo de Memoria Compartida

Un multiprocesador puede verse como una computadora paralela compuestapor varios procesadores interconectados que comparten un mismo sistema dememoria.Los sistemas multiprocesadores son arquitecturas MIMD con memoria

compartida. Tienen un único espacio de direcciones para todos los proce-sadores y los mecanismos de comunicación se basan en el paso de mensajesdesde el punto de vista del programador.Dado que los multiprocesadores comparten diferentes módulos de memo-

ria, pueden acceder a un mismo módulo varios procesadores, a los multi-procesadores también se les llama sistemas de memoria compartida.Para hacer uso de la memoria compartida por más de un procesador,

se requiere hacer uso de técnicas de semáforos que mantienen la integridadde la memoria; esta arquitectura no puede crecer mucho en el número deprocesadores interconectados por la saturación rápida del bus o del medio deinterconexión.Dependiendo de la forma en que los procesadores comparten la memoria,

se clasi�can en sistemas multiprocesador UMA, NUMA, COMA y Pipeline,que explicamos a continuación:

[email protected] 325 Antonio Carrillo Ledesma, Et alii

Page 328: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Figura 7: Arquitectura de una computadora paralela con memoria compar-tida

Uniform Memory Access (UMA) Sistema multiprocesador con ac-ceso uniforme a memoria. La memoria física es uniformemente compartidapor todos los procesadores, esto quiere decir que todos los procesadores tienenel mismo tiempo de acceso a todas las palabras de la memoria. Cada proce-sador tiene su propia caché privada y también se comparten los periféricos.

Figura 8: Acceso Uniforme a la memoria UMA

Los multiprocesadores son sistemas fuertemente acoplados (tightly-coupled),dado el alto grado de compartición de los recursos (Hardware o Software) yel alto nivel de interacción entre procesadores, lo que hace que un procesadordependa de lo que hace otro.El sistema de interconexión debe ser rápido y puede ser de uno de los

siguientes tipos: bus común, red Crossbar100 y red Multietapa. Este modeloes conveniente para aplicaciones de propósito general y de tiempo compartidopor varios usuarios, existen dos categorías de sistemas UMA.

� Sistema Simétrico

Cuando todos los procesadores tienen el mismo tiempo de accesoa todos los componentes del sistema (incluidos los periféricos),

100Red recon�gurable que permite la conexión de cada entrada con cualquiera de lassalidas, es decir, permite cualquier permutación.

[email protected] 326 Antonio Carrillo Ledesma, Et alii

Page 329: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

reciben el nombre de sistemas multiprocesador simétrico. Losprocesadores tienen el mismo dominio (prioridad) sobre los pe-riféricos y cada procesador tiene la misma capacidad para proce-sar.

� Sistema Asimétrico

Los sistemas multiprocesador asimétrico, son sistemas con proce-sadores maestros y procesadores esclavos, en donde sólo los primerospueden ejecutar aplicaciones y dónde en tiempo de acceso paradiferentes procesadores no es el mismo. Los procesadores esclavos(attached) ejecutan código usuario bajo la supervisión del maes-tro, por lo tanto cuando una aplicación es ejecutada en un proce-sador maestro dispondrá de una cierta prioridad.

Non Uniform Memory Access (NUMA) Un sistema multiproce-sador NUMA es un sistema de memoria compartida donde el tiempo deacceso varía según donde se encuentre localizado el acceso.

Figura 9: Acceso no uniforme a la memoria NUMA

El acceso a memoria, por tanto, no es uniforme para diferentes proce-sadores, existen memorias locales asociadas a cada procesador y estos puedenacceder a datos de su memoria local de una manera más rápida que a lasmemorias de otros procesadores, debido a que primero debe aceptarse dichoacceso por el procesador del que depende el módulo de memoria local.Todas las memorias locales conforman la memoria global compartida y

físicamente distribuida y accesible por todos los procesadores.

[email protected] 327 Antonio Carrillo Ledesma, Et alii

Page 330: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Cache Only Memory Access (COMA) Los sistemas COMA sonun caso especial de los sistemas NUMA. Este tipo de sistemas no ha tenidomucha trascendencia, al igual que los sistemas SIMD.Las memorias distribuidas son memorias cachés, por este motivo es un

sistema muy restringido en cuanto a la capacidad de memoria global. No hayjerarquía de memoria en cada módulo procesador. Todas las cachés formanun mismo espacio global de direcciones. El acceso a las cachés remotas serealiza a través de los directorios distribuidos de las cachés.Dependiendo de la red de interconexión utilizada, se pueden utilizar je-

rarquías en los directorios para ayudar a la localización de copias de bloquesde caché.

Figura 10: Ejemplo de COMA

Procesador Vectorial Pipeline En la actualidad es común encon-trar en un solo procesador los denominados Pipeline o Procesador VectorialPipeline del tipo MISD. En estos procesadores los vectores �uyen a través delas unidades aritméticas Pipeline.Las unidades constan de una cascada de etapas de procesamiento com-

puestas de circuitos que efectúan operaciones aritméticas o lógicas sobre el�ujo de datos que pasan a través de ellas, las etapas estan separadas porregistros de alta velocidad usados para guardar resultados intermedios. Asíla información que �uye entre las etapas adyacentes esta bajo el control deun reloj que se aplica a todos los registros simultáneamente.

7.2.2 Equipo Paralelo de Memoria Distribuida

Los sistemas multicomputadoras se pueden ver como una computadora paralelaen el cual cada procesador tiene su propia memoria local. En estos sistemas

[email protected] 328 Antonio Carrillo Ledesma, Et alii

Page 331: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

la memoria se encuentra distribuida y no compartida como en los sistemasmultiprocesador. Los procesadores se comunican a través de paso de men-sajes, ya que éstos sólo tienen acceso directo a su memoria local y no a lasmemorias del resto de los procesadores.

Figura 11: Arquitectura de una computadora paralela con memoria dis-tribuida

La transferencia de los datos se realiza a través de la red de interconexiónque conecta un subconjunto de procesadores con otro subconjunto. La trans-ferencia de unos procesadores a otros se realiza por múltiples transferenciasentre procesadores conectados dependiendo del establecimiento de dicha red.Dado que la memoria esta distribuida entre los diferentes elementos de

proceso, estos sistemas reciben el nombre de distribuidos. Por otra parte,estos sistemas son débilmente acoplados, ya que los módulos funcionan deforma casi independiente unos de otros. Este tipo de memoria distribuida esde acceso lento por ser peticiones a través de la red, pero es una forma muyefectiva de tener acceso a un gran volumen de memoria.

7.2.3 Equipo Paralelo de Memoria Compartida-Distribuida

La tendencia actual en las máquinas paralelas es de aprovechar las facili-dades de programación que ofrecen los ambientes de memoria compartida yla escalabilidad de los ambientes de memoria distribuida. En este modelo seconectan entre sí módulos de multiprocesadores, pero se mantiene la visiónglobal de la memoria a pesar de que es distribuida.

[email protected] 329 Antonio Carrillo Ledesma, Et alii

Page 332: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Clusters El desarrollo de sistemas operativos y compiladores del do-minio público (Linux y Software GNU), estándares para interfaz de pasode mensajes (Message Passing Interface MPI), conexión universal a periféri-cos (Periferial Component Interconnect PCI), entre otros, han hecho posibletomar ventaja de los recursos económicos computacionales de producciónmasiva (procesadores, discos, redes).La principal desventaja que presenta a los proveedores de multicomputa-

doras es que deben satisfacer una amplia gama de usuarios, es decir, debenser generales. Esto aumenta los costos de diseños y producción de equipos, asícomo los costos de desarrollo de Software que va con ellos: sistema operativo,compiladores y aplicaciones. Todos estos costos deben ser añadidos cuandose hace una venta. Por supuesto alguien que sólo necesita procesadores y unmecanismo de pase de mensajes no debería pagar por todos estos añadidosque nunca usará. Estos usuarios son los que estan impulsando el uso de Clus-ters principalmente de computadoras personales (PC), cuya arquitectura semuestra a continuación:

Figura 12: Arquitectura de un cluster

Los Cluster se pueden clasi�car en dos tipos según sus característicasfísicas:

� Cluster homogéneo: si todos los procesadores y/o nodos participantesen el equipo paralelo son iguales en capacidad de cómputo � en lacual es permitido variar la cantidad de memoria o disco duro en cadaprocesador�

� Cluster heterogéneo: es aquel en que al menos uno de los procesadoresy/o nodos participantes en el equipo paralelo son de distinta capacidadde cómputo

[email protected] 330 Antonio Carrillo Ledesma, Et alii

Page 333: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Los Clusters pueden formarse de diversos equipos; los más comunes son losde computadoras personales, pero es creciente el uso de computadoras multi-procesador de más de un procesador de memoria compartida interconectadospor red con los demás nodos del mismo tipo, incluso el uso de computadorasmultiprocesador de procesadores vectoriales Pipeline. Los Clusters armadoscon la con�guración anterior tienen grandes ventajas para procesamientoparalelo:

� La reciente explosión en redes implica que la mayoría de loscomponentes necesarios para construir un Cluster son vendidosen altos volúmenes y por lo tanto son económicos. Ahorros adi-cionales se pueden obtener debido a que sólo se necesitará unatarjeta de vídeo, un monitor y un teclado por Cluster. El mer-cado de los multiprocesadores es más reducido y más costoso

� El remplazar un componente defectuoso en un Cluster es rela-tivamente trivial comparado con hacerlo en un multiprocesador,permitiendo una mayor disponibilidad de Clusters cuidadosamentediseñados

Desventajas del uso de Clusters de computadoras personales para proce-samiento paralelo:

� Con raras excepciones, los equipos de redes generales produci-dos masivamente no estan diseñados para procesamiento paraleloy típicamente su latencia es alta y los anchos de banda pequeñoscomparados con multiprocesadores. Dado que los Clusters ex-plotan tecnología que sea económica, los enlaces en el sistema noson veloces implicando que la comunicación entre componentesdebe pasar por un proceso de protocolos de negociación lentos,incrementando seriamente la latencia. En muchos y en el mejorde los casos (debido a costos) se recurre a una red tipo Fast Ether-net restringimiento la escalabilidad del Cluster

� Hay poco soporte de Software para manejar un Cluster comoun sistema integrado

� Los procesadores no son tan e�cientes como los procesadoresusados en los multiprocesadores para manejar múltiples usuariosy/o procesos. Esto hace que el rendimiento de los Clusters sedegrade con relativamente pocos usuarios y/o procesos

[email protected] 331 Antonio Carrillo Ledesma, Et alii

Page 334: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Muchas aplicaciones importantes disponibles en multiproce-sadores y optimizadas para ciertas arquitecturas, no lo estan enClusters

Sin lugar a duda los Clusters presentan una alternativa importante paravarios problemas particulares, no sólo por su economía, si no también porquepueden ser diseñados y ajustados para ciertas aplicaciones. Las aplicacionesque pueden sacar provecho de Clusters son en donde el grado de comunicaciónentre procesos es de bajo a medio.

Tipos de Cluster Básicamente existen tres tipo de Clusters, cada unode ellos ofrece ventajas y desventajas, el tipo más adecuado para el cómputocientí�co es del de alto-rendimiento, pero existen aplicaciones cientí�cas quepueden usar más de un tipo al mismo tiempo.

� Alta disponibilidad (Fail-over o High-Availability): este tipode Cluster esta diseñado para mantener uno o varios serviciosdisponibles incluso a costa de rendimiento, ya que su funciónprincipal es que el servicio jamás tenga interrupciones como porejemplo un servicio de bases de datos de transacciones bancarias

� Alto rendimiento (HPC o High Performance Computing): estetipo de Cluster esta diseñado para obtener el máximo rendimientode la aplicación utilizada incluso a costa de la disponibilidad delsistema, es decir el Cluster puede sufrir caídas, este tipo de con�-guración esta orientada a procesos que requieran mucha capaci-dad de cálculo.

� Balanceo de Carga (Load-balancing): este tipo de Cluster estadiseñado para balancear la carga de trabajo entre varios servi-dores, lo que permite tener, por ejemplo, un servicio de cálculointensivo multiusuarios que detecte tiempos muertos del procesode un usuario para ejecutar en dichos tiempos procesos de otrosusuarios.

Grids Son cúmulos (grupo de Clusters) de arquitecturas en paralelointerconectados por red, los cuales distribuyen tareas entre los Clusters quelo forman, estos pueden ser homogéneos o heterogéneos en cuanto a los no-dos componentes del cúmulo. Este tipo de arquitecturas trata de distribuir

[email protected] 332 Antonio Carrillo Ledesma, Et alii

Page 335: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

cargas de trabajo acorde a las características internas de cada Cluster y lasnecesidades propias de cada problema, esto se hace a dos niveles, una en laparte de programación en conjunto con el balance de cargas y otra en la partede Hardware que tiene que ver con las características de cada arquitecturaque conforman al cúmulo.

7.2.4 Cómputo Paralelo en Multihilos

En una computadora, sea secuencial o paralela, para aprovechar las capaci-dades crecientes del procesador, el sistema operativo divide su tiempo deprocesamiento entre los distintos procesos, de forma tal que para poder eje-cutar a un proceso, el kernel les asigna a cada uno una prioridad y con ellouna fracción del tiempo total de procesamiento, de forma tal que se puedaatender a todos y cada uno de los procesos de manera e�ciente.En particular, en la programación en paralelo usando MPI, cada proceso

� que eventualmente puede estar en distinto procesador� se lanza como unacopia del programa con datos privados y un identi�cador del proceso único,de tal forma que cada proceso sólo puede compartir datos con otro procesomediante paso de mensajes.Esta forma de lanzar procesos por cada tarea que se desee hacer en

paralelo es costosa, por llevar cada una de ellas toda una gama de sub-procesos para poderle asignar recursos por parte del sistema operativo. Unaforma más e�ciente de hacerlo es que un proceso pueda generar bloques desubprocesos que puedan ser ejecutados como parte del proceso (como subta-reas), así en el tiempo asignado se pueden atender a más de un subprocesode manera más e�ciente, esto es conocido como programación multihilos.Los hilos realizarán las distintas tareas necesarias en un proceso. Para ha-

cer que los procesos funcionen de esta manera, se utilizan distintas técnicasque le indican al kernel cuales son las partes del proceso que pueden ejecutarsesimultáneamente y el procesador asignará una fracción de tiempo exclusivoal hilo del tiempo total asignado al proceso.Los datos pertenecientes al proceso pasan a ser compartidos por los sub-

procesos lanzados en cada hilo y mediante una técnica de semáforos el kernelmantiene la integridad de estos. Esta técnica de programación puede sermuy e�ciente si no se abusa de este recurso, permitiendo un nivel más deparalelización en cada procesador. Esta forma de paralelización no es exclu-siva de equipos multiprocesadores o multicomputadoras, ya que pueden serimplementados a nivel de sistema operativo.

[email protected] 333 Antonio Carrillo Ledesma, Et alii

Page 336: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

7.2.5 Cómputo Paralelo en CUDA

Son las siglas de arquitectura uni�cada de dispositivos de cómputo (ComputeUni�ed Device Architecture CUDA) que hace referencia a una plataformade computación en paralelo incluyendo un compilador y un conjunto de he-rramientas de desarrollo que permiten a los programadores usar una variacióndel lenguaje de programación C � Por medio de Wrappers se puede usarPython, Fortran y Java en vez de C/C++� para codi�car algoritmos en lasunidades de procesamiento de grá�cos (Graphics Processing Unit GPU).CUDA intenta explotar las ventajas de las GPU frente a las CPU de

propósito general utilizando el paralelismo que ofrecen sus múltiples núcleos,que permiten el lanzamiento de un altísimo número de hilos simultáneos.Por ello, si una aplicación está diseñada utilizando numerosos hilos que rea-lizan tareas independientes (que es lo que hacen las GPU al procesar grá�-cos, su tarea natural). Ahora, miles de desarrolladores, cientí�cos e inves-tigadores están encontrando innumerables aplicaciones prácticas para estatecnología en campos como el procesamiento de vídeo e imágenes, la biologíay la química computacional, la simulación de la dinámica de �uidos, la recon-strucción de imágenes de Tomografía Axial Computarizada TAC, el análisissísmico o el trazado de rayos, entre otros.

Procesamiento paralelo con CUDA Los sistemas informáticos es-tán pasando de realizar el «procesamiento central» en la CPU a realizar«coprocesamiento» repartido entre la CPU y la GPU. Para posibilitar estenuevo paradigma computacional, NVIDIA ha inventado la arquitectura decálculo paralelo CUDA, que ahora se incluye en las GPUs GeForce, IONQuadro y Tesla GPUs, lo cual representa una base instalada considerablepara los desarrolladores de aplicaciones.CUDA ha sido recibida con entusiasmo por la comunidad cientí�ca. Por

ejemplo, se está utilizando para acelerar AMBER, un simulador de dinámicamolecular empleado por más de 60.000 investigadores del ámbito académicoy farmacéutico de todo el mundo para acelerar el descubrimiento de nuevosmedicamentos. En el mercado �nanciero, Numerix y CompatibL introdu-jeron soporte de CUDA para una nueva aplicación de cálculo de riesgo decontraparte y, como resultado, se ha multiplicado por 18 la velocidad dela aplicación. Cerca de 400 instituciones �nancieras utilizan Numerix en laactualidad.Un buen indicador de la excelente acogida de CUDA es la rápida adopción

[email protected] 334 Antonio Carrillo Ledesma, Et alii

Page 337: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

de la GPU Tesla para aplicaciones de GPU Computing. En la actualidadexisten más de 700 Clusters de GPUs instalados en compañías publicadas enFortune 500 de todo el mundo, lo que incluye empresas como Schlumbergery Chevron en el sector energético o BNP Pariba en el sector bancario.Por otra parte, la reciente llegada de los últimos sistemas operativos de

Microsoft y Apple está convirtiendo el GPU Computing en una tecnologíade uso masivo. En estos nuevos sistemas, la GPU no actúa únicamentecomo procesador grá�co, sino como procesador paralelo de propósito generalaccesible para cualquier aplicación.

Plataforma de Cálculo Paralelo CUDA proporciona unas cuan-tas extensiones de C y C++ que permiten implementar el paralelismo enel procesamiento de tareas y datos con diferentes niveles de granularidad.El programador puede expresar ese paralelismo mediante diferentes lengua-jes de alto nivel como C, C++ y Fortran o mediante estándares abiertoscomo las directivas de OpenACC � que es un estándar de programaciónpara el cómputo en paralelo desarrollado por Cray, CAPS, Nvidia y PGIdiseñado para simpli�car la programación paralela de sistemas heterogéneosde CPU/GPU� . En la actualidad, la plataforma CUDA se utiliza en milesde aplicaciones aceleradas en la GPU y en miles de artículos de investigaciónpublicados, en las áreas de:

� Bioinformática

� Cálculo �nanciero

� Dinámica de �uidos computacional (CFD)

� Ciencia de los datos, analítica y bases de datos

� Defensa e Inteligencia

� Procesamiento de imágenes y visión computarizadas

� EDA (diseño automatizado)

� Aprendizaje automático

� Ciencia de los materiales

� Medios audiovisuales y entretenimiento

[email protected] 335 Antonio Carrillo Ledesma, Et alii

Page 338: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Imágenes médicas

� Dinámica molecular

� Análisis numérico

� Física

� Química cuántica

� Exploración sísmica

� Mecánica estructural computacional

� Visualización e interacción de proteínas

� Modelos meteorológicos y climáticos

Librerías aceleradas en la GPU:

� Thrust C++ Template

� cuBLAS

� cuSPARSE

� NPP

� cuFFT

Lenguajes de programación:

� CUDA C/C++

� CUDA Fortran

� Python

� .NET

[email protected] 336 Antonio Carrillo Ledesma, Et alii

Page 339: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Compiladores disponibles:

� OpenACC, paraleliza automáticamente los bucles de código Fortran oC utilizando directivas

� Compilador de autoparalelización de C y Fortran (de PGI) para CUDAC

� Compilador de autoparalelización HMPP de CAPS para CUDA Cbasado en C y Fortran

� Fortran

� Compilador de Fortran para CUDA de PGI

� Traductor de Fortran a C para CUDA

� FLAGON: librería de Fortran 95 para cálculo en la GPU

� Interfaz (Wrapper) de Python para CUDA: PyCUDA

� Wrapper de Java

� jCUDA: Java para CUDA

� Vínculos para las librerías BLAS y FFT de CUDA

� JaCUDA

� Integración de .NET para CUDA

� Thrust: librería de plantillas de C++ para CUDA

� CuPP : infraestructura de C++ para CUDA

� Libra: capa de abstracción de C/C++ para CUDA

� F# para CUDA

� Librería ArrayFire para acelerar el desarrollo de aplicaciones de GPUComputing en C, C++, Fortran y Python

[email protected] 337 Antonio Carrillo Ledesma, Et alii

Page 340: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Soporte de MATLAB, Mathematica, R, LabView:

� MATLAB

� MathWorks: Librerías MATLAB procesadas con GPUs NVIDIA

� Plugin Jacket basado en CUDA para MATLAB

� GPULib: librería de funciones matemáticas con vínculos para IDL yMATLAB

� Mathematica

� Programación con CUDA en Mathematica de Wolfram

� Plugin de Mathematica para CUDA

� Habilitación del GPU Computing en el entorno estadístico de R

� Librería CUDA para LabVIEW de National Instruments

� Formas de usar CUDA desde LabVIEW CVI

Además existen herramientas de productividad y clúster:

� Soporte de Eclipse para CUDA

� CUDA Occupancy Calculator

� Administrador de Clusters de cálculo para GPUs Tesla

� PBS Works para GPUs Tesla

� Scyld de Penguin Computing

[email protected] 338 Antonio Carrillo Ledesma, Et alii

Page 341: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

7.3 Escalabilidad

Se entiende por escalabilidad a la capacidad de adaptación y respuesta deun sistema con respecto al rendimiento del mismo a medida que aumentande forma signi�cativa la carga computacional del mismo. Aunque parezcaun concepto claro, la escalabilidad de un sistema es un aspecto complejo eimportante del diseño.La escalabilidad esta íntimamente ligada al diseño del sistema. In�uye en

el rendimiento de forma signi�cativa. Si una aplicación esta bien diseñada,la escalabilidad no constituye un problema. Analizando la escalabilidad, sededuce de la implementación y del diseño general del sistema. No es atributodel sistema con�gurable.La escalabilidad supone un factor crítico en el crecimiento de un sistema.

Si un sistema tiene como objetivo crecer la carga computacional � en elnúmero de usuarios o procesos� manteniendo su rendimiento actual, tieneque evaluar dos posibles opciones:

� Con un Hardware de mayor potencia o

� Con una mejor combinación de Hardware y Software

Se pueden distinguir dos tipos de escalabilidad, vertical y horizontal:

� El escalar verticalmente o escalar hacia arriba, signi�ca el añadir másrecursos a un solo nodo en particular dentro de un sistema, tal como elañadir memoria o un disco duro más rápido a una computadora.

� La escalabilidad horizontal, signi�ca agregar más nodos a un sistema,tal como añadir una computadora nueva a un programa de aplicaciónpara espejo.

Escalabilidad Vertical El escalar hacia arriba de un sistema viene a sig-ni�car una migración de todo el sistema a un nuevo Hardware que es máspotente y e�caz que el actual. Una vez se ha con�gurado el sistema futuro,se realizan una serie de validaciones y copias de seguridad y se pone en fun-cionamiento. Las aplicaciones que esten funcionando bajo la arquitecturaHardware antigua no sufren con la migración, el impacto en el código esmínimo.Este modelo de escalabilidad tiene un aspecto negativo. Al aumentar

la potencia en base a ampliaciones de Hardware, llegara un momento que

[email protected] 339 Antonio Carrillo Ledesma, Et alii

Page 342: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

existirá algún tipo de limitación de Hardware. Además a medida que se in-vierte en Hardware de muy altas prestaciones, los costos se disparan tantode forma temporal � ya que si se ha llegado al umbral máximo, hay com-ponentes de Hardware que tardan mucho tiempo en ampliar su potencia deforma signi�cativa� como económicos. Sin embargo a nivel estructural nosupone ninguna modi�cación reseñable, lo que la convierte en una buenaopción si los costos anteriores son asumibles.

Escalabilidad Horizontal La escalabilidad horizontal consiste en poten-ciar el rendimiento del sistema desde un aspecto de mejora global, a diferenciade aumentar la potencia de una única parte del mismo. Este tipo de esca-labilidad se basa en la modularidad de su funcionalidad. Por ello suele estarconformado por una agrupación de equipos que dan soporte a la funcionalidadcompleta. Normalmente, en una escalabilidad horizontal se añaden equipospara dar mas potencia a la red de trabajo.Con un entorno de este tipo, es lógico pensar que la potencia de proce-

samiento es directamente proporcional al número de equipos de la red. Eltotal de la potencia de procesamiento es la suma de la velocidad física decada equipo transferida por la partición de aplicaciones y datos extendida através de los nodos.Si se aplica un modelo de escalabilidad basado en la horizontalidad, no

existen limitaciones de crecimiento a priori. Como principal defecto, estemodelo de escalabilidad supone una gran modi�cación en el diseño, lo queconlleva a una gran trabajo de diseño y reimplantación. Si la lógica se haconcebido para un único servidor, es probable que se tenga que estructurarel modelo arquitectónico para soportar este modelo de escalabilidad.El encargado de como realizar el modelo de partición de datos en los

diferentes equipos es el desarrollador. Existen dependencias en el accesoa la aplicación. Es conveniente, realizar una análisis de actividad de losusuarios para ir ajustando el funcionamiento del sistema. Con este modelode escalabilidad, se dispone de un sistema al que se pueden agregar recursosde manera casi in�nita y adaptable al crecimiento de cargas de trabajo ynuevos usuarios.La escalabilidad cuenta como factor crítico en el crecimiento de usua-

rios. Es mucho más sencillo diseñar un sistema con un número constante deusuarios � por muy alto que sea este� que diseñar un sistema con un númerocreciente y variable de usuarios. El crecimiento relativo de los números es

[email protected] 340 Antonio Carrillo Ledesma, Et alii

Page 343: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

mucho más importante que los números absolutos.

Balance de carga A la hora de diseñar un sistema con compartición derecursos, es necesario considerar como balancear la carga de trabajo. Se en-tiende este concepto, como la técnica usada para dividir el trabajo a compar-tir entre varios procesos, ordenadores, u otros recursos. Esta muy relacionadacon lo sistemas multiprocesales, que trabajan o pueden trabajar con mas deuna unidad para llevar a cabo su funcionalidad. Para evitar los cuellos debotella, el balance de la carga de trabajo se reparte de forma equitativa através de un algoritmo que estudia las peticiones del sistema y las redirec-ciona a la mejor opción.

Balance de Carga por Hardware Presenta las siguientes características:

� A partir de un algoritmo de plani�cación de procesos � Round Robin,LRU� , examina las peticiones HTTP entrantes y selecciona el másapropiado entre los distintos clones del sistema

� La selección del clon del sistema esta basada en el algoritmo de susti-tución y es aleatoria

� Esto último punto provoca problemas en el diseño, ya que no garantizaque si un usuario realiza varias peticiones sean atendidas por el mismoclon del sistema. Por lo tanto, no hay mantenimiento de la sesión delusuario en servidor y condiciona el diseño

� La sesión debe de ser mantenida por el desarrollador

� Al ser un proceso de Hardware, es muy rápido

Balance de carga por Sotfware Presenta las siguientes características:

� Examinan el paquete a nivel del protocolo HTTP para garantizar elmantenimiento de la sesión de usuario

� Distintas peticiones del mismo usuario son servidas por el mismo clondel servidor

� Más lentos que los balanceadores de Hardware

� Normalmente son soluciones baratas

[email protected] 341 Antonio Carrillo Ledesma, Et alii

Page 344: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Cluster sobre servidores El concepto de Clustering introduce la capaci-dad de unir varios servidores para que trabajen en un entorno en paralelo.Es decir, trabajar como si fuera un solo servidor el existente. En las etapasprimigenias del Clustering, los diseños presentaban graves problemas que sehan ido subsanando con la evolución de este campo. Actualmente se puedencrear Clusters en función de las necesidades

� Unión de Hardware

� Clusters de Software

� Alto rendimiento de bases de datos

En resumen, Cluster es un grupo de múltiples ordenadores unidos median-te una red de alta velocidad, de tal forma que el conjunto es visto comoun único equipo, más potente. Con ello se pretende mejorar los siguientesparámetros de la arquitectura:

� Alto rendimiento

� Alta disponibilidad

� Equilibrio de carga

� Escalabilidad

El Clustering no presenta dependencias a nivel de Hardware (no todos losequipos necesitan el mismo Hardware) ni a nivel de Software (no necesitanel mismo sistema operativo). Este tipo de sistemas disponen de una interfazque permite dirigir el comportamiento de los Clusters. Dicha interfaz es laencargada de la interacción con usuarios y procesos, realizando la división dela carga entre los diversos servidores que compongan el Cluster.

Tipos de Cluster

Cluster Balanceado Este tipo de Cluster es capaz de repartir el trá�coentrante entre múltiples servidores corriendo las mismas aplicaciones. Todoslos nodos del Cluster pueden aceptar y responder peticiones. Si un nodofalla, el trá�co se sigue repartiendo entre los nodos restantes.

[email protected] 342 Antonio Carrillo Ledesma, Et alii

Page 345: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Alta Disponibilidad Enfocados a garantizar un servicio ininterrumpido,al duplicar toda la infraestructura e introducir sistemas de detección y reen-rutamiento, en caso de fallo. El propósito de este tipo de Clusters es garanti-zar que si un nodo falla, los servicios y aplicaciones que estaban corriendo enese nodo, sean trasladados de forma automática a un nodo que se encuentraen Stand-by. Este tipo de Cluster dispone de herramientas con capacidadpara monitorizar los servidores o servicios caídos y automáticamente migrar-los a un nodo secundario para garantizar la disponibilidad del servicio. Losdatos son replicados de forma periódica, o de ser posible en tiempo real, alos nodos en Stand-by.

7.4 Métricas de Desempeño

Las métricas de desempeño del procesamiento de alguna tarea en paraleloes un factor importante para medir la e�ciencia y consumo de recursos alresolver una tarea con un número determinado de procesadores y recursosrelacionados de la interconexión de éstos.Entre las métricas para medir desempeño en las cuales como premisa se

mantiene �jo el tamaño del problema, destacan las siguientes: Factor de ace-leración, e�ciencia y fracción serial. Cada una de ellas mide algo en particulary sólo la combinación de estas dan un panorama general del desempeño delprocesamiento en paralelo de un problema en particular en una arquitecturadeterminada al ser comparada con otras.

Factor de Aceleración (o Speed-Up) Se de�ne como el cociente deltiempo que se tarda en completar el cómputo de la tarea usando un sóloprocesador entre el tiempo que necesita para realizarlo en p procesadorestrabajando en paralelo:

s =T (1)

T (p)(7.1)

se asume que se usará el mejor algoritmo tanto para un solo procesador comopara p procesadores.Esta métrica en el caso ideal debería de aumentar de forma lineal al

aumento del número de procesadores.

E�ciencia Se de�ne como el cociente del tiempo que se tarda en comple-tar el cómputo de la tarea usando un solo procesador entre el número de

[email protected] 343 Antonio Carrillo Ledesma, Et alii

Page 346: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

procesadores multiplicado por el tiempo que necesita para realizarlo en pprocesadores trabajando en paralelo:

e =T (1)

pT (p)=s

p: (7.2)

Este valor será cercano a la unidad cuando el Hardware se este usandode manera e�ciente, en caso contrario el Hardware será desaprovechado.

Fracción serial Se de�ne como el cociente del tiempo que se tarda encompletar el cómputo de la parte secuencial de una tarea entre el tiempo quese tarda el completar el cómputo de la tarea usando un solo procesador:

f =TsT (1)

(7.3)

pero usando la ley de Amdahl:

T (p) = Ts +Tpp

y reescribiéndola en términos de factor de aceleración, obtenemos la formaoperativa del cálculo de la fracción serial que adquiere la forma siguiente:

f =

1s� 1

p

1� 1p

: (7.4)

Esta métrica permite ver las inconsistencias en el balance de cargas, yaque su valor debierá de tender a cero en el caso ideal, por ello un incrementoen el valor de f es un aviso de granularidad �na con la correspondientesobrecarga en los procesos de comunicación.

Costo o Trabajo Se de�ne el costo o trabajo de resolver un problema enparalelo como el producto del tiempo de cálculo en paralelo Tp por el númerode procesadores usando p y se representa por:

Cp = p � Tp:

[email protected] 344 Antonio Carrillo Ledesma, Et alii

Page 347: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Aceleración y E�ciencia Relativa Cuando se trabaja en más de unequipo paralelo � supongamos con p y p0 procesadores con p � p0� es comúncomparar el desempeño entre dichos equipos. Para ello se de�ne la aceleraciónrelativa como:

Sp0

p =Tp0

Tp

para p � p0, en la cual se espera que:

Sp0

p 'p

p0

y e�ciencia relativa como:

Ep0

p =p0

pSp

0

p =p0

p

Tp0

Tp:

Análisis de Rendimiento Usando Métricas Suponiendo un Clustercon 17 Cores o núcleos101, se muestran una ejempli�cación de las métricaspara un problema de ejemplo:

Cores Tiempo Aceleración E�ciencia Frac. Ser.1 52953 2538 2.08 0.69 0.2185 1391 3.80 0.76 0.0789 804 6.58 0.73 0.04517 441 12.00 0.70 0.025

Nótese que en todos los casos la fracción serial disminuye sustancialmentecon el aumento del número de procesadores, pero la aceleración esta pordebajo del valor esperado.

Suponiendo un Cluster A con 100 Cores y un Cluster B con 128 Cores,se muestra una ejempli�cación de las métricas para un problema de ejemploen ambos Clusters con los siguientes resultados:

101A cada procesador encapsulado se le llama Core o núcleo, logrando que la comunicaciónentre ellos se realiza de una forma más rápida a través de un bus interno integrado en lapropia pastilla de silicio sin tener que recurrir por tanto al bus del sistema mucho máslento. Al contrario del caso de la tecnología HyperThreading, en este caso si tenemos todoslos efectos de varias CPUS completamente independientes una por cada Core o núcleo.

[email protected] 345 Antonio Carrillo Ledesma, Et alii

Page 348: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Cores Cluster A Cluster B16 9158 seg ND32 5178 seg 5937 seg64 3647 seg 4326 seg100 2661 seg128 2818 seg

Como se muestra en la tabla, en todos los casos el Cluster A usandocomo máximo 100 Cores obtiene un tiempo de cálculo inferior al que requiereCluster B usando a lo más los 128 Cores.Haciendo uso de las métricas de aceleración y e�ciencia relativa102 se tiene

que para el Cluster B:

S32128 = 5937=2818 = 2:10

donde lo esperado sería:

S32128 = 32=128 = 4:00;

para el caso de la e�ciencia:

E32128 = (32=128) � (5937=2818) = 0:52:

En el caso del Cluster A se tiene que:

S16100 = 9158=2661 = 3:44

donde lo esperado sería:

S16100 = 16=100 = 6:35;

para el caso de la e�ciencia:

E16100 = (16=100) � (9158=2661) = 0:55:

Haciendo uso del mismo número de Cores base para el Cluster A que paraCluster B, se tiene que:

S32100 = 5178=2661 = 1:94

102Aceleración relativa es Sp0

p =Tp0

Tppara p � p0, en la cual se espera que Sp

0

p ' pp0 y

e�ciencia relativa es Ep0

p =p0

p Sp0

p =p0

p

Tp0

Tp:

[email protected] 346 Antonio Carrillo Ledesma, Et alii

Page 349: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

donde lo esperado sería:

S16100 = 32=100 = 3:12;

para el caso de la e�ciencia:

E16100 = (32=100) � (5178=2661) = 0:62:

De todo lo anterior, se desprende que el Cluster A obtiene valores de unaaceleración y e�ciencias relativas ligeramente mejores que el Cluster B, peroesto no se re�eja en la disminución de casi 6% del tiempo de ejecución y deluso de 28 Cores menos.Además, el costo computacional103:

Cp = P � Tp;

que para el caso del Cluster B es:

C128 = 360; 704

y en Cluster A es:C100 = 266; 100

que representa una disminución de 27%; además de un factor muy impor-tante, el Cluster A tuvo un costo monetario mucho menor con respecto delCluster B.

7.5 Programación de Cómputo de Alto Rendimiento

Hay muchas aplicaciones a las herramientas computacionales, pero nos in-teresan aquellas que permitan resolver problemas concomitantes en Cienciae Ingeniería. Muchas de estas aplicaciones caen en lo que comúnmente sellama cómputo cientí�co. La computación cientí�ca es el campo de estudiorelacionado con la construcción de modelos matemáticos, técnicas numéricaspara resolver problemas cientí�cos y de ingeniería; y su respectiva imple-mentación computacional. La solución de estos problemas genera un altoconsumo de memoria, espacio de almacenamiento o tiempo de cómputo; por

103El costo o trabajo de resolver un problema en paralelo es el producto del tiempode cálculo en paralelo Tp por el número de procesadores usando P y se representa porCp = P � Tp:

[email protected] 347 Antonio Carrillo Ledesma, Et alii

Page 350: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

ello nos interesa trabajar en computadoras que nos puedan satisfacer estasdemandas.La computación de alto rendimiento (véase 7) � High performance Com-

puting o HPC en inglés� es la agregación de potencia de cálculo para re-solver problemas complejos en Ciencia e Ingeniería o gestión. Para lograreste objetivo, la computación de alto rendimiento se apoya en tecnologíascomputacionales como los Clusters, las supercomputadoras o la computaciónparalela. La mayoría de las ideas actuales de la computación distribuida sehan basado en la computación de alto rendimiento.La computación paralela o de alto rendimiento es una forma de cómputo

en la que muchas instrucciones se ejecutan simultáneamente, operando sobreel principio de que problemas grandes, a menudo se pueden dividir en unosmás pequeños, que luego son resueltos simultáneamente (en paralelo). Hayvarias formas diferentes de computación paralela: paralelismo a nivel de bits,paralelismo a nivel de instrucción, paralelismo de datos y paralelismo detareas. El paralelismo se ha empleado durante muchos años, sobre todoen la computación de altas prestaciones, pero el interés en ella ha crecidoúltimamente debido a las limitaciones físicas que impiden el aumento de lafrecuencia. Como el consumo de energía �y por consiguiente la generación decalor�de las computadoras constituye una preocupación en los últimos años,la computación en paralelo se ha convertido en el paradigma dominante enla arquitectura de computadoras, principalmente en forma de procesadoresmultinúcleo.Las computadoras paralelas pueden clasi�carse según el nivel de paralelismo

que admite su Hardware: equipos con procesadores multinúcleo y multi-procesador que tienen múltiples elementos de procesamiento dentro de unasola máquina, procesadores masivamente paralelos, Cluster y cúmulos deClusters (Grids) que utilizan varios equipos para trabajar en la misma tarea.Muchas veces, para acelerar tareas especí�cas, se utilizan arquitecturas es-pecializadas de computación en paralelo junto a procesadores tradicionales.

Existen múltiples vertientes en el cómputo en paralelo, algunas de ellasson:

� Cómputo en memoria compartida usando OpenMP

� Cómputo en memoria distribuida usando MPI

[email protected] 348 Antonio Carrillo Ledesma, Et alii

Page 351: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Como es de esperarse, los programas informáticos paralelos son más com-plejos y difíciles de escribir que los secuenciales, porque la concurrencia intro-duce nuevos tipos de errores de Software � por ello existe una creciente gamade herramientas que coadyuvan a mejorar la escritura, depuración y desem-peño de los programas en paralelo� , pero la comunicación y sincronizaciónentre diferentes subtareas son algunos de los mayores obstáculos para obtenerun buen rendimiento del programa paralelo.Actualmente, en muchos centros de cómputo es una práctica común usar

directivas de compilación en equipos paralelos sobre programas escritos deforma secuencial, con la esperanza que sean puestos por el compilador comoprogramas paralelos. Esto en la gran mayoría de los casos genera códigospoco e�cientes, pese a que corren en equipos paralelos y pueden usar todala memoria compartida de dichos equipos, el algoritmo ejecutado continuasiendo secuencial en la gran mayoría del código.Si la arquitectura paralela donde se implemente el programa es UMA

de acceso simétrico, los datos serán accesados a una velocidad de memoriaconstante. En caso contrario, al acceder a un conjunto de datos es común queuna parte de estos sean locales a un procesador (con un acceso del orden denanosegundos), pero el resto de los datos deberán ser accesados mediante red(con acceso del orden de milisegundos), siendo esto muy costoso en tiempode procesamiento.Por lo anterior, si se cuenta con computadoras con memoria compartida o

que tengan interconexión por bus, salvo en casos particulares no será posibleexplotar éstas características e�cientemente. Pero en la medida en que seadecuen los programas para usar bibliotecas y compiladores acordes a lascaracterísticas del equipo disponible � algunos de ellos sólo existen de maneracomercial� la e�ciencia aumentará de manera importante.

7.5.1 Programando con OpenMP para Memoria Compartida

OpenMP es una interfaz de programación de aplicaciones (API) para la pro-gramación multiproceso de memoria compartida en múltiples plataformas.Permite añadir concurrencia a los programas escritos en C, C++ y Fortransobre la base del modelo de ejecución Fork-join. esta disponible en muchasarquitecturas, incluidas las plataformas de Unix, Linux y de Microsoft Win-dows. Se compone de un conjunto de directivas de compilador, rutinas de bib-lioteca, y variables de entorno que in�uyen en el comportamiento en tiempode ejecución.

[email protected] 349 Antonio Carrillo Ledesma, Et alii

Page 352: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

De�nido conjuntamente por proveedores de Hardware y de Software,OpenMP es un modelo de programación portable y escalable que propor-ciona a los programadores una interfaz simple y �exible para el desarrollode aplicaciones paralelas, para plataformas que van desde las computadorasde escritorio hasta supercomputadoras. Una aplicación construida con unmodelo de programación paralela híbrido se puede ejecutar en un Cluster decomputadoras utilizando OpenMP y MPI, o a través de las extensiones deOpenMP para los sistemas de memoria distribuida.OpenMP se basa en el modelo Fork-join, paradigma que proviene de los

sistemas Unix, donde una tarea muy pesada se divide en K hilos (Fork) conmenor peso, para luego «recolectar» sus resultados al �nal y unirlos en unsolo resultado (Join).Cuando se incluye una directiva de compilador OpenMP esto implica

que se incluye una sincronización obligatoria en todo el bloque. Es decir,el bloque de código se marcará como paralelo y se lanzarán hilos según lascaracterísticas que nos dé la directiva, y al �nal de ella habrá una barrera parala sincronización de los diferentes hilos (salvo que implícitamente se indiquelo contrario con la directiva Nowait). Este tipo de ejecución se denominaFork-join.OpenMP también soporta el modelo de paralelismo de tareas. El equipo

de hilos del bloque de código paralelo ejecuta las tareas especi�cadas dentrode dicho bloque. Las tareas permiten un paralelismo asíncrono. Desde laversión 4.0 lanzada en 2013 admite la especi�cación de dependencias entretareas, relegando a la biblioteca de tiempo de ejecución de OpenMP el trabajode plani�car las tareas y ponerlas en ejecución. Los hilos de ejecución irán eje-cutando las tareas a medida que estas esten disponibles (sus dependencias yaesten satisfechas). El uso de tareas da lugar a sincronización con una granu-laridad más �na. El uso de barreras no es estrictamente necesario, de maneraque los hilos pueden continuar ejecutando tareas disponibles sin necesidadde esperar a que todo el equipo de hilos acabe un bloque paralelo. El usode tareas con dependencias crea un grafo, pudiéndose aplicar propiedades degrafos a la hora de escoger tareas para su ejecución.Salvo el uso de implementaciones de Hardware de la biblioteca de tiempo

de ejecución OpenMP (p.ej. en una matriz de puertas programables FPGAs),los sobrecostes de las tareas es mayor, este sobrecoste ha de ser amortizadomediante el potencial paralelismo adicional que las tareas exponen.

[email protected] 350 Antonio Carrillo Ledesma, Et alii

Page 353: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Estructura del Programa en C++ Ejemplo de cálculo de Pi usandoOpenMP:

#include <stdio.h>// Indica si se carga lo referente a OpenMP#ifdef _OPENMP#include <omp.h>int threads=omp_get_num_threads();#elseint threads=0;#endif#de�ne STEPCOUNTER 1000000000int main (void){long i;double pi=0;printf("threads %d", threads);

#pragma omp parallel for reduction(+:pi)for (i=0; i < STEPCOUNTER; i++){pi += 1.0/(i*4.0 +1.0);pi -= 1.0/(i*4.0 +3.0);

}pi = pi*4.0;printf("PI = %2.16lf ",pi);return 0;

}

El compilador de OpenMP es el mismo que para los lenguajes C, C++ oFortran respectivamente (véase 4.7). Por ello, para usarlo en C++ en líneade comandos (véase 3.2), instalamos el compilador g++, mediante:

# apt install g++

Así, para compilar con g++104, sin usar OpenMP, usamos:

$ g++ pi.cpp -o pi

104Compilar fuentes en C++ solicitando que el ejecutable tenga el nombre ejemp:

[email protected] 351 Antonio Carrillo Ledesma, Et alii

Page 354: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ejecutar midiendo el tiempo:

$ time ./pi

Ahora, usando el compilar para OpenMP usamos:

$ g++ -o pi -fopenmp pi.cpp

Indicar el número de hilos, por ejemplo 2:

$ export OMP_NUM_THREADS=2

Ejecutar:

$ time ./pi

Aprender a Programar en OpenMP en Múltiples Lenguajes Enla red existen múltiples sitios especializados y una amplia bibliografía paraaprender a programar cada uno de los distintos aspectos de OpenMP, nosotroshemos seleccionado diversos textos que ponemos a su disposición en:

http://132.248.182.159/acl/Herramientas/Lenguajes/OpenMP/

$ g++ *.cpp -o ejemp

para ejecutar el programa ya compilado midiendo el tiempo de ejecución:

$ time ./ejemp

en este caso no se usa ninguna directiva para optimizar el ejecutable generado. Paracompilar usando diversas optimizaciones (O1, -O2 o -O3) usar por ejemplo:

$ g++ -O1 *.cpp

ahora ya se puede ver el resultado de las optimizaciones, para ejecutar el programa yacompilado usamos:

$ time ./a.out

[email protected] 352 Antonio Carrillo Ledesma, Et alii

Page 355: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

7.5.2 Programando con MPI para Memoria Distribuida

Para poder intercomunicar dos o más Cores en una o en múltiples computa-doras se usa la «interfaz de paso de mensajes (Message Passing InterfaceMPI)» (véase [62], [63], [66] y [64]), una biblioteca de comunicación paraprocesamiento en paralelo. MPI ha sido desarrollado como un estandar parael paso de mensajes y operaciones relacionadas.Este enfoque es adoptado por usuarios e implementadores de bibliotecas,

en el cual se proveen a los programas de procesamiento en paralelo de porta-bilidad y herramientas necesarias para desarrollar aplicaciones que puedanusar el cómputo paralelo de alto desempeño.El modelo de paso de mensajes posibilita a un conjunto de procesos que

tienen solo memoria local, la comunicación con otros procesos (usando Buso red) mediante el envío y recepción de mensajes. Por de�nición el paso demensajes posibilita transferir datos de la memoria local de un proceso a lamemoria local de cualquier otro proceso que lo requiera.En el modelo de paso de mensajes para equipos paralelos, los procesos

se ejecutan en paralelo, teniendo direcciones de memoria separada para cadaproceso, la comunicación ocurre cuando una porción de la dirección de memo-ria de un proceso es copiada mediante el envío de un mensaje dentro de otroproceso en la memoria local mediante la recepción del mismo.Las operaciones de envío y recepción de mensajes es cooperativa y ocurre

sólo cuando el primer proceso ejecuta una operación de envío y el segundoproceso ejecuta una operación de recepción, los argumentos base de estasfunciones son:

� Para el que envía, la dirección de los datos a transmitir y elproceso destino al cual los datos se enviarán.

� Para el que recibe, debe tener la dirección de memoria dondese pondrán los datos recibidos, junto con la dirección del procesoque los envío.

Es decir:Send(dir, lg, td, dest, etiq, com)

fdir; lg; tdg describe cuántas ocurrencias lg de elementos del tipode dato td se transmitirán empezando en la dirección de memoriadir.

[email protected] 353 Antonio Carrillo Ledesma, Et alii

Page 356: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

fdes; etiq; comg describe el identi�cador etiq de destino des aso-ciado con la comunicación com.

Recv(dir, mlg, td, fuent, etiq, com, st)

fdir; lg; tdg describe cuántas ocurrencias lg de elementos del tipode dato td se transmitirán empezando en la dirección de memoriadir.

ffuent; etiq; com; estg describe el identi�cador etiq de la fuentefuent asociado con la comunicación com y el estado est.

El conjunto básico de directivas (en nuestro caso sólo se usan estas) enC++ de MPI son (véase [62] y [63]):

MPI::Init Inicializa al MPIMPI::COMM_WORLD.Get_size Busca el número de procesos existentesMPI::COMM_WORLD.Get_rank Busca el identi�cador del procesoMPI::COMM_WORLD.Send Envía un mensajeMPI::COMM_WORLD.Recv Recibe un mensajeMPI::Finalize Termina al MPI

Estructura del Programa en C++ Ejemplo de Hola_Mundo en MPI:

#include <stdio.h>#include <mpi.h>int main(int argc, char *argv[]){int rank, size;MPI_Init(&argc, &argv);MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);printf("Hola! Soy el %d de %dnn", rank, size);MPI_Finalize();return 0;}

[email protected] 354 Antonio Carrillo Ledesma, Et alii

Page 357: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Otro ejemplo, para realizar una suma en MPI:

#include <iostream>#include <iomanip>#include <mpi.h>using namespace std;int main(int argc, char ** argv){int mynode, totalnodes;int sum = 0,startval,endval,accum;MPI_Status status;MPI_Init(&argc,&argv);MPI_Comm_size(MPI_COMM_WORLD, &totalnodes);MPI_Comm_rank(MPI_COMM_WORLD, &mynode);startval = 1000*mynode/totalnodes+1;endval =1000*(mynode+1)/totalnodes;for(int i=startval;i<=endval;i=i+1) sum = sum + i;if(mynode!=0)MPI_Send(&sum, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);elsefor(int j=1;j<totalnodes;j=j+1){MPI_Recv(&accum, 1, MPI_INT, j, 1,MPI_COMM_WORLD, &status);sum = sum + accum;}if(mynode == 0)cout << "The sum from 1 to 1000 is: "<< sum << endl;MPI_Finalize();}

Existe una gran variedad de compiladores de MPI en línea de coman-dos (véase 3.2), algunos disponibles en Debian GNU/Linux son instaladosmediante:

# apt install lam-runtime xmpi libmpich-dev mpich mpi-default-dev mpi-default-bin openmpi-bin valgrind-mpi

Para compilar y ejecutar es posible usar alguna de estas opciones:

[email protected] 355 Antonio Carrillo Ledesma, Et alii

Page 358: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

mpic++, mpic++.openmpi, mpiexec.mpich, mpif90.openmpi,mpirun.lam, mpicc, mpicxx, mpiexec.openmpi, mpifort, mpirun.mpich,mpiCC, mpicxx.mpich, mpif77, mpifort.mpich, mpirun.openmpi,mpicc.mpich, mpicxx.openmpi, mpif77.mpich, mpifort.openmpi,mpitask, mpicc.openmpi, mpiexec, mpif77.openmpi, mpimsg, mpi-vars, mpiCC.openmpi, mpiexec.hydra, mpif90, mpipython, mpichver-sion, mpipython, mpiexec.lam, mpif90.mpich, mpirun

Por ejemplo, para compilar ejemp.cpp en mpic++ solicitando que el eje-cutable tenga el nombre ejemp, usamos:

$ mpic++ ejemp.cpp -o ejemp

en este caso no se uso ninguna opción de optimización en tiempo de com-pilación (véase 4.7), se puede hacer uso de ellas (-O1, -O2 o -O3), mediante:

$ mpic++ -O3 ejemp.cpp -o ejemp

para ejecutar el programa ya compilado y medir el tiempo de ejecución(véase 4.7):

$ time mpirun -np 4 ejemp

También podemos compilar ejemp.c enmpicc solicitando que el ejecutabletenga el nombre ejemp:

$ mpicc ejemp.cpp -o ejemp

en este caso no se uso ninguna opción de optimización en tiempo decompilación, se puede hacer uso de ellas (-O1, -O2 o -O3), mediante:

$ mpicc -O3 ejemp.c -o ejemp

para ejecutar el programa ya compilado, usamos:

$ mpirun -np 4 ejemp

[email protected] 356 Antonio Carrillo Ledesma, Et alii

Page 359: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Un último ejemplo, en el caso de usar mpiCC.mpic y lamboot, entoces esnecesario compilar usando:

$ mpiCC.mpich -O2 ejemp.cpp -o ejemp -lm

iniciar ambiente de ejecución paralelo:

$ lamboot -v

correr usando 8 procesadores por ejemplo:

$ mpirun.mpich -np 8 ejemp

correr usando 4 procesadores segun lista machines.lolb por ejemplo:

$ mpirun.mpich -machine�le machines.lolb -np 5 ejemp

terminar ambiente de ejecución paralelo:

$ lamhalt -v

Observación 2 Para que en la ejecución de MPI no pida la clave de usuario:$ ssh-keygen -t rsaEn cada pregunta responder con ENTER, para después copiar usando:$ cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keysOjo: Si continúa pidiendo clave, es que esta instalado rsh o lsh.

Aprender a Programar en MPI en Múltiples Lenguajes En la redexisten múltiples sitios especializados y una amplia bibliografía para aprendera programar cada uno de los distintos aspectos de MPI, nosotros hemosseleccionado diversos textos que ponemos a su disposición en:

http://132.248.182.159/acl/Herramientas/Lenguajes/MPI/

[email protected] 357 Antonio Carrillo Ledesma, Et alii

Page 360: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

7.5.3 Esquema de Paralelización Maestro-Esclavo

El esquema de paralelización maestro-esclavo, permite sincronizar por partedel nodo maestro las tareas que se realizan en paralelo usando varios no-dos esclavos, éste modelo puede ser explotado de manera e�ciente si existepoca comunicación entre el maestro y el esclavo y los tiempos consumidosen realizar las tareas asignadas son mayores que los períodos involucrados enlas comunicaciones para la asignación de dichas tareas. De esta manera segarantiza que la mayoría de los procesadores estarán trabajando de maneracontinua y existirán pocos tiempos muertos.

Figura 13: Esquema del maestro-esclavo

Donde, tomando en cuenta la implementación en estrella del Cluster, elmodelo de paralelismo de MPI y las necesidades propias de comunicacióndel programa, el nodo maestro tendrá comunicación sólo con cada nodo es-clavo y no existirá comunicación entre los nodos esclavos, esto reducirá lascomunicaciones y optimizará el paso de mensajes.Un factor limitante en este esquema es que el nodo maestro deberá de

atender todas las peticiones hechas por cada uno de los nodos esclavos, estotoma especial relevancia cuando todos o casi todos los nodos esclavos com-piten por ser atendidos por el nodo maestro.Se recomienda implementar este esquema en un Cluster heterogéneo en

donde el nodo maestro sea más poderoso computacionalmente que los nodosesclavos. Si a este esquema se le agrega una red de alta velocidad y de bajalatencia, se le permitirá operar al Cluster en las mejores condiciones posibles,pero este esquema se verá degradado al aumentar el número de nodos esclavosinexorablemente.Pero hay que ser cuidadosos en cuanto al número de nodos esclavos que

se usan en la implementación en tiempo de ejecución versus el rendimientogeneral del sistema al aumentar estos, algunas observaciones posibles son:

[email protected] 358 Antonio Carrillo Ledesma, Et alii

Page 361: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� El esquema maestro-esclavo programado en C++ y usando MPI(véase 7.5.2) lanza P procesos (uno para el nodo maestro y P �1para los nodos esclavos), estos en principio corren en un soloprocesador pero pueden ser lanzados en múltiples procesadoresusando una directiva de ejecución, de esta manera es posible queen una sola máquina se programe, depure y sea puesto a punto elcódigo usando mallas pequeñas (del orden de cientos de nodos) ycuando este listo puede mandarse a producción en un Cluster.

� El esquema maestro-esclavo no es e�ciente si sólo se usan dosprocesadores (uno para el nodo maestro y otro para el nodo es-clavo), ya que el nodo maestro en general no realiza los cálculospesados y su principal función será la de distribuir tareas; loscálculos serán delegados al nodo esclavo.

Estructura del ProgramaMaestro-Esclavo La estructura del programase realizo para que el nodo maestro mande trabajos de manera síncrona a losnodos esclavos. Cuando los nodos esclavos terminan la tarea asignada, avisanal nodo maestro para que se les asigne otra tarea (estas tareas son acordes ala etapa correspondiente del método de descomposición de dominio ejecután-dose en un instante dado). En la medida de lo posible se trata de mandarpaquetes de datos a cada nodo esclavo y que estos regresen también paquetesal nodo maestro, a manera de reducir las comunicaciones al mínimo y tratarde mantener siempre ocupados a los nodos esclavos para evitar los tiemposmuertos, logrando con ello una granularidad gruesa, ideal para trabajar conClusters.La estructura básica del programa bajo el esquema maestro-esclavo codi-

�cada en C++ y usando MPI (véase 7.5.2) es:

main(int argc, char *argv[])

{

MPI::Init(argc,argv);

ME_id = MPI::COMM_WORLD.Get_rank();

MP_np = MPI::COMM_WORLD.Get_size();

if (ME_id == 0) {

// Operaciones del Maestro

[email protected] 359 Antonio Carrillo Ledesma, Et alii

Page 362: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

} else {

// Operaciones del esclavo con identi�cador ME_id

}

MPI::Finalize();

}

En este único programa se deberá de codi�car todas las tareas necesariaspara el nodo maestro y cada uno de los nodos esclavos, así como las formas deintercomunicación entre ellos usando como distintivo de los distintos procesosa la variableME_id. Para más detalles de esta forma de programación y otrasfunciones de MPI (véase 7.5.2, [62] y [63]).El principal factor limitante para el esquema maestro-esclavo es que se

presupone contar con un nodo maestro lo su�cientemente poderoso para aten-der simultáneamente las tareas síncronas del método, ya que este distribuyetareas acorde al número de nodos esclavos, estas si son balanceadas, ocasio-naran que muchos de los procesadores esclavos terminen aproximadamenteal mismo tiempo y el nodo maestro tendrá que atender múltiples comunica-ciones simultáneamente, degradando su rendimiento al aumentar el númerode nodos esclavos que atender. Para los factores limitantes inherente al pro-pio esquema maestro-esclavo, es posible implementar algunas operaciones delnodo maestro en paralelo, ya sea usando equipos multiprocesador o en másde un nodo distinto a los nodos esclavos.

7.5.4 Opciones de Paralelización Híbridas

En la actualidad, casi todos los equipos de cómputo usados en estacionesde trabajo y Clusters cuentan con dos o más Cores, en ellos siempre esposible usar MPI para intercambiar mensajes entre procesos corriendo enel mismo equipo de cómputo, pero no es un proceso tan e�ciente como sepuede querer. En estas arquitecturas llamadas de memoria compartida esmejor usar OpenMP o cualquiera de sus variantes para trabajar en paralelo.Por otro lado es común contar con las cada vez más omnipresentes tarjetasNVIDIA, y con los cada vez más numerosos Cores CUDA � que una solatarjeta NVIDIA TESLA puede tener del orden de cientos de ellos� y que enun futuro serán cada vez más numerosos.Para lograr obtener la mayor e�ciencia posible de estos tres niveles de

paralelización, se están implementando procesos híbridos (véase [67] y [65]),

[email protected] 360 Antonio Carrillo Ledesma, Et alii

Page 363: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

en donde la intercomunicación de equipos con memoria compartida se realizamediante MPI y la intercomunicación entre Cores que comparten la mismamemoria se realiza con OpenMP, además las operaciones matriciales, vec-toriales, etc. se le encargan a los numerosos Cores CUDA de las tarjetasNVIDIA.

Figura 14: Paralelización Híbrida

Los métodos de descomposición de dominio sin traslape para la resoluciónde ecuaciones diferenciales parciales concomitantes en Ciencias e Ingenieríaspueden hacer uso de esta forma integradora de paralelismo. Para ello, lainterconexión de equipos de memoria compartida se realizaría mediante MPIy en cada equipo de memoria compartida se manipularían uno o más sub-dominios mediante OpenMP � ya que cada subdominio es independiente delos demás� y la manipulación de matrices y operaciones entre matrices yvectores que requiere cada subdominio se realizarían en las tarjetas NVIDIAmediante los numerosos Cores CUDA sin salir a la RAM de la computadora.Permitiendo así, tener una creciente e�ciencia de paralelización que opti-

mizan en gran medida los recursos computacionales, ya que todas las matricesy vectores se generarían en la RAM de la tarjeta NVIDIA. De forma tal quesea reutilizable y que pueda usarse en problemas en los que el número degrados de libertad sea grande, permitiendo hacer uso de equipos de cómputocada vez más asequibles y de menor costo, pero con una creciente e�cienciacomputacional que compiten con los grandes equipos de cómputo de altodesempeño.

[email protected] 361 Antonio Carrillo Ledesma, Et alii

Page 364: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

8 Programación en Paquetes de Cálculo Numérico

El cálculo numérico permite diseñar e implementar algoritmos para que através de números y reglas matemáticas se pueden simular procesos matemáti-cos complejos aplicados a la resolución de problemas de Ciencias e Ingenierías.De esta forma los paquetes de cálculo numérico proporcionan todo el anda-miaje para llevar a cabo todos aquellos procedimientos matemáticos suscep-tibles de expresarse algorítmicamente que permitan su simulación o cálculoen procesos más sencillos empleando números.Los paquetes de cálculo numérico, son programas matemáticos que ofre-

cen un entorno de desarrollo integrado (IDE) con un lenguaje de progra-mación propio con un amplio abanico de herramientas numéricas para lalectura, manipulación, análisis y gra�cación de datos. Entre sus prestacionesbásicas se hallan:

� Manejo de números reales y complejos

� La manipulación de vectores y matrices tanto reales como complejas

� Manejo de funciones elementales y especiales

� Resolución de problemas de álgebra lineal

� Resolución de ecuaciones no lineales

� La representación de datos y funciones

� La implementación de algoritmos

� Integración de funciones

� Máximos y mínimos de funciones

� Manipulación de polinomios

� Integración de ecuaciones diferenciales

� Gra�cación de funciones en 2D y 3D

� La comunicación con programas en otros lenguajes de programación ycon otros dispositivos de Hardware.

[email protected] 362 Antonio Carrillo Ledesma, Et alii

Page 365: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

El programa comercial líder para el cálculo numérico es MATLAB (véase[19]) de la compañía MathWorks, este paquete salió a la venta en el año de1984 con la versión 1.0 y casi año con año, ha generado nuevas versiones de supaquete y múltiples sistemas de licenciamiento. Actualmente se comercializala versión 7.14 (R2012a) del año 2012 con más de 8 tipos de licenciamiento.Esta empresa cuenta con más de mil empleados y o�cinas en más de docepaíses alrededor del mundo.La idea detrás de paquetes como MATLAB es la de emplear grupos de

subrutinas escritas en principio en el lenguaje de programación FORTRANcomo son las librerías LINPACK (véase [30]) y EISPACK (véase [31]) paramanipular matrices y vectores y proporcionar un sencillo acceso a dicho Soft-ware y así, entre otras cosas, ser usado en resolución de problemas de álgebralineal, análisis numérico, ecuaciones diferenciales parciales y ordinarias, sinnecesidad de escribir programas en lenguajes de bajo nivel.Estos paquetes, pueden disponer de herramientas adicionales que ex-

panden sus prestaciones, como son el diseño y simulación de sistemas decontrol. Además, se pueden ampliar las capacidades base de dichos pro-gramas con las cajas de herramientas y con los paquetes de bloques. Enalgunos casos existen versiones para cómputo secuencial y paralelo � tantoen memoria compartida como distribuida, también para usar los múltiplesCores grá�cos CUDA (GPUs) de las tarjetas NVIDIA (véase 7)� .Los paquetes de cómputo para el Cálculo Numérico más usados actual-

mente son:

� MATLAB (véase [19]) «abreviatura de MATrix LABoratory (labora-torio de matrices)» es un Software matemático que ofrece un entornode desarrollo integrado (IDE) con un lenguaje de programación propio(lenguaje M). Entre sus prestaciones básicas se hallan: la mani-pulaciónde matrices, la representación de datos y funciones, la implementaciónde algoritmos, la creación de interfaces de usuario (GUI) y la comuni-cación con programas en otros lenguajes y con otros dispo-sitivos Hard-ware. El paquete MATLAB dispone de dos herramientas adicionalesque expanden sus prestaciones, a saber, una plataforma de simulaciónmultidominio Simulink (véase [33]) y un editor de interfaces de usuarioGUIDE. Además, se pueden ampliar las capacidades de MATLAB consu caja de herramientas (Tool Box) y las de Simulink con los paquetesde bloques.

� Octave (véase [23]) es un programa de cálculo numérico de licencia

[email protected] 363 Antonio Carrillo Ledesma, Et alii

Page 366: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

GNU (véase [15]), conocido por buscar una sintaxis similar a la deMATLAB, existiendo una gran compatibilidad en las funciones de cál-culo numérico.

� FreeMat (véase [22]) es un programa de cálculo numérico de licenciaGPL (véase [15]) que proporciona un ambiente libre para el rápidodesarrollo de prototipos para la Ciencia y la Ingeniería, además delprocesamiento de datos. Es similar a MATLAB y Octave, pero cuentacon una interfaz externa de código en los lenguajes de programaciónC, C++ y Fortran, incluso distribuye el desarrollo de algoritmos enparalelo con la interfaz de paso de mensajes llamada MPI.

� Scilab (véase [20]) es un programa de cálculo numérico de licencia Ce-CILL compatible con GPL (véase 11.1), desarrollado principalmenteen Francia, que incluye su propia librería para grá�cos. Es similara MATLAB, pero no busca una compatibilidad total, como lo puedehacer FreeMat y Octave. Scilab tiene una herramienta para el diseño ysimulación de sistemas de control Scicos (véase [32]) similar a Simulink(véase [33]) de MATLAB.

� Julia (véase [21]) es un lenguaje de programación homoicónico, multi-plataforma y multiparadigma de tipado dinámico de alto nivel y altodesempeño para la computación genérica, técnica y cientí�ca, con unasintaxis similar a la de otros entornos de computación similares, conlicencia MIT (véase 11.1).

Dispone de un compilador avanzado (JIT), mecanismos para la ejecu-ción en paralelo y distribuida, además de una extensa biblioteca defunciones matemáticas. La biblioteca, desarrollada fundamentalmenteen Julia, también contiene código desarrollado en C o Fortran, parael álgebra lineal, generación de números aleatorios, procesamiento deseñales, y procesamiento de cadenas. Adicionalmente, la comunidadde desarrolladores de Julia contribuye con la creación y distribución depaquetes externos a través del gestor de paquetes integrado de Juliaa un paso acelerado. IJulia es el resultado de la colaboración entrelas comunidades de IPython y Julia, provee de una poderosa interfazgrá�ca basada en el navegador Web para Julia.

� Scipy (véase [24]) es una librería de herramientas numéricas para Python(véase [25]) con licencia Open Source (véase [15]). En su �losofía no ha

[email protected] 364 Antonio Carrillo Ledesma, Et alii

Page 367: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

tratado de imitar a ninguno de los paquetes anteriores y tiene detrás elrespaldo de un auténtico lenguaje de programación orientado a objetose interpretado, que también puede ser compilado para ganar velocidaden la ejecución. Este hecho le con�ere una gran potencia y la capacidadde bene�ciarse de las mejoras del lenguaje base.

Existen otros paquetes que pueden ser usados en el cálculo numérico� estos poseen características que enriquecen las opciones clásicas de los pa-quetes de cálculo numérico� :

� R (véase [29])

� Maple (véase [41])

� Mathematica (véase [42])

� Maxima (véase [43])

Por otro lado existe Anaconda, una Suite de código abierto que abarcauna serie de aplicaciones, librerías y conceptos diseñados para el desarrollode la Ciencia de Datos con Python. En líneas generales Anaconda Distri-bution es una distribucción de Python que funciona como un gestor de en-torno, un gestor de paquetes y que posee una colección de más de 720 pa-quetes de código abierto. Anaconda Distribution se agrupa en 4 sectoreso soluciones tecnológicas, Anaconda Navigator, Anaconda Project, las li-brerías de Ciencia de Datos y Conda. Todas estas se instalan de maneraautomática y en un procedimiento muy sencillo. Para más información ver:https://www.anaconda.com/.También esta SageMath, una Suite de código abierto bajo la licencia GPL

de Software matemático como: NumPy, SciPy, Matplotlib, Sympy, Maxi-ma, GAP, FLINT, R, entre otros. Además combina acceso a una poderosacombinación del lenguaje basada en Python o directamente vía interfaceso Wrappers. La misión del proyecto es crear una alternativa de Softwarelibre a Magma, Maple, Mathematica y Matlab. Para más información ver:http://www.sagemath.org/.

8.1 Cálculo Numérico con Octave

El paquete Octave (véase [23]), al mantener una sintaxis similar a la delpaquete MATLAB (véase [19]) tiene cientos de características, tan variadas

[email protected] 365 Antonio Carrillo Ledesma, Et alii

Page 368: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

como el segmento de usuarios al que dicho Software esta dirigido. Al ser unpaquete tan completo, es difícil que un usuario promedio use las caracterís-ticas avanzadas de dicho paquete; esto repercute en que el usuario prome-dio pague un alto costo por el valor de las licencias de uso sin usar dichascaracterísticas; y esto contrasta con un vertiginoso desarrollo de nuevas ca-racterísticas, que permite a la compañía lanzar una o más versiones por año,cada una con múltiples opciones de licenciamiento, según las necesidades delsegmento al que estan dirigidas.Las múltiples características y los miles de usuarios, han creado una comu-

nidad robusta, la que ha logrado una gran cantidad de funciones optimizadas,que han permitido la publicación de decenas libros, cientos de artículos ymiles de páginas Web en los cuales se muestra como resolver diversos pro-blemas concomitantes en Ciencias e Ingenierías usando dicho paquete y lainteracción con otros lenguajes como son C/C++, Fortran o Java.Entre las principales aplicaciones de Octave/MATLAB incluyen la de

métodos secuenciales y paralelos para resolver problemas de álgebra linealcon matrices (ralas, dispersas y densas), estadística, análisis de Fourier, op-timización, integración numérica, resolución de ecuaciones diferenciales or-dinarias y parciales, creación de grá�cos y visualización de datos. Ademásde opciones para hacer interpolación y regresión de datos, cálculo de eigen-valores y valores singulares, etc.

Entornos de Programación Uno de los aspectos más agradables de Oc-tave/MATLAB es su entorno de programación, que permite centralizar lainformación en un entorno de ventanas. El depurador esta también incorpo-rado en el editor.

8.2 Trabajando con Octave

GNU Octave es un lenguaje de alto nivel destinado para el cálculo numérico.Provee una interfaz sencilla, orientada a la línea de comandos (consola), quepermite la resolución de problemas numéricos, lineales y no lineales, ademáspermite la ejecución de scripts y puede ser usado como lenguaje orientado alprocesamiento por lotes.Octave posee una gran cantidad de herramientas que permiten resolver

problemas de algebra lineal, cálculo de raíces de ecuaciones no lineales, in-tegración de funciones ordinarias, manipulación de polinomios, integraciónde ecuaciones diferenciales ordinarias y ecuaciones diferenciales algebraicas.

[email protected] 366 Antonio Carrillo Ledesma, Et alii

Page 369: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Sus funciones también se pueden extender mediante funciones de�nidas porel usuario escritas en el lenguaje propio de Octave o usando módulos dinámi-camente cargados escritos en lenguajes como C, C++ y Fortran entre otros.

Cálculos básicos Vamos a empezar a trabajar con la tarea más básicaque podemos darle a esta herramienta, vamos a utilizarla como una calcu-ladora. A continuación, veamos un ejemplo sencillo de suma, multiplicacióny división:

octave:1> 45 + 76 * 12.5 / 1.5

De igual manera también podemos calcular promedios de la siguienteforma:

octave:1> (12+15+20)/3

Para calcular potencias utilizamos el símbolo "^" o doble asterisco "**",ejemplo:

octave:1> 2^8

Octave, como toda calculadora cumple con cierta regla de precedenciapara el uso de operadores, esta es: las expresiones se evaluarán de izquierdaa derecha, la potencia tendrá el mayor orden de precedencia, seguido de lamultiplicación y división, y con la suma y resta como los operadores conmenor precedencia. No es lo mismo: "4 + 5 / 4 - 3" que "(4 + 5) / (4 - 3)".En la primera expresión se evaluará primero la división entre 5 y 4 y luego sele sumará (restará) el 4 y el 3, en la segunda expresión primero se evaluaránlas operaciones dentro de los paréntesis y luego se dividirá el resultado deestos valores.

Variables Las variables son identi�cadores que permiten almacenardatos, los cuales pueden cambiar durante la ejecución de un programa. Lasvariables nos permiten asignarle nombres a los valores para luego poder hacerreferencia a estos. No hay límite para la longitud en el nombre de una va-riable, pero estos deben estar constituidos por una secuencia de letras, un-dersCores (símbolo de subrayado o guión bajo) o números y sólo puedenempezar con letras o undersCores.

[email protected] 367 Antonio Carrillo Ledesma, Et alii

Page 370: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Vectores y Matrices En el área de la computación un vector ge-neralmente es de�nido como un arreglo, es decir, un conjunto de datos a loscuales se accede por medio de índices. Un vector es la forma más simple deuna matriz, podemos decir que es una matriz de una dimensión. En Octavedisponemos de una gran variedad de formas para de�nir vectores y matri-ces, usualmente lo hacemos encerrando los elementos dentro de corchetes,los elementos separados por espacios o comas (,) de�nen un vector �la, loselementos separados por el retorno de carro o por punto y coma (;) de�nenun nuevo vector �la en la matriz, ejemplo:

octave:1> a=[1,3,5]octave:2> b=[1;2;3]octave:3> e=[a ; b ; 2, 4 6]

Para de�nir la matriz identidad, por ejemplo de tamaño 3, hacemos:

octave:1> E=eye(3)

a partir de esta matriz, podemos de�nir un vector de ella, mediante:

octave:1> y=E(:,1)

ahora podemos hacer la multiplicación matriz vector, mediante:

v=E*v

Para de�nir una matriz de unos de tamaño 3, hacemos:

octave:1> A=ones(3)

podemos calcular la inversa de una matriz, para ello construyamos lamatriz a invertir, mediante:

octave:1>A=ones(3)+eye(3)octave:2> C=inv(A)

Por ejemplo para resolver un sistema lineal, hacemos:

octave:1> A=ones(3)+eye(3)octave:2> b=A(:,3)octave:3> x=inv(A)*b

[email protected] 368 Antonio Carrillo Ledesma, Et alii

Page 371: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

o de forma alternativa, podemos hacer eliminación gaussiana si A escuadrada y hacer:

octave:3> x=Anb

Podemos calcular la transpuesta a un vector mediante el símbolo �, porejemplo:

octave:1> a=[0 0 1]�

Para sustituir los valores de una �la o columna por los de un vector,hacemos:

octave:1> A(3,:)=voctave:2> A(:,2)=w

Para intercambiar, por ejemplo las �las 2 y 3 de A, de la siguiente forma:

octave:1> A([2 3],:)=A([3 2],:)

Algunas otras matrices de uso común son:

� diag(v) genera una matriz diagonal con el vector v como diagonal

� toeplitz(v) de�ne una matriz simétrica de diagonal constante con vcomo primera �la y primera columna

� toeplitz(w,v) de�ne una matriz simétrica de diagonal constante con wcomo primera columna y v como primera �la

� ones(n) genera una matriz de n�n con todos los valores iguales a uno

� zeros(n) genera una matriz de n�n con todos los valores iguales a cero

� eye(n) genera una matriz identidad de n� n

� rand(n) genera una matriz de n � n con elementos de valor aleatorioentre 0 y 1 (distribución uniforme)

� randn(n) genera una matriz de n� n cuyos elementos siguen una dis-tribución normal (media 0 y varianza 1)

[email protected] 369 Antonio Carrillo Ledesma, Et alii

Page 372: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� ones(m,n), zeros(m,n), rand(m,n) generan matrices de m� n

� ones(size(A)), zeros(size(A)), yes(size(A)) generan matrices de la mismaforma que A

� triu(A) coloca ceros en todos los elementos por debajo de la diagonal(triangular superior)

� tril(A) coloca ceros en todos los elementos por encima de la diagonal(triangular inferior)

� inv(A) calcula la inversa de A si es invertible

� pinv(A) calcula la pseudoinversa de A

� det(A) calcula el determinante (si A es una matriz cuadrada)

� rank(A) es el rango (número de pivotes=dimensión del espacio de �lasy del espacio de columnas)

� trace(A) es la traza, suma de autovalores

� null(A) es una matriz cuyas columnas n�r forman una base ortogonalpara el espacio nulo de A

� orth(A) es la matriz cuyas columnas r forman una base ortogonal parael espacio de columnas de A

Secuencias Una forma sencilla de producir una secuencia de númeroses utilizando la notación n:m donde n es el número inicial y m el �nal,ejemplo:

octave:1> 1:10

también podemos usar la notación p:q:r para crear una secuencia que ini-cia en p, �naliza en r con intervalos de q. En el siguiente caso almacenaremosen una variable b una secuencia partiendo de cero y �nalizando en diez, conun intervalo de dos entre cada número, ejemplo:

octave:1> b=0:2:10

[email protected] 370 Antonio Carrillo Ledesma, Et alii

Page 373: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Funciones matemáticas Octave incluye una serie de funciones matemáti-cas y trigonométricas que nos ayudan a simpli�car algunos cálculos, la listacompleta esta disponible en la ayuda del programa105. Las funciones puedencontener otras funciones como argumentos:

octave:1> sqrt( round( 25/3 ) + 1 )

en Octave, se asume que los argumentos de funciones trigonométricasestan en radianes por lo que si queremos calcular los grados de alguna funcióntrigonométrica debemos aplicar la siguiente fórmula:

octave:1> sin(90*pi/180)

Sistema de ecuaciones Para la resolución de sistemas de ecuacionesdel tipo Ax = b utilizamos la notación anb, por ejemplo, para calcular elsiguiente sistema de ecuaciones de primer grado con dos incógnitas:

6�x - 7�y = 58�x - 9�y = 7

para resolver, haremos lo siguiente: guardaremos los elementos x e yen una matriz a y la igualdad en un vector b, para �nalmente ejecutar elcomando anb, de la siguiente forma:

octave:1> a=[6, -7;8,-9]octave:2> b=[5;7]octave:3> anb

Funciones de�nidas por el usuario En Octave podemos crear nues-tras propias funciones, podemos escribirlas directamente desde la línea decomandos o ejecutarlas desde un archivo externo. Las funciones que creamosdesde la línea de comandos deben cumplir con el siguiente formato:

function variable_salida = nombre_funcion (argumentos_entrada)cuerpo _funcion

endfunction105Alguna de ellas son: sin, sinh, asin, asinh, cos, cosh, acos, acosh, tan, tanh, atan2,atanh, sec, sech, asec, asech, csc, csch, acsc, acsch, cot, coth, acot, acoth, exp, log, log10,pow2, sqrt, �x, �oor, ceil, round, mod, rem, sig, etc.

[email protected] 371 Antonio Carrillo Ledesma, Et alii

Page 374: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

en caso de devolver varias variables, estas deben estar encerradas entrecorchetes "[ ]":

function [salida1,salida2] = nombre_funcion (argumentos_entrada)cuerpo _funcion

endfunction

Por ejemplo, crearemos una función que calcula seno(x) en grados:

function s = sind(x)%SIND(X) Calcula seno(x) en gradoss = sin(x*pi/180);

endfunction

y ejecutamos:

octave:j> sind(45)

Para que Octave ejecute un archivo o script, este debe tener extensión .my debe encontrarse en el directorio desde donde estemos ejecutando Octave.También podemos agregar rutas adicionales con el comando addpath(�ruta�),donde ruta es el camino al directorio que contiene los scripts. Para borrar laruta usamos rmpath(�ruta�).Por ejemplo, el cálculo de las raíces de la ecuación cuadrática (véase 4.4),

podemos de�nir en el archivo cuadratica.m, el siguiente código:

Ejemplo en Octave/MatLab:

% Calculo de raices de una ecuacion cuadraticafunction[x1,x2] = raiz(a,b,c)fprintf(�Polinomio(%1.6f) X^2 + (%1.6f) X + (%1.6f) =

0nn�,a,b,c);x1 = 0;x2 = 0;if a == 0fprintf(�nnNo es cuadraticann�)return

endfprintf(�nnChicharronera 1nn�)

[email protected] 372 Antonio Carrillo Ledesma, Et alii

Page 375: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

x1 = (-b+sqrt(b*b-4*a*c))/(2*a);r = f(a, b, c, x1);fprintf(�Raiz(%1.16f), evaluacion raiz: (%e)nn�,x1,r);x2 = (-b-sqrt(b*b-4*a*c))/(2*a);r = f(a, b, c, x2);fprintf(�Raiz(%1.16f), evaluacion raiz: (%e)nn�,x2,r);fprintf(�nnChicharronera 2nn�)x1 = (-2*c)/(b+sqrt(b*b-4*a*c));r = f(a, b, c, x1);fprintf(�Raiz(%1.16f), evaluacion raiz: (%e)nn�,x1,r);x2 = (-2*c)/(b-sqrt(b*b-4*a*c));r = f(a, b, c, x2);fprintf(�Raiz(%1.16f), evaluacion raiz: (%e)nn�,x2,r);fprintf(�nnMetodo Newton-Raphsonnn�)x = x1 -1;fprintf(�Valor inicial aproximado de X1 = %1.16fnn�,x);for i = 1:10x = x - (f(a, b, c, x) / df(a, b, c, x));

endr = f(a, b, c, x);fprintf(�Raiz (%1.16f), evaluacion raiz: (%e)nn�,x,r);x = x2 -1;fprintf(�Valor inicial aproximado de X2 = %1.16fnn�,x);for i = 1:10x = x - (f(a, b, c, x) / df(a, b, c, x));

endr = f(a, b, c, x);fprintf(�Raiz (%1.16f), evaluacion raiz: (%e)nn�,x,r);

end% Funcion cuadraticafunction r = f(a, b, c, x)r = x * x * a + x * b + c;

end% Derivada de la funcion cuadraticafunction r = df(a, b, c, x)r = 2.0 * x * a + b;

end

[email protected] 373 Antonio Carrillo Ledesma, Et alii

Page 376: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

y podemos ejecutar mediante:

[x1,x2] = cuadratica(1,4,1)

para el polinomio x2 + 4x+ 1 = 0, con la salida mostrada en 4.4.

Grá�cos 2D en Octave La forma mas simple para producir grá�casbidimensionales en Octave se hace a través del comando plot(x[,y][,fmt]),donde x y opcionalmente y representan los vectores de coordenadas paracada punto, adicionalmente se le puede especi�car una serie de formatos quecambiaran la apariencia de salida de la grá�ca, esto incluye el estilo de línea,el color y otras características que explicaremos en los siguientes ejemplos.En este primer ejemplo crearemos un vector aleatorio de 50 elementos queluego gra�caremos:

octave:1> x = (rand(50,1));octave:2> plot(x)

acto seguido se abre una ventana mostrándonos la grá�ca resultante.

Grá�cos 3D en Octave Para producir grá�cos en 3D disponemos devarias opciones, la mas simple es usar el comando plot3(x,y,z) donde cadaargumento es tomado para convertirse en los vértices del grá�co tridimen-sional. Si todos los argumentos son vectores de la misma longitud se dibujaráuna única línea continua. En caso de todos los argumento sean matrices cadauna de las columnas de las matrices serán tratadas como líneas separadas.En caso de que sólo se le pasen dos argumentos en lugar de tres, plot3(x,c), elsegundo argumento �c�debe ser un número complejo, así, las partes reales eimaginarias de este son usadas como las coordenadas y e z respectivamente.Si sólo se le pasa un argumento, plot3(c), las partes reales e imaginarias delos argumentos son usados como los valores y y z, y se trazan frente a suíndice.El comando plot3 también acepta los argumentos que permiten modi�car

el formato de presentación de la grá�ca descritos en la sección de grá�casbidimensionales, ejemplo:

octave:1> t=0:pi/50:10*pi;octave:2> plot3(sin(t),cos(t),t)octave:3> grid onoctave:4> axis square

[email protected] 374 Antonio Carrillo Ledesma, Et alii

Page 377: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

acto seguido se abre una ventana mostrándonos la grá�ca resultante.

8.3 Desde la Nube

Existen diferentes servicios Web106 que permiten editar, compilar y ejecutarcódigo de diversos lenguajes y paquetes desde el navegador, esto en aras deque los estudiantes y profesores que cuenten con algún sistema de acceso ared y un navegador puedan programar en los más diversos lenguajes, IDEs yterminales sin hacer instalación alguna en su equipo de cómputo, tableta oteléfono celular.Algunos ejemplos de estos servicios son:

� Para Octave https://octave-online.net/

� Para Octave https://rextester.com/l/octave_online_compiler

� Para Octave http://www.compileonline.com/execute_matlab_online.php

� Para Octave http://www.tutorialspoint.com/octave_terminal_online.php

� Para Octave https://www.jdoodle.com/execute-octave-matlab-online

� Para SciLab http://cloud.scilab.in/

� Para SciLab http://hotcalcul.com/on-line-calculator/scilab

� Para Scipy https://www.jdoodle.com

� Para Scipy https://try.jupyter.org/

� Para Scipy http://browxy.com

106Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnitopara no guardar el historial de navegación, información introducida en los formularios yborrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitiosWeb que visitamos sí guardan información de nuestra visita, nuestro proveedor de Internettambién guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igualque el historial de descargas, además de las marcas de páginas o favoritos se conservaránal cerrar al navegador.

[email protected] 375 Antonio Carrillo Ledesma, Et alii

Page 378: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

9 Programación en Paquetes de Cálculo Sim-bólico

En matemáticas y ciencias de la computación, el cálculo simbólico, tambiénconocido como cálculo algebraico o álgebra computacional, es un área cientí-�ca que se re�ere al estudio y desarrollo de algoritmos y Software para la ma-nipulación de expresiones matemáticas y otros objetos matemáticos. Aunque,hablando con propiedad, el álgebra computacional debe ser un subcampo dela computación cientí�ca, ellos son considerados generalmente como camposdistintos, porque la computación cientí�ca se basa generalmente en el análisisnumérico con números aproximados en punto �otante; mientras que, el álge-bra computacional enfatiza el cálculo exacto con expresiones que contenganvariables que no tienen cualquier valor dado y por lo tanto son manipuladoscomo símbolos (de ahí se debe el nombre de cálculo simbólico).Las aplicaciones de Software que realizan cálculos simbólicos son cono-

cidos como sistemas de álgebra computacional, con el término sistema alu-diendo a la complejidad de las principales aplicaciones que incluyen, al menos,un método para representar los datos matemáticos en una computadora, unlenguaje de programación de usuario (por lo general diferente del lenguajeusado para la ejecución), un administrador de memoria, una interfaz deusuario para la entrada/salida de expresiones matemáticas, un gran con-junto de subrutinas para realizar operaciones usuales, como la simpli�caciónde expresiones, la regla de la cadena utilizando diferenciación, factorizaciónde polinomios, integración inde�nida, etc.El álgebra computacional es ampliamente utilizado para experimentar en

matemáticas y diseñar las fórmulas que se utilizan en los programas numéri-cos. También se usa para cálculos cientí�cos completos, cuando los métodospuramente numéricos fallan, como en la criptografía asimétrica o para al-gunos problemas no lineales.

Los paquetes de cálculo simbólico, son programas matemáticos que ofre-cen un entorno de desarrollo integrado (IDE) con un lenguaje de progra-mación propio con un amplio abanico de herramientas simbólicas y numéri-cas para la lectura, manipulación, análisis y gra�cación de datos. Entre susprestaciones básicas se hallan:

� Bibliotecas de funciones matemáticas elementales y especiales

� Matrices y manipulación de datos

[email protected] 376 Antonio Carrillo Ledesma, Et alii

Page 379: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Soporte para números complejos, precisión arbitraria, computación deintervalos aritméticos y simbólicos

� Datos en 2D y 3D, función y visualización geográ�ca y herramientasde animación

� Solucionadores para sistemas de ecuaciones, ecuaciones diofánticas, ecua-ciones diferenciales ordinarias, parciales, diferenciales algebraicas, deretraso, diferenciales estocásticas y relaciones de recurrencia

� Herramientas numéricas y simbólicas para cálculo de variable continuao discreta

� Bibliotecas de Estadística multivariable, incluyendo ajuste, pruebas dehipótesis, y cálculos de probabilidad

� Soporte para datos censurados, datos temporales, series temporales ydatos basados en unidades

� Cálculos y simulaciones en procesos aleatorios y colas

� Geometría computacional en 2D, 3D y dimensiones mayores

� Optimización restringida y no restringida, local y global

� Herramientas para problemas combinatorios

� Soporta el desarrollo de cálculos matemáticos de manera simbólica ynumérica con precisión arbitraria

� Librerías para funciones matemáticas básicas y avanzadas

� Manejo de números complejos y sus diversas operaciones

� Aritmética, álgebra, operaciones para desarrollo de polinomios multi-variados

� Limites, series y sucesiones

� Álgebra diferencial

� Herramientas para la manipulación de matrices incluyendo matricesdispersas

[email protected] 377 Antonio Carrillo Ledesma, Et alii

Page 380: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Sistemas de solución para ecuaciones diferenciales en sus diferentes va-riedades (ODE, DAE, PDE, DDE)

� Herramientas simbólicas y numéricas para cálculo discreto y continuo,incluye integración de�nida e inde�nida, diferenciación

� Optimización con restricciones y sin restricciones

� Herramientas para la resolución de problemas en el campo de la pro-babilidad

� Herramientas para el uso de series de tiempo

� Conexión a datos en línea, recopilados para aplicaciones �nancieras yeconómicas

� Herramientas para cálculos �nancieros, incluyendo: bonos, anualidadesentre otros

� Cálculos y simulaciones para procesos aleatorios

� Herramientas para el desarrollo de sistemas lineales y no lineales

� Incluye matemáticas discretas

Los programas líderes para el cálculo simbólico son Mathemática y Maple,los costos de sus licencias respectivas son onerosos, pero para la UNAM setienen licencias estudiantiles disponibles para profesores y estudiantes. Exis-ten otros paquetes como Maxima que tiene licencia GPL y estan disponiblespara los usuarios en múltiples plataformas.

9.1 Cálculo Simbólico con Maxima

El sistema de álgebra computacional Maxima107 es un motor de cálculo sim-bólico escrito en lenguaje Lisp publicado bajo licencia GNU GPL. Cuentacon un amplio conjunto de funciones para hacer manipulación simbólica depolinomios, matrices, funciones racionales, integración, derivación, manejode grá�cos en 2D y 3D, manejo de números de coma �otante muy grandes,

107Véase https://es.wikipedia.org/wiki/Maxima

[email protected] 378 Antonio Carrillo Ledesma, Et alii

Page 381: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

expansión en series de potencias y de Fourier, entre otras funcionalidades.Además tiene un depurador a nivel de fuente para el código de Maxima.Maxima esta basado en el sistema original de Macsyma desarrollado por

MIT en los años 70. Es bastante �able, tiene un buen recolector de basura,por lo que no desperdicia memoria. Viene con cientos de auto pruebas (test-suite). Maxima funciona en modo consola, sin embargo incluye las intefacesgrá�cas xMaxima y wxMaxima para facilitar su uso.El editor de texto cientí�co GNU TeXmacs también puede ser usado para

facilitar una interfaz grá�ca de usuario para Maxima. Otras opciones son,Imaxima, y el modo interactivo de Emacs. También puede hacer uso de lainterfaz grá�ca de SageMath, que facilita su integración con otras herramien-tas.Como esta escrito en Common Lisp, es fácilmente accesible para la pro-

gramación, desde la capa inferior de Lisp puede llamarse a Maxima. Comola mayoría de sistemas algebraicos, Maxima se especializa en operacionessimbólicas. También ofrece capacidades numéricas especiales, como son losnúmeros enteros y racionales, los cuales pueden crecer en tamaño sólo limi-tado por la memoria de la máquina; y números reales en coma �otante, cuyaprecisión puede ser arbitrariamente larga (b�oat). Permite el manejo de ex-presiones simbólicas y numéricas, y además produce resultados con una altaprecisión.Para cálculos intensivos en reales de coma �otante, Maxima ofrece la posi-

bilidad de generar código en otros lenguajes de programación, como Fortran,que quizá se ejecuten de manera más e�ciente.Maxima es un sistema de propósito general; como tal los cálculos espe-

ciales como la factorización de números grandes, la manipulación de poli-nomios extremadamente grandes, etc. son normalmente realizados de formamás e�ciente y rápida en sistemas especializados.

� Números

� Listas, arreglos y matrices

� Transformaciones algebraicas

� Resolución de ecuaciones

� Límites, derivadas e integrales

� Conjuntos

[email protected] 379 Antonio Carrillo Ledesma, Et alii

Page 382: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Vectores y campos

� Grá�cos

� Ecuaciones diferenciales

� Probabilidades y análisis de datos

� Interpolación numérica

� Inecuaciones racionales

� Ecuaciones diferenciales ordinarias

� Sistemas de ecuaciones diferenciales ordinarias

� Series de potencias

� Transformada de Laplace

� Ecuaciones recurrentes

� Generación de expresiones en Tex

� Programación

9.2 Trabajando con Maxima

Maxima es un poderoso paquete que puede hacer múltiples operaciones pornosotros, a continuación haremos un viaje por sus capacidades, pero sólo esuna muestra de ellas, para más información revise el manual y ejemplos enlínea.

Operaciones Aritméticas Para iniciar, podemos usar a Maxima comouna calculadora, por ejemplo (34*6)/34, entonces escribimos:

(34*6)/34;

y el paquete nos dará el resultado, las operaciones soportadas son +,-,*,/y ^. Además puede trabajar con números enteros tan grandes como se desee,por ejemplo para calcular el factorial de 200, hacemos:

[email protected] 380 Antonio Carrillo Ledesma, Et alii

Page 383: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

200!;

Maxima devuelve los resultados de forma exacta sin aproximaciones de-cimales, por ejemplo para resolver la siguiente operación:"�

37

4 + 35

��1+7

9

#3escribimos:

((3^7/(4+3/5)^(-1)+7/9)^3;

y obtenemos el resultado de forma simpli�cada. Si lo necesitamos podemospedir el resultado en forma decimal; por ejemplo si queremos la expresióndecimal del último resultado, escribimos:

�oat(%);

Maxima puede trabajar con precisión arbitraria. Para calcular el valordel cociente e

�con cien cifras decimales, debemos especi�car primero la pre-

cisión requerida asignándole a la variable fpprec el valor 100 y a continuaciónrealizar el cálculo, solicitando la expresión decimal con una llamada a lafunción b�oat, de esta forma:

fpprec:100$ b�oat(%e / %pi);

aquí se usa el símbolo de $ como delimitador entre instrucciones.

Factorización Maxima permite factorizar un número como el factorialde doscientos (200!) en sus factores primos, sólo hacemos:

factor(200!);

y nos entregará la lista de los factores primos. Si queremos saber el tiempode ejecución que lleva hacer algún cálculo, hacemos:

showtime:true$

y especi�camos la operación:

factor(2 ^300-1);

y desactivamos la información de tiempo de cálculo mediante:

showtime:false$

[email protected] 381 Antonio Carrillo Ledesma, Et alii

Page 384: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Números Complejos Maxima soporta números complejos, la unidadimaginaria

p�1 se representa mediante el símbolo %i y soporta operaciones

básicas con números complejos, por ejemplo de�nimos los números z1 y z2:

z1:3+5*%i$ z2:1/2-4*%i$

ahora podemos hacer cualquier otra operación, por ejemplo sumarlas:

z1+z2;

Combinatoria Maxima también soporta combinatoria, por ejemplo elcálculo de permutaciones de 3 elementos, mediante:

factorial(3)

si queremos generarlas, hacemos uso de la fución permutations, por ejem-plo:

permutations([1,2,3]);

cuando se trabaja con factoriales, la función minfactorial puede ayudara simpli�car algunas expresiones, por ejemplo:

minfactorial(n!/(n+2)!);

Expresiones Algebraicas Una de las capacidades más destacables deMaxima es su habilidad para manipular expresiones algebraicas, por ejemploa la variable q le asignaremos un expresión literal:

q: (x+3)^5-(x-a)^3+(x+b)^(-1)+(x-1/4)^(-5);

se observa que en principio Maxima no realiza ningún cálculo. La funciónexpand se encarga de desarrollar las potencias y los productos algebraicos:

expand(q);

[email protected] 382 Antonio Carrillo Ledesma, Et alii

Page 385: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

no obstante es posible que no nos interese desplegar toda la expresión,entre otras cosas para evitar una respuesta farragosa y difícil de interpretar;en tal caso podemos utilizar expand añadiéndole dos argumentos y operandode la siguiente manera:

expand(q,3,2);

con los argumentos adicionales indicamos que queremos la expansión detodas aquellas potencias con exponente positivo menor o igual a 3 y de lasque teniendo el exponente negativo no excedan en valor absoluto de 2.Dada una expresión con valores literales, podemos desear sustituir alguna

letra por otra expresión; por ejemplo, si queremos hacer los cambios a = 2,b = 2c en el último resultado obtenido:

%,a=2,b=2*c;

De forma más general, la función subst sustituye subexpresiones enteras.En el siguiente ejemplo, introducimos una expresión algebraica y a conti-nuación sustituimos todos los binomios x+ y por la letra k:

1/(x+y)-(y+x)/z+(x+y)^2;subst(k,x+y,%);

No obstante, el siguiente resultado nos sugiere que debemos ser precavidoscon el uso de esta función, ya que Maxima no siempre interpretará comosubexpresión aquella que para nosotros sí lo es:

subst(sqrt(k),x+y,(x+y)^2+(x+y));

la función subst realiza una simple sustitución sintáctica que, si bien essu�ciente en la mayor parte de los casos, a veces se queda corta como enla situación anterior; la función ratsubst es capaz de utilizar informaciónsemántica y obtiene mejores resultados:

ratsubst(sqrt(k),x+y,(x+y)^2+(x+y));

la operación inversa de la expansión es la factorización. Expandamos yfactoricemos sucesivamente un polinomio para comprobar los resultados:

[email protected] 383 Antonio Carrillo Ledesma, Et alii

Page 386: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

expand((a-2)*(b+1)^2*(a+b)^5);factor(%);

el máximo común divisor de un conjunto de polinomios se calcula con lafunción gcd y el mínimo común múltiplo con lcm:

p1: x^7-4*x^6-7*x^5+8*x^4+11*x^3-4*x^2-5*x;p2: x^4-2*x^3-4*x^2+2*x+3;gcd(p1,p2);load(functs)$lcm(p1,p2);

es posible que deseemos disponer delmcd factorizado, por lo que hacemos:

factor(%);

la instrucción solve puede admitir como segundo argumento la incógnitaque se pretende calcular, lo que resultará de utilidad cuando en la ecuaciónaparezcan constantes literales:

solve((2-a)/x-3=b*x+1/x,x);

Matrices Podemos también hacer uso de matrices, por ejemplo:

M : matrix([sqrt(3),2/5],[3,sin(2)]);

y resolverla:

linsolve_by_lu(M,M.M,��oat�eld);

Límites Sin más preámbulos, veamos algunos ejemplos de cómo calcu-lar límites con la asistencia de Maxima. En primer lugar vemos que es posiblehacer que la variable se aproxime al in�nito (x!1), o que se aproxime almenos in�nito (x! �1):

limit(1/sqrt(x),x,inf);

[email protected] 384 Antonio Carrillo Ledesma, Et alii

Page 387: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Derivadas Maxima controla el cálculo de derivadas mediante la ins-trucción di¤ . A continuación se presentan algunos ejemplos sobre su uso:

di¤(x^log(a*x),x);

la segunda derivada:

di¤(x^log(a*x),x,2);

Integrales En Maxima la función que controla el cálculo de integraleses integrate, tanto para las de�nidas como inde�nidas; empecemos por estasúltimas:

integrate(cos(x)^3/sin(x)^4,x);

otro ejemplo sobre la integral de�nida es:

integrate(2*x/((x-1)*(x+2)),x,3,5);�oat(%);

[email protected] 385 Antonio Carrillo Ledesma, Et alii

Page 388: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

9.3 Desde la Nube

Existen diferentes servicios Web108 que permiten editar, compilar y ejecutarcódigo de diversos lenguajes y paquetes desde el navegador, esto en aras deque los estudiantes y profesores que cuenten con algún sistema de acceso ared y un navegador puedan programar en los más diversos lenguajes, IDESy terminales sin hacer instalación alguna en su equipo de cómputo, tabletao teléfono celular.Algunos ejemplos de estos servicio son:

� https://mathics.angusgri¢ th.com/ Clon de Mathematica

� http://www.wolframalpha.com/

� http://www.quickmath.com/

� http://maxima-online.org

� http://maxima.cesga.es/

108Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnitopara no guardar el historial de navegación, información introducida en los formularios yborrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitiosWeb que visitamos sí guardan información de nuestra visita, nuestro proveedor de Internettambién guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igualque el historial de descargas, además de las marcas de páginas o favoritos se conservaránal cerrar al navegador.

[email protected] 386 Antonio Carrillo Ledesma, Et alii

Page 389: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

10 Programación en Paquetes Estadísticos

Los paquetes estadísticos, son programas matemáticos que ofrecen un en-torno de desarrollo integrado (IDE) con un lenguaje de programación propiocon un amplio abanico de herramientas de lectura, manipulación, análisis ygra�cación de datos estadísticos. Entre sus prestaciones básicas destacan:

� Análisis de datos mediante operadores para cálculos sobre arreglos,matrices y/o Tablas

� Tablas Cruzadas

� Reordenamiento de Datos

� Análisis de la Varianza (ANOVA)

� Frecuencias

� Estadística Descriptiva

� Estadística Lineal

� Estadística no Lineal

� Estadística Biestadística

� Pruebas Estadísticas Clásicas

� Análisis de Serie de Temporales

� Modelos de Regresión

� Clasi�cación

� Fiabilidad

� Categorías

� Clustering

� Validación de Datos

� Tendencias

[email protected] 387 Antonio Carrillo Ledesma, Et alii

Page 390: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Grá�cos y Diagramas

Actualmente, los paquetes estadísticos usados en las carreras de Actua-ría, Ciencias de la Computación, Matemáticas, Matemáticas Aplicadas y loscursos de Mátemáticas de las demás carreras de la Facultad (véase [2]) son:

� SPSS (véase [27])

� R (véase [29])

� SAS (véase [26])

� PSPP (véase [28])

� EViews (véase [35])

� Gretel (véase [36])

� Stata (véase [34])

� Statgraphics (véase [37])

� Statistica (véase [38])

� Systat (véase [39])

� Vensim (véase [40])

� Maple (véase [41])

� Mathematica (véase [42])

� MATLAB (véase [19])

� FreeMat (véase [22])

� Octave (véase [23])

� Maxima (véase [43])

� Scipy (véase [24])

� Anaconda (véase [47])

[email protected] 388 Antonio Carrillo Ledesma, Et alii

Page 391: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� SageMath (véase [48])

En el presente trabajo nos centraremos en R, pero el resto de los paquetesson muy usados ya sea por sus características, facilidad de uso o la accesibi-lidad del paquete para los estudiantes. Cabe aclarar, que los paquete SPSSy SAS tienen un alto costo monetario, en el caso de SAS existe una versiónestudiantil gratuita y SPPS hay una versión de prueba.

10.1 Cálculo Estadístico con R

El paquete R (véase [29]) es un lenguaje y entorno de programación paraanálisis estadístico y grá�co. Se trata de un proyecto de Software libre,resultado de la implementación GNU del premiado lenguaje S. SPSS, R yS-Plus � versión comercial de S� son, probablemente, los tres lenguajes másutilizados en investigación por la comunidad estadística, siendo además muypopulares en el campo de la investigación biomédica, la bioinformática y lasmatemáticas �nancieras. A esto contribuye la posibilidad de cargar diferentesbibliotecas o paquetes con �nalidades especí�cas de cálculo o grá�co.Además, R puede integrarse con distintas bases de datos y existen bi-

bliotecas que facilitan su uso desde lenguajes de programación interpretadoscomo Perl y Python. R soporta hacer interfase con lenguajes de programacióncomo C, C++ y Fortran.Otra de las características de R es su capacidad grá�ca, que permite

generar grá�cos con alta calidad. R posee su propio formato para la do-cumentación basado en LaTeX (véase [18]). R también puede usarse comoherramienta de cálculo numérico, campo en el que puede ser tan e�caz comootras herramientas especí�cas tales como FreeMat, GNU Octave y su equi-valente comercial, MATLAB. Se ha desarrollado una interfaz RWeka parainteractuar con Weka (véase [44]) que permite leer y escribir �cheros en elformato ar¤ y enriquecer R con los algoritmos de minería de datos de dichaplataforma.Los ambientes de desarrollo integrado para R existen como proyectos

externos, como pueden ser editores � que sólo soportan la sintaxis� , los IDEs(Integrate Development Environments) y los GUI (Graphical User Interfaces)� permiten editar, ejecutar y depurar código desarrollado para R� . Hay másde 20 proyectos activos, dos de los más conocidos son Tinn-R (véase [45]) yRStudio (véase [46]).

[email protected] 389 Antonio Carrillo Ledesma, Et alii

Page 392: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

10.2 Trabajando con R

R es un poderoso paquete que puede hacer múltiples operaciones por nosotros,a continuación haremos un viaje por sus capacidades, pero sólo es una mues-tra de ellas, para más información revise el manual y ejemplos en línea.Veamos algunos aspectos básicos a tener en cuenta:

� R distingue mayúsculas y minúsculas

� Para asignar contenido a un objeto usamos <-. Por ejemplo, x <- 10asigna a x el valor 10. En lugar de <- también podemos usar =

� Para ver el contenido de un objeto simplemente escribimos su nombre

� Para usar los comandos escribimos el nombre del comando seguidode sus argumentos entre paréntesis. Por ejemplo, ls() da una listade los objetos en el área de trabajo. Como no usamos argumentos(diferentes a los que el comando tenga por defecto) no escribimos nadaen el paréntesis

� Para obtener ayuda usamos el comando help. Por ejemplo, help(mean)para obtener ayuda sobre el comando mean que calcula la media

El comando c se usa para combinar varios objetos en uno solo. Porejemplo:

x <- c(3, 5, 10)

crea el vector x = (3; 5; 10), ahora lo visualizamos mediante:

x

para calcular, por ejemplo la media de x, hacemos:

mean(x)

Es habitual encontrar datos en la Web en formato de texto. Antes depoder trabajar con ellos hemos de importarlos a un formato con el que Rpueda trabajar. Por ejemplo, en la comunidad de Madrid evalúa anualmente

[email protected] 390 Antonio Carrillo Ledesma, Et alii

Page 393: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

a los alumnos de sexto de primaria de todos los colegios sobre varias materias.Los datos que vamos a utilizar corresponden a las notas medias obtenidaspor los colegios en los años 2009 y 2010 (fuente: diario El País) junto con eltipo de colegio (concertado, privado o público).Para ello, hay que bajar los datos y generar un �chero de R, el comando

read.table lee un �chero de datos de texto y crea un �chero con el que R yapuede trabajar. En nuestro ejemplo vamos a usar los siguientes argumentos:

� El camino en el que se encuentra el �chero (entre comillas).

� El argumento sep que especi�ca la separación entre las distintas va-riables. En este caso, un espacio en blanco.

� El argumento dec que especi�ca cómo se separa en los números la parteentera y la parte decimal. En este caso, mediante una coma.

� El argumento header que especi�ca si la primera �la del �chero contiene(TRUE) o no (FALSE) los nombres de las variables. En este caso, laprimera �la sí contiene los nombres de las variables.

notas<- read.table("http://www.uam.es/joser.berrendero/datos/notas.txt",

sep = " ", dec = ",", header = TRUE)

Medidas descriptivas elementales, para ver los nombres de las variablesdel �chero notas, escribimos:

names(notas)

dentro de este �chero cada variable se identi�ca usando la sintaxis:

�chero$variable

Por ejemplo, las medias de las notas de 2009 y 2010 se obtienen con loscomandos:

mean(notas$nota09)

las desviaciones típicas de las notas de 2009 y 2010 se obtienen con loscomandos:

[email protected] 391 Antonio Carrillo Ledesma, Et alii

Page 394: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

sd(notas$nota09)sd(notas$nota10)

el comando summary permite calcular algunas medidas descriptivas ele-mentales de todas las variables del �chero simultáneamente:

summary(notas)

Ya con esta información, ahora podemos generar un histograma de lasnotas de 2009. La distribución es bastante simétrica aunque muestra unaligera asimetría a la izquierda.

hist(notas$nota09)

para comparar conjuntos de datos un diagrama de caja puede ser másútil que un histograma. Por ejemplo, para comparar las notas de 2009 conlas de 2010:

boxplot(notas$nota09, notas$nota10)

vemos que en 2010 las notas tienden a ser más bajas. También podemoscomparar las notas de 2010 para cada tipo de colegio. Aunque las diferenciasno son muy grandes, los centros privados tienden a tener notas más altas quelos concertados, y éstos más altas que los públicos.

boxplot(notas$nota10 ~notas$tipo)plot of chunk boxplot2

para estudiar si hay relación entre las notas de los dos años podemosrepresentar la nube de puntos correspondiente:

plot(notas$nota09, notas$nota10)

se observa una relación positiva moderada. Numéricamente, esta relaciónse puede cuanti�car mediante la covarianza y la correlación:

cov(notas$nota09, notas$nota10)cor(notas$nota09, notas$nota10)

[email protected] 392 Antonio Carrillo Ledesma, Et alii

Page 395: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Además de analizar datos, R se puede usar para llevar a cabo todo tipode representaciones grá�cas y cálculos matemáticos. Por ejemplo, la funcióncos(x^2) se puede representar entre

�0; 2

�mediante:

curve(cos(x^2), 0, 2 * pi)

la integral de la función anterior entre�0; 2

�se calcula con:

integrate(function(x) cos(x^2), 0, pi)

una derivada de la función se obtiene de la siguiente forma:

D(expression(cos(x^2)), "x")

para representar la función de densidad de una variable aleatoria normalde media � = 3 y desviación típica � = 1 escribimos:

curve(dnorm(x, mean = 3, sd = 1), -1, 7)

hemos usado el comando dnorm, con los argumentos adecuados, paraevaluar la función de densidad normal. Si lo que queremos es generar 1000números aleatorios que sigan esta distribución y después representar el his-tograma correspondiente:

x <- rnorm(1000, mean = 3, sd = 1)hist(x)

Podemos escribir también nuestras propias funciones. En este apartadovamos a ver un ejemplo muy simple. Se trata de escribir una función quesimule los resultados de n tiradas de un dado. Por defecto n. El resultadoes un vector que contiene las frecuencias de cada posible resultado. Abrimosel editor (Archivo, Abrir script) y escribimos:

Dado <- function(n = 50) {

# Genera n lanzamientos de un dado y devuelve la tabla de frecuen-cias

lanzamientos <- sample(1:6, n, rep = TRUE)

# Selecciona con reemplazamiento n números en 1,2,...,6

frecuencias <- table(lanzamientos) # Obtiene la tabla de frecuencias

return(frecuencias)

}

[email protected] 393 Antonio Carrillo Ledesma, Et alii

Page 396: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

una vez guardado el �chero que contiene la función podemos usar:

source(nombredelfichero)

para cargar la función en el área de trabajo y poder usarla o, alternativa-mente, copiar y pegar el código anterior en la consola. Una vez hecho esto,ya podemos usar la función.

Dado(1000)Dado()

10.2.1 R y Python

El paquete R es un lenguaje y entorno de programación para análisis es-tadístico y grá�co poderoso, pero es posible exteder su uso al lenguaje deprogramación de Python, logrando una amalgama aún en proceso de desa-rrollo que permite tener lo mejor de ambos mundos con muy poco trabajoextra.Para iniciar, se debe importar las funciones y demás que componen la

parte del paquete R para poder usarse en Python, mediante:

from R_functions import *

y se esta listo para usar R en Python, ejemplo:

lst=[20,12,16,32,27,65,44,45,22,18]�venum(lst)

obteniendo:

> array([12. , 18.5, 24.5, 41. , 65. ])

Un ejemplo más es calcular un diagrama de barras con unas cuantas líneasusando la función dbinom:

probs=[]import matplotlib.pyplot as pltfor i in range(11):probs.append(dbinom(i,10,0.6))

plt.bar(range(11),height=probs)plt.grid(True)plt.show()

[email protected] 394 Antonio Carrillo Ledesma, Et alii

Page 397: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Por otro lado existe Anaconda, una Suite de código abierto que abarcauna serie de aplicaciones, librerías y conceptos diseñados para el desarrollode la Ciencia de datos con Python. En líneas generales Anaconda Distribu-tion es una distribucción de Python que funciona como un gestor de en-torno, un gestor de paquetes y que posee una colección de más de 720 pa-quetes de código abierto. Anaconda Distribution se agrupa en 4 sectoreso soluciones tecnológicas, Anaconda Navigator, Anaconda Project, Las li-brerías de Ciencia de datos y Conda. Todas estas se instalan de maneraautomática y en un procedimiento muy sencillo. Para más información ver:https://www.anaconda.com/.

También esta SageMath, una Suite de código abierto bajo la licencia GPLde Software matemático como: NumPy, SciPy, matplotlib, Sympy, Maxi-ma, GAP, FLINT, R, entre otros. Además combina acceso a una poderosacombinación del lenguaje basada en Python o directamente vía interfaceso Wrappers. La misión del proyecto es crear una alternativa de Softwarelibre a Magma, Maple, Mathematica y Matlab. Para más información ver:http://www.sagemath.org/.

10.3 Desde la Nube

Existen diferentes servicios Web109 que permiten editar, compilar y ejecutarcódigo de diversos lenguajes y paquetes desde el navegador, esto en aras deque los estudiantes y profesores que cuenten con algún sistema de acceso ared y un navegador puedan programar en los más diversos lenguajes, IDESy terminales sin hacer instalación alguna en su equipo de cómputo, tabletao teléfono celular.Algunos ejemplos de estos servicio son:

� Para R https://nclab.com/free-portal/

� Para R https://cdn.datacamp.com/dcl-react-prod/example.html

109Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnitopara no guardar el historial de navegación, información introducida en los formularios yborrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que los sitiosWeb que visitamos sí guardan información de nuestra visita, nuestro proveedor de Internettambién guarda constancia de nuestra visita y si descargamos algo, esto no se borra al igualque el historial de descargas, además de las marcas de páginas o favoritos se conservaránal cerrar al navegador.

[email protected] 395 Antonio Carrillo Ledesma, Et alii

Page 398: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

11 Apéndice A: Software Libre y Propietario

Hoy en día los usuarios disponemos de dos grandes opciones para adquirir yusar el Software necesario para que nuestra computadora funcione, a saber:

� Por un lado, podemos emplear programas comerciales, de los cuales nosomos dueños del Software, sólo concesionarios al adquirir una licenciade uso del Software y nos proporcionan un instalable del programaadquirido. La licencia respectiva es en la gran mayoría de los casosmuy restrictiva, ya que restringe su uso a una sola máquina y/o usuariosimultáneamente.

� Por otro lado, existe el Software libre, desarrollados por usuarios y parausuarios que, entre otras cosas, comparten los códigos fuente, el pro-grama ejecutable y dan libertades para estudiar, adaptar y redistribuira quien así lo requiera el programa y todos sus derivados.

11.1 Software Libre

La de�nición de Software libre (véase [16], [17], [12], [13], [11] y [15]) estipulalos criterios que se tienen que cumplir para que un programa sea consideradolibre. De vez en cuando se modi�ca esta de�nición para clari�carla o pararesolver problemas sobre cuestiones delicadas. «Software libre» signi�ca queel Software respeta la libertad de los usuarios y la comunidad. En térmi-nos generales, los usuarios tienen la libertad de copiar, distribuir, estudiar,modi�car y mejorar el Software. Con estas libertades, los usuarios � tantoindividualmente como en forma colectiva� controlan el programa y lo quehace.Cuando los usuarios no controlan el programa, el programa controla a los

usuarios. Los programadores controlan el programa y, a través del programa,controlan a los usuarios. Un programa que no es libre, llamado «privativoo propietario» , y es considerado por muchos como un instrumento de poderinjusto.El Software libre es la denominación del Software que respeta la liber-

tad de todos los usuarios que adquirieron el producto y, por tanto, una vezobtenido el mismo puede ser usado, copiado, estudiado, modi�cado, y re-distribuido libremente de varias formas. Según la Free Software Foundation

[email protected] 396 Antonio Carrillo Ledesma, Et alii

Page 399: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

(véase [16]), el Software libre se re�ere a la libertad de los usuarios para eje-cutar, copiar, distribuir, y estudiar el mismo, e incluso modi�car el Softwarey distribuirlo modi�cado.Un programa es Software libre si los usuarios tienen las cuatro libertades

esenciales:

0. La libertad de usar el programa, con cualquier propósito.

1. La libertad de estudiar cómo funciona el programa y modi�carlo, adap-tándolo a tus necesidades.

2. La libertad de distribuir copias del programa, con lo cual puedes ayudara tu prójimo.

3. La libertad de mejorar el programa y hacer públicas esas mejoras a losdemás, de modo que toda la comunidad se bene�cie.

Un programa es Software libre si los usuarios tienen todas esas libertades.Por tanto, el usuario debe ser libre de redistribuir copias, tanto con, comosin modi�caciones, ya sea gratuitamente o cobrando una tarifa por la dis-tribución, a cualquiera en cualquier parte. El ser libre de hacer estas cosassigni�ca, entre otras cosas, que no tiene que pedir ni pagar el permiso.También debe tener la libertad de hacer modi�caciones y usarlas en pri-

vado para su propio trabajo o pasatiempo, sin siquiera mencionar que exis-ten. Si publica sus cambios, no debe estar obligado a noti�carlo a nadie enparticular, ni de ninguna manera en particular.La libertad de ejecutar el programa signi�ca que cualquier tipo de persona

u organización es libre de usarlo en cualquier tipo de sistema de computación,para cualquier tipo de trabajo y �nalidad, sin que exista obligación algunade comunicarlo al programador ni a ninguna otra entidad especí�ca. Enesta libertad, lo que importa es el propósito de los usuarios, no el de losprogramadores. El usuario es libre de ejecutar el programa para alcanzarsus propósitos, y si lo distribuye a otra persona, también esa persona serálibre de ejecutarlo para lo que necesite; nadie tiene derecho a imponerle suspropios objetivos.La libertad de redistribuir copias debe incluir las formas binarias o eje-

cutables del programa, así como el código fuente, tanto para las versionesmodi�cadas como para las que no lo esten. Distribuir programas en formade ejecutables es necesario para que los sistemas operativos libres se puedan

[email protected] 397 Antonio Carrillo Ledesma, Et alii

Page 400: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

instalar fácilmente. Resulta aceptable si no existe un modo de producir unformato binario o ejecutable para un programa especí�co, dado que algunoslenguajes no incorporan esa característica, pero debe tener la libertad de re-distribuir dichos formatos si encontrara o programara una forma de hacerlo.Para que la libertad 1 y 3 de realizar cambios y publicar las versiones

modi�cadas tengan sentido, el usuario debe tener acceso al código fuentedel programa. Por consiguiente, el acceso al código fuente es una condiciónnecesaria para el Software libre. El «código fuente» compilado no es códigofuente real, y no cuenta como código fuente.La libertad 1 incluye la libertad de usar su versión modi�cada en lugar

de la original. Si el programa se entrega con un producto diseñado para eje-cutar versiones modi�cadas de terceros, pero rechaza ejecutar las suyas, unapráctica conocida como «tivoización» o «arranque seguro» [«Lockdown» ]la libertad 1 se convierte más en una �cción teórica que en una libertad prác-tica. Esto no es su�ciente. En otras palabras, estos binarios no son Softwarelibre, incluso si se compilaron desde un código fuente que es libre.Una manera importante de modi�car el programa es agregándole subruti-

nas y módulos libres ya disponibles. Si la licencia del programa especi�ca queno se pueden añadir módulos que ya existen y que estan bajo una licenciaapropiada, por ejemplo si requiere que usted sea el titular de los derechos deautor del código que desea añadir, entonces se trata de una licencia demasia-do restrictiva como para considerarla libre.La libertad 3 incluye la libertad de publicar sus versiones modi�cadas

como Software libre. Una licencia libre también puede permitir otras formasde publicarlas; en otras palabras, no tiene que ser una licencia de Copyleft.No obstante, una licencia que requiera que las versiones modi�cadas no seanlibres, no se puede considerar libre.«Software libre» no signi�ca que «no es comercial» . Un programa libre

debe estar disponible para el uso comercial, la programación comercial y ladistribución comercial. La programación comercial de Software libre ya noes inusual; tal Software libre comercial es muy importante, ejemplo de elloes la empresa RedHat. Puede haber pagado dinero para obtener copias deSoftware libre, o puede haber obtenido copias sin costo. Pero sin tener encuenta cómo obtuvo sus copias, siempre tiene la libertad de copiar y modi�carel Software, incluso de vender copias.El término Software no libre se emplea para referirse al Software dis-

tribuido bajo una licencia de Software más restrictiva que no garantiza estascuatro libertades. Las leyes de la propiedad intelectual reservan la mayoría de

[email protected] 398 Antonio Carrillo Ledesma, Et alii

Page 401: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

los derechos de modi�cación, duplicación y redistribución para el dueño delCopyright; el Software dispuesto bajo una licencia de Software libre rescindeespecí�camente la mayoría de estos derechos reservados.Los manuales de Software deben ser libres por las mismas razones que

el Software debe ser libre, y porque de hecho los manuales son parte delSoftware. También tiene sentido aplicar los mismos argumentos a otros tiposde obras de uso práctico; es decir, obras que incorporen conocimiento útil, talcomo publicaciones educativas y de referencia. La Wikipedia es el ejemplomás conocido.Tanto la Open Source Initiative como la Free Software Foundation mantie-

nen en sus páginas Web (véase [16], [17], y [15]) o�ciales listados de laslicencias de Software libre que aprueban.

11.1.1 Tipos de Licencias

Una licencia es aquella autorización formal con carácter contractual que unautor de un Software da a un interesado para ejercer "actos de explotaciónlegales". Pueden existir tantas licencias como acuerdos concretos se den entreel autor y el licenciatario. Desde el punto de vista del Software libre, existendistintas variantes del concepto o grupos de licencias:

Licencias GPL Una de las más utilizadas es la Licencia Pública Generalde GNU ( GNU GPL). El autor conserva los derechos de autor (Copyright),y permite la redistribución y modi�cación bajo términos diseñados para ase-gurarse de que todas las versiones modi�cadas del Software permanecen bajolos términos más restrictivos de la propia GNU GPL. Esto hace que sea im-posible crear un producto con partes no licenciadas GPL: el conjunto tieneque ser GPL.En la práctica, esto hace que las licencias de Software libre se dividan en

dos grandes grupos, aquellas que pueden ser mezcladas con código licenciadobajo GNU GPL (y que inevitablemente desaparecerán en el proceso, al serel código resultante licenciado bajo GNU GPL) y las que no lo permiten alincluir mayores u otros requisitos que no contemplan ni admiten la GNUGPL y que por lo tanto no pueden ser enlazadas ni mezcladas con códigogobernado por la licencia GNU GPL.

Licencias estilo BSD Llamadas así porque se utilizan en gran cantidad deSoftware distribuido junto a los sistemas operativos BSD. El autor, bajo tales

[email protected] 399 Antonio Carrillo Ledesma, Et alii

Page 402: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

licencias, mantiene la protección de Copyright únicamente para la renunciade garantía y para requerir la adecuada atribución de la autoría en traba-jos derivados, pero permite la libre redistribución y modi�cación, incluso sidichos trabajos tienen propietario. Son muy permisivas, tanto que son fácil-mente absorbidas al ser mezcladas con la licencia GNU GPL con quienes soncompatibles. Puede argumentarse que esta licencia asegura "verdadero" Soft-ware libre, en el sentido que el usuario tiene libertad ilimitada con respectoal Software, y que puede decidir incluso redistribuirlo como no libre.

Copyleft Hay que hacer constar que el titular de los derechos de autor(Copyright) de un Software bajo licencia Copyleft puede también realizaruna versión modi�cada bajo su Copyright original, y venderla bajo cualquierlicencia que desee, además de distribuir la versión original como Softwarelibre. Esta técnica ha sido usada como un modelo de negocio por una seriede empresas que realizan Software libre (por ejemplo MySQL); esta prácticano restringe ninguno de los derechos otorgados a los usuarios de la versiónCopyleft.

Comparación con el Software de Código Abierto Aunque en la prác-tica el Software de código abierto y el Software libre comparten muchas de suslicencias, la Free Software Foundation opina que el movimiento del Softwarede código abierto es �losó�camente diferente del movimiento del Softwarelibre. Los defensores del término «código abierto (Open Source)» , a�rmanque éste evita la ambigüedad del término en ese idioma que es «Free» en«Free Software» .Mucha gente reconoce el bene�cio cualitativo del proceso de desarrollo de

Software cuando los desarrolladores pueden usar, modi�car y redistribuir elcódigo fuente de un programa. El movimiento del Software libre hace especialénfasis en los aspectos morales o éticos del Software, viendo la excelenciatécnica como un producto secundario de su estandar ético. El movimientode código abierto ve la excelencia técnica como el objetivo prioritario, siendoel compartir el código fuente un medio para dicho �n. Por dicho motivo, laFSF se distancia tanto del movimiento de código abierto como del término«código abierto (Open Source)» .Puesto que la «iniciativa de Software libre Open Source Initiative (OSI)»

sólo aprueba las licencias que se ajustan a la «de�nición de código abierto(Open Source De�nition)» , la mayoría de la gente lo interpreta como un es-

[email protected] 400 Antonio Carrillo Ledesma, Et alii

Page 403: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

quema de distribución, e intercambia libremente "código abierto" con "Soft-ware libre". Aún cuando existen importantes diferencias �losó�cas entreambos términos, especialmente en términos de las motivaciones para el de-sarrollo y el uso de tal Software, raramente suelen tener impacto en el procesode colaboración.Aunque el término "código abierto" elimina la ambigüedad de libertad

frente a precio (en el caso del inglés), introduce una nueva: entre los progra-mas que se ajustan a la de�nición de código abierto, que dan a los usuariosla libertad de mejorarlos, y los programas que simplemente tiene el códigofuente disponible, posiblemente con fuertes restricciones sobre el uso de dichocódigo fuente. Mucha gente cree que cualquier Software que tenga el códigofuente disponible es de código abierto, puesto que lo pueden manipular. Sinembargo, mucho de este Software no da a sus usuarios la libertad de dis-tribuir sus modi�caciones, restringe el uso comercial, o en general restringelos derechos de los usuarios.

11.2 Software Propietario

No existe consenso sobre el término a utilizar para referirse al opuesto delSoftware libre. La expresión «Software propietario (Proprietary Software)»(véase [14]), en la lengua anglosajona, "Proprietary" signi�ca «poseído ocontrolado privadamente (Privately Owned and Controlled)» , que destacala manutención de la reserva de derechos sobre el uso, modi�cación o redis-tribución del Software. Inicialmente utilizado, pero con el inconveniente quela acepción proviene de una traducción literal del inglés, no correspondiendosu uso como adjetivo en el español, de manera que puede ser consideradocomo un barbarismo.El término "propietario" en español resultaría inadecuado, pues signi�ca

que «tiene derecho de propiedad sobre una cosa» , por lo que no podría cali�-carse de "propietario" al Software, porque éste no tiene propiedad sobre nada(es decir, no es dueño de nada) y, además, no podría serlo (porque es una cosay no una persona). Así mismo, la expresión "Software propietario" podríaser interpretada como "Software sujeto a propiedad" (derechos o titularidad)y su opuesto, el Software libre, también esta sujeto al derecho de autor. Otrainterpretación es que contrariamente al uso popular del término, se puedea�rmar de que "todo Software es propietario", por lo que la forma correctade referirse al Software con restricciones de uso, estudio, copia o mejora esla de Software privativo, según esta interpretación el término "propietario"

[email protected] 401 Antonio Carrillo Ledesma, Et alii

Page 404: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

podría aplicarse tanto para Software libre como Software privativo, ya quela diferencia entre uno y otro esta en que el dueño del Software privativo lolicencia como propiedad privada y el de Software libre como propiedad social.Con la intención de corregir el defecto de la expresión "Software propie-

tario" aparece el llamado "Software con propietario", sin embargo se ar-gumenta contra del término "con propietario" justamente su similitud conProprietary en inglés, que sólo haría referencia a un aspecto del Softwareque no es libre, manteniendo una de las principales críticas a éste (de "Soft-ware sujeto a derechos" o "propiedad"). Adicionalmente, si "propietario"se re�ere al titular de los derechos de autor � y esta claro que no se puedereferir al usuario, en tanto éste es simplemente un cesionario� , no resuelvela contradicción: todo el Software libre tiene también titulares de derechosde autor.La expresión Software no libre (en inglés Non-Free Software) es usado

por la FSF para agrupar todo el Software que no es libre, es decir, incluye alllamado en inglés "Semi-Free Software" (Software semilibre) y al "PropietarySoftware". Asimismo, es frecuentemente utilizado para referirse al Softwareque no cumple con las Directrices de Software libre de Debian GNU/Linux,las cuales siguen la misma idea básica de libertad en el Software, propugnadapor la FSF, y sobre las cuales esta basada la de�nición de código abierto dela Open Source Initiative.Adicionalmente el Software de código cerrado nace como antónimo de

Software de código abierto y por lo tanto se centra más en el aspecto deausencia de acceso al código que en los derechos sobre el mismo. éste sere�ere sólo a la ausencia de una sola libertad por lo que su uso debe enfocarsesólo a este tipo de Software y aunque siempre signi�que que es un Softwareque no es libre, no tiene que ser Software de código cerrado.La expresión Software privado es usada por la relación entre los conceptos

de tener y ser privado. Este término sería inadecuado debido a que, en una desus acepciones, la palabra "privado" se entiende como antónimo de "público",es decir, que «no es de propiedad pública o estatal, sino que pertenece a par-ticulares» , provocando que esta categoría se interpretará como no referenteal Estado, lo que produciría la exclusión del Software no libre generado porel aparato estatal. Además, el "Software público" se asocia generalmente conSoftware de dominio público.

[email protected] 402 Antonio Carrillo Ledesma, Et alii

Page 405: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

11.3 Implicaciones Económico-Políticas

Una vez que un producto de Software libre ha empezado a circular, rápida-mente esta disponible a un costo muy bajo. Al mismo tiempo, su utilidad nodecrece. El Software, en general, podría ser considerado un bien de uso in-agotable, tomando en cuenta que su costo marginal es pequeñísimo y que noes un bien sujeto a rivalidad � la posesión del bien por un agente económicono impide que otro lo posea� .Puesto que el Software libre permite el libre uso, modi�cación y redis-

tribución, a menudo encuentra un hogar entre usuarios para los cuales elcoste del Software no libre es a veces prohibitivo, o como alternativa a la pi-ratería. También es sencillo modi�carlo localmente, lo que permite que seanposibles los esfuerzos de traducción a idiomas que no son necesariamenterentables comercialmente.La mayoría del Software libre se produce por equipos internacionales que

cooperan a través de la libre asociación. Los equipos estan típicamente com-puestos por individuos con una amplia variedad de motivaciones, y puedenprovenir tanto del sector privado, del sector voluntario o del sector público.En México el Software Libre nació en las Universidades y los Centros de

Investigación. Es por eso que, desde hace tres décadas, los estudiantes y losprofesores usan Software libre para �nes didácticos y de investigación. Lasuniversidades suelen optar por el uso de Software libre en vez de utilizarSoftware privativo porque satisface de una mejor manera sus necesidades decómputo, dada su naturaleza de apertura del código y la libertad de compartirlos resultados obtenidos. De forma colateral, no se tienen gastos adicionalesderivados del pago de licenciamientos.Computólogos, físicos, químicos, matemáticos y otros profesionistas y

cientí�cos utilizan Software libre como herramienta de investigación y creación.Un claro ejemplo de ello es la llamada Delta Metropolitana, que es una redde supercomputadoras que estan en varios puntos de la Ciudad de México,en el CINESTAV, el IPN, la UAM y la UNAM. Esa red de supercómputo uti-liza Software libre para consolidar sus recursos, hacer investigación y generarconocimiento.Por otro lado, dadas las características del Software de código cerrado, un

usuario común ignora absolutamente el contenido del mismo y por tanto siexiste dentro de las líneas del código alguna amenaza contra su equipo o suinformación, además el usuario no sólo tiene prohibido el intentar eliminar ocambiar esa parte del código sino que puede ser perseguido por la ley por el

[email protected] 403 Antonio Carrillo Ledesma, Et alii

Page 406: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

hecho de intentar conocer si existe tal amenaza en dicho Software.Además, en una sociedad de la información, el Software se ha convertido

en una herramienta importante de productividad, y una licencia de Softwareprivativo constituye un acuerdo o contrato entre dos sujetos jurídicos que vo-luntariamente acuerdan las condiciones de uso de un programa, pero el costoeconómico de dicha licencia es cada vez más alto y en el caso de institucioneseducativas, gubernamentales y sociedades civiles es en la mayoría de los casos� por decir lo menos�prohibitivo.

Ya hace un tiempo, se anunció en varios periódicos de circulación nacional(véase [49]) que:

El Instituto Mexicano de la Propiedad Industrial (IMPI) anuncióque en las próximas semanas dará inicio una serie de clausuras anegocios que utilicen Software licenciado de manera ilegal; estocomo parte del acuerdo que tiene la dependencia con The SoftwareAlliance (BSA) desde el 2002, el cual busca fomentar el uso deprogramas informáticos legales y disminuir el índice de pirateríaen el país.

De acuerdo a la BSA, el porcentaje de Software ilegal utilizadoen el territorio aún se ubica en un 56 por ciento, cifra considera-blemente menor a lo visto en el 2005, cuando el número ascendíaa más del 65 por ciento. Sin embargo, México continúa siendouno de los mayores compradores de piratería a nivel mundial, ylo que se busca con este tipo de acciones en el 2013 es disminuir,al menos, un punto porcentual.

"Si como consecuencia de una visita de inspección completa seencuentra la existencia de Software ilegal, se procede a la sanción.En el 2012 incrementaron hasta un 200% las sanciones por eluso ilegal de Software", dijo Kiyoshi Tsuru, director general enMéxico de la BSA.

Aquí es donde algunos se preguntarán, ¿y qué autoridad tieneThe Software Alliance para ejecutar estas determinaciones? Pesea que cuenta con el apoyo de empresas como Microsoft, Apple,Autodesk, Adobe, Aveva, AVG, CISCO, Dell, Hewlett Packard,IBM, SAP y Symntec, lo cierto es que la BSA no puede clausurarlegalmente ningún negocio. La verdadera autoridad llega en su

[email protected] 404 Antonio Carrillo Ledesma, Et alii

Page 407: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

acuerdo con el IMPI, el cual sí tiene las facultades para aplicarsanciones.

Además, la UNAM, desde junio 9 del 2009 �rmo un acuerdo (véase [50]):

Con el objetivo de fomentar la cultura de la legalidad en lo quese re�ere al uso del Software entre los estudiantes, la UniversidadNacional Autónoma de México y la Business Software Alliance(BSA) �rmaron un convenio general de colaboración.

Mediante este acuerdo, se promoverá el uso ético de las tec-nologías de la información y comunicación, y se compartirán cono-cimientos en materia de propiedad intelectual y Software, a �nde apoyar el desarrollo y explotación de bienes digitales en laUNAM, así como de�nir programas para contribuir al avance deun mundo digital seguro, informaron ambas organizaciones en uncomunicado.

El secretario general de la máxima casa de estudios, Sergio M.Alcocer Martínez de Castro, reconoció que la UNAM necesitahacer un esfuerzo en el ámbito institucional y en cada una delas entidades que la conforman, para brindar educación a susalumnos, profesores y trabajadores en este campo.

�Se pretende�, destacó, �que el convenio sea operativo y que sedesarrolle en cada una de las entidades con la impartición decursos y capacitación y en una rendición de cuentas para que elSoftware que se utilice sea legal�.

El funcionario reconoció a los miembros de Business SoftwareAllianceen Latinoamérica, y apuntó que la Universidad Nacionalhará lo necesario para facilitar el uso responsable, ético y segurodel Software.

Informó también que ambas partes se reunirán seis meses des-pués del inicio de este convenio de colaboración para analizar losavances.

En tanto, el director General de BSA-México, Kiyoshi Tsuru Al-berú, resaltó que con la �rma de este convenio podrán impulsarun plan conjunto relacionado con alta tecnología, ética y legalidad�Estamos seguros que en el mediano plazo se tendrán resultadosimportantes y se podrá hacer la diferencia�, señaló.

[email protected] 405 Antonio Carrillo Ledesma, Et alii

Page 408: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Por su parte, el abogado general, Luis Raúl González Pérez, co-mentó que la UNAM busca difundir estos valores entre su co-munidad, y llegar especialmente a los estudiantes que inician elbachillerato, porque desde edad temprana es importante fomentarla cultura de la legalidad.

Ante este escenario, una alternativa viable podría ser optar por el Soft-ware Libre, aunque, pese a su incipiente desarrollo es seguro que en un futuropodría alcanzar a suplir todas las necesidades básicas de los usuarios, dejandola adquisición de paquetes especializados sólo para los cursos avanzados quejusti�que el uso de Software privativo.

[email protected] 406 Antonio Carrillo Ledesma, Et alii

Page 409: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

12 Apéndice B: Máquinas Virtuales

Entendamos por una máquina virtual a un programa de cómputo (véase[75], [76], [69] y [68]) que simula a una computadora, en la cual se puedeinstalar y usar otros sistemas operativos de forma simultánea como si fueseuna computadora real sobre nuestro sistema operativo huésped110.

Figura 15: Sobre un equipo AMD de gama baja y 4 GB de RAM, usandocomo sistema operativo huésped un Linux Debian estable, se ejecutan 4máquinas virtuales (mediante KVM) de Windows XP con diferentes apli-caciones y dentro de cada una de ellas se muestra la RAM asignada, la usadaen ese momento, el uso de CPU de cada máquina virtual, entre otros datos.

Una característica esencial de las máquinas virtuales es que los procesosque ejecutan estan limitados por los recursos y abstracciones proporcionadospor ellas. Estos procesos no pueden escaparse de esta "computadora virtual".Uno de los usos más extendidos de las máquinas virtuales es ejecutar sistemasoperativos nuevos u obsoletos adicionales a nuestro sistema habitual.

110Tal y como puede verse re�ejado en la de�nición de máquina virtual, en este texto nosestamos focalizando en las máquinas virtuales de sistema. Existen otro tipo de máquinasvirtuales, como por ejemplo las máquinas virtuales de proceso o los emuladores.

[email protected] 407 Antonio Carrillo Ledesma, Et alii

Page 410: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

De esta forma podemos ejecutar uno o más sistemas operativos � Linux,Mac OS, Windows XP, 7 ó 8� desde nuestro sistema operativo habitual �GNU/Linux oWindows� sin necesidad de instalarlo directamente en nuestracomputadora y sin la preocupación de que se descon�gure el sistema operativohuésped o a las vulnerabilidades del sistema virtualizado, ya que podemosaislarlo para evitar que se dañe.

12.1 Tipos de Máquinas Virtuales

Las máquinas virtuales se pueden clasi�car en dos grandes categorías segúnsu funcionalidad y su grado de equivalencia a una verdadera máquina:

� Máquinas virtuales de sistema (en inglés System Virtual Machine).También llamadas máquinas virtuales de Hardware, permiten a la má-quina física subyacente multiplicarse entre varias máquinas virtuales,cada una ejecutando su propio sistema operativo. A la capa de Softwareque permite la virtualización se le llama monitor de máquina virtual ohypervisor. Un monitor de máquina virtual puede ejecutarse o bien di-rectamente sobre el Hardware o bien sobre un sistema operativo ("HostOperating System").

� Máquinas virtuales de proceso (en inglés Process Virtual Machine).A veces llamada "máquina virtual de aplicación", se ejecuta como unproceso normal dentro de un sistema operativo y soporta un solo pro-ceso. La máquina se inicia automáticamente cuando se lanza el procesoque se desea ejecutar y se detiene para cuando éste �naliza. Su obje-tivo es el de proporcionar un entorno de ejecución independiente dela plataforma de Hardware y del sistema operativo, que oculte los de-talles de la plataforma subyacente y permita que un programa se ejecutesiempre de la misma forma sobre cualquier plataforma.

12.2 Técnicas de Virtualización

Básicamente se reconocen tres tipos de virtualización, algunas de las cualesson usadas actualmente en la gran mayoría de los sistemas operativos, ge-neralmente sin que el usuario este consciente de que usa virtualización111,estos son:111El ejemplo más común y omnipresente es la máquina virtual del lenguaje de progra-mación de JAVA.

[email protected] 408 Antonio Carrillo Ledesma, Et alii

Page 411: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Emulación del Hardware Subyacente (ejecución nativa) Esta téc-nica se suele llamar virtualización completa � Full Virtualization� del Hard-ware, y se puede implementar usando un hipervisor de Tipo I o de Tipo II:

1. Monitor de tipo I, se ejecuta directamente sobre el Hardware.

2. Monitor de tipo II, se ejecuta sobre otro sistema operativo.

Cada máquina virtual puede ejecutar cualquier sistema operativo sopor-tado por el Hardware subyacente. Así los usuarios pueden ejecutar dos o mássistemas operativos distintos simultáneamente en computadoras "privadas"virtuales. Actualmente tanto Intel como AMD han introducido prestacionesa sus procesadores x86_64 para permitir la virtualización de Hardware.

Emulación de un Sistema no Nativo Las máquinas virtuales tambiénpueden actuar como emuladores de Hardware, permitiendo que aplicacionesy sistemas operativos concebidos para otras arquitecturas de procesador sepuedan ejecutar sobre un Hardware que en teoría no soportan. Esta técnicapermite que cualquier computadora pueda ejecutar Software escrito para lamáquina virtual. Sólo la máquina virtual en sí misma debe ser portada acada una de las plataformas de Hardware.

Virtualización a Nivel de Sistema Operativo Esta técnica consisteen dividir una computadora en varios compartimientos independientes demanera que en cada compartimento podamos instalar un servidor. A estoscompartimentos se les llama "entornos virtuales". Desde el punto de vista delusuario, el sistema en su conjunto actúa como si realmente existiesen variosservidores ejecutándose en varias máquinas distintas.

12.3 ¿Qué Necesito para Crear y Usar una MáquinaVirtual?

Actualmente la virtualización de un sistema operativo se puede implemen-tar por Software o por Hardware, lo único que precisamos para poder usaruna máquina virtual es un ordenador e instalar y con�gurar el programamanejador de la máquina virtual. Cuanto más potente y actual sea el orde-nador del que dispongamos, mejor experiencia obtendremos trabajando consistemas operativos virtualizados.

[email protected] 409 Antonio Carrillo Ledesma, Et alii

Page 412: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Algunos de los puntos importantes para obtener un rendimiento óptimodel sistema operativo virtualizado son los siguientes:

� Preferentemente disponer de un procesador que disponga de capacidadde virtualización por Hardware (Intel VTx/AMD-V). Casi cualquier or-denador actual dispone de un procesador apto para virtualizar sistemasoperativos por Hardware.

� Disponer de espacio su�ciente en el disco duro112, es preferible disponerde un disco de estado sólido (SSD) por sus velocidades de lectura-escritura.

� Necesitamos disponer de memoria RAM su�ciente y adecuada113. Cuantamás memoria RAM y cuanto más rápida sea, mejores resultados de vir-tualización obtendremos.

� Sin duda el hecho de tener una buena tarjeta grá�ca también ayudaráa disponer de una mejor experiencia de virtualización.

12.4 ¿Cómo Funciona una Máquina Virtual?

Explicar el funcionamiento a detalle de una máquina virtual es engorroso yesta fuera del alcance del propósito de este texto. No obstante a grandesrasgos podemos decir que una máquina virtual es un Software que median-te una capa de virtualización114 se comunica con el Hardware que tenemosdisponible en nuestro ordenador consiguiendo de este modo emular la totali-dad de componentes de un ordenador real. De este modo la máquina virtualserá capaz de emular un disco duro, una memoria RAM, una tarjeta de red,un procesador, etc.

112Una máquina virtual con Windows XP ocupa por lo menos 2 GB en disco y una conWindows 7 ocupa por lo menos 4 GB en disco.113La cantidad de memoria RAM ideal dependerá del sistema operativo que queremosvirtualizar y del número de sistemas operativos que queramos virtualizar de forma si-multánea. Si tan solo queremos virtualizar un sistema operativo con 2 o 3 GB de RAMdebería ser su�ciente.114La capa de virtualización es un sistema de archivos propietario y una capa de abstrac-ción de servicio del Kernel que garantiza el aislamiento y seguridad de los recursos entredistintos contenedores. La capa de virtualización hace que cada uno de los contenedoresaparezca como servidor autónomo. Finalmente, el contenedor aloja la aplicación o cargade trabajo.

[email protected] 410 Antonio Carrillo Ledesma, Et alii

Page 413: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Una vez que sabemos esto, cuando abrimos una máquina virtual, comopor ejemplo Virtualbox (véase [70]), nos encontramos con un entorno grá�coque nos permitirá con�gurar y asignar recursos a cada uno de los compo-nentes físicos que emula la máquina virtual. En prácticamente la totalidadde máquinas virtuales debemos de�nir detalles del siguiente tipo:

� Tipo de procesador a usar

� Espacio que queramos asignar al disco duro.

� Memoria RAM que queremos asignar a la máquina virtual.

� La memoria de nuestra tarjeta grá�ca.

� La con�guración de red.

� etc.

Una vez con�gurados estos parámetros habremos creado una máquinavirtual para instalar un sistema operativo, de este modo tan solo tendremosque abrir la máquina virtual que se acaba de crear e instalar el sistemaoperativo tal y como si se tratará de un ordenador real.

Máquinas Virtuales de Sistemas Operativos Desde la Nube Existendiferentes servicios Web115 que permiten instalar, con�gurar y usar cientosde sistemas operativos Linux, Unix y Windows � máquinas virtuales usandoservicios Web en Linux y QEMU (véase sección 13)� desde el navegador, estoen aras de que los usuarios que cuenten con algún sistema de acceso a red yun navegador, puedan usar, con�gurar e instalar algún sistema operativo y surespectiva paquetería sin hacer instalación alguna en su equipo de cómputo,tableta o teléfono celular116. Una muestra de estos proyectos los encontramosen:115Cuando se trabaja desde la Web es recomendable usar el modo Privado o Incógnitopara no guardar el historial de la navegación, información introducida en los formulariosy borrar al cerrar el navegador los datos de los sitios visitados. Pero recuerda que lossitios Web que visitamos sí guardan información de nuestra visita, nuestro proveedor deInternet también guarda constancia de nuestra visita y si descargamos algo, esto no seborra al igual que el historial de descargas, además de las marcas de páginas o favoritosse conservarán al cerrar el navegador.116Estos servicios son conocidos como computación en la nube (Cloud Computing).

[email protected] 411 Antonio Carrillo Ledesma, Et alii

Page 414: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Distrotest (https://distrotest.net) y JSLinux (https://bellard.org/jslinux).

Algunas versiones listas para usar son:4mLinux, AbsoluteLinux, Academix, AlpineLinux, Antergos, antiX Linux, Ap-

tosid, ArchBang, ArchLabs, Archlinux, Archman, ArchStrike, ArcoLinux, Ar-tixLinux, AryaLinux, AV Linux, BackBoxLinux, BigLinux, Bio-Linux, BlackArch,BlackLab, BlackPantherOS, BlackSlash, blag, BlankOn, Bluestar, Bodhi, Bunsen-Labs, ByzantineOS, Caine, Calculate Linux Desktop, CentOS, Chakra, ChaletOS,ClearOS, Clonezilla, ConnochaetOS, Cucumber, Damn Small Linux, Damn SmallLinux Not, Debian, DebianEdu, deepin, DEFT, Devil-Linux, Devuan, DragonFlyBSD, Dragora, DuZeru, Dyne:bolic, Edubuntu, elementaryOS, Elive Linux, Em-mabuntüs, Emmi OS, Endless OS, EnsoOS, Exe GNU/Linux, ExTiX, Fatdog64,Fedora Atomic, Fedora Server, Fedora Workstation, FerenOS, FreeBSD, FreeDOS,Frugalware, G4L, GeckoLinux, Gentoo, GNewSense, GoboLinux, Gparted, Gree-nieLinux, GRML, GuixSD, Haiku, Heads, Kali Linux, Kanotix, KaOS, Knoppix,Kodachi, KolibriOS, Korora, Kubuntu, Kwort, Linux Lite, Linux Mint, LiveRaizo,LMDE, Lubuntu, LXLE OS, Macpup, Mageia, MakuluLinux, Manjaro, Matriux,MauiLinux, MenuetOS, MinerOS, MiniNo, Modicia, Musix, MX Linux, Nas4Free,Neptune, NetBSD, Netrunner, NixOs, NST, NuTyX, OpenIndiana, OpenMan-driva, openSUSE, OracleLinux, OSGeo live, OviOS, Parabola CLI, Parabola LXDE,Pardus, Parrot Home, Parrot Security, Parrot Studio, Parsix, PCLinuxOS, Pea-chOSI, Pentoo, Peppermint, PeppermintOS, Pinguy, PinguyOS, plopLinux, Point-Linux, Pop!_OS, PORTEUS, Puppy Linux, PureOS, Q4OS, QubesOS, Quirky,Raspberry Pi Desktop, ReactOS, RedCore, Rescatux, RevengeOS, RoboLinux,Rockstor, ROSA FRESH, Runtu, Sabayon, SalentOS, Salix, Scienti�cLinux, Siduc-tion, Slackware, Slax, SliTaz, Solus, SolydK, SolydX, SparkyLinux, Springdale,Stresslinux, SubgraphOS, SwagArch, Tails, Tanglu, Tiny Core, Trisquel, TrueOS,TurnKey Linux, Ubuntu, Ubuntu Budgie, Ubuntu Studio, UbuntuKylin, Uruk,VectorLinux, VineLinux, VoidLinux, Voyager, VyOS, WattOs, Xubuntu, Zentyal,Zenwalk, Zevenet, Zorin OS

Descarga de Máquinas Virtuales de Sistemas Operativos Existendiversos proyectos que permiten descargar decenas de máquinas virtualeslistas para ser usadas, para los proyectos VirtualBox y VMWare (y por endepara KVM/QEMU), estas se pueden descargar de múltiples ligas, algunas deellas son:

� https://www.osboxes.org

[email protected] 412 Antonio Carrillo Ledesma, Et alii

Page 415: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� https://virtualboxes.org/images/

Si descargamos y descomprimimos el archivo lubuntu1210.7z (véase sec-ción 13.9), esto dejará la imagen de VirtualBox de LUBUNTU cuyo nom-bre es lubuntu1210.vdi. Entonces esta imagen la usaremos directamente enKVM/QEMU, mediante:

$ kvm -m 2000 -hda lubuntu1210.vdi

Nota: esta imagen usa como usuario y clave de acceso: lubuntu/lubuntu

Máquinas Virtuales en Formato Live Linux es uno de los sistemas ope-rativos pioneros en ejecutar de forma autónoma o sin instalar en la computa-dora, existen diferentes distribuciones Live � descargables para formato CD,DVD, USB117� de sistemas operativos y múltiples aplicaciones almacenadosen un medio extraíble, que pueden ejecutarse directamente en una computa-dora, estos se descargan de la Web generalmente en formato ISO118, una delas listas más completas de versiones Live esta en: https://livecdlist.com.

En el caso de tener un archivo ISO de algún sistema operativo (por ejem-plo ubuntu-11.10-desktop-i386.iso) y se quiere ejecutar su contenido desdeuna máquina virtual con QEMU/KVM sólo es necesario usar:

$ kvm -m 512 -cdrom ubuntu-11.10-desktop-i386.iso

en este ejemplo usamos el virtualizador con la arquitectura por omisióny memoria de 512 MB.

Knoppix es una versión Live ampliamente conocida y completa, esta sepuede descargar el ISO de http://132.248.182.159/Replicas/knoppix/y usar mediante:

$ kvm -m 1024 -cdrom KNOPPIX_V8.2-2018-05-10-EN.iso

aquí se usa la arquitectura por omisión y memoria de 1024 MB.

117Para generar un dispositivo USB con la imagen contenida en un archivo ISOpodemos usar el Software ETCHER, descargable para Linux, Windows y Mac OS desdehttps://etcher.io/.118Una imagen ISO es un archivo informático donde se almacena una copia exacta de unsistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB

[email protected] 413 Antonio Carrillo Ledesma, Et alii

Page 416: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

12.5 Aplicaciones de las Máquinas Virtuales de Sis-tema

Cada uno de los sistemas operativos que virtualizamos � con su propio sis-tema operativo llamado sistema operativo «invitado (Guest)» � es indepen-diente de los otros sistemas operativos. De este modo, en caso que una delas máquinas virtuales deje de funcionar, el resto seguirá funcionando. Unamáquina virtual dispone de todos los elementos de un ordenador real, dedisco duro, memoria RAM, unidad de CD o DVD, tarjeta de red, tarjeta devídeo, etc., pero a diferencia de un ordenador real estos elementos en vez deser físicos son virtuales. Así, una vez instalado un sistema operativo en lamáquina virtual, podemos usar el sistema operativo virtualizado del mismomodo que lo usaríamos si lo hubiéramos instalado en nuestro ordenador.

Figura 16: Al poder correr diferentes sistemas operativos y/o versiones delmismo en donde podemos instalar diversas aplicaciones antagónicas que nopodrían coexistir en un sólo sistema operativo, nos permite ampliar el uso denuestro equipo de cómputo.

Varios sistemas operativos distintos pueden coexistir sobre la misma com-putadora trabajando simultáneamente, en sólido aislamiento el uno del otro,por ejemplo para probar un sistema operativo nuevo sin necesidad de insta-

[email protected] 414 Antonio Carrillo Ledesma, Et alii

Page 417: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

larlo directamente. La máquina virtual puede proporcionar una arquitecturade instrucciones que sea algo distinta de la verdadera máquina, es decir,podemos simular Hardware. Además, todos los elementos de una máquinavirtual se encapsulan en un conjunto pequeño de archivos � en KVM/QEMUes solo un archivo� , esto permite que podamos pasar un sistema operativovirtual de un ordenador a otro y realizar copias de seguridad de forma fácily rápida.La gran mayoría de los manejadores de máquinas virtuales � KVM, Vir-

tualBox o VMWare� permiten instalar prácticamente cualquier sistema ope-rativo � por ejemplo Linux, Android, Mac OS X, Windows, Chrome OS,etc.� . Sin embargo existen otros manejadores de máquinas virtuales �Virtual PC, Hiper-V o Parallels� que estan principalmente destinados avirtualizar Windows.La virtualización es una excelente opción hoy en día, ya que las máquinas

actuales � Laptops, Desktops y servidores� en la mayoría de los casos estansiendo "subutilizados" � estos cuentan con una gran capacidad de cómputo,disco duro y memoria RAM� ya que no se utilizan todos los recursos todoel tiempo, teniendo un uso promedio que oscila entre 30% a 60% de su ca-pacidad total. Permitiendo así, ejecutar varias máquinas virtuales en un sóloequipo físico aumentando el porcentaje de uso de los recursos de cómputodisponibles � en el caso de virtualizar servidores, a este proceso se le conocecomo consolidación de servidores� . Así, la consolidación de servidores con-tribuye a reducir el coste total de las instalaciones necesarias para mantenerlos servicios, permitiendo un ahorro considerable de los costos asociados �energía, mantenimiento, espacio, administración, etc.� , esto se hace patenteen la «computación en la nube (Cloud Computing)» muy en boga actual-mente.

12.6 Ventajas y Desventajas

Como toda tecnología, la virtualización tiene ventajas y desventajas, lascuales deben de ser sopesadas en cada ámbito de implementación. Lo que esun hecho que permite en un mismo equipo de cómputo ejecutar más de unsistema operativo o distintas versiones del mismo.Pero queda claro que uno de los inconvenientes de las máquinas virtuales,

es que agregan gran complejidad al sistema en tiempo de ejecución. Estotiene como efecto la ralentización del sistema, es decir, el programa no alcan-zará la misma velocidad de ejecución que si se instalase directamente en el

[email protected] 415 Antonio Carrillo Ledesma, Et alii

Page 418: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

sistema operativo «an�trión (Host)» o directamente sobre la plataforma deHardware, sin embargo, a menudo la �exibilidad que ofrecen compensa estapérdida de e�ciencia.Si la virtualización es por Hardware, la velocidad de ejecución es más

que aceptable para la mayoría de los casos, por ejemplo, en el caso de usarKVM/QEMU soporta máquinas virtuales de hasta 255 CPUs y 4 TB deRAM, y el rendimiento de aplicaciones como Oracle, SAP, LAMP, MS Ex-change sobre máquinas virtuales puede oscilar entre el 95% y el 135% com-parado con su ejecución en servidores físicos. Además, se ha conseguidoejecutar hasta 600 máquinas virtuales en un solo servidor físico.

12.6.1 Ventajas

Además de permitir ejecutar múltiples sistemas operativos, diferentes ver-siones de un mismo sistema pero con diferente Software que en principiopuede ser incompatible entre sí. Para usuarios de Windows, el hecho en sí,de no tener porque lidiar con problemas derivados de virus y antivirus le con-�ere una gran ventaja desde el punto de vista administrativo y del usuario�nal. Además, permite una administración centralizada, ya que todas lasmáquinas virtuales tendrían la misma con�guración y paquetes sin importarel Hardware subyacente en las que se ejecute el sistema operativo huésped.En el caso de instituciones educativas de cualquier nivel académico, es

común que en un mismo equipo de cómputo sea necesario ejecutar por un ladodiferentes versiones de sistemas operativos � por ejemplo Linux, WindowsXP, Windows 7, etc.� y por otro lado, en un sistema operativo, ejecutardiferentes versiones de un mismo paquete � generalmente no se pueden tenerinstalados simultáneamente más de una versión� .Las máquinas virtuales son una verdadera opción para coexistir simultá-

neamente diferentes versiones de sistemas operativos y en un mismo sistemamáquinas virtuales ejecutando las diversas versiones de un mismo programade cómputo, además se pueden con�gurar para que al momento de iniciarlassiempre se ejecuten a partir de una con�guración e instalación base, de talforma que al ser lanzadas, el usuario pueda instalar, con�gurar e inclusivedañar la máquina virtual, pero al reiniciarse la máquina virtual en una nuevasesión, se regresa a la con�guración de la versión base, de esta forma no hayposibilidad de infección de virus entre diversos lanzamientos de sesiones dela máquina virtual, la actualización es centralizada y se puede hacer por red,sin intervención del usuario.

[email protected] 416 Antonio Carrillo Ledesma, Et alii

Page 419: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Por ello, es una opción viable y común tener en una máquina un sis-tema huésped como Linux/GNU Debian Estable y dentro de el, un grupode máquinas virtuales de Windows �Windows XP, Windows 7, etc.� , enlos que cada máquina virtual tenga instalado Software agrupado por las ca-racterísticas del sistema operativo necesario para ejecutar a todas las apli-caciones seleccionadas � por ejemplo agrupados por la versión de ServicePack� .Por otro lado, si se descon�gura un sistema operativo virtualizado es

sumamente fácil de restaurar si lo comparamos con un máquina real. Sitomamos las precauciones necesarias podemos restaurar el estado que teníaun sistema operativo virtualizado, de forma fácil y rápida. Si hablamosdel entorno empresarial, la virtualización de sistemas operativos supone unahorro económico y de espacio considerable. Ya que mediante el uso de la vir-tualización evitamos la inversión en multitud de equipos físicos, esto suponeun ahorro importante en mantenimiento, en consumo energético, espacio yprocesos administrativos.Por otro lado, mediante la virtualización y el balanceo dinámico podemos

incrementar las tasas de prestación de servicios de un servidor del siguientemodo. Si disponemos de un servidor Web podemos asignar recursos adi-cionales al servidor, como por ejemplo memoria RAM y CPU en los picosde carga para evitar que el servidor se caiga y de este modo incrementar latasa de e�ciencia. Una vez �nalizado el pico de carga podemos desviar losrecursos aplicados al servidor Web a otra necesidad que tengamos. Por lotanto, aparte de mejorar la tasa de servicio se pueden optimizar los recursos.Si estamos usando una máquina virtual en un entorno de producción,

podemos ampliar los recursos de un sistema operativo o servidor de unaforma muy sencilla, tan solo tenemos que acceder al Software de virtualiza-ción y asignar más recursos. Además, es fácil crear un entorno para realizarpruebas de todo tipo aislado del resto de sistema. Así, las máquinas virtualesy la virtualización permiten usar un solo servicio por servidor virtualizadode forma sencilla, de este modo aunque se caiga uno de los servidores virtua-lizado los otros seguirán funcionando.En resumen, la virtualización permite ofrecer un servicio más rápido,

sencillo a usuarios (académicos, estudiantes, clientes, etc.) y es un pilar quedebe ser considerado en una escuela, universidad o compañía en su procesode transformación o consolidación, permitiendo escalonar y ser creativos ala hora de atender las necesidades crecientes y cambiantes de los usuarios; ycontar con servicios agregados, ágiles y adaptables a los constantes cambios

[email protected] 417 Antonio Carrillo Ledesma, Et alii

Page 420: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

de tecnología de Hardware y Software permitiendo escalar a la hiperconver-gencia hacia la nube.

12.6.2 Desventajas

Entre las principales desventajas de virtualizar sistemas propietarios119 comoWindows (véase 11.2)� no así los sistemas libres como Linux/GNU Debian(véase 11.1)� es que se puede violar el sistema de licenciamiento (véase11.3) del Software instalado en las máquinas virtuales, esto es especialmenteimportante cuando se usa en más de una máquina, pues la licencia usadapara la instalación es violada cuando se tiene más de una copia de la máquinavirtual o se ejecutan múltiples instancias de la máquina virtual.En el caso de Windows XP Home, no se infringe la licencia mientras se

cuente con número de licencias igual al máximo número de máquinas vir-tuales lanzadas simultáneamente. Para otras versiones del sistema operativoWindows como es Windows XP Profesional, la virtualización se maneja conlicencias adicionales a la del sistema operativo original y se debe de contar contantas licencias como el máximo número de máquinas virtuales lanzadas si-multáneamente. Además, es necesario contar con el tipo de licencia adecuadapara virtualizar a todos y cada uno de los paquetes de cómputo instaladosen cada máquina virtual y en las instancias para el número de máquinasvirtuales lanzadas simultáneamente en uno o más equipos.Para usar una máquina virtual en condiciones favorables, necesitamos

un ordenador potente. Debemos que tener en cuenta que si usamos dossistemas operativos de forma simultánea estamos empleando hasta el doblede recursos. No obstante cualquier ordenador doméstico de gama baja actualdispone de los recursos su�cientes para usar una o más máquinas virtuales.Los sistemas operativos y los programas se ejecutaran con mayor lenti-

tud en las máquinas virtuales. Esto es debido a que las máquinas virtualesno pueden sacar un rendimiento ideal del Hardware que tenemos en nues-tro equipo. Cuanto más potente sea nuestro ordenador menos se notará lapérdida de rendimiento.Si tenemos un problema � de Hardware o Software� en el ordenador que

aloja el sistema operativo an�trión puede caerse el servicio en la totalidad de

119Según la Free Software Foundation (véase [16]), el «Software libre» se re�ere a lalibertad de los usuarios para ejecutar, copiar, distribuir, y estudiar el mismo, e inclusomodi�car el Software y distribuirlo modi�cado. Así, un Software que no es libre, esllamado «Software privativo o propietario» .

[email protected] 418 Antonio Carrillo Ledesma, Et alii

Page 421: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

máquinas virtuales. Por lo tanto el ordenador que hace funcionar la máquinavirtual es una parte crítica del proceso de virtualización.A pesar de los inconvenientes que se citan en este apartado, bajo nuestro

punto de vista, la virtualización y las máquinas virtuales proporcionan unasventajas y una �exibilidad que compensan claramente los inconvenientes queacabamos de citar.

12.6.3 Consideraciones Técnicas y Legales de la Virtualización

Como se mostrará en la siguiente sección, virtualizar sistemas operativos� Linux, Unix, Windows entre otros� no representa ningún problema téc-nico, pero no es el caso en cuanto a las implicaciones legales de hacer lavirtualización que involucra el almacenamiento, distribución y el número deveces que se ejecuta simultáneamente una máquina virtual en uno o múlti-ples equipos, ya que en general, la máquina virtual esta contenida en unsólo archivo que facilita su distribución y almacenamiento, violando de estaforma la licencia de algunos sistemas operativos y/o programas instalados enel mismo.En el caso de virtualizar cualquier sistema operativo libre como Linux/GNU

Debian (véase 11.1), el tipo de licencia que tiene, permite y alienta su usopara cualquier fín que uno desee, por ello no hay ningún problema en vir-tualizarlo, no así el caso de hacerlo en sistemas operativos propietarios tipoWindows, la licencia (véase 11.2) restringe su uso a un sólo equipo de cóm-puto y en muchos casos prohíbe expresamente su virtualización. Ademáshay que tomar en cuenta el resto del Software instalado en el sistema opera-tivo, ya que estos también tienen sus propias restricciones legales a su uso ynúmero de veces que se puede ejecutar simultáneamente un paquete dado.Esto es especialmente importante cuando se usa en más de una máquina

física, la misma máquina virtual, pues la licencia usada para la instalaciónes violada cuando se tiene más de una copia de la máquina virtual o seejecutan múltiples instancias de la máquina virtual, esta violación de licenciaes su�ciente para ser sujeto a multas o incluso cárcel por dicho ilícito (véase11.3).Por otro lado, cada vez que se adquiere una licencia de uso de algún

Software que no caduque � la cual implica un alto costo monetario� , estapueda seguir siendo usada en una máquina virtual con una versión tal vezobsoleta del sistema operativo que la soporte, pero corriendo en un sistemahuésped moderno y protegido en Hardware de última generación de forma

[email protected] 419 Antonio Carrillo Ledesma, Et alii

Page 422: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

lícita y con el consiguiente ahorro económico.

12.7 Máquinas Virtuales en la Educación, Ciencias eIngeniería

Como hemos visto en las secciones anteriores, el uso de las máquinas virtualeses variado, �exible y permite ser usado en diversos ámbitos de la educación,del desarrollo y prueba de programas de cómputo y en general, en Ciencias eIngeniería. Algunas de las utilidades y bene�cios que podemos sacar de unamáquina virtual son los siguientes:

� Para aprender a instalar, probar diversas opciones de con�guracióny usar múltiples sistemas operativos. El proceso de instalación de lamáquina virtual no requiere crear particiones adicionales en nuestrodisco ni alterar la con�guración de la máquina an�triona.

� Para usar un Software que no esta disponible en nuestro sistema ope-rativo habitual. Por ejemplo, si somos usuarios de Linux y queremosusar Photoshop, lo podemos hacer a través de una máquina virtual.

� En ocasiones tenemos que usar Software que únicamente se puede eje-cutar en sistemas operativos obsoletos �Windows 98 por ejemplo� ,podemos crear una máquina virtual con dicho sistema y usar el Soft-ware de forma aislada sin preocuparnos de sus vulnerabilidades.

� Podemos experimentar en el sistema operativo que corre dentro de lamáquina virtual haciendo cosas que no nos atreveríamos a realizar connuestro sistema operativo habitual, como por ejemplo, instalar Softwareno seguro que consideramos sospechoso, etc.

� En muchos casos se quiere aprender a instalar, administrar y usarequipo al que no tenemos acceso como un equipo multiCore, con tarjetaCUDA instalada o un Cluster de múltiples nodos multiCore. Esto esposible hacer mediante el uso de máquinas virtuales en un equipo degama media.

� Si se hace el adecuado aislamiento de una máquina virtual en la que seinstale alguna versión de Windows, esta puede ser inmune a los virusy no requiere el uso de antivirus.

[email protected] 420 Antonio Carrillo Ledesma, Et alii

Page 423: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� En el caso de instituciones educativas de cualquier nivel académico, escomún que en un mismo equipo de cómputo sea necesario ejecutar porun lado diferentes versiones de sistemas operativos � Linux, WindowsXP, Windows 7, etc.� y por otro lado, en un sistema operativo, eje-cutar diferentes versiones de un mismo paquete � generalmente no sepuede tener instalada simultáneamente más de una versión� esto selogra con máquinas virtualizadas ad hoc coexistiendo en una mismamáquina física.

� Podemos crear/simular una red de ordenadores con tan solo un or-denador. Esta red de ordenadores virtualizados la podemos usar con�nes formativos y de este modo adquirir pericia sobre administraciónde redes.

� Si eres un desarrollador de Software puedes revisar si el programa queestas desarrollando funciona correctamente en varios sistemas opera-tivos y/o navegadores de Web.

� Podemos usar las máquinas virtuales para hacer SandBox120 con el �nde ejecutar aplicaciones maliciosas o abrir correos sospechosos en unambiente controlado y seguro.

� Para probar versiones Alfa, Beta y Release Candidate de ciertos pro-gramas y sistemas operativos.

� Para montar un servidor Web, un servidor VPN, un servidor de correoo cualquier otro tipo de servidor.

� Para probar multitud de programas en Windows y evitar que se en-sucie el registro mediante las instalaciones y desinstalaciones de losprogramas

� Consolidar servidores, i.e. lo que ahora hacen varias máquinas, sepueden poner en un solo equipo físico dentro de varias máquinas vir-tuales independientes o interactuando entre ellas según se requiera.

� Mantenimiento y pruebas de aplicaciones sin necesidad de adaptarnuevas versiones del sistema operativo.

120Un sistema de aislamiento de procesos o entorno aislado, a menudo usando comomedida de seguridad para ejecutar programas con seguridad y de manera separada delsistema an�trión.

[email protected] 421 Antonio Carrillo Ledesma, Et alii

Page 424: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� Aumentar la disponibilidad al reducir tiempo de parada y manteni-miento. Ya que la máquina virtual esta hecha, se pueden poner atrabajar una o más copias en un equipo o en múltiples máquinas físicasen cuestión de segundos, permitiendo la continuidad de un negocio oservicio y de recuperación ante desastres.

� Reducir costos de administración ya que se reducen y agilizan laspolíticas de respaldo y recuperación, además de optimizar los recur-sos disponibles permitiendo escalabilidad al crecer con contención decostos, mejorando la e�ciencia energética al usar un menor número deequipos de cómputo.

� Permite incursionar en la estrategia de nube híbrida proactiva creandoun conjunto de marcos de decisión en la nube y procesos para evaluar lasoportunidades de computación en la nube en función de las necesidadesy cargas de trabajo de los usuarios, por ejemplo el uso de supercómputorentado.

� Establecer las habilidades, herramientas y procesos para un entornodinámico e híbrido al asociarse los educadores y los especialistas entecnologías de información para realizar un inventario de habilidadesy competencias, e identi�car oportunidades de capacitación y áreas devulnerabilidad potencial.

[email protected] 422 Antonio Carrillo Ledesma, Et alii

Page 425: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

13 Apéndice C: Creación, Uso y OptimizacióndeMáquinas Virtuales Usando QEMU/KVM

Entendamos por una máquina virtual (véase sección 12) a un programa decómputo que simula a una computadora, en la cual se puede instalar y usarotros sistemas operativos de forma simultánea como si fuese una computadorareal sobre nuestro sistema operativo huésped. Hoy en día, tenemos a nuestradisposición varios manejadores de máquinas virtuales (MV), algunos de ellosson los siguientes:

� Virtualbox (véase [70]) es un Software desarrollado por Oracle, se tratade un Software multiplataforma capaz de virtualizar prácticamente latotalidad de sistemas operativos con arquitectura x86/AMD64. Labase de este Software dispone de una licencia GPL2 (véase 11.1.1),mientras que el Pack de extensiones que añaden funcionalidades estanbajo licencia privativa. Virtualbox es gratuito para un uso no comercial.

� Vmware Workstation Player (véase [71]) es un Software privativo mul-tiplataforma desarrollado por EMC corporation y es ampliamente usa-do en el entorno profesional en las áreas del Cloud Computing entremuchas otras. Al igual que Virtualbox, esta máquina virtual nos per-mite virtualizar una gran diversidad de sistemas operativos. Vmwaredispone de muchas soluciones de virtualización y prácticamente todasson de pago, no obstante Vmware Workstation Player es gratuita paraun uso no comercial.

� Parallels (véase [74]) es un Software multiplataforma, es usado fre-cuentemente por los usuarios del sistema operativo OS X de Apple quedesean virtualizar el sistema operativo Windows. Esta máquina vir-tual es de pago y únicamente puede virtualizar los sistemas operativosWindows y Mac OS.

� Windows Virtual PC (véase [72]) es un Software gratuito y privativopropiedad de Microsoft que se puede usar tanto en Windows como enMac OS. Virtual PC esta destinado únicamente a virtualizar sistemasoperativos Windows.

� QEMU/KVM (véase [68]) es un Software libre multiplataforma quedispone de licencia GPL (véase 11.1.1). Además de virtualizar un gran

[email protected] 423 Antonio Carrillo Ledesma, Et alii

Page 426: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

número de sistemas operativos, permite emular diversas arquitecturascomo por ejemplo X86, x86-AMD64, MIPS, Arm, PowerPC, etc.

¿Qué Manejadores Libres de Máquinas Virtuales Podemos Insta-lar?

QEMU Es un emulador de procesadores basado en la traducción diná-mica de binarios � conversión del código binario de la arquitectura fuente encódigo entendible por la arquitectura huésped� . QEMU también tiene ca-pacidades de virtualización dentro de un sistema operativo, ya sea GNU/Linux,Windows, o cualquiera de los sistemas operativos admitidos; de hecho esla forma más común de uso. Esta máquina virtual puede ejecutarse encualquier tipo de Microprocesador o arquitectura (x86, x86-64, PowerPC,MIPS, SPARC, etc.). esta licenciado en parte con la LGPL y la GPL deGNU (véase 11.1.1).El objetivo principal es emular un sistema operativo dentro de otro, sin

tener que reparticionar el disco duro, empleando para su ubicación cualquierdirectorio dentro de éste. El programa no dispone de GUI121, pero existe otroprograma llamado QEMU Manager que puede hacer de interfaz grá�ca si seutiliza QEMU desde Windows. También existe una versión para GNU/Linuxllamada Qemu-Launcher. En Mac OS X puede utilizarse el programa Qque dispone de una interfaz grá�ca para crear y administrar las máquinasvirtuales.

Kernel-based Virtual Machine (KVM) Máquina virtual basadaen el núcleo es una solución para implementar virtualización completa conLinux. esta formada por un módulo del núcleo (con el nombre kvm.ko) yherramientas en el espacio de usuario, siendo en su totalidad Software libre(véase 11.1.1). El componente KVM para el núcleo esta incluido en Linuxdesde la versión 2.6.20. El proyecto KVM esta incluido en el proyecto QEMU.

Las características principales de KVM/QEMU son:

� Cada máquina virtual se implementa como un proceso

� KVM/QEMU aprovecha el modelo de seguridad estandar de Linux:SELinux/AppArmor122. Estos modelos proporcionan el aislamiento y

121Graphical User Interface (Interfaz grá�ca del usuario).122AppArmor fue creado en parte como alternativa a SELinux.

[email protected] 424 Antonio Carrillo Ledesma, Et alii

Page 427: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

el control de recursos necesarios

� Hereda las características de gestión de memoria de Linux. La memoriautilizada por una MV se gestionará de la misma forma que la de otroproceso, podrá ser guardada en disco, utilizada en páginas grandes ysoporte NUMA123 de Linux permitiendo el uso de MVs de grandescantidades de memoria

� Soporta las últimas características de virtualización de memoria pro-porcionada por los fabricantes como EPT (Extended Page Table de In-tel) ó RVI (Rapid Virtualization Indexing de AMD). Estas tecnologíaspersiguen reducir el uso de CPU y aumentar el rendimiento de losHipervisores

� El compartir páginas de memoria se consigue a través de la carac-terística añadida a Linux llamada Kernel Same-page Merging (KSM).Escaneando las páginas de memoria de cada MV, si dos páginas coin-ciden, KSM las une en una sola página que se comparte entre las dosmáquinas, almacenando únicamente una copia y si en cualquier mo-mento, una de las MV modi�ca la página, le da una copia privada

� Permite utilizar cualquier tipo de almacenamiento soportado por Linuxpara las imágenes de las MVs

� Soporta el almacenamiento de �cheros distribuidos como GFS2124, OCFS125o GlusterFS126. De esta forma las imágenes de las MV pueden ser com-partidas por varios Hipervisores

� Las imágenes de disco soportan aprovisionamiento bajo demanda evi-tando tener que reservar todo el espacio inicialmente asignado. El for-mato nativo de KVM es QCOW2127, el cual permite la realización de

123Non-Uniform Memory Access (acceso a memoria no uniforme).124Global File System 2 es un sistema de archivos compartidos para clusters en Linux.125Oracle Cluster File System es un sistema de archivos de discos compartidos o sistemade archivos distribuidos para clústers de servidores de sistemas GNU/Linux desarrolladopor Oracle Corporation distribuidos bajo los términos de la GNU General Public License.126Gluster File System es un sistema multiescalable de archivos NAS desarrollado ini-cialmente por Gluster Inc.127QEMU Copy-On-Write el formato de imagen para máquinas virtuales segunda versiónde QCOW.

[email protected] 425 Antonio Carrillo Ledesma, Et alii

Page 428: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Snapshots128, compresión y cifrado

� Permite migraciones en vivo (Live Migrations), estas característicaspermite mover una MV en ejecución entre servidores físicos (Hipervi-sores) sin interrupción del servicio. Estas migraciones son transparentespara el usuario, ya que la MV permanece encendida, las conexiones dered activas y las aplicaciones en ejecución mientras la máquina se rea-comoda en un nuevo servidor

� KVM/QEMU soporta MV de hasta 255 CPUs y 4 TB de RAM. Y elrendimiento de aplicaciones como Oracle, SAP, LAMP, MS Exchangesobre MV puede oscilar entre el 95% y el 135% comparado con su ejecu-ción en servidores físicos, se ha conseguido ejecutar hasta 600 máquinasvirtuales en un sólo servidor físico

� Soporte de sistemas operativos invitados como Windows, Linux, An-droid, Familia BDS (OpenBSD, FreeBSD, NetBSD), Solaris, etc.

� Es ampliamente usado en varios proyectos sobre Cloud Computingcomo OpenStack, CloudStack, OpenNebula, etc.

En esta sección mostraremos como crear, con�gurar, optimizar y trabajarcon las máquinas virtuales mediante KVM/QEMU en Debian GNU/Linuxpara probar imágenes ISO129 descargadas de la red, instalar y usar máquinasvirtuales para Windows y Linux entre otros.

13.1 Tipo de Virtualización Soportado por la MáquinaHuésped

Primero es necesario saber si nuestro equipo soporta la virtualización porHardware o debemos usar la virtualización por Software, suponiendo quetenemos acceso a una máquina con Linux o ha sido inicializada usando unaversión «viva (Live)» 130 de CD, DVD o USB de Linux para iniciar la com-

128Es una copia instantánea del sistema de archivos que contiene a la máquina virtual.129Una imagen ISO es un archivo informático donde se almacena una copia exacta de unsistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB.130Una opción es KNOPPIX, es una distribución de Linux basada en Debian y usa LXDEcomo entorno de escritorio, pude ser descargada de http://www.knopper.net/knoppix/

[email protected] 426 Antonio Carrillo Ledesma, Et alii

Page 429: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

putadora. Entonces, para revisar si hay soporte en Hardware para la virtua-lización, usamos131:

$ egrep "vmxjsvm" /proc/cpuinfo

si se soporta la virtualización por Hardware aparecerá � entre otras132�la bandera

Procesadores INTEL: vmxProcesadores AMD: svm

Instalar y Usar Máquinas Virtuales Por omisión, los equipos de tec-nología de bajo desempeño no soportan la virtualización a nivel Hardware,pero siempre es posible su emulación mediante QEMU.Si la computadora soporta virtualización a nivel Hardware es posible usar

KVM (o en QEMU la bandera -enable-kvm). Según la versión de Linux,KVM puede existir como un paquete real o como uno virtual, si es virtual,al instalar KVM lo que realmente se instala es QEMU y al ejecutar KVMpor ejemplo

$ kvm ...

es remplazado por

$ qemu-system-x86_64 -enable-kvm ...

Estos tienen la misma sintaxis de uso, y para nuestros ejemplos sólo esnecesario remplazar qemu-system-x86_64 por kvm y en ambos siempre seusará qemu-img para manipular las imágenes.Instalación de KVM en Debian GNU/Linux (recomendado para virtua-

lización por Hardware) es mediante:

# apt install kvm

Instalación de QEMU en Debian GNU/Linux (permite emular diversasarquitecturas de Hardware) es mediante:

131Otra opción a usar es el comando lscpu, el cual mostrará en la etiqueta de Virtua-lización si es soportada y el tipo.132El signi�cado de las banderas de /proc/cpuinfo esta descrita en la sección 13.12.

[email protected] 427 Antonio Carrillo Ledesma, Et alii

Page 430: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

# apt install qemu-kvm

Observación 3 El desempeño de la emulación versus virtualización por Hard-ware es de varios ordenes de magnitud menor, pero una imagen creada concualquiera de ellos se puede usar con los otros virtualizadores. KVM sólosoporta virtualizar arquitecturas X86 y 64 de INTEL y AMD, QEMU emu-la diversas arquitecturas, como son ARM, CRIS, i386, M68k, MicroBlaze,MIPS, PowerPC, SH4, SPARC y x86-64.

Problemas Cómunes al Virtualizar Si se detecta la bandera para vir-tualización por Hardware y al tratar de usar KVM marca:

> open /dev/kvm: Permission denied> Could not initialize KVM, will disable KVM support

sólo hay que agregar, el login del usuario al grupo kvm en el archivo/etc/group.

Si marca:

> open /dev/kvm: No such �le or directory> Could not initialize KVM, will disable KVM support

sólo hay que activar en el BIOS la virtualización por Hardware

En KVM, al usar un procesador y solicitar la emulación de otro, es comúnque marque que ciertas banderas no son soportadas, por ejemplo al usar unprocesador AMD y solicitar la emulación de un procesador Nehalem IntelCore i7 9xx (Nehalem Class Core i7) mediante:

$ kvm -cpu Nehalem -cdrom TinyCore-current.iso133

ó133TinyCoreLinux es un sistema operativo minimalista centrado en proveer un sistemabase con núcleo Linux � es de tamaño de 11,16 MB y 106 Mb� , puede ser descargado dehttps://distro.ibiblio.org/tinyCorelinux

[email protected] 428 Antonio Carrillo Ledesma, Et alii

Page 431: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ qemu-system-x86_64 -enable-kvm -cpu Nehalem -cdrom nTinyCore-current.iso

es común que marque:

warning: host doesn�t support requested feature:

CPUID.01H:ECX.ssse3 [bit 9]

warning: host doesn�t support requested feature:

CPUID.01H:ECX.sse4.1.sse4_1 [bit 19]

warning: host doesn�t support requested feature:

CPUID.01H:ECX.sse4.2.sse4_2 [bit 20]si es necesario usar dichas banderas en el CPU, entonces usar:

$ qemu-system-x86_64 -cpu Nehalem -cdromTinyCore-current.iso

en este caso avisará que:

warning: TCG doesn�t support requested feature:

CPUID.01H:EDX.vme [bit 1]

i.e. soporta el chip, pero no la virtualización (vme: Virtual Mode Exten-sions [8086 mode]), se sacri�ca velocidad en aras de tener las prestacionesdel chip emulado.

[email protected] 429 Antonio Carrillo Ledesma, Et alii

Page 432: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

13.2 Salida Grá�ca de la Virtualización Usando VNC

Si se usa la versión Debian BUSTER GNU/Linux o se desea usar el protocolode Computación Virtual en Red (Virtual Network Computing VNC134) comovisualizador de la salida grá�ca de KVM/QEMU, debemos agregar -vnc :n ala línea de comandos, donde n es el número de pantalla a usar, esto se hacemediante:

$ kvm -m 128 -cdrom TinyCore-current.iso -cpu kvm64 n-vnc :0 &

y para ver la salida grá�ca135 en la misma máquina, usamos:

$ vncviewer 0

Si se desea ver la salida grá�ca en otro equipo conectado en red (puedeser con sistema operativo Windows, Linux o MAC OS que tenga instaladovncviewer136), es recomendable hacer ajustes en la calidad de la salida grá�ca

134Virtual Network Computing (VNC) es un programa de Software libre basado en unaestructura cliente-servidor que permite observar las acciones del ordenador servidor re-motamente a través de un ordenador cliente. VNC no impone restricciones en el sistemaoperativo del ordenador servidor con respecto al cliente, es posible compartir la pantallade una máquina con cualquier sistema operativo que admita VNC conectándose desde otroordenador o dispositivo que disponga de un cliente VNC portado, además permite usarInternet de baja velocidad en la visualización.Para visualizar la salida grá�ca usando VNC se debe instalar algún cliente de VNC, en

Debian Linux existen una gran variedad de clientes, uno de ellos es tigervnc-viewer, y seinstala mediante:

# apt install tigervnc-viewer

Otras opciones son vncviewer y xtightvncviewer. Ninguno de ellos requieren con�gu-ración adicional al ser instalados.135Después de que es ejecutado el comando vncviewer, aparecerá la ventana de la máquinavirtual (optimizada para ser usada en conexiones de red de baja velocidad), en ella sepuede usar la máquina virtual como si estuviese instalada en su equipo. Se puede cerrar laventana de visualización de VNC y la máquina virtual seguirá trabajando en el servidor;de ser necesario se puede abrir el cliente de VNC tantas veces como requiera. Para apagarla máquina virtual en el servidor, se debe de solicitar a esta que se apague mediante elmenú de inicio de la virtualización.136Otros proyectos multiplataforma son: Zoho Assist, TigerVNC, RealVNC,TeamViewer, Remmina, NoMachine, Apache Guacamole, XRDP, FreeNX, X2Go, Xpra,entre otros.

[email protected] 430 Antonio Carrillo Ledesma, Et alii

Page 433: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

a mostrar y que no se vea afectada por la velocidad del Internet, si suponemosque el servidor de la máquina virtual es 192.168.13.230, entonces lanzamosla máquina virtual mediante:

$ kvm -m 128 -cdrom TinyCore-current.iso -cpu kvm64 n-vnc :0,lossy &

y para ver la salida grá�ca en cualquier otro equipo interconectado porred, usamos:

$ vncviewer 192.168.13.230:0 QualityLevel=3

donde la calidad del video QualityLevel=n137, es de 0 a 9, donde 0 es lamás pobre y 9 la más alta calidad de la salida grá�ca.

Nota: En caso que el cursor del Mouse de la máquina virtual no coincidacon el del equipo an�trión es necesario agregar: -usb -device usb-tablet, allanzar la máquina virtual:

$ kvm -m 128 -cdrom TinyCore-current.iso -cpu kvm64 n-usb -device usb-tablet -vnc :0 &

y para ver la salida grá�ca (como se comento antes) usamos:

$ vncviewer 0

Uso de SSH para Interactuar con una Máquina Virtual de FormaRemota Si se tiene acceso a un servidor mediante SSH 138 en el cual este137El valor por omisión es de 3 para una para una conexión de Internet de baja velocidadcomún en los hogares, en caso necesario usar un valor de 0, que permite usar VNC enconexiones de muy baja velocidad.138SSH (o Secure SHell) es un protocolo que facilita las comunicaciones seguras entre dossistemas usando una arquitectura cliente/servidor y que permite a los usuarios conectarsea un host remotamente. A diferencia de otros protocolos de comunicación remota talescomo FTP o Telnet, SSH encripta la sesión de conexión, haciendo imposible que alguienpueda obtener contraseñas no encriptadas.

[email protected] 431 Antonio Carrillo Ledesma, Et alii

Page 434: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

activo X11 Forwarding139 e instalado KVM/QEMU, entonces es posible eje-cutar una máquina remota en el servidor y visualizar la salida grá�ca en lamáquina donde se ejecuta el comando SSH140.Primero, al hacer la conexión mediante SSH, es necesario solicitar en la

conexión se habilite X11 Forwarding mediante:

$ ssh -X -l usr 192.168.13.230

donde <usr> es el nombre del usuario en el equipo <192.168.13.230>.Después de hacer la conexión, ya podemos ejecutar la máquina virtual comose indico antes:

$ kvm -m 128 -cdrom TinyCore-current.iso &

y la salida grá�ca de la máquina virtual se trasmitirá por red de formasegura usando la tunelización de SSH.

13.3 Usando un Sistema Operativo Live como unaMáquinaVirtual

Linux es uno de los sistemas operativos pioneros en ejecutar de forma autóno-ma o sin instalar en la computadora, existen diferentes distribuciones Live� descargables para formato CD, DVD, USB141� de sistemas operativos ymúltiplesaplicaciones almacenados en un medio extraíble, que pueden ejecu-tarse directamente en una computadora, estos se descargan de la Web gen-eralmente en formato ISO142, una de las listas más completas de versionesLive esta en https://livecdlist.com

139Es el servidor grá�co que usan casi todas las distribuciones Linux. Este servidorpermite, entre otras cosas, forwarding a través de SSH. Esto signi�ca que es posible ejecutaraplicaciones grá�cas de una máquina remota exportando el display a nuestro escritorio. Esdecir, la aplicación se ejecuta en el servidor remoto, pero la interfaz grá�ca la visualizamosen nuestro escritorio local.140Es recomendable usar VNC en conjunción con SSH, de lugar de SSH puro, ya queel consumo de red en la salida grá�ca sin VNC en la conexión SSH es excesivo para lamayoría de las infraestructuras de Internet.141Para generar un dispositivo USB con la imagen contenida en un archivo ISOpodemos usar el Software ETCHER, descargable para Linux, Windows y Mac OS desdehttps://etcher.io/142Una imagen ISO es un archivo informático donde se almacena una copia exacta de unsistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB.

[email protected] 432 Antonio Carrillo Ledesma, Et alii

Page 435: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

En el caso de tener un CD, DVD o USB Live y se quiera ejecutar su con-tenido desde una máquina virtual con QEMU/KVM solo es necesario montarel dispositivo. Para ello, primero es necesario conocer donde es montado porel sistema operativo, mediante:

$ df

suponiendo que el dispositivo es /dev/sddx, entonces usar ese dispositivoen KVM mediante:

$ kvm -m 512 -usb /dev/sddx

en este ejemplo usamos el virtualizador con la arquitectura por omisióny memoria de 512 MB (-m 512).

13.4 Usando un Archivo ISO como una Máquina Vir-tual

En el caso de tener un archivo ISO143 de algún sistema operativo (ubuntu-11.10-desktop-i386.iso) y se quiera ejecutar su contenido desde una máquinavirtual con QEMU/KVM solo es necesario usar:

$ kvm -m 512 -cdrom ubuntu-11.10-desktop-i386.iso

en este ejemplo usamos al virtualizador con la arquitectura por omisióny memoria de 512 MB (-m 512).

13.5 Creación de Máquinas Virtuales

En esta sección mostraremos varios ejemplos completos para crear máquinasvirtuales de Linux y Windows mediante el uso de KVM/QEMU.

143Una imagen ISO es un archivo informático donde se almacena una copia exacta de unsistema de archivos y de esta se puede generar una imagen para CDROM, DVD o USB.

[email protected] 433 Antonio Carrillo Ledesma, Et alii

Page 436: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Ejemplo 5 Instalación y uso de una máquina virtual para Debian GNU/Linuxestable a partir del archivo ISO144, para ello, primero necesitamos:Generar el disco virtual que la contendra, por ejemplo de 10 GB con el

nombre debianStable.img mediante:$ qemu-img create -f qcow2 debianStable.img 10G

Después, instalar la imagen de Debian estable145 en el disco virtual genera-do en el paso anterior, solicitando a KVM que una vez terminada la insta-lación no haga el reinicio de la máquina virtual, esto mediante:

$ kvm -no-reboot -boot d -cdrom debian-802-i386-netinst.iso n-hda debianStable.img -m 400

Después de la instalación, es conveniente compactar y desfragmentar laimagen usando:

$ qemu-img convert -c debianStable.img -O qcow2 debian.imgAhora podemos usar la máquina virtual con la imagen desfragmentada

y compactada de Debian estable solicitando que tenga 800 MB de RAM,mediante:

$ kvm -hda debian.img -m 800

Observación 4 La de�nición de la toda la máquina virtual � el disco vir-tual que contiene el sistema operativo instalado y su respectiva paquetería�esta contenida en un único archivo que puede ser copiado, almacenado o dis-tribuido. En esto radica el poder de las máquinas virtuales, una vez hecha ycon�gurada, se pude usar en donde se requiera y la cantidad de veces que lonecesitemos.Al ser un solo archivo la máquina virtual, es común tener múltiples archivos

que conserven los distintos estados conforme se instalen o con�guren paque-tes de la misma. De esta forma se agiliza la recuperación tras algún fallo yel poder hacer modi�caciones de la máquina base o restaurar una máquina aalgún punto de con�guración anterior, con tan solo usar la respectiva copiaalmacenada.144Diversas imágenes ISO del proyecto Linux Debian se pueden descargar de:https://www.debian.org/CD/145Instrucciones paso a paso de como instalar, con�gurar y optimizar Linux De-bian están disponibles en múltiples lugares de la red, pero se pueden descargar de:http://www.132.248.182.159/Replicas/debianInstall/

[email protected] 434 Antonio Carrillo Ledesma, Et alii

Page 437: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Además, al usar KVM/QEMU se tiene la certeza de que la máquina vir-tual creada en una distribución de Linux puede ser usada en cualquier otradistribución bajo cualquier arquitectura de Hardware soportada por Linux �que tenga instalada una versión igual o superior de KVM/QEMU� sin cam-bio alguno.

Ejemplo 6 Instalación y uso de una máquina virtual para Windows XP, eneste caso necesitamos:Crear el disco virtual, por ejemplo de 10 GB mediante:$ qemu-img create -f qcow2 WindowsXP.img 10G

Hacer la instalación básica de Windows XP a partir, por ejemplo del ISO,mediante:

$ kvm -no-reboot -boot d -hda WindowsXP.img -m 400 n-localtime -cdrom es_winxp_pro_with_sp2.iso

Y concluir la instalación de Windows XP mediante:$ kvm -no-reboot -boot c -hda WindowsXP.img -m 400 n-localtime -cdrom es_winxp_pro_with_sp2.iso

Después de la instalación, es conveniente compactar y desfragmentar laimagen usando:

$ qemu-img convert -c WindowsXP.img -O qcow2 Windows.imgAhora podemos usar la máquina virtual con la imagen desfragmentada y

compactada de Windows XP usando:$ kvm -boot c -hda Windows.img -m 400 -localtime

Ejemplo 7 Una vez que se cuenta con una imagen de Windows, podemosinstalar por ejemplo Windows O¢ ce, donde tenemos dos opciones a saber:1) Instalar Windows O¢ ce 2003 a partir del ISO de O¢ ce mediante:$ kvm -localtime -m 300 -boot c -hda Windows.img n-cdrom O¢ ce-2003.iso

2) Si se tiene el CD o DVD, entonces podemos usar:$ kvm -localtime -m 300 -boot c -hda Windows.img n-cdrom /dev/cdrom/

[email protected] 435 Antonio Carrillo Ledesma, Et alii

Page 438: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Observación 5 En el caso de Windows hay que usar el mismo Hardwaresiempre, en caso contrario marca que es necesario registrar el sistema opera-tivo nuevamente al ejecutarlo en otra arquitectura, para evitar este problema,es necesario usar la bandera -cpu al momento de crearlo y usarlo, por ejem-plo:Usar máquina virtual de Windows en QEMU y KVM usando el mismo

Hardware mediante alguna de estas opciones:$ kvm -localtime -m 400 -boot c -hda Windows.img -cpu qemu32$ qemu-system-x86_64 -localtime -m 400 -boot c -hda nWindows.img -cpu qemu32$ qemu-system-x86_64 -enable-kvm -localtime -m 400 -boot c n-hda Windows.img -cpu qemu32

Para conocer los CPUs soportados usar:$ kvm -cpu ?

Para conocer las máquinas soportadas usar:$ kvm -machines ?

Ejemplo 8 Otro ejemplo completo de instalación y uso de una máquina vir-tual para Windows 7, en este caso necesitamos:Crear el disco virtual, por ejemplo de 15 GB mediante:$ qemu-img create -f qcow2 Windows7.img 15G

Hacer la instalación básica de Windows 7 a partir, por ejemplo del DVDmediante:

$ kvm -no-reboot -cdrom /dev/cdrom -boot d -hda Windows7.img n-m 500 -localtime

Concluir la instalación de Windows 7 mediante:$ kvm -no-reboot -boot c -hda Windows7.img -cdrom /dev/cdrom n-m 500 -localtime

Después de la instalación, es conveniente compactar y desfragmentar laimagen usando:

$ qemu-img convert -c Windows7.img -O qcow2 Windows.imgAhora podemos usar la máquina virtual con la imagen desfragmentada y

compactada de Windows 7 mediante:$ kvm -boot c -hda Windows.img -m 500 -localtime

[email protected] 436 Antonio Carrillo Ledesma, Et alii

Page 439: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

13.6 Uso de Virtualización Dentro de Otra Virtual-ización

Esta operación parece muy exótica y que rara vez se necesitará. Pero por lasconstantes vulnerabilidades descubiertas en los sistemas operativos, es muycomún tener la última versión estable del sistema operativo para obtener elmejor desempeño posible del Hardware y la máxima seguridad posible en elsistema an�trión y dentro de el, ejecutar una o más versiones de sistemasope-rativos huésped � no necesariamente actualizados� para dentro de elloscorrer otras versiones de sistemas operativos obsoletos o vulnerables, per-mitiendo la estabilidad en entornos de producción, así como migraciones envivo entre servidores. Esto se logra por ejemplo, para un procesador AMDal usar:

$ kvm -m 128 -hda Linux.img -cpu phenom,+svm

Figura 17: Sobre un equipo AMD de gama baja y 4 GB de RAM, se muestrael uso de una virtualización sobre otra virtualización y corriendo dentro deella, una máquina virtual con Windows XP en la cual se muestra el uso deRAM y CPU dentro de la misma.

[email protected] 437 Antonio Carrillo Ledesma, Et alii

Page 440: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

De esta forma, los sistemas virtualizados huésped heredan la capacidad devirtualizar por Hardware del an�trión, acelerando los procesos anidados delas virtualizaciones, aumentando las posibilidades de uso de la virtualizaciónal permitir explotar de forma e�ciente el gran poder computacional que díaa día se desarrolla146.

13.7 Manipulación del Estado de la Máquina Virtual

La virtualización permite manipular el estado de una máquina en ejecución,por ejemplo, una vez que se esta corriendo una máquina virtual:

$ kvm -boot c -hda Windows.img -m 400 -localtime

es posible manipular el estado de la misma en algún punto de su ejecuciónal usar la combinación de teclas:

[Ctrl] + [Alt] + [2]

ya en ella, podemos detener y grabar el estado de la máquina virtual:

(qemu) savevm test.vm(qemu) quit

para que en otro momento, podamos restaurar la máquina virtual talcomo estaba cuando esta se detuvo mediante:

$ kvm -boot c -hda Windows.img -m 400 -localtime n-loadvm test.vm

13.8 Optimización de Imágenes

Las imágenes de disco de KVM/QEMU después de ser generadas � al in-stalar algún sistema operativo o paquetes� , tienen muchos archivos internosdispersos, para optimizar su rendimiento es recomendable convertir la imagendispersa en una que no tenga esta propiedad, mediante:

146Es común que un sólo equipo de cómputo cuente con hasta 3 TB de RAM y variosprocesadores por tarjeta madre, donde cada procesador tiene decenas de Cores.

[email protected] 438 Antonio Carrillo Ledesma, Et alii

Page 441: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ qemu-img convert disk-sparse.img -O qcow2 disk.img

o puede ser compactada y optimizada mediante:

$ qemu-img convert -c disk-sparse.img -O qcow2 disk.img

Para descompactar una imagen se hace mediante:

$ qemu-img convert disk-compact.img -O qcow2 disk.img

13.8.1 Trabajar con una Imagen Virtual sin que se Altere

En algunos casos, es deseable que al trabajar con una máquina virtual, dejarla información de la máquina virtual base intacta y guardar los cambios quese requieran en otro archivo, una forma es hacer una copia y trabajar con lacopia de esta o crear un archivo que almacene por separado los cambios a laimagen, para esto último usar:

$ qemu-img create -b debianStable.img -f qcow2 debian.img

y trabajar con la imagen resultante (para este ejemplo debian.img) comocon cualquier otra imagen, de esta forma, todos los cambios al trabajar seránalmacenados en debian.img dejando intacta la imagen base debianStable.img.

13.8.2 Aumento de Desempeño

La virtualización normalmente es rápida, pero en algunas circunstancias sehace lenta, esto es ajeno a KVM/QEMU y generalmente es por la constantegrabación de pequeños paquetes de datos al disco por parte de la máquinavirtual.Para optimizar el desempeño de la máquina virtual es posible pedirle a

KVM/QEMU que trate de usar un cache y baje lo menos posible a discola información, esto aumentará notablemente el desempeño de la máquinavirtual.Para aumentar el desempeño, en lugar de usar:

$ kvm -boot c -hda Win.img -m 400

[email protected] 439 Antonio Carrillo Ledesma, Et alii

Page 442: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Usar:

$ kvm -drive �le=Win.img,cache=writeback,media=disk n-m 400

En el caso de usar un archivo ISO, usar:

$ kvm -drive �le=fedora.iso,cache=writeback,media=cdrom n-m 512

Ejemplo 9 Instalación y uso de una máquina virtual (por ejemplo paraUBUNTU 11.10) usando el cache, en este caso necesitamos:Generar un disco virtual, por ejemplo de 10 GB mediante:$ qemu-img create -f qcow2 disco.img 10G

Instalar la imagen de UBUNTU en un disco virtual:$ kvm -no-reboot -boot d -drive �le=ubuntu-11.10-desktop- ni386.iso,cache=writeback,media=cdrom -drive �le=disco.img, ncache=writeback,media=disk -m 500

Después de la instalación, es conveniente compactar y desfragmentar laimagen usando:

$ qemu-img convert -c disco.img -O qcow2 Ubuntu.imgAhora ya podemos utilizar la imagen y hacer uso del cache para acelerar

el desempeño mediante:$ kvm -drive �le=Ubuntu.img,cache=writeback,media=disk -m 500

Mejorando el Desempeño del Vídeo de la Máquina Virtual Poromisión se tiene un tarjeta grá�ca de pobre desempeño en la máquina virtual,si se necesita mayor resolución en la salida grá�ca, una opción es usar laopción -VGA, donde dos de sus posibilidades es STD o VMWARE usándosecomo:

$ kvm -drive �le=fedora.iso,cache=writeback,media=cdrom n-m 512 -vga std

o

[email protected] 440 Antonio Carrillo Ledesma, Et alii

Page 443: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ kvm -drive �le=fedora.iso,cache=writeback,media=cdrom n-m 512 -vga vmware

hay otras opciones que permiten inclusive el uso de GPUs reales o vir-tuales. Para ver detalles, favor de revisar el manual del usuario del proyectoQEMU.

Uso de Tarjeta de Sonido Dentro de KVM/QEMU Por omisión eluso de la tarjeta de audio no esta habilitada, para habilitarla usar en la líneade comandos: -soundhw sb16, es1370, adlib, por ejemplo:

$ kvm -boot c -hda Windows.img -m 400 -localtime n-soundhw sb16,es1370,adlib

hay otras opciones, para ver estas, favor de revisar el manual del usuariodel proyecto QEMU.

Algunas Otras Opciones Lanzar KVM con dos procesadores, 1536 MBde RAM, dispositivo de red e1000, MAC addres147 52:54:00:12:34:50, ini-ciando el DHCP148 en la dirección 10.0.2.40 y reenviando la salida del puerto22 de la máquina virtual al 5555 del equipo huésped, mediante:

$ kvm -smp 2 -drive �le=debianStableTmp.img,cache=writeback,media=disk -m 1536 -device e1000,netdev=user.0,mac=52:54:00:12:34:50 -netdev user,id=user.0,dhcpstart=10.0.2.40,hostfwd=tcp::5555-:22 &

o lanzar kvm con dos procesadores, 1536 MB de RAM, dispositivo de rede1000 y reenviando la salida del puerto 22 de la máquina virtual al 5555 delequipo huésped de la siguiente forma:147En las redes de computadoras, la dirección MAC (siglas en inglés de Media AccessControl) es un identi�cador de 48 bits (6 bloques de dos caracteres hexadecimales (4 bits))que corresponde de forma única a una tarjeta o dispositivo de red. Se la conoce tambiéncomo dirección física, y es única para cada dispositivo.148Protocolo de con�guración dinámica de host (en inglés: Dynamic Host Con�gurationProtocol, también conocido por sus siglas de DHCP) es un protocolo de red de tipocliente/servidor mediante el cual un servidor DHCP asigna dinámicamente una direcciónIP y otros parámetros de con�guración de red a cada dispositivo en una red para quepuedan comunicarse con otras redes IP.

[email protected] 441 Antonio Carrillo Ledesma, Et alii

Page 444: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ kvm -smp 2 -drive �le=debianStableTmp.img,cache=writeback,media=disk -m 1536 -device e1000,netdev=user.0 -netdev user,id=user.0,hostfwd=tcp::5555-:22 &

el redireccionamiento de puerto puede ser hecho también con:

$ kvm -m 512 -cpu phenom,+svm -hda b.qcow2 -redir tcp:5555:10.0.2.15:22 &

Si se desea usar ssh y scp en la máquina virtual usar:

# apt install openssh-server

acceder usando:

$ ssh -p 5555 root@localhost

hacer copia del equipo huésped a la máquina virtual mediante:

$ scp -P 5555 �le.txt usr@localhost:/tmp

Algunos Problemas Comunes con la Red Por lo general las máquinasvirtuales detectan correctamente la red, pero en el caso de Windows esto nosiempre pasa, por ello es común emular una tarjeta de red lo más genéricaposible, esta puede ser RTl8139, para ello es necesario que al lanzar lamáquina virtual que se indique:

�net nic;model = rtl8139 � net user

por ejemplo mediante:

$ kvm -boot c -hda WindowsXP.img -m 400 -localtime n-net nic,model=rtl8139 -net user

algunas de las otras opciones para la red son: NE2000 PCI, RTL8139,PCNET y NE2000 ISA.

[email protected] 442 Antonio Carrillo Ledesma, Et alii

Page 445: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Direcciones de Red Usadas en QEMU/KVM

Gateway/DHCP/TFTP Server: 10:0:2:2DNS Server: 10:0:2:3Samba Server: 10:0:2:4Netmask: 255:255:255:0Guest IP: cualquier dirección superior a 10:0:2:15

13.9 Uso deMáquinas Virtuales de VirtualBox en KVM/QEMU

Virtualbox es un programa desarrollado por Oracle ampliamente usado sobretodo para la plataforma Windows. Se trata de un Software multiplataformacapaz de virtualizar prácticamente la totalidad de sistemas operativos conarquitectura x86/amd64. La base de este Software dispone de una licenciaGPL2 (véase 11.1.1), mientras que el pack de extensiones que añaden fun-cionalidades estan bajo licencia privativa, Virtualbox es gratuito para un usono comercial.VirtualBox (https://www.virtualbox.org/) dispone de diversas imágenes

funcionales listas para descargar y usar varias decenas de distribuciones deLinux (https://virtualboxes.org/images/ y https://www.osboxes.org).

Interacción de VirtualBox en KVM/QEMU Ya que VirtualBox esampliamente usado, KVM/QEMU ha desarrollado formas de usar, convertiry migrar máquinas de VirtualBox y otros manejadores de máquinas virtualescon un mínimo esfuerzo, ejemplo de ello es que se puede descargar cualquierimagen VDI de VirtualBox y usarla directamente en KVM usando la mismasintaxis que con sus propias máquinas virtuales.Para mostrar esto, descargar de:

https : ==virtualboxes:org=images=lubuntu=

la imagen de LUBUNTU 12.10:

http : ==sourceforge:net=projects=virtualboximage=files=

Lubuntu=12:10=lubuntu1210:7z=download

y descomprimir el archivo lubuntu1210.7z, esto dejará una imagen de Virtu-alBox de LUBUNTU cuyo nombre es lubuntu1210.vdi. Entonces esta imagenla usaremos directamente en KVM/QEMU, mediante:

[email protected] 443 Antonio Carrillo Ledesma, Et alii

Page 446: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ kvm -m 2000 -hda lubuntu1210.vdi

o

$ qemu-system-x86_64 -enable-kvm -m 2000 -hda lubuntu1210.vdi

Nota: esta imagen usa como usuario y clave de acceso: lubuntu/lubuntu

Algunas veces es necesario montar y extraer el contenido de un disco vir-tual, supongamos que tenemos una máquina virtual de VirtualBox y quere-mos ver su contenido, para ello usamos:

$ qemu-img convert diskname.vmdk -O qcow2 diskname.qcow2

o para el formato RAW:

$ qemu-img convert diskname.vmdk -O raw diskname.raw

Instalar nbd-client:

# apt install nbd-client

después:

# qemu-nbd �connect=/dev/nbd0 /mnt/kvm/diskname.qcow2# fdisk /dev/nbd0 -l# sudo mount /dev/nbd0p1 /mnt/somepoint/# umount /mnt/somepoint/

13.10 Conversión deMáquinas Virtuales a KVM/QEMU

Es posible convertir máquinas virtuales de los proyectos de virtualización:

� VMware ESXi

� OVA exported from VMware

� VMX from VMware

� RHEL 5 Xen

[email protected] 444 Antonio Carrillo Ledesma, Et alii

Page 447: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� SUSE Xen

� Citrix Xen

� Hyper-V

a KVM/QEMU, mediante el comando virt-v2v, este convierte un hiper-visor de estos proyectos para ser ejecutado en KVM/QEMU. Puede leermáquinas virtuales de dichos proyectos de ambientes Linux y Windows que seejecutan en VMware, Xen, Hyper-V y algunos otros hipervisores, y conver-tirlos a KVM administrado por libvirt, OpenStack, oVirt, Red Hat Virtua-lization (RHV) u otros objetivos.También hay un Front-End149 complementario llamado virt-p2v que se

presenta como una imagen ISO, CD o PXE 150 que se puede iniciar en máquinasfísicas para virtualizar esas máquinas (de físico a virtual o p2v).

Ejemplos:

Convertir de VMware vCenter a un servidor libvirt local si setiene una imagen de VMware vCenter server llamada vcenter.example.com,en un centro de datos llamado Datacenter, y un ESXi151 hipervisor llamadoesxi. Entonces podemos convertir el invitado llamado vmware_guest a unamáquina virtual para libvirt de la siguiente manera:

$ virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi nvmware_guest

149En diseño de Software el Front-End es la parte del Software que interactúa con losusuarios150Preboot eXecution Environment (PXE) (Entorno de ejecución de prearranque), es unentorno para arrancar e instalar el sistema operativo en computadoras a través de unared, de manera independiente de los dispositivos de almacenamiento de datos disponibles(como discos duros) o de los sistemas operativos instalados.151VMware ESXi (anteriormente VMware ESX) es una plataforma de virtualización anivel de centro de datos producido por VMware, Inc.. Es el componente de su productoVMware Infraestructure que se encuentra al nivel inferior de la capa de virtualización, elhipervisor, aunque posee herramientas y servicios de gestión autónomos e independientes.

[email protected] 445 Antonio Carrillo Ledesma, Et alii

Page 448: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

en este caso es necesario ejecutar el comando en modo root, ya que nece-sita comunicación con el demonio152 libvirt y copiar localmente en:/var/lib/libvirt/images.

Convertir de VMware a RHV153/oVirt154 este ejemplo es similaral anterior, excepto que se quiere enviar el huésped a RHV Data Domainusando RHV REST API. La interfaz de red del huésped debe ser conectadacon la red del objetivo llamada ovirtmgmt, entonces:

$ virt-v2v -ic vpx://vcenter.example.com/Datacenter/esxi nvmware_guest -o rhv-upload -oc https://ovirt-engine.examnple.com/ovirt-engine/api -os ovirt-data -op /tmp/ovirt-adnmin-password -of raw -oo rhv-ca�le=/tmp/ca.pem -oo nrhv-direct �bridge ovirtmgmt

en este caso el host155 ejecutando virt-v2v actúa como un servidor deconversión.

Convertir de ESXi hipervisor sobre SSH a libvirt local Si setiene un hipervisor ESXi llamado esxi.example.com con acceso habilitadocon SSH, entonces se puede convertir de VMFS156 almacenamiento VMFSsobre el servidor a un archivo local de la siguiente forma:

152En sistemas UNIX/LINUX se conoce como demonio o daemon (Disk And ExecutionMonitor) a un proceso que se ejecuta en segundo plano del sistema operativo, se ejecutaen todo momento y no posee interacción directa con el usuario, también se le conocegenericamente como servicio o proceso, del cual no percibimos su ejecución. Un demoniorealiza una operación especí�ca en tiempos prede�nidos o en respuesta a ciertos eventosdel sistema.153Red Hat Virtualization REST Application154oVirt is an open-source distributed Virtualization solution155El término host o an�trión se usa en informática para referirse a las computadorasu otros dispositivos conectados a una red que proveen y utilizan servicios de ella. Losusuarios deben utilizar an�triones para tener acceso a la red. En general, los an�triones sonmáquinas monousuario o multiusuario que ofrecen servicios de transferencia de archivos,conexión remota, servidores de base de datos, servidores Web, etc.156VMware VMFS es el sistema de archivos en clúster de VMware, Inc. utilizado por elpaquete de virtualización de servidores insignia de la compañía, vSphere. Fue desarrolladopara almacenar imágenes de disco de la máquina virtual, incluidas instantáneas.

[email protected] 446 Antonio Carrillo Ledesma, Et alii

Page 449: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ virt-v2v n-i vmx -it ssh n"ssh://[email protected]/vmfs/volumes/datastore1n/guest/guest.vmx" -o local -os /var/tmp

El huésped no debe estar corriendo y virt-v2v no necesita ser ejecutadopor root.

Convertir imagen de disco a OpenStack Glance157 dada una ima-gen en disco se puede convertir a otro hipervisor ejecutandose sobre Open-Stack (sólo imágenes basadas en OpenStack sobre KVM son soportadas),para ello hacemos:

$ virt-v2v -i disk disk.img -o glance

Convertir imagen de disco a imagen de disco dada una imagende disco de otro hipervisor que se quiera convertir a KVM/QEMU tenemosdos opciones:

$ virt-v2v -i disk disk.img -o local -os /var/tmp

el otro método más complejo es escribir un libvirt XML que describael invitado a convertir (si se puede usar el hipervisor de origen para queproporcione el libvirt XML es mejor), entonces hacemos:

$ virt-v2v -i libvirtxml guest-domain.xml -o local -os /var/tmp

dado que guest-domain.xml contiene la(s) ruta(s) de las imágen(es) deldisco invitado, no es necesario especi�car el nombre de la imagen del discoen la línea de comandos.Para convertir una imagen de disco local e inmediatamente iniciarla en

QEMU local, hacemos lo siguiente:

$ virt-v2v -i disk disk.img -o qemu -os /var/tmp �qemu-boot

157OpenStack es un proyecto de computación en la nube para proporcionar una in-fraestructura como servicio (IaaS).

[email protected] 447 Antonio Carrillo Ledesma, Et alii

Page 450: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

13.11 Comunicación de las Máquinas Virtuales con elSistema An�trión e Internet

Para tener comunicación de las máquinas virtuales y el sistema an�trión eInternet, existen varias maneras de hacer esto, a saber:a) Mediante el uso de algún navegador Web, se puede acceder a su cuenta

de correo electrónico y al almacenamiento en la nube como Google Drive,Dropbox, HubiC, pCloud, MediaFire, FlipDrive, Mega, entre otros.b) En el sistema operativo Linux, se puede acceder a cualquier servidor

de internet mediante los protocolos SSH, SAMBA158 o montar un sistema dearchivos mediante SSHFS159, NFS160, entre otros.1) Por ejemplo con PCManFM, Dolphin, Nautilus, Thunar, Konqueror,

entre otros, podemos acceder a una máquina que tenga un servidor:

A) Acceder a un servidor SAMBA, escribir la ruta de archivos enel manejador de archivos:

smb://[email protected]/estud/

B) Acceder a un servidor SSH, escribir la ruta de archivos en elmanejador de archivos:

sftp://[email protected]/home/usuario/

2) En línea de comandos, podemos:

A) Montar con SSHFS un directorio de otra máquina con servidorSSH :

158Samba es una implementación libre del protocolo de archivos compartidos de MicrosoftWindows (antiguamente llamado SMB, renombrado recientemente a CIFS) para sistemasde tipo UNIX. De esta forma, es posible que computadoras con GNU/Linux, Mac OS Xo Unix en general se vean como servidores o actúen como clientes en redes de Windows.159Secure SHell FileSystem (SSHFS) es un sistema de archivos para Linux (y otros sis-temas operativos con una implementación FUSE, tal como en Mac OS X), que opera sobrearchivos en una computadora remota usando un entorno seguro de acceso. En la com-putadora local donde se monta SSHFS, la implementación hace uso del módulo del kernelFUSE.160El sistema de archivos de red (Network File System) es una aplicación cliente/servidorque permite al usuario ver y opcionalmente almacenar y actualizar archivos en un equiporemoto como si estuvieran en el propio equipo del usuario.

[email protected] 448 Antonio Carrillo Ledesma, Et alii

Page 451: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

$ sshfs [email protected]:/home/usuario/ /home/algun/lugar

B) Montar con mount un directorio de otra máquina con servidorNFS :

# mount 10.0.2.2:/directorio /home/algun/lugar

C) Usar SCP y SFTP de SSH para transferir archivos:

para copiar un archivo, usamos:

$ scp archivo.dat [email protected]:~/Datos/

para copiar un subdirectorio, usamos:

$ scp -r Directorio [email protected]:.

para copiar un archivo de una máquina remota a nuestra máquina,usamos:

$ scp [email protected]:/home/usuario/archivo .

c) En cualquier sistema operativo podemos usar algún navegador grá�code FTP, FTPS o SFTP como FileZilla, WinSCP, PSCP, PSFTP, FireFTP,CoreFTP, entre muchos otros, para transportar archivos y carpetas.d) Se puede usar FSDEV de KVM/QEMU que monta un recurso local

mediante las siguientes indicaciones:

$kvm [...]-fsdev local,id=fs1,path=$HOME/code/linux,security_model=none-device virtio-9p-pci,fsdev=fs1,mount_tag=host-code

Donde $HOME/code/linux es la ruta a compartir, y host-code es el iden-ti�cador para el montaje, en la MV se puede usar:

$ mkdir -p /mnt/host

Donde /mnt/host es el directorio de montaje (checar que se den los per-misos pertinentes), para ahora hacer:

# mount host-code -t 9p /mnt/host

[email protected] 449 Antonio Carrillo Ledesma, Et alii

Page 452: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Para desmontar usar:

# umount /mnt/host

e) Mediante el uso de la línea de comandos (véase 3.2) usando el comandoscp o rsync (véase 3.6) y sí así se requiere, comprimiendo archivos para sufácil traslado (véase 3.5) ó bien mediante programas que posean una interfazgrá�ca de usuario para SSH o SCP.f) Leer un dispositivo USB montado en el sistema an�trión desde la

máquina virtual, para ello el dispositivo USB deberá estar conectado en lamáquina an�trión y deberá ser accedido directamente en la máquina virtual.KVM/QEMU necesita parámetros adicionales, el parámetro -usb activa elsoporte en la máquina virtual de dispositivos USB. La emulación de IntelSB82371 UHCI-Controller tiene 8-puertos en el USB hub. Si se busca teneracceso a uno de los dispositivos físicos, se requiere encontrar los parámetrosVendor-ID y Product-ID. Esta información se obtiene examinando la salidadel comando:

# /sbin/lsusb

o

$ cat /proc/bus/usb/devices

Entonces es posible decirle a KVM/QEMU los datos de VendorID y Pro-ductID a través de la línea de comandos (véase 3.2):

$ qemu -usb -usbdevice host:<VendorID>:<ProductID> ...

o iniciar KVM/QEMU con soporte para dispositivos USB activados me-diante:

$ qemu -usb ...

después de iniciar la máquina virtual, cambiar al sistema de monitoreode la máquina virtual presionando:

[Ctrl]+[Alt]+[2] e introducir el siguiente comando:usb_add host:<VendorID>:<ProductID>

[email protected] 450 Antonio Carrillo Ledesma, Et alii

Page 453: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

cuando se retorne al ambiente grá�co al teclear [Ctrl]+[Alt]+[1] se vera elmensaje de reconocimiento del dispositivo USB. Por ejemplo si se tiene unaimpresora HP Scanjet 3300C conectada en el puerto USB de la computadora,la salida del comando lsub es:

# lsusbBus 003 Device 002: ID 03f0:0205 ScanJet 3300C

así, el comando en KVM/QEMU para dejar accesible el dispositivo es:

$ qemu -usb -usbdevice host:03f0:0205 ...

g) Usar la impresora conectada en el puerto paralelo, pera ello al invocarla ejecución de la máquina virtual usar:

$ qemu -parallel /dev/parport0 ...

h) Montar el contenido de un disco virtual y poder intercambiar infor-mación entre la máquina virtual y la huésped, primero convertir el disco aformato accesible a Linux:

$ qemu-img convert disco.img -O raw tmp.img

montar la imagen en Linux como root:

# mkdir disk# mount -o loop,o¤set=32256 tmp.img disk

trabajar con la imagen montada y al terminar desmontar esta:

# umount ./disk

y puede ser regresada al formato original mediante:

$ qemu-img convert -c tmp.img -O qcow2 disco.img

[email protected] 451 Antonio Carrillo Ledesma, Et alii

Page 454: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

13.12 Signi�cado de las Banderas de /proc/cpuinfo

Recordemos que para revisar si hay soporte en Hardware para la virtua-lización, usamos:

$ egrep "vmxjsvm" /proc/cpuinfo

si soporta la virtualización por Hardware, aparecerá la bandera:

Procesadores INTEL: vmxProcesadores AMD: svm

Hay una gran variedad de banderas que informan sobre el Hardware delque se dispone y las opciones que pueden usarse en KVM/QEMU que son so-portadas por Hardware � como la virtualización dentro de una virtualización�, en esta sección veremos parte de ellas para poder usarlas si son necesariaspara un proyecto en particular.

Intel Advanced Vector Extensions Programming Referencefpu: Onboard FPU (�oating point support)vme: Virtual Mode Extensions (8086 mode)de: Debugging Extensions (CR4.DE)pse: Page Size Extensions (4MB memory pages)tsc: Time Stamp Counter (RDTSC)msr: Model-Speci�c Registers (RDMSR, WRMSR)pae: Physical Address Extensions (support for more than 4GB of RAM)mce: Machine Check Exceptioncx8: CMPXCHG8 instruction (64-bit compare-and-swap)apic: Onboard APICsep: SYSENTER/SYSEXITmtrr: Memory Type Range Registerspge: Page Global Enable (global bit in PDEs and PTEs)mca: Machine Check Architecturecmov: CMOV instructions (conditional move) (also FCMOV)pat: Page Attribute Tablepse36: 36-bit PSEs (huge pages)pn: Processor serial numbercl�ush: Cache Line Flush instructiondts: Debug Store (bu¤er for debugging and pro�ling instructions)

[email protected] 452 Antonio Carrillo Ledesma, Et alii

Page 455: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

acpi: ACPI via MSR (temperature monitoring and clock speed modula-tion)mmx: Multimedia Extensionsfxsr: FXSAVE/FXRSTOR, CR4.OSFXSRsse: Intel SSE vector instructionssse2: SSE2ss: CPU self snoopht: Hyper-Threadingtm: Automatic clock control (Thermal Monitor)ia64: Intel Itanium Architecture 64-bit (not to be confused with Intel�s64-bit x86 architecture with �ag x86-64 or AMD64 bit indicated by�ag lm)pbe: Pending Break Enable (PBE# pin) wakeup support

AMD-de�ned CPU features, CPUID level 0x80000001syscall: SYSCALL (Fast System Call) and SYSRET (Return From FastSystem Call)mp: Multiprocessing Capable.nx: Execute Disablemmxext: AMD MMX extensionsfxsr_opt: FXSAVE/FXRSTOR optimizationspdpe1gb: One GB pages (allows hugepagesz=1G)rdtscp: Read Time-Stamp Counter and Processor IDlm: Long Mode (x86-64: amd64, also known as Intel 64, i.e. 64-bitcapable)3dnowext: AMD 3DNow! extensions3dnow: 3DNow! (AMD vector instructions, competing with Intel�sSSE1)

Transmeta-de�ned CPU features, CPUID level 0x80860001recovery: CPU in recovery modelongrun: Longrun power controllrti: LongRun table interface

[email protected] 453 Antonio Carrillo Ledesma, Et alii

Page 456: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Other features, Linux-de�ned mappingcxmmx: Cyrix MMX extensionsk6_mtrr: AMD K6 nonstandard MTRRscyrix_arr: Cyrix ARRs (= MTRRs)centaur_mcr: Centaur MCRs (= MTRRs)constant_tsc: TSC ticks at a constant rateup: smp kernel running on uparch_perfmon: Intel Architectural PerfMonpebs: Precise-Event Based Samplingbts: Branch Trace Storerep_good: rep microcode works wellnopl: The NOPL (0F 1F) instructionsxtopology: cpu topology enum extensionstsc_reliable: TSC is known to be reliablenonstop_tsc: TSC does not stop in C statesextd_apicid: has extended APICID (8 bits)amd_dcm: multi-node processoraperfmperf : APERFMPERFeagerfpu: Non lazy FPU restorenonstop_tsc_s3: TSC doesn�t stop in S3 state

Intel-de�ned CPU features, CPUID level 0x00000001 (ecx)pni: SSE-3 (Prescott New Instructions)pclmulqdq: Perform a Carry-Less Multiplication of Quadword instruc-tion �accelerator for GCM)dtes64: 64-bit Debug Storemonitor: Monitor/Mwait support (Intel SSE3 supplements)ds_cpl: CPL Qual. Debug Storevmx: Hardware virtualization: Intel VMXsmx: Safer mode: TXT (TPM support)est: Enhanced SpeedSteptm2: Thermal Monitor 2ssse3: Supplemental SSE-3cid: Context IDfma: Fused multiply-addcx16: CMPXCHG16Bxtpr: Send Task Priority Messages

[email protected] 454 Antonio Carrillo Ledesma, Et alii

Page 457: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

pdcm: Performance Capabilitiespcid: Process Context Identi�ersdca: Direct Cache Accesssse4_1: SSE-4.1sse4_2: SSE-4.2x2apic: x2APICmovbe: Move Data After Swapping Bytes instructionpopcnt: Return the Count of Number of Bits Set to 1 instruction(Hamming weight, i.e. bit count)tsc_deadline_timer: Tsc deadline timeraes/aes-ni: Advanced Encryption Standard (New Instructions)xsave: Save Processor Extended States: also provides XGETBY,XRSTOR,XSETBYavx: Advanced Vector Extensionsf16c: 16-bit fp conversions (CVT16)rdrand: Read Random Number from Hardware random numbergenerator instructionhypervisor: Running on a hypervisor

VIA/Cyrix/Centaur-de�ned CPU features, CPUID level 0xC0000001rng: Random Number Generator present (xstore)rng_en: Random Number Generator enabledace: on-CPU crypto (xcrypt)ace_en: on-CPU crypto enabledace2: Advanced Cryptography Engine v2ace2_en: ACE v2 enabledphe: PadLock Hash Enginephe_en: PHE enabledpmm: PadLock Montgomery Multiplierpmm_en: PMM enabled

More extended AMD �ags: CPUID level 0x80000001, ecxlahf_lm: Load AH from Flags (LAHF) and Store AH into Flags(SAHF) in long modecmp_legacy: If yes HyperThreading not validsvm: Secure virtual machine: AMD-V

[email protected] 455 Antonio Carrillo Ledesma, Et alii

Page 458: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

extapic: Extended APIC spacecr8_legacy: CR8 in 32-bit modeabm: Advanced Bit Manipulationsse4a: SSE-4Amisalignsse: Misaligned SSE mode3dnowprefetch: 3DNow prefetch instructionsosvw: OS Visible Workaroundibs: Instruction Based Samplingxop: extended AVX instructionsskinit: SKINIT/STGI instructionswdt: Watchdog timerlwp: Light Weight Pro�lingfma4: 4 operands MAC instructionstce: translation cache extensionnodeid_msr: NodeId MSRtbm: Trailing Bit Manipulationtopoext: Topology Extensions CPUID leafsperfctr_Core: Core Performance Counter Extensionsperfctr_nb: NB Performance Counter Extensionsperfctr_l2: L2 Performance Counter Extensions

Auxiliary �ags: Linux de�ned - For features scattered in various CPUIDlevelsida: Intel Dynamic Accelerationarat: Always Running APIC Timercpb: AMD Core Performance Boostepb: IA32_ENERGY_PERF_BIAS supportxsaveopt: Optimized Xsavepln: Intel Power Limit Noti�cationpts: Intel Package Thermal Statusdts: Digital Thermal Sensorhw_pstate: AMD HW-PStateproc_feedback: AMD ProcFeedbackInterfaceintel_pt: Intel Processor Tracing

[email protected] 456 Antonio Carrillo Ledesma, Et alii

Page 459: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

Virtualization �ags: Linux de�nedtpr_shadow: Intel TPR Shadowvnmi: Intel Virtual NMI�expriority: Intel FlexPriorityept: Intel Extended Page Tablevpid: Intel Virtual Processor IDnpt: AMD Nested Page Table supportlbrv: AMD LBR Virtualization supportsvm_lock: AMD SVM locking MSRnrip_save: AMD SVM next_rip savetsc_scale: AMD TSC scaling supportvmcb_clean: AMD VMCB clean bits support�ushbyasid: AMD �ush-by-ASID supportdecodeassists: AMD Decode Assists supportpause�lter: AMD �ltered pause interceptpfthreshold: AMD pause �lter threshold

Intel-de�ned CPU features, CPUID level 0x00000007:0 (ebx)fsgsbase: {RD/WR}{FS/GS}BASE instructionsbmi1: 1st group bit manipulation extensionshle: Hardware Lock Elisionavx2: AVX2 instructionssmep: Supervisor Mode Execution Protectionbmi2: 2nd group bit manipulation extensionserms: Enhanced REP MOVSB/STOSBinvpcid: Invalidate Processor Context IDrtm: Restricted Transactional Memorympx: Memory Protection Extensionrdseed: The RDSEED instructionadx: The ADCX and ADOX instructionssmap: Supervisor Mode Access Prevention

[email protected] 457 Antonio Carrillo Ledesma, Et alii

Page 460: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

14 Apéndice D: Cómputo en Instituciones Ed-ucativas

Hace algunos años la disposición de un equipo de cómputo por cada estu-diante era algo difícil de satisfacer para las instituciones educativas. Ahora,las cosas son distintas, cada vez más estudiantes disponen y tienen acceso adispositivos de cómputo � computadoras de escritorio, portátiles, tabletas, yteléfonos inteligentes� que en principio pareciera que permitirían satisfacerla creciente demanda de recursos computacionales de los estudiantes.Pero una computadora requiere de un sistema operativo además de los

diversos paquetes de Software � que esten disponibles para esa versión delsistema operativo� que permitan resolver los problemas para los cuales usa elequipo de cómputo. Aquí es donde empiezan los problemas para los usuariosde equipos de cómputo, puesto que hay una gran cantidad de equipos decómputo con diversas tecnologías y recursos que soportan alguna versión desistema operativo acorde a los recursos computacionales del equipo adquiridoque no necesariamente soportan a todos y cada uno de los programas decómputo que el usuario requiere.Ante la creciente necesidad de programas de cómputo podríamos pensar

en que cada usuario que requiera hacer uso de ellos tenga acceso a un equipode cómputo adecuado, conjuntamente con el sistema operativo que lo soporte.Pero esto dista mucho de la realidad, puesto que la gran mayoría de losusuarios no pueden hacer esos gastos y menos una institución educativa.

¿Entonces que opciones tenemos para satisfacer la creciente de-manda de recursos computacionales?

� Por un lado, si ya disponemos de un equipo de cómputo con su respec-tivo sistema operativo, entonces hacer uso de sólo aquellos programasde cómputo que nuestro equipo soporte, teniendo cuidado de no instalarprogramas de cómputo antagonistas.

� Otra opción es, si ya disponemos de un equipo de cómputo, entoncestener dos o más versiones de sistema operativo que permitan instalaruna mayor diversidad de programas de cómputo y tener el cuidado deno instalar programas de cómputo incompatibles. Así, dependiendo denuestras necesidades podemos hacer uso de uno u otro sistema opera-tivo y sus respectivos programas.

[email protected] 458 Antonio Carrillo Ledesma, Et alii

Page 461: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

� La opción más viable, es una que conjugue las dos anteriores. Peroademás, podríamos emular Hardware del que no disponemos medianteel uso de máquinas virtuales (véase 12) que nos permitirían en un sóloequipo de cómputo usar simultáneamente diversos sistemas operativospara distintas arquitecturas y sus respectivos programas que ahora esposible instalar en las máquinas virtuales programas de cómputo in-compatibles de forma aislada unos de otros.

Usando esta última opción es posible satisfacer en un sólo equipo de cóm-puto una gran variedad de necesidades computacionales. Esto permite quea nivel de usuario (estudiante, ayudante y profesor) o institución educativa,el equipo de cómputo usando Software de virtualización pueda proporcionarun marco que permita satisfacer las diversas y crecientes necesidades com-putacionales. Pero hay que notar que aún esta opción no esta exenta deproblemas legales y técnicos, pero en principio es una opción viable para lagran mayoría de los usuarios y la institución educativa.Tomando esto en cuenta, es viable tener una cantidad adecuada de paque-

tes de cómputo, que permitieran satisfacer las necesidades especializadas dela gran mayoría de los cursos y estos estar instalados en aquellos espacios enlos cuales se asignarían los cursos, además de las áreas comunes de cómputoen la que los estudiantes requiriesen hacer uso de dichos paquetes. Además,de proporcionar un mecanismo para que los profesores y ayudantes que re-quieran enseñar algo con alguna versión privativa que no se disponga, seaimplementada � en medida de lo posible� en los paquetes disponibles. Perohay que hacer notar, que no todas aquellas funciones que hace una versiónparticular de un paquete, es posible hacerlas con otras versiones o paquetesalternativos. Esto es muy común con ciertas actividades especia-lizadas �al hacer cálculo simbólico, cálculo numérico, manejo de datos y trabajar enentornos de desarrollo� . Ello implicaría, por un lado restringir el Softwareinstalado en los equipos de cómputo o por el otro instalar todas y cada unade las solicitudes de Software, aún cuando se requiera más de una versión deun paquete particular.El restringir el Software instalado, impediría al profesor � que así lo re-

quiera por la libertad de cátedra� enseñar aquello que considera que es nece-sario � en particular el manejo de uno o más paquetes especializados decómputo� para proporcionar las herramientas básicas a sus alumnos y queestos deben de dominar para aprobar su curso.

[email protected] 459 Antonio Carrillo Ledesma, Et alii

Page 462: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

En el caso de dar �exibilidad, para que cada profesor solicite la insta-lación del paquete o los paquetes que requiera para sus cursos, implica queel Software solicitado puede o no contar con licencia adecuada de uso. Así,se estaría permitiendo que se tenga instalado Software del que se viola lalicencia de uso (véase 11.3).En cuanto a tener la lista de�nitiva de Software que usaran todos y cada

uno de los profesores o ayudantes de los cursos asignados a un espacio es difíciltener antes del inicio del curso � por la costante evolución del Software y lascambiantes necesidades de la enseñanza� , además de depender de la formade asignación de estos en los laboratorios y talleres de cómputo. En cuantoa la solicitud para hacer la instalación correspondiente, se requiere tenercerteza de en que espacio serán asignados todos y cada uno de los cursos.

Por ello se han buscado opciones161 � no siempre las más adecuadas olícitas (véase 11.3)� para que sin importar en que espacio sea asignado elcurso � siempre y cuando el equipo de cómputo lo soporte� se tenga desdelos primeros días de uso del espacio el paquete solicitado y en casos excep-cionales el tiempo de espera sea menor a unos horas o días sin importar laplataforma �Windows o Linux� o el tipo de Software solicitado � libreo privativo� , se ha optado por la virtualización162, usando como sistemaoperativo base a GNU/Linux Debian Stable, instalando como paquete devitualización a KVM/QEMU. Aquí, se montan las múltiples máquinas vir-tuales que son ejecutadas según las necesidades del usuario. Para controlarla actualización de las máquinas virtuales sin que se requiera intervención delusuario, se usa RSYNC tunelizado mediante SSH que sincroniza las máquinasvirtuales y la con�guración del equipo base de forma remota.Para tener la �exibilidad anteriormente comentada, es necesario poder

contar con distintas versiones de sistemas operativos, de cada una de las ver-siones � en caso de Windows, tener independientemente los Service Pack� .

161En el caso que el equipo sólo tenga un sistema operativo sin virtualización, es necesarioesperar a que las asignaciones de los cursos y sus respectivas peticiones de uso de paquetesde cómputo estén completas, para entonces proceder a realizar instalación del Software queno sean antagónicos. Nótese que, por lo general, los cursos requieren el uso de los equiposde cómputo y el Software solicitado de forma inmediata, por lo cual esperar tiempo (días)para tener acceso al mismo no es una opción viable.162Una vez creada la máquina virtual, esta es un archivo que puede ser copiado o descar-gado de la red, por ello el usuario � estudiante, ayudante o profesor� puede llevarse lamáquina virtual para hacer uso de ella en el equipo al que tenga acceso, teniendo comoúnico requisito tener instalado el programa de virtualización.

[email protected] 460 Antonio Carrillo Ledesma, Et alii

Page 463: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

De tal forma que sea posible instalar cada versión de Software solicitada en laplataforma adecuada, teniendo en cuenta que muchas versiones del Softwareson mutuamente excluyentes para ser instaladas en una misma versión delsistema operativo simultáneamente.

Por todo lo anterior, el uso de máquinas virtuales � que permiten tenermúltiples versiones de sistemas operativos independientemente, así como deuna versión particular tener por separado cada una de ellas con los respec-tivos Service Pack� es una opción viable para proporcionar el servicio deinstalación centralizada de los diversos paquetes de cómputo solicitados porlos profesores de las diversas carreras de la Facultad de Ciencias. Esta op-ción minimiza los tiempos de espera para la instalación de un paquete enparticular y agiliza las prestaciones a todos y cada uno de los grupos quese atienden semestralmente en los cientos de equipos en los laboratorios ytalleres de cómputo.

[email protected] 461 Antonio Carrillo Ledesma, Et alii

Page 464: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

15 Bibliografía

Este texto es una recopilación demúltiples fuentes, nues-tra aportación � si es que podemos llamarla así� esplasmarlo en este documento, en el que tratamos de darcoherencia a nuestra visión de los temas desarrollados.

En la realización de este texto se han revisado � enla mayoría de los casos indicamos la referencia, peropudimos omitir varias de ellas, por lo cual pedimos unadisculpa� múltiples páginas Web, artículos técnicos, li-bros, entre otros materiales bibliográ�cos, los más repre-sentativos y de libre acceso los ponemos a su disposiciónen la siguiente liga:

http://mmc.geo�sica.unam.mx/acl/Herramientas/

Referencias

[1] Carreras en la Facultad de Ciencias, UNAM,http://www.fciencias.unam.mx/licenciatura/resumen/

[2] Aulas y Talleres en el Tlahuizcalpan de las Carrerasde Matemáticas de la Facultad de Ciencias, UNAM,http://www.matematicas.unam.mx/tlahuiz/ 388

[3] http://es.wikipedia.org/wiki/Microsoft_Windows 15

[4] http://es.wikipedia.org/wiki/Linux 21

[5] http://es.wikipedia.org/wiki/Mac_OS 16

[6] http://es.wikipedia.org/wiki/Android 18

[7] https://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)125

[email protected] 462 Antonio Carrillo Ledesma, Et alii

Page 465: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

[8] https://es.wikipedia.org/wiki/Python 125

[9] https://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n)125

[10] https://es.wikipedia.org/wiki/C%2B%2B 125

[11] http://www.gnu.org/philosophy/free-sw.es.html 396

[12] http://es.wikipedia.org/wiki/Software_libre 396

[13] http://www.hispalinux.es/SoftwareLibre 396

[14] http://es.wikipedia.org/wiki/Software_propietario 401

[15] Diferentes Tipos de Licencias para el Software,http://www.gnu.org/licenses/license-list.html 364, 396, 399

[16] FSF, Free Software Fundation, http://www.fsf.org/ 396, 397, 399, 418

[17] GNU Operating System, http://www.gnu.org/ 396, 399

[18] LaTeX, A Document Preparation System, http://www.latex-project.org/ 389

[19] MATLAB, MathWorks, http://www.mathworks.com/products/matlab/363, 365, 388

[20] SCILAB, Scilab Open Source for Numerical Computation,http://www.scilab.org/ 364

[21] Julia, The Julia Programming Language, https://julialang.org 364

[22] FreeMat, FreeMat Open Source for rapid engineering and scienti�c pro-totyping and data processing, http://freemat.sourceforge.net/ 364, 388

[23] OCTAVE, GNU Octave, https://www.gnu.org/software/octave/ 363,365, 388

[24] SCIPY Open Source Library of Scienti�c Tools, http://www.scipy.org/364, 388

[25] Python Programming Language, http://www.python.org/ 364

[email protected] 463 Antonio Carrillo Ledesma, Et alii

Page 466: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

[26] SAS, Business Analytics and Business Intelligence Software,http://www.sas.com/ 388

[27] IBM SPSS Software, http://www-01.ibm.com/Software/analytics/spss/388

[28] GNU PSPP, http://www.gnu.org/software/pspp/ 388

[29] The R Project for Statistical Computing, http://www.r-project.org/365, 388, 389

[30] LINPACK, http://www.netlib.org/linpack/ 363

[31] EISPACK, http://www.netlib.org/eispack/ 363

[32] Scicos Block Diagram Modeler/Simulator, http://www.scicos.org/ 364

[33] Simulink Simulation and Model-Based Design,https://es.mathworks.com/products/simulink.html 363, 364

[34] MATLAB to Scilab conversion tips,http://help.scilab.org/docs/6.0.1/en_-US/m2sci_doc.html 388

[35] EViews, http://www.eviews.com/home.html 388

[36] Gretel, http://gretl.sourceforge.net/ 388

[37] Statgraphics, http://statgraphics.softonic.com/ 388

[38] Statistica, https://www.tibco.com/es/products/tibco-statistica 388

[39] Systat, https://www.systatsoftware.com/ 388

[40] Vensim, http://vensim.com/vensim-Software/ 388

[41] Maple, http://www.maplesoft.com/ 365, 388

[42] Mathematica, http://www.wolfram.com/mathematica/ 365, 388

[43] Maxima, http://maxima.sourceforge.net 365, 388

[44] RWeka, https://cran.r-project.org/Web/packages/RWeka/index.html389

[email protected] 464 Antonio Carrillo Ledesma, Et alii

Page 467: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

[45] Tinn-R Edit code and run it in R,http://nbcgib.uesc.br/lec/software/editores/tinn-r/en 389

[46] RStudio Software, Education, and Services for the R community,http://www.rstudio.com/ 389

[47] Suite de código abierto con más de 700 paquetes para el desarrollo de laciencia de datos con Python, https://www.anaconda.com/ 388

[48] Suite de código abierto de Software matemático como: NumPy,SciPy, matplotlib, Sympy, Maxima, GAP, FLINT, R, entre otros,basada en Python o directamente vía interfaces o Wrappers,http://www.sagemath.org/ 389

[49] El economista, http://eleconomista.com.mx/tecnociencia/2013/01/22/clausuraran-negocios-mexico-uso-ilegal-Software 404

[50] PCworld, http://www.pcworld.com.mx/UNAM-y-BSA-promueven-el-uso-de-software-legal/ 405

[51] L. F. Pavarino, A. Toselli; Recent Developments in Domain Decomposi-tion Methods. Springer, 2003. 292

[52] M.B. Allen III, I. Herrera &G. F. Pinder; Numerical Modeling in ScienceAnd Engineering. John Wiley & Sons, Inc . 1988. 289, 291, 292

[53] R. L. Burden y J. D. Faires; Análisis Numérico. Math Learning, 7 ed.2004. 289

[54] S. Friedberg, A. Insel, and L. Spence; Linear Algebra, 4th Edition, Pren-tice Hall, Inc. 2003. 289

[55] Y. Saad; Iterative Methods for Sparse Linear Systems. SIAM, 2 ed. 2000.280, 282, 284, 289, 291, 292

[56] Y. Skiba; Métodos y Esquemas Numéricos, un Análisis Computacional.UNAM, 2005. 288, 289, 292, 295

[57] I. Herrera;Un Análisis del Método de Gradiente Conjugado. Comunica-ciones Técnicas del Instituto de Geofísica, UNAM; Serie Investigación,No. 7, 1988. 297

[email protected] 465 Antonio Carrillo Ledesma, Et alii

Page 468: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

[58] G. Herrera; Análisis de Alternativas al Método de Gradiente Conjugadopara Matrices no Simétricas. Tesis de Licenciatura, Facultad de Ciencias,UNAM, 1989. 297

[59] M. Diaz, I. Herrera; Desarrollo de Precondicionadores para los Proce-dimientos de Descomposición de Dominio. Unidad Teórica C, Posgradode Ciencias de la Tierra, 22 pags, 1997. 299

[60] A. Toselli, O. Widlund; Domain Decomposition Methods - Algorithmsand Theory. Springer, 2005. 299

[61] C.T. Keller, Iterative Methods for Linear and Nonlinear Equations, So-ciete for Industrial and Applied Mathematics, 1995. 292, 295

[62] W. Gropp, E. Lusk, A. Skjellem, Using MPI, Portable Parallel Program-ming Whit the Message Passing Interface. Scienti�c and EngineeringComputation Series, 2ed, 1999. 353, 354, 360

[63] I. Foster; Designing and Building Parallel Programs. Addison-WesleyInc., Argonne National Laboratory, and the NSF, 2004. 353, 354, 360

[64] Jorge L. Ortega-Arjona, Patterns for Parallel Software Design, Wileyseries in Software Design Patterns, 2010. 353

[65] S.J. Pennycook, S.D. Hammond, S.A. Jarvis and G.R. Mudalige, Per-formance Analysis of a Hybrid MPI/CUDA Implementation of the NAS-LU Benchmark. ACM SIGMETRICS Perform. Eval. Rev. 38 (4). ISSN0163-5999, (2011). 360

[66] XMPI, A Run/Debug GUI for MPI. 353

http://www.lam-mpi.org/software/xmpi/

[67] VAMPIR, Performance Optimization. 360

http://www.vampir.eu/

[68] QEMU, http://wiki.qemu.org/Main_Page 407, 423

[69] KVM, http://www.linux-kvm.org/page/Main_Page 407

[70] Oracle MV VirtualBox, https://www.virtualbox.org 411, 423

[email protected] 466 Antonio Carrillo Ledesma, Et alii

Page 469: Introducción a la Programaciónmmc.geofisica.unam.mx/acl/edp/IntroduccionALaProgramac... · 2020-03-20 · de construcción de Software y los criterios para su uso y combinación

Introducción a la Programación

[71] VMware, https://www.vmware.com 423

[72] Virtual PC, 423

https://www.microsoft.com/es-mx/download/details.aspx?id=3702

[73] Hyper-V,

https://msdn.microsoft.com/es-es/library/mt16937(v=ws.11).aspx

[74] Parallels, https://www.parallels.com 423

[75] Máquinas Virtuales, http://es.wikipedia.org/wiki/Máquina_virtual 407

[76] Algunos usos de máquinas Virtuales, 407

http://www.con�gurarequipos.com/doc747.html

[email protected] 467 Antonio Carrillo Ledesma, Et alii