¿Cómo funciona exactamente un programa de ordenador? ¿Cómo le dicen líneas de texto a una caja de cables que haga algo? ¿Creía que los ordenadores se basaban en 0s y 1s? ¿Cómo se traduce?

Oh wow. Qué buena pregunta. Hay que saber un poco de arquitectura de ordenadores para entender bien lo que pasa. Los ordenadores funcionan en 0s y 1s. Permítanme empezar desde lo más bajo.

  1. La parte central de un ordenador se llama CPU (Unidad Central de Procesamiento). Las CPUs modernas incluyen un montón de cosas, pero explicado de forma sencilla, la CPU es un montón de microelectrónica que puede ejecutar instrucciones.

main-qimg-59acf5b686888287a39b51be4d2184bf.webp

  1. Puedes pensar en la CPU como un montón de puertas lógicas de transistores. Un montón de ellas. Estas puertas consisten en transistores y otras partes electrónicas que implementan operadores lógicos muy simples: AND, OR y NOT. Las CPUs más sencillas solían tener miles de transistores. Para comprender la complejidad de las CPUs modernas, considere que algunas de ellas tienen más de 2.500 millones de transistores. Como habrás adivinado, son diminutas. Pero aquí hay algunos no tan pequeños:
    1. main-qimg-b59ee324cb1fbe8b03ffb3adcf7d8ea4.webp
      1. (observe tres conectores: dos de entrada y uno de salida)
      2. Los transistores funcionan con corrientes eléctricas. De ahí vienen sus 1s y 0s. Existe corriente - 1. No hay corriente - 0. Las operaciones lógicas alteran estas corrientes. Por ejemplo, AND significa que la salida tendrá corriente sólo si sus dos entradas la tienen (1 AND 1 = 1). OR significa que sólo una es suficiente (1 O 0 = 1). NOT sólo invierte la existencia de corriente (NOT 0 = 1).
      3. Lo creas o no, estos tres operadores lógicos, cuando los combinas, son suficientes para implementar toda la lógica, incluyendo las operaciones aritméticas sobre enteros (+, -, /, *), y en consecuencia casi todo lo demás. Sólo que hay que combinar muchos de ellos. Puedes pensar en ello de esta manera: los números se representan como 1s y 0s en el sistema numérico binario, por lo que la adición es sólo un conjunto de operaciones lógicas entre los 1s y 0s de los que constan los dos números. Aquí's por ejemplo, un par de transistores que suman dos bits. Combina más de esos y podrás sumar números grandes.

      main-qimg-a2c3b3248175a9f1553f77eaa8e3aacd.webp

      1. Ok, esto es la CPU y su lógica. Pero ¿de dónde sacamos las instrucciones? Como sabemos cómo se implementan operaciones como la suma, ahora podemos darles algún tipo de código. Por ejemplo, podemos acordar que 45 significa sumar dos números, y 87 significa dividirlos (por supuesto, también debemos especificar exactamente qué). Lo que hace la CPU es leer estos números (código) y ejecutar la instrucción correspondiente.
      2. En las CPUs modernas, lo que acabo de describir se llama Microcódigo, y el microcódigo contiene las instrucciones más básicas. El microcódigo se utiliza entonces para implementar un conjunto de instrucciones más complicado, que se llama código máquina. El código máquina también son números, sólo que las instrucciones son algo más complicadas. Como ejemplo imaginario, digamos que la instrucción de código máquina es 76 2 3 4. Podría significar "sumar dos números (opcode 76) de la memoria en las posiciones 2 y 3, y escribir el resultado en la posición 4". Su implementación en microcódigo contiene órdenes mucho más simples y atómicas como "recuperar el número de la posición 2". Entonces la CPU los ejecuta.
      3. Ahora que he mencionado la memoria. La memoria es más fácil de entender - sólo contiene un montón de estos 0s y 1s que se pueden cambiar. Y además no parece nada emocionante:
        1. main-qimg-8a36945b1c58fe41c7109ac3cd916efc.webp
          1. En casi todas las arquitecturas de ordenador existentes (gracias al tipo llamado Von Neumann), el código de instrucciones del que hablamos antes se almacena en la memoria, como cualquier otro dato. Las instrucciones que he mencionado antes (76 2 3 4) también se almacenarían en memoria. Para encender el ordenador (CPU), hay que apuntar a algún lugar de la memoria con instrucciones y decir -¡Vamos! Leerá las instrucciones una por una y las ejecutará de la manera que he descrito anteriormente.
          2. Por supuesto, ya que los ordenadores sólo entienden la corriente eléctrica o la falta de ella (1s y 0s), todos los datos, incluyendo esos números de instrucciones, se almacenan en el sistema numérico binario. El sistema binario es en realidad bastante fácil de entender. Nosotros&apostemos por el sistema Decimal, porque tenemos 10 dedos. Cada número puede ser uno de los 10 dígitos posibles: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. No hay nada especial en el diez. Puedes imaginar que unos extraterrestres con 8 dedos, podrían usar un sistema numérico con sólo ocho dígitos: 0, 1, 2, 3, 4, 5, 6, 7.

          main-qimg-c3a65c5b2ab6d11f3b52058ab04e6dd9.webp

          1. ¡Yo uso el sistema numérico Octal (8)!

            Puedes pensar en el binario como un sistema numérico que algún desafortunado ET con sólo dos dedos usaría. Aquí tienes un ejemplo de cómo convertir de binario a decimal:

          main-qimg-1787b1bb3353b27292701d16ff972d7c

          1. ¡Phew! Ahora estamos llegando a alguna parte. Pero aún no hemos terminado. Verás, escribir números incluso en sistema decimal es muy, muy incómodo y propenso a errores. Así que lo primero que aparece es el lenguaje ensamblador. El lenguaje ensamblador no es más que una representación mnemónica del código máquina. Por ejemplo, nuestra instrucción favorita 76 2 3 4, podría representarse como algo así:

            ADD [2], [3] -> [4] (no es código ensamblador real)

          2. El primer ensamblador (el programa que traduce el lenguaje ensamblador a código máquina) por supuesto, tuvo que ser escrito en código puro (números). Pero es relativamente fácil, porque los comandos en ensamblador se corresponden casi 1:1 con el código máquina.
          3. Bien, ahora es un poco mejor, pero el lenguaje ensamblador sigue siendo demasiado verboso. Incluso los programas más simples, como leer la entrada del usuario, sumarle 1 e imprimirlo de nuevo, contienen un montón de comandos en lenguaje ensamblador. Es de muy bajo nivel y carece de abstracciones superiores.
          4. Entre los lenguajes de programación. Son mucho más de alto nivel, y usted puede expresar cosas complicadas muy sucintamente en comparación con los lenguajes de ensamblaje. Podrías escribir algo así:

            R = 2,0
            print "Cuadrado de círculo con radio %f es %f" % (R, 3,14*R*R)

            Esto se traduce en un montón de comandos en lenguaje ensamblador, que es exactamente lo que hace un Compilador. El compilador toma un programa en un lenguaje de relativamente alta abstracción como el ejemplo anterior, y lo convierte en un programa en lenguaje ensamblador (en realidad, muchas veces directamente en código máquina, pero bueno). El primer compilador, por supuesto, tuvo que ser escrito en lenguaje ensamblador. Pero una vez que la primera versión funciona, puedes escribir las futuras versiones de tu compilador en el mismo lenguaje desde el que compila. Después de todo, un compilador es como cualquier otro programa de ordenador: traduce la entrada en salida.

          5. Así que ahora tiene un compilador. Y puedes escribir programas y compilarlos en código máquina. El resultado final es un archivo ejecutable. ¿Recuerdas cuando hablábamos de que el código máquina es sólo números en la memoria? Así que usted tiene estos números en el disco en algún lugar en un archivo. Para ejecutar su programa, el ordenador carga este archivo en la memoria, apunta la CPU al principio del programa y dice:
          6. El último término que quieres conocer para tener una comprensión aproximada de la arquitectura de los ordenadores es Sistema Operativo. El sistema operativo es básicamente un programa que se pone en marcha cuando tu ordenador se inicia, y gestiona conceptos aún más complicados (como disco, archivo, tu monitor, tu teclado y tu ratón, etc.) para que cada programa que escribas no tenga que implementarlos una y otra vez. En lugar de saber cómo hablar con un teclado, por ejemplo, un programa simplemente pregunta al sistema operativo, por ejemplo, por la última tecla que has pulsado, y el sistema operativo se encarga de los detalles de la comunicación con el teclado (o cualquier otro hardware).

          main-qimg-44378404da64b22b4377ef1f9157024.webp

          1. Tres sistemas operativos de escritorio más populares
            1. main-qimg-14921901148797b1b7981d4bbf72d8e9.webp
              1. Sistemas operativos móviles

                Es el sistema operativo que introduce conceptos como Archivo y Carpeta. Es el sistema operativo que carga su programa desde el archivo ejecutable en la memoria, apunta a la CPU al principio del mismo y dice: ¡Vamos!

              ¡Felicidades! Ahora tienes un conocimiento aproximado de la arquitectura de los ordenadores
              main-qimg-790e56af154d4afc43ffd506a6215ce9.webp