2.2 Почему компьютер работает в двоичной системе счисления

Ответ на этот вопрос не так прост, как кажется. Для этого нам потребуется:

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

И мы найдём ответ!

В общем, работы у нас с вами будет много, но мы постарались, чтобы к концу параграфа у вас в голове сложилась цельная картина.

Давайте приступим.

Назад в школу

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

Для начала дадим определение системе счисления.

Система счисления — это способ записи чисел с помощью определённого набора символов (цифр) по заданным правилам.

Мы — в смысле человечество — работаем в десятичной системе счисления. То есть записываем числа, оперируя всего 10 цифрами: от 0 до 9. Для этого мы группируем их по разрядам, каждый из которых обозначает позицию той или иной цифры в числе и помогает нам называть число.

Вот как раскладывается по разрядам число пять тысяч триста сорок пять:

5

3

4

5

тысячи

сотни

десятки

единицы

А ещё каждый разряд можно выразить как 10 в степени, соответствующей позиции этого разряда в числе (начиная с 0).

Добавим ещё ряд в нашу табличку:

5

3

4

5

тысячи

сотни

десятки

единицы

То есть число 5345 можно представить так:

5 × + 3 × + 4 × + 5 × = 5 × 1000 + 3 × 100 + 4 × 10 + 5 × 1

Пока не ушли далеко — давайте дадим определение разряда:

Разряд — структурный элемент представления чисел в позиционных системах счисления. Когда мы говорим «N-значное число», то имеем в виду, что в нём N разрядов.

Например, 200 — трёхзначное число, в нём 3 разряда.

Считается, что человечество использует десятичную систему, потому что у нас 10 пальцев на руках. Если бы мы произошли от разумных осьминогов, то считали бы в восьмеричной системе счисления. Ну или в четверичной, если бы использовали в качестве рук всего четыре щупальца. Идею вы поняли.

Нюанс

Тут стоит оговориться, что в истории человечества были народы, которые отвергали десятичную систему счисления.

Например, вавилоняне пользовались шестидесятеричной, майя — двадцатеричной, а некоторые народы — пятеричной.

Теперь у нас достаточно контекста, чтобы поговорить конкретно про двоичную систему счисления.

Нули и единицы

Перенесёмся на планету Бибус. На ней живут разумные ребята, но по воле эволюции (или Творца, мы не настаиваем) у них всего лишь два пальца на руках. Впрочем, это не помешало им построить величественную цивилизацию: с алгеброй, геометрией и даже местным аналогом МФЦ.

нули

Считают бибустяне так:

0

1

Всё, приехали — цифры закончились. Как быть? А так же, как и на Земле: дошли до последней цифры — переходим к следующему разряду (9 → 10). Посчитаем до пяти вместе с бибустянами:

0

1

10

11

100

101

Да, цифр у бибустян поменьше, но за это приходится расплачиваться более длинными числами: одноразрядное десятичное число 8 в двоичной системе требует четырёх разрядов (1000), а трёхразрядное 150 — восьми (1001 0110).

Но что хорошо — в двоичной системе тоже можно разложить число по разрядам со степенями:

1

0

0

1

0

1

1

0

Проверяем. Нули сразу опустим, так как умножение на 0 даёт дырку от бублика:

1001 0110 = 1 × + 1 × + 1 × + 1 × = 128 + 16 + 4 + 2 = 150

1.1

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

Программируем без электричества

Представьте: на дворе начало XIX века, вы инженер и вам нужно сделать так, чтобы ткацкий станок мог быстро выдавать ткань с разными узорами.

Из ресурсов у вас — смекалка и бумага. Электричества ещё нет, учёных — единицы. Чего в избытке — так это напудренных мужчин в кокетливых париках, но нашему делу они не помогут.

Давайте думать.

