Kitabı oxu: «Основы информационных технологий для неспециалистов: что происходит внутри машин»
Посвящается Мэг
Understanding the Digital World:
What You Need to Know about Computers, the Internet, Privacy, and Security, Second Edition by Brian W. Kernighan.
Copyright © 2021 by Princeton University Press
All rights reserved.
No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage and retrieval system, without permission in writing from the Publisher.
Библиотека ИТ. Главные книги о современных технологиях
© Жевлакова Е.В., перевод на русский язык, 2024
© Оформление. ООО «Издательство «Эксмо», 2024
Предисловие
Курс под названием «Компьютеры в нашем мире» я преподаю в Принстоне почти каждую осень начиная с 1999 года. Название курса – размытое до неприличия, но дело в том, что однажды мне пришлось придумать его за пять минут, а поменять с тех пор стало довольно сложно. Впрочем, преподавать этот курс – самая увлекательная часть моей работы, которая и так почти всегда приносит радость.
Факт, что компьютеры и вычислительная техника окружают нас повсюду. Некоторые технологии у всех на виду: у студентов есть ноутбуки, и они намного мощнее компьютера IBM 70941, который стоил несколько миллионов долларов, занимал большую комнату с кондиционером и обслуживал весь кампус Принстона, когда я пришел сюда аспирантом в 1964 году. Кроме того, каждый студент пользуется сотовым телефоном, вычислительная мощность которого намного выше, чем у той древней машины IBM. У всех студентов, как и у значительной доли населения земного шара, есть высокоскоростной доступ в интернет. Любой из них может искать информацию в браузере, совершать покупки онлайн, пользоваться электронной почтой, мессенджерами и социальными сетями для общения с друзьями и семьей.
Но это только вершина айсберга вычислительных технологий, большая его часть скрыта в глубине. Мы обычно не думаем о компьютерах, которые незаметно работают в бытовой технике, машинах, самолетах и вездесущих электронных устройствах вроде умных телевизоров, термостатов и дверных звонков, средств распознавания голоса, фитнес-трекеров, наушников, игрушек и игровых аксессуаров, – и мы воспринимаем их как данность. Мы мало задумываемся и о том, до какой степени от вычислительной техники зависит инфраструктура: телефонная сеть, кабельное телевидение, управление воздушным движением, энергосистема, банковские и финансовые услуги.
Большинство людей напрямую не создают эти системы, но ощущают их сильное влияние – а некоторым предстоит принимать важные решения по поводу их работы. Образованный человек должен знать по меньшей мере основы вычислительных технологий: что делают компьютеры и как, на что они не способны в принципе, а что просто чересчур сложно для них на данный момент, как они общаются между собой и что при этом происходит, какими многочисленными способами технологии и коммуникации воздействуют на мир вокруг нас.
То, что информационные технологии проникают повсюду, влияет на нас неожиданным образом. Хотя нам время от времени напоминают о распространении систем наблюдения, о вторжениях в нашу частную жизнь, угрозах кражи личных данных, мы не всегда осознаем, насколько это все обусловлено технологиями и коммуникациями.
В июле 2013 года Эдвард Сноуден, подрядчик Агентства национальной безопасности (АНБ) Соединенных Штатов Америки, предоставил журналистам 50 000 документов, в которых раскрывалось, что сотрудники АНБ регулярно отслеживали электронные средства связи: звонки, сообщения, письма, интернет – и собирали данные почти по каждому жителю мира. Что примечательно, они следили и за американцами, которые жили в своей стране и не представляли никакой угрозы ее безопасности. Документы Сноудена показывали, что и другие государства тоже шпионили за своими гражданами. Удивительно, но после первоначального возмущения общественности все вернулось на круги своя, правительства стали еще более масштабно отслеживать, чем занимаются граждане, и шпионить за ними, а люди либо смирились с этим, либо не возражают по неведению.
Нашу деятельность в интернете и реальном мире отслеживают также и корпорации. Бизнес-модели многих компаний основаны на обширном сборе данных, возможностях прогнозировать наше поведение и влиять на него. Доступность громадных объемов данных позволила достичь серьезного прогресса в машинном распознавании речи и образов, а также автоматических переводах. Но она вредит неприкосновенности частной жизни, и теперь сложно сохранять анонимность.
Хакеры всех мастей стали особенно изощренными в своих атаках на хранилища данных. В государственных службах и на предприятиях почти ежедневно происходят электронные взломы; данные о клиентах и сотрудниках похищают в больших количествах и часто используют в целях мошенничества и кражи личной информации. Обычными стали атаки на отдельных лиц. Раньше считалось, что для защиты от онлайн-мошенников достаточно игнорировать письма от мнимых нигерийских принцев или их родственников. Но сейчас целевые атаки стали куда более хитроумными, и это один из наиболее распространенных способов взлома корпоративных компьютеров.
Социальные сети вроде Facebook1, Instagram2, X (Twitter), Reddit и других изменили способы общения между людьми. С одной стороны, это полезно: мы можем поддерживать связь с друзьями и семьей, просматривать новости и всевозможные развлекательные посты. Соцсети могут и помочь, как в середине 2020 года, когда движение Black Lives Matter привлекло всеобщее внимание благодаря «вирусным» видеороликам о жестокости полиции.
Но через социальные сети также распространялось множество дурных идей. Расисты, участники групп ненависти, сторонники теорий заговора и другие безумцы, независимо от их убеждений и политических взглядов, могут легко находить друг друга в интернете, координировать свои действия и усиливать свое влияние. Сдержать разгул ненависти и бреда мешают щекотливые вопросы свободы слова, а также технологические сложности модерирования контента.
В мире с обширным взаимодействием через интернет сложно решать вопросы юрисдикции. В 2018 году Европейский союз ввел в действие Общий регламент по защите персональных данных, который позволил жителям ЕС контролировать сбор и использование своих данных и запретил компаниям отправлять или хранить данные за пределами ЕС. Коллегия присяжных еще не определила, насколько Общий регламент оказался полезным для конфиденциальности. К тому же эти правила применяются только в ЕС, а в других частях мира действуют иные законы.
Еще одна сложность появилась после быстрого внедрения облачных вычислений, когда отдельные лица и компании стали хранить данные и обрабатывать их на серверах, принадлежащих Amazon, Google, Microsoft и т. д. Данные теперь хранятся не только у их владельца, но и у третьих лиц, у которых есть свои цели, обязанности, уязвимые места и неразрешенные проблемы с взаимоисключающими требованиями разных юрисдикций.
Быстро развивается «интернет вещей», в котором все виды устройств подключаются к сети. Смартфоны – это очевидный пример, но, кроме них, онлайн-доступ получают автомобили, камеры слежения, бытовая техника и средства управления домом, медицинское оборудование и большая часть инфраструктуры – например, управление воздушным движением и энергосети. Эта тенденция соединять все с интернетом будет продолжаться, потому что преимущества такого соединения неоспоримы. К сожалению, здесь есть и серьезные риски: некоторые устройства контролируют жизненно важные системы, а не только развлечения, и часто их защита намного слабее, чем у более зрелых технологий.
Криптография – одно из немногих эффективных средств защиты, поскольку она обеспечивает конфиденциальность и безопасность как коммуникации, так и хранения данных. Но надежная криптография подвергается постоянным атакам. Правительствам не нравится идея, что люди, компании или террористы получат возможность общаться по-настоящему тайно, поэтому они часто призывают внедрить в криптографические алгоритмы лазейки, которые позволили бы госслужбам взломать шифрование – разумеется, с «надлежащей страховкой» и только «в интересах национальной безопасности». Какими бы благими ни были их намерения, это очень плохая идея. Даже если вы верите, что правительство всегда будет вести себя достойно и не позволит утечь секретной информации (забудем о Сноудене), ослабленная криптография поможет не только вашим союзникам, но и противникам. А плохие парни все равно не будут ее применять.
Это лишь некоторые проблемы и вопросы, которые должны беспокоить обычных граждан на улицах, вроде студентов моего курса или, как говорится, «людей просвещенных», независимо от их происхождения и образования.
Студенты моего курса – не технические специалисты. Они не инженеры, не физики, не математики. Они – бакалавры английского языка и политологии, историки, классицисты, экономисты, музыканты и артисты. Превосходная выборка по гуманитарным и общественным наукам. К окончанию курса эти одаренные люди должны научиться читать и понимать новостные статьи на компьютерную тематику, узнавать из них что-то новое и, возможно, находить неточности. В более широком смысле я хочу, чтобы мои студенты и читатели разумно и скептически относились к технологиям, понимали, что они полезны, но вовсе не панацея. И наоборот, понимали, что, хотя технологии иногда приводят к плохим последствиям, они вовсе не абсолютное зло.
Ричард Мюллер в своей прекрасной книге «Физика для будущих президентов»2 пытается объяснить научно-техническую подоплеку, лежащую в основе проблем, с которыми сталкиваются лидеры: ядерная угроза, терроризм, энергетические кризисы, глобальное потепление и так далее. Эрудированные люди, хоть и не претендующие на пост президента, тоже должны разбираться в этих темах. Если опираться на подход Мюллера, то и мое направление работы можно определить схоже: «Компьютеризация для будущих президентов».
Что будущий президент должен знать о компьютеризации? Что должен знать об этом эрудированный человек – например, вы?3
Я выделяю четыре основные технические области: аппаратное обеспечение, программное обеспечение, коммуникации и данные.
Аппаратное обеспечение — это осязаемая часть. Компьютеры, которые мы видим и трогаем, они стоят у нас дома и в офисах, мы носим их с собой в телефонах. Что находится внутри компьютера, как он работает и как он устроен? Как он хранит и обрабатывает информацию? Что такое биты и байты и как мы их используем для воспроизведения музыки, фильмов и всего остального?
Программное обеспечение — это инструкции, которые указывают компьютеру, что делать, и они, напротив, практически не осязаемы. Что мы можем вычислить и как быстро? Как мы отдаем компьютеру команды? Почему так трудно заставить компьютеры работать правильно? Почему так часто бывает сложно их использовать?
Коммуникации — это средства, которые позволяют компьютерам, телефонам и другим устройствам общаться между собой на пользу нам, а людям – разговаривать друг с другом: интернет, Всемирная паутина, электронная почта и социальные сети. Как это работает? Выгоды очевидны, но какие при этом возникают риски, особенно в отношении нашей безопасности и неприкосновенности частной жизни, и как их можно снизить?
Данные — это вся информация, которую аппаратное и программное обеспечение собирает, хранит и обрабатывает, а системы коммуникации рассылают по миру. Некоторые данные, осмотрительно это или нет, мы предоставляем добровольно: загружаем тексты, картинки и видео. В ходе нашей повседневной жизни большая часть этой персональной информации собирается и распространяется без нашего ведома и тем более согласия.
Президент вы или нет, вам нужно знать об устройстве мира применительно к компьютерам, поскольку это касается лично вас. Не важно, насколько ваша жизнь и профессия связаны с техникой – вы все равно будете взаимодействовать с технологиями и техническими специалистами. Хоть какое-то знание о работе устройств и систем – это большое преимущество, даже в простых ситуациях. Например, оно поможет понять, что продавец, политик или служба поддержки не говорят вам всей правды.
Мало того, невежество в этой сфере может напрямую повредить вам. Если вы не разбираетесь в вирусах, фишинге и подобных угрозах, то становитесь уязвимыми для них. Если вы не знаете, как социальные сети сливают или даже открыто передают информацию, которую вы считаете конфиденциальной, то вы раскрываете о себе гораздо больше сведений, чем предполагали. Если вы не осознаете, как безудержно коммерческие компании стремятся использовать все, что они узнали о вашей жизни, то вы отказываетесь от конфиденциальности без особой пользы для себя. Если вы не знаете, почему опасно пользоваться банковскими услугами, сидя в кафе или аэропорту, то возникает риск, что ваши деньги и личные данные похитят. Если вы не знаете, как легко другие люди манипулируют данными, то, скорее всего, попадетесь на удочку заведомо ложных новостей, фальсифицированных изображений и теорий заговора.
Предполагается, что вы прочтете эту книгу от начала до конца, но, возможно, вам захочется перейти к интересующим вас темам, а потом возобновить чтение по порядку. Например, вы можете начать с главы 8, где рассматриваются сети, сотовые телефоны, интернет, Всемирная паутина и вопросы конфиденциальности. Возможно, вам придется заглянуть в предыдущие главы, чтобы разобраться в каких-либо тонкостях, но в целом материал будет вам понятен. Также вы можете пропустить места, где много математики, – например, главу 2 о сути двоичных чисел или подробности о языках программирования в паре других глав.
В конце вы найдете список книг, которые я рекомендую, и ссылки на полезные ресурсы с дополнительными сведениями. В глоссарии приведены краткие определения и объяснения важных технических терминов и сокращений.
Любая книга об IT может быстро устареть, и эта не исключение. Предыдущее издание вышло задолго до того, как мы увидели, в каких масштабах враждебные силы способны влиять на общественное мнение и выборы в разных странах. Я дополнил книгу новыми важными историями, многие из которых касаются личной неприкосновенности и безопасности, поскольку за последние годы эти вопросы стали более актуальными. Появилась новая глава об искусственном интеллекте, машинном обучении и о том, как «большие данные»3 сделали их такими эффективными, а в некоторых случаях – опасными. Я также попытался упростить сложные объяснения, а устаревший материал удалил или заменил. Тем не менее некоторые фрагменты уже устареют или станут неверными, когда вы будете читать эту книгу. Но я приложил все усилия, чтобы четко выделить знания, наделенные непреходящей ценностью.
Моя цель при работе над книгой состояла в том, чтобы вы по достоинству оценили удивительные технологии и по-настоящему поняли, как они работают, откуда появились и куда могут привести в будущем. На этом пути вы, возможно, приобретете полезную манеру мышления о мире в целом. Я надеюсь на это.
Благодарности
Я снова в большом долгу перед друзьями и коллегами, которые помогали мне улучшить эту книгу. Как и прежде, Джон Бентли с особым вниманием вычитывал многочисленные черновики, а его поддержка в форме организационных предложений, проверки фактов и сбора новых примеров просто неоценима. Аль Ахо, Свати Бхатт, Джованни де Феррари, Пол Керниган, Джон Линдерман, Мадлен Планейкс-Крокер, Арнольд Роббинс, Ян Сон, Говард Трики и Джон Уэйт дали подробные комментарии ко всей рукописи. Я также благодарен Фабрицио д’Аморе, Питеру Грабовски, Эбигейл Гупте, Майе Хамин, Джерарду Хольцманну, Кену Ламберту, Даниэлю Лопрести, Теодору Марку, Джоан Ордилле, Аюши Синхе, Уильяму Угетте, Питеру Вайнбергеру и Франциске Вейрих-Фрейберг за ценные предложения. Корейский перевод предыдущего издания, сделанный Сончан Ха, заметно улучшил и эту английскую версию. Гарри Льюис, Джон Маккормик, Брайан Респасс и Эрик Шмидт не скупились на похвалы для предыдущего издания. Как всегда, было приятно работать с производственной группой издательства Принстонского университета: Марком Беллисом, Лоррейн Донекер, Кристен Хоп, Дмитрием Каретниковым и Хэлли Стеббинс. В свою очередь, Мэри-Эллен Оливер исключительно тщательно вычитала текст и проверила факты.
Спустя двадцать лет мои студенты начнут управлять миром или, по крайней мере, не дадут ему развалиться. Они станут журналистами, врачами, юристами, учителями всех уровней, чиновниками, учредителями компаний, творческими людьми, актерами и просто глубоко неравнодушными гражданами. Я очень горжусь ими.
Мы все в долгу перед многими людьми, которые трудились, не жалея себя, во время пандемии COVID-19, чтобы мы могли работать дома с относительным удобством, зная, что даже во время карантина будут действовать ключевые службы, а система здравоохранения не перестанет заботиться о нас. Никакими словами не выразить, как сильно мы обязаны им.
Благодарность за второе издание книги «Цифровой мир»
Я снова в большом долгу перед друзьями и коллегами за их щедрую помощь и советы. Как и в случае с первым изданием, Джон Бентли внимательно прочитал несколько черновиков, оставил полезные комментарии на каждой странице, и эта книга стала намного лучше благодаря его вкладу. Ценные предложения, критику и правки я получил также от Свати Бхатт, Джованни Де Феррари, Питера Грабовски, Джерарда Хольцманна, Вики Керн, Пола Кернигана, Эрена Курсуна, Дэвида Малана, Дэвида Маускопа, Дипы Муралидхар, Мадлен Планейкс-Крокер, Арнольда Роббинса, Говарда Трики, Джанет Вертези и Джона Уэйта. Кроме того, я воспользовался полезными советами Дэвида Добкина, Алана Донована, Эндрю Джадкиса, Марка Кернигана, Элизабет Линдер, Жаклин Мислоу, Арвинда Нараянана, Джона Синовица, Питера Вайнбергера и Тони Вирт. Было приятно работать с производственной группой издательства Принстонского университета – Марком Беллисом, Лоррейн Донекер, Дмитрием Каретниковым и Вики Керн. Моя благодарность им всем.
Я также благодарен Принстонскому центру политики в области информационных технологий за хорошую компанию, беседы и еженедельные бесплатные обеды, и прекрасным студентам курса COS 109, чей талант и энтузиазм по-прежнему удивляют и вдохновляют меня. Спасибо вам.
Благодарности за книгу «D значит Digital»4
Я в большом долгу перед друзьями и коллегами за щедрую помощь и советы. В частности, Джону Бентли – за подробные комментарии почти к каждой странице нескольких черновиков. Клей Бейвор, Дэн Бентли, Хильдо Бирсма, Стю Фельдман, Джерард Хольцманн, Джошуа Кац, Марк Керниган, Мэг Керниган, Пол Керниган, Дэвид Малан, Тали Мо-решет, Джон Рике, Майк Ши, Бьярне Страуструп, Говард Трики и Джон Уэйт внимательно прочитали полные черновики, внесли много полезных предложений и спасли меня от нескольких серьезных оплошностей. Я также благодарю Дженнифер Чен, Дуга Кларка, Стива Элгерсму, Ави Флам-хольца, Генри Лейтнера, Майкла Ли, Хью Линча, Патрика Маккормика, Жаклин Мислоу, Джонатана Рошелла, Кори Томпсона и Криса Ван Вика за ценные комментарии. Я надеюсь, они увидят, что во многих местах я воспользовался их советами, и не заметят, что где-то я этого не сделал.
Дэвид Брэйлсфорд дал очень полезные советы по самостоятельной публикации и форматированию текста, полагаясь на личный опыт, приобретенный тяжким трудом. Грег Доенч и Грег Уилсон щедро делились советами по вопросам публикации. За фотографии я в долгу перед Джерардом Хольцманном и Джоном Уэйтом.
Гарри Льюис принимал меня в Гарварде в 2010/2011 учебном году, когда я написал первые несколько черновиков. Советы Гарри и его опыт преподавания аналогичного курса очень пригодились мне, как и его комментарии к многочисленным черновикам. Гарвардская школа инженерных и прикладных наук и Беркмановский центр интернета и общества создали для меня дружественную и вдохновляющую атмосферу, предоставили офис, оборудование и (да, такое бывает!) регулярные бесплатные обеды.
Я особенно благодарен многим сотням студентов, которые прошли курс COS 109 «Компьютеры в нашем мире». Их интерес, энтузиазм и дружелюбие стали неисчерпаемым источником вдохновения. Я надеюсь, что, когда несколько лет спустя они будут руководить миром, окажется, что этот курс пошел им на пользу.
Введение
Это было лучшее из всех времен, это было худшее из всех времен…5
Чарльз Диккенс.Повесть о двух городах, 1859
Мы с женой планировали провести летний отпуск 2020 года в Англии. Мы забронировали номер, внесли предоплату, купили билеты, договорились с друзьями, чтобы они присмотрели за нашим домом и котом… а потом мир изменился.
В начале марта стало понятно, что COVID-19 станет серьезным мировым кризисом в области здравоохранения. Принстонский университет отменил занятия и в срочном порядке отправил студентов домой. Им дали неделю, чтобы собрать вещи и уехать. Быстро последовало решение, что в этом семестре они уже не вернутся.
Занятия перенесли в онлайн. Студенты смотрели лекции, писали работы, сдавали экзамены и получали оценки – все происходило удаленно. Я начал познавать Zoom – систему для видеоконференций – и стал пусть не экспертом, но, во всяком случае, опытным пользователем-любителем. К счастью, я преподавал два коротких семинара, примерно по десятку студентов в каждом, поэтому одновременно видел всю группу и поддерживал нормальное общение. У коллег, которые вели большие лекционные занятия, дела обстояли не так хорошо – и, конечно, это негативно отразилось на учениках по другую сторону всех этих виртуальных кафедр.
Большинство студентов вернулись в свои уютные дома с надежным электроснабжением и устойчивым интернет-соединением, где их поддерживали родные и они не столкнулись с нехваткой еды или еще чего-либо жизненно важного. Естественно, отношения между людьми страдали из-за вынужденного разделения или процветали из-за вынужденного объединения (а иногда – наоборот). Но это были несерьезные проблемы.
Часть студентов попала в гораздо более бедственное положение. У одних интернет-соединение прерывалось или вообще отсутствовало, из-за чего они не могли пользоваться видеосвязью и электронной почтой. Другие долго болели или находились на длительном карантине. У третьих заразились родственники, и о них приходилось заботиться, а у кого-то даже умерли близкие.
Повседневная административная работа в университете также перешла в онлайн-режим, случайные разговоры в коридоре превратились в ежедневные виртуальные встречи, а вся бумажная работа в основном велась по электронной почте. Я быстро устал от Zoom, но пока что хотя бы не сталкивался с выходками хакеров, вторгающихся в онлайн-пространство.
Во многих частях мира нашлись везучие люди, профессия которых позволяла трудиться удаленно, и компании быстро перешли в режим работы из дома. Люди улучшали фон для видеосвязи: демонстрировали книжные полки или аккуратно расставленные цветы и картины, учились добиваться (почти полной) тишины от своих детей, домашних животных и близких, а также не показывать их в кадре.
Стриминговые сервисы вроде Netflix, и так уже популярные, расширили аудиторию. Полный запрет на спортивные мероприятия поспособствовал ускорению развития онлайн-игр и фэнтези-спорта6.
Мы постоянно смотрели новостные сводки о том, как быстро распространяется вирус COVID-19 и как удручающе медленно и непоследовательно его сдерживают, что сопровождалось чрезмерным изобилием несуразных идей и откровенной лжи политиков. Честных и компетентных руководителей среди них нашлось мало. Еще мы немного узнали о том, как стремительно развиваются экспоненциальные процессы.
Адаптироваться к новому способу ведения дел оказалось на удивление легко. Счастливчики продолжали работать, поддерживали виртуальный контакт с друзьями и родственниками, заказывали еду и все необходимое, почти как и прежде. Интернет и вся инфраструктура поддерживали связь между нами. Ситуация была на удивление устойчивой: системы передачи информации никогда не отключались, как и (к счастью) электричество, тепло и вода.
Технологические системы настолько хорошо работали во время этого глобального кризиса, что мы почти не вспоминали о них, – если не считать нескольких тревожных моментов, – хотя без них нам пришел бы конец. То же самое относится и ко множеству незаметных героев, которым не уделяли внимания, но они не допускали поломок, зачастую серьезно рискуя здоровьем и даже жизнью. Кроме того, мы по-настоящему не задумывались о миллионах людей, которые потеряли работу, потому что не могли выполнять свои задачи через интернет и их источник дохода исчез в одночасье.
Я буквально никогда не слышал о Zoom перед тем, как начал использовать его в марте. Эта программа, выпущенная в 2013 году, предоставляла систему для видеоконференций, конкурируя с более крупными игроками вроде Microsoft Teams и Meet от Google (этот проект часто переименовывали). Zoom вышла на фондовую биржу в 2019 году, а сейчас, поздней осенью 2020 года, когда я пишу это, она оценивается в более чем 125 миллиардов долларов4, что намного выше стоимости таких старых и хорошо известных компаний, как General Motors (61 млрд) и General Electric (85 млрд), и значительно дороже IBM (116 млрд).
Работать удаленно получалось у тех, кто обладал быстрым надежным интернетом, а также компьютером с камерой и микрофоном. Интернет-провайдеры и поставщики облачных сервисов располагали достаточными мощностями, чтобы справиться с растущим трафиком. Службы видеосвязи оказались настолько доступными и совершенными, чтобы большинство людей пользовались ими безо всяких неудобств. А ведь еще десять лет назад эти сервисы работали совсем не так хорошо, если вообще существовали.
Короче говоря, вездесущие современные технологии дали возможность счастливчикам жить в обстановке, вполне похожей на нормальную. Эти события напомнили нам, как разнообразны технологии, насколько глубоко они вошли в нашу жизнь и как улучшили ее во всех отношениях.
Но у этой истории есть оборотная сторона, не такая радостная.
Ситуация с интернетом, который уже стал рассадником паранойи, ненависти и безумных теорий, еще ухудшилась. Социальные сети позволили политикам и чиновникам распространять ложь, все заметнее разделять нас и избегать ответственности, получая поддержку от «новостных» агентств, не интересующихся фактами. Такие сайты, как Twitter и Facebook7, безуспешно пытались найти золотую середину – остаться нейтральной платформой для свободного выражения идей, но сдержать шквал провокационных постов и откровенной лжи.
Слежка вышла на новый уровень: во многих странах применялись технологии для ограничения прав людей, мониторинга их поведения и контроля над ним. Например, в Китае, помимо прочего, использовалась технология распознавания лиц для надзора за национальными меньшинствами. Во время пандемии COVID-19 китайское правительство обязало граждан установить приложение, которое работает как своего рода паспорт иммунитета, но также сообщает полиции о местонахождении пользователей5. В США и Великобритании местные правоохранительные органы приглядывают за людьми, полагаясь на систему распознавания лиц, считыватели номерных знаков и тому подобное.
Наши мобильные телефоны постоянно фиксируют местоположение, и различные субъекты могут агрегировать эти данные. Приложения для отслеживания смартфонов – отличный пример двойственности технологий. Кто станет возражать против системы отслеживания контактов с COVID-19, которая уведомляет вас, общались ли вы с потенциально заразным человеком? Но любая технология, позволяющая правительству узнать, где вы были и с кем разговаривали, в том числе помогает ему более эффективно вести мониторинг и контроль. Это короткий и скользкий путь от отслеживания заболеваемости к выявлению мирных протестующих, инакомыслящих, политических оппонентов, изобличителей и всех остальных, кого власти воспринимают как угрозу. (Неясно, работает ли вообще отслеживание контактов на основе приложений, поскольку оно очень часто выдает ложноположительные и ложноотрицательные результаты6.)
Почти все наши взаимодействия с онлайн-миром, а часто и в офлайне, отслеживают бесчисленные компьютерные системы. Они запоминают, с кем мы имели дело, сколько заплатили и где находились в то или иное время. Основную часть этих данных накапливают в коммерческих целях, поскольку чем больше компании знают о нас, тем точнее могут настроить целенаправленную рекламу. Многие читатели уже знают, что эти данные собираются, но, полагаю, не подозревают, в каких объемах и насколько подробно.
Наблюдением занимаются не только компании, но и правительство. То, что обнародовал Эдвард Сноуден, – электронные письма АНБ, внутренние отчеты, презентации PowerPoint, – многое поведало о шпионаже в цифровую эпоху7. Суть в том, что АНБ следит за всеми в грандиозных масштабах.
Разоблачения Сноудена ошеломляли. Многие подозревали, что АНБ шпионит за людьми активнее, чем признаётся, но истинный размах превзошел воображение. Сотрудники АНБ регулярно собирали метаданные обо всех телефонных разговорах в США – кто и кого вызывал, когда и как долго они беседовали – и могли даже записывать сами звонки. Они сохраняли мои разговоры по Skype, контакты по электронной почте, а также, возможно, содержимое моих писем. (И ваших, конечно, тоже.) Они прослушивали телефонные разговоры мировых лидеров. Они перехватывали громадные объемы интернет-трафика, установив записывающие устройства на оборудование в тех местах, где подводные кабели входят на территорию США или покидают ее. Они склоняли и принуждали крупные телекоммуникационные и интернет-компании собирать и передавать информацию о своих пользователях. Они длительное время хранили громадное количество данных, делясь некоторыми из них со шпионскими агентствами других стран8.
Возвращаясь к сфере бизнеса, отметим, что мы чуть ли не каждый день узнаём об очередном нарушении безопасности в каких-либо компаниях или структурах, когда загадочные хакеры крадут информацию: имена, адреса, номера кредитных карт и другие персональные данные миллионов людей. Обычно этим промышляют преступники, разбирающиеся в высоких технологиях, но иногда причина – в шпионских действиях других стран, которые ищут ценные сведения. Время от времени персональные данные раскрывают случайно, из-за некомпетентности или небрежности компаний, хранящих такую информацию. Впрочем, причина утечек не имеет значения. Важно, что собранные о нас данные слишком часто раскрывают или крадут, а затем, возможно, используют против нас.
Цель этой книги – рассказать о технологии, которая скрыта за всеми упомянутыми системами, чтобы вы разобрались, как они работают. Как фотографии, музыка, фильмы и подробности вашей личной жизни могут мгновенно передаваться по миру? Как работают электронная почта и мессенджеры? Насколько они конфиденциальны? Почему спам так легко отправлять и так трудно заблокировать? Постоянно ли сотовые телефоны передают данные о вашем местоположении? Кто отслеживает вас онлайн и по смартфону и почему это важно? Могут ли распознать ваше лицо в толпе? Кто определяет, что это именно вы? Способны ли хакеры завладеть вашей машиной? А как насчет самоуправляемых автомобилей? Можем ли мы обеспечить себе безопасность и неприкосновенность частной жизни или незачем даже пробовать9?
К концу этой книги вы должны обрести четкое представление о том, как работают компьютеры и коммуникационные системы, как они влияют на вас и как вы можете найти баланс между использованием полезных сервисов и защитой вашей конфиденциальности.
Все сводится к горстке фундаментальных концепций, «универсалий», которые мы гораздо более подробно обсудим далее.
Во-первых, универсальное цифровое представление информации. Большую часть XX века документы, фотографии, музыку и фильмы хранили с помощью сложных и хорошо продуманных механических систем, но сейчас их заменили единым универсальным методом. Информация теперь представляется в цифровом виде – в числовых значениях, а не в таких специализированных форматах, как цветные красители, внедренные в пластиковую пленку, или комбинации магнитных частиц на виниловой ленте. Бумажные письма и карты уступили место цифровым, а бумажные документы заменяются базами данных в интернете. Аналоговые форматы во всем их разнообразии вытеснил единый низкоуровневый способ представления – цифровая информация, где все выражается просто числами.
Вторая концепция – универсальный цифровой процессор. Вся эта цифровая информация обрабатывается стандартными устройствами одного типа, цифровыми вычислительными машинами. Компьютеры, которые оперируют универсальными цифровыми представлениями, пришли на смену сложным механическим устройствам, работавшим с аналоговыми форматами отображения информации. Как мы увидим далее, все компьютеры равны в том, что они способны обсчитывать, но отличаются в скорости обработки и в том, какие объемы данных могут хранить. Любой смартфон – это крайне замысловатый компьютер с такой же вычислительной мощностью, как и у ноутбука. Все больше и больше задач, с которыми раньше справлялись только переносные и настольные компьютеры, теперь выполняются на телефонах, и этот процесс унификации ускоряется.
Третье понятие – универсальная цифровая сеть. Интернет соединяет между собой цифровые вычислительные машины, которые обрабатывают цифровое представление данных. Он подключает компьютеры и телефоны к почте, веб-поиску, социальным сетям, магазинам, банкам, новостным и развлекательным каналам и всему остальному. Большинство людей на земле имеют доступ к этой сети. Вы можете обмениваться электронными письмами с любым человеком независимо от того, где он находится или каким способом проверяет почту. Со своего телефона, ноутбука или планшета вы можете искать информацию, сравнивать цены в разных магазинах и совершать покупки. Социальные сети позволяют вам поддерживать связь с друзьями и семьей – опять же через телефон или компьютер. Вы можете смотреть бессчетные развлекательные каналы, зачастую даже бесплатно. Системы в вашем доме отслеживают и контролируют «умные» устройства, которые понимают ваши голосовые команды или вопросы. И существует всемирная инфраструктура, которая обеспечивает совместную работу всех этих служб.
Четвертая концепция – цифровые данные, которые постоянно собирают и анализируют в колоссальных объемах. В свободном доступе находятся карты, аэроснимки и подробные фотографии улиц. Поисковые системы неустанно сканируют интернет и эффективно находят ответы на запросы. В цифровой форме доступны миллионы книг. Социальные сети и файлообменники хранят огромные объемы данных для нас и о нас. Как сетевые, так и традиционные магазины и сервисы предлагают доступ к своим товарам, но в то же время незаметно сохраняют все наши действия, тогда как поисковые системы, социальные сети и наши телефоны не просто позволяют, а помогают им заниматься этим. Во время онлайн-взаимодействий интернет-провайдеры записывают историю наших подключений и, возможно, многое другое. Правительства постоянно шпионят за нами, причем еще 10 или 20 лет назад такая масштабная и тщательная слежка была бы невозможна.
И все это очень быстро меняется, потому что цифровые технические системы становятся всё более компактными, быстрыми и дешевыми. Производители постоянно выпускают новые телефоны с затейливыми функциями, улучшенными экранами и привлекательными приложениями. Регулярно появляются новые гаджеты, а затем функциональность самых полезных из них переходит к приложениям на телефонах. У цифровых технологий имеется естественный побочный продукт: любое развитие аппаратной части приводит к появлению усовершенствований во всех цифровых устройствах. То есть, если какие-либо изменения позволяют обрабатывать данные более дешево, быстро и в увеличенных объемах, выигрывают все устройства. Вот почему цифровые системы встречаются повсюду и встраиваются в нашу жизнь – как зримо, так и незримо.
Считается, что прогресс приносит пользу, и во многих отношениях это действительно так. Но нет добра без худа. Самый очевидный из негативных факторов (и, пожалуй, наиболее тревожный для людей на личном уровне) – влияние технологий на неприкосновенность частной жизни. Когда вы пользуетесь телефоном, чтобы найти какой-нибудь продукт, а затем посещаете интернет-магазины, все участники этого процесса записывают ваши переходы по страницам. Они знают, кто вы такой, потому что идентифицируют вас по смартфону. Они знают, где вы находитесь, потому что телефон постоянно передает координаты вашего местоположения с точностью до 100 метров. Телефонные компании записывают эти сведения и затем могут продать их. Служба GPS (система глобального позиционирования) работает с точностью до 5-10 метров. Когда вы включаете ее, то информация о вашем местонахождении становится доступной для приложений, и их владельцы тоже могут продавать ее. Вообще дела обстоят даже хуже: когда вы выключаете службу позиционирования, то запрещаете использовать GPS-данные только приложениям. Но это совсем не препятствует операционной системе смартфона собирать и выгружать данные через телефонную сеть, Wi-Fi или Bluetooth10.
В реальной жизни за вами наблюдают так же, как и онлайн. Технология распознавания лиц способна узнать вас на улице или в магазине. Дорожные камеры умеют сканировать ваши номерные знаки и определять, где сейчас ваш автомобиль. То же самое делают электронные системы взимания платы за проезд. Подключенные к интернету умные термостаты, автоответчики, дверные замки, радионяни и камеры наблюдения – это устройства слежки, нами же приглашенные в наш дом. Методы надзора, описанные в романе Джорджа Оруэлла «1984», выглядят дилетантскими на фоне того отслеживания, с которым мы сегодня смиряемся, даже не думая о нем.
Записи того, что и где мы делали, могут сущестовать вечно. Цифровое хранение настолько дешево, а данные настолько ценны, что информацию редко стирают. Если вы опубликовали в интернете что-то постыдное или отправили письмо, о котором потом пожалели, то уже ничего не исправить. С многочисленных ресурсов можно собрать информацию и создать подробную картину вашей жизни, доступную для коммерческих, правительственных и преступных субъектов без вашего ведома и разрешения. Скорее всего, она будет оставаться доступной неопределенно долгое время, а в будущем может всплыть и навредить вам.
Десять или двадцать лет назад мы даже не представляли, насколько уязвимыми для незнакомых нам людей сделают нас универсальная сеть и ее цифровая информация. Как говорит Брюс Шнайер в своей превосходной книге «Данные и Голиаф»11: «Неприкосновенность нашей частной жизни поставлена под удар из-за непрерывного наблюдения. Чтобы осознать, как высоки ставки, критически важно понять, как это происходит».
Социальные механизмы, которые защищают нашу частную жизнь и нашу собственность, не поспевают за быстрым развитием технологий. Тридцать лет назад я общался с местным банком и другими финансовыми организациями посредством бумажных писем и изредка заходил лично. Чтобы получить доступ к моим средствам, требовалось потратить много времени, и все действия подробно отмечались в документах, так что, если бы кто-то решил украсть мои деньги, ему пришлось бы непросто. Сейчас я общаюсь с финансовыми организациями в основном через интернет. Мне удобно получать доступ к моим данным, но если я или одна из этих компаний где-то ошибемся, то мошенник на другой стороне планеты сумеет опустошить мой счет, украсть личные данные, испортить мою кредитную историю и вообще устроить все, что пожелает. Причем все это произойдет мгновенно, а шансов на исправление ситуации почти не будет.
Данная книга поможет понять, как эти системы работают и как они меняют нашу жизнь. Но в силу обстоятельств она всего лишь отображает положение дел на текущий момент: будьте уверены, что через десять лет сегодняшние методы и устройства покажутся вам неуклюжими и устаревшими. Технологии развиваются не разовым скачком, а в ходе непрерывного процесса, быстрого, постоянного и ускоряющегося. К счастью, основные понятия о работе цифровых систем останутся неизменными, поэтому если вы поймете их суть один раз, то и в будущем сможете разобраться в них – лучше справиться с трудностями и воспользоваться возможностями, которые связаны с ними.
Часть I
Аппаратное обеспечение
О Господи, как жаль, что эти расчеты выполнены не с помощью пара!
Чарльз Бэббидж, 1821 год8
Аппаратное обеспечение – это осязаемая, видимая часть компьютерных систем, то есть устройства и оборудование, которые вы можете увидеть и потрогать. История вычислительных устройств интересна, но здесь я коснусь лишь основных эпизодов. Стоит отметить некоторые тенденции, особенно экспоненциальный рост количества схем и аппаратов, которые удавалось уместить в заданном объеме пространства, зачастую по фиксированной цене. По мере того как цифровое оборудование становилось дешевле и мощнее, на смену крайне разнородным механическим системам пришли электронные, гораздо более единообразные.
Вычислительная техника имеет долгую историю, однако самые ранние устройства предназначались только для решения узких задач – нередко для предсказания астрономических событий и положений. Например, согласно одной (недоказанной) теории, Стоунхендж был астрономической обсерваторией. Антикитерский механизм, датируемый примерно 100 годом до н. э., применялся для астрономических вычислений и отличается чрезвычайно замысловатой конструкцией. Арифметические устройства вроде абака или счет использовались людьми на протяжении тысячелетий, особенно в Азии. В начале 1600-х годов, вскоре после того как Джон Непер описал логарифмы, появилась счетная линейка. Я вычислял на такой, когда еще учился на инженера в 1960-х годах. Но сейчас логарифмические линейки – диковинка. Их заменили калькуляторы и компьютеры, а мои старательно приобретенные навыки стали бесполезными.
Наиболее значимый предок современных компьютеров – жаккардовый ткацкий станок, изобретенный Жозефом Мари Жаккардом во Франции около 1800 года. В этом агрегате применялись прямоугольные карточки с многочисленными рядами отверстий, которые задавали узоры плетения. Соответственно, жаккардовый станок «программировали» на создание разнообразных узоров по инструкциям, которые он получал на перфорированных карточках. Меняя карты, вы получали другие комбинации плетения12. Создание машин, которые уменьшали трудозатраты, привело к социальным потрясениям, поскольку ткачи теряли работу: так, в 1811–1816 годах движение луддитов в Англии яростно выступало против механизации. Современные вычислительные технологии аналогичным образом привели к расколу.

