<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-24248206</id><updated>2012-01-24T14:49:48.392+01:00</updated><category term='parser generator'/><category term='case study'/><category term='DSLs'/><category term='helios'/><category term='slides'/><category term='left factoring'/><category term='javascript'/><category term='nordic coding'/><category term='kotlin'/><category term='jdt'/><category term='autosar'/><category term='conference'/><category term='Java multi-line strings'/><category term='xpand'/><category term='scoping'/><category term='extension methods'/><category term='CG2011'/><category term='Galileo'/><category term='itemis'/><category term='UML modeling brumm brumm'/><category term='GSoC'/><category term='Languages'/><category term='git'/><category term='eclipse modeling itemis'/><category term='DSL'/><category term='DSL code generation eclipse xtext slides'/><category term='xtext'/><category term='eclipse'/><category term='Eclipse EclipseCon Modeling Xtext'/><category term='Guice'/><category term='code generation'/><category term='presentations'/><category term='language design'/><category term='builder API'/><category term='guicecon'/><category term='emf index'/><category term='JVM'/><category term='scala'/><category term='OSGi'/><category term='eclipsecon'/><category term='java'/><category term='democamps'/><category term='refactoring'/><category term='english'/><category term='webinar'/><category term='Java testing performance'/><category term='example'/><category term='protocol buffers'/><category term='left recursion'/><category term='jax 2010'/><category term='website'/><category term='fowler'/><category term='api design'/><category term='packrat'/><category term='java.scala'/><category term='oaw eclipse xtext'/><category term='android'/><category term='MDSD'/><category term='expressions'/><category term='xtend'/><category term='groovy'/><category term='eclipse summit'/><category term='index'/><category term='xbase'/><category term='modeling'/><category term='kiel'/><category term='release'/><category term='automotive'/><category term='http://www.blogger.com/img/gl.link.gif'/><category term='xtend 2'/><category term='internal DSLs'/><category term='oAW'/><category term='codegeneration'/><category term='OpenJDK'/><title type='text'>Sven Efftinge's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.efftinge.de/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default?start-index=101&amp;max-results=100'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>119</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-24248206.post-8066747576253081842</id><published>2012-01-11T09:05:00.003+01:00</published><updated>2012-01-11T09:17:15.730+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtend'/><title type='text'>I like free beer!</title><content type='html'>Did you know about &lt;a href="http://99-bottles-of-beer.net/"&gt;http://99-bottles-of-beer.net&lt;/a&gt;?&lt;br /&gt;They list programs generating lyrics for a song about beer in 1440 different programming languages (it will be 1441 very soon ;-)). &lt;a href="http://99-bottles-of-beer.net/lyrics.html"&gt;These are the lyrics to generate&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So here is a version written in &lt;a href="http://xtend-lang.org/"&gt;Xtend&lt;/a&gt;:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-LTIZIv4Kq6U/Tw1EzCCQZ2I/AAAAAAAAAXg/hA9Oby_FEAY/s1600/Screen+Shot+2012-01-11+at+9.13.29+AM.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-LTIZIv4Kq6U/Tw1EzCCQZ2I/AAAAAAAAAXg/hA9Oby_FEAY/s1600/Screen+Shot+2012-01-11+at+9.13.29+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;It uses a couple of interesting features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.eclipse.org/Xtext/xtend/#templateexpression"&gt;Template Expressions&lt;/a&gt;&lt;/b&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.eclipse.org/Xtext/xtend/#extensionmethods"&gt;Extension methods&lt;/a&gt;&lt;/b&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.eclipse.org/Xtext/xtend/#switchexpression"&gt;Switch Expression&lt;/a&gt;&lt;/b&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.eclipse.org/Xtext/xtend/#everythingisanexpression"&gt;Everything is an Expression&lt;/a&gt;&lt;/b&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Seriously, I think this is one of the most concise and readable versions. &lt;a href="http://99-bottles-of-beer.net/toplist.html"&gt;Compare yourself&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-8066747576253081842?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/8066747576253081842/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=8066747576253081842&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8066747576253081842'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8066747576253081842'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2012/01/i-like-free-beer.html' title='I like free beer!'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-LTIZIv4Kq6U/Tw1EzCCQZ2I/AAAAAAAAAXg/hA9Oby_FEAY/s72-c/Screen+Shot+2012-01-11+at+9.13.29+AM.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-9048286371858999110</id><published>2012-01-04T09:57:00.002+01:00</published><updated>2012-01-04T11:54:18.909+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='jdt'/><title type='text'>Collection Literals in Java (or a hidden gem in Eclipse JDT)</title><content type='html'>Yesterday I watched a devoxx presentation by Joshua Bloch about the &lt;a href="http://www.devoxx.com/display/DV11/The+Evolution+of+Java++Past,+Present,+and+Future"&gt;Evolution of Java"&lt;/a&gt; which I enojoyed. &lt;br /&gt;In that talk he discusses the various language features which have been added to Java in terms of how important resp. problematic their addition was. I agree with most of his reasoning but not with the following two:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;static imports&lt;/b&gt; &lt;br /&gt;He said they are ok, but not too useful and that he makes use of them only about once a month.&lt;/li&gt;&lt;li&gt;&lt;b&gt;diamond operator&lt;/b&gt; &lt;br /&gt;He claimed, that this was an important addition, since now creating new collections is less noisy.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;I disagree for the following reasons&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Joshua Bloch actually also helped designing a very cool collection library which is part of &lt;a href="http://code.google.com/p/guava-libraries/"&gt;Google Guava&lt;/a&gt;. If you don't know it, have a look! Besides other useful stuff that library contains factory methods for the common collection types.&lt;br /&gt;For instance to create an ArrayList you could write the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;List&amp;lt;String&amp;gt; names = Lists.newArrayList();&lt;/pre&gt;&lt;br /&gt;Making use of a static import one can write something like this: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import static com.google.common.collect.Lists.*;&lt;br /&gt;...&lt;br /&gt;List&amp;lt;String&amp;gt; stuff = newArrayList("Foo","Bar","Baz");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But the inconvenience of adding a static import every time you want to create a new collection is a problem. &lt;b&gt;JDT to the rescue!&lt;/b&gt; There is an almost hidden gem in JDT, that allows you to have static import favorites for content assist. This is my configuration:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-OoC-0PCx6xA/TwQvIKGd0AI/AAAAAAAAAW0/wcINjklbgeE/s1600/Screen+Shot+2012-01-04+at+11.50.33+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="270" src="http://1.bp.blogspot.com/-OoC-0PCx6xA/TwQvIKGd0AI/AAAAAAAAAW0/wcINjklbgeE/s400/Screen+Shot+2012-01-04+at+11.50.33+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;Having your static imports configured here, will make their methods available through code completion without having an import first. Instead the import will automatically be added as you apply the proposal.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-U7xwQlYuVmE/TwQSrIxTjKI/AAAAAAAAAWo/SwSMiDk3exE/s1600/Screen%2BShot%2B2012-01-04%2Bat%2B9.36.27%2BAM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="177" src="http://2.bp.blogspot.com/-U7xwQlYuVmE/TwQSrIxTjKI/AAAAAAAAAWo/SwSMiDk3exE/s400/Screen%2BShot%2B2012-01-04%2Bat%2B9.36.27%2BAM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I only create collections that way, because it's so easy and readable, and I don't have much use cases for the diamond operator (in fact inference on the left hand side would have been much more interesting). On the other hand I use static imports in almost any class file.&lt;br /&gt;&lt;br /&gt;Btw, those static imports not only make the factory methods available but also all the nice higher-order functions like, collect, filter, etc.. &lt;br /&gt;A welcome productivity gain!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-9048286371858999110?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/9048286371858999110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=9048286371858999110&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/9048286371858999110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/9048286371858999110'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2012/01/collection-literals-in-java-or-hidden.html' title='Collection Literals in Java (or a hidden gem in Eclipse JDT)'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-OoC-0PCx6xA/TwQvIKGd0AI/AAAAAAAAAW0/wcINjklbgeE/s72-c/Screen+Shot+2012-01-04+at+11.50.33+AM.png' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-5797081556272561038</id><published>2012-01-03T09:25:00.002+01:00</published><updated>2012-01-11T11:07:14.016+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtend'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Upcoming Presentations on Xtext / Xtend</title><content type='html'>There will be a couple of opportunities to learn about the &lt;a href="http://xtext.org/"&gt;Xtext&lt;/a&gt; / &lt;a href="http://xtend-lang.org/"&gt;Xtend&lt;/a&gt; technology stack in the next couple of months. Here are the dates:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://xtext_xtend.eventbrite.com/"&gt;January 12 - Java User Group Ostfalen, Braunschweig&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.meetup.com/Londonjavacommunity/events/41282572/?value=Xtend+and+Xtext"&gt;February 1 - Java Community, London&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.itemis.de/itemis-ag/veranstaltungen/2012/language=de/taps=646/41198/vortragsreihe-bonn-domaenenspezifische-sprachen-mit-xtext"&gt;February 2 - Bonn&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://lanyrd.com/2012/jfokus/smtht/"&gt;February 14 - Jfokus, Stockholm&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipsecon.org/2012/sessions/dsls-java-developers-xtext"&gt;March 29&lt;/a&gt; - &lt;a href="http://www.eclipsecon.org/2012/sessions/eclipse-xtend-language-made-java-developers"&gt;EclipseCon, Washington D.C.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rcp-vision.com/?page_id=1938"&gt;May 4- Eclipse Day, Florence&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Hope to see you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-5797081556272561038?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/5797081556272561038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=5797081556272561038&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5797081556272561038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5797081556272561038'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2012/01/upcoming-presentations-on-xtext-xtend.html' title='Upcoming Presentations on Xtext / Xtend'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1906917844933476002</id><published>2011-12-21T10:19:00.002+01:00</published><updated>2011-12-21T10:22:12.397+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtend'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='java.scala'/><title type='text'>Groovy, Scala, Java, Xtend - an UPDATED stupid comparison</title><content type='html'>This is an update to &lt;a href="http://blog.efftinge.de/2011/12/groovy-scala-java-xtend-stupid.html"&gt;yesterday's post&lt;/a&gt;, based on feedback I got so far:&lt;br /&gt;&lt;h2&gt;Measurement&lt;/h2&gt;&lt;a href="http://blog.efftinge.de/2011/12/groovy-scala-java-xtend-stupid.html?showComment=1324427023173#c917609833070775784"&gt;Henning suggested&lt;/a&gt; that the number of iterations is too small:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;10000 iterations are probably not enough for a comparison: If I go from 10k to 100k iterations, the Scala version needs 5x time -- the Java version only 2x.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Indeed. Here's what I got when using 1M iterations:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Java (the pretty version): &lt;pre&gt;Took : 245 ms, number of elements : 3000000&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Xtend : &lt;pre&gt;Took : 278 ms, number of elements : 3000000&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Xtend (using switch - see below) : &lt;pre&gt;Took : 298 ms, number of elements : 3000000&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Scala (using for comprehensions) : &lt;pre&gt;Took : 5140 ms, number of elements : 3000000&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Scala (using while loops) : &lt;pre&gt;Took : 931 ms, number of elements : 3000000&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Scala (using while loops and java.util.collections - see below) : &lt;pre&gt;Took : 315 ms, number of elements : 3000000&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Groovy (using &amp;lt;&amp;lt; operator - see below): &lt;pre&gt;Took : 1683 ms, number of elements : 3000000&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;Groovy&lt;/h2&gt;&lt;a href="http://blog.efftinge.de/2011/12/groovy-scala-java-xtend-stupid.html?showComment=1324415480827#c8686136002844570445"&gt;Thorsten&lt;/a&gt; and &lt;a href="http://blog.efftinge.de/2011/12/groovy-scala-java-xtend-stupid.html?showComment=1324424445659#c714482153377410531"&gt;Jochen&lt;/a&gt; pointed out that I used the wrong operator for adding new elements to a list. I should use '&amp;lt;&amp;lt;' instead of '+=' since the latter would create a new list for the single elements before adding them. I've fixed this and the Groovy program is much faster now.&lt;br /&gt;&lt;br /&gt;Jochen also pointed out that the comparison is unfair since, because of the dynamic dispatch Groovy does heavy caching assuming that a method is invoked for the same type of argument most of the time.&lt;br /&gt;&lt;br /&gt;My initial idea was to do a comparison where Groovy has a strength (i.e. dynamic dispatch). After all the other examples also do dispatching at runtime. The Java and Scala version don't call another method, but since Xtend does so and is as fast as Java I'd say this extra call doesn't change much.&lt;br /&gt;&lt;br /&gt;Jochen also states:&lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;Imagine a class with those three foo methods written in Java. Then in Groovy you can still run your test. I dare to say that in Xtend you cannot make this work without a dispatcher method somewhere - and your dispatch keyword is implying that - thus I assume you cannot make this then work using a Java class.&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I think this is actually a big problem with Groovy. Although it's syntax might look a bit like Java it behaves totally different.&lt;br /&gt;In contrast Xtend binds statically just like Java and in fact a multi method in Xtend behaves always the same no matter if you call it from Java or Xtend. &lt;br /&gt;&lt;br /&gt;He further says &lt;br /&gt;&lt;b&gt;&lt;i&gt;&lt;br /&gt;But let us not stop here... let us assume that you write the base class in Java, where it knows foo(String) foo(Object) and foo(Boolean). Using this class the Integer variant would call the foo(Object) method in your code. Now extend that class in Java with a foo(Integer) method and Groovy would no longer call foo(Object) but foo(Integer). &lt;br /&gt;I doubt you can easily simulate that case.&lt;br /&gt;&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I can indeed not do that in Java. But I can do that with Xtend and it still behaves as expected no matter form what language you'd call that code.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Scala&lt;/h2&gt;&lt;a href="http://blog.efftinge.de/2011/12/groovy-scala-java-xtend-stupid.html?showComment=1324413943183#c7129611571905586173"&gt;Jan said&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;I rewrote your little program to use while loops and the java utils collections and the scala version was as fast as java - but nearly as ugly to :-D&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here's the updated Scala version with while and java.util.collections, which is now almost as fast as the Java version:&lt;br /&gt;&lt;pre&gt;object Scala extends Application {&lt;br /&gt;  val absoluteResult = new ArrayList[Any]()&lt;br /&gt;  val before = System.currentTimeMillis()&lt;br /&gt;  var i =0&lt;br /&gt;  while (i&amp;lt;1000000) {&lt;br /&gt;    i = i+1&lt;br /&gt;    val result = List("foo", 23, true).iterator&lt;br /&gt;    while (result.hasNext) {&lt;br /&gt;      absoluteResult.add(foo(result.next))&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  println("Took : "+(System.currentTimeMillis() - before)&lt;br /&gt;      +" ms, number of elements : "+absoluteResult.size)&lt;br /&gt;  &lt;br /&gt;  def foo(obj : Any) =&lt;br /&gt;    obj match {&lt;br /&gt;          case _:String =&amp;gt; "String"&lt;br /&gt;          case _:Boolean =&amp;gt; "Boolean"&lt;br /&gt;          case _:Integer =&amp;gt; "Integer"&lt;br /&gt;          case _ =&amp;gt; throw new IllegalArgumentException()&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Clojure&lt;/h2&gt;&lt;a href="http://blog.efftinge.de/2011/12/groovy-scala-java-xtend-stupid.html?showComment=1324422925446#c1323114631190254595"&gt;Stefan&lt;/a&gt; did a nice little example in Clojure. It doesn't use any mutable collections but uses a pure functional style:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;(defn foo [x]&lt;br /&gt;(cond&lt;br /&gt;(number? x) "Number"&lt;br /&gt;(string? x) "String"&lt;br /&gt;(= (class x) Boolean) "Boolean"))&lt;br /&gt;&lt;br /&gt;(time (println (count &lt;br /&gt;(map foo &lt;br /&gt;(apply concat &lt;br /&gt;(repeat 10000 ["foo" 23 true]))))))&lt;br /&gt;&lt;/pre&gt;On his machine the Java example takes '31ms' and the Clojure program prints &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Prints: 30000 "Elapsed time: 194.046477 msecs"&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Xtend&lt;/h2&gt;An alternative way to do the dispatch in Xtend is using type guards in switch,&lt;br /&gt;which doesn't make a huge difference performance-wise :&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class XtendWithSwitch {&lt;br /&gt;  def static void main(String[] args) {&lt;br /&gt;    val absoluteResult = newArrayList()&lt;br /&gt;    val before = System::currentTimeMillis()&lt;br /&gt;    for (times : 0..1000000) {&lt;br /&gt;      val result = newArrayList('foo', 23, true)&lt;br /&gt;      for (y : result) {&lt;br /&gt;        absoluteResult += foo(y)&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    println("Took : "+(System::currentTimeMillis() as int - before)&lt;br /&gt;      +" ms, number of elements : "+absoluteResult.size)&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def static foo(Comparable comp) {&lt;br /&gt;    switch(comp) {&lt;br /&gt;      String : 'String'&lt;br /&gt;      Boolean : 'Boolean'&lt;br /&gt;      Integer : 'Integer'&lt;br /&gt;      default : throw new IllegalArgumentException()&lt;br /&gt;    }  &lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2&gt;Java&lt;/h2&gt;&lt;br /&gt;Finally based on &lt;a href="http://blog.efftinge.de/2011/12/groovy-scala-java-xtend-stupid.html?showComment=1324427023173#c917609833070775784"&gt;Henning's suggestion&lt;/a&gt; I beautified the Java version a bit using Guava and static imports:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;public static void main(String[] args) {&lt;br /&gt;  List&amp;lt;Object&amp;gt; absoluteResult = newArrayList();&lt;br /&gt;  long before = System.currentTimeMillis();&lt;br /&gt;  for (int i=0; i &amp;lt; 1000000; i++) {&lt;br /&gt;    for (Object y : newArrayList("foo", 23, true)) {&lt;br /&gt;      absoluteResult.add(foo(y));&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  System.out.println("Took : "+(System.currentTimeMillis() - before)&lt;br /&gt;    +" ms, number of elements : "+absoluteResult.size());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static String foo(Object s) {&lt;br /&gt;  if (s instanceof String) {&lt;br /&gt;    return "String";&lt;br /&gt;  } else if (s instanceof Boolean) {&lt;br /&gt;    return "Boolean";&lt;br /&gt;  } else if (s instanceof Integer) {&lt;br /&gt;    return "Integer";&lt;br /&gt;  } else {&lt;br /&gt;    throw new IllegalArgumentException();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1906917844933476002?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1906917844933476002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1906917844933476002&amp;isPopup=true' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1906917844933476002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1906917844933476002'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/12/groovy-scala-java-xtend-updated-stupid.html' title='Groovy, Scala, Java, Xtend - an UPDATED stupid comparison'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-4474110263473978366</id><published>2011-12-20T19:29:00.005+01:00</published><updated>2011-12-21T08:46:00.599+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Groovy, Scala, Java, Xtend - a stupid comparison</title><content type='html'>&lt;p&gt;&lt;i&gt;Disclaimer: This is probably the worst possible way to compare execution performance. I'm posting it nonetheless since the result was significant. Judge for yourself.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Today I took some time to check out the latest Eclipse plugins for both Groovy and Scala. I mainly wanted to know how nice the tooling is and played around with it a bit. I had been doing some Scala a couple of years ago, but since the Eclipse plugin not even existed those days it was a bit too painful for me to get used to it.&lt;/p&gt;&lt;p&gt;Groovy's tooling looks very good. There are just a few oddities but mainly I think it's well done... in contrast to the Scala plugin (I used 2.0.0 RC4). It holds a lot of surprises. For instance, with the Scala-IDE installed you'll get Scala-related template proposals in the Java and the Groovy editor. Still Scala the language would be my personal choice if I had to decide between the two. Anyway, this post is not about language features or Eclipse-plugin quality, but about what I experienced regarding runtime performance.&lt;/p&gt;&lt;p&gt;I knew Groovy's performance is bad. But I expected the performance problems to diminish, if I use a scenario using dynamic dispatch and mostly untyped objects. So I wrote the following brain dead code:&lt;/p&gt;&lt;pre&gt;class Groovy {&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    def absoluteResult = []&lt;br /&gt;    def before = System.currentTimeMillis()&lt;br /&gt;    for (times in 1..10000) {&lt;br /&gt;      def result = ['foo', 23, true]&lt;br /&gt;      for (y in result) {&lt;br /&gt;        absoluteResult += foo(y)&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    println("Took : "+(System.currentTimeMillis() - before)&lt;br /&gt;      +" ms, number of elements : "+absoluteResult.size);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  static String foo(String s) {&lt;br /&gt;    'String'&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  static String foo(Boolean s) {&lt;br /&gt;    'Boolean'&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  static String foo(Integer s) {&lt;br /&gt;    'Integer'&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;It doesn't do anything interesting but leverages Groovy's built-in way of resolving overloaded methods using the runtime type. I thought it's fair to use this feature in a comparison, also because Xtend's dispatch methods have the same behavior. The result of the code above would be a list containing the string 'String', 'Boolean', and 'Integer' each 10.000 times. &lt;/p&gt;&lt;p&gt;When I run this code on my machine, it prints something like the following:&lt;/p&gt;&lt;pre&gt;Took : 2025 ms, number of elements : 30000&lt;/pre&gt;&lt;h3&gt;A possible Xtend version&lt;/h3&gt;&lt;p&gt;This is how I could achieve the same using Xtend:&lt;/p&gt;&lt;pre&gt;class Xtend {&lt;br /&gt;  def static void main(String[] args) {&lt;br /&gt;    val absoluteResult = newArrayList()&lt;br /&gt;    val before = System::currentTimeMillis()&lt;br /&gt;    for (times : 1..10000) {&lt;br /&gt;      val result = newArrayList('foo', 23, true)&lt;br /&gt;      for (y : result) {&lt;br /&gt;        absoluteResult += foo(y)&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    println("Took : "+(System::currentTimeMillis() - before)&lt;br /&gt;           +" ms, number of elements : "+absoluteResult.size)&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def static dispatch foo(String s) {&lt;br /&gt;    'String'&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  def static dispatch foo(Boolean s) {&lt;br /&gt;    'Boolean'&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  def static dispatch foo(Integer s) {&lt;br /&gt;    'Integer'&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;On a first glance it looks very similar. Note, the dispatch keyword, which turns a set of overloaded methods into dynamically dispatched methods (i.e. the default Groovy behavior). &lt;br /&gt;In contrast to the Groovy version this one is &lt;b&gt;fully statically typed&lt;/b&gt; and as it turned out &lt;b&gt;much faster&lt;/b&gt;. (Again as you see my measurement technique is everything but professional, but given such a big difference I dare to say it's faster).&lt;/p&gt;&lt;p&gt;It prints something like:&lt;/p&gt;&lt;pre&gt;Took : 43 ms, number of elements : 30000&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;I also did a Scala version:&lt;/h3&gt;&lt;br /&gt;&lt;pre&gt;object Scala extends Application {&lt;br /&gt;  val absoluteResult = MutableList[Any]()&lt;br /&gt;  val before = System.currentTimeMillis()&lt;br /&gt;  for (times &lt;- 0 until 10000) {&lt;br /&gt;    val result = List("foo", 23, true)&lt;br /&gt;    for (y &amp;lt;- result) {&lt;br /&gt;      absoluteResult += foo(y)&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  println("Took : "+(System.currentTimeMillis() - before)&lt;br /&gt;      +" ms, number of elements : "+absoluteResult.size)&lt;br /&gt;&lt;br /&gt;  def foo(obj : Any) =&lt;br /&gt;    obj match {&lt;br /&gt;          case _:String =&gt; "String"&lt;br /&gt;          case _:Boolean =&gt; "Boolean"&lt;br /&gt;          case _:Integer =&gt; "Integer"&lt;br /&gt;          case _ =&gt; throw new IllegalArgumentException()&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;I got this kind of result:&lt;/p&gt;&lt;pre&gt;Took : 130 ms, number of elements : 30000&lt;/pre&gt;&lt;h3&gt;And finally a Java version:&lt;/h3&gt;&lt;pre&gt;public class Java {&lt;br /&gt;  public static void main(String[] args) {&lt;br /&gt;    List&amp;lt;Object&amp;gt; absoluteResult = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;    long before = System.currentTimeMillis();&lt;br /&gt;    for (int i=0; i &lt; 10000; i++) {&lt;br /&gt;      List&amp;lt;Object&amp;gt; result = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;      result.add("foo");&lt;br /&gt;      result.add( 23);&lt;br /&gt;      result.add(true);&lt;br /&gt;      for (Object y : result) {&lt;br /&gt;        absoluteResult.add(foo(y));&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    System.out.println("Took : "+(System.currentTimeMillis() - before)&lt;br /&gt;      +" ms, number of elements : "+absoluteResult.size());&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  static String foo(Object s) {&lt;br /&gt;    if (s instanceof String) {&lt;br /&gt;      return "String";&lt;br /&gt;    } else if (s instanceof Boolean) {&lt;br /&gt;      return "Boolean";&lt;br /&gt;    } else if (s instanceof Integer) {&lt;br /&gt;      return "Integer";&lt;br /&gt;    } else {&lt;br /&gt;      throw new IllegalArgumentException();&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Which prints:&lt;/p&gt;&lt;pre&gt;Took : 40 ms, number of elements : 30000&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-4474110263473978366?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/4474110263473978366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=4474110263473978366&amp;isPopup=true' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4474110263473978366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4474110263473978366'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/12/groovy-scala-java-xtend-stupid.html' title='Groovy, Scala, Java, Xtend - a stupid comparison'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7547842925285864702</id><published>2011-12-12T14:46:00.014+01:00</published><updated>2011-12-13T08:29:10.856+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtend'/><category scheme='http://www.blogger.com/atom/ns#' term='builder API'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Writing Android UIs with Xtend</title><content type='html'>(Update: You can find the project on github :&amp;nbsp;https://github.com/svenefftinge/xtend-android-experiments )&lt;br /&gt;&lt;br /&gt;&lt;a href="http://xtend-lang.org/"&gt;Xtend&lt;/a&gt; is a great fit for Android development. Since Xtend translates to Java source code, it's very easy to use it. After you've installed the Xtend SDK and the Android Development Tools you only need to do two things to get started.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In Eclipse's preferences configure Xtend's compiler to generated to the gen/ folder.&lt;/li&gt;&lt;li&gt;Add the &lt;a href="http://build.eclipse.org/common/xtend/maven/org/eclipse/xtend2/org.eclipse.xtend2.lib/2.2.0/org.eclipse.xtend2.lib-2.2.0.jar"&gt;Xtend lib&lt;/a&gt; and &lt;a href="http://code.google.com/p/guava-libraries/"&gt;Google Guava&lt;/a&gt; to your project's classpath.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Why is it useful?&lt;/span&gt;&lt;br /&gt;Using a combination of Xtend's powerful &lt;a href="http://www.eclipse.org/Xtext/xtend/documentation/index.html#extensionMethods"&gt;extension methods&lt;/a&gt; and closures, it's possible to come up with a very declarative API to define UI models. It takes a couple of minutes to write an API which allows for defining a UI like the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class AppActivity extends Activity {&lt;br /&gt; &lt;br /&gt;  override void onCreate(Bundle savedInstanceState) {&lt;br /&gt;    super.onCreate(savedInstanceState);&lt;br /&gt;  &lt;br /&gt;    contentView = this.linearLayout [&lt;br /&gt;   &lt;br /&gt;      orientation = VERTICAL&lt;br /&gt;  &lt;br /&gt;      view = this.textView ("Hello Android!")&lt;br /&gt;  &lt;br /&gt;      view = this.button ("Click Me!") [&lt;br /&gt;        onClickListener = [ &lt;br /&gt;          this.textMessage('Hello you clicked me!').show&lt;br /&gt;        ]&lt;br /&gt;      ]&lt;br /&gt;    ]&lt;br /&gt;  } &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The API is made available by means of a static extension import. To outline the idea, here's how the button method is defined:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;def static button(Context context, String text,&lt;br /&gt;      (Button)=&amp;gt;void initializer) {&lt;br /&gt;  val result = new Button(context)&lt;br /&gt;  result.text = text&lt;br /&gt;  initializer.apply(result)&lt;br /&gt;  return result&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Used as an extension method button can be invoked on any instance of Context. Since the last argument is a function type it can be passed after the actual method invocation:&lt;br /&gt;&lt;br /&gt;&lt;pre style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;view = this.button ("Click Me!") [&lt;br /&gt;        onClickListener = [ &lt;br /&gt;          this.textMessage('Hello you clicked me!').show&lt;br /&gt;        ]&lt;br /&gt;      ]&lt;/pre&gt;&lt;br /&gt;Also note how you can simply assign a closure to &lt;i&gt;onClickListener (&lt;/i&gt;which is btw. invoking&lt;i&gt; setOnClickListener())&lt;/i&gt;. The compiler will automatically convert it to an abstract class of &lt;i&gt;View.OnClickListener&lt;/i&gt;.&lt;br /&gt;&lt;b&gt;And everything is 100% statically typed!&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-IkROPJKJFLQ/TuYEvNTVJuI/AAAAAAAAAUs/Xc5w9-1wuDw/s1600/Screen+Shot+2011-12-12+at+2.37.53+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-IkROPJKJFLQ/TuYEvNTVJuI/AAAAAAAAAUs/Xc5w9-1wuDw/s1600/Screen+Shot+2011-12-12+at+2.37.53+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7547842925285864702?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7547842925285864702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7547842925285864702&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7547842925285864702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7547842925285864702'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/12/writing-android-uis-with-xtend.html' title='Writing Android UIs with Xtend'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-IkROPJKJFLQ/TuYEvNTVJuI/AAAAAAAAAUs/Xc5w9-1wuDw/s72-c/Screen+Shot+2011-12-12+at+2.37.53+PM.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7883668256041238099</id><published>2011-11-22T09:39:00.004+01:00</published><updated>2011-11-23T13:11:35.720+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend'/><category scheme='http://www.blogger.com/atom/ns#' term='extension methods'/><title type='text'>What’s So Special About Xtend’s Extension Methods?</title><content type='html'>&lt;p&gt;You should read this, if you are :&lt;/p&gt;&lt;ul&gt;&lt;li&gt; interested in new programming language concepts&lt;/li&gt;&lt;li&gt; understood how great dependency injection is&lt;/li&gt;&lt;li&gt; want to learn about some uniqueness in &lt;a href="http://xtend-lang.org"&gt;Eclipse Xtend&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h3&gt;Extension Methods&lt;/h3&gt;&lt;i&gt;&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Extension_method"&gt;Extension methods&lt;/a&gt;&lt;/strong&gt; enable you to "add" methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type. In C# extension methods are a special kind of static method, but they are called as if they were instance methods on the extended type.&lt;/i&gt; (Wikipedia November 2011)&lt;br /&gt;&lt;p&gt;In Xtend you could, for instance, add a new method to java.util.List like this:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;def static &amp;lt;T&amp;gt; T head(List&amp;lt;T&amp;gt; list) {&lt;br /&gt;   for (element : list)&lt;br /&gt;     return element &lt;br /&gt;  return null &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Which then can be used as an extension method on any instance of Iterable&amp;lt;T&amp;gt;:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;newArrayList(“foo”,”bar”).head()&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Using the prefix notation is much closer to how we think, read, and write. From left to right that is. Also the IDE can now provide useful proposals because the receiver is known. The readability gets even better if you use chained method invocations. For instance, let's assume you want to filter the list before obtaining the head. Using the regular infix syntax known from Java the code would like like that :&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;head(filter(newArrayList(“foo”,”bar”) , [e | e != “foo”]))&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;But reading inside out doesn’t seem to be the best way to understand what’s going on. So better use extension methods:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;newArrayList(“foo”,”bar”).filter(e | e != “foo”).head&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Much better, isn't it?&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Static Methods Are Bad!&lt;/h3&gt;&lt;p&gt;But wait, don’t extension methods advocate the heavy use of static methods? And isn’t that bad coding style? &lt;/p&gt;&lt;p&gt;Yes, often it is.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;With static methods you’ll bind your code not only to the signature of a certain method but to the actual implementation. There’s no way (aside from byte code manipulation) to change the implementation without touching the client code. That’s probably not a big deal with the kind of extension methods I just showed. But what if you want to have DAO-like methods available on your domain model types? Accessing them in a static way seems totally uncool, since we wouldn’t be able to run the code with mocks or exchange the database layer easily or just fix or change something later on. That's why static methods are a bad choice most of the time.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Typically you would want to use a dependency injection container to have such services injected. This is where Xtend’s extension methods are different from the one you find in C#.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Xtend allows to use methods from local fields as extension methods.&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Let’s assume we have the following Java interface:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;interface SaveSupport { &lt;br /&gt;  void save(Entity entity);&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;And given we have some domain model type &lt;i&gt;Person&lt;/i&gt; which implements Entity, you can write the following code:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;class Controller {  &lt;br /&gt;  @Inject extension SaveSupport&lt;br /&gt;    def testStuff() {&lt;br /&gt;     val p = new Person() &lt;br /&gt;    p.name = “Fred Flintstone” &lt;br /&gt;    p.save // translated to ‘this._saveSupport.save(p)’&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;That’s a big deal, because now &lt;strong&gt;you can use an object oriented coding style but keep your domain model free from layer specific code at the same time!&lt;/strong&gt; And everything is easily testable and can be run in different scenarios using different DI configuration. There are other unique language features in Xtend, like the template expression, but the combination of extension methods and a good dependency injection framework (Guice) really changes how you structure your software system and reason about it. &lt;br /&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7883668256041238099?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7883668256041238099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7883668256041238099&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7883668256041238099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7883668256041238099'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/11/whats-so-special-about-xtends-extension.html' title='What’s So Special About Xtend’s Extension Methods?'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-5675894481813820951</id><published>2011-11-04T09:42:00.003+01:00</published><updated>2011-11-04T09:42:50.775+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><title type='text'>New Xtend Website</title><content type='html'>&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px; text-align: center;"&gt;With the recent release of &lt;a href="http://blog.efftinge.de/2011/11/build-your-own-jvm-language.html"&gt;Xtext 2.1&lt;/a&gt;, also the language &lt;a href="http://www.eclipse.org/Xtext/releasenotes/2.1.0/new_and_noteworthy.php#Xtend"&gt;Xtend got improved in various ways&lt;/a&gt;.&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;Today we announce a new landing page for Xtend:&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://xtend-lang.org/"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;xtend-lang.org&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cTkZv4NHQH0/TrOkXE-gs5I/AAAAAAAAAUQ/M3KF8zvuZh8/s1600/Screen+Shot+2011-11-04+at+9.36.44+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="286" src="http://2.bp.blogspot.com/-cTkZv4NHQH0/TrOkXE-gs5I/AAAAAAAAAUQ/M3KF8zvuZh8/s400/Screen+Shot+2011-11-04+at+9.36.44+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;So go find out about this little Java-enhancer and if you happen to be at EclipseCon Europe today&amp;nbsp;&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;make sure to attend Sebastian's talk on Xtend.&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-height: 14px; text-align: center;"&gt;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; &lt;a href="http://eclipsecon.org/sessions/xtend-powerful-tool-everyday-programming"&gt;Xtend - A Powerful Tool For Everyday Programming&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 12px/normal Helvetica; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;&amp;nbsp; &amp;nbsp; Theater Stage at 2 p.m.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-5675894481813820951?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/5675894481813820951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=5675894481813820951&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5675894481813820951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5675894481813820951'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/11/new-xtend-website.html' title='New Xtend Website'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-cTkZv4NHQH0/TrOkXE-gs5I/AAAAAAAAAUQ/M3KF8zvuZh8/s72-c/Screen+Shot+2011-11-04+at+9.36.44+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7040045142088759733</id><published>2011-11-01T23:21:00.000+01:00</published><updated>2011-11-01T23:21:52.740+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='language design'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><title type='text'>Build Your Own JVM Language!</title><content type='html'>Xtext has already simplified development of domain-specific languages a lot. From a simple grammar definition you not only get a full language infrastructure but also powerful Eclipse-based tool support.&lt;br /&gt;Now it's getting even better.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xtext.org/"&gt;Today we release Xtext 2.1&lt;/a&gt;, which comes with surprisingly easy to use support for defining little languages targeting the JVM (Java Virtual Machine). You only need to define two files:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the grammar&lt;/li&gt;&lt;li&gt;a mapping to Java concepts&lt;/li&gt;&lt;/ul&gt;The first one is not new. It's still the same concise and readable grammar language we always had in Xtext. &lt;br /&gt;&lt;br /&gt;The second script is the big deal: it allows you to map your language concepts to any number of Java types, fields and methods. By doing that you implicitly tell the framework what it needs to know to provide you with a fully working IDE including an incremental compiler!&lt;br /&gt;&lt;br /&gt;We have written a nice little &lt;a href="http://www.eclipse.org/Xtext/documentation/2_1_0/035-domainmodel-java.php"&gt;tutorial explaining the five steps&lt;/a&gt; needed to get a language like the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import java.util.List&lt;br /&gt;&lt;br /&gt;package my.model {&lt;br /&gt;&lt;br /&gt;    entity Person {&lt;br /&gt;        name: String&lt;br /&gt;        firstName: String&lt;br /&gt;        friends: List&amp;lt;Person&amp;gt;&lt;br /&gt;        address : Address&lt;br /&gt;&lt;br /&gt;        op getFullName() : String {&lt;br /&gt;            return firstName + " " + name;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        op getFriendsSortedByFullName() : List&amp;lt;Person&amp;gt; {&lt;br /&gt;            return friends.sortBy( f | f.fullName);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    entity Address {&lt;br /&gt;        street: String&lt;br /&gt;        zip: String&lt;br /&gt;        city: String&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, it supports all kinds of advanced features such as Java generics and full expressions even including closures. But you not only get a working parser, linker and compiler but a fully-working high-end Eclipse plug-in on top! The screencast demos the resulting language and IDE and briefly shows how that can be built. Be creative and have fun!&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/31423880?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="480" height="270" frameborder="0" webkitAllowFullScreen allowFullScreen&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7040045142088759733?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7040045142088759733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7040045142088759733&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7040045142088759733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7040045142088759733'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/11/build-your-own-jvm-language.html' title='Build Your Own JVM Language!'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-5407987617337634739</id><published>2011-10-25T19:30:00.003+01:00</published><updated>2011-10-25T19:38:49.907+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipsecon'/><category scheme='http://www.blogger.com/atom/ns#' term='api design'/><title type='text'>This Is Not Your Father's Java</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.eclipsecon.org/europe2011/sites/default/files/130x100_speaking.gif?1307137694" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://www.eclipsecon.org/europe2011/sites/default/files/130x100_speaking.gif?1307137694" /&gt;&lt;/a&gt;&lt;/div&gt;The Java language and so its community has traditionally been relatively conservative when it comes to API design and language features. After all Java seems to be the very last language on earth without closures! Also a lot of other language features are highly demanded by many people.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;With limits come creativity!&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;To compensate for the verbose language and missing convenience, the Java community created the &lt;a href="http://netbeans.org/"&gt;three&lt;/a&gt; &lt;a href="http://www.jetbrains.com/idea/"&gt;single&lt;/a&gt; &lt;a href="http://www.eclipse.org/"&gt;best&lt;/a&gt; IDEs in the world. Also the popularity and maturity of code generation and language add-ons like AspectJ or even XML stems from the limitations in Java as a language. With the rise of alternative languages for the JVM, Java folks started to think out of the box. Modern API design is pushing Java to its limits and with some creativity you can even emulate missing language features.&lt;br /&gt;&lt;br /&gt;Next week at&amp;nbsp;&lt;a href="http://eclipsecon.org/"&gt;EclipseCon Europe&lt;/a&gt;&amp;nbsp;I'll be giving a talk on creative API design in Java.&lt;br /&gt;&lt;br /&gt;The talk will be structured like a quiz: I show a working piece of Java code to the audience and explain&amp;nbsp;&lt;b&gt;what&lt;/b&gt; it does. Then you tell me &lt;b&gt;how&lt;/b&gt; it does so. So it's a slightly similar structure to the popular &lt;a href="http://www.infoq.com/presentations/Java-Puzzlers"&gt;Java Puzzlers&lt;/a&gt; talks but in this case the puzzlers are actually unconventional but useful idioms. I expect a lively discussion about the pros and cons of the various idioms and I'm&amp;nbsp;almost sure there is something new for everybody.&amp;nbsp;Feel challenged? Come to the session! :-)&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;a href="http://eclipsecon.org/sessions/not-your-fathers-java"&gt;This Is Not Your Father's Java - Wednesday November 2nd, 17:00 - 17:30&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-5407987617337634739?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/5407987617337634739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=5407987617337634739&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5407987617337634739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5407987617337634739'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/10/this-is-not-your-fathers-java.html' title='This Is Not Your Father&apos;s Java'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-727583921528384531</id><published>2011-10-20T10:20:00.006+01:00</published><updated>2011-10-20T12:56:02.753+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtend'/><category scheme='http://www.blogger.com/atom/ns#' term='kotlin'/><category scheme='http://www.blogger.com/atom/ns#' term='builder API'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Xtend 2.1 - Type-safe Groovy-style Builder API</title><content type='html'>&lt;p&gt;The upcoming release of Xtend (Version 2.1, November 2nd) is going to be a huge leap forward. Besides the many new editor features, we managed to improve the performance of linking and type inference by many times. The editing experience is now very close to what you are used to from Eclipse's Java tooling. We are working on a comprehensive New &amp;amp; Noteworthy page where all the cool new features will be listed. Everything will be ready for &lt;a href="http://eclipsecon.org/sessions/xtend-powerful-tool-everyday-programming"&gt;EclipseCon Europe on November 2nd&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;In this post I want to focus on the new language features we added. There are mainly two of them, which are both interesting for themselves but even more so in combination.&lt;br /&gt;&lt;/p&gt;&lt;b&gt;&lt;br /&gt;The Implicit Variable &lt;i&gt;'it'&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;&lt;p&gt;If you name your variable 'it' all its members are accessible without qualifying them with the variable reference (just like 'this').&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Example:&lt;br /&gt;&lt;/p&gt;&lt;code&gt;&lt;br /&gt;def appendFoo(StringBuilder it) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;append('foo')&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;Also note that variables with the name 'it' are the only ones which can be overridden in lexical scopes. So you could for instance write the following, where the closure shadows the outer variable it.&lt;br /&gt;&lt;/p&gt;&lt;code&gt;&lt;br /&gt;def foo(List&amp;lt;String&amp;gt; it) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;foreach( it | toUpperCase )&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;You should understand the other new language features to see how this is meant to be used.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Sugar For Closures With One Argument&lt;/b&gt;&lt;br /&gt;&lt;p&gt;Many languages have special syntactic sugar for closures with just one argument. So does Xtend 2.1. The general syntax for a closure with one argument is :&lt;/p&gt;&lt;code&gt;&lt;br /&gt;[Type arg | expression-using-arg ]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;With zero arguments it still is&lt;br /&gt;&lt;/p&gt;&lt;code&gt;&lt;br /&gt;[| expression-using-only-outer-context ]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;And the new sugared version for closures with one argument is:&lt;br /&gt;&lt;/p&gt;&lt;code&gt;&lt;br /&gt;[expression-using-it]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;And of course the name of the implicit argument is &lt;i&gt;'it'&lt;/i&gt;.&lt;/p&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Closures As Last Arguments&lt;/b&gt;&lt;br /&gt;&lt;p&gt;We added another feature, which is common in many other popular languages: If you invoke a method where the last argument is a closure you can place the closure after the &lt;br /&gt;actual method invocation.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Example:&lt;br /&gt;&lt;/p&gt;&lt;code&gt;&lt;br /&gt;newArrayList('a','b','c').foreach [ toUpperCase ]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Groovy-style Builder Syntax&lt;/b&gt;&lt;br /&gt;&lt;p&gt;Using these three language enhancements in combination allows for defining statically-typed groovy-style builder APIs. Check the screencast to see it in action. &lt;/p&gt;&lt;p&gt;&lt;iframe src="http://player.vimeo.com/video/30818911?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen allowFullScreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;If you are attending EclipseCon Europe and would like to know more about the possibilities of Xtend, make sure to go to &lt;a href="http://eclipsecon.org/sessions/xtend-powerful-tool-everyday-programming"&gt;Sebastian's session&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-727583921528384531?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/727583921528384531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=727583921528384531&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/727583921528384531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/727583921528384531'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/10/xtend-21-type-safe-groovy-style-builder.html' title='Xtend 2.1 - Type-safe Groovy-style Builder API'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-458236238324959090</id><published>2011-08-15T11:00:00.001+01:00</published><updated>2011-08-15T12:12:54.842+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xbase'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend 2'/><title type='text'>Riding the Waterfall</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/-60yDKaMDZ14/TKRz9lL-yJI/AAAAAAAAAQE/WlPjBetihZY/s1600/BMBF.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="153" src="http://2.bp.blogspot.com/-60yDKaMDZ14/TKRz9lL-yJI/AAAAAAAAAQE/WlPjBetihZY/s200/BMBF.gif" width="200" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Did you know we are working on a research project called “Xbase”? It’s a two year project which is going to end in May 2012. So far we are absolutely in time with everything we had written down in the project plan two years ago. We've developed Xbase itself and Xtend on top of it. Next up in the plan is a textual language for EMF Ecore files as well as a validation language. Both are based on and leveraging Xbase. Also in the plan is support for debugging for Xbase-based languages, evaluating the usefulness of Xbase in the context of web-development and extensive documentation. So here are the details for the next couple of months:&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Xcore&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;a href="http://ed-merks.blogspot.com/2011/08/xcore-coolness-reborn.html"&gt;Ed already blogged about it&lt;/a&gt;: It’s going to be the primary syntax to design Ecore models and it will not only come with decent tooling to define the structural elements of an Ecore model. It will allow you to express behavior of EOperations and derived EStructuralFeatures using Xbase. It’s still in a very early state but we’ll have something cool to show at EclipseCon Europe (as long as &lt;a href="http://www.eclipsecon.org/europe2011/sessions/xcore-ecore-meets-xtext"&gt;the talk&lt;/a&gt; gets accepted that is ;-))&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Validation language&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;The validation language is developed together with our friends from Paranor. It will focus on a declarative description of compiler issues, including the messages and severities and will automatically allow language users to change the severities on a per project level.&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Debugging&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;Developing with DSLs includes debugging them. We want to allow debugging any Xbase-based DSL right within the Java debugger. The idea is that you can debug through the underlying Java but at the same time (i.e. during the same debugging session) you can also step over the original DSL code. This might be best explained with the small prototype I created a couple of weeks ago.&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;iframe frameborder="0" height="225" src="http://player.vimeo.com/video/26046484?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="400"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Evaluation in the context of web development&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;To proof the relevance of Xbase and Xtext we have put this evaluation task into the project plan. The idea is to write a small web application framework, which might not be as general as something like Spring Roo or the Play! Framework but is much more concrete than the domain model example we ship. Think of it as a comprehensive real world application of Xtext 2.0. The project plan states that this is going to be open-sourced :-)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Extensive Documentation (The Xtext book)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;The Xbase project plan says we are going to work a couple of months on extensive documentation. The best form would be a printed book. So that’s what we want to do.&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;Maintenance&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;We have just added Xbase to the already relatively large Xtext project. We’ve also added Xtend, a statically typed programming language, and plan to have a couple of other new components as well. But we cannot just throw stuff in all the time. We need to make sure that the overall quality is improved steadily and this gets harder as the framework grows. The good thing is, that we won’t do (we can’t since we published API) big changes to the core framework as we did in previous years. But still there’s enough to do and even the further improvement of the runtime and the editor parts of Xbase, Xtend and Xtext itself is written down in the project plan. Isn't waterfall planning a great thing? ;-)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;BTW: Xtext 2.0.1 and Xtext 2.1.0&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 14.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 12.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="letter-spacing: 0px;"&gt;A service release has been available for two weeks now and the 2.1 release is planned for mid October. It will contain a lot of bugfixes, a more stable version of the reimplemented serializer, and more performance improvements (we are still working on that). It will also come with one or the other enhancement. It’s best to check bugzilla to find out about the details. We use the SR2 flag for it.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-458236238324959090?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/458236238324959090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=458236238324959090&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/458236238324959090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/458236238324959090'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/08/riding-waterfall.html' title='Riding the Waterfall'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-60yDKaMDZ14/TKRz9lL-yJI/AAAAAAAAAQE/WlPjBetihZY/s72-c/BMBF.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-8272842787806728765</id><published>2011-08-04T13:25:00.000+01:00</published><updated>2011-08-04T13:25:10.482+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nordic coding'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenJDK'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>Nordic Coding Part III</title><content type='html'>The third &lt;a href="http://www.diwish.de/index.php?id=termindetails&amp;amp;no_cache=1&amp;amp;view=single&amp;amp;event_id=525&amp;amp;cHash=987cf67fd5"&gt;Nordic Coding&lt;/a&gt; event is taking place on August 19 in Kiel, Germany.&lt;br /&gt;&lt;br /&gt;I think, we again managed to come up with a very nice program. Here it is:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JavaScript - The World's Most Misunderstood Programming Language (Thomas Bahn)&lt;/b&gt;&lt;br /&gt;JavaScript can be a very nice dynamically typed, functional language if you use it properly. Thomas is going to show us what the language's cool core features like closures and prototypes look like and how to use them.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Scala rocks! An Introduction to Scala (Arno Haase)&lt;/b&gt;&lt;br /&gt;Everybody is talking about Scala these days. So it's time to have some introduction to this nice functional language at Nordic Coding. I know Arno loves the language and he can be very passionate about things he likes :-)&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Java SE - The road forward, 2011 edition (Dalibor Topic)&lt;/b&gt;&lt;br /&gt;The State of the Union of the Oracle Java SE platform group. In this presentation you'll learn more about where we are now, how we got there and where we are going in the future.&lt;br /&gt;&lt;br /&gt;So I hope you like such a language-oriented program as much as I do.&lt;br /&gt;Like always DiWiSH will serve some food and drinks after the last talk.&lt;br /&gt;Hope to see a lot of you there!&lt;br /&gt;&lt;a href="http://www.diwish.de/index.php?id=termindetails&amp;amp;no_cache=1&amp;amp;view=single&amp;amp;event_id=525&amp;amp;cHash=987cf67fd5"&gt;Here is the link to the official announcement (in German)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-8272842787806728765?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/8272842787806728765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=8272842787806728765&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8272842787806728765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8272842787806728765'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/08/nordic-coding-part-iii.html' title='Nordic Coding Part III'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-6213499280242988384</id><published>2011-06-06T08:01:00.001+01:00</published><updated>2011-06-06T08:29:44.243+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='democamps'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Upcoming Eclipse Democamps Featuring Xtext</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/-Yc5RlbR1Yts/Tex7Dk7CBbI/AAAAAAAAARk/ubtV3YvaxPM/s1600/Xtext-Logo-Kreide-sw.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="183" src="http://3.bp.blogspot.com/-Yc5RlbR1Yts/Tex7Dk7CBbI/AAAAAAAAARk/ubtV3YvaxPM/s320/Xtext-Logo-Kreide-sw.jpg" width="320" /&gt;&lt;/a&gt;Have you yet checked whether there is an &lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011"&gt;Eclipse DemoCamp for Indigo&lt;/a&gt; near your place?&lt;br /&gt;&lt;br /&gt;There is a lot of Xtext coverage in DemoCamps in Europe and one in the US this month. So if you want to learn about Xtext 2.0 and its new features, you should consider to come to one of the following events.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;June 7th&lt;/td&gt;&lt;td&gt;Frankfurt, Germany&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Frankfurt"&gt;Xtext 2.0 (with me)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 11th&lt;/td&gt;&lt;td&gt;Krakow, Poland&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Krakow"&gt;Xtext Demo (Marcin Lewandowski)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 14th&lt;/td&gt;&lt;td&gt;Bonn, Germany&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Bonn"&gt;Xtext 2.0 (Jan Koehnlein)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 17th&lt;/td&gt;&lt;td&gt;Vienna, Austria&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Vienna"&gt;Xtext 2.0 (Sebastian Zarnekow)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 20th&lt;/td&gt;&lt;td&gt;Munich, Germany&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Muenchen"&gt;Xtext 2.0 (Sebastian and me)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Muenchen"&gt;APPlause (built with Xtext) (Peter Friese)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 20th&lt;/td&gt;&lt;td&gt;San Jose, USA&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/San_Jose"&gt;Xtext 2.0 (Moritz Eysholdt)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 21st&lt;/td&gt;&lt;td&gt;Dresden, Germany&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Dresden"&gt;Xtext 2.0 (Jan Koehnlein)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 21st&lt;/td&gt;&lt;td&gt;Darmstadt, Germany&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Darmstadt"&gt;APPlause (built with Xtext) (Marcus Ficner)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 28th&lt;/td&gt;&lt;td&gt;Hamburg, Germany&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Hamburg"&gt;Xtext 2.0 (me)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 28th&lt;/td&gt;&lt;td&gt;Amsterdam, Netherlands&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Amsterdam"&gt;Xtext 2.0 (Christophe Bouhier)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;June 29th&lt;/td&gt;&lt;td&gt;Berlin, Germany&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011/Berlinm"&gt;APPlause (built with Xtext) (Heiko Behrens)&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;In addition to that Sebastian and I are giving &lt;a href="http://jazoon.com/Conference/Tuesday-21-June/Sven-Efftinge-Sebastian-Zarnekow"&gt;a talk at Jazoon in Zurich, Switzerland&lt;/a&gt; on June 21st. I'm looking forward to see many of you at one of these events!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-6213499280242988384?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/6213499280242988384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=6213499280242988384&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6213499280242988384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6213499280242988384'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/06/upcoming-eclipse-democamps-featuring.html' title='Upcoming Eclipse Democamps Featuring Xtext'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Yc5RlbR1Yts/Tex7Dk7CBbI/AAAAAAAAARk/ubtV3YvaxPM/s72-c/Xtext-Logo-Kreide-sw.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-9029797953749054020</id><published>2011-06-03T08:13:00.002+01:00</published><updated>2011-06-03T21:18:00.350+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fowler'/><category scheme='http://www.blogger.com/atom/ns#' term='DSLs'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend 2'/><title type='text'>5 simple steps to Fowler's DSL with Xtext 2.0</title><content type='html'>You might have read (about) the book &lt;a href="http://martinfowler.com/books.html#dsl"&gt;Domain-Specific Languages written by Martin Fowler&lt;/a&gt;. As the name suggests it is about these little useful programming languages you can built very easily with &lt;a href="http://www.xtext.org/"&gt;Xtext&lt;/a&gt;. Unfortunately Martin decided to use more low level technology in order to explain how to implement such a language. So if you don't want to spend hours of hours dealing with complex low level technology just to end up with a parser but nothing else, here are the five steps needed to get a fully working implementation for the &lt;a href="http://www.informit.com/articles/article.aspx?p=1592379"&gt;DSL he uses throughout the book&lt;/a&gt;&amp;nbsp;(Mrs Grant's Controller). It doesn't get simpler.&lt;br /&gt;&lt;br /&gt;Below you can find a detailed description. For those of you who prefer to just sit and watch, here are three screencasts I've recorded around this example.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="263" src="http://player.vimeo.com/video/24584569?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=DBD7EF" width="468"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;b&gt;Creating the project and defining the language&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="263" src="http://player.vimeo.com/video/24584729?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=DBD7EF" width="468"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;b&gt;Defining the code generator and see its integration&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="263" src="http://player.vimeo.com/video/24585008?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=DBD7EF" width="468"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;b&gt;Features, Features, Features&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;1) Download Eclipse and Install Xtext&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For many people this is the hardest part. But believe me things have improved and it is now quite easy to get a working Eclipse distribution including the latest milestone of Xtext 2.0. :-)&lt;br /&gt;&lt;br /&gt;Download an &lt;b&gt;Eclipse Classic&lt;/b&gt; distribution for your platform from here : &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="http://www.eclipse.org/downloads/index-developer.php"&gt;http://www.eclipse.org/downloads/index-developer.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unzip and start Eclipse, choose &lt;b&gt;Help -&amp;gt; Install New Software... &lt;/b&gt;and use the update site&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="http://download.itemis.com/updates/milestones"&gt;http://download.itemis.com/updates/milestones&lt;/a&gt;&lt;br /&gt;in order to install the &lt;b&gt;Xtext SDK&lt;/b&gt; feature&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;2) Use the Xtext project wizard&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Select &lt;b&gt;New -&amp;gt; Project...&lt;/b&gt;, and within the dialog choose &lt;b&gt;Xtext Project&lt;/b&gt;.&amp;nbsp;You can stick with the defaults on the next page, but make sure you choose the &lt;b&gt;Experimental Features&lt;/b&gt; configuration in order to get the latest and greatest features, such as rename refactoring.&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-zTpS2BQYJ_w/TeiG-tXfjNI/AAAAAAAAARg/RmMJfIjsLx4/s1600/Screen+shot+2011-06-03+at+9.01.57+AM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="26" src="http://1.bp.blogspot.com/-zTpS2BQYJ_w/TeiG-tXfjNI/AAAAAAAAARg/RmMJfIjsLx4/s400/Screen+shot+2011-06-03+at+9.01.57+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;You should use the experimental features&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;3) Define the grammar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Xtext grammar file is automatically opened. Just copy and paste the following grammar definition for Martin's statemachine DSL in.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;grammar&lt;/span&gt; org.xtext.example.mydsl.MyDsl &lt;span style="color: #921167;"&gt;with&lt;/span&gt; org.eclipse.xtext.common.Terminals&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;generate&lt;/span&gt;&lt;span style="color: black;"&gt; statemachine &lt;/span&gt;"http://www.xtext.org/example/secretcompartments/Statemachine"&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Statemachine :&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; {Statemachine}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;(&lt;/span&gt;'events'&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;events+=Event+&amp;nbsp;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;'end'&lt;span style="color: black;"&gt;)?&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;(&lt;/span&gt;'resetEvents'&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;resetEvents+=[Event]+&amp;nbsp;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;'end'&lt;span style="color: black;"&gt;)?&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;(&lt;/span&gt;'commands'&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;commands+=Command+&amp;nbsp;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;'end'&lt;span style="color: black;"&gt;)?&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;states+=State*&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Event:&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;name=ID code=ID&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Command:&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;name=ID code=ID&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;State:&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;'state'&lt;/span&gt; name=ID&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;(&lt;span style="color: #4726f9;"&gt;'actions'&lt;/span&gt; &lt;span style="color: #4726f9;"&gt;'{'&lt;/span&gt; actions+=[Command]+ &lt;span style="color: #4726f9;"&gt;'}'&lt;/span&gt;)?&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;transitions+=Transition*&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;'end'&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Transition:&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Monaco; font-size: 11px;"&gt;&amp;nbsp;&lt;/span&gt;event=[Event] &lt;span style="color: #4726f9;"&gt;'=&amp;gt;'&lt;/span&gt; state=[State]&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;4) Run the generator&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Now you need to run the generator which creates the parser and a couple of other parts of the language infrastructure. To do so right click into the editor and choose&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &lt;b&gt;Run As -&amp;gt; Generate Xtext Artifacts&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Times; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;5) Define the code generator&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;A DSL isn't worth much if you are not able to execute it somehow. Xtext has already provided you with a stub for a code generator written in our cool new template language Xtend (Xtend as well as the grammar language are also implemented with Xtext of course).&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;To get a working implementation which produces a Java implementation of a defined statemachine, just copy the following into the file &lt;i&gt;MyDslGenerator.xtend&lt;/i&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Times; font-size: medium; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;package&lt;/span&gt; org.xtext.example.mydsl.generator&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;import&lt;/span&gt; org.eclipse.emf.ecore.resource.Resource&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;import&lt;/span&gt; org.eclipse.xtext.generator.IGenerator&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;import&lt;/span&gt; org.eclipse.xtext.generator.IFileSystemAccess&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;import&lt;/span&gt; org.xtext.example.mydsl.statemachine.Statemachine&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;import&lt;/span&gt; org.xtext.example.mydsl.statemachine.Event&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;import&lt;/span&gt; org.xtext.example.mydsl.statemachine.Command&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;import&lt;/span&gt; org.xtext.example.mydsl.statemachine.State&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #921167;"&gt;class&lt;/span&gt; MyDslGenerator &lt;span style="color: #921167;"&gt;implements&lt;/span&gt; IGenerator {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #921167;"&gt;override&lt;/span&gt; &lt;span style="color: #921167;"&gt;void&lt;/span&gt; doGenerate(Resource resource, IFileSystemAccess fsa) {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;fsa.generateFile(resource.className+&lt;span style="color: #4726f9;"&gt;".java"&lt;/span&gt;, toJavaCode(resource.contents.head &lt;span style="color: #921167;"&gt;as&lt;/span&gt; Statemachine))&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #921167;"&gt;def&lt;/span&gt; className(Resource res) {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;span style="color: #921167;"&gt;var&lt;/span&gt; name = res.URI.lastSegment&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;name.substring(&lt;span style="color: #909090;"&gt;0&lt;/span&gt;, name.indexOf(&lt;span style="color: #4726f9;"&gt;'.'&lt;/span&gt;))&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #921167;"&gt;def&lt;/span&gt; toJavaCode(Statemachine sm) &lt;span style="color: #4726f9;"&gt;'''&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;import java.io.BufferedReader;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;import java.io.IOException;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;import java.io.InputStreamReader;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;public class &lt;/span&gt;«sm.eResource.className»&lt;span style="color: #4726f9;"&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;public static void main(String[] args) {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;new &lt;/span&gt;«sm.eResource.className»&lt;span style="color: #4726f9;"&gt;().run();&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;«&lt;span style="color: #921167;"&gt;FOR&lt;/span&gt; c : sm.commands»&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;«c.declareCommand»&lt;/div&gt;&lt;div style="color: #921167; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;«&lt;/span&gt;ENDFOR&lt;span style="color: black;"&gt;»&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;protected void run() {&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;boolean executeActions = true;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;String currentState = "&lt;span style="color: black;"&gt;«sm.states.head.name»&lt;/span&gt;";&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;String lastEvent = null;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;while (true) {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;«&lt;span style="color: #921167;"&gt;FOR&lt;/span&gt; state : sm.states»&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt;&lt;/span&gt;«state.generateCode»&lt;/div&gt;&lt;div style="color: #921167; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;«&lt;/span&gt;ENDFOR&lt;span style="color: black;"&gt;»&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;«&lt;span style="color: #921167;"&gt;FOR&lt;/span&gt; resetEvent : sm.resetEvents»&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt;if ("&lt;span style="color: black;"&gt;«resetEvent.name»&lt;/span&gt;".equals(lastEvent)) {&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;System.out.println("Resetting state machine.");&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;currentState = "&lt;span style="color: black;"&gt;«sm.states.head.name»&lt;/span&gt;";&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;executeActions = true;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #921167; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;«&lt;/span&gt;ENDFOR&lt;span style="color: black;"&gt;»&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;private String receiveEvent() {&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;System.out.flush();&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;try {&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;return br.readLine();&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;} catch (IOException ioe) {&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;System.out.println("Problem reading input");&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;return "";&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;'''&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #921167;"&gt;def&lt;/span&gt; declareCommand(Command command) &lt;span style="color: #4726f9;"&gt;'''&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;protected void do&lt;/span&gt;«command.name.toFirstUpper»&lt;span style="color: #4726f9;"&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;System.out.println("Executing command &lt;span style="color: black;"&gt;«command.name»&lt;/span&gt; (&lt;span style="color: black;"&gt;«command.code»&lt;/span&gt;)");&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;'''&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #921167;"&gt;def&lt;/span&gt; generateCode(State state) &lt;span style="color: #4726f9;"&gt;'''&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;if (currentState.equals("&lt;span style="color: black;"&gt;«state.name»&lt;/span&gt;")) {&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;if (executeActions) {&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;«&lt;span style="color: #921167;"&gt;FOR&lt;/span&gt; c : state.actions»&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt;do&lt;/span&gt;«c.name.toFirstUpper»&lt;span style="color: #4726f9;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #921167; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;«&lt;/span&gt;ENDFOR&lt;span style="color: black;"&gt;»&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;executeActions = false;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;System.out.println("Your are now in state '&lt;span style="color: black;"&gt;«state.name»&lt;/span&gt;'. Possible events are [&lt;span style="color: black;"&gt;«&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;state.transitions.map(t | t.event.name).join(&lt;span style="color: #4726f9;"&gt;', '&lt;/span&gt;)»&lt;span style="color: #4726f9;"&gt;].");&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;lastEvent = receiveEvent();&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;«&lt;span style="color: #921167;"&gt;FOR&lt;/span&gt; t : state.transitions»&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;if ("&lt;span style="color: black;"&gt;«t.event.name»&lt;/span&gt;".equals(lastEvent)) {&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt;currentState = "&lt;span style="color: black;"&gt;«t.state.name»&lt;/span&gt;";&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;     &lt;/span&gt;executeActions = true;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #921167; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #4726f9;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;«&lt;/span&gt;ENDFOR&lt;span style="color: black;"&gt;»&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;}&lt;/div&gt;&lt;div style="color: #4726f9; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;'''&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-9029797953749054020?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/9029797953749054020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=9029797953749054020&amp;isPopup=true' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/9029797953749054020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/9029797953749054020'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/06/five-simple-steps-to-fowlers-dsl-with.html' title='5 simple steps to Fowler&apos;s DSL with Xtext 2.0'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zTpS2BQYJ_w/TeiG-tXfjNI/AAAAAAAAARg/RmMJfIjsLx4/s72-c/Screen+shot+2011-06-03+at+9.01.57+AM.png' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-4332465734968018973</id><published>2011-05-16T07:28:00.000+01:00</published><updated>2011-05-16T07:28:59.370+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CG2011'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend 2'/><title type='text'>Code Generation 2011</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.codegeneration.net/cg2011/images/header.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="64" src="http://www.codegeneration.net/cg2011/images/header.gif" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Have you heard of &lt;a href="http://blog.efftinge.de/2011/04/eclipse-xtend-beta-available.html"&gt;Xtend&lt;/a&gt;, yet? It's the successor to the template language Xpand. It's implemented with &lt;a href="http://www.xtext.org/"&gt;Xtext&lt;/a&gt; and it's based on Xtext's new embeddable expression language &lt;a href="http://blog.efftinge.de/2010/09/xbase-new-programming-language.html"&gt;Xbase&lt;/a&gt;.&lt;br /&gt;&lt;b&gt;Xtend's main purpose is to be the most concise and most productive way to write code generators.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Of course, the best conference to present such a language is &lt;a href="http://www.codegeneration.net/cg2011/index.php"&gt;"Code Generation 2011" in Cambridge, UK&lt;/a&gt;. A nice familial conference, taking place next week, with lots of very friendly people all interested in one topic. This year's keynotes are given by the authors of two of the main libraries Xtext is based on: my friend &lt;a href="http://ed-merks.blogspot.com/"&gt;Ed Merks&lt;/a&gt;, the original author and lead of EMF, and &lt;a href="http://www.parr.us/terence/index.html"&gt;Terence Parr&lt;/a&gt;, the author of the Antlr Parser Generator.&lt;br /&gt;&lt;br /&gt;Terence has also developed a new version of his template language (&lt;a href="http://www.stringtemplate.org/"&gt;StringTemplate&lt;/a&gt;) which he is hopefully able to demo next week. Our friends from Obeo will have a talk about &lt;a href="http://www.eclipse.org/acceleo/"&gt;Acceleo&lt;/a&gt; which is an OMG standards based template language. They do a pretty good job in compensating the little freedom in language design they have by adding rich tooling. I especially like the tracing stuff they have.&lt;br /&gt;&lt;br /&gt;There are also various other interesting presentations like the hands-on sessions on &lt;a href="http://www.jetbrains.com/mps/"&gt;MPS&lt;/a&gt; and &lt;a href="http://www.metacase.com/mwb/"&gt;MetaEdit+&lt;/a&gt;. Also Heiko and Peter are going to give their&lt;a href="http://www.codegeneration.net/cg2011/sessioninfo.php?session=28"&gt; very entertaining talk about cross-mobile platform development&lt;/a&gt;. I have yet to see a more practical and at the same time entertaining presentation on how to benefit from code generation and DSLs.&lt;br /&gt;&lt;br /&gt;Unfortunately I cannot go to all the mentioned sessions because some of them take place in parallel. Anyway, the two sessions I definitely will attend are starting&amp;nbsp;on Tuesday at 11am. They are both classified as hands-on sessions and will be giving them together with &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; and &lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;During the &lt;a href="http://www.codegeneration.net/cg2011/sessioninfo.php?session=17"&gt;Xtend hands-on&lt;/a&gt; you will learn everything you need to get started with this nice little language. Learning Xtend is quite easy if you are familiar with Eclipse and Java, because the integration of the tooling is tight and the syntax is only different at a few places. Mostly Xtend just leaves superfluous stuff out (e.g. type inference). This session will have a huge hands-on part and doesn't require any previous knowledge.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.codegeneration.net/cg2011/sessioninfo.php?session=16"&gt;other session will be about Xtext 2.0&lt;/a&gt;. We will cover the basic principles as well as advanced topics.&amp;nbsp;Also Xbase, the embeddable expression language, will be covered. In this session the hands-on parts will likely not be as excessive as in the Xtend session, because we have to expect a mixed audience with respect to prior knowledge of Xtext. The session shall be interesting to both experienced and not so experienced listeners.&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="clear: right; float: right; margin-bottom: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-3f3mm5uS5Rg/Tc-4dUlPCZI/AAAAAAAAARc/CjThhqiyiC8/s1600/IMG_0447.JPG" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://1.bp.blogspot.com/-3f3mm5uS5Rg/Tc-4dUlPCZI/AAAAAAAAARc/CjThhqiyiC8/s320/IMG_0447.JPG" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Punting tour during CG 2009&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Both sessions&amp;nbsp;only require you to bring your own laptop (or a friend with one) and a JVM with SDK (1.5 or higher).&lt;br /&gt;&lt;br /&gt;I'm looking forward to see you next week in nice Cambridge. Hopefully we will have great weather so we can go punting and / or enjoy the evenings otherwise in this beautiful town. Apart from the great program the evenings are usually the best thing at most conferences and this is supposed to be especially true if you are in Cambridge in May. Well at least if the weather is as nice as as it was in 2009 when I took the picture on the right hand side.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-4332465734968018973?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/4332465734968018973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=4332465734968018973&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4332465734968018973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4332465734968018973'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/05/code-generation-2011.html' title='Code Generation 2011'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-3f3mm5uS5Rg/Tc-4dUlPCZI/AAAAAAAAARc/CjThhqiyiC8/s72-c/IMG_0447.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-2978604122147887301</id><published>2011-04-18T15:30:00.000+01:00</published><updated>2011-04-18T15:30:34.250+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend 2'/><title type='text'>Eclipse Xtend - beta available</title><content type='html'>I proudly announce that a beta release of the upcoming Xtend language is available for download now. Xtend is a modern statically-typed programming language which&amp;nbsp;tightly integrates with and runs on the Java Virtual Machine. It has its roots in the Java programming&amp;nbsp;language but improves on a couple of concepts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Advanced Type Inference&lt;/b&gt; - You rarely need to write down type signatures&lt;/li&gt;&lt;li&gt;&lt;b&gt;Full support for Java Generics&lt;/b&gt; - Including all conformance and conversion rules&lt;/li&gt;&lt;li&gt;&lt;b&gt;Closures&lt;/b&gt; - concise syntax for anonymous function literals&lt;/li&gt;&lt;li&gt;&lt;b&gt;Injected extension methods&lt;/b&gt;&amp;nbsp;- Enhance closed types with new functionality injected via JSR-330&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;b&gt;Multiple dispatch&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;aka polymorphic method invocation&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;/span&gt;Operator overloading&lt;/b&gt; - make your libraries even more expressive&lt;/li&gt;&lt;li&gt;&lt;b&gt;Powerful switch expression&lt;/b&gt; - type based switching with implicit casts&lt;/li&gt;&lt;li&gt;&lt;b&gt;No statements&lt;/b&gt; - Everything is an expression&lt;/li&gt;&lt;li&gt;&lt;b&gt;Template syntax&lt;/b&gt; with intelligent &lt;b&gt;whitespace handling&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Translates to Java&lt;/b&gt; not bytecode - understand what's going on and use your code for platforms such as Android or GWT&lt;/li&gt;&lt;/ul&gt;It is not aiming at replacing Java but meant to be a better fit for implementing&amp;nbsp;dependency-injected&amp;nbsp;components and is especially well suited for doing code generation. Its library is just a&amp;nbsp;thin layer over the Java Development Kit (JDK) and it interacts with Java exactly the same as it interacts with Xtend code. Also Java can call Xtend functions in a&amp;nbsp;completely transparent way. And as it is implemented with Xtext, a modern Eclipse-based IDE closely integrated with the Java Development Tools (JDT) is available.&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-UlOa15ntDNg/Taw8F88rvjI/AAAAAAAAARI/OSn2DvfNivY/s1600/Xtend_and_Java.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="165" src="http://2.bp.blogspot.com/-UlOa15ntDNg/Taw8F88rvjI/AAAAAAAAARI/OSn2DvfNivY/s400/Xtend_and_Java.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Xtend and Java vis-a-vis&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Downloads&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;There are prepackaged Eclipse distributions available for download. They are shipped with the latest stable build and the nightly update sites are registered. So &lt;b&gt;make sure you do "Help -&amp;gt; Check For Updates" on a regular basis to get the latest improvements.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here are the download links :&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img alt="[   ]" src="http://download.itemis.com/icons/compressed.gif" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://download.itemis.com/distros/eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-linux-gtk-x86_64.tar.gz"&gt;eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-linux-gtk-x86_64.tar.gz&lt;/a&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img alt="[   ]" src="http://download.itemis.com/icons/compressed.gif" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://download.itemis.com/distros/eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-linux-gtk.tar.gz"&gt;eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-linux-gtk.tar.gz&lt;/a&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img alt="[   ]" src="http://download.itemis.com/icons/compressed.gif" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://download.itemis.com/distros/eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-macosx-cocoa-x86_64.tar.gz"&gt;eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-macosx-cocoa-x86_64.tar.gz&lt;/a&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img alt="[   ]" src="http://download.itemis.com/icons/compressed.gif" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://download.itemis.com/distros/eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-macosx-cocoa.tar.gz"&gt;eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-macosx-cocoa.tar.gz&lt;/a&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img alt="[   ]" src="http://download.itemis.com/icons/compressed.gif" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://download.itemis.com/distros/eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-win32-x86_64.zip"&gt;eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-win32-x86_64.zip&lt;/a&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img alt="[   ]" src="http://download.itemis.com/icons/compressed.gif" /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://download.itemis.com/distros/eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-win32.zip"&gt;eclipse-SDK-3.7M6-Xtext-2-nightly-HEAD-win32.zip&lt;/a&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td align="right"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;Getting Started&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Xtend is shipped with a reference documentation which can be accessed through Eclipse's Help system.&lt;br /&gt;Use the menu action [Help -&amp;gt; Help Contents] and you will find it.&lt;br /&gt;&lt;br /&gt;Next up you might want to start playing around. The easiest thing to do is to materialize the Xtend tutorial project, which explains all the concepts by example. To do so use the project wizard and choose [File -&amp;gt; New... -&amp;gt; Example ...] and choose [Xtext Examples / Xtend tutorial].&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="351" src="http://player.vimeo.com/video/22556622?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=DBD7EF" width="468"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Getting Feedback&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;It is important for us to get as much feedback as possible. Please use the &lt;a href="http://www.eclipse.org/forums/index.php?t=thread&amp;amp;frm_id=27&amp;amp;"&gt;Xtext Forum / Newsgroup&lt;/a&gt; to ask questions and &lt;a href="http://bugs.eclipse.org/"&gt;bugs.eclipse.org&lt;/a&gt; to file bugzillas (product : TMF / component : Xtext).&lt;br /&gt;&lt;br /&gt;The official release will be June 22nd. The language and its library is mostly finished and will only slightly be changed until then.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Acknowledgement&lt;/b&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-3oWb0zdyTjg/TaxBlmDS7LI/AAAAAAAAARM/CdWh468i9v0/s1600/756px_bmbf_logo.svg.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="103" src="http://3.bp.blogspot.com/-3oWb0zdyTjg/TaxBlmDS7LI/AAAAAAAAARM/CdWh468i9v0/s200/756px_bmbf_logo.svg.png" width="200" /&gt;&lt;/a&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;The language has been designed and implemented based on Xtext 2.0 and more important together with my friends and colleagues &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; and &lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt; (Unfortunately &lt;a href="http://twitter.com/#!/docfx"&gt;Moritz&lt;/a&gt; was busy with Xtext's serializer :-)). &amp;nbsp;Our work is funded by &lt;a href="http://www.itemis.com/"&gt;itemis&lt;/a&gt; and the Federal Ministry of Education and Research.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-2978604122147887301?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/2978604122147887301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=2978604122147887301&amp;isPopup=true' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2978604122147887301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2978604122147887301'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/04/eclipse-xtend-beta-available.html' title='Eclipse Xtend - beta available'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-UlOa15ntDNg/Taw8F88rvjI/AAAAAAAAARI/OSn2DvfNivY/s72-c/Xtend_and_Java.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-4730986768274766013</id><published>2011-04-15T13:36:00.006+01:00</published><updated>2011-11-10T08:57:39.498+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='language design'/><title type='text'>Dear Java killers,</title><content type='html'>I love to see all the languages for the JVM popping up on almost a daily basis. Language design is big fun and it's the ultimate thing for a developer to write programs in a language you've built your own. :-)&lt;br /&gt;&lt;br /&gt;I especially like the languages which try out new ideas and don't take themselves too seriously, because thinking out of the box is the best you can do in order to push things forward.&lt;br /&gt;&lt;br /&gt;However there are also a couple of languages who try hard to attract a certain audience:&amp;nbsp;&lt;b&gt;The Java community.&amp;nbsp;&lt;/b&gt;The number of Java developers out there is huge (&lt;a href="http://www.numberof.net/number-of-java-developers/"&gt;it had been about 9 million two years ago&lt;/a&gt;) so if you could make only a part of this crowd love and use your language it would be a huge &amp;nbsp;success.&lt;br /&gt;Languages like Groovy, Scala, Clojure,&amp;nbsp;Gosu, Fantom,&amp;nbsp;or lately (but not yet existent) Ceylon and Kotlin more or less try to attract this group. Actually I shouldn't really count Clojure in, because it is so different (I like it though). But all the other languages seem to try to be a better Java for Java developers.&lt;br /&gt;&lt;br /&gt;Here are my seven most important Dos and Don'ts you should consider when developing a language for the Java community:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1) Don't make unimportant changes&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;People are reluctant to change. You should leverage existing knowledge where possible. Changing keywords because you think they sound better might be good for your ego but not for the acceptance of your language. Most languages fall into this trap somehow. The best example is the recently announced Ceylon, which renames all kinds of Java keywords with little reason. For instance the keywords extends and implements are different. In an interview &lt;a href="http://www.infoq.com/news/2011/04/ceylon"&gt;on InfoQ Gavin King explains why he made that decision&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;"Java is irregular here. In a class definition, the list of one or more interfaces follows the keyword "implements". In an interface the list of one or more interfaces follows the keyword "extends", which by coincidence may also appear in a class definition where it means something completely different (it is followed by a single class). Ceylon is regular. Lists of types always follow "satisfies". The keyword "extends" is always followed by an expression that instantiates the superclass."&lt;/i&gt;&lt;/blockquote&gt;Given that over nine million people are used to it and absolutely understand the semantics, I'd consider this an unfortunate decision.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2) Static Typing&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;The Java folks are used to top-notch tooling based on static type information. I don't think that errors found by static typing are actually that important, but the tooling you can build on top of this information is. And again it is a matter of the audience you are trying to attract. I wouldn't try to come up with a new statically-typed Ruby, since that doesn't make much sense. I know Mirah and it's not bad. My point is that the Ruby community is not interested in static typing.&lt;br /&gt;Static typing is an important part of the Java culture and the problems it causes can be reduced (see my other advices). Besides that Groovy generally looks a bit overgrown, I'd say the lack of static typing has been a problem for the success of Groovy. Obviously the Groovy folks have understood that and try to fix it with Groovy++.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3) Don't touch generics&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Static type systems are complicated. I don't think that more than 1% of all Java developers have really understood generics. All this co- and contra variance, wildcards, raw types, upper and lower bounds and the involved conversion rules are super complicated.&lt;br /&gt;However If asked most Java developers think they know generics and feel quite comfortable with it.&lt;br /&gt;I'm glad that languages like Scala do important work in this area by trying different approaches and having more sophisticated type systems. That's important for the industry but it scares off and there are nine million people out there who feel comfortable with an existing, quite sound type system (aside from very few practically irrelevant problems).&lt;br /&gt;&lt;br /&gt;After all generics in Java are rather sound, it's just that the problem they solve is essentially complex.&lt;br /&gt;&lt;br /&gt;Also note that reified generics are a bad idea. Type arguments are static type information. They are lying at runtime and the situations where they are helpful are rare. This also breaks interoperability with other JVM languages btw.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4) Use Type Inference&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The biggest problem with static typing and generics is that people think that this is the reason why Java code is so cluttered with redundant type signatures. That's not true! It is just a language design decision that one has to be very explicit (or ceremonial) about everything he/she writes down.&lt;br /&gt;&lt;br /&gt;A modern statically-typed language should make heavy use of type inference. That is in most situations you give the developer the choice whether to put a type signature or not. Code needs to be concise and readable.&lt;br /&gt;&lt;br /&gt;Ceremonial languages like Java don't esteem their users, they think they are stupid and therefore force them to do all kinds of repetitive things. I'm glad the way language or library users are treated has changed in recent years such that developers are given more responsibility for what they do. Only then you can expect quality. The ceremonial style is the biggest problem with Java which urgently needs to be fixed.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5) Care about Tool Support (IDE)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Your language won't be successful within the Java community if it lacks decent tool support. Scala ignored this for quite some time and are now trying to catch up a bit.&lt;br /&gt;My advice is to start working on the IDE while designing the language, because the IDE is an important part of the overall user experience people have with your language. Many syntactical decisions can have a great influence on how the tooling works. A simple example:&lt;br /&gt;&lt;br /&gt;In Java when declaring a local variable, Eclipse first proposes you with a type and then afterwards with a name proposal using the simple name of the field's type :&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-C-rgOotSwZA/TagadmIis6I/AAAAAAAAARE/UZVBOunHaxs/s1600/Screen+shot+2011-04-15+at+12.13.44+PM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-C-rgOotSwZA/TagadmIis6I/AAAAAAAAARE/UZVBOunHaxs/s1600/Screen+shot+2011-04-15+at+12.13.44+PM.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Name proposals in Eclipse&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;This is simply not possible if you switch the order of type and name like in Scala ( name : Type ), because you first have to type the name.&lt;br /&gt;&lt;br /&gt;This is just a simple example, there are other problems hiding in the complexity of a language implementation. Make sure you have an experienced IDE developer in your team and care about the holistic user experience of your language. For Java folks the IDE is an important part of it.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6) Closures&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There is no way your language can be successful without closures. Besides the ceremonial verbosity and inflexible syntax of Java the lack of closures is where Java suffers most. &lt;br /&gt;Also for closures type inference and a concise syntax are essential.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7) Get rid of old unused concepts&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Removing unnecessary concepts is also a good idea. Java was designed for the C/C++ crowd and was meant to be used in embedded devices and the web. It turned out that it is used quite differently today and most Java developers really don't care about bit shifting, break and continue statements and fall-through switches anymore. Remove them!&lt;br /&gt;&lt;br /&gt;APPENDIX&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A personal note to the Gavin Kings in this world:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.xtext.org/"&gt;Eclipse Xtext&lt;/a&gt; is a language development framework, which not only helps implementing parsers, linkers, compilers and interpreters but also a top-notch Eclipse IDE. You should use it for any kind of language development, because it boosts your productivity and is fun to use.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;A general note on Xtext:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Of course there is no mass-market for programming languages. Although Xtext handles them quite well and is used for commercial programming language IDEs, the main focus is to allow people to easily define small, focussed domain-specific languages. The good news is that we have developed a concise, statically typed Java like expression language library supporting everything I mentioned before. &lt;b&gt;And *you* can easily embed it into your DSL! See what you can do with it:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;iframe allowfullscreen="" frameborder="0" height="270" src="http://player.vimeo.com/video/31423880?title=0&amp;amp;byline=0&amp;amp;portrait=0" webkitallowfullscreen="" width="480"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-4730986768274766013?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/4730986768274766013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=4730986768274766013&amp;isPopup=true' title='34 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4730986768274766013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4730986768274766013'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/04/dear-java-killers.html' title='Dear Java killers,'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-C-rgOotSwZA/TagadmIis6I/AAAAAAAAARE/UZVBOunHaxs/s72-c/Screen+shot+2011-04-15+at+12.13.44+PM.png' height='72' width='72'/><thr:total>34</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3865188802684308222</id><published>2011-04-04T18:14:00.001+01:00</published><updated>2011-04-04T18:17:19.760+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nordic coding'/><category scheme='http://www.blogger.com/atom/ns#' term='OSGi'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Nordic Coding with OSGi, Xtext and Git (April 15th)</title><content type='html'>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://de.academic.ru/pictures/dewiki/75/KielerStadtzentrumLuftaufnahme.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="http://de.academic.ru/pictures/dewiki/75/KielerStadtzentrumLuftaufnahme.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Kiel&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;In two weeks on April 15th we are having &lt;a href="http://goo.gl/JpySZ"&gt;the next Nordic Coding event in Kiel&lt;/a&gt;&amp;nbsp;(link is german). There will be three talks each 40 mins.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First &lt;a href="http://www.martinlippert.com/"&gt;Martin Lippert&lt;/a&gt; explains the core principals behind &lt;a href="http://www.osgi.org/Main/HomePage"&gt;OSGi&lt;/a&gt; before he shares some entertaining real-life experiences he had with OSGi.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Next &lt;a href="http://koehnlein.blogspot.com/"&gt;Jan Köhnlein&lt;/a&gt; tells us about and demos &lt;a href="http://www.xtext.org/"&gt;Xtext&lt;/a&gt; 2.0. Sorry for the self advertisement but we did some very exciting stuff during the last months and just *have* to show it. :-)&lt;/li&gt;&lt;li&gt;The last talk is given by &lt;a href="http://www.ralfebert.de/"&gt;Ralf Ebert&lt;/a&gt;, who taught me to use and love &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;. Git is absolute fantastic and Ralf is a very good teacher.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;The event is again for free (incl. soft drinks and food), but you have to register in advance:&amp;nbsp;To do so just send an e-mail to &lt;a href="mailto:mail@diwish.de"&gt;mail@diwish.de&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3865188802684308222?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3865188802684308222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3865188802684308222&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3865188802684308222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3865188802684308222'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/04/nordic-coding-with-osgi-xtext-and-git.html' title='Nordic Coding with OSGi, Xtext and Git (April 15th)'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-265505196500705316</id><published>2011-03-21T23:22:00.000+01:00</published><updated>2011-03-21T23:22:59.530+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipsecon'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend 2'/><title type='text'>A rough performance comparison between Xpand and Xtend 2</title><content type='html'>&lt;a href="http://blog.efftinge.de/2010/12/xtend-2-successor-to-xpand.html"&gt;Xtend 2&lt;/a&gt; is still in an early state. It works quite well, but there are still some issues and we haven't even started measuring and improving performance yet. Although I was pretty sure that Xtend 2 would easily outperform Xpand, I was curious how much.&lt;br /&gt;&lt;br /&gt;Today, I wrote a small code generator (the traditional domain model to Java Beans stuff) in Xpand and Xtend 2 and compared the execution time with different numbers of model elements, just to get a first impression.&lt;br /&gt;&lt;i&gt;Disclaimer: Doing benchmarks is hard and I don't claim that do a fair comparison here, although I tried.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-wSlp8ERjaHA/TYfMOVvVcbI/AAAAAAAAAQ0/16lUgoDnEuE/s1600/Screen+shot+2011-03-21+at+3.07.05+PM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="225" src="https://lh6.googleusercontent.com/-wSlp8ERjaHA/TYfMOVvVcbI/AAAAAAAAAQ0/16lUgoDnEuE/s400/Screen+shot+2011-03-21+at+3.07.05+PM.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The Xpand version&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-5u3CAtkHOL0/TYfMk9TT96I/AAAAAAAAAQ8/-6QHXnDbkU4/s1600/Screen+shot+2011-03-21+at+3.09.01+PM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="225" src="https://lh6.googleusercontent.com/-5u3CAtkHOL0/TYfMk9TT96I/AAAAAAAAAQ8/-6QHXnDbkU4/s400/Screen+shot+2011-03-21+at+3.09.01+PM.png" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The Xtend 2 version&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Generating files for 1000 entities (1 file each) containing 20 properties and 5 operations each took (on average exec. the generator 10 times) :&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Xtend 2 : 663 ms&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Xpand : 4254 ms&lt;/div&gt;&lt;br /&gt;If I remove the actual file writing and only do the in memory string concatenation the result was  (again on average exec. the generator 10 times) :&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Xtend 2 : 247 ms&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;Xpand : 3302 ms&lt;/div&gt;&lt;br /&gt;So it seems as if the computation and string concatenation in Xtend2 is roughly 10 times as fast as in Xpand. As we haven't yet profiled Xtend 2, there should be room for improvements. &lt;br /&gt;&lt;br /&gt;On a side note, I have also implemented &lt;a href="http://stronglytypedblog.blogspot.com/2009/07/java-vs-scala-vs-groovy-performance.html"&gt;the quicksort benchmark you can find here&lt;/a&gt; with Xtend 2, and found that the Java version was only twice as fast as Xtend. Compared to Groovy which was 20 times slower than Java it's quite good. It is mostly slower than Java, because we do a lot of conversion between ints and Integer (auto boxing) when using operators, so some special treatment in this area should make that even faster. Anyway, sorting int arrays is not the main focus of Xtend ;-).&lt;br /&gt;&lt;br /&gt;If you are doing code generation or are interested in it and you are visiting &lt;a href="http://www.eclipsecon.org/2011/"&gt;EclipseCon&lt;/a&gt;, you should definitely come to our &lt;a href="http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2053"&gt;tutorial on Thursday&lt;/a&gt;. There is &lt;a href="http://blog.efftinge.de/2011/03/xtend-screencast-part-1-basics.html"&gt;much&lt;/a&gt; &lt;a href="http://blog.efftinge.de/2011/03/xtend-screencast-part-2-switch.html"&gt;more&lt;/a&gt; &lt;a href="http://blog.efftinge.de/2011/03/xtend-screencast-part-3-rich-strings-ie.html"&gt;to Xtend 2&lt;/a&gt; than just the improved execution performance.&lt;br /&gt;And don't be afraid about missing the lunch, attendees get served a delicious, warm, and freshly prepared lunch after the tutorial :-).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-265505196500705316?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/265505196500705316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=265505196500705316&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/265505196500705316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/265505196500705316'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/03/rough-performance-comparison-between.html' title='A rough performance comparison between Xpand and Xtend 2'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh6.googleusercontent.com/-wSlp8ERjaHA/TYfMOVvVcbI/AAAAAAAAAQ0/16lUgoDnEuE/s72-c/Screen+shot+2011-03-21+at+3.07.05+PM.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-6533150616064411390</id><published>2011-03-21T02:45:00.001+01:00</published><updated>2011-03-29T05:06:51.140+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipsecon'/><category scheme='http://www.blogger.com/atom/ns#' term='Guice'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='guicecon'/><title type='text'>A Guice Modules DSL</title><content type='html'>&lt;i&gt;[Update] The code is available &lt;/i&gt;&lt;a href="https://github.com/svenefftinge/Guice-Modules-DSL"&gt;&lt;i&gt;at github&lt;/i&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yesterday &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; and I were attending GuiceCon. A nice little get-together with the &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt; developers and some very smart Guice users. As Guice is key in &lt;a href="http://www.xtext.org/"&gt;Xtext&lt;/a&gt;'s architecture we took the opportunity to show the people what we do with it. The first idea was to just explain how we use Guice, but while we travelled across California last week a better idea came up :&amp;nbsp;We could develop a Guice Modules DSL using Xtext.&lt;br /&gt;&lt;br /&gt;So we did and we did it from scratch right in front of the audience without any tricks or shortcuts. The good thing was that everyone in the room knew the domain very well, so we didn't need to explain anything about the domain of the language.&lt;br /&gt;First I defined the grammar and a first shot on the code generator and then Sebastian added type conformance checks and improved content assist. Today I've spent another two hours on it. The screencast below demos the status quo.&lt;br /&gt;&lt;br /&gt;Note that there will be an &lt;a href="http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2053"&gt;extended tutorial at EclipseCon&lt;/a&gt; this Thursday, where you can learn how to create such things yourself in no time. Not to forget the short talk on &lt;a href="http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2034"&gt;"What's new in Xtext 2.0"&lt;/a&gt;, Tuesday 2 pm.&lt;br /&gt;&lt;br /&gt;Have fun!&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="263" src="http://player.vimeo.com/video/21277569?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=DBD7EF" width="468"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-6533150616064411390?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/6533150616064411390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=6533150616064411390&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6533150616064411390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6533150616064411390'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/03/guice-modules-dsl.html' title='A Guice Modules DSL'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7746493637870271132</id><published>2011-03-07T10:06:00.001+01:00</published><updated>2011-03-07T17:07:22.739+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipsecon'/><category scheme='http://www.blogger.com/atom/ns#' term='xbase'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend 2'/><title type='text'>Xtend Screencast Part 3 - Rich Strings (i.e. Codegeneration)</title><content type='html'>&lt;a href="http://blog.efftinge.de/2010/12/xtend-2-successor-to-xpand.html"&gt;Xtend&lt;/a&gt; is a programming language with special support for code generation and traversing typed object graphs (like EMF models). It is developed with &lt;a href="http://www.xtext.org/"&gt;Xtext&lt;/a&gt; 2.0. So the question is what is so special about code generation, that we need special support in a language? Well it's mostly string concatenation, and the most readable way of doing string concatenation is using a template syntax.&lt;br /&gt;&lt;br /&gt;Today's screencast covers rich string expressions. It resembles the basic template syntax known from Xpand but in Xtend they are expressions, so you can use them everywhere a normal expression is expected. The new and unique aspect about&amp;nbsp;Rich Strings is their intelligent whitespace handling system, including nice tool support. See it yourself:&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="263" src="http://player.vimeo.com/video/20734786?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=DBD7EF" width="468"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;You can get your hands on this at &lt;a href="http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2053"&gt;EclipseCon&lt;/a&gt; in just two weeks and/or at &lt;a href="http://jax.de/2011/sessions/?tid=1879"&gt;JAX&lt;/a&gt; in two months.&lt;br /&gt;The final release of Xtext 2 and the new Xtend language is June 22nd (Eclipse Indigo).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7746493637870271132?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7746493637870271132/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7746493637870271132&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7746493637870271132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7746493637870271132'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/03/xtend-screencast-part-3-rich-strings-ie.html' title='Xtend Screencast Part 3 - Rich Strings (i.e. Codegeneration)'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-316008739352832092</id><published>2011-03-04T09:17:00.000+01:00</published><updated>2011-03-04T09:17:23.460+01:00</updated><title type='text'>Xtend Screencast Part 2 - Switch Expression</title><content type='html'>In this part I show and explain the switch expression, which is defined in &lt;a href="http://blog.efftinge.de/2010/09/xbase-new-programming-language.html"&gt;Xbase&lt;/a&gt;, so you can also have that in you &lt;a href="http://www.xtext.org/"&gt;Xtext&lt;/a&gt; DSL if you want :-)&lt;br /&gt;In &lt;a href="http://www.eclipsecon.org/2011/sessions/?page=sessions&amp;amp;id=2053"&gt;the tutorial at EclipseCon on Thursday&lt;/a&gt; we will show how to embed Xbase expressions in a simple DSL.&lt;br /&gt;&lt;br /&gt;Here again I use &lt;a href="http://blog.efftinge.de/2010/12/xtend-2-successor-to-xpand.html"&gt;Xtend&lt;/a&gt; for the demo:&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="263" src="http://player.vimeo.com/video/20635904?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=DBD7EF" width="468"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-316008739352832092?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/316008739352832092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=316008739352832092&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/316008739352832092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/316008739352832092'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/03/xtend-screencast-part-2-switch.html' title='Xtend Screencast Part 2 - Switch Expression'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-98523585274988880</id><published>2011-03-02T00:04:00.000+01:00</published><updated>2011-03-02T00:04:01.492+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtend Screencast Part 1 - Basics</title><content type='html'>Only three weeks till EclipseCon!&lt;br /&gt;I can't tell how excited I am. &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; and I are going to Los Angeles in just two weeks in order to travel up the Highway 1 to EclipseCon for one week. I know the weather will be great :-)&lt;br /&gt;At EclipseCon we finally can show people what we have been working on the last two months and what kind magic can be done with Xtext 2.0 in such a short time frame.&lt;br /&gt;&lt;br /&gt;In the meantime we (&lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt;, &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; and I) want to help you get into a similar mood :-). &amp;nbsp;Sebastian already blogged about it and &lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt; will definitely do so very soon. I decided to record a series of screen cast.&lt;br /&gt;The screen casts are not edited at all, because I thought it would be more authentic and trustworthy that way.&lt;br /&gt;&lt;br /&gt;The first screen cast covers the basic concepts. I hope you like it:&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="263" src="http://player.vimeo.com/video/20535484?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=DBD7EF" width="468"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Georgia, serif; font-size: x-small; line-height: 20px;"&gt;[1] The Xbase development is sponsored by itemis and the Federal Ministry of Education and Research.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-98523585274988880?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/98523585274988880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=98523585274988880&amp;isPopup=true' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/98523585274988880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/98523585274988880'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2011/03/xtend-screencast-part-1-basics.html' title='Xtend Screencast Part 1 - Basics'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-6019832139239162856</id><published>2010-12-13T09:53:00.000+01:00</published><updated>2010-12-13T09:53:34.703+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xbase'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>REPL for Xbase</title><content type='html'>&lt;a href="http://sebastianbenz.posterous.com/introducing-an-interactive-programming-enviro"&gt;Sebastian Benz blogged about a &lt;span id="goog_246571731"&gt;&lt;/span&gt;REPL (Read-Eval-Print loop)&lt;span id="goog_246571732"&gt;&lt;/span&gt; he implemented for Xbase.&amp;nbsp;&lt;/a&gt;&lt;br /&gt;He also wrote a very good introduction to explain what Xbase is and why it is such an important addition to the Xtext framework.&lt;br /&gt;&lt;br /&gt;His blog isn't yet included in Eclipse Planet, so I wanted to makes sure that you won't miss it.&lt;br /&gt;I think the REPL is a great way to explore the power of a language. Maybe we should use it in the &lt;a href="http://www.blogger.com/goog_246571739"&gt;proposed&amp;nbsp;&lt;/a&gt;&lt;a href="https://www.eclipsecon.org/submissions/2011/view_talk.php?id=2053"&gt;EclipseCon tutorial&lt;/a&gt; if it's getting accepted. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-6019832139239162856?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/6019832139239162856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=6019832139239162856&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6019832139239162856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6019832139239162856'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/12/repl-for-xbase.html' title='REPL for Xbase'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-8821389501090964479</id><published>2010-12-03T15:41:00.000+01:00</published><updated>2010-12-03T15:41:30.233+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipsecon'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='xtend 2'/><title type='text'>Xtend 2 - the Successor to Xpand</title><content type='html'>&lt;a href="http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.xpand.doc/help/core_reference.html"&gt;M2T Xpand&lt;/a&gt; is one of the widest used template languages for code generation. It is statically typed, supports polymorphic dispatching of template definitions and provides a very convenient way to navigate through models. The navigation convenience mostly comes from the built-in higher order functions for collection types, the possibility to have extension functions using &lt;a href="http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.xpand.doc/help/Xtend_language.html"&gt;Xtend&lt;/a&gt; and some syntactic sugar for common expressions.&lt;br /&gt;Also Xpand is known to provide a very open architecture. There are several hooks in the interpreter to integrate profilers, pretty printers or whatever comes to mind.&amp;nbsp;That's all very nice and has led to quite some success.&lt;br /&gt;&lt;br /&gt;But there are also some issues with Xpand and Xtend&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;(Just in case you don't know I am not blaming other people's work, because I'm the author of Xpand, &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;Xtend and Check)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Performance -&amp;nbsp;Xpand and its siblings are interpreted and the interpreter was written without much performance considerations, i.e. is slow.&lt;/li&gt;&lt;li&gt;Tooling -&amp;nbsp;The tooling is hand-made with JFace and Co, the code is old, not well tested and unfortunately a bit buggy.&amp;nbsp;&lt;/li&gt;&lt;li&gt;Ugly conceptual short cuts - built-in higher order functions instead of closures, built-in collection types instead of generics, and a couple of other unsound semantics which pop up occasionally and bite the user frequently.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Xtend 2&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The reason I started work on &lt;a href="http://www.xtext.org/"&gt;Xtext&lt;/a&gt; in the first place was, because it had been so painful to write the IDE support for Xpand, Xtend and Check. I thought that there must be some higher abstraction to derive functionality like syntax coloring, content assist, outline views, etc. from a language description. So I wrote the first prototype of Xtext in 2006 and luckily found some&amp;nbsp;&lt;a href="http://3.bp.blogspot.com/_Ii_da0jTxAY/S64kPlcwsVI/AAAAAAAAAOU/Mj2KG3F0pkE/s1600/4457875296_55ac9e2905.jpg"&gt;friends&lt;/a&gt; and a &lt;a href="http://www.itemis.com/"&gt;sponsor&lt;/a&gt; to create what was chosen to be the &lt;a href="http://www.infoq.com/news/2010/03/eclipse-awards"&gt;most innovative project&lt;/a&gt; at Eclipse this year.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today Xtext is ready to be the basis for a rewritten version of Xpand. We call it &lt;b&gt;Xtend 2&lt;/b&gt; as it is more like a successor to Xtend which allows to have Xpand's template syntax as an expression. After having designed Xpand and Xtend and having seen so many different applications of it with different requirements and problems to solve, we know what features are helpful and which are problematic. Also during the last years with Xtext I have learned so much about language and IDE design and so did my team. All the languages we built for customers and all the languages we saw people developing with Xtext have helped to get a good feeling of what is good language design and what is not.&amp;nbsp;We are now in a promising position to design a very, very nice language.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And indeed we are all thrilled about the concepts we put together so far. I'm writing up the language specification these days and will post it as soon as it is more consumable state. Today I wanted to share my excitement and give you an idea of what it is going to look like.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;What are the main differences?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Based on Xbase&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Xtend 2 is of course using the expressions defined in &lt;a href="http://blog.efftinge.de/2010/09/xbase-new-programming-language.html"&gt;Xbase&lt;/a&gt;. That basically means it is tightly integrated with Java, has closures, full generics and a couple of very neat features like operator overloading or the super cool switch statement.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Compiles to Java&lt;/span&gt;&lt;br /&gt;Xtend2 files are directly compiled to Java classes. In fact they are compiled to Java source code, which means that you can read (and debug) what the compiler makes out of your Xtend 2 coding. We will put much effort in making the generated code very readable and performant at the same time.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Contains successful features from Xpand and Xtend...&lt;/span&gt;&lt;br /&gt;The cool stuff from Xpand and Xtend will be there such as polymorphic dispatch, extension methods or the template syntax.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;... but they are even better now&lt;/span&gt;&lt;br /&gt;For instance extension methods can be any static Java function and more important any methods from injected objects. This basically allows you to exchange the implementation of any extension methods only by changing the DI configuration. This in turn replaces the whole AOP story we have in Xpand and Xtend.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;"Simplicity is the Ultimate Sophistication"&lt;/span&gt;&lt;br /&gt;You'll see a lot of other small improvements, but the coolness of the language doesn't come from the amount of features but from the short and carefully chosen list of concepts working consistenly together. It is the overall composition of concepts and the holistic experience (tooling, etc.) which gives a language its "feel".&amp;nbsp;And although&amp;nbsp;I don't have the language in my hands right now, it already feels fantastic. :-)&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;We want to show this at EclipseCon&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is a submission for a &lt;a href="https://www.eclipsecon.org/submissions/2011/view_talk.php?id=2053"&gt;tutorial on Xtend 2&lt;/a&gt; we submitted for EclipseCon 2011. My favorite conference at my favorite location. It is extremely important to us to be able to share with you guys what we have been working on for the last months (actually years if you count the development of Xtext in).&lt;br /&gt;&lt;a href="http://aniszczyk.org/2010/12/01/eclipsecon-2011-late-submission-policy/"&gt;Chris asked people to use the comment system&lt;/a&gt; to provide feedback, in order to help the committee composing a great program.&amp;nbsp;So please, if you are interested in attending a hands on tutorial for Xtend 2 at EclipseCon 2011,&amp;nbsp;&lt;a href="https://www.eclipsecon.org/submissions/2011/view_talk.php?id=2053"&gt;tell them&lt;/a&gt;. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-8821389501090964479?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/8821389501090964479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=8821389501090964479&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8821389501090964479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8821389501090964479'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/12/xtend-2-successor-to-xpand.html' title='Xtend 2 - the Successor to Xpand'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1303463886571536738</id><published>2010-12-03T11:23:00.000+01:00</published><updated>2010-12-03T11:23:23.313+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nordic coding'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='kiel'/><title type='text'>*Extreme* Nordic Coding</title><content type='html'>Yesterday the first &lt;a href="http://blog.efftinge.de/2010/11/nordic-coding.html"&gt;Nordic Coding&lt;/a&gt; mini conference took place in my hometown Kiel. In the beginning I was a bit skeptical whether it was possible to motivate enough people to come to such a code-centric and Java-centric event. Kiel is quite small and I wasn't sure if the local IT industry was big enough. But after we got 100 registrations in advance there was only the snow to spoil the party.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_Ii_da0jTxAY/TPi_py3TmdI/AAAAAAAAAQk/6cn956KqFY0/s1600/IMG_0578.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="297" src="http://2.bp.blogspot.com/_Ii_da0jTxAY/TPi_py3TmdI/AAAAAAAAAQk/6cn956KqFY0/s400/IMG_0578.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Yesterday we've had the total snow chaos in Kiel and a lot of people couldn't even manage to get to work or school or elsewhere. So I was a bit afraid that nobody was going to come to the first Nordic Coding event. But I was wrong and eventually more than half of the registered people made it to the event.&lt;br /&gt;&lt;br /&gt;The first presentation was held by &lt;a href="http://www.jgoodies.com/"&gt;Karsten Lentzsch&lt;/a&gt; of JGoodies fame. He lives in Kiel and shared some very enlightening and entertaining stories about his experience with customers and how they tackle UI-programming. He is no doubt an absolute expert in that field and also a great presenter.&lt;br /&gt;&lt;br /&gt;After that &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian Zarnekow&lt;/a&gt; and I talked about how we push Java to its limits in order to make code more readable and expressive. It was fun giving the talk as both Sebastian and I really love programming and could put a lot of passion into that topic.&lt;br /&gt;&lt;br /&gt;Afterwards we had some interesting conversations and delicious finger food. Thanks to &lt;a href="http://www.diwish.de/"&gt;DiWiSH&lt;/a&gt; for sponsoring and organizing the event with us.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_Ii_da0jTxAY/TPjBqw3f0HI/AAAAAAAAAQo/DCVuGKLoJCk/s1600/IMG_0573.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="298" src="http://4.bp.blogspot.com/_Ii_da0jTxAY/TPjBqw3f0HI/AAAAAAAAAQo/DCVuGKLoJCk/s400/IMG_0573.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;The feedback was great and I'm looking forward to the next event which will be in about four months. I asked everybody to submit proposals for presentations and already got three interesting responses.&amp;nbsp;It's my desire to have one presenter from Kiel minimum at each event.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;See you next time!&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1303463886571536738?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1303463886571536738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1303463886571536738&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1303463886571536738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1303463886571536738'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/12/extreme-nordic-coding.html' title='*Extreme* Nordic Coding'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ii_da0jTxAY/TPi_py3TmdI/AAAAAAAAAQk/6cn956KqFY0/s72-c/IMG_0578.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-4223227354453516949</id><published>2010-11-08T09:21:00.001+01:00</published><updated>2010-11-08T09:23:00.414+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nordic coding'/><title type='text'>Nordic Coding</title><content type='html'>On &lt;b&gt;December 2nd&lt;/b&gt; the first &lt;a href="http://www.diwish.de/index.php?id=termindetails&amp;amp;no_cache=1&amp;amp;view=single&amp;amp;event_id=455&amp;amp;cHash=d1bf17d0ce"&gt;nordic coding event&lt;/a&gt; is happening &lt;a href="http://maps.google.de/maps?q=54.32667,10.135848&amp;amp;num=1&amp;amp;t=h&amp;amp;sll=54.326785,10.136143&amp;amp;sspn=0.002475,0.006335&amp;amp;hl=de&amp;amp;ie=UTF8&amp;amp;ll=54.326635,10.135859&amp;amp;spn=0.002475,0.006335&amp;amp;z=18"&gt;in Kiel&lt;/a&gt;. It's a mini, mini conference (two to three presentations) around software development on the Java platform. It is planned to have such an event at least twice a year. For the first event we will have two presentations:&lt;br /&gt;&lt;br /&gt;1) &lt;b&gt;Karsten Lentzsch&lt;/b&gt; (&lt;a href="http://www.jgoodies.com/"&gt;JGoodies.com&lt;/a&gt;) will talk about UI-Design and why so many smart people regularly fail in writing good user interfaces. Karsten is known to be a great presenter and I am really looking forward to his talk.&lt;br /&gt;&lt;br /&gt;2) &lt;b&gt;Sebastian Zarnekow&lt;/b&gt; (&lt;a href="http://www.xtext.org/"&gt;Xtext&lt;/a&gt;/&lt;a href="http://www.itemis.de/"&gt;itemis&lt;/a&gt;) and me are talking about modern Java programming. We're going to cover how to use the more complex capabilities of the Java language such as reflection, annotations and generics to design readable and convenient Java APIs. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.diwish.de/"&gt;DiWiSH&lt;/a&gt; will serve free snacks and drinks and we surely will have a lot of interesting discussions and maybe a beer in the irish pub afterwards. The event is free of charge and I hope to see a lot of Kiel's (and Hamburg's and inbetween's) software developers there.&lt;br /&gt;&lt;br /&gt;You have to &lt;a href="mailto:mail@diwish.de"&gt;register in advance&lt;/a&gt;.&amp;nbsp;A printable announcement (in German) can be found &lt;a href="http://www.diwish.de/fileadmin/DiWiSH/Termine/Tagungsprogramm_Faxantwort.pdf"&gt;here&lt;/a&gt;.&lt;span id="goog_901859113"&gt;&lt;/span&gt;&lt;span id="goog_901859114"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-4223227354453516949?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/4223227354453516949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=4223227354453516949&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4223227354453516949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4223227354453516949'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/11/nordic-coding.html' title='Nordic Coding'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1935048324491889067</id><published>2010-09-30T09:47:00.015+01:00</published><updated>2010-09-30T15:44:06.456+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xbase'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xbase - A new programming language?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ii_da0jTxAY/TKRz9lL-yJI/AAAAAAAAAQE/aThi-Fq3-Yk/s1600/BMBF.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 154px;" src="http://3.bp.blogspot.com/_Ii_da0jTxAY/TKRz9lL-yJI/AAAAAAAAAQE/aThi-Fq3-Yk/s200/BMBF.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5522666544854648978" /&gt;&lt;/a&gt;&lt;br /&gt;No!&lt;br /&gt;&lt;p&gt;It's the basis for a plethora of new programming languages and domain-specific languages!&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;What is Xbase?&lt;/h2&gt;&lt;p&gt;Xbase is a partial programming language implemented in Xtext and is meant to be embedded and extended within other programming languages and domain-specific languages (DSL) written in Xtext.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Why Xbase?&lt;/h2&gt;Developing textual modeling languages (aka DSLs) has become incredibly easy with Xtext. Structural languages which introduce new coarse-grained concepts, such as services, entities, value objects or statemachines can be developed in minutes. However, software systems do not consist of structure only. At some point a system needs to do something, hence we want to specify some behavior which is usually done using so called expressions. Expressions are the heart of every programming language and are not so easy to get right. That is why most people do not add support for expressions in their DSL, but try to solve this differently.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;The most often used workaround is to only define the structural information in the DSL and add behavior in a second step by modifying or extending the generated code. It is not only unpleasant to write, read and maintain closely related information in two different places, on two different levels of abstraction and in two different languages, this also only works for compilers (i.e. code generators) but not for interpreters. (Additionally they are a lot of other reasons why mixing generated and hand written code is problematic, which is not the topic of this blog post.)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But still as of today this is the preferred solution since adding support for expressions (and a corresponding compiler) for your language is hard - even with Xtext.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Actually being able to call out to the host language is one big advantage internal DSLs have over external DSLs. With Xbase it will be possible to explicitly allow more complex programming at certain places within your DSL, while still have full control over the syntax and semantics of your language. And you neither have to reinvent the wheel by implementing a full-blown programming language nor do your language's users have a hard time to understand the expression language, since it is closely related to Java and well specified.&lt;br /&gt;&lt;p&gt;Also the more Xbase-based languages we see the more commonly known it will be.&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Main Decisions&lt;/h2&gt;We want Xbase to be expressive and convenient to use, but at the same time easy to understand and easy to adapt. Understanding not only means learning how to use it but also understanding the language infrastructure, i.e. the parser, compiler, type checkers, etc. Because people shall be able to reuse and adapt that stuff easily.&lt;br /&gt;&lt;p&gt;The main target audience for Xbase are Java developers. That is why an Xbase expression looks like a Java expression (or statement) at a first glance. This means the most commonly used Java statements and expressions (e.g. string literals, if statement, foreach loop, method invocation, constructor call) are also available as is in Xbase. On the other hand Java is a very complicated language, especially when it comes to the details. After all the spec counts over 600 pages and while it is very precise most of the text deals with exceptional conditions often involving the special handling of built-in types, etc.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Xbase shall be significantly simpler, so we have to make some decisions.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Runs on the JVM &lt;/h3&gt;&lt;p&gt;The JVM is a great, popular platform. In order to ship a compiler, interpreter as well as static typing, Xbase needs to bind to some target platform.&lt;br /&gt;Other platforms such as C/C++, ObjectiveC or JavaScript are also very interesting target platforms for Xtext languages, but for now the main focus of Xbase is the JVM. This seems to be natural decision, since Xtext itself runs on the JVM. Also we know a lot about this platform and the community.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Compiles to Java &lt;/h3&gt;&lt;p&gt;The compiler will translate to Java instead of byte code directly. This is for the following reasons:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Anybody should be able to integrate the expressions compiler with any Java code generator&lt;/li&gt;&lt;li&gt;The output as well as the implementation of the compiler shall be as readable / understandable as possible&lt;/li&gt;&lt;li&gt;The code can be used with non-JVM platforms like GWT or Android&lt;/li&gt;&lt;li&gt;We want to leverage the optimizations coming with proven Java compilers&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Another pragmatic reason is, that while we plan to have a debugger for Xbase based languages, it won't be part of next year's release. Therefore people will have to debug on the Java code level, which wouldn't be possible if we were generating byte code directly.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Interpreter &lt;/h3&gt;&lt;p&gt;We also want to ship an interpreter in order to allow interpreted DSLs using Xbase.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Statically Typed &lt;/h3&gt;&lt;p&gt;Xbase is statically typed. This means that there is a type checker and also that the compiler will use static type information to do it's job. Most important to users, might be the rich tooling we can and plan to provide based on Xtext and Eclipse in general.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;However, it should be possible to remove the type checking phase and change the compiler to do dynamic method invocations, etc.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Full Java Generics &lt;/h3&gt;&lt;p&gt;Xbase uses fully-fledged Java generics and doesn't change anything here. While Java Generics are not perfect they have been understood (or at least people think they have ;-)) by a lot of people.&lt;br /&gt;Introducing a different type model would hurt adoption. Under the hood this is backed-up by the JVM-Types we introduces with Xtext 1.0.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;No built-in types &lt;/h3&gt;&lt;p&gt;While the Jvm-Types support every Java type, Xbase will automatically convert any references to built-in types and array types to their corresponding wrapper types resp. lists.&lt;br /&gt;This means you can use built-in types in your languages if you want to (and you should be able to extend Xbase in a way that it can, too), but you don't have to.&lt;br /&gt;The compiler might use built-in types in the generated Java code, but statically and conceptually everything is a subtype of java.lang.Object (i.e. pure OO).&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Closures &lt;/h3&gt;&lt;p&gt;The main addition in Xbase is the concept of closures. While it looks like Java will have them one day, the lack of them is a major problem with Java.&lt;br /&gt;Xbase comes with a small runtime library, where interfaces for Functions are part of. Closures in Xbase are just sugar for anonymous classes of one of these Function types.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;For instance the following Java expression:&lt;br /&gt;&lt;pre&gt;new Function1&amp;lt;String,String&amp;gt;() {&lt;br /&gt;  public String apply(String s) {&lt;br /&gt;    return s.toUpperCase();&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;can be written like this in Xbase:&lt;/p&gt;&lt;pre&gt;String s | s.toUpperCase()&lt;/pre&gt;&lt;p&gt;Xbase also provides sugar for the types of functions. That is&lt;/p&gt;&lt;pre&gt;(String)=&gt;String&lt;/pre&gt;&lt;p&gt;is a shorthand for&lt;/p&gt;&lt;pre&gt;Function1&amp;lt;String,String&amp;gt;&lt;/pre&gt;&lt;h3&gt;Type Inference &lt;/h3&gt;&lt;p&gt;Type inference is another important feature of any modern statically typed language. Type inference basically means that the compiler doesn't force you to write redundant information about types. In Java for example the type of a local variable needs to be specified although it could be inferred from the initialization expression:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;Map&amp;lt;String,Person&amp;gt; namesToPerson = new HashMap&amp;lt;String,Person&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;In Xbase you don't have to write the type signature twice, but can write the following instead:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;val namesToPerson =  new HashMap&amp;lt;String,Person&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Of course namesToPerson would be of type HashMap&amp;lt;..&amp;gt; here. If you want to be explicit, you can add the type information optionally:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;val Map&amp;lt;String,Person&amp;gt; namesToPerson =  new HashMap&amp;lt;String,Person&amp;gt;();&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Xbase does type inference for type arguments in closures as well. That is the argument types don't need to be specified if they can be inferred from the current context.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Also note, that the typing service of Xbase can be used in your language in order to do type inference (for instance for return types in method signatures).&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Operator Overloading &lt;/h3&gt;&lt;p&gt;Xtext comes with a fixed set of operators, with a fixed precedence and associativity. The difference to Java is, that those operators are not bound to certain built-operations on built.in types but are just shorthands (or sugar) for certain method invocations.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;That is if some type &lt;em&gt;T&lt;/em&gt; has a method &lt;em&gt;plus(T2)&lt;/em&gt;, you can either write &lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;myT.plus(myT2)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;or &lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;myT + myT2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;This concept is known from Groovy (although it's slightly different there).&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Simplicity over Syntactical Flexibility &lt;/h3&gt;&lt;p&gt;With operator overloading we could have gone a step further as done in Scala. In Scala the operators aren't fixed keywords but words with certain characteristics (usually starting with a certain letter). That would allow to have operators which are not predefined in the language. However, this would have introduced a couple of additional lexer rules, which had limited the available syntactical space dramatically. This had made extending the language much harder (and even impossible in many cases).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In general we decided to prefer simplicity over syntactic flexibility. This is because with Xbase you already have the largest syntactic freedom. You just create a sublanguage and add or remove anything you want.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Languages like Scala really need to have all this flexibility, because they are designed to add new language features as a library. These special rules about identifiers and operators and other syntactic flexibility like newlines as expression separators (and the situations when this doesn't work) as well as the different ways to invoke functions is what makes Scala syntactically flexible but complicated at the same time.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Xbase is designed to let you easily add new language features on the language level. If you need a certain syntax you can just have it. The base language remains simple.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Everything is an Expression &lt;/h3&gt;&lt;p&gt;There's just no good reason to separate between expressions and statements. Although most statements are inherently imperative (i.e. about side effects), there's no reason to have this separation (which is a limitation) built into the language.&lt;br /&gt;Instead in Xbase everything is an expression, that is everything returns something (and has a type at compile-time). This allows to use the typical imperative statement constructs deeply nested like in the following expression:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="  white-space: pre; font-family:monospace;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;this&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;.setFoo(&lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;if&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; (isFoo) "foo" &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;else&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; "bar")&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In Java we have the ternary operator to do branches within expressions. In Xbase you can use the if expression, but you can also have for and while loops, try-catch clauses or even the nice switch expression deeply nested.&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;Powerful Switch Expression &lt;/h3&gt;&lt;p&gt;This is one of the new features we added. I like pattern matching, but think it is way too complex for many people to use and most people to integrate in their language.&lt;br /&gt;Also I like polymorphic dispatching, like we always had in Xpand and use a lot in Xtext.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;On the other hand the switch expression in Java is just stupid. It is complex (fall through) and limited (finally switch over strings in Java 7 ?).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;So what we do in Xbase is&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;we remove fall through (first match wins)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;we allow to switch over anything (based on equals)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;we introduce so called type guards (which automatically applies down casts)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div&gt;Example:&lt;/div&gt;&lt;p&gt;&lt;span class="Apple-style-span"  style="  white-space: pre; font-family:monospace;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;val&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt; p = getMeSomeObject();&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;b&gt;switch&lt;/b&gt; ( p ) {&lt;br /&gt; Foo &lt;b&gt;case&lt;/b&gt; p.isSpecialFoo() : "SpecialFoo";&lt;br /&gt; Foo : "OrdinaryFoo";&lt;br /&gt; Bar : "It's a "+p.barKind()+" bar";&lt;br /&gt;&lt;b&gt;  default&lt;/b&gt; : "don't know";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;I hope this is intuitive and readable. You can find the details in the &lt;a href="http://www.eclipse.org/Xtext/documentation/Xbase%20Language%20Specification.pdf"&gt;Xbase language specification.&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;h2&gt;Current state&lt;/h2&gt;&lt;p&gt;The development of Xbase has just begun. We have a first draft of a &lt;a href="http://www.eclipse.org/Xtext/documentation/Xbase%20Language%20Specification.pdf"&gt;language specification&lt;/a&gt; and grammars as well as some infrastructure, but we are still in a very early state. &lt;/p&gt;&lt;p&gt;I hope this post made you interested in Xbase. Feedback is very welcome.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1935048324491889067?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1935048324491889067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1935048324491889067&amp;isPopup=true' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1935048324491889067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1935048324491889067'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/09/xbase-new-programming-language.html' title='Xbase - A new programming language?'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ii_da0jTxAY/TKRz9lL-yJI/AAAAAAAAAQE/aThi-Fq3-Yk/s72-c/BMBF.gif' height='72' width='72'/><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-2656373300010176087</id><published>2010-09-29T13:11:00.008+01:00</published><updated>2010-09-29T13:56:51.467+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext in Indigo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ii_da0jTxAY/TKMtb2aMN9I/AAAAAAAAAP0/07jIbzYA7Bo/s1600/BMBF.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 154px;" src="http://1.bp.blogspot.com/_Ii_da0jTxAY/TKMtb2aMN9I/AAAAAAAAAP0/07jIbzYA7Bo/s200/BMBF.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5522307524571445202" /&gt;&lt;/a&gt;We've started development on the next release of Xtext just four weeks ago. Prior to that we did the service release and some internal prototyping and evaluation for upcoming features. We also already have had our yearly kick-off meeting in order to define the main goals for the next release.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ii_da0jTxAY/TKMtV9q8hFI/AAAAAAAAAPs/zvgQ9w5jIYU/s1600/BMBF.gif"&gt;&lt;br /&gt;&lt;/a&gt;With this blog post I'ld like to share what we are up to. Feedback is welcome.&lt;div&gt;&lt;div&gt;&lt;h3&gt;Xtext Version 2.0&lt;/h3&gt;&lt;div&gt;Yes, that's right. We are aiming at a new major version. This means lots of&lt;/div&gt;&lt;div&gt;great new features and improvements as well as incompatible changes. While our API lifecycle contract is, that nothing remains compatible between two major versions, we of course are aware of what API most users use. So we reconsider any changes and don't do them easily.&lt;/div&gt;&lt;div&gt;The differences might turn out to be comparable to those we had between the last two releases, which were &lt;a href="http://blog.dietmar-stoll.de/2010/09/migrating-from-xtext-07x-to-xtext-10-in.html"&gt;considered easy to migrat&lt;/a&gt;e to.&lt;/div&gt;&lt;h3&gt;What we did so far&lt;/h3&gt;&lt;p&gt;During M2 we did a lot of clean up. We removed any deprecated code and incremented the bundle versions for those with incompatible changes to 2.0.0.&lt;br /&gt;Also the whole outline view infrastructure as well as the auto editing has been rewritten. The new outline view is cleaner, faster and simpler. In addition Xtext now leverages JFace partitions. That is one can register different Jface service implementations, such as content assist, per partition. By default there are distinct partitions for comments and string literals as well as the default partition type for everything else. See the full list of &lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?chfieldto=Now;query_format=advanced;chfieldfrom=2010-07-01;bug_status=RESOLVED;component=MWE;component=Xpand;component=Xtext;classification=Modeling;product=EMFT;product=M2T;product=TMF;target_milestone=M2"&gt;solved bugzillas&lt;/a&gt; here.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h3&gt;Milestone builds&lt;/h3&gt;&lt;p&gt;Yesterday we had our M2 of the current indigo stream. We don't have a promoted milestone build, as we had some issues with the build servers. Please use the nightly builds in case you want to give the latest changes a spin.&lt;/p&gt;&lt;p&gt;Expect the first promoted milestone build (M3) of the current development stream of Xtext in six weeks (November 9th).&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;h3&gt;What's next? (Plan for Indigo)&lt;/h3&gt;&lt;p&gt;The development plan for Indigo is laid out around one big topic, which is called &lt;b&gt;Xbase&lt;/b&gt;. Xbase is an expression language bound to the JVM, which will be shipped with Xtext and can be embedded and extended in other Xtext-based languages. It is basically a simplified version of Java's expressions but also adds some new concepts. I will post a separate blog entry on Xbase tomorrow. Note, that Xbase is a research project we are doing together with Christian-Albrecht University of Kiel which is sponsored by &lt;a href="http://www.bmbf.de/en/index.php"&gt;the Federal Ministry of Education and Research&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Refactorings &amp;amp; Clean ups&lt;/b&gt;&lt;/p&gt;&lt;p&gt;As you might know, we usually implement most functionality twice (or more often), because we are simply too stupid to get it right in the first place :-).&lt;br /&gt;Even with Xtext 1.0.0 this is not different, so we have identified the following parts of the framework which we want to clean up or even re-implment:&lt;/p&gt;&lt;ul&gt; &lt;li&gt;Outline view (done)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Auto Editing (done)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Bracket Matching (done)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Serializer&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Formatter&lt;/li&gt;&lt;br /&gt;&lt;li&gt;some smaller things&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;New Features&lt;/b&gt;&lt;/p&gt;&lt;p&gt;But hey, we know most people are interested in new features. So this is what we want to work on in addition to Xbase:&lt;/p&gt;&lt;ul&gt; &lt;li&gt;Generic Rename Refactoring&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Additional Import Namespace Functionality (organize imports, add import, warnings and errors)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Default Implementation and Convenience API for Text Hovers&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Lexer and Parser Fragments&lt;/li&gt;&lt;br /&gt;&lt;li&gt;View Framework (Convenient way to define tree views, such as call or type hierarchies)&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;More Languages&lt;/h3&gt;&lt;p&gt;We of course eat our own dog food and therefore will implement a couple of new languages based on Xbase. &lt;/p&gt;&lt;p&gt;One is a textual notation to define Ecore elements similar to EMFatic, but where one can specify the behavior in derived EStructuralFeatures and EOperations in the language.&lt;/p&gt;&lt;p&gt;Another is a successor to Xpand and Xtend, called &lt;b&gt;Xtend 2&lt;/b&gt;. That one comes with a couple of very interesting features I'll talk about in subsequent blog posts. &lt;/p&gt;&lt;p&gt;We are also thinking about having DSLs for several different view points in Xtext itself, such as scoping. Don't miss tomorrow's blog post on &lt;b&gt;Xbase&lt;/b&gt;. :-)&lt;/p&gt;&lt;p&gt;&lt;i&gt;&lt;b&gt;Disclaimer:&lt;/b&gt; As usual this is what we would like to do and defines the general direction. But as we don't have any fortuneteller in our team, we might (will) adjust the plan slightly as we go. &lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-2656373300010176087?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/2656373300010176087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=2656373300010176087&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2656373300010176087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2656373300010176087'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/09/xtext-in-indigo.html' title='Xtext in Indigo'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ii_da0jTxAY/TKMtb2aMN9I/AAAAAAAAAP0/07jIbzYA7Bo/s72-c/BMBF.gif' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3356067999977317003</id><published>2010-08-26T21:40:00.003+01:00</published><updated>2010-08-26T22:03:13.933+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Will talk about Xtext in Antwerp and Stockholm soon.</title><content type='html'>I have the pleasure to present Xtext in two of the most beautiful european cities within the next two weeks. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;Belgian Eclipse Community Meeting (Antwerp)&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll be in Antwerp next Tuesday and meet up with Belgian's Eclipse Community.&lt;/div&gt;&lt;div&gt;The event is free of charge and the details can be found &lt;a href="http://wiki.eclipse.org/Regional_Communities/Belgium"&gt;here&lt;/a&gt;. There's also a presentation of EGit, which I'm looking forward to see (I'll have lots of questions :-)).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;"Developing Domain-Specific Languages with Xtext" (Stockholm)&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A week later on Thursday, the 9th, I'll be in Stockholm. The event is sponsored by &lt;a href="http://www.jayway.se/"&gt;Jayway&lt;/a&gt; and there will be two presentations. First I'll talk about Xtext and afterwards Patrik Nordwall and Andreas Källberg will present &lt;a href="http://sites.google.com/site/fornaxsculptor/"&gt;Sculptor&lt;/a&gt;, which is an open-source framework/code generator based on textual DSLs implemented in Xtext.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The event is also free of charge. &lt;a href="http://jwsdsl09sep.eventbrite.com/"&gt;Register here.&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3356067999977317003?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3356067999977317003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3356067999977317003&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3356067999977317003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3356067999977317003'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/08/will-talk-about-xtext-in-antwerp-and.html' title='Will talk about Xtext in Antwerp and Stockholm soon.'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7670537504361663701</id><published>2010-08-23T15:50:00.011+01:00</published><updated>2010-08-23T16:11:14.032+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext 1.0.1 (SR1) release and git migration on Wednesday</title><content type='html'>In the last two months Xtext got a great number of performance and memory footprint improvements, bug fixes and extensive documentation enhancements (most of them done by Sebastian while us others were on summer vacation :-)). We also fixed a couple of annoying bugs in Xpand's editor.&lt;br /&gt;&lt;br /&gt;You can find a detailed list of all &lt;b&gt;89 fixes&lt;/b&gt; in &lt;a href="http://bit.ly/drYYWl"&gt;this bugzilla query&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;The upcoming Xtext 1.0.1 (Helios SR1) release will be built on Wednesday.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Migration to git&lt;/b&gt;&lt;br /&gt;We are also happy to announce that this will be our last CVS based release, since we will &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=317923"&gt;switch to git&lt;/a&gt; on the very same day. I also want to thank &lt;a href="http://www.ralfebert.de/"&gt;Ralf Ebert&lt;/a&gt; for his excellent git training he gave us last week in exchange to an Xtext training. Git is cool! :-)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7670537504361663701?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7670537504361663701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7670537504361663701&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7670537504361663701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7670537504361663701'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/08/xtext-101-sr1-release-and-git-migration.html' title='Xtext 1.0.1 (SR1) release and git migration on Wednesday'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-15407873014621817</id><published>2010-08-09T09:17:00.021+01:00</published><updated>2010-08-25T09:24:23.592+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='left recursion'/><category scheme='http://www.blogger.com/atom/ns#' term='left factoring'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='expressions'/><title type='text'>Parsing Expressions with Xtext</title><content type='html'>Parsing simple XML-like, structural languages with Xtext is a no-brainer. However, parsing nested expressions is often considered a bit more complicated. This is because they are more complicated due to their recursive nature and also because with Xtext you have to avoid left recursive parser rules. As the underlying parser (generated by Antlr) uses a top-down approach it would recurse endlessly if you had a left recursive grammar.&lt;br /&gt;&lt;br /&gt;Let's have a look at parsing a simple arithmetic expression:&lt;pre&gt;2 + 20 * 2&lt;/pre&gt;If you know EBNF a bit and wouldn't think about avoiding left recursion, operator precedence or associativity, you'ld probably write a grammar like this:&lt;pre&gt;Expression :&lt;br /&gt; Expression '+' Expression |&lt;br /&gt; Expression '-' Expression |&lt;br /&gt; INT;&lt;/pre&gt;This grammar would be left recursive because the parser reads the grammar top down and left to right and would endlessly call the Expression rule without consuming any characters, i.e. altering the underlying state of the parser. While this kind of grammars can be written for bottom-up parsers, you'ld still have to deal with operator precedence in addition. That is define that a multiplication has higher precedence than an addition for example.&lt;br /&gt;&lt;br /&gt;In Xtext you define the precedence implicitly when left-factoring such a grammar. Left-factoring means you get rid of left recursion by applying a certain technique, which I will show in the following.&lt;br /&gt;&lt;br /&gt;So here is a left-factored grammar (not yet working with Xtext) for the expression language above  :&lt;br /&gt;&lt;pre&gt;Addition :&lt;br /&gt; Multiplication ('+' Multiplication)*;&lt;br /&gt;&lt;br /&gt;Multiplication:&lt;br /&gt; NumberLiteral ('*' NumberLiteral)*;&lt;br /&gt;&lt;br /&gt;NumberLiteral:&lt;br /&gt; INT;&lt;/pre&gt;As you can see the main difference is that we have three rules instead of one and if you look a bit closer you see, that there's a certain delegation pattern involved. The rule &lt;span style="font-style:italic;"&gt;Addition&lt;/span&gt; doesn't call itself but calls &lt;span style="font-style:italic;"&gt;Multiplication&lt;/span&gt; instead. The operator precedence is defined by the order of delegation. The later the rule is called the higher is its precedence. This is at least the case for the first two rules which are of a left recursive nature (but we've left-factored them now). The last rule is not left recursive which is why you can write them down without applying this pattern.&lt;br /&gt;&lt;br /&gt;We should allow users to explicitly adjust precedence by adding parenthesis, e.g. write something like &lt;span style="font-style:italic;"&gt;(2 + 20) * 2&lt;/span&gt;.&lt;div&gt;So let's add support for that (note that the grammar is still not working with Xtext):&lt;pre&gt;Addition :&lt;br /&gt; Multiplication ('+' Multiplication)*;&lt;br /&gt;&lt;br /&gt;Multiplication:&lt;br /&gt; Primary ('*' Primary)*;&lt;br /&gt;&lt;br /&gt;Primary :&lt;br /&gt; NumberLiteral |&lt;br /&gt; '(' Addition ')';&lt;br /&gt;&lt;br /&gt;NumberLiteral:&lt;br /&gt; INT;&lt;/pre&gt;So once again: if you have some construct that recurses on the left hand side, you need to put it into the delegation chain according to their operator precedence. The pattern is always the same, the thing that recurses delegates to the rule with the next higher precedence.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Construction of an AST&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that we know how to avoid left recursion, let's have a look at what the parser produces. In Xtext each rule returns some value. &lt;i&gt;&lt;a href="http://www.eclipse.org/Xtext/documentation/1_0_0/xtext.html#parser_rules"&gt;Parser rules&lt;/a&gt;&lt;/i&gt; return AST nodes (i.e. &lt;span style="font-style:italic;"&gt;EObject&lt;/span&gt; instances), &lt;i&gt;&lt;a href="http://www.eclipse.org/Xtext/documentation/1_0_0/xtext.html#EnumRules"&gt;enum rules&lt;/a&gt;&lt;/i&gt; return enum literals and &lt;i&gt;&lt;a href="http://www.eclipse.org/Xtext/documentation/1_0_0/xtext.html#datatypeRules"&gt;datatype rules&lt;/a&gt;&lt;/i&gt; as well as &lt;i&gt;&lt;a href="http://www.eclipse.org/Xtext/documentation/1_0_0/xtext.html#terminalRules"&gt;terminal rules&lt;/a&gt;&lt;/i&gt; return simple values like strings and the like (&lt;i&gt;EDatatype&lt;/i&gt; in EMF jargon).&lt;br /&gt;Xtext can automatically infer whether some rule is a parser rule, i.e. constructs and returns an AST node or if it is a datatype rule. Above's grammars only consisted of datatype rules so all they would produce is a string.&lt;br /&gt;In order to construct an AST we need to add &lt;span style="font-style:italic;"&gt;Assignments&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;Actions&lt;/span&gt;. But before we do that we need to talk about return types.&lt;br /&gt;&lt;br /&gt;The return type of a rule can be specified explicitly using the '&lt;i&gt;returns&lt;/i&gt;' keyword but can be inferred if the type's name is the same as the rule's name.&lt;br /&gt;That is&lt;pre&gt;NumberLiteral : … ;&lt;/pre&gt;is a short form of&lt;pre&gt;NumberLiteral returns NumberLiteral : …. ;&lt;/pre&gt;However in the case of the expressions grammar above, the rules all need to return the same type since they are recursive. So in order to make the grammar functional we need to add a common return type explicitly (but the grammar is still missing some bits):&lt;pre&gt;Addition returns Expression:&lt;br /&gt; Multiplication ('+' Multiplication)*;&lt;br /&gt;&lt;br /&gt;Multiplication returns Expression:&lt;br /&gt; Primary ('*' Primary)*;&lt;br /&gt;&lt;br /&gt;Primary returns Expression:&lt;br /&gt; NumberLiteral |&lt;br /&gt; '(' Addition ')';&lt;br /&gt;&lt;br /&gt;NumberLiteral:&lt;br /&gt; INT;&lt;/pre&gt;The AST type inference mechanism of Xtext will infer two types: &lt;span style="font-style:italic;"&gt;Expression&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;NumberLiteral&lt;/span&gt;. Now we need to add assignments and Actions in order to store all the important information in the AST and to create reasonable subtypes for the two operations.&lt;br /&gt;&lt;br /&gt;In the following you see the &lt;span style="font-weight:bold;"&gt;final fully working Xtext grammar&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Addition returns Expression:&lt;br /&gt; Multiplication ({Addition.left=current} '+' right=Multiplication)*;&lt;br /&gt;&lt;br /&gt;Multiplication returns Expression:&lt;br /&gt; Primary ({Multiplication.left=current} '*' right=Primary)*;&lt;br /&gt;&lt;br /&gt;Primary returns Expression:&lt;br /&gt; NumberLiteral |&lt;br /&gt; '(' Addition ')';&lt;br /&gt;&lt;br /&gt;NumberLiteral:&lt;br /&gt; value=INT;&lt;/pre&gt;Let's go through the grammar as the parser would do it for the expression &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;b&gt;( 1 + 20 ) * 2&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-size:x-small;"&gt;(I'm sure it's pretty hard to follow what's going just by reading this text. Therefore I have prepared a small video where I visualize and explain what is going on. You can find it at the end of this section.)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The parser always starts with the first rule (&lt;i&gt;Addition&lt;/i&gt;). Therein the first element is an unassigned rule call to &lt;i&gt;Multiplication&lt;/i&gt; which in turn calls &lt;i&gt;Primary&lt;/i&gt;. &lt;i&gt;Primary&lt;/i&gt; now has two alternatives. The first on is calling &lt;i&gt;NumberLiteral&lt;/i&gt; which consists only of one assignment  to a feature called 'value' of what the &lt;i&gt;INT&lt;/i&gt; rule returns.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;But as the first token in the expression is an opening parenthesis '&lt;i&gt;(&lt;/i&gt;' the parser will take the second alternative in &lt;i&gt;Primary&lt;/i&gt;, consume the '(' and call the rue &lt;i&gt;Addition&lt;/i&gt;. Now the value '1' is the look ahead token and again &lt;i&gt;Addition&lt;/i&gt; calls &lt;i&gt;Multiplication&lt;/i&gt; and &lt;i&gt;Multiplication&lt;/i&gt; calls &lt;i&gt;Primary&lt;/i&gt;. This time the parser takes the first alternative because '1' was consumed by the &lt;i&gt;INT&lt;/i&gt; rule (which btw. is a reused library terminal rule). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As soon as the parser hits an assignment it checks whether an AST node for the current rule was already created. If not it will create one based on the return type, which is &lt;i&gt;NumberLiteral&lt;/i&gt;. The Xtext generator will have created an EClass 'NumberLiteral' before which can now be instantiated. That type will also have a property called &lt;i&gt;value&lt;/i&gt; of type Integer, which will get the value '1' set. This is what the Java equivalent would look like:&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: normal;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;// value=INT&lt;br /&gt;if (current == null)&lt;br /&gt; current = new NumberLiteral();&lt;br /&gt;current.setValue(ruleINT());&lt;br /&gt;...&lt;/pre&gt;Now that the rule has been completed the created EObject is returned to the calling rule &lt;i&gt;Primary&lt;/i&gt;, which in turn returns the object unchanged to its own caller. Within &lt;i&gt;Multiplication&lt;/i&gt; the call to &lt;i&gt;Primary&lt;/i&gt; has been successfully parsed and returned an instance of &lt;i&gt;NumberLiteral&lt;/i&gt;. The second part of the rule is a so called g&lt;i&gt;roup&lt;/i&gt; (everything within the parenthesis). The asterisk behind the closing parenthesis states that this part can be consumed zero or more times. The first token to consume in this part is the multiplication operator '*'. Unfortunately in the current situation the next token to consume is the plus operator '+', so the group is not consumed at all and the rule returns what they got from the unassigned rule call (the &lt;i&gt;NumberLiteral&lt;/i&gt;) .&lt;br /&gt;&lt;br /&gt;In rule &lt;i&gt;Addition&lt;/i&gt; there's a similar group but this time it expects the correct operator so the parser goes into the group.&lt;br /&gt;The first element in the group is a so called a&lt;i&gt;ction&lt;/i&gt;. As Xtext grammars are highly declarative and bi-directional it is not a good idea to allow arbitrary expression within actions as it is usually the case with other parser generators. Instead we only support two kinds of actions. This one will create a new instance of type &lt;i&gt;Addition&lt;/i&gt; and assign what was the to be returned object to the feature &lt;i&gt;left&lt;/i&gt;. In Java this would have been something like:&lt;pre&gt;// Multiplication rule call&lt;br /&gt;current = ruleMultiplication();&lt;/pre&gt;&lt;pre&gt;// {Addition.left=current}&lt;br /&gt;Addition temp = new Addition();&lt;br /&gt;temp.setLeft(current);&lt;br /&gt;current = temp;&lt;br /&gt;...&lt;/pre&gt;As a result the rule would now return an instance of &lt;i&gt;Addition&lt;/i&gt; which has a &lt;i&gt;NumberLiteral&lt;/i&gt; set to its property &lt;i&gt;left&lt;/i&gt;. Next up the parser consumes the '+' operator. We do not store the operator in the AST because we have an explicit &lt;i&gt;Addition&lt;/i&gt; type, which implicitly contains this information.&lt;br /&gt;The assignment ('right=Multiplication') calls &lt;i&gt;Multiplication&lt;/i&gt; another time and assigns the returned object (a &lt;i&gt;NumberLiteral&lt;/i&gt; of value=20) to the property named &lt;i&gt;right&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;If we now had an additional plus operation '+' (e.g. 1 + 2 + 3) the group would match another time and create another instance of &lt;i&gt;Addition&lt;/i&gt;. But we don't and therefore the rule is completed and returns the created instance of &lt;i&gt;Addition&lt;/i&gt; to its caller which was the second alternative in &lt;i&gt;Primary&lt;/i&gt;. Now the closing parenthesis is matched and consumed and the stack is reduced once more.&lt;br /&gt;&lt;br /&gt;We are now in rule &lt;i&gt;Multiplication&lt;/i&gt; and have the multiplication operator '*' on the look ahead. The parser goes into the group and applies the action. Finally it calls the Primary rule gets another instance of &lt;i&gt;NumberLiteral&lt;/i&gt; (value=2), assigns it as the 'right' operand of the &lt;i&gt;Multiplication&lt;/i&gt; and returns the &lt;i&gt;Multiplication&lt;/i&gt; to &lt;i&gt;Addition&lt;/i&gt; which in turn returns the very same object as there's nothing left to parse.&lt;br /&gt;&lt;br /&gt;The resulting AST looks like this:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ii_da0jTxAY/THI1VxExhTI/AAAAAAAAAPU/VwS7vvE7wuU/s1600/expression_ast.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 209px;" src="http://1.bp.blogspot.com/_Ii_da0jTxAY/THI1VxExhTI/AAAAAAAAAPU/VwS7vvE7wuU/s400/expression_ast.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5508523942294422834" /&gt;&lt;/a&gt;&lt;br /&gt;The following video tries to explain what you just have read. The grammar is slightly different, but I'm sure this won't be problem for you ;-).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;iframe src="http://player.vimeo.com/video/14358869?title=0&amp;amp;byline=0&amp;amp;portrait=0&amp;amp;color=DBD7EF" width="468" height="263" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Associativity&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There is still one topic I should mention, which is associativity. There is left and right associativity as well as none associativity. In the example we have seen left associativity. Associativity tells the parser how to construct the AST when there are two infix operations with the same precedence. The following example is taken from the corresponding &lt;a href="http://en.wikipedia.org/wiki/Operator_associativity"&gt;wikipedia entry&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Consider the expression &lt;span style="font-style:italic;"&gt;a ~ b ~ c&lt;/span&gt;. If the operator ~ has left associativity, this expression would be interpreted as &lt;span style="font-style:italic;"&gt;(a ~ b) ~ c&lt;/span&gt; and evaluated left-to-right. If the operator has right associativity, the expression would be interpreted as &lt;span style="font-style:italic;"&gt;a ~ (b ~ c)&lt;/span&gt; and evaluated right-to-left. If the operator is non-associative, the expression might be a syntax error, or it might have some special meaning.&lt;/blockquote&gt;We already know the most important form which is &lt;b&gt;left associativity&lt;/b&gt;:&lt;pre&gt;Addition returns Expression:&lt;br /&gt; Multiplication ({Addition.left=current} '+' right=Multiplication)*;&lt;/pre&gt;&lt;b&gt;Right associativity&lt;/b&gt; is done using the following pattern (note the quantity operator and the call to the rule itself at the end):&lt;pre&gt;Addition returns Expression:&lt;br /&gt; Multiplication ({Addition.left=current} '+' right=Addition)?;&lt;/pre&gt;And if you don't want to allow multiple usages of the same expression in a row (hence &lt;b&gt;non-associativity&lt;/b&gt;) you write:&lt;pre&gt;Addition returns Expression:&lt;br /&gt; Multiplication ({Addition.left=current} '+' right=Multiplication)?;&lt;/pre&gt;Note that sometimes it's better to allow associativity on parser level, but forbid it later using validation, because you can come up with a better error message. Also the whole parsing process won't be interrupted, so your tooling will generally be more forgiving.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(This post has also been included into the &lt;a href="http://www.eclipse.org/Xtext/documentation"&gt;Xtext User Guide&lt;/a&gt; since version 1.0.1)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-15407873014621817?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/15407873014621817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=15407873014621817&amp;isPopup=true' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/15407873014621817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/15407873014621817'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/08/parsing-expressions-with-xtext.html' title='Parsing Expressions with Xtext'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ii_da0jTxAY/THI1VxExhTI/AAAAAAAAAPU/VwS7vvE7wuU/s72-c/expression_ast.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-2263563049707324606</id><published>2010-07-02T13:45:00.009+01:00</published><updated>2010-07-02T14:12:17.221+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext does musical scores</title><content type='html'>&lt;div&gt;Dennis Harmath has built a &lt;a href="http://lilypond.org/"&gt;LilyPond&lt;/a&gt; IDE for Eclipse. He sent a very nice testimonial to our newsgroup:&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;I'm happy to announce &lt;a href="http://elysium.thsoft.hu/"&gt;Elysium&lt;/a&gt;, a LilyPond IDE for Eclipse - proudly brewed with Xtext!&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;I must say that I really enjoyed developing tooling support for LilyPond, the definitive textual DSL of music notation using Xtext, it was great fun to see the grammar evolve with the help of automatic abstract syntax inference, and the IDE features I got "for free" from Xtext really impressed me. Hooking into Xtext's build process to implement incremental build was also much easier than writing an own builder. In the future, developers might reuse LilyPond's abstract syntax as a metamodel for music notation e.g. to write converters from/to LilyPond, hence bringing more music notation support to Eclipse.&lt;/i&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;There's also a screenast showing Elysium in action:&lt;/div&gt;&lt;br /&gt;&lt;object width="500" height="335"&gt;&lt;param name="movie" value="http://www.youtube.com/v/c2EOqAa5HiQ&amp;amp;rel=0&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xd0d0d0&amp;amp;hl=en_US&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/c2EOqAa5HiQ&amp;amp;rel=0&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xd0d0d0&amp;amp;hl=en_US&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="500" height="335" &gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-2263563049707324606?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/2263563049707324606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=2263563049707324606&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2263563049707324606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2263563049707324606'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/07/xtext-does-musical-scores.html' title='Xtext does musical scores'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-2250086169542850936</id><published>2010-06-09T07:55:00.003+01:00</published><updated>2010-06-09T08:12:17.853+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webinar'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='helios'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext Webinar is online</title><content type='html'>Yesterday's webinar on Xtext 1.0 (to be released June 23) was recorded and can be watched at Eclipse Live : &lt;a href="http://live.eclipse.org/node/886"&gt;http://live.eclipse.org/node/886&lt;/a&gt; &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I think it went very well, at least Jan and me had a lot of fun talking about our beloved framework. :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;We had quite a good number of attendees:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;199 registered&lt;/li&gt;&lt;li&gt;153 attended live&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;And the poll showed that there were as many Xtext users as there were people who are new to Xtext. So that the focus of giving an overview of the framework and how it works but also demo the new features seemed to have been appropriate.&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Are you using Xtext?&lt;/div&gt;&lt;div&gt;35% (31) – Yes, I use it frequently&lt;/div&gt;&lt;div&gt;14% (12) – Yes, I use it sometimes&lt;/div&gt;&lt;div&gt;47% (40) – No, but I'm interested in using it&lt;/div&gt;&lt;div&gt;  2% (2) – No, I don’t have plans to use it&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;We hope the webinar was and is helpful for you. Thank you!&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-2250086169542850936?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/2250086169542850936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=2250086169542850936&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2250086169542850936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2250086169542850936'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/06/xtext-webinar-is-online.html' title='Xtext Webinar is online'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-870214609778194055</id><published>2010-06-03T08:41:00.010+01:00</published><updated>2010-06-03T09:15:33.039+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webinar'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='helios'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>5 Good Reasons To Watch Our Xtext Webinar</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ii_da0jTxAY/TAdkNdhpqCI/AAAAAAAAAPM/820D5ULaDo4/s1600/Xtext-Webinar-2010-Logo-Kreide-sw.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 217px;" src="http://4.bp.blogspot.com/_Ii_da0jTxAY/TAdkNdhpqCI/AAAAAAAAAPM/820D5ULaDo4/s400/Xtext-Webinar-2010-Logo-Kreide-sw.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5478457654146344994" /&gt;&lt;/a&gt;&lt;div style="text-align: left;"&gt;Next Tuesday (June 8th) there will be an &lt;a href="http://live.eclipse.org/node/886"&gt;interactive webinar &lt;/a&gt;&lt;a href="http://live.eclipse.org/node/886"&gt;on Xtext at Eclipse Live&lt;/a&gt;. Here are the best 5 reasons for you to show up:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Reason I : &lt;/b&gt;You want to learn how easy Domain-Specific Language (DSL) development can be&lt;/div&gt;&lt;div&gt;&lt;br /&gt;People state that developing external DSLs is much more complicated than internal DSLs. With Xtext the opposite is the case. Xtext itself provides a concise language to describe DSLs, so that it takes only minutes to create a first draft of your language. You don't have to deal with complex meta programming or multiple syntax alternatives as you do in internal DSL development. With Xtext your language definition is concise and declarative &lt;b&gt;and&lt;/b&gt; you get language specific IDE support.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;Reason II: &lt;/b&gt;You want to see the new Helios features in action&lt;br /&gt;&lt;br /&gt;In the Helios release Xtext graduated to version 1.0. It has grown up from a tiny little editor generator to a mature language development framework. Still simple things are simple, but you now get much more out of the box. Features like namespace-based scoping, a workspace index, a builder infrastructure, validation and linking against dirty editor state, quick fixes, linking to any Java elements and tight integration with JDT, enhanced serialization and formatting support and much more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Reason III:&lt;/b&gt; You'ld like to see how "Modeling 2.0" looks like&lt;br /&gt;&lt;br /&gt;The days of heavy weight, dogmatic modeling approaches are over. In 2010 Modeling technology is mature and a pragmatic solution to many problems. Xtext and EMF are a dream team! Models are now also code and integrate seamless with common development environments such as version control.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reason IV:&lt;/b&gt; You need a decent IDE for a particular programming language&lt;br /&gt;&lt;br /&gt;It's astounding how many programming languages are used in the different industries. There are so many languages I'm sure you haven't heard of. Most of them have one thing in common: They lack decent tool support. I'm not talking about syntax coloring for Vim, but something close to what modern Java IDEs offer. We at &lt;a href="http://www.itemis.com/"&gt;itemis&lt;/a&gt; have already successfully implemented a couple of IDEs for various programming languages. We will show something in the webinar.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Reason V:&lt;/b&gt; The webinar is free and interactive&lt;br /&gt;&lt;br /&gt;As usual with Eclipse Live webinars, the event is free of charge and the integrated chat application allows us to communicate. The Xtext committers will attend and be happy to answer any questions.  Unfortunately &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; won't be able to join (for personal reasons). But &lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt; was so kind to jump in and do the presentation with me. We are looking forward to meet you online!&lt;/div&gt;&lt;div&gt;  &lt;div&gt;Have fun.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-870214609778194055?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/870214609778194055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=870214609778194055&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/870214609778194055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/870214609778194055'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/06/5-good-reasons-to-watch-our-xtext.html' title='5 Good Reasons To Watch Our Xtext Webinar'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ii_da0jTxAY/TAdkNdhpqCI/AAAAAAAAAPM/820D5ULaDo4/s72-c/Xtext-Webinar-2010-Logo-Kreide-sw.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-6109747613491055922</id><published>2010-05-31T09:52:00.006+01:00</published><updated>2010-05-31T12:21:07.840+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='autosar'/><category scheme='http://www.blogger.com/atom/ns#' term='case study'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='automotive'/><title type='text'>Screencast: Xtext in the automotive industry</title><content type='html'>A couple of month ago I had already &lt;a href="http://blog.efftinge.de/2009/11/xtext-in-automotive-industry.html"&gt;blogged&lt;/a&gt; about how BMW Car IT use Xtext to develop a full-blown IDE for the Autosar standard . Now Sebastian Benz has published a video demonstrating ARText. See what you can do with Xtext.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;object width="600" height="450"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12080038&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=12080038&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/12080038"&gt;ARText in Action!&lt;/a&gt; from &lt;a href="http://vimeo.com/user3912163"&gt;Sebastian Benz&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-6109747613491055922?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/6109747613491055922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=6109747613491055922&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6109747613491055922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6109747613491055922'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/05/screencast-xtext-in-automotive-industry.html' title='Screencast: Xtext in the automotive industry'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1178246805135583018</id><published>2010-04-15T16:07:00.004+01:00</published><updated>2010-04-16T06:16:56.331+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='example'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>WYSIWYG with Xtext</title><content type='html'>Yesterday I came across a post in the EMF newsgroup which got me to do this little prototype of two languages. One mark up document language and one where you can declare the text styles to use in that mark up language. See the screencast:&lt;br /&gt;&lt;br /&gt;&lt;object width="468" height="328"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10954009&amp;amp;server=vimeo.com&amp;amp;show_title=0&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=DBD7EF&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10954009&amp;amp;server=vimeo.com&amp;amp;show_title=0&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=DBD7EF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="468" height="328"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;The very rough prototype code can be &lt;a href="http://drop.io/xtext_coloring_example"&gt;downloaded from here&lt;/a&gt;.&lt;br /&gt;It is based on Xtext 1.0.0 &gt;= M6.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1178246805135583018?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1178246805135583018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1178246805135583018&amp;isPopup=true' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1178246805135583018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1178246805135583018'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/04/wysiwyg-with-xtext.html' title='WYSIWYG with Xtext'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-6191245980934925953</id><published>2010-04-14T08:23:00.002+01:00</published><updated>2010-04-14T09:01:36.772+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='protocol buffers'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Google's Protocol Buffers implemented in Xtext</title><content type='html'>Eat your own dog food is an excellent advice. So do I and therefore I use Xtext to implement languages from time to time. Usually these are languages we either implement for one of our open source projects (examples or the recently added &lt;a href="http://zarnekow.blogspot.com/2010/01/sneak-peek-at-new-mwe-editor.html"&gt;MWE2 language I developed together with Sebastian&lt;/a&gt;) or for customer projects.&lt;br /&gt;&lt;br /&gt;A couple of weeks ago I implemented the DSL of &lt;a href="http://code.google.com/p/protobuf/"&gt;Google's Protocol Buffers&lt;/a&gt; using &lt;a href="http://www.xtext.org"&gt;Xtext&lt;/a&gt;. I don't want to add it as an example to Xtext, because it doesn't add any specific value over the existing examples nor do I have the time to start a new project or maintain it in any way. However, I thought there might be some people who want to have a look as an example or want to take it over and extend/maintain it further.&lt;br /&gt;&lt;br /&gt;I didn't know Protocol Buffers so I had to learn the language using the documentation and the unit tests they have. The concepts of the language (scoping, imports) are very close to Xtext's defaults so that it took me only 3 hours to implement it. Most of the time was spent to get the lexing part right, which was not so close to the defaults :-).&lt;br /&gt;&lt;br /&gt;If you want to have a look, &lt;a href="http://drop.io/protocol_buffers_Xtext"&gt;here are the two Eclipse projects&lt;/a&gt;. Feel free to do whatever you want with that code. I of course would love to see someone creating a new open source project for it or adding it to an existing. In any case I'll be glad to help you getting started with the code.&lt;br /&gt;&lt;br /&gt;The code should work with  every post-M6-milestone as well as the final Xtext 1.0.0 release which will be published in  June.&lt;br /&gt;&lt;br /&gt;I also recorded a short screen cast demoing the result:&lt;br /&gt;&lt;br /&gt;&lt;object height="263" width="468"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10918855&amp;amp;server=vimeo.com&amp;amp;show_title=0&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=DBD7EF&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=10918855&amp;amp;server=vimeo.com&amp;amp;show_title=0&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=DBD7EF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="263" width="468"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-6191245980934925953?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/6191245980934925953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=6191245980934925953&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6191245980934925953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6191245980934925953'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/04/googles-protocol-buffers-implemented-in.html' title='Google&apos;s Protocol Buffers implemented in Xtext'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7028798444732123610</id><published>2010-04-13T09:19:00.003+01:00</published><updated>2010-04-13T09:48:26.967+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='jax 2010'/><category scheme='http://www.blogger.com/atom/ns#' term='modeling'/><title type='text'>Modeling Day @ JAX 2010</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://it-republik.de/jaxenter/jax2010/img/download/jax2010.gif"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 177px; height: 59px;" src="http://it-republik.de/jaxenter/jax2010/img/download/jax2010.gif" alt="" border="0" /&gt;&lt;/a&gt;The &lt;a href="http://it-republik.de/konferenzen/jax2010/"&gt;JAX conference&lt;/a&gt; is coming closer. This year there's a "&lt;a href="http://it-republik.de/konferenzen/jax2010/session/?tid=1550"&gt;Modeling Day&lt;/a&gt;" consisting of nine 45 min  talks. We not only have well-known speakers but also in-depth practical presentations. If you want to learn about Eclipse Modeling Technologies and see how they are applied in industry the JAX Modeling Day is for you.&lt;br /&gt;The fishbowl discussion we have at the end of the day should be a lot of fun as well.&lt;br /&gt;All sessions will be held in English.&lt;br /&gt;&lt;br /&gt;Looking forward to see you there!&lt;span class="name"&gt;&lt;span class="firma"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7028798444732123610?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7028798444732123610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7028798444732123610&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7028798444732123610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7028798444732123610'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/04/modeling-day-jax-2010.html' title='Modeling Day @ JAX 2010'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7638661604768085955</id><published>2010-03-27T16:25:00.012+01:00</published><updated>2010-03-27T17:02:05.339+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext won Eclipse Community Award!</title><content type='html'>What a great community you are! Thank you so much for giving us this kind of support. We are all incredibly proud about the fact that &lt;a href="http://www.eclipse.org/org/press-release/20100322_awardswinners.php"&gt;Xtext has won the Eclipse Community Award 2010&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ii_da0jTxAY/S64kPlcwsVI/AAAAAAAAAOU/Mj2KG3F0pkE/s1600/4457875296_55ac9e2905.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_Ii_da0jTxAY/S64kPlcwsVI/AAAAAAAAAOU/Mj2KG3F0pkE/s400/4457875296_55ac9e2905.jpg" alt="" id="BLOGGER_PHOTO_ID_5453336048961630546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I also want to take the opportunity to say &lt;a href="http://blog.efftinge.de/2009/06/galileo-thank-you-team.html"&gt;thank you to the team&lt;/a&gt; once more. Especially to &lt;a href="https://www.xing.com/profile/Dennis_Huebner2"&gt;Dennis Huebner&lt;/a&gt; who couldn't make it to this year's EclipseCon. &lt;a href="http://www.itemis.com/"&gt;Itemis&lt;/a&gt; and in particular our bosses Wolfgang Neuhaus and Jens Wagener also deserve a big thank you: If they hadn't believed in my vision two years ago and still do, there were no Xtext and we were all working on different things and hadn't had the chance to combine our forces to create our favorite &lt;a href="http://www.eclipse.org/Xtext"&gt;programming language and IDE development framework&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I already put the award logo Lynn sent me on our website. See how nice it fits into the Xtext-Nova theme.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.eclipse.org/Xtext"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 264px;" src="http://4.bp.blogspot.com/_Ii_da0jTxAY/S64ofXR66sI/AAAAAAAAAOk/fxY2Bx-rHcg/s400/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5453340718082484930" border="0" /&gt;&lt;/a&gt;EclipseCon 2010 was so much fun. I'm still in San Francisco but am already looking forward to next year's issue of my favorite conference. Thank you for all the support!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7638661604768085955?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7638661604768085955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7638661604768085955&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7638661604768085955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7638661604768085955'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/03/xtext-won-eclipse-community-award.html' title='Xtext won Eclipse Community Award!'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ii_da0jTxAY/S64kPlcwsVI/AAAAAAAAAOU/Mj2KG3F0pkE/s72-c/4457875296_55ac9e2905.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-2250983299037233157</id><published>2010-03-22T14:03:00.005+01:00</published><updated>2010-03-22T16:17:34.159+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipsecon'/><title type='text'>EclipseCon 2010</title><content type='html'>I'm sitting in my room at the Hyatt hotel in Santa Clara, California. It's 6 am and I'm glad I could sleep til 5 am at least. Seems that the 7h bike trip we did yesterday did its job (we hoped that being outside most of the day would get us in tune with the local time zone). I only wished the saddle hadn't been so hard....&lt;br /&gt;&lt;br /&gt;Today, the conference starts and I'm currently looking at what sessions I'ld like to attend.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipsecon.org/2010/table/table?date=2010-03-22"&gt;&lt;span style="font-weight: bold;"&gt;Monday&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;Monday starts with the introduction of the &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1612"&gt;e4-Rover Mars Challenge&lt;/a&gt;. I bet you've already heard of it. Right after that Jan, Moritz and Heiko give a 3 hour tutorial called &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1191"&gt;"Xtext meets e4"&lt;/a&gt;. They will show how one can model a workbench in a textual way. They have worked hard on preparing the workshop material and I'm curious to see how the audience like what they have. After lunch the shorter presentations begin. I'm going to see what Stephan and Kenn think the &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1315"&gt;twenty modeling things&lt;/a&gt; are and am looking forward to &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1360"&gt;the b3 talk&lt;/a&gt;.  After that Peter has his &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1129"&gt;session on Xpand&lt;/a&gt; just before Heiko presents on how one can &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1178"&gt;apply MDSD to develop IPhone apps&lt;/a&gt;. Also I want to note Jan's talk on &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1135"&gt;combining GMF and Xtext&lt;/a&gt;.&lt;br /&gt;In the evening I have a modeling panel and after that there's the &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1589"&gt;community awards ceremony&lt;/a&gt;. Xtext is finalist in the category "most innovative project". How cool is that? :-)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipsecon.org/2010/table/table?date=2010-03-23"&gt;&lt;span style="font-weight: bold;"&gt;Tuesday&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;In the morning I'll be out on another bicycle trip. After that I'll have to practice my presentations for the afternoon (yes I practice and I always hope nobody watches me while I'm doing so :-)).&lt;br /&gt;After lunch there are a couple of talks I find interesting. Kai presents on &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1086"&gt;CSS in e4&lt;/a&gt; and Berni does his &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1253"&gt;penalty shoot out of textual modeling tools&lt;/a&gt; (didn't know there are other than Xtext ;-)).&lt;br /&gt;I'm also interested in &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1201"&gt;what's new in CDT&lt;/a&gt;. Not because I'm a big fan of C/C++, but I'm interested in Eclipse-based IDE development. At 2 pm it's showtime for Sebastian and me. We'll demo the &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1148"&gt;coolest IDE features you get when developing a language in Xtext&lt;/a&gt;. And right after that there's the &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1278"&gt;Modeling Runway&lt;/a&gt;, where a couple of modeling projects present their projects (5 min each).&lt;br /&gt;&lt;br /&gt;Later that day I'll likely attend the &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1306"&gt;Graphiti talk&lt;/a&gt;. Let's see if it is any better than GMF. I think I'll have a break after that in order to read through Wayne's &lt;a href="http://www.eclipse.org/projects/dev_process/development_process_2010.php"&gt;revised Eclipse Development Process&lt;/a&gt; in order to be prepared for the &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1441"&gt;Development at Eclipse&lt;/a&gt; panel I am attending.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipsecon.org/2010/table/table?date=2010-03-24"&gt;&lt;span style="font-weight: bold;"&gt;Wednesday&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;I am not yet decided whether to go to &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1192"&gt;"Modular Architecture from Top to Bottom"&lt;/a&gt; or &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1427"&gt;"API Design and Evolution"&lt;/a&gt; in the morning. Both seem very interesting, but I guess I'll have more fun asking controversial questions in the API talk :-). In the afternoon I probably will visit the &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1340"&gt;Groovy IDE talk&lt;/a&gt;. The new version of the Eclipse plugin looks great. Especially the tight integration with JDT is pretty cool. But I also might go out for another trip, since the weather is forecast to be great. If not I'll go to see what cool features Eike and his team brought to &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1373"&gt;CDO&lt;/a&gt; lately. In the evening Sebastian will present the &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1172"&gt;new version of MWE2&lt;/a&gt;. It's implemented in Xtext and we're very proud of the result and how easy it was to implement it using Xtext.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eclipsecon.org/2010/table/table?date=2010-03-25"&gt;&lt;span style="font-weight: bold;"&gt;Thursday&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;For me the day certainly starts with &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1220"&gt;"&lt;/a&gt;&lt;a href="http://www.eclipsecon.org/2010/sessions?id=1220"&gt;Understanding  and Using Git at Eclipse&lt;/a&gt;&lt;a href="http://www.eclipsecon.org/2010/sessions?id=1220"&gt;"&lt;/a&gt;. Actually we're still using CVS and I personally am ok with it because of the great tooling Eclipse provides. The only problem we have is its slowness. Synchronizing my development workspace sometimes takes 15 min. So we plan to switch to Git right after Helios.&lt;br /&gt;In the afternoon the talk about &lt;a href="http://www.eclipsecon.org/2010/sessions?id=1498"&gt;Dependency Injection&lt;/a&gt; got my attention. I love DI, though I am also a bit concerned about how DI is used in e4.  I'll make sure to have some discussions with the e4 folks about my concerns. I'll have to bring my bicycle back to the store in the early evening, so I won't be able to attend any other talks on Thursday.&lt;br /&gt;&lt;br /&gt;These are just my personal selection of a great variety of interesting talks you can attend at this year's EclipseCon. All in all it looks like a very diverse program and I'm looking forward to four interesting days full of great talks and discussions. I especially like the trend towards shorter presentations because I expect them to be better prepared and more focused.&lt;br /&gt;....ups, it's already 8:17 am (I've had a great breakfast in the meantime) and I am missing the e4-Rover Mars Challenge. I'll have to go now. See you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-2250983299037233157?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/2250983299037233157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=2250983299037233157&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2250983299037233157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2250983299037233157'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/03/eclipsecon-2010.html' title='EclipseCon 2010'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-8825158315995510380</id><published>2010-03-18T07:03:00.015+01:00</published><updated>2010-03-18T10:09:10.995+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Multiple dispatch (and poor men's patter matching) in Java</title><content type='html'>There are times where you do not want to or simply cannot add a certain aspect of behavior to your domain model's class hierarchy.&lt;br /&gt;Most applications are layered but share the same domain model (the times where people translate  state into layer-specific representations are hopefully gone). Sharing the same domain model classes between different layers is convenient and effective. However if you do that, your domain model tends to become a so called &lt;a href="http://martinfowler.com/bliki/AnemicDomainModel.html"&gt;anemic domain model&lt;/a&gt;, that is you do not add the behavior to your classes but hold it externally in order to keep the domain model layer independent. This ensures that your domain model only contains code which belongs to the domain and not to a technical layer. That's ok because you do not want to have UI-specific or database-specific code in your domain model if you pass it through all layers.&lt;br /&gt;&lt;br /&gt;The problem is that you cannot leverage Java's polymorphism anymore. As a result you either write lengthy if-else cascades in order to dispatch between different types or you use the visitor pattern, which is some kind of external polymorphism support. Well actually the old visitor pattern is not that much external but very invasive. You have to prepare your domain model to be able to accept visitors. That's not always possible and also a lot of work.&lt;br /&gt;&lt;br /&gt;Other languages support features to solve this problem. One is &lt;a href="http://en.wikipedia.org/wiki/Pattern_matching"&gt;pattern matching&lt;/a&gt; as known from functional languages which also has &lt;a href="http://www.scala-lang.org/node/120"&gt;made its way to object oriented languages&lt;/a&gt;. It's nice and powerful but not available in Java. :-(&lt;br /&gt;Another feature is &lt;a href="http://en.wikipedia.org/wiki/Multiple_dispatch"&gt;"multiple dispatch"&lt;/a&gt;. Languages supporting multiple dispatch (aka "multimethod") decide which method to invoke based on the actual runtime type of the passed arguments. Java in contrast links the method at compile time based on the static types.&lt;br /&gt;&lt;br /&gt;This is why in Java the following would print "Hello Fruit":&lt;br /&gt;&lt;pre&gt;print((Fruit) new Banana());&lt;br /&gt;&lt;br /&gt;static void print(Fruit f) {&lt;br /&gt; sysout("Hello Fruit");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;static void print(Banana b) {&lt;br /&gt; sysout("Hello Banana");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;If Java would support multiple dispatch it would print "Hello Banana", because at runtime the passed argument is an instance of Banana.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://www.eclipse.org/Xtext"&gt;Xtext&lt;/a&gt; we have "added" multiple dispatch to Java (we call it polymorphic dispatch). For instance a label provider is implemented like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class MyLabelProvider extends AbstractDeclarativeLabelProvider {&lt;br /&gt;&lt;br /&gt;String text(Banana b) {&lt;br /&gt;return "yellow fruit";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;String text(Apple b) {&lt;br /&gt;return "keeps the doctor away";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;The framework just calls ILabelProvider.getText(Object element) and the implementation of this method dispatches to the best matching label(Object) method. So if you are interested how it works, have a look at the &lt;a href="http://tinyurl.com/PolymorphicDispatcher"&gt;PolymorphicDispatcher&lt;/a&gt; class. Other examples where we use this technique are validation, scoping, qualified name provider, content assist, outline view, etc.&lt;br /&gt;&lt;br /&gt;This stuff is very useful for defining such kinds of APIs because it allows us to define nice defaults while the user can add specific behavior just by adding the corresponding methods.&lt;br /&gt;&lt;br /&gt;But what if you are in the middle of some implementation and only need to make some decisions based on the type? Write code like this?&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Fruit fruit = new Banana();&lt;br /&gt;String result=null;&lt;br /&gt;&lt;br /&gt;if (fruit instanceof Banana) {&lt;br /&gt;  Banana b = (Banana) fruit;&lt;br /&gt;  result =  // do stuff with b;&lt;br /&gt;&lt;br /&gt;} else if (fruit instanceof Apple) {&lt;br /&gt;  Apple a = (Apple) fruit;&lt;br /&gt;  result = // do stuff with a;&lt;br /&gt;&lt;br /&gt;} else if (fruit instanceof Peach) {&lt;br /&gt;  Peach p = (Peach) fruit;&lt;br /&gt;  result = // do stuff with p;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;System.out.println(result);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.antiifcampaign.com/"&gt;You might get into trouble with these guys.&lt;/a&gt;&lt;br /&gt;How about this one?:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;System.out.println(&lt;br /&gt;new Match() {&lt;br /&gt;&lt;br /&gt;  String is(Banana b) {&lt;br /&gt;    return // do stuff with b;&lt;br /&gt;  }  &lt;br /&gt;&lt;br /&gt;  String is(Apple a) {&lt;br /&gt;    return // do stuff with a;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  String is(Peach p) {&lt;br /&gt;    return // do stuff with p;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}.apply(new Banana()));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It's only a bit shorter, but I like it much better because it is functional and more declarative. That is I don't have to declare variables and do side-effects within the different if statements. Also this works for multiple parameters as well.&lt;br /&gt;&lt;br /&gt;P.S.: If your domain model is implemented in EMF you get a so called Switch-class generated, which acts similar. So if you only dispatch within that hierarchy and you only need one argument, this works great as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-8825158315995510380?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/8825158315995510380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=8825158315995510380&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8825158315995510380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8825158315995510380'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/03/multiple-dispatch-and-poor-mens-patter.html' title='Multiple dispatch (and poor men&apos;s patter matching) in Java'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-4624911880349934983</id><published>2010-02-09T08:33:00.003+01:00</published><updated>2010-02-09T09:12:46.705+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='helios'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext Helios M5 is out!</title><content type='html'>Last Friday we (eclipse.org) officially released the M5 of the Helios release train. Xtext, being part of the train, got a couple of &lt;a href="http://www.eclipse.org/Xtext/documentation/0_8_0/new_and_noteworthy.php"&gt;new &amp;amp; noteworthy features&lt;/a&gt; we (Xtext team) are very happy (and sort of proud) with. &lt;br /&gt;&lt;br /&gt;I'm personally most excited about the &lt;a href="http://blog.efftinge.de/2010/01/xtexts-new-builder-infrastructure.html"&gt;new builder infrastructure&lt;/a&gt;, which allows to revalidate, index and build any kind of EMF resource. Some of the new features we added in M5 demonstrate the huge potential of that builder infrastructure. My favorite is the open element dialog, which I use frequently. Besides that we also added a couple of other features like, auto editing, bracket matching and styled label providers. Our &lt;a href="http://www.eclipse.org/Xtext/documentation/0_8_0/new_and_noteworthy.php"&gt;new &amp;amp; noteworthy document&lt;/a&gt; shows the most important feature additions using screenshots and small screencasts (we hope you like it).&lt;br /&gt;&lt;br /&gt;During M6 we will &lt;a href="http://tinyurl.com/Xtext-helio-m6"&gt;add some features as well as doing the regular bug fixes&lt;/a&gt;. Also we will do a major rename refactoring (actually it is already done), so you might face some migration efforts when you upgrade. For M7 we are going to focus on performance improvements and further bug fixing. Documentation, tutorials and migration guide will be worked on during the RC phase. In parallel we're working on a new general purpose language developed in Xtext. It is meant to be some kind of library. Everyone should be able to reuse, adapt and extend that language within her own Xtext languages. That language won't be released with Helios, but as it is open-source you might be able to check it out by that time.&lt;br /&gt;&lt;br /&gt;Btw.:&lt;br /&gt;Have you already voted for the Eclipse Community Awards?&lt;br /&gt;No? &lt;a href="http://www.eclipse.org/org/foundation/eclipseawards/index.php"&gt;Go here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-4624911880349934983?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/4624911880349934983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=4624911880349934983&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4624911880349934983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4624911880349934983'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/02/xtext-helios-m5-is-out.html' title='Xtext Helios M5 is out!'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-6149018498203526112</id><published>2010-01-05T10:00:00.009+01:00</published><updated>2010-01-05T14:57:35.981+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='index'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext's new builder infrastructure</title><content type='html'>The M4 of the current development stream of Xtext (Helios) finally contains the long awaited builder infrastructure. This topic turned out to be a very complex beast, and although we already took two attempts the last one took us about six weeks of very intensive work. But we love the result :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;What is this builder infrastructure for?&lt;/span&gt;&lt;br /&gt;I'd &lt;a href="http://blog.efftinge.de/2009/01/xtext-scopes-and-emf-index.html"&gt;already&lt;/a&gt; &lt;a href="http://blog.efftinge.de/2009/07/xtext-scopes-and-emf-index-in-action.html"&gt;blogged&lt;/a&gt; about the idea of name space based linking.&lt;br /&gt;The builder infrastructure collects lightweight descriptions of all Xtext resources in the workspace. The linking can then use this information. In addition we use this information to compute the transitive hull of affected resources.&lt;br /&gt;&lt;br /&gt;Also the builder takes care of validation and will support an extension point where users can hook in code generators and the like. Other features where we'll make use of the new information includes: more sophisticated searches, call graphs, and of course &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=282683"&gt;find reference&lt;/a&gt; actions. A generic rename refactoring is also something we want to start working on as soon as possible.&lt;br /&gt;&lt;br /&gt;The documentation will be updated during the RC phase.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.eclipse.org/Xtext/documentation/0_8_0/new_and_noteworthy.php#M4"&gt;New &amp;amp; Noteworthy page&lt;/a&gt; contains a short screen casts showing the builder in action:&lt;br /&gt;&lt;br /&gt;&lt;object height="517" width="637"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8235494&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=8235494&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="345" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Dirty State aware editing&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note, that state in the builder is shadowed by any dirty editor state:&lt;br /&gt;&lt;br /&gt;&lt;object height="517" width="637"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8235536&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1"&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=8235536&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=0&amp;amp;show_portrait=0&amp;amp;color=00ADEF&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="353" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;What about the EMF Index?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Wasn't the EMF Index intended to do this?&lt;br /&gt;It took us some time to find out what Xtext really needs, and in the end we learned that there are a couple of  important specialties, like the lazy linking or the linking by name. We didn't want to add those concepts to the EMF index. Therefore we started out to solve the actual problem in Xtext first and later see if the requirements fit and can be handled by the EMF Index project. As a result we came up with a very small interface which can be implemented to use the EMF Index as soon as it supports the needed use cases and is mature enough. Most of the stuff we did is Xtext related, the code which might be replaced by the EMF Index is just a couple of lines.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-6149018498203526112?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/6149018498203526112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=6149018498203526112&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6149018498203526112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6149018498203526112'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2010/01/xtexts-new-builder-infrastructure.html' title='Xtext&apos;s new builder infrastructure'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-9021692230493678539</id><published>2009-11-25T11:08:00.004+01:00</published><updated>2009-11-25T22:12:12.633+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><title type='text'>RE: The Hidden Costs of Domain-Specific Languages</title><content type='html'>Today, &lt;a href="http://twitter.com/JohanDenHaan/status/6045987865"&gt;Johan Den Haan&lt;/a&gt; pointed me to a &lt;a href="http://ruicurado.com/2009/11/25/the-hidden-costs-of-domain-specific-languages"&gt;post about "Hidden Costs" of DSLs&lt;/a&gt; via twitter.&lt;br /&gt;The post starts with the following statement:&lt;br /&gt;&lt;blockquote style="font-style: italic; font-weight: bold;"&gt;While I am a big fan of Domain-Specific Modeling, I am openly not in favor of Domain-Specific Languages.&lt;/blockquote&gt;... which leaves me puzzled. I'm pretty sure that the DSM guys call their abstractions DSLs as well.&lt;br /&gt;Anyway, the post itself is not particularly interesting, but at the end of it there are a couple of questions about DSLs. This sort of questions which I've heard often and which contain a lot of miss- and preconceptions. Thought it was a good opportunity to answer them.&lt;br /&gt;&lt;br /&gt;So here are the questions and my answers:&lt;br /&gt;&lt;blockquote style="font-style: italic; font-weight: bold;"&gt;If we take so much time to master a general purpose language, should we invest a comparable amount of time in limited-use languages (i.e. DSL)? &lt;/blockquote&gt;No, you shouldn't and you won't. DSLs are much easier to learn, since they are limited and focused. The important thing is that you have to understand the domain. But that is necessary in any case, no matter if you translate everything to a general purpose language or write it down like it is meant to be (i.e. using a DSL). If you know the domain very well, but are not able to grasp the DSL, than the DSL might not be that good.&lt;br /&gt;&lt;blockquote style="font-style: italic; font-weight: bold;"&gt;How can we get support for a DSL, apart from its own creators? &lt;/blockquote&gt;How can you get support for an API, apart from its creator? Well, by looking at the code or any existing documentation, or by asking any other users. In many aspects DSLs are comparable to libraries or frameworks.&lt;br /&gt;&lt;blockquote style="font-style: italic; font-weight: bold;"&gt;Where’s community support? &lt;/blockquote&gt;It depends on whether it is a widely used DSL (i.e. there is a community) or one you use and have defined in your one-man project. For the DSLs used in Ruby on Rails there's much community support, for instance. Same for the DSLs we have in Xtext.&lt;br /&gt;Where's the community support for your homegrown libraries?&lt;br /&gt;&lt;blockquote style="font-style: italic; font-weight: bold;"&gt;What happens after the departure of the language’s creator? &lt;/blockquote&gt;It is like with any other artifact in your software system: A DSL definition needs to be clean, understandable and maintainable. If you know that an important team member is leaving the project, make sure she's not taking any exclusive knowledge with her. That is she should coach other people before she lefts.&lt;br /&gt;&lt;blockquote style="font-style: italic; font-weight: bold;"&gt;What’s BNF? Do I need it?&lt;/blockquote&gt;see http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form :-)&lt;br /&gt;&lt;blockquote style="font-style: italic; font-weight: bold;"&gt;DSL critics say really useful DSLs are hard and expensive to create. DSL supporters answer that DSLs are not designed, they evolve. Well, won’t any of those “evolutionary steps” risk breaking the entire development based on that DSL, much like a broken app build? &lt;/blockquote&gt; Useful DSLs can be very simple and at the same time a very complex DSL can be absolutely useless. It's not the complexity of a DSL, which makes it useful, but whether how good it is to solve the problem at hand.&lt;a href="http://en.wikipedia.org/wiki/KISS_principle"&gt;  KISS&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/YAGNI"&gt;YAGNI&lt;/a&gt; are important principles here as well.&lt;br /&gt;When defining concepts and abstractions it is key to find a good compromise between simplicity (abstraction) and re-usability. The simpler a DSL and the higher its potential for reuse the better. You're hitting a sweet spot, then. You start leaving that sweet spot as soon as you add concepts to the DSL which are only used by a small subset of the users. Often it is better to have two simple DSLs in two projects, than putting everything into one big DSL.&lt;br /&gt;&lt;br /&gt;Back to the question: I don't think that evolution and design is mutual exclusive. Don't everybody design software systems incrementally these days.&lt;br /&gt;Changing a textual DSL is not a big problem in practice. At least not as long as you have a decent test suite (which you should have no matter if you use DSLs or not). However, managing compatibility and versioning can become quite complicated, but again it's the same as with APIs.&lt;br /&gt;&lt;blockquote style="font-style: italic; font-weight: bold;"&gt;Will the evolution in the language be severe enough to trash what has been done so far?&lt;/blockquote&gt;You can shoot your foot, if you want. But you don't need a DSL to do so.&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;blockquote style="font-style: italic; font-weight: bold;"&gt;Can you imagine yourself developing a complex C++ software system while C++ itself was still being designed and developed?&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;Can you imagine writing a complex C++ software system while the standard libraries are still being designed and developed?&lt;br /&gt;I can imagine, but I am not keen on doing that. That is why we have things like versioning and that is also why people think about compatibility when enhancing public programming interfaces. Such interfaces can be a method signature, but it can also be a syntax of a language. It doesn't matter. If it breaks it breaks. And the designer has to be explicit about the contract of that interface as well as its life cycle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-9021692230493678539?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/9021692230493678539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=9021692230493678539&amp;isPopup=true' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/9021692230493678539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/9021692230493678539'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/11/re-hidden-costs-of-domain-specific.html' title='RE: The Hidden Costs of Domain-Specific Languages'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-456778769964834351</id><published>2009-11-24T10:19:00.011+01:00</published><updated>2009-11-24T12:05:58.495+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext - Using existing Ecore models</title><content type='html'>Maybe it's because it was not possible in the old oAW Xtext or because the wizard suggests a grammar which makes use of the "generated Ecore model"-feature. But somehow some people tend to think that you cannot use existing Ecore models with Xtext. YOU CAN!&lt;br /&gt;&lt;br /&gt;The feature is &lt;a href="http://www.eclipse.org/Xtext/documentation/0_7_2/xtext.html#grammarImport"&gt;described in the documentation&lt;/a&gt;, but maybe it got too few words (Which is not because we don't use it and don't want you to use it, but because it's so simple).&lt;br /&gt;&lt;br /&gt;In the following I want to show you how to do this. You'll see that it is relatively straight forward.&lt;br /&gt;Let's assume you have an existing Ecore model, describing a library of books (sounds familiar?;-)):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ii_da0jTxAY/Swu062bJuSI/AAAAAAAAANo/FVvz9xJXa4k/s1600/Picture+23.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://2.bp.blogspot.com/_Ii_da0jTxAY/Swu062bJuSI/AAAAAAAAANo/FVvz9xJXa4k/s400/Picture+23.png" alt="" id="BLOGGER_PHOTO_ID_5407614700723222818" border="0" /&gt;&lt;/a&gt;In order to create a textual syntax with Xtext you only need to create an Xtext project and change the proposed grammar to something like this :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ii_da0jTxAY/Swu1fAGiPCI/AAAAAAAAANw/SMNEP6qreWQ/s1600/Picture+24.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://4.bp.blogspot.com/_Ii_da0jTxAY/Swu1fAGiPCI/AAAAAAAAANw/SMNEP6qreWQ/s400/Picture+24.png" alt="" id="BLOGGER_PHOTO_ID_5407615321796394018" border="0" /&gt;&lt;/a&gt;So if you want to reuse an existing ecore model, it is just a matter of switching from a "generated Ecore"-statement to an "import"-statement. Note that as soon as you do this, the grammar is statically analyzed and you'll get all kinds of compiler errors and warnings for missing attributes and classes in the imported Ecore models (you can import multiple ecore models, of course).&lt;br /&gt;&lt;br /&gt;Next, you run Xtext's generator and you'll get an EMF Resource writing and reading instances of your Ecore model to the textual syntax defined in aboves Xtext grammar.&lt;br /&gt;In addition you'll get an editor for your new language :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ii_da0jTxAY/Swu2RzHJxkI/AAAAAAAAAN4/g5gZwXBhuXs/s1600/Picture+20.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://2.bp.blogspot.com/_Ii_da0jTxAY/Swu2RzHJxkI/AAAAAAAAAN4/g5gZwXBhuXs/s400/Picture+20.png" alt="" id="BLOGGER_PHOTO_ID_5407616194482652738" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;You can, of course, still use any EMF-based editor, since it's just an EMF model:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ii_da0jTxAY/Swu22VZYEoI/AAAAAAAAAOA/5BINDCj45Nk/s1600/Picture+22.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_Ii_da0jTxAY/Swu22VZYEoI/AAAAAAAAAOA/5BINDCj45Nk/s400/Picture+22.png" alt="" id="BLOGGER_PHOTO_ID_5407616822161183362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Note, that you cannot only import multiple Ecore models but can even mix generated and imported Ecore models in the same grammar.&lt;br /&gt;&lt;br /&gt;To sum it up: The feature we have in Xtext to derive an Ecore model from the grammar description, is a very convenient &lt;span style="font-weight: bold;"&gt;option&lt;/span&gt; to get you started. If you have one or more existing Ecore models, you won't want and need to use it. But if you start developing a new language this feature speeds up your turn-arounds dramatically.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-456778769964834351?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/456778769964834351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=456778769964834351&amp;isPopup=true' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/456778769964834351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/456778769964834351'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/11/xtext-using-existing-ecore-models.html' title='Xtext - Using existing Ecore models'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ii_da0jTxAY/Swu062bJuSI/AAAAAAAAANo/FVvz9xJXa4k/s72-c/Picture+23.png' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3181933089302874735</id><published>2009-11-13T15:00:00.014+01:00</published><updated>2009-11-14T07:31:09.414+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='presentations'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext - Tour Dates</title><content type='html'>&lt;p&gt;I just realized that there's an invasion of Xtext presentations and demos about to overrun the world during the next couple of weeks. And all of them are free of charge!&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Date&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Country&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;City&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Title&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Presenter&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/16&lt;/td&gt;&lt;td&gt;USA&lt;/td&gt;&lt;td&gt;New York&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_Modeling_Day#New_York_City"&gt;Modeling Day: Building DSLs with Xtext&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Heiko Behrens&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/16&lt;/td&gt;&lt;td&gt;USA&lt;/td&gt;&lt;td&gt;New York&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_Modeling_Day#New_York_City"&gt;Modeling Day: Converging Textual and Graphical Editors&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Moritz Eysholdt&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/17&lt;/td&gt;&lt;td&gt;France&lt;/td&gt;&lt;td&gt;Paris&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2009/Paris"&gt;Demo Camp: Building DSLs with Xtext&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Sebastian Zarnekow&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/17&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;td&gt;Leipzig&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2009/Leipzig"&gt;Demo Camp: Und heute generier' ich&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Alexander Nittka&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/18&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;td&gt;Hamburg&lt;/td&gt;&lt;td&gt;&lt;a href="http://www.jughh.org/pages/viewpage.action?pageId=4325396"&gt;Java User Group: Building DSLs with Xtext&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Sven Efftinge, Sebastian Zarnekow&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/18&lt;/td&gt;&lt;td&gt;Canada&lt;/td&gt;&lt;td&gt;Toronto&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_Modeling_Day#Toronto"&gt;Modeling Day: Building DSLs with Xtext&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Heiko Behrens&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/18&lt;/td&gt;&lt;td&gt;Canada&lt;/td&gt;&lt;td&gt;Toronto&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_Modeling_Day#Toronto"&gt;Modeling Day: Converging Textual and Graphical Editors&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Moritz Eysholdt&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/23&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;td&gt;Berlin&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2009/Berlin"&gt;Demo Camp: Building DSLs with Xtext&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Peter Friese&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/26&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;td&gt;Frankfurt&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2009/Frankfurt"&gt;Demo Camp: Using Xtext in a large scale modeling and implementation project&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Nicolai Busse&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/26&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;td&gt;Stuttgart&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2009/Stuttgart"&gt;Demo Camp: Textual DSLs with Eclipse Xtext (and a little bit code code generation with Xpand)&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Markus Völter&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/11/30&lt;/td&gt;&lt;td&gt;Austria&lt;/td&gt;&lt;td&gt;Vienna&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2009/Vienna"&gt;Demo Camp: Xtext&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Michael Clay&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/12/04&lt;/td&gt;&lt;td&gt;Germany&lt;/td&gt;&lt;td&gt;Hamburg&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2009/Hamburg"&gt;Demo Camp: Combining graphics and text in model editors&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Jan Köhnlein&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2009/12/10&lt;/td&gt;&lt;td&gt;Italy&lt;/td&gt;&lt;td&gt;Florence&lt;/td&gt;&lt;td&gt;&lt;a href="http://wiki.eclipse.org/Eclipse_DemoCamps_November_2009/Florence"&gt;Demo Camp: Xtext, a Textual Modeling Framework &lt;/a&gt;&lt;/td&gt;&lt;td&gt;Francesco Guidieri&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3181933089302874735?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3181933089302874735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3181933089302874735&amp;isPopup=true' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3181933089302874735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3181933089302874735'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/11/xtext-tour-dates.html' title='Xtext - Tour Dates'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7646231212825894582</id><published>2009-11-12T16:22:00.014+01:00</published><updated>2010-05-31T18:43:37.253+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse summit'/><category scheme='http://www.blogger.com/atom/ns#' term='DSLs'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext in the automotive industry</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ii_da0jTxAY/Svw04lZ900I/AAAAAAAAANA/XSBSb3086sQ/s1600-h/P90053936.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 267px;" src="http://2.bp.blogspot.com/_Ii_da0jTxAY/Svw04lZ900I/AAAAAAAAANA/XSBSb3086sQ/s400/P90053936.jpg" alt="" id="BLOGGER_PHOTO_ID_5403251799656092482" border="0" /&gt;&lt;/a&gt;At this year's &lt;a href="http://www.blogger.com/www.eclipsecon.org/summiteurope2009/"&gt;Eclipse Summit Europe&lt;/a&gt; there was a &lt;a href="http://www.eclipsecon.org/summiteurope2009/sessions?id=988"&gt;very nice Xtext-related talk&lt;/a&gt; given by &lt;a href="https://www.xing.com/profile/Sebastian_Benz5"&gt;Sebastian Benz&lt;/a&gt; who is working at BMW Car IT.&lt;br /&gt;The talk was about how they used &lt;a href="http://www.xtext.org/"&gt;Xtext&lt;/a&gt; in order to develop a textual syntax and corresponding IDE for the &lt;a href="http://www.autosar.org/"&gt;AUTOSAR&lt;/a&gt; standard. The name of the project is ARText and it is freely available to all AUTOSAR members as part of the &lt;a href="http://www.artop.org/"&gt;Artop project&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One of the biggest challenges when implementing the AUTOSAR standard is to create scalable solutions. AUTOSAR projects might become very, very big and in order to work with such huge projects the tools need to perform very well. In the modeling world people usually strife for repository-based (i.e. database-based) solutions as soon as projects get really big. However, the folks at BMW Car IT wanted to develop AUTOSAR projects in a traditional text-based manner and given all the good experiences with tools like JDT or IntelliJ, it's clear that text-based IDEs can scale very well.&lt;br /&gt;&lt;br /&gt;In order to implement the language they first had tried the old Xtext version from oAW, which was way too slow. Then, later, when the new &lt;a href="http://www.eclipse.org/Xtext"&gt;TMF Xtext&lt;/a&gt; came around they gave it another try and saw that the performance had been improved significantly. Sebastian showed the following slide in his talk:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ii_da0jTxAY/SwZahStRobI/AAAAAAAAANY/BBnEHjCb9Ho/s1600/performance.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://3.bp.blogspot.com/_Ii_da0jTxAY/SwZahStRobI/AAAAAAAAANY/BBnEHjCb9Ho/s400/performance.jpg" alt="" id="BLOGGER_PHOTO_ID_5406107930708779442" border="0" /&gt;&lt;/a&gt;After that he explained how they have solved a couple of other problems, such as supporting different releases of the standard or making the language extendable. All the solutions looked very nice, they must have some very skilled people at BMW Car IT.&lt;br /&gt;&lt;br /&gt;He compared working with the state-of-the-art commercial graphical modeling tool (What's the name of it?) and the ARText IDE and found that the use of ARText reduces development time by about 40%.&lt;br /&gt;&lt;br /&gt;In the end there was this nice summary slide I don't want to withhold:&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ii_da0jTxAY/SwZa6Up44GI/AAAAAAAAANg/FkPqBJSRRhI/s1600/summary.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 283px;" src="http://2.bp.blogspot.com/_Ii_da0jTxAY/SwZa6Up44GI/AAAAAAAAANg/FkPqBJSRRhI/s400/summary.jpg" alt="" id="BLOGGER_PHOTO_ID_5406108360728174690" border="0" /&gt;&lt;/a&gt;It was a very nice talk and of course a pleasure to see that Xtext is used by such smart people in such an interesting environment. And even better it seems that they've had as much fun using Xtext as we had and still have when developing (and using) it. :-)&lt;br /&gt;&lt;br /&gt;Btw.: If you have &lt;a href="http://blog.efftinge.de/2009/09/xtext-in-wind-energy.html"&gt;other interesting applications&lt;/a&gt; of Xtext or Eclipse Modeling in general, please contact me. (Even if you don't want me to blog about it ;-))&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Edited: Sebastian has recently posted a screencast showing ARText in action:&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;object width="600" height="450"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12080038&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=12080038&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;&lt;a href="http://vimeo.com/12080038"&gt;ARText in Action!&lt;/a&gt; from &lt;a href="http://vimeo.com/user3912163"&gt;Sebastian Benz&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7646231212825894582?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7646231212825894582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7646231212825894582&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7646231212825894582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7646231212825894582'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/11/xtext-in-automotive-industry.html' title='Xtext in the automotive industry'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ii_da0jTxAY/Svw04lZ900I/AAAAAAAAANA/XSBSb3086sQ/s72-c/P90053936.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3094905624098819284</id><published>2009-10-29T08:03:00.004+01:00</published><updated>2009-10-29T08:52:24.309+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse summit'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Eclipse Summit Europe 2009</title><content type='html'>This year's &lt;a href="http://www.eclipsecon.org/summiteurope2009/"&gt;Eclipse Summit Europe&lt;/a&gt; is again a very nice happening. It's so important to meet all the people you're chatting and mailing with in person.&lt;br /&gt;Yesterday, &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; and I had the chance to demo some of the &lt;a href="http://www.eclipsecon.org/summiteurope2009/sessions?id=906"&gt;new Xtext features&lt;/a&gt; we've been working on in the Helios train. It was much fun and we got very positive feedback for both the talk and (more important) the features. We'll post the demos to our blogs very soon.&lt;br /&gt;&lt;br /&gt;I'm especially excited about how well Xtext is accepted within the Eclipse Community. Yesterday there were at least three talks about other projects which make use of Xtext:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The b3 guys are working on a DSL to describe builds&lt;/li&gt;&lt;li&gt;In the new EMF Search implementation the query language is implemented with Xtext&lt;/li&gt;&lt;li&gt;The Relax NG tools are as well implemented in Xtext&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;How about e4? Designing UIs works good in a WYSIWYG style, but there are scenarios where you want to program parts of it. In addition storing the UI descriptions in XMI is not necessarily the best option. You cannot read it and it's very hard to diff and merge them. I can imagine that a programmer friendly textual syntax might please the modeling skeptics a bit. We can still use a WYSIWYS editor on top.&lt;br /&gt;&lt;br /&gt;Implementing the CSS functionality with Xtext could be another opportunity to get more for less. To find out, I'll have to attend Kai's talk about the&lt;a href="http://www.eclipsecon.org/summiteurope2009/sessions?id=850"&gt; CSS customization in e4&lt;/a&gt; this morning.&lt;br /&gt;There are lots of other interesting sessions to attend today. Unfortunately I have to decide between listening to&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Sebastian Benz (BMW) who talks about how &lt;a href="http://www.eclipsecon.org/summiteurope2009/sessions?id=988"&gt;Xtext is applied in the automotive industry&lt;/a&gt; (AUTOSAR) and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://koehnlein.blogspot.com/"&gt;Jan Koehnlein&lt;/a&gt; and Jos Warmer who talk about how to &lt;a href="http://www.eclipsecon.org/summiteurope2009/sessions?id=957"&gt;combine Xtext and GMF&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;because they are both scheduled for 14:40.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3094905624098819284?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3094905624098819284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3094905624098819284&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3094905624098819284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3094905624098819284'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/10/eclipse-summit-europe-2009.html' title='Eclipse Summit Europe 2009'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7047973104660094619</id><published>2009-10-05T09:15:00.010+01:00</published><updated>2009-10-05T13:06:13.252+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='helios'/><category scheme='http://www.blogger.com/atom/ns#' term='xpand'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Helios M2 of Xtext, Xpand and MWE</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ii_da0jTxAY/Ssm57_fdhgI/AAAAAAAAAMo/f5KvX6s7YfM/s1600-h/Xtext-Logo-Kreide-sw.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 403px; height: 232px;" src="http://4.bp.blogspot.com/_Ii_da0jTxAY/Ssm57_fdhgI/AAAAAAAAAMo/f5KvX6s7YfM/s400/Xtext-Logo-Kreide-sw.jpg" alt="" id="BLOGGER_PHOTO_ID_5389042869432321538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The M2 builds are promoted (with Athena!). And here's the promised update on what we've already done for the M2 of Helios.&lt;br /&gt;&lt;br /&gt;You can find the details in the bugzilla links. Here I'll only mention new big features.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Xtext (&lt;/span&gt;&lt;a style="font-weight: bold;" href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;amp;classification=Modeling&amp;amp;product=TMF&amp;amp;component=Xtext&amp;amp;target_milestone=M2"&gt;fixed bugzillas&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;Quickfix Support&lt;/span&gt;&lt;br /&gt;It is now possible to register quickfixes for validation rules. The feature is documented as part of the &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.tmf/org.eclipse.xtext/plugins/org.eclipse.xtext.doc/html/xtext.html?root=Modeling_Project&amp;amp;view=co#validation"&gt;validation section&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;JVM - EMF bridge&lt;/span&gt;&lt;br /&gt;This one allows referencing Java elements from EMF models, as it is desired in most DSLs which are used in a JVM context. We already wrote a small MWE prototype (without XML syntax), which makes use of this new component. It took us a day to come up with a neat MWE editor. Our upcoming base language will be based on top of this type system.&lt;br /&gt;&lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; is going to blog about the details soon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;EMF Index integration&lt;/span&gt;&lt;br /&gt;We made some good progress with regards to the index integration. However, as it was not finished by M2 and the changes were too big we decided to hold it back. It will be shipped with M3 and I will write a separate blog about it soon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Xpand (&lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;amp;classification=Modeling&amp;amp;product=M2T&amp;amp;component=Xpand&amp;amp;target_milestone=M2"&gt;fixed bugzillas&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Incremental Generation&lt;/span&gt;&lt;br /&gt;There's support for incremental generation now. It leverages EMFCompare to find out what has changed and only triggers those parts in a generator which could possibly be affected by the changes. In typical scenarios where one has big models and only very little changes between the builds this can yield a significant performance boost. The implementation is there and the unit tests should be a good starting point (org.eclipse.xpand.incremental.tests). Documentation and an example workflow will follow.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Xpand Profiler&lt;/span&gt;&lt;br /&gt;If you want to improve the overall execution performance of your generator, the new Xpand profiler comes in handy. Heiko already &lt;a href="http://www.heikobehrens.net/2009/09/25/profiler-for-xpandxtendcheck/"&gt;blogged about it&lt;/a&gt;. There's also &lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.m2t/org.eclipse.xpand/doc/org.eclipse.xpand.doc/html/xpand_reference.html?root=Modeling_Project&amp;amp;view=co#r10_profiler"&gt;documentation&lt;/a&gt; available.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MWE (&lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;amp;classification=Modeling&amp;amp;product=EMFT&amp;amp;component=MWE&amp;amp;target_milestone=M2"&gt;fixed bugzillas&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For MWE only some bugs were fixed. The new MWE syntax we're working on has not yet been checked in. It is primarily meant as a test language for the Java EMF bridge. In order to replace the current parser and infrastructure we need to implement an XML based reader (for backward compatibility) and of course the interpreter needs to work on EMF models. This is not planned for M3 as we have little resources and want to focus on the EMF Index integration as well as the Java EMF bridge. But I'm pretty sure we'll do this during one of the next milestones.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Disclaimer: We encourage &lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;everybody to use and test our milestones. It really helps to get as much feedback as possible. However, note that every API we introduce between M1 to M5 might be changed or even be removed completely in future milestones. Also milestones are usually not as stable as releases.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you want to test the milestones just take the composite updates site from itemis:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;http://download.itemis.com/updates/milestones/&lt;br /&gt;&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;heck the Antlr feature ("Xtext Antlr Support 0.8.0 M2" -&gt; "Xtext Antlr Feature") and p2 will do the rest.&lt;br /&gt;&lt;br /&gt;Just in case you're interested in what is planned for M3. Here are the bugzilla queries:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;amp;classification=Modeling&amp;amp;product=TMF&amp;amp;component=Xtext&amp;amp;field0-0-0=flagtypes.name&amp;amp;type0-0-0=substring&amp;amp;value0-0-0=helios&amp;amp;target_milestone=M3"&gt;Xtext M3 bugzillas&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;amp;classification=Modeling&amp;amp;product=M2T&amp;amp;component=Xpand&amp;amp;field0-0-0=flagtypes.name&amp;amp;type0-0-0=substring&amp;amp;value0-0-0=helios&amp;amp;target_milestone=M3"&gt;Xpand M3 bugzillas&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;amp;classification=Modeling&amp;amp;product=EMFT&amp;amp;component=MWE&amp;amp;field0-0-0=flagtypes.name&amp;amp;type0-0-0=substring&amp;amp;value0-0-0=helios&amp;amp;target_milestone=M3"&gt;MWE M3 bugzillas&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7047973104660094619?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7047973104660094619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7047973104660094619&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7047973104660094619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7047973104660094619'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/10/helios-m2-of-xtext-xpand-and-mwe.html' title='Helios M2 of Xtext, Xpand and MWE'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ii_da0jTxAY/Ssm57_fdhgI/AAAAAAAAAMo/f5KvX6s7YfM/s72-c/Xtext-Logo-Kreide-sw.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-6899666947437229076</id><published>2009-09-15T13:21:00.005+01:00</published><updated>2009-09-18T14:22:07.037+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='case study'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext in wind energy</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ii_da0jTxAY/SrN_Ou0yi4I/AAAAAAAAAMQ/AXyApNlk0Nc/s1600-h/IWES_OneWind.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 301px;" src="http://2.bp.blogspot.com/_Ii_da0jTxAY/SrN_Ou0yi4I/AAAAAAAAAMQ/AXyApNlk0Nc/s400/IWES_OneWind.jpg" alt="" id="BLOGGER_PHOTO_ID_5382785870702218114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've visited the &lt;a href="http://www.iwes.fraunhofer.de/"&gt;Fraunhofer IWES&lt;/a&gt; in Bremerhaven this week. Fraunhofer is a famous german research institute and the IWES department focusses on wind energy. In their current research project they make heavy use of &lt;a href="http://www.xtext.org"&gt;Xtext&lt;/a&gt; and other &lt;a href="http://www.eclipse.org/modeling/"&gt;Eclipse Modeling&lt;/a&gt; technologies.&lt;br /&gt;&lt;br /&gt;The project is about specifying and connecting the different components a wind turbine is made of and simulating real time scenarios using such models.&lt;br /&gt;The problem they want to solve is that today's computers are much too slow to compute structural, fluid, or thermo dynamics of detailed models in detailed surroundings in a reasonable time. Also the components are usually tested and simulated in isolation only.&lt;br /&gt;The general approach to face this is to reduce the level of detail in order to speed up computation. This has of course the drawback that the resulting data gets more imprecise. The goal of the research project is to dynamically change the level of detail for the different components during the simulation. This is modeled using a state machine.&lt;br /&gt;For instance if you want to simulate a storm in order to find out at what wind force a blade breaks you have to start with low wind force and increase it constantly. The system would allow to replace a lower detailed blade with a higher detailed one in certain scenarios. The engineer specifies in what circumstances detailed information is interesting and the system can use fast models with low details for the rest of the time. For instance one would want to replace a low-detailed blade with a high-detailed blade when the wind gets so strong that it is likely that the blade breaks.&lt;br /&gt;&lt;br /&gt;The other problem they have to solve is that there are many different tools (e.g. &lt;a href="http://www.modelica.org/"&gt;Modelica&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Nastran"&gt;NASTRAN&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/ANSYS"&gt;ANSYS&lt;/a&gt;) used to model and simulate the different components. Each of them have their strengths and weaknesses so the research team needs to find a universal way to reuse and interconnect all of these tools.&lt;br /&gt;&lt;br /&gt;To solve these two issues they have developed a DSL used to model the different components. From that description they generate representations for the &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ii_da0jTxAY/SrOAJlxCyAI/AAAAAAAAAMY/MJ4Ru3KwVr8/s1600-h/2385413733_1ee7b88ceb.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 299px;" src="http://2.bp.blogspot.com/_Ii_da0jTxAY/SrOAJlxCyAI/AAAAAAAAAMY/MJ4Ru3KwVr8/s400/2385413733_1ee7b88ceb.jpg" alt="" id="BLOGGER_PHOTO_ID_5382786881882867714" border="0" /&gt;&lt;/a&gt;different tools in different levels of detail. In addition they have developed Xtext implementations of the most interesting languages they use, that is &lt;a href="http://www.modelica.org/"&gt;Modelica&lt;/a&gt; (an object-oriented, equation based language), NASTRAN, and ANSYS.&lt;br /&gt;&lt;br /&gt;I want to mention that the Fraunhofer IWES are &lt;a href="http://www.iwes.fraunhofer.de/jobs/"&gt;looking for smart software engineers&lt;/a&gt;. So if you're interested in wind energy and Eclipse Modeling it might be a good fit. I haven't spent much time in Bremerhaven but on a first glance it looked much nicer than I thought.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-6899666947437229076?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/6899666947437229076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=6899666947437229076&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6899666947437229076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6899666947437229076'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/09/xtext-in-wind-energy.html' title='Xtext in wind energy'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ii_da0jTxAY/SrN_Ou0yi4I/AAAAAAAAAMQ/AXyApNlk0Nc/s72-c/IWES_OneWind.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1022866070154292872</id><published>2009-08-27T10:43:00.004+01:00</published><updated>2009-08-27T11:43:14.927+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='helios'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext - Road to Helios</title><content type='html'>After the Galileo release of Xtext we are now focussing on the next iteration. We've had a &lt;a href="http://wiki.eclipse.org/Xtext/Meetings"&gt;face-to-face meeting in Kiel&lt;/a&gt; and discussed the different ideas, our process and what the "themes" for our Helios development are.&lt;br /&gt;&lt;br /&gt;In this post I want to share our vision of how the road to Helios could! look like. I say 'could' because although we have a rough idea of where we want to go, we know from the past, that the actual road we go will slightly differ. That is things we find useful today might have become less important in six months. "Round And Round The Earth Is Turning" :-).&lt;br /&gt;I'll outline our visions and priorities along the four themes we identified for the Helios development period.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Theme I : Clean Code&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Our code base is already comparatively clean but we want it to be even cleaner. Cleanness in code means the following to us:&lt;br /&gt;&lt;br /&gt;DRY - Don't repeat yourself&lt;br /&gt;&lt;br /&gt;Every information should be kept in one place only. This is as everything I write not meant dogmatic. So, there are of course situations where it is more pragmatic to duplicate a piece of information.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;KISS - Keep it small and simple&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Solutions should only be as complicated as they need to be. Sometimes it is hard to understand for developers that they have solved a problem but we do not want to check it in in that way. That is of course not because we do not appreciate the effort. It is because we think it is too complex, and we do not want to add superfluous complexity to the code base. Of course opinions of what is superfluous and what is not might as well differ :-).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Keep it testable and have tests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Code needs to be testable. If it is not testable unit testing is either not possible or it is too complicated and therefore is fragile and complex. We want to have sufficient unit tests. Sufficient is again a weak statement. Usually one has too little tests, so having too many tests is very seldom the case. Mature and published code can't have too many tests, as long as each test covers a different case. Note that the code cleanness of unit tests is as important as the code quality of the production code. When we fix bugs we usually do test first. That is we write a failing test reproducing the reported miss behavior and fix it afterwards.&lt;br /&gt;In Xtext we have more LOC in the tests than in production code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Comments&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Any comments need to reflect the code! Wrong comments are far more problematic than no comments.&lt;br /&gt;&lt;br /&gt;Inlined comments are a smell. They tell you that your code is not readable. Most of the time the simplest thing to do in order to avoid such comments is extracting a method and naming that method like the comment you wanted to put in front of that code snippet.&lt;br /&gt;&lt;br /&gt;JavaDoc comments are important. This is an aspect where we should improve our code base.&lt;br /&gt;JavaDocs should be as small as possible and as verbose as needed in order to understand the contract behind the API at hand. We only add JavaDocs to primary hooks. Internal stuff is seldom commented because we can do a quick view at the code in order to understand what's going on. At least as long as the code fulfills the next requirement.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Readability&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Code is read far more often than it is written or edited. So it's especially important to write the code so that your intentions are clear. Small functions and expressive names are good starting points.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Theme II : Usability (UI Quality &amp;amp; Features, API Quality, Documentation Quality)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;UI Quality and Features&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In Galileo we mainly focused on putting the main abstractions in place and creating a solid framework. Some UI features were therefore postponed.&lt;br /&gt;One of the first things we want to do in Helios is adding the &lt;a href="http://wiki.eclipse.org/EmfIndex"&gt;EMF Index&lt;/a&gt; and making the usage of it and &lt;a href="http://blog.efftinge.de/2009/07/xtext-scopes-and-emf-index-in-action.html"&gt;the corresponding scope provider&lt;/a&gt; the default. Based on that we have information about all cross file references, which enables us to not only automatically trigger validation of referencing models, but also provide advanced navigation features and things like rename refactoring.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;API Quality&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It is our desire that people have fun when working with the abstractions we provide.&lt;br /&gt;The mantra for last year's development was 'We aim to make simple things simple and complex things possible.' (by Alan Kay). Which means to us that what the 80% of things we want to do with a framework needs to be as simple as possible, but at the same time we need to make sure that the other 20% are still possible (and ideally also not too hard to accomplish). Of course there are use cases which simply do not fall into the scope of a framework but that is a different story.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Documentation Quality&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Our &lt;a href="http://www.eclipse.org/Xtext/documentation/"&gt;documentation&lt;/a&gt; is in a relatively good shape, but still can be improved. We are convinced that good documentation is key for the overall acceptance of a framework.&lt;br /&gt;So keeping the documentation current and keeping a good quality is part of our development process. That is adding or changing code is always paired with adding and changing tests and updating the documentation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;Theme III : Performance &amp;amp; Scalability &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This has been a major theme for last year's development as well.&lt;br /&gt;Given user stories like the &lt;a href="https://www.eclipsecon.org/submissions/ese2009/view_talk.php?id=988"&gt;talk about Xtext and AUTOSAR&lt;/a&gt; proposed for ESE 2009, it seems that we met this non-functional requirement fair enough.&lt;br /&gt;But that does not mean that we don't need to check it from time to time, or that users neverface performance issues. We take this aspect very serious.&lt;br /&gt;But of course we do not write optimized code as along as we haven't measured that optimization is worth the extra unreadability, complexity or what ever.&lt;br /&gt;What we do is having regular profiling sessions and thinking about different use cases when we design concepts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;Theme IV : Increase Applicability (Base Language, Grammar Features)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So far all the themes are more or less about, improving the quality. I haven't talked about many new features (despite the mentioning of EMF Index and what it means for some UI features we want to implement). You will of course see many improvements and new features I haven't mentioned in this post. We decide which bugzillas to work on from milestone to milestone (I'll write about what is coming in M2 in a separate post.)&lt;br /&gt;But there is one huge "feature" we want to do and I want to mention it here:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Base Language&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We want to provide a base language, which can be extended and customized by users. The idea is not new: The Intentional Workbench as well as MPS both have similar things. Despite that these frameworks are of a different nature (they are not text-based) we also don't want to implement Java or C# (that is what they do), but come up with a much simpler and nicer language. Actually I like Scala very much, because it has very little concepts in it and allows to define new concepts out of them. But with an Xtext-based language you don't need the syntactical flexibility of Scala or Ruby, because the parser and the compiler are open and you can change the language as it seems fit. Imagine state machines with action implementations, entity models with implementation for operations and derived attributes, validation languages etc. Looking at the current land scape of external DSLs I'ld say that about 90% of all languages would benefit from support for embedding expressions. Some people already have implemented their own expression language others reuse the language of the target platform, i.e. they write the behavior in Java and mix it into the generated code. &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; and I gave a &lt;a href="http://www.slideshare.net/sefftinge/challenges-in-dsl-design"&gt;talk about this at Code Generation 2009&lt;/a&gt; in June.&lt;br /&gt;&lt;br /&gt;In order to show and prove how great such a language is, we plan to implement an EMFatic version that supports adding implementation for EOperations and derived EStructuralFeatures.&lt;br /&gt;With that you'll no longer need to change the generated code (at least most of the time) and you'ld have everything in one place.&lt;br /&gt;In addition DSLs for common viewpoints in Xtext, such as scoping, validation, quick fixes, formatting, etc. would be nice.&lt;br /&gt;&lt;br /&gt;The base language is a huge effort and will likely not be finished by next year. As of now I'm not sure if and how much it will be included in the Helios release.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Java adaption&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another really nice thing we're already working on is, having a thin EMF adapter layer to JDT's Java model. This allows for referencing Java elements from within a DSL, which is very often desired. Reimplementing MWE with a nicer syntax will be a matter of a couple of days when we have this feature. We want this to be tightly integrated with EMF Index.&lt;br /&gt;This is also a bigger topic but will definitely be part of Helios (actually we plan to have it finished by M4).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Grammar Features&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;There are a lot of ideas of additional features for the grammar language. We haven't decided on them yet but things like multiple grammar inheritance might get more important when we ship a base language. But what exactly such a feature would mean and what the consequences are still has to grow on us.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;DISCLAIMER&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Please don't take any of these ideas as guaranteed. This is what we currently have in mind but our view of the world will change. Also note that developing the base language we have in mind is a big effort, so it might take us more than just one release cycle.&lt;br /&gt;I'll write a post for each milestone in order to tell what we exactly we did and do.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1022866070154292872?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1022866070154292872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1022866070154292872&amp;isPopup=true' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1022866070154292872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1022866070154292872'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/08/xtext-road-to-helios.html' title='Xtext - Road to Helios'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-8720175646576635876</id><published>2009-07-17T21:23:00.003+01:00</published><updated>2009-07-17T21:38:21.977+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='release'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext 0.7.1 available</title><content type='html'>We've just published a bugfix update to the Galileo release. Actually it is not only an update of &lt;a href="http://www.xtext.org"&gt;Xtext&lt;/a&gt; but also of MWE and Xpand. All three projects are now shipped in version 0.7.1.&lt;br /&gt;&lt;br /&gt;The update contains a lot of nice bugfixes (see &lt;a href="http://zarnekow.blogspot.com/2009/07/xtext-071-is-in-starting-blocks.html"&gt;Sebastian's blog &lt;/a&gt;for details). Getting it should be pretty easy for everyone this time. It's all available from our update site at itemis :&lt;br /&gt;&lt;br /&gt;  &lt;span style="font-weight: bold;"&gt;http://download.itemis.com/updates&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://twitter.com/docfx"&gt;Moritz&lt;/a&gt; made it a P2 composite site pointing to the corresponding update sites at Eclipse as well as to the highly recommended Antlr generator fragment. So it is just a matter of pressing 'update' if you already had Xtext installed and had added the updatesite above. If you want to install Xtext for the first time, just add the update site above and install the Xtext SDK. This will install everything you need (including MWE UI and the like, which was previously not automatically added). Have fun!&lt;br /&gt;&lt;br /&gt;Thank you Moritz, Dennis and Sebastian. It works great! :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-8720175646576635876?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/8720175646576635876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=8720175646576635876&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8720175646576635876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8720175646576635876'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/07/xtext-071-available.html' title='Xtext 0.7.1 available'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-2205418460153437960</id><published>2009-07-15T07:56:00.003+01:00</published><updated>2009-07-15T08:15:39.215+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>RT @Xtext #webinar #bugfix-release #dsl-contest</title><content type='html'>Just in case you're not sure what exciting things to do within the next couple of days, here are some suggestions:&lt;br /&gt;&lt;br /&gt;First you could attend the &lt;a href="http://live.eclipse.org/node/705"&gt;Xtext webinar&lt;/a&gt; &lt;a href="http://www.1160pm.net/"&gt;Heiko&lt;/a&gt; and I are giving today (at 5:00 pm GMT). There you'll learn something about the general principles and ideas behind this new language framework. We'll also show some examples.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;You have to &lt;a href="http://live.eclipse.org/node/705"&gt;register in advance&lt;/a&gt;!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Second you grab the bugfix release (0.7.1) of &lt;a href="http://www.eclipse.org/Xtext"&gt;Xtext&lt;/a&gt; which is due this Friday (July 17th). It includes a lot of nice &lt;a href="https://bugs.eclipse.org/bugs/buglist.cgi?query_format=advanced&amp;amp;short_desc_type=allwordssubstr&amp;amp;short_desc=&amp;amp;classification=Modeling&amp;amp;product=TMF&amp;amp;version=0.7.0&amp;amp;target_milestone=SR1&amp;amp;long_desc_type=allwordssubstr&amp;amp;long_desc=&amp;amp;bug_file_loc_type=allwordssubstr&amp;amp;bug_file_loc=&amp;amp;status_whiteboard_type=allwordssubstr&amp;amp;status_whiteboard=&amp;amp;keywords_type=allwords&amp;amp;keywords=&amp;amp;bug_status=RESOLVED&amp;amp;bug_status=VERIFIED&amp;amp;resolution=FIXED&amp;amp;emailtype1=substring&amp;amp;email1=&amp;amp;emailtype2=substring&amp;amp;email2=&amp;amp;bugidtype=include&amp;amp;bug_id=&amp;amp;votes=&amp;amp;chfieldfrom=&amp;amp;chfieldto=Now&amp;amp;chfieldvalue=&amp;amp;cmdtype=doit&amp;amp;order=Reuse+same+sort+as+last+time&amp;amp;known_name=Xtext+0.7.1&amp;amp;query_based_on=Xtext+0.7.1&amp;amp;field0-0-0=noop&amp;amp;type0-0-0=noop&amp;amp;value0-0-0="&gt;bug fixes&lt;/a&gt;. &lt;a href="http://zarnekow.blogspot.com/2009/07/xtext-071-is-in-starting-blocks.html"&gt;Sebastian already blogged about it&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;With that on your box you'll be well prepared to develop a nice, witty language using Xtext and submit it for the &lt;a href="http://tinyurl.com/nlt27n"&gt;DSL contest&lt;/a&gt; itemis is running. Creativity wins!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.1160pm.net/wp-content/uploads/2009/07/xtext-laureate.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 411px; height: 292px;" src="http://www.1160pm.net/wp-content/uploads/2009/07/xtext-laureate.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-2205418460153437960?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/2205418460153437960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=2205418460153437960&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2205418460153437960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2205418460153437960'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/07/rt-xtext-webinar-bugfix-release-dsl.html' title='RT @Xtext #webinar #bugfix-release #dsl-contest'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-4023821900980796565</id><published>2009-07-02T13:23:00.014+01:00</published><updated>2009-07-02T15:29:35.812+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scoping'/><category scheme='http://www.blogger.com/atom/ns#' term='emf index'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext scopes and EMF index in action</title><content type='html'>&lt;span style="font-style: italic;"&gt;This is a post about scoping and how to use the EMF index for that. It is in some sense a practical follow up on another blog post about the general idea behind &lt;a href="http://blog.efftinge.de/2009/01/xtext-scopes-and-emf-index.html"&gt;indexing and scoping in Xtext&lt;/a&gt;. The topic is somewhat advanced and bleeding edge. This post describes the needed steps to get the current index based default scoping up and running. I've prepared a &lt;/span&gt;&lt;a style="font-style: italic;" href="http://gallery.me.com/sven.efftinge/100036"&gt;small screencast&lt;/a&gt;&lt;span style="font-style: italic;"&gt; demonstrating the result in action.&lt;/span&gt; &lt;span style="font-style: italic;"&gt;The example language can be downloaded from &lt;a href="http://www.efftinge.de/index-based-language.zip"&gt;here&lt;/a&gt;.&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Today, the common way to do cross resource references in &lt;a href="http://www.xtext.org"&gt;Xtext&lt;/a&gt; is to do it via resource URIs. That is if you want to reference a model element (EObject) from another resource, you typically put the whole resource on the scope by adding a corresponding import. Example:&lt;br /&gt;&lt;pre&gt;import "platform:/resource/my.project/src/othermodel.dsl"&lt;br /&gt;&lt;br /&gt;//.. refer to elements from othermodel.dsl&lt;/pre&gt;The corresponding default scoping is very simplistic. Every object in the current resource and in the referenced resources can be referenced by its simple name (as long as it has a 'name').&lt;br /&gt;&lt;br /&gt;Although this is very easy to understand, it has it's limitation when it comes to more sophisticated design. If you for instance want to hide some elements or have duplicate simple names in different packages (this can be the case if you use elements, which are developed by others).&lt;br /&gt;&lt;br /&gt;In many programming languages we have the notion of namespaces, which are much more flexible and powerful. Java, for instance, is file system agnostic. Although it forces you to put the files into folders which correspond the packages, it ultimately is just based on namespaces (packages, types).&lt;br /&gt;That said Java's namespace mechanism is also a bit limited. For instance I cannot have imports in nested namespaces but only per file. And I cannot nest packages but only classes and interfaces.&lt;br /&gt;&lt;br /&gt;Scala and C# both allow to have multiple nested packages within one file and you can put imports per namespace, so that imported names are only visible within that namespace.&lt;br /&gt;&lt;br /&gt;In order to demonstrate how to use the index together with Xtext, I've implemented a &lt;span style="font-family:courier new;"&gt;DefaultIndexBasedScopeProvider &lt;/span&gt;which implements a similar semantic. There's a small example I've prepared, where you can see how it can be used. It is mainly a matter of configuring the different implementations with &lt;a href="http://code.google.com/p/google-guice/"&gt;Guice&lt;/a&gt;. Programming is not needed as long as you're happy with the defaults.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Here's how it works&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.eclipse.org/emfindex/"&gt;index&lt;/a&gt; registeres a builder, which is invoked on resource changes. In order to make your model elements visible, you'll have to contribute a so called Indexer using an extension point.&lt;br /&gt;&lt;pre&gt;&amp;lt;extension point="org.eclipse.emf.index.indexer"&amp;gt;&lt;br /&gt;&amp;lt;indexer class="org.eclipse.xtext.example.DomainmodelExecutableExtensionFactory&lt;br /&gt;                  :org.eclipse.xtext.index.DefaultDeclarativeResourceIndexer"&lt;br /&gt;            fileextensions="dmodel"/&amp;gt;&lt;br /&gt;&amp;lt;/extension&amp;gt;&lt;br /&gt;&lt;/pre&gt;Please ignore the &lt;span style="font-family:courier new;"&gt;ExecutableExtensionFactory&lt;/span&gt;, which is declared in order to make any executable extension Guice aware, that is you can use dependency injection. This is a different topic and might be covered by another blog post.&lt;br /&gt;&lt;br /&gt;The actual class to be instantiated is the one after the colon (':'):  The &lt;span style="font-family:courier new;"&gt;DefaultDeclarativeResourceIndexer&lt;/span&gt;, which delegates to an instance of &lt;span style="font-family:courier new;"&gt;IQualifiedNameProvider&lt;/span&gt;, which itself is injected. This means that its implementation can be arbitrarily changed.&lt;br /&gt;The contract of a name provider is very simple: it computes a qualified name for an element, if it returns null, the element is not indexed and hence not referable.&lt;br /&gt;&lt;br /&gt;By default we use a &lt;span style="font-family:courier new;"&gt;DefaultDeclarativeQualifiedNameProvider&lt;/span&gt;, which if not otherwise specified looks up a simple name (if there's an attribute 'name') and concatenates it to the qualified name of its parent. It's named 'declarative' because you're able to change the described default behavior per type by just adding a method like this:&lt;br /&gt;&lt;pre&gt;String qualifiedName(MyType foo) {&lt;br /&gt;  // compute different qualified name for MyTypes&lt;br /&gt;  // ...&lt;br /&gt;}&lt;/pre&gt;It will automatically dispatch to this method as soon as it has to compute a qualified name for an instance of MyType.&lt;br /&gt;&lt;br /&gt;With this in place we'll have our elements automatically indexed as long as they are in a project, which have the index nature enabled. Being indexed means that they are globally visible by their qualified name, which is comparable to how public Java elements are globally visible as soon as they are on the classpath.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What's next?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In order to use the index and have it injected into your components (e.g. your scope provider) you'll have to configure the singleton instance from the index bundle into your Guice module. In the example the corresponding binding goes into the UI module and looks like this:&lt;br /&gt;&lt;pre&gt;public IndexStore bindIndexStore() {&lt;br /&gt; return EmfIndexUIPlugin.getDefault().getIndexStore();&lt;br /&gt;}&lt;/pre&gt;With that in place you can inject the index store by just adding a dependency in your code:&lt;br /&gt;&lt;pre&gt;@Inject&lt;br /&gt;private IndexStore store;&lt;/pre&gt;Guice will automatically put the instance into such declared dependencies.&lt;br /&gt;Now that we have a binding for &lt;span style="font-family:courier new;"&gt;IndexStore&lt;/span&gt; we can add the index based scoping to the runtime module:&lt;br /&gt;&lt;pre&gt;public IndexStore bindIndexStore() {&lt;br /&gt; return new PersistableIndexStore();&lt;br /&gt;}&lt;br /&gt;  &lt;br /&gt;@Override&lt;br /&gt;public Class bindIScopeProvider() {&lt;br /&gt; return DefaultIndexBasedScopeProvider.class;&lt;br /&gt;}&lt;/pre&gt;Note the additional &lt;span style="font-family:courier new;"&gt;IndexStore&lt;/span&gt; binding, which is overridden by the binding we previously added to the UI module, but is needed in order to use this stuff at runtime (i.e. without running within exquinox). So it gets active as soon as you run without UI.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How the &lt;span style="font-family:courier new;"&gt;DefaultIndexBasedScopeProvider&lt;/span&gt; works&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-family:courier new;"&gt;DefaultIndexBasedScopeProvider&lt;/span&gt;&lt;br /&gt;- looks up EAttributes with name '&lt;span style="font-family:courier new;"&gt;importNamespace&lt;/span&gt;'&lt;br /&gt;- and translates the globally unique qualified name into shorter ones using those import statements.&lt;br /&gt;&lt;br /&gt;By default qualified names with or without a wildcard at the end are supported. For an import of a qualified name the simple name is made available as we know from e.g. Java, where&lt;br /&gt;&lt;pre&gt;import java.util.Set;&lt;/pre&gt;makes it possible to refer to 'java.util.Set' by its simple name 'Set'.&lt;br /&gt;Contrary to Java the import is not active for the whole file but only for the namespace it is declared in and its child namespaces. That is why you can write the following in the example DSL:&lt;br /&gt;&lt;pre&gt;package foo {&lt;br /&gt;  import bar.Foo&lt;br /&gt;  entity Bar extends Foo {&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;package bar {&lt;br /&gt;  entity Foo {}&lt;br /&gt;}&lt;/pre&gt;Of course the declared elements within a package are as well referable by their simple name:&lt;br /&gt;&lt;pre&gt;package bar {&lt;br /&gt;  entity Bar extends Foo {}&lt;br /&gt;  entity Foo {}&lt;br /&gt;}&lt;/pre&gt;Of course the following would as well be ok:&lt;br /&gt;&lt;pre&gt;package bar {&lt;br /&gt;  entity Bar extends bar.Foo {}&lt;br /&gt;  entity Foo {}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Disclaimer&lt;/span&gt;&lt;br /&gt;All this is in a very early stage. The index is not finished and its architecture is not settled down yet. Also the scope provider implementation might be changed in future (I'm sure it will).&lt;br /&gt;Additionally, there are other things around this which we have to work on before considering this mature.&lt;br /&gt;&lt;br /&gt;But as I know that there are a lot of bleeding edge users out there, I wanted to share the current state, so you might find a starting point to play with it. The index is an enabler for more advanced functionality in Xtext and in EMF based development in general. So expect it to become an important part in Eclipse Modeling.&lt;br /&gt;&lt;br /&gt;Feedback is highly appreciated and should either go to the &lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.modeling.tmf"&gt;newsgroup&lt;/a&gt;&lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.modeling.tmf"&gt; for Xtext&lt;/a&gt; (the scoping part) or to the &lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.technology.emft"&gt;EMFT newsgroup&lt;/a&gt; (the index part), because the index project is a component under EMFT.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-4023821900980796565?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/4023821900980796565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=4023821900980796565&amp;isPopup=true' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4023821900980796565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4023821900980796565'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/07/xtext-scopes-and-emf-index-in-action.html' title='Xtext scopes and EMF index in action'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-4743750871922784674</id><published>2009-06-24T10:47:00.012+01:00</published><updated>2009-06-24T15:18:16.951+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='Galileo'/><title type='text'>Galileo! Thank you team!</title><content type='html'>&lt;a href="http://www.eclipse.org"&gt;Today is the day&lt;/a&gt;. The &lt;a href="http://www.eclipse.org/Xtext"&gt;framework&lt;/a&gt; we've been working on for over a year has been released.&lt;br /&gt;And before I fall into a big dark hole (because I forgot to think about what is next), I wanted to use this medium in order to thank my team. I never ever had the pleasure to work with such nice and talented people. Without them there would be nothing to release.&lt;br /&gt;&lt;br /&gt;Usually I prefer to stick talking about the team as a whole as opposed to talking about the individuals, because the synergy is so important and needs to be emphasized. But on the other hand it's important for me that everybody knows who was involved and made this possible.&lt;br /&gt;So I will make an exception this time and want thank them in alphabetical order:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ii_da0jTxAY/SkIvqCHbq5I/AAAAAAAAAL4/6MK1S87n2_I/s1600-h/DSC00366.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 308px;" src="http://4.bp.blogspot.com/_Ii_da0jTxAY/SkIvqCHbq5I/AAAAAAAAAL4/6MK1S87n2_I/s400/DSC00366.JPG" alt="" id="BLOGGER_PHOTO_ID_5350891706438626194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.1160pm.net/"&gt;Heiko&lt;/a&gt; (Behrens)&lt;/span&gt;, our drummer, came in one year ago. The first thing he did was developing the Ecore model generation from Xtext grammars. He's an excellent software developer and at the same time (and that is rare) a highly skilled communicator and team player. He developed a profiler for Xpand and improved the performance of the static analysis of Xpand templates about 300%. Also he designed and implemented our nice new website.&lt;br /&gt;Thank you, Heiko. I have learned a lot from you.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="https://www.xing.com/profile/Michael_Clay"&gt;Michael&lt;/a&gt; (Clay&lt;/span&gt;) is one of the few people who were already active contributors to the previous version of Xtext. He worked a lot on the code completion functionality as well as implemented a &lt;a href="http://blog.efftinge.de/2009/01/emfatic-implemented-in-tmf-xtext.html"&gt;textual format for Ecore models&lt;/a&gt; as one of the examples. I'm sorry that especially in the beginning, I was not able to integrate him enough, since we had a lot of offline discussions, which he couldn't join. Thank you for contributing (and for your patience). &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.linkedin.com/pub/moritz-eysholdt/8/503/b2a"&gt;Moritz&lt;/a&gt; (Eysholdt&lt;/span&gt;) joined our team in April 2008 in order to write his master thesis on co-evolution of meta models and models (he finished with 100 out of 100 points). In parallel he not only managed the support for the XSD adapter he wrote for Xpand, but wrote the serialization algorithm for Xtext. That is definitely not an easy one and he solved it without too much worry. Good to have you!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.peterfriese.de/"&gt;Peter&lt;/a&gt; (Friese&lt;/span&gt;), our &lt;a href="http://twitter.com/xtext"&gt;tweeting bird&lt;/a&gt;, always has an eye on how the project is viewed from outside. He is not only one of the kindest people I know but is so a&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ii_da0jTxAY/SkIv6WMYGGI/AAAAAAAAAMA/ZU5b9JLqLBc/s1600-h/IMG_5211.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 266px;" src="http://2.bp.blogspot.com/_Ii_da0jTxAY/SkIv6WMYGGI/AAAAAAAAAMA/ZU5b9JLqLBc/s400/IMG_5211.JPG" alt="" id="BLOGGER_PHOTO_ID_5350891986705979490" border="0" /&gt;&lt;/a&gt;ctive in the Eclipse Community, that some people even have thought that he was the founder of &lt;a href="http://www.itemis.com"&gt;itemis&lt;/a&gt;. Thank you, for doing all that community work and spreading the word. Also thank you for coming up with the &lt;a href="http://wiki.eclipse.org/Mylyn/Incubator/WikiText"&gt;WikiText&lt;/a&gt; infrastructure, which we used to write the &lt;a href="http://www.eclipse.org/Xtext/documentation/0_7_0/xtext.pdf"&gt;documentation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've been working with &lt;a href="https://www.xing.com/profile/Dennis_Huebner2"&gt;&lt;span style="font-weight: bold;"&gt;Dennis&lt;/span&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; (Huebner&lt;/span&gt;) for about 6 years now. He's always been a great person to work with. Last year we had serious problems with our build infrastructure. Every now and then strange errors came up and we didn't know what to do. So at some point Dennis took this thing over and managed it. It was great to see how he cared about the whole project, he fixed broken builds even at night or at the weekends. Without him there would be no release today.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt; (Koehnlein&lt;/span&gt;) joined the team in February, 2008. Among all the cool stuff he did, the most noteworthy things may be co-authoring the initial design of the grammar language as well as implementing the partial parsing algorithm. Also he's the most experienced with EMF. Jan has really become a friend of mine over the past year and I especially enjoyed visiting all the conferences with him. But, Jan, please do not talk me into drinking whisky again. Thanks!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="https://www.xing.com/profile/Patrick_Schoenbach"&gt;Patrick&lt;/a&gt; (Schoenbach&lt;/span&gt;) is the good fairy behind the scenes. He's responsible at any day time and when ever there was something wich needed urgent action, Patrick was there. Thank you, Patrick, I hope we can meet some day.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ii_da0jTxAY/SkIwg7O5FfI/AAAAAAAAAMI/-3YFZt6FZIs/s1600-h/DSC00354.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_Ii_da0jTxAY/SkIwg7O5FfI/AAAAAAAAAMI/-3YFZt6FZIs/s400/DSC00354.JPG" alt="" id="BLOGGER_PHOTO_ID_5350892649483671026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.linkedin.com/pub/knut-wannheden/1/40/a98"&gt;Knut&lt;/a&gt; (Wannheden&lt;/span&gt;) joined the team very late, but had provided a lot of useful features before. Knut is one of these seldom seen developers who look deep into the code and understands what's going on in an incredible short amount of time. Whatever he contributes is of highest quality. Good to have you.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; (Zarnekow&lt;/span&gt;). He is unbelievable. He joined the team late 2008. If you look at the &lt;a href="http://dash.eclipse.org/dash/commits/web-app/summary.cgi?login=y&amp;amp;month=x&amp;amp;project=modeling.tmf&amp;amp;company=itemisAG"&gt;commit statistics&lt;/a&gt;, you'll see what kind of productivity gain Sebastian brought to the project. From day one he cared about every single line, he reviewed every bit which was committed. On the other hand he contributed masses of code, which is between the best I've seen so far. Sebastian is propably the one with the most knowledge about the whole system and has become something like a co-lead to me. Besides other things he tought me to improve keeping discipline (still learning ;-)) and why it is important. Sebastian, you made my year.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ii_da0jTxAY/SkIsPdV2WRI/AAAAAAAAALw/UdaFUABcb8A/s1600-h/IMG_0064.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_Ii_da0jTxAY/SkIsPdV2WRI/AAAAAAAAALw/UdaFUABcb8A/s400/IMG_0064.JPG" alt="" id="BLOGGER_PHOTO_ID_5350887951355500818" border="0" /&gt;&lt;/a&gt;We've just been out for lunch where I got the chance to take this nice photo (&lt;span style="font-weight: bold;"&gt;Note the&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; name of that restaurant!&lt;/span&gt;). Hopefully we can convince someone to open a new restaurant or rename an existent to &lt;span style="font-weight: bold;"&gt;'Helios' &lt;/span&gt;soon.&lt;br /&gt;&lt;br /&gt;Have fun (while downloading the complete Xtext distro from &lt;a href="http://xtext.itemis.com/"&gt;http://xtext.itemis.com/&lt;/a&gt;)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-4743750871922784674?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/4743750871922784674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=4743750871922784674&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4743750871922784674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4743750871922784674'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/06/galileo-thank-you-team.html' title='Galileo! Thank you team!'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ii_da0jTxAY/SkIvqCHbq5I/AAAAAAAAAL4/6MK1S87n2_I/s72-c/DSC00366.JPG' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-8172284578214646498</id><published>2009-06-19T08:29:00.006+01:00</published><updated>2009-06-19T08:49:25.598+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='website'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext : New Website</title><content type='html'>It has been online for a couple of days and also been mentioned on twitter as well as in the &lt;a href="http://ianskerrett.wordpress.com/2009/06/16/galileo-freshman-project-1-xtext/"&gt;blogosphere&lt;/a&gt;. But we haven't announced it "officially" yet. So here we go:&lt;br /&gt;&lt;br /&gt; &lt;span style="font-weight: bold;"&gt;We have a &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://www.xtext.org/"&gt;new website&lt;/a&gt;&lt;span style="font-weight: bold;"&gt; :-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ii_da0jTxAY/Sjs_MOAst2I/AAAAAAAAALg/z-FjX1BhgY8/s1600-h/Picture+2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 328px;" src="http://2.bp.blogspot.com/_Ii_da0jTxAY/Sjs_MOAst2I/AAAAAAAAALg/z-FjX1BhgY8/s400/Picture+2.png" alt="" id="BLOGGER_PHOTO_ID_5348938461584602978" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I think &lt;a href="http://www.1160pm.net/"&gt;Heiko&lt;/a&gt; really did an excellent job. Given the limited time he had (as it states in the screenshot there are &lt;a href="http://www.eclipse.org/galileo/"&gt;only five days left&lt;/a&gt;...) the result is just fantastic.&lt;br /&gt;&lt;br /&gt;How do you like it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-8172284578214646498?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/8172284578214646498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=8172284578214646498&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8172284578214646498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8172284578214646498'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/06/xtext-new-website.html' title='Xtext : New Website'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ii_da0jTxAY/Sjs_MOAst2I/AAAAAAAAALg/z-FjX1BhgY8/s72-c/Picture+2.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3329497368653214580</id><published>2009-06-18T08:40:00.005+01:00</published><updated>2009-06-18T09:35:50.473+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL code generation eclipse xtext slides'/><title type='text'>Code Generation Conference 2009</title><content type='html'>This year's &lt;a href="http://www.codegeneration.net/cg2009/"&gt;Code Generation Conference&lt;/a&gt; in Cambridge UK is again a great event. So far I listened to a lot of interesting and entertaining talks and had many discussions on code generation and language development. It's organization is just perfect. They even came up with great weather and fireworks (each night!)!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ii_da0jTxAY/Sjn7Wq2bU_I/AAAAAAAAALY/fZ4CWCucv5E/s1600-h/fire_work.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 268px;" src="http://1.bp.blogspot.com/_Ii_da0jTxAY/Sjn7Wq2bU_I/AAAAAAAAALY/fZ4CWCucv5E/s400/fire_work.jpg" alt="" id="BLOGGER_PHOTO_ID_5348582399357441010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Thanks to Mark Dalgarno and his team, who again did an excellent job.&lt;br /&gt;&lt;br /&gt;I've uploaded the &lt;a href="http://www.slideshare.net/sefftinge/challenges-in-dsl-design"&gt;slides of the presentation&lt;/a&gt; I did together with &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; on Tuesday.&lt;br /&gt;&lt;br /&gt;Today is the last day, and there'll be a workshop on a new technology called &lt;a href="http://www.xtext.org"&gt;Xtext&lt;/a&gt;.&lt;br /&gt;Sounds exciting ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3329497368653214580?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3329497368653214580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3329497368653214580&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3329497368653214580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3329497368653214580'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/06/code-generation-conference-2009.html' title='Code Generation Conference 2009'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ii_da0jTxAY/Sjn7Wq2bU_I/AAAAAAAAALY/fZ4CWCucv5E/s72-c/fire_work.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-8957247674406194104</id><published>2009-06-05T19:41:00.003+01:00</published><updated>2009-06-05T20:09:00.807+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext : From oAW to TMF</title><content type='html'>Only two weeks until the release of Xtext 0.7.0 (simultaneous with Galileo). If you've been using the Xtext version previously shipped with openArchitectureWare (oAW Xtext) you might wonder what has changed and how to migrate to the &lt;a href="http://www.xtext.org"&gt;new version from TMF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We now have a &lt;a href="http://www.eclipse.org/modeling/tmf/documentation/from_oaw_to_tmf.pdf"&gt;migration document&lt;/a&gt; describing the most important decisions, changes, and the motivation behind them. We hope it will not only help oAW Xtext users to get their projects migrated but also provide them a good start for learning about the new ideas and concepts. Any feedback is highly appreciated!&lt;br /&gt;&lt;br /&gt;We are confident that migrating to TMF Xtext is a good idea and pays off soon. Your DSLs will not only run on faster and better code (we e.g. have &lt;a href="http://download.eclipse.org/modeling/tmf/xtext/downloads/drops//0.7.0/S200906021318/testresults/html/org.eclipse.xtext.generator.tests_linux.gtk.html"&gt;lots&lt;/a&gt; of &lt;a href="http://download.eclipse.org/modeling/tmf/xtext/downloads/drops//0.7.0/S200906021318/testresults/html/org.eclipse.xtext.ui.common.tests_linux.gtk.html"&gt;unit&lt;/a&gt; &lt;a href="http://download.eclipse.org/modeling/tmf/xtext/downloads/drops//0.7.0/S200906021318/testresults/html/org.eclipse.xtext.ui.core.tests_linux.gtk.html"&gt;tests&lt;/a&gt;), but you'll automatically benefit from cool new features like serialization, pretty printing, template proposals, and semantic highlighting (just to name a few).&lt;br /&gt;&lt;br /&gt;Also we, the committers, love the project and are keen on helping you in the &lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.modeling.tmf"&gt;newsgroup&lt;/a&gt; :-).&lt;br /&gt;Note, that &lt;a href="http://www.itemis.com"&gt;itemis&lt;/a&gt; offers migration services and trainings, just in case you're busy or don't want to do it yourself. Just drop me a note in that case.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-8957247674406194104?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/8957247674406194104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=8957247674406194104&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8957247674406194104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8957247674406194104'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/06/xtext-from-oaw-to-tmf.html' title='Xtext : From oAW to TMF'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3589443569477104742</id><published>2009-05-14T07:32:00.005+01:00</published><updated>2009-05-14T07:53:07.889+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='code generation'/><title type='text'>Code Generation 2009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.codegeneration.net/cg2009/images/CG2009logo150x115.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 150px; height: 115px;" src="http://www.codegeneration.net/cg2009/images/CG2009logo150x115.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Some of &lt;a href="http://koehnlein.blogspot.com/"&gt;my&lt;/a&gt; &lt;a href="http://www.1160pm.net/"&gt;team&lt;/a&gt; &lt;a href="http://zarnekow.blogspot.com/"&gt;mates&lt;/a&gt; and I will be attending this years &lt;a href="http://www.codegeneration.net/cg2009"&gt;Code Generation conference&lt;/a&gt; in Cambridge.&lt;br /&gt;Last year's Code Generation conference has been one of the most interesting of the year, so I'm really looking forward to it.&lt;br /&gt;&lt;br /&gt;We'll be doing&lt;br /&gt;- a &lt;a href="http://www.codegeneration.net/cg2009/sessioninfo.php?session=30"&gt;workshop on TMF Xtext&lt;/a&gt;&lt;br /&gt;- a talk on general &lt;a href="http://www.codegeneration.net/cg2009/sessioninfo.php?session=23"&gt;challenges in DSL Design&lt;/a&gt;&lt;br /&gt;- and a talk about &lt;a href="http://www.codegeneration.net/cg2009/sessioninfo.php?session=64"&gt;practical experience&lt;/a&gt; at &lt;a href="http://www.codegeneration.net/cg2009/sessioninfo.php?session=64"&gt;Deutsche Boerse&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I especially enjoyed the different gold fish bowls and panels. Looking at &lt;a href="http://www.codegeneration.net/cg2009/sessioninfo.php?session=59"&gt;this year's&lt;/a&gt; &lt;a href="http://www.codegeneration.net/cg2009/sessioninfo.php?session=60"&gt;topics&lt;/a&gt; they should become pretty interesting again.&lt;br /&gt;So if you're at all into code generation, language design or model&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;ing &lt;a href="http://www.codegeneration.net/cg2009"&gt;Code Generation 2009&lt;/a&gt; is a must attend event.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3589443569477104742?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3589443569477104742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3589443569477104742&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3589443569477104742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3589443569477104742'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/05/code-generation-2009.html' title='Code Generation 2009'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-603414975819811096</id><published>2009-05-11T19:06:00.004+01:00</published><updated>2009-05-11T19:47:39.025+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='Galileo'/><title type='text'>Xtext M7 - New &amp; Noteworthy</title><content type='html'>Last week was the last milestone (M7) for this year's release train (Galileo). We're pretty happy with the result. It's in a much better shape than what was available after M6 as we cleaned up a number of things and fixed many bugs.&lt;br /&gt;&lt;br /&gt;Besides that Xtext now supports lazy linking, the &lt;a href="http://wiki.eclipse.org/Xtext/Documentation#Content_Assist"&gt;content assist framework&lt;/a&gt; has been overhauled and finally is in a shape we're very happy with. In addition M7 enables &lt;a href="http://wiki.eclipse.org/Xtext/Documentation#Templates"&gt;template proposals &lt;/a&gt;(including corresponding preference page) for all languages without the need for any extra programming or configuration. Also the preference page for syntax coloring now works as expected.&lt;br /&gt;Finally we made some progress regarding the &lt;a href="http://www.eclipse.org/proposals/emf-index/"&gt;EMF Index&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;See the &lt;a href="http://wiki.eclipse.org/Xtext/Documentation/Xtext_New_and_Noteworthy#New_.26_Noteworthy_M7"&gt;New &amp;amp; Noteworthy&lt;/a&gt; document for the whole list of changes in M7.&lt;br /&gt;&lt;br /&gt;Xtext now contains all features and concepts we wanted it to have in the final release.&lt;br /&gt;There will be five release candidates (RC) before the final build will be made available:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;RC1&lt;/b&gt;&lt;/td&gt;&lt;td&gt;05/19/2009&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;RC2&lt;/b&gt;&lt;/td&gt;&lt;td&gt;05/26/2009&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;RC3&lt;/b&gt;&lt;/td&gt;&lt;td&gt;06/02/2009&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;RC4&lt;/b&gt;&lt;/td&gt;&lt;td&gt;06/09/2009&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;RC5&lt;/b&gt;&lt;/td&gt;&lt;td&gt;06/16/2009&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;0.7.0&lt;/b&gt;&lt;/td&gt;&lt;td&gt;06/28/2009&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;We'll spend the next weeks on improving the overall user experience. This includes things like&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wiki.eclipse.org/Xtext/Documentation"&gt;Documentation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Website&lt;/li&gt;&lt;li&gt;Wizards&lt;/li&gt;&lt;li&gt;UI polishing&lt;/li&gt;&lt;li&gt;minor code clean ups&lt;/li&gt;&lt;li&gt;Bug fixing&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;In order to allow you helping us ;-), we've prepared a set of Galileo M7 distros containing everything necessary to get started with Xtext. The zips can be downloaded from itemis' website:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://xtext.itemis.com/distros/eclipse-SDK-3.5M7-xtext-0.7M7-win32.zip"&gt;eclipse-SDK-3.5M7-xtext-0.7M7-win32.zip&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://xtext.itemis.com/distros/eclipse-SDK-3.5M7-xtext-0.7M7-macosx-carbon.tar.gz"&gt;eclipse-SDK-3.5M7-xtext-0.7M7-macosx-carbon.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://xtext.itemis.com/distros/eclipse-SDK-3.5M7-xtext-0.7M7-macosx-cocoa.tar.gz"&gt;eclipse-SDK-3.5M7-xtext-0.7M7-macosx-cocoa.tar.gz&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://xtext.itemis.com/distros/eclipse-SDK-3.5M7-xtext-0.7M7-linux-gtk.tar.gz"&gt;eclipse-SDK-3.5M7-xtext-0.7M7-linux-gtk.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Any &lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.modeling.tmf"&gt;feedback&lt;/a&gt; is as always highly appreciated. Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-603414975819811096?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/603414975819811096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=603414975819811096&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/603414975819811096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/603414975819811096'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/05/xtext-m7-new-noteworthy.html' title='Xtext M7 - New &amp; Noteworthy'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3822679268398432602</id><published>2009-03-25T19:39:00.003+01:00</published><updated>2009-03-25T19:56:27.328+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse EclipseCon Modeling Xtext'/><title type='text'>EclipseCon: Slides and other stupid things</title><content type='html'>So far &lt;a href="http://www.eclipsecon.org/"&gt;EclipseCon&lt;/a&gt; was much fun and I'm pretty confident that we will have a good time for the rest.&lt;br /&gt;&lt;br /&gt;One thing which might be especially entertaining is the talk &lt;a href="http://www.peterfriese.de/"&gt;Peter&lt;/a&gt; is giving this afternoon (15:30 / Theater).&lt;br /&gt;Now that he's been living in America for some time, it seems that he like many &lt;a href="http://ed-merks.blogspot.com/"&gt;other American&lt;/a&gt; finally is convinced about &lt;a href="http://www.eclipsecon.org/2009/sessions?id=358"&gt;the stupidity of modeling&lt;/a&gt;. So if you also think modeling is stupid, let's meet in the talk to gossip about it. See you there ;-)&lt;br /&gt;&lt;br /&gt;Btw.: I just uploaded the slides for yesterday's talks (&lt;a href="http://www.slideshare.net/sefftinge/xtext-eclipse-con"&gt;xtext&lt;/a&gt; , &lt;a href="http://www.slideshare.net/sefftinge/generic-editor"&gt;generic editor&lt;/a&gt;). Unfortunately slideshare is not able to show the embedded videos and transitions &lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt; and I put into the slides :-(&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3822679268398432602?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3822679268398432602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3822679268398432602&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3822679268398432602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3822679268398432602'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/03/eclipsecon-slides-and-other-stupid.html' title='EclipseCon: Slides and other stupid things'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7605409475915664013</id><published>2009-03-19T11:06:00.002+01:00</published><updated>2009-03-19T11:07:34.138+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>TMF Xtext M6</title><content type='html'>&lt;p&gt;The &lt;a href="http://www.eclipse.org/modeling/tmf/downloads/?project=xtext"&gt;M6 builds&lt;/a&gt; are published and ready for &lt;a href="http://oaw.itemis.com/openarchitectureware/language=en/2837/downloads"&gt;download&lt;/a&gt;. We've prepared a &lt;a href="http://oaw.itemis.com/openarchitectureware/language=en/2837/downloads"&gt;distro&lt;/a&gt; containing everything you need and have written a short &lt;a href="http://wiki.eclipse.org/Xtext/GettingStarted"&gt;getting started tutorial&lt;/a&gt; which should give you a feel of how Xtext works. M6 Xtext is using &lt;a href="http://wiki.eclipse.org/MWE"&gt;MWE&lt;/a&gt; and &lt;a href="http://wiki.eclipse.org/Xpand"&gt;Xpand&lt;/a&gt;, so oAW Xtext users should feel comfortable. Note that the M6 release is not intended to be used in production. We'll still change things and if you don't get support by one of the committers (see below), you might need to have good code archeologists on your site ;-). The production-ready release will be available in June (Galileo).&lt;/p&gt;&lt;p&gt;During M6 we've focused on a large number of things (see &lt;a href="http://wiki.eclipse.org/Xtext/Documentation/Xtext_New_and_Noteworthy"&gt;New and Noteworthy&lt;/a&gt;). For instance, TMF Xtext now generates EMF classes for the derived EPackages (using existing EPackages is of course supported as well). The generated EClasses make use of &lt;a href="http://ed-merks.blogspot.com/2009/01/emf-ultra-slim-diet.html"&gt;latest improvements in EMF&lt;/a&gt;, namely the &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=252501"&gt;MinimalEObject&lt;/a&gt;. This has reduced memory footprint by about 30% and at the same time made the runtime even faster.&lt;/p&gt;&lt;p&gt;Another noteworthy thing is the new composable code generator API. Xtext is now shipped with lots of so called generator fragments, each adding functionality for a certain aspect. For instance, the generation of EMF classes is implemented as such a fragment. You can choose from those provided fragments, configure them individually and even add your own fragments in order to have a generator, generating exactly what you need. A fragment can contribute, to Manifest.MF, plugin.xml and the Guice modules. Sebastian has &lt;a href="http://zarnekow.blogspot.com/2009/03/xtext-corner-4-customizing-generator.html"&gt;written&lt;/a&gt; about it.&lt;/p&gt;&lt;p&gt;Looking at &lt;a href="http://www.eclipse.org/projects/project-plan.php?projectid=modeling.tmf"&gt;our project plan&lt;/a&gt;, one can see that M6 is also the API freeze milestone. Have a look at &lt;a href="http://www.1160pm.net/2009/03/19/xtext-m6-with-more-documentation-and-stable-api/"&gt;Heiko's post&lt;/a&gt; and the corresponding &lt;a href="http://wiki.eclipse.org/Xtext/Documentation/API"&gt;wiki page&lt;/a&gt; to see how we handle API contracts.&lt;/p&gt;&lt;p&gt;&lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt; and I will present &lt;a href="http://www.eclipsecon.org/2009/sessions?id=436"&gt;TMF Xtext M6 at EclipseCon&lt;/a&gt; next week.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;M7&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There are a couple of things we want to do in M7 (&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=242356"&gt;enum rules&lt;/a&gt;, &lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=263711"&gt;lazy linking&lt;/a&gt;, etc.). In addition it's planned to put the &lt;a href="http://www.eclipse.org/proposals/emf-index/"&gt;EMF Index&lt;/a&gt; into a shape, where it can become a solid foundation for linking and navigation in Xtext. Jan will give a short talk about the &lt;a href="http://www.eclipsecon.org/2009/sessions?id=501"&gt;EMF Index at EclipseCon&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;We do consulting&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Although mentioned, that M6 is not yet production-ready, we at &lt;a href="http://www.itemis.com/"&gt;itemis&lt;/a&gt; already help a couple of customers using &lt;a href="http://www.xtext.org/"&gt;TMF Xtext&lt;/a&gt; in industry projects. It's so important to use new technology to solve real problems and gather feedback which is based on real projects as soon as possible. Using TMF Xtext in many different projects gives us a pretty good feel for what's important and what is not. And so far the feedback from those projects is very positive.&lt;/p&gt;&lt;p&gt;It's also good to see that our business model actually works well (even in these times). This is especially important since doing open-source development which is only funded by doing consulting, is not that common at Eclipse.&lt;/p&gt;&lt;p&gt;So, don't forget that we provide professional support! This does not mean that we won't do regular unpaid support through the &lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.modeling.tmf"&gt;newsgroup.&lt;/a&gt; It's just that if you need things like prototypes, reliable response times, onsite trainings, etc. &lt;a href="http://oaw.itemis.com/openarchitectureware/language=en/2824/professional-services"&gt;you can get it&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7605409475915664013?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7605409475915664013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7605409475915664013&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7605409475915664013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7605409475915664013'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/03/tmf-xtext-m6.html' title='TMF Xtext M6'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-7206952587257270267</id><published>2009-02-02T08:00:00.003+01:00</published><updated>2009-02-02T08:10:18.339+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='itemis'/><title type='text'>itemis on TV</title><content type='html'>There was a competition in western Germany comparing medium-sized companies and how good they are as employer. And itemis won first price :-)&lt;br /&gt;&lt;br /&gt;See my colleagues on TV :  &lt;a href="http://tinyurl.com/aez2bd"&gt;http://tinyurl.com/aez2bd&lt;/a&gt;&lt;br /&gt;And in the Bild-Zeitung : &lt;a href="http://tinyurl.com/b9rpgc"&gt;http://tinyurl.com/b9rpgc&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-7206952587257270267?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/7206952587257270267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=7206952587257270267&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7206952587257270267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/7206952587257270267'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/02/itemis-on-tv.html' title='itemis on TV'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-6403206919806906272</id><published>2009-01-19T16:13:00.005+01:00</published><updated>2009-01-19T17:36:02.886+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='packrat'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='parser generator'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Xtext - new parser backend</title><content type='html'>So far, &lt;a href="http://www.xtext.org"&gt;Xtext&lt;/a&gt;'s parsing was based on &lt;a href="http://www.antlr.org"&gt;Antlr 3.0&lt;/a&gt;, a very popular Java-based parser generator.&lt;br /&gt;Unfortunately we've had an IP-issue with Antlr. As Xtext is an Eclipse project, all used libraries need to get IP-approved by the EMO. This has been done for the runtime of Antlr 3.0 but not for the generator. The generator is implemented in StringTemplate, Terence Parr's template language. The problem is that StringTemplate itself is implemented in Antlr 2.x, which won't get an approvement, because it is not clear where all it's code orginally comes from.&lt;br /&gt;As Terence won't be able to migrate StringTemplate to Antlr 3.0 before this summer, we had to solve this somehow. :-(&lt;br /&gt;&lt;br /&gt;The good news are, that we found a very nice solution:&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;We're implementing our own parser generator :-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Actually &lt;a href="http://zarnekow.blogspot.com/"&gt;Sebastian&lt;/a&gt; already did so and is still working on things like error recovery and error reporting. The parser backend is based on a &lt;a href="http://pdos.csail.mit.edu/%7Ebaford/packrat/"&gt;packrat parsing algorithm&lt;/a&gt;, which means it is scanner-less. We've read &lt;a href="http://www.cs.ucla.edu/%7Eawarth/papers/dls07.pdf"&gt;all&lt;/a&gt; &lt;a href="http://www.cs.nyu.edu/rgrimm/papers/pldi06.pdf"&gt;kinds&lt;/a&gt; &lt;a href="http://pdos.csail.mit.edu/%7Ebaford/packrat/thesis"&gt;of related papers&lt;/a&gt; (Actually, I was surprised how good the quality of those papers are) and played around with prototypes.&lt;br /&gt;&lt;br /&gt;The new implementation is three times faster. This does not mean that Antlr is three times slower, but that we've used it in a rather expensive way :-). The replacement of a lexer-based parser with a packrat algorithm also allows for much simpler composition of grammars (a.k.a. grammar modularization). And we can provide nice hooks for error recovery and handling.&lt;br /&gt;&lt;br /&gt;We now develop both solutions in parallel, so that the dependency to Antlr's generator is only 'works-with' as oppposed to 'pre-req'. But we hope that we're soon able to remove the Antlr implementation completely.&lt;br /&gt;&lt;br /&gt;Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-6403206919806906272?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/6403206919806906272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=6403206919806906272&amp;isPopup=true' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6403206919806906272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6403206919806906272'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/01/xtext-new-parser-backend.html' title='Xtext - new parser backend'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-5698183814198237939</id><published>2009-01-08T10:32:00.012+01:00</published><updated>2010-05-06T19:58:45.718+01:00</updated><title type='text'>Xtext Scopes and EMF Index</title><content type='html'>There is a new proposal for a so called &lt;a href="http://www.eclipse.org/proposals/emf-index/"&gt;EMF Index&lt;/a&gt;. At ESE I got the impression that a lot of people are looking for such a thing or have already built their own. To make clear what we expect from such a project, I'll try to explain why and how TMF Xtext needs such an "Index".&lt;br /&gt;&lt;br /&gt;The main difference between &lt;a href="http://www.xtext.org"&gt;Xtext&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/dd129869.aspx"&gt;Oslo's MGrammar&lt;/a&gt; or other parser generators, is that Xtext not only provides abstractions (mostly DSLs) to describe the syntax of a language, but also for implementing other aspects. One is linking. So where other frameworks create a tree, Xtext also takes care of the cross-links, hence creates a graph (a.k.a model).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;How does this work?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let me explain this by example.&lt;br /&gt;Assume you want to parse the following model:&lt;br /&gt;&lt;pre&gt;entity Animal&lt;br /&gt;entity Dog extends Animal&lt;br /&gt;&lt;/pre&gt;That is, two declarations of something we call 'entity' one 'extending' the other. The extend declaration 'extends Animal' cross-links to the actual declaration 'entity Animal'.&lt;br /&gt;So that we're able to write something like this when working on the parsed model later:&lt;br /&gt;&lt;pre&gt;myDog.getExtends().getName().equals("Animal")&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What do we need to do, to get this working?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First of all, one has to specify the syntax of the language including the syntax for the cross link. With Xtext one not only specifies the syntax but also writes down how a model is created during parsing:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;MyModel : (entities+=Entity)*;&lt;br /&gt;Entity : 'entity' name=ID ('extends' extends=[Entity|ID])?;&lt;br /&gt;&lt;/pre&gt;This would result in an ecore model of the following structure:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;EPackage {&lt;br /&gt;   EClass MyModel {&lt;br /&gt;        containment entities : Entity[]&lt;br /&gt;   }&lt;br /&gt;   EClass Entity {&lt;br /&gt;        name : EString&lt;br /&gt;        extends : Entity // the crosslink&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Naturally a parser is only able to create a tree, so parsing an instance of the DSL defined above would result in an unlinked model, which has to be linked in a second phase using the provided ID (which was 'Animal' in the introductory example).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So how do I find an Entity which is 'identifiable' by the text 'Animal'?&lt;/span&gt;&lt;br /&gt;By default Xtext assumes that the name of an EObject (if it's EClass has such an EAttribute) is the identifier. All the named elements within the same file are visible (as long as they have a unique name). We also have a very simple import mechanism:&lt;br /&gt;If you have an EObject, containing a string in an EAttribute called '&lt;span style="font-style: italic;"&gt;importURI&lt;/span&gt;', Xtext automatically creates an outer scope containing the content of the referred EMF Resource. "Outer scope" what's that?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Scoping&lt;/span&gt;&lt;br /&gt;In Xtext scopes (&lt;a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.tmf/org.eclipse.xtext/plugins/org.eclipse.xtext/src/org/eclipse/xtext/crossref/IScope.java?root=Modeling_Project&amp;amp;view=markup"&gt;IScope&lt;/a&gt;) are nested. Each scope makes EObjects visible by an identifier (String).&lt;br /&gt;Assume we have added the import feature described above:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;MyModel :&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(imports+=Import)*&lt;/span&gt;&lt;br /&gt;(entities+=Entity)*;&lt;br /&gt;&lt;br /&gt;Import :&lt;br /&gt;'import' &lt;span style="font-weight: bold;"&gt;importURI&lt;/span&gt;=STRING;&lt;br /&gt;&lt;br /&gt;Entity :&lt;br /&gt;'entity' name=ID ('extends' extends=[Entity|ID])?;&lt;br /&gt;&lt;/pre&gt;... we would be able to have two files:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;myModel1.dsl&lt;/span&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt; entity Animal&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;and &lt;span style="font-style: italic;"&gt;otherModel.dsl&lt;/span&gt;&lt;br /&gt;&lt;pre&gt; import "myModel1.dsl"&lt;br /&gt;entity Dog extends Animal&lt;br /&gt;&lt;/pre&gt;The scope used to do the linking in the declaration of entity 'Dog' would have an outer scope containing the definitions from the imported file ('-&gt;' means outer):&lt;br /&gt;&lt;pre&gt; scope (elements from otherModel.dsl) -&gt; scope(elements from myModels1.dsl)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If we would add additional import statements, we would get additional outer scopes in the order of declaration:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import "myModel1.dsl"&lt;br /&gt;import "myModel2.dsl"&lt;br /&gt;import "myModel3.dsl"&lt;br /&gt;entity Dog extends Animal&lt;br /&gt;&lt;/pre&gt;results in&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;scope(elements from local resource) -&gt;&lt;br /&gt;scope(elements from myModels1.dsl) -&gt;&lt;br /&gt;scope(elements from myModels2.dsl) -&gt;&lt;br /&gt;scope(elements from myModels3.dsl)&lt;br /&gt;&lt;/pre&gt;So the linker would ask the most inner scope for an element called 'Animal'. If it contains such an element it returns it if not it asks it's outer scope.&lt;br /&gt;This means that an inner scope overlays elements from the outer scope. So it would be ok to have a declaration of 'Animal' in the local file, but the one imported from 'myModel1.dsl' wouldn't be referenceable anymore.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;import "myModel1.dsl"&lt;br /&gt;entity Dog extends Animal&lt;br /&gt;entity Animal // this one overlays the definition imported from myModel.dsl&lt;br /&gt;&lt;/pre&gt;If you don't want to allow overwriting things, you'll have to add constraints, which is of course possible but is a different topic.&lt;br /&gt;Ok, I hope you have an idea of how linking in TMF Xtext basically works.&lt;br /&gt;&lt;br /&gt;Although the described default semantics might be sufficient in many cases, sometimes scoping and linking is a bit more sophisticated. We won't need (and currently have) something like an Index, but it might speed things up, if one wouldn't need to load referenced resources while linking but just ask something like an Index, what's in a resource. The Index could provide a normalized EMF URI, which can then be set into a proxy.&lt;br /&gt;Also there are IDE things like "Find Model Element" or code completion for available resources, which would be easy to implement on top of an EMF Index.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Advanced Scoping and Linking&lt;/span&gt;&lt;br /&gt;Anyway, if you want to have something more file-system independent like Java's class path, where one imports name spaces instead of actual URIs, you would need some kind of repository (similar to the class path) containing all referenceable elements. This is because it would far two expensive to "scan the world" each time you want to satisfy a link.&lt;br /&gt;&lt;br /&gt;In fact I think that leveraging the Java class path is a very good idea, since it is well understood by Xtext users and is well supported in the development phase (Eclipse JDT, or even the OSGi support from PDT) and at runtime. That's why Xtext has a URIConverter introducing a class path scheme for EMF resources. So what we want to do most of the time is to scan the class path for EMF resources and index them.&lt;br /&gt;We would need to index them per container (jar, class-folder, etc.), because the class path is also scoped hierarchically.&lt;br /&gt;Such a hierarchy could look like so:&lt;br /&gt;&lt;pre&gt; classpathScope{stuff from bin/} -&gt;&lt;br /&gt;classpathScope{stuff from foo.jar/} -&gt;&lt;br /&gt;... -&gt;&lt;br /&gt;classpathScope{stuff from JRE System Library}&lt;br /&gt;&lt;/pre&gt;And of course, we would like to have these global scopes backed up by the EMF Index transparently integrated into our scoping hierarchy. This turns out to be very natural if we look into a final example, showing how we would implement the scoping for Java:&lt;br /&gt;&lt;div dir="ltr" style="text-align: left;"&gt;&lt;pre class="source-java"&gt;&lt;span class="co1"&gt;// file contents scope&lt;/span&gt;&lt;br /&gt;&lt;span class="co2"&gt;import static my.Constants.&lt;span style="font-weight: bold;"&gt;STATIC&lt;/span&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kw2"&gt;public&lt;/span&gt; &lt;span class="kw2"&gt;class&lt;/span&gt; ScopeExample &lt;span class="br0"&gt;{&lt;/span&gt; &lt;span class="co1"&gt;// class body scope&lt;/span&gt;&lt;br /&gt; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw3"&gt;Object&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;field&lt;/span&gt; = &lt;span class="kw2"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt; &lt;span class="kw2"&gt;private&lt;/span&gt; &lt;span class="kw4"&gt;void&lt;/span&gt; method&lt;span class="br0"&gt;(&lt;/span&gt;&lt;span class="kw3"&gt;String&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;param&lt;/span&gt;&lt;span class="br0"&gt;)&lt;/span&gt; &lt;span class="br0"&gt;{&lt;/span&gt; &lt;span class="co1"&gt;// method body scope&lt;/span&gt;&lt;br /&gt;  &lt;span class="kw3"&gt;String&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;localVar&lt;/span&gt; = null;&lt;br /&gt;  innerBlock: &lt;span class="br0"&gt;{&lt;/span&gt; &lt;span class="co1"&gt;// block scope&lt;/span&gt;&lt;br /&gt;   &lt;span class="kw3"&gt;String&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;innerScopeVar&lt;/span&gt; = null&lt;span class="st0"&gt;&lt;/span&gt;;&lt;br /&gt;   &lt;span class="kw3"&gt;Object&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;field&lt;/span&gt; = null;&lt;br /&gt;   &lt;span class="co1"&gt;// ?SCOPE?&lt;/span&gt;&lt;br /&gt;  &lt;span class="br0"&gt;}&lt;/span&gt;&lt;br /&gt; &lt;span class="br0"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span class="br0"&gt;}&lt;/span&gt;&lt;span style="font-family:Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;The object scope created in the inner block (//?SCOPE?) would look like so:&lt;br /&gt;&lt;pre&gt; blockScope{field,innerScopeVar}-&gt;&lt;br /&gt;methodScope{localVar,param}-&gt;&lt;br /&gt;classScope{field}-&gt;&lt;br /&gt;fileScope{STATIC}-&gt; //the static import&lt;br /&gt;classpathScope{static fields from bin/} -&gt; // (e.g. my.Constants.STATIC)&lt;br /&gt;classpathScope{static fields from foo.jar/} -&gt;&lt;br /&gt;... -&gt;&lt;br /&gt;classpathScope{static fields JRE System Library}&lt;br /&gt;&lt;/pre&gt;For performance reasons it would be useful to have some kind of database (EMF Index) backing up the class path scopes. Especially during development (modeling) , because it would be necessary to re-index changed models.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EMF Index&lt;/span&gt;&lt;br /&gt;So mainly we want to have something which tells us what elements are available in a given 'world'. Such a 'world' like a Java class path includes EObjects (from several EMF resources). It should be possible to define and configure arbitrary implementations of 'worlds' (databases, web, workspace, etc.). Elements contained in a world, need to be selectable using an identifier (unique within a world). It also should be possible to add arbitrary additional information to such entry.&lt;br /&gt;&lt;br /&gt;As mentioned, IMHO such an Index is important to track changes during development (i.e. modeling). Also we want to have code completion for globally available elements, look model elements up by name, etc.. At runtime we need to load all the models anyway, so the need for an index is not that important.&lt;br /&gt;&lt;br /&gt;This has been a lengthy post (sorry). But if you made it to this point, it would be very helpful to hear what you think about this. Would the scope abstraction work for the languages you have in mind? What do you expect from an EMF Index? Maybe answers to the latter question better go to the &lt;a href="http://www.eclipse.org/newsportal/thread.php?group=eclipse.technology.emft"&gt;EMFT news group&lt;/a&gt; :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-5698183814198237939?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/5698183814198237939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=5698183814198237939&amp;isPopup=true' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5698183814198237939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5698183814198237939'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/01/xtext-scopes-and-emf-index.html' title='Xtext Scopes and EMF Index'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-20250601843045910</id><published>2009-01-06T22:04:00.009+01:00</published><updated>2009-01-06T22:42:14.851+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>EMFatic implemented in TMF Xtext (Screencast)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ii_da0jTxAY/SWPM4FsNY8I/AAAAAAAAALA/qlwpEjz7zyo/s1600-h/Picture+3.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 249px; height: 150px;" src="http://3.bp.blogspot.com/_Ii_da0jTxAY/SWPM4FsNY8I/AAAAAAAAALA/qlwpEjz7zyo/s400/Picture+3.png" alt="" id="BLOGGER_PHOTO_ID_5288295651435439042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="https://www.xing.com/profile/Michael_Clay"&gt;Michael Clay&lt;/a&gt; is working on a &lt;a href="http://www.xtext.org/"&gt;TMF Xtext&lt;/a&gt; implementation of &lt;a href="http://www.google.de/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwiki.eclipse.org%2FEmfatic&amp;amp;ei=OcxjSZCgN4PI0gWauZjKCA&amp;amp;usg=AFQjCNHIeZkbqChplH0Na4Q5uUlzB1-WsQ&amp;amp;sig2=rWt1usX4SEcxaKGsxEaNyw"&gt;EMFatic&lt;/a&gt; (see &lt;a href="http://www.screencast.com/t/UAtBcfRF"&gt;this screencast&lt;/a&gt;).&lt;br /&gt;He's also prepared &lt;a href="http://www.screencast.com/t/5wek9C3FIr"&gt;a screencast&lt;/a&gt; showing template proposals on &lt;a href="http://martinfowler.com/dslwip/Intro.html#TheStateMachineFramework"&gt;Martin Fowler's DSL example&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We'll show more of &lt;a href="http://www.eclipsecon.org/2009/sessions?id=436"&gt;TMF Xtext at EclipseCon&lt;/a&gt; in march.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-20250601843045910?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/20250601843045910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=20250601843045910&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/20250601843045910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/20250601843045910'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2009/01/emfatic-implemented-in-tmf-xtext.html' title='EMFatic implemented in TMF Xtext (Screencast)'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ii_da0jTxAY/SWPM4FsNY8I/AAAAAAAAALA/qlwpEjz7zyo/s72-c/Picture+3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3563756476852141672</id><published>2008-11-10T14:12:00.003+01:00</published><updated>2008-11-10T14:21:18.981+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='slides'/><category scheme='http://www.blogger.com/atom/ns#' term='scala'/><title type='text'>W-JAX slides online</title><content type='html'>I've just uploaded the slides of the presentations I gave at last weeks W-JAX conference in munich.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.slideshare.net/sefftinge/scala-737461/"&gt;Scala&lt;/a&gt; - (It's an introduction to a programming language called Scala. Most of the slides contain code snippets only, so it may not be that usable without explanation.)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.slideshare.net/sefftinge/MissingFeaturesInJava/"&gt;Vermisste Sprachfeatures in Java&lt;/a&gt; (it's in german and is about some IMHO important language features Java lacks.)&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3563756476852141672?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3563756476852141672/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3563756476852141672&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3563756476852141672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3563756476852141672'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/11/w-jax-slides-online.html' title='W-JAX slides online'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-8796355388424654294</id><published>2008-10-17T12:28:00.008+01:00</published><updated>2008-10-17T13:25:24.702+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java multi-line strings'/><title type='text'>Multi-line String Literals in Java</title><content type='html'>Having multi-line string literals is a common and useful thing in most modern languages. It is for instance very convenient to use multi-line strings to specify test data in-line as opposed to referring to external files containing the data. As Java lackes multi-line string literals, one observes the definition of data in external files very often.&lt;br /&gt;&lt;br /&gt;I've implemented multi-line strings in Java using a library approach, so that it's possible to write the following:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    /**&lt;br /&gt;  * @param args&lt;br /&gt;  */&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  System.out.println(S(/* &lt;br /&gt;     Wow, we finally have&lt;br /&gt;      multiline strings in&lt;br /&gt;       Java! HOOO!&lt;br /&gt;          */));&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;which will print the following to standard out:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;                                 Wow, we finally have&lt;br /&gt;                                 multiline strings in&lt;br /&gt;                                 Java! HOOO!&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;How does this work?&lt;br /&gt;Well, first of all you have to make sure that your source is on the class path, then the following code does the job:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   public static String S() {&lt;br /&gt;       StackTraceElement element = new RuntimeException().getStackTrace()[1];&lt;br /&gt;       String name = element.getClassName().replace('.', '/') + ".java";&lt;br /&gt;       InputStream in = getClassLoader().getResourceAsStream(name);&lt;br /&gt;       String s = convertStreamToString(in, element.getLineNumber());&lt;br /&gt;       return s.substring(s.indexOf("/*")+2, s.indexOf("*/"));&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Obviously this don't perform that well, but for unit testing it's sufficient. &lt;br /&gt;Maybe it would be cool to add some support for interpolation functionality to it (using e.g. groovy or Xpand).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-8796355388424654294?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/8796355388424654294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=8796355388424654294&amp;isPopup=true' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8796355388424654294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8796355388424654294'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/10/multi-line-string-literals-in-java.html' title='Multi-line String Literals in Java'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3533038578504554843</id><published>2008-09-24T08:13:00.002+01:00</published><updated>2008-09-24T08:36:05.983+01:00</updated><title type='text'>Article on Xtext and oAW</title><content type='html'>I just found &lt;a href="http://www.mt-ag.com/web/download/experts_library/special_interest_artikel/Implementation%20and%20Integration%20of%20a%20DSL.pdf"&gt;a really nice article/tutorial on Xtext and oAW&lt;/a&gt; on the web.&lt;br /&gt;&lt;br /&gt;It walks you through the process of&lt;br /&gt;1) designing a dsl with xtext&lt;br /&gt;2) adding constraints&lt;br /&gt;3) enhancing the generated text editor&lt;br /&gt;4) generating some code out of it&lt;br /&gt;in great detail (about 30) and very well written.&lt;br /&gt;&lt;br /&gt;The author comes to this nice conclusion :&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;Finally, consider the effort we had to invest. It took a couple of pages to describe the process, but when you count the actual lines of code we had to write and the number of clicks we had to perform, you may agree that this does not amount to anything worth worrying about. The framework kept most of the complexities away from us. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;It is the power of frameworks like oAW that let us leverage the potential of DSLs and related concepts into our daily projects.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3533038578504554843?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3533038578504554843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3533038578504554843&amp;isPopup=true' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3533038578504554843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3533038578504554843'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/09/article-on-xtext-and-oaw.html' title='Article on Xtext and oAW'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-4609380187109332640</id><published>2008-09-18T20:49:00.013+01:00</published><updated>2008-09-18T22:15:25.720+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Languages'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><category scheme='http://www.blogger.com/atom/ns#' term='internal DSLs'/><title type='text'>Language feature supporting internal DSLs</title><content type='html'>There's a lot of discussion going on about internal or embedded DSLs and what programming languages are best suited to develop them.&lt;br /&gt;Mainly an internal DSL is about pushing the syntactic flexibility of a language to it's limits in order to write against an API in a domain-specific manner. What that means depends on the DSL but in most cases it means simplification of client code by implying context, allowing declarativity and avoiding &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt;-violation.&lt;br /&gt;&lt;br /&gt;Many people think, that it is the dynamic nature of a language which makes it suitable for internal DSLs. That is only partly true. More important than the possibility to do meta programming is to have a flexible syntax allowing to invoke functions with different syntaxes (omitting paranthesis, semicolons, etc.). Ruby and Scala are both very flexible in this sense.&lt;br /&gt;&lt;br /&gt;Working on the new version of &lt;a href="http://www.xtext.org"&gt;Xtext&lt;/a&gt;, I had an idea for what I think would be a cool language feature.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Introducing new syntax via libraries&lt;/span&gt;&lt;br /&gt;When declaring a function, one typically only declares a name and what kind of parameters need to be passed in. Programming languages themselfs then have defined a (more or less flexible) generic way of how such functions can be invoked.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;pre&gt;def foo(String x) : "foo"+x;&lt;/pre&gt;which is invoked like this :&lt;br /&gt;&lt;pre&gt;foo("bar")&lt;/pre&gt;Imagine a language which alternatively allows to specify the concrete syntax of how such a function is invoked.:&lt;br /&gt;&lt;pre&gt;def  myFunc : 'foo' x=ID : "foo"+x;&lt;/pre&gt;Where the part between the first and the second colon introduces a new syntax (I've reused the Xtext syntax here) which can be used to invoke the function, so one could simply write:&lt;br /&gt;&lt;pre&gt;foo bar&lt;/pre&gt;Where 'foo' is a newly introduced keyword (limited to the static scope where the definition is visible of course) and bar is an identifier which is a builtin lexer token of type String.&lt;br /&gt;&lt;br /&gt;Another example:&lt;br /&gt;&lt;pre&gt;def Person :&lt;br /&gt;    ('girl'|male?='boy') name=ID (lastName=ID)? ('from' city=ID)? :&lt;br /&gt;    new Person(male,name,lastName,city);&lt;br /&gt;&lt;br /&gt;def greet :&lt;br /&gt;    p1=Person 'greets' 'the'? p2=Person :&lt;br /&gt;    p2.greetedBy = p1;&lt;br /&gt;&lt;/pre&gt;which would allow for expressions like:&lt;br /&gt;&lt;pre&gt;boy Sven from Kiel greets the girl Scarlett Johansson&lt;/pre&gt;and would effectively construct two instances of person and link them. :-)&lt;br /&gt;&lt;br /&gt;Obviously this would be a tough thing to implement (parsers which dynamically change their behaviour) and it would also be problematic to avoid ambiguities with syntaxes imported by other libraries or introduced by the host language. I haven't spent much time on thinking it out yet. So maybe there are obvious show stoppers I overlooked or one of your neighbors has already developed such a language a decade ago?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-4609380187109332640?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/4609380187109332640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=4609380187109332640&amp;isPopup=true' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4609380187109332640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/4609380187109332640'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/09/language-feature-supporting-internal.html' title='Language feature supporting internal DSLs'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3348309176828323260</id><published>2008-09-05T07:23:00.005+01:00</published><updated>2008-09-05T07:53:15.353+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML modeling brumm brumm'/><title type='text'>Product-line engineering with UML</title><content type='html'>Some time ago one of our current customers, an international tractor manufacturer, wanted us to come up with a domain-specific language to describe his products (i.e. tractors) in order to manage the different variants, etc.&lt;br /&gt;&lt;br /&gt;I always was really skeptical about using UML to define DSLs, but after investigating several month in tweaking it, we came up with an IMHO very pragmatic and concise solution.&lt;br /&gt;With this a farmer is now able to simulate how it feels to work with the different tractors.&lt;br /&gt;The DSL provides the typical variability people need, when defining a new product:&lt;br /&gt; - number of wheels&lt;br /&gt; - number of exhaust pipes&lt;br /&gt; - whether the farmer wants to sit at the front or behind&lt;br /&gt; - etc.&lt;br /&gt;&lt;br /&gt;Here's an example of how such model looks like. Isn't that declarative and intentional?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ii_da0jTxAY/SMDR48NGwjI/AAAAAAAAABE/-a-J0j9JUng/s1600-h/Picture+1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_Ii_da0jTxAY/SMDR48NGwjI/AAAAAAAAABE/-a-J0j9JUng/s400/Picture+1.png" alt="" id="BLOGGER_PHOTO_ID_5242420742423233074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;With &lt;a href="http://ed-merks.blogspot.com/2008/08/itemis-putting-your-money-where-your.html"&gt;Ed on board&lt;/a&gt; and&lt;a href="http://ed-merks.blogspot.com/2008/08/emf-isnt-rocket-science-but-dont-tell.html"&gt; his new contacts at NASA&lt;/a&gt;, we hope we can reuse this DSL in order to model space ships, etc. at NASA.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3348309176828323260?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3348309176828323260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3348309176828323260&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3348309176828323260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3348309176828323260'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/09/product-line-engineering-with-uml.html' title='Product-line engineering with UML'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ii_da0jTxAY/SMDR48NGwjI/AAAAAAAAABE/-a-J0j9JUng/s72-c/Picture+1.png' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-992743837975911255</id><published>2008-09-03T12:34:00.006+01:00</published><updated>2008-09-03T13:34:37.073+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java testing performance'/><title type='text'>Testing Processing Time on a JVM</title><content type='html'>I think most people would agree that having some unit tests, which ensures that non-functional requirements are met, is a good idea. With processing time people usually use time in order to measure whether a particular function runs within the requirements. However, everybody knows that measuring time is inaccurate, since it varies depending on the machine the tests are running and whether there are other process consuming resources in parallel.&lt;br /&gt;&lt;br /&gt;Wouldn't it be cool to just &lt;span style="font-weight: bold;"&gt;count the atomic operations per thread&lt;/span&gt; executed by e.g. the Java VM?&lt;br /&gt;We could than have a reference system, which is used to give each atomic operation a value (e.g. nanoseconds).&lt;br /&gt;&lt;br /&gt;Then I would like to write tests like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;@ExecutesIn(23000)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public void testFoo() {&lt;br /&gt;  doStuff("Foo "+" bar");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Where the number 23000 is the time it would take to run the code on the reference system. The test would always take the same time, no matter &lt;span style="font-family:arial;"&gt;it was run on an x386 machine or a modern multi GHz box.&lt;br /&gt;&lt;br /&gt;Questions:&lt;br /&gt;Does anyone know whether such a tool/library/framework already exists?&lt;br /&gt;And if not, do you have any idea of how this could be implemented?&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-992743837975911255?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/992743837975911255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=992743837975911255&amp;isPopup=true' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/992743837975911255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/992743837975911255'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/09/testing-processing-time-on-jvm.html' title='Testing Processing Time on a JVM'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-2654625388373994234</id><published>2008-09-01T10:35:00.008+01:00</published><updated>2008-11-11T12:03:29.405+01:00</updated><title type='text'>DSLs in the Netherlands</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ii_da0jTxAY/SLu-gxXCPpI/AAAAAAAAAA8/EHoD5G4CsMQ/s1600-h/IMG_0235.JPG"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_Ii_da0jTxAY/SLu-gxXCPpI/AAAAAAAAAA8/EHoD5G4CsMQ/s400/IMG_0235.JPG" alt="" id="BLOGGER_PHOTO_ID_5240992061590748818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Last friday I was in the Netherlands near Amsterdam to give a talk about Xtext at &lt;a href="http://java.profict.nl/"&gt;profict summer camp&lt;/a&gt; 2008. This was really a nice event in an impressing location (see picture - people work there!). They'd invited thee speakers:&lt;br /&gt;&lt;br /&gt;First &lt;a href="http://www.nealford.com/"&gt;Neal Ford&lt;/a&gt; gave a very entertaining introduction on DSLs. After that he talked about implementing internal DSLs with Java, Groovy and Ruby. He also mentioned external DSLs very briefly and recommended Antlr for this very much.&lt;br /&gt;&lt;br /&gt;His talk gave a nice foundation for my introduction of Xtext. Which I did by leveraging the terminalogy Neal introduced (As Neal is a collegue of Martin Fowler and has done a lot talks on DSLs with him, I assumed that he will stick to Martin's terminology and I was right) . I also showed the &lt;a href="http://effi-blog.blogspot.com/2008/06/fowlers-dsl-example-with-xtext.html"&gt;implementation of the example&lt;/a&gt; from &lt;a href="http://martinfowler.com/dslwip/"&gt;Martin Fowler's upcoming Book on DSLs&lt;/a&gt;, which should help to compare the different technologies (internal DSL in Ruby, Antlr, Xtext).&lt;br /&gt;I've been asked to put my presentation slides online. So &lt;a href="http://www.slideshare.net/sefftinge/xtext-profict-summer-camp-presentation/"&gt;here they are&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The last presenter, &lt;a href="http://www.zefhemel.com/"&gt;Zef Hemel&lt;/a&gt; from TU Delft, showed us a web framework called &lt;a href="http://webdsl.org/"&gt;WebDSL&lt;/a&gt;, which uses a lot of external DSLs to make development of database driven web applications (CRUD and more) easier. It is implemented in &lt;a href="http://www.program-transformation.org/Stratego/StrategoXT"&gt;strategoXT&lt;/a&gt;, which is crazy stuff.&lt;br /&gt;&lt;br /&gt;After that there was a panel while outdoor a great smelling barbecue was prepared. Unfortunately I had to catch my flight back, so I had to leave without any barbecue :-(.&lt;br /&gt;Anyway the event was really nice and I've met a lot of very nice people there. It seems that DSLs are a hot topic in the Netherlands.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-2654625388373994234?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/2654625388373994234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=2654625388373994234&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2654625388373994234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2654625388373994234'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/09/dsls-in-netherlands.html' title='DSLs in the Netherlands'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ii_da0jTxAY/SLu-gxXCPpI/AAAAAAAAAA8/EHoD5G4CsMQ/s72-c/IMG_0235.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-879143678881694407</id><published>2008-09-01T09:51:00.004+01:00</published><updated>2008-09-01T10:34:56.476+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse modeling itemis'/><title type='text'>Ed Merks now working for itemis</title><content type='html'>Last Friday, &lt;a href="http://ed-merks.blogspot.com/"&gt;Ed Merks&lt;/a&gt; (Eclipse Modeling PMC Lead, EMF Lead, Board Member... you know him) has &lt;a href="http://ed-merks.blogspot.com/2008/08/itemis-putting-your-money-where-your.html"&gt;officially announced&lt;/a&gt; that he's now working for &lt;a href="http://www.itemis.com/"&gt;itemis AG&lt;/a&gt;.&lt;br /&gt;I'm especially happy with this because when I first heard that Ed has quitted IBM, I was a bit worried whether he would be able to do the great job he's doing at Eclipse in the future. &lt;br /&gt;&lt;br /&gt;I'm pretty sure that this was a good step, not only for itemis and Ed but also for Eclipse and Eclipse Modeling, since this ensures that Ed can follow up on helping Eclipse Modeling becoming the most open, flexible and powerful DSL toolkit.&lt;br /&gt;&lt;br /&gt;Why? Because the business model of itemis is not to develop another commercial product on top of Eclipse but to help people using the open-source technology at Eclipse directly (we're doing consulting, trainings, support, etc. then).&lt;br /&gt;&lt;br /&gt;And we don't want to do consulting which could be eliminated by better tools and better documentation. We think that DSLs and generators/interpreters will and should become mainstream. Therefore we need to lower the barriers and make the tools and languages as good as possible. We want to make software development better. AFAIK this doesn't conflict with Ed's goals :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-879143678881694407?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/879143678881694407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=879143678881694407&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/879143678881694407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/879143678881694407'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/09/ed-merks-now-working-for-itemis.html' title='Ed Merks now working for itemis'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-6800419009637233398</id><published>2008-08-08T08:47:00.005+01:00</published><updated>2008-08-08T14:49:48.067+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='oAW'/><category scheme='http://www.blogger.com/atom/ns#' term='refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC'/><title type='text'>Refactorings for oAW 4.3</title><content type='html'>&lt;a href="http://modelmind.blogspot.com/"&gt;Steven Reinisch&lt;/a&gt;, now studying at hasso-plattner-institute for software systems engineering, has added some cool refactorings to Xpand and Xtend languages of &lt;a href="http://www.openarchitectureware.org/"&gt;openArchitectureWare&lt;/a&gt; 4.3 during this year's &lt;a href="http://wiki.eclipse.org/Refactorings_for_Xpand_/_Xtend_/_Check"&gt;Google Summer Of Code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;During the development he lived in Kiel in order to work in &lt;a href="http://maps.google.com/maps?q=54.335167%2C%2010.119291"&gt;our office&lt;/a&gt; at itemis. He managed to understand the code base of Xpand more or less independently. It was a pleasure to work with him and I'm looking forward to future contributions from Steven (He said he's willing to do so :-)).&lt;br /&gt;&lt;br /&gt;It's not sure where and how this work will be made available. If we don't put it into oAW 4.3.1, itemis will include it in the distros available at &lt;a href="http://oaw.itemis.eu/5408/downloads.html"&gt;oaw.itemis.eu&lt;/a&gt; when it's finished.&lt;br /&gt;&lt;br /&gt;Here's a &lt;a href="http://gonzo.uni-weimar.de/%7Ereinisch/gsoc/oaw_refac.avi.ff.mov"&gt;screencast&lt;/a&gt; steven made.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-6800419009637233398?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/6800419009637233398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=6800419009637233398&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6800419009637233398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/6800419009637233398'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/08/refactorings-for-oaw-43.html' title='Refactorings for oAW 4.3'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-8077964057964206774</id><published>2008-07-15T11:21:00.005+01:00</published><updated>2008-07-15T14:46:24.531+01:00</updated><title type='text'>MDSD and DSLs</title><content type='html'>I'm regularly reading Martin Fowler's blog and am especially interested in his writings about DSLs. I usually tend to agree with and like what he says about that topic.&lt;br /&gt;In his &lt;a href="http://martinfowler.com/bliki/ModelDrivenSoftwareDevelopment.html"&gt;recent&lt;/a&gt; &lt;a href="http://martinfowler.com/bliki/MDSDandDSL.html"&gt;posts&lt;/a&gt; he started to talk about MDSD and how it's related to DSLs. As I'm somewhat involved in the MDSD community, I wanted to clarify what MDSD means to me.&lt;br /&gt;&lt;br /&gt;Basically, MDSD is about&lt;br /&gt;1) defining domain-specific abstraction (no matter how) and&lt;br /&gt;2) make them executable (no matter how).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Defining abstractions&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Sometimes the general-purpose programming language (GPL), e.g. Java or Ruby, can be used to define such abstractions (we call these abstractions APIs or internal DSLs). If the GPL is not flexible enough or we need static typing or better tooling, etc. we design an external DSL.&lt;br /&gt;&lt;br /&gt;Most people think that developing an external DSL is complicated, because if it's a textual DSL you need to develop a &lt;a href="http://martinfowler.com/bliki/ParserFear.html"&gt;parser&lt;/a&gt;, if it's graphical you need an editor, etc.. Therefore people  customize/extend existing languages like XML or UML a lot.&lt;br /&gt;&lt;br /&gt;However, nowadays it's not complicated to define an external DSL anymore. Frameworks like &lt;a href="http://www.xtext.org"&gt;Xtext&lt;/a&gt; and the &lt;a href="http://www.eclipse.org/modeling/"&gt;Eclipse Modeling Project&lt;/a&gt; in general offer a variety of tools and libraries to make the design of external DSLs easy and more important flexible, in terms that the DSL can grow and evolve over time. DSLs are a lively part of your project and therefore need to evolve like the rest of your software.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Make DSLs executable&lt;br /&gt;&lt;/span&gt;&lt;blockquote style="font-style: italic;"&gt;"A difference is that most MDSD  people assume that you'll want to generate code from that model  rather than executing the model directly."&lt;/blockquote&gt;I don't assume code generation. Interpretation is of course a common option. Both approaches have their pros and cons. Generally speaking, one could say that code generation has strength when the DSL is of a structural nature (like a domain or component model), the target language is statically typed and you don't need to have dynamic execution of DSL expressions.&lt;br /&gt;But it's also perfectly ok to generate code out of behavioural languages (such as statemachines) or interpret structural information like hibernate or spring do with their XML-based configuration DSLs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other misconceptions about MDSD&lt;br /&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;In order to use model-oriented DSLs you need a different,  &lt;a href="http://martinfowler.com/bliki/RepositoryBasedCode.html"&gt;RepositoryBasedCode&lt;/a&gt;,   approach to tooling.&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;/blockquote&gt;There are a lot of modeling tools using this approach. However we (Eclipse Modeling) use plain text files to store our models, because we think it's important to have all relevant information to build the software system in the same version control system. Also we want to reuse common, proven tools such as Diff and Merge.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;DSLs seem to have a proportionately higher emphasis in the MDSD  world than they do in the mainstream programming world.&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;&lt;/blockquote&gt;MDSD is not a holistic approach to develop software or a replacement to "mainstream programming", it's just the "how can I use external DSLs"-technique. And DSLs are just one useful thing among many others. MDSD emphasizes DSLs like AOP emphasizes Aspects.&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;"&lt;/span&gt;A particularly visible sub-community of MDSD is centered around  ModelDrivenArchitecture (MDA). I'm not much of a fan of MDA in  particular&lt;span style="font-style: italic;"&gt; ..."&lt;/span&gt;&lt;/blockquote&gt;MDA indeed is a heavyweight thing which is based on overly complex standards and faces problems which are not relevant in most situations (like being platform independent). Also the suggestion of using UML and it's profile mechanism to define DSLs and layering code generators (make them target platform independent) with multiple model transformations is questionable.&lt;br /&gt;To me MDSD has not much in common with MDA.&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;"Model Driven Software Development (MDSD) ... considers itself as an alternative to the  traditional style of programming"&lt;/blockquote&gt;To me it's more like an extension. Again: MDSD is only about using DSLs, interpreters and code generators and integrate them in your project. To be a good software developer you need to have much more than this in your mental tool box.&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;"Most fans of MDSD  base their enthusiasm on the basis that models are ipso facto a  higher level abstraction than programming languages."&lt;/blockquote&gt;I also have met people (mostly with a CASE or MDA background) who haven't yet understood that models are just information like code is information and DSLs are just about specifying information in an abstract, concise, intentional and non-redundant manner. Models are code!&lt;br /&gt;Sometimes those people even talk about "hand-written code" like it was something dirty. They argue that with models and code generation everything gets automated and forget that especially modeling in a graphical tool takes more time than writing the same information into a text document. IMHO such statements are one of the reasons why people like Martin think of MDSD being a holistic, tool-centric, heavy-weight approach (this is what I read between the lines).&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-8077964057964206774?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/8077964057964206774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=8077964057964206774&amp;isPopup=true' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8077964057964206774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/8077964057964206774'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/07/mdsd-and-dsls.html' title='MDSD and DSLs'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-2303322486121601774</id><published>2008-06-26T09:31:00.003+01:00</published><updated>2008-06-26T09:42:39.589+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSLs'/><category scheme='http://www.blogger.com/atom/ns#' term='MDSD'/><category scheme='http://www.blogger.com/atom/ns#' term='code generation'/><title type='text'>MDSD Best Practices</title><content type='html'>InfoQ just published a new article written by &lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt;, &lt;a href="http://www.peterfriese.de/"&gt;Peter&lt;/a&gt; and me.&lt;br /&gt;It's called &lt;a href="http://www.infoq.com/articles/model-driven-dev-best-practices"&gt;"Best Practices for Model-Driven Software Development"&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I hope you enjoy it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-2303322486121601774?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/2303322486121601774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=2303322486121601774&amp;isPopup=true' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2303322486121601774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2303322486121601774'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/06/mdsd-best-practices.html' title='MDSD Best Practices'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-5896579669625806287</id><published>2008-06-17T16:32:00.003+01:00</published><updated>2008-06-17T16:44:17.962+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>Next Monday: Eclipse Stammtisch in Dortmund, Germany!</title><content type='html'>Just a short reminder for those who're interested in meeting up with &lt;a href="http://ralph-at-eclipse.blog.de/"&gt;Ralph&lt;/a&gt; and other Eclipse enthusiasts. &lt;br /&gt;On next monday (June 23rd) an Eclipse Stammtisch is taking place at 7 p.m in the Strandbar SOLENDO (http://www.solendo.de) near Dortmund harbor (didn't know they even have water there ;-)). Anyway they have BEER!&lt;br /&gt;Cheers!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-5896579669625806287?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/5896579669625806287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=5896579669625806287&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5896579669625806287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5896579669625806287'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/06/next-monday-eclipse-stammtisch-in.html' title='Next Monday: Eclipse Stammtisch in Dortmund, Germany!'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1534885233979467346</id><published>2008-06-10T14:42:00.010+01:00</published><updated>2008-06-10T16:47:16.819+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='oAW'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Fowler's DSL example with Xtext</title><content type='html'>In his recent DSL related blog entries (&lt;a href="http://www.martinfowler.com/bliki/ParserFear.html"&gt;ParseFear&lt;/a&gt; and &lt;a href="http://www.martinfowler.com/bliki/SyntacticNoise.html"&gt;Syntactic Noise&lt;/a&gt;), Martin Fowler mentioned a &lt;a href="http://martinfowler.com/dslwip/Intro.html"&gt;DSL example&lt;/a&gt; he's using in his upcoming DSL book. &lt;a href="http://martinfowler.com/dslwip/TreeConstruction.html"&gt;Here&lt;/a&gt; you can see how it is implemented using Antlr and a lot of Java.&lt;br /&gt;&lt;br /&gt;This is how it can be done using Xtext and openArchitectureWare.&lt;br /&gt;1) Download the &lt;a href="http://oaw.itemis.eu/5408/downloads.html"&gt;oAW distro from itemis&lt;/a&gt;&lt;br /&gt;2) Create a new Xtext Project&lt;br /&gt;3) Paste the following Xtext grammar into the opened editor:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Statemachine :&lt;br /&gt;  'events'&lt;br /&gt;     (events+=Event)*&lt;br /&gt;  'end'&lt;br /&gt;  'commands'&lt;br /&gt;     (commands+=Command)*&lt;br /&gt;  'end'&lt;br /&gt;  (states+=State)*;&lt;br /&gt; &lt;br /&gt;Event :&lt;br /&gt;  (resetting?='resetting')? name=ID code=ID;&lt;br /&gt; &lt;br /&gt;Command :&lt;br /&gt;  name=ID code=ID;&lt;br /&gt; &lt;br /&gt;State :&lt;br /&gt;  'state' name=ID&lt;br /&gt;     ('actions' '{' (actions+=[Command])+ '}')?&lt;br /&gt;     (transitions+=Transition)*&lt;br /&gt;  'end';&lt;br /&gt; &lt;br /&gt;Transition :&lt;br /&gt;  event=[Event] '=&gt;' state=[State];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4) start the generator (right click on generate.oaw &lt;span style="font-style: italic;"&gt;Run-&gt;oaw workflow&lt;/span&gt;)&lt;br /&gt;your're done.&lt;br /&gt;&lt;br /&gt;You not only get an Antlr based parser but also get an EMF based AST (&lt;a href="http://martinfowler.com/dslwip/SemanticModel.html"&gt;SemanticModel&lt;/a&gt;), and a &lt;a href="http://gallery.mac.com/sven.efftinge/100019"&gt;fully fledged eclipse editor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Of course it's up to you whether you want to interpret models or generate some code out of them. I choosed to write a small Xpand template file, generating a "controller".&lt;br /&gt;&lt;a href="http://gallery.mac.com/sven.efftinge#100013"&gt;Here it is&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1534885233979467346?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1534885233979467346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1534885233979467346&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1534885233979467346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1534885233979467346'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/06/fowlers-dsl-example-with-xtext.html' title='Fowler&apos;s DSL example with Xtext'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-204837227092937145</id><published>2008-06-10T10:53:00.003+01:00</published><updated>2008-06-10T16:46:33.390+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='codegeneration'/><title type='text'>Codegeneration 2008</title><content type='html'>&lt;a href="http://www.codegeneration.net/conference/"&gt;Codegeneration 2008&lt;/a&gt; is coming! And there'll be a lot of friends giving talks.&lt;br /&gt;Peter and Frank are talking about &lt;a href="http://www.codegeneration.net/conference/sessioninfo.php?session=friesezimmermann"&gt;model-driven Lego&lt;/a&gt;.&lt;br /&gt;Markus will give two talks (&lt;i&gt;&lt;a href="http://www.codegeneration.net/conference/sessioninfo.php?session=voelterdsl"&gt;Implementation &lt;/a&gt;&lt;a href="http://www.codegeneration.net/conference/sessioninfo.php?session=voelterdsl"&gt;Techniques for Domain-Specific Languages&lt;/a&gt;&lt;/i&gt; and &lt;i&gt;&lt;a href="http://www.codegeneration.net/conference/sessioninfo.php?session=voelterinterpreter"&gt;Building Interpreters with EMF, Xtext and Scala&lt;/a&gt;).&lt;/i&gt;&lt;br /&gt;I'll do two tutorials together with Arno:&lt;br /&gt;One is called &lt;a href="http://www.codegeneration.net/conference/sessioninfo.php?session=haaseefftingedsl"&gt;Concrete Syntaxes of DSLs&lt;/a&gt; and the other will give an &lt;a href="http://www.codegeneration.net/conference/sessioninfo.php?session=haaseefftingeoverview"&gt;Overview of Eclipse Modeling&lt;/a&gt;.&lt;br /&gt;Finally on Friday, Karsten, Jan and me are holding a workshop about &lt;a href="http://www.codegeneration.net/conference/sessioninfo.php?session=thoms"&gt;Using openArchitectureWare for M2M and M2T&lt;/a&gt;.&lt;br /&gt;As this conference is specialized on code generation I'm looking forward to some interesting discussions. See you there!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-204837227092937145?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/204837227092937145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=204837227092937145&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/204837227092937145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/204837227092937145'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/06/codegeneration-2008.html' title='Codegeneration 2008'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-2184215223111123272</id><published>2008-05-16T21:15:00.004+01:00</published><updated>2008-05-16T23:25:28.846+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oaw eclipse xtext'/><title type='text'>Current Development at itemis Kiel</title><content type='html'>Just to give you a short update.&lt;br /&gt;We've been working on a complete rework of Xtext for the last two weeks. While &lt;a href="http://koehnlein.blogspot.com/"&gt;Jan&lt;/a&gt; and me have been developing the grammar language and witten the code generator, &lt;a href="http://www.peterfriese.de/"&gt;Peter&lt;/a&gt; and &lt;a href="https://www.xing.com/profile/Dennis_Huebner2"&gt;Dennis&lt;/a&gt; started to develop Xtext's new IDE framework.&lt;br /&gt;&lt;br /&gt;Started with the new grammar language written in the new grammar language, we are now able to generate the parser, meta model and some other cool stuff from that description.  Actually it took us some time to understand and manage the whole bootstrapping process. It 's never been so easy to shoot yourself in the foot... :-)&lt;br /&gt;&lt;br /&gt;Currently we're working on a generic serialization mechanism. With this, one can modify instantiated models and write them back without loosing original layout information or comments.&lt;br /&gt;&lt;br /&gt;Hopefully it won't be long until we can start reimplementing Xpand using the new framework (we yet have to add syntactic and semantic predicates to the grammar language in order to describe Xpand).&lt;br /&gt;&lt;br /&gt;The current state can be checked out from eclipse's cvs : &lt;span style="font-weight: bold;"&gt;:pserver:anonymous@dev.eclipse.org:/cvsroot/modeling/org.eclipse.tmf/org.eclipse.xtext&lt;/span&gt;&lt;br /&gt;Milestone planning can be found here : &lt;a href="http://wiki.eclipse.org/Xtext_Project_Plan"&gt;http://wiki.eclipse.org/Xtext_Project_Plan&lt;/a&gt;&lt;br /&gt;Feedback or feature requests are of course welcome. Please use the developer mailing list for that : &lt;a href="mailto:xtext-dev@eclipse.org"&gt;xtext-dev@eclipse.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-2184215223111123272?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/2184215223111123272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=2184215223111123272&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2184215223111123272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/2184215223111123272'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/05/current-development-at-itemis-kiel.html' title='Current Development at itemis Kiel'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1236118197125932966</id><published>2008-04-16T10:30:00.006+01:00</published><updated>2008-04-16T11:06:50.599+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='oAW'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='xtext'/><title type='text'>Game development with oAW</title><content type='html'>Last week Jens Wagener posted a &lt;a href="http://www.jenswagener.de/2008/04/09/ein-kleines-ratsel-fur-schlaue-itler/"&gt;small riddle&lt;/a&gt; in his blog. He stated that it is claimed that 98% of all people are incapable of solving it.&lt;br /&gt;To put it short: I didn't solve it. (Thank God! I'm not that freaky ;-))&lt;br /&gt;&lt;br /&gt;But hey, as we're currently testing our &lt;a href="http://www.peterfriese.de/openarchitectureware-43-to-be-released-in-april-2008/"&gt;next release of openArchitectureWare&lt;/a&gt;, I thought I should give it a try and do something which helps solving it (our at least help to understand that it is really hard to solve ;-)) using oAW.&lt;br /&gt;&lt;br /&gt;So first I wrote a DSL implemented in Xtext and then I specified the constraints outlined in the riddle using Check. (At this point you should have read &lt;a href="http://www.jenswagener.de/2008/04/09/ein-kleines-ratsel-fur-schlaue-itler/"&gt;Jens' post&lt;/a&gt; so you can understand what I'm talking about)&lt;br /&gt;&lt;br /&gt;Using the DSL one writes the attributes (Color, Role, Pet, Language and Magazine) for the five houses down, one house per line. As I said the constraints outlined in the riddle are implemented using Check. So if there are any of theses constraints violated the editor provides the appropriate feedback.&lt;br /&gt;The puzzle is solved when all markers have gone and there are no more wildcards 'X' in it.&lt;br /&gt;&lt;br /&gt;This is a screenshot, of the "game" implemented in oAW:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ii_da0jTxAY/SAXN4TmEMtI/AAAAAAAAAA0/BDv2S-9T8JM/s1600-h/riddle.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_Ii_da0jTxAY/SAXN4TmEMtI/AAAAAAAAAA0/BDv2S-9T8JM/s400/riddle.png" alt="" id="BLOGGER_PHOTO_ID_5189780512830665426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;So if you want to play around with it, just drop me a mail, and please don't come up with boring rule engine solutions ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1236118197125932966?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1236118197125932966/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1236118197125932966&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1236118197125932966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1236118197125932966'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/04/game-development-with-oaw.html' title='Game development with oAW'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ii_da0jTxAY/SAXN4TmEMtI/AAAAAAAAAA0/BDv2S-9T8JM/s72-c/riddle.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-609998957630435457</id><published>2008-03-28T10:11:00.005+01:00</published><updated>2008-03-28T16:57:07.124+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Initializers in Java</title><content type='html'>I'm working on slides about language features I'ld like to see in Java. One of them are &lt;a href="http://msdn2.microsoft.com/en-us/library/bb384062.aspx"&gt;initializers&lt;/a&gt;.&lt;br /&gt;IMHO the lack of this features is the main reason why everybody uses XML. It's just ugly to construct object graphs in an imperative way. Usually such code looks like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Customer c = new Customer();&lt;br /&gt;c.setName("foobar");&lt;br /&gt;c.setId(4711);&lt;br /&gt;&lt;br /&gt;Address address = new Address();&lt;br /&gt;address.setStreet("Schauenburgerstr. 116");&lt;br /&gt;address.setZip("24118");&lt;br /&gt;address.setCity("Kiel");&lt;br /&gt;&lt;br /&gt;c.setAddress(address);&lt;br /&gt;&lt;br /&gt;Order o1 = new Order();&lt;br /&gt;o1.setArticleId(0815);&lt;br /&gt;o1.setAmount(2);&lt;br /&gt;&lt;br /&gt;c.addOrder(o1);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Would be much better if we could specify such a data structure like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Customer c = new Customer {&lt;br /&gt;name     = "foobar",&lt;br /&gt;id       = 4711,&lt;br /&gt;address = new Address {&lt;br /&gt; street = "Schauenburgerstr. 116",&lt;br /&gt; zip     = "24118",&lt;br /&gt; city    = "Kiel",&lt;br /&gt;},&lt;br /&gt;orders = [new Order {&lt;br /&gt; articleId = 0815;&lt;br /&gt; amount = 2;&lt;br /&gt;}]&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;Actually Java already supports this in some way (not ideal but IMHO better than doing it in a procedural manner). The following code is working Java code:&lt;br /&gt;&lt;pre&gt;Customer c = new Customer() {{&lt;br /&gt;name    = "foobar";&lt;br /&gt;id      = 4711;&lt;br /&gt;address = new Address {{&lt;br /&gt; street = "Schauenburgerstr. 116";&lt;br /&gt; zip     = "24118";&lt;br /&gt; city    = "Kiel";&lt;br /&gt;}};&lt;br /&gt;addOrder(new Order {{&lt;br /&gt; articleId = 0815;&lt;br /&gt; amount = 2;&lt;br /&gt;}});&lt;br /&gt;}};&lt;/pre&gt;The code creates anonymous subclasses with initializers in it. However, as there are no such thing as properties for now you may want to replace the field access by getters and setters. Note that you don't have to make the fields public. So with a combination of getters and protected fields you get immutable types.&lt;br /&gt;Btw.: the same mechanism forks for collections of course:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;List&lt;order&gt; l = new ArrayList&lt;order&gt;() {{&lt;br /&gt;           add(new Order() {{&lt;br /&gt;                   setName("stuff");&lt;br /&gt;           }});&lt;br /&gt;           add(new Order() {{&lt;br /&gt;                   setName("foo");&lt;br /&gt;                   setAmount(34);&lt;br /&gt;           }});&lt;br /&gt;   }};&lt;br /&gt;&lt;/order&gt;&lt;/order&gt;&lt;/pre&gt;&lt;br /&gt;I'ld still prefer "real" initializers and "real" collection literals, but all in all I think this seems to be a pretty useful idiom.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-609998957630435457?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/609998957630435457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=609998957630435457&amp;isPopup=true' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/609998957630435457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/609998957630435457'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/03/initializers-in-java.html' title='Initializers in Java'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-5682275887891702673</id><published>2008-03-19T22:56:00.003+01:00</published><updated>2008-03-19T23:18:57.820+01:00</updated><title type='text'>DSL development with MagicDraw</title><content type='html'>&lt;a href="http://www.gentz-software.de/"&gt;Ekkehard Gentz&lt;/a&gt; just showed me how to customize MagicDraw so that diagrams are really domain specific (no UML anymore). And it looks pretty cool. You can (and it seemed not to be too hard to do so) hide everything you don't want, extend and customize existing UML2 diagrams, etc.&lt;br /&gt;In the end the modeling language ekkehard showed me didn't look like UML anymore. It was very simple and just showed the domain-specific concepts.&lt;br /&gt;Unfortunately, if you go and process those models you are back in UML-hell again. But as all the customization information is modeled within the profile, one could transform a real domain-specific meta model (based on ecore of course) and a corresponing transformation from it. This would encapsulate the UML stuff completely.&lt;br /&gt;Ekkehard will present his DSLs at this year's JAX during the &lt;a href="http://it-republik.de/jaxenter/jax/workshops.php?tid=779"&gt;DSL day&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-5682275887891702673?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/5682275887891702673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=5682275887891702673&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5682275887891702673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5682275887891702673'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/03/dsl-development-with-magicdraw.html' title='DSL development with MagicDraw'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1714958833445713554</id><published>2008-03-19T16:24:00.005+01:00</published><updated>2008-03-19T17:01:45.691+01:00</updated><title type='text'>Mega modeling at EclipseCon</title><content type='html'>Yesterday, at EclipseCon there was a &lt;a href="http://www.eclipsecon.org/2008/?page=sub/&amp;amp;id=564"&gt;BOF called "Mega Modeling Mania"&lt;/a&gt;, which was pretty interesting. It started with a discussion whether UML is a good starting point for domain specific languages or not.  Some people argued that with profiles you can do a lot of cool stuff, but the tools have failed. But in the end I think (and hope ;-)) most people were convinced that there is no point in starting with such a huge meta model with hundreds of concepts in it just to design a language having couple of them.&lt;br /&gt;&lt;br /&gt;After that we were discussing whether Ecore is good enough for meta modeling. Some people would like to see CMOF concepts like "Package Merge" or "Associations". Actually, the absence of associations was one of things I really liked when I started to do meta modeling in Ecore. And until today I never missed them. I got the impression that it is more a matter of taste, and that people who meta model using graphical syntax and often use bidirectional relationships want to design them at once. So to me this sounds more like a tooling thing...&lt;br /&gt;Package merge seems to be an application of model-to-model transformations. And because it's so specific it makes sense to have a DSL to describe those transformations. &lt;a href="http://voelterblog.blogspot.com/"&gt;Markus&lt;/a&gt; did this when he developed &lt;a href="http://www.voelter.de/data/workshops/AOM2007.pdf"&gt;XWeave&lt;/a&gt;. Actually Achim Demelt told me that XWeave is even more powerful than Package Merge. So why should we want to have that in the core, i.e. EMF? It's already there and you can use it if you want.&lt;br /&gt;To me everything seemed unecessary complicated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1714958833445713554?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1714958833445713554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1714958833445713554&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1714958833445713554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1714958833445713554'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/03/mega-modeling-at-eclipsecon.html' title='Mega modeling at EclipseCon'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1868703131953114571</id><published>2008-03-02T13:58:00.003+01:00</published><updated>2008-03-02T14:13:39.797+01:00</updated><title type='text'>EclipseCon 2008</title><content type='html'>Originally I didn't plan to attend this years' &lt;a href="http://www.eclipsecon.org/2008/"&gt;EclipseCon&lt;/a&gt;. But as &lt;a href="http://apps.itemis.de/roller/itemislabkiel/"&gt;we&lt;/a&gt; have big plans wrt our contributions to Eclipse Modeling, I decided to register myself in order to meet up with the other &lt;a href="http://www.eclipsecon.org/2008/?page=sub/&amp;amp;id=564"&gt;"Eclipse Modelers&lt;/a&gt;". &lt;a href="http://apps.itemis.de/roller/jwagener/entry/embedded_world_2008_eclipse_in"&gt;Wolfgang&lt;/a&gt; will join as well.&lt;br /&gt;Too bad I didn't submit some talks myself. Anyway, there are many interesting presentations to be visited. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1868703131953114571?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1868703131953114571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1868703131953114571&amp;isPopup=true' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1868703131953114571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1868703131953114571'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/03/eclipsecon-2008.html' title='EclipseCon 2008'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-3114935341464828975</id><published>2008-02-21T22:01:00.002+01:00</published><updated>2008-02-21T22:13:08.554+01:00</updated><title type='text'>oAW at EclipseCon and QCon</title><content type='html'>&lt;a href="http://voelterblog.blogspot.com/"&gt;Markus&lt;/a&gt; Voelter and &lt;a href="http://www.kolbware.de"&gt;Bernd&lt;/a&gt; Kolb will present oAW (and Eclipse Modeling) at EclipseCon. There are several talks regarding Eclipse Modeling. Strange thing that some of them take place at the same time in different rooms... ???&lt;br /&gt;Anyway, if you're there make sure to visit their talks, because they will present some cool new features :-)&lt;br /&gt;In addition Markus will talk about &lt;a href="http://qcon.infoq.com/london/presentation/Hands-On+DSLs+with+Eclipse+Tools"&gt;Xtext&lt;/a&gt; at this year's QCon. You have to go there if you 're at all interested in DSLs!&lt;br /&gt;Markus and Bernd: Thank you for traveling around the world and presenting it. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-3114935341464828975?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/3114935341464828975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=3114935341464828975&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3114935341464828975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/3114935341464828975'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/02/oaw-at-eclipsecon-and-qcon.html' title='oAW at EclipseCon and QCon'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-5073730065918412496</id><published>2008-02-18T12:54:00.004+01:00</published><updated>2008-02-18T14:38:22.209+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http://www.blogger.com/img/gl.link.gif'/><title type='text'>itemis labs kiel - Team blog</title><content type='html'>There's a rumor about &lt;a href="http://www.itemis.eu/"&gt;Itemis AG&lt;/a&gt; in Kiel working on great ;-) open-source software hosted at  &lt;a href="http://www.eclipse.org/modeling"&gt;eclipse.org&lt;/a&gt; as well as &lt;a href="http://www.openarchitectureware.org/"&gt;openarchitectureware.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you want to keep yourself informed about their latest activities go here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://apps.itemis.de/roller/itemislabkiel/"&gt;http://apps.itemis.de/roller/itemislabkiel/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-5073730065918412496?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/5073730065918412496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=5073730065918412496&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5073730065918412496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/5073730065918412496'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/02/itemis-labs-kiel-team-blog.html' title='itemis labs kiel - Team blog'/><author><name>Sven Efftinge</name><uri>http://www.blogger.com/profile/11751196715155150517</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_Ii_da0jTxAY/SNxsRY6r26I/AAAAAAAAABk/WzYcCAnzC9Q/S220/foto-openbc.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24248206.post-1861574887691672314</id><published>2008-01-31T08:58:00.000+01:00</published><updated>2008-02-04T08:10:14.100+01:00</updated><title type='text'>TMF- Successful Creation Review</title><content type='html'>&lt;p&gt;Yesterday, I presented the new TMF (Textual Modeling Framework) to the Eclipse Foundation together with my co-lead Frédéric Jouault from INRIA, France. There were just a view questions regarding the relationship to IMP and Antlr. One of the attendees already had experience with Xtext and was very excited to hear about Xtext becoming an Eclipse project. Nice to hear :-)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The next step is to do some paper work, rename packages, etc. and get the AntLR generator IP-approved. &lt;/p&gt;&lt;p&gt;Stay tuned.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24248206-1861574887691672314?l=blog.efftinge.de' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.efftinge.de/feeds/1861574887691672314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24248206&amp;postID=1861574887691672314&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1861574887691672314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24248206/posts/default/1861574887691672314'/><link rel='alternate' type='text/html' href='http://blog.efftinge.de/2008/01/tmf-successful-creation-review.html' title='TMF- Successful Creation Review'/
