Код. Тайный язык информатики. Чарльз Петцольд

Как пишет автор в предисловии, эта «книга о том, как работают компьютеры». Петцольд старается избегать «изысканных метафор и сравнений». Он прямо пишет, что «компьютер представляет собой иерархию, в основании которой лежат транзисторы, а на вершине — информация, отображаемая на мониторе» — и именно об этом книга.

В первой части посмотрим на главы 1–14. За это время успеем узнать, что именно Петцольд подразумевает под кодом, и почему двоичные коды — особенные. Начиная с 4-й главы начнём строить электрические цепи с лампочками, а начиная с 10-й главы — логические. В конце первой части конспекта мы соберём цепь, которая будет уметь считать от 0 до 256 🤯

Глава 1. Верные друзья

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

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

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

Читателей знакомят с кодированием информации через азбуку Морзе. В ней самые частые буквы кодируются самыми простыми и короткими символами:

Таблица в направлении «буква алфавита → точки и тире азбуки Морзе»
Таблица в направлении «буква алфавита → точки и тире азбуки Морзе»

На письме азбука Морзе сводится ко двум символам. А…

Два чего угодно способны в соответствующих комбинациях передать любую информацию

Глава 2. Коды и комбинации

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

Диаграмма в направлении «точки и тире азбуки Морзе → буква алфавита»
Диаграмма в направлении «точки и тире азбуки Морзе → буква алфавита»

Из неё можно увидеть, что количество букв, которые можно закодировать, равно двойке в степени, равной количеству точек или тире:

Количество кодов = 2 Количество точек и тире

Значит, азбука Морзе — это двоичный код. Для двоичных кодов при подсчёте количества кодов используют степени 2.

Глава 3. Брайль и двоичные коды

В шрифте Брайля символы кодируются комбинациями от одной до шести выпуклых точек, расположенных в ячейке размерами 2х3. Шрифт Брайля — тоже двоичный код.

Любая точка может пребывать в одном из двух состояний: плоская или выпуклая

Общее число комбинаций шести точек, каждая из которых может быть плоской или выпуклой, равно 2^6 = 64
Общее число комбинаций шести точек, каждая из которых может быть плоской или выпуклой, равно 2^6 = 64

Многие из кодов несут двойную нагрузку в зависимости от контекста: интервалов между кодами, особых кодов переключений (shift codes) и escape-кодов.

Код переключения меняет смысл всех следующих кодов, пока его действие не будет отменено

Признак прописной буквы [escape-код, прим. автора конспекта] означает, что следующая за ним буква (и только она) должна интерпретироваться как прописная, а не строчная

К таким кодам часто прибегают при двоичном кодировании печатных символов.

Глава 4. Анатомия фонарика

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

Батарейка, лампа и разомкнутый провод, который играет роль переключателя
Батарейка, лампа и разомкнутый провод, который играет роль переключателя

Чтобы лампочка загорелась, цепь должна быть замкнутой. Переключатель управляет замыканием и размыканием цепи. По замкнутой цепи «течёт» поток заряженных частиц, электронов, от одного атому к другому.

Батарейки «заставляют» электричество течь по цепи против часовой стрелки, если цепь замкнута.

Химический состав батареек подобран так, что… на том конце батарейки, что помечен знаком «–», образуется избыток электронов, а на противоположном — …возникает их недостаток

Чтобы возобновить реакцию, избыточным электронам на отрицательном полюсе батарейки нужно обеспечить проход к ее положительному полюсу. …Реакция происходит только при наличии замкнутой электрической цепи

Электричество течёт по проводу, который сделан из особого материала, который проводит электричество — проводника. Материалы, которые плохо проводят электричество называются изоляторами.

Проводники «сопротивляются» течению тока — обладают сопротивлением (R). Чем выше сопротивление, тем меньше электронов течёт по цепи (I). У батареек есть потенциальная способность к выполнению работы — напряжением (U). Величины связаны законом Ома:

I = U / R

Лампочка горит, потому что

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

Переключатель отвечает за замкнутость цепи: выключен фонарик или нет, это тоже похоже на двоичный код.

Глава 5. Там, за поворотом

Попробуем построить электрическую схему для устройства, похожего на телеграф:

Когда переключатели соединены, соответствующая лампочка загорается; это позволяет передавать сообщения азбукой Морзе на расстоянии
Когда переключатели соединены, соответствующая лампочка загорается; это позволяет передавать сообщения азбукой Морзе на расстоянии

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

Здесь буквой V обозначается соединение батареи отрицательным контактом с землёй
Здесь буквой V обозначается соединение батареи отрицательным контактом с землёй

Чем длиннее провода, тем больше сопротивление, меньше ток, и тусклее светит лампа. Эта проблема относится и к настоящему телеграфу.

Глава 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 — это число битов.

Чаще всего двоичный код в жизни можно увидеть на штрих-кодах. В битовом представлении срез штрих-кода выглядит так:

Штрих-код представляет собой набор 95 битов; эти же цифры можно найти под штрих-кодом
Штрих-код представляет собой набор 95 битов; эти же цифры можно найти под штрих-кодом

Биты также играют роль в логике, где под 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 обозначается так:

Обозначение вентиля AND
Обозначение вентиля AND

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

Обозначение вентиля OR
Обозначение вентиля 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:

Результат равен 1, если сигнал подаётся лишь на один из входов
Результат равен 1, если сигнал подаётся лишь на один из входов

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

Обозначение вентиля XOR
Обозначение вентиля XOR

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

Схема полусумматора
Схема полусумматора

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

Схема полного сумматора (full-adder)
Схема полного сумматора (full-adder)

Глава 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.

Схема для вычитания будет такой:

Если надо выполнить вычитание, сигнал Выч будет равен 1. При вычитании входы В инвертируются, а к результату сумматора прибавляется 1
Если надо выполнить вычитание, сигнал Выч будет равен 1. При вычитании входы В инвертируются, а к результату сумматора прибавляется 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). Этот триггер запоминает один бит информации и хранит его для дальнейшего использования:

Clock = «запомнить этот бит»; можно считать эту схему «памятью» в 1 бит
Clock = «запомнить этот бит»; можно считать эту схему «памятью» в 1 бит

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

Первый блок работает как D-триггер, но содержимое входа Данные сохраняется, когда сигнал Clk равен 0. Выходы первого блока — это входы для второго, их содержимое сохраняется при обращении сигнала Clk в 1
Первый блок работает как D-триггер, но содержимое входа Данные сохраняется, когда сигнал Clk равен 0. Выходы первого блока — это входы для второго, их содержимое сохраняется при обращении сигнала Clk в 1

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

Если совместить подряд 3 делителя частоты…

Схема с тремя последовательно соединёнными делителями частоты
Схема с тремя последовательно соединёнными делителями частоты

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

Графики сигнала Clk и выходных сигналов каждого из делителей
Графики сигнала Clk и выходных сигналов каждого из делителей

…То получим схему, которая…

считает в двоичном формате от 0 до максимального числа, зависящего от количества триггеров в схеме

Что дальше

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

Ссылки по теме