മോഡുല-3

**മോഡുല-3** എന്നത് മോഡുല-2+ എന്നറിയപ്പെടുന്ന മോഡുല-2(Modula-2) അപ്ഗ്രേഡ് ചെയ്ത പതിപ്പിനെ പിന്തുടരുന്ന ഒരു പ്രോഗ്രാമിംഗ് ഭാഷയാണ്. ഗവേഷണ വൃത്തങ്ങളിൽ സ്വാധീനം ചെലുത്തിയപ്പോൾ (ജാവ, സി#, പൈത്തൺ എന്നീ ഭാഷകളുടെ രൂപകൽപ്പനകളെ സ്വാധീനിക്കുന്നു) പക്ഷേ ഇത് വ്യവസായങ്ങളിൽ വ്യാപകമായി ഉപയോഗിക്കപ്പെടുന്നില്ല. ലൂക്കാ കാർഡല്ലി, ജെയിംസ് ഡൊണഹ്യൂ, ലൂസിലി ഗ്ലാസ്മാൻ, മിസ്റ്റർ ജോർദൻ (ഒലിവ്ട്ടി സോഫ്റ്റ്‌വേർ ടെക്നോളജി ലബോറട്ടറിയിൽ മുൻപ്), ഡിജിറ്റൽ എക്പ്സ് കോർപ്പറേഷൻ (ഡി.ഇ.സി) സിസ്റ്റംസ് റിസേർച്ച് സെൻറർ (എസ്ആർസി), ഒലിവ്ട്ടി റിസർച്ച് സെൻറർ (ഒ ആർ സി), ബിൽ കൽസോവ്, ഗ്രെഗ് നെൽസൻ എന്നിവർ ചേർന്ന് 1980 കളിൽ തുടക്കമിട്ടു.

സിസ്റ്റംസ്-പ്രോഗ്രാമിങ് ഭാഷയുടെ കരുത്ത് നിലനിർത്തുമ്പോൾ, മൊഡുല-3 യുടെ പ്രധാന സവിശേഷതകൾ ലളിതവും സുരക്ഷിതത്വവുമാണ്. ടൈപ്പ് സുരക്ഷയുടെ പാസ്കൽ പാരമ്പര്യം നിലനിർത്താൻ മോഡുല-3 ലക്ഷ്യംവച്ച്, പ്രായോഗികമായ യഥാർത്ഥ പ്രോഗ്രാമിംഗിനുള്ള പുതിയ നിർമ്മാണങ്ങൾ അവതരിപ്പിക്കുന്നു. ജനറിക് പ്രോഗ്രാമിങ് (ടെംപ്ലേറ്റുകൾക്ക് സമാനമായ), പ്രത്യേകിച്ച് മൊഡുല-3 യുടെ പിന്തുണയിൽ മൾട്ടിത്രെഡിംഗ്(multithreading), ഒഴിവാക്കൽ കൈകാര്യം ചെയ്യൽ, ഗാർബേജ് ശേഖരണം, ഒബ്ജക്റ്റ് ഓറിയെൻറഡ് പ്രോഗ്രാമിങ്, ഭാഗികമായി വെളിപ്പെടൽ, സുരക്ഷിതമല്ലാത്ത കോഡിൻറെ സ്പഷ്ടമായ അടയാളം എന്നിവയാണ്. മോഡുല 3 യുടെ ഡിസൈൻ ലക്ഷ്യം ആധുനികമായ, ആധികാരിക ഭാഷകളുടെ ഏറ്റവും പ്രധാനപ്പെട്ട സവിശേഷതകളെ വളരെ അടിസ്ഥാനപരമായ രൂപങ്ങളിൽ നടപ്പിലാക്കുന്ന ഭാഷയാണ്. അപകടകരമായതും സങ്കീർണവുമായ നിരവധി സവിശേഷതകളുള്ള, മൾട്ടിപ്പിൾ ഇൻഹെറിറ്റൻസ്, ഓപ്പറേറ്റർ ഓവർലോഡിംഗും പോലുള്ളവ ഒഴിവാക്കി.
## ചരിത്രപരമായ വികസനം
1986 നവംബറിൽ മൊഡുല-3 പ്രോജക്ട് ആരംഭിച്ചു. മോഡുലയുടെ ഒരു പുതിയ പതിപ്പിന് വേണ്ടിയുളള ചില ആശയങ്ങളുമായാണ് നിക്കോളസ് വിർത്ത് മൗറീസ് വിൽക്കെസിന് എഴുതിയത്. വിൽക്സ് ഡി.ഇ.സിക്കു വേണ്ടി പ്രവർത്തിച്ചുവെങ്കിലും, ഇംഗ്ലണ്ടിൽ മടങ്ങിയെത്തിയപ്പോൾ ഒലിവറ്റിന്റെ റിസർച്ച് സ്ട്രാറ്റജി ബോർഡിൽ ചേർന്നു. വിർക് ഒബറോണിലേക്ക് ഇതിനകം മാറിയിരുന്നു, മോഡുല നാമത്തിൻറെ കീഴിൽ വിൽകസിന്റെ സംഘം വികസിപ്പിക്കൽ തുടരുന്നു.1988 ആഗസ്റ്റിൽ ഭാഷാ നിർവ്വചനം പൂർത്തിയായി. 1989 ജനുവരിയിൽ പുതുക്കിയ പതിപ്പായിരുന്നു ഉപയോഗിച്ചിരുന്നത്. ഡി.ഇ.സി(DEC) യുടെ കമ്പൈലറുകളെ ഒലിവേട്ടി ഉടൻതന്നെ പിന്തുടർന്നു, അതിനു ശേഷം മൂന്നാം കക്ഷി ഇപ്ലിമെന്റേഷൻസ് നടപ്പിലാക്കി. 

എസ്.ആർ.സിയുടെയും എക്രോൺ കംപ്യൂട്ടർ റിസേർച്ച് സെൻററിൻറെയും ഉപയോഗത്തിൽ Modula-2+ (ആർസി, പിന്നീട് ORC ഒലിവ്ട്ടി ഏക്കോൺ വാങ്ങിയപ്പോൾ) അക്കാലത്ത്, ഡി.സി. ഫയർഫ്ലൈ, മൾട്ടിപ്രോസസർ വാക്സ് (VAX) വർക്ക്സ്റ്റേഷൻ എന്ന ഓപ്പറേറ്റിങ് സിസ്റ്റം എഴുതിയ ഭാഷ, ഏക്രോൺ സിക്ക് വേണ്ടി എക്രോൺ കംപൈലർ എആർഎസിൽ എക്രോൺ ആർക്കിമെഡസ് എന്ന കമ്പ്യൂട്ടർ ശ്രേണിയിലെ ആർക്സ്(ARX) ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം പ്രോജക്ടിനായി ആർക്കി(ARC)ൽ മൊഡ്യുൾ എക്സിക്യൂഷൻ ലൈബ്രറി (കാമൽ) എഴുതി. പരിഷ്കരിച്ച മോഡുല-3 റിപ്പോർട്ട് പ്രസ്താവന പ്രകാരം മെസോ, സെഡാർ, ഒബ്ജക്റ്റ് പാസ്കൽ, ഒബറോൺ, യൂക്ലിഡ് മുതലായ മറ്റു ഭാഷകളും ഈ ഭാഷയെ സ്വാധീനിച്ചു.

1990-കളിൽ, മോഡുല-3 പഠനഭാഷയായി ഗണ്യമായ തുക നേടിക്കൊടുത്തു. എന്നാൽ അത് വ്യാവസായിക ആവശ്യങ്ങൾക്ക് വ്യാപകമായി ഉപയോഗിച്ചില്ല. മോഡുല-3 യുടെ പിന്തുണയോടു കൂടി ഇതിലേക്ക് സംഭാവന നൽകുന്നത് ഡി.ഇ.സി. യുടെ അവസാനം കുറിക്കുകയാകാം(പ്രത്യേകിച്ച് ഡി.ഇ.സി കോംപാകിന് 1998-ൽ വിൽക്കുന്നതിനുമുമ്പ് ഇത് ഫലപ്രദമായി അറ്റകുറ്റപണി ചെയ്തില്ല). ഏത് സാഹചര്യത്തിലും, മോഡുല-3 യ്ക്ക് ലാളിത്യവും ശക്തിയും ഉണ്ടെങ്കിലും, ഒബ്ജക്റ്റ് ഓറിയെന്റഡ് പ്രോഗ്രാമിങ്ങിന്റെ നിയന്ത്രിത നിർവ്വഹണത്തോടുകൂടിയ ഒരു പ്രൊസീഡറൽ സംഗ്രഹിതഭാഷയ്ക്ക് ചെറിയ ആവശ്യം ഉണ്ടായിരുന്നതായി കാണുന്നു. ഒരു സമയം, സിംഎം3(CM3) എന്ന പേരിൽ ഒരു വാണിജ്യ കമ്പൈലർ കൈകാര്യം ചെയ്തു. ഡിസിക്ക് എസ്ആർസിയിൽ മുൻപുള്ള പ്രധാന നിർവ്വാഹക രിൽ ഒരാൾ പരിപാലിക്കുന്നത് വേണ്ടി ഡി.ഇ.സിയെ കോമ്പാക്കിന് വിൽക്കുന്നതിനുമുമ്പ് അയാൾ വാടകയ്ക്കെടുത്തിരുന്നു, റിയാക്ടർ എന്ന ഒരു സംയോജിത വികസന പരിതഃസ്ഥിതിയും എക്സ്റ്റെൻസിബിൾ ജാവ വെർച്വൽ മെഷിൻ (ബൈനറി, സ്രോതസ്സുകളുടെ ഫോർമാറ്റുകളിലും ലൈസൻസുള്ളതും റിയാക്റ്റർ ഉപയോഗിച്ച് നിർമ്മിക്കാൻ കഴിയുന്നതുമാണ്), ക്രിട്ടിക്കൽ മാസ്, ഇൻക്, എന്നാൽ 2000 ൽ ആ കമ്പനി  പ്രവർത്തനം നിർത്തി, എൽഗോ സോഫ്റ്റ്‌വേർ സൊല്യൂഷൻസ് GmbH- യ്ക്ക് അതിന്റെ ഉൽപ്പന്നങ്ങളുടെ ഉറവിടങ്ങൾ നൽകി. യൂണിവേഴ്സിറ്റിയിൽ പ്രോഗ്രാമിങ് ഭാഷാ കോഴ്സുകളിൽ താരതമ്യേന പാഠ്യപദ്ധതി ഇപ്പോൾ പഠിപ്പിക്കുന്നുണ്ട്, അതിന്റെ പാഠപുസ്തകങ്ങൾ അച്ചടിക്കുന്നില്ല. അടിസ്ഥാനപരമായി മോഡുലർ 3 ന്റെ ഏക കോർപ്പറേറ്റ് പിന്തുണക്കാരൻ എൽഗോ സോഫ്റ്റ്‌വേർ സൊല്യൂഷൻസ് GmbH ആണ്,  ഇത് ക്രിട്ടിക്കൽ മാസ്സിന്റെ ഉറവിടങ്ങളിൽ നിന്ന് പാരമ്പര്യമായി കൈമാറ്റം ചെയ്യപ്പെടുകയും, അവയിൽ നിന്നും സിംഎം3 (CM3) സംവിധാനത്തിന്റെ സ്രോതസ്സും ബൈനറി രൂപവും പുറത്തിറക്കിയിട്ടുണ്ട്. റിയാക്റ്റർ ഐഡിഇ(IDE)യ്ക്ക് നിരവധി വർഷങ്ങൾക്ക് ശേഷം ഓപ്പൺ സോഴ്സ് റിലീസ് ചെയ്തു, അതിന്റെ പുതിയ പേര് സിഎം3-ഐഡിഇ(CM3-IDE). 2002 മാർച്ചിൽ എൽഗോ മറ്റൊരു സജീവ മോഡുല-3 വിതരണത്തിന്റെ റിപ്പോസിറ്ററിയും ഏറ്റെടുത്തു, എകോളെ പോളിടെക്കനിക് ഡെ മോൺട്രിയൽ( École Polytechnique de Montréal) ആണ് പിഎം3(PM3) പരിപാലിച്ചുപോന്നത്, എന്നാൽ പിന്നീട് എച്ച്എം3(HM3)യിൽ തുടർന്നുവന്ന പ്രവർത്തനങ്ങൾ പിന്നീട് കാലഹരണപ്പെട്ടു.
## വാക്യഘടന
ഭാഷയുടെ വാക്യഘടനയുടെ ഒരു പൊതു ഉദാഹരണമാണ് ഹലോ വേൾഡ് പ്രോഗ്രാം.

```modula3
MODULE Main; 
 IMPORT IO;
 BEGIN
   IO.Put("Hello World\n")
 END Main.
```

മോഡുല-3 യിലെ എല്ലാ പ്രോഗ്രാമുകളും ചുരുങ്ങിയത് ഒരു മൊഡ്യൂൾ ഫയലുകളാണെങ്കിലും, മിക്ക ഘടകങ്ങളും മൊഡ്യൂളിൽ നിന്ന് ഡാറ്റാ ആക്സസ് ചെയ്യുന്നതിന് ക്ലയന്റുകൾ ഉപയോഗിക്കുന്ന ഒരു ഇന്റർഫേസ് ഫയൽ ഉൾക്കൊള്ളുന്നു. മറ്റ് ഭാഷകളെ പോലെ മോഡുല-3 പ്രോഗ്രാമിൽ പ്രധാന മൊഡ്യൂൾ എക്സ്പോർട്ട് ചെയ്യണം,  അതിന് Main.m3 എന്ന ഫയൽ, അല്ലെങ്കിൽ `EXPORT` ഫയൽ വഴി വിളിക്കാം.

```modula3
MODULE Foo EXPORTS Main
```

മൊഡ്യൂൾ ഫയൽ നാമങ്ങൾ യഥാർത്ഥ മൊഡ്യൂൾ നാമം പോലെ തന്നെ നിർദ്ദേശിക്കപ്പെട്ടിരിക്കുന്നു, പക്ഷേ, അവ വ്യത്യസ്തമാണെങ്കിൽ കമ്പൈലർ നിങ്ങൾക്ക് മുന്നറിയിപ്പ് നൽകും. സിന്റാക്സിലെ മറ്റ് കൺവെൻഷനുകൾ, ഒരു ഇന്റർഫെയിസ് `T` എക്സ്പോർട്ട് ചെയ്തതിന്റെ പേരു് നൽകി, അവയുടെ മുഴനീള നാമങ്ങൾ സാധാരണയായി യോഗ്യതയുള്ളതാണ്,  അതിനാൽ ഫൂ എന്ന ഒരു മൊഡ്യൂളിൽ ചെയ്യുന്ന ടൈപ്പിന് ` Foo.T` എന്ന് നൽകും. സമാനമായ മറ്റൊരു കൺവെൻഷൻ പബ്ലിക്ക് ഒബജക്ടിനെ സൂചിപ്പിക്കുന്നതിനാണ് മുകളിൽ ഊപ്പ് (OOP) ഉദാഹരണങ്ങളിൽ `public` നൽകിയിരിക്കുന്നത്.
## ഭാഷാ സവിശേഷതകൾ
### മോഡുലറിറ്റി
ഒന്നാമതായി, എല്ലാ സമാഹാര യൂണിറ്റുകളും ഒന്നുകിൽ `INTERFACE` അല്ലെങ്കിൽ നടപ്പിലാക്കുന്ന `MODULE`s, ഒരു ഫ്ലേവറോ അല്ലെങ്കിൽ മറ്റൊന്നോ ആണ്. `INTERFACE` എന്ന കീവേഡിനൊപ്പം ഒരു ആമുഖ സമാഹാര യൂണിറ്റ്, കോൺടെന്ററുകൾ, തരങ്ങൾ, വേരിയബിളുകൾ, ഒഴിവാക്കലുകൾ, നടപടിക്രമങ്ങൾ എന്നിവ നിർവ്വചിക്കുന്നു. കീവേഡ് `MODULE` ഉപയോഗിച്ച് ആരംഭിക്കുന്ന നടപ്പിലാക്കൽ ഘടകം, ഇന്റർഫേസ് നടപ്പിലാക്കാൻ ആവശ്യമായ യഥാർത്ഥ കോഡ്, കൂടുതൽ സ്ഥിരാങ്കങ്ങൾ, തരങ്ങൾ അല്ലെങ്കിൽ വേരിയബിളുകൾ നൽകുന്നു. ഡിഫാൾട്ട് ആയി ഒരു ഇംപ്ലിമെൻറ് ഘടകം ഇതേ പേരിലുള്ള ഇന്റർഫെയിസ് നടപ്പിലാക്കും, പക്ഷേ ഒരു മൊഡ്യൂൾ അതേ പേരിൽ `EXPORT` ലേക്ക് നൽകാനാവില്ല. ഉദാഹരണത്തിനു് പ്രധാന ഇന്റർഫെയിസിനുള്ള ഒരു പ്രധാന പ്രോഗ്രാം ഇംമ്പ്ലിമെന്റേഷൻ മോഡൂൾ എക്സ്പോർട്ട് ചെയ്യുന്നു.

```modula3
MODULE HelloWorld EXPORTS Main; 
 IMPORT IO;
 BEGIN
   IO.Put("Hello World\n")
 END HelloWorld.
```

ഏതെങ്കിലും സമാഹാര യൂണിറ്റ് `IMPORT`ലേക്ക് മറ്റ് ഇന്റർഫേസുകൾക്ക് മുൻഗണന നൽകും, സർക്കുലർ ഇംപോർട്ട്  നിരോധിച്ചിട്ടുണ്ട്. ഇംപ്ലിമെൻറ് `MODULE` ൽ നിന്ന് ഇറക്കുമതി ചെയ്തുകൊണ്ട് ഇത് പരിഹരിക്കപ്പെടാം. ഇറക്കുമതി ചെയ്ത മൊഡ്യൂളിലെ എന്റിറ്റികൾ, മൊഡ്യൂൾ പേരിന് പകരം, മൊഡ്യൂൾ `IMPORT` ഇനം ഉപയോഗിച്ചു [, ഇനം] * സിന്റാക്സ്:

```modula3
MODULE HelloWorld EXPORTS Main; 
 FROM IO IMPORT Put;
 BEGIN
   Put("Hello World\n")
 END HelloWorld.
```

സാധാരണ, ഒരു ഇന്റർഫേസ് മാത്രമേ ഇറക്കുമതിചെയ്യുന്നുള്ളൂ, ഒപ്പം ഇന്റർഫേസിലെ ഇനങ്ങൾ ആക്സസ് ചെയ്യാൻ 'ഡോട്ട്' നോട്ടേഷൻ ഉപയോഗിക്കുന്നു (റെക്കോർഡിനുള്ളിൽ ഫീൽഡുകൾ ആക്സസ് ചെയ്യുന്നതിന് സമാനമാണ്). ഏതെങ്കിലും പിന്തുണാ പ്രക്രിയകൾക്കൊപ്പം ഒരു ഇന്റർഫെയിസ് ഓരോ ഡാറ്റാ ഘടനയും (റെക്കോഡ് അല്ലെങ്കിൽ ഒബ്ജക്റ്റ്) നിർവചിക്കുകയാണ് സാധാരണ ഉപയോഗം. ഇവിടെ പ്രധാന തരം 'T' എന്ന പേരിൽ ലഭിക്കും, `myModule.T` ഉപയോഗിക്കുന്നു. 

മൊഡ്യൂളിനുളളിൽ ഇറക്കുമതി ചെയ്യുന്ന ഘടകംക്കും മറ്റ് എന്റിറ്റികൾക്കും ഇടയിൽ ഒരു നെയിം കോളീഷൻ ഉണ്ടാകുകയാണെങ്കിൽ,  കരുതൽ വാക്കായി `AS` എന്നായിരിയ്ക്കണം, ഉദാഹരണത്തിന് `IMPORT CollidingModule AS X;`
## സുരക്ഷിതമല്ലാത്തതും സുരക്ഷിതമായതും
ചില വിശേഷത സുരക്ഷിതമല്ലാത്തതായി കരുതപ്പെടുന്നു, അവിടെ കമ്പൈലർക്ക് തുടർന്നും ഫലമുണ്ടാവില്ല (ഉദാഹരണമായി, സി പ്രോഗ്രാമിങ് ഭാഷയിലേക്ക് ഇടപഴകുമ്പോൾ). `INTERFACE` അല്ലെങ്കിൽ`MODULE` എന്നതിന് മുമ്പുള്ള `UNSAFE` കീവേഡ്, ഭാഷയുടെ ചില നിമ്ന തല സവിശേഷതകൾ പ്രാപ്തമാക്കുന്നതിന് കംപൈലർ ഉപയോഗിച്ചേക്കാം. ഉദാഹരണത്തിന്, ഒരു സുരക്ഷിതമല്ലാത്ത ബിറ്റ്, ഒരു ഫ്ലോട്ടിംഗ് പോയിന്റ് `REAL` നമ്പറിലേക്ക് ഒരു ഇൻസൈറ്റിന്റെ ബിറ്റുകൾ പകർത്താൻ `LOOPHOLE` ഉപയോഗിച്ച് ഒരു സുരക്ഷിതമല്ലാത്ത പ്രവർത്തനം മറികടക്കുന്ന      താണ്. 

സുരക്ഷിതമല്ലാത്ത ഒരു മൊഡ്യൂൾ ഇറക്കുമതി ചെയ്യുന്ന ഒരു ഇന്റർഫേസ് തന്നെ സുരക്ഷിതമല്ലാത്തതായിരിക്കും. സുരക്ഷിതമായ ഇന്റർഫേസ് സുരക്ഷിതമല്ലാത്ത ഒരു നിർവ്വഹണ ഘടകം വഴി എക്സ്പോർട്ടുചെയ്യാം. ബാഹ്യ ലൈബ്രറികളിലേക്ക് ഇന്റർഫേസ് ചെയ്തപ്പോൾ, സാധാരണയായി ഉപയോഗിക്കുന്നത് രണ്ട് ഇൻറർഫേസുകൾ (ഒന്ന് സുരക്ഷിതമല്ലാത്തത്, മറ്റൊന്ന് സുരക്ഷിതം).
## ജനറിക്സ്
ഒരു സാധാരണ ഇന്റർഫെയിസും അതിനനുസരിച്ചുള്ള ജെനറിക്കൽ ഘടകവും,`GENERIC`ഉള്ള`INTERFACE`അല്ലെങ്കിൽ`MODULE` കീവേർഡ് പ്രിഫിക്സ്, കൂടാതെ ഫോർമൽ ആർഗ്യുമെന്റുകൾ മറ്റ് ഇൻറർഫേസുകളായി എടുക്കുകയും ചെയ്യുക. അതിനാൽ (സി ++ ടെംപ്ലേറ്റുകൾ പോലെ) അമൂർത്തമായ ഡാറ്റാ തരം എളുപ്പത്തിൽ നിർവചിക്കുകയും ഉപയോഗിക്കുകയും ചെയ്യാം. എന്നാൽ സി ++ ൽ നിന്ന് വ്യത്യസ്തമായി ഗ്രാനുലാരിറ്റി മോഡുൾ ലെവലാണ്. ഒരു ഇന്റർഫെയിസ് സാധാരണ ആർഗ്യുമെന്റായി സാധാരണ ഇന്റർഫെയിസ്, നടപ്പിലാക്കൽ മൊഡ്യൂളുകൾക്ക് കൈമാറുന്നു, കൂടാതെ കമ്പൈലർ കോൺക്രീറ്റ് മോഡ്യൂളുകൾ സൃഷ്ടിക്കും. 

ഉദാഹരണത്തിനു്, ജനറിക് സ്റ്റാക്ക്(GenericStack )നിഷ്കർഷിയ്ക്കാനും, `IntegerElem` പോലുള്ള ഇൻറർഫെയിസുകളുമായി ഇതു് ഇൻസ്റ്റാന്റിനേറ്റ്(instantiate) ചെയ്യാം. അല്ലെങ്കിൽ `RealElem` ‌അല്ലെങ്കിൽ ഒബ്ജക്റ്റുകളിൽ  ഓരോ ഇന്റർഫെയിസുകളും, ജനറിക് മൊഡ്യൂളുകൾ ആവശ്യപ്പെടുന്ന വസ്തുക്കളെ നിർവചിക്കുന്നു.  ശ്രദ്ധിക്കുക: അവർ `INTEGER`, അല്ലെങ്കിൽ `REAL` ഉപയോഗിക്കാൻ കഴിയില്ല, കാരണം അത് മൊഡ്യൂളുകൾ അല്ലാത്തതിനാൽ, ആർഗുമെന്റിനെ അടിസ്ഥാനമാക്കിയുള്ള മൊഡ്യൂളുകൾ ഉപയോഗിക്കുന്ന ജനറിക് സിസ്റ്റം ആണ്. താരതമ്യേന, ഒരു സി ++ ടെംപ്ലേറ്റിൽ, സ്‌പഷ്‌ടമായി മാത്രം ഉപയോഗിക്കേണ്ടതാണ്.

**FILE: IntegerElem.i3**


```modula3
INTERFACE IntegerElem;
 CONST Name = "Integer";
 TYPE T = INTEGER;
 PROCEDURE Format(x: T): TEXT;
 PROCEDURE Scan(txt: TEXT; VAR x: T): BOOLEAN;
 END IntegerElem.
```


**FILE: GenericStack.ig**


```modula3
GENERIC INTERFACE GenericStack(Element);
 (* Here Element.T is the type to be stored in the generic stack. *)
 TYPE
    T = Public OBJECT;
    Public = OBJECT
    METHODS
        init(): TStack;
        format(): TEXT;
        isEmpty(): BOOLEAN;
        count(): INTEGER;
        push(elm: Element.T);
        pop(VAR elem: Element.T): BOOLEAN;
    END;
 END GenericStack.
```


**FILE: GenericStack.mg**


```modula3
GENERIC MODULE GenericStack(Element);
 < ... generic implementation details... >
 PROCEDURE Format(self: T): TEXT =
 VAR
    str: TEXT;
 BEGIN
    str := Element.Name & "Stack{";
    FOR k := 0 TO self.n -1 DO
        IF k > 0 THEN str := str & ", "; END;
            str := str & Element.Format(self.arr[k]);
    END;
    str := str & "};";
    RETURN str;
 END Format;
 < ... more generic implementation details... >
 END GenericStack.
```


**FILE: IntegerStack.i3**


```modula3
INTERFACE IntegerStack = GenericStack(IntegerElem) END IntegerStack.
```


**FILE: IntegerStack.m3**


```modula3
MODULE IntegerStack = GenericStack(IntegerElem) END IntegerStack.
```

## കണ്ടെത്താനുള്ള കഴിവ്
മറ്റ് ഭാഷകളിലെ 'ഉൾപ്പെടുത്തൽ' സവിശേഷതകളിൽ നിന്ന് വ്യത്യസ്തമായി ഏത് ഐഡന്റിഫയർ ആണെന്നും അത് എവിടെയാണ് ഉത്ഭവിച്ചതെന്ന് കണ്ടെത്താനാവും. ഒരു കമ്പൈലേഷൻ യൂണിറ്റ് ഒരു `IMPORT` സ്റ്റേറ്റ്മെന്റ് ഉപയോഗിച്ച് മറ്റ് കംമ്പൈലേഷൻ വിഭാഗങ്ങളിൽ നിന്നുള്ള ഐഡന്റിഫയറുകൾ ഇറക്കുമതിചെയ്യണം. ഒരു റെക്കോർഡിലെ ഒരു ഫീൽഡ് ആക്സസ് ചെയ്യുമ്പോൾ ഉപയോഗിച്ചിരിക്കുന്ന അതേ 'ഡോട്ട്' നോട്ടേഷൻ പോലും ഗണനത്തിന് ഉപയോഗപ്പെടുത്തുന്നു.

```modula3
INTERFACE A;

TYPE Color = {Black, Brown, Red, Orange, Yellow, Green, Blue, Violet, Gray, White};

END A;
```


```modula3
MODULE B;

IMPORT A;
FROM A IMPORT Color;

VAR
  aColor: A.Color;  (* Uses the module name as a prefix *)
  theColor: Color;  (* Does not have the module name as a prefix *)
  anotherColor: A.Color;

BEGIN
  aColor := A.Color.Brown;
  theColor := Color.Red;
  anotherColor := Color.Orange;  (* Can't simply use Orange *)
END B.
```

## ഡൈനാമിക് പ്രോഗ്രാമിംഗ്
റൺടൈമിൽ ഡാറ്റ അനുവദിക്കുന്നതിനെ മോഡുല-3 പിന്തുണയ്ക്കുന്നു. `TRACED`, `UNTRACED` എന്നിവയ്ക്ക് അനുവദിച്ചിരിക്കുന്ന രണ്ട് തരത്തിലുള്ള മെമ്മറി ഉണ്ട്. ഗാർബേജ് കളക്ടർക്ക്(പ്രോസസ് ചെയ്യുമ്പോൾ മെമ്മറിയിൽ താൽക്കാലികമായി സൂക്ഷിച്ചിരിക്കുന്ന അനാവശ്യ ഡാറ്റ നീക്കം ചെയ്യുന്ന ഒരു പ്രോഗ്രാം.) ഇത് കാണാൻ കഴിയുമോ ഇല്ലയോ എന്ന വ്യത്യാസം ഉണ്ട്. ഈ ക്ലാസ് മെമ്മറിയിൽ ഒന്നിന്റെ ഡാറ്റ അനുവദിക്കുന്നതിനായി `NEW ()` ഉപയോഗിക്കുന്നു. `UNSAFE` മൊഡ്യൂളിലെ, `DISPOSE`  കണ്ടെത്താൻ കഴിയാത്ത സ്വതന്ത്ര മെമ്മറിയിൽ ലഭ്യമാണ്.
## ഒബ്ജക്റ്റ് ഓറിയെന്റഡ്
മോഡുല-3 യിൽ ഒബ്ജക്റ്റ് ഓറിയെന്റഡ് പ്രോഗ്രാമിംഗ് ടെക്നിക്കുകൾ ഉപയോഗിക്കാവുന്നതാണ്, എന്നാൽ അവയുടെ ഉപയോഗം ആവശ്യമില്ല. മോഡുല-3 (മൊഡ്യൂളുകൾ, ജനറിക്സുകൾ) യിൽ നൽകിയിരിക്കുന്ന മറ്റു പല സവിശേഷതകളും സാധാരണയായി ഒബ്ജക്റ്റ് ഓറിയന്റേഷന്റെ കഴിവു നേടാം. 

ഒബ്ജക്റ്റ് പിന്തുണ മനഃപൂർവ്വം അതിന്റെ ഏറ്റവും ലളിതമായ രീതിയിൽ സൂക്ഷിച്ചിരിക്കുന്നു. `OBJECT` പ്രഖ്യാപനത്തിലൂടെ ഒരു വസ്തു തരം (മറ്റ് ഒബ്ജക്റ്റ് ഓറിയെന്റഡ് ഭാഷകളിൽ  "ക്ലാസ്" എന്നു പറയുന്നു) പ്രത്യേകിച്ച് ഒരു `RECORD` ഡിക്ലറേഷൻ അതേ സിന്റാക്സ് ഉണ്ട്, ഒരു വസ്തു തരം ഒരു റഫറൻസ് തരം ആണെങ്കിലും, Modula-3 യിലെ `RECORD`  ഡുകൾ (സി ഭാഷയിലെ സ്ട്രറ്റ് പോലെയുള്ളവ) അല്ല. എക്സറ്റഡ് തരങ്ങൾ സാധാരണയായി ടി എന്ന് കൺവെൻഷൻ വഴിയാണ് സൂചിപ്പിക്കുന്നത്, കൂടാതെ രീതികളും ഡാറ്റയും വെളിപ്പെടുത്തുന്നതിന് ഒരു പ്രത്യേക "പൊതു" തരം സൃഷ്ടിക്കുക. ഉദാഹരണത്തിന്:

```modula3
INTERFACE Person;

TYPE T <: Public;
  Public = OBJECT 
  METHODS
    getAge(): INTEGER;
    init(name: TEXT; age: INTEGER): T;
  END;

END Person.
```

ഇത് രണ്ട് തരങ്ങൾ, `T`, `PUBLIC`, എന്നിവ ഉപയോഗിച്ച് ഒരു ഇന്റർഫേസ് `Person` നിർവചിക്കുന്നു, അത് രണ്ട് രീതികളുള്ള getAge (), init () എന്നീ ഒബ്ജക്റ്റുകളെ നിർവചിച്ചിരിക്കുന്നു. `<:` ഓപ്പറേറ്റർ ഉപയോഗിക്കുമ്പോൾ, പൊതു ഉപയോഗത്തിന്റെ ഉപഘടകമായാണ് `T` വരുന്നത്.

ഒരു പുതിയ `Person.T` എന്ന വസ്തു സൃഷ്ടിക്കുന്നതിന്, നമ്മൾ നിർമ്മിച്ച `NEW` എന്ന കോഡ്  `init ()`മെത്തേഡിലാണ് ഉപയോഗിക്കുന്നത്.

```modula3
VAR jim := NEW(Person.T).init("Jim", 25);
```

Modula-3 യുടെ `REVEAL`ഘടന ക്ലയന്റുകളിൽ നിന്ന് നിർദ്ദിഷ്ട വിശദാംശങ്ങൾ ഒളിപ്പിച്ചു വച്ച ആശയം ലളിതവും ശുദ്ധിയുള്ള വളരെ ശക്തമായ സംവിധാനം നൽകുന്നു, സ്വമേധയാ പല തലത്തിലുള്ള "മൈത്രി" നിലനിർത്തുന്നു. മുകളിൽ ഉള്ള ഉദാഹരണത്തിൽ വ്യക്തിയുടെ ഇൻറർഫേസ് പൂർണ്ണമായി നടപ്പിലാക്കാൻ ഞങ്ങൾ `REVEAL`ഉപയോഗിക്കുന്നു.

```modula3
MODULE Person;

REVEAL T = Public BRANDED 
OBJECT 
  name: TEXT;   (* These two variables *)
  age: INTEGER; (* are private. *)
OVERRIDES
  getAge := Age;
  init := Init;
END;

PROCEDURE Age(self: T): INTEGER =
  BEGIN
    RETURN self.age;
  END Age;

PROCEDURE Init(self: T; name: TEXT; age: INTEGER): T =
  BEGIN
    self.name := name;
    self.age := age;
  RETURN self;
  END Init;

BEGIN
END Person.
```

`BRANDED` കീവേഡിന്റെ ഉപയോഗം ശ്രദ്ധിക്കുക. "ബ്രാൻഡുകൾ" ആയ ഒബ്ജക്റ്റുകളെ ഘടനാപരമായ സമത്വം ഒഴിവാക്കാനായി അവയെ സവിശേഷമാക്കാൻ കഴിയുന്നതാണ്. `BRANDED` ഒരു സ്ട്രിംഗിനെ ഒരു ആർഗുമെന്റ് എടുത്തേക്കാം, എന്നാൽ ഒഴിവാക്കുമ്പോൾ, നിങ്ങൾക്കായി ഒരു അദ്വിതീയ സ്ട്രിംഗ് സൃഷ്ടിക്കപ്പെടും. 

ഒരു മൊഡ്യൂളിൽ നിന്ന് കർശനമായി യോഗ്യത നേടിയ, ബാഹ്യ ആവലംബങ്ങൾ ആവശ്യമുള്ള കുറച്ച് പ്രോഗ്രാമിംഗ് ഭാഷകളിലൊന്നാണ് മോഡുല-3,  അതായത് മോഡുൾ `A`യുടെ അവലംബം, ഒബജക്ട് `x` ൽ നിന്ന് കയറ്റുമതി ചെയ്ത മോഡുൾ`B` ഫോം `B.x` നിന്ന് എടുക്കേണ്ടതാണ്. ഒരു മൊഡ്യൂളിൽ നിന്ന് "എല്ലാ എക്സ്പോർട്ട് ചെയ്ത പേരുകളും" ഇറക്കുമതി ചെയ്യാൻ മോഡുല-3 യിൽ സാധ്യമല്ല. 

നാമ യോഗ്യതയിൽ ഭാഷയുടെ ആവശ്യകതകൾ കാരണം മെത്തേഡ് ഓവർറൈഡിംഗ് മൂലം ഒരു ഇന്റർഫെയിസിലേക്ക് (ഏതെങ്കിലും ഇന്റർഫെയിസിൽ) പുതിയ പ്രഖ്യാപനങ്ങൾ ചേർക്കുന്നതിലൂടെ ഒരു വർക്ക് പ്രോഗ്രാമിനെ തകർക്കുവാൻ സാധ്യമല്ല. വൈരുദ്ധ്യങ്ങൾക്ക് പേരുനൽകുന്നതിനെ കുറിച്ച് യാതൊരു ആശങ്കയും കൂടാതെ, പ്രോഗ്രാമർമാർക്ക് വലിയ പ്രോഗ്രാമുകൾ ഒരേസമയം എഡിറ്റ് ചെയ്യുവാൻ ഇത് സഹായിക്കുന്നു. നിലവിലുള്ള പ്രോഗ്രാമുകളൊന്നും ഈ പ്രക്രിയയിൽ "ബ്രോക്കൺ" എന്നത്, ശക്തമായ അറിവുപയോഗിച്ച് കോർ ഭാഷാ ലൈബ്രറികൾ എഡിറ്റ് ചെയ്യുന്നത് സാധ്യമാക്കുന്നു.
## ഒഴിവാക്കലുകൾ
ഒഴിവാക്കലുകൾ കൈകാര്യം ചെയ്യൽ `TRY`... `EXCEPT` എന്നിവ അടിസ്ഥാനമാക്കിയുള്ളതാണ്  ബ്ലോക്ക് സിസ്റ്റം, അതിനു ശേഷം ഇത് പൊതുവായിത്തീർന്നു. ഡെൽഫി, പൈത്തൺ, സ്കാലാ, വിഷ്വൽ ബേസിക്.നെറ്റ് എന്നിവയിലെ ശ്രദ്ധേയമായ ഒഴിവാക്കലുകളോടെ മറ്റു ഭാഷകളിലും ഉപയോഗിക്കാത്ത ഒരു സവിശേഷത, `EXCEPT` കൺസ്ട്രക്ടിൽ സ്വിച്ച് സ്റ്റേറ്റ്മെന്റ് നിർവചിച്ചിരിക്കുന്നു എന്നതാണ്. മോഡുല-3 `LOOP... EXIT ... END` എന്നതിനെ പിന്തുണയ്ക്കുന്നു, `EXIT` സംഭവിക്കുന്നത് വരെ ആ ലൂപ്പുകൾ നിർമ്മിക്കുന്നു, `TRY... EXCEPT` ക്ലോസ്സിനുള്ളിൽ ലളിതമായ ലൂപ്പിന് സമാനമായ ഒരു ഘടന ലഭിക്കുന്നു.
## മൾട്ടി-ത്രെഡുകൾ
ഭാഷ മൾട്ടി-ത്രെഡ്ഡിംഗിനെയും, ത്രെഡുകൾക്കിടയിലുള്ള സമന്വയിപ്പിക്കലിനെയും പിന്തുണയ്ക്കുന്നു. ഇവിടെ ത്രെഡ് എന്ന റൺടൈം ലൈബ്രറി (m3core) ഒരു സ്റ്റാൻഡേർഡ് മോഡ്യൂൾ ആണ്,  മൾട്ടി-ത്രെഡ് ആപ്ലിക്കേഷനുകളുടെ ഉപയോഗം പിന്തുണയ്ക്കുന്നു. വാസ്തവത്തിൽ, മോഡുല-3 റൺടൈം ഗാർബേജ് ശേഖരണം പോലുള്ള ആന്തരിക പ്രവർത്തനങ്ങൾക്ക് ഒരു പ്രത്യേക ത്രെഡ് ഉപയോഗപ്പെടുത്താം. സാധ്യമായ കറപ്ക്ഷന്റെയോ റേസിന്റെയോ അവസ്ഥയോ ഉള്ള അവസരങ്ങളിൽ നിന്ന് ഒന്നിലധികം ത്രെഡുകൾ സിൻക്രൊണൈസ് ചെയ്യുന്നതിനും ഡാറ്റ ഘടനകൾ സംരക്ഷിക്കുന്നതിനും അന്തർനിർമ്മിത ഡാറ്റാ ഘടന `MUTEX` ഉപയോഗിക്കുന്നു. `LOCK` ഉം ബന്ധപ്പെട്ട `UNLOCK` നിർദ്ദേശങ്ങളും, ഒരു `MUTEX`ലോക്കുചെയ്യുക, അൺലോക്കുചെയ്യുക. `MUTEX`ഒരു വസ്തുവാണ്, അതുപോലെ മറ്റു വസ്തുക്കൾ അതിൽ നിന്നും ഉദ്ഭവിച്ചേക്കാം. ഉദാഹരണത്തിനു്, libm3 ലൈബ്രറിയുടെ I / O ഭാഗത്ത്, റീഡേഴ്സും റൈറ്റേഴ്സും (Rd.T, and Wr.T)`MUTEX` ൽ നിന്ന് വികസിപ്പിച്ചെടുക്കുകയും ബഫറുകൾ പോലെയുള്ള ഏതൊരു ആന്തരിക ഡാറ്റകൾ ആക്സസ് ചെയ്യുന്നതിനോ പരിഷ്ക്കരിക്കുന്നതിനോ സ്വയം പൂട്ടുന്നു.
## സംഗ്രഹം
ചുരുക്കത്തിൽ, ഭാഷാ സവിശേഷതകൾ താഴെ കൊടുക്കുന്നു:
* മൊഡ്യൂളുകളും ഇന്റർഫെയിസുകളും
* സുരക്ഷിതമല്ലാത്ത കോഡ് വ്യക്തമാക്കാൻ അടയാളപ്പെടുത്തുന്നു.
* സാമാന്യഗതം(genrics)
* യാന്ത്രിക ഗാർബേജ് ശേഖരണം
* ശക്തമായ ടൈപ്പിംഗ്, തരങ്ങളുടെ ഘടനാപരമായ സമവാക്യം
* ഒബജ്ക്ട്സ്
* ഒഴിവാക്കലുകൾ
* ത്രെഡുകൾ

ക്രമികമായ വികാസ സവിശേഷതകൾ രേഖപ്പെടുത്തപ്പെടുത്തി യിട്ടുള്ള അപൂർവ്വം ഭാഷകളിലൊന്നാണ് മോഡുല-3.

മോഡുല 3-ൽ സിസ്റ്റം പ്രോഗ്രാമിംഗിൽ, ഭാഷാ രൂപകൽപ്പനയിലെ നാല് പ്രധാന സൂചകങ്ങൾ വളരെയധികം ചർച്ച ചെയ്യപ്പെട്ടിട്ടുണ്ട്. ഈ വിഷയങ്ങൾ: അംഗവിധാനം സംബന്ധിച്ചത് vs. നാമ സമത്വം, ഉപടൈപ്പിങ് നിയമങ്ങൾ, സാമാന്യഗതമായ മൊഡ്യൂളുകൾ, കൂടാതെ `READONLY` പോലുള്ള പരാമീറ്റർ മോഡുകൾ.
## ഗുണനിലവാര ലൈബ്രറി സവിശേഷതകൾ
സി പ്രോഗ്രാമിങ് ഭാഷയ്ക്ക് തുടക്കം കുറിച്ച ഒരു പ്രവണത തുടരുന്നു. യഥാർത്ഥ പ്രോഗ്രാമുകൾ എഴുതാൻ ആവശ്യമായ നിരവധി സവിശേഷതകൾ ഭാഷാ നിർവ്വചനത്തിൽ നിന്നും വിട്ടുപോയി. അതിനുപകരം പല ഗുണനിലവാരമുള്ള ലൈബ്രറികളിലൂടെയും നൽകി. താഴെയുള്ള ഇന്റർഫെയിസുകളുടെ ഭൂരിഭാഗവും വിശദമായി പ്രതിപാദിച്ചിരിക്കുന്നു

ഗുണനിലവാരമുള്ള ലൈബ്രറികൾ താഴെ പറയുന്ന സവിശേഷതകൾ നൽകുന്നു. ഇവയെ ഗുണനിലവാരമുള്ള ഇന്റർഫേസുകൾ എന്ന് വിളിക്കുന്നു, അവ (അവ നൽകേണ്ടതുണ്ട്) ഭാഷയിൽ ആവശ്യമുള്ളവയാണ്.
* വാചകം: മാറാത്ത സ്ട്രിംഗ് റഫറൻസുകളിലേക്കുള്ള പ്രവർത്തനങ്ങൾ, `TEXT`കൾ എന്ന് വിളിക്കുന്നു
* ത്രെഡ്: `MUTEX`, കൺഡിഷൻ വേരിയബിൾ, ത്രെഡ് പോസ് ചെയ്യൽ എന്നിവയുൾപ്പെടെ ത്രെഡിംഗുമായി ബന്ധപ്പെട്ട പ്രവർത്തനങ്ങൾ. ത്രെഡിംഗ് ലൈബ്രറി പ്രീ-എംപ്റ്റീവ് ത്രെഡുകൾ സ്വിച്ചിംഗ് നൽകുന്നു
* വാക്ക്: കൈമാറ്റം ചെയ്യാത്ത പൂർണ്ണസംഖ്യകളിൽ ബിറ്റ് വൈസ്(Bitwise) പ്രവർത്തനങ്ങൾ (അല്ലെങ്കിൽ മെഷീൻ പദങ്ങൾ). കമ്പൈലർ നേരിട്ട് നടപ്പിലാക്കുന്നു
* ഫ്ലോട്ടിങ്-പോയിന്റ് ഇന്റർഫെയിസുകൾ

ലഭ്യമായ ഇംമ്പ്ലിമെന്റേഷൻ നടപ്പിലാക്കിയ ചില ഇന്റർഫേസുകൾ, പക്ഷെ ആവശ്യമില്ല
* ലീക്സ്: പാഴ്സുചെയ്യൽ സംഖ്യയും മറ്റ് ഡാറ്റയും
* എഫ്എംറ്റി(Fmt): അച്ചടിക്കാനുള്ള വിവിധ ഡേറ്റാടൈപ്പുകൾ ഫോർമാറ്റുചെയ്യുന്നു
* പികെഎൽ(Pkl) (അല്ലെങ്കിൽ പിക്കിൾ(Pickle)): ഏതെങ്കിലും റഫറൻസ് തരങ്ങളുടെ ഒബ്ജക്റ്റ് സീരിയലൈസേഷൻ ഗാർബേജ് കലക്ടർ വഴി എത്താം
* പട്ടിക: മാപ്പുകളുടെ പൊതുവായ മൊഡ്യൂളുകൾ

സി(C)യിൽ ഉള്ളപോലെ, മോഡുല-3 യിൽ `RD`, `Wr`എന്ന് വിളിക്കുന്ന ലൈബ്രറികൾ വഴിയും ഇൻപുട്ട് / ഔട്ട്പുട്ട് (I / O) ലഭ്യമാണ്. ഗ്രിഗെൻ നെൽസൻ പുസ്തകരൂപത്തിൽ നൽകുന്ന ലൈബ്രറികളാണ് `RD`,`Wr` (യഥാക്രമം വായനക്കാരും എഴുത്തുകാരും) എന്നിവയടങ്ങിയ ഒബ്ജക്റ്റ് ഓറിയന്റഡ് ഡിസൈൻ. മോഡുല 3-യുടെ ഒരു രസകരമായ ഘടകം, ചില പ്രോഗ്രാമിങ് ഭാഷകളിലൊന്നാണ്, ലോക്ക് ചെയ്യുന്ന ബഗ്ഗുകൾ ഉൾപ്പെടെയുള്ള വിവിധ തരത്തിലുള്ള ബഗുകൾ അടങ്ങുന്ന പരമ്പരാഗത ലൈബ്രറികൾ ഔപചാരികമായി പരിശോധിച്ചുവരുന്നത്. ഇത് ലാർച്ച് / മോഡുല-3(Larch / Modula-3 )(Larch കുടുംബം കാണുക),  ഡെക്ക് സിസ്റ്റംസ്(DEC Systems) റിസേർച്ച് സെന്ററിൽ വിപുലീകരിച്ച സ്റ്റാറ്റിക് പരിശോധന  എന്നീ പ്രോജക്റ്റുകളുടെ കീഴിലായിരുന്നു.
## നടപ്പിലാക്കൽ
നിരവധി കമ്പൈലറുകൾ ലഭ്യമാണ്, അവയിൽ മിക്കതും ഓപ്പൺ സോഴ്സാണ്.
* ഡെക്ക്-എസ്ആർസി എം3(DEC-SRC M3), യുടെ അസൽ രൂപം.
* ഒളിവ്ട്ടി റിസർച്ച് സെന്റർ (ORC) മോഡുല-3 ടൂൾകിറ്റ്, യഥാർത്ഥത്തിൽ ഒരു കമ്പൈലർ, ഇപ്പോൾ മോഡുല 3 പ്രോഗ്രാമുകളുടെ വാക്യഘടന, ലെക്സിക്കൽ, സെമാന്റിക് വിശകലനത്തിനായി ലൈബ്രറിയായി ലഭ്യമാണ്.
* ഡിസി-എസ്ആർസി എം 3 യുടെ പിൻഗാമിയായ ക്രിട്ടിക്കൽ പിണ്ഡം സിഎം3(CM3).
* പോളിടെക്നിക് മോണ്ട്രൽ മോഡുല -3 PM3, ഡെക്ക്-എസ്ആർസി എം3(DEC-SRC M3)യുടെ പിൻഗാമിയായി, ഇപ്പോൾ സിഎം3(CM3)യിലൂടെ ലയിപ്പിക്കുന്നു
* ഇഇസ്ഡ് വിഎം3(EzVM3), സ്വതന്ത്രമായ കനംകുറഞ്ഞതും എളുപ്പത്തിൽ കൊണ്ടുനടക്കാവുന്നതുമായ ഇംപ്ലിമെൻറേഷൻ, സിവി സംപു(CVSup)മായി ബന്ധപ്പെടുത്തി വികസിപ്പിച്ചെടുക്കുന്നു
* പിഎം 3 ന്റെ pm3-1.1.15 പ്രകാശനത്തിന്റെ പിൻഗാമിയായ എച്ച്എം3(HM3), എൻപിറ്റിഎൽ(NPTL) ഉപയോഗിച്ച് നേറ്റീവ് ത്രെഡിംഗ് പിന്തുണയോടെ
* സിഎം 3, ക്രിട്ടിക്കൽ പിണ്ഡം സിഎം3(CM3)യുടെ പിൻഗാമിയാണ്. ഇത് മാത്രമാണ് കാലത്തിനുശേഷവും പരിപാലിക്കപ്പെടുന്നതും വികസിപ്പിച്ചതും. റിലീസുകൾ http://www.opencm3.net/releng/  ൽ നിന്നും ലഭ്യമാണ്.

മോഡുല-3 യിൽ നിന്ന് നഷ്ടപ്പെടാത്ത സി-ഡാറ്റ ഘടനകളുടെ ഏക വശം യൂണിയൻ തരം ആയതിനാൽ, എല്ലാ നിലവിലുള്ള മോഡുല-3 ആക്റ്റിവേഷനുകളും സി-ടൈപ്പ് ഡിസററേഷൻ ഓഫ് അറേ, സ്ട്രറ്റുകൾ എന്നിവയുമായി നല്ല ബൈനറി കോംപാറ്റിബിളിറ്റി ലഭ്യമാക്കുന്നു.
## പുസ്തകങ്ങൾ
ഈ പുസ്തകങ്ങളൊന്നും അച്ചടിയിൽ ഇല്ലെങ്കിലും, ഉപയോഗിച്ചിരി ക്കുന്ന പകർപ്പുകൾ ലഭിക്കുന്നു, ചിലത് ഡിജിറ്റൽവത്കൃതമോ ഭാഗികമായോ ഡിജിറ്റൽവൽക്കരിക്കപ്പെട്ടവയോ, അവയുടെ ചില അധ്യായങ്ങൾ വെബിൽ നിന്ന് റിസേർച്ച് റിപ്പോർട്ടുകളായി ലഭിക്കത്തക്കതോ പിൻകാലമോ ആയതോ ആയ പതിപ്പുകളാണ്.
* ഗ്രെഗ് നെൽസൺ, ഇഡി(ed). മോഡുല-3 ഉപയോഗിച്ച് സിസ്റ്റംസ് പ്രോഗ്രാമിങ്, മോഡുല-3 ഭാഷയിലെ നിർബ്ബന്ധിത റഫറൻസ് ഒബ്ജക്റ്റ് ഓറിയെന്റഡ് സിസ്റ്റംസ് സോഫ്റ്റ്‌വേർ നിർമ്മാണത്തിൽ രസകരമായ ലേഖനങ്ങൾ ചർച്ചയിലൂടെ ഒരു ഡോക്യുമെന്റേഷൻ ഭാഷയുടെ അന്തിമ സവിശേഷതകളിലേക്ക് നയിക്കുന്നു. മുമ്പുള്ള ചിലത് ഉണ്ട് (അദ്ധ്യായം രണ്ട്, , അദ്ധ്യായം നാല്,  അഞ്ചാമദ്ധ്യായത്തിൽ,ആറാമത്തെ അദ്ധ്യായത്തിന് [3] കാണുക)പീന്നീട് (കാണുക, അദ്ധ്യായം ഒന്നിൽ കൂടുതൽ അപ്ഡേറ്റ് ചെയ്ത രണ്ട്, ഇത് മുമ്പുള്ള ഭാഷാ നിർവചനങ്ങൾ  മുൻകൂർ DEC സിസ്റ്റംസ് റിസർച്ച് സെന്ററിൽ (എസ്ആർസി) ഡൗൺലോഡ് ചെയ്യുന്നതിനുള്ള ഗവേഷണ റിപ്പോർട്ടുകളായി അതിന്റെ എട്ടു അദ്ധ്യായങ്ങളിൽ ഭൂരിഭാഗവും പ്രസിദ്ധീകരിക്കാവുന്ന പതിപ്പുകളുടെ ഏഴ് അദ്ധ്യായമായി മൂന്നായും മൂന്നാമത്തേയും വ്യക്തിപരമായി ലഭ്യമാണ്).
* സാമുവൽ പി. ഹാർബ്സൺ, മോഡുല-3 എന്ന പാഠപുസ്തകം ഉപയോഗിക്കാൻ എളുപ്പമുളളതാണ്
*  റോബർട്ട് സെഡ്ജിവീക്, മോഡുല 3-ൽ ഉള്ള അൽഗോരിതങ്ങൾ
* ലാസ്ലോ ബോസ്സോമെനിയി & കാർസ്റ്റൺ വെച്ച്, പ്രോഗ്രാമിങ് ഇൻ മോഡൽ -3: ആൻ ഇൻട്രോഡക്ഷൻ ഇൻ പ്രോഗ്രാമിങ് വിത്ത് സ്റ്റൈൽ
* റെൻസോ ഒർസിനി, അഗോസ്റ്റിനോ കോർട്ടിസി പ്രോഗ്രാമിംഗ്, മോഡുല-3: അനിവാര്യ പ്രോഗ്രാമിംഗിനുള്ള ആമുഖവും അതിന്റെ പ്രധാന സവിശേഷതകളെ വിശദീകരിക്കുന്ന ഭാഷയുടെ ഒരു ഇറ്റാലിയൻ പുസ്തകവും.
## മോഡുല-3 ഉപയോഗിക്കുന്ന പ്രോജക്ടുകൾ
* പ്രോഗ്രാമിങ് ഭാഷയായി മൊഡുല 3 ഉപയോഗിച്ചാണ് എസ് പിഐഎൻ(SPIN) ഓപ്പറേറ്റിങ് സിസ്റ്റം നടപ്പിലാക്കിയത്.
* മോഡുല-3 ൽ CVSup റിപ്പോസിറ്ററി സിൻക്രൊണൈസേഷൻ പ്രോഗ്രാം നടപ്പിലാക്കി.
* മോഡുല-3 ഓബ്ജക്റ്റ് പ്രോഗ്രാമിങ് ഭാഷ ഉപയോഗിക്കുന്നത് മോഡുല-3 ഓബ്ജക്റ്റ് ഓറിയന്റഡ് പ്രോഗ്രാമിങ് മാത്യകയിലേക്ക് വിതരണം ചെയ്യുന്നതിനുള്ള കഴിവ്, പ്രാദേശിക നെറ്റ് വർക്കുകളിൽ വസ്തുക്കളെ മൈഗ്രേറ്റ് ചെയ്യുന്നതിനുള്ള കഴിവ്. വിതരണ ആപ്ലിക്കേഷനുകൾ, കമ്പ്യൂട്ടർ ആനിമേഷനുകൾ, വെബ് പ്രോഗ്രാമിങ് ആപ്ളിക്കേഷനുകൾ എന്നിവ മോഡുല-3 യിലേക്കുള്ള സ്ക്രിപ്റ്റിങ് വിപുലീകരണത്തിൽ നിർമ്മിക്കുന്നതിനായി ഇത് ഉപയോഗിച്ചു വരുന്നു.
## മറ്റ് പ്രോഗ്രാമിംഗ് ഭാഷകളിൽ ഉള്ള സ്വാധീനം
മോഡുല-3 യ്ക്ക് മുഖ്യധാര സ്റ്റാൻഡേർഡ് ലഭിച്ചില്ലെങ്കിലും, ഡി.ഇ.സി.-എസ്ആർസി എം 3 വിതരണത്തിന്റെ പല ഭാഗങ്ങളും ചെയ്തു. ഏറ്റവും സ്വാധീനമുള്ള ഭാഗം നെറ്റ്വർക്ക് ഒബ്ജക്ട്സ് ലൈബ്രറിയാണ്, ഇത് യഥാർത്ഥ നെറ്റ്വർക്ക് പ്രോട്ടോക്കോൾ ഉൾപ്പെടെ, ജാവയുടെ ആദ്യ ത്തെ ആർഎംഐ (RMI) നടപ്പിലാക്കലിന്റെ അടിസ്ഥാനമായി. CORBA സ്റ്റാൻഡേർഡിൽ നിന്നും SUN IIOP അടിസ്ഥാനമാക്കിയുള്ള പ്രോട്ടോക്കോളിലേക്ക് മാറ്റുമ്പോൾ, അത് ഉപേക്ഷിച്ചു. വിദൂര വസ്തുക്കളുടെ ശേഖരണങ്ങൾ ശേഖരിക്കുന്നതിനുള്ള രേഖകൾ ഇപ്പോഴും മോഡുല 3 നെറ്റ്വർക്ക് വസ്തുക്കൾക്കായി പ്രവർത്തിച്ചിട്ടുണ്ട്.  പൈഥനിലെ ക്ലാസ് മെക്കാനിസവും സി++, മോഡുല-3 എന്നിവയിൽ ക്ലാസ് മെക്കാനിസവും പ്രചോദിപ്പിച്ചിട്ടുണ്ട്. 

## അവലംബം

## പുറത്തേക്കുള്ള കണ്ണികൾ
*Modula-3 Resource Page
*CM3 Implementation Website
*Modula-3 Home Page (now long dead, mirror)
*Modula-3: Language definition 
*elego Software Solutions
*[news:comp.lang.modula3 Modula-3 newsgroup] (Mostly deserted)
*Modula-3 Development Mailing List  (active)
*Notes from Caltech's CS2 class, taught in Modula-3 in 2002 and 2003. 
*.
*mirror ''Programming in Modula-3'': program examples
*''Building Distributed OO Applications: Modula-3 Objects at Work''. Michel R. Dagenais. Draft Version (January 1997) 
*[ftp://ftp.u-aizu.ac.jp/pub/lang/Modula/m3/faq/document/LangToolsLibs/root.ps *Modula-3: Language, Libraries and Tools*. Presentation on Modula-3 over 120 slides. Michael R. Dagenais] (dead)
*''Object-Oriented Data Abstraction in Modula-3''. Joseph Bergin (1997)
*Computerworld Interview with Luca Cardelli on Modula-3