اومتا

اومتا (به انگلیسی: OMeta) یک زبان برنامه‌نویسی شی‌گرا و مخصوص تطبیق الگو است که توسط الساندر وارث (Alessandro Warth) و ایان پیمارتا (Ian Piumarta) در سال ۲۰۰۷ زیر نظر موسسهٔ تحقیقاتی ViewPoints توسعه یافته‌است. این زبان با هدف فراهم آوردن «یک روش طبیعی و راحت برای برنامه‌نویسان به منظور پیاده‌سازی توکن‌سازها، تجزیه کننده‌ها، بازدیدگرها و تبدیل‌کننده‌های درختی»، به جای دستور زبان‌های مستقل از متن (CFG) بر اساس دستور زبان‌های تجزیهٔ عبارت (PEG) است.

هدف اصلی اومتا این است که به مخاطبان گسترده‌تری اجازه دهد تا از تکنیک‌هایی مانند تجزیه که عموماً تنها برای برنامه‌نویسان زبان فراهم است، استفاده کنند. همچنین اومتا برای کاربردش در ساخت سریع نمونه‌های اولیه (prototype) نیز مشهور است؛ اگرچه برنامه‌های نوشته شده به زبان اومتا عموماً نسبت به برنامه‌هایی که در پیاده‌سازی وانیلی (زبان پایه)، مانند جاوااسکریپت نوشته شده‌اند، کم‌تر بهینه هستند.

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

شرح 
اومتا یک فرازبان است که در ساخت نمونه‌های اولیه و زبان‌های خاص دامنه استفاده می‌شود و به عنوان یک «زبان شی‌گرا برای تطبیق الگو» معرفی شده‌است. این فرازبان از دستور زبان‌های تجزیهٔ عبارت (PEG) (توصیف‌هایی از زبان «بر اساس تشخیص رشته‌ها به جای تولید آن‌ها») استفاده می‌کند که برای مدیریت انواع دلخواه داده، مانند کاراکتر، عدد، رشته، اتم و لیست طراحی شده‌اند. این امر تطبیق پذیری زبان را افزایش می‌دهد و آن را قادر می‌سازد تا روی هر دو نوع دادهٔ ساخت‌یافته و دادهٔ بدون ساختار، کار کند.

مزیت اصلی این زبان بر زبان‌های مشابهش، توانایی آن در استفاده از کد یکسان در تمام مراحل کامپایل است (مثلاً تحلیل لغوی و تجزیه). همچنین اومتا از تعریف قوانین تولید بر اساس آرگومان‌ها نیز پشتیبانی می‌کند؛ این ویژگی می‌تواند برای افزودن چنین قوانینی به خود اومتا یا زبان میزبانی که اومتا روی آن اجرا می‌شود، مورد استفاده قرار گیرد. به علاوه، این قوانین می‌توانند از یکدیگر به عنوان آرگومان استفاده کرده و «قوانین مرتبه بالاتر» بسازند یا از یکدیگر ارث‌بری کنند تا از کد موجود، قوانین تولید به دست آورند. اومتا می‌تواند از نوع داده‌های بولی (درست/نادرست) زبان میزبان در حین تطبیق الگو استفاده کند؛ این‌ها به عنوان «محمولات معنایی» شناخته می‌شوند. اومتا از تطبیق الگوی تعمیم‌یافته استفاده می‌کند تا به برنامه‌نویسان اجازه دهد راحت‌تر مراحل کامپایل را با یک ابزار واحد پیاده‌سازی کنند و گسترش دهند.

اومتا از گرامرها برای تعیین قوانینی که در آن عمل می‌کند، استفاده می‌کند. به دلیل استفاده از تابع __init__ که هنگام ایجاد یک گرامر فراخوانی می‌شود، گرامرها می‌توانند تعداد نامشخصی متغیر نگه دارند. گرامرها دقیقاً مانند کلاس‌ها در زبان‌های برنامه‌نویسی کامل، می‌توانند از یک‌دیگر ارث‌بری کنند یا یک‌دیگر را فراخوانی کنند (استفاده از «مکانیسم فراخوانی تولید خارجی» به گرامرها اجازه می‌دهد تا جریان ورودی یکدیگر را «قرض» بگیرند). همچنین اومتا برخلاف بسیاری از فرازبان‌ها، گزینه‌های یک گرامر داده شده را برای رفع ابهام، اولویت‌بندی می‌کند. پس از تطبیق الگوی یک ورودی با یک گرامر داده شده، امتا هر مولفه از الگو را به یک متغیر که بعداً به زبان میزبان می‌دهد، تخصیص می‌دهد.

