2010-09-02 2 views
4

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

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

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

+0

Вы все еще объединяете модули и пространства имен. C++ использует пространства имен, чтобы избежать конфликтов имен, и использует другие методы для создания модулей. Пространства имен и модули * разные *. –

+0

Как вы отмечаете, термин модуль не может быть строго определен, потому что его определение варьируется от одного языка к другому. –

+0

Когда я сказал «нет строгого определения», я имею в виду, что это не обязательно просто файл или класс; это может быть группа файлов или группа классов, или может быть более одного модуля для каждого файла. Но в любом случае вы смотрите на него, модуль является единицей группировки кода, а не единицей группировки имен. –

ответ

0

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

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

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

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

+0

Значит, это разные понятия. Java и .NET убили двух птиц одним камнем, объединив пространства имен и модули в единую конструкцию. Хорошо знать. Это еще не начинает отвечать на мой первоначальный вопрос: кто изобрел пространства имен? Кто придумал модули? Когда они были впервые реализованы на языке? –

+0

@code: я не ответил на эту часть, потому что не знал :) Я думаю, что модули почти такие же старые, как подпрограммы, и с их нечетким определением трудно точно отследить. Пространства имен, похоже, не появляются в языках 1950-х и 60-х годов, таких как fortran, lisp, algol; C++ и Perl оба приобрели свои функции пространства имен в 1990-х годах; поэтому существует более низкая и верхняя граница для их изобретения (или, по крайней мере, популяризации). –

Смежные вопросы