March 30th, 2020

Библиотека классов

Занялся последним проектом-упражнением к главе 13 «Многофайловые программы» учебника Лафоре (стр.639):

4. Создайте библиотеку классов, моделирующую какую-нибудь интересующую вас предметную область. Создайте main() или клиентскую программу для ее тестирования. Предложите свою библиотеку классов на рынке, станьте богатым и знаменитым.


Вроде, ничего сложного, однако в этой главе Лафоре очень обтекаемо пишет о библиотеке классов. Это понятие требует более подробного описания в упражнении, иначе не очень-то понятно, что именно требуется от ученика.

Кстати, пока гуглил, наткнулся на коллегу по запросу. Некий юрист искал четкое определение данного термина в интернете для того, чтобы включить его в судебный иск (понятно, что в суде от сторон требуется четкость в определениях):
https://softwareengineering.stackexchange.com/questions/249887/what-is-a-class-library

Лучшее, что ему смогли посоветовать, это следующее:

A class library is a library containing classes.

Как говорится, idem per idem. С другой стороны, может, это и правильно: чем проще, тем понятнее.

На самом деле, библиотекой классов называют разное в зависимости от контекста. В нашем случае, во-первых, это контекст языка C++. Библиотека классов может содержать от одного до множества классов. Одна библиотека классов может распространяться в виде одного или множества файлов.

Обычно библиотека классов состоит из интерфейса (заголовочный файл .h с определениями классов, в которых методы только объявлены) и реализации (один или несколько файлов с определениями методов классов).

Реализация может распространяться:


  • в текстовом исходном файле (файлах) .cpp;

  • в объектном файле (файлах) .obj (или с другим расширением в зависимости от операционной системы);

  • в файле .lib (или с другим расширением в зависимости от операционной системы);

  • в файле .dll (или с другим расширением в зависимости от операционной системы).

Лафоре практически не касается (по крайней мере, в главах 1-13) двух последних пунктов (.lib и .dll), возможно, потому, что, как пишут, эти форматы файлов не оговорены в стандарте языка C++ (это выходит за рамки языка программирования).

Как пишут, формат файла .lib (в операционных системах MS Windows) — это что-то вроде контейнера, который содержит один или более объектных файлов в несжатом виде.

Для создания исполняемого файла приложения программист в первом случае из текстового исходного файла библиотеки классов компилирует объектный файл, который затем компонуется в исполняемый файл. Во втором случае библиотека классов уже содержит объектный файл, поэтому для получения исполняемого файла нужно пройти только второй этап сборки — этап компоновки. В третьем случае файл .lib передается на вход компоновщику, как и во втором случае. Все эти три случая подходят под определение статической библиотеки классов. Это означает, что все классы и функции такой библиотеки будут включены компоновщиком («linker» на английском) в исполняемый файл, независимо от того, используются они в приложении или нет.

В последнем (четвертом) случае в исполняемый файл приложения включается только информация, необходимая операционной системе для обнаружения и загрузки в оперативную память файла .dll, содержащего нужную для работы приложения библиотеку классов. Этот случай подходит под определение динамической библиотеки классов.

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

Источники:
https://ru.wikipedia.org/wiki/Библиотека_(программирование)
https://docs.microsoft.com/ru-ru/cpp/build/dlls-in-visual-cpp