اومتا از تطبیق الگو استفاده می‌کند تا تمام گام‌های کامپایل سنتی را به تنهایی انجام دهد. به این صورت که ابتدا در کاراکترها الگو می‌یابد تا توکن‌ها را بسازد، سپس این توکن‌ها را با گرامرشان تطبیق می‌دهد تا درخت‌های نحو را بسازد. بعد از آن، کنترل‌کننده‌های نوع، الگوهای درخت‌های نحو را تطبیق می‌دهند تا درخت‌های حاشیه‌نویسی بسازند. بازدیدگرها نیز برای تولید درخت‌های دیگر، به‌طور مشابه عمل می‌کنند. سپس یک مولد کد، درخت‌ها را تطبیق الگو می‌کند تا کد را تولید کند. در اومتا «پیمایش درخت تجزیه آسان است؛ چرا که این عملکرد، به صورت بومی پشتیبانی می‌شود».

این فرازبان برای قابل استفاده بودن در بیشتر زبان‌های برنامه‌نویسی مورد توجه قرار گرفته‌است؛ اگرچه معمولاً در زبان پیاده‌سازی‌اش استفاده می‌شود - مثلاً اومتا/جاوااسکریپت (OMeta/JS) در جاوااسکریپت استفاده می‌شود. چون اومتا به یک زبان میزبان نیاز دارد، سازندگانش از آن به عنوان «زبان انگلی» یاد می‌کنند.

توسعه 
الساندرو وارث و ایان پیمارتا در سال ۲۰۰۷ و در مؤسسهٔ تحقیقاتی ViewPoints، سازمانی با هدف بهبود سیستم‌های تحقیقات و رایانش شخصی، اومتا را توسعه دادند. آن‌ها در ابتدا از یک معماری ترکیبی لامبدا شی یا COLA (یک زبان خود توصیف که در مؤسسهٔ تحقیقاتی ViewPoints درحال بررسی بود) به عنوان زبان میزبان اومتا استفاده کردند و سپس با یاری یوشیکی اوشیما (Yoshiki Ohshima)، آن را به Squeak Smalltalk منتقل کردند تا قابلیت استفادهٔ آن از چندین زبان میزبان را تأیید کنند. همچنین اومتا در مقالهٔ مقدماتی خود، به عنوان یک مطالعهٔ موردی برای «پیاده‌سازی یک زیرمجموعهٔ تقریباً کامل از جاوااسکریپت» استفاده شد.

استفاده 
اومتا، مانند دیگر فرازبان‌ها، در درجهٔ اول برای ساخت زبان‌های خاص دامنه (DSL) و به‌طور خاص برای نمونهٔ اولیه سازی سریع DLSها استفاده می‌شود. سرعت اجرای کم اومتا و گزارش خطای ناواضح آن، بسیاری از عملکردهایش را به عنوان یک زبان برنامه‌نویسی کامل از بین می‌برد. اومتا به علت تواناییش در استفاده از یک نحو واحد برای تمام مراحل کامپایل مفید است و باعث می‌شود به جای چندین ابزار جداگانه در ساخت کامپایلر استفاده شود. علاوه بر این، اومتا هم به خاطر سرعت استفاده از آن برای ایجاد DSLها و هم میزان کد قابل توجه کم‌تری که برای انجام چنین کاری در مقایسه با پیاده‌سازی وانیلی نیاز دارد، ارزشمند است. گزارش‌هایی نشان می‌دهند که تعداد خط کدهای کارکننده برای اومتا حدود ۲۶٪ پیاده‌سازی وانیلی است.

