<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"
     xml:base="https://specificlanguages.com/">
  <channel>
    <title>Specific Languages</title>
    <link>https://specificlanguages.com/</link>
    <description>Recent content on Specific Languages</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>sergej@specificlanguages.com (Sergej Koščejev)</managingEditor>
    <webMaster>sergej@specificlanguages.com (Sergej Koščejev)</webMaster>
    <lastBuildDate>Wed, 01 Apr 2026 10:30:36 +0200</lastBuildDate>
    
    <atom:link href="https://specificlanguages.com/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>MPS Office Hours 🆓</title>
      <link>https://specificlanguages.com/services/mps-office-hours/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/services/mps-office-hours/</guid>
      <description>&lt;p&gt;You have a problem with MPS and you don&amp;rsquo;t know how to solve it. Worst of all, you don&amp;rsquo;t even know what words to use to
describe the problem, or what to look for in the forum or the documentation. But, you are sure that if you could demo it
for a few minutes to an expert, a hint would get you unstuck very quickly.&lt;/p&gt;
&lt;p&gt;Well, now you can do just that! I&amp;rsquo;m offering MPS Office Hours, a regular group call where you can demonstrate your
problem and get hints from myself or other present experts.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/services/mps-office-hours/"><![CDATA[ <p>You have a problem with MPS and you don&rsquo;t know how to solve it. Worst of all, you don&rsquo;t even know what words to use to
describe the problem, or what to look for in the forum or the documentation. But, you are sure that if you could demo it
for a few minutes to an expert, a hint would get you unstuck very quickly.</p>
<p>Well, now you can do just that! I&rsquo;m offering MPS Office Hours, a regular group call where you can demonstrate your
problem and get hints from myself or other present experts.</p>
<p>And if you don&rsquo;t have a problem yet but just want to watch and learn from others, you can, too!</p>
<p>Best of all, it&rsquo;s free!</p>
<blockquote>
<p>I wasn&rsquo;t expecting to participate in the Office Hours today. My plan was to just watch and learn. I&rsquo;m used to the
try-it-and-see and RTFM before asking for help. Still, I&rsquo;m glad that I did participate, got good feedback and
pointers. It&rsquo;s a valuable resource for the community.</p>
<p>&ndash; Nuba Princigalli</p>
</blockquote>
<h2 id="interested">Interested?</h2>
<p>Here are the important details:</p>
<ul>
<li>The call takes place <strong>every Monday and Thursday from 14:30 until 15:00</strong> CE(S)T (GMT+1 or +2, dependent on daylight
savings).</li>
<li>We meet on Google Meet. To avoid zoombombing, the link is not shared publicly but will be posted to the
<code>#office-hours</code> channel in the offical <a href="http://slack-mps.jetbrains.com">MPS Slack</a>.</li>
<li>Discussion related to MPS Office Hours also takes place in the <code>#office-hours</code> channel.</li>
<li>The office hours are <strong>not recorded</strong> currently but this may change in the future.</li>
<li>Attendance is <strong>free</strong> and the meeting is <strong>public</strong>. If you want a private consultation, <a href="https://specificlanguages.com/about/">contact me</a>.</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>MPS Advisory Service</title>
      <link>https://specificlanguages.com/services/mps-advisory-service/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/services/mps-advisory-service/</guid>
      <description>&lt;p&gt;Are you worried about unforeseen challenges of technical nature with MPS development? Afraid that you don&amp;rsquo;t know what
you don&amp;rsquo;t know?&lt;/p&gt;
&lt;p&gt;To help reduce the risk of your team getting stuck on a difficult issue, I offer MPS Advisory Service where I answer
your technical questions related to MPS with a response time of one business day.&lt;/p&gt;
&lt;h2 id=&#34;examples-of-topics-that-are-covered&#34;&gt;Examples of topics that are covered&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;How to implement a particular editing feature&lt;/li&gt;
&lt;li&gt;Understanding an error message and suggestions on how to best fix the underlying cause&lt;/li&gt;
&lt;li&gt;How to automate the build process&lt;/li&gt;
&lt;li&gt;How to best integrate MPS with a particular system or environment&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-is-not-covered&#34;&gt;What is not covered&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Developing production code – but I might create a small example to illustrate a point or a technique, if necessary.&lt;/li&gt;
&lt;li&gt;Maintaining or debugging existing code – but I could give you tips to help you do it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;The service is offered to you as a single person (a team lead, an architect, a CTO). You ask questions by email, I
reply to my best ability within one business day, but usually faster. If necessary and convenient, we may jump on a
videocall to understand the problem better, but the service is mostly asynchronous.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/services/mps-advisory-service/"><![CDATA[ <p>Are you worried about unforeseen challenges of technical nature with MPS development? Afraid that you don&rsquo;t know what
you don&rsquo;t know?</p>
<p>To help reduce the risk of your team getting stuck on a difficult issue, I offer MPS Advisory Service where I answer
your technical questions related to MPS with a response time of one business day.</p>
<h2 id="examples-of-topics-that-are-covered">Examples of topics that are covered</h2>
<ul>
<li>How to implement a particular editing feature</li>
<li>Understanding an error message and suggestions on how to best fix the underlying cause</li>
<li>How to automate the build process</li>
<li>How to best integrate MPS with a particular system or environment</li>
</ul>
<h2 id="what-is-not-covered">What is not covered</h2>
<ul>
<li>Developing production code – but I might create a small example to illustrate a point or a technique, if necessary.</li>
<li>Maintaining or debugging existing code – but I could give you tips to help you do it.</li>
</ul>
<h2 id="how-it-works">How it works</h2>
<p>The service is offered to you as a single person (a team lead, an architect, a CTO). You ask questions by email, I
reply to my best ability within one business day, but usually faster. If necessary and convenient, we may jump on a
videocall to understand the problem better, but the service is mostly asynchronous.</p>
<h2 id="terms">Terms</h2>
<ul>
<li>The service costs 3 000 EUR/month (30 days), paid in full in advance.</li>
<li>In case of vacations/holidays the duration of the service is extended.</li>
<li>To ensure a high quality of service I only take 2 clients in a given month.</li>
</ul>
<p>Interested? Contact me at <a href="mailto:sergej@specificlanguages.com">sergej@specificlanguages.com</a>.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>What&#39;s new in the MPS ecosystem: March 2026</title>
      <link>https://specificlanguages.com/posts/2026-04/01-whats-new-in-mps-ecosystem/</link>
      <pubDate>Wed, 01 Apr 2026 10:30:36 +0200</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-04/01-whats-new-in-mps-ecosystem/</guid>
      <description>&lt;p&gt;In this series I go through the commit logs and change logs of MPS and popular MPS libraries and collect notable changes
