Код. Тайный язык информатики. Чарльз Петцольд
Как пишет автор в предисловии, эта «книга о том, как работают компьютеры». Петцольд старается избегать «изысканных метафор и сравнений». Он прямо пишет, что «компьютер представляет собой иерархию, в основании которой лежат транзисторы, а на вершине — информация, отображаемая на мониторе» — и именно об этом книга.
В первой части посмотрим на главы 1–14. За это время успеем узнать, что именно Петцольд подразумевает под кодом, и почему двоичные коды — особенные. Начиная с 4-й главы начнём строить электрические цепи с лампочками, а начиная с 10-й главы — логические. В конце первой части конспекта мы соберём цепь, которая будет уметь считать от 0 до 256 🤯
Глава 1. Верные друзья
Код — это система для обмена информацией между людьми и машинами, то есть средство коммуникации. Код полезен, если выполняет задачу, с которой не справляются другие коды.
Звуки, издаваемые при произнесении слова, — это код, понятный любому, кто способен услышать наш голос и понимает язык, на котором мы говорим. Мы называем этот код речью. Для слов, изображаемых на бумаге, существует другой код — в виде написанных или на- печатанных символов. Мы называем этот код письмом или текстом
Для общения люди используют множество различных кодов, потому что одни коды иногда удобнее других. Например, устную речь нельзя сохранить на бумаге, поэтому вместо нее мы применяем письмо
Читателей знакомят с кодированием информации через азбуку Морзе. В ней самые частые буквы кодируются самыми простыми и короткими символами:

На письме азбука Морзе сводится ко двум символам. А…
Два чего угодно способны в соответствующих комбинациях передать любую информацию
Глава 2. Коды и комбинации
Чтобы воспринимать сообщение, написанное морзянкой, проще использовать не таблицу выше, а другую, в обратном направлении «точки и тире азбуки Морзе → буква алфавита».

Из неё можно увидеть, что количество букв, которые можно закодировать, равно двойке в степени, равной количеству точек или тире:
Количество кодов = 2 Количество точек и тире
Значит, азбука Морзе — это двоичный код. Для двоичных кодов при подсчёте количества кодов используют степени 2.
Глава 3. Брайль и двоичные коды
В шрифте Брайля символы кодируются комбинациями от одной до шести выпуклых точек, расположенных в ячейке размерами 2х3. Шрифт Брайля — тоже двоичный код.
Любая точка может пребывать в одном из двух состояний: плоская или выпуклая

Многие из кодов несут двойную нагрузку в зависимости от контекста: интервалов между кодами, особых кодов переключений (shift codes) и escape-кодов.
Код переключения меняет смысл всех следующих кодов, пока его действие не будет отменено
Признак прописной буквы [escape-код, прим. автора конспекта] означает, что следующая за ним буква (и только она) должна интерпретироваться как прописная, а не строчная
К таким кодам часто прибегают при двоичном кодировании печатных символов.
Глава 4. Анатомия фонарика
На примере фонарика рассмотрим действие электричества. Простейшая схема фонарика может быть такой:

Чтобы лампочка загорелась, цепь должна быть замкнутой. Переключатель управляет замыканием и размыканием цепи. По замкнутой цепи «течёт» поток заряженных частиц, электронов, от одного атому к другому.
Батарейки «заставляют» электричество течь по цепи против часовой стрелки, если цепь замкнута.
Химический состав батареек подобран так, что… на том конце батарейки, что помечен знаком «–», образуется избыток электронов, а на противоположном — …возникает их недостаток
Чтобы возобновить реакцию, избыточным электронам на отрицательном полюсе батарейки нужно обеспечить проход к ее положительному полюсу. …Реакция происходит только при наличии замкнутой электрической цепи
Электричество течёт по проводу, который сделан из особого материала, который проводит электричество — проводника. Материалы, которые плохо проводят электричество называются изоляторами.
Проводники «сопротивляются» течению тока — обладают сопротивлением (R). Чем выше сопротивление, тем меньше электронов течёт по цепи (I). У батареек есть потенциальная способность к выполнению работы — напряжением (U). Величины связаны законом Ома:
I = U / R
Лампочка горит, потому что
Если сопротивление провода невелико, он раскаляется и начинает светиться, поскольку электрическая энергия в нем преобразуется в тепловую
Переключатель отвечает за замкнутость цепи: выключен фонарик или нет, это тоже похоже на двоичный код.
Глава 5. Там, за поворотом
Попробуем построить электрическую схему для устройства, похожего на телеграф:

