Introducción a la Programación, 2022-1
Nota de clase 02: Estructura física de una computadora
Manuel Soto Romero
4 de febrero de 2022
Colegio de Ciencia y Tecnología UACM
La programación de computadoras se ha vuelto una labor indispensable hoy en día. Podemos encontrar
programas en cualquier dispositivo, celulares, tabletas, computadoras personales, televisiones, entre muchos
otros. A lo largo de estas notas estudiaremos los conceptos básicos que involucran a la programación de
computadoras y nos enfocaremos principalmente en el diseño de algoritmos que puedan ser automatizados.
En esta nota, en particular, discutiremos de forma muy general cómo es que la computadora almacena
información, es decir, estudiaremos (de forma muy superficial) su arquitectura. Esto con el fin de entender,
a grandes rasgos, lo que sucede cuando un programa se ejecuta. Estudiaremos con detalle la llamada
Arquitectura de von Neumann en la cual se basan las computadoras actuales.
2.1. Definiciones básicas
Comencemos por dar una definición de lo que es una computadora.
Definición 2.1. (Computadora) Es una máquina electrónica que trabaja a gran velocidad.
Procesa datos mediante lenguajes entendibles para la misma, almacena y brinda información.
A simple vista, una computadora no es más que un conjunto de componentes físicos. Llamamos a estos
componentes el hardware de la computadora.
Definición 2.2. (Hardware) Es la estructura física de una computadora, todo lo tangible, es
decir, los dispositivos materiales que puede tocar el usuario como son el teclado, el monitor, el
gabinete, etcétera.
Es el hardware de una computadora es el que se encarga de procesar datos, almacenar y brindar informa-
ción. Sin embargo, la mayor utilidad de una computadora proviene del hecho de que son entes programables,
o dicho de otro modo, una computadora es útil porque ejecuta software.
1
Definición 2.3. (Software) Es la estructura lógica de una computadora, todo lo intangible, es
decir, son las aplicaciones, sistemas operativos, etcétera que no son tangibles para el usuario.
Esta relación entre hardware y software se logra gracias a la programación de computadoras. En sus inicios,
esta labor consistía en reconfigurar el hardware, desconectando cables y conectándolos en otros lugares.
Hoy en día la programación de computadoras se lleva a cabo usando lo que se conoce como lenguaje de
alto nivel.
2.2. Arquitectura de von Neumann
Consientes de que la labor de programación era muy lenta y por lo tanto propensa a errores, Prespert
Ecket, Johm Mauchly, Herman Goldstine y John von Neumann discutieron acerca de una una forma de
proveer a la computadora del programa a ejecutar de una manera más sencilla. Con lo cual, se definió una
arquitectura con el siguiente proceso:
1. Cargar el programa en la memoria de la computadora.
2. El usuario proporciona datos de entrada a la computadora.
3. A partir de la información de entrada, el programa es ejecutado.
4. Una vez ejecutado el programa, se obtienen datos de salida.
Dentro de este proceso, intervienen los siguientes componentes y unidades: [2]
Memoria RAM
Aquí son almacenados los datos y las instrucciones durante la ejecución del programa.
Unidad Central de Proceso (CPU, Central Processing Unit)
Controla y coordina la ejecución de las instrucciones de un programa. Se compone de dos unidades
auxiliares:
• La Unidad Aritmético-Lógica (ALU) se encarga de realizar operaciones aritméticas (sumas y
restas) y lógicas (Álgebra Booleana) sobre los datos del programa.
• La Unidad de Control se encarga de leer las instrucciones del programa, decodificarlas y enviar
órdenes a los componentes correspondientes. Cada instrucción es guardada temporalmente en
lo que se conoce como Registro de Instrucción y el Contador del Programa que indica cuál es
la siguiente instrucción a ejecutar.
Dipositivos de entrada y salida
Son responsables de la comunicación con el usuario. Los dispositivos de entrada permiten a la compu-
tadora obtener datos e instrucciones, por ejemplo, a través del teclado. Los dispositivos de salida,
permiten enviar los resultados de un programa al usuario, por ejemplo, a través del monitor.
2
Buses
Permiten conectar todos los componentes. Son vistos como una línea de transmisión donde pasa la
información. Existen, en general tres tipos de buses:
• Bus de datos. Es un canal bidireccional que permite el intercambio de datos entre la CPU y el
resto de unidades.
• Bus de direcciones. Es un canal unidireccional por el cual la unidad central de proceso envía
las direcciones de memoria para ubicar información en los dispositivos de memoria.
• Bus de control. Por el bus de control, se transmiten las órdenes necesarias para activar las
operaciones de lectura o escritura.
Observación 2.1. Es importante mencionar que la Unidad Central de Proceso no recibe los datos
de manera directa de la unidad de entrada, ni los envía directamente a la unidad de salida. Usa
la memoria RAM como lugar de paso. De esta forma:
La Unidad central de proceso es la única que puede procesar los datos, esto implica que
los datos tienen que llegar de alguna forma ahí para ser procesados.
La Unidad Central de Proceso sólo puede acceder a los datos o instrucciones almacenados
en memoria RAM.
Observación 2.2. Un registro es, de forma más detallada, una colección de celdas de memoria,
cada una de las cuales puede almacenar un 0 o un 1 (bit). El numero de celdas corresponde al
número de bits que puede almacenarse en un registro. De esta forma hay registros de 4, 16 o 32
bits. A esto se le conoce como palabra.
La Figura 1 muestra un diagrama de la llamada Arquitectura de von Neumann.
Finalmente, John von Neumann publicó esta arquitectura en el artículo First Draft of a Reporter: on the
EDVAC a partir de donde recibió este nombre. Esta arquitectura es tomada como base en la mayoría de
dispositivos actuales.
De esta forma, el funcionamiento general de una computadora, se obtiene mediante un programa (software),
o dicho de otro modo, sigue los siguientes pasos:
Datos de entrada ⇒ Computadora ⇒ Datos de salida
⇑
Programa (Conformado por
instrucciones)
3
Figura 1: Arquitectura de von Neumann[1]
2.3. Procesamiento de instrucciones
Hemos dicho que una computadora toma datos de entrada que son procesados mediante un programa,
generando datos de salida. Revisemos la definición de estos conceptos con un poco más de detenimiento:
Definición 2.4. (Dato) Un dato es un símbolo, valor, texto, fecha que da lugar a la informa-
ción. Un dato por sí mismo no nos proporciona contexto alguno, sin embargo con el procesa-
miento adecuado da lugar a obtener información. Se dice que un dato es la unidad mínima de
información.
Ejemplo 2.1. Por ejemplo:
’F’ “Chilaquiles” 2001 4/02/2004
Definición 2.5. (Información) Es un conjunto de datos procesados en un determinado con-
texto.
4
Ejemplo 2.2. Por ejemplo:
’F’ Representa el género femenino. “Chilaquiles” Es la comida favorita de la abuelita de Batman. 2001
Es el año de fundación de la UACM. 4/02/2004 Es la fecha de fundación de Facebook.
2.3.1. Programas
Debido a que las computadoras únicamente entienden lenguaje de máquina (binario), fue necesario crear
nuevos lenguajes que fueran más entendibles para las personas y que funcionaran como un intermediario
entre el programador y las computadora. Este tipo de lenguajes (de programación) son clasificados como
lenguajes de alto nivel y lenguajes de bajo nivel. Mientras más cercano a la arquitectura de la computadora
(hardware) más bajo el nivel.
De esta forma, lenguajes de programación como C, Java o Python que son más cercanos al lenguaje
de los humanos, son de alto nivel.
Los lenguajes de bajo nivel son llamados ensabladores y cada procesador provee su propio lenguaje.
Con estos conceptos definidos, veamos ahora, qué es un programa.
Definición 2.6. (Programa) Es un conjunto de instrucciones que describen las órdenes dadas
a una computadora, éstas pueden ser escritas en un lenguaje de programación, de alto o bajo
nivel o bien en lenguaje máquina.
Los programas escritos en lenguaje máquina son ejecutados directamente por la computadora.
Los programas escritos en lenguajes de programación, deben ser traducidos al lenguaje de la máquina
para que ésta pueda ejecutarlos.
Al programa que se requiere traducir se le llama programa fuente 1 . Para realizar la traducción, se puede
emplear un programa llamado traductor. En general existen dos tipos de traductores: compiladores e
intérpretes. El programa final generado después de la traducción es llamado programa objeto 2 .
1
También llamado código fuente.
2
Código objeto
5
Definición 2.7. (Compilador) Es un traductor de lenguajes de programación de alto o bajo
nivel que toma todo un programa fuente y lo traduce pasando por distintas fases en un programa
ensamblador o programa objeto.
Definición 2.8. (Intérprete) Es un traductor de lenguajes de programación de alto o bajo
nivel que traduce línea por línea las instrucciones de un programa fuente, es decir, traducen
cada línea a código objeto y la ejecutan.
2.3.2. Representación de la información
Los datos e instrucciones son almacenados en la memoria en un lenguaje entendible para la misma,
llamado lenguaje de máquina. Este lenguaje se compone de cadenas de ceros y unos y es llamado binario.
Una computadora entiende este lenguaje pues únicamente trabaja con dos estados: activo o desactivado,
abierto o cerrado, pasa corriente o no pasa corriente.
Unidades de medida
Tanto la memoria como las unidades de almacenamiento utilizan unidades para ser medidas, entre las
cuales se encuentran.
Bit. Es la unidad más pequeña de información en el sistema binario, es decir, es o bien 0 o 1.
Byte. Es conocida como la unidad de almacenamiento, se presenta en bloques de 8 bits. Con esto
se pueden representar hasta 256 valores distintos.
Kilobyte (kb). Corresponde a 1,024 bytes.
Megabyte (mb). Corresponde a 1,024 kilobytes, es decir, 1,048,576 bytes.
Gigabyte (gb). Corresonde a 1,024 megabytes, es decir, 1,073,741,824 bytes.
Terabyte (tb). Corresponde a 1,204 terabytes, es decir, 1,099,511,627,776 bytes.
2.3.3. Ejecución de instrucciones
Ahora que tenemos bien definido cómo se representa la información en la computadora, y cómo es traducida
a lenguaje de máquina, veamos cómo es que la computadora procesa cada cadena de bits.
La mayoría de lenguajes de programación, son traducidos directamente al lenguaje que provee el pro-
cesador, llamado ensamblador. Por lo que ejemplificaremos el proceso de ejecución, mediante programas
escritos en este tipo de lenguajes. Por ejemplo, supongamos un lenguaje ensamblador con las siguientes
operaciones: [2]
6
Instrucción Código Descripción
Carga <DIR> 20 Transfiere el dato almacenado en la posición de memoria
<DIR> al acumulador de la ALU.
Guarda <DIR> 02 Guarda el contenido del acumulador en la posición de
memoria <DIR>.
Divide <DIR> 38 Divide el contenido del acumulador entre el dato
almacenado en la posición de memoria <DIR>. El resultado
queda almacenado en el acumulador.
Multiplica <DIR> 36 Multiplica el contenido del acumulador entre el dato
almacenado en la posición de memoria <DIR>. El resultado
queda almacenado en el acumulador.
Resta <DIR> 33 Resta el contenido del acumulador entre el dato
almacenado en la posición de memoria <DIR>. El resultado
queda almacenado en el acumulador.
Suma <DIR> 30 Suma el contenido del acumulador entre el dato
almacenado en la posición de memoria <DIR>. El resultado
queda almacenado en el acumulador.
Alto 70 Indica el fin del programa
Ejemplo 2.3. Por ejemplo, supongamos que tenemos un programa escrito en un lenguaje de alto
nivel, que calcula el promedio de tres números. Algo similar al siguiente código:
Imprimir " Ingresa el primer número "
Leer numero1
Imprimir " Ingresa el segundo número "
Leer numero2
Imprimir " Ingresa el tercer número "
Leer numero3
promedio ← ( numero1 + numero2 + numero3 ) / 3
Imprimir " Promedio : " + promedio
Supongamos que el usuario ingresa los números, 10, 4 y 4, por lo tanto, las variables numero1, numero2
y numero3, tienen esos valores, que podemos almacenar en los registros 00, 01 y 02 de la memoria. En el
registro 03, agrego un número 3 que me permitirá hacer la división. Con lo cual el código ensamblador
correspondiente quedaría como sigue:
Carga 00
Suma 01
Guarda 04
Carga 02
Suma 04
Guarda 04
Carga 04
Divide 03
7
Guarda 04
Alto
Una vez realizado esto, necestiamos buscar el código asociado a cada operación y represetarlo en código
máquina, es decir en binario. Esto se vería así:
00010100 00000000
00011110 00000001
00000010 00000100
00010100 00000010
00011110 00000100
00000010 00000100
00010100 00000100
00100110 00000011
00010100 00000100
01000110 00000000
Los pasos que sigue el procesador para ejecutar instrucciones se conocen como ciclo de ejecución y se
listan a continuación[2]:
1. La unidad de control obtiene de la memoria RAM la instrucción indicada en el contador de
programa (PC) y la almacena en el registro de instrucción (IR). Actualiza el contenido del
contador de programa con la dirección de memoria donde se encuentra almacenada la siguiente
instrucción del programa.
2. La unidad de control decodifica la instrucción del registro de instrucción, detecta las unidades
que deben interactuar para ejecutarla y les envía señales de control para indicarles la acción
que deben de realizar. Si la acción requiere un dato que esté en memoria, se hará la lectura
correspondiente, utilizando para ello los buses apropiados.
3. Si las instrucciones contienen operaciones lógicas o aritméticas en los datos, este trabajo es
asignado a la ALU, la cual realiza la operación con el dato indicado en la instrucción y el dato
almacenado en el acumulador. El resultado es almacenado en el acumulador del ALU, perdiéndose
con ello el dato anterior.
De esta forma, la memoria final de nuestro programa, luce de la siguiente manera. Suponiendo que las
instrucciones se almacenan a partir de la dirección en memoria 10.
00000000 0000000 0000000 0000000 ... 00010100 00011110 ...
00001010 00000100 00000100 0000011 00000000 00000001
00 01 02 03 10 11
Podemos resumir la ejecución de cada instrucción en la siguiente tabla. [2]
8
ALU Unidad de control Memoria
Instrucción
Operación Acumulador IR PC
10 4 4 3
10
00 01 02 03 04
10 4 4 3
Carga 00 10 20 00 11
00 01 02 03 04
10 4 4 3
Suma 01 10+4 14 30 01 12
00 01 02 03 04
10 4 4 3 14
Guarda 04 14 02 04 13
00 01 02 03 04
10 4 4 3 14
Carga 02 4 20 02 14
00 01 02 03 04
10 4 4 3 14
Suma 04 4+14 18 30 04 15
00 01 02 03 04
10 4 4 3 18
Guarda 04 18 02 04 16
00 01 02 03 04
10 4 4 3 18
Carga 04 18 20 04 17
00 01 02 03 04
10 4 4 3 18
Divide 03 18/3 6 38 03 18
00 01 02 03 04
10 4 4 3 6
Guarda 04 6 20 04 19
00 01 02 03 04
10 4 4 3 6
Alto 70 -
00 01 02 03 04
Referencias
[1] José de J. Galaviz, Notas de Clase de Organización y Arquitectura de Computadoras, Facultad de
Ciencias UNAM, Revisión 2015-2.
[2] Alejandra Andrade, Diana Cruz, et. al. Programación estructurada y modular en el lenguaje C, UACM,
Primera Edición, 2010.
[3] Juan J. Alvarez, S. Alejandra Andrade, et. al. Introducción a la Programación, UACM, Primera edición
2007.