from their master branches.&lt;/p&gt;
&lt;h1 id=&#34;mps&#34;&gt;MPS&lt;/h1&gt;
&lt;p&gt;The list below only mentions user-visible changes and does not include refactorings such as dead-code removal or moving
functionality around.&lt;/p&gt;
&lt;h2 id=&#34;baselanguage&#34;&gt;BaseLanguage&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🆕 &lt;code&gt;IForEachLoop&lt;/code&gt; interface to capture commonalities between various foreach loops.&lt;/li&gt;
&lt;li&gt;↗️ Intention &amp;lsquo;Add Field For Unused Param&amp;rsquo; got a slightly nicer name&lt;/li&gt;
&lt;li&gt;↗️ BaseLanguage no longer depends on the behavior language&lt;/li&gt;
&lt;li&gt;↗️ Resolution of unknown elements during Java parsing will not add a used language when it already comes from a used
devkit.&lt;/li&gt;
&lt;li&gt;🐞 Fixed a few NPEs when accessing scope or class hierarchy for a detached node&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;behavior-language&#34;&gt;Behavior language&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;↗️ Generated code changes to improve diagnostics: parameter names are now tracked, no code is generated for empty
constructors, and invoking some internal implementation methods directly to shorten stack traces.&lt;/li&gt;
&lt;li&gt;↗️ Removed the dependency of the behavior language on the kernel subsystem.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;core&#34;&gt;Core&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;↗️ Diagnostics improvements (better printout from ClassLoaderManager, extra trace from EDTExecutor).&lt;/li&gt;
&lt;li&gt;↗️ Continued internal refactoring towards per-project repositories.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;editor&#34;&gt;Editor&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;↗️ The &lt;code&gt;:&lt;/code&gt; cell was made non-selectable in Boolean style items.&lt;/li&gt;
&lt;li&gt;↗️ Avoid auto-fixing references in nodes that are no longer open in the editor.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;find-usages&#34;&gt;Find Usages&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;↗️ A nicer tab name for module dependency usages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;make&#34;&gt;Make&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;↗️ The RCP build script wizard was updated to reflect the fact that the MPS Make plugin now depends on the Java plugin.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;migrations&#34;&gt;Migrations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;↗️ Minor improvements in the migration notification (&amp;ldquo;Some languages in the project are not deployed&amp;hellip;&amp;rdquo;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;mps-extensions&#34;&gt;MPS-extensions&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;🆕 &lt;code&gt;blutil&lt;/code&gt; language was extended with several additional operations, such as &amp;rsquo;elvis&amp;rsquo; operator &lt;code&gt;?:&lt;/code&gt;, integer ranges
(&lt;code&gt;[2..5]&lt;/code&gt;), &lt;code&gt;select&lt;/code&gt; with index, and more. For more details, see
the &lt;a href=&#34;https://github.com/JetBrains/MPS-extensions/blob/master/CHANGELOG.md&#34;&gt;changelog&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-04/01-whats-new-in-mps-ecosystem/"><![CDATA[ <p>In this series I go through the commit logs and change logs of MPS and popular MPS libraries and collect notable changes
from their master branches.</p>
<h1 id="mps">MPS</h1>
<p>The list below only mentions user-visible changes and does not include refactorings such as dead-code removal or moving
functionality around.</p>
<h2 id="baselanguage">BaseLanguage</h2>
<ul>
<li>🆕 <code>IForEachLoop</code> interface to capture commonalities between various foreach loops.</li>
<li>↗️ Intention &lsquo;Add Field For Unused Param&rsquo; got a slightly nicer name</li>
<li>↗️ BaseLanguage no longer depends on the behavior language</li>
<li>↗️ Resolution of unknown elements during Java parsing will not add a used language when it already comes from a used
devkit.</li>
<li>🐞 Fixed a few NPEs when accessing scope or class hierarchy for a detached node</li>
</ul>
<h2 id="behavior-language">Behavior language</h2>
<ul>
<li>↗️ Generated code changes to improve diagnostics: parameter names are now tracked, no code is generated for empty
constructors, and invoking some internal implementation methods directly to shorten stack traces.</li>
<li>↗️ Removed the dependency of the behavior language on the kernel subsystem.</li>
</ul>
<h2 id="core">Core</h2>
<ul>
<li>↗️ Diagnostics improvements (better printout from ClassLoaderManager, extra trace from EDTExecutor).</li>
<li>↗️ Continued internal refactoring towards per-project repositories.</li>
</ul>
<h2 id="editor">Editor</h2>
<ul>
<li>↗️ The <code>:</code> cell was made non-selectable in Boolean style items.</li>
<li>↗️ Avoid auto-fixing references in nodes that are no longer open in the editor.</li>
</ul>
<h2 id="find-usages">Find Usages</h2>
<ul>
<li>↗️ A nicer tab name for module dependency usages.</li>
</ul>
<h2 id="make">Make</h2>
<ul>
<li>↗️ The RCP build script wizard was updated to reflect the fact that the MPS Make plugin now depends on the Java plugin.</li>
</ul>
<h2 id="migrations">Migrations</h2>
<ul>
<li>↗️ Minor improvements in the migration notification (&ldquo;Some languages in the project are not deployed&hellip;&rdquo;)</li>
</ul>
<h1 id="mps-extensions">MPS-extensions</h1>
<ul>
<li>
<p>🆕 <code>blutil</code> language was extended with several additional operations, such as &rsquo;elvis&rsquo; operator <code>?:</code>, integer ranges
(<code>[2..5]</code>), <code>select</code> with index, and more. For more details, see
the <a href="https://github.com/JetBrains/MPS-extensions/blob/master/CHANGELOG.md">changelog</a>.</p>
</li>
<li>
<p>🆕 <code>EditorTestLifecycleMethods</code> attribute and related intentions were added to the <code>nl.f1re.testing</code> language. With these
intentions you can add before/after tests methods to editor tests.</p>
</li>
<li>
<p>🐞 <code>de.itemis.mps.linenumbers</code> Improve line numbers position in diff editors where the line numbers appear to the
right of the editor.</p>
</li>
<li>
<p>🐞 <code>de.itemis.mps.linenumbers</code> Fix a NullPointerException that would occur after application shutdown and would be
logged e.g. by command line tools. The NPE was caused by failing to properly dispose a Swing timer.</p>
</li>
<li>
<p>🐞 <code>de.itemis.mps.editor.celllayout.runtime</code> Grid layout was broken after previous performance optimization</p>
</li>
</ul>
<h1 id="mbeddr-platform">mbeddr platform</h1>
<p>Bugfixes to several languages:</p>
<ul>
<li>🐞 com.mbeddr.mpsutil.filepicker: Solution-relative pickers now work correctly during generation.</li>
<li>🐞 com.mbeddr.mpsutil.hyperlink: random exceptions should no longer occur after module reload.</li>
<li>🐞 com.mbeddr.mpsutil.interpreter: Throw a more detailed exception when TypedChildConstraint cannot determine
the type of a node.</li>
<li>🐞 com.mbeddr.mpsutil.interpreter: Generated node URLs now correctly point to the input model instead of the transient
model.</li>
</ul>
<h1 id="kernelf">KernelF</h1>
<ul>
<li>no changes in March</li>
</ul>
<h1 id="mbeddrmps-gradle-plugin">mbeddr/mps-gradle-plugin</h1>
<ul>
<li>🐞 A minor fix to the <code>MpsMigrate</code>: pass an additional <code>--add-open</code> argument to MPS so that versions 2025.1 and above
do not complain at run time.</li>
</ul>
<h1 id="mps-build-backends">mps-build-backends</h1>
<ul>
<li>🐞 A few fixes to get fewer stack traces logged during backend execution.</li>
<li>🆕 The <code>execute</code> backend can now exit with a custom error code: if the executed method returns an integer value, this
value is used as the backend exit code.</li>
</ul>
<h1 id="other-projects">Other projects</h1>
<ul>
<li>
<p>Eugen Schindler from <a href="https://dslfoundry.com">DSLFoundry</a> wrote in to mention that he recently migrated two DSLFoundry
projects to MPS 2025.1: <a href="https://github.com/DSLFoundry/mps-UMLRT">mps-UMLRT</a>
and <a href="https://github.com/DSLFoundry/mps-metabnf">mps-metabnf</a>.</p>
</li>
<li>
<p>MetaBNF seems to be a catchy name because this is also the name
of <a href="https://github.com/porscheofficial/MetaBNF">a new project open-sourced by Porsche</a>. Both projects appear to be
focused on generating MPS DSLs from a Backus-Naur Form (BNF) description.</p>
</li>
</ul>
]]></content:encoded>
    </item>
    
    <item>
      <title>What&#39;s new in the MPS ecosystem: February 2026</title>
      <link>https://specificlanguages.com/posts/2026-03/10-whats-new-in-mps-ecosystem/</link>
      <pubDate>Tue, 10 Mar 2026 08:34:12 +0100</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-03/10-whats-new-in-mps-ecosystem/</guid>
      <description>&lt;p&gt;In this series I go through the commit logs and change logs of MPS and popular MPS libraries and collect notable changes
