-
Notifications
You must be signed in to change notification settings - Fork 145
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
25 changed files
with
2,558 additions
and
14 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
# Comunicando con la CPU | ||
|
||
Estamos acostumbrados a comunicarnos con la CPU en un lenguaje de alto nivel como JavaScript o C, pero el código que escribirías en estos lenguajes no representa directamente lo que le estás diciendo a la CPU que haga. | ||
|
||
Es como si decidieras viajar a Grecia. Escribir en un lenguaje de alto nivel sería como comprar un paquete de viaje que lo gestionara todo por ti, como la reserva de los billetes de avión, los hoteles, la gestión de la comida o el alquiler del coche. Si quisieras gestionar esas cosas manualmente, tendrías que comprar cada cosa por separado y organizarla tú mismo. | ||
|
||
Del mismo modo, con tu ordenador, si quieres controlar cada aspecto de lo que le pides que haga, tendrás que escribirle las instrucciones en un formato llamado lenguaje ensamblador (assembly). | ||
|
||
El lenguaje ensamblador es el nivel más bajo de abstracción en informática, en el que el código que escribes sigue siendo legible para el ser humano. Puede que no estés de acuerdo con la parte legible por humanos cuando lo veas por primera vez, ¡pero te prometo que es mejor que lo que ve el ordenador! | ||
|
||
¿Qué entendemos por abstracción? Bueno, una abstracción es una capa por encima de otra cosa que hace que esa cosa sea más fácil de hacer. | ||
|
||
<p align="center"> | ||
<br /> | ||
<img height="300" src="https://cloud-lrwvwyim3-hack-club-bot.vercel.app/0wheel.png"> | ||
</p> | ||
<br /> | ||
|
||
Por ejemplo, el volante. Un volante simplifica la conducción: sólo tienes que girar a la izquierda y a la derecha, y la cantidad que giras se corresponde con lo que giran tus neumáticos. Pero, ¿qué ocurre debajo? El volante es una capa de abstracción sobre las barras, las palancas y cualquier otra cosa que ocurra dentro del coche, que simplifica el acto de girar. O algo así. Está claro que no sé nada de coches. | ||
|
||
En nuestro caso, el ensamblaje es el volante, y las barras, palancas y demás cosas ocultas son nuestro código máquina. | ||
|
||
El código máquina es sólo un montón de números que el ordenador puede leer. De hecho, resulta que **todo son sólo números** por debajo. Los ordenadores sólo entienden números, así que todo lo que hacemos tiene que traducirse a números. | ||
|
||
Así, el código máquina no es más que un montón de números que la CPU lee para averiguar qué instrucciones debe ejecutar y sobre qué datos. Es el código legible por el ordenador. | ||
|
||
Como a los humanos nos gusta leer texto, el ensamblador es un lenguaje basado en texto, formado por siglas que representan instrucciones para el ordenador. Por desgracia, al ser texto, no son directamente legibles por la CPU. Así que ese archivo de texto se traduce, a través de algo llamado **ensamblador**, en números que el ordenador puede leer. | ||
|
||
Es como si fueras estadounidense y le dieras a tu amigo islandés una receta de tarta. Los estadounidenses escriben las recetas en medidas imperiales (por ejemplo, tazas, cucharadas, etc.) y los islandeses, en medidas métricas (gramos, litros, etc.). | ||
|
||
<p align="center"> | ||
<br /> | ||
<img src="https://cloud-r72u23edw-hack-club-bot.vercel.app/0recipe-resized.png"> | ||
</p> | ||
<br /> | ||
|
||
Línea por línea, traducirías la receta hasta que tuvieras una nueva receta para tu amigo. Tomarías la primera medida, 2 tazas de harina (**lenguaje assembly**), la convertirías a gramos (**el ensamblador**), y luego escribirías la receta convertida para utilizar 136 gramos de harina (**código máquina**). Mírate, ¡tú eres el ensamblador! | ||
|
||
Podrías saltarte todas estas travesuras del ensamblador escribiendo el código máquina directamente, pero el código máquina se parece a algo así: | ||
|
||
``` | ||
73 137 252 73 137 245 65 85 | ||
65 84 232 52 0 0 0 232 | ||
``` | ||
|
||
Por otra parte, Assembly (lenguage ensamblador), se parece a esto: | ||
|
||
```asm | ||
mov r12, r13 | ||
add r12, 4 | ||
``` | ||
|
||
Sé que esto no parece muy amigable, especialmente comparado con los lenguajes de programación de alto nivel que tenemos hoy en día. Sin embargo, ¡te prometo que es mucho más amigable que escribir un montón de números! | ||
|
||
Todos los lenguajes de programación tienen algún nivel de abstracción por encima del código máquina. Pero, al final, todo el código escrito por humanos tiene que convertirse en números para que tu CPU pueda leerlo. | ||
|
||
<br /> | ||
|
||
--- | ||
|
||
<a href="cpu.md"> | ||
<picture> | ||
<source media="(prefers-color-scheme: dark)" srcset="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg"> | ||
<img align="left" width="70" src="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg" /> | ||
</picture> | ||
</a> | ||
|
||
<p align="right"> | ||
<em> | ||
<b> | ||
<a href="instrucciones.md"> | ||
¿Cómo funciona? → | ||
</a> | ||
</b> | ||
</em> | ||
</p> | ||
|
||
--- | ||
|
||
<p align="center"> | ||
<a href="https://hackclub.com/"> | ||
<img width="35" src="https://cloud-l0g1cgz4b-hack-club-bot.vercel.app/0h.png"><br/> | ||
Hecho con amor por Hack Club | ||
</a> | ||
</p> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
# Convirtiendo una Instrucción a Código Máquina | ||
|
||
<p align="center"> | ||
<br /> | ||
<img width="375" src="https://cloud-ksjv20zq7-hack-club-bot.vercel.app/0communicate.png"> | ||
<br /> | ||
</p> | ||
|
||
<br /> | ||
|
||
Puede que te estés preguntando qué aspecto puede tener esto. Si es así, ¡estás de suerte! Vamos a convertir una instrucción en código máquina. | ||
|
||
¿Recuerdas nuestros registros? Hablaremos de ellos [más adelante](/es/guia/programar/registros.md), pero para este ejemplo, sólo necesitamos recordar que son lugares donde puedes almacenar cosas temporalmente. | ||
|
||
|
||
```asm | ||
add r12, 4 ; Añade el número 4 al número guardado en el registro 12 | ||
``` | ||
|
||
Primero, la CPU va y obtiene la instrucción. En código máquina, esto podría terminar pareciéndose a esto (veremos lo que es [binario](/es/mates/sistema-de-numeros#binario-base-2) más tarde): | ||
|
||
``` | ||
00000001 00001100 00000100 | ||
``` | ||
|
||
Lo que, en [base 10](#sistema-de-numeros) (¡como normalmente hablamos de números!), es: | ||
|
||
``` | ||
1 12 4 | ||
``` | ||
|
||
Cuando el decodificador lee su primer valor, sabe que está buscando un número para asignarlo a un opcode. | ||
|
||
| Número | Instrucción | | ||
| ------ | ----------- | | ||
| 1 | `add` | | ||
| 2 | `sub` | | ||
| ... | ... | | ||
|
||
Ahora, digamos que el número `1` corresponde al opcode `add`. Cuando ve el `1`, sabe que está leyendo una instrucción `add`. | ||
|
||
El decodificador sabe que el primer argumento de la instrucción `add` es ambos: | ||
|
||
- el destino de guardado | ||
- y la posición del primer número a sumar | ||
|
||
El decodificador ve entonces que el siguiente dato tiene el valor `12`, por lo cual sabe que su destino es el registro 12 (`r12`). Entonces puede coger el número almacenado en `r12` para la parte matemática. | ||
|
||
El decodificador sabe que a continuación viene el argumento para el número a sumar, que es `4`. | ||
|
||
Luego todo esto se ejecuta. La CPU envía el número `4` y el número almacenado en el registro 12 (`r12`) a la ALU, que envía la suma de estos dos números de nuevo a la CPU. La CPU toma esta suma de la ALU y la guarda en el registro 12 (`r12`). ¡Lo conseguimos! | ||
|
||
<br /> | ||
|
||
--- | ||
|
||
<br /> | ||
|
||
> #### Nota: | ||
> | ||
> Hoy en día, en lugar de un ciclo en el que cada flujo de instrucciones termina antes de que empiece el siguiente, las CPU implementan algo llamado **pipelining**. | ||
> | ||
> Imaginemos un almacén en el que estamos empaquetando cajas. La CPU es el almacén, y cada estación (la adición de artículos, el empaquetado y la carga en furgonetas) es un paso en el procesamiento de instrucciones (los paquetes). | ||
> | ||
> En el método de ciclo más simple descrito anteriormente, un paquete estaría completamente empaquetado y enviado antes de trabajar en el siguiente. | ||
> | ||
> Como alternativa, el pipelining utilizaría una cadena de montaje en la que un paquete pasaría por una única estación. Una vez que termina y pasa a la siguiente estación, ¡llega un nuevo paquete a esta estación! Antes de que se envíe nuestro primer paquete, ya se han empezado a llenar y empaquetar otros. | ||
> | ||
> Lo que esto significa para nosotros en términos de CPU es que las CPU modernas pueden buscar, descodificar y ejecutar simultáneamente diferentes instrucciones al mismo tiempo. Esto reduce drásticamente el tiempo de ejecución, lo que permite a la CPU funcionar mucho más rápido. ¡Bravo para nosotros! | ||
<br /> | ||
|
||
--- | ||
|
||
<a href="instrucciones.md"> | ||
<picture> | ||
<source media="(prefers-color-scheme: dark)" srcset="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg"> | ||
<img align="left" width="70" src="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg" /> | ||
</picture> | ||
</a> | ||
|
||
<p align="right"> | ||
<em> | ||
<b> | ||
<a href="mundo-fisico.md"> | ||
Trasladando esto al mundo físico → | ||
</a> | ||
</b> | ||
</em> | ||
</p> | ||
|
||
--- | ||
|
||
<p align="center"> | ||
<a href="https://hackclub.com/"> | ||
<img width="35" src="https://cloud-l0g1cgz4b-hack-club-bot.vercel.app/0h.png"><br/> | ||
Hecho con amor por Hack Club | ||
</a> | ||
</p> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# La CPU | ||
|
||
<p align="center"> | ||
<br /> | ||
<img height="300" src="https://cloud-iprjhyjdt-hack-club-bot.vercel.app/0processor.png"> | ||
</p> | ||
<br /> | ||
|
||
¿Has oído hablar de las empresas Intel o AMD? Son dos empresas muy conocidas que fabrican las CPU que van en nuestros ordenadores. Todos los ordenadores que utilizamos contienen algo llamado unidad central de procesamiento, también conocida como CPU o procesador, que actúa como el cerebro del ordenador. | ||
|
||
Los ordenadores contienen otras unidades de procesamiento (como la tarjeta gráfica) que se encargan de procesar otras cosas más específicas, pero la CPU es el motor general de todas las tareas informáticas. Dicho esto, la CPU puede hacer sorprendentemente poco. Puede: | ||
|
||
1. Leer valores | ||
1. Establecer valores | ||
1. Realizar cálculos matemáticos sencillos, como sumas, restas y comparaciones. | ||
|
||
Le das los números y se pone a trabajar para procesar los datos como tú quieras. Eso es todo. Todo lo que hace tu ordenador consiste en eso. ¿No es increíble? | ||
|
||
<br /> | ||
|
||
--- | ||
|
||
<a href="es/guia/programar/introduccion.md"> | ||
<picture> | ||
<source media="(prefers-color-scheme: dark)" srcset="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg"> | ||
<img align="left" width="70" src="https://cloud-c4m75tmer-hack-club-bot.vercel.app/0back.svg" /> | ||
</picture> | ||
</a> | ||
|
||
<p align="right"> | ||
<em> | ||
<b> | ||
<a href="comunicando.md"> | ||
Comuniquémonos con la CPU → | ||
</a> | ||
</b> | ||
</em> | ||
</p> | ||
|
||
--- | ||
|
||
<p align="center"> | ||
<a href="https://hackclub.com/"> | ||
<img width="35" src="https://cloud-l0g1cgz4b-hack-club-bot.vercel.app/0h.png"><br/> | ||
Hecho con amor por Hack Club | ||
</a> | ||
</p> |
Oops, something went wrong.