مثال‌ها 
در زیر، نمونه‌ای از زبان یک ماشین حساب ساده در #C با استفاده از اومتا آمده‌است: ometa BasicCalc <: Parser
 {
  Digit  = super:d                    -> d.ToDigit(),
  Number = Number:n Digit:D           -> (n * 10 + d)
         | Digit,
  AddExpr = AddExpr:x ‘+’ MulExpr:y  -> (x + y)
          | AddExpr:x ‘-’ MulExpr:y  -> (x - y)
          | MulExpr,
  MulExpr = MulExpr:x ‘*’ primExpr:y -> (x * y)
          | MulExpr:x ‘/’ primExpr:y -> (x / y)
          | PrimExpr,
 PrimExpr = ‘(‘ Expr:x ‘)’  -> x
          | Number,
     Expr = AddExpr
 }می‌توان از زبان‌های نوشته شده، زیرکلاس (subclass) نیز ایجاد کرد: ometa ExponentCalc <: BasicCalc
 {
   MulExpr = MulExpr:x ‘^’ PrimExpr:e -> Math.pow(x,e)
           | super
 }همچنین زبان‌های قبلاً نوشته شده می‌توانند به جای ارث‌بری، فراخوانی شوند: ometa ScientificCalc <: Parser
 {
       MathFunc :n = Token(n) Spaces,
   AdvExp          = MathFunc(‘sqrt’) AdvExp:x -> Math.Sqrt(x)
                   | FacExp
   FacExp          = PrimExp:x ‘!’
                       ->  {
                                 var r = 1;
                                 for(; x > 1; x--)
                                 {
                                   r *= x;
                                 }
                                 return r;
                           }
                   | PrimExp
   PrimExp         = foreign(ExponentCalc.Expr):x -> x
   Expr     = AdvExp
 }

نسخه‌ها 
از نظر تئوری، اومتا می‌تواند در هر زبان میزبانی پیاده‌سازی شود ولی اغلب به عنوان OMeta/JS، یک پیاده‌سازی از جاوااسکریپت استفاده می‌شود. وارث گفته‌است که الگوها در «OMeta/X که X یک زبان میزبان است» بهتر است تحت تأثیر X قرار گیرند تا این که با اومتا استاندارد شوند؛ به دلیل این واقعیت که زبان‌های میزبان مختلف انواع مختلفی از اشیا را تشخیص می‌دهند.

متاکولا (MetaCOLA) 
متاکولا اولین پیاده‌سازی از اومتا بود که در مقالهٔ معرفی زبان، استفاده شد. متاکولا اولین کدهای تست اومتا را پیاده‌سازی کرد و یکی از سه شکل (بقیه OMeta/Squeak و یک OMeta/JS تقریباً تمام شده) زبان که پیش از انتشار آن ساخته شدند، بود.

OMeta/Squeak 
OMeta/Squeak یک درگاه اومتا بود که در نمایش‌های اولیهٔ سیستم، مورد استفاده قرار گرفت. OMeta/Squeak برای «آزمایش با نحوهای جایگزین در سیستم Squeak EToys» استفاده می‌شود. OMeta/Squeak برخلاف OMeta/JS که در عملیات قوانین تنها به قلاب ([و]) نیاز دارد، به قلاب و پرانتز احتیاج دارد. با این حال، OMeta/Squeak ۲ نحوی شبیه‌تر به OMeta/JS دارد. برخلاف پیاده‌سازی COLA از اومتا، نسخهٔ Squeak نتایج میانی را به خاطر نمی‌سپرد. (ذخیره‌سازی اعدادی که قبلاً در محاسبات استفاده شده‌اند)

اومتا/جاوااسکریپت (OMeta/JS) 
OMeta/JS یک پیاده‌سازی از اومتا در قالب جاوااسکریپت است. پیاده‌سازی‌های زبانی با استفاده از OMeta/JS نسبت به مواردی که فقط با استفاده از جاوااسکریپت وانیلی نوشته شده‌اند، برای استفاده راحت‌تر و در حافظه کارآمدتر هستند، اما نشان داده شده‌است که عملکرد بسیار کندتری دارند. به همین علت، OMeta/JS به عنوان ابزار بسیار مفیدی برای نمونهٔ اولیه سازی به‌شمار می‌رود ولی برای پیاده‌سازی تولیدی زبان‌ها، ترجیح داده نمی‌شود.