Как вообще работает ткацкий станок: натянуты вертикальные нити (основа), между ними ряд за рядом проходят поперёк горизонтальные нити (уто́к). Чтобы создать узор, надо в нужный момент поднимать одни нити основы и оставлять на месте другие. Так уток проходит поверх одних и под другими, создавая переплетение.

Предположим, мы хотим нарисовать узор в виде креста на лоскуте 5 × 5:

1.1

Тогда в ряду 1 должны быть подняты нити 1 и 5. В ряду 2 — нити 2 и 4. И так далее. Таких узоров нам нужно сделать миллион. Поднимать нити вручную не вариант — устанет рука. Значит, нужно как-то автоматизировать процесс.

Думаем дальше.

А что, если нам сделать 5 картонных карточек (по количеству рядов), нарисовать на них таблицу и в тех местах, где нужно поднимать нить, сделать отверстия? Ну и, предположим, у нас будут специальные щупы:

  • если щуп проходит через отверстие, то нажимает кнопку и нить поднимается;
  • если упирается в картон — нить остаётся на месте.

Тогда можно просто правильно сложить карточки стопкой и после каждого вытканного ряда убирать по одной.

Идея огонь! Благодаря ей мы только что открыли три вещи:

  • ткацкий станок Жаккара;
  • перфокарту;
  • кодирование информации.

Остановимся подробнее на кодировании. У нас на перфокарте два состояния: нет отверстия и есть отверстие. Их можно представить в виде нуля и единицы:

1.1

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

На последнем остановимся подробнее.

Думаем об истине и лжи

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

Можно рассматривать любые высказывания как переменные, которые могут принимать всего два значения: истина (1) или ложь (0). Тогда фразу «Пока гром не грянет, мужик не перекрестится» можно выразить так:

1 (грянул гром) 1 (мужик перекрестился).

Составим таблицу возможных комбинаций:

Гром

Ритуал

1

1

1

0

0

1

0

0

Получается, человечество утратило три других варианта поговорки:

  • «Гром грянул — а мужик не крестится»
  • «Гром не грянул — а мужик крестится»
  • «Грома нет, не крестится мужик»

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

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

В первый день прогремел гром, но Агафон не перекрестился. На другой день ни грома, ни крестного знамения не было. На третий — Агафон перекрестился, но гром не прогремел. А на четвёртый — всё совпало, о чём мы радостно написали в дневнике.

Получится такая табличка:

Гром

Ритуал

Запись в дневнике

1

0

0

0

0

0

0

1

0

1

1

1

Такую операцию назовём И (конъюнкция): у нас же должны совпасть условие 1 И условие 2.

Теперь изменим ситуацию. Будем делать запись в дневничке каждый раз, когда прогремел гром ИЛИ Агафон перекрестился. Вот что у нас получится:

Гром

Ритуал

Запись в дневнике

1

0

1

0

1

1

1

1

1

0

0

0

Как вы догадались, эта операция называется ИЛИ (дизъюнкция): у нас должно произойти ИЛИ условие 1, ИЛИ условие 2.

Есть ещё одна операция — НЕ. Но на ней мы останавливаться не будем.

В общем, вы только что изобрели алгебру логики. Её основоположником был англичанин Джордж Буль, поэтому она называется ещё «булева алгебра». А было это в 1847 году.

Любопытный факт

В программировании есть булевый тип данных (Boolean), названный в честь Буля. Как вы можете догадаться, у него всего два возможных значения — True и False.

Он используется для описания ситуаций, когда нам нужно что-то сделать при наступлении определённого условия. Этот инструмент называется условная конструкция.

Вот как мы закодировали бы нашу поговорку с помощью Python. Со строчки if has_thunder and has_cross — как раз начало условной конструкции и перечисление условий для её «срабатывания»:

1def proverb(has_thunder: bool, has_cross: bool) -> bool:
2
3    has_entry = False  # изначально записи в дневнике нет.
4
5    if has_thunder and has_cross:
6        has_entry = True
7
8    return has_entry
9
10proverb(False, False)  # грома нет и не крестится → записи нет (False)
11proverb(True, False)   # гром есть, но не крестится → записи нет (False)
12proverb(True, True)    # гром есть и крестится → запись есть (True)

Булеву алгебру пока отложим в сторонку, к ней мы ещё вернёмся через 90 лет. Пока сделаем маленький шаг назад, в 1844 год, и переместимся в США.

Усиливаем сигнал

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

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

Давайте думать, как решить эту проблему.

Буквально 20 лет назад в Европе совершили открытие: если железный прут обмотать медной проволокой и пустить по ней ток, то он получит свойства магнита — начнёт притягивать к себе другие кусочки железа.

Кто был этим героем?

Это эволюция идеи, к ней причастны трое учёных.

Первым был датский физик Ханс Кристиан Эрстед. В 1820 году он заметил, что магнитная стрелка компаса отклоняется, если рядом проходит электрический ток. Это было первое прямое доказательство того, что ток создаёт магнитное поле.

В том же 1820 году французский физик Андре-Мари Ампер показал, что токи в проводниках могут взаимодействовать друг с другом через магнитные поля.

А уже в 1824 году английский учёный Уильям Стёрджен создал первый электромагнит (мы описали его выше) и показал, что магнитное поле можно сделать гораздо сильнее, чем у постоянного магнита.

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

Электромагнит замыкает цепь, включая локальный источник питания, и ток с него идёт дальше, пока не начнёт затухать. А там уже новый электромагнит. И так далее, пока не дойдём до приёмника.

Изобразим схематично:

1.1

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

И что особенно хорошо: если электричество перестаёт течь, то электромагнит моментально прекращает работу и цепь тут же размыкается, заставляет другие электромагниты по цепочке разорвать свои цепи.

Ну что, задача решена, и мы молодцы! Мы только что изобрели:

  • телеграф;
  • электромеханическое реле.
Пара слов об изобретателях реле и телеграфа

Первый прототип реле придумал американский учёный Джозеф Генри в 1835 году. Это было устройство, которое позволяло замыкать и размыкать слабым током более мощную электрическую цепь.

Через несколько лет профессор химии Леонард Гейл развил идеи Генри и помог Морзе улучшить его телеграф.

Электромеханическое реле — то самое устройство, которое под воздействием тока размыкает или замыкает цепь. Чтобы вам было проще представить, вот как оно выглядит схематично:

1.1

В дальнейшем мы будем рисовать реле схематично, вот так:

1.1

Как выглядит реле в реальной жизни

Вообще их два вида — электромеханическое и твердотельное.

Вот электромеханическое:

Источник

А вот твердотельное:

Источник

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

Объединяем идеи

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

Для начала вы соединяете два реле последовательно:

1.1

Если включить только верхний выключатель, первое реле замкнётся. А второе — нет: второй выключатель разомкнутый, цепь прерывается, лампочка не загорается.

Если включить только нижний выключатель, то лампочка тоже не загорится: цепь не замкнётся, и будет разомкнуто и первое, и второе реле.

А вот если включить оба — лампочка загорится.

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

Первый выключатель

Второй выключатель

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

0

0

0

1

0

0

0

1

0

1

1

1

Ого! Получается, последовательное подключение реле в электрической цепи дало нам такой же результат, что и булев оператор И!

Теперь соединим реле параллельно:

1.1

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

Это даёт нам такую таблицу:

Первый выключатель

Второй выключатель

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

0

0

0

1

0

1

0

1

1

1

1

1

То есть параллельная схема подключения соответствует оператору ИЛИ!

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

Поздравляем, вы объединили две идеи и совершили мощный прорыв. Теперь у нас есть знание, которое поможет построить первую электронную вычислительную машину.

В реальности это открытие совершил математик и электротехник Клод Шеннон, — хотя и работал только с теоретическим материалом, не собирая схемы на практике. Тем не менее, это принесло ему титул отца «информационного века».

