اومتا کیست؟ توضیح بده.
اومتا (به انگلیسی: 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 &lt;: Parser Digit = super:d -&gt; d.ToDigit(), Number = Number:n Digit:D -&gt; (n * 10 + d) | Digit, AddExpr = AddExpr:x ‘+’ MulExpr:y -&gt; (x + y) | AddExpr:x ‘-’ MulExpr:y -&gt; (x - y) | MulExpr, MulExpr = MulExpr:x ‘*’ primExpr:y -&gt; (x * y) | MulExpr:x ‘/’ primExpr:y -&gt; (x / y) | PrimExpr, PrimExpr = ‘(‘ Expr:x ‘)’ -&gt; x | Number, Expr = AddExpr }می‌توان از زبان‌های نوشته شده، زیرکلاس (subclass) نیز ایجاد کرد: ometa ExponentCalc &lt;: BasicCalc MulExpr = MulExpr:x ‘^’ PrimExpr:e -&gt; Math.pow(x,e) | super }همچنین زبان‌های قبلاً نوشته شده می‌توانند به جای ارث‌بری، فراخوانی شوند: ometa ScientificCalc &lt;: Parser MathFunc :n = Token(n) Spaces, AdvExp = MathFunc(‘sqrt’) AdvExp:x -&gt; Math.Sqrt(x) | FacExp FacExp = PrimExp:x ‘!’ var r = 1; for(; x &gt; 1; x--) r *= x; return r; | PrimExp PrimExp = foreign(ExponentCalc.Expr):x -&gt; 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 به عنوان ابزار بسیار مفیدی برای نمونهٔ اولیه سازی به‌شمار می‌رود ولی برای پیاده‌سازی تولیدی زبان‌ها، ترجیح داده نمی‌شود.آیرون‌متا (IronMeta).گوردون تیشر (Gordon Tisher) در سال ۲۰۰۹، آیرون‌متا را برای دات نت ساخت. این نسخه در عین شباهت به اومتا#، یک پیاده‌سازی بسیار بیشتر پشتیبانی شده و قوی‌تر است که تحت مجوز BSD در گیت‌هاب توزیع شد.اوهم (Ohm).اوهم یک جانشین اومتا، با هدف بهبود آن به وسیلهٔ (در میان دیگر موارد) جداسازی نحو از اعمال معنایی است.