Как работает компьютер, взгляд из 2026 года
Прошло уже много лет, как я прочитал книгу Чарльза Петсольда Код. Тайный язык информатики, в которой он описал как устроен компьютер, с точки зрения базовых принципов, а именно транзисторов. И подал он свой рассказ так увлекательно, что мне хотелось его повторить. Просто взять в руки проволоку, лампочки, батарейки, собрать простые реле, из них логику, затем заменить все это на транзисторы и начать собирать простую систему, например, которая умеет складывать 2 числа.
На картинки ниже, как раз показана схема, как выглядит устройство, которое складывает два числа, при этом есть ограничение каждой число не может быть больше 15.

При этом, я понимал, что это слишком сложный и муторный вопрос, у меня есть друзья, да и в интернете полно энтузиастов, которые прошли этот путь, и смогли собрать сумматор, кто-то продвинулся даже до полноценного арифметического ядра микропроцессора. Но все это очень много мелкой работы, собирать транзисторы руками, а их очень, очень, просто очень много.

На изображении выше показан логический элемент НЕ ИЛИ, который работает по принципу на выходе будет 1, если на входе оба сигнала 0, во всех остальных случаях он дает 0.
Этот элемент нужен, чтобы построить логический элемент ИЛИ, который уже используется для построение всей остальной математики.

В общем, чтобы не мучать себя проводами, а я признаться не умею и не особо то люблю паять, я решил попробовать собрать все это в системе симуляции электрических цепей.
Микропроцессор
Сборка началась с простого, соберу обычный сумматор, после того как я сделал этого, в книге пошел рассказ о том, что дальше мы можем научить его вычитать, сказано — сделано. Но раз у нас получилось сделать сложение и вычитание, то формально мы научили машину считать. Осталось только добавить память, чтобы организовать циклические операции, например, умножение это циклическое сложение, все мы помним со школы, что 2*5=2+2+2+2+2.
Но раз мы хотим научить нашу машину считать разные числа и делать разные операции нужно как то научить ее понимать, какую операцию мы делаем, и завертелось. Получилось полноценное арифметическое устройство.

Собрав 4битное арифметическое устройство, остался один шаг до создания процессора, нужно добавить память, управление и организовать минимальный вывод. Ну и главное, что бы это все оказалось компьютером, нужно научить процессор выполнять программы.
Все это хорошо и меня было уже не остановить, в отличие от ручной сборки, собирать процессор из логических блоков было просто, потому что я просто копировал их, не надо создавать каждый с нуля. И весь процесс выглядит как сборка конструктора лего.
Также создав 4битную версию, я понял, что для нормальной работы, нам понадобиться 8битная версия процессора, а для понимающих 8битная командная часть, 16 битная шина адреса памяти, чтобы реализовать 64кб памяти для компьютера. Думаю, многие современные люди, даже не представляют, что такое 64кб, ведь их телефоны уже давно имеют по 256 гигабайт памяти, а то и больше, а тут 64кб.
В общем сказано сделано, я взял за основу для себя, как ориентир, микропроцессор 6502, который использовался в компьютерах Apple 1 и Apple 2, а также Commodore 64 и приставках NES, которые на постсоветском пространстве были известны как Dendy и у меня получилось вот это.

