В рамках моего курса в университете мы сначала играем с жесткими дисками и уже потом переходим к обсуждению программного обеспечения (ПО) и «Hello, world!» в том числе. ПО – это все, что взаимодействует с аппаратным обеспечением. С его помощью вы добиваетесь от компьютера выполнения написанных вами на клавиатуре инструкций. Это то, что обеспечивает работу программы «Hello, world!». К слову, текст, который вы набираете, также превращается в инструкции, которые компьютер исполняет. Железо – это физическая часть компьютера, софт – все остальное. Таким образом, компьютерное программирование и написание ПО чаще всего означают одни и те же вещи.
Не буду вас обманывать: программирование – это математика. И если кто-то пытается убедить вас в обратном, что, мол, без математики можно научиться программировать, то, скорее всего, вам пытаются что-то продать.
Хорошая новость заключается в том, что для начального уровня программирования понадобится математика уровня 4‒5 класса школы. Вам нужно разбираться в таких операциях, как сложение, вычитание, умножение, деление, и понимать, что такое проценты и остаток. Кроме того, понадобятся базовые знания геометрии, а именно представления о площади, периметре, радиусе и окружности. Также стоит вспомнить о графиках и о координатах х, y, z. Наконец, вам понадобится базовое понимание функций – тех, что мы используем, чтобы превратить 2 в 22.
Если у вас математическая фобия, то, вероятно, на этом самом месте вы хотите закрыть книгу. Это нормально. Многие говорят, что каждый должен уметь писать программы, но я так не считаю. Программирование окажется неприятным опытом, если математика – не ваша сильная сторона. Однако если вы уверены, что способны пересчитать чек в ресторане, или справляетесь с ежедневными задачами вроде измерения ковра, который планируете положить в гостиной, то определенно вы справитесь.
А вот средний уровень программирования требует знаний линейной алгебры, геометрии и математического анализа. Хотя большинство людей не чувствуют нехватки знаний, оставаясь на базовом уровне. Программирование может быть как искусством, так и ремеслом. Как ремесло оно помогает учиться и зарабатывать на жизнь. Как искусство программирование требует как ремесленного подхода, так и знания в области высшей математики. В рамках этой книги мы будем считать, что вас интересует именно подход ремесленника.
Обычно способ взаимодействия аппаратного обеспечения и софта описывается техническим языком. Вместо этого воспользуемся метафорой. Разобраться в слоях компьютера – все равно что разобраться в слоях клаб-сэндвича с индейкой (рис. 2.3).
Клаб-сэндвич с индейкой – понятная вещь. Он состоит из множества частей, однако вместе они создают восхитительный вкус. Компьютер работает в определенной логике, подобно тому как ингредиенты сэндвича находятся в определенном порядке.
Слой хлеба – основа сэндвича, в случае компьютера – это железо. Оно «не знает» ничего, разве что то, как справиться с двоичными данными – нулями и единицами. Под справляться я подразумеваю считать. Помните, что вся деятельность компьютеров сводится к математике.
Над аппаратным обеспечением находится слой, который позволяет переводить слова в двоичный код (нули и единицы). Назовем его слоем машинного языка. Это как слой индейки, который укладывается поверх хлеба. Машинный слой обеспечивает перевод символов в двоичный код, при помощи которого компьютер и осуществляет расчеты. Этими символами могут быть слова, цифры – то, что мы, люди, используем для коммуникации друг с другом. Это искусственная система. Чтобы говорить на языке машинных кодов, необходимо владеть особым диалектом – языком ассемблера, который буквально собирает символы в машинный код.
Язык ассемблера сложный. Ниже можно познакомиться с примером того, как на нем выглядит программа десятикратного вывода «Hello, world!». Я нашла этот код на сайте для разработчиков под названием Stack Overflow.
org
xor ax, ax
mov ds, ax
mov si, msg
boot_loop: lodsb
or al, al
jz go_flag mov ah, 0x0E
int 0x10
jmp boot_loop
go_flag:
jmp go_flag
msg db ‘hello world’, 13, 10, 0
times 510- ($-$$) db 0
db 0x55
db 0xAA
Язык ассемблера нелегко читать, на нем сложно писать. Немногие хотят посвятить ему свое время. Поэтому, чтобы облегчить процесс передачи инструкций, появился еще один слой. Назовем его операционной системой. На моем Mac работает операционная система Linux, названная в честь ее создателя, Линуса Торвальдса. Linux основывается на Unix – операционной системе, разработанной Ричи, автором «Hello, world!». Уверена, сами операционные системы вам известны лучше, чем их разработчики. Собственно, компьютерная революция 1980-х была как раз триумфом операционных систем, которые стали функционировать поверх языка машинных кодов и значительно упростили человеку взаимодействие с компьютером.
На этой стадии у вас появляется вполне рабочая версия компьютера. Вы можете запускать любые существующие программы только лишь с помощью Linux. Однако его интерфейс основывается на текстовых командах и не слишком интуитивно понятен – на компьютерах Mac, например, работает своя операционная система OS X с ее известнейшим интерфейсом. Он называется графическим пользовательским интерфейсом (GUI, graphic user interface). GUI был одной из самых инновационных идей Стива Джобса: он понял, что командные интерфейсы слишком сложны, поэтому распространял практику использования иконок поверх текста, помогая ориентироваться на экране. Джобс узнал о графическом пользовательском интерфейсе и мыши у Алана Кэя, исследователя лаборатории Xerox PARC, в 1973 г. выпустившей обе эти технологии. И хотя мы любим приписывать кому-то конкретному лавры инновационных технологических побед, на самом деле редко когда за компьютерной инновацией стоит один человек. Если присмотреться, всегда можно найти логического предшественника, а также команду специалистов, которая разрабатывала проект месяцами, если не годами. В свое время Джобс заплатил за экскурсию по Xerox PARC, увидел проект GUI и запатентовал его. Графический интерфейс в дуэте с мышью от Xerox PARC – это производная от более ранней идеи, системы oN-Line System (NLS), представленной Дугласом Энгельбартом в презентации «Мать всех демо» (Mother of All Demos) в 1968 г. на конференции Ассоциации вычислительной техники. Мы рассмотрим эту историю подробнее в главе 6.
Следующий слой – тоже программный, работающий поверх операционной системы. Веб-браузер (вроде Safari, Firefox, Chrome или Internet Explorer) – это программа, которая позволяет просматривать веб-страницы. Microsoft Word – текстовый редактор. Компьютерные видеоигры вроде Minecraft – это тоже программы. И каждая из них спроектирована таким образом, чтобы пользоваться возможностями разных операционных систем. Поэтому, например, на Mac нельзя запустить программу для Windows (если только вы не используете эмулятор, очередную программу). Программы спроектированы так, чтобы ими было