Рис. 1.1. Современное воплощение разностной машины Бэббиджа13
Вычислительные системы в современном понимании зародились в Англии в середине XIX века благодаря трудам Чарльза Бэббиджа. Этот ученый муж интересовался навигацией и астрономией, а в таких дисциплинах для расчета координат требовались таблицы числовых значений. Бэббидж потратил большую часть жизни, пытаясь создать вычислительное устройство, которое позволило бы механизировать утомительные и ненадежные подсчеты вручную, необходимые не только для создания таблиц, но даже для их печати. Его раздражение сквозит в цитате на предыдущей странице. По целому ряду причин, включая конфликты со спонсорами, он так и не преуспел в реализации своих замыслов, но его проекты были разумными. Современные воплощения некоторых машин Бэббиджа, созданные с применением инструментов и материалов его времени, можно увидеть в Музее науки в Лондоне и Музее компьютерной истории в Маунтин-Вью, штат Калифорния14 (см. рис. 1.1).
Чарльз поощрял интерес к математике и своим вычислительным устройствам у молодой Августы Ады Байрон – дочери поэта Джорджа Байрона, впоследствии графини Лавлейс. Она составила подробные описания о том, как использовать аналитическую машину Бэббиджа (наиболее передовое из его спроектированных устройств) для научных вычислений и предположила, что это устройство может даже выполнять нечисловые операции – в частности, сочинять музыку. «Если предположить, например, – писала она, – что основные соотношения высоких звуков в науке гармонии и музыкальной композиции поддаются таким отображениям и изменениям, то машина способна сочинять тщательно продуманные и научные музыкальные произведения любой сложности или протяженности15». Аду Лавлейс часто называют первым в мире программистом, а язык программирования Ada назван в ее честь16.
Герман Холлерит, сотрудник Бюро переписи населения США, в конце XIX века изобрел и построил устройства, которые сводили в таблицы сведения о жителях страны намного быстрее, чем при ручной обработке. Применяя идеи жаккардового ткацкого станка, Холлерит пробивал отверстия в карточках из плотной бумаги, тем самым кодируя данные переписи в формате, подходящем для обработки его машинами. Примечательно, что для получения сводных таблиц переписи 1880 года потребовалось восемь лет, но благодаря перфокартам и счетным машинам Холлерита итоги переписи 1890 года появились всего через год, а не через десять или больше, как прогнозировалось. Герман основал компанию, которая в 1924 году благодаря слияниям и приобретениям превратилась в International Business Machines, известную сегодня как IBM.

