Большую программу невозможно написать, не разбив ее на части. До сих пор мы изучали механизмы логической декомпозиции программы: классы и функции. Однако большие программы требуется разбивать на части еще и физически. Обычно отдельная часть большой программы называется модулем. Разбиение программы на части выгодно по многим причинам: отдельные части крупного проекта могут одновременно разрабатываться разными программистами; с небольшим модулем быстрее и удобнее работать; разбиение способствует инкапсуляции, что облегчает обнаружение и исправление ошибок.
Разделить программу на части — это только половина работы. Отдельные модули сами по себе функционировать не будут — программу требуется снова собрать в единое целое. Обычно сборка осуществляется одним из двух способов: во-первых, можно объединить исходные тексты, во-вторых, программу собрать можно и из объектных модулей. Объектный модуль — это результат трансляции одного модуля. Такой способ называется раздельной трансляцией.
Основным достоинством первого подхода является простота, а главный недостаток — необходимость транслировать большую программу. Этот процесс может занимать очень много времени.
Во втором варианте объединяются объектные модули. Собственно, этот способ и был придуман для того, чтобы избежать трансляции всей программы целиком. Процесс сборки программы из объектных модулей называется компоновкой, и выполняет эту работу специальная программа, которая обязательно входит в состав любой системы программирования. Эта программа называется компоновщиком, но программисты часто называют ее линкером (linker).
При компоновке в программу собираются не только разработанные нами модули, но и стандартные модули. Стандартные модули, естественно, не транслируются вместе с нашей программой — они поставляются вместе с системой в виде объектных модулей и объектных библиотек. Если вы напишете в программе вызов некоторой стандартной функции, например sqrt(x), то компоновщик разыщет среди стандартных модулей тот, в котором записана эта функция, и присоединит ее к программе.
Обычно в реальном программировании используется сочетание обоих подходов: в единую программу компонуются объектные модули, но отдельный объектный модуль может собираться из нескольких модулей с исходным текстом. В С++ объединение исходных текстов делается с помощью препроцессора.
Таким образом, мы можем разбить большую программу на файлы, оттранслировать их по отдельности, а потом собрать в единое целое. Однако в С++ отсутствуют конструкции для обозначения модуля. Вместо этого в стандарте определено понятие единицы трансляции (см. п. п. 2/1 в [1]). Единица трансляции — это отдельный файл с исходным текстом на С++, который получается после обработки препроцессором. Поэтому в дальнейшем мы будем использовать термины «файл» и «модуль» как синонимы. В С++ отсутствуют также конструкции для сборки объектных модулей в исполняемую программу — это делается средствами интегрированной среды. Обычно в интегрированной среде создается проект, в составе которого указываются все исходные и объектные модули.
ПРИМЕЧАНИЕ
Средства определения и сборки модулей включены во многие языки. В клонах Modula й Oberon модуль является основной конструкцией. В языке Turbo Pascal модуль обозначается зарезервированным словом unit, а использование модуля в программе можно указать директивой uses. В Java модуль (пакет) обозначается зарезервированным словом package, а подключение пакета задается оператором import.
Раздельная трансляция требует согласования объявлений и определений в разных единицах трансляции. Если что-то не согласовано, то мы получим ошибку либо при компиляции, либо при компоновке. Во всех единицах трансляции должны быть согласованы объявления классов, функций, переменных и констант, перечислений, шаблонов и пространств имен.
Опубликовал Kest
January 15 2014 11:58:52 ·
3 Комментариев ·
6060 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
YaXniZkij January 15 2014 13:41:17
Да, хорошую прогу без разбиения на модули не напишешь, это точно)) Помню как я на первом курсе в универе писал жуткого вида РГЗ на 1000 строк и все в одном модуле. Ну и намучился тогда! Зато научился в куче кода искать нужную строчку))
Зато сейчас печалей не знаю. Разбил на модули в каждом модуле своя подпрограмма, решающая конкретную задачу! Удобно!
Роберт January 15 2014 18:31:13
"Разделяй и властвуй" вот мой тезис даже при написании простой программы.
Это правило, которое я выучил сразу. Разделение кода на автономные части дает вам не толь легкую читабельность кода, но и его функциональность в плане повторного использования.
Один раз написав часть кода можно его использовать и в других программах. Тоже относиться и к классам, только там сложнее.
Vladimir B. January 15 2014 19:36:59
Немного сложновата техническая сторона реализации вашей информации, но, думаю это того стоит. Я ошибался раньше, предполагая, что разбивая программу на части, потеряю много времени. Но, ознакомившись с весьма поучительной и полезной информацией из вашей статьи пришел к выводу,что: следуя определенным правилам, от создания большой программы с исходными и объектными модулями будет больше практической пользы.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.