**Metamodelis** – modeliavimo kalbos modelis, kuriame apibrėžtos esminės kalbos savybės. Metamodelis turi būti tikslus išreikštinių darinių (angl. *artifacts*) ir taisyklių apibrėžimas, kuris reikalingas semantinių arba dalykinės srities modelių kūrimui.
Metamodelį sudaro:

* Koncepcijos, kurias pats metamodelis palaiko.
* Tekstinė sintaksė
* Grafinė sintaksė
* Semantika

Kas yra metamodelis ir kam jis tinkamas?
----------------------------------------

Metamodelio loginys ryšys su modeliu ir realiu pasauliu
Kurdami realaus pasaulio modelius inžinieriai dažniausiai braižo schemas arba aprašinėja realų pasaulį tam tikrais simboliais. Galima sakyti jie bendrauja tam tikra kalba. Tų kalbų yra labai daug - kiekvienai dalykinei sričiai, kiekvienai specialybei ar problemai gali būti po atskirą modeliavimo kalbą.

Toms pačioms problemoms spręsti dažniau naudojami tie patys modeliai. Tai reiškia, kad galima naudoti tą patį metamodelį. Galima teigti, jog metamodeliai unifikuoja naudojamas modeliavimo kalbas. Tuo pasinaudojus galima kurti galingus ir lanksčius projektavimo įrankius toms kalboms.

Metamodelis yra vienas iš metamodeliavimo veiklos rezultatų. Tai yra bandymas apibūdinti mus supantį pasaulį turint tam tikrą **tikslą**. Tai yra, metamodelis visada kuriamas tam tikram tikslui. Neverta naudoti metamodelio, nesuprantant kokiu tikslu jo autoriai jį sukūrė. Modelis niekada nebus idealiai tikslus. Tai tik aproksimacija, kurios sėkmė priklauso nuo to, kiek sėkmingas yra metamodelis. Modelis visada atitinka unikalų metamodelį. Tai pačiai dalykinei sričiai gali būti taikomi skirtingi modeliai, todėl ir metamodeliai skirsis. Iš to išplaukia, kad metamodelių priežiūra ir migracija yra svarbūs dalykai.

Į metamodelį galima žiūrėti iš trijų perspektyvų:

* Rinkinys blokų ir taisyklių, iš kurių galima konstruoti modelius.
* Dominančios srities modelis.
* Kito modelio egzempliorius (angl. *instance*).

Duomenų inžinerijoje, sistemų inžinerijoje ir programų inžinerijoje metamodelių panaudojimas yra vis labiau rekomenduojamas. Tai yra visiškai priešinga klasikiniams programos kodo rašymo metodams. Inžinieriams modeliai leidžia lengviau kovoti su problemų sudėtingumu.

Vienas iš aktyviausių šiuo metu modeliais paremtos inžinerijos naudojamų metodų yra OMG pasiūlyta modelių architektūra (angl. *Model - driven architecture*). Šis būdas remiasi kalbos panaudojimu rašant metamodelius, vadinamus metaobjektų įranga (angl. *Meta object facility*) arba MOF. Tipiniai metamodeliai pasiūlyti OMG yra UML, SysML, SPEM arba CWM. ISO taip pat pasiūlė standartinį metamodelį ISO/IEC 24744.

Metamodelio sandara
-------------------

Kadangi į metamodelį galima žiūrėti kaip į kalbą, tai jį sudaro šios dalys:

* Abstrakti sintaksė. Kokios koncepcijos ir ryšiai yra toje kalboje.
* Konkreti sintaksė. Kaip tiksliai užrašomos tos koncepcijos ir ryšiai. Tai detaliausias lygmuo.
* Semantika. Ką reiškia koncepcijos ir ryšiai.

Bendrai, metamodelio architektūra remiantis OMG MOF1.X gali būti tokia:

* Programos duomenys, t. y. veikianti programa. Žemiausias lygmuo.
* Pats programos aprašas - kodas.
* Kalbos, naudotos parašyti kodui, metamodelis.
* Meta - metamodelis apibūdina visų metamodelių savybes. Aukščiausias lygmuo.

