Глава 25
Графическая революция
В выпуске журнала Life от 10 сентября 1945 года читатели обнаружили привычную чересполосицу статей и фотографий: заметки об окончании Второй мировой войны, рассказ о жизни танцора Вацлава Нижинского в Вене, фоторепортаж о профсоюзе рабочих автомобильной промышленности. Однако тот выпуск содержал и нечто неожиданное: провокационную статью Вэнивара Буша (1890–1974) о будущем научных исследований. С 1927 по 1931 год, работая профессором Массачусетского технологического института, Ван Буш (как его называли) внес свой вклад в историю вычислительной техники, сконструировав один из самых значимых аналоговых компьютеров — дифференциальный анализатор. В 1945 году, когда вышел его артикул, Буш возглавлял управление научных исследований и разработок, которое во время войны координировало научные исследования США, включая Манхэттенский проект.
Статья Буша «Как мы можем мыслить» (As We May Think), несколько сокращенная с момента своего первого появления в The Atlantic Monthly двумя месяцами ранее, содержала описания некоторых будущих гипотетических изобретений, предназначенных для ученых и исследователей, которым приходится иметь дело с постоянно растущим объемом специализированных изданий. Решение этой проблемы Буш видел в использовании микропленки и придумал устройство под названием Memex для хранения книг, статей, звукозаписей и изображений. Это устройство также должно было позволять пользователю устанавливать тематические связи между этими фрагментами информации по аналогии с тем, как человеческий разум формирует ассоциации. Буш даже представлял новую группу профессионалов, которые должны были заниматься созданием этих ассоциативных связей.
Несмотря на то что на протяжении всего XX века о чудесах будущего было написано множество работ, статья Буша выделялась. В ней речь не шла о бытовых устройствах для облегчения домашнего труда, о футуристических видах транспорта или о роботах. Она была посвящена информации и тому, как новые технологии могут помочь справиться с увеличением ее объема.
За десятилетия, прошедшие с момента создания первых релейных калькуляторов, компьютеры стали меньше, быстрее и дешевле. Эта тенденция изменила саму природу вычислений. Чем более дешевыми становятся компьютеры, тем больше людей могут их себе позволить. По мере уменьшения их размера и повышения роста быстродействия программное обеспечение оказывается все более изощренным, благодаря чему расширяется круг задач, решаемых этими машинами.
Дополнительная мощность и скорость могут использоваться для совершенствования самой важной части компьютерной системы — пользовательского интерфейса, который обеспечивает человеко-машинные взаимодействия. Люди и компьютеры — разные создания. К сожалению, людей гораздо легче убедить в необходимости приспосабливаться к особенностям вычислительных машин, чем наоборот.
Поначалу цифровые компьютеры не были интерактивными. Для программирования одних использовались переключатели и кабели, для программирования других — перфорированная лента или пленка. В период с 1950-х до начала 1970-х годов компьютеры эволюционировали до такой степени, что нормой стала пакетная обработка с минимальным вмешательством оператора: программы и данные сохранялись на перфокартах, которые затем считывались в память. Программа анализировала полученную информацию, делала некоторые выводы и печатала результаты на бумаге.
Самые ранние интерактивные компьютеры работали с помощью телетайпных аппаратов. Такие установки, как система распределения времени Дартмутского университета (начала 1960-х), описанная в предыдущей главе, позволяли одновременно применять несколько телетайпов. Пользователь набирал на телетайпе строку текста, на которую компьютер отвечал одной или несколькими строками, отпечатываемыми на рулоне бумаги. Обмен информацией между телетайпом и компьютером осуществлялся с помощью потоков ASCII-кодов (хотя могла быть и другая кодировка), включающих, помимо кодов символов, простые управляющие коды, например для возврата каретки и перевода строки.
Однако электронно-лучевая трубка, которая получила более широкое распространение в 1970-е, не имела таких ограничений. Программное обеспечение могло использовать экран более гибко — в качестве двумерной платформы для отображения информации. Тем не менее разработчики большинства программ для небольших компьютеров, вероятно привыкшие к определенной логике отображения информации, продолжали рассматривать экран в качестве «стеклянного телетайпа». Создаваемые ими программы выводили данные на экран построчно сверху вниз, а по достижении нижней границы его содержимое необходимо было прокручивать вверх. Именно таким способом дисплей использовали все программы CP/M и большинство программ MS-DOS, а операционная система UNIX до сих пор с гордостью поддерживает эту традицию.
Интересно, что набор символов ASCII не является столь уж неуместным при работе с ЭЛТ. Изначально эта кодировка включала код 1Bh (Escape), специально предназначенный для расширения набора отображаемых символов. В 1979 году Американский национальный институт стандартов опубликовал стандарт «Дополнительные управляющие символы для использования с ASCII». Его цель — «удовлетворение ожидаемых потребностей в контроле над вводом и выводом на двумерных устройствах отображения информации, включая интерактивные терминалы с электронно-лучевой трубкой и принтеры».
Код 1Bh занимает всего один байт, поэтому может иметь только одно значение. Код Escape предваряет последовательности символов, которые выполняют определенные функции. Например, последовательность, состоящая из кода Escape, за которой следуют символы [2J, стирает все содержимое экрана и перемещает курсор в верхний левый угол.
1Bh 5Bh 32h 4Ah
Телетайпный аппарат не позволяет сделать ничего подобного. Последовательность, состоящая из кода Escape, за которой следуют символы [5; 29H, перемещает курсор на пятую строку 29-го столбца.
1Bh 5Bh 35h 3Bh 32h 39h 48h
Комбинация ЭЛТ и клавиатуры, которая реагирует на ASCII-коды (возможно, и на Escape-последовательности), поступающие с удаленного компьютера, иногда называется «немым» терминалом. Такой терминал работает быстрее и гибче по сравнению с телетайпными аппаратами, однако его скорости недостаточно для внедрения нового в пользовательском интерфейсе. Настоящие инновации были реализованы в 1970-х годах в небольших компьютерах, в которых, как и в гипотетическом компьютере из главы 21, видеопамять была частью адресного пространства микропроцессора.
Первым признаком того, что домашние компьютеры будут сильно отличаться от своих более крупных и дорогих предшественников, было, вероятно, приложение VisiCalc, разработанное Даниэлем Бриклином (род. 1951) и Бобом Фрэнкстоном (род. 1949) в 1979 году для компьютера Apple II. Приложение VisiCalc выводило на экран двумерное изображение электронной таблицы. До этого электронная таблица представляла собой разлинованный лист бумаги, обычно используемый для выполнения вычислений. Приложение VisiCalc заменило бумагу экраном, позволив пользователю перемещаться по электронной таблице, вводить числа и формулы, а также пересчитывать результаты после внесения изменений.
Удивительным в VisiCalc было то, что это приложение нельзя было воссоздать на больших компьютерах. Подобным программам необходимо очень быстро обновлять экран. По этой причине приложение VisiCalc записывало данные непосредственно в видеопамять компьютера Apple II, являющуюся частью адресного пространства микропроцессора. Интерфейс между большим компьютером с системой распределения времени и «немым» терминалом работал недостаточно быстро для такой электронной таблицы.
Чем быстрее компьютер может реагировать на сигналы клавиатуры и обновлять видеоизображение, тем плотнее его взаимодействие с пользователем. Большая часть программ, написанных в течение первого десятилетия после выхода IBM PC (в 1980-х), предполагала запись данных непосредственно в видеопамять. Поскольку стандартов аппаратного обеспечения, введенных компанией IBM, придерживались и другие производители компьютеров, разработчики программ могли обойти операционную систему и напрямую задействовать аппаратное обеспечение, не опасаясь, что на некоторых компьютерах их программы будут работать неправильно (вообще не будут работать). Если бы во всех клонах IBM PC применялись разные аппаратные интерфейсы для видеодисплеев, то программистам было бы сложно учесть особенности различных конструкций.
В большинстве ранних приложений для IBM PC на экране отображался только текст без графики, что обеспечивало максимальную скорость работы. Когда видеодисплей устроен так, как описано в главе 21, программа может отобразить на экране конкретный символ, просто записав в память соответствующий ASCII-код. Программе, использующей графический видеодисплей, обычно требуется записать в память восемь или более байтов для вывода на экран изображения текстового символа.
Переход от отображения текста к отображению графики стал чрезвычайно важным шагом в эволюции. Однако процесс развития компьютерного оборудования и программного обеспечения, работающего не только с текстом, но и с графическими изображениями, происходил очень медленно. Еще в 1945 году Джон фон Нейман рассматривал возможность вывода графических изображений на дисплей, основанный на принципе работы осциллографа. Однако только в начале 1950-х годов компьютерная графика стала реальностью, когда в Массачусетском технологическом институте (при содействии компании IBM) была учреждена Лаборатория Линкольна, перед которой стояла задача разработать компьютер для системы ПВО ВВС США. Этот проект под названием SAGE (Semi-Automatic Ground Environment, «полуавтоматическая наземная среда») подразумевал использование графических экранов, с помощью которых операторы могли бы анализировать большие объемы информации.
Первые видеодисплеи, использованные в таких системах, как SAGE, не были похожи на мониторы современных персональных компьютеров. Сегодня ПК оснащены так называемыми растровыми дисплеями. Как и в телевизоре, изображение на устаревших ЭЛТ-мониторах состоит из серии горизонтальных растровых линий, рисуемых лучом электронной пушки, который быстро пробегает по экрану. Такой экран можно представить в виде большого прямоугольного массива точек, называемых пикселами. Для хранения видеоизображения в памяти компьютера выделяется целая область, в которой один или несколько битов соответствует пикселу на экране. Значения этих битов определяют степень светимости и цвет пикселов.
Например, разрешение большинства современных компьютерных дисплеев составляет как минимум 640 пикселов по горизонтали и 480 пикселов по вертикали. Их общее количество соответствует произведению этих двух чисел: 307 200. Если для каждого пиксела выделяется только один бит памяти, то его цвет ограничивается двумя вариантами, обычно черным и белым. Например, значение 0 может указывать на черный пиксел, значение 1 — на белый. Такой видеодисплей требует 307 200 бит памяти, или 38 400 байт.
Чтобы расширить диапазон отображаемых цветов, необходимо выделить для каждого пиксела большее количество битов, а это увеличивает требования видеоадаптера к памяти. Например, для кодирования оттенков серого под каждый пиксел можно предоставить один байт памяти. При таком подходе значение 00h будет соответствовать черному цвету, значение FFh — белому, а промежуточные — оттенкам серого.
Цветное изображение ЭЛТ создается с помощью трех электронных пушек, по одной для каждого из трех основных цветов: красного, зеленого и синего. (В этом можно убедиться, рассмотрев цветной экран телевизора или компьютера через увеличительное стекло; в принтерах другой набор цветов.) Сочетание красного и зеленого дает желтый цвет, красного и синего — малиновый, зеленого и синего — голубой, а комбинация всех трех основных цветов — белый.
Простейший цветной графический адаптер требует, чтобы на один пиксел приходилось три бита, по одному биту на каждый из основных цветов. Цвет пикселов может быть закодирован следующим образом.
Биты
Цвет
000
Черный
001
Синий
010
Зеленый
011
Голубой
100
Красный
101
Малиновый
110
Желтый
111
Белый
Однако такой набор подходит только для очень простых «мультяшных» изображений. Большинство цветов, встречающихся в реальном мире, — это комбинации различных уровней красного, зеленого и синего. Если вы выделите два байта на пиксел, то на каждый основной цвет будет приходиться пять бит (один бит останется незадействованным). Это даст 32 уровня красного, зеленого и синего, что в общей сложности составит 32 768 разных цветов. Такая схема кодирования часто называется палитрой High color («высококачественное цветовоспроизведение»), или Thousands of colors («тысяча цветов»).
Следующий шаг — использование трех байтов на пиксел, или одного байта для каждого из основных цветов. Такая схема кодирования предусматривает 256 уровней красного, зеленого и синего, что в общей сложности дает 16 777 216 различных цветов. Часто эта палитра называется True Color («истинный/настоящий цвет»), или Millions of colors («миллионы цветов»). При разрешении дисплея 640 × 480 объем требуемой памяти составляет 921 600 байт — почти целый мегабайт.
Количество битов на пиксел иногда называется глубиной цвета или цветовым разрешением. Количество различных цветов связано с количеством битов на пиксел следующим соотношением:
Количество цветов = 2количество битов на пиксел.
Плата видеоадаптера имеет определенный объем памяти, что ограничивает количество возможных комбинаций разрешения и глубины цвета. Например, плата видеоадаптера с памятью один мегабайт может обеспечить разрешение 640 × 480 при глубине цвета, равной трем байтам на пиксел. Однако если вы хотите использовать разрешение 800 × 600, для такой глубины цвета имеющейся памяти окажется недостаточно, поэтому придется довольствоваться двумя байтами на пиксел.
Несмотря на то что растровые дисплеи кажутся нам вполне естественным выбором, поначалу они редко использовались, поскольку предъявляли огромные требования к памяти. В системе SAGE употреблялись векторные дисплеи, больше напоминающие осциллограф, чем телевизор. Управляемая электрическим сигналом электронная пушка рисовала на экране прямые и кривые линии, которые в течение некоторого времени сохранялись на экране, что и создавало из них примитивные изображения.
Компьютеры SAGE также поддерживали использование световых карандашей, которые позволяли операторам изменять кадры на дисплее. Световой карандаш — это стилус с прикрепленным к одному концу проводом. С помощью специального программного обеспечения компьютер определяет точку экрана, на который указывает световой карандаш, и изменяет изображение в соответствии с его движением.
Принцип работы светового карандаша иногда ставит в тупик даже технически подкованных людей. Суть в том, что световой карандаш не излучает, а улавливает свет. Электронная схема, управляющая электронной пушкой в ЭЛТ (вне зависимости от типа используемого дисплея), также фиксирует момент, когда свет от электронной пушки попадает на световой карандаш, определяя при этом точку экрана, на которую он указывает.
Одним из тех, кто первым предвосхитил начало эры интерактивных вычислений, был Айвен Сазерленд (род. 1938), который в 1963 году продемонстрировал революционную графическую программу Sketchpad, разработанную им для компьютеров SAGE. Эта программа могла хранить описания изображений в памяти и выводить их на экран. Кроме того, она предусматривала возможность использования светового карандаша для рисования и изменения изображений на экране, причем все это отслеживалось компьютером.
Еще одним провидцем эры интерактивных вычислений был Дуглас Энгельбарт, который прочитал статью Вэнивара Буша «Как мы можем мыслить» в 1945 году, сразу после ее публикации, а пять лет спустя начал развивать новые идеи в области компьютерных интерфейсов. В середине 1960-х годов, работая в Стэнфордском исследовательском институте, Энгельбарт полностью переосмыслил концепцию устройств ввода и придумал пятиклавишную клавиатуру для ввода команд (которая так и не прижилась), а также небольшое устройство с колесиками и кнопкой, которое он назвал мышью. Теперь мышь практически повсеместно применяется для перемещения указателя и выбора объектов на экране.
К счастью, многие из первых энтузиастов интерактивных графических вычислений собрались в компании Xerox в то время, когда использование растровых дисплеев стало экономически целесообразным. В 1970 году Xerox в Пало-Альто учредила исследовательский центр PARC для разработки продуктов, с которыми эта компания могла бы выйти на рынок. Вероятно, самым известным прогнозистом в центре PARC был Алан Кэй (род. 1940), который в возрасте 14 лет узнал о библиотеке микрофильмов Вана Буша из рассказа Роберта Хайнлайна, а затем придумал портативный компьютер Dynabook.
Первый крупный проект PARC — компьютер Alto, сконструированный в 1972–1973 годах. По меркам тех лет это устройство впечатляло: массивный системный блок, обработка 16-разрядных чисел, два диска емкостью по три мегабайта, 128 килобайт оперативной памяти (расширяемой до 512 килобайт) и мышь с тремя кнопками. Поскольку во времена создания Alto однокристальных 16-разрядных микропроцессоров еще не существовало, его процессор пришлось собирать из 200 отдельных интегральных микросхем.
Видеодисплей Alto был одним из нескольких элементов, выделявших этот компьютер на фоне других. Экран напоминал лист бумаги шириной 20,3 и высотой 25,4 сантиметра. Он работал в режиме растровой графики с разрешением 606 пикселов по горизонтали и 808 пикселов по вертикали (всего 489 648 пикселов). Для каждого пиксела выделялся один бит памяти, то есть он мог быть либо черным, либо белым. Всего для видеоизображения предоставлялось 64 килобайта памяти в общем адресном пространстве процессора.
Записывая данные в эту видеопамять, программа могла выводить на экран изображения или отображать текст различных шрифтов и размеров. Перемещая по столу мышь, пользователь мог позиционировать указатель и взаимодействовать с объектами на экране. В отличие от телетайпного аппарата, реагирующего на действия пользователя с задержкой, дисплей Alto — чрезвычайно емкий двумерный массив информации — позволял пользователю взаимодействовать с компьютером более непосредственно.
В конце 1970-х годов у программ, написанных для компьютера Alto, появились интересные особенности. На экране могли одновременно отображаться несколько программ, каждая в своем окне. Графические возможности компьютера позволяли выйти за рамки текста и по-настоящему воплощать мысли пользователя. В интерфейсе появились такие графические объекты, как кнопки, меню, а также небольшие изображения, называемые иконками. Мышь использовалась для выбора окон и активации программных функций посредством взаимодействия с графическими объектами.
Такое программное обеспечение упростило непосредственный контакт между человеком и машиной. Работа с компьютерами не ограничивалась простым перемалыванием чисел. Как выразился Дуглас Энгельбарт в своей легендарной статье, написанной в 1963 году, такие программы были разработаны «для усиления человеческого интеллекта».
Разработки центра PARC легли в основу так называемого графического пользовательского интерфейса (Graphic User Interface, GUI). Однако Xerox не стала продавать компьютер Alto (который в этом случае стоил бы более 30 тысяч долларов). Прошло более десяти лет, прежде чем идеи, воплощенные в этом компьютере, нашли применение в коммерческих продуктах.
В 1979 году PARC посетили Стив Джобс и другие сотрудники компании Apple Computer, которых впечатлило увиденное. А в январе 1983 года они представили печально известный компьютер с графическим интерфейсом Lisa, за которым год спустя последовал гораздо более успешный Macintosh.
Первый компьютер Macintosh был оснащен микропроцессором Motorola 68000, ПЗУ емкостью 64 килобайта, 128 килобайтами оперативной памяти, 3,5-дюймовым дисководом (позволяющим сохранять на дискете до 400 килобайт), клавиатурой, мышью, а также монитором с разрешением 512 × 342 (всего 175 104 пикселов) и диагональю девять дюймов. Каждому пикселу соответствовал один бит памяти, он мог быть либо черным, либо белым, поэтому объем достигал лишь 22 килобайт.
Аппаратное обеспечение первого компьютера Macintosh было элегантным, но отнюдь не революционным. От других машин, присутствовавших на рынке в 1984 году, его отличала операционная система, которая в то время именовалась системным программным обеспечением, а позже получила название Mac OS.
Такие текстовые однопользовательские операционные системы, как CP/M или MS-DOS, отличаются небольшим размером и не предусматривают обширного интерфейса прикладного программирования (API). В главе 22 я уже объяснил, что от этих текстовых операционных систем в основном требовалось предоставление приложениям доступа к файловой системе. В отличие от них такая графическая операционная система, как Mac OS, занимает намного больше памяти и предоставляет сотни функций API, каждая из которых имеет описательное название.
В то время как текстовая операционная система, вроде MS-DOS, позволяла производить лишь несколько простых функций API, например отображать на экране текст в стиле телетайпных аппаратов, графическая операционная система Mac OS должна была выводить на экран графическое изображение. Теоретически этого можно достичь за счет реализации одной функции API, которая разрешает приложению задавать цвет пиксела с определенными горизонтальной и вертикальной координатами. Однако такой способ оказывается неэффективным, поскольку при его применении изображение формируется очень медленно.
Разумнее сделать так, чтобы операционная система предоставляла исчерпывающую систему графического программирования, состоящую из функций API для отрисовки линий, прямоугольников, эллипсов (включая окружности) и текста. Эта система должна позволять создавать сплошные или пунктирные линии, заполнять прямоугольники и эллипсы различными узорами, а для текста задавать разные шрифты, размеры и стили начертания. Система графического программирования также должна отвечать за визуализацию этих объектов в виде набора точек на экране.
Программы, работающие под управлением графической ОС, используют одни и те же функции API для вывода изображений на экран компьютера и для их печати на принтере. Именно поэтому документ текстового редактора отображается на экране почти так же, как и на распечатке. Этот принцип называется WYSIWYG (What You See Is What You Get — «что видишь, то и получишь»).
Привлекательность графического пользовательского интерфейса отчасти в том, что различные приложения основаны на одних и тех же принципах, благодаря чему опыт, накопленный пользователем при работе с одной программой, применим и с другими. Это означает, что операционная система также должна предусматривать функции API, позволяющие приложениям реализовывать различные компоненты пользовательского интерфейса, например кнопки и меню. Вопреки распространенному убеждению, графический интерфейс облегчает работу не только пользователям, но и программистам, поскольку допускает написание программы с современным интерфейсом. Получается, нет необходимости изобретать велосипед.
Еще до появления Macintosh несколько компаний пытались разработать графическую операционную систему для IBM PC и совместимых с ним компьютеров. В некотором смысле разработчикам компании Apple было легче, поскольку они работали над аппаратным и программным обеспечением одновременно. Системное программное обеспечение компьютера Macintosh должно было поддерживать только один тип флоппи-дисковода, один дисплей и два принтера. Однако реализация графической ОС для IBM PC предполагала поддержку множества дополнительных аппаратных средств.
Несмотря на то что компьютер IBM PC был представлен всего несколькими годами ранее (в 1981-м), многие уже привыкли к приложениям MS-DOS и не были готовы от них отказываться. И поэтому было важно, чтобы графическая ОС для IBM PC предусматривала использование приложений MS-DOS наряду с приложениями, специально написанными для новой операционной системы. (Программное обеспечение для компьютера Apple II на Macintosh не работало, поскольку в нем был другой микропроцессор.)
В 1985 году компания Digital Research, создавшая CP/M, представила систему GEM (Graphical Environment Manager, «менеджер графической среды»), компания VisiCorp, занимавшаяся распространением приложения VisiCalc, выпустила среду VisiOn, а Microsoft — версию Windows 1.0, которая быстро стала первым претендентом на победу в «войне окон». Однако только в мае 1990 года, после выпуска версии Windows 3.0, эта система обратила на себя внимание пользователей. С тех пор ее популярность значительно возросла, и сегодня Windows используется примерно в 90%. Несмотря на сходства операционных систем Windows и Mac OS, в них совершенно разные API-интерфейсы.
Теоретически графическая ОС по сравнению с текстовой требует применения только одного дополнительного аппаратного средства — графического дисплея. При этом не нужен даже жесткий диск: у первого компьютера Macintosh его не было, а система Windows 1.0 в нем не нуждалась. Версии Windows 1.0 не требовалась мышь, хотя все были согласны с тем, что это устройство значительно упрощает процесс пользования. Неудивительно, что графические пользовательские интерфейсы распространялись по мере роста производительности микропроцессоров и увеличения емкости оперативной памяти и запоминающих устройств. С функциональным обогащением графические ОС становились более ресурсозатратными: им требовалось пара сотен мегабайт на жестком диске и более 32 мегабайт оперативной памяти.
Приложения для графических ОС почти никогда не пишутся на языке ассемблера. Поначалу программы для Macintosh в основном разрабатывались на Паскале, а приложения Windows — на C. Однако программисты из центра PARC и здесь продемонстрировали совершенно иной подход. Начиная с 1972 года они занимались созданием языка Smalltalk, воплощающего концепцию объектно-ориентированного программирования.
Традиционно высокоуровневые языки программирования различают код (операторы, которые обычно начинаются с ключевого слова вроде set, for или if) и данные (значения переменных). Это различие, несомненно, коренится в архитектуре фон Неймана, где все делится на машинный код и обрабатываемые им данные.
В объектно-ориентированном программировании код и данные комбинируются в объект. Как именно данные хранятся в объекте, можно понять только по связанному с ним коду. Объекты взаимодействуют, отправляя и получая сообщения, которые содержат инструкции, запрашивающие информацию.
Объектно-ориентированные языки часто бывают удобными при написании приложений для графических операционных систем, поскольку позволяют работать с объектами на экране (например, с окнами и кнопками) с учетом того, как их воспринимает пользователь. Возьмем, к примеру, кнопку. Она имеет определенный размер и положение на экране, включает некоторый текст или маленькое изображение. Все это — относящиеся к объекту данные. Код, связанный с объектом, фиксирует факт «нажатия» этой кнопки пользователем с помощью клавиатуры или мыши и отправляет сообщение об этом событии.
Наиболее популярные объектно-ориентированные языки для персональных компьютеров — это расширенные версии таких традиционных языков типа АЛГОЛ, как C и Паскаль. Самое известное объектно-ориентированное расширение языка C — C++. (Как вы помните, в языке C два плюса соответствуют оператору инкремента.) Язык C++, разработанный в основном Бьёрном Страуструпом (род. 1950) из Bell Telephone Laboratories, сначала был реализован как транслятор, который преобразовывал программу, написанную на C++, в программу на C (хотя получавшийся в результате код на языке С был практически нечитаемым). После этого преобразования программу на C можно было скомпилировать обычным способом.
Разумеется, возможности объектно-ориентированных языков не выходят за рамки возможностей традиционных языков. Однако программирование — это деятельность, связанная с решением задач, а объектно-ориентированные языки позволяют учесть различные, часто более совершенные решения. На объектно-ориентированном языке также можно (хоть это и непросто) написать программу, компилируемую как под Mac OS, так и под Windows. Такая программа не обращается напрямую к функциям API, а вместо этого использует объекты, которые вызывают эти функции. Для компиляции программы под Mac OS или Windows нужны разные определения объектов.
Программистам, работающим на небольших компьютерах, больше не требуется запускать компилятор из командной строки. Вместо этого они используют интегрированную среду разработки (IDE), включающую все необходимые инструменты в одной удобной программе, которая работает подобно другим графическим приложениям. Кроме того, они широко применяют метод визуального программирования, в рамках которого окна программ разрабатываются в интерактивном режиме с помощью мыши для организации кнопок и других компонентов.
В главе 22 я рассказывал о текстовых файлах, которые содержат только ASCII-коды символов и получаются человекочитаемыми. Во времена текстовых операционных систем текстовые файлы были идеальным средством для обмена информацией между приложениями. Одно из важных преимуществ текстовых файлов — в них можно производить поиск, то есть программа может проверить множество файлов на наличие определенной текстовой строки. Однако когда в операционной системе появляется средство для отображения текста с использованием различных шрифтов, размеров и начертаний, возможности текстового файла внезапно оказываются неадекватными. Большинство текстовых редакторов сохраняют документы в собственном двоичном формате, а для хранения графической информации такие файлы вообще не подходят.
Например, информацию о параметрах шрифта и расположении абзацев можно закодировать вместе с текстом и получить при этом пригодный для чтения текстовый файл. Для этого нужно выбрать управляющий символ, после которого будет следовать эта информация. В формате RTF (Rich Text Format), разработанном компанией Microsoft для обмена форматированным текстом между приложениями, для выделения информации о форматировании текста используются фигурные скобки {} и обратная косая черта \.
Эта концепция доведена до предела в формате текстового файла PostScript, разработанном соучредителем компании Adobe Systems Джоном Уорноком (род. 1940). PostScript — универсальный язык графического программирования, который используется в основном для печати текста и графики на высокотехнологичных принтерах.
Возможность отображения графики на экранах персональных компьютеров непосредственно проистекает из усовершенствования и удешевления аппаратных средств. Рост быстродействия микропроцессоров, уменьшение стоимости памяти, а также увеличение разрешения и цветопередачи дисплеев и принтеров способствовали быстрому развитию компьютерной графики.
Компьютерные графические изображения, как и видеодисплеи, бывают двух типов: векторные и растровые.
Векторные изображения создаются алгоритмически с помощью прямых и кривых линий, а также заполняемых цветом фигур. Векторная графика применяется в системах автоматизированного проектирования (computer-aided drawing, CAD) для создания инженерных или архитектурных чертежей. Графическое изображение такого типа может быть сохранено в формате так называемого метафайла. Метафайл — обычный набор команд для рисования векторных графических объектов, обычно закодированных в двоичной форме.
С помощью заполненных цветом фигур, прямых и кривых линий можно изобразить проект моста, однако если вам нужен рисунок готового моста, возможностей векторной графики будет недостаточно. Потребуется реалистичная картинка, которую невозможно создать из векторных объектов.
Для этой цели лучше использовать растровые, или точечные, изображения. При применении растровой графики изображение кодируется как прямоугольный массив битов, соответствующих пикселам устройства вывода. Как и видеодисплей, растровое изображение имеет такие параметры, как разрешение (ширина и высота в пикселах) и глубина цвета (количество битов на пиксел). Каждому пикселу соответствует одинаковое количество битов.
Несмотря на то что растровое изображение двумерно, сам битовый массив — это единый поток байтов, в котором последовательно закодированы все строки пикселов.
Одни растровые изображения создаются «вручную» в специальном графическом редакторе, другие — алгоритмически с помощью компьютерного кода. Однако в наши дни растровая графика чаще всего необходима при работе со снимками реальных объектов (например, с фотографиями). Для перенесения таких изображений из реального мира в компьютер существуют специальные аппаратные средства. Как правило, они используют полупроводниковый прибор с зарядовой связью (ПЗС), который вырабатывает электрический ток при облучении светом. Для создания одного пиксела требуется одна ячейка ПЗС.
Старейшее из подобных устройств — сканер. Принцип его работы аналогичен принципу работы копировального аппарата и заключается в перемещении линейного массива элементов ПЗС вдоль поверхности сканируемого изображения, например фотографии. Элементы ПЗС генерируют электрические заряды в зависимости от интенсивности света, отраженного от поверхности изображения. Сопровождающее сканер программное обеспечение преобразует полученные сигналы в битовый массив и сохраняет его в файле.
В видеокамерах для захвата изображений используется двумерный массив ячеек ПЗС. Как правило, они записываются на видеопленку. Однако выходной видеосигнал может подаваться непосредственно в устройство для захвата кадра — на плату, преобразующую аналоговый видеосигнал в массив битов. Эти устройства можно использовать с любым обычным источником видеосигнала, например с видеомагнитофоном, проигрывателем лазерных дисков или даже с телевизором.
Цифровые камеры похожи на обычные, только вместо пленки в них используется массив элементов ПЗС для захвата изображения, которое сохраняется непосредственно в памяти камеры, а затем передается в компьютер.
Графическая операционная система часто предусматривает специальный формат для хранения растровых изображений. В Mac OS используется формат Paint — от программы MacPaint, в которой он был применен впервые. (Однако предпочтителен формат Macintosh PICT, допускающий хранение и растровых, и векторных изображений.) В Windows для хранения растровых изображений используется формат BMP.
Растровые изображения могут занимать довольно много места, в связи с чем возникает необходимость в разработке способа уменьшения их объема. Этой задаче посвящена целая область информатики под названием сжатие данных.
Вернемся к примеру с изображением, где на пиксел приходится по три бита. Это фотография неба и дома с газоном с большими областями синего и зеленого цветов. Возможно, верхняя строка растрового изображения содержит 72 синих пиксела, идущих подряд. Чтобы уменьшить объем растрового изображения, нужно закодировать в файле данные о том, что синий пиксел повторяется 72 раза. Такой способ сжатия называется кодированием серий последовательностей (Run-Length Encoding, RLE).
Алгоритм RLE используется в обычном офисном факсимильном аппарате для уменьшения размера изображения перед его отправкой по телефонной линии. Поскольку факс распознаёт только черный и белый цвета без оттенков серого, факсимильное изображение часто содержит длинные последовательности белых пикселов.
Уже довольно давно популярен формат растровых изображений GIF (Graphics Interchange Format, «формат для обмена изображениями»), разработанный компанией CompuServe в 1987 году. Этот формат использует алгоритм сжатия данных LZW, названный так по именам создателей (Lempel, Ziv, Welch, алгоритм Лемпеля — Зива — Велча). Алгоритм LZW является более мощным, чем RLE, поскольку помимо последовательностей одинаковых пикселов он способен распознавать закономерности, состоящие из различных пикселов.
Алгоритмы RLE и LZW называются методами сжатия данных без потерь, поскольку исходный файл может быть полностью восстановлен. Другими словами, сжатие обратимо. Однако метод обратимого сжатия данных подходит не для всех типов файлов. В некоторых случаях объем сжатого файла превышает объем исходного!
В последние годы широкое распространение получили методы сжатия данных с потерями. Алгоритм сжатия с потерями не является обратимым, поскольку при его использовании некоторые исходные данные безвозвратно теряются. Вы вряд ли примените этот алгоритм к электронным таблицам или текстовым документам, так как в них каждое число и слово имеют значение. Однако вы, вероятно, не станете возражать против его применения к изображениям при условии, что потеря данных не окажет существенного влияния на результат. Именно поэтому методы сжатия данных с потерями основаны на психологических исследованиях, задача которых выявить, что важно для человеческого визуального восприятия, а что нет. Самые распространенные методы сжатия данных с потерями, применяемые для растровых изображений, известны под общим названием JPEG (Joint Photography Experts Group, «объединенная группа экспертов по фотографии»). Формат JPEG фактически объединяет несколько алгоритмов сжатия как с потерями, так и без.
Преобразовать метафайл в растровое изображение довольно просто. Поскольку видеопамять и битовый массив концептуально идентичны, программа, способная записать метафайл в видеопамять, также может сохранить его в битовый массив.
Преобразовать растровое изображение в метафайл не так просто, а в случае сложного изображения вообще невозможно. Один из способов решения этой задачи — оптическое распознавание символов (Optical Character Recognition, OCR). Оно используется, когда нужно преобразовать в ASCII-коды растровое изображение некоторого текста (например, полученную по факсу или отсканированную печатную страницу). Программное обеспечение OCR анализирует точечные последовательности и определяет, каким символам они соответствуют. Из-за алгоритмической сложности этой задачи OCR-программы обычно не дают абсолютно точного результата. Еще менее точным является программное обеспечение, предназначенное для преобразования в ASCII-коды рукописного текста.
Растровые изображения и метафайлы используются для цифрового представления визуальной информации. Звуковую информацию тоже можно преобразовать в биты и байты.
Цифровой звук произвел настоящий фурор в 1983 году благодаря появлению компакт-диска (compact-disk, CD), который стал самым успешным продуктом в истории потребительской электроники. Компакт-диск был разработан компаниями Philips и Sony и позволял хранить на одной стороне диска диаметром 12 сантиметров цифровые аудиофайлы общей длительностью 74 минуты. Такая длительность была выбрана для того, чтобы на компакт-диске могла уместиться Девятая симфония Бетховена.
Для кодирования звука подходит метод кодово-импульсной модуляции. Несмотря на сложное название, концептуально этот метод довольно прост.
Звук — это вибрация. Вибрация наших голосовых связок, музыкальных инструментов, падающего в лесу дерева приводит в движение молекулы воздуха, при этом он начинает периодически (с частотой несколько сотен или тысяч раз в секунду) сжиматься и расширяться. Вибрирующий воздух, в свою очередь, воздействует на наши барабанные перепонки, и мы слышим звук.
В 1877 году Томас Эдисон изобрел фонограф, в котором для записи и воспроизведения звука на поверхности цилиндра, покрытого фольгой, создавались углубления, повторяющие форму звуковых волн. До появления компакт-диска эта техника записи звука практически не менялась, хотя цилиндры были заменены дисками, а оловянная фольга — сначала воском, а затем пластиком. Первые фонографы были полностью механическими, однако со временем для усиления звука в них стали использоваться электрические компоненты. Переменный резистор в микрофоне преобразует звук в электрический сигнал, а электромагнит в динамике превращает этот сигнал обратно в звук.
Электрический ток, с помощью которого кодируется звук, не похож на цифровые сигналы, о которых мы говорили. Звуковое давление непрерывно изменяется, в связи с чем меняется и напряжение. Электрический ток — аналог звуковой волны. Для преобразования аналогового сигнала в цифровой потребуется специальный аналого-цифровой преобразователь (АЦП), обычно реализуемый в виде микросхемы. Выходные цифровые сигналы АЦП, количество которых равно 8, 12 или 16, обозначают относительный уровень напряжения. Например, 12-битный АЦП преобразует входящий сигнал в число от 000h до FFFh, различая при этом 4096 уровней напряжения.
При использовании метода кодово-импульсной модуляции напряжение, соответствующее звуковой волне, преобразуется в цифровые значения с постоянной скоростью. Эти значения сохраняются на компакт-диске в виде маленьких углублений, вырезанных на поверхности, и считываются лазерным лучом, отраженным от его поверхности. Во время воспроизведения эти значения снова конвертируются в электрический сигнал с помощью цифро-аналогового преобразователя (ЦАП). (ЦАП также используется в цветных графических адаптерах для преобразования значений пикселов в аналоговые сигналы, подающиеся на монитор.)
Аналоговый звуковой сигнал переводится в цифровой с постоянной скоростью, называемой частотой дискретизации. В 1928 году Гарри Найквист из Bell Telephone Laboratories показал, что частота дискретизации должна как минимум в два раза превышать максимальную частоту звука, который необходимо записать и воспроизвести. Считается, что человек воспринимает звуки в диапазоне частот от 20 до 20 000 герц. Частота дискретизации, используемая при записи компакт-дисков, более чем вдвое превышает максимальный показатель и составляет 44 100 герц.
Разрядность (количество бит на выборку) определяет динамический диапазон компакт-диска — разницу между самым громким и самым тихим звуком, который можно записать и воспроизвести. Это требует пояснения: будучи аналогом звуковой волны, электрический сигнал отклоняется от нулевого значения; максимальное отклонение — амплитуда волны. Интенсивность звука пропорциональна удвоенной амплитуде. Десятикратному увеличению интенсивности звука соответствует один бел (единица измерения относительной силы звука, названная в честь Александра Белла); один децибел — 0,1 бела, примерно минимальное увеличение интенсивности звука, которое человек в состоянии воспринять.
Динамический диапазон для 16-разрядного звука — 96 децибел, что примерно соответствует разнице между порогом слышимости (за которым мы ничего не слышим) и болевым. Именно такая разрядность используется при записи компакт-дисков.
Таким образом, каждой секунде звуковой записи на компакт-диске соответствует 44 100 выборок по два байта. Если вы предпочитаете стереозвук, необходимо удвоить это число, чтобы в итоге получить 176 400 байт на секунду. Это 10 584 000 байт на минуту звукозаписи. (Теперь вы понимаете, почему цифровая звукозапись распространилась только в 1980-е годы.) Для записи на компакт-диске стереозвука длительностью 74 минуты требуется 783 216 000 байтов.
Цифровой звук по сравнению с аналоговым обладает многими хорошо известными преимуществами. В частности, при копировании аналогового звука (например, при записи на фонограф звука, воспроизводимого с магнитной ленты) его качество ухудшается. Оцифрованный звук закодирован числами, которые всегда можно скопировать без потери точности. В аналоговых телефонных сетях качество звука было тем хуже, чем длиннее расстояние, преодолеваемое телефонным сигналом. Сейчас этой проблемы не существует. Поскольку большая часть телефонной системы перешла на цифровой звук, звонки с другого конца страны по качеству не уступают звонкам с соседней улицы.
На компакт-дисках можно хранить не только звук, но и другие данные. Диск, используемый исключительно для хранения данных, называется CD-ROM (CD Read-Only Memory, «память только для чтения»). Как правило, емкость таких дисков — около 660 мегабайт. В настоящее время большинство компьютеров оснащено специальными дисководами, а диски — распространенные носители для коммерческого программного обеспечения и игр.
Средства для работы со звуком и видео, добавленные в персональный компьютер, получили название «мультимедиа». Теперь они настолько популярны, что не нуждаются в специальном названии. Большинство современных домашних компьютеров оснащены звуковой платой, которая включает устройство АЦП для записи звука через микрофон и устройство ЦАП для воспроизведения записанного звука через динамики. Звуки могут храниться на диске в формате WAV (waveform — «в форме волны»).
Поскольку при записи и воспроизведении звука на домашних компьютерах CD-качество требуется не всегда, программы для Macintosh и Windows предусматривают более низкие значения частоты дискретизации (22 050, 11 025 и 8000 герц) разрядности (восемь бит), а также возможность создания монофонической записи. Таким образом, на одну секунду звучания может приходиться 8000 байт, или 480 тысяч байт на одну минуту.
Все, кто смотрел научно-фантастические фильмы, знают, что компьютеры будущего общаются с пользователями на человеческом языке. Если компьютер оснащен аппаратными средствами для записи и воспроизведения звука, то решение всех остальных задач сводится к написанию программного обеспечения.
Существует несколько способов научить компьютер употреблять узнаваемые слова и предложения при общении с пользователем. Один из них состоит в записи произнесенных человеком фрагментов предложений, фраз, слов и чисел, которые затем можно сохранить в файлах и комбинировать. Этот подход часто применяется в информационных системах, доступ к которым осуществляется по телефону, и он отлично работает при ограниченном количестве комбинаций воспроизводимых слов и чисел.
Более общий способ синтеза человеческой речи предполагает преобразование произвольного текста в кодировке ASCII в звуковой файл. Поскольку написание слов иногда отличается от их произношения, программа может использовать словарь или сложные алгоритмы для определения правильного произношения. Из простых звуков (называемых фонемами) можно составлять целые слова. Часто программе требуются и другие корректировки. Например, если в конце предложения стоит знак вопроса, то последнее слово нужно произнести более высоким голосом.
Распознавание голоса, или преобразование звука в ASCII-коды, — более сложная задача. Многим трудно воспринимать даже диалекты родного языка. Несмотря на то что программы для распознавания речи существуют, им необходима некоторая тренировка, прежде чем они смогут качественно расшифровывать речь конкретного пользователя. Преобразование речи в ASCII-коды — довольно простая задача по сравнению с тем, чтобы научить компьютер по-настоящему «понимать» сказанное. Эта проблема относится к области искусственного интеллекта.
Звуковые карты современных компьютеров также снабжены небольшими электронными синтезаторами, которые могут имитировать звучание 128 мелодических и 47 ударных инструментов. Они называются MIDI-синтезаторами (Musical Instrument Digital Interface — «цифровой интерфейс для музыкальных инструментов»). Спецификация MIDI была разработана в начале 1980-х годов консорциумом производителей электронных музыкальных синтезаторов для подключения этих электронных устройств к компьютерам и друг к другу.
В различных типах MIDI-синтезаторов используются разные способы синтеза звука музыкальных инструментов, некоторые реалистичнее, чем другие. Общее качество звука, создаваемого конкретным MIDI-синтезатором, не имеет отношения к спецификации MIDI. Все, что требуется от синтезатора, — воспроизведение звуков в ответ на короткие сообщения длиной один, два или три байта. Как правило, эти сообщения указывают, какой инструмент необходим, какую ноту нужно сыграть, звучание какой из нот следует прекратить.
MIDI-файл — это набор MIDI-сообщений с информацией о том, когда следует выполнять то или иное действие. Как правило, MIDI-файл содержит всю музыкальную композицию, которую воспроизводит MIDI-синтезатор. MIDI-файл обычно компактнее, чем файл в формате WAV, содержащий ту же музыку. Если говорить об относительном размере, то файл в формате WAV можно сопоставить с растровым изображением, а MIDI-файл — с векторным. Недостатком MIDI-технологии является то, что закодированная таким образом музыка может отлично звучать на одном MIDI-синтезаторе и ужасно — на другом.
Еще одно направление мультимедиа — цифровое видео. Иллюзия движения видео- и телевизионных изображений достигается путем быстрой смены отдельных неподвижных изображений, которые называются кадрами. Фильмы воспроизводятся со скоростью 24 кадра в секунду. Для телевидения США стандарт — скорость 30 кадров в секунду, а для большинства других — 25 кадров в секунду.
Воспроизводимый на компьютере видеофайл является просто последовательностью растровых изображений, сопровождаемых звуком. Без применения алгоритма сжатия данных размер такого файла будет огромным. Например, при разрешении 640 × 480 пикселов и 24-битной глубине цвета каждый кадр фильма занимает 921 600 байт. При скорости воспроизведения 30 кадров в секунду нам требуется 27 648 000 байт для записи одной секунды видео. При таких параметрах одна минута будет занимать 1 658 880 000 байт, а весь двухчасовой фильм — 199 065 600 000 байт — около 200 гигабайт. Так что большинство воспроизводимых на персональном компьютере фильмов имеют небольшое разрешение и невысокое качество, и они короткие.
Алгоритм сжатия данных JPEG уменьшает размер неподвижных изображений, а алгоритм MPEG (Motion Pictures Expert Group — «экспертная группа по движущимся изображениям») — фильмов. Технология сжатия движущихся изображений основана на факте, что смежные кадры обычно содержат много одинаковой информации.
Существуют несколько стандартов MPEG. MPEG-2 предназначен для телевидения высокой четкости (HDTV) и цифровых видеодисков (DVD, Digital Video Disks) или цифровых многоцелевых дисков (Digital Versatile Disc). DVD-диск имеет такой же размер, что и компакт-диск, однако данные можно записывать на обеих его сторонах по два слоя. Видео, записанное на DVD-диске, сжимается примерно в 50 раз, поэтому для двухчасового фильма требуется всего четыре гигабайта, и оно может уместиться на одном слое одной стороны. Использование обоих слоев и обеих сторон увеличивает емкость DVD-дисков примерно до 16 гигабайт, что примерно в 25 раз превышает емкость компакт-диска.
Являются ли диски CD-ROM и DVD-ROM современной реализацией устройства Memex, описанного Вэниваром Бушем? Изначально в Memex планировалось использовать микрофильмы, однако диски CD-ROM и DVD-ROM гораздо больше подходят на роль носителей информации для этого устройства. По сравнению с физическими преимущество электронных носителей следующее: в них легче найти нужные данные. К сожалению, мало кто может получить доступ сразу к нескольким CD- или DVD-дискам. Максимально приближенная к концепции Буша реализация предполагает не хранение всей нужной информации в одном месте, а соединение компьютеров друг с другом для обмена информацией и более эффективного использования запоминающих устройств.
Первым человеком, которому удалось осуществить удаленное управление компьютером, был Джордж Стибиц, сотрудник Bell Labs, который в 1930-х годах разработал релейный компьютер. Удаленное управление этим компьютером имело место в 1940 году на демонстрации в Дартмуте.
Телефонная система устроена так, чтобы передавать по проводам звук, а не биты. Передача битов по телефонным проводам требует их преобразования в звук. Непрерывная звуковая волна постоянной частоты и амплитуды, называемая несущей, вообще не передает существенной информации. Стоит изменить какой-то из параметров этой звуковой волны, другими словами, произвести модуляцию, чтобы один из ее параметров колебался между двумя разными состояниями, и вы сможете представить с ее помощью значения 0 и 1. Преобразование битов в звук происходит с помощью устройства, называемого модемом (modem; модулятор/демодулятор). Модем — последовательный интерфейс, поскольку отдельные биты байта передаются друг за другом, а не одновременно. (Принтеры часто подключаются к компьютерам через параллельный интерфейс, позволяющий одновременно передавать целый байт благодаря наличию восьми проводов.)
В ранних модемах использовался метод частотной манипуляции. Модем, передающий данные со скоростью, например, 300 бит в секунду, может преобразовывать 0 бит в частоту 1070 герц, а один бит — в частоту 1270 герц. Каждый байт предваряется старт-битом и заканчивается стоп-битом, поэтому для передачи одного байта требуется десять бит. Первые модемы передавали данные со скоростью 300 бит (30 байт) в секунду. В современных модемах используются более сложные технологии, позволяющие увеличить скорость передачи данных более чем в 100 раз.
На заре эры компьютерных коммуникаций энтузиасты объединяли персональный компьютер и модем в электронные доски объявлений, к которым через телефонную линию могли подключаться пользователи других компьютеров и скачивать файлы, то есть копировать файлы с удаленного компьютера на свой. Эта концепция широко применялась и такими крупными информационными сервисами, как CompuServe. В большинстве случаев обмен данными осуществлялся в форме ASCII-кодов.
Качественное отличие интернета от этих ранних систем заключается в децентрализованности. Работа интернета основана на наборе протоколов, с помощью которых компьютеры взаимодействуют друг с другом. Самый важный — семейство протоколов TCP/IP (Transmission Control Protocol / Internet Protocol). Вместо передачи ASCII-кодов по проводам передатчики, работающие на основе TCP/IP, разделяют крупные блоки данных на небольшие пакеты, которые отправляются по линии передачи (например, по телефонной) и заново собираются в приемнике.
Популярная составляющая интернета — сервис World Wide Web (WWW, Всемирная паутина), использующий протокол HTTP (Hypertext Transfer Protocol — «протокол передачи гипертекста»). Содержимое веб-страниц оформляется в текстовом формате HTML (Hypertext Markup Language — «язык разметки гипертекста»). Слово «гипертекст» используется для описания совокупности связанных фрагментов (как в устройстве Memex Вэнивара Буша). HTML-файл может содержать ссылки на другие веб-страницы, на которые с него можно легко перейти.
Формат HTML напоминает описанный ранее RTF, поскольку содержит ASCII-текст вместе с информацией о его форматировании. HTML также позволяет ссылаться на изображения в форматах GIF, PNG (Portable Network Graphics) и JFIF (JPEG File Interchange Format). Большинство веб-браузеров разрешают просматривать HTML-файлы именно благодаря их текстовому формату. Еще одно преимущество текстового представления HTML-файла — легкость, с которой в нем можно осуществлять поиск. Несмотря на свое название, HTML не относится к языкам программирования, о которых мы говорили в главе 19 и главе 24. Веб-браузер считывает данные из HTML-файла и соответствующим образом форматирует текст и графику.
Иногда при просмотре определенных веб-страниц необходимо запустить специальный программный код. Такой код может работать либо на сервере, где хранятся исходные веб-страницы, либо на клиенте, то есть на вашем компьютере. На сервере вся необходимая работа (например, интерпретация содержимого полей онлайн-формы), как правило, выполняется с помощью сценариев CGI (Common Gateway Interface — «общий интерфейс шлюза»). Запускаемый на стороне клиента код обычно содержится в HTML-файле в виде сценария, написанного на простом языке программирования JavaScript. Веб-браузер интерпретирует операторы JavaScript так же, как текст HTML.
Почему веб-сайт не может просто предоставить исполняемую программу для запуска на компьютере? Во-первых, многое зависит от типа машины. Компьютеру Macintosh требуется исполняемый файл, содержащий машинный код для процессора PowerPC и обращения к функциям API Mac OS, PC-совместимому — исполняемый файл, содержащий код для процессора Intel Pentium и обращения к функциям API ОС Windows. Однако существуют другие компьютеры и графические операционные системы. Более того, вам вряд ли захочется загружать все исполняемые файлы без разбора, поскольку можно загрузить из ненадежного источника файл, который способен причинить вред.
Для решения этой проблемы компания Sun Microsystems разработала язык Java (не путайте с JavaScript). Java — это полноценный объектно-ориентированный язык программирования, похожий на C++. В предыдущей главе я объяснил, в чем разница между компилируемыми и интерпретируемыми языками. Язык Java — что-то среднее. Программу, написанную на Java, необходимо скомпилировать, но результатом компиляции обычно является не машинный код, а байт-коды Java. По структуре они похожи на машинный код, но предназначены для воображаемого компьютера, называемого виртуальной машиной Java (JVM, Java virtual machine). Компьютер, на котором выполняется скомпилированная Java-программа, эмулирует работу JVM, интерпретируя байт-коды. Java-программа использует установленную графическую операционную систему, что позволяет заниматься платформонезависимым программированием.
Несмотря на то что большая часть этой книги была посвящена использованию электричества для передачи сигналов и информации по проводам, более эффективна передача данных в виде световых импульсов по оптоволоконному кабелю — тонкой стеклянной или полимерной трубке, позволяющей свету огибать углы. При использовании такой технологии скорость передачи данных достигает миллиардов бит в секунду.
Таким образом, в будущем именно фотоны, а не электроны будут доставлять большую часть информации в наши дома и офисы. Это будет напоминать многократно ускоренную передачу кода Морзе и обмен вспышками света, которые мы когда-то использовали для того, чтобы поделиться полуночной мудростью с лучшим другом, жившим в доме напротив.