Если вы работаете в области технологий, в какой-то момент вам придется попытаться объяснить, чем вы занимаетесь, нетехническому человеку. Это может быть ваш любознательный партнер, желающий узнать больше о том, что вы делаете в этой «матричной штуке» (терминале) весь день. Или, возможно, ваш дружелюбный сосед узнал, что вы работаете программистом, и попросил вас починить их принтер. Такие разговоры могут быть трудными.

Выйдя из своего домашнего офиса после долгого дня написания кода, мой партнер задал мне глубокий вопрос:

«Разве ты не можешь просто сказать компьютеру НЕТ?»

Я пробормотал ответ о том, что компьютер не понимает «НЕТ». Он может говорить только в двоичном формате. Он работает в совершенно нетехнической сфере, но знает, что такое двоичный код. Он шутит в ответ: «Сколько нулей и единиц вам нужно, чтобы записать N — O?» Я вздохнул, пытаясь найти самый простой способ ответить на его вопрос, и подумал о том, сколько технарей, вероятно, в тот или иной момент вели подобный разговор.

Я здесь, пишу это руководство, чтобы развеять некоторые вопросы:

  • Действительно ли компьютер говорит с помощью нулей и единиц? Как это работает?
  • Как, черт возьми, взаимодействуют программисты и компьютеры? Программисты сидят за своими «матричными штуковинами» и целыми днями пишут нули и единицы?
  • Как сказать "НЕТ" в двоичном формате?

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

Действительно ли компьютер говорит с помощью нулей и единиц? Как это работает?

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

Дело в том, что это может быть 0/1, вкл/выкл, да/нет, правда/ложь или кошка/собака. Неважно, как мы это называем, важно лишь то, что оно представляет собой различие. Одна вещь, которая явно отличается от другой. Для компьютеров это электричество и 0/1. Так что все на вашем компьютере на самом деле является числом. Даже если это такая буква, как «N» или «O», на самом деле это просто набор единиц и нулей.

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

Компьютеры НЕ умные. На самом деле они очень тупые. Но они быстрые.

Если бы я представил вам человека и сказал, что он может понимать только две вещи: 0 и 1, вы, вероятно, не подумали бы, что он очень умный. Подробнее об этом позже.

Хорошо, компьютеры говорят с помощью нулей и единиц. Так как же люди общаются с ними?

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

Информация есть везде. Это в наших умах, в наших смартфонах и даже в нашей ДНК. И у него есть единица измерения, которая универсальна независимо от того, о каком типе информации (данных) мы говорим. Эта единица измерения называется бит. Бит — это сокращение от (как вы уже догадались) двоичной цифры. Биты имеют двоичное значение либо 0, либо 1. Звучит знакомо? В байте 8 битов, и большинство из нас знает все о байтах — вы, вероятно, точно знаете, сколько гигабайт может вместить ваш смартфон или ноутбук.

По оценкам, человеческий мозг способен хранить эквивалент 2,5 миллионов гигабайт данных. Таким образом, в абстрактном смысле я мог бы сказать, что если я разговариваю с кем-то на улице, я передаю биты (информацию) из своего мозга в их с помощью языка. Если компьютер перемещает файлы на жесткий диск, он также передает биты.

Ну, программисты тоже общаются с компьютерами с помощью языков. Только не разговорные языки, такие как английский или французский. Возможно, вы слышали о таких языках программирования, как Javascript, C, Ruby, Java (отличается от JavaSCRIPT), Python, Go, R, PHP… этот список можно продолжить. Если вы когда-нибудь видели текст Javascript, он мог выглядеть примерно так:

const min = function(numbers) {
   let lowestNum = numbers[0];
   for (let num of numbers) {
      if (num < lowestNum) {
         lowestNum = num;
      }
   }
   return lowestNum;
};

Подождите, это же не 0 и 1… куда вы клоните??

Человеческие языки, такие как английский или французский, занимают промежуточное положение между абстрактными мыслями в нашем мозгу и менее абстрактным представлением той информации, которая в конечном итоге доходит до того, кто слушает, что мы говорим или пишем. Точно так же языки программирования стоят между абстрактными ЧЕЛОВЕЧЕСКИМИ мыслями программиста и более точными и менее абстрактными нулями и единицами МАШИНЫ.

Обычные люди изо всех сил пытаются запомнить 10-значный номер телефона, не говоря уже о миллионах нулей и единиц, поэтому нам нужен способ абстрагироваться от всех этих нулей и единиц и общаться с компьютером так, чтобы его могли понять и люди, и машины. Точно так же компьютер — это всего лишь последовательность включенных или выключенных электрических цепей, поэтому он не может понимать наши сложные языковые инструменты. В итоге мы получаем что-то среднее между 0 и 1 и человеческим языком, как приведенный выше Javascript.

Хорошо, теперь у нас есть языки программирования для общения с компьютерами. Как ОНИ становятся 0 и 1?

Короче говоря, программы, написанные на языках программирования, преобразуются в 0 и 1 другими программами. Правильно, умные программисты научили компьютеры переводить языки, которые они не понимают, на те, которые они понимают. Довольно круто, да? Эта черновая работа выполняется чем-то, что называется компилятором. Компилятор — это программа, которая берет код, написанный программистом, и преобразует его в набор инструкций, написанных в коде, понятном компьютеру. В итоге получается большой длинный список нулей и единиц, которые заставляют электричество отключаться и включаться в точно правильном порядке, так что компьютер выполняет инструкции, указанные программистом. Реальность того, что происходит с компилятором, намного сложнее, но если бы я попытался объяснить это, мы бы торчали здесь весь день. Также есть что-то похожее на компилятор, называемое интерпретатором, но опять же, для простоты мы не будем вдаваться в подробности.

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

Так кто написал компилятор? Звучит как тяжелая работа!

Да, дорогой читатель. На каком-то этапе некоторые очень умные люди сели и сопоставили все непонятные комбинации символов, составляющие синтаксис языка программирования (например, то, что вы видите в Javascript выше), в комбинацию нулей и единиц для компьютера. И большая часть этой логики выполняется компилятором.

Кажется, самое время упомянуть, что не все языки программирования одинаковы. У нас есть языки программирования высокого и низкого уровня, и они находятся на шкале между удобными для человека (языки высокого уровня) и удобными для компьютера (языки низкого уровня).

Если вы хотите написать код для веб-сайта, вы можете безопасно, легко и, самое главное, быстро использовать язык высокого уровня, такой как JavaScript, Python или Ruby. Они проще в освоении и менее сложны. Языки низкого уровня, такие как язык ассемблера, настолько близки к 0 и 1, что даже не используют компилятор. На самом деле то, что на самом деле делает компилятор под капотом, — это перевод языка высокого уровня на язык ассемблера. Языки низкого уровня намного сложнее и сложны для изучения. Где-то посередине находится такой язык, как C, который обычно используется для сложных задач программирования, таких как создание операционной системы или создание компилятора, но не такой хардкорный, как язык ассемблера.

Давайте вернемся к делу: как сказать компьютеру "НЕТ" и как починить принтер?

Я упоминал ранее, что даже письма на компьютер представляют собой набор единиц и нулей. Они превращаются из букв в набор единиц и нулей посредством процесса, называемого кодированием. Ну, есть такая вещь, используемая для кодирования, которая называется ASCII, и она использует 7 цифр для отображения первых 126 символов и символов английского алфавита. Это удобно последовательно, а буквы N и O расположены рядом друг с другом.

С ASCII вы сообщаете компьютеру номер «1001110 1001111». Обратите внимание, что эти два набора из 7 нулей и 1 различаются только потому, что первый заканчивается на 0, а второй на 1. Как я уже сказал, прямо рядом друг с другом. Заглавные буквы имеют значение, но это не важно для понимания концепции. А как насчет всех остальных персонажей, спросите вы? Их гораздо больше, чем просто 126!

ASCII никогда не будет достаточно. Чтобы стандартизировать множество символов мира, у нас есть организация, называемая Консорциумом Unicode, и они контролируют список из более чем 100 000 символов, каждый из которых представлен набором двоичных цифр. Им пришлось пройти весь путь до 32 нулей и единиц, чтобы представить такое количество символов. В наши дни тип кодировки, который мы используем для символов, называется UTF-8, и он довольно широко используется в современной сети. К счастью, он обратно совместим с ASCII, поэтому «1001110 1001111» по-прежнему «НЕТ», хотя технически теперь у нас есть 32 0 и 1, чтобы сказать НЕТ, а не только 7. Это трудно понять, но есть больше информации для вас. в ссылках, если вы хотите изучить его больше.

Что касается принтеров… они 2008 года выпуска. Прочитайте о том, почему вы должны переосмыслить свое решение о владении принтером.

В заключение…

Теперь вы знаете, как реагировать, если компьютер попытается спеть вам песню своего народа! Что-то вроде… Это ни в коем случае не является исчерпывающим или подробным объяснением всего, что нужно знать по любой из упомянутых тем (двоичные файлы, теория информации, языки программирования, кодировка символов и т. д.). Он лишь поверхностно затрагивает увлекательную область исследования, а концепции упрощены, чтобы помочь вам открыть свой первый уровень понимания.

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

Мои рекомендации — ваши ресурсы!

Ричард Фейнман о том, насколько компьютеры ТУПЫЕ и БЫСТРЫЕ

Подробнее о том, как работает компилятор

Еще о теории информации и науке о передаче данных

Большая книга по системам коммуникации

Ускоренный курс информатики Youtube-сериал

Том Скотт об ASCII и чуде Unicode

Подробнее о Консорциуме Юникод

Список всех символов Юникода

Объем памяти человеческого мозга