Kiekvienas žemesnis lygmuo yra aukštesnio lygmens egzempliorius.

Ryšys su ontologijomis
----------------------

Metamodeliai glaudžiai susiję su ontologijomis. Abu yra dažnai naudojami apibūdinti ir analizuoti ryšius tarp koncepcijų. Taisyklingas metamodelis yra ontologija, bet ne visos ontologijos yra išreikštinai modeliuojamos kaip metamodeliai. Kai lyginami metamodelius su ontologijomis, kalbame apie metamodelius kaip modelius (2 perspektyva). Metamodelis yra ontologija naudojama modeliuotojų. Modeliuotojai sutaria naudoti tam tikrą žodyną ar ontologiją dominančiai sričiai modeliuoti.

Metamodelių panaudojimo atvejai
-------------------------------

Pagrindiniai metamodelių panaudojimo atvejai:

* Kaip schema semantiniams duomenims, kuriais norima apsikeisti. Pavyzdžiui: CDIF, CASE įrankių duomenų apsikeitimui (vėliau tapo UML/XMI), STEP pramoninio projektavimo duomenų apsikeitimui, ir net XML schema.
* Metamodelių, kaip schemos semantiniams duomenims saugoti saugykloje, panaudojimas.
* Kaip kalba palaikanti konkrečią metodologiją ar procesą. Toks buvo pradinis UML metamodelio tikslas. Šiuo atveju metamodelis kalbos specialistui leidžia geriau užfiksuoti, analizuoti ir suprasti apie ką jie iš tiesų rašo tose metodologijų knygose.
* Kaip kalba leidžianti išreikšti papildomą semantiką jau turimai informacijai. Vienas iš pavyzdžių yra informacijos esančios Internete didesnis pritaikymas kompiuteriams. Tai plati naujos krypties tyrimo, Semantinio Interneto, sritis.

Metamodelio semantika
---------------------

**Semantika** - ką reiškia modeliai ir programos parašytos modeliavimo kalba.
Semantikos sąvoka metamodeliams yra labai svarbi. Vis dėlto dažnai ji yra nesuprantama žmonėms.
Žodis semantika reiškia ne tik realaus pasaulio modeliavimo poreikį, bet ir prasmės modeliavimą, kuris turi kažkokį ryšį su metamodelio tikslu. Žinoma, ta prasmė yra priklausoma ir nuo modeliuotojo, ir labai priklauso nuo metamodelio paskirties (tai viena iš priežasčių, kodėl pirmiausia buvo kalbama apie metamodelio paskirtį).

### Semantikos pavyzdys

Paprasčiausias piešimo įrankis ir tinkamas pavyzdys. Jei jo pagalba nupiešiame stačiakampį, įrankis supranta, kad tai stačiakampis. Jis privalo tai suprasti, nes kitu atveju jis nežinotų, ar turėjo būti nupieštas stačiakampis, ar apskritimas. Taigi, žiūrint iš piešimo įrankio perspektyvos, prasmė yra „stačiakampis ekrane" (su tam tikromis koordinatėmis, spalva ir t. t.).
Bet jeigu jūs naudojate šį įrankį norint dokumentuoti įmonės darbo eigą (angl. *workflow*), tada „stačiakampis ekrane" nėra prasmė, kurią jūs turite galvoje žiūrėdami į diagramą. Jūs galvojate: prasmė to, ko ką tik nupiešiau yra „administracijos procesas".
Taigi, piešimo įrankis ir jūs žiūrite į visiškai tą pačią informaciją, ir turite visiškai skirtingas nuomones apie tai, ką matote ekrane. Tai reiškia, kad jūsų metamodelis yra visiškai skirtingas nuo piešimo įrankio metamodelio.
  
