Распространение программного обеспечения и язык С++
Распространение программного обеспечения и язык С++
Для понимания проблем, связанных с использованием C++ как набора компонентов, полезно проследить, как распространялись библиотеки C++ в конце 1980-х годов. Представим себе разработчика библиотек, который создал алгоритм поиска подстрок за время O(1) (то есть время поиска постоянно, а не пропорционально длине строки). Это, как известно, нетривиальная задача. Для того чтобы сделать алгоритм возможно более простым для пользователя, разработчик должен создать класс строк, основанный на алгоритме, который будет быстро передавать текстовые строки (fast text strings) в любую программу клиента. Чтобы сделать это, разработчику необходимо подготовить заголовочный файл, содержащий определение класса:
// faststring.h
class FastString
{
char *mpsz;
public:
FastString(const char *psz);
~FastString(void);
int Length(void) const;
// returns # of characters
// возвращает число символов
int Find(const char *psz) const;
// returns offset
//возвращает смещение
};
После того как класс определен, разработчик должен реализовать его функции-члены в отдельном файле:
// FastString.cpp
#include «faststring.h»
#include <string.h>
FastString::FastString(const char *psz) : mpsz(new char [strlen(psz) + 1])
{ strcpy(mpsz, psz); }
FastString::~FastString(void)
{ delete[] mpsz; }
int FastString::Length(void) const
{ return strlen(mpsz); }
int FastString::Find(const char *psz) const
{
//O(1) lookup code deleted for> clarity
1
// код поиска 0(1) удален для ясности
}
Библиотеки C++ традиционно распространялись в форме исходного кода. Ожидалось, что пользователи библиотеки будут добавлять реализации исходных файлов и создаваемую ими систему и перекомпилировать библиотечные исходные файлы на месте, с использованием своего компилятора C++. Если предположить, что библиотека написана на наиболее употребительной версии языка C++, то такой подход был бы вполне работоспособным. Подводным камнем этой схемы было то, что исполняемый код этой библиотеки должен был включаться во все клиентские приложения.
Предположим, что для показанного выше класса FastString сгенерированный машинный код для четырех методов занял 16 Мбайт пространства в результирующем исполняемом файле. Напомним, что при выполнении O(1)-поиска может потребоваться много пространства для кода, чтобы обеспечить заданное время исполнения, – дилемма, которая ограничивает большинство алгоритмов. Как показано на рис. 1.1, если три приложения используют библиотеку FastString, то каждая из трех исполняемых программ будет включать в себя по 16 Мбайт кода. Это означает, что если конечный пользователь инсталлирует все три клиентских приложения, то реализация FastString займет 48 Мбайт дискового пространства. Хуже того – если конечный пользователь запустит все три клиентских приложения одновременно, то код FastString займет 48 Мбайт виртуальной памяти, так как операционная система не может обнаружить дублирующий код, имеющийся в каждой исполняемой программе.
Есть еще одна проблема в таком сценарии: когда разработчик библиотеки находит дефект в классе FastString, нет способа всюду заменить его реализацию. После того как код FastString скомпонован с клиентским приложением, невозможно исправить машинный код FastString непосредственно в компьютере конечного пользователя. Вместо этого разработчик библиотеки должен известить разработчиков каждого клиентского приложения об изменениях в исходном коде и надеяться, что они переделают свои приложения, чтобы получить эффект от этих исправлений. Ясно, что модульность компонента FastString утрачивается, как только клиент запускает компоновщик и заново формирует исполняемый файл.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Глава 13 Надежность программного обеспечения
Глава 13 Надежность программного обеспечения Системные меры безопасности (ядра безопасности, меры контроля доступа, криптография и т. д.) в комплексе с хорошими сетевыми мерами безопасности (брандмауэрами, системами обнаружения вторжения, механизмами проверки) создают
2.6. Установка программного обеспечения
2.6. Установка программного обеспечения Многие начинающие пользователи операционной системы Linux сталкиваются с проблемой установки нового программного обеспечения, а также удаления и обновления уже установленного. При описании установки той или иной программы в
17.2.1. Установка программного обеспечения
17.2.1. Установка программного обеспечения В качестве операционной системы, естественно, будем использовать ОС Linux. Метод настройки, рассмотренный в этой главе, подойдет для любого дистрибутива. Также вам потребуются пакет ррр версии 2.3.x (желательно самая новая версия) и
7.5. Установка программного обеспечения
7.5. Установка программного обеспечения В ОС Windows установка новых программ происходит просто: достаточно запустить setup.exe, ввести серийный номер, каталог для установки и нажать на кнопку «Далее». После этого вы можете поступить так. как рекомендует Microsoft: «откиньтесь на
8. Эффективное использование программного обеспечения
8. Эффективное использование программного обеспечения Вы можете посчитать название этой главы несколько странным, однако оно в наилучшей степени отражает те приемы, которые в наши дни используются для управления компьютерными системами. Я надеюсь, что, прежде чем
4.3. Иерархичность программного обеспечения
4.3. Иерархичность программного обеспечения В проектировании иерархии функций или объектов определяется два направления. От выбора направления очень зависит иерархическое представление
4.3. Иерархичность программного обеспечения
4.3. Иерархичность программного обеспечения В проектировании иерархии функций или объектов определяется два направления. От выбора направления очень зависит иерархическое представление
Гонка в запуске программного обеспечения
Гонка в запуске программного обеспечения Сделайте что-нибудь и идите быстроЗапуск программного обеспечения — лучший способ добиться инерции, поучаствовать в ралли командой, и отсеять идеи, которые не работают. Это должно быть приоритетом номер один в первый же день
24 Цели программного обеспечения
24 Цели программного обеспечения Программист, проспавший большую часть последних десяти или двадцати лет, наверное, не знает о том, что такое объектно-ориентированное программирование. Остальные из нас уже сыты этими объектами по горло. Я испытываю некоторое сочувствие к
4. ХАРАКТЕРИСТИКИ КАЧЕСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
4. ХАРАКТЕРИСТИКИ КАЧЕСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Качество программного обеспечения может быть оценено следующими
5.2 Представления о качестве программного обеспечения
5.2 Представления о качестве программного обеспечения Имеется несколько представлений о качестве, некоторые из которых обсуждаются
5.5. Сопровождение программного обеспечения
5.5. Сопровождение программного обеспечения Сопровождающим программистам требуется детальное описание программного обеспечения, такое, чтобы они могли локализовать и корректировать ошибки и модернизировать или изменять программное обеспечение соответствующим
11.2. СВОЙСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
11.2. СВОЙСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ Следует выделить следующие свойства программного обеспечения.Корректность программного обеспечения — свойство безошибочной реализации требуемого алгоритма при отсутствии таких мешающих факторов, как ошибки входных данных,