Или используя схему с заземлением:

Чем длиннее провода, тем больше сопротивление, меньше ток, и тусклее светит лампа. Эта проблема относится и к настоящему телеграфу.
Глава 6. Телеграф и реле
Мгновенная связь появилась относительно недавно и началась с телеграфа.
…Суть электрического телеграфа проста: вы делаете нечто на одном конце провода, в результате чего на другом конце провода что-то происходит
Основа телеграфа — электромагнит. Замыкание переключателя на одном конце «включает» электромагнит на другом.
Когда телеграфный ключ нажат, электромагнит тянет подвижный металлический молоточек вниз, и раздается звук одного тона («тик»). Когда ключ отпущен, электромагнит выключается, и молоточек возвращается в исходное положение, производя звук другого тона («так»). Быстрое чередование звуков («тик-так») соответствует точке, медленное — тире

Провода тянуть бесконечно нельзя, поэтому приходится организовывать ретрансляцию — повторение сообщения для передачи дальше. Для этого используется реле.

Глава 7. Великолепная десятка
Выбор десятичной системы счисления был произвольным. Но в десятичной системе (в отличие от той же римской) был ноль, который позволил использовать позиционную запись и облегчил умножение и деление.
Так как десятичная система позиционная, каждая цифра в записи числа — это количество соответствующих степеней десятки:
4825,8 = 4 * 103 + 8 * 102 + 2 * 101 + 5 * 100 + 8 * 10-1
А также:
Преимущество позиционной записи не в том, что она хорошо работает в десятичной системе счисления, а в том, что она хорошо работает в системах счисления, основанных не на десяти
Глава 8. Альтренативы десяти
В десятичной системе счисления круглыми числами мы считаем те, которые заканчиваются на 0: 10, 100, 1000… Такие числа — это произведение 10 на себя.
В других системах счисления круглые числа получаются по тому же принципу. В двоичной, например:
- 102 = 2 × 1
- 1002 = 2 × 2
- 10002 = 2 × 2 × 2
В многозначном двоичном числе позиции цифр соответствуют степеням двойки
Провод, лампа и переключатель из прошлых глав тоже могут быть представлены в двоичном виде:
Если по проводу течет ток, двоичная цифра равна 1. Если тока нет… 0
Если переключатель включен, двоичная цифра равна 1. Если выключен… 0
Если лампочка горит, двоичная цифра равна 1. Если не горит… 0
Двоичное число — это бит.
Глава 9. За битом бит
Двоичная система счисления — простейшая система. Бит — одна двоичная цифра — это также минимально возможное количество информации.
Одиночный бит — это выбор из двух возможностей: да или нет. Всё, что можно свести к такому выбору, можно представить набором битов.
Чем больше битов используется, тем больше доступных вариантов выбора (кодов). В двоичной системе число кодов (N) — это:
N = 2b
…где b — это число битов.
Чаще всего двоичный код в жизни можно увидеть на штрих-кодах. В битовом представлении срез штрих-кода выглядит так:

Биты также играют роль в логике, где под 1 и 0 представляют истину и ложь.
Глава 10. Логика и переключатели
Традиционная алгебра работает с числами, булева алгебра работает с множествами.
В булевой алгебре знак «+» (или OR) означает объединение множеств, символ «×» (или AND) означает пересечение множеств. В ней работают коммутативность, ассоциативность и дистрибутивность.
Пустое множество означается нулём, 0. Единица — полное множество, всё, о чём идёт речь. Для пересечения справедливо:
0 x 0 = 0
0 x 1 = 0
1 x 0 = 0
1 x 1 = 1
Для объединения:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 1
Операцию пересечения можно представить в виде электрической цепи, где два переключателя соединены последовательно:

Для объединения подойдёт цепь с двумя параллельными переключателями:

