Modula-3

Modula-3是一種系統程式語言，它是叫做的升級版本的Modula-2的後繼者。雖然它已經在研究界有了影響力，受其影響的語言有Java、C#和Python，但未能在工業上被廣泛採用。它是在1980年代末由在數字裝置公司、Bill Kalsow和設計。Modula-3的主要特點，是保持系統程式語言的強力，同時具有簡單性和安全性。Modula-3意圖延續Pascal的型別安全和Modula-2的模組化程式設計傳統，同時為實際程式設計引入新構造。特別是Modula-3添加了如下支援：異常處理、與預設引數值、有跟蹤的引用與垃圾回收、面向物件、不透明型別及其披露、泛型、多執行緒和不安全程式碼顯式標記。Modula-3的設計目標，是以非常基本的形式，實現指令式程式語言的大部份重要的現代特徵。因此省略了涉嫌危險和複雜的特徵，如多重繼承和運算子過載。發展歷史.Modula-3專案始於1986年11月，當時莫里斯·威爾克斯向尼克勞斯·維爾特寫信，提出了一些關於Modula新版本的想法。威爾克斯在此之前一直在DEC工作，他回到英格蘭並加入了Olivetti的研究策略委員會。Wirth已經轉移到了Oberon，但Wilkes的團隊在Modula名下繼續開發沒有任何問題。語言定義於1988年8月完成，並於1989年11月更新了版本。DEC和Olivetti的編譯器很快就出現了，隨後又有了第三方實現。它的設計受到和Acorn計算機研究中心的Acorn編譯器的語言。正如修訂的Modula-3報告所述，該語言演化自Mesa、Modula-2、Cedar和，還受到其他語言的影響如：Object Pascal，Oberon和。在20世紀90年代，Modula-3作為一種教學語言獲得了可觀的傳播，華盛頓大學在1994年發行的微核心作業系統是用Modula-3開發的，但它從未廣泛用於工業用途。造成這種情況的原因，可能是Modula-3的關鍵支持者DEC的消亡，特別是在1998年DEC被出售給康柏之前就不再有效地維護它了。無論如何，儘管Modula-3有著簡單性和強大功能，似乎當時對有限實現了面向物件程式設計的過程式編譯語言的需求很少。Critical Mass公司曾在一段時間內提供了一個名為CM3的商業編譯器，它由以前DEC SRC的在DEC被出售給Compaq之前僱用的一個主要實現者維護，和叫做Reactor的一個整合開發環境以及可擴充套件的Java虛擬機器。但該公司在2000年停止了活動，並將其產品的一些原始碼提供給了elego軟體解決方案有限公司。基本上，Modula-3的唯一企業支持者是elego軟體解決方案有限公司，它繼承了Critical Mass的資源，並且已經以原始碼和二進位制形式釋出了幾個版本的CM3系統。Reactor IDE在幾年後才開源釋出，新的名稱是CM3-IDE。2002年3月，elego還接管了此前由蒙特利爾工程學院維護的另一個活躍的Modula-3發行版PM3的儲存庫，在此後幾年間以HM3名義進行了持續改進，直至最終被淘汰。Modula-3是文件記錄了語言特徵演化的少見語言之一，在《用Modula-3系統程式設計》中，收錄了設計者對四個設計要點的討論：結構等價與名稱等價、子型別規則、泛型模組和引數模態。Modula-3現在主要是在大學中的比較程式語言課程中教授，其教科書已絕版。程式示例.Modula-3中所有的程式至少具有一個模組檔案，而大多數程式還包括一個介面檔案，客戶端使用它來訪問來自模組的資料。語言語法的一個常見示例是Hello world程式：MODULE Main;IMPORT IO;BEGINIO.Put("Hello World\n")END Main.與其他語言一樣，Modula-3程式必須有匯出codice_1介面的實現模組，如上述示例中實現模組預設匯出了同名的介面，它可以處在名為Main.m3的檔案中；或者是透過codice_2匯出codice_1介面的實現模組，比如：MODULE HelloWorld EXPORTS Main;IMPORT IO;BEGINIO.Put("Hello World\n")END HelloWorld.建議這個模組所在的檔案的名字與實際模組名字相同，當它們不同時編譯器只是發出一個警告。語言設計理念.Modula-3委員會將Modula-3設計為ALGOL語言家族的現代代表，他們認為：ALGOL家族語言都有強型別系統，其基本想法是把值空間劃分成型別，限制變數持有單一型別的值，並且限制運算應用於固定型別的運算數。這個語言家族的趨勢，在1960年代是朝向控制流程和資料結構特徵，在1970年代是朝向特徵如介面、不透明型別和泛型，在1980年代是採納來自LISP家族和始自BCPL的C家族的仔細挑選的技術。Modula-3委員會堅持一個自稱為“複雜度預算”的設計原則：在五十頁內將語言準確而易讀的描述出來，為此只容納最有用的特徵。精選出來的特徵直接針對兩個主要目標：這些特徵中任何一個都沒有特殊的新穎性，但是組合起來是簡單而強力的。人們越是更好的理解程式，就越是使用更大的建造塊去構造它。指令之後是語句，語句之後是過程，過程之後是介面，下一步應當是抽象型別。在理論層面，抽象型別，是透過其操作的規定，而非透過其資料的表示，來定義的型別。詞法記號.關鍵字：保留識別符號：運算子：此外，註釋是開於codice_4併合於codice_5的任意字元的序列。註釋可以巢狀並可以擴充套件跨越多於一行。基礎性語法和語義.Modula-3承襲了ALGOL家族傳統的強型別，並且為了使型別系統儘可能的統一，採用瞭如下原則：一個典型的不安全執行時間錯誤，是釋放仍可由活躍引用觸及的資料結構。避免這個問題的唯一可靠方式，是不再觸及儲存的自動釋放，或稱為垃圾收集。Modula-3因而提供了有跟蹤的引用，它類似於Modula-2的指標，除了它們所指向的儲存被儲存在有跟蹤的堆之中之外，在這裡它們將在到它們的引用都消失時自動釋放。垃圾收集的另一個巨大利益是簡化了介面，沒有垃圾收集，介面就必須規定客戶或實現是否有責任釋放每個分配的引用，和在什麼條件下可以安全的去這麼做。異常是一次退出多層作用域的控制結構。一個異常被重複的發起退出當前活躍的作用域，直到找到給這個異常的處理器，並將控制權移交給這個處理器，如果沒有處理器，則計算以某種依賴於系統的方式終止，比如進入偵錯程式。在Modula-3中，codice_11和codice_12語句的語義，分別使用退出異常codice_13和返回異常codice_14來定義。Modula-3的設計者認為語言實現，除了這種返回異常和退出異常之外，更應當以各種異常為代價，加速正常的結果產出；為每個引發的異常花費一千條指令，來為每個過程節約一條指令都是合理的。塊與宣告.宣告介入一個常量、型別、變數、異常或過程的一個名字。這個名字的作用域是包含這個宣告的塊。一個塊可以出現為一個模組或過程的本體，或一個塊語句，Pascal和Modula-2沒有塊語句。一個塊有如下形式：DeclsBEGINSEND這裡的codice_15是成序列的宣告，而codice_16是一個語句，經常是順序複合語句即成序列的語句，它是這個塊的執行部份。這裡的codice_15與codice_16在縮排上對齊，是因為在Pascal語言家族中，可能含有巢狀過程宣告的宣告序列的位置相較於ALGOL 60，從緊隨在關鍵字codice_19之後轉移到了緊靠在其前面。一個塊的宣告可以介入一個名字最多一次，然而一個名字可以在巢狀的塊中重新宣告。在塊中這些宣告的次序，除了確定變數的初始化次序之外無關緊要。一個Modula-3程式規定了一個計算，它作用在一序列的叫做地點的數字元件之上。變數是地點的一個集合，它依據這個變數的型別所確定的約定，表示一個數學上的。如果一個值可以由型別codice_7的某個變數來表示，則稱謂這個值是codice_7的一個成員，並且codice_7包含這個值。宣告為一個變數、型別、過程、或異常指定一個被稱為識別符號的作為名字。一個宣告應用於其上的程式區域，叫做這個宣告的作用域。作用域是可以巢狀的。一個識別符號的含義，由這個識別符號在其中宣告的最小的包圍作用域來確定。型別宣告有如下形式：，這裡的codice_7是一個識別符號，而codice_8是一個型別或型別表示式。在需要型別的各種地方，通常允許型別表示式。變數宣告有如下形式：，這裡的codice_25是一個識別符號，codice_7是除了開放陣列之外的一個非空型別，而codice_27是一個表示式。它聲明瞭codice_25是型別codice_7的一個變數，其初始值是codice_27的值。codice_31和codice_32任何一個都可省略，但二者不能都省略。如果省略了codice_7，它採用codice_27的型別。如果省略了codice_27，初始值是型別codice_7的任意值。如果二者都存在，codice_27必須可賦值給codice_7。初始值是一種簡寫，等價於在隨後的塊的可執行部份開始處插入賦值codice_39，如果多個變數有初始值，按它們宣告的次序插入它們的賦值。形式，是的簡寫。宣告有如下形式：，這裡的codice_25是一個識別符號，codice_7是一個型別，而codice_42是一個常量表達式。它宣告codice_25為具有型別codice_7和值codice_42的一個常量。codice_32可以省略，在這種情況下codice_25的型別是codice_42的型別。如果codice_7存在，則它必須包含codice_42。值與型別.Modula-3的型別系統使用，而非Modula-2的即型別構造子的每次出現產生一個新型別。在結構等價中，在如果兩個型別的定義在展開的時候，也就是在所有常量表達式都被替換為它們的值，並且所有型別名字都被替代為它們的定義的時候，變成相同的，則這兩個型別是相同的。在遞迴資料型別的情況下，這個展開是部份展開的無窮極限。有三種序數型別：列舉、子範圍和整數型別，預定義瞭如下序數型別：codice_51、codice_52、codice_53。整數和列舉元素合起來叫做序數值。序數值codice_58如果是整數或擴充套件精度整數，則codice_58的基礎型別分別是codice_51或codice_52，否則codice_58的基礎型別是包含它的那個唯一性的列舉型別。兩個序數如果有相同的值則二者相等。有三種浮點型別：codice_63、codice_64和codice_65，這些型別的屬性規定在對應的必要介面中。兩個浮點數如果定義它們的底層實現相同則二者相等。一個引用值要麼是codice_66，要麼是一個叫做所引用者的變數的地址。預定義瞭如下引用型別：codice_67，它包含所有的有跟蹤的引用，codice_68，它包含所有的無跟蹤的引用，和codice_69，它只包含codice_66。Modula-3支援在執行時間的資料分配。分配操作有如下形式：，這裡的codice_7是除了預定義的codice_67、codice_68或codice_69之外的引用型別。兩個引用如果定址相同的地點則二者相等。記錄是叫做這個記錄的欄位的命名變數的一個序列，記錄型別的宣告有如下形式：，在這裡的型別表示式中，codice_75是型別構造子，而它的實際引數是欄位宣告的一個列表codice_76，其中每個欄位都有如下形式：，這裡的欄位名字codice_77是一個識別符號，而欄位型別codice_78是除了開放陣列之外的非空型別，而欄位預設值codice_79是一個常量表達式。形式，是的簡寫。兩個記錄如果有相同的欄位，並且對應的欄位都相等則二者相等。在Modula-3中的物件，非常類似於Simula 67中的物件：它們總是引用，它們擁有資料欄位和方法二者，並且它們有著單一繼承而非多重繼承。預定義瞭如下物件型別：codice_80，它是沒有欄位或方法的有跟蹤的物件型別，和codice_81，它是沒有欄位或方法的無跟蹤的物件型別。是一個名字，它指示某個給定引用型別的未知子型別。預定義了兩個：codice_82和codice_83，它們分別表示文字串和互斥訊號量，它們的屬性分別規定於必要介面codice_84和codice_85之中。陣列是叫做這個陣列的元素的組成變數的有索引的蒐集。有兩種陣列型別，固定的和開放的。固定陣列的長度是在編譯時間確定的，開放陣列的長度是在執行時間分配確定的，這個長度此後不能改變。兩個陣列如果有相同的長度，並且對應的元素都相等則二者相等。包裝型別的變量出現在記錄、物件或陣列中，佔據指定數量的位元，並毗鄰於前導的欄位或元素緊壓打包。包裝型別的宣告有如下形式：，這裡的codice_86是一個基礎型別，而codice_87是整數取值的常量表達式。集合是取自某個序數型別的值的蒐集。集合型別宣告有如下形式：，這裡的基礎型別codice_86是一個序數型別。兩個集合如果有相同的元素則二者相等。不包含值的一個型別是空的，例如codice_89是一個空型別。空型別可以用來建造非空型別，比如codice_90。宣告一個空型別的一個變數是靜態錯誤。所有的都有一個唯一的型別，但是一個值可以是很多型別的一個成員，例如值codice_91是codice_92和codice_51二者的成員，因此論述“一個值的型別”將會是有歧義的。短語“codice_94的型別”，意味著“表示式codice_94的型別”；然而短語“codice_94是codice_7的成員”，意味著“codice_94的值是codice_7的成員”。但在有一種情況下，一個值可以稱為有著一個型別：所有的物件或有跟蹤的引用值，包括了一個型別程式碼，它叫做這個引用值的分配型別。分配型別透過codice_100語句來測試。語言規定提供了型別運算codice_101、codice_102和codice_103，分別返回變數codice_94或者型別codice_7的那些變數的位元數目、8位位元組的數目和可定址地點的數目。在所有情況下，codice_94必須是指定式，而codice_7必須不是開放陣列型別，指定式codice_94只在它的型別是開放陣列的時候求值。序數型別.列舉型別宣告有如下形式：，這裡的codice_25是各不相同的識別符號，型別codice_7是codice_87個值的有序集合，表示式codice_112指示這個型別在遞增次序下的第codice_113個值，空列舉codice_114是允許的。子範圍型別宣告有如下形式：，這裡的codice_115和codice_116是有相同的基礎型別的兩個序數值，codice_7的值是從codice_115到codice_116含二者所有的值，它們必須是常量表達式，如果codice_115超過codice_116，則子範圍是空的。每個不同的列舉型別介入新的一組值，而子範圍型別重複使用底層型別的值。例如：TYPET1 = {A, B, C};T2 = {A, B, C};U1 = [T1.A..T1.C];U2 = [T1.A..T2.C]; (* sic *)這裡的codice_122和codice_123是相同型別，因為它們有相同的展開定義。codice_124和codice_125也是相同的型別，因為codice_126。型別codice_122和codice_124卻是不同的，儘管它們包含相同的值，但是codice_122的展開定義是列舉，而codice_124的展開定義是子範圍。型別codice_131是第三個型別，它的值codice_132和codice_133無關於值codice_134和codice_135。語言規定提供了支援序數型別的一些型別運算：對於序數型別codice_7，codice_137返回在codice_7中元素的數目，codice_139返回codice_7的最小值，codice_141返回codice_7的最大值。codice_143將一個列舉的元素codice_144，轉換成表示它在列舉次序中所處位置的整數，如果元素的型別是列舉codice_7的子範圍，結果是元素在codice_7內的位置，而非在子範圍內。codice_147將表示在列舉型別codice_7中位置的整數codice_113，轉換成在這個列舉中此位置上的那個元素，如果codice_7是列舉型別的子範圍，結果是在源出列舉型別的位置codice_113上的元素，而非在子範圍內。如果codice_87是型別codice_7的一個整數，則有平凡的：codice_154。陣列型別.固定陣列型別宣告有如下形式：，這裡的索引型別codice_155是序數型別，而元素型別codice_156是除了開放陣列之外的任何型別。開放陣列型別宣告有如下形式：，這裡的元素型別codice_156是任何型別。陣列型別codice_7的值，是元素型別為codice_156的陣列；對於固定陣列型別，這個陣列的長度是索引型別codice_155的元素數目；對於開放陣列型別，這個陣列的長度是任意的；開放陣列的索引型別是codice_51子範圍codice_162，這裡的codice_87是這個陣列的長度。開放陣列型別只能用作形式引數的型別，引用型別的所引用者，另一個開放陣列的元素型別，或作為陣列構造子中的型別。多維陣列的形狀是它每一維的長度的序列。更精確的說，一個數組的形狀是它的長度跟隨著任何它的元素的形狀，非陣列的形狀是空序列。陣列如果有相同的型別和形狀，則它們是可賦值的。如果賦值的要麼麼目標是開放陣列，則需要執行時間檢查。形如的表示式，是的簡寫。如果codice_164有陣列型別codice_7，則codice_166指示codice_164的一個指定元素，它在陣列中的位置對應於codice_113在索引型別中位置。形如codice_169的表示式，是codice_170的簡寫。索引的解釋由一個數組的型別確定，而非它的值；陣列賦值改變陣列變數的值，而非它的型別。例如：VARa := ARRAY [1..3] OF REAL {1.0, 2.0, 3.0};b: ARRAY [-1..1] OF REAL := a;這裡在codice_164或codice_172做元素值變更之前，codice_173為codice_174，儘管codice_175而codice_176。可以使用codice_177，得到一個固定陣列型別的索引型別中的元素數目，使用codice_178和codice_179，分別得到一個固定陣列型別的索引型別的最小元素和最大元素。可以使用codice_180，得到一個數組的索引型別中的元素數目，使用codice_181和codice_182，分別得到一個數組的索引型別的最小元素和最大元素，在這種情況下，表示式codice_164只在它指示一個開放陣列的時候求值。引用型別.一個引用型別要麼是有跟蹤的要麼是無跟蹤的。當到已分配的一段儲存的所有的有跟蹤的引用都消失時，系統對這段儲存進行垃圾回收。有跟蹤的引用型別以如下形式來宣告：，這裡的codice_78是任何型別。codice_7的值是到型別codice_78的變數的有跟蹤的引用，codice_78叫做codice_7的所引用型別。無跟蹤的引用型別以如下形式來宣告：，這裡的codice_78是任何無跟蹤的型別。兩個引用型別如果都是有跟蹤的或都是無跟蹤的，那麼它們有相同的引用類。一個一般性的型別是有跟蹤型別的條件為，它是有跟蹤的引用型別，其任何欄位型別是有跟蹤型別的記錄型別，其元素型別是有跟蹤型別的陣列型別，或其底層未包裝型別是有跟蹤型別的包裝型別。在有跟蹤的和無跟蹤的二者情況下，關鍵字codice_190可選的可以前導上codice_191，這裡的codice_172是叫做銘牌的文字常量。銘牌用來區分原本上相同的型別，它們沒有其他語義效果。在一個程式中所有銘牌都必須是唯一性的。如果codice_193出現而codice_172缺席，系統自動的為codice_172提供一個唯一的值。分配操作返回codice_7的所引用型別的一個新分配的變數的地址，如果codice_7是物件型別，則返回到有配對的方法套件的一個新分配的資料記錄的引用。codice_198返回的引用不同於所有的現存引用。這個新引用的分配型別是codice_7。如果codice_7的所引用型別為空則是一個靜態錯誤。如果codice_7是到有codice_202個開放維度的陣列的引用，codice_203操作有如下形式：，這裡的這些codice_87是指定新陣列在它的前codice_202個維度上的長度的整數取值表示式。所有的物件型別和有跟蹤的引用型別都有一個關聯的整數程式碼。不同的型別有不同的程式碼。給一個型別的程式碼對程式的任何單一執行都是常量，但對不同的執行可以不同。型別運算codice_207，返回型別codice_7的這個程式碼，而codice_209，返回引用codice_210的分配型別的這個程式碼。如果codice_7是codice_67，或者不是物件型別或有跟蹤的引用型別，則是一個靜態錯誤。型別運算codice_213，測試codice_94是否為codice_7的成員，這裡的codice_7必須是物件型別或有跟蹤的引用型別，而codice_94必須可賦值給codice_7。表示式.規定產生一個值或變數的一個計算。所有的表示式都有一個靜態確定的型別，它包含這個表示式可以產生的所有的值。在語法上，一個表示式要麼是一個運算數，要麼是應用於自身也是表示式的實際引數的一個運算。運算數是識別符號、或型別。透過遞迴的求值一個運算的實際引數並應用這個運算，來求值一個表示式。實際引數的求值次序，對除了短路求值的codice_219和codice_220之外的所有運算都是未定義的。對一個過程的呼叫，在這個過程是返回一個結果的函式過程的時候，是稱為函式應用的一個表示式，這個表示式的型別是過程的結果型別。Modula-3語言規定提供了字首算術運算：codice_221、codice_222，中綴算術運算：codice_221、codice_222、codice_225、codice_226、codice_227、codice_228，數值函式運算：codice_229、codice_230、codice_231、codice_232、codice_233、codice_234、codice_235、codice_236，關係運算：codice_237、codice_238、 codice_239、codice_240、codice_241、codice_242，邏輯運算：codice_243、codice_244、codice_245，文字串接運算：codice_246，記憶體分配運算：codice_247，集合運算：並集codice_221、差集codice_222、交集codice_225、對稱差集codice_226和隸屬關係測試codice_252，它在序數codice_253是集合codice_254的元素的時候返回codice_174。表示式可建構自如下：、實數文字、和。集合、陣列和記錄有構造子表示式：表示式是一般性的表示式類的子集，所要求的限制使得可以靜態的求值這個表示式。在常量表達式中，除了codice_198、解引用、codice_285、codice_286、codice_287、codice_288、codice_289和codice_290之外的所有運算都是合法的，唯獨可運用的過程，是在提供無符號字運算的codice_291介面中的函式。變數在常量表達式中，只能作為給codice_292、codice_293、codice_294、codice_101、codice_102或codice_103的實際引數出現，並且這個變數必須不是開放陣列型別的。文字和頂層過程常量在常量表達式中是合法的。指定式.產生變數的表示式叫做指定式。常量表達式永遠不是指定式。指定式的型別是它產生的變數的型別。一個指定式依賴於上下文，可以指示要麼一個變數，要麼這個變數的值。比如，它作為賦值的左值時是變數，作為右值時是這個變數的值。一些指定式是隻讀的，它們不能用在可能改變這個變數的值的上下文中，並非只讀的指定式就是可寫的指定式。一個識別符號是可寫的指定式的條件為，它被宣告為變數，是codice_298或codice_299形式引數，codice_100或codice_301語句的區域性變數，或繫結到可寫指定式的codice_302區域性變數。一個識別符號是隻讀的指定式的條件為，它是codice_303形式引數，codice_304語句的區域性變數，或繫結到非指定式或只讀的指定式的codice_302區域性變數。只有如下運算可以產生指定式：子型別規則.使用codice_375指示codice_7是codice_8的子型別，也就是codice_8是codice_7的超型別。子型別規則是：如果codice_375，則型別codice_7的所有值，都是型別codice_8的值，反過來則不成立。對於序數型別codice_7和codice_8，codice_375的條件為，它們擁有相同的基礎型別，並且所有的codice_7的成員都是codice_8的成員。就是說序數型別上的子型別，反映了在值集合上的子集關係。對於陣列型別，一個數組型別codice_266是一個數組型別codice_389的子型別的條件為，它們有相同的最終元素型別，相同的維度數，並且對於每個維度，要麼二者都是開放的，要麼codice_266是固定的而codice_389是開放的，要麼它們都是固定的並有著相同的大小。對於過程型別，codice_375的條件為，它們除了形式引數名字、預設值和codice_393集合之外是相同的，並且codice_7的codice_393集合包含在codice_8的codice_393集合中。codice_66是所有的過程型別的一個成員。對於包裝型別，codice_399和codice_7有相同的值，也就是說：codice_401並且codice_402。對於集合型別，codice_403的條件是codice_404，就是說集合的子型別規則簡單的使用值集合規則。對於引用型別有：NULL  LAST(self.a^) THENWITH temp = NEW(REF ARRAY OF INTEGER, 2 * NUMBER(self.a^)) DOFOR i := 0 TO LAST(self.a^) DOtemp[i] := self.a[i]END;self.a := tempENDEND;self.a[self.n] := x;INC(self.n)END Push;PROCEDURE Pop(self: T): INTEGER =BEGINDEC(self.n);RETURN self.a[self.n]END Pop;BEGINEND IntegerStack.建立新堆疊在這裡的部份不透明型別實現下為：，在上述的不透明型別實現下為：。而壓入一個數在這裡的部份不透明型別實現下為：，在上述的不透明型別實現下為：。多執行緒.語言支援多執行緒和線上程間的同步。在執行時庫中有一個必要介面叫做codice_85，它支援採用分叉會合模型的多執行緒應用。這裡還預定義不透明型別codice_1004被用來同步多個執行緒，並保護共享資料免於具有可能損害或競爭條件的同時訪問。codice_1004是一個物件，因此可以從它派生其他物件。codice_1048語句有如下形式：，這裡的codice_16是一個語句，而codice_1050是一個表示式，它等價於：WITH m = mu DOThread.Acquire(m);TRY S FINALLY Thread.Release(m) ENDEND這裡的codice_355表示不出現在codice_16中的一個變數。codice_1048語句介入一個互斥鎖要鎖定的塊，並暗含著在程式碼執行軌跡離開這個塊時的解鎖它。不安全標記.某些功能被認為是不安全的，編譯器無法再保證結果是一致性的。在codice_1054或codice_1055前面加上字首關鍵字codice_1056，可用於告訴編譯器啟用語言的某些不安全的低階功能。例如，在codice_1056模組中，使用codice_290將整數的諸位元複製成浮點codice_63數，使用codice_1060釋放無跟蹤的記憶體。一個介面是內在安全的，如果在安全模組中使用這個介面，無法產生不核查的執行時間錯誤。如果匯出一個安全介面的所有的模組都是安全的，編譯器保證這個介面的內在安全性。如果匯出一個安全介面的任何模組是不安全的，就要程式設計者而非編譯器，去做這種保證了。安全介面匯入不安全介面，或安全模組匯入或匯出不安全介面，都是靜態錯誤。匯入不安全介面的編譯單元本身必定也是不安全的。對其他程式語言的影響.儘管Modula-3沒有獲得主流地位，DEC-SRC M3發行的某些部份做到了。可能最有影響的一部份是網路物件庫，它形成了Java包括了網路協議的最初的遠端方法呼叫標準轉移到基於IIOP的協議的時候才被放棄。Java關於遠端物件的垃圾收集的文件仍提及了Modula-3網路物件為其先驅性工作 。Python從Modula-3借鑑了模組系統、異常系統和關鍵字引數，Python的類機制受到C++和Modula-3的啟發。Nim利用了Modula-3的某些方面比如有跟蹤和無跟蹤的指標。