from their master branches.&lt;/p&gt;
&lt;h1 id=&#34;mps&#34;&gt;MPS&lt;/h1&gt;
&lt;p&gt;The main areas of work in February were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;closer integration with the IDEA platform and being a good citizen of it,&lt;/li&gt;
&lt;li&gt;refactorings and improvements towards replacing the global repository with per-project repositories (a long-term
effort),&lt;/li&gt;
&lt;li&gt;deadlock hunting,&lt;/li&gt;
&lt;li&gt;removal of deprecated code,&lt;/li&gt;
&lt;li&gt;various minor bug fixes in areas such as base language data flow with commented out nodes, proper cleanup in editor
tests in case of failure, and handling of Java source stubs (MPS models created based on Java sources, as opposed to
compiled class files).&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;mps-extensions&#34;&gt;MPS-extensions&lt;/h1&gt;
&lt;p&gt;Optimizing performance of editors showing many similar kinds of images (e.g. checkboxes) and editors using the
celllayout language which installs a layout interceptor to modify how MPS lays out its editors.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-03/10-whats-new-in-mps-ecosystem/"><![CDATA[ <p>In this series I go through the commit logs and change logs of MPS and popular MPS libraries and collect notable changes
from their master branches.</p>
<h1 id="mps">MPS</h1>
<p>The main areas of work in February were:</p>
<ul>
<li>closer integration with the IDEA platform and being a good citizen of it,</li>
<li>refactorings and improvements towards replacing the global repository with per-project repositories (a long-term
effort),</li>
<li>deadlock hunting,</li>
<li>removal of deprecated code,</li>
<li>various minor bug fixes in areas such as base language data flow with commented out nodes, proper cleanup in editor
tests in case of failure, and handling of Java source stubs (MPS models created based on Java sources, as opposed to
compiled class files).</li>
</ul>
<h1 id="mps-extensions">MPS-extensions</h1>
<p>Optimizing performance of editors showing many similar kinds of images (e.g. checkboxes) and editors using the
celllayout language which installs a layout interceptor to modify how MPS lays out its editors.</p>
<p>Line numbers now properly appear when a new editor is opened.</p>
<h1 id="mbeddr">mbeddr</h1>
<p>A new language to visualize generator plans, <code>com.mbeddr.mpsutil.genplandiagram</code>.</p>
<h1 id="iets3-opensource">IETS3 Opensource</h1>
<ul>
<li>Variability-related improvements</li>
</ul>
<h1 id="mps-build-backends">mps-build-backends</h1>
<p>In the <code>execute</code> backend (which is a replacement/improvement over the <code>run mps code</code> MPS functionality and the
corresponding <code>runMPS</code> Ant task) if the executed method returns an integer value, it will be used as the exit code of
the backend. This allows the caller to distinguish between several error conditions.</p>
<p>Additionally, <code>project-loader</code> got some workarounds so that a few scary-looking but harmless stack traces that appeared
during MPS startup and shutdown will no longer be logged.</p>
<h1 id="mbeddrmps-gradle-plugin">mbeddr/mps-gradle-plugin</h1>
<p>The plugin had a minor update to upgrade the dependencies it uses. It will now work with the current MPS prerelease.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>What&#39;s new in the MPS ecosystem: January 2026</title>
      <link>https://specificlanguages.com/posts/2026-02/05-whats-new-in-mps-ecosystem/</link>
      <pubDate>Thu, 05 Feb 2026 10:00:00 +0100</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-02/05-whats-new-in-mps-ecosystem/</guid>
      <description>&lt;p&gt;In this series I go through the commit logs of MPS itself and popular MPS libraries and collect notable changes from