Рис. 1.2. Ада Лавлейс. Фрагмент портрета работы Маргарет Сары Карпентер, 1836 год17
Машины Бэббиджа представляли собой сложные механические конструкции из шестеренок, колес, рычагов и стержней. Развитие электроники в XX веке позволило спроектировать компьютеры, в которых уже не применялись механические компоненты. Первой серьезной электрической машиной стал ENIAC (Electronic Numerical Integrator and Computer9), созданный Преспером Эккертом и Джоном Мокли в 1940-х годах в Пенсильванском университете в Филадельфии. ENIAC занимал просторное помещение и требовал огромного количества электроэнергии, а выполнял при этом около 5000 операций сложения в секунду. Предполагалось, что устройство будут использовать для баллистических расчетов и тому подобного, но его достроили только в 1946 году, уже после окончания Второй мировой войны18. (Части ENIAC выставлены в Электротехнической школе Мура при Пенсильванском университете.)
Еще Бэббидж четко понимал, что вычислительные устройства могут сохранять свои командные инструкции и данные в одной и той же форме. Но в памяти ENIAC содержалась только информация, а программировали его путем настройки соединений с помощью реле и переключения кабелей. Первые компьютеры, способные совместно хранить программы и данные, создали в Кембридже в 1949 году. Они назывались EDS АС (Electronic Delay Storage Automatic Calculator – электронные автоматические вычислители с задержкой хранения).
Вычислительными элементами для первых электронных компьютеров служили вакуумные трубки. Эти электронные устройства размером и формой примерно с цилиндрическую лампочку (см. рис. 1.7 в следующей главе) были дорогими, хрупкими, громоздкими и требовали много энергии. Современная эра вычислительной техники началась после изобретения транзистора (1947 год) и интегральных схем (1958 год). Благодаря этим технологиям электронные системы равномерно становились все более компактными, дешевыми и быстродействующими.
В следующих трех главах рассказывается об аппаратных средствах компьютеров, причем наибольшее внимание уделяется логической архитектуре вычислительных систем, а не подробностям их физического конструирования. Архитектура практически не менялась за последние десятилетия, тогда как оборудование преобразилось просто ошеломительно. В первой главе приводится обзор структуры и компонентов компьютера. Во второй главе показывается, как компьютеры представляют информацию в виде битов, байтов и двоичных чисел. В третьей главе объясняется, как вычислительные машины проводят расчеты – как они обрабатывают биты и байты, чтобы достичь результата.
1. Что такое компьютер?
Поскольку готовое устройство будет представлять собой вычислительную машину общего назначения, оно должно включать в себя главные блоки, относящиеся к арифметическим операциям, хранению в памяти, управлению и связи с человеком-оператором.
Артур У. Бёркс, Герман Х. Голдстайн, Джон фон Нейман.Предварительное рассмотрение логического устройства электронного вычислительного прибора19, 1946
Давайте начнем обсуждение аппаратного обеспечения с обзора того, что представляет собой вычислительная машина. Мы рассмотрим ее по крайней мере с двух позиций: логической или функциональной организации (какие у нее части, что они делают и как соединены) и физической структуры (как выглядят части и как они сконструированы). Цель этой главы – разобраться, что такое компьютер и что у него внутри, узнать, что выполняет каждая его часть, и получить представление о том, что значат все эти бесчисленные сокращения и циферки.
Подумайте о ваших вычислительных устройствах. У многих читателей наверняка есть ПК, то есть или ноутбук, или настольный компьютер, произошедший от тех самых PC (Personal Computer, персональный компьютер), которые продавала компания IBM в 1981 году. Если у вас такой ПК, он работает на какой-нибудь версии операционной системы Windows от Microsoft. У других имеется Apple Macintosh под управлением той или иной версии macOS20. У третьих – хромбук (Chromebook) на операционной системе ChromeOS, которая задействует интернет для большей части вычислений и хранения данных. Более специализированные устройства вроде смартфонов, планшетов и электронных книг тоже представляют собой мощные вычислительные машины. Они все выглядят по-разному, и при использовании каждое из них ощущается по-своему, но внутри они устроены в принципе одинаково. Мы поговорим о причинах этого.
Можно провести небольшую аналогию с машинами. Функционально автомобили не меняются уже больше ста лет. В каждом из них есть двигатель, который работает на каком-либо топливе и приводит машину в движение. Есть руль, с помощью которого водитель управляет автомобилем. Есть место, где содержится топливо, а также пространство для пассажиров и их вещей. Однако физически машины сильно преобразились за столетие: их изготавливают из других материалов, они стали быстрее, безопаснее, надежнее и удобнее. Есть огромная разница между моей первой машиной (подержанным Volkswagen Beetle10 1959 года выпуска) и Ferrari, но любая из них доставит меня и мои продукты домой из магазина или провезет через всю страну, и в этом смысле они функционально одинаковы. (Отмечу для ясности, что я никогда даже не садился в Ferrari, не говоря уже о том, чтобы владеть ею, поэтому лишь предполагаю, что там хватит места для продуктов. Правда, однажды я припарковался рядом с одной из них: см. рис. 1.1.)

Рис. 1.1. Самое близкое расстояние, на которое я когда-либо подходил к Ferrari
С вычислительными машинами все то же самое. По логической организации современные компьютеры очень похожи на своих предшественников 1950-х годов, но их физические различия выходят далеко за пределы тех изменений, которые претерпели автомобили. Сегодня компьютеры намного меньше, дешевле, быстрее и надежнее, чем 60 или 70 лет назад, и буквально в миллион раз лучше по некоторым показателям. Такие усовершенствования послужили главной причиной повсеместного распространения компьютеров.
Различия между функциями и физическими свойствами – то есть между тем, что делает объект, и тем, как он устроен или работает внутри, – имеют большое значение. Для компьютеров часть «как это устроено» меняется удивительными темпами, как и их быстродействие, но вот часть «что делает» довольно стабильна. Такое различие между абстрактным описанием и конкретным воплощением будет неоднократно обсуждаться в дальнейшем.
На первой лекции я иногда провожу опрос среди студентов: у скольких из вас есть ПК, у скольких из вас есть Мас? В начале 2000-х годов соотношение уверенно держалось в области 10 к 1 в пользу ПК, но за несколько лет быстро изменилось, и теперь на долю Mac приходится более 75 % компьютеров. Впрочем, это нетипично для мира в целом, где ПК доминируют с большим отрывом.
Вызвано ли подобное неравенство тем, что один тип компьютеров превосходит другой? Если да, то что так резко изменилось за столь короткое время? Я спрашиваю студентов, какой компьютер лучше, и прошу назвать объективные критерии их выбора. На основании чего вы решаете купить тот или иной компьютер?
Естественно, один из ответов – цена. ПК обычно дешевле из-за жесткой конкуренции на рынке. Более широкий спектр дополнительных компонентов «железа», больше программного обеспечения и возможностей посоветоваться со специалистами, к тому же все это легко доступно. Яркий пример того, что экономисты называют эффектом сетевой выгоды: чем больше других людей применяют что-то, тем полезнее оно окажется для вас, примерно пропорционально количеству других пользователей.
На стороне Mac стоят надежность, качество, эстетическая привлекательность и ощущение, что «все просто работает», а за такое многие потребители готовы приплачивать.
Дебаты продолжаются, и, хотя ни одна из сторон не убеждает другую, в головах у спорящих возникают полезные вопросы, что помогает им задуматься о том, какие есть различия между разными видами вычислительных машин и что в них работает одинаково.
Аналогичные дебаты ведутся и о телефонах. Почти у каждого есть смартфон («умный телефон»), который может запускать программы («приложения»), загруженные из Apple App Store, Google Play Store или иных магазинов приложений. Телефон служит браузером, почтой, часами, камерой, проигрывателем музыки и видео, диктофоном, картой, навигатором, средством для сравнения цен в магазинах, а иногда по нему даже звонят и общаются. Обычно примерно три четверти моих студентов владеют iPhone, и почти все остальные – смартфоном на ОС Android от разных поставщиков. iPhone стоят дороже, но они обеспечивают более плавную интеграцию с экосистемой компьютеров, планшетов, часов, музыкальных плееров и облачных сервисов от Apple: вот вам и еще один пример эффекта сетевой выгоды. Лишь изредка кто-то признаётся, что пользуется только «кнопочным телефоном», у которого нет дополнительных функций, кроме возможности совершать звонки. Я проводил исследование в США среди сравнительно обеспеченных людей, а в других странах и группах населения смартфоны на Android будут распространены гораздо шире.
И снова у людей есть веские причины для выбора: функциональность, экономичность, эстетическая привлекательность, – но за всем этим, как и в случае с ПК и Мас, скрывается весьма схожая аппаратура для вычислений. Давайте посмотрим, почему так.
1.1. Логическое построение
Если бы нарисовали абстрактное изображение простого стандартного компьютера, его логическую и функциональную архитектуру, то оно выглядело бы как схема на рисунке 1.2, причем как для Мас, так и для ПК. Процессор, какая-нибудь оперативная память, внешняя память и многие другие компоненты, соединенные набором проводов – шиной, которая передает информацию между ними.
Если мы представим в такой форме телефон или планшет, то рисунки будут похожи, но мышь, клавиатура и дисплей объединятся в один компонент, появятся экран и многие другие скрытые компоненты, такие как компас, датчик поворота экрана, GPS-приемник для определения вашего физического местоположения.
Базовая организация – процессор, память и хранилище для инструкций и данных, а также устройства ввода и вывода – была стандартной с 1940-х годов. Ее часто называют архитектурой фон Неймана в честь Джона фон Неймана, который описал ее в цитируемой выше статье 1946 года. Хотя и сейчас порой возникают дискуссии о том, не получает ли фон Нейман слишком много славы за работу, проделанную другими, его статья написана столь ясно и познавательно, что ее стоит прочесть даже сегодня. Например, цитата в начале текущей главы – это первое предложение его статьи. В переводе на современную терминологию, процессор обеспечивает арифметические операции и управление, оперативная и внешняя память – хранение в памяти, а клавиатура, мышь и дисплей взаимодействуют с человеком-оператором.

Рис. 1.2. Архитектурная схема простого идеализированного компьютера
Примечание по терминологии: процессор исторически назывался ЦПУ, или центральное процессорное устройство, но сейчас его часто именуют просто «процессор». Оперативную память часто называют ОЗУ, или оперативное запоминающее устройство, а внешнюю память – диск или накопитель, что отражает разницу в их материальных воплощениях. В основном я буду использовать слова «процессор», «память» и «хранилище», но иногда вы встретите старые термины.
1.1.1. Процессор
Процессор – это мозг компьютера, если такое слово можно здесь применить. Он выполняет арифметические вычисления, перемещает данные, управляет работой других элементов. Процессору доступен лишь ограниченный набор базовых операций, но он проводит их с невероятной быстротой, совершая миллиарды действий в секунду. На основе результатов предыдущих вычислений ЦПУ может решать, какие операции проводить дальше, поэтому он сравнительно независим от своих пользователей-людей. В главе 3 мы уделим этому компоненту больше времени, потому что он играет важную роль.
Если вы зайдете в магазин онлайн или офлайн, чтобы купить компьютер, то наткнетесь на описание всех компонентов, где обычно указываются загадочные аббревиатуры и не менее загадочные цифры. Например, вам может встретиться такое описание процессора – «2.2 GHz двухъядерный Intel Core 17», как в одном из моих компьютеров. Что это такое? Данный процессор произведен компанией Intel, a Core i7 – это название их обширной линейки. Он имеет два процессорных блока в одном корпусе: в этом контексте «ядро» синонимично «процессору». Любое ядро – само по себе процессор, однако в ЦПУ может входить несколько ядер, которые работают либо вместе, либо раздельно, но вычисления ускоряются в любом случае. Чаще всего приемлемо определять такую конструкцию как «процессор» независимо от того, сколько в ней ядер.
«2,2 ГГц» – это более интересная часть. Скорость процессора можно измерить, пусть даже примерно, подсчитав количество операций, команд или их частей, которые он способен произвести за секунду. Для пошагового выполнения своих основных операций процессор полагается на внутренние часы, которые «отбивают ритм», как сердцебиение или метроном. Один из показателей скорости – количество таких тактов в секунду. Один удар или такт в секунду называется одним герцем (сокращенно Гц) в честь немецкого инженера Генриха Герца, который в 1888 году открыл, как получать электромагнитное излучение, что напрямую привело к появлению радио и других беспроводных систем. Радиостанции вещают на частотах, измеряемых в мегагерцах (миллионах герц), например 102,3 МГц. Современные компьютеры, как правило, функционируют с частотой в миллиарды герц, или гигагерц – ГГц. Значит, мой довольно обычный процессор в 2,2 ГГц работает со скоростью 2 200 000 000 тактов в секунду. Человеческое сердце бьется с частотой примерно 1 Гц, или почти 100 000 ударов в день, то есть около 30 миллионов ударов в год. Итак, каждое ядро в моем процессоре за одну секунду выполняет столько операций, сколько мое сердце совершило бы за 70 лет.
Выше мы познакомились с некоторыми «числовыми» приставками вроде «мега» и «гига», которые весьма распространены в компьютерных системах. Мега – это один миллион, или 106, а гига (ударение на первый слог) – один миллиард, или 109. Вскоре мы познакомимся с другими приставками, полный список которых вы можете найти в глоссарии.
1.1.2. Оперативная память
Оперативная память хранит информацию, которая активно используется процессором и другими частями компьютера, причем ЦПУ способно изменять ее содержимое. В оперативной памяти содержатся не только данные, с которыми в данный момент работает процессор, но и инструкции по совершаемым операциям. Это чрезвычайно важный момент: загружая различные инструкции в память, мы можем «поручать» процессору разные вычисления. Благодаря этому ЭВМ с хранимой программой становится устройством общего назначения. Один и тот же компьютер способен запускать текстовый редактор и электронные таблицы, просматривать веб-страницы, отправлять и получать электронную почту, поддерживать связь с друзьями на Facebook11, помогать с налогами и проигрывать музыку. И все это благодаря размещению подходящих инструкций в памяти. Важность концепции хранимой программы невозможно переоценить.
Оперативная память предоставляет место для хранения информации во время работы компьютера. В ней содержатся инструкции программ, которые на данный момент активны, – например, Word, Photoshop или браузера. Также в ней хранятся их данные: редактируемые документы, изображения на экране, воспроизводимая в данный момент музыка. Наконец, там же размещаются инструкции оперативной системы – Windows, macOS или какой-либо иной, – которая работает за кулисами и позволяет вам запускать несколько приложений одновременно. Мы поговорим о приложениях и оперативных системах в главе 6.
Оперативную память также называют памятью с произвольным доступом (англ, random access memory, или RAM, а в русской терминологии – ОЗУ, оперативное запоминающее устройство), потому что процессор может одинаково быстро достать информацию из любой части устройства. Если немного упростить, то доступ к ячейкам памяти в случайном порядке не приводит к потере скорости. Хотя видеокассеты давно ушли в прошлое, возможно, вы помните, что если вам хотелось посмотреть конец фильма, то приходилось ускоренно перематывать вперед (плавно!) от начала. Такой доступ называется последовательным.
Как правило, ОЗУ энергозависимо, то есть содержимое памяти исчезает при отключении электричества, и вся активная в данный момент информация теряется. Вот почему разумно сохранять свою работу почаще, особенно на настольном компьютере, чтобы не навлечь на себя истинное бедствие, случайно выдернув шнур питания.
Ваш компьютер имеет фиксированный объем оперативной памяти. Ее емкость измеряется в байтах. Один байт — это минимальный объем памяти, которого достаточно для хранения одного символа вроде W или или короткого числа, такого как 42, или фрагмента более крупного значения. В главе 2 будет показано, в какой форме информация хранится в памяти и других частях компьютера, поскольку это один из фундаментальных вопросов вычислительной техники. Но пока вы можете представить себе память как громадный набор одинаковых маленьких коробочек, пронумерованных до нескольких миллиардов. Каждая из них содержит в себе небольшое количество информации.
Что такое емкость? В ноутбуке, на котором я сейчас печатаю, емкость оперативной памяти составляет 8 миллиардов байт, или 8 гигабайт (8 Гб), чего, возможно, слишком мало. Причина в том, что для ускорения вычислений обычно требуется увеличение объема памяти, поскольку ее никогда не хватает на все программы, которые одновременно хотят ее использовать, и требуется время, чтобы извлечь из нее части неактивной программы, освобождая место для чего-то нового. Если вы хотите, чтобы ваш компьютер работал быстрее, то, скорее всего, лучший вариант – купить больше «оперативки». По крайней мере, если предусмотрена возможность расширения памяти, что бывает не всегда.
1.1.3. Внешняя память
Оперативная память обладает большой, но ограниченной емкостью для хранения информации, и ее содержимое исчезает при отключении питания. Внешняя память не теряет размещенные в ней данные, даже когда электричество отключается. Существует два основных вида внешней памяти: более старый – жесткий (магнитный) диск, или накопитель на жестком диске (HDD), и более современное устройство – твердотельный диск, или SSD. Оба вида накопителей гораздо объемнее, чем оперативная память, и они не энергозависимы, то есть информация на любом диске не сотрется, даже если пропадет электропитание. Данные, инструкции и все остальное содержатся во внешней памяти в течение длительного времени и лишь ненадолго переносятся в оперативную память.
Жесткий диск хранит информацию, задавая направление намагничивания крохотных участков магнитного материала на вращающихся металлических поверхностях. Данные содержатся на концентрических дорожках, которые записываются и считываются датчиком, перемещающимся с дорожки на дорожку. Жужжание и щелчки, которые вы слышите при работе старого компьютера, издает диск, перемещая датчик в нужные места на поверхности. Поверхность диска вращается с огромной скоростью, как минимум 5400 оборотов в минуту. На изображении стандартного диска ноутбука (рис. 1.3) показаны поверхность и датчик. Диаметр тарелки жесткого диска составляет 6,35 см (2,5 дюйма).
Хранение одного байта на диске примерно в 100 раз дешевле, чем на ОЗУ, но при этом доступ к информации происходит медленнее. Дисководу требуется примерно 10 миллисекунд, чтобы добраться до определенной дорожки на поверхности, и скорость передачи данных составляет около 100 Мб/с.

