Назад Оглавление Вперед
На головную страницу М.М.Горбунов-Посадов
 
РАСШИРЯЕМЫЕ ПРОГРАММЫ
 

Предисловие
 

 

ПРЕДИСЛОВИЕ

Наша конечная цель — расширяемое программирование.
Никлаус Вирт [Вирт, 1998]

      Как редко практикующему программисту выпадают дни, когда он начинает создавать новую программу «с чистого экрана»! Какое блаженство испытывает он в такой момент, зная наверняка, что ни одна из набранных им сейчас строк не принесет вреда ничему из того, что он сам или его коллеги написали когда-либо ранее!
      И напротив, какая тоска одолевает разработчика, когда он достигает определенного порога сложности своей программы и далее не может уже без содрогания слышать о появлении новых требований к ней, поскольку у него просто не поднимается рука для внесения очередных дополнений. Обычно разработчик быстро находит, что и где надо будет менять, но тут вспоминает, как недавно исправление пары символов в третьестепенной (как тогда казалось) строчке исходного текста на неделю вывело программу из строя, сорвав сроки ответственного производственного расчета. Однако в современном мире выживают только энергично развиваемые программы, и скрепя сердце разработчик подходит к компьютеру...
      Такого рода драматические коллизии весьма неприятны, повсеместны и общеизвестны. Тем не менее складывается впечатление, что создатели программистского инструментария недостаточно часто задают себе вопрос: «Что я сделал для облегчения развития программы?»
      Одно из наиболее серьезных препятствий, преграждающих дорогу к безболезненному развитию, к расширяемым программам, — необходимость редактирования написанного и отлаженного ранее исходного текста. Ведь обращение к редактору подобно хирургическому вторжению в живой программный организм, вслед за чем почти неизбежно наступает мучительный период реанимации.
      В распространенных инструментальных средах развитие программы обычно немыслимо без редактирования. Для пользователя подобной среды постоянные болезненные модификации отлаженных текстов настолько обыденны, что даже не вызывают чувства протеста. Более того, нередко он ошибочно полагает, что дополнить программу новой частью без редактирования написанных ранее либо вообще невозможно, либо для этого необходимо какое-то сверхъестественное инструментальное окружение, что-то из разряда искусственного интеллекта.
      На самом же деле существуют довольно простые механизмы безболезненного развития программы, способные органично войти в традиционную среду разработки. Нужно лишь немного усовершенствовать эту среду, включив в нее две-три несложные конструкции. В результате удается поставить дело таким образом, что вновь написанные части программы будут, как правило, только дополнять множество существующих исходных текстов, не требуя их редактирования.
      О расширяемых программных конструкциях и пойдет речь в этой книге. Работают они в сфере программирования «в большом» (уровня модулей), которое, как и программирование «в малом» (уровня операторов), нуждается в языковой и инструментальной поддержке.
      Пока размер вашей программы не превышает нескольких десятков строк, не будет большой беды, если вы используете в ней GOTO или даже напишете ее на ассемблере. С переходом к сотням и тысячам строк применение канонических управляющих структур и языков высокого уровня дает уже весьма существенный выигрыш в надежности и производительности.
      Похоже обстоит дело и в программировании «в большом». Хаотическая организация модулей не страшна, пока их число измеряется десятками, а число строк программы — тысячами. С увеличением размеров тут также все настойчивее заявляет о себе потребность в регулярных механизмах. Такие механизмы, т. е. формируемые из модулей конструкции и средства их системной поддержки, помогают навести порядок в программном хозяйстве большого объема, обеспечить его сопровождение и развитие.
      Программирование «в большом» проходит еще период становления. Этим, в частности, объясняется выбранная форма подачи материала. Книга построена как серия взаимосвязанных этюдов, освещающих отдельные грани существующих и ожидаемых расширяемых программных конструкций.
      Гл. 1 посвящена оформлению варианта — одной из простейших задач программирования «в большом», сопоставление различных решений которой позволяет не только проиллюстрировать охватываемый книгой круг проблем, но и ввести некоторые существенные понятия и термины. В гл. 2 анализируются разнообразные мотивы, которыми руководствуются при расчленении программы на модули.
      В последующих главах разбирается и оценивается ряд расширяемых конструкций, обеспечивающих построение программы из модулей. В гл. 34 рассматриваются конструкции, уже получившие признание и прошедшие проверку в реальных разработках, в частности при решении многовариантных задач вычислительного эксперимента. В гл. 56 предлагаются новые конструкции, обслуживающие расширяемые наборы однородных элементов программы. Гл. 7 повествует о характерных эпизодах из практики расширяемого программирования.
      В конце книги находятся сводка описаний предлагаемых программных конструкций и словарь терминов, где собраны краткие определения используемых понятий.
      О программировании «в большом» сейчас много говорят, нередко вспоминая при этом и о расширяемости программы. Однако из-за каприза программистской моды расширяемость рассматривается обычно не как самостоятельная цель, а лишь как одно из многих полезных проявлений объектной ориентации. Между тем расширяемость входит в число высших приоритетов разработчика крупной программы, а объектная ориентация — не единственная, и отнюдь не самая прямая дорога к расширяемости. Книга не обходит вниманием объектную ориентацию, ей посвящено несколько разделов. Но в целом по тематической направленности книга близка к известной монографии [Фуксман, 1979], где проблемы расширяемости рассматриваются вне связи с тем или иным стилем программирования.
      Бегло намечаются пути реализации обсуждаемых конструкций. Эта часть книги адресована в первую очередь квалифицированному программисту-профессионалу. Вместе с тем основной материал, посвященный возможностям предлагаемых конструкций и особенностям их использования в программах, вполне доступен читателю, не обладающему пока высокой квалификацией.

