data=11 imagetops %filterargs %filterinput %filteroutput" /> description»"Image centering" format»"-nocenter" type="bool" default»"true"> cvalue name»"true" description="Yes" /> cvalue name»"false" description»"No" /> description»"Image rotation" format»"-%value" type="list" default»"auto"> cvalue name="auto" description="Automatic" /> cvalue name»"noturn" description="None" /> cvalue name="turn" description»"90 deg" /> c/filterarg> cfilterarg name="scale" description»"Image scale" format»"-scale %value" type»"float" min="0.0" max="1.0" default»"!.000" /> 37 Даже не зная ничего о семантике полей, можно отметить, что более плотно упаковать данные в двоичном формате было бы весьма трудно. Ограничивающие поля символы двоеточия должны были бы иметь функциональные эквиваленты, которые, как минимум, занимали бы столько же места (обычно либо определенное количество байтов, либо строки нулевой длины). Каждая запись, содержащая данные одного пользователя, должна была бы иметь ограничитель (который едва ли мог бы быть короче, чем один символ новой строки), либо неэкономно заполняться до фиксированной длины. В действительности, перспективы сохранения пространства посредством двоичного кодирования почти полностью исчезают, если известна фактическая семантика данных. Значения числового идентификатора пользователя (третье поле) и идентификатора группы (четвертое поле) являются целыми числами, поэтому на большинстве машин двоичное представление данных идентификаторов заняло бы по крайней мере 4 байта и было бы длиннее текста для всех значений до 999. Это можно проигнорировать и предположить наилучший случай, при котором значения числовых полей находятся в диапазоне 0-255. В таком случае можно было бы уплотнить числовые поля (третье и четвертое) путем сокращения каждого числа до одного байта и восьмибитового кодирования строки пароля (второе поле). В данном примере это дало бы около 8% сокращения размера. 8% мнимой неэффективности текстового формата имеют весьма большое значение. Они позволяют избежать наложения произвольного ограничения на диапазон числовых полей. Они дают возможность модифицировать файл паролей, используя любой старый предпочтительный текстовый редактор, т.е. освобождают от необходимости создавать специализированный инструмент для редактирования двоичного формата (хотя непосредственно в случае файла паролей необходимо быть особенно 38 Запись и считывание файлов подобного формата могли бы осуществляться быстрее по сравнению с текстовыми файлами, но тогда возникали бы другие проблемы. Простая реализация в записях фиксированной длины создавала бы искусственные ограничения относительно длины имен групп новостей и (что более важно) на максимальное количество диапазонов номеров просматриваемых статей. Более сложный формат двоичных пакетов позволил бы избежать ограничений относительно длины, однако его невозможно было бы редактировать с помощью простых средств, а это очень важно, когда необходима переустановка только некоторых из битов чтения в отдельной группе новостей. Кроме того, данный формат не обязательно был бы переносимым на другие типы машин. Разработчики первоначальной программы чтения новостей предпочли экономии прозрачность и способность к взаимодействию. Движение в другом направлении не было полностью ошибочным; файлы .newsrc могут достигать весьма больших размеров, и в одной из современных программ для чтения новостей (Pan в среде GNOME) используется оптимизированный по скорости частный формат, который позволяет избежать запаздывания при запуске. Но для других разработчиков в 1980 году текстовое представление было хорошим компромиссом и приобретало еще больший смысл по мере того, как скорость машин увеличивалась, а цены на накопительные устройства падали. 39 Не следует путать рассматриваемую здссь прозрачность конструкции с прозрачностью пикселей, которая поддерживается в PNG-изображспиях. 40 Одним из пережитков этой предшествующей Unix истории является то, что Internet-протоколы обычно используют в качестве ограничителя строк последовательность CR-LF вместо принятой в Unix LF. 41 Документ RFC 3205: 42 Коллега, мыслящий экономическими категориями, комментирует: "Воспринимаемость относится кумсиыиснню входных барьеров, а прозрачность — к сокращению стоимости жизни в данном коде". 43 При разработке ядра Linux предпринимается множество попыток добиться воспринимаемости, включая подкаталог документации в архиве исходного кода ядра и значительное количество учебных пособий на Web-сайтах и в книгах. Скорость, с которой изменяется ядро, препятствует этим попыткам — документация хронически отстает. 44 Возвратное тестирование (regression testing) представляет собой метод для обнаружения ошибок, появляющихся по мерс модификации программного обеспечения. Оно состоит в периодической проверке вывода изменяющегося программного обеспечения для некоторого фиксированного тестового ввода по сравнению со снимком вывода, взятого па ранней стадии данного процесса. Известно (или предполагается) что данный снимок корректен. 45 Фактически переменная TERM устанавливается системой во время регистрации пользователя. Для реальных терминалов на последовательных линиях преобразование из tty-строк в значения TERM, устанавливается из системного конфигурационного файла во время загрузки системы; детали весьма различаются в разных Unix-системах. Эмуляторы терминалов, такие как 46 Инвариантным является свойство конструкции программного обеспечения, которое сохраняется при каждой операции в нем. Например, в большинстве баз данных инвариантным свойством является то, что никакие две записи не могут иметь один и тот же ключ. В С-программе, корректно обрабатывающей строки, каждый строковый буфер должен содержать завершающий NUL-байт на выходе из каждой строковой функции. В системах инвентаризации пи один счетчик частей не может быть отрицательным. 47 См. результаты, приведенные в 48 То есть, лучшие достижения, выраженные в количестве прорывов безопасности относительно общего времени работы в Internet. 49 Распространенная ошибка в программировании с созданием подоболочек заключается в том, что программист забывает блокировать сигналы в родительском процессе при работающем подпроцсссс. Без такой предосторожности прерывание подпроцесса может иметь нежелательные побочные эффекты для родительского процесса. 50 ' Распространенная ошибка заключается в использовании вместо выражения $*. Это приводит к негативным последствиям при передаче имени файла, содержащего пробелы. 51 Стандартный ввод и стандартный вывод программы 52 Коллега, порекомендовавший этот учебный пример, прокомментировал его гак: "Да, можно выйти из положения с помощью этой методики..., если имеется всего несколько легко распознаваемых блоков информации, поступающих обратно от подчиненного процесса, а также есть щипцы и противорадиационный костюм". 53 Особенно опасным вариантом этой атаки является вход 54 Средство STREAMS было гораздо более сложным. Деннису Ритчи приписывают следующее высказывание: "Слово "streams" означает нечто другое, если его прокричать". 55 Разработчики основного конкурирующего с GNOME пакета KDE вначале использовали технологию CORBA, но отказались от нес в версии 2.0. С тех пор они ищут более легковесные IPC-методы. 56 Лее Хаттоп в письме, где речь идет о его очередной книге, 57 Для менее технически подготовленных читателей: скомпилированная форма С-программы производится из ее исходного С-кода путем компиляции и связывания. PostScript-версия troffpyMeHTOB troff-документа является производной от исходного troff-кода; чтобы осуществить это преобразование используется команда 58 Любой язык Тьюринга мог бы теоретически использоваться для универсального программирования и теоретически является в точности таким же мощным, как любой другой язык Тьюринга. На практике некоторые языки Тьюринга были бы слишком сложными для использования за пределами специфической или узкой предметной области. 59 Такая прозрачность и простота являются следствием хорошей конструкции мини-языка. Соответствие между нотацией и объектами предметной области весьма очевидно. Связи между объектами выражаются непосредственно, а не через именованные ссылки или другое непрямое преобразование, которого необходимо придерживаться. Основой функциональный тест для подобного мини-языка прост: возможно ли разобраться в данном языке, не изучая руководство? Для значительного количества случаев использования Преимущества использования Более подробная информация, включая исходный код, документацию и ссылки на примеры приложений, доступны на странице проекта 60 Однако неочевидно, что XSLT мог бы быть несколько проще при тех же функциональных возможностях, поэтому его нельзя охарактеризовать как плохую конструкцию. 61 Концепции и практическое применение XSL 62 http://www.netlib.org/ 63 Пример 8.5. Синтетический код f etchmailrc # Опрашивать данный узел первым в цикле. poll pop.provider.net proto рорЗ user "jsmith" with pass "secretl" is "smith" here user jones with pass "secret2" is "jjones" here with options keep # Опрашивать данный узел вторым poll billywig.hogwarts.com with proto imap: user harry_potter with pass "floo" is harry_potter here 64 Цитата принадлежит Алану Перлису (Alan Perils), который провел ряд передовых работ по модульности программного обеспечения приблизительно в 1970 году. Двоеточие в данном случае означало разделитель или ограничитель операторов в различных потомках языка Algol, включая Pascal и С. 65 Существует сайт проекта GhostScript chttp: //www. cs .wise. edu/~ghost/>. 66 Первое руководство no PostScript 67 Реализации JavaScript с открытыми исходными кодами на С и Java доступны на сайте 68 20 миллионов — сдержанная оценка, основанная на графиках Linux Counter и других источниках по состоянию на середину 2003 года. 69 Рассматривалась идея написания связующего уровня, который имел бы явную информацию о структуре всех 3 классов и использовал бы данную информацию для просмотра инициализатора при создании соответствующих объектов. Однако данная идея была отклонена, поскольку существовала вероятность добавления со временем новых членов класса, по мере создания новых функций в конфигурационном языке. Если бы код создания объектов был написан таким очевидным путем, то он также был бы хрупким и склонным к рассинхронизации при изменении определения классов либо структуры инициализатора, выводимой с помощью генератора отчетов - - conf igdump. Подобный подход приводит к бесконечному появлению ошибок. Более надежным способом было бы использование создание программы, управляемой данными, т.е. кода, который анализировал бы форму и члены инициализатора, опрашивал бы определения классов об их членах, а затем согласовывал бы оба набора. Программисты, работающие с Lisp и Java, называют данную методику В примере 9.3 приведен фрагмент кода приблизительно со строки 1895 в версии 1.43. 70 Данная проблема решается следующим образом. В состав исходного дистрибутива входит файл с именем splashscreen, в котором содержится такой же экран использования, как в приведенном примере. Исходный код на С содержит следующую функцию. void showHelp(FILE *out, char *progname) { fprintf(out,"Usage: %s t-dxohv] [-t] [char-alias...]\n", progname); ftinclude "splashscreen.h" exit(0); } Файл splashscreen. h генерируется инструкцией шаке-файла. splashscreen.h: splashscreen sed «splashscreen >splashscreen.h \ -e 's/W/WW/g' -e ,s/'7\\,7' -e ' s/. */puts ("&");/' Поэтому при сборке программы файл splashscreen автоматически преобразовывается в серию вызовов функции вывода, которые С-препроцессор затем включает в необходимую функцию. Путем создания кода из данных поддерживается редактируемая версия справочного экрана, идентичного его представлению на дисплее. В результате этого повышается прозрачность. Более того, при желании можно модифицировать справочный экран, не затрагивая С-кода вообще, а верное внешнее представление будет автоматически получено при следующей сборке. По тем же причинам инициализатор, содержащий строки синонимичных названий, также генерируется посредством $еascii. Большая часть файла nametable просто копируется в С-инициализатор. Но процесс генерации упростил бы адаптацию данного средства для других 8-битовых наборов символов, таких как ISO-8859 (Latin-1 и подобные). 71 Здесь CGI означает lie Computer Graphic Imagery, а технологию Common Gateway Interface (интерфейс общего шлюза), которая применяется для создания интерактивных Web-документов. 72 Для отображения скрытых файлов используется параметр -а утилиты 73 Суффикс "гс" связан с системой, предшествующей Unix, CTSS. В ней присутствовала функция сценария команд, которая называлась "runcom". В ранних Unix-систсмах имя "гс" использовалось для загрузочного сценария операционной системы как дань runcom в CTSS. 74 Никто не знает действительно изящного способа представить эти распределенные данные о настройках. Переменные среды, вероятно, не являются этим способом, однако для всех известных альтернатив характерны одинаково неприятные проблемы. 75 i В действительности, большинство Unix-программ вначале проверяют переменную VISUAL, и только если она не установлена, обращаются к переменной EDITOR. Это пережиток того времени, когда пользователи имели различные настройки для строковых и визуальных редакторов. 76 См. стандарты GNU-нрограммирования на странице 77 Файл .xinitrc является аналогом каталога автозагрузки в Windows и других операционных системах. 78 Диспетчер окон (window manager) поддерживает связи между окнами на экране и запущенными заданиями. Диспетчер окон управляет такими функциями, как расположение, отображение заголовков, свертывание, развертывание, перемещение, изменение размеров и затенение окон. 79 Такой взгляд на проблему характерен для нетсхнического конечного пользователя. 80 Исходные коды данной программы и других конвертеров с подобными интерфейсами доступны на странице 81 Управляющая программа (harness programm) представляет собой упаковщик, предназначенный для того, чтобы предоставлять вызываемым им программам доступ к некоторому специальному ресурсу. Данный термин часто употребляется при характеристике средств тестирования, которые предоставляют тестовые нагрузки и (часто) примеры корректного вывода для проверки фактического вывода тестируемых программ. 82 СтраницаScript-Fu http://www.cs.yorku.ca/~oz/wily http://plan9.bell-labs.com/sys/doc/acme/acme.html 83 формуле: An + с, где А — некоторый неизвестный постоянный коэффициент пропорциональности, а С — неизвестная константа, представляющая время установки. Линейный поиск определенного значения в списке представляет собой алгоритм типа О (и). Алгоритм 2 Удвоение мощности в течение каждых 18 месяцев, обычно цитируемое в контексте закона Мура, подразумевает, что можно достичь 26% прироста производительности просто путем приобретения нового аппаратного обеспечения через 6 месяцев. Молодые читатели могут не знать, что раньше терминалы печатали (на бумаге и очень медленно). 84 Термины, введенные здесь для обозначения проблем проектирования, происходят из устоявшегося жаргона хакеров, описанного в книге lb66]. 85 Разделение случайной и необязательной сложности означает, что рассматриваемые здесь категории 86 http://plan9.bell-labs.com/sys/doc/sam/sam.html 87 Разработчиками Emacs были Ричард М. Столлмен (Richard М. Stallman) и Берии Гринберг (Bcrnie Greenberg). Первоначальный редактор Emacs был изобретением Столлмена, первая версия со встроенным языком Lisp была создана Гринбергом, а окончательная на сегодняшний день версия создана Стол-лменом на основе версии Гринберга. К 2003 году нет полного изложения истории разработки редактора, но эту тему освещает статья Гринберга 88 За пределами мира Unix этот прирост аппаратной производительности на три порядка в значительной мере затмевается соответствующим понижением производительности программ. 89 ерьезность данной проблемы подтверждается богатым сленгом, выработанным Unix-програм-мистами для описания различных ее разновидностей: "псевдонимная ошибка" (aliasing bug), "нарушение выделенной области памяти" (arena corruption), "утечка памяти" (memory leak), "переполнение буфера" (buffer overflow), "разрушение стека" (stack smash), "отклонение указателя" (fandango on core), "недействительный указатель" (stale pointer), "подкачка памяти" (heap trashing), а также вызывающее справедливые опасения "вторичное повреждение" (secondary damage). Пояснения приведены в Словаре хакера chttp: / /www.catb.org/-esr/jargon>. 90 Последний стандарт С++, датированный 1998 годом, был широко распространенным, но слабым, особенно в области библиотек. 91 См. очерк Тома Кристианссна (Tom Christiansen) 92 Существует Web-сайт проекта Freenet chttp://lbreenetproject. org>. 93 URL-запроса для получения статистических данных: 94 Распространенное более новое описание языка Perl как "швейцарской бензопилы" является производным. 95 PLY можно загрузить со страницы 96 Пакет CUP доступен на странице 97 Пакет Jack доступен на странице 98 Пакет Yacc/M доступен на странице 99 http://cm.bell-labs.com/cm/cs/upe/ 100 Блочный тест представляет собой тестовый код, прикрепленный к модулю для проверки корректности представления. Использование термина "блочный тест" подразумевает, что тест написан разработчиком одновременно с основным кодом и означает порядок, при котором версии модуля не считаются завершенными до тех нор, пока к ним не прикреплен тестовый код. Данный термин и идея возникли в методологии "Экстремального программирования", популяризированной Кентом Беком (Kent Beck), но получили широкое распространение среди Unix-программистов примерно с 2001 года. 101 Более подробная информация по данным и родственным командам управления компиляцией приведена в справочном мешо Emacs: p+processes- >compile. 102 Подробнее эти и родственные команды описываются в подразделе справочной системы Emacs, озаглавленном 103 Агентство NASA, в котором целенаправленно создавалось программное обеспечение, предназначенное для использования в течение десятилетий, научилось настаивать на доступности исходного кода для всех создателей программного обеспечения для аэрокосмической техники. 104 Обе системы PDP-7 Unix и Linux стали примерами "неожиданной живучести". Unix в качестве "игрушки для опытов" была создана несколькими исследователями в перерывах между основными проектами. Наполовину она была предназначена для экспериментов с файловой системой и наполовину для поддержки компьютерной игры. Linux была охарактеризована своим создателем как "мой эмулятор терминала с выросшими ногами" 85] 105 Таким образом, литера "С" в названии языка С означает Common (общий) или, возможно, "Christopher". Аббревиатура BCPL первоначально расшифровывалась как "Bootstrap CPL" — сильно упрощенная версия языка CPL, весьма интересного, но слишком претенциозного языка общего программирования (Common Programming Language) Оксфордского и Кембриджского университетов, также называемого "языком программирования Кристофера" (Christopher Programming Language) по имени его главного пропагандиста, первопроходца компьютерной науки Кристофера Стрэчи (Christopher Strachey). 106 Документ доступен в Web: 107 Первоначальный пробный стандарт в 1985 году назывался IEEE-IX. Название "POSIX" было предложено Ричардом Столлменом. Введение в POSIX.1 гласит "Ожидается произношение "поз-икс" как "позитив", а не "по-сикс" или в других вариантах. Произношение опубликовано в целях обнародования стандартного способа ссылки на стандартный интерфейс операционной системы". 108 Один Linux-дистрибьютор, а именно Лазермун (Lasermoon) из Великобритании, добился сертификации POSIX. 1 FIPS 151-2, но вышел из бизнеса, поскольку потенциальных клиентов сертификация не интересовала. 109 Эта тема обсуждается в книге 110 Web-поиск, вероятно, предоставит популярную страницу, на которой сатирически описывается семиуровневая модель OSI сравнивается. 111 Эти слова впервые были произнесены членом руководства IETF Дэйвом Кларком (Dave Clark) в 1992 году на бурном собрании, в ходе которого IETF отвергла протокол открытого взаимодействия систем. 112 9 RFC 1149 доступен в Web— 10 RFC 2324 доступен в Web — chttp: //www. ietf .org/rfc/rfc2324 . txt>. 11 RFC 3514 доступен в Web — chttp: //www. ietf .org/rfc/rfc3514 . txt>. 113 В XML-жаргоне то, что здесь названо "диалектом" (dialect), называется "приложением" (application). Автор избегает использования слова "приложение", поскольку в данном случае оно противоречит другому более широко распространенному его значению. 114 Это название — дань кинофильму, вышедшему в 1958 году, который вошел в историю как "наихудшее из созданного", 115 История о том, как была создана UTF-8, включает в себя описание безумной ночной работы Кена Томпсона и Роба Пайка — 116 Ищите F_NOTIFY в 117 Данный параграф основывается на аналитической статье Генри Спенсера, вышедшей в 1984 году. Он отметил, что управление задачами было необходимо и целесообразно точно учесть в POSIX.1 и последующих стандартах Unix, 118 Web-страница проекта 119 ? Для непрограммистов: 120 http://www.cros-os.org/ 121 Что же касается операционной системы Apple Newton, мини-компыотера AS/400 и карманного компьютера Palm, то здесь речь может идти об исключении. 122 Ю Более полное обсуждение данного эффекта приведено в главе 123 Ч Весьма пугающий перечень возможностей, созданный известным специалистом по безопасности, приведен в ТСРА FAQ 124 Введение в гибкое программирование представлено на странице Agile Manifesto notes
Примечания
1
Три с половиной десятилетия между 1969 и 2003 гг. — это время исторической эволюции ОС Unix, воплотившей достижения более 50 млн. человеко-лет.
2
Действительно, Ethernet уже дважды была заменена другой технологией с тем же названием: в первый раз, когда коаксиальный кабель был заменен витой парой, и во второй раз, когда появилась технология гигабитовой Ethernet.
3
MacOS фактически состоит из двух частных уровней (перенесенные приложения OpenStep и классические GUI-интерфейсы Macintosh) поверх Unix-основы с открытым исходным кодом (проект Darwin).
4
Если в систсмс поддерживаются подсвечиваемые всплывающие окна, которые "мало вторгаются" между пользователем и приложением,
5
В течение нескольких лет казалось, что семиуровневый стандарт ISO может успешно конкурировать с набором протоколов TCP/IP. Он продвигался Европейским комитетом стандартов, напуганным мыслью о заимствовании любой технологии, рожденной в недрах Пентагона. Увы, их негодование превысило остроту их технического зрения. Результат оказался чрезмерно сложным и напрасным. Более подробно эта тема описана в книге [60]
6
7