Пространства имен и модули являются отдельными проблемами. Пространства имен обеспечивают отдельную концептуальную группировку идентификаторов. Если проект A использует пространство имен A и все его идентификаторы находятся в A или подпространствах A, то он не может конфликтовать с проектом B с использованием пространства имен B. В языке с одним большим плоским пространством имен, таким как C, могут возникнуть проблемы, когда разные проекты хотят использовать тот же идентификатор.
Модули - это отдельные единицы кода. Обычно это файлы или группы файлов, хотя я не думаю, что строгое определение возможно. Модули могут содержать подмодули, которые содержат подмодули.
Разница здесь в том, что, хотя для каждого модуля характерно иметь свое собственное пространство имен в отношении один-к-одному, в общем случае это не требуется. Например, C ++ STL разделен на различные модули, такие как <vector>
, <functional>
и т. Д., Но все они используют одно и то же пространство имен std::
. В C вы можете иметь модульный код (в парах .c / .h), но у вас не может быть пространств имен - или, что то же самое, все модули используют одно пространство имен.
Имя «пакет» в целом может быть неоднозначным: я видел, что оно относится либо к пространству имен (как в Perl), либо к комбинации пространства имен / модуля (как в Java).