LINUX.ORG.RU

JetBrains MPS 1.0 - финальный релиз системы метапрограммирования


0

0

Компания JetBrains выпустила MPS (Meta Programming System), чья бета-версия горячо обсуждалась на ЛОРе в конце прошлого года. MPS - инновационный подход к разработке ПО, реализующий Language Oriented Programming, парадигму, ориентирующуюся на специализированные языки (DSL). MPS - инструмент, обеспечивающий полный цикл создания и использования проблемно-ориентированных языков на платформе JVM.

Авторы MPS поясняют свою мотивацию:

Несмотря на сегодняшнее обилие языков программирования, эти языки все равно ставят нас в определенные рамки. Поэтому имеет смысл расширять языки, создавая новые, ориентированные на конкретные задачи. Это позволит разработчикам перейти на более высокий уровень и работать в манере, более близкой к предметной области.

Имея инструмент, который позволяет создавать конструкции языка так же легко, как, например, привычные вам классы и методы, можно радикально изменить собственный подход к разработке ПО.

Разработка MPS началась в 2003 году как исследовательский проект. С тех пор MPS удостоилась упоминания во многих публикациях, в частности, в статье корифея методологии разработки ПО Мартина Фаулера.

Принципы работы MPS.

Скачать MPS.

>>> Сайт MPS

★★

Проверено: boombick ()

Ответ на: комментарий от EugenyN

> Завтра вечером, пожалуйста. Для чистоты эксперимента (были прецеденты, присылали неожиданно, читал только через часов 20).

Решения быстро гуглятся. Так что смысла неожиданно присылать нет.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Правильно ли я понял, что хотят динамически загружать в проект код, который будет унаследован от существующих типов данных, при этом типы в данном загружаемом модуле должны обладать следующими свойствами:

1) Быть унаследованы от уже существующих типов данных. 2) Новый тип может иметь новые методы. 3) Чтобы статический контроль типов в IDE - контролировал правильность набираемого программистом кода.

Так ли понял, что немного не так или еще что и как?

Я пока уточняю постановку задачи.

EugenyN
()
Ответ на: комментарий от www_linux_org_ru

> Решения быстро гуглятся. Так что смысла неожиданно присылать нет.

Еу. Давайте доведем дело до конца. Гуглить лениво, придумать - интересно.

EugenyN
()
Ответ на: комментарий от solomatov

>> Но может я не так подхожу к делу, и можно сразу определить *параметрический* концепт, (а точнее, концепт с параметрическим редактором) в котором то, что в обычном концпте есть константы и вбивается ручками, создавалось бы по инфе из солюшена?

> Теоретически это возможно, можно создать дерево ячеек руками, просто возвращая соответствующий объект, но это API не документировано.

Тут мне подсказали, что InstanceMethodCallOperation параметризован как мне хочется.

______________________________

Если нажать в правильном месте ctrl-spc, MPS скажет, что такое [-

Неужели сильно сложно сделать это же инфу во всплывающей подсказке?

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от EugenyN

In this paper we shall follow the tradition and use as a running example a processor of a (very!) simple language with the following grammar: Exp ::= Lit | Add

Lit ::= non-negative integer

Add ::= Exp ‘+’ Exp

We name the language ale from the initials of its constituent categories. Along with a representation of the data itself, from the outset the processor is to im- plement a print() operation to show expressions on screen. To examine the expression problem we shall then want to try out different representations of ale in the context of two “future” extensions: with a new operation, eval(), to evaluate expressions, and with a new kind of expression Neg :

Exp ::= ... | Neg

Neg ::= ‘−’ Exp

Of course this is a toy example, limited to the minimum necessary to illustrate the points in the paper. Given the small amount of application logic involved, it may seem that the amount of infrastructure needed in the examples is over- whelming in comparison. But one should keep in mind that real applications will involve a much large proportion of application logic. Also, “legacy” client code of a Composite structure can also made reusable by a nondestructive extension, and is therefore likely to constitute another major bulk of code that is spared the need to be hand updated or recompiled.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

Про eval я уловил, динамически генерировать код люди хотят.

Решение (для Java) - в использовании отражении? Там динамически инстанцировать класс то можно... Давно применял, и даже как-то делал немного экзотический, для данного случая, Factory Method, для такого инстанцирования объекта заранее не известного класса...

Как же я его описывал то... И смотреть книгу лениво, десяток других учебников открыто, а это смотреть лениво...

EugenyN
()
Ответ на: комментарий от EugenyN

Экзотические способы вроде встраивания в код аннотаций (например в Java это возможно, начиная с Java 1.5) - оно служит для в чем-то сходных целей (скомпилировали проект, выложили на сервер, а потом внешними инструментами байт-код со включенными аннотациями - можно то изменить).

Это немного не то.

Написать антихакерскую внутреннюю виртуальную машину - тоже слишком пушкой по воробьям.

Написать что-то, чтобы JIT-компилятор использовать для генерации код - тоже слишком... пушкой обухом по воробью...

EugenyN
()
Ответ на: комментарий от EugenyN

Остановлюсь на решении, что отражение в Java это позволяет сделать.

Очень не уверен, а смотреть лениво. В чем честно и признаюсь.

Методы там можно было интроспекцией просканировать, конструкторы... инстанцировал я как-то...

Так не скажу, без заглядывания в учебник, можно или нет.

Напишите решение, пожалуйста. Желательно на русском, английский у меня на уровне технического английского, деепричастные обороты скорее интуитивно угадываю, но не во всех случаях.

EugenyN
()
Ответ на: комментарий от EugenyN

Еще можно динамически подгружать код, с сервера.

Например по паттерну Lazy Load, или как там его правильно, активно используется в архитектуре Эклипса.

EugenyN
()
Ответ на: комментарий от EugenyN

Если язык позволяет использовать eval() для генерации кода, то это возможно.

Но статический контроль типов тут - под большим вопросом. Хотя, ухищрениями вроде присвоить объекту ссылку на его прототип - по моему я это применял, слишком давно было.

EugenyN
()
Ответ на: комментарий от EugenyN

> Решение (для Java) - в использовании отражении?

Reflection не годится, т.к. наличие нужных полей и методов статически не проверить.

Решения обычно использует визитор, но все равно выглядят ужасно... на ночь лучше не смотреть :-)

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от EugenyN

