בשנת 1977 וירת התחיל את הפיתוח של מודולה־2 כהמשך לפיתוח של מודולה, וכתחליף לפסקל. מודולה הראשונה הייתה שפת תכנות נסיונית, והיא מעולם לא פותחה מעבר לשלבי הניסוי שלה אחרי שנת 1975. וירת תכנן את מודולה־2 שתהיה שפת תכנות מערכות ושפת תכנות כללית במחשבי DISER Lilith. תחביר השפה היה דומה יותר לזה של מודולה מאשר לפסקל, לכן וירת החליט לקרוא לה מודולה־2.
בשנת 1978 פורסמה המהדורה הראשונה של הדו"ח של אפיון השפה.
בשנת 1979 נוצר היישום השימושי הראשון של השפה עבור מחשבי ה־PDP-11 בשימוש פנימי של המכון הטכנולוגי של ציריך.
בשנת 1980 פורסמה המהדורה השנייה של הדו"ח של האפיון השפה.
בשנת 1981 מהדר השפה שוחרר בפעם הראשונה לציבור הרחב. מיד לאחר מכן השפה צברה פופולריות ונוצר עניין ציבורי בפרסום מדריך רשמי עבור השפה.
בשנת 1982 פורסמה הגרסה הראשונה של מדריך השפה מאת ניקלאוס וירת על ידי הוצאת שפרינגר.
בשנת 1983 פורסמה הגרסה השנייה של השפה (PIM2).
בין השנים 1983–1985 וירת החליט לפתח מהדר משלו עבור השפה. המהדר של וירת היה מהיר ויעיל בהרבה מהמהדרים שהוצעו עד כה לשפה.
בשנת 1985 פורסמה הגרסה השלישית של השפה (PIM3).
בשנת 1988 פורסמה הגרסה הרביעית של השפה (PIM4).
בשנת 1989 וירת פרסם מאמר בו התייחס לתכנות מונחה עצמים במודולה־2, למרות שבמקור לא עוצבה לכך. במאמר וירת הציע פתרון לחיקוי הורשה במודולה־2 באמצעות היכולת של השפה להתעלם מאכיפת טיפוסיות בתכנות מערכות.
בשנת 1996 ארגון התקינה הבין־לאומי (ISO) פרסם תקן מקיף לשפת התכנות מודולה־2. מכיוון שהיו בו שינויים מזעריים אך מחייבים בשפה, הוא נחשב לניב נוסף של השפה.
בשנת 2010 שוחררה הגרסה הראשונה של המימוש החופשי GNU Modula-2 עבור המהדר GCC לציבור הרחב מטעם מיזם גנו.
בשנת 2011 שוחררה הגרסה הראשונה של המהדר החינמי ADW Modula-2 לציבור הרחב אחרי שירש את הפיתוח של המהדר Stony Brook Modula-2.
תיעוד.
מדריך השפה יצא לאור בארבע מהדורות בין השנים 1982–1988. המהדורות שיקפו על שינויים בשפה. סקירת השפה פורסמה באופן חופשי לקהל הרחב בגרסת PDF מתוך מדריך השפה. הסקירה כוללת בה אפיון מלא של השפה. גרסת ה־PDF שפרסמה הוצאת שפרינגר כוללת בה גם את ארבעת הנספחים האחרונים בספר: הגדרת תחביר השפה בסימון EBNF , תיאור ספריית הליבה של מודולה־2, טבלת תוי ASCII, ותרשימי זרימה לתחביר השפה.
דוגמאות.
מחלק משותף מרבי.
הדוגמה הבאה מוצאת את המחלק המשותף המריבי בין המונה למכנה בשבר פשוט שהמשתמש קולט לתוכם, ואז מדפיסה אותו במסוף.
עיצוב.
וירת עיצב את מודולה־2 כדי לתת מענה מקיף לכל החסרונות של פסקל, והכתיר אותה להיות היורשת. מודולה־2 היא שפת תכנות מערכות, ולמרות זאת, הפירקניות שלה מאפשרת לתוכניות לעבור הידור מוצלח בלי שינויים נוספים עבור ארכיטקטורות מחשבים שונות, מכיוון שיישום השפה (המהדר והפירקנים שלו) דואג לספק פירקנים מערכתיים עם ממשק זהה ויישום מותאם לכל ארכיטקטורה שהוא מכיר בה. פירקנים מערכתיים אלה עוברים הידור נפרד ובלתי־תלוי בשאר התוכנית של המשתמש. אחריות זו מוטלת על יישום השפה. חידושיה המרכזיים של מודולה־2 על פני פסקל הם:
היקף משתנים.
כמו שפות אימפרטיביות אחרות, גם מודולה־2 משתמשת בהיקף לקסיקלי. כלומר, שמות משתנים חייבים להיות מוכרזים לפני השימוש בהם באותו ההיקף. בנוסף, על מנת להשתמש במשתנה בביטוי, חייבים להקצות לו ערך כלשהו.
טיפוסי נתונים.
מודולה־2 מכירה בשישה טיפוסי נתונים : מספר שלם, מספר טבעי, מספר ממשי, בוליאני (אמת או שקר), תו, ומערך ביטים . לא ניתן לשנות טיפוס של משתנה לאחר הכרזתו, וניסיון להקצות ערך שאינו הולם את טיפוסיות המשתנה יגרום לשגיאת הידור עוד לפני הריצה של התוכנית. אי לכך, מודולה־2 היא שפת תכנות עם טיפוסיות חזקה וסטטית. בנוסף, טיפוס הנתונים של המשתנה מגדיר את הפעולות האפשריות עליו. מודולה־2 מאפשרת למתכנת להגדיר הרכבות של טיפוסי נתונים מתקדמים יותר בעזרת ששת הטיפוסים הבסיסיים. לא רק משתנים נושאים עימם טיפוסיות, אלא גם קבועים, פונקציות, ותוצאות של פעולות. בנוסף, מודולה־2 לא מבצעת המרת טיפוסים בלי הוראה מפורשת. לדוגמה, פעולת חשבון בין מספר טבעי ומספר ממשי תדרוש המרה מפורשת של אחד מהם לטיפוס של האחר בעזרת או .
פִּירְקָנוּת.
אחד מחידושיה המרכזיים של מודולה־2 הוא פיצול התוכנית לפירקנים כיחידות קוד מקור שעוברות הידור נפרד. במודולה־2, פירקן מוגדר בשני רבדים: הכרזת הממשק, ויישום הפירקן. בדומה לשפת C, הכרזת הממשק של הפירקן נמצאת בקובץ נפרד שמכריז על השגרות הזמינות באותו פירקן, על סוגי המשתנים שהן קולטות ופולטות. הכרזת הפירקן היא שימושית בעיקר למהדר, ואין צורך לספק אותה למשתמש התוכנית. לעומת זאת, יישום הפירקן עובר הידור לשפת מכונה כי הוא מכיל בו קוד אימפרטיבי שמתאר את אופן הפעולה והביצוע של השגרות והתכנית.
תחביר.
התחביר של מודולה־2 מורכב מפקודות אימפרטיביות. פקודות מופרדות בעזרת נקודה ופסיק , ולעיתים קרובות הן גם מכילות ביטויים שעוברים חישוב. פקודות וביטויים מורכבים מאסימונים שנוצרים מרצף תווי ASCII. המהדר מבצע בדיקת דקדוק תחבירי, ניתוח סמנטי, וניתוח לקסיקלי, ואז מתרגם פקודות לשפת סף. אסימונים מוכרים מייצגים בין היתר מילים שמורות, ערכים, מחרוזות, הערות, מזהים (שמות של משתנים, קבועים, שגרות, ופירקנים), פעולות, ופיסוק.
מילים שמורות.
למודולה־2 קיימות ארבעים מילים שמורות.
פקודות וביטויים.
בדומה לשפות תכנות רבות, פקודות במודולה־2 מאפשרות תכנות אימפרטיבי בכך שהן מורות בקרת זרימה והקצאת ביטויים לתוך משתנים, בעוד שהביטויים עצמם הם רצפים של פעולות ואופרנדים שעוברים חישוב לפי סדר פעולות מתמטי, או סדר פעולות שהמתכנת מגדיר בעזרת סוגריים עגולים. מודולה־2 מכירה באחד־עשרה סוגי פקודות:
קבועים.
מודולה־2 מאפשרת למתכנת להכריז ערכים קבועים. ערכים אלה אינם משתנים במהלך התוכנית, וערכם נקבע על ידי המהדר לפני הריצה של התוכנית. הכרזה של קבוע נעשית בעזרת הסימן , והמילה מאפשרת הכרזה של כמה קבועים ברצף כמו בדוגמה למטה.
משתנים.
הכרזה של משתנה נעשית בעזרת הסימן כשמשמאל שם המשתנה, ומימין טיפוס המשתנה. בדומה לקבועים, ניתן להכריז מספר משתנים ברצף בעזרת המילה .
בקרת זרימה.
מהיותה שפת תכנות מבנית, חלק מסוגי הפקודות יכולות להכיל בתוכן תת־פקודות. לדוגמה, תנאי יכול להיות מוכל בתוך תנאי אחר, שגם הוא יכול להיות מוכל בתוך לולאת , וכך בעצם נוצרת בקרת זרימה. במודולה־2, הסימן נקודה ופסיק הוא מפריד בין פקודות ומגדיר את סדר הביצוע בתוכנית.
לולאות.
מודולה־2 מציעה ארבעה סוגי לולאות: , , , ו־. כמו בשפות אחרות, הלולאות , , ו־ הן תלויות בתנאי כלשהו. לעומת זאת, הלולאה היא אין־סופית ומתקיימת ללא תנאים. לכן, היא דורשת יציאה ידנית באמצעות הפקודה בתוכה. ובכל אופן, הפקודה יודעת לעצור לולאה מכל סוג. דוגמה ללולאת :
בלולאה , כל עוד התנאי מתקיים, הלולאה תמשיך לחזור על עצמה. דוגמה ללולאת :
בלולאת , הבדיקה נעשית בסוף המחזור, והמחזור הראשון מתקיים ללא תנאי. התנאי לעצירה צריך להתקיים על מנת שהלולאה תיעצר. דוגמה ללולאת :
בלולאת ישנה הכרזה של משתנה ייעודי. ברירת המחדל, הלולאה מקדמת את המשתנה שלה ב־1 כל מחזור, אבל אפשר להגדיר את קצב ההתקדמות או להפוך אותה להתקדמות שלילית בעזרת בפקודת :
תנאים.
במודולה־2, הפקודה מאפשרת בקרת זרימה לפי תנאים. אם התנאי הראשון נכשל, ניתן לשרשר מספר תנאים נוספים אחריו בעזרת , ומצב ברירת מחדל באמצעות . חשוב לציין שבשרשרת תנאים הבדיקה היא לפי סדר הופעתם. לכן, ברגע שתנאי אחד מתקיים, כל השאר אחריו מדולגים. תחביר של תנאי מלא יראה כך:
מבני נתונים.
מודולה־2 מציעה שמונה סוגים בסיסיים של טיפוסי נתונים:
בעזרת הטיפוסים הבסיסיים בשפה ניתן להרכיב טיפוסי נתונים חדשים עבור מבני נתונים מורכבים יותר כגון מערך דו־ממדי. לאחר הכרזת הטיפוסים החדשים ניתן להמשיך להרכיב בעזרתם טיפוסים מורכבים אף יותר.
מערכים.
באופן דומה להכרזת משתנים, הכרזת מערכים תיעשה בעזרת המילה , טווח האיברים מוגדר בעזרת שתי נקודות בין סוגריים מרובעים, וטיפוסיות האיברים תבוא בסוף הפקודה אחרי המילה . גישה למערכים נעשית בעזרת סוגריים מרובעים , ובמערכים רב־ממדיים מפרידים בין הממדים בעזרת פסיק : . שלא כמו בשפות אחרות, הקצאה בין משתנים שמחזיקים מערכים היא בפועל מעתיקה את המערך בינם ולא רק את המצביע. מתכנת מתחיל היה עושה זאת בעזרת לולאה, ומעתיק איבר־איבר, אך במודולה־2 מספיק להקצות את כל המערך למשתנה חדש, והוא למעשה יוצר מערך נפרד עם אותם איברים.
במודולה־2 אפשר להכריז על מערכים רב־ממדיים לאיברים מאותו טיפוס בעזרת שני תחבירים:
טיפוסי נמנים.
במודולה־2 ניתן להגדיר בעזרת רשימת מזהים בסוגריים עגולים. בדומה לטיפוס התו (), ניתן לבקש את המספר הסידורי של כל איבר במניה בעזרת הפונקציה . בנוסף, הטיפוס הבוליאני () במודולה־2 הוא מקרה פרטי של טיפוס נמנים מהצורה: . השימוש בטיפוסי נמנים הוא כשאר הטיפוסים בשפה. כלומר, משתנה מאותו טיפוס נמנים יכול להכיל בו אחד מהפריטים במנייה.
טווח משנה.
במודולה־2 ניתן להגדיר טיפוס נתונים חדש שמגביל את טווח הערכים המותר בטיפוס ערכי בלתי־רציף (כלומר, טיפוס מספרי שאינו מספר ממשי) או טיפוס נמנים קיים. לדוגמה, טווח משנה אופייני של ימי עסקים וסוף שובע בישראל בתוך ימי השבוע יוגדר כך:
רשומות.