Todas las computadoras tienen una estructura en común aunque hayan
sido diseñadas con fines muy diferentes. Lo que puede cambiar entre
distintas computadora es la calidad y la tecnología de los componentes.
Los tiempos de respuesta de un sistema informático pueden ser más
rápidos con una mejor calidad de la electrónica, una mayor sofisticación
de los circuitos o la utilización de algoritmos más eficientes que
realicen la tarea a resolver en un tiempo menor. Por ejemplo, una
Playstation, un teléfono celular smartphone, una notebook, un televisor
(tipo smart-tv), una supercomputadora (que cuesta millones de dólares)
todos estos mecanismos son computadoras que comparten una estructura
común, aunque se usen para fines completamente diferentes. Normalmente
estamos más acostumbrados a las PC nombre que viene del inglés Personal
Computer, es decir computadora personal. Esta denominación las
diferenció en su aparición de los grandes sistemas que sólo se
encontraban en los centros de cómputos de universidades o
empresas.
Lo primero que tenemos que diferenciar son las dos
estructuras constructivas principales que hacen funcionar una
computadora. Estas son el HARDWARE y el SOFTWARE
Veremos ahora lo que son cada una de estas estructuras:
Hardware: Si lo traducimos del inglés así como palabra
de uso común esta sería ferretería (si, ese lugar al que iríamos a
comprar tornillos o tuercas) y no es una mala traducción. Hardware es
toda la estructura de circuitos electrónicos de la computadora,
incluyendo soporte y ventilación. Dicho de otro modo, es lo que podemos
tocar en una de estás máquinas, es tangible, está ahí. Los que diseñan y
construyen hardware suelen estudiar en las facultades o departamentos de
ingeniería.
Software: El software es algo intangible pero real.
Engloba a las instrucciones que se le dan a una computadora para que
ejecute, y de esta manera, que produzca los resultados que se desea.
Sería el equivalente a los algoritmos que se estudian en álgebra, pero
ahora implementados en el sistema de computación. Ustedes ya conocen
diferentes tipos de Software, por ejemplo, los Sistemas Operativos (SO):
En un celular pueden ser el Android o el IOS, o en una PC podrían ser
Windows (realizado por Microsoft), MacOSX (programado por Apple) o el
que usaremos en la práctica: el LINUX. Este último fue desarrollado por
voluntarios de Universidades y de empresas por todo el planeta. Sobre
estos SO corren los programas cuyas órdenes fueron escritas en lenguajes
de computación. En esta cursada vamos a darles los elementos necesarios
para desarrollar software de cálculo matemático, de visualización y
análisis de datos, utilizando dos lenguajes el FORTRAN y el
PYTHON.
Los que trabajan en desarrollo de Software estudian en facultades de
informática o sistemas.
La CPU (iniciales en inglés de Central Processing
Unit o Unidad de Procesamiento Central) es el componente de la
computadora que realmente realiza el trabajo. En la actualidad es un
chip (o un conjunto de varios chips dentro del mismo encapsulamiento y
que interactúan en conjunto). Este circuito electrónico está construido
con el equivalente a millones de transistores y es una de las partes más
caras de la computadora. Cada elemento electrónico tiene tamaños de 5 a
14 nm (nm es un nanómetro cuyo tamaño es \(10^{-9}\) metros). En las computadoras
actuales este chip se instala sobre la placa madre (Motherboard). Las
CPUs no trabajan recibiendo órdenes en algo que se parezca a lenguaje
humano, las órdenes están en lenguaje binario. Las CPUs realizan las
operaciones que se indican en los programas y los cálculos matemáticos.
No poseen grandes cantidades de memoria.
En computadoras de uso profesional puede haber varias CPUs en la placa
madre y estas pueden realizar trabajo en paralelo. En esta situación
cada CPU realiza parte del trabajo al mismo tiempo, es como si se
construyera una casa y cada albañil construye una parte o un cuarto
diferente de esta. Entonces más albañiles permitirían construir la casa
en menos tiempo. Esto suele ser muy útil en los casos de cálculos
complejos donde se pueden hacer varias operaciones matemáticas a la vez.
Por lo cual, el trabajo se resuelve más rápido.
Muchas CPUs tienen estructuras para hacer paralelismo interno. A estas
estructuras que trabajan independientemente se las llama CORES, pudiendo
tener una CPU de una PC no muy sofisticada entre 4 y 8 cores como algo
estándar, pero hay CPUs que tienen más de 48 CORES. Además, en cada CORE
suele haber dos unidades de procesamiento matemático que se los denomina
Threads.
La CPU se relaciona con los demás componentes de la computadora en forma
sincrónica, es decir que todos los componentes
electrónicos reciben pulsos para realizar las operaciones de
transferencia de datos al mismo tiempo. Esto significa que cada
computadora tiene un reloj que crea esos pulsos. Recuerden que la
frecuencia como medida es la inversa del tiempo, es \(1/t\) y se mide en hertz. Un hertz es \([hertz] = [1/seg]\), por lo tanto, con más
Hertz (más pulsos por segundo), más rápida será la computadora para
correr un programa al funcionar todos sus elementos electrónicos a mayor
velocidad. Los valores actuales de los relojes que sincronizan las CPUs
están en los Gigahertz, es decir mil millones de pulsos por
segundo.
Para una explicación alternativa vea la figura 1.1. Un
problema asociado es que al aumentar la frecuencia del reloj aumenta
mucho la cantidad de calor generado, y por consiguiente, es un desafío
muy importante de las arquitecturas de las CPUs cómo eliminar o disipar
este aumento de temperatura. Por eso, se trabaja mucho en el diseño para
evitar generar calor por un lado y su disipación por el otro.
Otro aspecto del problema del calor está en el desarrollo de las CPUs
para notebooks y celulares, ya que si se desperdicia energía en generar
calor, la energía almacenada en la batería de estos sistemas se agotará
muy rápido. En este tipo de computadoras se prefieren entonces CPUs más
lentas para que la batería dure mucho más.
También existen las GPU (Graphics Processing Unit) que
usan para gráficas, tanto profesionales como para los juegos y son
apreciadas por los gamers. Pero tienen la competencia de las
NPU (Neural Processing Unit), que son circuitos
diseñados para acelerar los cálculos de los programas de inteligencia
artificial. Muchas cpus actualmente tiene dentro de ellas circuitos de
GPU y NPU. Las unidades de medida de las NPU son los TOPS, que indican
los Trillones de OPeraciones por Segundo que pueden realizar.
Veamos la siguiente publicidad de las empresas INTEL y AMD (figuras
1.2 y 1.3) que son los
mayores fabricantes de CPUs para las PCs (PC viene de Personal Computer,
es decir Computadora Personal).
La memoria RAM, cuyo nombre proviene del inglés Random Access Memory
(memoria de acceso aleatorio), es la memoria en donde se guardan los
programas que están corriendo en la computadora y sus datos. Esta
memoria funciona siempre que la computadora esté encendida. Un corte de
corriente haría que los datos que están guardados en esta memoria se
pierdan. La CPU se conecta con la memoria con un sistema de cables que
se los denomina Bus de datos.
Existen en general dos tipos de esta memoria, la
Dinámica y la Estática. La primera es
de muy bajo costo de fabricación y con capacidad de ser accedida en
algunas decenas de nanosegundos (recordar que un nanosegundo es \([ns]=10^{-9}\) de segundo), claramente en
un tiempo fuera de la escala de la percepción humana. Esta memoria tiene
la desventaja que necesita ser recargada de energía en períodos cortos
de tiempo, y entonces, la computadora pierde tiempo en esta tarea. Por
otro lado, la memoria Estática es mucho más rápida (del
orden de algunos ns) y no tiene que ser recargada, pero su precio es
mucho más alto y encarece a la computadora.
Para que las computadoras funcionen más rápido y su costo de fabricación
no sea muy alto, se usan ambas memorias en combinación. De esta forma se
usa memoria dinámica en grandes cantidades (que es muy barata), pero en
el camino del Bus de datos se encuentra un sistema de memoria estática
(no mucha, por su precio) que guarda lo último que haya pasado por este
Bus. Es decir, si guardo un número de un cálculo en la memoria, este se
copia en la memoria estática en el camino a guardarse en la dinámica. A
esta memoria en el camino se la llama memoria CACHE.
Las CPUs modernas suelen tener memorias cache dentro de ellas para ganar
tiempo. Estas trabajan adelantando datos que hace poco se hayan usado y
que estén ahí en vez de tener que ir a buscar a ese dato particular a la
memoria dinámica. Las CPUs modernas tienen varios niveles de cache
interno, incluso algunos cores dentro de la CPU tienen sus propia
memoria cache.
Es una clase de memoria que se graba los datos y quedan en forma
permanente, aún con la computadora apagada. ROM es la sigla de Read Only
Memory, que significa que es una memoria que sólo se puede leer. La
información que está en la ROM fue puesta por el fabricante de la
computadora. En este tipo de memoria suele estar un software llamado
BIOS que es el que corre cuando arranca la computadora y después de
hacer una serie de testeos, (en jerga de informáticos “Bootea”) este
arranca, a su vez el sistema operativo (por ejemplo, el Windows o el
Linux).
Es un tipo de memoria lenta pero muy útil, ya que los datos se
guardan y se conservan aún estando apagada la computadora. Suele ser
utilizada en circuito electrónicos que no necesiten mucha energía. CMOS
viene de Complementary Meta Oxide Semiconductor. Para lo cual las
computadoras disponen de una pila recargable para alimentar esta
memoria. Esta pila se recarga cuando la computadora está encendida. Este
tipo de memoria, de la cual hay varias tecnologías diferentes, suelen
ser en la actualidad variantes de la memoria Flash, que es la tecnología
usada en los pen drives.
Sirve fundamentalmente para guardar las configuraciones de la
computadora. Por ejemplo, si yo apago la computadora y le agrego más
memoria, al encenderla el BIOS es el encargado de encontrar cuanta
memoria existe en total sumando el nuevo agregado y este nuevo valor es
guardado en la CMOS. Luego al activarse el sistema operativo (SO), por
ejemplo el Windows, este se entera por el BIOS de la nueva cantidad de
memoria y entonces este SO la puede utilizar, de lo contrario no sabría
de su existencia.
La idea del almacenamiento interno y externo es la de guardar
programas y datos que sobrevivan cuando la computadora esté apagada, o
bien para transportarlos entre computadoras o simplemente para hacer
copias de respaldo (Backups) de datos de mucha importancia. Con la idea
de que estos no se pierdan en caso de fallas con la electrónica o
errores humanos (muy probables!!!).
Hay dos tipos de almacenamiento que se instalan en la parte interna de
las computadoras, el más antiguo, son los discos rígidos. Estos son
dispositivos mecánicos que graban magnéticamente la información sobre
una superficie ferromagnética rotante con geometría de disco.
Típicamente con velocidades de acceso del orden de los
milisegundos.
La otra opción son los Discos de Estado Sólido (o SSD) que si bien se
los llama discos no hay nada circular (ni rotante) en ellos. Son un tipo
de memoria flash que graba en circuitos la información. Tienen
velocidades de acceso en las décimas de milisegundo y se espera que en
un tiempo corto sean tan rápidos como la velocidad de acceso a la
memoria RAM.
A estos dispositivos se los “Formatea”, es decir se construye en ellos
una estructura de índices, para que se pueda guardar y recuperar la
información. Para ser gráfico, pensemos en una biblioteca, el disco es
el cuarto libre. El formateo construye las repisas y los muebles donde
se almacenan los libros y los ficheros que indican su ubicación.
Hay distintos protocolos para formatear un disco, a estos protocolos se
los denomina sistema de archivos (File System,) ejemplos de File Systems
son: FAT32, ext4, etc).
Los periféricos, son todos los distintos dispositivos que se pueden
conectar a la computadora, pueden ser el teclado, el mouse, pantallas,
sistemas de audio, video, etc. Para ello hay distintas interfaces
electrónicas. Las pantallas de Video o monitores suelen conectarse con
enchufes VGA (analógicos), DVI o HDMI (digitales).
El HDMI es un sistema de conexión diseñado para los sistemas de DVD o
Blu-Ray, por lo cual la mayoría de los televisores puede conectarse con
esa interface como monitor de una computadora. Aunque se pueden
conseguir convertidores de HDMI a VGA y viceversa, los sistemas de
conexión digitales son los que proveen una mejor imagen.
Para todos los demás periféricos, los conectores digitales modernos, son
puertos serie (no paralelos), es decir los bits binarios van uno detrás
del otro como una fila de personas. El más utilizado es USB (Universal
Serial Bus), que también es el enchufe típico de los cargadores de
celulares. Actualmente el enchufe tipo A es el más usado, pero se está
reemplazando progresivamente por el tipo C, que es más pequeño y puede
ser usado sin tener en cuenta de que lado se lo conecta, es reversible.
Mientras que el enchufe tipo A, que es el más común, no es reversible.
Vea la Fig. 1.4
Hay sistemas para conectar periféricos que no usan cables, el preferido para dispositivos cercanos es el bluetooth. Normalmente es usado para conectar parlantes, teclados, mouses1 (o ratones en español) y que se utiliza en la mayoría de los celulares. En cambio, las conexiones Wi-Fi son usadas para conexiones a la red internet, aunque bajo ese nombre existe una gran cantidad e incluso diversos protocolos de conexión. También es posible conectar un celular a internet a través de las compañías telefónicas, usando protocolos conocidos como 3G, 4G y en un par de años 5G. Este último es extremadamente rápido y su despliegue cambiará mucho la forma de uso del celular. Para conexiones a corta distancia también existe el bluetooth que es muy usado en el sistemas de audio, desde auriculares para celular a parlantes portátiles.
El Software son las órdenes que se le dan al Hardware para su
ejecución. El software que más usamos es el Sistema Operativo (SO). Este
se encarga del manejo del sistema y de ser la interface entre el usuario
y la computadora. Además se encarga de coordinar los periféricos
(printer, parlantes, etc). Por ejemplo, en una PC es el Windows, en una
computadora de Apple es el MacOSX, o puede ser el Linux. Este último es
un SO gratuito realizado por voluntarios de todo el planeta y es el
sistema operativo más utilizado en muchas áreas científicas.
Cuando uno conecta un dispositivo nuevo a su computadora, este suele
venir con un “driver” o manejador, que le permite al SO “hablar” este
periférico. Estos drivers solían venir en discos pero actualmente los SO
los bajan de internet al momento de localizar que existe un nuevo
hardware conectado a la computadora.
El LINUX es una versión de UNIX y es el que usamos en la cátedra. Los
sistemas UNIX son los que prefieren las personas que usan computadoras
en forma profesional y que programan sus propios códigos. Esto es debido
a que el SO opera mucho más rápido. Por esta razón, estos SO son los
preferidos en los ambientes científicos. Mientras que el Windows o el
MacOSX están pensados para usuarios menos calificados con la idea de
vender estas computadoras como un electrodoméstico mas. A pesar de esto,
el MacOSX tiene un UNIX interno escondido. Las nuevas versiones de
Windows evolucionan a también convertirse en un UNIX, ya que es posible
desde el propio "store" del sistema instalar un sistema que permite
correr órdenes linux de la distribución Ubuntu2. En
ambos casos la idea general es que el usuario no profesional lo utilice
a partir de un sistema gráfico más simple, pero que el usuario más
capacitado y con usos profesionales tenga acceso a un sistema más
complejo en la calidad y variedad de órdenes que se le pueden dar a la
computadora.
Otro ejemplo, son los celulares y tabletas donde existen dos SO que
dominan el mercado en este momento (hay otros con menor cantidad de
usuarios), el Android realizado por Google a partir de portar el Linux a
los celulares y el IOS que se usa en el Iphone. Un punto que hay que
destacar es el interés de los fabricantes de celulares para que en un
futuro cercano haya un SO común entre PCs y teléfonos, con la idea de
que fabriquen computadoras con la tecnología de los celular. Un ejemplo
de esto es la tecnología de la nueva CPU llamada M1 de Apple o los
procesadores ARM que pueden correr Windows.
También hay sistemas operativos conocidos como ‘firmware’’ estos se
usan en dispositivos de uso doméstico y aunque son invisibles al usuario
existen. Se utilizan desde los televisores hasta en los termostatos de
estufas, etc. Si son dispositivos que se conectan a internet,
normalmente su dueño los descubre cuando el aparato pide permiso para
instalar una actualización.
Para darle las órdenes a la computadora hay que usar un lenguaje de
programación. Hay muchos lenguajes y muy diferentes, construidos con la
idea de realizar un tipo de tarea específica. En nuestro caso, el
interés como científicos es el de calcular, analizar y visualizar
datos.
En esta cursada la idea es que los alumnos dominen dos lenguajes: el
Fortran que es muy antiguo pero útil para hacer programas de cálculo muy
pesados y el Python que es uno de los lenguajes más usados en el
análisis de datos. En el caso del Python, este es un lenguaje moderno y
orientado a objetos (más adelante veremos qué es un objeto) a diferencia
del Fortran. Pero con una desventaja al ser tan actual: continuamente se
lo mejora pero sin mantener la compatibilidad con versiones anteriores,
lo que obliga a revisar programas de hace unos años o meses.
En general hay dos clases de lenguajes para programar una computadora,
los que son compilados o los que son
interpretados. El lenguaje Fortran es compilado, es
decir se escriben las órdenes y este conjunto de órdenes (todas juntas)
son convertidas (o traducidas) a un programa ejecutable que es el que
entiende la CPU de la computadora.
Por lo tanto en Fortran tengo 3 etapas: programar el código, compilarlo
y luego puedo correr el ejecutable que es el resultado de esta
compilación.
En el caso de los interpretados (como el Python), cada orden (o un
conjunto de estas) del programa es convertida a órdenes del CPU y luego
ejecutada, para pasar a la orden que sigue, esto permite trabajar con
más interacción con el código, pero los programas son más lentos porque
el método es poco eficiente. Pero por otro lado es más fácil encontrar
errores en el código o realizar mejoras en el momento, y en computadoras
muy rápidas la ineficiencia del interprete pasa mucho más
desapercibida.
En lenguajes interpretados modernos a veces estos se usan como un frente
(frontend) para llamar a códigos ya compilados (backend) y estamos en un
caso híbrido entre compilados e interpretados. Por ejemplo, esto se
utiliza con los sistemas de Machine Learning.
En el caso del Fortran este tiene una cantidad no muy grande de
órdenes a disposición del usuario pero estas son suficientes para
realizar todas las operaciones que se pueden encontrar en un libro de
álgebra. En el caso del Fortran no se le están agregando nuevos
comandos. Mientras que el lenguaje Python tiene un filosofía de trabajo
diferente en la cual se pueden agregar órdenes y funciones construidas
por otros autores como si fuesen nativas del sistema, por lo cual la
cantidad de comandos es inmenso en número, variado en temas y a su vez
evoluciona rápidamente con el tiempo. Veremos con detalle estas
diferencias durante la cursada.