Сумма частей |
Я написал эту статью, чтобы объяснить своим друзьям, не являющимся техническими специалистами, чем я занимаюсь в своей повседневной работе. Я старший программист. Моя ежедневная рутина включает в себя размышления о компьютерах, программирование компьютеров, тестирование компьютеров и ругань на компьютеры. Я хотел объяснить, что такое программа и как она работает, но в итоге я перешел на очень низкий уровень, объясняя, как от кучи проводов и электронных сигналов перейти к полностью функционирующему компьютеру.
Компьютер — это черный ящик, который может быть размером с часы или размером с картотечный шкаф. Внутри него живет гремлин, который никогда не спит, не ест и не пьет, но способен делать и знать гораздо больше, чем вы когда-либо будете способны. Шучу — есть гремлин, но на самом деле он ничего не «знает» и не «делает» сам по себе: он просто следует заданному шаблону заранее определенных инструкций, результат которых, безусловно, больше, чем сумма его частей.
Подумайте о языке и о том, как люди решили и согласовали сложную систему сложных значений, основанную на крошечных кусочках. Мы коллективно согласились, что буквы имеют письменное представление и звук при произнесении. Они довольно дерьмовые сами по себе и на самом деле мало что вытворяют. Однако вы можете комбинировать буквы в слова, которые на самом деле весьма полезны. Они позволяют вам использовать простой звук для представления чего-то другого вместо того, чтобы указывать на него или имитировать его. Но у слов тоже есть свои ограничения, потому что их значение легко спутать без соответствующего контекста. Что значит «мясо»?
- Я хочу немного мяса?
- Где мясо?
- Ты мне не нравишься и я превращу тебя в мясо?
Чтобы обойти это, мы согласовываем грамматическую структуру, а затем упорядочиваем слова в предложения, что позволяет нам указать контекст нашего употребления слов, значительно уменьшая двусмысленность и не давая нам съесть друг друга. Буквы, слова, предложения, язык. Фантастически универсальная и замысловато красивая система может быть построена постепенно из крошечных строительных блоков, которые сами по себе почти бесполезны. Компьютеры — это просто еще один пример такой системы эмерджентного поведения.
На самом атомарном уровне компьютеры состоят из транзисторов, образующих логические вентили. Транзистор — это обычный компонент схемы (например, переключатель, лампочка, резистор или диод), который может усиливать электронный вход, чтобы вызвать электронный выход — проще говоря, это электронный переключатель. Несколько транзисторов могут быть объединены в схему для формирования логического элемента. Логические элементы преобразуют комбинацию нескольких входных сигналов в один выходной сигнал, который называется «включено» (1) или «выключено» (0) в двоичном виде. Логический элемент ИЛИ выдаст 1, если один (или оба) из входов равен 1, тогда как логический элемент И выдаст 1, только если оба входа равны 1. Существует много различных типов логических элементов, и они во много раз полезнее, когда сочетаются между собой интересными и сложными способами. Чипы (эти черные штучки с металлическими ножками) содержат готовые схемы с логическими вентилями, расположенными определенным образом для выполнения определенных задач, таких как синхронизация, управление двигателем или регулировка напряжения.
Электронные сигналы в этом низкоуровневом контексте схемы могут быть только «включены» или «выключены» — 1 или 0. Это не очень полезно для нас, людей. Чтобы быть полезным, компьютер должен представлять более двух состояний. Люди справились с этим очевидным ограничением, изобретя (или, точнее, открыв) двоичные числа как способ представления чисел, используя только цифры 1 и 0.
Люди обычно используют десятичную систему с числами от 0 до 9. Если вы хотите представить число больше 9, вам нужно добавить еще один «разряд», и это делается путем размещения большего количества чисел рядом. 7 рядом с 3 рядом с 4 означает 734, где 7 представляет сотни, 3 представляет десятки, а 4 представляет единицы, или 7 100, 3 10 и 4 1. Вы заметили, что в десятичной системе каждое «место» выражается в степени 10: от 100 до 10 и до 1? Базовое количество цифр и приращений «место» известно как «база» системы счисления — десятичная система счисления — это система счисления с основанием 10, а двоичная — система счисления с основанием 2.
Этот процесс «мест», имеющих заранее определенную величину, работает и с двоичными цифрами. 101 в двоичном формате эквивалентно 5 в десятичном. Двоичные числа работают так же, как и десятичные, за исключением того, что каждое «место» увеличивается в степени 2: 4, затем 2, а затем 1. Читая 101 слева направо, мы получаем 1x 4, 0x 2 и 1x 1. Почему степени двойки? Это потому, что у вас есть только 0 или 1 в каждом «месте» (2 возможных значения), тогда как в десятичной системе у вас есть от 0 до 9 в каждом «месте» (10 возможных значений). Кстати, Decimal 734 — это 1011011110 в двоичном виде — 1x 512, 0x 256, 1x 128, 1x 64, 0x 32, 1x 16, 1x 8, 1x 4, 1x 2, 0x 1.
Хорошо, если вы до сих пор следите, но как абстрактные представления чисел помогают нам изобретать Google или Call of Duty 37? Наши схемы и логические вентили по-прежнему представляют только 2 состояния, чего явно недостаточно, чтобы сделать что-то полезное. Мы можем получить гораздо больше от наших вентилей, соединив вместе несколько логических вентилей, используя выход одного вентиля в качестве входа для следующего. Если вы приписываете значение размещению этих ворот, тогда можно иметь подсхемы ворот, которые представляют «места» двоичной системы счисления.
Чтобы добавить 1 к 1, вы можете использовать вентиль И и указать, что его выход означает 2 (в десятичном виде). Другими словами, он задает вопрос «у меня есть 2?» и ответ «да», если у вас есть 1 И 1, или «нет» во всех остальных случаях.
Расположив большое количество таких вентилей и договорившись о том, какая цифра представлена каждым вентилем, вы можете создать простую схему, которая суммирует двоичные представления чисел и выводит правильный ответ (в другом двоичном представлении). Пофантазировав с вашими воротами и комбинациями, вы также можете выполнять умножение, вычитание и деление. Вы даже можете расположить свои ворота таким образом, чтобы контролировать вход, который решает, какую сумму выполнить — 0 для добавления, 1 для минуса.
Обратите внимание, как я намеренно расплывчато использовал слова «вход» и «выход». Входы могут поступать откуда угодно — переключатели, датчики, даже другие выходы. Комбинируя входы и выходы транзисторов, мы создали логические вентили, а комбинируя входы и выходы логических вентилей, мы начали представлять числа, арифметику и принятие решений. При тщательном планировании и терпении можно представить себе расположение логических вентилей, способное справиться с очень большими и сложными суммами. Что, если бы он выполнил вычисление, а затем использовал результат в качестве входных данных для следующего вычисления? Это значительно увеличило бы сложность и диапазон вычислений, доступных в нашей вычислительной схеме.
«Но это все цифры и математика, я хочу размещать фотографии кошек в своей ленте, это БУКВАЛЬНО бесполезно для меня!» Я слышу, как ты визжишь. Самое замечательное в числах то, что их множество. Слишком много, чтобы даже сосчитать. Они также могут представлять менее числовые вещи.
Если бы я сказал вам написать письмо, используя только цифры, как бы вы это сделали? На самом деле вы не можете, если человек на другом конце не согласится, что будут означать числа, которые вы им отправляете. Это точно так же, как наши общие предположения о языке — маленькие абстрактные символы, имеющие согласованное значение, которые мы компонуем в коммуникацию, инструкцию, значение и эмоцию, но они полностью и совершенно бессмысленны, если получатель не разделяет предполагаемого вами значения.
Так как же написать букву цифрами? Выберите код (или шифр) для использования и убедитесь, что получатель расшифрует ваше сообщение, используя согласованный код. Довольно очевидным кодом было бы использование чисел для представления положения буквы в алфавите: 1 = a, 2 = b, 3 = c и т. д. 8 5 12 12 15, 23 15 18 12 4!
Мы только что изобрели способ представления букв цифрами. Компьютер понимает, что означают эти символы, не больше, чем он знает значение чисел, которые он складывает. Это система, следующая по заранее запрограммированному пути с согласованным значением входов и выходов. Мы, люди, добавляем смысл. У компьютера нет ни понимания смысла, ни знаний, и он волшебным образом ничего не «делает», кроме как прослеживает лабиринт логических решений и агрегаций со скоростью света, чтобы преобразовать ввод в вывод, который мы понимаем.
Вы заметили образец, который я передаю? Крошечные биты, такие как буквы или транзисторы, могут создавать более полезные вещи, такие как слова или логические элементы, которые можно комбинировать в полезные вещи, такие как предложения или калькуляторы. Атомные части сами по себе бессмысленны, но только благодаря общему пониманию и совместному соглашению мы можем придать смысл абстракции и постепенно создавать невероятно мощные системы, которые, в свою очередь, делают нас как вид более значительным, чем сумма наших частей. Пошли вы, гремлины.