На данной схеме отображено 22 544 транзистора, вернее тут изображен мой вариант процессора 6502, содержащий элементы, которые состоят из 22 544 транзисторов, и это было моей ошибкой!
Оригинальный процессор 6502 содержал всего 3500 транзисторов, но это были другие транзисторы, они были скажем так попроще с точки зрения технологии, имели издержки в виде сильного нагрева и т.д., но позволяли реализовать логику меньшим числом транзисторов и я этого не знал, но именно для симуляции транзисторной логики это оказалось критическим, так как работает моего процессора в симуляторе прогоняет сигнал по каждому отдельному элементу, то большое число транзисторов требует много времени на отработку, и в тоге мой процессор оказался не 100% аппаратно совместимым с 6502, а значит бинарные файлы от Apple ][ он запустить не сможет, кроме того он оказался примерно в 100 раз медленнее, реального.
Но оптимизацией работы, мы займемся позже, сразу забегая вперед скажу, что я ее победил. Было не просто, пришлось пожертвовать многим, но это удалось.
Компьютер
И так, я собрал процессор, но процессор это не компьютер, ему нужна память, нужны устройства ввода и вывода, как минимум клавиатура и монитор, желательно добавить устройства хранения информации и передачи. Итого план: монитор, клавиатура, внешние диски и модем.
Внешние устройства я не делал, я взял их из симулятора электрических цепей, но вот подключение к компьютеру (процессору) оказалось не простым, в реальной жизни было несколько вариантов решения задачи, и как оказалось я выбрал не лучший, и достаточно старый способ, я подключил все напрямую к процессору, тогда как в современных компьютерах, да и в компьютерах конца 70-х начала 80-х уже делали шину данных и внешние устройства подключали к ней.
Ве это следствие ошибки изначального проектирования устройства, если что я делал это в первый раз в жизни.
В общем у меня получилось собрать вот такую конструкцию.

И эта штука реально работает, но компьютер без программы это просто груда металлолома, а в моем случае просто красиво нарисованная картинка, даже на цветмет не сдать.
Программы
Значит надо написать какие-то программы, но как это сделать? Компьютер есть, но не умеет ничего! А ведь надо как то загрузить в память хоть какую то программу.
Вообще исторически это делали так, брали постоянную память ROM (Read Only Memory) и с помощью специального устройства записывали в нее биты, которые формировали программу. А компьютер знал, что при включении он должен взять ROM и выполнить программу, которая находиться по определенному адресу. Такие программы называют мониторами.
WOZ MONITOR — APPLE I ROM $FF00–$FFFF (256 bytes, 1976)
FF00: D8 58 A0 7F 8C 12 D0 A9
FF08: A7 8D 11 D0 8C 13 D0 C9
FF10: DF F0 13 C9 9B F0 03 C8
FF18: 10 0F A9 DC 20 EF FF A9
FF20: 8D 20 EF FF A0 01 B9 00
FF28: 02 09 80 20 EF FF C9 8D
FF30: D0 D4 8A 48 A9 AC 8D 11
FF38: D0 A9 A7 8D 11 D0 99 00
FF40: 02 0A 85 2B C8 B9 00 02
FF48: C9 8D F0 D4 C9 A3 90 F4
FF50: F0 F0 C9 BA F0 EB C9 D2
FF58: F0 3B 86 28 86 29 84 2A
FF60: B9 00 02 49 B0 C9 0A 90
FF68: 06 69 88 C9 FA 90 11 0A
FF70: 0A 0A 0A A2 04 0A 26 28
FF78: 26 29 CA D0 F8 C8 D0 E0
FF80: C4 2A F0 97 24 2B 50 10
FF88: A5 28 81 26 E6 26 D0 B5
FF90: E6 27 4C 44 FF 6C 24 00
FF98: 30 2B A2 02 B5 27 95 25
FFA0: 95 23 CA D0 F7 D0 14 A9
FFA8: 8D 20 EF FF A5 25 20 DC
FFB0: FF A5 24 20 DC FF A9 BA
FFB8: 20 EF FF A0 00 B1 24 20
FFC0: DC FF A5 24 29 07 10 02
FFC8: A9 8D 20 EF FF E5 24 A5
FFD0: 24 C5 28 A5 25 E5 29 B0
FFD8: 2B E6 24 D0 CE E6 25 4C
FFE0: B4 FF 48 4A 4A 4A 4A 20
FFE8: E5 FF 68 29 0F 09 B0 C9
FFF0: BA 90 02 69 06 2C 12 D0
FFF8: 30 FB 8D 12 D0 60 00 FF
FFFA: 00 00
FFFC: 00 FF
FFFE: 00 00
Для не посвященных это очень похоже на матрицу, просто набор цифр. Но на самом деле, эти цифры просто нули и единицы (для удобства работы они представлены в шестнадцатеричной системе счисления) который попадая на логические вентили пропускают сигнал к устройствам и все.
Такие программы умеют крайне мало, это вам не привычные операционные системы такие как Windows, MacOS или Linux. Вот список всего, что умеет делать мой монитор.

Понятно, что легче вам не стало, расскажу, монитор может прочитать ячейку памяти по адресу, может записать значение в ячейку памяти по адресу, можно посмотреть участок памяти, можно вывести участок памяти в виде кодов ассемблера, можно запустить программу с определенного участка памяти, можно прочитать диск (B или B2), можно сохранить участок памяти на диск и отформатировать диск. А также очистить экран и прочитать этот список команд. Все!
Это все, что у вас есть, чтобы работать, и что интересно именно так все и начиналось, все базовое появилось уже поверх этого, этого было достаточно, чтобы разработать язык Бейсик, а на нем сделать игры, разработать программное обеспечение для работы, текстовые и графические редакторы, программы для работы с компьютерными сетями и периферией, типа принтеры, мышки, джойстики.
Hello World!
По классике программирования, первая программа, которую пишут все, кто изучает программирование это Привет Мир! Осталось только понять, а как ее написать?
Нужно просто вызвать команду, которая отправляет в область памяти, которая связан с экраном (видеопамять) значения, которые при попадании в экран превратятся в букву, потому что каждая буква закодирована набором сигналов, и состоит из точек.
Но это не так просто, сначала надо научиться просто выводить символ, сразу скажу, я пропустил огромный кусок работы связанный с тем, чтобы вывести на экран просто точку.
; hello — пишет 'H' в экран ($8078, строка3) и зависает
.org $0300
LDI #$48
STA $8078
here:
JMP here
Вот код на ассемблере, который выводит символ на экран, просто один символ. Но это просто текст для удобства понимания кода, в реальности, это просто набор цифр, которые записаны в память начиная с адреса $0300.
Но это все до тех пор пока вы не сделаете полноценный код монитора, затем не напишите компилятор ассемблера, на ассемблере не напишите программы, например тот же текстовый редактор, его же у вас нет изначально. И так далее, по этому, что бы упростить себе жизнь, я попросил Claude помочь мне, я отправил ему свою электронную схему и говорю, вот есть такой процессор сделай мне для него монитор, ассемблер и редактор. И Claude разобрался со схемой и написал мне указанные продукты, после чего я попросил написать мне язык Бейсик - и с этим он тоже справился, и что интересно, у меня симуляция компьютера на чистом JS в браузере, для этого компьютера LLM разработала свой собственный ассемблер, и на нем написала язык Бейсик, на котором уже я могу сделать программу Hello World!

И так, я собрал компьютер из транзисторов, на ассемблере которого был разработан Бейсик, и на котором была написана программа Hello World!
Что дальше?
На самом деле сейчас уже есть следующие программы: компилятор ассемблера, текстовый редактор, бейсик, телнет терминал для выхода в сеть, игра змейка.
И все это доступно для изучения по адресу: cs.khanin.info – это мой симулятор электрических цепей, который умеет размещать на холсте транзисторы и собирать из них электрические цепи. Симулятор примитивный и умеет только простые транзисторыне схемы. Также вам доступен демо проект, который содержит мой комьютер.
Но! тут важная оговорка, для того, чтобы им можно было пользоваться у вас есть 3 режима симуляции цепи: Real Fast Trubo они работают так, Real – это реальное пропускание тока по цепи до каждого транзистора, мой процессор будет работать примерно в 1000 раз медленнее настоящего 6502. Fast – мы знаем булевы таблицы логических элементов, таких как OR, AND, XOR и тех, которые состоят из них. Симулятор понимает на какой уровень просчитать таблицы и не пропускает сигнал до транзисторов, а просто берет результат из таблиц. На самом деле все несколько сложнее, но примерно звучит так. Это позволяет получить отставание от реального 6502 примерно от 8 до 3 раз, округлено в 10 раз медленнее, то есть 0.1МГц. а это значит, что работать с Бейсиком вы еще сможете, а вот с Текстовым редактором или играть в игры чуть сложнее змейки уже нет. Fast – решение проблемы со скоростью, это фактически JS эмулятор моего процессора, который выполняет код без симуляции транзистора, и этот код дает максимальную отзывчивость в работе.
Надеюсь вам было интересно это читать.
PS. зачем это продуктовым аналитикам
При работе с современными командами, я столкнулся с тем, что люди не знают, как устроен компьютер, и как он работает. Некоторые даже верят, что компьютер умеет самостоятельно думать и умеет узнавать людей. Хотел бы я показать им, как протекают сигналы по транзистору и спросить, как это может узнавать людей... но это отдельная история.
Главное же, по моему мнению то, что люди, которые занимаются продуктовой аналитикой, да и вообще разработкой IT продуктов должны понимать, какие реально данные они получают от системы, и как правильно их трактовать чтобы принимать корректные управленческие решения, потому что часто люди не понимают, почему проводимый ими AB тест не заканчивается, а ведь просто компьютер не может нормально сбалансировать группы A и B и вывести эксперимент на статистическую значимость. Но это уже отдельная большая история.
Пишите комментарии, делитесь своим мнением, мне важно получить от вас обратную связь.
Практические методы юнит-экономики и финмоделирования
50€/год
менее 1€ в неделю · оплата раз в годА ещё: выбор темы оформления, настройка шрифта, печать статей и увеличение изображений.
Для доступа к материалам оформите подписку.
Если вы уже клиент, то просто входите.
* – оплата через Boosty позволяет оплачивать картами Мир, оплата через Stripe для международных карт Visa, Mastercard и т.д.
мы не храним ваш email, а только зашифрованный hash, что повышает безопасность вашей почты.