Рис. 1.3. Внутренняя структура жесткого диска
Десять лет назад почти во всех ноутбуках стояли магнитные жесткие диски. Сегодня почти все снабжены SSD-накопителями, которые используют не вращающееся оборудование, а флеш-память. Она энергонезависима, поскольку информация содержится в ее схемах в виде электрических зарядов. Даже при отключении питания они не исчезают из индивидуальных элементов схемы. Сохраненные заряды можно считывать для определения того, какое значение они отображают, а также стирать и перезаписывать с новым значением. Флеш-память работает быстрее, легче, надежнее, не выходит из строя при падении и требует меньше энергии, чем обычный дисковый накопитель, поэтому ее применяют в сотовых телефонах, камерах и других устройствах. Цена за байт пока что выше, чем у HDD, но снижается. Преимущества SSD-накопителей настолько убедительны, что они в значительной степени вытеснили механические диски в ноутбуках.
Обычный SSD для ноутбука вмещает от 250 до 500 Гб. Различные внешние диски, которые можно подключить к разъему USB, имеют емкость до нескольких терабайт (Тб), и они по-прежнему основываются на вращающихся механизмах. «Тера» означает триллион, или 1012, и это еще одно обозначение, с которым вы будете часто сталкиваться.
Кстати, насколько велик терабайт или гигабайт? Один байт хранит один буквенный знак стандартного английского алфавита. Роман «Гордость и предубеждение» объемом около 250 бумажных страниц содержит 680 000 знаков, и тогда 1 Гб может хранить около 1500 копий этого произведения21. Впрочем, мне бы вполне хватило одной копии, а на свободное место я записал бы какую-нибудь музыку. Одна минута музыки в формате MP3 занимает около 1 Мб. Значит, если я запишу МР3-версию одного из моих любимых звуковых компакт-дисков The Jane Austen Songbook объемом около 60 Мб, то в одном гигабайте памяти хватит места еще для 15 часов музыки. Сериал «Гордость и предубеждение» 1995 года (производство ВВС, в главных ролях Дженнифер Эль и Колин Фёрт) на двух DVD занимает менее 10 Гб, поэтому я могу сохранить на одном терабайте его и еще сотню подобных фильмов.
На примере дискового накопителя очень удобно объяснять различия между логической структурой и физической реализацией. Программы вроде File Explorer («Проводник») для Windows или Finder для macOS отображают содержимое диска в виде иерархии папок и файлов. Но хранить сами данные можно на вращающемся оборудовании, в интегральных схемах без подвижных частей или на чем-то совершенно другом. Тип накопителя на компьютере не имеет значения. Аппаратное обеспечение в виде диска и программное обеспечение в рамках ОС, называемое файловой системой, работают вместе, создавая организационную структуру. Мы вернемся к этой теме в главе 6.
Такая логическая организация настолько хорошо подходит людям (или, возможно, мы уже так сильно к ней привыкли), что ее применяют и в других устройствах, даже если там она реализуется совершенно иными аппаратными средствами. Например, программа, которая обеспечивает доступ к информации на CD или DVD, создает впечатление, что данные хранятся в файловой иерархии, независимо от того, как они располагаются физически. То же самое относится к USB-устройствам, камерам и другим гаджетам, где используются карты памяти. И даже почтенная дискета, ныне полностью вышедшая из употребления, на логическом уровне устроена аналогично. Это хороший пример абстракции, встречающейся повсюду в компьютерных системах. Согласно этой идее, детали физической реализации нужно скрывать. В случае файловой системы, независимо от того, какие технологии задействованы, данные представляются пользователю в виде иерархии файлов и папок.
1.1.4. Другие устройства
Существует множество прочих устройств со специальными функциями. Мышки, клавиатуры, сенсорные экраны, микрофоны, камеры и сканеры дают людям возможность вводить данные. Дисплеи, принтеры и динамики выводят информацию. Сетевые компоненты вроде Wi-Fi и Bluetooth обеспечивают взаимодействие с другими вычислительными устройствами. Различные вспомогательные технологии содействуют пользователям со зрительными, слуховыми или другими ограничениями.
На схеме архитектуры (рис. 1.2) все такие устройства и системы соединены одним набором проводов, называемых шиной, – данный термин заимствован из электротехники. На самом деле внутри компьютера находится много шин, свойства которых зависят от их функций: короткие, быстрые и дорогие соединяют память с процессором, а длинные и медленные, но дешевые, ведут к разъему для наушников. Некоторые из них имеют выход наружу – например, вездесущая универсальная последовательная шина, или USB, которая используется для подключения устройств к компьютеру.
Сейчас мы не станем уделять много времени другим приспособлениям, но иногда я буду их упоминать в том или ином контексте. А пока попробуйте вспомнить все устройства, которые сопутствуют вашему вычислительному устройству или подключены к нему: мыши, клавиатуры, тачпады и сенсорные экраны, дисплеи, принтеры, сканеры, игровые контроллеры, наушники, динамики, микрофоны, камеры, телефоны, датчики отпечатков пальцев, каналы связи с другими компьютерами. Список можно продолжать. Все они эволюционировали так же, как процессор, память и дисковые накопители: быстро менялись физические свойства, обычно в сторону расширения возможностей и увеличения компактности при снижающейся стоимости.
Также стоит отметить, что все эти устройства объединяются. Сотовые телефоны теперь служат часами, калькуляторами, фото- и видеокамерами, проигрывателями музыки и видео, игровыми приставками, считывателями штрих-кодов, навигаторами и даже фонариками.
Смартфон имеет ту же абстрактную архитектуру, что и ноутбук, хотя и с существенными отличиями в реализации из-за ограничений по размеру и мощности. В телефонах нет жестких дисков, которые показаны на рис. 1.3, но у них есть флеш-память для хранения информации (списков контактов, изображений, приложений и тому подобного), когда телефон выключен. К ним можно присоединить не так много внешних устройств, но в них обычно есть гнездо для наушников и USB-разъем. Крошечные камеры настолько дешевы, что большинство телефонов имеют по одной с каждой стороны. Планшеты, такие как iPad и его конкуренты, занимают другую нишу в пространстве возможностей, но и они – вычислительные машины с такой же общей архитектурой и схожими компонентами.
1.2. Механическая конструкция
На занятиях я раздаю всевозможные образцы «железа» (найденные за десятки лет лазания по помойкам) со снятыми кожухами. В информатике столь много абстрактного, что бывает довольно полезно увидеть и потрогать диски, чип с интегральными схемами, пластины, в которые они встроены, и т. д. Также интересно посмотреть на эволюцию некоторых устройств. Например, современный жесткий диск ноутбука внешне неотличим от своих предшественников, выпущенных десять или двадцать лет назад. Емкость более нового диска увеличилась в 10-100 раз, но эти улучшения невидимы. То же самое относится и к картам памяти (SD), которые мы используем, например, в камерах. Их современные корпуса идентичны тем, что применялись несколько лет назад (рис. 1.4), но емкость карт намного выше, а цена ниже.
Так, изображенная здесь карта на 32 Гб стоит меньше 10 долларов.

Рис. 1.4. SD-карты весьма разной емкости
С другой стороны, в печатных платах, на которых размещены компоненты компьютера, наблюдается явный прогресс. Сегодня компонентов меньше, потому что внутри находится больше микросхем, проводка тоньше, а соединительные контакты («штырьки») более многочисленны и расположены гораздо плотнее, чем 20 лет назад.

Рис. 1.5. Печатная плата для ПК, выпущена ок. 1998 года.
Размер 12 × 7,5 дюймов (30 × 19 см)
На рис. 1.5 показана печатная плата для настольного ПК конца 1990-х годов. Такие компоненты, как процессор и память, смонтированы на плате (или вставлены в нее) и соединены проводами, проложенными на другой стороне. На рис. 1.6 показана часть оборотной стороны той же печатной платы, где параллельно идущие печатные провода – это шины разного типа.

Рис. 1.6. Шины на печатной плате
Электронные схемы в компьютерах формируются из нескольких базовых элементов, представленных в большом количестве. Наиболее важный из них – логический вентиль, который вычисляет одно выходное значение на основе одного или двух входных. Он использует входные сигналы (напряжение или силу тока) для управления выходным сигналом аналогичного вида. При наличии достаточного количества таких вентилей, соединенных правильным образом, возможно производить вычисления любого типа. Чарльз Петцольд в своей книге «Код»22 удачно знакомит нас с этим процессом, а на многочисленных веб-сайтах представлены графические анимации, которые показывают, как логические схемы выполняют арифметические и другие вычисления.
Основным элементом схемы служит транзистор — устройство, изобретенное в Лабораториях Белла12 в 1947 году учеными Джоном Бардином, Уолтером Браттейном и Уильямом Шокли, которые в 1956 году получили за это Нобелевскую премию по физике. В компьютере транзистор играет роль переключателя, который может включать и выключать ток под воздействием напряжения. На таком простом основании можно построить сколь угодно сложные системы.
Логические вентили раньше собирались из дискретных компонентов: вакуумных (электронно-лучевых) трубок размером с электрическую лампочку в ENIAC и отдельных транзисторов величиной примерно с карандашный ластик в компьютере 1960-х годов. На рис. 1.7 показаны копия первого транзистора (слева), вакуумная трубка и процессор в корпусе. Сама схема находится в центре и занимает площадь около 1 кв. см, а электронно-лучевая трубка имеет длину около 4 дюймов (10 см). Современный процессор такого размера содержал бы в себе несколько миллиардов транзисторов.
Логические вентили создаются на интегральных схемах, или ИС, которые часто называют микросхемами или микрочипами.
Интегральная схема содержит все компоненты и проводку электронной схемы на одной плоской поверхности (тонкий лист полупроводника), которая создается путем сложной последовательности оптических и химических процессов. В итоге получается схема без дискретных элементов и проводов обычного вида. Такие ИС намного компактнее и надежнее, чем схемы с дискретными компонентами. Микросхемы массово изготавливаются на круглых кристаллических пластинах (платах) диаметром 12 дюймов (30 см): из них затем нарезаются отдельные микросхемы, каждую из которых помещают в свой корпус. Обычная микросхема (рис. 1.7, внизу справа) монтируется в больший по размеру корпус с 10-100 штырьками, соединяющими ее с остальной системой. На рис. 1.8 показана интегральная схема в корпусе, где сам процессор находится в центре, и его площадь составляет около 1 кв. см.

Рис. 1.7. Вакуумная трубка, первый транзистор, микросхема процессора в корпусе

Рис. 1.8. Чип интегральной схемы
Из-за того, что интегральные схемы основаны на кремнии, регион в Калифорнии к югу от Сан-Франциско, где впервые возник бизнес по производству этих схем, стали называть Кремниевой долиной. Сейчас так условно называют все высокотехнологичные предприятия в этом регионе, а это название стало вдохновляющим для десятка подражателей, таких как Кремниевая аллея (Silicon Alley) в Нью-Йорке и Кремниевый торфяник (Silicon Fen) в Кембридже, Англия.
ИС изобрели примерно в 1958 году, причем открытие независимо друг от друга сделали Роберт Нойс и Джек Килби. Нойс умер в 1990 году, но Килби за свой вклад получил в 2000 году Нобелевскую премию по физике. Хотя интегральные схемы занимают центральное место в цифровых устройствах, другие технологии здесь также используются: магнитное запоминающее устройство для дисков, лазеры для CD и DVD и оптическое волокно для сетей. За последние 50–60 лет все они радикально изменились в размерах, производительности и стоимости.
1.3. Закон Мура
В 1965 году Гордон Мур, который затем станет соучредителем компании Intel и будет работать там генеральным директором на протяжении многих лет, опубликовал короткую статью под названием «Втиснуть больше компонентов в интегральные схемы»23. Экстраполируя очень ограниченное количество данных, Мур заметил, что с усовершенствованием технологий количество транзисторов, которые удавалось встроить в интегральные схемы заданного размера, удваивалось примерно каждый год. Затем, пересмотрев расчеты, он изменил этот показатель на «каждые два года», а другие исследователи говорили о 18 месяцах. Поскольку вычислительную мощность можно грубо определять по количеству транзисторов, то она тоже удваивалась каждые два года, если не быстрее. За 20 лет должно было произойти 10 удвоений, и количество устройств увеличилось бы в 210, то есть примерно в 1000 раз. За 40 лет – в миллион раз или больше.
Такой экспоненциальный рост, ныне известный как закон Мура, продолжается уже почти 60 лет, и поэтому в интегральные схемы сейчас встраивают в миллион раз больше транзисторов, чем в 1965 году. График действия закона Мура, особенно для микросхем процессора, показывает рост количества транзисторов от пары тысяч для ЦПУ Intel 8008 в начале 1970-х годов до миллиарда в ЦПУ недорогих потребительских ноутбуков нашего времени.
Наилучшим образом масштабы схемы характеризует какое-либо отдельное число, обозначающее размер того или иного элемента интегральной схемы – например, ширину провода или активной части транзистора. Этот показатель неуклонно сокращается на протяжении многих лет. В первой (и единственной) интегральной схеме, которую я однажды разрабатывал в 1980 году, величина элементов равнялась 3,5 микрона (3,5 микрометра). В 2021 году для многих ИС минимальный размер элементов составлял 7 нанометров, или 7 миллиардных долей метра, а следующим шагом будет 5 нанометров. «Милли» – это одна тысячная доля, или 10-3; «микро» – одна миллионная, или 10-6; «нано» – одна миллиардная, или 10-9, а нанометр сокращенно обозначается как нм. Для сравнения: толщина листа бумаги или человеческого волоса составляет 100 микрометров, или 1/10 миллиметра.
Если ширина элементов в интегральной схеме уменьшится в 1000 раз, то количество компонентов на единицу площади увеличится в квадратной зависимости, т. е. в миллион раз. Соответственно, там, где по старому производственному процессу размещали тысячу транзисторов, теперь хватит места для миллиарда.
Разработка и изготовление интегральных схем – чрезвычайно сложный и высококонкурентный бизнес. Кроме того, производственные операции («сборочные линии») весьма дороги: новый завод может стоить миллиарды долларов. Компания, которая не успевает за финансовым и технологическим развитием, будет уступать своим соперникам на рынке, а страна, у которой нет таких ресурсов, попадет в технологическую зависимость от других государств, что потенциально может стать серьезной проблемой стратегического уровня.
Закон Мура – это не закон природы, а руководящий принцип, который применяли в индустрии полупроводников для постановки целей. В какой-то момент он перестанет действовать. В прошлом часто предсказывали, что предел миниатюризации достигнут, но до сих пор находятся способы его преодолеть. Однако мы уже приближаемся к тому, что в отдельных схемах будет находиться лишь несколько атомов, а этого слишком мало, чтобы управлять ими.
Скорость процессоров возрастает не особенно – и уж точно больше не удваивается каждые два года, – отчасти потому, что быстрые микросхемы выделяют слишком много тепла. Но объем памяти по-прежнему увеличивается. Так или иначе, процессоры могут использовать больше транзисторов, если поместить два или более ядер ЦПУ на одной микросхеме. Кроме того, в системах зачастую применяются несколько процессорных ИС. Происходит рост количества ядер, а не скорости их работы.
Интересно будет сравнить современный персональный компьютер и первый ПК от IBM, который выпустили 1981 году. Процессор того ПК работал с тактовой частотой 4,77 МГц, то есть почти в 500 раз меньше, чем у процессорного ядра 2,2 ГГц, к тому же у такого ЦПУ обычно два или четыре ядра. Компьютер от IBM располагал 64 килобайтами оперативной памяти, а у современных компьютеров ее в 125 000 раз больше – 8 Гб. («Кило» – это одна тысяча, поэтому сокращение для килобайта – Кб.) Объем памяти гибких дисков для первого ПК составлял не более 750 Кб, а жесткого диска он не имел, тогда как в современных ноутбуках внешней памяти уже почти в миллион раз больше. Первый ПК мог выводить на свой 11-дюймовый монитор только 24 ряда по 80 зеленых символов на черном фоне, а большую часть этой книги я написал, сидя перед 24-дюймовым экраном с 16 миллионами цветов. Компьютер с 64 Кб памяти и одним гибким диском объемом 160 Кб стоил 3000 долларов в 1981 году, что сейчас с учетом инфляции эквивалентно 10 000 долларов, а ноутбук с процессором 2 ГГц, 8 Гб оперативной памяти и SSD-диском на 256 Гб сегодня продается за пару сотен.
1.4. Краткие выводы
Компьютерное оборудование, то есть все виды цифрового аппаратного обеспечения, экспоненциально совершенствуется на протяжении 60 лет, начиная с изобретения интегральных схем. Термин «экспоненциально» часто понимают и употребляют неверно, но в данном случае он точно отражает ситуацию: за каждый фиксированный период времени схемы становились компактнее, дешевле или производительнее на определенный процент. Простейший пример – закон Мура: примерно каждые 18 месяцев количество элементов, помещавшихся на интегральную схему заданного размера, почти удваивается. Этот огромный рост возможностей послужил основой цифровой революции, которая так сильно изменила нашу жизнь.
Скачок возможностей и производительности также изменил наши представления о том, что такое информатика и компьютеры. Первые вычислительные машины рассматривались как сверхбыстрые арифмометры, пригодные для решения задач баллистики, проектирования оружия и других научных и инженерных расчетов. Потом они пригодились в обработке данных для бизнеса: они составляли платежные ведомости, формировали счета и так далее. Когда цена накопителей уменьшилась, ЭВМ начали управлять базами данных, где хранилась информация для подготовки тех самых ведомостей и счетов. С появлением ПК компьютеры стали настолько дешевыми, что их смог позволить себе каждый, и тогда они стали использоваться для обработки персональных данных, ведения расчетов по домашним финансам и операций с текстами (например, для написания писем). Вскоре после этого их начали применять в развлекательных целях вроде воспроизведения музыки с компакт-дисков, но в особенности для игр. А когда возник интернет, наши компьютеры заодно превратились и в устройства для общения, на которых работают электронная почта, Всемирная паутина и социальные сети.
Базовая архитектура компьютера – его составные части, их функции и то, как они соединяются друг с другом, – не менялась с начала 1940-х годов. Если бы фон Нейман явился к нам и изучил один из современных компьютеров, то, полагаю, его ошеломили бы возможности и способы применения современного оборудования, но логическая структура показалась бы ему совершенно привычной.
Раньше компьютеры имели огромные размеры и занимали большие комнаты с кондиционерами, но затем постепенно уменьшились. Современные ноутбуки настолько малы, насколько это возможно с точки зрения удобства пользователя. Вычислительные устройства внутри наших телефонов довольно мощные, а сами телефоны настолько компактны, насколько это разумно. ЭВМ внутри наших гаджетов тоже крохотные. На другом конце диапазона расположены «компьютеры», которые находятся где-то в центрах обработки и хранения данных (возвращаемся к комнатам с кондиционерами), однако мы регулярно имеем дело и с ними. Мы совершаем покупки, запускаем поиск, беседуем с друзьями – и все благодаря этим вычислительным машинам, причем мы даже не думаем о них как о компьютерах, не говоря уже о том, чтобы интересоваться их местоположением. Они просто где-то «там», в облачной среде.
Одно из величайших открытий информатики XX века заключается в том, что логические или функциональные свойства и современных цифровых компьютеров, и первых ПК, и их более объемных и менее мощных предшественников, и вездесущих телефонов, и устройств, зависящих от компьютеров, и сервисов облачных вычислений, по сути одинаковы. Если не брать в расчет показатели вроде скорости и емкости накопителей, все эти ЭВМ проводят одни и те же вычисления. Следовательно, усовершенствования в аппаратном обеспечении вносят огромный практический вклад в тех областях, где применимы такие расчеты, но, что удивительно, сами по себе не оказывают серьезного влияния на то, что в принципе можно «обсчитывать». Мы поговорим об этом более подробно в главе 3.
2. Биты, байты и формат записи информации
В этой главе мы обсудим три фундаментальные концепции того, как информация представлена в вычислительных устройствах.
Во-первых, компьютеры – это машины для обработки цифровых данных. Они хранят и обрабатывают информацию, которая поступает дискретными порциями и принимает дискретные значения (по сути, просто цифры). А вот аналоговая информация подразумевает плавное изменение значений.
Во-вторых, компьютеры представляют информацию в битах. Бит – это двоичная цифра, то есть число, равное 0 или 1. Внутри вычислительной машины всё записывается в виде битов, а не привычных для нас десятичных чисел.
В-третьих, группы битов представляют более крупные объекты. Числа, буквы, слова, названия, звуки, изображения, фильмы и инструкции, из которых составлены программы для их обработки, – все это представлено в виде групп битов.
Вы можете спокойно пропустить математические выкладки в этой главе, но саму идею понять важно.
2.1. Различия аналоговой и цифровой форм
Давайте определим, чем аналоговое отличается от цифрового. Слово «аналог» имеет тот же корень, что и «аналогичный», и поэтому оно подразумевает, что значения изменяются плавно по мере изменения чего-то другого. Многое из того, что окружает нас в повседневности, имеет аналоговую природу – например, водопроводный кран или руль автомобиля. Если вы хотите немного повернуть машину, то немного поворачиваете руль и вообще можете произвести сколь угодно малую регулировку. А теперь посмотрите на поворотник: его можно либо включить, либо выключить, никакого промежуточного положения. В аналоговом устройстве значение (угол поворота машины) меняется плавно и непрерывно, в определенной пропорции к изменению чего-либо (угла поворота руля). Здесь нет четко выраженных шагов: небольшие изменения одного значения приводят к небольшим изменениям в другом.
Цифровые системы имеют дело с дискретными значениями, поэтому в них используют только фиксированное количество возможных значений. Сигнал поворота либо выключен, либо включен. Если включен, то либо левый, либо правый. Небольшое изменение чего-то приводит или к тому, что больше ничего не меняется, или к тому, что нечто иное меняется резко, переходя от одного дискретного значения к другому.
Представьте себе часы. В аналоговых часах есть часовая, минутная и секундная стрелка, которая проходит один круг в минуту. Современными часами управляет внутренняя цифровая схема, так что часовая и минутная стрелки плавно меняют положение с течением времени. А вот цифровые часы или сотовый телефон отображают время в виде цифр. Числа на дисплее меняются каждую секунду, каждую минуту появляется новое значение минуты, но никогда не бывает долей секунды.
Представьте себе спидометр в автомобиле. У меня в машине традиционный аналоговый спидометр, стрелка которого перемещается размеренно и прямо пропорционально скорости движения. Переходы от одного значения скорости к другому совершаются плавно и без прерываний. Но в машине есть также цифровой дисплей, который показывает скорость с точностью до мили (или километра) в час. Если вы начнете двигаться немного быстрее, то число на нем поменяется с 65 на 66. Если поедете чуть медленнее – вернется к 65. Но он никогда не отобразит значение 65,5.
Представьте себе термометр. Те из них, что со столбиком красной жидкости (обычно подкрашенного спирта) или ртути, – аналоговые. Жидкость в них расширяется или сжимается прямо пропорционально изменению температуры, поэтому небольшое изменение температуры вызовет такое же небольшое изменение высоты столбика. А вот устройство на стене здания, высвечивающее «37°», – цифровое. У него числовой дисплей, который будет отображать 37 градусов при любой температуре между З6½ и 37½.
Это может привести к курьезным ситуациям. Год назад я ехал по шоссе в США на расстоянии приема радиосигнала из Канады, где используется метрическая система, и слушал радио. Диктор, стараясь угодить всей своей аудитории, сказал: «За последний час температура по Фаренгейту повысилась на один градус, а температура по Цельсию не изменилась».
Зачем тогда пользоваться цифровым форматом, а не аналоговым? В конце концов, наш мир аналоговый, и нам легче считывать взглядом показания аналоговых устройств, таких как часы и спидометры. Тем не менее современные технологии в большинстве своем – цифровые, и я рассматриваю в книге многие аспекты этого. Данные внешнего мира (звуки, изображения, движения, температура и прочее) при вводе как можно скорее преобразуются в цифровую форму, а при выводе – как можно позднее – обратно в аналоговую форму. Причина в том, что компьютерам легче взаимодействовать с цифровой информацией. Ее можно сохранять, передавать и обрабатывать различными способами независимо от источника происхождения. Как мы увидим в главе 8, цифровую информацию можно сжать, исключив избыточные или неважные данные. Ее можно зашифровать для обеспечения безопасности и конфиденциальности, объединить с другими данными, точно скопировать, отправить по интернету в любую точку мира и сохранить на бесконечно разнообразных устройствах. С аналоговой информацией большую часть этих действий сложно или даже невозможно осуществить.
Цифровые системы обладают еще одним преимуществом перед аналоговыми: их гораздо легче расширять. Например, секундомер на моих часах способен засекать время с точностью до сотых долей секунды, а вот добавить такую возможность аналоговым часам было бы непросто. С другой стороны, у аналоговых систем тоже есть преимущества: старые носители информации вроде глиняных табличек, камней с резьбой, пергамента, бумаги и фотопленки выдержали испытание временем, и еще неизвестно, получится ли это у цифровых форм.
2.2. Аналого-цифровое преобразование
Как мы преобразуем аналоговую информацию в цифровую форму? Давайте рассмотрим несколько основных примеров, которые в совокупности иллюстрируют наиболее важные понятия, а начнем с изображений и музыки.
2.2.1. Оцифровка изображений
Преобразование изображений в цифровую форму – возможно, самое простое наглядное объяснение процесса. Предположим, мы сфотографировали своего кота (рис. 2.1).
Аналоговая камера создает изображение, подвергая светочувствительный участок пластиковой пленки с химическим покрытием воздействию лучей, отраженных от фотографируемого объекта. На различные участки попали разные «объемы» света разных цветов, и это повлияло на окраску пленки. Затем ее обрабатывают и печатают на бумаге в ходе замысловатой последовательности химических процессов. Цвета отображаются с помощью сочетания красителей, взятых в разных долях.