*     *     *

      Отправной точкой для книги послужила предшествующая монография автора [Горбунов-Посадов, 1994], выдержавшая два издания. Ее материал подвергся основательной переделке, было заменено свыше трети общего объема, заново написана последняя глава, вобравшая в себя три недавно опубликованных статьи [Горбунов-Посадов, 1996а, 1996б, 1998]. Все это привело к книге с новым названием, более точно отражающим ее содержание.

*     *     *

      Неоценимую помощь в работе над книгой оказали А.Л.Александров, В.Б.Бетелин, Ю.А.Бухштаб, Д.В.Волков, А.В.Ермаков, Т.Б.Иваницкая, В.Я.Карпов, В.Ш.Кауфман, А.С.Кленин, В.А.Крюков, А.Н.Литвиненко, Э.З.Любимский, В.В.Мартынюк, Е.Н.Маслова, В.И.Маслянкин, М.П.Матекин, А.К.Петренко, Т.А.Полилова, И.В.Поттосин, В.Г.Садиков, Г.К.Серяков, Д.А.Французов, сделавшие в разное время множество важных замечаний. По материалам книги автор несколько лет читал различные курсы на факультете ВМК МГУ, собирая богатый урожай студенческих мнений на каждой лекции или экзамене. Автор глубоко благодарен всем этим своим коллегам за состоявшиеся обсуждения, позволившие навести некоторый порядок среди излагаемых понятий.
      Особую признательность хочется выразить Д.А.Корягину, который одобрил первоначальный замысел книги и неизменно поддерживал автора на всех этапах ее подготовки. Автор рад представившейся возможности поблагодарить редактора книги А.С.Попова, не только значительно улучшившего ее текст, но и раз за разом находившего блестящие решения множества сопутствующих изданию организационных проблем. Автор высоко ценит консультации и организационную помощь, оказанную ему В.Д.Новиковым (РФФИ), а также благодарен В.Б.Филиппову (издательство Фазис) за обсуждения на начальной стадии издательского проекта.
 
      С благодарностью будут приняты любые замечания по содержанию или оформлению книги, которые можно направлять по адресу polilova@online.ru (издательство) или gorbunov@keldysh.ru (автор).

Далее

Рейтинг@Mail.ru