their master branches.&lt;/p&gt;
&lt;h1 id=&#34;mps&#34;&gt;MPS&lt;/h1&gt;
&lt;p&gt;There have been quite a lot of changes in January, so I am splitting them by subsystem.&lt;/p&gt;
&lt;h2 id=&#34;ai&#34;&gt;AI&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Include the mcp-server plugin from IDEA in MPS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;base-language&#34;&gt;Base Language&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Refactoring: moving code around to reduce the number of cyclic dependencies in the subsystem.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Classifier.isDescendant()&lt;/code&gt; optimized to avoid loading stubs unnecessarily and walk the class hierarchy more
efficiently.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;editor&#34;&gt;Editor&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cleanup: a deprecated 2-argument cell factory method in the editor language generator was removed, only the
no-argument version remains. This affects authors of custom editor cells.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;migrations&#34;&gt;Migrations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cleanup: removed unused code, old project migrations (2020 and earlier).&lt;/li&gt;
&lt;li&gt;Refactoring of internals to improve the internal API and reduce the need for model read lock.&lt;/li&gt;
&lt;li&gt;Changes around how language versions and module dependencies are computed - less guessing, version -1 will be used if
not stored.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;model-persistence&#34;&gt;Model Persistence&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;New version of binary model persistence (.mpb files). The format now stores versions of languages used by the model.
This is related to the changes in the migration subsystem.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;project&#34;&gt;Project&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Continued preparations for closer integration with the IDEA platform (workspace model)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;structure&#34;&gt;Structure&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cleanup: &lt;code&gt;EnumDataTypeDeclaration_Old&lt;/code&gt; and related concepts deprecated several years ago were removed.&lt;/li&gt;
&lt;li&gt;Internal: show &amp;lsquo;concept scope&amp;rsquo; in developer mode (concept scope is an experimental, internal feature to designate some
concepts as non-referenceable or only referenceable from within the same root node).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;testing&#34;&gt;Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cleanup: drop previously deprecated concepts for node tests (&lt;code&gt;NodeTypeSystemWarningCheckOperation&lt;/code&gt; and
&lt;code&gt;CheckNodeForErrors&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;vcs&#34;&gt;VCS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;UI improvements around conflict resolution&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;mps-extensions&#34;&gt;MPS-extensions&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;diagrams: to support custom SVG export, the SVGGenerator class is now an object with options (TextAsShape, UseCSS,
SetViewBox).&lt;/li&gt;
&lt;li&gt;rich text: Generic placeholders like generic comments can&amp;rsquo;t be inserted into words anymore (an exception was thrown).&lt;/li&gt;
&lt;li&gt;tables: Prevent inserting a new row node before/after a singular cardinality child node&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;mbeddr&#34;&gt;mbeddr&lt;/h1&gt;
&lt;p&gt;An exception was fixed in the mpsutil filepicker.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-02/05-whats-new-in-mps-ecosystem/"><![CDATA[ <p>In this series I go through the commit logs of MPS itself and popular MPS libraries and collect notable changes from
their master branches.</p>
<h1 id="mps">MPS</h1>
<p>There have been quite a lot of changes in January, so I am splitting them by subsystem.</p>
<h2 id="ai">AI</h2>
<ul>
<li>Include the mcp-server plugin from IDEA in MPS.</li>
</ul>
<h2 id="base-language">Base Language</h2>
<ul>
<li>Refactoring: moving code around to reduce the number of cyclic dependencies in the subsystem.</li>
<li><code>Classifier.isDescendant()</code> optimized to avoid loading stubs unnecessarily and walk the class hierarchy more
efficiently.</li>
</ul>
<h2 id="editor">Editor</h2>
<ul>
<li>Cleanup: a deprecated 2-argument cell factory method in the editor language generator was removed, only the
no-argument version remains. This affects authors of custom editor cells.</li>
</ul>
<h2 id="migrations">Migrations</h2>
<ul>
<li>Cleanup: removed unused code, old project migrations (2020 and earlier).</li>
<li>Refactoring of internals to improve the internal API and reduce the need for model read lock.</li>
<li>Changes around how language versions and module dependencies are computed - less guessing, version -1 will be used if
not stored.</li>
</ul>
<h2 id="model-persistence">Model Persistence</h2>
<ul>
<li>New version of binary model persistence (.mpb files). The format now stores versions of languages used by the model.
This is related to the changes in the migration subsystem.</li>
</ul>
<h2 id="project">Project</h2>
<ul>
<li>Continued preparations for closer integration with the IDEA platform (workspace model)</li>
</ul>
<h2 id="structure">Structure</h2>
<ul>
<li>Cleanup: <code>EnumDataTypeDeclaration_Old</code> and related concepts deprecated several years ago were removed.</li>
<li>Internal: show &lsquo;concept scope&rsquo; in developer mode (concept scope is an experimental, internal feature to designate some
concepts as non-referenceable or only referenceable from within the same root node).</li>
</ul>
<h2 id="testing">Testing</h2>
<ul>
<li>Cleanup: drop previously deprecated concepts for node tests (<code>NodeTypeSystemWarningCheckOperation</code> and
<code>CheckNodeForErrors</code>)</li>
</ul>
<h2 id="vcs">VCS</h2>
<ul>
<li>UI improvements around conflict resolution</li>
</ul>
<h1 id="mps-extensions">MPS-extensions</h1>
<ul>
<li>diagrams: to support custom SVG export, the SVGGenerator class is now an object with options (TextAsShape, UseCSS,
SetViewBox).</li>
<li>rich text: Generic placeholders like generic comments can&rsquo;t be inserted into words anymore (an exception was thrown).</li>
<li>tables: Prevent inserting a new row node before/after a singular cardinality child node</li>
</ul>
<h1 id="mbeddr">mbeddr</h1>
<p>An exception was fixed in the mpsutil filepicker.</p>
<h1 id="iets3-opensource">IETS3 Opensource</h1>
<h2 id="kernelf">KernelF</h2>
<ul>
<li>Physical units:
<ul>
<li>The units Joule, Coulomb and Watt can now have also prefixes with negative metric scaling, e.g., mW (milliwatt).
Additionally, some typos have been corrected in the physical units documentation.</li>
<li>The precision of number types with prefixed units (e.g. mW or km) was always set to infinite by the typesystem.
Now, the precision is as precise as possible.</li>
</ul>
</li>
<li>ShortLambda Interpreter: Fixed a bug which resulted in a <code>RuntimeErrorType</code> when interpreting ShortLambdas.</li>
</ul>
<h2 id="variability">Variability</h2>
<ul>
<li>Viewer for skeleton trees has been improved (better error reporting, more stable, does not break on nodes which are
string literals).</li>
</ul>
<h1 id="specificlanguagesmps-gradle-plugin">specificlanguages/mps-gradle-plugin</h1>
<p>I have finally <a href="https://specificlanguages.com/posts/2026-01/14-mps-gradle-plugin-2-0-0/">released version 2.0.0 of the plugin</a>, after replacing the buggy artifact transforms with a
custom caching solution. A few days later, I released version 2.0.1 which improves compatibility with Gradle
configuration cache.</p>
<p>My goal now is to improve the plugin so that it can be used for the build of mbeddr. The main missing features are 1)
dependencies on other subprojects and 2) sharing external libraries among several MPS projects in the same repository.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>mps-gradle-plugin 2.0.0: modern Gradle builds for MPS projects</title>
      <link>https://specificlanguages.com/posts/2026-01/14-mps-gradle-plugin-2-0-0/</link>
      <pubDate>Wed, 14 Jan 2026 16:00:00 +0100</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-01/14-mps-gradle-plugin-2-0-0/</guid>
      <description>&lt;p&gt;I have released a new major version of my Gradle plugin for building MPS projects from Gradle,
&lt;a href=&#34;https://plugins.gradle.org/plugin/com.specificlanguages.mps/2.0.0&#34;&gt;com.specificlanguages.mps&lt;/a&gt;,
or &lt;a href=&#34;https://github.com/specificlanguages/mps-gradle-plugin&#34;&gt;specificlanguages/mps-gradle-plugin&lt;/a&gt;. The plugin is
available from the Gradle plugin portal.&lt;/p&gt;
&lt;p&gt;In this new version I have incorporated all the experience I got from setting up builds of MPS projects for customers.
Version 1 of the plugin relied heavily on conventions, but I quickly found that, while the idea is compelling,
conventions can only work for very simple projects at present.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-01/14-mps-gradle-plugin-2-0-0/"><![CDATA[ <p>I have released a new major version of my Gradle plugin for building MPS projects from Gradle,
<a href="https://plugins.gradle.org/plugin/com.specificlanguages.mps/2.0.0">com.specificlanguages.mps</a>,
or <a href="https://github.com/specificlanguages/mps-gradle-plugin">specificlanguages/mps-gradle-plugin</a>. The plugin is
available from the Gradle plugin portal.</p>
<p>In this new version I have incorporated all the experience I got from setting up builds of MPS projects for customers.
Version 1 of the plugin relied heavily on conventions, but I quickly found that, while the idea is compelling,
conventions can only work for very simple projects at present.</p>
<p>Therefore, in the new version the build author has to specify the structure of their project explicitly. In exchange,
the plugin now supports multiple MPS build scripts, including tests, and even having multiple MPS projects built from
a single Gradle project.</p>
<p>Why use the MPS Gradle plugin? There are two main reasons, describing the builds on a higher level of abstraction and
staying up to date with the current Gradle best practices for writing build scripts. Writing build scripts on a higher
level helps with their maintenance, and Gradle rewards well-written scripts with performance optimizations.</p>
<p>Many build scripts of MPS projects were cobbled together by copying existing scripts from other projects without giving
much thought to abstractions. This is mainly because the build scripts were quite complicated to begin with, but this
became a vicious cycle with the copied build scripts becoming even more complicated and more and more difficult to
maintain over time.</p>
<p>With mps-gradle-plugin, you list the build scripts and their dependencies, and the plugin registers the necessary Gradle
tasks. The tasks that the plugin registers are more granular than what build authors would write themselves. This helps
potentially avoid more work and have builds complete faster.</p>
<p>Using modern Gradle practices such as lazy configuration and configuration avoidance improves build performance further
by avoiding unnecessary work. In addition, although not implemented yet, lazy configuration will enable build and
configuration caching, potentially further improving build performance for complex projects.</p>
<p>And there are some convenience features as well. The plugin will:</p>
<ul>
<li>generate build scripts for you, so you don&rsquo;t need to maintain a separate &lsquo;build all scripts&rsquo; build script,</li>
<li>cache MPS and JBR for all subprojects within a single project, and optionally across multiple unrelated projects, so
that you don&rsquo;t have a dozen separate copies of MPS lying around,</li>
<li>configure MPS to put its cache and log directories in different locations for different tasks so that several
MPS instances can run in parallel without stepping on each other.</li>
</ul>
<p>The new version is already in use in the build
of <a href="https://github.com/JetBrains/MPS-extensions/blob/3bedaa5954710ab7e97814e33c0154d3ef944c2c/build.gradle.kts#L22">MPS-extensions</a>
and I encourage you to try it out on your projects.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>What&#39;s new in the MPS ecosystem: December 2025</title>
      <link>https://specificlanguages.com/posts/2026-01/09-whats-new-in-mps-ecosystem-december-2025/</link>
      <pubDate>Mon, 12 Jan 2026 15:00:00 +0100</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2026-01/09-whats-new-in-mps-ecosystem-december-2025/</guid>
      <description>&lt;p&gt;The MPS community is quite active but talks little about their work. I went through Git commit logs for the last month
