История пространств имен / пакетов / модулей? - PullRequest
4 голосов
/ 02 сентября 2010

Я изучал, как разные языки управляют организацией исходного кода. Похоже, что большинство современных языков используют некоторую форму именованного абстрактного контейнера. То, как оно называется и как оно реализуется, варьируется от одного языка к другому, но сводится к программной конструкции, которая работает за пределами файлов, чтобы сгруппировать связанный код.

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

Мне интересно, кто впервые предложил эту идею и когда она была предложена. Кроме того, на каком языке он был первым?

1 Ответ

0 голосов
/ 02 сентября 2010

Пространства имен и модули являются отдельными проблемами. Пространства имен обеспечивают отдельную концептуальную группировку идентификаторов. Если проект A использует пространство имен A и все его идентификаторы находятся в A или подпространствах A, то он не может конфликтовать с проектом B с использованием пространства имен B. В языке с одним большим плоским пространством имен, таким как C, могут возникнуть проблемы, когда разные проекты хотят использовать тот же идентификатор.

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

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

Имя «пакет» в целом может быть неоднозначным: я видел, что оно относится либо к пространству имен (как в Perl), либо к комбинации пространства имен / модуля (как в Java).

...