Los objetivos del curso CI-0110 "Introducción a la computación" son que la persona estudiante pueda:
-
Explicar los conceptos fundamentales de la disciplina [C].
-
Resolver problemas mediante diseño matemático y algorítmico [A].
-
Emplear herramientas informáticas básicas para su formación y ejercicio profesional [H].
-
Desarrollar un criterio ético ante el impacto de la tecnología en la sociedad [E].
1. Filosofía de la computación
1.1. Computación como disciplina [C]
¿Cuál es el propósito de la disciplina? Es decir, ¿a qué se dedicará el resto de su vida la persona profesional de esta disciplina? ¿Cuál es el método para lograr ese propósito?
Responda de acuerdo a lo que usted piensa:
-
¿Es la computación una matemática? ( ) Sí ( ) No
-
¿Es la computación una ciencia? ( ) Sí ( ) No
-
¿Es la computación una ingeniería? ( ) Sí ( ) No
De acuerdo a lo que usted piensa: Indique en la siguiente tabla el propósito de cada disciplina en una oración. Indique el método que cada disciplina sigue para lograr su propósito. No indague ni comente con otras personas, simplemente escriba las ideas que le llegan a la mente.
Disciplina | Propósito/Objetivo | Método |
---|---|---|
Matemática |
||
Ciencia |
||
Ingeniería |
||
Computación |
En parejas discutan y refinen sus propias definiciones, sin indagar en otras fuentes. Una vez refinadas todas las celdas de la tabla, discuten en grupos de cuatro, y así sucesivamente hasta formar un unico grupo. Un delegado transcribe las decisiones en un documento compartido (ej. pizarra).
El docente expone su filosofía.
Cada estudiante de forma individual, plasma los objetivos y métodos que más le convencieron.
1.2. Estudios universitarios [E]
Los estudios universitarios no son un fin. Nadie estudia para contemplar un título colgado en una pared, ahí terminar y dedicarse a otra cosa. Los estudios son un medio. Los fines para los cuales se estudia una carrera son más trascendentales. Los hay a corto y largo plazo. Ejemplos podrían ser: para cambiar a otra carrera en la que no logré ingresar, para ganar bien, crear una empresa, ser como alguien que admiro, …
Liste las razones o motivaciones por las que escogió estudiar la carrera de computación. Piense en el momento en que tuvo que llenar el formulario con las opciones de carrera. ¿Qué le llevó a escoger computación?
-
¿Cuál es mi propósito de estudiar computación? ¿Qué meta quiero conseguir?
-
Imagine que ya en este momento tiene el anhelado título en sus manos ¿qué haría con él? ¿emprendería? ¿continuaría estudiando? ¿saldría del país?
Mercado laboral costarricense e internacional. Sector industria, gobierno, y académico. Empleamiento vs emprendedurismo.
1.2.1. Grados académicos
Llene la siguiente tabla con las ideas que le vienen a la mente. Escriba una palabra en cada celda de la segunda columna, que resuma lo que una persona formada en ese nivel universitario es. Naturalmente esa palabra no es "bachiller", "máster", ni "doctor(a)". En la tercera columna puede indicar varias palabras o frases.
Un/a: | es la formación de un/a: | y se distingue de quien no lo es por: |
---|---|---|
Bachillerato (Licenciatura) |
||
Maestría |
||
Doctorado |
1.2.2. Énfasis del bachillerato
Énfasis del bachillerato. Ejemplo con un problema complejo
-
Ingeniería electrónica (EE)
-
Ingeniería en computación (CE)
-
Ciencias de la computación (CS)
-
Ingeniería de software (SE)
-
Tecnología de la información (IT)
1.3. Lenguajes de marcado ligero [H]
1.3.1. Archivos y editores de texto
Escriba las respuestas a las siguientes preguntas en un archivo de texto text_files.txt
.
-
¿Cuál es la diferencia entre editor de texto (ej.: Notepad, Geany) y procesador de palabras (ej.: Google Docs, Microsoft Word…)?
-
¿Qué es un archivo?
-
¿Cuál es la diferencia (informal) entre archivos de texto y binarios?
-
¿Cuál es la importancia de los archivos de texto en la disciplina?
Por sencillez, se puede considerar un archivo de texto como una secuencia de caracteres alfanuméricos y de puntuación, sin formato. Hay una amplia oferta de editores de texto, por ejemplo, Notepad++, Sublime Text, Geany, Emacs, y Vi.
Transcriba lo mejor que pueda una de las tablas de la filosofía de la computación (del grupo, del docente, …) a un archivo de texto plano. Piense que va a enviar el archivo a otra persona ajena a la discusión y que esa persona pueda comprender que se trata de una tabla. Guarde el archivo con extensión .txt
en una carpeta computing_philosophy/
.
1.3.2. Ambiente de desarrollo integrado (IDE)
Un ambiente/entorno de desarrollo integrado (IDE, Integrated Development Environment) es un software que facilita la creación de código fuente y otros archivos asociados a la programación de computadoras. Se caracteriza por tener un editor de texto para editar el código fuente, herramientas de construcción para compilar, depurar, y probar dicho código.
Si no lo tiene ya, instale en su máquina personal el Microsoft Visual Studio Code. Se puede trabajar con un archivo directamente, pero lo usual es hacerlo con una carpeta que puede abrir o arrastrar. El IDE mostrará un explorador de archivos y un editor de texto. En el curso lo usaremos principalmente para marcado ligero (Markdown, AsciiDoc), diseño algorítmico (pseudocódigo) y programación (Python).
Abra la carpeta computing_philosophy/
en el ambiente de desarrollo. ¿Qué diferencias nota respecto al editor de texto? Trate de renombrar el archivo desde el IDE y deshaga el cambio.
1.3.3. Marcardo ligero: Markdown [H]
Un archivo con marcado ligero es un archivo de texto que aplica las reglas de un lenguaje para marcar trozos de texto y darles un significado diferente. Es ligero porque las marcas son poco obstructivas, y permite leer el contenido original con facilidad. Hay varios de estos lenguajes, entre los que se puede citar Markdown por sencillez/popularidad y AsciiDoc por funcionalidad.
Ejemplo de marcas en Markdown: párrafos, títulos, listas, tablas. Énfasis, código fuente, bloques de código fuente.
Transcriba una de las tablas de la filosofía de la computación a un archivo de texto en formato Markdown. Agregue el propósito del documento, títulos, y resalte las palabras más importantes.
Plugin de Markdown para el navegador para visualizar documentos.
Plugin de Markdown para enriquecer texto. Enviar un correo electrónico con el archivo final.
1.3.4. Expresiones regulares [H]
Convertir las tablas de Google Docs a Markdown
2. Resolución de problemas
2.1. Ejercicios vs problemas [A]
Un problema es una situación vivencial desventajosa y las acciones para cambiarla a una situación favorable (modelo solución) no son inmediatamente obvias. Hay que averiguar o construir este modelo, lo cual genera un bloqueo mental. Se diferencia de un ejercicio que es una situación para la cual se tiene un modelo solución, el cual simplemente se aplica o “ejercita”.
Tres misioneros y tres caníbales deben cruzar un río. Hay un bote pequeño que no puede contener más de dos personas. Si llegara a ocurrir que a un lado del río hayan más caníbales que misioneros, incluyendo los que están en el bote, los caníbales devorarán a los misioneros. Su propósito es encontrar el itinerario más sencillo que permita a todos los misioneros y caníbales cruzar el río de forma segura usando el bote. Suponga que todos los pasajeros desembarcan siempre al llegar a la otra orilla y que debe haber al menos una persona en el bote para cruzarlo de un lado al otro del río.
Los números del 1 al 9 reservaron un hotel con nueve habitaciones dispuestas como muestra la figura de abajo. Sin embargo, antes de llegar al hotel ocurrió un altercado entre los números, de tal forma que tanto los números consecutivos (ejemplo 6 y 7), como los divisores y múltiplos excepto 1 (ejemplo 3 y 6) quedaron enemistados. Ellos no están dispuestos a dormir en una habitación que tenga por vecino (en cruz o diagonal) a uno de sus enemigos. ¿Puede ubicar los nueve dígitos del 1 al 9 en el hotel de tal forma que puedan dormir tranquilos?
2.2. Proceso de resolución de problemas [A]
2.3. Análisis [AC]
Comprender el problema. Complejo cuando uno no está familiarizado(a) con el contexto.
Producto: documentos de requerimientos.
Prueba: verificación con los usuarios/clientes.
Generar casos de prueba
2.4. Diseño [AC]
Arquitecto que construye un edificio sin planos. Cambian los requerimientos.
Resolver el problema con artefactos baratos. Pueden ser artefactos de invención propia, o si son definidos por un colectivo, depende del paradigma.
Producto: modelos o diseños.
Prueba: Rastrear el modelo con casos de prueba y confirmar que realiza o produce el resultado deseado.
2.5. Implementación [AC]
Traducir los modelos
2.6. Implantación [AC]
2.7. Métodos de resolución de problemas [A]
2.7.1. Prueba y error
2.7.2. Descomposición (divide-y-vencerás)
2.7.3. Analogía
2.8. Control de versiones [H]
Concepto de control de versiones y sus beneficios.
Crear un repositorio para el curso, y cada curso de la carrera
Agregar todos los archivos de Markdown hechos hasta el momento (filosofía de la computación).
3. Paradigmas de computación
3.1. Adopción o programación [A]
Buscar soluciones existentes primero: adopción de herramientas de software
Definición de programación
Reutilizar recursos siempre dando el crédito cuando corresponde.
3.2. Diseño humano [A]
No se puede instruir una máquina si uno no puede resolver un problema con los recursos que uno dispone. Sin las limitaciones de la máquina
Recursos: papel, plastilina, legos, matemática…
Resolver algunos problemas funcionales/matemática discreta.
3.3. Recursos de la máquina computacional [C]
Procesamiento
Almacenamiento
Comunicación
3.4. Paradigmas de computación/programación [C]
Definición de paradigma de computación/programación.
Paradigmas, conceptos, y lenguajes de programación. Relación entre ellos.
Relaciones entre paradigmas
Computación/programación imperativa vs declarativa
Computación/programación funcional
En una convención se encuentran 20 personas. Si cada asistente saluda a todos las demás con un apretón de manos: (1) ¿Cuántos apretones de mano hubo en total?
(2) Si en la convención se encuentran \(n\) personas, diseñe un modelo que encuentre la cantidad total de apretones de mano que se efectuarán.
(3) Si por el contrario, se sabe que en la convención se efectuaron \(h\) apretones de mano, diseñe un modelo que indique la cantidad de personas que participaron en el evento.
Computación/programación procedimental
En su camino, una tropa de infantería se encuentra con que el puente sobre un profundo río fue destruido, y cerca de él, un par de niños juegan en su bote de remos. El bote es tan pequeño que sólo soporta el peso de un soldado o de dos niños. Pese a esto, la tropa logró cruzar el río. ¿Cómo lo lograron? Si la tropa consta de \(n\) soldados, diseñe un modelo que resuelva el problema.
Computación/programación genérica
Computación/programación orientada a eventos
Computación/programación orientada a objetos
Computación/programación concurrente
Computación/programación distribuida
Computación/programación lógica
Computación/programación metaprogramación
Problemas complejos: combinación de los paradigmas
Metáfora de la caja de herramientas. Ejemplo del albañil que sólo usa martillo.
3.5. AsciiDoc [H]
Hacerle un readme al repositorio
Tabla de contenidos
4. Diseño procedimental: algoritmos
Un algoritmo es un conjunto ordenado de instrucciones efectivamente computables no ambiguas que se ejecutan en un tiempo finito y producen un resultado. Un algoritmo correcto es el que produce el resultado esperado para resolver un problema. El resultado debe ser observable, podría ser un número, un texto, imagen, o un cambio en el medio. Un algoritmo eficiente es el que produce el resultado usando una cantidad razonable de recursos de la máquina: tiempo (procesamiento), espacio (memoria), y comunicación (entrada/salida).
Una instrucción es no ambigua si puede ser comprendida y ejecutada directamente por el agente computacional sin necesidad de más simplificaciones o explicaciones [Schn19]. Los agentes disponen, de nacimiento o de fábrica, de un conjunto de instrucciones primitivas que son por naturaleza no ambiguas. Para una máquina, la cantidad de instrucciones primitivas son reducidas, no así para un humano. Las instrucciones primitivas varían también de máquina en máquina de la misma forma que de una persona a otra. De esta forma, un algoritmo para un agente podría no ser apto para otro.
Sobre las instrucciones primitivas se escriben algoritmos que pasan a formar parte del banco de operaciones que el agente puede realizar. Nuevos algoritmos pueden escribirse en función de las instrucciones primitivas, de los algoritmos ya conocidos por el agente, o ambas. Esta poderosa capacidad no sólo permite reutilizar código, sino resolver problemas más complejos.
Una instrucción es efectivamente computable si el agente, además de comprenderla, es capaz de realizarla. Por ejemplo, si a usted se le pide saltar con sus pies del suelo al techo de la Torre de Pisa, leer La Biblia completa en una hora, o ganarle diez partidas seguidas de ajedrez al motor de Stockfish, son instrucciones comprensibles, no ambiguas, pero incapaces de ser ejecutadas por un humano.
Las instrucciones se escriben en la conjugación verbal imperativa.
Origen del concepto: Abu Ja’far Muhammad ibn Musa Al-Khwarizmi (780-850?) profesor de matemáticas en Baghdad cuando el imperio Persia se convirtió en punto de encuentro de pensadores y científicos. En el año 820 escribió Kitab al jabr w’al muqabala (El libro conciso de cálculos por reducción) que se convirtió en el libro de texto de matemáticas más usado en Europa. El término "reducción" en árabe se escribe al jabr que se occidentalizó como "álgebra". En el año 825 Al-Khwarizmi escribió otro libro sobre el sistema número posicional en base 10 recién desarrollado en la India. Al-Khwarizmi fue muy cuidadoso de incluir procedimientos para realizar las operaciones en este nuevo sistema numérico. Al traducir el libro al latin, su apellido quedó Algoritmi y en su honor, los procedimientos contenidos en el libro se comenzaron a llamar "algoritmos". Por lo tanto, el término "algoritmo" es un epónimo.
4.1. Algoritmos para agentes humanos [A]
Diseñe un algoritmo para que una persona que lo ejecute pueda efectivamente bañarse.
Haga pareja con otra persona. Una persona tomará el rol de mago y la otra el rol de modelo. La persona en rol de mago realiza los siguientes pasos (de preferencia memorizárselos y agregar dramatismo y sonidos de suspenso). La persona modelo no debe conocer el truco y hará lo que el mago dice. Ambos pueden usar una calculadora si lo prefieren.
-
[Mago dice:] Piense un número positivo de tres dígitos cualquiera.
-
Duplique los dígitos, por ejemplo, 123 se convertiría en 123123.
-
Divida el número de seis dígitos por 7, un número de buena suerte.
-
Divida el número que obtuvo por 13, un número de mala suerte.
-
¿Pero por qué hace esa cara? ¿Qué cosa rara de número le dejó la mala suerte?
-
[Mago divide el número que le dieron entre 11, el resultado será <X>]
-
¡Chan-chan-chan-chan Mis poderes dicen que usted pensó en el número <X>!
El agente que ejecuta un algoritmo (persona o máquina), llamado agente computacional, no necesita comprender el problema, ni las decisiones de diseño que llevaron a la formulación del algoritmo.
No todo problema se puede resolver algorítmicamente, incluso aunque parezcan factibles. Un ejemplo clásico el el problema de la parada, que consiste en construir un algoritmo que indique si otro algoritmo se detendrá en algún momento. Teóricamente es imposible construir este algoritmo. Este tipo de problemas se les conoce como problemas no resolubles {unsolvable problems}.
Existe otro conjunto de problemas para los cuales teóricamente se puede construir una solución algorítmica, pero su ejecución consume tantos recursos que incluso la super computadora más potente que disponga la humanidad tardaría millones de años en poderlos ejecutar. A estos problemas se les llaman problemas intratables.
Un ejemplo de un problema intratable es una solución que construya todo el espacio de movimientos (jugadas) del Ajedrez, lo cual sería el algoritmo que gane todos los juegos en que compita. Con una oportunidad promedio de 40 jugadas posibles por turno y 30 turnos para que el juego concluya, la cantidad aproximada de movimientos es un árbol de \(40^30 ~ 10^48\) jugadas. Una supercomputadora que pueda analizar mil billones de jugadas en un segundo (\(10^15\)) tardaría \(\frac{10^48}{10^15}=10^33s=3.17 \cdot 10^25 \text{años}\), es decir, aproximadamente 32 cuatrillones de años en hacer su primer movimiento.
Existe un último grupo de problemas que se conjetura pueden resolverse algorítmicamente, pero nadie ha intentado o logrado elaborar uno. Algunas actividades que son naturales para los seres humanos, pero realmente difíciles para las computadoras entran en esta categoría, como la habilidad de generar humor.
4.2. Algoritmos para máquinas computacionales [A]
La máquina no tiene tanta libertad como los humanos. Sus capacidades son limitadas a los tres tipos de recursos. De ellos se definen ocho tipo de instrucciones:
Recurso | # | Instrucción | Ejemplos en pseudocódigo |
---|---|---|---|
Comunicación |
1 |
Leer valor(es) |
|
2 |
Imprimir valor(es) |
|
|
Almacenamiento |
3 |
Crear una variable con un valor |
|
4 |
Cambiarle el valor a una variable |
|
|
Procesamiento |
5 |
Condicionar instrucción(es) |
|
6 |
Repetir instrucción(es) |
|
|
Descomposición |
7 |
Realizar una subtarea |
|
8 |
Definir una subtarea: |
|
Sintaxis | Ejemplos en pseudocódigo |
---|---|
Definir tipos de datos |
|
Expresiones |
|
Constantes literales |
|
Manejo de archivos
|
|
Un valor es un elemento de un conjunto de datos. Por ejemplo, -5
es un valor del conjunto de números enteros. Una expresión es una combinación de operadores y operandos que se evalúa en un valor. Por lo tanto, las instrucciones que trabajan con un valor, puede este cambiarse por una expresión.
Las tareas/subtareas (rutinas/subrutinas) es el mecanismo funcional y procedimental de descomponer, modularizar, y abstraer grandes problemas en otros unidades más pequeñas y reutilizables desde diferentes contextos.
Las primitivas de comunicación (primer grupo de la tabla) son los archivos (una secuencia de bytes que se accede con cursores de entrada o salida) y los eventos. Los archivos ofrecen operaciones de entrada (input
o read
), salida (output
o write
), posicionamiento (seeking
), apertura (open
), cierre (close
), y manejo de errores (eof
). Los eventos pertenecen al paradigma de computación dirigida por eventos (event-driven programming). A nivel de algoritmos se podrían incorporar la primitiva de registro de eventos (when
).
La memoria (almacenamiento, segundo grupo de la tabla) se organiza en cuatro primitivas: variables, indirección (direcciones de memoria o punteros), arreglos (array
), y registros de memoria (record
).
La obesidad es una de las enfermedades más alarmantes del presente y futuro de la humanidad. Actualmente mueren casi 3 millones de adultos por año a causa de la obesidad y el sobrepeso. Para dar un punto de comparación, si esta enfermedad atacara a todos los ticos, en año y medio acabaría con toda la población del país.
La forma convencional de medir la obesidad es a través del índice de masa corporal (IMC) (en inglés BMI de body mass index), que relaciona la masa m en kilogramos de la persona con su altura h en metros, según la ecuación:
\(bmi = \frac{m}{h^2}\)
La Organización Mundial de la Salud definió cuatro estados nutricionales de acuerdo a la siguiente tabla:
Resultado |
Estado nutricional |
BMI category |
bmi < 18.5 |
infrapeso |
underweight |
18.5 ≤ bmi < 25 |
normal |
normal |
25 ≤ bmi < 30 |
sobrepeso |
overweight |
30 ≤ bmi |
obesidad |
obese |
En un centro de observación de la obesidad, se tienen registros de varios indicadores de salud, entre ellos el peso (en kilogramos) y altura (en centímetros), de millones de personas. Se quiere un programa que calcule y reporte el índice de masa corporal y el estado nutricional para cada registro.
Ejemplo de entrada:
57.5 149
58 169
15.8 113
70.6 192
-68.9 0
120 175
Ejemplo de salida:
57.50 149.00 25.90 overweight
58.00 169.00 20.31 normal
15.80 113.00 12.37 underweight
70.60 192.00 19.15 normal
-68.90 0.00 invalid data
120.00 175.00 39.18 obese
Debido a problemas de calidad de datos, hay algunas masas y alturas registradas como cero o negativas, o valores exagerados, presumiblemente por errores de digitación. Estas dos medidas siempre deben ser positivas, la altura no puede superar los 300cm y la masa los 1000kg. En caso contrario, se debe indicar invalid data
para ayudar al observatorio a detectar esos casos.
4.3. Pseudocódigo [AC]
Entrada y salida [AC]
Variables y expresiones (cómputo) [AC]
Control de flujo/secuencia [AC]
Tareas/subrutinas/modularización [AC]
4.4. Diagramas de flujo [AC]
4.5. PSeint [H]
4.6. Rastreo de algoritmmos
4.7. Análisis de complejidad
Use una hoja de cálculo para comparar el comportamiento de los órdenes de magnitud \(O(lg n)\), \(O(n)\), \(O(n^2)\), \(O(n^3)\), \(O(2^n)\), y \(O(n!)\). Trate de representar el comportamiento con algunos valores de \(n\), al menos entre 0 y 100.
Elabore un gráfico donde el eje-x corresponde a \(n\) y el eje-y a la cantidad de recursos que debe consumir la máquina para ese \(n\). Cada función de orden corresponde a una serie en el gráfico.
Suponga que una computadora puede ejecutar una cantidad de instrucciones por segundo, indicada en una celda de la hoja de cálculo. Para cada valor de las funciones, calcule cuánto tiempo le tomaría a la máquina ejecutarlas. Haga un segundo gráfico que refleje el tiempo.
5. Calculadoras
Las calculadoras son las predecesoras a las computadoras. Se pueden considerar la pre-historia de la computación.
Ejercicio: hacer una línea de tiempo.
5.1. Calculadoras mecánicas
El ábaco: representa el estado del programa, la persona es la CPU. La persona ejecuta procedimientos o algoritmos para realizar las operaciones.
El incremento de la investigación científica en el renacimiento, que requería el cómputo de cálculos aritméticos más complejos y precisos, pudo ser la motivación de automatizarlos mediante máquinas [Schn19]. Hubo un considerable número de máquinas calculadoras mecánicas que se desarrollarían hasta la aparición de la calculadora electrónica hacia 1970. En lo siguiente sólo se listan algunas.
La Pascalina (Francia) Video de la máquina. Podía hacer sumas y restas. Concepto de acumulador, desborde, aritmética de precisión de punto fijo vs matemática entera.
Gottfried Leibnitz (Alemania) se interó en el trabajo de Pascal y otros. Construyó dos calculadoras capaces de multiplicar. Su innovación se debe a un dispositivo al que llamó La rueda de Leibnitz (Leibnitz’s Wheel) creado en 1673 y que se usaría en las calculadoras mecánicas hasta su extición hacia la década de los 1970.
Se diferencian de las computadoras en que las calculadoras no son programables.
5.2. Concepto de acumulador
En la Pascalina, cada engranaje representa un dígito en base 10. Naturalmente, la Pascalina no puede representar números de una cantidad infinita de dígitos, si no de tantos dígitos como engranajes tenga. Si una pascalina tiene w engranajes, se dice que es una Pascalina de w digitos. El concepto de Pascalina en este contexto sigue siendo válido en las computadoras modernas, pero recibe el nombre de acumulador (en inglés, accumulator) o registro de CPU (en inglés, register). Naturalmente las computadoras modernas no utilizan engranajes sino transistores, pero el concepto sigue siendo el mismo.
-
Sea \$a\$ el primer número a sumar, compuesto de \$w\$ dígitos: \$a_{w-1}, a_{w-2}, ..., a_1, a_0\$ tal que el dígito \$i\$ tenga un valor posicional de \$a_i \cdot 10^i\$.
-
Sea \$b\$ el segundo número a sumar, compuesto también de \$w\$ dígitos \$b_{w-1}, b_{w-2}, ..., b_1, b_0\$ con las mismas propiedades que \$a\$.
-
Sea \$r\$ la variable que almacenará el resultado de la suma \$r = a + b\$, compuesto de máximo \$w + 1\$ dígitos \$r_w, r_{w-1}, r_{w-2}, ..., r_1, r_0\$ con las mismas propiedades de los dos anteriores.
-
Sea \$c := 0\$ la variable "acarreo" de la suma de dos dígitos.
-
Para \$i := 0\$ hasta \$w\$ haga:
-
Sea \$s = a_i + b_i + c\$ la suma parcial con sus correspondientes dígitos \$s_1, s_0\$.
-
\$r_i := s_0\$
-
\$c := s_1\$
-
-
Si \$c > 0\$ entonces:
-
\$r_w := c\$*
-
-
El resultado de la suma estará en \$r\$.
Suma de dos números en precisión de punto fijo. En un aritmética de precisión de punto fijo, la instrucción 6.a del algoritmo anterior, cambiaría por "encienda bombillo de desbordamiento (overflow)".
Diseñe un algoritmo para máquinas que permita sumar dos números de hasta w dígitos. El programa lee la cantidad de dígitos y luego dos números de máximo esa cantidad de digitos. Calcula la suma y la imprime. Ejemplo de entrada:
2 37 28
Ejemplo de salida
65
Si el número resultado ocupa
5.3. El telar de Jacquard [E]
El telar de Joseph Jacquard primera máquina programable para automatizar la creación de tejidos que era una labor muy lenta y propensa a fallos. 1801. El dispositivo innovador fue el uso de tarjetas perforadas que indicaban si un hilo iba por encima o debajo del tejido. Forman un patrón. Cada tarjeta programa una fila del patrón. Varias tarjetas se conectan entre ellas y el telar las procesaba en secuencia. Primer dispositivo en usar código binario?
Impacto en la sociedad. Personas por temor a perder su puesto de trabajo, formaron agrupaciones que violentamente se opusieron a los cambios tecnológicos. Un ejemplo fueron los Luddites, liderados por Ned Ludd Nottingham en Inglaterra, quienes quemaron fábricas donde se usaban telares de Jacquard. Es el inicio de la tecnofobia [Schn19].
5.4. Las máquinas diferencial y analítica
Charles Babbage era hijo de un bancario en Inglaterra. Estudió matemáticas y se convirtió en profesor de esta disciplina en la Universidad de Cambridge. En las dos anteriores el operador interpreta el resultado que es la posición final de los engranajes. Babbage visionó que la calculadora imprimiera el resultado para evitar errores de interpretación.
Diseñe un algoritmo para sumar dos números en base 10 de máximo tre dígitos. Piense que el resultado puede ser de cuatro o menos dígitos.
Adapte su algoritmo del sumador de tres dígitos para que el resultado siempre se produzca en un número también de tres dígitos. Descarte siempre el acarreo en la cifra más significativa. Rastree su algoritmo e indique qué resultado produce con la expresión 708 + 524?
Adapte su algoritmo para que pueda sumar dos números en base 10 de cualquier cantidad de dígitos. A este tipo de matemática se le conoce como aritmética de precisión arbitraria.
¿Por qué escribir procedimientos que sabemos hacer informalmente de esa manera tan complicada? Porque si podemos especificar formalmente un algoritmo para resolver un problema, entonces podemos automatizar su solución. Es decir, codificarlo en un lenguaje de programación, convertirlo en un programa de computadora, de tal forma que pueda ser ejecutado con las ventajas de velocidad, almacenamiento, y comunicación que esta dispone.
6. Aritmética de precisión de punto fijo
La aritmética de precisión de punto fijo son aproximaciones finitas de los números enteros de los seres humanos.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6.1. Aritmética sin signo (~enteros no negativos)
6.2. Aritmética con signo (~enteros)
Hay varias convenciones para representar enteros negativos en un acumulador: signo-magnitud, notación de exceso, y complemento a dos.
6.3. Signo-magnitud
El primer bit siempre indica el signo, donde 0
es positivo o neutro, y 1
es negativo. El bit de signo sólo tiene ese significado. Los restantes bits codifican la magnitud utilizando notación sin signo.
6.4. Complemento a la base
Se utiliza el método de los complementos para representar positivos y negativos en acumuladores de ancho \$w\$ dígitos en base \$b\$. En este método se define:
Definición | Nombre largo | Nombre corto |
---|---|---|
\$-x = b^w - x\$ |
El complemento a la base |
El negativo |
\$\bar{x} = b^w - 1 - x\$ |
El complemento a la base - 1 |
El complemento |
Una forma más rápida de calcular el negativo es obtener el complemento a la base -1 de cada dígito y luego sumarle uno, expresado \$\bar{x} = b^w - 1 - x + 1\$, de lo que se infiere que el negativo de un número es su complemento más 1:
6.5. Complemento a dos
Se utiliza el método de los complementos para representar positivos y negativos.
6.6. Conversiones de base
Sea \$\vec{n}\$ un número en una base cualquiera \$b \ge 2\$, cuyos dígitos representados un acumulador de ancho \$w\$ corrresponden al vector \$(n_{w-1}, n_{w-2}, ..., n_0)\$. Al sumar el valor posicional de esos dígitos, se obtiene su equivalente valor en base \$10\$:
En complemento a 2 el bit más significativo además de su valor posicional, representa el signo. Al convertir el vector \$\vec{n}\$ de complemento a 2 a base 10, el primer dígito pesa su valor posicional acorde a su signo, es decir:
Para convertir un número \$n\$ en base \$10\$ a cualquier otra base sin signo \$b \ge 2\$, el resultado serán los residuos de múltiples divisiones por la base hasta que el cociente se anule. Este algoritmo puede expresarse construyendo el vector resultado \$\vec{r}\$ compuesto de los dígitos:
Para convertir un número \$n\$ en base \$10\$ con signo, es decir a complemento a \$b\$, donde la base destino \$b \ge 2\$, se hacen dos pasos. Primero, se convierte el valor absoluto \$|n|\$ a la base destino cuyo resultado intermedio sería el vector \$\vec{s}\$, usando la conversión sin signo de la Ecuación (4). Luego, si \$n\$ es negativo, el resultado final sería el negativo de \$\vec{s}\$, expresado como el complemento a la base según la Ecuación (1), es decir \$-\vec{s}=\bar{s} + 1\$:
6.7. Representaciones comunes
6.7.1. Representación octal
Tomar grupos de tres bits.
Actividad: permisos de Unix.
6.7.2. Representación hexadecimal
Tomar grupos de cuatro bits.
Hacer tabla decimal, binario, octal, y hexadecimal de los primeros 16 números.
Actividad: Visualizar un archivo binario (eg. xxd
) ojala con flotantes de doble precisión (usar txt2bin
).
Ejercicio: Hacer tabla de sumas hexadecimales de los primerso 16 números
7. Aritmética de precisión de punto flotante (IEEE-754)
La aritmética de precisión de punto flotante son aproximaciones finitas de los números reales de los seres humanos. El estándar IEEE-754 define varios formatos de punto flotante, expresados en la siguiente tabla. El hardware moderno normalmente implementa sólo punto flotante de precisión simple, doble, y cuádruple.
Precisión | Tamaño | Signo | Exponente | Mantisa | Exceso |
---|---|---|---|---|---|
Medio (half) |
16 bits |
1 bit |
5 bits |
10 bits |
31 |
Simple (single) |
32 bits |
1 bit |
8 bits |
23 bits |
127 |
Doble (double) |
64 bits |
1 bit |
11 bits |
52 bits |
1023 |
Cuádruple (quadruple) |
128 bits |
1 bit |
15 bits |
112 bits |
16383 |
Óctuple (octuple) |
256 bits |
1 bit |
19 bits |
236 bits |
262143 |
El primer bit siempre es el signo y no cumple ninguna otra función, por lo que punto flotante es signo-magnitud para la parte decimal. El exponente también puede ser negativo, pero no usa signo-magnitud ni complemento a dos, sino que se representa en notación de exceso (offset-binary o exponent bias). El exceso se suma al exponente real, lo que genera el exponente ajustado que se almacena en el valor flotante.
s exponent mantissa [1|10001101|10011001000000000000000]
7.1. Conversión real a flotante
Algoritmo para convertir de decimal (reales de los humanos) a IEEE 754:
-
Asignar el bit de signo.
-
Convertir a base 2 el número sin signo.
-
Normalizar y obtener el exponente.
-
Sumar el exceso (127 en 32 bits, 1023 en 64 bits, o 16383 en 128 bits) al exponente, sea en decimal o binario.
-
Copiar la mantisa normalizada sin el bit oculto.
7.2. Conversión flotante a real
Algoritmo para convertir de punto flotante a decimal:
-
Agregar el bit oculto y el punto decimal a la mantisa
-
Restar el exceso al exponente
-
Desnormalizar: correr la coma decimal hasta que el exponente se haga 0
-
Convertir a base 10 el número resultante
-
Aplicar el bit de signo
7.3. Valores flotantes especiales
8. Arquitectura de computadoras
Objetivo: diseñar un procesador (de ocho bits). Herramienta: LogiSim.
8.1. Circuitos digitales
Tabla de mapeo entre operadores lógicos, operadores aritméticos, y compuertas lógicas. Sus tablas de verdad.
Actividad: probar las compuertas lógicas en LogiSim.
8.2. Comparador
Un comparador (CMP
) es una función que recibe dos números a
y b
de igual cantidad de bits y produce tres salidas:
-
LT
(less-than), es una salida de 1 bit que se enciende sólo sia < b
, de lo contrario produce 0. -
EQ
(equals), es una salida de 1 bit que se enciende sólo sia = b
, es decir,a
yb
tienen todos sus bits iguales, de lo contrario produce 0. -
GT
(greater-than), es una salida de 1 bit que se enciende sólo sia > b
, de lo contrario produce 0.
8.2.1. Comparador sin signo
8.2.2. Comparador con signo
Un comparador con signo tiene la misma interfaz que su contraparte sin signo, con la diferencia de que los números a
y b
se deben interpretar en complemento a dos. Un número que inicie con el bit más significativo en 1, es negativo.
8.3. Sumador
Circuito que recibe dos números de igual cantidad de bits y produce otro número resultado de igual cantidad de bits. Produce además un bit de acarreo final que sirve para saber si hubo desborde (overflow) o no. Para permitir encadenar varios sumadores, recibe como entrada un acarreo que proviene de otro sumador.
8.4. Multiplexor (selector) (MUX)
Un multiplexor o selector (MUX
) es un circuito lógico (función) que recibe \$2^n\$ entradas y escoge/selecciona una de ellas que será copiada en la salida. Las entradas están numeradas desde 0 hasta \$2^n - 1\$. Para saber cuál de las entradas es la que será copiada en la salida, recibe la identificación de éste como otro número de \$n\$ bits. Por lo tanto, la cantidad total de entradas del multiplexor corresponde a \$2^n + n\$.
8.4.1. Multiplexor 2 a 1 (MUX 2:1)
8.4.2. Multiplexor 4 a 1 (MUX 4:1)
8.4.3. Multiplexor de n bits (MUX 2^n:1)
Multiplexor teórico completo de n bits.
8.5. Demultiplexor y decodificador
Un demultiplexor (DEMUX
) es un circuito lógico (función) que invierte la función del multiplexor. Recibe un número por entrada que será copiado a una de las \$2^n\$ salidas del circuito, las demás producirán ceros. Las salidas están numeradas desde 0 hasta \$2^n - 1\$. Para saber cuál de las salidas será la que copie la entrada, recibe la identificación de esta como otro número de \$n\$ bits. Por lo tanto, la cantidad total de entradas del demultiplexor corresponde a \$n + 1\$ mientras que las salidas a \$2^n\$.
Un decodificador (decoder, DEC
) es el mismo circuito que el demultiplexor con la diferencia de que no tiene un número por entrada que será copiado en una de las salidas. Sino que las salidas son siempre de un único bit y una de ellas estará encendida (1) y las demás apagadas (0). En adelante se usará más este circuito que el demultiplexor.
8.5.1. Decodificador 1 a 2 (DEC 1:2)
8.5.2. Decodificador de 1 a 4 (DEC 1:4)
8.5.3. Decodificador de n bits (DEC 1:2^n)
Decodificador teórico completo de n bits.
8.6. Memoria principal
Memoria es un arreglo de celdas (bytes) que almacenan datos o instrucciones. Toda celda está identificada por un entero sin signo, su dirección de memoria.
Ancho de la memoria (actualmente 8 bits). Se requieren varias celdas continuas para almacenar números más grandes de 16, 32, 64, y 128 bits.
Memoria principal vs memoria secundaria. Random Access Memory (RAM) vs Read-Only Memory (ROM).
Dirección vs valor. Prefijos en base 10 y base 2.
Registros de una memoria:
-
MAR Memory address register.
-
MDR Memory data register.
Operaciones de una memoria (algoritmos):
-
value = fetch(address)
MAR <- address Decode address in MAR Copy memory contents in that address to MDR
-
store(address, value)
Load address into MAR Load value into MDR Decode address in MAR Store contents of MDR into memory location
8.7. Máquinas de programa almacenado
-
Programa en entrada del dispositivo
-
Programa almacenado
Arquitectura de von Neumann
-
Instrucción: código de operación (operation code, op code) + parámetros (entre 0 y 3)
-
Conjunto de instrucciones (instruction set)
-
RISC (Reduced Instruction Set Computers)
-
CISC (Complex Instruction Set Computers)
-
Lenguaje máquina (machine language)
Tipos de instrucciones
-
Data transfer: copian bits de un lado para otro destruyendo el destino. Ej: LOAD, STORE.
-
Arithmetic/logic: suma, resta, multiplicación, división, tanto fija como flotante. Operadores lógicos: AND, OR, NOT, XOR, etc. Pueden tener de uno a tres parámetros, como:
-
Three-address instruction:
ADD X,Y,Z
que podría significarZ := X + Y
-
Two-address instruction:
ADD X,Y
que podría significarX := X + Y
oY := Y + X
a criterio de las personas diseñadoras. -
One-address instruction:
ADD X
que debe usar un registro, comoR := R + X
-
-
Compare: comparan dos números y encienden banderas (bits) llamadas condition codes de acuerdo al resultado. Ejemplo
COMPARE X,Y
podríaGT=1
yLT=0
siX=5
yY=3
. -
Branch: Alteran el flujo normal de ejecución (la secuencia). Por defecto, después de ejecutar la instrucción en la dirección
PC
de la memoria, la arquitectura de von Neumann ejecuta la instrucción que le sigue, que estaría en la direcciónPC + 1k
, dondek
es la cantidad de bits (ancho) de cada instrucción. Normalmente se salta en función de los códigos de condición (banderas) comoLT
yEQ
, por lo que usualmente están precedidas por una instrucción de comparación. Ej.:JUMP X
salta incondicionalmente a la direcciónX
mientras queJUMPNE X
salta a la instrucciónX
si el código de condiciónNE
(not-equal) es 1, de lo contrario, ejecuta la instrucción que le sigue como de costumbre. La instrucciónJUMPLE
salta si alguna de las banderasLE
oEQ
están encendidas.
Actividades:
-
Ejecutar el código ¿que produce en la salida? ¿qué hace el programa?
-
Desensamblar (disassemble) el código (Ingeniería inversa)
-
Decompilar a pseudocódigo
-
Optimizar el código
-
Generar código que lea repetidamente un número e imprima su antecesor hasta que haya un desborde
Ejercicios:
-
Programar la suma de dos números
-
Programar la suma de tres números
-
Encontrar el mayor de tres números (ej.: hipotenusa)
-
Leer repetidamente números de la entrada estándar hasta que se ingrese cero, e imprimir la suma
9. Máquinas modernas
9.1. Computación paralela
-
Von Neumann bottleneck
-
Niveles de caché
-
Pipelining
-
Fin de la ley de Moore
-
Núcleos de procesador
-
Hilos de ejecución
Cada estudiante emamble una PC a partir de sus componentes: caja, tarjeta madre, procesador, memoria, disco duro, monitor, teclado, y ratón. Algunos de ellos podrían estar defectuosos.
Instalarle dos sistemas operativos con arranque dual: Windows y Linux.
9.2. Computación distribuida
Crear una máquina virtual en la nube, ej.: Oracle Academic Cloud, con algún Linux.
Darle una IP pública. Instalarle un servidor web.
Crear un sitio web personal con su currículo y un portafolios para proyectos académicos (hechos durante la carrera) y personales.
10. Máquinas teóricas
La máquina de Turing es un modelo (versión simplificada de la realidad que abstrae/elimina detalles).
(state, symbol, next symbol, next state, direction)
La máquina siempre arranca en el primer bit no blanco en estado 1. Ejemplos:
-
Inversor de bits
-
Bit de paridad (odd parity bit): escribir 1 al final si la cantidad de bits 1 en el número es par para que quede siempre impar.
-
Incrementar números en notación unaria.
Tesis Church-Turing: Todo algoritmo ejecutable por una máquina convencional puede ser ejecutado por una máquina de Turing y viceversa.
Problemas no resolubles:
-
Saber si un programa se detiene o no independientemente de la entrada que se le dé (problema de la parada, halting problem).
-
Saber si un programa siempre va a producir un resultado específico para una entrada específica.
-
Saber si dos programas son equivalentes, es decir, producen la misma salida para todas las posibles entradas.
11. Ética
La ética y la moral ambas se refieren a distinguir las acciones humanas "buenas" de las "malas". La moral es dependiente de la cultura (ej.: tomar café, o comer carne de res). La ética es una rama de la filosofía y trata de transcender las idiosincracias de las culturas.
La tecnología ha modificado fuertemente la sociedad, tanto que se habla vivimos un revolución de la información posterior a la revolución industrial. La ética no tiene aún una respuesta para muchos de estos cambios que ocurren día a día y queda a responsabilidad de las personas profesionales en la disciplina obrar con corrección. Algunas preguntas a realizarse para ayudarse ante situaciones nuevas [Schn19]:
-
¿Quiénes son todos los involucrados en esta situación?
-
¿En qué se beneficia o afecta cada involucrado?
-
¿Cuáles son los deberes y responsabilidades de cada involucrado?
-
¿Hay situaciones similares que no involucren tecnología para las que se ha encontrado una solución? (analogía)
Ejemplos de situaciones que involucran tecnología:
-
Compartir archivos con derechos de copia. Ej: libros, música (vinilos, casetes, radio, CDDA, Napster, iTunes Store, Spotify) y películas (descarga directa, P2P).
-
Intervenir llamadas (teléfono, VoIP, WhatsApp) para facilitar la investigación policial, pero también facilita a los hackers su mal uso.
-
Ceder células para un estudio genómico (privacidad, anonimazación, lucro, medicamentos)