ماجولا ۳

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو
ماجولا-3
M3Logo.gif
پارادایم(ها) imperative, structured, procedural
طراحی‌شده توسط DEC and Olivetti
توسعه‌دهنده elego Software Solutions GmbH
ظهور در 1980s
انتشار پایدار 5.8.6 / July 14, 2010
انتشار پیش‌نمایش 5.8.6 / July 14, 2010
نظم تایپ strong, static, safe or if unsafe explicitly safe isolated
پیاده‌سازی‌های بزرگ SRC Modula-3, CM3, PM3, EZM3, M3/PC Klagenfurt
گویش‌ها functional, persistent, multimedia, parallel, distributed and Network Modula-3
تأثیرگرفته از Modula-2+, Modula-2, Pascal, الگول, Oberon
تأثیرگذاشته بر Java, Python,[۱] Caml, C#
سیستم‌عامل Cross-platform (multi-platform)
پروانه متن‌باز
وب‌گاه [۱]

ماجولا-۳ در علوم کامپیوتر ماجولا-۳ به عنوان یک آپدیت موفق ماجولا-۲ به نام ماجولا-۲+ تصور می‌شود.
با وجود اینکه این زبان به عنوان زبانی در سیکل تحقیقات زبان‌های دیگر (در طراحی زبان‌های جاوا، سی شارپ و جاوا) تاثیرگذار بوده است ولی به صورت گسترده در صنعت مورد استفاده قرار نگرفته است. این زبان در اواخر دهه ۱۹۸۰ توسط لوکا کاردلی، جیم دوناهو، لوسیل گلاسمن، مایک جردن (در لابراتوار تکنولوژی‌های نرم‌افزاری اولیوت)، بیل کالسو و گرگ نلسون در شرکت مرکزی تحقیقات سیستمی تجهیزات دیجیتال و تحقیقات مرکزی اولیوتی طراحی شده است.
ویژگی‌های اصلی ماجولا-۳ سادگی و امنیت می‌باشد که دلایلی بر قدرت یک زبان است و این ویژگی‌ها زبان را قدرتمند نگاه می‌دارد. با وجود اینکه ماجولا-۳ قصد داشت که امنیت وجود در زبان پاسکال را داشته باشد قصد معرفی ساختاری جدید برای زبان‌های کاربردی جهانی را نیز داشت. ماجولا-۳ پشتیبانی برنامه نویسی عمومی (مثل قالب‌ها)، چند نخ، کنترل استثنا، بازیابی زباله، برنامه نویسی شی گرا، آشکار سازی و نشانه واضح کدهای نا امن را به زبان خود افزود.
دلیل اصلی طراحی ماجولا-۳ این بود که زبانی طراحی شود که عمدهٔ ویژگی‌های زبان‌های امری را در فرم ساده‌ای در برداشته باشد. بنابراین ویژگی‌های مشخص خطرناک و پیچیده مانند وراثت چندگانه و بارگذاری برروی اپراتور حذف شدند.

تاریخچه توسعه[ویرایش]

پروژه ماجولا-۳ در نوامبر سال ۱۹۸۶ هنگامی که ماریس وایکس به نیکلاس ویس چند ایده در مورد ورژن جدید ماجولا نوشت شروع شد. وایکس که در DEC کار می‌کرد فقط به این نکات بسنده کرد و به انگلیس بازگشت و به صفحه استراتژی پژوهشی اولیوتیس پیوست. ویس به اوبرون انتقال داده شده بود ولی مشکلی به کار کردن به نام ماجولا مشکلی نداشت. زبان در آگوست سال ۱۹۸۸ به صورت کامل تعریف شد و در جون ۱۹۸۹ به ورژن جدید آپدیت شد. بلافاصله کامپایلری از طرف DEC و الیوت معرفی شد و قسمت سوم بعد از آن اجرا شد.
طراحی این زبان تحت تاثیر زیاد زبان ماجولا -2 که در آن زمان در SRC و در مرکز تحقیقات کامپیوتری ACRON بود که این زبان در سیستم عامل برای پردازنده های VAX ، DEC Firefly نوشته شده بود ، و کامپایلر ACRON (CAMEL ) نیز برای گسترش زبان ماجولا-2 در ARC برای پروژه سیستم عامل ARX برای ARM که بر پایه ی دسته ی کامپیوترهای Acron Archimedes بود ساخته شده بود .
آنگونه که اعلام شده است زبان ماجولا-3 از زبان های هم چوم Mesa ، Cedar ، Object Pascal ، Oberon ، و Euclid تاثیرپذیر یوده و گرفته شده است .
در دهه ی 1980 ، ماجولا-3 ، به عنوان زبان قابل توجهی برای آموزش در نظر گرفته شد ولی هرگز این زبان برای استفاده های صنعتی پذیرفته نشد . کمک به این زبان میتوانست برابر از بین رفتن DEC باشد ( بخصوص در زمانی که قبل از فروش DEC در سال 1998 متوقف شده بود ) . در هر صورت علی رغم سادگی و قدرت ماجولا-3 به نظر میرسد تقاضا برای زبان کامپایلر بیس رویه ای و جود دارد که کمی از ویژگی های شی گرایی را داشته باشد . در یک بازه ی زمانی یک کامپایلر تجاری به نام CM3 توسط یکی از متخصصان پیاده سازی ارشد در DEC SRC که قبلا توسط DEC که در آن استخدام شده بود توسط Compaq ( دارای مجوز در فرمت های باینری و ساخته شده در Reactor ) بود فروخته شد که این نظر به وسیله Critical Mas بود اما شرکت فعال ceased در سال قسمتی از سورس این محصول را به elego software solution GmbH فروخته شد .
ماجولا-3 در حال حاضر در دانشگاه ها عمدتا در دوره های تدریس زبان های برنامه نویسی تدریس می شود که کتاب هایش خارج از چاپ است . اساسا تنها حامی ماجولا-3 شرکت بزرگ elego software solution GmbH بوده است که سورس اصلی را از Critical Mas ارث برده است و تا کنون انتشارهای زیادی از سیستم CM3 برای سورس و کدهای باینری صورت گرفته است . Reactor IDE منبع متن بازی بود که بعد از چند سال انتشار یافت و با نام CM3 IDE نام نگرفته بود .