Рис. 2.1. Фотография кота, 2020 год
В цифровой камере объектив фокусирует изображение на прямоугольной матрице с крошечными светочувствительными детекторами, которые находятся за красными, зелеными и синими фильтрами. Каждый детектор накапливает электрический заряд, пропорциональный количеству падающего на него света. Эти заряды преобразуются в числовые значения, и на основе полученных результатов, которые обозначают интенсивность света в тех или иных точках, создается изображение в цифровой форме. Чем больше детекторов и чем точнее измеряются заряды, тем строже цифровое изображение будет соответствовать оригиналу.
Каждый элемент матрицы датчиков представляет собой три детектора, которые измеряют количество красного, зеленого и синего света. Одна такая группа называется пикселем, или элементом изображения15. Если размер изображения составляет 4000 на 3000 пикселей, то в нем двенадцать миллионов элементов изображения, или двенадцать мегапикселей, – немного, по меркам современных цифровых фотоаппаратов. «Окраска» пикселя обычно определяется тремя значениями, которые соответствуют интенсивности красного, зеленого и синего цветов, поэтому для изображения размером 12 мегапикселей в сумме записывается 36 миллионов значений интенсивности света. На экране картинка отображается с помощью множества троек красных, зеленых и синих огоньков, уровень яркости которых задается соответствующими значениями в пикселе. Если вы посмотрите на экран телефона, компьютера или телевизора через увеличительное стекло, то разглядите отдельные пятнышки, подобно показаным на рис. 2.2, только цветные. Если вы подойдете достаточно близко к экранам стадионов или цифровых рекламных щитов, то увидите такую же картинку.

Рис. 2.2. RGB-пиксели
2.2.2. Оцифровка звука
Второй пример аналого-цифрового преобразования – обработка звука, в особенности музыкальных произведений. Цифровая музыка хороша для изучения, потому что она стала одной из первых областей, где свойства цифровой информации привели к важным последствиям в социальном, экономическом и юридическом аспектах. В отличие от виниловых пластинок или аудиокассет, цифровую музыку можно без искажений перенести на каждое домашнее устройство сколько угодно раз, а точные копии отправить в любую точку мира по интернету, где их тоже получат в безупречном виде. И всё бесплатно. Индустрия звукозаписи увидела в этом серьезную угрозу и начала кампанию на юридическом и политическом фронтах, стремясь остановить копирование. Война не окончена – стычки все еще происходят в судах и на политических аренах, – но возникновение стриминговых музыкальных сервисов, таких как Spotify, сгладило проблему. К этому вопросу мы еще вернемся в главе 9.
Что такое звук? Любой его источник вызывает колебания давления воздуха посредством вибрации или других быстрых движений, и наши уши преобразуют эти изменения в нервную активность, которую мозг интерпретирует как звук. Устройство под названием «фонограф», созданное в 1870-х годах Томасом Эдисоном, преобразовывало такие пульсации в бороздку с непостоянной глубиной на восковом цилиндре, и полученная дорожка позже использовалась для воссоздания колебаний давления воздуха. Трансформация звука в дорожку с углублениями представляла собой «запись», а обратное преобразование – «воспроизведение». Изобретение Эдисона быстро совершенствовалось, и к 1940-м годам появились долгоиграющие записи, или грампластинки (рис. 2.3), от которых не отказались до сих пор, хотя в основном их слушают любители ретрозвука.
Пластинки – это виниловые диски с длинными спиральными дорожками, на которых зашифрованы изменения звукового давления. Для записи звук подается на микрофон, измеряющий данные перепады, и полученные результаты используются для создания последовательности высот и углублений на спиральной канавке. Когда пластинка проигрывается, по этой дорожке перемещается тонкая игла. Ее движения преобразуются в колебания электрического тока, который усиливается и подается на репродуктор или наушники – устройства, создающие звук посредством вибраций поверхности.

Рис. 2.3. Грампластинка (долгоиграющая запись)
Звук легко визуализировать, если построить график изменения давления воздуха во времени, как показано на рис. 2.4. Значения давления можно передавать любым физическим способом: напряжением или током в электронной схеме, яркостью света или полностью механической системой, как в оригинальном фонографе Эдисона. Высота волн звукового давления здесь соответствует интенсивности или громкости, а по горизонтальной оси отложено время. Число волн в секунду – высота или частота звука.

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

Рис. 2.5. Оцифровка формы звукового сигнала
Измерения дают нам последовательность цифровых значений, которые приближенно отображают кривую. Чем чаще и точнее мы делаем измерения, тем меньше будет расхождение. В итоге у нас получится последовательность чисел – цифровое представление формы волны, которое можно хранить, копировать, обрабатывать и пересылать.
Воспроизводить звук можно с помощью устройств, которые генерируют на основе числовых значений последовательность изменений напряжения или тока. Полученный сигнал воздействует на динамик или наушники, и так снова создается звук. Трансформация звуковых волн в числа называется аналого-цифровым преобразованием, а соответствующие устройства – аналого-цифровыми преобразователями, или АЦП. Обратный процесс – цифро-аналоговое преобразование. Ни то ни другое не бывает совершенным: при трансформации в обоих направлениях что-то утрачивается. Для большинства людей потери незаметны, хотя аудиофилы утверждают, что цифровой звук не так хорош, как аналоговый с долгоиграющей пластинки.
Первым носителем цифрового звука, рассчитанным на потребителей, стал аудио-компакт-диск, или CD, появившийся примерно в 1982 году. В отличие от грампластинок с аналоговой канавкой, на компакт-дисках записываются числа, для чего применяется длинная спиральная дорожка на одной из сторон. Поверхность в каждой точке дорожки либо гладкая, либо почти незаметно углублена. С помощью таких ямок или их отсутствия кодируются числовые значения волны. Любой участок – это один бит, а последовательность битов передает цифровые значения в двоичном кодировании, что мы обсудим в следующем разделе. Когда диск вращается, лазер освещает дорожку, и фотоэлектрический датчик определяет интенсивность отраженного света. Если она низкая, значит, на участке есть углубление, а если высокая, то ямки нет. При стандартном кодировании на компакт-дисках берется 44 100 выборок звука в секунду. Каждая из них имеет два значения амплитуды (левый и правый каналы для стерео), измеренных с погрешностью не более 1/65 536 – последнее число равняется 216. Сами углубления настолько малы, что их можно увидеть только под микроскопом. DVD устроены аналогично, только участки на дорожке меньше, а у лазера более короткая длина волны, что позволяет записывать на них около 5 Гб по сравнению с 700 Мб для CD.
Компакт-диск практически вытеснил грампластинки из обихода, потому что значительно превосходил их во многих отношениях: не такой хрупкий, не подверженный износу (с лазером нет физического контакта), не так сильно боящийся грязи или царапин и в буквальном смысле компактный. Но пластинки периодически возрождаются из пепла, пусть и не слишком масштабно, а вот CD с поп-музыкой находятся в глубоком упадке, потому что ее проще и дешевле загрузить из интернета. Компакт-диски «подрабатывали» как средство хранения и распространения ПО и данных, но затем их место заняли DVD, а тех, в свою очередь, заменили интернет-хранилища и загрузки. Многим читателям аудиодиски уже могут показаться таким же антиквариатом, как и грампластинки. Однако же я рад, что моя музыкальная коллекция полностью состоит из CD (правда, также она хранится в формате MP3 на съемных жестких дисках). Ими я владею по-настоящему, чего нельзя сказать о подборках композиций «в облаке». Выпущенные на производстве диски переживут меня, а вот их копии, возможно, нет: при их записи использовались химические изменения в светочувствительных красителях, чьи свойства могут с течением времени стать иными.
Поскольку звук и изображения содержат больше деталей, чем человек способен воспринять, их можно сжимать. В случае музыки применяются такие методы, как MP3 и AAC (Advanced Audio Coding16). Размер файла уменьшается в 10 раз, а ухудшение качества почти неуловимо. Для изображений наиболее распространена техника сжатия JPEG, названная в честь организации-изобретателя – Joint Photographic Experts Group (Совместная экспертная группа по фотографии). С ее помощью можно уменьшить файл картинки в 10 и более раз. Сжатие – один из примеров обработки, которую можно применить к цифровой информации, но чрезвычайно сложно (а то и невозможно) к аналоговой. Подробнее мы обсудим сжатие в главе 8.
2.2.3. Оцифровка фильмов
А что насчет фильмов? В 1870-х годах английский фотограф Эдвард Мейбридж показал, как создать иллюзию движения, быстро и последовательно перемещая статичные снимки. Сегодня в кинофильмах изображения прокручиваются со скоростью 24 кадра в секунду, а в телепередачах – от 25 до 30 кадров в секунду. Это достаточно быстро, чтобы человеческий глаз воспринимал последовательность картинок как непрерывное движение. Для видеоигр данный показатель обычно составляет 60 кадров в секунду, тогда как в старых кинолентах он равен 10, поэтому в них заметно мерцание. О таком искажении нам напоминают давнее обозначение для фильмов (англ, flicks – «мерцание») и современное название Netflix.
В цифровом представлении фильма сочетаются и синхронизируются звуковые и графические компоненты24. Здесь сжатие можно применить, чтобы уменьшить запрашиваемый объем пространства, как в стандартных форматах вроде MPEG (Moving Picture Experts Group17). Ha практике отобразить видео в числах тяжелее, чем аудио. Среди причин – то, что оно сложнее по своей сути, а также то, что большая часть видеозаписей основывается на стандартах широковещательного телевидения, которое почти всегда существовало в аналоговой форме. Сейчас аналоговое ТВ постепенно сворачивается в большинстве стран мира. В США телевещание перевели на цифровой формат в 2009 году, в других странах этот процесс находится на тех или иных стадиях.
Кино и телешоу представляют собой комбинацию изображений и звука, а производство коммерческих фильмов обходится гораздо дороже, чем производство музыки, однако сделать идеальные цифровые копии кинолент и бесплатно разослать их по всему миру настолько же просто. Поэтому убыток от нарушения авторских прав в данном случае выше, и индустрия развлечений продолжает кампанию против пиратства.
2.2.4. Оцифровка текста
Некоторые виды информации легко представить в цифровой форме, поскольку не требуется никаких преобразований, кроме согласования формата записи. Рассмотрим обычный текст – набор символов алфавита, цифр и знаков препинания, как в этой книге. Мы могли бы присвоить уникальный номер каждой отдельной букве: А равно 1, В равно 2 и так далее. Получилось бы прекрасное цифровое представление. Фактически именно так все и делается, разве что в стандартном представлении буквам от А до Z соответствуют числа с 65 по 90, от а до z – с 97 по 122, цифрам от 0 до 9 – с 48 по 57, а другие символы, такие как знаки препинания, принимают другие значения. Это представление называется ASCII (American Standard Code for Information Interchange) – стандартный американский код для обмена информацией, принятый в 1963 году.
На рис. 2.6 показана часть ASCII; я опустил первые четыре ряда, в которых содержится табуляция, пробел и другие непечатаемые символы.

