Computadoras, Programas y Ciencias de la Computación Marcelo Arroyo Departamento de Computación - FCEFQyN Universidad Nacional de Rı́o Cuarto Diciembre de 2015 Resumen Aunque parece ser un problema simple de resolver podrı́a ser tedioso y repetitivo. Imaginen que nos piden que escribamos los números pares menores que 1.000.000. Escribiendo un número por segundo (lo cual es bastante rápido) sin parar (y bastante cansador), demorarı́amos 11 dı́as y medio, lo que es casi imposible para un ser humano. Para eso es lo que sirven las máquinas y en especial las computadoras: Hacer trabajo laborioso, posiblemente repetitivo y tal vez más rápido que un ser humano. A pesar que las computadoras hoy forman parte de nuestra vida diaria, mucha gente no especialista generalmente no puede describir fácilmente cómo funcionan las computadoras, cómo se construyen ni cómo se programan, mucho menos cuál es el objeto de estudio de las ciencias de la computación o qué hace un profesional, docente o un investigador de esta disciplina. Este artı́culo intenta responder a esas preguntas de manera simple y concisa, en lenguaje no técnico pensado para quien sienta curiosidad por el amplio mundo de las ciencias de la compuVolviendo al problema dado, un matemático tación. podrı́a describirnos el problema con el siguiente conjunto: 1. Introducción pares ≡ {x | 0 < x < N ∧ resto(x, 2) = 0} (1) Para poder entender qué es todo esto, pensemos en el problema de tener que escribir (en un papel) los números enteros pares mayores que cero y menores a uno dado, digamos N . En principio parece ser una tarea simple, sólo requiere saber lo siguiente: lo que significa que pares es el conjunto de los números (llamados x) entre 0 y N cuyo resto de su división por 2 es cero (lo cual es la definición de par ). Sin embargo, La definición1 no dice cómo generarlos (calcularlos o computarlos). Es un ejemplo de una definición declarativa, 1. Saber qué es un número par. en particular es una definición de un conjunto 2. Dado un número par, calcular el siguiente por comprensión. Lo interesante es notar que un problema puede representarse o describirse par. matemáticamente. 3. Decidir si ya terminamos, es decir, determiUna forma de describir cómo computar los nar si ya hemos escrito todos los números números requeridos, podrı́a ser: los menores que N . 1 Supongamos que N es 8: Esta descripción es más formal, es decir menos ambigua, precisa y más general. Hemos usado una notación matemática para definir (inventar) variables (X0 , X1 , X2 , . . .) con nombres cuyos subı́ndices se corresponden con cada paso del proceso: Cada variable Xi se corresponde al número par i-ésimo generado (o computado). Esta descripción precisa de un proceso se conoce como un algoritmo. Un algoritmo describe una sucesión de pasos concretos (instrucciones) para llegar a la solución de un problema. 1. El primer número par es 2. 2. Como es menor que 8, lo escribimos. 3. El próximo número 4 = 2 + 2. 4. Como es menor que 8, lo escribimos. 5. El próximo número 6 = 4 + 2. 6. Como es menor que 8, lo escribimos. 3. Si Xi < N , entonces lo escribimos, sino terminamos. El hombre ha desarrollado teorı́as (ciencia) y tecnologı́a (artefactos) para hacer que estos procesos repetitivos, tediosos y hasta aburridos puedan ser realizados o ejecutados por máquinas. Algunas máquinas pueden ejecutar un conjunto predefinido de problemas. Algunas de ellas, ya vienen pre-programadas, como por ejemplo, una calculadora que puede ejecutar algoritmos para resolver algunos problemas aritméticos. Otras máquinas son programables, como una máquina de coser moderna o una máquina de mecanizado de control numérico (CNC, por sus siglas en inglés), que permite mecanizar (cortar, tornear, fresar, . . . ) materiales. Si bien algunas de estas máquinas pueden ser programables, no se las considera computadoras, ya que están diseñadas para resolver un cierto tipo de problemas (coser, mecanizar, etc). Una máquina más general, es decir que pueda ejecutar un conjunto de instrucciones que puedan servir para usos arbitrarios, es lo que conocemos como una computadora. La computadora es la máquina más versátil desarrollada por la humanidad. 4. Calcular el próximo número par: Xi+1 = Xi + 2. 2. 7. El próximo número 8 = 6 + 2. 8. Como no es menor que 8, no lo escribimos y el proceso termina. Hay que notar que no hemos usado la definición de resto, usada en la definición matemática del problema, sino que usamos un resultado de un teorema de la aritmética que nos asegura que dado un número par, si le sumamos dos, el resultado es el siguiente par. Sin embargo, ésta descripción es parcial, es decir, sólo sirve hasta N = 8. ¿Cómo podrı́amos especificar un proceso más general, es decir, para un N arbitrario? Para automatizar el proceso1 , la descripción de generación de los números requiere que sea precisa y completa. Hagamos un mejor intento: 1. El primer número par es 2. Llamémoslo X0 . 2. Llamemos Xi al último número obtenido. 5. Volver al paso 2. Computadoras y programas Una computadora moderna es una máquina Es decir, ejecutar una serie de acciones sin la necesi- que tiene al menos los siguientes componentes (hardware) tal como se muestra en la figura 1): dad de pensar, algo que podrı́a hacer una máquina. 1 2 Memoria: Un número fijo de celdas que pueden almacenar números de una cierta cantidad de cifras fija. Unidad central de procesamiento o CPU: se encarga de ejecutar las instrucciones de un programa almacenado en la memoria. Dispositivos de entrada-salida (teclado, pantalla, sensores, etc) que le permite interactuar con el mundo exterior. Figura 2: Sumador decimal mecánico. Memoria 0 1 2 Un dispositivo que requiera menos estados es mas sencillo de construir. Este es el motivo por el cual las computadoras actuales usan el sistema binario, el cual consiste en el uso de sólo dos cifras: 0 y 1. En este sistema, un interruptor de luz es una memoria (mecánica) ya que recuerda (por su posición) si la luz está encendida o apagada. Las computadoras modernas están construidas usando electrónica digital (representando la información con ceros y unos (o dos niveles de corriente). Un circuito digital tiene relación directa con una parte de la lógica y del álgebra. ... Pantalla CPU ... byte Teclado 01011001 Figura 1: Esquema de una computadora. Analicemos cada uno de esos componentes. La memoria es un dispositivo que permite almacenar (recordar ) valores numéricos. Podemos ver a la memoria como una sucesión de celdas que pueden almacenar un número de una cierta cantidad fija de cifras. En principio se desarrollaron dispositivos que almacenaban dı́gitos, es decir cifras en el sistema numérico decimal (0..9), porque ası́ estamos acostrumbrados los humanos. Esto requiere que el dispositivo tenga que tener 10 estados posibles (0..9) para poder representar cada cifra. Esto puede conseguirse, por ejemplo, con un engranaje o rueda numerada cuya posición determine su estado (como en el caso de las viejas máquinas mecánicas de sumar). Figura 3: Sumador binario (con bolitas). 3 En las figuras 2 y 3 se muestra la diferencia de complejidad de un mecanismo sumador en decimal versus uno en binario. En el mecanismo decimal, es necesario un complejo mecanismo de relojerı́a para mover los engranajes, mientras que en binario, cada cifra se representa por la posición del balancı́n: si está inclinado a la derecha (por la presión de la bolita) es un 1, si está inclinado a la izquierda es un cero[1]. Figura 4: Circuito integrado Un componente puede ser un circuito que representa un bit (elemento básico de memoria), Cada cifra binaria se conoce como bit (de o una función lógica, es decir que dada una enbinary digit). trada genera una salida, como el esquema del Cada celda de la memoria contiene un númesumador electrónico de dos bits mostrado en la ro fijo de bits. Una celda con 8 bits se denomifigura 5. na byte. Un byte puede representar 256 valores (0 al 255). Cualquier estudiante de computación seguramente se familiarizará con el sistema binario. La capacidad de una memoria es su cantidad de celdas (bytes). Las computadoras actuales tienen tantas celdas de memoria que usamos múltiplos. Por ejemplo, 1024 bytes forman un kilobyte (kb), 1024 kb forman un megabyte Figura 5: Circuito de un sumador de dos bits. (mb), 1024 mb forman un gigabyte (gb), 1024 gb forman 1 terabyte (tb). La combinación de circuitos permite implementar funciones muy complejas. La En principio muchos de estos mecanismos fuecombinación de muchos componentes o subsisron pasando de dispositivos mecánicos (madera y metal), a electro-mecánicos (interruptores, temas permiten que se configure una máquina válvulas, tubos de rayos catódicos) hasta llegar que se comporte como una computadora, es finalmente a los dispositivos electrónicos actua- decir, sepa ejecutar un conjunto predefinido de les. Los avances de la tecnologı́a en electrónica instrucciones. y la fı́sica aplicada permitieron el desarrollo de dispositivos pequeñı́simos, de muy bajo consumo y que pueden operar a gran velocidad. Actualmente, un circuito electrónico integrado (CI) moderno puede contener componentes electrónicos miniaturizados de un tamaño de unos pocos nanómetros (ej: 50nm). Esto permite que un CI[2] contenga muchı́simos componentes interconectados en una pastilla de silicio de unos 10mm de lado (ver figura 4. No debemos confundir la memoria (conocida como Random Access Memory o RAM ) con los dispositivos de almacenamiento como los discos (o un pendrive)2 . Estos dispositivos, si bien son memorias, ya que almacenan datos, no son accedidos directamente por la CPU para acceder o modificar su contenido, sino que antes deberán 2 Que son memorias que funcionan básicamente como los discos, excepto que no tienen partes móviles. 4 cargarse en la RAM para luego de allı́ transferirse a o desde los dispositivos. La RAM es volátil, es decir que su contenido se borra cuando la computadora se apaga. Los dispositivos de almacenamiento (que son memorias permanentes, es decir su contenido no se pierde al apagarse), son necesarios para preservar la información de un sistema, generalmente en forma de archivos. Su capacidad de almacenamiento se mide también en bytes y en general tienen mucha mayor capacidad que la RAM. por ejemplo, teclados, pantallas, parlantes, dispositivos de almacenamiento y comunicaciones, etc. A modo de ejemplo, cuando pulsamos una tecla en nuestra computadora, un número asociado a la tecla se almacena en una celda de memoria determinada. De ésta forma un programa puede acceder a esa celda para saber qué tecla pulsó el usuario. De la misma manera, un display o pantalla, está conectada a un rango determinado de celdas de memoria. Para mostrar algo en la pantalla, un programa deberá escribir datos (números) en algunas de esas celdas. La CPU es un circuito (bastante complejo, por cierto, con millones de componentes electrónicos básicos3 ) diseñado para ejecutar instrucciones almacenadas en la memoria. En realidad podemos decir que la CPU es una máquina que tiene el siguiente algoritmo implementado en hardware: Los dispositivos de entrada-salida pueden ser muy variados, como un foco de luz o un motor eléctrico. Un programa podrá controlar esos dispositivos, por ejemplo, encender o apagar la luz o el motor (y éste a su vez podrá mover un elemento de un brazo de un robot o accionar un ventilador). 1. Cargar próxima instrucción 2. Decodificarla: decidir qué instrucción es 3. Cargar datos requeridos por la instrucción 4. Ejecutar la instrucción Un dispositivo de entrada podrı́a inyectar un valor a una celda de memoria, como el el caso de un sensor de movimiento (giróscopo) de un teléfono inteligente. Un programa podrı́a monitorear los cambios de valores de esa celda para actuar en consecuencia, como por ejemplo, reacomodando la información de las celdas de memoria conectadas a la pantalla para lograr el efecto de giro de la pantalla. 5. Almacenar el resultado 6. volver al paso 1 Una CPU moderna puede ejecutar millones de instrucciones por segundo y su velocidad se mide en cantidad de ciclos por segundo (hertz). Cada ciclo podrı́a corresponder a un paso del algoritmo anterior. Por último, una computadora deberı́a poder interactuar con el ambiente en que está inmersa, por lo que generalmente se le conectan otros dispositivos a la CPU y/o a la determinadas celdas de memoria que permiten ingresar/extraer datos a/de la CPU o a/de la memoria, como Esto muestra que una computadora puede interactuar con su ambiente exterior por medio del uso de sensores (teclado, giróscopos, etc) y actuar en consecuencia activando actuadores (electroimanes, motores, luces, etc) lo que hace que 3 Los componentes electrónicos básicos son los transis- su aplicación sólo quede librada a nuestra imaginación. tores, resistencias, diodos, capacitores, etc. 5 2.1. Programas y datos El hardware de display asocia un bit de la memoria de pantalla con un pixel. Si el bit tiene valor 0 pinta el pixel de blanco y si es un 1 lo pinta de negro. Entonces si queremos hacer el dibujo de figura 6, hay que escribir en las celdas correspondientes de la memoria los siguientes valores (de arriba hacia abajo): 00010000 00101000 01111100 10000010 00000000 Si la memoria de una computadora almacena sólo números ¿Cómo podemos representar texto, imágenes, sonido, programas, etc? La respuesta rápida es que todo se codifica o representa como números. Por ejemplo, este documento fue escrito con un editor de textos (un programa que permite escribir texto y almacenarlo en un archivo). Las letras (denominados caracteres) se codifican dándole a cada una un número. Por ejemplo, en este texto cada letra A (mayúscula) se representa (en mi computadora) con el número 65 (que es el correspondiente en el código ASCII, un código ahora internacionalizado). Por lo tanto el siguiente texto: Soy una computadora se representa con la siguiente secuencia de números (en decimal): 83 111 121 32 117 110 97 32 99 111 109 112 117 116 97 100 111 114 97 De manera similar se puede codificar (representar) sonido. Imaginemos que se toman muestras a ciertos intervalos de tiempo (ej: cada 1 microsegundo) de desde un micrófono transformados en un valor numérico (digitalizados) en una escala (ej: del 0. . . 100), donde el 0 es silencio, siguiendo por tonos graves y el 100 es el más agudo). La secuencia de números representa los tonos del sonido y podrı́an ser almacenados en la memoria (y/o archivado) Debemos notar que el espacio también es un para luego ser reproducidos. La cantidad de muestras que se toman en una unidad de tiempo caracter y se codifica (¿cuál es?). (ej: 1 segundo) es la frecuencia de muestreo Bueno, ya tenemos una idea de cómo se repre- (sampling) y se mide en herthz. senta un texto en una computadora, pero cómo Un video es simplemente una secuencia de se representan los gráficos, sonidos y pelı́culas o imágenes mostradas rápidamente (ej: unas 30 animaciones? veces por segundo) en una pantalla tal como Imaginemos una porción de una pantalla como una grilla (matriz) de puntos (picture ele- lo hace el cine. Eso produce en el cerebro una ments o pı́xels) como en la figura 6 en la que se ilusión de movimiento. dibuja la letra A. Hasta aquı́ hemos visto cómo se pueden representar cosas como texto, imágenes y sonido. Por supuesto que quedan muchas cosas por resolver, como por ejemplo, la representación de números negativos4 y reales, pero quedan más allá del alcance de este artı́culo. Ahora es tiempo de ver cómo se representa un Figura 6: Display de la letra A 4 Una posibilidad es usar el bit de más a la izquierda para el signo (0:positivo, 1:negativo). 6 programa. Un programa es una secuencia de instrucciones. Cada instrucción es una operación que puede ser ejecutada por la CPU. Cada tipo de CPU puede ejecutar un conjunto de operaciones (instrucciones) pre-establecidas en su diseño. Cada instrucción también se codifica en números que la CPU sabrá interpretar (decodificar ) y ejecutar. celda 101 en la instrucción sumar ), se almacenarán en celdas siguientes al código de operación. Cada tipo de CPU define su conjunto de instrucciones y cómo se representan en la memoria. La CPU puede ejecutar un programa si éste reside en la memoria. ¿Cómo se carga un programa en la memoria y se da comienzo a su ejecución?. Bien, en las computadoras primitivas, se hacı́a a mano, manipulando interruptores, que permitı́an cargar números en las celdas de memoria. Como esto era algo muy tedioso y propenso a cometer errores, luego se inventaron formas de representar un programa (secuencia de números) en cintas o tarjetas de papel perforadas. Estas cintas o tarjetas se leı́an por un dispositivo que reconocı́a los números (correspondientes a instrucciones y datos) y los almacenaban en la memoria. Luego el operador de la computadora6 oprimı́a algún botón y la CPU comenzaba su ejecución comenzando generalmente por la instrucción que estaba en la primera celda (dirección cero) de memoria. A modo de ejemplo (en una computadora hipotética) el programa de la sección 1 podrı́a hacerse con el siguiente programa almacenado a partir del comienzo de la memoria y asume que N (el valor tope de los números a escribir) está en la celda cuya dirección de memoria es 100. Los números pares calculados van almacenándose (de a uno) en la celda 200. 0: 1: 2: 3: 4: 5: 6: mover valor 2 a la celda 101 restar valores de la celdas 100 y 101 si resultado <= 2, ir al paso 6 mover valor de la celda 101 a la 200 sumar 2 al valor de la celda 101 ir a al paso 1 parar Si la celda 200 estarı́a conectada a una pantalla (display), se podrı́an ir visualizando los valores pares calculados.5 Se puede apreciar que hay diferentes tipos de instrucciones, como almacenar un valor (instrucción 0) en una celda, calcular nuevos valores (instrucción 4), tomar una decisión (instrucción 2), saltos (instrucción 5) y otras. Posteriormente, las cintas y las tarjetas fueron desplazados por discos magnéticos y últimamente por memorias de estado sólido (pendrive) en los que se almacenan los programas y datos en forma de archivos, los cuales pueden organizarse en carpetas. ¿Qué hace que un archivo pueda cargarse en la memoria? Pues bien, otro programa. ¿Y quién carga ese otro programa? Parece ser un problema sin fin (como el del huevo y la gallina). El problema se resuelve poniendo una memoria no volátil (no se borra cuando el equipo se apaga) que contiene un programa inicial. La instrucción mover se podrı́a representar con el número 1, la instrucción sumar con un 2, la instrucción ir al paso con un 3, etc. Estos números se conocen como códigos de operación. Los operandos (que también son números) de las instrucciones (como el 2 y la dirección de la 5 Aunque en una computadora moderna se harı́a tan rápido que seguramente sólo visualizarı́amos el último. 6 7 Un técnico que ya ha desaparecido. Esta memoria (conocida como READ ONLY MEMORY o ROM) es de sólo lectura ya que su contenido está grabado de fábrica. Las celdas de esa memoria generalmente reemplazan a las primeras (o últimas) celdas de la RAM. sección anterior se podrı́a escribir en un lenguaje de programación de alto nivel (hipotético) como: par = 2 mientras par < N: mostrar par // sumamos dos a la variable par En la ROM hay un programa el cual se encarpar = par + 2 ga de cargar un segundo programa almacenado en una parte pre-definida en algún dispositivo de almacenamiento (ej: un disco). Este proceso se conoce como boot o arranque 7 . Este último programa cargado se conoce como núcleo de un sistema operativo (kernel) y contiene código que sabe interactuar con los dispositivos de entrada-salida y sabe manejar el sistema de archivos (en discos) y ası́ puede ejecutar otros programas. Un sistema operativo, además, contiene otros programas que nos permite interactuar con el sistema, ya sea por medio de comandos o una interfaz gráfica con ventanas y permite que busquemos archivos de datos o ejecutar otros programas. Ejemplos de sistemas operativos son GNU-Linux, MS-Windows y MAC OS-X. En el mundo de los teléfonos móviles (o inteligentes) y tabletas es muy popular Android, que está basado en GNU-Linux. Bastante mas legible, no? Si analizamos un poco el programa, vemos que a las celdas de memoria ahora les dimos un nombre (identificador). Por ejemplo, tenemos dos celdas, par y N. Ahora no tenemos que lidiar con direcciones de celdas. Además usamos instrucciones (que ahora llamaremos sentencias) al estilo más cercano al lenguaje natural y hasta podemos escribir comentarios para documentar el programa (todo lo que comienza con //. Un lenguaje de programación define un conjunto (limitado) de sentencias. Ahora, este último programa no está representado como una secuencia de instrucciones que entienda la CPU. Entonces, ¿Cómo podemos ejecutar este programa en una computadora? El truco consiste en usar otro programa que traduzca el programa de alto nivel a un programa en lenguaje de máquina. Este programa 3. Lenguajes de programación traductor se denomina compilador o intérprete9 . El programa traducido, podrá luego cargarse en El programa mostrado en la sección anterior la memoria de la computadora y ejecutarse. es bastante difı́cil de entender porque es de muy bajo nivel 8 . Un programa de ese nivel se Es decir que un compilador es un traductor: dice que es un programa en lenguaje de máquina. Toma un programa (texto o secuencia de caracteres) como entrada y genera otro programa (gePara que los programadores puedan ser mas productivos y los programas sean más legibles neralmente en lenguaje de máquina) como salie independientes del tipo de cada CPU, se han da. Para pensar: desarrollado lenguajes de programación de alto nivel. A modo de ejemplo, el programa de la 1. En una computadora sin ningún software, 7 Es similar al sistema de arranque del motor de un automóvil, el cual es arrancado por otro (eléctrico). 8 Es decir, muy cercano a la computadora y dependerá de su diseño y conjunto de instrucciones. 9 La diferencia es que el primero traduce en otro archivo, mientras que el segundo carga el código fuente y lo ejecuta (interpreta) directamente. 8 ¿En qué lenguaje podrá escribirse el compi- los detalles de interacción con el hardware y de operaciones comunes como acceder al sistema lador? de archivos, cargar programas en la memoria 2. ¿Podrı́amos escribir un compilador en un y ejecutarlos, entre otras cosas. Un lenguaje de lenguaje A disponible en una computadora programación define abstracciones (sentencias) para que genere lenguaje de máquina para lingüı́sticas sobre las instrucciones de una CPU, una computadora B? y la memoria (ya no hablamos de direcciones de 3. Una vez que tengamos un compilador para memoria, sino de identificadores). Un programa un lenguaje A: ¿En qué lenguaje podrı́amos de usuario (aplicación) usa todos los niveles de escribir un compilador para un nuevo len- abstracción anteriores, tal como se muestra en la figura 7. guaje B? 4. ¿Podrı́amos reescribir el compilador A en el lenguaje A mismo? Progs. de usuario (juegos, . . . ) Progs de sistema La idea que tengamos una jerarquı́a de lenguajes en computación es porque deseamos ocultar Sistema operativo los detalles y concentrarnos en resolver problemas concretos sin tener que lidiar con los detaHardware lles especı́ficos de cada tipo de computadora. Si disponemos de un compilador para un lenguaje de programación para diferentes tipos de Figura 7: Sistema de computación computadoras, podemos escribir un programa y luego compilarlo para la computadora que sea, lo que nos independiza del hardware y del Actualmente se conocen muchı́simos lensistema operativo en donde tenga que ejecutarse. guajes de programación (más de 1500)[3], por lo cual es imposible enseñar programación Los programas básicos para poder escribir basado en la enseñanza de lenguajes. En las otros programas como lo son los editores de carreras modernas de computación se enseñan texto, compiladores e intérpretes, se denominan los conceptos y fundamentos de los lenguajes programas de sistema ya que constituyen las y sus clasificaciones, ya que hay lenguajes que herramientas fundamentales para la progra- ofrecen estilos y técnicas muy diferentes de mación y que generalmente son utilizados programación. Algunos de los lenguajes actuapor especialistas en la disciplina y no por los les mas usados son C, C++, Java, Javascript, usuarios finales. Python, Perl, Ruby, Pascal, Basic, Fortran y otros. El proceso de ocultar los detalles para concentrarse en los aspectos fundamentales de un La mayorı́a de los lenguajes están basados en problema se denomina abstracción y es una de un formato textual, aunque otros están basalas técnicas fundamentales aplicada en las cien- dos en componentes gráficos, como por ejemplo cias de la computación. Scratch[5] que está pensado para enseñar proUn sistema de computación (hardware + soft- gramación a los niños. En la figura 8 se muestran ware) puede verse como una jerarquı́a de abs- los bloques (sentencias) del lenguaje gráfico. tracciones. El sistema operativo nos abstrae de El concepto de lenguaje es fundamental en las 9 Figura 8: Bloques de Scratch. ciencias de la computación. Hay lenguajes de programación, pero también hay lenguajes de descripción de datos y documentos (por ejemplo HTML, que es la notación usada en las páginas web), como ası́ también existen lenguajes de especificación de sistemas, manipulación y consultas de grandes bases de datos, y otros. Una de las principales áreas de investigación es el desarrollo de lenguajes para tratar de resolver problemas especı́ficos, por lo cual el área de lenguajes es una de las áreas mas activas de desarrollo. 4. La computación como ciencia ¿Cuál es el objeto de estudio de la ciencia computación? En principio, podrı́amos decir que la computación como ciencia trata del estudio sobre cómo automatizar procesos, qué se puede automatizar y a qué costo (cuántos pasos y memoria requiere un problema dado) y técnicas y métodos de describir computaciones. Además estudia los tipos de dispositivos de cómputo desde el punto de vista teórico que se conocen como modelos de computación. Se considera al matemático Alan Turing10 como el padre de la ciencia de la computación[4], ya que fue el primero en estudiar qué es computable y en 1936 propuso un modelo teórico de computadora: La máquina de Turing. Esto deja claro que la ciencia de la computación moderna se originó desde la matemática. Con respecto a una de las preguntas fundamentales sobre ¿qué se puede computar?, se ha determinado (demostrado matemáticamente) la familia (o tipo) de problemas que pueden ser resueltos por un algoritmo. Un ejemplo de un problema que no puede resolverse algorı́tmicamente para entradas arbitrarias, es el siguiente:11 Dadas dos listas de palabras como por ejemplo, < α1 , . . . , αn > y < β1 , . . . , βn >, encontrar un orden tal que αi , . . . , αj = βi , . . . , βj . Ejemplo: Sean α =< a, ab, bba > y β =< baa, aa, bb >, una solución es < 3, 2, 3, 1 >, ya que bba ab bba a = bb aa bb baa> (si omitimos los espacios). Este es un caso en que existe una solución, pero para las listas α =< ab, bba > y β =< aa, bb > no existe. El problema es que no existe un programa (y se puede demostrar matemáticamente) que pueda decidir si hay una solución o no, es decir que termine, dadas dos listas arbitrarias. Hay problemas, para los cuales exista un algoritmo que lo resuelve, pero no quiere decir que sea aplicable en la práctica, ya que tal vez necesitarı́a una cantidad de pasos muy grande (que a la CPU le llevarı́a años ejecutar) o una cantidad de memoria que excede la tecnologı́a actual. Por ejemplo, escribir un programa que juegue al ajedrez es simple, en principio. Calcular la próxima movida es elegir la mejor opción de 10 El protagonista de la pelı́cula Enigma. Conocido como el problema de correspondencia de Post. 10 11 todos los movimientos posibles desde la configuración actual del tablero hasta llegar a una configuración ganadora. El problema es que el programa deberı́a explorar una cantidad muy grande de opciones ya que hay aproximadamente 2120 configuraciones posibles (más que el número estimado de partı́culas en el universo). Es obvio que un programa ası́ no serı́a útil, aunque se puede escribir. Por eso es importante poder analizar la complejidad computacional de un problema para poder saber cómo buscar una solución práctica o aproximada. Un programa moderno de ajedrez usa reglas (basadas en estrategias conocidas) para elegir el próximo movimiento basándose en el análisis de sólo algunos movimientos, no todos los posibles. Esto es, el programa intenta simular lo que hace un buen jugador de ajedrez humano. vehı́culos (autos, aviones, etc) y cada vez más tenemos que interactuar como usuarios. El desarrollo de programas es análogo a la resolución de cualquier problema. Es por eso que se utilizan técnicas basadas en las matemáticas y se usan principios de ingenierı́a, principalmente para diseñar, analizar e implementar sistemas de software grandes y complejos (área conocida como ingenierı́a de software). Las matemáticas son imprescindibles para las definiciones precisas de modelos de programas y para poder analizarlos. Además, muchos problemas a resolver por computadora requieren la programación de cálculos complejos. Algunos problemas requieren un modelado complejo de sus datos. Por ejemplo: ¿Cómo se puede representar en la memoria un tablero de ajedrez o un mapa carretero? Esto hace que se estudien y apliquen ciertas estructuras de datos (forma de representar 5. Conclusiones cosas en la memoria) y que tienen relación con La ciencia de la computación constituye una el álgebra y los algoritmos aplicables a esas disciplina muy amplia que incluye principalmen- representaciones. te el estudio de las siguientes áreas: Otra área muy importante es el de lenguaModelos de computación (teorı́a) jes de programación, la cual la ciencia de la computación ha tomado prestado de otras Lenguajes de programación disciplinas como la lingüı́stica, principalmente los aportes de Noam Chomsky que permitió Datos y algoritmos que en computación se relacione la idea de un lenguaje como equivalente a un problema y que Arquitecturas de computadoras dió origen a una teorı́a de lenguajes. Ingenierı́a de software El estudio y ejercicio de esta disciplina es muy interesante, desafiante e intrigante. Programar es una tarea creativa, que requiere disciplina Otros (juegos, robótica, . . . ) y conocimientos de conceptos de otras áreas, En una carrera de grado de computación, ca- principalmente la matemática. da curso aborda problemas en algunas de estas áreas. Pensar sobre qué es computable y complejidad Actualmente la computación está en todos la- computacional desafı́a a la intuición y nos lleva dos, en nuestro hogar (computadoras, tv inteli- a los fundamentos de la matemática (infinitos, y gente), con nosotros (teléfonos inteligentes), en problemas aún no resueltos). Computación cientı́fica 11 Actualmente, las aplicaciones pueden ser tan variadas, como desde un sistema de control de un satélite, o un sistema de control de encendido o de frenado de un auto hasta sistemas médicos, simulación de procesos atmosféricos (usados para predecir el clima), juegos, etc, que es indispensable que un especialista en computación tenga que trabajar en equipos inter-disciplinarios, es decir con ingenieros de otras disciplinas, médicos, biólogos, psicólogos, etc. El desarrollo de software profesional requiere el desarrollo de proyectos complejos y es equivalente al proceso de desarrollo de cualquier otra área. Si bien el desarrollo de un programa a veces puede ser una tarea ardua, es muy reconfortante el observar y utilizar el producto obtenido. La gran amplitud de sus aplicaciones hace que la industria de software en todo el mundo, y por supuesto, también la Argentina, requiera de técnicos y profesionales altamente capacitados e innovadores. Actualmente, la demanda de la industria supera ampliamente a los profesionales generados en las universidades y otras instituciones de formación técnica. Referencias [1] Matthias Wandel. Sumador binario con bolitas. http://woodgears.ca/marbleadd/ index.html Video: https://www.youtube.com/ watch?v=GcDshWmhF4A [2] Intel 8742 153056995 by Ioan Sameli - http://www.flickr.com/photos/ biwook/153056995/. Licensed under CC BY-SA 2.0 via Commons - https: //commons.wikimedia.org/wiki/File: 12 Intel_8742_153056995.jpg#/media/ File:Intel_8742_153056995.jpg [3] Wikipedia:Lista de lenguajes de programación.https://en.wikipedia.org/wiki/ List_of_programming_languages [4] Alan Turing. https://es.wikipedia. org/wiki/Alan_Turing [5] Scratch. https://scratch.mit.edu/