Индустрия чистых идей
1.2. Общие установки
В следующей лекции мы перейдем непосредственно к разработке программ. Нам не понадобится детальное знание компьютера, но давайте ознакомимся с его фундаментальными свойствами, поскольку они устанавливают контекст для конструирования программ.
Задачи компьютеров
Компьютеры – цифровые устройства с автоматически хранимой программой; если быть более точным – это машины, которые могут хранить и находить информацию, выполнять операции над этой информацией и обмениваться информацией с другими устройствами.
Следующее определение подчеркивает основные способности компьютера.
Компьютеры выполняют
- хранение и поиск
- операции
- коммуникации
Хранение и доступ – необходимое условие для всего остального: компьютеры должны иметь возможность где-то хранить и откуда-то извлекать информацию, прежде чем они смогут ее обрабатывать или передавать. Это "где-то" называется памятью.
Операции включают сравнение ("Являются ли два значения одинаковыми?"), замену ("Замени одно значение на другое"), арифметику ("Вычисли сумму этих двух значений") и другое. Операции являются примитивными, но, тем не менее, компьютеры способны совершать изумительные вещи благодаря скорости, с которой они выполняют базисные операции и мастерству человека – вашему, того, кто пишет программы.
Коммуникация позволяет нам вводить информацию в компьютер и находить нужную нам информацию (оригинальную либо созданную в процессе выполнения операций). Компьютеры могут также общаться с другими компьютерами и различными устройствами, такими как датчики, телефоны, дисплеи и многие другие.
Общая организация
Предыдущее определение дает основу для построения следующей диаграммы.
Память хранит информацию. Говоря о памяти, нужно понимать, что у компьютера могут быть несколько устройств, называемых памятью, и они могут быть разного вида, отличаясь размерами, скоростью доступа и живучестью (возможностью сохранения информации при отключении энергии).
Процессоры выполняют операции. И снова их может быть несколько. Обычно мы встречаемся с процессором, называемым ЦПУ (CPU, аббревиатура для устаревшего термина Central Processing Unit).
Устройства коммуникации обеспечивают способ взаимодействия с внешним миром. На рисунке показана связь внешнего мира с процессором, а не непосредственно с памятью; в действительности, когда нужно изменить информацию в памяти при вводе данных из внешнего мира, предварительно нужно выполнить некоторые операции процессора. Устройства коммуникации поддерживают либо ввод (из мира в компьютер), либо вывод (в обратном направлении), либо обмен в обоих направлениях. Примерами устройств являются:
- клавиатура, с помощью которой человек вводит тексты (ввод);
- дисплей или терминал (вывод);
- мышь или джойстик, позволяющий создавать точки на экране (ввод);
- датчики, регулярно посылающие результаты измерений производственных параметров в компьютер (ввод);
- сетевое соединение, позволяющее связываться с другими компьютерами и устройствами (ввод-вывод).
Аббревиатура I/O используется для ввода и вывода.
Информация и данные
Ключевое слово в определении компьютеров – информация, которую мы храним в памяти, обрабатываем и которой обмениваемся, используя устройства коммуникации.
Это верно с точки зрения человека. Строго говоря, компьютеры не манипулируют с информацией, они имеют дело с данными, представляющими информацию.
Определения: данные, информация
Совокупности символов, хранящиеся в компьютере, называются данными.
Любая интерпретация данных в интересах человека называется информацией.
Информация может быть всем, чем угодно: заголовками новостей, фотографией друга, тезисами докладчика на семинаре. Данные – закодированная форма информации.
Приведу пример: аудиоформат MP3 задает множество правил, позволяющих декодировать информацию о музыкальном произведении, которое может храниться в виде данных в памяти компьютера, может быть передано по сети и послано аудиоустройству для воспроизведения.
Данные хранятся в памяти. Задача устройств коммуникации – создать данные из приходящей информации, сохранить их в памяти и, когда процессоры преобразуют эти данные и создадут новые, передать их во внешний мир в таком виде, чтобы данные воспринимались как информация. В адаптированном виде этот процесс показан на следующей картинке:
Стрелки, идущие вправо и влево, показывают, что процесс не однонаправленный, а повторяющийся, и благодаря обратной связи позволяет вырабатывать новые результаты.
Компьютеры повсюду
Обыденной картиной является настольный или портативный компьютер, чей процессор и память могут быть упрятаны в ящик размером с учебник, подобный этой книге, или с большой словарь. Они имеют размеры, соответствующие удобству человека. Среди "ручных" размеров встречаются такие устройства, как мобильный телефон, являющийся сегодня карманным компьютером с расширенными функциями коммуникации. Для сложных научных вычислений (физика, предсказание погоды…) применяются суперкомпьютеры, размеры которых соизмеримы с размерами комнаты. Конечно, эти размеры не идут ни в какое сравнение с размерами компьютеров предыдущих поколений, занимавших целые здания при более чем скромных возможностях.
![Компьютеры: (a)настольный; (b) портативный; (c) iPhone (Apple);(d) навигационная система GPS;(e) встроенный процессор](/EDI/28_11_18_2/1543357168-6234/tutorial/999/objects/1/files/01_04.jpg)
Рис. 1.4. Компьютеры: (a)настольный; (b) портативный; (c) iPhone (Apple);(d) навигационная система GPS;(e) встроенный процессор
Размеры процессора и памяти значительно меньше, чем занимают показанные на рисунке устройства. Растет число компьютеров, встраиваемых в бытовые устройства. Современные автомобили напичканы компьютерами, регулирующими подачу топлива, торможение, даже открытие окон. Принтер, связанный с компьютером, сам является компьютером, способным создавать шрифты, сглаживать изображения, после заминки бумаги начинать печать с последней необработанной страницы. Электрические бритвы включают компьютеры. Стиральные машины содержат компьютеры, и в ближайшем будущем маленькие компьютеры могут встраиваться в одежду для согласования с процессом стирки.
Компьютеры, которые вы будете использовать для выполнения упражнений этой книги, – это обычные компьютеры с клавиатурой, мышкой, дисплеем, но подсознательно нужно всегда иметь в виду, что методика разработки ПО покрывает более широкую область. ПО для встроенных систем должно удовлетворять более жестким требованиям: неверное срабатывание системы торможения может привести к ужасным последствиям, и их нельзя исправить, как при выполнении программ на настольном компьютере, остановив выполнение, исправив ошибку и запустив программу повторно.
Компьютер с хранимой программой
Компьютер, как отмечалось, является универсальной машиной, способной выполнять любую введенную в него программу.
Для процесса ввода используются устройства коммуникации, обычно клавиатура и мышь. Текст появляется на экране при его печати и кажется, что это непосредственный результат ввода, но это иллюзия. Клавиатура является устройством ввода, дисплей – устройством вывода, отображение входного текста на экране требует специальной программы, называемой текстовым редактором, получающей ввод, обрабатывающей его и выводящей результат на экран. Благодаря скорости работы компьютера возникает иллюзия непосредственной связи клавиатуры и дисплея.
Когда программа вводится, куда же она попадает? В память, доступную для ее хранения. Вот почему говорят о компьютере с хранимой программой. Чтобы стать специализированной машиной, способной выполнять специфические задачи, которые вы как программист поставили ему, компьютер будет читать ваши приказы из своей памяти.
Свойство хранимой программы объясняет, почему мы не дали подходящего определения для устройств памяти. Следовало бы сказать, что память – это устройство для хранения и доступа к данным, но тогда понятие данных распространялось бы и на программы. Разумнее разделять эти два понятия.
Определение: память
Память – устройство для хранения и доступа к данным и программам.
Способность компьютеров рассматривать программы как данные – выполняемые данные – объясняет их исключительную гибкость. В начале компьютерной эры это привело к осознанию существования самомодифицируемых программ (так как программы могут изменять данные, они могут и модифицировать программы, включая и саму исполняемую программу). Отсюда пошли философские рассуждения, что в результате последовательности самомодификаций программы могут стать умнее создателя и компьютер захватит власть над миром.
Действительность, с которой мы сталкиваемся сегодня, – более прозаическая и более неприятная. Например, одна из причин, почему пользователи электронной почты должны быть крайне осторожны при открытии вложений, приходящих с письмом, состоит в том, что приходящие данные могут оказаться зловредно написанной программой, чье выполнение разрушит другие данные.
Для программистов свойство хранимой программы имеет непосредственное следствие: оно делает программы подлежащими, подобно данным любого другого типа, различным трансформациям, выполняемым другими программами. В частности, программа, которую вы пишете, это не та программа, которую вы выполняете. Операции, которые может выполнять процессор, спроектированы для машин, не для человека, их непосредственное использование утомительно и чревато ошибками. Вместо этого вы будете:
- писать программы в нотации, спроектированной для людей и называемой языками программирования. Эта форма программы называется исходным кодом (исходным текстом, иногда просто исходником);
- зависеть от специальных программ, называемых компиляторами, которые преобразуют программу, читаемую человеком, в формат, подходящий для выполнения процессором (этот формат называют машинным кодом, объектным кодом).
Мы часто будем сталкиваться со следующими терминами, отражающими это разделение задач.
Определения: статика, динамика
Статические свойства программы – это свойства исходного текста, которые могут быть проанализированы компилятором.
Динамические свойства – это те свойства, которые характерны для этапа выполнения машинного кода на компьютере.
Детали всего этого – коды процессора, языки программирования, компиляторы, примеры статических и динамических свойств – появятся в последующих лекциях. На данный момент следует знать, что программы, которые вы собираетесь писать, начиная со следующей лекции, предназначены как для людей, так и для компьютеров.
Человеческий аспект программирования является центральным для инженерии программ. Когда вы программируете, вы пишете текст не только для компьютера, но и для человека, например, для того, кто позже будет читать вашу программу, чтобы добавить в нее новые функции, исправить ошибки. Это хороший повод, чтобы позаботиться о читабельности вашей программы. Дело не только в том, чтобы быть любезным по отношению к другому человеку; этим "другим" можете быть вы сами, когда, став старше на несколько месяцев, будете пытаться расшифровать написанное в исходной версии и чертыхаться, силясь понять, что бы это могло значить.
В этой книге внимание акцентируется не только на приемах, которые делают программу хорошей для компьютера (таких как эффективность выполнения, позволяющих достаточно быстро выполнять программу), но и на приемах, которые делают программу хорошей для чтения человеком. Программные тексты должны быть понятными, расширяемыми (простыми для внесения изменений); программные элементы должны быть повторно используемыми, чтобы при повторной встрече с похожей задачей не пришлось бы повторно изобретать ее решение. Программы должны быть устойчивыми, защищать себя от ошибочно введенных данных. И главное, они должны быть корректными, выдавать ожидаемые результаты.
Программистский фольклор: все важное в дырочках
Ветераны аэрокосмической индустрии рассказывают историю об одном инженере в эпоху первых космических полетов, который был ответственным за вес всего, что попадает на борт космического корабля. Он приставал к программистам, требуя, чтобы они назвали вес управляющего ПО. Ответ неизменно был, что ПО вообще ничего не весит; но инженера это не убеждало.
Однажды он пришел к главному программисту, размахивая пачкой перфокарт (средство ввода данных в те времена, смотри рисунок). "Это и есть ПО, – закричал он, – разве я не говорил вам, что и оно, подобно всему, имеет вес!" На что программист, не раздумывая, ответил ему: "Видите дырки? Они и есть ПО".
(Возможно, апокриф, но все же хорошая история)