Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kernigan_paik.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.91 Mб
Скачать

8.9. Заключение

Переносимый код — это идеал, к которому надо стремиться, посколь­ку только он способен сэкономить вам время при переносе программы из системы в систему или при изменении текущего окружения. Однако переносимость достается не бесплатно — вам придется быть особенно внимательными при написании кода, а также представлять себе детали всех потенциально пригодных систем.

Мы рассмотрели два подхода к обеспечению переносимости — объединение и пересечение. Объединение предусматривает создание версий, которые работают в каждой конкретной среде; акцент при этом делается на механизмы вроде условной компиляции. Недостат­ков у этого подхода много: требуется писать больше кода, и нередко этот код получается весьма сложным; трудно изменять версии, очень трудно тестировать.

Пересечение предусматривает написание возможно большей части кода так, чтобы он работал без каких-либо изменений или условий в лю­бой системе. Обработка системных различий, от которых все равно ни­куда не денешься, должна быть вынесена в отдельные файлы, которые будут играть роль интерфейса между программой и конкретной систе­мой. И у этого подхода есть свои недостатки, главным из которых является потенциальное ухудшение производительности и даже возможнос­тей, но в общем и целом все недостатки окупаются открывающимися преимуществами.

Дополнительная литература

Есть много описаний языков программирования, но немногие из них достаточно точны, чтобы служить полноценным справочным ру­ководством по языку. Авторы данной книги имеют личные причины, чтобы предпочитать книгу "Язык программирования С" Брайана Кернигана и Денниса Ритчи (Brian Kernighan, Dennis Ritchie. The С Programming Language. Prentice Hall, 1988), но она не заменяет стан­дарт. В книге "С: Справочное руководство" Сэма Харбисона и Гая Стила (Sam Harbison, Guy Steele. C: A Reference Manual. Prentice Hall, 1994), которая дожила уже до четвертого издания, даны хорошие со­веты по переносимости. Официальные стандарты языков С и C + + доступны в ISO (The International Organization for Standardization). Книга, наиболее близкая к официальному стандарту языка Java, — "Спецификация языка Java" Джеймса Гослинга, Билла Джоя и Гая Стила (James Gosling, Bill Joy and Guy Steele. The Java Language. Specification. Addison-Wesley, 1996).

Книга Ричарда Стивенса "Программирование в системе Unix" (Ri­chard Stevens. Advanced Programming in the Unix Environment. Addison-Wesley, 1992) является отличным пособием для программистов под Unix; в частности, там дан подробный обзор вопросов переносимости между различными Unix-системами.

POSIX (the Portable Operating System Interface) — международный стандарт команд и библиотек, основанный на Unix-системах. Он опи­сывает стандартную среду, переносимость исходного кода, а также уни­фицированный интерфейс для ввода-вывода, файловых систем и про­цессов. Этот стандарт описан в нескольких книгах, опубликованных IEEE.

Термин "big-endian" был введен Джонатаном Свифтом в 1726 г.15 Ста­тья Денни Коэна "О святых войнах и мольбе о мире" (Danny Cohen. On holy wars and a plea for peace. IEEE Computer, October 1981) является замечательной басней о порядке байтов, в которой термин "endian" был впервые применен в компьютерной области.

В операционной системе Plan 9, разработанной в Bell Labs, перено­симость является главным приоритетом. Система компилируется из од­ного и того же исходного кода (без директив условной компиляции!) на множестве разных процессоров и повсеместно использует символы Unicode. Последние версии редактора Sam, впервые описанного в "The Text Editor sam" (Software — Practice and Experience, 17, 11, p. 813-845, 1987), используют Unicode, но тем не менее работают на большом коли­честве систем. Проблемы работы с 16-битовыми наборами символов вроде Unicode описаны в статье Роба Пайка и Кена Томпсона "Hello, World or (написано на языке арабского происхождения :-) ) (Документы зимней конфе­ренции USENIXT993. Сан-Диего, 1993. С. 43-50). Впервые кодировка UTF-8 была представлена именно в этой статье. Данный документ, как и последняя версия редактора Sam, также доступен на Web-сайте, по­священном системе Plan 9 в Bell Labs.

Система Inferno основывается на опыте Plan 9 и в чем-то похожа на Java, поскольку она определяет виртуальную машину, которая может быть реализована на любой реальной машине, предоставляет язык (Limbo), который может быть скомпилирован в инструкции для этой виртуальной машины, и использует Unicode в качестве основного набо­ра символов. Она также включает виртуальную операционную систему, которая предоставляет переносимый интерфейс ко множеству коммер­ческих систем. Она описана в статье "Операционная система Inferno" Шона Дорварда, Роба Пайка, Дэвида Л. Презотто, Денниса Ритчи, Го­варда Трики и Филиппа Винтерботтома (Sean Dorward, Rob Pike, David Leo Presotto, Dennis M. Ritchie, Howard W. Trickey и Philip Winter-bottom. The Inferno Operating System. Bell Labs Technical Journal, 2, 1, Winter, 1997).

9. Нотация

Из всех творений человека

самым удивительным является язык.

Джайлс Литтон Страчи. Слова и поэзия

Правильный выбор языка может решающим образом влиять на про­стоту написания программы. Поэтому в арсенале практикующего про­граммиста находятся не только языки общего назначения вроде С и его родственников, но и программируемые оболочки, языки скриптов, а так­же большое количество языков, ориентированных на конкретные при­ложения.

Преимущества хорошей нотации — способа записи — появляются при переходе от традиционного программирования к узкоспециальным про­блемным областям. Регулярные выражения позволяют использовать компактные (из-за этого подчас превращающиеся в тайнопись) описания классов строк. Язык HTML позволяет определять внешний вид интерак­тивных документов, нередко используя встроенные программы на других языках, вроде JavaScript. PostScript рассматривает целый документ — на­пример эту книгу — как стилизованную программу. Электронные табли­цы и текстовые процессоры часто содержат в себе языки программирова­ния типа Visual Basic, они используются для вычисления выражений, доступа к информации, управления размещением данных в документе.

Если вы ловите себя на том, что приходится писать слишком много кода для выполнения рутинных операций, или если у вас возникают проблемы с тем, чтобы в удобной форме описать весь процесс, знайте — скорее всего, вы выбрали неправильный язык. Отсутствие правильного языка можно считать хорошим поводом написать его самостоятельно. Придумать свой язык вовсе не означает создать преемника Java: просто нередко самые за­путанные проблемы проясняются при выборе должной нотации. В связи с этим вспомните форматные строки семейства printf, которые дают нам компактный и выразительный способ для управления выводом.

В этой главе мы говорим о том, как способ записи может помочь в реше­нии наших проблем, а также демонстрируем ряд приемов, которые вы мо­жете использовать для создания собственных специализированных язы­ков. Мы даже заставим программу писать другую программу, такое экстремальное использование способа записи распространено гораздо шире и осуществляется гораздо проще, чем думают многие программисты.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]