Чем ещё он знаменит?

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

А ещё он занимался криптографией, теориями надёжности связи и построил ряд изобретений вроде механической мыши-робота и жонглирующих машин.

И и ИЛИ ещё называют логическими вентилями. В дальнейшем на схемах мы будем обозначать их так:

1.1

Их можно комбинировать между собой и создавать более сложные схемы. Совсем скоро нам это пригодится!

Создаём первую вычислительную машину

Мы по-прежнему в 1937 году. Как и Шеннон, играемся с реле. Сидим себе спокойно на кухне, соединяем их то так, то эдак.

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

И здорово, что их очень просто складывать: начинаем справа налево. Если у нас два нуля или ноль и единица — записываем сумму. Если две единицы — записываем ноль, единицу держим в уме и переносим в следующий разряд:

10 + 0 = 10

10 + 1 = 11

11 + 1 = 100

Запишем эту идею в виде таблицы:

Сумма (S)

0

1

0

0

1

1

1

0

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

Его можно собрать с помощью вентилей ИЛИ и И-НЕ. Последний мы не разбирали, но он ведёт себя как противоположность И. Вот так:

Значения входов

0

1

0

1

1

1

1

0

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

1.1

А вот как выглядит схема исключающего ИЛИ (ИСКЛ. ИЛИ):

1.1

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

1.1

Как суммировать два числа — разобрались. Теперь подумаем, как переносить разряд. На ум приходит такая табличка:

Перенос (С)

0

1

0

0

0

1

0

1

А, ну тут всё понятно — это логический вентиль И. То есть, чтобы сложить два двоичных числа, нужно подключить друг к другу ИСКЛ. ИЛИ и И:

1.1

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

Поздравляем, вы только что собрали устройство, которое может складывать два двоичных одноразрядных числа.

Похожее устройство собрал у себя на кухне математик и инженер компании Bell Labs Джордж Стибиц. Он взял два старых реле, две батареи и две лампочки, изготовил пару примитивных кнопок, кое-как закрепил всё это на доске, соединил проводами — и получил полусумматор.

Поскольку дело происходило на его кухне, устройство получило название Model K (kitchen). Выглядело оно так:

Кухонный» полусумматор Стибица теперь музейный экспонат. Источник

Кажется, ерунда, но благодаря ему кибернетика сделала огромный шаг вперёд.

Если Клод Шеннон показал, что принципы булевой алгебры можно реализовать с помощью электрических цепей, то Стибиц воплотил эту идею в жизнь.

Более того, он показал устройство руководству Bell Labs, и компания утвердила проект по разработке первого электромеханического калькулятора для комплексных чисел — CNC (Complex Number Calculator).

Калькулятор был построен к 1940 году и стал первым компьютером, к которому подключили удалённые терминалы по телетайпу. А уже через год немецкий учёный Конрад Цузе собрал из реле не просто калькулятор, но полноценный двоичный компьютер — Z3.

Пожилой герр Цузе и многочисленные реле его компьютера. Источник

Реле использовались до середины 1940-х годов: например, в компьютере Harvard Mark I, созданном в 1944 году. А вот построенный в 1945 году ENIAC был уже полностью электронным: к тому времени уже появились более совершенные компоненты. Но суть у них та же что и у реле, и работают они с «нулями» и «единицами» — наличием и отсутствием электрического сигнала.

И из них тоже можно собирать логические вентили. Просто они более компактные и позволяют проводить вычисления быстрее. Рассмотрим их чуть подробнее в следующем параграфе. А заодно — компьютеры, которые из них состояли.



Чтобы добавить в заметки выделенный текст, нажмите Ctrl + E
Предыдущий параграф2.1. О чём пойдёт речь в этой главе
Следующий параграф2.3. Как эволюционировали вычислительные компоненты компьютеров