Рис. 2.6. Символы ASCII и их числовые значения
В разных географических и языковых регионах существует множество стандартов для набора символов, но мир, по большому счету, сошелся на одном из них, который называется Unicode (Юникод). Он определяет уникальное числовое значение для каждого знака во всех языках. Это большая коллекция, поскольку люди, создавая системы письменности, всегда проявляли бесконечную изобретательность, но редко заботились о систематичности. Unicode включает в себя 140 тысяч символов, и их число неуклонно растет. Как несложно представить, значительную часть объема составляют азиатские знаки вроде набора китайских иероглифов, но ими дело не ограничивается. На веб-сайте Юникода (https://home.unicode.org/) можно просмотреть списки всех символов – это увлекательное занятие, и туда определенно стоит заглянуть.
Подведем итог: цифровые формы записи способны представлять любые из перечисленных видов информации и вообще всё, что можно преобразовать в числовые значения. Поскольку это всего лишь цифры, они подходят для обработки вычислительными машинами. Как мы увидим в главе 9, числовые данные можно скопировать на любой компьютер через универсальную цифровую сеть – интернет.
2.3. Биты, байты и двоичная система исчисления
В мире есть только 10 типов людей: те, которые понимают двоичные числа, и те, кто их не понимает.
Цифровые системы представляют любую информацию в виде числовых значений. Возможно, вы удивитесь, но в процессе работы они не используют привычную нам десятичную систему счисления (систему по основанию 10). Вместо этого там применяются двоичные числа – система по основанию 2.
Хотя каждый более-менее знаком с арифметикой, я вижу по своему опыту, что люди не слишком четко понимают, что такое число, особенно когда дело доходит до построения аналогий между десятичной системой (хорошо известной) и двоичной (незнакомой большинству). В текущем разделе я постараюсь прояснить этот вопрос, но, если вам покажется, что все запуталось и путает вас самих, просто говорите себе: «Это как обычные числа, только вместо десяти – два».
2.3.1. Биты
Биты – наиболее элементарный способ представления цифровой информации. Как отмечено в цитате в начале этой главы, «бит» – это сокращение от слов «двоичное число» (англ, binary digit), введенное статистиком Джоном Тьюки в середине 1940-х годов. Эдвард Теллер, хорошо известный как отец водородной бомбы, предпочитал использовать слово «биджит» (bigit), которое, к счастью, не прижилось.
Термин «двоичный», или «бинарный», указывает на то, что нечто имеет два значения (приставка «би» означает «два»), и это действительно так, ведь бит принимает значение либо 0, либо 1, и никакое иное. Тут очевидно различие с десятичными цифрами: они имеют 10 возможных значений, от 0 до 9.
С помощью одного бита мы способны закодировать или представить любую ситуацию, где есть выбор единственного параметра из двух. Таких бинарных вариантов предостаточно: вкл./выкл., истина/ложь, да/нет, высоко/ низко, вход/выход, вверх/вниз, влево/вправо, север/юг, восток/запад и т. д. Одного бита достаточно, чтобы определить, какой элемент из пары выбран. Например, мы можем присвоить «выключить» значение 0, а «включить» – 1, или наоборот. Главное, чтобы все согласились с таким определением.
На рис. 2.7 изображены тумблер питания на моем принтере и стандартный значок «вкл./выкл.», который встречается на многих устройствах. Это тоже символ из Unicode.
Одного бита достаточно, чтобы представить включение/выключение, истину/ложь и подобные двоичные выборы, но нам нужен способ для отображения более обширных диапазонов или более сложных концепций. Для этого мы используем группы битов – всевозможные комбинации нолей и единиц. Например, чтобы представить четыре года обучения в колледже США, возьмем два бита: первокурсник (00), второкурсник (01), третьекурсник (10) и старшекурсник (11). Если у нас появится еще одна категория, скажем, аспирант, то двух битов будет недостаточно – нам понадобится пять возможных значений, а комбинаций из двух битов только четыре. Трех нам хватит, и даже больше того: теперь у нас получится представить до восьми различных категорий, поэтому можно добавить профессуру, штатных преподавателей и научно-педагогических работников. Получатся следующие комбинации: 000, 001, 010, 011, 100, 101, 110 и 111.

Рис. 2.7. Тумблер питания и стандартный значок включения-выключения
Существует правило для соотнесения количества битов и максимального количества элементов, которые удастся обозначить ими. Взаимосвязь проста: если имеется N битов, то число различных способов их скомбинировать равняется 2N, то есть 2 × 2 ×… × 2 (N раз), как показано на рис. 2.8.

Рис. 2.8. Степени числа 2
Аналогичное правило применимо и к десятичным цифрам: если их взято N, то количество их уникальных комбинаций (которые мы называем числами) равно 10N (см. рис. 2.9).

Рис. 2.9. Степени числа 10
2.3.2. Степени чисел 2 и 10
Поскольку все в компьютере обрабатывается в двоичном формате, такие свойства, как размеры и емкости, обычно выражаются в степенях двойки. Если у нас N битов, то возможных значений будет 2N, поэтому удобно знать степени двойки до некоторого значения, скажем, до 210. Совсем большие числа, конечно, уже не стоит запоминать. К счастью, есть простой способ – округление, как показано на рис. 2.10. Определенные степени двойки довольно близки к степеням десятки, причем это сходство упорядоченно и его легко запомнить. На той же иллюстрации показан еще один префикс размера – «пета», или 1015. В глоссарии в конце книги есть более подробная таблица с дополнительными единицами измерения.

Рис. 2.10. Степени чисел 2 и 10
Чем больше значения, тем заметнее разница, но даже при 1015 округление составляет всего 12,6 %, так что эта схема полезна в широком диапазоне. Вы обнаружите, что люди часто не делают больших различий между степенями 2 и 10 (особенно если это играет им на руку в чем-либо), поэтому «кило» или «1К» могут означать как тысячу, так и 210, то есть 1024. Разница обычно невелика, поэтому знать степени чисел 2 и 10 весьма полезно, когда вы проводите в уме расчеты с большими значениями, связанными с битами.
2.3.3. Двоичные числа
Последовательность битов может отображать число, если считать, что цифры, как обычно, расставлены по разрядам, только с основанием 2, а не 10. Десяти цифр от 0 до 9 достаточно, чтобы обозначить десять предметов. Если их больше, то нам понадобится больше разрядов. Так, с помощью двух десятичных цифр мы сможем обозначить до 100 предметов – от 00 до 99. Для более чем 100 предметов мы возьмем три разряда и получим 1000 комбинаций – от 000 до 999. Нужно отметить, что мы, как правило, не записываем начальные нули для чисел, но они подразумеваются. Кроме того, в повседневной жизни мы начинаем считать от единицы, а не от нуля.
Десятичные числа – это сокращенная запись для сумм степеней 10. Например, 1867 – это 1 × 103 + 8 × 102 + 6 × 101 + 7 × 10°, или 1 × 1000 + 8 × 100 + 6 × 10 + 7 × 1, или 1000 + 800 + 60 + 7. Вспомните сложение в столбик из начальной школы: единицы, десятки, сотни и так далее. Просто мы настолько привыкли к такому виду, что редко задумываемся об этом.
С двоичными числами все точно так же, только при основании 2, а не 10, поэтому используются лишь цифры 0 и 1. Двоичное число 11101 интерпретируется как 1 × 24 + 1 × 23 + 1 × 22 + 0 × 21 + 1 × 2°, которое при основании 10 выражается как 16 + 8 + 4 + 0 + 1, или 29.
Тот факт, что последовательности битов можно истолковывать как числа, означает, что есть органичная закономерность для присвоения элементам двоичных обозначений. Их располагают в порядке возрастания. Мы уже видели это выше, с индексами для первокурсника, второкурсника и так далее – 00, 01, 10, 11. В десятичной системе эти числа имеют значения 0, 1, 2 и 3. Следующая последовательность выглядела бы как 000, 001, 010, 011, 100, 101, ПО, 111 с числовыми значениями от 0 до 7.
Чтобы лучше это понять, выполним одно упражнение. Мы все умеем считать до десяти на пальцах, но до какого числа вы смогли бы досчитать, используя двоичные числа, где каждый палец (не просто так их назвали!18) представляет двоичную цифру? Какой получится диапазон значений? Если вы уже сообразили, на что похоже бинарное отображение 4 и 132, то уловили идею19.
Как вы уже убедились, преобразовать двоичную систему в десятичную просто: сложите степени 2, для которых соответствующий бит числа равен 1. Преобразовать числа из десятичной системы в двоичную сложнее, но ненамного. Начните делить десятичное число на 2. Запишите остаток, который будет равняться 1 или 0, а полученный результат снова делите на два. Не останавливайтесь, пока число не будет равно нулю. Полученная последовательность остатков – это двоичное число, но сейчас оно записано в обратном порядке, так что «переверните» его.
В качестве примера на рис. 2.11 показано преобразование числа 1867 в двоичный формат. Читая биты в обратном порядке, мы получим 1110100 1011. Для проверки сложим степени двух: 1024 + 512 + 256 + 64 + 8 + 2 + 1 = 1867.
На каждом этапе деления мы вычисляем наименее значимый (крайний правый) бит оставшегося числа. Эта процедура аналогична тому, как мы преобразовываем большое количество секунд в дни, часы, минуты и секунды: сначала делим число на 60 и получаем минуты (остаток – количество секунд), делим результат на 60 и получаем часы (остаток – количество минут), делим новый результат на 24 и получаем дни (остаток – количество часов). Разница в том, что при таком расчете времени используется не одинаковое, а смешанное основание – 60 и 24.

Рис. 2.11. Преобразование десятичного числа 1867 в двоичное 11101001011
Вы можете также преобразовать десятичное число в двоичное, вычитая из исходного числа убывающие степени двух. Начать нужно с высшей степени 2, которую содержит число, – например, 210 в 1867. Каждый раз при вычитании степени записывайте 1 или, если ее значение больше остатка, 0, как в случае с 27 или 128 в примере выше. Итоговая последовательность единицы и нолей даст вам двоичное значение. Этот подход, пожалуй, более наглядный, а не механический.
Бинарная арифметика проста. Поскольку для работы требуются всего две цифры, в таблицах сложения и умножения есть только два ряда и две колонки, как показано на рис. 2.12. Маловероятно, что вам когда-либо придется совершать арифметические операции с двоичными числами самостоятельно, однако сама простота этих таблиц дает понять, почему компьютерные схемы на основе двоичной арифметики намного проще, чем они получались бы с применением десятичной.

Рис. 2.12. Таблицы сложения и умножения в двоичной системе
2.3.4. Байты
Во всех современных компьютерах базовой единицей обработки и организации памяти являются восемь бит, которые рассматриваются как единое целое. Группа из восьми бит называется байтом. Это слово ввел в 1956 году Вернер Бухгольц, разработчик архитектуры ЭВМ, работавший в IBM. Одним байтом можно закодировать 256 различных значений (28, то есть все уникальные комбинации из восьми нулей и единиц) – например, целые числа от 0 до 255, или 7-битный символ из ASCII (с одним битом в запасе), или что-то еще. Часто конкретный байт входит в более крупную группу, которая отображает что-то более объемное или сложное. Два байта вместе дают 16 бит, чего достаточно для представления числа от 0 до (216 – 1), или 65 535. Они также могут отображать символ из набора Unicode, скажем, из записи названия «Токио», первый или второй в слове. На каждый иероглиф отведено по два байта. Четыре байта – это 32 бита, которые могут определять четыре символа ASCII, или два символа Unicode, или числа до (232 – 1), что составляет около 4,3 миллиарда. Байтами допустимо отображать что угодно, однако сам процессор имеет довольно скромный набор групп – в частности, целые значения различного размера, – а также располагает инструкциями для их обработки.
Если мы хотим записать числовое значение, представленное одним или несколькими байтами, его допустимо выразить в десятичной форме, что удобно для чтения человеком (только если оно точно числовое). Мы можем записать его в двоичной системе, чтобы увидеть отдельные биты: это важно, поскольку разные биты кодируют разные типы информации. Однако двоичная система громоздка, и такие представления более чем втрое длиннее десятичных, поэтому обычно используется альтернативная система счисления, называемая шестнадцатеричной25. Для записи чисел с таким основанием применяются 16 цифр (по аналогии с 10 цифрами для десятичной и 2 для двоичной) – 0,1… 9, A, B, C, D, E и F. Каждая шестнадцатеричная цифра представляет собой 4 бита, числовые значения которых приведены на рис. 2.13.

Рис. 2.13. Таблица шестнадцатеричных цифр и их значений в двоичной системе исчисления
Если вы не программист, то шестнадцатеричный код встречается вам лишь в нескольких местах. Одно из них – краски на веб-странице. Как я упоминал выше, в наиболее распространенном представлении цветов на компьютере используется три байта на каждый пиксель: по одному для красного, зеленого и синего. Эта система кодирования называется RGB (Red, Green, Blue). Каждый из таких компонентов хранится в виде одного байта, поэтому существует 256 различных значений (оттенков) красного, на любой из которых приходится 256 возможных значений зеленого, а на всякую их комбинацию – 256 оттенков синего. В общей сложности получаем 256 × 256 × 256 возможных цветов, что звучит внушительно. Давайте прибегнем к степеням двух и десяти, чтобы быстро прикинуть количество. Это 28 × 28 × 28, что равно 224, или 24 × 220, или примерно 16 × 106, или 16 миллионов. Вероятно, это число попадалось вам в описаниях компьютерных дисплеев («Более 16 миллионов цветов!»)26. Кстати, оценка занижена примерно на 5 %, ведь 224 в десятичной записи – 16 777 216.
Насыщенный красный представлен числом FF0000, то есть максимальным значением из 255 возможных, если брать десятичную систему. В нем нет ни зеленого, ни синего. А вот яркий, но негустой синий цвет, которым выделяются ссылки на многие веб-страницы, кодируется как 000 °CC. Желтый цвет – это смесь красного и зеленого, и его самый яркий оттенок выражается комбинацией FFFF00. Оттенки серого содержат в себе равное количество красного, зеленого и синего. Например, средний серый пиксель будет закодирован числом 808080, в котором содержание всех трех цветов будет одинаковым. Наконец, черный и белый – это 000000 и FFFFFF соответственно.
Шестнадцатеричные значения также используются в кодовых таблицах Unicode для определения символов. Например, –
это 6771 4EAC. Кроме того, вы можете встретить шестнадцатеричные числа в адресах Ethernet, о которых мы поговорим в главе 8, и в специальных символах в URL-адресах – это глава 10.
В рекламе компьютеров вы иногда встречаете понятие «64-битный» («Microsoft Windows 10 Ноше 64-битная»). Что это значит? Внутри себя компьютеры обрабатывают данные в виде блоков разного размера, в которые входят как числа – а для них удобнее применять 32 и 64 бита, – так и адреса, то есть указания, где расположена информация в оперативной памяти. Речь в рекламе идет о втором параметре. Тридцать лет назад произошел переход от 16-битных адресов к 32-битным, которые достаточно велики для доступа к 4 Гб памяти. В настоящее время мы почти перешли от 32 к 64 битам в компьютерах общего назначения27. Не стану предсказывать, когда мы двинемся от 64 к 128 битам: пока все на какое-то время затихнет.
Из этого обсуждения битов и байтов нам важно запомнить, что значение группы битов зависит от контекста: вам не удастся определить, что они отображают, просто посмотрев на них. Например, в байт может входить один бит, представляющий истину или ложь, а семь других не будут использоваться. Там может храниться небольшое целое число или символ ASCII, такой как #. Возможно, что байт составляет либо часть символа в другом алфавите, либо компонент большого числа из 2, 4 или 8 байт, либо фрагмент изображения или музыки на DVD, либо часть инструкции для процессора и так далее. (С десятичными цифрами все то же самое. В зависимости от контекста, трехзначное число может обозначать телефонный код района США, номер шоссе, показатель отбивания в бейсболе и многое другое.)
Инструкции для одной программы иногда служат данными для другой. Когда вы загружаете программу или приложение, то они представляют собой просто данные – биты, копируемые вслепую. Но когда вы запускаете программу, ее биты при обработке в ЦПУ воспринимаются как инструкции.
2.4. Краткие выводы
Почему мы используем вместо десятичной системы двоичную? Намного легче создать физические устройства, в которых есть только два состояния (например, включено/выключено), а не десять. Эта сравнительная простота в явном виде присутствует во многих технологиях: ток (протекает или нет), напряжение (высокое или низкое), электрический заряд (есть или нет), магнетизм (направление на север или юг), свет (яркий или тусклый), отражение (блестящее или матовое). Это ясно осознавал фон Нейман, который в 1946 году сказал: «Наша фундаментальная единица памяти естественным образом адаптирована к двоичной системе, поскольку мы не пытаемся измерять градации заряда».
Зачем нам знать про двоичные числа или интересоваться ими? Одна из причин заключается в том, что, оперируя с числами в незнакомой системе счисления, мы можем, например, развить количественное мышление и лучше понять, как устроены числа со старым добрым основанием 10. Также это важно, потому что количество битов обычно тем или иным образом указывает на то, как много места, времени или сложных операций потребуется. Компьютеры вообще заслуживают того, чтобы в них разбирались, а двоичные числа – ключевой элемент их работы.
Двоичные значения также используются в повседневных занятиях, не связанных с компьютерами. Вероятно, дело в том, что такие расчеты, как удвоение или уменьшение веса, длины и тому подобного, вполне естественны для людей. Например, во втором томе книги Дональда Кнута «Искусство программирования»28 описаны английские единицы тары для вина 1300-х годов, в которые входят 13 двоичных порядков величины: 2 джилла – это один шопен, 2 шопена – это одна пинта, 2 пинты – это одна кварта, и так далее, пока 2 барреля не станут одним хогсхедом, 2 хогсхеда не сольются в одну пипу (или пайп), а 2 пипы не образуют один тан. Около половины этих единиц все еще используются в английской системе мер для жидкостей, хотя такие очаровательные слова, как «феркин» и «килдеркин» (два феркина, или половина барреля), ныне встречаются уже редко.
3. Процессор изнутри
Если, однако, приказы для машины сведены к числовому коду и если машины могут каким-то образом отличать число от команды, то орган памяти может хранить как числа, так и приказы.
Артур У. Бёркс, Герман Х. Голдстайн, Джон фон Нейман.Предварительное рассмотрение логического устройства электронного вычислительного прибора, 1946
В главе 1 я упомянул, что процессор, или ЦПУ, – «мозг» компьютера, хотя и с оговоркой, что это определение употребляется не в прямом значении. Сейчас пришло время более подробно рассмотреть процессор, поскольку это самый важный элемент вычислительной машины и его свойства имеют наибольшее значение для оставшейся части книги.
Как работает процессор? Что за процессы в нем идут и как? При первом близком рассмотрении ЦПУ мы обнаруживаем, что оно способно выполнять набор базовых операций. Процессор может, подобно калькулятору, производить арифметические операции: сложение, вычитание, умножение и деление чисел. Он извлекает данные из памяти, обрабатывает их и сохраняет результаты туда же, как действуют многие счетные устройства. Процессор управляет остальными частями компьютера – отправляет по шине сигналы для контроля и координации ввода и вывода от всего, что электрически соединено с ним, включая мышь, клавиатуру, экран и многое другое.
Самое главное – ЦПУ принимает решения, пусть и простые. Процессор способен сравнивать как числа (больше или меньше), так и данные других типов (совпадает ли эта часть информации с другой), и на основании полученных результатов решать, что делать дальше. Это самое важное его свойство, поскольку, хотя процессору доступно немногим больше, чем калькулятору, он умеет работать без вмешательства человека. Как сказали Беркс, Голдстайн и фон Нейман, «предполагается, что машина будет полностью автоматической по своей природе, то есть независимой от человека-оператора после начала вычислений».
Поскольку процессор может определять дальнейшие действия на основании обрабатываемых данных, он способен самостоятельно управлять всей системой. Хотя его репертуар действий невелик и незамысловат, он умеет выполнять миллиарды операций в секунду, поэтому справляется с чрезвычайно сложными вычислениями.
3.1. Компьютер-игрушка
Позвольте мне объяснить, как работает процессор, описав машину, которой нет. Этот выдуманный или условный компьютер действует по тем же принципам, что и реальный, но он намного проще. Поскольку он существует только на бумаге, я представлю его в той форме, которая лучше всего подойдет, чтобы разъяснить вам принципы действия настоящих ЭВМ. Я также могу создать программу для реального компьютера, которая будет имитировать мое воображаемое творение, а затем написать программы уже для этого воплощения вымышленной машины и посмотреть, как они будут выполняться.
Я привык называть такую выдуманную машину «компьютером-игрушкой», или просто Игрушкой, поскольку она не настоящая, но обладает свойствами реальной. По возможностям она примерно соответствует уровню мини-ЭВМ конца 1960-х годов и напоминает устройство, описанное в первой статье Беркса, Голдстайна и фон Неймана. В компьютере-игрушке есть память, отведенная под инструкции и данные, а также одна дополнительная область хранения – накопитель, емкости которого достаточно для удержания одного числа. Накопитель – это аналог экрана на калькуляторе: он показывает число, только что введенное пользователем, или последние результаты вычислений. Компьютер-игрушка содержит около десяти инструкций для выполнения основных операций, описанных выше. На рис. 3.1 приведены первые шесть из данного набора.

Рис. 3.1. Типовые инструкции в машине-игрушке
Каждая ячейка памяти хранит одно число или одну инструкцию, поэтому программа состоит из последовательности инструкций и элементов данных, сохраненных в памяти. Выполняя операции, процессор начинает с первой ячейки памяти и затем повторяет простой цикл:
Fetch: извлечь следующую инструкцию из памяти
Decode: определить, что выполнять по этой инструкции (декодировать)
Execute: выполнить инструкцию вернуться к Fetch
3.1.1. Первая программа компьютера-игрушки
Чтобы создать программу для Игрушки, мы должны написать последовательность инструкций для решения желаемой задачи, поместить их в память и приказать ЦПУ выполнить их. В качестве примера предположим, что память содержит следующие инструкции, которые хранятся как двоичные числа:
GET
STOP
Когда эта последовательность выполняется, первая инструкция запрашивает у пользователя число, вторая отображает введенное число, а третья велит процессору остановиться. Это смертельно скучно, но наглядно показывает, что такое программа. Будь у нас реальная машина-игрушка, то программа могла бы даже запуститься.
И, к счастью, рабочие игрушечные компьютеры существуют. На рис. 3.2 показан один из них в действии.
Это симулятор, написанный на JavaScript, поэтому его можно запустить на любом браузере, как мы увидим в главе 7.

Рис. 3.2. Симулятор компьютера-игрушки с готовой к запуску программой
Когда вы нажимаете ПУСК, выполняется инструкция GET и появляется диалоговое окошко (см. рис. 3.3). Число 123 введено пользователем.

Рис. 3.3. Диалоговое окно ввода симулятора Игрушки
После того как пользователь напечатал число и нажал ОК, симулятор запускается и отображает результаты, как показано на рис. 3.4. Как и было обещано, программа запрашивает введенное число, отображает его и останавливается.

Рис. 3.4. Симулятор Игрушки после выполнения короткой программы
3.1.2. Вторая программа компьютера-игрушки
Следующая программа (см. рис. 3.5) немного сложнее, поскольку в ней добавлена еще одна функция – хранить значение в памяти и затем извлекать его. Программа получает число в накопитель, сохраняет в памяти, получает второе число в накопитель (оно переписывает первое), добавляет к нему первое число (извлекая его из памяти, где оно бережно хранилось), печатает сумму и затем останавливается.
Процессор запускается в начале программы и извлекает инструкции по одной за раз. Он по очереди выполняет каждую команду, затем переходит к следующей. После любой инструкции напечатан комментарий, то есть объяснения в помощь программистам, не влияющие на саму программу.
Единственная сложность заключается в том, что нам нужно выделить место в памяти для хранения данных – первого числа, которое будет считываться. Мы не можем оставить первое число в накопителе, так как вторая инструкция (GET) перезапишет его. Поскольку число – это данные, а не инструкция, мы должны хранить его в определенном месте в памяти, где оно не будет истолковано как инструкция. Но, если мы поместим его в конец программы, после всех инструкций, процессор точно не попытается интерпретировать значение данных как инструкцию, потому что остановится (STOP) и не доберется до него.

Рис. 3.5. Программа компьютера-игрушки для сложения двух чисел и вывода суммы
Нам также нужен способ ссылаться на место хранения, когда этого потребуют инструкции программы. Мы можем заметить одну возможность для хранения данных – седьмую ячейку памяти (после шестой инструкции) – и написать «STORE 7». В конечном итоге наша программа будет сохранена в такой форме. Но местоположение (адрес) может меняться при изменении программы. Решение в том, чтобы присвоить ему имя: как мы увидим в главе 5, любая программа способна выполнять такую «конторскую» задачу, то есть отслеживать, где в памяти находятся данные, заменяя имя правильным положением числа. FirstNum указывает, что это «первое число». Имя задается произвольно, хотя рекомендуется использовать то, которое отражает предназначение или смысл связанных с ним данных или инструкций. После имени мы поставили двоеточие, чтобы определить FirstNum как метку. По соглашениям о именовании, инструкции в программе набирают с отступом, а имена, привязанные к инструкциям или ячейкам памяти, – без. В симуляторе Игрушки учитываются все эти детали.
3.1.3. Инструкции ветвления
Как нам расширить программу, показанную на рис. 3.5, чтобы она суммировала три числа? Можно просто добавить еще одну последовательность инструкций – STORE, GET и ADD (для них есть два свободных места), но такое «расширение», конечно, не позволит суммировать тысячу чисел. Программа вообще не даст результата, если мы не будем знать заранее, сколько чисел нужно сложить.
Верное решение – дополнить репертуар процессора новым типом инструкций, который позволит ему повторно использовать последовательности команд. Инструкция GOTO, которую часто называют «ветвлением» или «переходом», указывает процессору, что следующую команду нужно брать не по порядку, а из местоположения, указанного в самой GOTO.
С помощью инструкции GOTO мы можем заставить процессор вернуться к предшествующей части программы и повторить выполнение команд. Вот несложный пример: программа, которая выводит каждое число по мере его ввода. По сути, так работает любая программа, которая копирует или отображает ввод данных для нее, и здесь показывается, что делает инструкция GOTO. Первая инструкция программы, изображенная на рис. 3.6, называется Тор («Верх»). Имя задано произвольно и указывает на ее роль. Наконец, последняя инструкция заставляет процессор вернуться к первой.

Рис. 3.6. Программа копирования данных, которая выполняется вечно
Это отчасти нам помогает: мы можем неоднократно использовать инструкции. Но перед нами все еще стоит критическая проблема: невозможно остановить бесконечное повторение последовательности инструкций, или цикла. Чтобы прервать цикл, нам нужна инструкция другого вида, которая позволит не бездумно продолжать, а проверить некое условие и решить, что делать дальше. Инструкция такого рода называется условным ветвлением или условным переходом. Одна из возможностей, которая есть в любом компьютере, – инструкция, которая проверяет, равно ли какое-либо значение нулю, и, если это так, переходит к определенной команде. К счастью, в Игрушке есть инструкция под названием IFZERO, которая переходит к заданной команде, если значение в накопителе равно нулю. В противном случае выполняется следующая инструкция в последовательности.
Давайте задействуем инструкцию IFZERO, чтобы написать программу (см. рис. 3.7), которая считывает и печатает входные значения до тех пор, пока в них не появится значение, равное 0. Она будет извлекать и отображать данные, пока пользователь не устанет и не введет ноль, после чего программа перейдет к инструкции STOP, помеченной как Bot, то есть bottom («низ»), и остановится. (Заманчиво написать IFZERO STOP, но так не сработает: за IFZERO должна следовать ячейка, а не инструкция.)

Рис. 3.7. Программа копирования данных, которая останавливается при вводе О
Обратите внимание, что у нас не отображается ноль, который служит сигналом о прекращении ввода. Как бы вы изменили программу, чтобы она выводила ноль перед тем, как остановиться? Вопрос без подвоха – ответ здесь ясен. Но это отлично показывает, как в программах возникают небольшие различия в ходе выполнения задачи, или как они вообще начинают делать не то, что задумывалось, – и все из-за того, что пару инструкций просто поменяли местами.
Сочетание GOTO и IFZERO позволяет нам писать программы, которые повторяют инструкции до тех пор, пока некое заданное условие не станет истинным. Значит, процессор может изменять порядок вычислений в зависимости от результатов предыдущих вычислений. (Подумайте, нельзя ли обойтись без GOTO, если у вас есть IFZERO. Найдется ли способ имитировать GOTO с помощью IFZERO и некоторых других инструкций?) Как ни удивительно, больше нам ничего не требуется для совершения операций, которые способен произвести любой цифровой компьютер. Какое угодно вычисление можно разбить на небольшие шаги, применяя элементарные инструкции.
Процессор Игрушки, имеющий в своем арсенале IFZERO, в принципе можно запрограммировать на выполнение буквально любых вычислений.
Я говорю «в принципе», потому что на практике мы обязаны учитывать скорость процессора, объем памяти, ограниченность величины чисел в компьютере и тому подобное. Так или иначе, иногда мы будем возвращаться к идее эквивалентности всех ЭВМ, поскольку это фундаментальная концепция.
В качестве еще одного примера работы IFZERO и GOTO на рис. 3.8 приведена программа, которая суммирует несколько чисел и останавливается, когда введен 0. Какое-либо специальное значение сплошь и рядом применяют для того, чтобы завершить последовательность ввода. В данном случае ноль вполне подходит в качестве метки окончания, потому что мы складываем числа, а добавлять данные с нулевым значением не обязательно.
Симуляторы компьютера-игрушки интерпретируют «инструкции» вроде последней строчки в этой программе так: «определить имя для ячейки памяти и поместить определенное цифровое значение в эту ячейку перед тем, как программа будет запущена». Это не настоящая инструкция, а скорее «псевдоинструкция», которая интерпретируется симулятором при обработке текста программы перед ее запуском.
Нам нужно место в памяти, чтобы сохранять текущую сумму в процессе сложения. В начале работы эта ячейка памяти должна содержать нулевое значение, по аналогии с тем, как мы очищаем память калькулятора. Нам также необходимо дать ячейке памяти имя, которое будет использоваться остальной программой для обращения к ней. Оно задается произвольно, но Sum – удачный вариант, так как указывает на роль ячейки памяти.

Рис. 3.8. Программа Игрушки для сложения последовательности чисел
Как бы вы проверили эту программу, чтобы убедиться, что она работает? На первый взгляд все выглядит нормально, и она дает правильные ответы на простые тестовые задачи. Упустить из виду проблему легко, поэтому нужна систематическая проверка. Ключевое слово – «систематическая»: просто вводить в программу случайные данные будет неэффективно.
Какой самый простой тестовый пример? Если мы не вводим никаких чисел, кроме нуля, который завершает ввод, то сумма будет равняться нулю, так что в качестве первой проверки годится. Потом нужно попробовать ввести одно число: сумма должна совпасть с ним. Затем надо ввести два числа, сумма которых уже вам известна (например, 1 и 2, где результат должен равняться 3). После нескольких таких тестов вы можете с достаточной степенью уверенности утверждать, что программа работает. Если вы скрупулезны, то проверите код еще до того, как он попадет на компьютер, – тщательно пройдетесь по всей последовательности инструкций. Хороший программист поступает так с каждой написанной им программой.
3.1.4. Представление в памяти
До сих пор я уклонялся от ответа на вопрос о том, как инструкции и данные представлены в памяти. Как это работает?
Вот одно из возможных объяснений. Предположим, что каждая инструкция использует одну ячейку памяти для хранения своего цифрового кода, а также задействует ту, что расположена рядом, если ссылается на местоположение в памяти или имеет значение данных. То есть GET занимает одно место, а инструкции вроде IFZERO и ADD, которые ссылаются на ячейку памяти, используют два. Второе – это место, на которое они ссылаются.
Предположим также, что любое значение данных помещается в одной ячейке. Это все упрощения, однако они не слишком искажают картину того, что происходит в реальных компьютерах. Наконец, примем, что числовые значения инструкций следующие: GET = 1, PRINT =2, STORE = 3, LOAD = 4, ADD = 5, STOP = 6, GOTO = 7, IFZERO = 8. В таком порядке они появлялись на предыдущих страницах.
Программа на рис. 3.8 суммирует последовательность чисел. Когда программа начинает работать, содержимое памяти будет таким, как показано на рис. 3.9. Здесь также изображены фактические ячейки памяти, три привязанные к ним метки, инструкции и адреса, соответствующие содержимому памяти.

Рис. 3.9. Как программа сложения чисел выглядит в памяти
Симулятор Игрушки написан на JavaScript – языке программирования (ЯП), о котором пойдет речь в главе 7, – но мы могли выбрать любой другой ЯП. Данный симулятор легко расширить. Например, вы без труда добавите инструкцию умножения или условную ветвь другого типа, даже если никогда раньше не видели компьютерную программу. Это хороший способ проверить, как вы усвоили материал. Код можно найти на веб-сайте этой книги.
3.2. Настоящие процессоры
Мы рассмотрели упрощенную версию процессора, но он не сильно отличается от тех, что стояли в ранних вычислительных устройствах или сейчас применяются в маленьких. Современные ЦПУ гораздо сложнее в деталях, и все сосредоточено вокруг производительности.
Любой процессор снова и снова производит цикл извлечения, декодирования, выполнения. Он извлекает из памяти очередную инструкцию, которая обычно хранится в следующей ячейке памяти, но ее местоположение также могли задать GOTO или IFZERO. Процессор декодирует инструкцию (то есть выясняет, что она делает) и совершает все необходимые приготовления для ее запуска. Затем он выполняет инструкцию: вытаскивает информацию из памяти, производит арифметические или логические действия и сохраняет результат в подходящей комбинации битов. Потом ЦПУ возвращается к шагу извлечения. Цикл «извлечение – декодирование – выполнение» в настоящем процессоре задействует хитроумные методы, которые ускоряют всю процедуру, но фундаментально там нет разницы с циклом для сложения чисел, показанным выше.
Настоящие компьютеры выполняют больше инструкций, чем наша Игрушка, хотя они относятся к тем же основным видам. Они знают больше способов того, как перемещать данные, выполнять арифметические действия (в том числе для различных размеров и типов чисел), сравнивать и разветвлять, а также управлять остальными частями машины. Типичное ЦПУ имеет от пары десятков до пары сотен различных инструкций, которые вместе с данными занимают несколько ячеек памяти, обычно от 2 до 8 байт на каждую. В реальном процессоре есть много накопителей, чаще всего от 16 до 32. Поэтому он может хранить более одного промежуточного результата в своей, скажем так, чрезвычайно быстродействующей памяти.
Настоящие программы колоссальны по сравнению с нашими примерами для Игрушки, и часто в них содержатся миллионы инструкций. Мы еще вернемся к тому, как пишутся программы, когда будем говорить о ПО в последующих главах.
Дисциплина, которая занимается разработкой процессора и его связей с остальными частями машины, называется архитектурой ЭВМ. В университетах ее часто изучают как подобласть на границе информатики и электротехники.
Одна из проблем, рассматриваемых архитектурой ЭВМ, – размер набора инструкций, то есть совокупности команд, которые выполняет процессор. Что лучше: множество инструкций для широкого спектра различных вычислений или небольшое количество команд – таких, которые проще создавать и которые будут выполняться быстрее? Разработка архитектуры предполагает поиск многогранного баланса функциональности, скорости, сложности, энергопотребления и программируемости. Снова процитируем фон Неймана: «В общем внутренняя структура арифметического устройства определяется компромиссом между стремлением к быстроте работы <…> и к простоте или дешевизне машины».
Как процессор соединяется с оперативной памятью и остальными частями компьютера? Начнем с того, что ЦПУ действуют очень быстро, выполняя одну инструкцию менее чем за наносекунду. (Напомним, что «нано» – это одна миллиардная, или 10“9.) Для сравнения, память чрезвычайно медленная: извлечение данных или инструкций из нее занимает от 10 до 20 наносекунд. Конечно, это молниеносно в абсолютном выражении, но неторопливо по меркам функционирования процессора. Он мог бы выполнить десятки инструкций за то время, что ему приходится ждать поступления данных.
В современных компьютерах для хранения недавно использованных инструкций и данных используется небольшое количество высокоскоростной памяти между ЦПУ и ОЗУ Она называется кэшем. Информацию, которую можно найти в кэше, быстрее достать оттуда, чем дожидаться ее извлечения из оперативной памяти. Подробнее о кэшах и кэшировании я расскажу в следующем разделе.
У разработчиков также есть набор конструкционных приемов, которые ускоряют работу процессора. ЦПУ можно изготовить так, чтобы шаги извлечения и выполнения совмещались, и тогда процессор будет одномоментно прогонять несколько инструкций на разных стадиях завершенности. Это называется конвейерной обработкой, как при движении деталей автомобиля по сборочной линии. Хотя выполнение любой отдельной инструкции будет занимать такое же время, при одновременной обработке других возрастут общие темпы выполнения. Иной вариант – параллельно прогонять несколько инструкций, если они не мешают друг другу или не взаимозависимы. В машиностроении тоже есть аналогия, параллельные линии сборки. Иногда инструкции даже можно выполнять не по порядку, если они не взаимодействуют.
Еще один вариант – одновременная работа нескольких процессоров. Сегодня это норма для ноутбуков и мобильных телефонов. В процессоре Intel моего компьютера 2015 года выпуска, на котором я сейчас печатаю, есть два ядра на одном чипе интегральной схемы. Сейчас наблюдается сильная тенденция в сторону увеличения количества ядер ЦПУ на чипе, а также на установку более одного чипа в устройстве. Поскольку размеры элементов интегральной схемы уменьшаются, на микросхему удается поместить больше транзисторов, и они, как правило, используются для того, чтобы добавить ядер и увеличить кэш-память. Процессоры сами по себе не ускоряются, но ядер становится больше, и фактическая быстрота вычислений продолжает расти.
Когда определяется, где будет применяться ЦПУ, в его конструкцию вносят еще ряд компромиссных решений. Долгое время их в основном изготавливали для настольных компьютеров, обладающих сравнительным изобилием доступной электрической мощности и свободного пространства. Благодаря этому разработчики могли сосредоточиться на создании как можно более быстрого процессора, зная, что тому вполне хватит и энергии, и возможностей отводить тепло с помощью вентиляторов. Из-за ноутбуков искомый баланс значительно изменился, так как пространство в них ограниченно, а при отключении от сети они получают питание от тяжелой и дорогой батареи. При прочих равных условиях процессоры для ноутбуков обычно работают медленнее и потребляют меньше электроэнергии.
В случае сотовых телефонов, планшетов и других портативных устройств требуется идти на еще большие компромиссы, поскольку размер, вес и мощность уменьшаются еще заметнее. Здесь уже недостаточно только «подкрутить» конструкцию. Если Intel и ее основной конкурент AMD – главные поставщики ЦПУ для компьютеров и ноутбуков, то в большинстве сотовых телефонов и планшетов используется процессор под названием ARM, специально спроектированный для работы с низким энергопотреблением. Структура таких ЦПУ запатентована английской компанией Arm Holdings.
Сравнение скоростей процессоров – дело сложное и, по сути, бессмысленное. Даже базовые операции вроде арифметических действий могут выполняться настолько разными способами, что трудно провести прямое сопоставление. Например, одному процессору понадобится выполнить три инструкции, чтобы сложить два числа и сохранить результат в ходе третьей, как делала Игрушка. Другому для такого вычисления хватит двух команд, а третьему – всего одной. Некоторые ЦПУ способны параллельно обрабатывать несколько инструкций или совмещать их, чтобы они выполнялись поэтапно. Процессоры умеют жертвовать скоростью работы ради снижения энергопотребления и даже динамически регулировать ее в зависимости от того, поступает энергия из батареи или из сети. В отдельные ЦПУ встроены как быстрые, так и медленные ядра для выполнения разных задач. Поэтому вам следует с осторожностью заявлять о том, что один процессор «шустрее» другого, – вероятно, ваша оценка субъективна.
3.3. Кэширование
Соответственно, мы обязаны признать возможность создания иерархических отделов памяти, каждый из которых будет обладать большей емкостью, чем предыдущий, но менее быстрым доступом.
Артур У. Бёркс, Герман Х. Голдстайн, Джон фон Нейман.Предварительное рассмотрение логического устройства электронного вычислительного прибора, 1946
Здесь стоит ненадолго отойти от темы и рассмотреть кэширование – идею, широко применимую за пределами вычислений как таковых. В процессоре кэш — это маленькая быстрая память, где хранится недавно обработанная информация. Тем самым удается избежать постоянных обращений к оперативной памяти, которая больше по объему, но действует значительно медленнее. Как правило, процессор неоднократно обращается к группам данных и инструкций за короткий отрезок времени. Например, пять инструкций в цикле программы, приведенной на рис. 3.9, будут выполняться по одному разу для каждого введенного числа. Если хранить их в кэше, то извлекать их из ОЗУ для каждого цикла уже не понадобится, и тогда программа начнет выполняться быстрее, поскольку для обработки инструкций не придется ждать их поступления из памяти. Аналогично, если держать Sum (переменную из программы для Игрушки) в кэше данных, доступ тоже ускорится, однако узкое место в этой программе – получение данных.
Типичный процессор имеет два или три кэша, которые последовательно увеличиваются по емкости и уменьшаются в скорости. Их часто называют уровнями LI, L2 и L3. Самый большой из них способен вмещать несколько мегабайт данных. (На моем ноутбуке 256 Кб кэша L2 для каждого ядра и 4 Мб в одном кэше L3.) Кэширование приносит пользу, так как велика вероятность, что недавно использованная информация вскоре понадобится вновь, а наличие ее в кэше уменьшит время ожидания отклика памяти. Обычно в процессе кэширования одновременно загружаются все блоки данных – например, блок последовательных ячеек памяти, когда запрашивается один байт. Это связано с тем, что «примыкающая» информация, вероятно, также скоро будет использоваться – и значит, почти наверняка уже окажется в кэше, когда в ней возникнет надобность. Тогда ссылкам на соседние данные не придется ждать.
Такой тип кэширования в основном невидим для пользователей, если не считать того, что оно улучшает производительность. Однако кэширование – гораздо более общая концепция, которая помогает нам независимо от того, используем ли мы что-то в данный момент и, вероятно, вскоре задействуем это же снова, или нам с большой вероятностью понадобятся соседние данные. Многочисленные накопители в процессоре, по сути, форма кэша на максимальной скорости работы. Оперативная память может служить кэшем для дисков, а ОЗУ и «винты» вместе – кэшем для данных, поступающих из сети. Наконец, сети часто имеют свои кэши для ускорения потока информации от удаленных серверов, где также есть кэши.
Возможно, раньше вы видели это слово в контексте «почистить кэш» для веб-браузера. Он сохраняет локальные копии изображений и других сравнительно объемных материалов, которые составляют веб-страницу, так как при повторном посещении страницы быстрее будет использовать эти копии, чем загружать все заново. Кэш не может расти бесконечно, поэтому браузер либо сам незаметно удаляет старые данные и освобождает место для новых, либо предлагает сделать это вам.
Иногда преимущества кэширования вполне очевидны. Запустите какую-нибудь объемную программу вроде Word или Firefox и замерьте время, которое понадобится ей для полной загрузки с диска. Потом закройте ее и немедленно перезапустите. Обычно во второй раз программа стартует намного быстрее, потому что ее инструкции все еще находятся в ОЗУ, которая играет роль кэша для жесткого диска. В дальнейшем, пока вы будете работать в других приложениях, память начнет заполняться их инструкциями и данными. Они «вытеснят» предыдущую программу из кэша.
Еще одна форма кэширования – список недавних файлов в таких приложениях, как Word или Excel. Word запоминает документы, с которыми вы работали в последнее время, и отображает их названия в меню, поэтому вам не нужно искать их каждый раз. По мере того как вы открываете новые файлы, те, к которым вы не обращались долгое время, будут заменены в списке на более свежие.
3.4. Другие виды вычислительных устройств
Довольно просто решить, что все компьютеры – это ноутбуки, поскольку именно их мы видим чаще всего. Но существуют и другие разновидности вычислительных устройств, больших и маленьких, которые объединены тем, что способны производить одни и те же логические операции. Они имеют схожую архитектуру, но в них соблюдается различный баланс стоимости, мощности, величины, быстродействия и так далее.
Мобильные телефоны и планшеты – тоже вычислительные машины, которые управляются теми или иными ОС и формируют богатую компьютерную среду. Системы еще меньших размеров встроены почти во все цифровые устройства, которые загромождают нашу жизнь: фотоаппараты, электронные «читалки», фитнес-трекеры, бытовую технику, игровые консоли и так далее. Так называемый интернет вещей – сетевые термостаты, камеры безопасности, умные светильники, устройства распознавания голоса и тому подобное – также опирается на аналогичные процессоры.
В суперкомпьютерах, как правило, устанавливают большое количество ЦПУ и громадный объем памяти. Сами их процессоры порой имеют инструкции, которые обрабатывают определенные виды данных намного быстрее, чем их более привычные собратья. Правда, современные суперкомпьютеры основаны на кластерах быстрых, но в целом обычных процессоров, а не на специализированном оборудовании. Каждые полгода на вебсайте top500.org публикуется новый список 500 самых быстрых компьютеров в мире. Поразительно, как быстро повышается максимальная скорость: машины, которые находились в первой десятке несколько лет назад, сегодня вообще отсутствуют в списке. Лучшая машина на ноябрь 2020 года, построенная компанией Fujitsu в Японии, имеет 7,6 миллиона ядер и может выполнять максимум 537 × 1015 арифметических операций в секунду20. Скорость суперкомпьютеров измеряется количеством операций с плавающей запятой, или флопами, т. е. количеством арифметических операций с числами с дробной долей в секунду. Лидер списка top500.org показывает результат в 537 петафлопов, а компьютер на 500-м месте – 2,4 петафлопа.
Графический процессор (GPU) – это специализированный процессор, который выполняет определенные графические вычисления намного быстрее, чем ЦПУ общего назначения. Такие устройства изначально разрабатывались для высокоскоростных расчетов графики, необходимой для игр, но они также применяются для обработки речи и сигналов в телефонах. GPU помогают ускорить работу обычных ЦПУ при определенных видах рабочих нагрузок. Графические процессоры могут параллельно выполнять большое количество простых арифметических вычислений, поэтому если какую-либо часть задачи можно передать для выполнения в GPU, то операция в целом будет выполняться быстрее. Данные устройства особенно полезны для машинного обучения (глава 12), при котором одни и те же вычисления производятся независимо в разных частях большого набора данных.
Распределенные вычисления выполняются на компьютерах, которые более независимы: они, например, не используют общую память, а иногда физически рассредоточены, вплоть до того, что находятся в разных частях света. Из-за такого подхода повышается вероятность того, что связь станет узким местом, но он позволяет людям и компьютерам взаимодействовать на больших расстояниях. Крупномасштабные веб-сервисы – поисковые системы, интернет-магазины, социальные сети и облачная обработка данных в целом – это распределенные вычислительные системы, в которых тысячи ЭВМ объединяются, чтобы быстрее получить результат для большого количества пользователей.
Все эти типы компьютеров базируются на одних и тех же фундаментальных принципах. Они основаны на процессоре общего назначения, который можно запрограммировать для выполнения бесконечно разнообразных задач. Каждый ЦПУ имеет ограниченный набор простых инструкций для выполнения арифметических действий, сравнения значений данных и выбора следующей инструкции на основании результатов предыдущих вычислений. Определяющая архитектура ЭВМ не сильно изменилась с конца 1940-х годов, но их физическая конструкция непрерывно эволюционировала поразительными темпами.
Возможно, это прозвучит неожиданно, но все упомянутые компьютеры обладают одинаковыми логическими возможностями и способны «обсчитывать» буквально одно и то же, если оставить в стороне такие практические факторы, как требования к скорости и памяти. Данную теорию независимо друг от друга доказали в 1930-х годах несколько ученых, включая английского математика Алана Тьюринга. Именно его подход легче всего понять неспециалисту. Тьюринг описал элементарное счетное устройство, гораздо проще нашей Игрушки, и показал, что оно может вычислить всё, что поддается вычислениям в самом общем смысле. Сегодня такой компьютер называется машиной Тьюринга29. Затем Алан показал, как создать машину Тьюринга, которая способна действовать как симулятор других подобных машин. Теперь такое устройство обозначается как универсальная машина Тьюринга (УМТ). Составить программу, которая будет имитировать УМТ, несложно. Также возможно (но уже не просто) написать программу для УМТ, которая будет имитировать настоящий компьютер. Следовательно, все компьютеры равны в том, что они умеют вычислять, но различаются в скорости обработки.
Во время Второй мировой войны Алан перешел от теории к практике: он сыграл главную роль в разработке специализированного компьютера для дешифрирования немецких военных сообщений30, о чем мы еще кратко поговорим в главе 13. Работы Тьюринга на благо фронта показаны – со значительными художественными отступлениями – в нескольких фильмах, в частности «Взлом кода» (Breaking The Code, телеканал ВВС) 1996 года и «Игра в имитацию» 2014 года.
В 1950 году Тьюринг опубликовал статью под названием «Вычислительные машины и разум»31, в которой предлагался тест (сегодня называемый тестом Тьюринга), который подошел бы для оценки того, демонстрирует ли компьютер человеческий интеллект. Представьте себе, как вычислительная машина и человек по отдельности общаются через клавиатуру и экран с человеком-опросчиком. Ведя такую беседу, может ли опрашивающий установить, кто из его собеседников – человек, а кто – компьютер? Тьюринг полагал, что, если их не удастся надежно различить, значит, ЭВМ демонстрирует разумное поведение. Как мы увидим в главе 12, компьютеры сейчас общаются на уровне человека или даже выше по некоторым темам – хотя, конечно, к общему умственному развитию это никак не относится.

Рис. 3.10. CAPTCHA32
Имя Тьюринга упоминается в несколько вымученной аббревиатуре CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart), она же «капча», которая расшифровывается как «Полностью автоматизированный публичный тест Тьюринга, позволяющий отличать компьютеры от людей»21. CAPTCHA представляет собой искаженные наборы букв вроде тех, что приведены на рис. 3.10. Она используется для попыток проверить, человек ли посетитель веб-сайта или программа. «Капча» – пример обратного теста Тьюринга, поскольку она пробует отличить человека от компьютера, полагаясь на тот факт, что люди, как правило, лучше машин распознают графические структуры. Конечно, CAPTCHA неприменима для тех, кто страдает нарушениями зрения.
Тьюринг – одна из самых важных фигур в информатике. Он внес основной вклад в наше понимание вычислений, и в его честь названа премия Тьюринга33 – эквивалент Нобелевской премии в области компьютерных наук. В последующих главах будет описано полдюжины важных изобретений в области информатики, авторы которых удостоились такой награды.
В 1952 году Тьюринга привлекли к ответственности за гомосексуальную активность, которая в то время в Англии преследовалась по закону. Он умер в 1954 году, по-видимому, покончив с собой34.
3.5. Краткие выводы
Компьютер – это машина общего назначения. Он берет инструкции из памяти, и мы можем изменить выполняемые им вычисления, записав в память другие команды. Инструкции и данные неразличимы вне контекста. То, что для одного – команды, для другого – информация.
Современные компьютеры почти всегда оснащены несколькими ядрами на одном чипе. Также в них встречается несколько микросхем процессоров, а для более эффективного доступа к памяти на интегральной схеме размещают объемный кэш. Кэширование – это фундаментальный принцип в вычислительной технике, который мы встречаем на всех уровнях от ЦПУ до интернета. Чаще всего оно основывается на локальности данных (во времени или пространстве), что обеспечивает более быстрый доступ к ним.
Есть много способов создать архитектуру для набора инструкций в машине и найти очень тонкий баланс таких факторов, как скорость, энергопотребление и сложность самих инструкций. Эти показатели критически значимы для разработчиков аппаратного обеспечения, но в гораздо меньшей степени влияют на большинство программистов. А для тех, кто просто использует какое-нибудь устройство, подобные соображения вообще не важны.
Тьюринг показал, что все компьютеры с данной структурой (а к таковым относятся практически все, какие вы когда-либо увидите) обладают равными вычислительными возможностями, то есть способны «обсчитывать» буквально одно и то же. Конечно, их производительность может широко варьироваться, но все они одинаково эффективны, если не учитывать скорость расчетов и объем памяти. Самая крошечная и простейшая машина способна вычислить все то же, что и ее большой собрат. Какой угодно компьютер можно запрограммировать так, чтобы он имитировал любой другой, а ведь Тьюринг, по сути, именно так обосновывал свои выводы.
Нет необходимости создавать различные новые машины для выполнения различных вычислительных процессов. Они все могут быть выполнены одним цифровым компьютером, соответствующим образом запрограммированным для каждого случая.
Алан Тьюринг. Вычислительные машины и разум22.Mind, 1950
Краткое заключение по аппаратному обеспечению
Мы уже подошли к завершению нашей беседы об аппаратном оборудовании, хотя еще будем периодически возвращаться к обсуждению гаджетов или устройств. Вот некоторые основные идеи, которые вы должны усвоить из этой части.
Цифровая вычислительная машина (будь то настольный компьютер, ноутбук, сотовый телефон, планшет, электронная «читалка» или любое иное из множества устройств) содержит один или много процессоров и различные виды памяти. Процессоры очень быстро выполняют простые инструкции. Они могут определять свои дальнейшие действия на основании результатов предыдущих вычислений и вводных данных из внешнего мира. Память содержит как данные, так и инструкции, которые определяют, как обрабатывать информацию.
Логическая структура компьютеров не сильно изменилась с 1940-х годов, но физическая конструкция преобразовалась колоссально. Уже больше пятидесяти лет подтверждается закон Мура – по сути, предсказание, повлиявшее на реальность. В нем говорится об экспоненциальном уменьшении размера и цены отдельных компонентов и, следовательно, экспоненциальном увеличении вычислительной мощности при заданной стоимости и объеме пространства. Предупреждения о том, что закон Мура перестанет действовать в ближайшие 10 лет, неизменно звучат в предсказаниях о развитии технологий вот уже на протяжении десятилетий23. Очевидно, что в наше время техпроцесс для интегральной схемы совершенствовать сложнее, поскольку компоненты теперь могут состоять всего из нескольких атомов. Но люди в прошлом выказывали удивительную изобретательность: возможно, какое-нибудь новое открытие обеспечит нам следующий взлет.
Цифровые устройства работают в двоичном формате. На базовом уровне информация представлена в компонентах с двумя состояниями, поскольку они просты в сборке и наиболее надежны в эксплуатации. Информация любого вида представлена в виде набора битов. Числа разных видов (целые, дробные, научная запись24) отображаются с помощью 1, 2, 4 или 8 байт – такие фрагменты естественным образом подходят для обработки аппаратным обеспечением. Это значит, что при обычных условиях числа обладают конечным размером и ограниченной точностью. С помощью подходящего ПО можно поддерживать произвольный размер и точность, хотя программы на таком обеспечении будут работать медленнее. Иную информацию, вроде символов естественных языков, также представляют в виде некоторого количества байтов. Шифрование ASCII, которое вполне годится для английского языка, задействует один байт на символ. Более обширный Unicode, сочетающий несколько кодировок, обрабатывает все наборы символов, но занимает ощутимо больше места. UTF-8 – кодировка переменной длины в Unicode, которая предназначена для обмена информацией между системами. В ней применяется один байт для символов из ASCII и два или более для других.
Аналоговую информацию, такую как измерения величин, можно преобразовать в цифровую форму и обратно. Музыку, изображения, фильмы и тому подобные виды данных оцифровывают с помощью определенной последовательности выборок, а затем переводят обратно в аналоговый формат для восприятия человеком. При этом некоторая потеря информации не просто ожидаема – ее даже используют для сжатия.
Возможно, прочитав об аппаратном обеспечении и о том, как оно выполняет арифметические операции, вы пытаетесь сообразить: если процессор – не более чем высокоскоростной программируемый калькулятор, то как это оборудование может понимать речь, рекомендовать фильм на ваш вкус, отмечать друзей на фото? Хороший вопрос. Общий ответ состоит в том, что даже сложные процессы можно разбить на крошечные этапы вычислений. Мы еще поговорим об этом и в следующих главах о программном обеспечении, и даже после них.
Осталась еще одна тема, о которой стоит упомянуть. Компьютеры – цифровые устройства, поскольку все в конечном счете сводится к битам, которые по отдельности или в группах представляют информацию любого рода в виде чисел. Интерпретация битов зависит от контекста. Все, что мы в состоянии свести к битам, можно отобразить и обработать с помощью цифровой машины. Но учтите, что мы не знаем, как закодировать в биты или обсчитать на компьютере еще очень-очень много всего. В основном это важные области нашей жизни: творчество, истина, красота, любовь, честь и ценности. Подозреваю, что они еще какое-то время будут недоступны нашим вычислительным устройствам. И вам следует скептически относиться к тем, кто заявляет, что знает, как обращаться с такими понятиями «на компьютере».
Часть II
Программное обеспечение
Хорошая новость: компьютер – это машина общего назначения, способная выполнять любые вычисления. Хотя у него есть только несколько типов инструкций, он может прогонять их очень быстро и в значительной степени контролировать свою работу.
Плохая новость: сам он не предпринимает никаких действий, пока кто-то ему не скажет, что делать, при этом в мучительно мелких подробностях. Компьютер – настоящий «ученик чародея», способный неустанно и безошибочно следовать инструкциям, но требующий со скрупулезной точностью описывать ему, что делать.
Программное обеспечение – это общий термин, обозначающий последовательности инструкций, которые заставляют компьютер выполнять что-то полезное. Слово soft (англ, software – программное обеспечение) противоположно по смыслу слову hard25 (англ, hardware – аппаратное обеспечение), потому что ПО неосязаемо, к нему сложно прикоснуться. «Железо» осязаемо: если вы уроните ноутбук себе на ногу, то ощутите это. Но для «софта» такую ситуацию представить невозможно.
В следующих нескольких главах мы будем говорить о ПО, то есть о средстве указать компьютеру, что нужно сделать. В главе 4 мы обсудим теорию программных средств с упором на алгоритмы – по сути, схематические программы для решения узких задач. В главе 5 мы поговорим о программировании и его языках (ЯП): мы применяем их, чтобы задавать последовательности вычислительных операций. В главе 6 описываются основные виды программных систем, которыми мы пользуемся, порой даже не зная о них. В последней части данного раздела, главе 7, вы кратко познакомитесь с двумя наиболее популярными на сегодня ЯП – JavaScript и Python.
В ходе чтения стоит помнить кое о чем. Современные технологические системы все более обширно задействуют оборудование общего назначения (процессоры, память, средства коммуникации с окружающей средой), а определенное поведение создают с помощью программных средств. Вот вам прописная истина: по сравнению с оборудованием, ПО более дешево и приспособляемо, а также его легче изменить, особенно когда устройство уже покинуло завод. Например, если в машине подачей мощности и торможением управляет компьютер (встроенная система), очевидно, что различные функции вроде антиблокировки тормозов и электронного контроля устойчивости реализуются на программном уровне.
Поезда, корабли и самолеты также все больше зависят от ПО. К сожалению, с помощью программных средств не всегда просто изменить поведение оборудования.
После того как в октябре 2018 года и марте 2019 года разбились два «Боинга-737 МАХ», что привело к гибели 346 человек, в новостях часто обсуждали программное обеспечение для самолетов. Компания Boeing начала производство серии 737 в 1967 году, и с годами машины постоянно совершенствовались. Самолеты модели 737 МАХ, выпущенные в 2017 году, представляли собой обширную модификацию оригинала с более объемными и экономичными двигателями.
Вследствие такого обновления машины приобрели существенно иные летные характеристики. Вместо того чтобы модифицировать аэродинамические параметры и обеспечить тем самым поведение самолета, близкое к ранним версиям, инженеры Boeing разработали программную систему автоматического контроля полета под названием Maneuvering Characteristics Augmentation System26, или MCAS. Ее задача состояла в том, чтобы МАХ летал так же, как и другие модели серии 737, ведь тогда удалось бы избежать крупных затрат на повторную сертификацию и переобучение пилотов. В каком-то смысле ПО сделало бы новый самолет неотличимым от старого.
Говоря простым языком, из-за более тяжелых двигателей, к тому же перемещенных в другое положение, у МАХ поменялись летные характеристики. При определенных обстоятельствах, когда программа MCAS считала, что нос самолета находится слишком высоко, она интерпретировала это как возможное сваливание и опускала нос. Ее решение основывалось на показаниях одного (возможно, неисправного) входного датчика, хотя на «Боинге» их стояло два. Когда пилоты пытались поднять нос, программа отменяла эту команду. В результате самолет раскачивался вверх и вниз, что неизбежно приводило к авиакатастрофам. Что еще хуже, Boeing не уведомляла о существовании MCAS, поэтому пилоты даже не знали о возможной проблеме. Их не обучали тому, как ее устранить36.
Вскоре после второго крушения авиационные органы власти по всему миру приостановили эксплуатацию самолета МАХ. Репутация Boeing серьезно пострадала, а убытки компании оценивались в более чем 20 миллиардов долларов. В конце ноября 2020 года Федеральное управление гражданской авиации США снова разрешило полеты на МАХ, так как в подготовку пилотов и в саму машину внесли изменения. Впрочем, неясно, когда эти самолеты снова будут регулярно подниматься в воздух.
Компьютеры занимают центральное место в критически важных системах, а ПО управляет ими. Беспилотные автомобили (или обычные помощники, встроенные в современные машины) находятся под контролем программного обеспечения. Вот простой пример: в моей машине Subaru Forester установлены две камеры, которые смотрят наружу через лобовое стекло. Благодаря компьютерному зрению автомобиль предупредит меня, если я перестроюсь, не включив поворотники, или если в опасной близости окажутся машина или человек. Нередко эта информация ошибочна, и частые ложные срабатывания больше отвлекают, чем помогают, но несколько раз данная функция выручала меня.
В медицинских системах визуализации тоже применяются компьютеры: они управляют сигналом и формируют изображения, которые анализируют врачи, так что цифровые картинки вытеснили пленочные снимки. Схожая ситуация теперь и в таких областях инфраструктуры, как система управления воздушным движением, навигационные средства, электрические и телефонные сети. Но в вычислительных устройствах для голосования нашли серьезные недостатки. Так, в начале 2020 года подсчет голосов на предварительных выборах Демократической партии в Айове сорвался из-за неполадок с компьютерной системой, и для устранения ошибки понадобилось несколько дней37. Идея интернет-голосования стала популярной во время пандемии COVID-19, но она несет в себе рисков больше, чем осознают сотрудники избирательных комиссий. Очень сложно разработать систему, которая надежно даст людям сделать выбор, сохранив при этом тайну голосования38.
Военные системы полностью зависят от компьютеров как по части вооружений, так и в аспекте снабжения. То же самое относится и к финансовым системам по всему миру. Кибервойна и шпионаж – это реальные угрозы. Например, червь Stuxnet 2010 года разрушил иранские центрифуги по обогащению урана. Крупное отключение электроэнергии на территории Украины в декабре 2015 года было вызвано российской вредоносной программой, хотя правительство РФ отрицает свою причастность39. Два года назад (в 2018-м) произошла вторая серия атак с использованием программы-вымогателя Petya, которая повлияла на работу различных украинских организаций. Когда атака программы-вымогателя WannaCry нанесла ущерб в миллиарды долларов по всему миру, правительство США официально возложило ответственность на Северную Корею40. В июле 2020 года несколько стран обвинили российскую группу кибершпионажа в попытке украсть сведения о разрабатываемых вакцинах против COVID-1941.
Нападениям, как криминальным, так и поддерживаемым государством, вполне могут подвергнуться самые разнообразные цели. Если наше ПО недостаточно устойчиво и надежно, то у нас проблемы, а по мере роста зависимости от компьютеров ситуация будет только усугубляться. Как мы увидим далее, сложно написать «софт», который совершенно надежен. Любая ошибка или недосмотр в логике или реализации способны привести к сбоям в работе программы, и даже если их не происходит при обычном использовании, возможно, что возникшая лазейка пригодится злоумышленникам.
4
Алгоритмы
Алгоритм Фейнмана42:
1. Запишите проблему.
2. Подумайте над ней как следует.
3. Запишите решение.
Приписывается физику Мюррею Гелл-Манну, лауреату Нобелевской премии, 1992
Когда люди хотят объяснить, что такое программное обеспечение, то часто сравнивают его с кулинарным рецептом. В поваренных книгах описываются ингредиенты, последовательность действий, которые нужно выполнить, и ожидаемый результат. По аналогии, в программе для решения какой-либо задачи необходимо указать данные и прописать, что с ними делать. Правда, в реальности советы кулинарам настолько расплывчатые и неопределенные, что никакую программу при всем желании так не составить, поэтому аналогия не слишком удачна. Например, в рецепте шоколадного торта сказано: «Выпекайте в духовке 30 минут или до затвердевания. Проверьте, аккуратно положив ладонь на поверхность»43. На что повар должен обратить внимание – на колебание, упругость или что-то еще? «Аккуратно» – это как именно? Выпекать нужно не больше или не меньше 30 минут?
Более удачная метафора – бланки налоговых деклараций, так как в них описывается множество подробностей того, что нужно сделать («Вычтите строку 30 из строки 29. Если получилось ноль или меньше, укажите 0. Умножьте строку 31 на 0,25…»). Аналогия все еще не совершенна, но тут намного лучше, чем в варианте с рецептами, отражаются вычислительные аспекты. Здесь проводятся арифметические операции, значения данных копируются из одного места в другое, проверяются условия, последующие расчеты зависят от результатов предыдущих.
Также важно, что при заполнении форм процесс должен дойти до конца, то есть у вас в любом случае обязан получиться результат – сумма причитающегося налога. Он должен четко определяться правилами: все люди, которые вводят одни и те же исходные данные, должны получить одинаковый итог. И расчеты должны завершиться через конечный промежуток времени. Исходя из моего личного опыта, это все идеализация, потому что терминология не всегда понятна, инструкции более туманны, чем кажется налоговой инспекции, и зачастую непонятно, какие значения данных следует использовать.
Алгоритм — это компьютерная версия тщательно составленного, точного и недвусмысленного рецепта или налоговой формы. По сути, последовательность шагов, которые гарантируют правильное вычисление результата. Каждый этап описывается в терминах базовых операций, значение которых четко определено: например, «сложить два целых числа». Нет никаких расплывчатых терминов. Указан характер входных данных. Рассмотрены все возможные ситуации: никогда не бывает такого, что при работе с алгоритма становится непонятно, какие действия производить дальше. Если специалисты по информатике склонны к педантизму, то обычно добавляют еще одно условие: алгоритм не может выполняться бесконечно. Согласно такому стандарту, классическая инструкция к шампуню «намылить, смыть, повторить»27 – это не алгоритм.
На разработке, анализе и внедрении эффективных алгоритмов зиждется академическая информатика. Кроме того, в реальном мире существуют алгоритмы, имеющие огромное значение. Я вовсе не собираюсь точно объяснять или описывать алгоритмы, но хочу донести до вас, что речь идет о последовательностях операций, заданных достаточно подробно и точно. Настолько, чтобы не возникло сомнений в том, какие действия имелись в виду и как их выполнять, даже если совершает их сущность без интеллекта и воображения. Мы также обсудим алгоритмическую эффективность – то, как время вычислений зависит от объема обрабатываемых данных. В качестве примеров мы возьмем несколько базовых алгоритмов, которые хорошо известны и понятны.
В этой главе вам не обязательно вникать во все подробности или иногда всплывающие формулы, но изложенные здесь принципы важны.
4.1. Линейные алгоритмы
Предположим, мы хотим выяснить, кто самый высокий человек в помещении. Люди могут просто осмотреться и прикинуть, но алгоритм должен прописать все шаги настолько точно, чтобы даже глупый компьютер сумел им следовать.
Простейший метод – поочередно узнать рост всех присутствующих, отмечая, кто самый высокий на текущий момент. То есть мы по очереди спрашиваем каждого человека: «Джон, какой у тебя рост? Мэри, какой у тебя рост?» – и так далее. Если Джон – первый из опрошенных, то пока он будет самым высоким. Если Мэри выше, то теперь она будет самой высокой, в противном случае Джон сохранит лидерство. Дальше мы спросим третьего человека и т. д.
В конце, опросив всех людей, мы узнаем, кто самый высокий и какой у него рост. Если внести вполне очевидные вариации, то тем же способом мы определим, кто из присутствующих самый богатый, чье имя идет первым по алфавиту или чей день рождения ближе всего к концу года.
Но тут есть сложности. Как мы справимся с повторами – например, если окажется, что у двух людей одинаковый рост? Придется выбирать, кого указывать в результате: первого, второго, обоих или определить случайным образом.
Заметьте, что поиск большой группы людей с одинаковым ростом – еще более сложная проблема, так как от нас потребуется непрерывно помнить имена всех, кто соответствует условию, и до самого конца опроса мы не будем знать, кто попадет в финальный список. Этот пример подразумевает использование структуры данных, то есть способа представления информации, необходимой для вычисления. Такой фактор важен для многих алгоритмов, хотя здесь мы не будем подробно обсуждать данную тему.
А что, если мы захотим вычислить средний рост? Можно узнавать у каждого человека его или ее рост, складывать получаемые значения по мере их поступления (возможно, используя программу Игрушки для суммирования последовательности чисел) и потом разделить итог на количество опрошенных. Если у нас на листочке записано N значений роста, то, выразив процесс расчета более «алгоритмически», мы получим:

Однако если мы попросим компьютер выполнить эту работу, надо будет проявить внимательность. Что произойдет, например, если на листочке нет никаких чисел? Если расчеты ведет человек, то это не проблема: нам понятно, что пока вычислять нечего. Компьютеру же нужно сказать, чтобы он проверил, не возникла ли такая ситуация, и описать ему порядок действий на такой случай. Если машина не проведет проверку, то будет пытаться разделить сумму на ноль, а это неопределенная операция. Алгоритмы и компьютеры обязаны обрабатывать все возможные ситуации. Если вы когда-нибудь получали чек на «О долларов и 00 центов» или счет, где к оплате указана сумма, равная нулю, то сталкивались с примером того, что кто-то не учел все вероятные случаи должным образом.
Что, если мы не знаем заранее, сколько будет элементов данных, как чаще всего и бывает? Можно подсчитывать элементы по мере вычисления суммы:

Как видите, в конце добавлено условие отсутствия записей, при соблюдении которого машина сообщает, что значения роста не введены. Это один из способов решения проблемы с возможным делением на ноль – целевая проверка, не возникло ли такое «неудачное» состояние.
Один из важнейших параметров алгоритма – эффективность его работы: быстрый он или медленный, сколько времени ему понадобится для обработки определенного количества данных. В приведенных выше примерах количество шагов для выполнения задачи (или время, которое понадобится для этого компьютеру) прямо пропорционально объему поступающей информации. Если в комнате соберется вдвое больше людей, то компьютер будет в два раза дольше определять самого высокого человека или средний рост, а если вдесятеро больше – то в десять раз. Когда время вычисления прямо или линейно пропорционально количеству данных, алгоритм называется линейно-временным или просто линейным. Если бы мы построили график зависимости срока обработки от количества элементов данных, то у нас получилась бы прямая линия, направленная вверх и вправо. Многие алгоритмы, с которыми мы сталкиваемся в повседневной жизни, линейные, поскольку они предполагают выполнение одной и той же базовой операции или операций над какой-либо информацией. И чем больше данных, тем больше работы (в прямо пропорциональной зависимости).
Многие линейные алгоритмы принимают одну и ту же базовую форму. В них есть некий этап инициализации – например, текущую сумму устанавливают равной 0 или задают для «самого высокого роста» какое-либо малое значение. Затем проверяется каждый элемент по очереди, и с ним производятся те или иные простые вычисления: его учитывают, сравнивают с предыдущим значением, элементарно преобразовывают, возможно, печатают. В конце могут потребоваться некоторые шаги для завершения работы – например, вычисление среднего значения, вывод суммы или самого высокого роста. Если операция с каждым элементом занимает примерно одинаковое время, то общий срок будет пропорционален количеству элементов.
Pulsuz fraqment bitdi.