Kermeta

Kermeta это язык моделирования и программирования для метамодельной инженерии. Он заполняет пробел между MOF, которое определяет только структуру метамодели, и практическими нуждами программирования, добавив средства определения статической семантики (подобно предметно-ориентированному языку программирования) и динамической семантики (используя операционную семантику метамодели).[1] Kermeta использует объектно-ориентированную парадигму, как Java или Eiffel.

История

Язык Kermeta был инициирован Франком Флойри в 2005 году в рамках работы над проектом Triskell французского Института Информатики и Системных Исследований IRISA в Ренне (Бретань).

Язык Kermeta заимствует понятия из таких языков, как MOF, OCL и QVT, но и от BasicMTL, языка преобразования моделей, который реализовали в 2004 году в проекте Triskell D.Vojtisek и F.Fondement. Он также вдохновлен предыдущим опытом по MTL - первому языку трансформаций, созданному в рамках проекта Triskell, и по языку описания действий для UML "Xion".

Название Kermeta это сокращение от "Kernel Metamodeling" и отражает тот факт, что язык задуман как ядро для (мета-)моделирования.

Kermeta, и его исполняемая платформа под Eclipse в настоящее время доступна в версии 2.0.4 [2] выпущенной в 2012 году. Это open source продукт под Eclipse Public License.

Философия

Kermeta является языком моделирования и аспектно-ориентированного программирования. Лежащая в его основе метамодель соответствует версии EMOF стандарта MOF. Он разработан, чтобы писать программы, являющиеся также моделями и выполняющие преобразования над моделями. Цель этого подхода - ввести дополнительный уровень абстракции поверх "объектного" уровня, и увидеть данную систему как набор концептов (и экземпляров этих концептов), образующий единое целое, называемое моделью.

Kermeta, таким образом, приносит:

  • Все концепты версии EMOF языка MOF используются для спецификации моделей.
  • Конкретный синтаксис, который хорошо подходит для написания моделей и метамоделей.
  • Две парадигмы: объектная и модельная.
  • Мост к еще одной реализации метамодельного подхода - Eclipse Modeling Framework.

Характеристики

Основные характеристики языка Kermeta:

  • императивность: традиционные структуры управления
  • объект-ориентированность: множественное наследование, позднее связывание
  • модель-ориентированность: первоклассные понятия ассоциации и композиции
  • аспект-ориентированность: интегрирован простой, но мощный механизм для простых задач мета-моделирования. Он особенно удобен для того, чтобы добавить в модель поведенческую семантику - операциональную или трансляционную
  • контрактное программирование: поддержка операций до и после условия, классы используют инварианты.
  • Функциональное программирование: функции и лямбда-выражения первого класса
  • статическая типизация: типичность для классов и операций, типы функций...
  • полная интроспекция: вся модель программы доступна во время выполнения.

Синтаксис

Любознательный читатель найдет дополнительную информацию на Kermeta.

Пример (Kermeta 1.4)

package fsm;

require kermeta

using kermeta::standard

class FSM
{
   attribute ownedState : set State[0..*]#owningFSM
   reference initialState : State[1..1] 
   reference currentState : State 

   /**
    * Print the FSM on the standard output
    */
   operation printFSM() is do
       self.ownedState.each 
       { s | 
           stdio.writeln("State : " + s.name)
           s.outgoingTransition.each 
           { t | 
               stdio.writeln("  Transition : " + t.source.name + 
               "-(" + t.input + "/" + t.output + ")->" + t.target.name)
           }
       }
   end
}

class State {
   attribute name : String
   reference owningFSM : FSM#ownedState
   attribute outgoingTransition : set Transition[0..*]#source
   reference incomingTransition : set Transition[0..*]#target
   
   operation step(c : String) : String is do
       // Get the valid transitions
       var validTransitions : Collection<Transition> 
       validTransitions :=    outgoingTransition.select { t | t.input.equals(c) }
       // Check if there is one and only one valid transition
       if validTransitions.empty then raise "No Transition!" end
       if validTransitions.size > 1 then raise "Non Determinism" end
       // fire the transition
       result := validTransitions.one.fire
   end
   
   
}

class Transition 
{
   reference source : State[1..1]#outgoingTransition
   reference target : State[1..1]#incomingTransition
   attribute output : String
   attribute input : String
   
   operation fire() : String is do
       // update FSM current state
       source.owningFSM.currentState := target
       result := output
   end
}

См. также

Примечания

  • Weaving Executability into Object-Oriented Meta-Languages Pierre-Alain Muller, Franck Fleurey, and Jean-Marc Jézéquel. In S. Kent L. Briand, editor, Proceedings of MODELS/UML'2005, LNCS, Montego Bay, Jamaica, October 2005. Springer.
  1. Документация по языку Архивировано 27 сентября 2013 года.
  2. Vojtisek, Didier Version 2.0.4 is released !  (неопр.) Дата обращения: 3 декабря 2012. Архивировано 30 октября 2015 года.

Ссылки

  • Kermeta official website
  • article list