Начало пути
У компьютера есть память. Как организована память? С помощью двоичного счёта. Это значит, что в каждой ячейке памяти хранится либо "одно", либо "другое". Обычно это обозначают цифрами 1 и 0. Если взять теперь много таких нулей/единиц, ими можно считать. Считать будем так: 0000 (0), 0001 (1), 0010 (2), 0011 (3), 0100 (4), 0101 (5), 0110 (6), 0111 (7) и т. д. Далее придумаем так: когда процессору нужно узнать, что там, в какой-то конкретной ячейке памяти (1 или 0) - он посылает туда электрический ток. Мы можем сделать такую электрическую схему ячейки памяти, что когда в ней 1, мы сохраняем небольшое количество тока в конденсаторе и когда от процессора приходит (в виде тока) вопрос "что в памяти", мы используем этот запасённый ток, отправляем его на транзистор и транзистор отправляет в ответ какой-то более-менее заметный ток. Если процессор этот ток получил, значит, в памяти была 1. А что если 0? Схема памяти устроена так, что в этом случае конденсатор пуст, тока нет, поэтому на транзистор ничего не приходит и поэтому процессор получает "ничего". Если так и вышло, значит, процессор знает, что в памяти 0. Процессор также может не только узнавать, что в памяти (читать), но и писать в память. Идея проста. Когда приходит комбинация нулей и единичек, они заряжают конденсаторы. Единица (наличие тока) конденсатор зарядила, ноль (нет тока) оставил конденсатор разряженным.
Середина пути
Но память это только начало. Сердце (вернее, мозг) компьютера - это процессор. Как устроен процессор? По-сути, процессор это очень-очень-очень-ооооооооочень сложная электрическая схема, поведение которой зависит от того, какие сигналы придут на вход. При этом у процессора десятки входов и выходов. 64 ножки процессора используются для того, чтобы получить из памяти сразу 64 штуки нулей/единиц, ещё столько же ножек нужно для того, чтобы процессор мог объяснить из какой конкретно области памяти (адрес) он хочет взять число. Чтобы это работало, есть контроллер памяти - это схема, которая в зависимости от нулей/единиц на ножках адреса как бы "перенаправляет" ток к одним или другим ячейкам памяти. Кроме этого у процессора существует также свой крошечный объём памяти, прямо внутри процессора, в котором он способен сохранить несколько чисел (числом мы будем называть набор из 64 электрических сигналов, тех самых "нулей" и "единичек"). Нужно помнить хотя бы пару чисел, чтобы можно было выполнять арифметические действия (сложение, умножение и т. д.). Эта крошечная память (каждая из которых умеет хранить только одно число) называется регистрами.
Основная же сверхсложная схема процессора (в которой миллионы транзисторов) посвящена тому, что она направляет ток от десятков своих входов таким образом, что, в итоге, происходит что-то разумное. Если на входе было такое-то число (64 нуля/единицы), то это означает "процессору нужно взять число из памяти, адрес которой будет указан в следующем числе, и сохранить полученное число в первом регистре". Наличие такой комбинации токов на входах (каждая единичка - это ток, а нолик - это отсутствие тока) направляет ток по схеме процессора так, чтобы именно это и произошло (разработчики процессора для этого впаяли в него сотни схем для сотен разных чисел), на выход процессора подаются числа-запрос к нужному адресу памяти и процессор ждёт следующее число. Он уже знает, что следующее число - это полезные данные (так ему было сказано в прошлый раз), он записывает это число в первый регистр (как было сказано).
Это была одна команда... Далее процессор берёт число из следующего адреса. Для того, чтобы знать, откуда брать числа, которые являются программой, у процессора есть регистр, в котором он хранит текущий адрес команды. Каждый раз, как он берёт очередную команду, он прибавляет к этому регистру единичку (для этого опять существует целая схема, которая умеет складывать числа). Поэтому процессор каждый раз берёт число из следующих 64 конденсаторов памяти. Так он движется число за числом и делает что-то полезное. Например, следующим числом, будет число, которое означает "возьми из адреса (который, как обычно, будет указан далее) число и запиши его во второй регистр". Потом будет "возьми число (адрес указан далее) и запиши в третий регистр". Потом, например, "вычти из числа в первом регистре число второго регистра и результат запиши снова в первый регистр". Потом "если в первом регистре сейчас ноль, поменяй число в счётчике адреса на число, которое сейчас находится в третьем регистре" (есть и такая команда).
Что, в итоге, произошло? Процессор взял два числа из памяти и сравнил их между собой. Если эти два числа равны (в этом случае после вычитания получился ноль), процессор вместо того, чтобы выполнить команду, которая должна была быть следующей, установил в регистре адреса новое число. Поэтому следующую команду он возьмёт из какой-то другой части памяти и там будет уже другая программа.
Конец пути
Ну а как всё это вывести на экран? Это уже просто. Существует видеокарта. Это отдельная схема со своей собственной памятью. При этом, допустим, 60 раз в секунду, видеокарта "сканирует" свою память и поочерёдно, число за числом, записывает сигнал в видеовыход. Только она не выдаёт число по 64 проводам (как мы это делали раньше) а сперва преобразует число: чем больше это число, тем сильнее видеокарта подаёт ток. В итоге мы получаем, что сила тока соответствует величине числа. Этот провод идёт к монитору. Монитор же, поочерёдно, выводит этот сигнал точка за точкой. В мониторе есть красные, зелёные и синие точки (очень мелкие, может потребоваться лупа). Чем сильнее ток в этот момент, тем ярче зажигается точка. Цвета смешиваются и выводится изображение.