Глава 11. Вентили, которые не протекают
Соединение нескольких реле лежит в основе построения логических вентилей. Например, для построения AND:

Символически вентиль AND обозначается так:

Если соединить реле параллельно, а не последовательно, получится вентиль OR, который обозначается так:

Если же лампочка горит, когда переключатель разомкнут, и тухнет, когда переключатель замкнут, получится инвертор:

Вентиль NOR работает, как вентиль AND с двумя инверторами на входах:
!A × !B = !(A + B)
Вентиль OR с инвертированными входами — это NAND:
!A + !B = !(A × B)
Последние два выражения — это законы де Моргана. Они помогают упрощать цепи.
Глава 12. Двоичный сумматор
Сложение — основное арифметическое действие, а также…
Практически единственное действие, которое выполняют компьютеры
Таблицу сложения двоичных чисел удобно делить на две: таблицу разряда суммы и таблицу разряда переноса:
Сумма | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
Перенос | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
Таблица переноса это работа вентиля AND, для работы суммы нам нужна схема XOR:

Обозначается эта схема так:

И тогда схема суммирования:

Это полусумматор (half-adder). Называется он так, потому что он не прибавляет к сумме возможный разряд переноса от предыдущего суммирования. Чтобы сложить 3 двоичных цифры, нужны 2 полусумматора и вентиль OR:

Глава 13. А как же вычитание?
Сперва научимся вычитать без заимствования из старшего разряда:
253 – 176 <=>
253 – 176 + 1000 – 1000 <=>
253 – 176 + 999 + 1 – 1000 <=>
253 + (999 – 176) + 1 – 1000 <=>
253 + 823 + 1 – 1000 <=>
76 + 1 = 77
При вычитании двоичных чисел используется такой же метод, только вместо дополнения до 9, используется дополнение до 1.
Схема для вычитания будет такой:

Для записи отрицательных чисел используется дополнение до двух, когда отрицательные числа становятся после последнего возможного положительного числа:
0 00000000
1 00000001
…
126 01111110
127 01111111
-128 10000000
-127 10000001
…
-2 11111110
-1 11111111
Диапазон чисел: от -128 до +127, старший значащий бит — это знаковый разряд.
Чтобы вычислить дополнение до двух, нужно посчитать дополнение до единицы и прибавить 1 или, что эквивалентно, инвертировать все цифры и прибавить 1
Эта система позволяет выражать положительные и отрицательные числа без знака «минус», а также складывать положительные и отрицательные числа, используя только правила сложения
Глава 14. Обратная связь и триггеры
Соединение с обратной связью (feedback) — это соединение, в котором выход является также одним из его входов. Триггер (flip-flop) — соединение, которое сохраняет информацию.
Он снабжает электрическую схему памятью, в которой хранится информация о том, что в этой схеме происходило раньше
У простейшего триггера (RS-триггера), два входа S (set) и R (reset). Он запоминает, какой из двух входов был последний раз под напряжением.
Триггер, который запоминает значение в конкретный момент времени, это D-триггер со срабатыванием по уровню (data). Этот триггер запоминает один бит информации и хранит его для дальнейшего использования:

В таком триггере, если сигнал Данные изменится, пока сигнал Clk равен 1, изменения будут отражаться на выходах Q и !Q. Если мы хотим, чтобы выход менялся только, когда сигнал Clk переходит из 0 в 1, то нам нужен триггер со срабатыванием по фронту (edge-trigger):

Когда выход !Q соединён со входом D (data), а ко входу Clk подведён осциллятор, мы получаем делитель частоты (frequency divider). Он делит частоту осциллятора на 2. Выход делителя может быть совмещён со входом Clk следующего делителя, тогда частота осциллятора будет делиться на 2количество делителей.
Если совместить подряд 3 делителя частоты…

…И считать их выходы…

…То получим схему, которая…
считает в двоичном формате от 0 до максимального числа, зависящего от количества триггеров в схеме
Что дальше
В следующей части конспекта мы прочитаем оставшиеся главы 15–25. В них мы соберём первую память, которая сможет хранить информацию, а потом подключим её к сумматору. Создадим первый процессор, на основе которого сделаем примитивный компьютер с вводом и выводом.