اومتا# (#OMeta) 
#OMeta پروژه‌ای از جف موزر (Jeff Moser) برای ترجمهٔ OMeta/JS به یک عملکرد سی شارپ است. به این ترتیب، طراحی #OMeta براساس طراحی OMeta/JS الساندرو وارث است. هدف این پروژه، این است که به کاربران امکان درست کردن زبان‌های کاری با سادگی بالا را بدهد. به‌طور خاص، #OMeta قصد دارد به عنوان یک ابزار تنها برای توسعهٔ زبان دات نت کار کند، منحنی یادگیری تیز توسعهٔ زبان را کاهش دهد، به منبعی مفید برای یادگیری تبدیل شود و برای استفاده در برنامه‌های واقعی، کاربردی باشد. در حال حاضر #OMeta از سی شارپ ۳ به جای ۴ عنوان زبان میزبان اومتا استفاده می‌کند؛ چرا که سی شارپ ۳ یک زبان ایستا است و تشخیص زبان میزبان با #OMeta با یک زبان نوع پویا، می‌توانست دو تا سه برابر زشت‌تر و بزرگ‌تر باشد.

#OMeta از کلاس‌ها و نوع‌های دات نت به عنوان گرامرها و از توابع به عنوان «قوانین» داخلی گرامرها استفاده می‌کند. #OMeta از آکولاد ({ و }) برای تشخیص زبان میزبانش در گرامرها استفاده می‌کند. این زبان دقیقاً مانند زبان میزبانش، روی تعیین نوع قوی، تمیز و ایستا تمرکز دارد که به پیچیدگی ساخت زبان، می‌افزاید. پیاده‌سازی‌های جدید سی شارپ نیز باید با فرازبان دات نت سازگار باشند که این خود، ساخت زبان را پیچیده‌تر می‌کند. به علاوه، برای جلوگیری از سو استفادهٔ کاربران از فراقوانین #OMeta، موزر می‌خواهد آن‌ها را به عنوان «یک رابط صریح که از طریق یک ویژگی در معرض دید قرار می‌گیرد» پیاده‌سازی کند. (مثلاً به جای «_apply»، یک «MetaRules.Apply» داریم) بخش‌های بعدی #OMeta در خود زبان نوشته می‌شود، اگرچه عملکرد زبان تا حد زیادی به سی شارپ وابسته است. کد #OMeta روی Codeplex قرار داده شده‌است و قرار است به عنوان یک پروژهٔ منبع-باز باقی بماند. با این حال، به‌روزرسانی‌ها از کمی پس از آغاز پروژه، با recommitهایی از سرور در ۱ اکتبر ۲۰۱۲، وقفهٔ نامشخصی داشته‌اند.

آیرون‌متا (IronMeta) 
گوردون تیشر (Gordon Tisher) در سال ۲۰۰۹، آیرون‌متا را برای دات نت ساخت. این نسخه در عین شباهت به اومتا#، یک پیاده‌سازی بسیار بیشتر پشتیبانی شده و قوی‌تر است که تحت مجوز BSD در گیت‌هاب توزیع شد.

اوهم (Ohm) 
اوهم یک جانشین اومتا، با هدف بهبود آن به وسیلهٔ (در میان دیگر موارد) جداسازی نحو از اعمال معنایی است.

جستارهای وابسته 
 انتلر (ANTLR) (ابزار دیگری برای تشخیص زبان)، یک فرازبان مشابه
 متا دوم (META II) یک کامپایلر-کامپایلر اولیه، تأثیرگذار در پیاده‌سازی اومتا
 ریپازیتوری گیت‌هاب اومتا/جاوااسکریپت

منابع 

زبان‌های برنامه‌نویسی شیءگرا
تولیدکننده‌های تجزیه‌گر