Metamodelis yra rinkinys „koncepcijų" (daiktų, terminų, …), sudarančių žodyną ir kurį naudojate kalbėdami apie tam tikrą dalykinę sritį. Pavyzdžiui, Stačiakampis, Linija, Apskritimas arba Procesas, virsmas ir t. t.
Kadangi yra šnekama apie tikslią prasmę, tam kad būtų sukurtas supratimas, labai svarbu tiksliai apibrėžti tas prasmes. Būtent todėl metamodeliai dažniausiai yra – ir visuomet turėtų būti – sukurti remiantis griežtu taisyklių rinkiniu, kuris dažniausiai yra kildintas iš esybių - ryšių - atributų ar objektinio modeliavimo.

Metamodelių vartotojai
----------------------

Tradiciniai metamodelių vartotojai:

* Kompiuterinio projektavimo (angl. *CASE*) įrankių pardavėjai/modeliavimo įrankių pardavėjai.
* Saugyklų (angl. *Repository vendor*) pardavėjai.
* Sistemų integratoriai. Pirmiausia turi suprasti duomenų prasmę visose sistemose, kurias reikia integruoti: kurie duomenys turi tą pačią prasmę, kurie duomenys papildo vienas kitą ir kaip viskas susiję. Analizės rezultatas yra semantinis modelis tų duomenų, kuriuos reikia integruoti. Kitaip sakant – metamodelis.
* Galutinis vartotojas – metamodelis nulemia ką galima išreikšti naudojant tam tikrą programinę įrangą. Tai gali nulemti paketo pasirinkimą jį įsigyjant.

Kaip atskirti gerą metamodelį nuo blogo?
----------------------------------------

Rekomenduojama įvertinti metamodelius remiantis šiais kriterijais:

* Apimtis (angl. *scope*) Norint išbandyti, paimkite tam tikrą kiekį duomenų ir pažiūrėkite kaip gerai galima išreikšti tuos duomenis naudojant tik koncepcijas iš jūsų metamodelio. Ar yra visos reikalingos koncepcijos? Ar reikia keisti duomenis norint panaudoti metamodelį? Ar galite iš metamodelio grįžti atgal į duomenis neprarandant informacijos?
* Techninė kokybė. Metamodeliai yra artefaktai, sukurti inžinierių, ir turėtų būti vertinami panašiai kaip ir pasiūlyta programų architektūra. Taikykite įvairius testus, netikėtus scenarijus.
* Išplečiamumas. Kuriant programų architektūras svarbu palikti galimybę jas vystyti ir plėsti. Metamodeliams tai ypač svarbu. Ar sistemos naudojančios seną metamodelį ir naują, išplėstą, veiks kartu?
* Dokumentacijos apibrėžimo kokybė. Metamodeliai turi būti aprašyti, nes kitaip tik bus gaunamos paprastos diagramos ir negalima bus suprasti ar ten jos "dar ką nors reiškia?".

Metamodelių tipai
-----------------

Biblioteka sudaryta iš panašių metamodelių yra vadinama metamodelių Zoologijos sodu (angl. *Zoo of metamodels*). Egzistuoja keletas metamodelių zoologojos sodų tipų. Kai kurie yra išreikšti per ECore. Kiti yra parašyti MOF 1.4 – XMI 1.2. Metamodeliai išreikšti UML-XMI gali būti įkelti UML CASE įrankį.

Metamodelių priežiūra ir migracija
----------------------------------

Šaltiniai
---------

* What is metamodeling, and what is it good for? Archyvuota kopija 2006-12-07 iš Wayback Machine projekto. Žiūrėta 2007-09-25.
* What are the differences between a vocabulary, a taxonomy, a thesaurus, an ontology, and a meta - model? Archyvuota kopija 2009-03-02 iš Wayback Machine projekto. Žiūrėta 2007-09-25.
* Meta - modeling Metamodeliavimas (anglų kalba).

Bibliografija
-------------

* Clark T. Evans A. Sammut P. Willians J.(2004).*Applied Metamodelling: A Foundation for Language-Driven Development*. Pasiekiama

Tolesniam skaitymui
-------------------

* The International Zoo of MetaModels Archyvuota kopija 2007-03-29 iš Wayback Machine projekto.
* BPM Workflow Archyvuota kopija 2008-12-10 iš Wayback Machine projekto.
* OMG's MetaObject Facility