АГА! Есть решение! Не на 100%, но в очень значительной части, причем все полностью архитектурно. Без вот этих ухищрений-eval-которые (что Вы и критиковали).

Есть такие паттерны, кратко опишу суть.

Например у нас есть 500 объектов. Или 10000, не важно. Нам нужно в каждый из них - добавить некоторое свойство. Или изменить реализацию методов.

Сейчас опишу как...

EugenyN
()
Ответ на: комментарий от www_linux_org_ru

> Решения обычно использует визитор

Ах, черт, ну на 5 минут бы позже написали... Я уже и сам догадался.

Не устраивает? Сейчас подумаю, но может ответа и не будет.

EugenyN
()
Ответ на: комментарий от www_linux_org_ru

> Решения обычно использует визитор, но все равно выглядят ужасно... на ночь лучше не смотреть :-)

Все же оно обладает огромной мощью. И заранее можно спрогнозировать и сделать - как и что чтобы было.

Думать не буду, не устраивает - ну тогда Вам не угодишь. :-P ;)

Спокойной ночи! Очень было интересно!

EugenyN
()
Ответ на: комментарий от EugenyN

Если в MPS придумано удобное инкапсулирование этого дела, то тогда, опять же, проще в классе/фреймворке описать.

Покажите мне где я неправ. :)

Если это так, то, подводя черту, MPS для того, для чего он позиционируется - не совсем подходит, по сравнению с "традиционными" методами решения проблем. :)

Или нет? :)

EugenyN
()
Ответ на: комментарий от EugenyN

1. Классы и фреймворки на основе классов имеют местами весьма существенные ограничения.

2. МПС, похоже, позволяет делать контроль типов, превосходящий классы.

Но все равно я бы не рискнул использовать не обычный язык, а язык из МПС для статического контроля типов в задаче, подобной expression problem.

> Если это так, то, подводя черту, MPS для того, для чего он позиционируется - не совсем подходит, по сравнению с "традиционными" методами решения проблем.

MPS позиционируется для создания расширяемых языков, где создание допустим даже классов -- это только половина. Далее тебе придется создавать синтаксис расширений.

З.Ы. мой подход к созданию расширяемых языков не совсем такой, как у МПС.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от sv75

>> Я выясню, можно ли (легко ли) читать/писать MPS-деревья сторонними скриптами, и отпишусь здесь.

> Ждёмс с нетерпением.

В процессе изучения МПС и ее идеологии мне пришли интересные идеи, которые очень сильно понизили приоритет процесса изучения МПС... короче, для меня задача читать/писать MPS-деревья сторонними скриптами откладывается на неопределенный срок. Sorry.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от www_linux_org_ru

> В процессе изучения МПС и ее идеологии мне пришли интересные идеи, которые очень сильно понизили приоритет процесса изучения МПС... короче, для меня задача читать/писать MPS-деревья сторонними скриптами откладывается на неопределенный срок. Sorry.

Боюсь что знаю о чем идет речь.

Мне кажется что 3 затмения в июле дали что-то, что одновременно у множества людей по всему миру... начали складываться какие-то решения.

EugenyN
()
Ответ на: комментарий от EugenyN

> анекдот, не хотят взять человека с большей квалификацией

Это разумно. Человеку с классификацией выше требуемой может быть скучно или он быстро свалит, добивишись своих личных целей. Или займёт место тех, кто разместил вакансию.

sv75 ★★★★★
()
Ответ на: комментарий от sv75

>> анекдот, не хотят взять человека с большей квалификацией

> Это разумно. Человеку с классификацией выше требуемой может быть скучно или он быстро свалит, добивишись своих личных целей. Или займёт место тех, кто разместил вакансию.

Разумно, да. Но как всегда и в любом деле - "важны нюансы". Я потом около года проработал в другой компании, рядовым Java-программистам. С этим проблем не было, а вывод первой компании, как видно - был ошибочен.

EugenyN
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.