and collected notable changes in MPS and the most prominent MPS libraries.&lt;/p&gt;
&lt;h1 id=&#34;mps-master-version-20261&#34;&gt;MPS master (version 2026.1)&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Fix for Java stubs being loaded incorrectly sometimes (&lt;a href=&#34;https://youtrack.jetbrains.com/issue/MPS-39316&#34;&gt;MPS-39316&lt;/a&gt;,
also in 2025.3), along with a few improvements to Java
stubs (&lt;a href=&#34;https://youtrack.jetbrains.com/issue/MPS-39356&#34;&gt;MPS-39356&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Support for multi-line binary expressions (MPSSPRT-474, not accessible publicly).&lt;/li&gt;
&lt;li&gt;UI color fixes and a new splash screen (&lt;a href=&#34;https://youtrack.jetbrains.com/issue/MPS-39266&#34;&gt;MPS-39266&lt;/a&gt; - editor
gutter color, &lt;a href=&#34;https://youtrack.jetbrains.com/issue/MPS-39257&#34;&gt;MPS-39257&lt;/a&gt; - red color in dependency
analyzer tool for the Islands theme, &lt;a href=&#34;https://youtrack.jetbrains.com/issue/MPS-39370&#34;&gt;MPS-39370&lt;/a&gt; - the new splash
screen).&lt;/li&gt;
&lt;li&gt;Migration listeners were changed from extension points to ModuleRuntime.Extensions (a newer way of implementing
extensions with an API that is supposed to be more safe in the face of reloading classes).&lt;/li&gt;
&lt;li&gt;Accommodating the updates of the underlying IDEA platform: fixes related to the product-info.json file, RCP boot
classpath, converting a component to a service.&lt;/li&gt;
&lt;li&gt;The HTML page that appears when opening a node by URL now shows international characters in the node name
correctly (&lt;a href=&#34;https://youtrack.jetbrains.com/issue/MPS-39352&#34;&gt;MPS-39352&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;(Ongoing) Updating the generator_demo sample project to the current best practices (ongoing,
&lt;a href=&#34;https://youtrack.jetbrains.com/issue/MPS-39192&#34;&gt;MPS-39192&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;(Ongoing) integration of the MPS in-IDE build with JPS (the IntelliJ Platform build system). This should help with
implementing a background build in the future. MPS used to be able to build in the background, but this option was
disabled because with newer MPS versions it led to deadlocks.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;mps-extensions&#34;&gt;MPS-extensions&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Line numbers are now updated asynchronously for better performance&lt;/li&gt;
&lt;li&gt;The assertions of the &amp;lsquo;compare&amp;rsquo; language can now be configured to ignore annotations (as they previously did by
default).&lt;/li&gt;
&lt;li&gt;An experimental extension point for customizing concept aliases. This feature is implemented using MPS internals and
can break in future MPS versions, but you can try it out and give feedback.&lt;/li&gt;
&lt;li&gt;An extension point to customize intentions (e.g. disable intentions from libraries or change their descriptions).
Works with the custom intentions menu.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;mbeddr&#34;&gt;mbeddr&lt;/h1&gt;
&lt;p&gt;No changes except integrating the MPS-extensions updates above.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2026-01/09-whats-new-in-mps-ecosystem-december-2025/"><![CDATA[ <p>The MPS community is quite active but talks little about their work. I went through Git commit logs for the last month
and collected notable changes in MPS and the most prominent MPS libraries.</p>
<h1 id="mps-master-version-20261">MPS master (version 2026.1)</h1>
<ul>
<li>Fix for Java stubs being loaded incorrectly sometimes (<a href="https://youtrack.jetbrains.com/issue/MPS-39316">MPS-39316</a>,
also in 2025.3), along with a few improvements to Java
stubs (<a href="https://youtrack.jetbrains.com/issue/MPS-39356">MPS-39356</a>).</li>
<li>Support for multi-line binary expressions (MPSSPRT-474, not accessible publicly).</li>
<li>UI color fixes and a new splash screen (<a href="https://youtrack.jetbrains.com/issue/MPS-39266">MPS-39266</a> - editor
gutter color, <a href="https://youtrack.jetbrains.com/issue/MPS-39257">MPS-39257</a> - red color in dependency
analyzer tool for the Islands theme, <a href="https://youtrack.jetbrains.com/issue/MPS-39370">MPS-39370</a> - the new splash
screen).</li>
<li>Migration listeners were changed from extension points to ModuleRuntime.Extensions (a newer way of implementing
extensions with an API that is supposed to be more safe in the face of reloading classes).</li>
<li>Accommodating the updates of the underlying IDEA platform: fixes related to the product-info.json file, RCP boot
classpath, converting a component to a service.</li>
<li>The HTML page that appears when opening a node by URL now shows international characters in the node name
correctly (<a href="https://youtrack.jetbrains.com/issue/MPS-39352">MPS-39352</a>).</li>
<li>(Ongoing) Updating the generator_demo sample project to the current best practices (ongoing,
<a href="https://youtrack.jetbrains.com/issue/MPS-39192">MPS-39192</a>).</li>
<li>(Ongoing) integration of the MPS in-IDE build with JPS (the IntelliJ Platform build system). This should help with
implementing a background build in the future. MPS used to be able to build in the background, but this option was
disabled because with newer MPS versions it led to deadlocks.</li>
</ul>
<h1 id="mps-extensions">MPS-extensions</h1>
<ul>
<li>Line numbers are now updated asynchronously for better performance</li>
<li>The assertions of the &lsquo;compare&rsquo; language can now be configured to ignore annotations (as they previously did by
default).</li>
<li>An experimental extension point for customizing concept aliases. This feature is implemented using MPS internals and
can break in future MPS versions, but you can try it out and give feedback.</li>
<li>An extension point to customize intentions (e.g. disable intentions from libraries or change their descriptions).
Works with the custom intentions menu.</li>
</ul>
<h1 id="mbeddr">mbeddr</h1>
<p>No changes except integrating the MPS-extensions updates above.</p>
<h1 id="iets3-opensource">IETS3 Opensource</h1>
<ul>
<li>
<p>Improvements in feature modeling. I do not have enough knowledge to describe them or comment on them.</p>
</li>
<li>
<p>The typesystem rules now use nullable &lsquo;as&rsquo; casts instead of strict (&rsquo;:&rsquo;) casts and KernelF should produce fewer
exceptions in unforeseen cases.</p>
</li>
</ul>
<h1 id="mps-build-backends-mbeddrmps-gradle-plugin">mps-build-backends, mbeddr/mps-gradle-plugin</h1>
<p>No changes in December.</p>
<h1 id="specificlanguagesmps-gradle-plugin">specificlanguages/mps-gradle-plugin</h1>
<p>No changes in December.</p>
<p><a href="https://specificlanguages.com/posts/2025-11/28-whats-new-in-mps-ecosystem/">The artifact transforms story from November</a> turned out to
be more complicated. As pointed out by Sascha Lißon, artifact transforms will not let users share MPS or JBR versions
among unrelated projects. The key under which the result of an artifact transform is cached takes into account the
complete classpath of the Gradle build script that performs the transform (not just the classpath of the transform
itself). This classpath depends on the set of applied plugins and their versions and is likely to be different for
different build scripts.</p>
<p>IntelliJ Platform Gradle Plugin hit this problem as well and solved it by implementing its own caching of the extracted
distributions. I am almost finished implementing this for the MPS Gradle plugin and I&rsquo;m going to release the final
version 2.0.0 soon.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>What&#39;s new in the MPS ecosystem: November 2025</title>
      <link>https://specificlanguages.com/posts/2025-11/28-whats-new-in-mps-ecosystem/</link>
      <pubDate>Fri, 28 Nov 2025 12:47:18 +0100</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2025-11/28-whats-new-in-mps-ecosystem/</guid>
      <description>&lt;p&gt;The MPS community is quite active but talks little about their work. I decided to help improve the situation, so I went
through Git commit logs for the last month and collected notable changes in MPS itself and the most prominent libraries.&lt;/p&gt;
&lt;p&gt;I list changes on master/main branches only. Some, but not all, of these changes are backported to older versions as
well.&lt;/p&gt;
&lt;h1 id=&#34;mps-master-version-20261&#34;&gt;MPS master (version 2026.1)&lt;/h1&gt;
&lt;h2 id=&#34;ide&#34;&gt;IDE&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Update to the latest IDEA platform.&lt;/li&gt;
&lt;li&gt;Various minor UI improvements. For example, an annoying bug where the project pane selection would jump to the
‘Transient Models’ on every build (if transient models are enabled) was fixed.&lt;/li&gt;
&lt;li&gt;UI performance improvements.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;version-control&#34;&gt;Version Control&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Merge driver improvements (‘do not generate’ flag is now merged properly).&lt;/li&gt;
&lt;li&gt;Merge UI improvements.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;generator&#34;&gt;Generator&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;An initial implementation of conditional generation (&lt;a href=&#34;https://youtrack.jetbrains.com/issue/MPS-38672&#34;&gt;MPS-38762&lt;/a&gt;).&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;editor&#34;&gt;Editor&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Intentions are now enabled on read-only cells (&lt;a href=&#34;https://youtrack.jetbrains.com/issue/MPS-33716&#34;&gt;MPS-33716&lt;/a&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;This should make the corresponding hack in MPS-extensions unnecessary.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;java&#34;&gt;Java&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Javadoc improvements:&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;The javadoc language now uses the text language for its text content, including text in various tags such as
&lt;code&gt;@param&lt;/code&gt; or &lt;code&gt;@deprecated&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Text can now be pasted &amp;lsquo;as Javadoc&amp;rsquo; (in addition to &amp;lsquo;as Java statement&amp;rsquo; and &amp;lsquo;as Java class content&amp;rsquo;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;building-and-packaging&#34;&gt;Building and Packaging&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;All JARs from mps_home/lib/modules are added to the IDEA layout, making the MPS.ThirdParty module in MPS-extensions
unnecessary (the module was removed as a consequence, see MPS-extensions changes below).&lt;/li&gt;
&lt;li&gt;MPS build scripts now have a property, &lt;code&gt;mps.log.dir&lt;/code&gt;, that can be used to specify a directory where logs will be
written, so that they are not written into the MPS home directory. This allows using one MPS installation in multiple
parallel builds.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;mps-extensions&#34;&gt;MPS-extensions&lt;/h1&gt;
&lt;p&gt;Based on the &lt;a href=&#34;https://github.com/JetBrains/MPS-extensions/blob/master/CHANGELOG.md&#34;&gt;changelog&lt;/a&gt; and commit logs:&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2025-11/28-whats-new-in-mps-ecosystem/"><![CDATA[ <p>The MPS community is quite active but talks little about their work. I decided to help improve the situation, so I went
through Git commit logs for the last month and collected notable changes in MPS itself and the most prominent libraries.</p>
<p>I list changes on master/main branches only. Some, but not all, of these changes are backported to older versions as
well.</p>
<h1 id="mps-master-version-20261">MPS master (version 2026.1)</h1>
<h2 id="ide">IDE</h2>
<ul>
<li>Update to the latest IDEA platform.</li>
<li>Various minor UI improvements. For example, an annoying bug where the project pane selection would jump to the
‘Transient Models’ on every build (if transient models are enabled) was fixed.</li>
<li>UI performance improvements.</li>
</ul>
<h2 id="version-control">Version Control</h2>
<ul>
<li>Merge driver improvements (‘do not generate’ flag is now merged properly).</li>
<li>Merge UI improvements.</li>
</ul>
<h2 id="generator">Generator</h2>
<ul>
<li><strong>An initial implementation of conditional generation (<a href="https://youtrack.jetbrains.com/issue/MPS-38672">MPS-38762</a>).</strong></li>
</ul>
<h2 id="editor">Editor</h2>
<ul>
<li><strong>Intentions are now enabled on read-only cells (<a href="https://youtrack.jetbrains.com/issue/MPS-33716">MPS-33716</a>)</strong>
<ul>
<li>This should make the corresponding hack in MPS-extensions unnecessary.</li>
</ul>
</li>
</ul>
<h2 id="java">Java</h2>
<ul>
<li><strong>Javadoc improvements:</strong>
<ul>
<li>The javadoc language now uses the text language for its text content, including text in various tags such as
<code>@param</code> or <code>@deprecated</code>.</li>
<li>Text can now be pasted &lsquo;as Javadoc&rsquo; (in addition to &lsquo;as Java statement&rsquo; and &lsquo;as Java class content&rsquo;).</li>
</ul>
</li>
</ul>
<h2 id="building-and-packaging">Building and Packaging</h2>
<ul>
<li>All JARs from mps_home/lib/modules are added to the IDEA layout, making the MPS.ThirdParty module in MPS-extensions
unnecessary (the module was removed as a consequence, see MPS-extensions changes below).</li>
<li>MPS build scripts now have a property, <code>mps.log.dir</code>, that can be used to specify a directory where logs will be
written, so that they are not written into the MPS home directory. This allows using one MPS installation in multiple
parallel builds.</li>
</ul>
<h1 id="mps-extensions">MPS-extensions</h1>
<p>Based on the <a href="https://github.com/JetBrains/MPS-extensions/blob/master/CHANGELOG.md">changelog</a> and commit logs:</p>
<ul>
<li>Tables: copy-paste support for tables was added.</li>
<li>Diagrams: there is now a flag to suppress autolayout-on-init functionality, useful when laying out multiple diagrams
in a batch.</li>
<li>Improvements to spell checking functionality (support for custom dictionaries).</li>
<li>MPS.ThirdParty solution with stubs of libraries bundled with MPS was removed, MPS.IDEA or MPS.IDEA.Modules can now be
used instead.</li>
</ul>
<h1 id="mbeddr">mbeddr</h1>
<p>Based on the <a href="https://github.com/mbeddr/mbeddr.core/blob/master/CHANGELOG.md">changelog</a> and commit logs:</p>
<h2 id="assessments">Assessments</h2>
<ul>
<li>Performance improvement when updating results of previously run queries.</li>
<li>A new option, &lsquo;always show checkboxes&rsquo;, to let users check off individual entries without marking the entire
containing assessment with an error.</li>
<li>API change to make the current MPS project available in assessments and assessment scopes.</li>
</ul>
<h2 id="action-filter">Action Filter</h2>
<ul>
<li>UI fixes to make sure the selected action profile stays selected after a restart.</li>
<li>Filtering now works without having to install an IDEA plugin.</li>
</ul>
<h2 id="small-improvements">Small improvements</h2>
<ul>
<li>The search tool has got a new icon to distinguish it from the built-in Find Usages tool window.</li>
<li><code>CommandButton#perform</code> got an overload accepting the current project as a parameter.</li>
</ul>
<h1 id="iets3-opensource-kernelf">IETS3 Opensource (KernelF)</h1>
<p>Based on the <a href="https://github.com/IETS3/iets3.opensource/blob/master/CHANGELOG.md">changelog</a> and commit logs. These
changes are only present on the MPS 2025.1 branch and haven’t been merged to master yet, but hopefully will be soon.</p>
<h2 id="added">Added</h2>
<ul>
<li>The Maven POM now contains all bundled JARs as dependencies with <code>provided</code> scope to help with automated license and
vulnerability scanning.</li>
<li>The Grammar Cells of KernelF editors can now be customized through the extension point <code>EditorCustomization</code>. Optional
cells, flag cells, constant cells, substitute cells and side transformations can be customized (activation of
substitutions, side transformations, description text, post-processing</li>
</ul>
<h2 id="fixed">Fixed</h2>
<ul>
<li>NumberLiteral editor no longer breaks if a property macro was used for its value.</li>
<li>Added missing support for IndexExpr for the operations findFirst and forEach.</li>
<li>Some editor action descriptions were improved.</li>
</ul>
<h1 id="mps-build-backends">mps-build-backends</h1>
<p>Added support for the current MPS master (2025.3/2026.1). This required passing an additional <code>--add-opens</code> flag to the
JVM when launching MPS and making the <code>remigrate</code> backend (for executing re-runnable migrations) properly wait until MPS
is done building its indices.</p>
<h1 id="mbeddrmps-gradle-plugin">mbeddr/mps-gradle-plugin</h1>
<p>No changes in November, but I am working on a simple change to bump the dependency on mps-build-backends launcher from
above. However, this leads to dropping support for older MPS versions, at least in tests.</p>
<h1 id="specificlanguagesmps-gradle-plugin">specificlanguages/mps-gradle-plugin</h1>
<p>I wanted to release the final version 2.0.0, but unfortunately my clever use of artifact transforms to share a single
MPS installation among multiple projects got derailed.</p>
<p>Gradle 9.1 has begun checking the transformed artifacts to make sure they are not changed after transformation, and
since MPS likes to write its logs into its home directory, we did not pass the check. JetBrains has implemented a fix
for this issue, but the fix did not work correctly on older MPS versions. So now I am waiting for <a href="https://youtrack.jetbrains.com/issue/MPS-39193">the fix to the
fix</a> to be released and hoping that I will not have to implement
a workaround.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>2024: a recapitulation</title>
      <link>https://specificlanguages.com/posts/2024-12/13-2024-recap/</link>
      <pubDate>Fri, 13 Dec 2024 15:29:44 +0100</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2024-12/13-2024-recap/</guid>
      <description>&lt;p&gt;In January, I &lt;a href=&#34;https://specificlanguages.com/posts/2024-01/26-my-plans-for-2024/&#34;&gt;stated&lt;/a&gt; some goals that I wanted to focus on this year.
The year is almost over, so how did I do?&lt;/p&gt;
&lt;h2 id=&#34;proper-continuous-integration-of-platforms&#34;&gt;Proper continuous integration of platforms&lt;/h2&gt;
&lt;p&gt;I wrote this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I want to set up proper continuous integration of MPS with mbeddr platform and IETS3 (KernelF). The main/master branch
of each library should be regularly built against the latest successful build of MPS master branch. If we can build
them regularly, it should be easier to pinpoint compatibility problems because the delta from the previous working
build will be smaller.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2024-12/13-2024-recap/"><![CDATA[ <p>In January, I <a href="https://specificlanguages.com/posts/2024-01/26-my-plans-for-2024/">stated</a> some goals that I wanted to focus on this year.
The year is almost over, so how did I do?</p>
<h2 id="proper-continuous-integration-of-platforms">Proper continuous integration of platforms</h2>
<p>I wrote this:</p>
<blockquote>
<p>I want to set up proper continuous integration of MPS with mbeddr platform and IETS3 (KernelF). The main/master branch
of each library should be regularly built against the latest successful build of MPS master branch. If we can build
them regularly, it should be easier to pinpoint compatibility problems because the delta from the previous working
build will be smaller.</p>
</blockquote>
<p>And I have succeeded in bringing MPS-extensions and mbeddr to build against the master branch of MPS. I haven&rsquo;t yet
implemented this for IETS3 but Alexander Pann is currently working on that.</p>
<p>This required a few bits and pieces:</p>
<ol>
<li>Repackaging and uploading MPS prereleases (this was already available in January).</li>
<li>Cascading merges from branches for older versions of MPS to newer versions (also available in January).</li>
<li>Automating migrations and running them from the command line as part of the build, in order to make sure that no
migrations are pending nor outdated concepts used after the cascading merge.</li>
<li>Setting up Dependabot, and later Renovate, to regularly upgrade the used MPS version (and other dependencies).</li>
</ol>
<p>After all the above pieces were in place, we could change the master branch of MPS-extensions and mbeddr to build
against the MPS prereleases.</p>
<h2 id="tightening-the-integration-checks">Tightening the integration checks</h2>
<p>Here is what my goal was:</p>
<blockquote>
<p>While simply building a project against the latest MPS version will show some problems, it is also necessary to do
more automated checks. The CI builds should also check the projects for any deprecated code, code that wasn&rsquo;t migrated
to the latest version of a language (this is likely to happen due to cascading merges) or other
violations. Daniel Ratiu&rsquo;s mps-qa library provides &ldquo;linters&rdquo; with most of these checks, as well as
whitelisting mechanisms in order to improve the quality gradually, and I am going to look into adding these linters as
part of the build for each library.</p>
</blockquote>
<p>My vision here was not only to run migrations, but also to check the project for any new deprecated code that was
introduced (or code that became deprecated with the new MPS prerelease). I have looked at mps-qa and while it is a very
useful library, I found several things I disliked about the approach:</p>
<ol>
<li>I would like to keep the &ldquo;whitelist&rdquo; of deprecated code that is currently in use in a text file rather than in an MPS
model because I would like it to be human-readable and easy to diff/blame/annotate with Git.</li>
<li>I would like to improve on error reporting and I feel that using mps-qa would make it impossible by design because
mps-qa integrates into the model checking framework of MPS.</li>
</ol>
<p>I have prototyped a tool to produce a deprecation report in a YAML-like format but I haven&rsquo;t implemented it in any
projects yet because of limited time and will.</p>
<h2 id="achievements-and-new-problems">Achievements and new problems</h2>
<p>Having the continuous integration with MPS master has helped us to quickly migrate to MPS 2024.1 and will likely help
with the migration to 2024.3 as well.</p>
<p>However, as is often the case in software development, solving one problem creates multiple new ones. After automating
cascading merges, dependency upgrades, and migration checks, we now have the problem of having many PRs.</p>
<p>We have improved this somewhat by enabling auto-merge for cascading PRs so if there are no migrations necessary, they
will be merged automatically as soon as the build is green. But some PRs require mindless but nevertheless manual
changes to merge. For example, in a recent version of MPS the format of module descriptors changed slightly so that the
order of attributes in a certain XML elements got reversed. This of course produces errors when trying to merge pull
requests from the previous version into this one.</p>
<p>A solution to this would be to run migrations automatically on a PR and committing changes. This would immediately
&ldquo;unlock&rdquo; a new problem: what if a migration is written incorrectly and running it a second time produces more changes?
We would need some kind of protection against infinite loops.</p>
<p>Another problem is that there are now several projects for which regularly PRs are being submitted to upgrade them to
newer MPS versions, and it is becoming difficult to keep track of the state of all proposed PRs and regularly merge
them. A dashboard (and enabling auto-merge for Renovate) would help here.</p>
<h2 id="incremental-builds-and-modularizing-the-platform-libraries">Incremental builds and modularizing the platform libraries</h2>
<p>These were my ideas back in January:</p>
<blockquote>
<h2 id="incremental-builds">Incremental builds</h2>
<p>As more and more checks will be added to the build, it is going to become slower. In order to mitigate this, we will
have to look into making the build incremental, so that only affected parts are rebuilt. (Of course, a new MPS
version will likely mean that the entire library has to be rebuilt, but a change in one component of a platform
should not require rebuilding and reanalyzing unrelated components.)</p>
<p>I have already had some success and gained some experience with incremental builds in a client project but adding
incrementality requires providing more information about the dependencies (inputs and outputs) of a particular
component from MPS to the build tool. MPS already keeps project information in two places: the <code>.mps</code> directory and
the MPS build scripts, and we would be adding a third, so this needs some thinking and automation.</p>
<h2 id="modularizing-the-platform-libraries">Modularizing the platform libraries</h2>
<p>I hope that by improving the tooling around incremental builds, it will also be possible to split the current MPS
platforms into smaller components. It is currently impossible, for example, to use just the assessments framework from
the mbeddr platform without bringing along most of the rest of the platform. My inspiration here is Spring Framework
which is releasing multiple libraries that can be used together but do not have to.</p>
<p>The biggest obstacle to achieving this currently is that this would mean lots of small build scripts, both in MPS and
in Gradle, and I would like to avoid having to keep them all in sync. This may also need some changes in the way MPS
build scripts describe dependencies (as they cannot handle transitive dependencies very well, for example).</p>
</blockquote>
<p>I haven&rsquo;t made any progress on that, unfortunately. I have an idea to try: reading MPS module descriptors (.msd and .mpl
files) to find out the dependencies of each individual module, then leverage Gradle&rsquo;s support for incremental and
parallel builds in order to build modules in parallel, but I&rsquo;m afraid that modelling Gradle dependencies to match MPS is
going to be very tricky, so it&rsquo;s something that will have to remain a dream for now.</p>
<p>Another problem that would need to be solved is specifying plugins and plugin dependencies. In fact, this is currently
the one problem for which the MPS build language offers a unique solution that would be more difficult to replicate
outside of MPS. One could create a DSL in Gradle to specify plugins, their contents and dependencies, but checking them
for correctness would require knowledge of the plugins bundled with MPS.</p>
<h2 id="plans-for-the-next-year">Plans for the next year</h2>
<p>At the end of the year I can&rsquo;t help feeling quite exhausted from the build-related work. I feel like it&rsquo;s important yet
at the same time I don&rsquo;t see anybody else recognize the importance of having a frictionless build and join my efforts.
This has led me to gradually spend less and less time on the builds, and in the next year I will likely prioritize
writing articles over improving builds.</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>Dealing with cyclic dependencies</title>
      <link>https://specificlanguages.com/posts/2024-12/08-dealing-with-cyclic-dependencies/</link>
      <pubDate>Sun, 08 Dec 2024 19:46:15 +0100</pubDate>
      <author>sergej@specificlanguages.com (Sergej Koščejev)</author>
      <guid>https://specificlanguages.com/posts/2024-12/08-dealing-with-cyclic-dependencies/</guid>
      <description>&lt;p&gt;In the life of every successful MPS project, there seems to come a point where it has to deal with cyclic dependencies.
These are dependencies between modules, such as a language depending on a solution which refers to concepts defined in
the language, or a language using another language which indirectly extends the original language, or some other form
of convoluted dependency graphs that begin to cause problems for the developers working on the project.&lt;/p&gt;</description>
      <content:encoded xml:base="https://specificlanguages.com/posts/2024-12/08-dealing-with-cyclic-dependencies/"><![CDATA[ <p>In the life of every successful MPS project, there seems to come a point where it has to deal with cyclic dependencies.
These are dependencies between modules, such as a language depending on a solution which refers to concepts defined in
the language, or a language using another language which indirectly extends the original language, or some other form
of convoluted dependency graphs that begin to cause problems for the developers working on the project.</p>
<h1 id="why-avoid-cyclic-dependencies">Why avoid cyclic dependencies</h1>
<p>Apart from “soft” reasons such as being confusing and making it more difficult to understand the project structure,
cyclic dependencies cause several practical problems when building MPS projects.</p>
<p>First, there is the performance aspect. MPS has to build modules that form cyclic dependencies together in one “chunk”.
This means that every time there is a change in one of the modules, all of them will have to be rebuilt.</p>
<p>Second, occasionally the dependencies in the cycle have to be generated in a certain order. For example, a language may
have to be generated <em>after</em> the language that it extends due to some aspects using cross-model generation and requiring
checkpoints of the extended language to be available. MPS tries to accommodate this and order dependencies in a certain
way but it may fail to produce a buildable order.</p>
<p>Third, if your dependencies are forming a cycle that requires you to specify the <code>bootstrap</code> flag in your build project,
this is a sign that you are going to have problems building your project in the future. In order to build projects that
contain bootstrap cycles, it may be necessary to add the generated sources to source control. It is then easy for these
sources to get out of date and this introduces an additional source of friction to the development process.</p>
<h1 id="how-to-avoid-cyclic-dependencies">How to avoid cyclic dependencies</h1>
<p>On the day-to-day level, cyclic dependencies often occur when a language grows large and internal logic is extracted
into a separate solution (often named generically “helper” or “util”). Care must be taken to ensure that this solution
does not depend on the language. <strong>A helper solution for a language must not refer to or use any of the concepts defined
in the language.</strong></p>
<p>Note that such a solution does not need any special designation. It does not have to be a plugin solution nor a runtime
solution, a plain solution with no special settings is enough.</p>
<p>Another source of cyclic dependencies that I have seen is splitting large languages according to “topics”. Let’s say,
your domain is describing rules and levels of adventure games. As it grows large, you may decide to split the game
language into a language for describing spells and another language for describing monsters.</p>
<p>However, although such topic-based split may look natural and logical (after all, we create a separate language for each
domain), it will easily lead to circular dependencies. Let’s say, you need to give the user a possibility to describe
how a spell affects certain monsters. This leads to a dependency from lang.spells to lang.monsters. Now, let’s say the
user wants to describe that certain monsters may use certain spells during combat. This requires a dependency from
lang.monsters to lang.spells.</p>
<p>In order to avoid such dependencies, it is important to create a <em>core</em> language which defines the domain objects in the
game that need to know about each other. In our case, this language would contain both Monster and Spell. Additional
languages may then be created to define additional features, such as complex rules about how spells affect monsters, or
conditions for monsters to use spells.</p>
<p>Of course, this problem may also be solved differently with more levels of indirections or abstractions, such as only
defining some sort of Rule class in the core language which would affect RuleObjects, and then have Monster and Spell
contain Rules which affect RuleObjects, or something in that direction. But this only proves the point: the core
language remains, only now it defines Rules and RuleObjects.</p>
<p>Therefore: <strong>on a higher level, organize your projects as “core and extensions”</strong> where the core defines interfaces,
abstract concepts, or extension points for extensions to implement or extend.</p>
<h1 id="when-cyclic-dependencies-do-not-matter">When cyclic dependencies do not matter</h1>
<p>Cyclic references, especially in user models, do not need to be problematic per se. As a real-life example, we have
Wikipedia articles which may refer to each other and form cycles, and this is of course a valuable feature. Notice,
however, that I used the word <em>references</em> here. In fact, the problem starts when <em>references</em> turn into <em>dependencies</em>,
usually for technical reasons, such as needing to generate and compile Java code.</p>
<p><strong>If all you do with user models is generate some sort of non-executable output such as XML or JSON or HTML, the cyclic
references do not need to be a problem.</strong></p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
