Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Непейвода Н.Н. -> "Основания программирования " -> 31

Основания программирования - Непейвода Н.Н.

Непейвода Н.Н., Скопин И.Н. Основания программирования — Институт компьютерных исследований , 2002. — 919 c.
Скачать (прямая ссылка): osnovanprogramm2002.pdf
Предыдущая << 1 .. 25 26 27 28 29 30 < 31 > 32 33 34 35 36 37 .. 316 >> Следующая

Пример 2.2.3. Стандарт языка С предписывает, что системы программирования на нем долн предусматривать специальный инструмент для обработки программных текстов, который называется препроцессором. Препроцессор делает массу полезнх преобразований. Как у е упоминалось, он берет на себя реение задачи подкл чения к программе внених (библиотечных) файлов (см. 1.2), с его помощью можно скрывать утомительные детали программирования, достигать ряда ну нх эффектов, не предусмотренных в основных средствах языка (например, именованные константы — см. 1.5.1). Постулируется, что программа на языке С есть то, что получается после работы препроцессора с текстом (разумеется, если результат такой работ ока-ется корректным). Следовательно, использование препроцессора — синтаксическая прагматика языка. о это противоречит практике работы программиста: он просто не в состоянии написать содержательную программу, которая могла бы выполняться без использования при своей трансляции препроцессора. Если при программировании на С ограничива тся употребле-
84
ГЛАВА 2. ССП
нием препроцессорных команд подключения файлов определений и определения констант, то работа препроцессора не очень затрудняет понимание получившейся программы. Но когда применяются, к примеру, условные пре-процессорне конструкции, возмо но появление программ-химер, зрительно воспринимаемй текст которх дезинформирует относительно их реальной структур . Пусть написано
if (x > 0) Firstmacro else PerformAction;
Внешне это выглядит как то, что действие выполняется, если x ^ 0, но первый макрос раскрвается как
PrepareAction; if (x <= 0) CancelAction
а е сам автор данной программ через некоторое время не поймет, почему е она у него так себя ведет. . . Конец примера 2.2.3.
ак это ни странно, подобные построения использу тся в практике программирования на С: они применя тся, чтобы в одном обем тексте задать несколько вариантов выполняемых программ, которые разграничива тся при работе препроцессора, т. е. до выполнения.
Наложение команд препроцессора на текст программы — это смешение двух моделей вчислений: одна из них — модель базового языка С, другая — модель препроцессора.9 В результате программист при составлении и изучении программ вну ден думать на двух уровнях сразу, а это и трудно, и провоцирует оибки.
9 Модель вычислений препроцессора можно охарактеризовать следующими свойствами. Исходные перерабатываемые данные — это текст (любой структуры, не обязательно на языке С), в котором имеются строки, начинающиеся с символа '#'. Такие строки представляют команды, управляющие работой препроцессора. Например,
#include ...
заставляет препроцессор вставить некоторый файл в перерабатываемый текст (не следует понимать это буквально — нужно просто обеспечить соответствующий эффект). Другой пример:
#define two 2
дает указание препроцессору на то, что в оставшейся части текста идентификатор two должен заменяться числом 2. Результат вычислений препроцессора — текст, который не содержит его команд.
2.2.
85
Во многих языках, в частности, в Object Pascal, для подобных целей используется более концептуально подходящее средство, так называемая условная компиляция. Суть его в том, что программисту дана возможность указать, что некоторй фрагмент компилируется, если при компиляции задан соот-ветствуий параметр (опция), и не компилируется в противном случае.
ри этом оказвается искл ченной ситуация, приведенная в предыдуем примере, поскольку чаще всего способ, которым задается фрагмент, привязан к синтаксическим конструкциям языка, т. е. условную компиляцию можно задавать не для произвольных фрагментов, а лиь для тех, которые явля т-ся язковыми конструкциями. ри условной компиляции проверяется корректность синтаксиса и, что не менее суественно, зримй образ программы явно отражает ее вариантность (именно это свойство нарушено в примере 2.2.3). Конечно, программист на С может писать тексты, в которых не появляется незаметная смесь вариантов, но, к со алени , проверить, что это условие вполнено, препроцессор не в состоянии.
Разработчики С с самого начала мало заботились о концептуальной целостности языка. Это привело к тому, что при развитии языка концептуальная эклектика множилась: надо было заботиться о стихийно складывающихся традициях использования язка, чтобы не терять активно работаих пользователей. Ситуация типичная, она многократно повторялась в истории. В этой связи поучительно будет обсудить ход развития другого язка — Pascal линии Turbo. значально целостная модель вчислений стандартного языка Pascal не во всем удовлетворяла практических программистов. Это стало стимулом для развития языка, которое среди прочих вариантов демонстрирует последовательность версий Turbo Pascal. Разработчики данной линии смогли сохранить стиль прародительского языка вплоть до версии 7, несмотря на значительные расирения. В целом они успено реали очень трудную задачу отделения прагматики от развивающейся модели вычислений.
днако с ней не удалось справиться тем е разработчикам, когда они взялись за конструирование принципиально новой систем программирования Delphi и ее языка Object Pascal (причины могут бть разне, в том числе банальная конкурентная гонка, которая, безусловно, заставляла чем-то ерт-вовать). Одним из многих отрицательных следствий явилась принципиальная неотделимость язка от систем программирования, а потому — бес-смсленность их самостоятельного раздельного развития. далее история Delphi с точность до деталей повторяет то, что было с языком С/С++. последовавих версиях системы, вну деннх поддеривать преемственность, все более переплетаются модель вычислений и прагматика.
Предыдущая << 1 .. 25 26 27 28 29 30 < 31 > 32 33 34 35 36 37 .. 316 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100