مادولا (زبان برنامه‌نویسی)
زبان برنامه‌نویسی مادولا یکی از نسل‌های زبان برنامه‌نویسی پاسکال است. طزاحی آن به زمانی بر می‌گردد که دکتر نیکلاس ورث (Niklaus Wirth) عضو کمیته‌ای بود که وظیفه آن طراحی زبانی بود که جانشین زبان الگول-60 شود. حاصل کار این کمیته زبان الگول-68 بود. عدم وجود متودی منسجم در طراحی الگول-68 باعث شد که این زبان به مجموعه‌ای از امکانات بی نظم و آشفته تبدیل شود و مانند زبان PL/I سقوط زود هنگامی را تجربه کند. در این زمان دکتر ورث کمیته را رها کرد و تصمیم به طراحی زبانی متأثر از تئوری‌های دایسترا (Dijkstra)، هور (Hoare) و دال (Dahl) گرفت و سرانجام تلاش او زبان پاسکال بود که به گفته خودش هدف از طراحی زبان پاسکال بر دو مبنا بود: طراحی زبانی اصولی برای آموزش برنامه‌نویسی و گسترش زبانی که قابلیت اطمینان و کارایی بالایی برای کامپیوترهای موجود دارد.
یک پروژه برای به انجام رسیدن به دو چیز نیاز دارد. اول لیستی از مسائل مرتبط با پروژه و دیگر راه حل هر یک از این مسائل که به راهکاری برای پروژه منجر می‌شوند. شرایط مشابهی در برنامه‌نویسی برای به انجام رساندن یک پروژه وجود دارد. چیزی که مرکز تحقیقات پالو آلتو (PARC)، جایی که ورث مشغول به کار بود، به آن نیاز داشتند نوعی زبان برنامه‌نویسی بود که به کمک آن بتوان سیستم‌های بزرگ و پیچیده را پیاده کرد یا به عبارتی امکانی برای پیاده‌سازی واحدهایی مرتبط با سیستم که به‌طور جداگانه قابل ترجمه باشند. این واحدها اکنون مادول گفته می‌شود. زیانی که ورث در صدد طراحی آن برای رفع نیازهای PARC بود، برگرفته از زبان پاسکال با تأکید بیشتری بر واحدهای برنامه‌نویسی یا همان مادول‌ها بودند و به همین علت مادولا نام گرفت. امکاناتی کامپیوترهای سال 1977 مهیا می‌کردند پردازنده‌های مرکزی بودند که سیستم‌های پیچیده time-sharing را مدیریت می‌کردند و با ترمینال‌ها قابل دسترسی بودند. انقلاب بزرگ پدیدار شدن سیستم‌های شخصی آلتو که در PARC توسعه یافته بودند ورث را متقاعد کرد که در آینده، توسعه نرم‌افزار بر اساس این سیستم‌های شخصی خواهد بود. در حالی که این سیستم‌ها در آن زمان در بازارها موجود نبودند یک راه برای PARC وجود داشت و آن این بود که خود این امکانات را فراهم آورد. محصول این پروژه ساخت ایستگاه کاری لیلیت (Lilith) بود. Modula-2 در سال 1982 به صورت تجاری توسط کمپانی تازه تأسیس DISER [Data Image Sound Processor and Emitter Receiver System] با نام کامپایلرهای MC1 و MC2 عرضه شد. Modula-2 به عنوان زبانی که ادامه دهنده زاه پاسکال بود و از زبان برنامه‌نویسی Mesa نیز تأثیر فراوانی پذیرفته بود شناخته شد. Mesa زبانی بود که در دهه 70 از آن در PARC برای پروژه‌های سطح پایین و پیاده سازی‌های تیمی استفاده می‌شد. Modula-2 و ایستگاه کاری آن لیلیت، همواره کنار یکدیگر شناخته شده‌اند و اولین سیستمی را تشکیل می‌دادند که امکانات کامپیوتر شخصی به همراه محیط گرافیکی با تفکیک بالا و پنجره ای، موشواره، ویراشگرهای متن با فونت‌های مختلف و چاپگر لیزری مدت‌ها قبل از مکینتاش ارائه کردند.
تمام نسخه‌های مختلف و فرزندان زبان مادولا از نوع زبان‌های امری و از خانواده زبان‌های بلوکی الگول 60 هستند. زبان‌های خانواده مادولا اکثر ساختارهای کنترلی معمول در زبان‌های بلوکی را دارا می‌باشند مانند: For، Loop، Repeat، Loop، While، If، Case، With. در Modula و Modula-2 مفاهیم شیئ گرایی به مادول‌ها و مفهوم ضمنی Interface که مادول‌ها فراهم می‌آورند و رکوردها محدود می‌شود. در Modula-2+ و Modula-3 پایه‌هایی از مفاهیم شیئ گرایی مانند وراثت و Generics اضافه شدند.
مانند زبان الگول 60 زبان مادولا و تمام زبان‌های مشتق شده از این زبان، سیستم تایپ قوی دارند (Strongly Typed) . در زبان‌های مادولا تایپ تمام عبارتها و متغیرها در زمان کامپایل مشخص می‌شوند و تایپ یک عبارت با استفاده از زیر عبارتهای آن عبارت مشخص می‌شوند. همچنین در زبان‌های مادولا تبدیل خودکار تایپ وجود ندارد و تبدیل تایپ باید به‌طور صریح انجام شود.  در Modula-3 تایپ داده به انواع زیر تقسیم می‌شوند: یکی از اهداف اصلی طراحی زبان مادولا جهش از ساختار زبان پاسکال به زبانی بود که در آن بتوان اجزای مختلف برنامه را جداگانه نوشت و ترجمه کرد. این واحدها در مادولا، مادول نام دارند. مفهوم مادول به عنوان لیستی از شناسه‌های Import یا Export شده از یک واحد برنامه‌نویسی از زبان Mesa گرفته شده‌است. همچنین مفهوم فایل سمبل‌ها به عنوان اطلاعات از قبل ترجمه شده از زبان Mesa گرفته شدند. مادول واحدی است که به‌طور ساده مفهوم کپسوله‌سازی را پیاده می‌کند و به برنامه‌نویس امکان می‌دهد متغیرها و توابع در یک مادول از دید کاربر بیرونی مخفی باشند مگر آنکه Import یا Export شده باشند. مادول‌ها به‌طور ضمنی مفهوم Interface با تایپ صریح را نیز در زبان ارائه می‌کنند. Import M0,M1; بدین ترتیب عناصر مادول M0 مانند x به صورت M0.x قابل دسترسی هستند در صورتی که در M0، Export شده باشند. عناطر یک مادول به‌طور مستقیم نیز می‌توانند Import شوند تا از نوشتن مکرر نام مادول اجتناب شود: From M1 Import x,y,z;
چک کردن تایپ در مادولا به صورت ایستا صورت می‌گیرد. بدین معنی که در زمان کامپایل تطابق تایپ‌ها و پیروی آن‌ها از قواعد تایپ زبان در زمان کامپایل صورت می‌گیرد و به زمان اجرا موکول نمی‌شود. در مقابل پاسکال مشکلاتی داشت از جمله کامل نبودن برخی از تایپ‌های پارامتری توابع مانند تایپ Procedure که باعث می‌شود نتوان چک کردن تایپ به‌طور ایستا صورت بگیرد. برای مثال در زیر نمونه‌ای از این خطا در زبان پاسکال وجود دارد که کامپایلر نمی‌تواند آن را در زمان کامپایل تشخیص دهد:
مادولا این مشکل را با الزام تعریف کامل نوع پارامترها برای تایپ‌های Procedure حل کرد. برای مثال تایپ Precdure(real,real) ئدر مادولا یک تایپ متمایز از Procedure(integer,real) در نظر گرفته می‌شود.
مفهوم پروسیجر به عنوان تایپ نیز از زبان Mesa گرفته شد. این نوع تایپ در پاسکال نیز به عنوان پروسیجرهای پارامتریک (ورودی از نوع پروسیجر) وجود داشت و در مادولا به متغیرها و پارامترها بسط داده شد. تایپ‌های ADDRESS و CARDINAL تایپ ADRESS در Modula-2 برای آدرس دهی‌های 16 بیتی استفاده می‌شود و تایپ CARDINAL برای کار با اعداد صحیح بدون علامت و اعمال ریاضی روی آدرس‌ها در نظر گرفته شده‌است.
در زبان مادولا امکاناتی هستند که قابل پیاده‌سازی توسط مجردات زبان نیستند و از این رو دز سطح ماشین پیاده‌سازی شده‌اند. استفاده از نام تایپ برای تبدیل صریح تایپ داده یکی از نمونه‌های این امکانات است. اگر x یک متغیر و T یک تایپ در زبان مادولا باشند، T(x) همان مقدار x را با تایپ T داراست در صورتی که تایپ x به T قابل تبدیل باشند. این امکانات زبان مادولا این زبان را تا حدی وابسته به ماشین و نحوه پیاده‌سازی زبان کرده‌است. در Modula-2 امکانات سیستمی از طریق مادول SYSTEM فراهم می‌شود.
در مادولا مانند پاسکال مفهوم اشاره گرها پیاده‌سازی شده‌اند و از این رو امکان استفاده از حافظه پویا با توابعی مانند NEW(x) وجود دارد. با توجه به حافظه محدود کامپیوترها در زمان طراحی Modula-2 امکان استفاده مجدد از حافظه غیرقابل دسترسی بسیار ارزشمند بود و از این رو نوعی Garbage Collection در Modula-2 برای بازیابی حافظه غیرقابل دسترسی تعبیه شده‌است.
در Modula-2 امکان تعریف پرش بین پروسیجرها و تعریف پروسیجرهای وظیفه‌ای (Tasks) به صورت Coroutine پیاده‌سازی شده‌است. Modula-2 یکی از اولین زبان‌های برنامه‌نویسی سطح بالاست که این امکان را فراهم کرده‌است. این امکانات از طریق مادول COROUTINES و تایپ COROUTINE فراهم شده‌اند. با استفاده از این نوع پروسیجرها امکان پرش بین پروسیجرها وجود دارد.
امکان تعریف مادول‌های عام (Generic) در مادولا وجود دارد. این مادول‌ها همانند Template‌های C++ هستند که امکان می‌دهند برخی از تایپ‌ها در زمان تعریف مادول نام معلوم تعریف شوند و در زمان Instance گرفتن از مادول معین شوند. برای مثال عناطر یک مادول که یک پیاده‌سازی از ساختار پشته است، می‌توانند از نوع Integer، Real یا هر تایپ دیگری باشند.
امکان مدیریت حالت استثناء در Modula-2+ و Modula-3 اضافه شدند. در Modula-3 مدیریت استثناء به فرم بلوکی معروف TRY … EXCEPT … تعریف شده‌است.
این برنامه پیغام Hello World! را چاپ می‌کند.
متن برنامه:
اجرای نمونه:
این برنامه اعداد را از یک فایل ورودی می خواند و میانگین آن‌ها را محاسبه می‌کند. متن برنامه:
BEGIN WriteString('Enter the names of the output, input files'); WriteLn; OpenOutput("OUT"); IF NOT Done THEN WriteString('Output file cannot be opened'); WriteLn; HALT; END; OpenInput("IN"); IF NOT Done THEN CloseOutput; WriteString('Input file cannot be opened'); WriteLn; HALT; END;
N:=0; SUM:=0; ReadInt(X); WHILE Done DO WriteInt(X,3); WriteLn; N:=N+1; SUM:=SUM+X; ReadInt(X); END;
WriteString('The Sum is '); WriteInt(SUM, 1); WriteLn; AVERAGE:=SUM DIV N; WriteString('The Average is '); WriteInt(AVERAGE, 1); WriteLn; CloseOutput; CloseInput;
END SumAndAverage. اجرای نمونه:
این برنامه شامل یک پروسیجر می‌شود که N! را محاسبه می‌کند.  متن برنامه:
MODULE Factorial; FROM InOut IMPORT WriteCard, WriteLn;
PROCEDURE Fact(n:CARDINAL):CARDINAL;
VAR
BEGIN
END Fact;
VAR BEGIN END Factorial.
اجرای نمونه: