簡介
是The Mozilla Public License的簡寫,是1998年初Netscape的 Mozilla小組為其開源軟體項目設計的軟體許可證。MPL許可證出現的最重要原因就是,Netscape公司認為GPL許可證沒有很好地平衡開發者對原始碼的需求和他們利用原始碼獲得的利益。
區別
MPL同著名的GPL許可證和BSD許可證相比,MPL在許多權利與義務的約定方面與它們相同(因為都是符合OSIA認定的開源軟體許可證)。但是,相比而言MPL還有以下幾個顯著的不同之處:
MPL雖然要求對於經MPL許可證發布的原始碼的修改也要以MPL許可證的方式再許可出來,以保證其他人可以在MPL的條款下共享原始碼。但是,在MPL許可證中對“發布”的定義是“以原始碼方式發布的檔案”,這就意味著MPL允許一個企業在自己已有的原始碼庫上加一個接口,除了接口程式的原始碼以MPL許可證的形式對外許可外,原始碼庫中的原始碼就可以不用MPL許可證的方式強制對外許可。這些,就為借鑑別人的原始碼用做自己商業軟體開發的行為留了一個豁口。
MPL許可證第三條第7款中允許被許可人將經過MPL許可證獲得的原始碼同自己其他類型的代碼混合得到自己的軟體程式。
對軟體專利的態度,MPL許可證不像GPL許可證那樣明確表示反對軟體專利,但是卻明確要求原始碼的提供者不能提供已經受專利保護的原始碼(除非他本人是專利權人,並書面向公眾免費許可這些原始碼),也不能在將這些原始碼以開放原始碼許可證形式許可後再去申請與這些原始碼有關的專利。
對原始碼的定義。在MPL(1.1版本)許可證中,對原始碼的定義是:“原始碼指的是對作品進行修改最優先擇取的形式,它包括:所有模組的所有源程式,加上有關的接口的定義,加上控制可執行作品的安裝和編譯的‘原本’(原文為‘Script’),或者不是與初始原始碼顯著不同的原始碼就是被原始碼貢獻者選擇的從公共領域可以得到的程式代碼。”
MPL許可證第3條有專門的一款是關於對原始碼修改進行描述的規定,就是要求所有再發布者都得有一個專門的檔案就對原始碼程式修改的時間和修改的方式有描述。
數學程式語言
(數學程式語言)
The MPL Modeling System
Maximal Software is the developer of MPL (Mathematical Programming Language), an advanced modeling system that allows the model developer to formulate complicated optimization models in a clear, concise, and efficient way. The MPL modeling language offers a natural algebraic notation that is unrivaled in its expressive power, readability and user friendliness. MPL is the fastest and most scalable optimization modeling software on the market today, easily capable of handling problems with millions of variables, quickly and efficiently. MPL works with the world's fastest optimization engines, such asCPLEXand XPRESS, and many other industrial strength solvers.
元編程庫
MPL(Meta-Programming Library)是由David Abrahams和Aleksey Gurtovoy為方便模板元編程而開發的庫,2003年被Boost吸納為其中的一員,此後又歷經一些大幅度修改,已經相當完善,其最新版本於2004年11月發布。MPL的出現是C++模板元編程發展中的一大創舉,它提供了一個通用、高層次的編程框架,其中包括了序列(Sequence)、疊代器(Iterator)、算法(Algorithm)、元函式(Metafunction)等多種組件,具有高度的可重用性,不但提高了模板元編程的效率,而且使模板元編程的套用範圍得到相當的擴展。
(一)MPL的組織架構
一個庫的組織形式有時候甚至比它的功能還重要。MPL的作者聰明地借鑑了已經取得巨大成功的STL,在MPL中保留了許多STL的概念,對函式式的編程方式進行了精巧的包裝,使得任何熟悉STL的程式設計師都可以輕易地理解MPL的使用方法。像STL一樣,MPL有一個完整的概念體系,對組件作了精心的劃分,組件之間相對獨立,接口具有通用性,因此將組件之間的依存度和耦合性降低到最小的限度。
STL和MPL的組件概念對照如下:
STL 概念 | MPL 對應概念 |
容器(Container) | 序列(Sequence) |
算法(Algorithm) | 算法(Algorithm) |
疊代器(Iterator) | 疊代器(Iterator) |
仿函式 ,(Functor) | 元函式類(Metafunction) |
配接器(Adaptor) | 有View、Inserter Iterator和相當於仿函式配接器的Binding元函式 |
配置器(Allocator) | 無此概念 |
標準中沒有定義 | 宏(Macro) |
(二)MPL對其他庫的依賴
MPL是一個高層次的庫,它的地位和編譯期執行的特殊性決定了它需要一些特殊的輔助設施,並對其他庫會有所依賴。
Preprocessor庫是一個基於宏的元編程庫。預處理器的作用發生在編譯以前,所以它比MPL所處的地位還要高端,能夠真正實現代碼生成。它的典型功能是疊代或者枚舉相似的代碼段,減少重複而易寫錯的代碼段。MPL中不少代碼是近似的,比如在vector的原始代碼中,就需要定義n個
vectori { … }
其中i從1疊代到n。為了減少重複勞動,MPL的原始碼大量使用自定義和Preprocessor庫的宏對重複或具有遞推性的內容進行疊代。不過,這也導致原始碼難以閱讀。比如上面一段展開後的原始碼首先是定義在vector/aux_/numbered.cpp的。