2010-09-02 25 views
4

我一直在研究不同的語言如何管理源代碼的組織。看來大多數現代語言使用某種形式的命名抽象容器。它的調用方式以及實現方式隨語言的不同而不同,但它歸結爲一種編程結構,它在文件邊界之外運行以分組相關代碼。命名空間/程序包/模塊的歷史?

在Java和.NET語言中,它被用作組織依賴性的基礎(包含/導入類所屬的名稱空間/包而不是其定義的文件)。雖然C++僅用它來避免名稱衝突。

我很好奇誰最先提出這個想法,以及何時提出。哪種語言是最先實現它的?

+0

你仍然在混淆模塊和命名空間。 C++使用名稱空間來避免名稱衝突,並使用其他方法來創建模塊。命名空間和模塊是*不同*。 – 2010-09-02 13:43:18

+0

正如你指出的那樣,術語模塊不能嚴格定義,因爲它的定義因語言而異。 – 2010-09-02 13:55:59

+0

當我說「沒有嚴格的定義」時,我的意思是它不一定只是一個文件或一個類;它可能是一組文件或一組類,或者每個文件可能有多個模塊。但是無論你如何看待它,模塊都是代碼分組的單位,而不是名稱分組的單位。 – 2010-09-02 14:03:31

回答

0

命名空間和模塊是不同的問題。名稱空間提供了對標識符的單獨概念分組。如果項目A使用名稱空間A,並且其所有標識符都位於A或A的子名稱空間中,則它不能與使用名稱空間B的項目B衝突。對於具有一個大的平面名稱空間(例如C)的語言,當不同項目想要使用相同的標識符。

模塊是單個代碼單元。通常他們是文件或文件組,但我認爲不可能有嚴格的定義。模塊可以包含包含子模塊的子模塊。

這裏的區別在於,儘管每個模塊在一對一關係中都有自己的名稱空間是很常見的,但通常不是必需的。例如,C++ STL被分成不同的模塊,例如<vector>,<functional>等,但它們都使用相同的命名空間std::。在C中,可以有模塊化代碼(以.c/.h對爲單位),但不能有名稱空間 - 或者等價地,所有模塊都使用一個名稱空間。一般而言,名稱「package」可能不明確:我已經看到它指的是名稱空間(如在Perl中)或名稱空間/模塊組合(如在Java中)。

+0

所以他們是不同的概念。 Java和.NET通過將命名空間和模塊組合到一個單獨的構造中,一舉兩得。很高興知道。這仍然不能回答我最初的問題:誰發明了命名空間?誰發明了模塊?他們什麼時候首次以某種語言實施? – 2010-09-02 15:35:49

+0

@code:我沒有回答那個部分,因爲我不知道:)我想象的模塊幾乎和子程序一樣古老,而且他們的模糊定義很難精確追蹤。命名空間似乎不會出現在20世紀50年代和60年代的語言中,如fortran,lisp,algol; C++和Perl都在20世紀90年代獲得了它們的命名空間特性;所以他們的發明有一個較低和較高的界限(或至少是普及化)。 – 2010-09-02 15:44:29