Computadoras, Programas y Ciencias de la Computación

Anuncio
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/
Descargar