ماجولا ۳

تاریخچه توسعه

پروژه ماجولا-۳ در نوامبر سال ۱۹۸۶ هنگامی که ماریس وایکس به نیکلاس ویس چند ایده در مورد ورژن جدید ماجولا نوشت شروع شد. وایکس که در DEC کار می‌کرد فقط به این نکات بسنده کرد و به انگلیس بازگشت و به صفحه استراتژی پژوهشی اولیوتیس پیوست. ویس به اوبرون انتقال داده شده بود ولی مشکلی به کار کردن به نام ماجولا مشکلی نداشت. زبان در آگوست سال ۱۹۸۸ به صورت کامل تعریف شد و در جون ۱۹۸۹ به ورژن جدید آپدیت شد. بلافاصله کامپایلری از طرف DEC و الیوت معرفی شد و قسمت سوم بعد از آن اجرا شد.

طراحی این زبان تحت تأثیر زیاد زبان ماجولا -۲ که در آن زمان در SRC و در مرکز تحقیقات کامپیوتری ACRON بود که این زبان در سیستم عامل برای پردازنده‌های VAX، DEC Firefly نوشته شده بود، و کامپایلر ACRON (CAMEL) نیز برای گسترش زبان ماجولا-۲ در ARC برای پروژه سیستم عامل ARX برای ARM که بر پایهٔ دستهٔ کامپیوترهای Acron Archimedes بود ساخته شده بود .

آنگونه که اعلام شده‌است زبان ماجولا-۳ از زبان‌های هم چوم Mesa، Cedar، Object Pascal، Oberon، و Euclid تأثیرپذیر یوده و گرفته شده‌است .

در دههٔ ۱۹۸۰، ماجولا-۳، به عنوان زبان قابل توجهی برای آموزش در نظر گرفته شد ولی هرگز این زبان برای استفاده‌های صنعتی پذیرفته نشد.
کمک به این زبان می‌توانست برابر از بین رفتن DEC باشد (بخصوص در زمانی که قبل از فروش DEC در سال ۱۹۹۸ متوقف شده بود). در هر صورت علی‌رغم سادگی و قدرت ماجولا-۳ به نظر می‌رسد تقاضا برای زبان کامپایلر بیس رویه‌ای و جود دارد که کمی از ویژگی‌های شی گرایی را داشته باشد.
در یک بازهٔ زمانی یک کامپایلر تجاری به نام CM3 توسط یکی از متخصصان پیاده‌سازی ارشد در DEC SRC که قبلاً توسط DEC که در آن استخدام شده بود توسط Compaq (دارای مجوز در فرمت‌های باینری و ساخته شده در Reactor) بود فروخته شد که این نظر به وسیله Critical Mas بود اما شرکت فعال ceased در سال قسمتی از سورس این محصول را به elego software solution GmbH فروخته شد .

ماجولا-۳ در حال حاضر در دانشگاه‌ها عمدتاً در دوره‌های تدریس زبان‌های برنامه‌نویسی تدریس می‌شود که کتاب‌هایش خارج از چاپ است.
اساساً تنها حامی ماجولا-۳ شرکت بزرگ elego software solution GmbH بوده‌است که سورس اصلی را از Critical Mas ارث برده است و تا کنون انتشارهای زیادی از سیستم CM3 برای سورس و کدهای باینری صورت گرفته‌است. Reactor IDE منبع متن بازی بود که بعد از چند سال انتشار یافت و با نام CM3 IDE نام نگرفته بود.

نحو زبان

مثالی ساده از برنامهٔ Hello Word با نحو زبان ماجولا-۳ :
 MODULE Main;
 IMPORT IO;
 BEGIN
   IO.Put("Hello World\n")
 END Main.
برنامه‌ها در ماجولا-۳ نهایتاً به یک فایل ماژول می‌باشد، که این فایل دارای یک سری رابطه می‌باشد که برای دسترسی کلاینت‌ها می‌باشد. شبیه زبان‌های دیگر ماجولا-۳ نیز می‌تواند یک ماژول اصلی داشته باشد که می‌تواند مثلاً Main.m3 نام بگیرد یا اینکه فایل می‌تواند ماژول اصلی را از طریق دستور export صدا زده شود .
MODULE Foo EXPORTS Main
بهتر است در این زبان فایل ماژول‌ها با نام اصلی ماژول نام گذاری شود و اگر این اتفاق صورت نگیرد کامپایلر پیغام خطا صادر خواهد شد .

کنوانسیون دیگر در نحو زبان شامل میانجی‌های نام گرفته به نام T که با نام کامل باید نام گرفته شود، مثلاً T با نام Foo.T در ماژول Foo نام خواهد گرفت که در قابلیت خوانایی کمک می‌کند، برای نام گذاری ماژول Public نیز از نحوهٔ نوشتن Public استفاده می‌شود.

ماژولاریتی

اولین و بهترین ویژگی این است که گردآوری واحدها که خواه INTERFACE یا پیاده‌سازی ماژول باشد از بک نوع هستند. یک واحد گردآوری شده میانجی توسط کلمه کلیدی INTERFACE شروع می‌شود و ثابت‌ها، تایپ‌ها، متغیرها، استثناها و فرایندهای را معنی می‌نماید. ماژول شدن با آوردن کلمهٔ کلیدی MODULE در ابتدا محقق می‌شود و کد واقعی را فراهم می‌آورد و ثابتی، توعی یا متغیری اضاقی برای پیاده‌سازی میانجی‌ها احتیاج است.

به‌طور میانجی‌ها باید اسمی که ماژول به کار می‌برند را به کار ببرند ولی اگر ماژولی به صورت ضمنی در ماژول دیگری استفاده شود با دستور Export احتیاجی به این کار نیست، برای نمونه برنامهٔ اصلی ماژولی را برای میانجی اصلی پیاده‌سازی می‌کند و خروجی می‌دهد .
 MODULE HelloWorld EXPORTS Main;
 IMPORT IO;
 BEGIN
   IO.Put("Hello World\n")
 END Main.
هر واحد گرد آوری شده شاید میانجی را IMPORT کند و زیر نظر کنترلر برنامه آیتم‌هایی را در میانجی‌ها شامل شود.
به‌طور نمونه برای دسترسی به محتوای داخلی ماژول می‌توان از حرف "." استفاده نمود (مانند دسترسی به رکوردها) یک استفاده معمولی این است که یک داده ساختار را برای هر میانجی معرفی می‌کنیم با هرگونه پشتیبانی. در اینجا مثلاً به داده نوع T دسترسی خواهیم داشت با استفاده از MyModule.T

ایمنی در برابر نا امنی

بعضی از ویژگی‌ها به نظر می‌رسد نا امنی هستنئ، مثلاً زمانی که کامپایلر اطمینان نمی‌دهد که داده و نتیجه زمان زیادی موجود باشد (مثل زمانی که با برنامه‌نویسی c تداخل پیدا می‌کند) بکار بردن کلمهٔ UNSAFE در جلوی INTERFACE یا ماژول به این منظور است که به کامپایلر بفهماند که ویژگی‌های سطح پایین از زبان را فعال کن. برای مثال بکاربردن کلمهٔ UNSAFE به منظور LOOP HOLE یعنی اجازهٔ کپی کردن بیت‌های عدد صحیح در عدد ممیز شناور و REAL .

interface ای که ماژول را نا امنی را خروجی می‌دهد خود نیز باید نا امن باشد. interface امن شاید به کارگیری یک ماژول نا امن تولید شود. این استفاده معمول است وقتی که میانجی گری می‌کنید به کتابخانه‌ای بیرونی وقتی که دومیانجی ساخته شده‌است (یکی نا امن و دیگری امن)

عمومی

interface عمومی و ماژول وابستهٔ عمومی آن با استفاده از کلمهٔ کلیدی GENERIC در ابتدای کلمهٔ INTERFACE یا MODULE ساخته می‌شود و به عنوان آرگومان‌های رسمی دیگیر interfaceها قرار می‌گیرد .

در نتیجه (مثل زبان C ++) به راحتی می‌توان داده‌های نوع انتزاعی را تعریف و استفاده نمود اما نه کاملاً مثل C++، دانه‌دانه بودن در سطح ماژول می‌باشد .

برای مثال، می‌توان GENERIC STACK را تعریف نمود سپس آن را به وسیله INTERFACE، Real یا حتی ارجاع به اشیا معرفی کرد. هر INTERFACE ماژول باید به یک interface عمومی پاس داده شود و در ماژول به عنوان آرگومان واقعی بکارگیری شود و کامپایلر ماژول را به صورت مرتب تولید خواهد نمود .

قابلیت ردیابی

هر کدام از معین کننده‌های هویت می‌توانند پیگیری شوند که درکجا تولید شده‌اند که شبیه include در زبان‌های دیگر نیست. یک واحد یکپارچه باید معرفی کننده‌ها را از یک واحد یکپارچه دیگر وارد خود کند، با استفاده از کلمهٔ IMPORT. حتی شمارش ما را مجبور به استفاده از ‘. ’ می‌کند وقتی که می‌خواهیم به فیلد از یک رکورد دسترسی داشته باشیم .

برنامه‌نویسی شی گرا

برنامه‌نویسی با استفاده از تکنیک‌های شی گرا در ماجولا -۳ استفاده شده‌است اما استفاده از آن‌ها مورد احتیاج نیست. خیلی از ویژگی‌های دیگری که در ماجولا-۳ مانند ماژول و اینترفیس وجود دارد که بجای استفاده از برنامه‌نویسی شی گرا می‌توان از آن استفاده کرد. پشتیبانی از شی به خاطر سادگی در استفاده از آن می‌باشد. یک نوع شی (کلاس در زبان‌های دیگر) با استفاده از OBJECT معرفی می‌شود که نحوه شبیه به رکورد و معرفی آن دارد اگرچه یک نوع شی از نوع مرجع می‌باشد، گرچه رکوردها در ماجولا-۳ وجود ندارند. نوع‌های خروجی معمولاً با T نام گذاری می‌شوند و یک تایپ Public به صورت جداگانه برای متدها و داده‌ها ساخته می‌شود برای مثال :
INTERFACE Person;TYPE T <: Public;
  Public = OBJECT
  METHODS
  getAge(): INTEGER;
  init(name: TEXT; age: INTEGER): T;
  END;END Person.
این برنامه یک اینترفیس به نام Person را تعریف می‌نماید همراه دو T و یک Public که شی را همراه دو روش تعریف می‌نماید getage() و init()، و T به عنوان یک زیر نوع از Public با استفاده زا :> تعریف می‌شود .

برای ساخت یک Person.T جدید از NEW استفاده می‌شود همراه با استفاده از روش init .
VAR jim := NEW(Person.T).init("Jim", 25);
ساختار REVAL در ماجولا-۳ یک مکانیزم قدرتمند، ساده و تمیز را برای پیاده‌سازی جزییات از دید کاربر را ارائه می‌دهد، با سطح‌های مختلف "friendliness".

REVAL را برای نشان دادن کاربرد کامل آن در Person نشان می‌دهیم .
MODULE Person;REVEAL T = Public BRANDEDOBJECT
  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;BEGINEND Person.
نکته استفاده از BRANCH شی "brands" برای یکی ساختن به عنوان اجتناب از مساوی‌های ساختاری. BRANDED می‌تواند یک رشته را به عنوان آرگومان دریافت نماید اما وقتی حذف می‌شود یک رشته برای ما تولید می‌کند.

ماجولا-۳ یکی از محدود زبان‌هایی است که به ماژول مرجع بیرونی احتیاج دارد که به صورت واضح توصیف شده‌است. مثلاً ماژول A یک مرجع به شی X دارد که این شی از ماژول B درست شده‌است پس باید از B.X استفاده شود. در ماجولا-۳ نمی‌توان از تمامی نام‌های export شده از یک ماژول استفاده کرد.
بخاطر احتیاجات زبان در نام‌ها و رونویسی روش‌ها می‌توان کاری را از انجام متوقف کرد با استفاده از اعلاناتی که به یک میانجی می‌دهیم (هر میانجی موجود).

این امکان این اختیار را به ما می‌دهد که بتوان در حین اجرای برنامه، برنامهٔ نوشته شده را ویرایش کرد بدون هیچگونه نگرانی در مورد برخورد چند برنامه با هم و می‌توان هستهٔ اصلی کتابخانه‌های زبان را با دانش قطعی در مورد زبان ویرایش کرد بدون اینکه برنامه‌های موجود دچار هیچگونه گسستگی شود .

استثنا

مدیریت استثنا از طریق بلوک TRY...EXCEPT معمول می‌باشد.
یک ویژگی که در زبان‌های دیگر پذیرفته نشد، در دلفی، پایتون، اسکالا، ویژوال بیسیک دات نت این است که EXPECT در این زبان‌ها استفاده نشده‌است و شرطی مانند Switch statement مورد استفاده قرار گرفته‌است، ماجولا-۳ نیز ساختار LOOP...EXIT...END را دارد که در حلقه‌ها می‌ماند تا شرط EXIT فراهم شود یک مثال ساده مثل TRY...EXCEPT می‌باشد .

چند روندها

این زبان چند روندی را نیز پشتیبانی می‌کند و سنکرون بودن این روندها. MUTEX داده ساختاری را می‌سازد و LOCK گزارهٔ MUTEX را قفل می‌کند، در ماجولا-۳ در حال اجرا شاید استفاده از روندهای جداگانه باعث ازدیاد فضای بیهوده شود.
در این زبان ماژول استانداردی وجود دارد که runtime library نام دارد یا libm3 که نام روندها می‌باشد که پشتیبانی می‌کند از چند روندی.

خلاصه

ویژگی‌های زبان ماجولا-۳:
—ماژول‌ها و interfaceها
—کدهای نا امن را به‌طور واضح مشخص می‌کند
—عمومی
—مدیریت اتوماتیک داده‌های بیهوده
—ذخیره‌سازی تایپ‌ها
—شی گرایی
—مدیریت استثنا
—روندها