نحو زبان[ویرایش]

مثالی ساده از برنامه ی Hello Word با نحو زبان ماجولا-3 :

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

برنامه ها در ماجولا-3 نهایتا به یک فایل ماژول میباشد ، که این فایل دارای یک سری رابطه میباشد که برای دسترسی کلاینت ها میباشد . شبیه زبان های دیگر ماجولا-3 نیز میتواند یک ماژول اصلی داشته باشد که میتواند مثلا 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 . حتی شمارش ما را مجبور به استفاده از ‘.’ میکند وقتی که میخواهیم به فیلد از یک رکورد دسترسی داشته باشیم .

برنامه نویسی شی گرا[ویرایش]

برنامه نویسی با استفاده از تکنیک های شی گرا در ماجولا -3 استفاده شده است اما استفاده از آنها مورد احتیاج نیست . خیلی از ویژگی های دیگری که در ماجولا-3 مانند ماژول و اینترفیس وجود دارد که بجای استفاده از برنامه نویسی شی گرا میتوان از آن استفاده کرد . پشتیبانی از شی به خاطر سادگی در استفاده از آن می باشد . یک نوع شی ( کلاس در زبان های دیگر ) با استفاده از OBJECT معرفی میشود که نحوه شبیه به رکورد و معرفی آن دارد اگرچه یک نوع شی از نوع مرجع میباشد ، گرچه رکوردها در ماجولا-3 وجود ندارند . نوع های خروجی معمولا با T نام گذاری میشوند و یک تایپ Public به صورت جداگانه برای متدها و داده ها ساخته میشود برای مثال :
source lang="modula3"> INTERFACE Person;

TYPE T <: Public;

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

END Person. </source> این برنامه یک اینترفیس به نام Person را تعریف مینماید همراه دو T و یک Public که شی را همراه دو روش تعریف مینماید getage() و init() ، و T به عنوان یک زیر نوع از Public با استفاده زا :> تعریف میشود .
برای ساخت یک Person.T جدید از NEW استفاده میشود همراه با استفاده از روش init .

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

ساختار REVAL در ماجولا-3 یک مکانیزم قدرتمند ، ساده و تمیز را برای پیاده سازی جزییات از دید کاربر را ارائه میدهد ، با سطح های مختلف "friendliness" .
REVAL را برای نشان دادن کاربرد کامل آن در Person نشان میدهیم .

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.

نکته استفاده از BRANCH شی "brands" برای یکی ساختن به عنوان اجتناب از مساوی های ساختاری . BRANDED میتواند یک رشته را به عنوان آرگومان دریافت نماید اما وقتی حذف میشود یک رشته برای ما تولید میکند.
ماجولا-3 یکی از محدود زبان هایی است که به ماژول مرجع بیرونی احتیاج دارد که به صورت واضح توصیف شده است . مثلا ماژول A یک مرجع به شی X دارد که این شی از ماژول B درست شده است پس باید از B.X استفاده شود . در ماجولا-3 نمیتوان از تمامی نام های export شده از یک ماژول استفاده کرد . بخاطر احتیاجات زبان در نام ها و رونویسی روش ها میتوان کاری را از انجام متوقف کرد با استفاده از اعلاناتی که به یک میانجی میدهیم ( هر میانجی موجود ).
این امکان این اختیار را به ما میدهد که بتوان در حین اجرای برنامه ، برنامه ی نوشته شده را ویرایش کرد بدون هیچگونه نگرانی در مورد برخورد چند برنامه با هم و میتوان هسته ی اصلی کتابخانه های زبان را با دانش قطعی در مورد زبان ویرایش کرد بدون اینکه برنامه های موجود دچار هیچگونه گسستگی شود .

استثنا[ویرایش]

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

چند روندها[ویرایش]

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

خلاصه[ویرایش]

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

منابع[ویرایش]

  1. http://www.python.org/doc/essays/foreword/ Foreword for "Programming Python" (1st ed.)

پیوند به بیرون[ویرایش]

پیوند به بیرون[ویرایش]