<?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-13105375</id><updated>2011-04-22T01:25:42.727+02:00</updated><title type='text'>Transformations and Abstractions</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13105375.post-2735879087990807716</id><published>2007-01-07T14:03:00.000+01:00</published><updated>2007-01-07T14:12:19.011+01:00</updated><title type='text'>moving blog</title><content type='html'>Dear reader of my blog, if you exist. After foolishly renaming the url of my blogger blog to throw off your rss subscription, here is another attempt to make sure I loose you. I have set up camp under the new domain
&lt;center&gt;
  &lt;a href="http://www.eelcovisser.net"&gt;http://www.eelcovisser.net&lt;/a&gt;
&lt;/center&gt;
where I intend to collect all my personal webmusing, including my photography work.
Part of the new site is a &lt;a href="http://www.s9y.org/1.html"&gt;serendipity&lt;/a&gt; based blog, which you'll find at
&lt;center&gt;
  &lt;a href="http://blog.eelcovisser.net"&gt;http://blog.eelcovisser.net&lt;/a&gt;
&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-2735879087990807716?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/2735879087990807716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=2735879087990807716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/2735879087990807716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/2735879087990807716'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2007/01/moving-blog.html' title='moving blog'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-8743335486205986943</id><published>2006-12-30T19:26:00.001+01:00</published><updated>2006-12-30T19:26:54.716+01:00</updated><title type='text'>Flickr</title><content type='html'>This is a test post from &lt;a href="http://www.flickr.com/r/testpost"&gt;&lt;img alt="flickr" src="http://www.flickr.com/images/flickr_logo_blog.gif" width="41" height="18" border="0" align="absmiddle" /&gt;&lt;/a&gt;, a fancy photo sharing thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-8743335486205986943?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/8743335486205986943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=8743335486205986943' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/8743335486205986943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/8743335486205986943'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/12/flickr.html' title='Flickr'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-116182453260235468</id><published>2006-10-26T02:55:00.000+02:00</published><updated>2006-11-05T21:07:27.219+01:00</updated><title type='text'>Declarative, Formal, and Extensible Syntax Definition for AspectJ </title><content type='html'>&lt;div style="float: right; margin-left: 10px; margin-bottom: 10px;"&gt; &lt;a href="http://www.flickr.com/photos/eelcovisser/279451988/" title="photo sharing"&gt;&lt;img src="http://static.flickr.com/108/279451988_7523f6f638_m.jpg" alt="" style="border: solid 2px #000000;" /&gt;&lt;/a&gt; &lt;br /&gt; &lt;span style="font-size: 0.9em; margin-top: 0px;"&gt;  &lt;a href="http://www.flickr.com/photos/eelcovisser/279451988/"&gt;coauthors&lt;/a&gt;  &lt;br /&gt;  Originally uploaded by &lt;a href="http://www.flickr.com/people/eelcovisser/"&gt;Eelco Visser&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;This afternoon Martin Bravenboer presented our OOPSLA'06 paper &lt;em&gt;Declarative, Formal, and Extensible Syntax Definition for AspectJ&lt;/em&gt;. The photo shows the coauthors just before the presentation.&lt;br /&gt;&lt;br /&gt;Aspect-Oriented Programming (AOP) is attracting attention from both research and industry, as illustrated by the ever-growing popularity of AspectJ, the de facto standard AOP extension of Java. From a compiler construction perspective, AspectJ is interesting as it is a typical example of a compositional language, i.e., a language composed of a number of separate languages with different syntactical styles: in addition to plain Java, AspectJ includes a language for defining pointcuts and one for defining advices. Language composition represents a non-trivial challenge for conventional parsing techniques. First, combining several languages with different lexical syntax leads to considerable complexity in the lexical states to be processed. Second, as new language features for AOP are being explored, many research proposals are concerned with further extending the AspectJ language, resulting in a need for an extensible syntax definition. &lt;br /&gt;&lt;br /&gt;This paper shows how scannerless parsing elegantly addresses the issues encountered by conventional techniques when parsing AspectJ. We present the design of a modular, extensible, and formal definition of the lexical and context-free aspects of the AspectJ syntax in the Syntax Definition Formalism SDF, which is implemented by a scannerless, generalized-LR parser (SGLR). We introduce grammar mixins as a novel application of SDF's modularity features, which allows the declarative definition of different keyword policies and combination of extensions. We illustrate the modular extensibility of our definition with syntax extensions taken from current research on aspect languages. Finally, benchmarks show that the performance of scannerless generalized-LR parsing for this grammar is comparable to the parser of abc.&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-116182453260235468?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/116182453260235468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=116182453260235468' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/116182453260235468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/116182453260235468'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/10/declarative-formal-and-extensible.html' title='Declarative, Formal, and Extensible Syntax Definition for AspectJ '/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-115460595803457993</id><published>2006-08-03T13:18:00.000+02:00</published><updated>2006-11-05T21:07:27.155+01:00</updated><title type='text'>From Vertical to Horizontal Compilation?</title><content type='html'>The Stratego compiler is a pipeline applying over 40 components (some of which are applied more than once) to transform a sugared and modular source program to an implementation in C. This is an example of &lt;em&gt;vertical&lt;/em&gt; compilation in the sense that one stage of compilation is applied to the entire program, before the next stage is applied. 

The alternative, &lt;em&gt;horizontal&lt;/em&gt; compilation, is to apply the entire pipeline, or at least a considerable part of it to a single unit of the program, before considering the next unit. 
This is of course done in separate compilation, where 'compilation units' are compiled separately
from other units. But it can be done to smaller units as long as the transformations are &lt;em&gt;compositional&lt;/em&gt;, don't need information from other parts of the program. 

&lt;p /&gt;

After &lt;a href="http://eelco-visser.blogspot.com/2006/08/getting-rid-of-nested-functions.html"&gt;getting rid of nested functions&lt;/a&gt;, the next &lt;a href="https://bugs.cs.uu.nl/browse/STR-311"&gt;issue&lt;/a&gt; on my agenda is to refactor the Stratego compiler to provide a &lt;em&gt;compilation library&lt;/em&gt; that offers translation strategies that can be applied to single definitions and that can be composed to form both horizontal and vertical compilers. 

The first goal of the operation is to improve the performance of the Stratego compiler by eliminating intermediate ATerm files and by increasing the locality of the operations; instead of  traversing the entire program for each stage, apply all stages to a single definition, before moving to the next. 

In the longer term, this refactoring should enable the combination of interpreted, statically compiled, and run-time compiled code. Furthermore, it should facilitate the creation of an &lt;em&gt;open compiler&lt;/em&gt; for Stratego that supports languages extension libraries.

&lt;p /&gt;

The catch of course is in the compositionality of the compilation process. While many stages
of the compiler can easily be applied per definition, or are even based on local rewriting, there are several stages that require the whole program. One example, is the stage that combines definitions with the same name into a single definition. A compositional compilation will require a scheme that allows the union of such definitions at link time. Another example, is the 'lifting of dynamic rules', which requires awares of all dynamic rule definition sites in a program to prevent generation of duplicate definition. Turning these operations into 'horizontal' ones may require some new (intermediate) language constructs or meta-data that can be consulted when joining program fragments. Such considerations will no doubt guide the design of a better module system for Stratego. More later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-115460595803457993?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/115460595803457993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=115460595803457993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115460595803457993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115460595803457993'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/08/from-vertical-to-horizontal.html' title='From Vertical to Horizontal Compilation?'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-115459861248814798</id><published>2006-08-03T11:20:00.000+02:00</published><updated>2006-11-05T21:07:27.083+01:00</updated><title type='text'>Getting rid of nested functions</title><content type='html'>Last summer I started with a renovation of the back-end of the Stratego compiler. 
The implementation of failure handling was based on the C exception handling API (setjmp/longjmp).
However, this turned out to be costly. 
In the 
&lt;a href="http://eelco-visser.blogspot.com/2005_08_01_eelco-visser_archive.html"&gt;new compilation scheme&lt;/a&gt;
failure is now represented as a NULL ATerm. 

&lt;p /&gt;

The second part of the renovation was to get rid of nested functions in the generated C code. 
After a year I have finally managed to finish this part of the renovation. In this blog I'll
explain the old and new compilation schemes.

&lt;p /&gt;

At the same time as the setjmp/longjmp were introduced in the Stratego compiler (somewhere in 2001), I discovered that gcc supported nested functions in C. The following example illustrates why this was a useful feature.

The strategy &lt;code&gt;bottomup&lt;/code&gt; is defined as follows:

&lt;pre&gt;
  bottomup(s) = all(bottomup(s)); s
&lt;/pre&gt;

A recursive invocation of &lt;code&gt;bottomup(s)&lt;/code&gt; is passed to the one-level traversal
operator &lt;code&gt;all&lt;/code&gt;. 

In the generated C code, strategy operators are implemented as functions that take a function
pointer as argument. For instance, the &lt;code&gt;all&lt;/code&gt; operator is implemented by the function
&lt;code&gt;SRTS_all&lt;/code&gt; with signature

&lt;pre&gt;
  ATerm SRTS_all(ATerm f(ATerm), ATerm);
&lt;/pre&gt;

However, a strategy expression such as &lt;code&gt;bottomup(s)&lt;/code&gt; is clearly not something with
a function pointer. Therefore, the compiler lifts such expressions from argument positions into
local definitions. Thus, the definition of &lt;code&gt;bottomup&lt;/code&gt; is rewritten to:

&lt;pre&gt;
  bottomup_1_0(e_1 : ATerm() -&gt; ATerm()|) =
    let a_0(|) = bottomup_1_0(e_1|)
     in all(a_0|)
    end
    ; e_1
&lt;/pre&gt;

Now the argument of &lt;code&gt;all&lt;/code&gt; is just a function name, which can be translated
as passing a function pointer. The definition of &lt;code&gt;a_0&lt;/code&gt; has to be nested in the definition of &lt;code&gt;bottomup&lt;/code&gt; since it refers to the argument &lt;code&gt;e_1&lt;/code&gt; of
that definition.

&lt;p /&gt;

Nested functions in C provide a very convenient feature for translating such local definitions.
A nested function is an ordinary C function that is defined within the scope of another C function. Thus, it can refer to all arguments and local variables of the enclosing function. This
enables a straightforward implementation of local definitions in Stratego; a local definition is
replaced with a nested function. Using this approach the rewritten definition of &lt;code&gt;bottomup&lt;/code&gt; above is translated as follows:

&lt;pre&gt;
ATerm bottomup_1_0 (ATerm e_1 (ATerm), ATerm t)
{
  auto ATerm a_0 (ATerm t);
  ATerm a_0 (ATerm t)
  {
    t = bottomup_1_0(e_1, t);
    if((t == NULL)) goto fail_1 ;
    return(t);
    fail_1 :
    return(NULL);
  }
  t = SRTS_all(a_0, t);
  if((t == NULL)) goto fail_0 ;
  t = e_1(t);
  if((t == NULL)) goto fail_0 ;
  return(t);
  fail_0 :
  return(NULL);
}
&lt;/pre&gt;

While nested functions make the translation of nested definitions straightforward, they posed several problems.

In the first place, nested functions are only supported by gcc, reducing the portability of
code generated by the Stratego compiler.

&lt;p /&gt;

Secondly, nested functions in gcc are implemented by means of &lt;a href="http://gcc.gnu.org/onlinedocs/gccint/Trampolines.html"&gt;trampolines&lt;/a&gt;,
a small piece of code that is generated at run-time and stored on the stack. 
This code essentially stores the &lt;em&gt;closure&lt;/em&gt; of the nested function, that is,
a pointer to the actual function and (pointers to) the variables in the enclosing stack-frame(s) to which it has access.
The problem with this implementation is that it executes code stored on the stack, which is forbidden on more and more platforms, as it poses a security risk. Thus, we were confronted with  users not being able to use Stratego/XT on some platforms.

&lt;p /&gt;

Finally, the implementation of nested functions in gcc does not have a high priority with gcc developers, which caused build failures for the Stratego/XT distribution with some versions of
gcc, especially on MacOSX.

&lt;p /&gt;

While nested functions were quite convenient, they had to go and be replaced with an explicit
mechanism for handling closures. The mechanism chosen was to use static links to reach stack
frames of enclosing functions and an explicit closure data-structure to represent a function
pointer with its environment. For example, in the new translation scheme, the signature of the &lt;code&gt;SRTS_all&lt;/code&gt; operator becomes:

&lt;pre&gt;
  ATerm SRTS_all(StrSL sl, StrCL s, ATerm t)
&lt;/pre&gt;

&lt;code&gt;StrSL&lt;/code&gt; represents static links and &lt;code&gt;StrCL&lt;/code&gt; is the type of closures.

Locally defined strategies are now translated to top-level (static) functions and an explicit
closure is allocated in the enclosing function. Thus, the &lt;code&gt;bottomup&lt;/code&gt; strategy
is translated to the following pair of C functions:

&lt;pre&gt;
ATerm bottomup_1_0 (StrSL sl, StrCL e_1, ATerm t)
{
  sl_decl(sl);
  sl_funs(1);
  sl_init_fun(0, e_1);
  {
    struct str_closure a_0 = { &amp;(lifted_0) , &amp;(frame) };
    StrCL lifted_0_cl = &amp;(a_0);
    t = SRTS_all(sl, lifted_0_cl, t);
    if((t == NULL)) goto fail_1 ;
    t = cl_fun(e_1)(cl_sl(e_1), t);
    if((t == NULL)) goto fail_1 ;
  }
  return(t);
  fail_1 :
  return(NULL);
}
static ATerm lifted_0 (StrSL sl, ATerm t)
{
  sl_decl(sl);
  t = bottomup_1_0(sl_up(sl), sl_fun_cl(0, sl), t);
  if((t == NULL)) goto fail_2 ;
  return(t);
  fail_2 :
  return(NULL);
}
&lt;/pre&gt;

The declaration

&lt;pre&gt;
  struct str_closure a_0 = { &amp;(lifted_0) , &amp;(frame) };
&lt;/pre&gt;

allocates a closure consisting of a pointer to the function &lt;code&gt;lifted_0&lt;/code&gt; and 
a pointer to the current &lt;code&gt;frame&lt;/code&gt;, which is an explicit data-structure in
which escaping functions and variables are stored. The &lt;code&gt;frame&lt;/code&gt; variable is
declared by the macro &lt;code&gt;sl_decl&lt;/code&gt; at the start of the &lt;code&gt;bottomup_1_0&lt;/code&gt;
function. A pointer to this closure (&lt;code&gt;lifted_0_cl&lt;/code&gt;) is passed to the invocation of &lt;code&gt;SRTS_all&lt;/code&gt;.

&lt;p /&gt;

Note that a call to a function passed as a closure needs unwrapping of the closure
into a function pointer and a static link:

&lt;pre&gt;
    t = cl_fun(e_1)(cl_sl(e_1), t);
&lt;/pre&gt;

While I started the implementation of this new translation scheme already in September 2005,
I didn't get around to finishing it until yesterday. We spent a large effort last Fall to
get the documentation of Stratego/XT in better shape, and after that I was busy teaching 
and doing god knows what, but it was not hacking the Stratego compiler. 

&lt;p /&gt;

With this stumbling block out of the way, the door is open to a whole new set of innovations to the compiler and the Stratego language. A better module system is high on the wish list. Also
we want to move from a separation of the compiler in phases to a compiler library that will allow larger parts of the compilation process to be applied to a single definition and elimination of intermediate ATerm files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-115459861248814798?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/115459861248814798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=115459861248814798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115459861248814798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115459861248814798'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/08/getting-rid-of-nested-functions.html' title='Getting rid of nested functions'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-115211259426766683</id><published>2006-07-05T17:05:00.000+02:00</published><updated>2006-11-05T21:07:27.017+01:00</updated><title type='text'>Learn Stratego/XT at OOPSLA/GPCE</title><content type='html'>When you fill in the &lt;a href="http://www.oopsla.org/2006/registration.html"&gt;registration form for OOPSLA and GPCE&lt;/a&gt; don't forget to check the G4 box for our 
(&lt;a href="http://www.cs.uu.nl/~martin"&gt;Martin&lt;/a&gt;, 
&lt;a href="http://www.ii.uib.no/~karltk/"&gt;Karl&lt;/a&gt; and 
&lt;a href="http://www.cs.uu.nl/~visser"&gt;me&lt;/a&gt;) tutorial on &lt;a href="http://www.oopsla.org/2006/submission/tutorials/gpce4:_building_java_transformations_with_stratego/xt.html"&gt;Building Java Transformations with Stratego/XT&lt;/a&gt;. The tutorial will be held on Monday afternoon. 

&lt;p /&gt;

In this tutorial we give an overview of techniques for program transformation, illustrated through the Stratego/XT program transformation system. We explain the general architecture of transformation systems, and how Stratego/XT is used to assemble such systems from components. We introduce a set of ready made components for Java transformation, and show how to program custom transformation components using Stratego. In particular, we show how to express local transformations using rewrite rules and strategies and how context-sensitive transformations can be expressed easily using dynamic rewrite rules. All techniques and language features are illustrated with implementations of transformations on Java programs, that show how to apply all introduced techniques in practice.

&lt;p /&gt;

See also the &lt;a href="http://www.hope.cs.rice.edu/twiki/bin/view/GPCE06/TutorialGPCE4"&gt;page on the GPCE'06 site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-115211259426766683?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/115211259426766683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=115211259426766683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115211259426766683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115211259426766683'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/07/learn-strategoxt-at-oopslagpce.html' title='Learn Stratego/XT at OOPSLA/GPCE'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-115210307005253198</id><published>2006-07-05T14:25:00.000+02:00</published><updated>2006-11-05T21:07:26.950+01:00</updated><title type='text'>Partial Evaluation and (Semantics-based) Program Manipulation</title><content type='html'>Once you are done with your contribution for the 
&lt;a href="http://www.program-transformation.org/Sts/STS06"&gt;Software Transformation Systems&lt;/a&gt; workshop in Portland (co-located with 
&lt;a href="http://www.oopsla.org/2006/"&gt;OOPSLA&lt;/a&gt;/&lt;a href="http://www.gpce.org/"&gt;GPCE&lt;/a&gt;), 
you should start thinking about your contribution to
&lt;a href="http://www.program-transformation.org/PEPM07"&gt;PEPM 2007&lt;/a&gt;, which I am chairing together with &lt;a href="http://www.research.ibm.com/people/r/rama/"&gt;Ramalingam&lt;/a&gt; from IBM.

&lt;p /&gt;

Last year PEPM broadened its mission from a narrow focus on partial evaluation techniques and applications, to all topics concerned with analysis and manipulation of programs. 
In particular, the aim is to attract work that applies such techniques to real languages and large code bases. That is, not just design of clever techniques, but also validation of these techniques in practice. The website provides extensive advice for authors of research and tool presentation papers.

&lt;ul&gt;
&lt;li&gt; Program and model manipulation techniques such as transformations driven by rules, patterns, or analyses, partial evaluation, specialization, slicing, symbolic execution, refactoring, aspect weaving, decompilation, and obfuscation. 
&lt;/li&gt;
&lt;li&gt; Program analysis techniques that are used to drive program/model manipulation such as abstract interpretation, static analysis, binding-time analysis, dynamic analysis, constraint solving, and type systems.
&lt;/li&gt;
&lt;li&gt; Analysis and transformation for programs/models with advanced features such as objects, generics, ownership types, aspects, reflection, XML type systems, component frameworks, and middleware.
&lt;/li&gt;
&lt;li&gt; Techniques that treat programs/models as data objects including meta-programming, generative programming, staged computation, and model-driven program generation and transformation.
&lt;/li&gt;
&lt;li&gt; Application of the above techniques including experimental studies, engineering needed for scalability, and benchmarking. Examples of application domains include legacy program understanding and transformation, domain-specific language implementations, scientific computing, middleware frameworks and infrastructure needed for distributed and web-based applications, resource-limited computation, and security.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p /&gt;
We especially encourage papers that break new ground including
descriptions of how program/model manipulation tools can be integrated
into realistic software development processes, descriptions of robust
tools capable of effectively handling realistic applications, and new
areas of application such as rapidly evolving systems, distributed and
webbased programming including middleware manipulation, model-driven
development, and on-the-fly program adaptation driven by run-time or
sttistical analysis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-115210307005253198?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/115210307005253198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=115210307005253198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115210307005253198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115210307005253198'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/07/partial-evaluation-and-semantics-based.html' title='Partial Evaluation and (Semantics-based) Program Manipulation'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-115169688245093441</id><published>2006-06-30T21:36:00.000+02:00</published><updated>2006-11-05T21:07:26.885+01:00</updated><title type='text'>From Natural Semantics to Stratego</title><content type='html'>Yesterday, &lt;a href="http://www.cs.adelaide.edu.au/~brad/"&gt;Brad Alexander&lt;/a&gt; from the University of Adelaide visited the Uithof and gave a talk in the &lt;a href="http://www.cs.uu.nl/wiki/Stc"&gt;Software Technology Colloquium&lt;/a&gt; with the title "From Natural Semantics to Stratego". He explained how he was in the process of converting an implementation of an optimizer for a second-order functional language in natural semantics (using the Centaur system) to a Stratego program using rewrite rules and strategies. As a result of using Stratego, transformations that took hundreds of lines of code could be reduced to only a few.

The exciting thing about his presentation was that the basic Stratego techniques he used were quite unexiting. That is, using the basic ideas of separate rewrite rules and  parametric strategies he could greatly simplify his optimizer. I hope to see more of his work in the future. 

Brad was on his way to Estonia to deliver a talk at the &lt;a href="http://cs.ioc.ee/mpc-amast06/amast/"&gt;AMAST 2006&lt;/a&gt; conference.

&lt;center&gt;
&lt;a href="http://www.flickr.com/photos/eelcovisser/178550534/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/49/178550534_2a2452b84f.jpg" width="500" height="434" alt="brad-alexander" /&gt;&lt;/a&gt;
&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-115169688245093441?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/115169688245093441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=115169688245093441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115169688245093441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115169688245093441'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/06/from-natural-semantics-to-stratego.html' title='From Natural Semantics to Stratego'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-115167564947513891</id><published>2006-06-30T15:34:00.000+02:00</published><updated>2006-11-05T21:07:26.820+01:00</updated><title type='text'>Career Evolution (Moving to Delft)</title><content type='html'>Last week I accepted a position as associate professor at the &lt;a href="http://www.se.ewi.tudelft.nl/"&gt;Software Engineering Group&lt;/a&gt; of &lt;a href="http://www.tudelft.nl/"&gt;Delft University of Technology&lt;/a&gt;. I will join forces there with &lt;a href="http://www.st.ewi.tudelft.nl/~arie/"&gt;Arie van Deursen&lt;/a&gt; who recently started at TUD as a full professor. 

The ambition is to build a strong research group in the area of software engineering, based on our work in software evolution (Arie) and program transformation. 

With NWO funding for a project on &lt;a href="http://eelco-visser.blogspot.com/2006/05/transformations-for-abstractions.html"&gt;extensibility of transformation systems&lt;/a&gt; and one on &lt;a href="http://eelco-visser.blogspot.com/2006/06/model-driven-software-evolution.html"&gt;model-driven software evolution&lt;/a&gt; my tenure at TUD can start full force.
Of course, I will continue work on Stratego/XT and applications together with &lt;a href="http://www.cs.uu.nl/wiki/Martin"&gt;Martin Bravenboer&lt;/a&gt;, who will join me at TUD. I also hope to convince &lt;a href="http://www.cs.uu.nl/~eelco/"&gt;Eelco Dolstra&lt;/a&gt; to make the move to Delft.
We are aiming at setting up a new buildfarm for supporting our own, but hopefully also other research projects.

&lt;center&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://www.flickr.com/photos/eelcovisser/154080688/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/75/154080688_cd3364f426_m.jpg" width="240" height="160" alt="CGN" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;
=&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;a href="http://www.flickr.com/photos/eelcovisser/173694037/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/46/173694037_b3216e0156_m.jpg" width="240" height="183" alt="mekelweg 4" /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-115167564947513891?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/115167564947513891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=115167564947513891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115167564947513891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115167564947513891'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/06/career-evolution-moving-to-delft.html' title='Career Evolution (Moving to Delft)'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-115167427076055438</id><published>2006-06-30T15:01:00.000+02:00</published><updated>2006-11-05T21:07:26.759+01:00</updated><title type='text'>Model-Driven Software Evolution</title><content type='html'>We just got word from &lt;a href="http://www.nwo.nl"&gt;NWO&lt;/a&gt;, the dutch national research funding organization, that our 
project proposal on &lt;b&gt;Model-Driven Software Evolution&lt;/b&gt; has been granted. This means
that we will have funding to hire two PhD students, a postdoc, and an assistant professor.

The project is a collaboration between 
&lt;a href="http://www.st.ewi.tudelft.nl/~arie/"&gt;Arie van Deursen&lt;/a&gt; (principal investigator) and myself and is going to take place at &lt;a href="www.tudelft.nl"&gt;Delft University of Technology&lt;/a&gt;, (&lt;a href="http://eelco-visser.blogspot.com/2006/06/career-evolution-moving-to-delft.html"&gt;where I'll be moving; see next blog&lt;/a&gt;).

&lt;p /&gt;

If you have an interest in program transformation and domain-specific languages, and the ambition to contribute to the state-of-the-art in these areas, then
you might consider applying for one of these jobs. Official job adverts will be available later (we really just learned about acceptance), but in the mean time you can contact me if you have questions. 

&lt;p /&gt;

Here is the summary of the research proposal:

&lt;p /&gt;

The promise of model-driven engineering (MDE) is that the development
and maintenance effort can be reduced by working at the model instead
of the code level. Models define what is variable in a system, and
code generators produce the functionality that is common in the
application domain.

&lt;p /&gt;

The problem with model-driven engineering is that it can lead to a
lock-in in the abstractions and generator technology adopted at
project initiation.  Software systems need to evolve, and systems
built using model-driven approaches are no exception. What complicates
model-driven engineering is that it requires multiple dimensions of
evolution.  In regular evolution, the modeling language is used to
make the changes.  In meta-model evolution, changes are required to
the modeling notation.  In platform evolution, the code generators and
application framework change to reflect new requirements on the target
platform.  Finally, in abstraction evolution, new modeling languages
are added to the set of (modeling) languages to reflect increased
understanding of a technical or business domain.  While MDE has been
optimized for regular evolution, presently little or no support exists
for metamodel, platform and abstraction evolution.  It is this gap
that this project proposes to address.

&lt;p /&gt;

The first fundamental premise of this proposal is that evolution
should be a continuous process.  Software development is a continuous
search for recurring patterns, which can be captured using
domain-specific modeling languages.  After developing a number of
systems using a particular meta-model, new patterns may be recognized
that can be captured in a higher-level or richter meta-model. The
second premise is that reengineering of legacy systems to the
model-driven paradigm should be a special case of this continuous
evolution, and should be performed incrementally.

&lt;p /&gt;

The goal of this project is to develop a systematic approach to
model-driven software evolution. This approach includes methods,
techniques, and underlying tool support.  We will develop a prototype
programming environment that assists software engineers with the
introduction, development, and maintenance of models and
domain-specific languages.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-115167427076055438?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/115167427076055438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=115167427076055438' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115167427076055438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/115167427076055438'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/06/model-driven-software-evolution.html' title='Model-Driven Software Evolution'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-114744072419538688</id><published>2006-05-12T15:32:00.000+02:00</published><updated>2006-11-05T21:07:26.617+01:00</updated><title type='text'>Software Transformation Systems</title><content type='html'>Together with 
&lt;a href="http://www.ii.uib.no/~magne/"&gt;Magne Haveraaen&lt;/a&gt;,
&lt;a href="http://www.cs.queensu.ca/~cordy/"&gt; Jim Cordy&lt;/a&gt;, and 
&lt;a href="http://homepages.cwi.nl/~jan/"&gt;Jan Heering&lt;/a&gt;,
I am organizing the next 
&lt;a href="http://www.program-transformation.org/Sts/STS06"&gt;Workshop on Software Transformation Systems (STS'06)&lt;/a&gt;, which will be co-located with GPCE and OOPSLA in Portland, Oregon in October.
If you are interested in the design, implementation, and use of transformation systems you should consider submitting an abstract. (Note that the webpage is being updated, so check back on details of submissions.)
If it will be like last time, it promisses to be a lively day full of interesting discussions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-114744072419538688?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/114744072419538688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=114744072419538688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/114744072419538688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/114744072419538688'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/05/software-transformation-systems.html' title='Software Transformation Systems'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-114726206791488058</id><published>2006-05-10T12:32:00.000+02:00</published><updated>2006-11-05T21:07:26.549+01:00</updated><title type='text'>Transformations for Abstractions (Looking for a Postdoc or PhD student)</title><content type='html'>Recently I got notice from NWO, the dutch research funding organization, that the project proposal `&lt;a href="http://www.cs.uu.nl/wiki/Visser/TFA"&gt;Transformations for Abstractions (TFA)&lt;/a&gt;' that I submitted last September was accepted. (In a very competitive round; only 15% of proposals was accepted this year.) As a consequence, I have funding for a three year postdoc or a four year PhD student position. The topic of the project is language extensions (abstractions), in general, and extension of transformations on/for language extensions, in particular. Here is the summary of the proposal:

&lt;p /&gt;

This proposal is about techniques at the intersection of two areas of software engineering. (1) In order to automate software engineering we would like to automate the process of producing programs by means of automatic transformations, thereby computing with programs as we do with other data. (2) In order to improve the expressivity of programming languages to the concepts and notations of specific application domains, we would would like to extend general-purpose languages with domain-specific abstractions. Combining these desiderata leads to the need to extend transformations for new domain-specific abstractions.

&lt;p /&gt;

The goal of this project is to develop a systematic approach to the extension of general purpose languages with domain-specific abstractions, integrating those abstractions in the syntax and transformations of the programming environment. This requires research into the following issues:

&lt;ul&gt;
  &lt;li&gt; strategies for the definition of domain abstractions &lt;/li&gt; 

  &lt;li&gt; mechanisms for open extensibility of transformations &lt;/li&gt; 

  &lt;li&gt; methods and patterns for design of open transformations &lt;/li&gt; 

  &lt;li&gt; constraints for independent extensibility of transformations &lt;/li&gt; 

  &lt;li&gt; derivation of transformation extensions from definitions of abstractions &lt;/li&gt; 
&lt;/ul&gt;

We approach this goal by analyzing a variety of existing domain-specific languages and transformations, developing generic extensibility mechanisms, and validating these first in an `in vitro' setting and then in a programming environment for the Java language. The project builds on a solid body of work from the Stratego/XT project that will allow us to concentrate on the core of the problem, rather than being distracted by infrastructural issues.

&lt;p /&gt;

If you are interested in the project, either as a candidate for the position or as a collaborator, &lt;a href="http://www.cs.uu.nl/~visser/"&gt;I would like to hear from you&lt;/a&gt;. Further information (such as the full project proposal) is available on request.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-114726206791488058?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/114726206791488058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=114726206791488058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/114726206791488058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/114726206791488058'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/05/transformations-for-abstractions.html' title='Transformations for Abstractions (Looking for a Postdoc or PhD student)'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-114702474467044393</id><published>2006-05-07T19:59:00.000+02:00</published><updated>2006-11-05T21:07:26.484+01:00</updated><title type='text'>Image Transformation</title><content type='html'>After many years, I finally have a new picture for my home page. Here is the transformation from December 1998 to May 2006:

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;a href="http://www.flickr.com/photos/38456545@N00/142113066/" title="December 1998"&gt;&lt;img src="http://static.flickr.com/54/142113066_a691623143_o.jpg" width="175" height="200" alt="self" align="left"/&gt;&lt;/a&gt; 
&lt;/td&gt;
&lt;td&gt;=&amp;gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="http://www.flickr.com/photos/38456545@N00/142113068/" title="June 1999"&gt;&lt;img src="http://static.flickr.com/47/142113068_3f008ade7a_m.jpg" width="139" height="240" alt="self" align="center"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;=&amp;gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="http://www.flickr.com/photos/38456545@N00/141569082/" title="May 2006"&gt;&lt;img src="http://static.flickr.com/56/141569082_372ea07ea9_m.jpg" width="180" height="240" alt="self" align="right"/&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

Clearly the main reason for a new picture was the quality of the old one; I don't look a day older, do I;-)

My renewed interest in photography was sparked by the discovery of &lt;a href="http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html"&gt;autostitch&lt;/a&gt;, a tool that stitches together pictures from different parts of the same scene. It allows easy composition of panoramas such as the following picture of a canal in Amersfoort:

&lt;center&gt;
&lt;a href="http://www.flickr.com/photos/38456545@N00/138480223/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/45/138480223_4223d474bb.jpg" width="500" height="154" alt="canal / bridge" /&gt;&lt;/a&gt;
&lt;/center&gt;

It is composed from a bunch (10?) pictures taken by hand (no tripod) with my not so fantastic Samsung digital camera. Autostitch discovers how to put the pieces together.

It does not only work for landscape panoramas, as illustrated by the following 180 degrees interior shot:

&lt;center&gt;
&lt;a href="http://www.flickr.com/photos/38456545@N00/138467614/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/50/138467614_e18f8c11c7.jpg" width="500" height="260" alt="interior" /&gt;&lt;/a&gt;
&lt;/center&gt;

It can also be used for funny things such as the following composition of three pictures I took back in 2004 at OOPSLA/GPCE in Vancouver of Martin Bravenboer and Jurgen Vinju:

&lt;center&gt;
&lt;a href="http://www.flickr.com/photos/38456545@N00/138507999/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/54/138507999_bf0e6fac62.jpg" width="500" height="238" alt="Bravenboer &amp; Vinju" /&gt;&lt;/a&gt;
&lt;/center&gt;

Or even more surrealistic compositions with multiple occurrences of the same people:

&lt;center&gt;
&lt;a href="http://www.flickr.com/photos/38456545@N00/141305202/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/51/141305202_2f0abd668a.jpg" width="500" height="391" alt="garden" /&gt;&lt;/a&gt;
&lt;/center&gt;

See my &lt;a href="http://www.flickr.com/photos/38456545@N00/tags/autostitch/"&gt;autostitch experiments&lt;/a&gt; for more examples. 

That was a fun diversion in the past week. I've neglected this blog for a while. Much has happened in the meantime, and there are many plans for new (program) transformation work. Now that I've found time for messing around with picture transformation, I expect I'll find time for new blogs as well in the near future. Stay tuned. (I will mainly publish new photos at my &lt;a href="http://www.flickr.com/photos/38456545@N00/"&gt;flickr&lt;/a&gt; account.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-114702474467044393?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/114702474467044393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=114702474467044393' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/114702474467044393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/114702474467044393'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2006/05/image-transformation.html' title='Image Transformation'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-112681615320943665</id><published>2005-09-15T21:55:00.000+02:00</published><updated>2006-11-05T21:07:26.081+01:00</updated><title type='text'>MetaBorg in Action</title><content type='html'>This morning Rene de Groot presented his thesis work in our &lt;a href="http://www.cs.uu.nl/wiki/Stc"&gt;Software Technology Colloquium&lt;/a&gt;. He has 
worked on two case studies of embedding domain-specific languages in Java --- applying and refining our &lt;a href="http://www.stratego-language.org/Stratego/MetaBorg"&gt;MetaBorg&lt;/a&gt; approach to `&lt;a href="http://www.cs.uu.nl/wiki/Visser/ConcreteSyntaxForObjects"&gt;concrete syntax for objects&lt;/a&gt;'.

&lt;p&gt;

In the first case study Rene elaborated the JavaSwul extension of Java with the SWing Userinterface Language. Rather than the usual spaghetti code of Swing method invocations, the language allows you to follow the hierarchical structure of the Swing class hierarchy to create
userinterface objects. For example, the following GUI

&lt;p&gt;

&lt;img src="http://www.stratego-language.org/pub/Stratego/JavaSwulExamples/Test3.png" align="center"&gt;

&lt;p&gt;

is produced by this Java program

&lt;blockquote&gt;
&lt;pre&gt;
import javax.swing.*;
import java.awt.*;
  
public class Test3 {
  public static void main(String[] ps) {
    JFrame frame = frame {
      title = "Welcome!"
      content = panel of border layout {
        center = label { text = "Hello World" }
        south = panel of grid layout {
          row = {
            button { text = "cancel" }
            button { text = "ok"}
          }
        }
      }
    };
    frame.pack();
    frame.setVisible(true);
  }
}
&lt;/pre&gt;
&lt;/blockquote&gt;

The &lt;a href="http://www.stratego-language.org/Stratego/JavaSwulExamples"&gt;JavaSwul Examples&lt;/a&gt; page contains a number of other cool examples including the creation of menus with eventhandlers and gridbags with a semi-visual layout syntax.

&lt;p&gt;

The second case study is the extension of Java with concrete syntax for regular expressions. First it provides a syntax for regular expressions and checks regular expressions in a program against that syntax &lt;em&gt;at compile-time&lt;/em&gt;. Second because of the explicit syntax extension, there is no need for escaping special characters as has to be done when encoding regular expressions using strings. Finally, the extension provides syntax for defining string rewrite rules and combining those into compound string rewrite operations (analogously to rewriting strategy combinators in &lt;a href="http://www.stratego-language.org"&gt;Stratego&lt;/a&gt;). Here is an example, with some wiki-like rewrite rules:

&lt;blockquote&gt;
&lt;pre&gt;
public String publish(String page) {
  regex body = [/ &amp;lt;body[^&gt;]*?&gt; .* &amp;lt;/body&gt; /]

  regex amp = [/ &amp;amp; /] -&gt; [/ &amp;amp;amp; /] ;
  regex lt  = [/ &amp;lt; /] -&gt; [/ &amp;amp;lt;  /] ;
  regex gt  = [/ &gt; /] -&gt; [/ &amp;amp;gt;  /] ;

  regex escape = amp &amp;lt;+ lt &amp;lt;+ gt

  regex noattach  = [/ &amp;lt;a[^&gt;]*?&gt; \s* Attach \s* &amp;lt;/a&gt; /]
                 -&gt; [/ &amp;lt;strike&gt; Attach &amp;lt;/strike&gt; /] ;
  regex edittopic = [/ %EDITTOPIC% /]
                 -&gt; [/ &amp;lt;a href="${editAction}"&gt;&amp;lt;b&gt; Edit &amp;lt;/b&gt;&amp;lt;/a&gt; /] ;
  input ~= one( body
                &amp;lt;~&gt;
                all( edittopic &amp;lt;+ noattach &amp;lt;+ escape  )
              )
  return input ;
}
&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;

In addition to the syntactic extensions of Java and their definition using transformations, the implementations include an extension of &lt;a href="http://www.cs.uu.nl/~martin"&gt;Martin Bravenboer&lt;/a&gt;'s typechecker for Java, so that Java programs using the extensions are typechecked &lt;em&gt;before&lt;/em&gt; transformation.

&lt;p&gt;

A preview of the work is presented in &lt;a href="http://www.cs.uu.nl/wiki/Visser/MetaBorgInAction"&gt;MetaBorg in Action&lt;/a&gt;,  a paper for the 
&lt;a href="http://www.di.uminho.pt/GTTSE2005"&gt;Summer School on Generative and Transformational Techniques in Software Engineering (GTTSE'05)&lt;/a&gt; that  was held in Braga, Portugal last Summer.

Rene's thesis is due soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-112681615320943665?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/112681615320943665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=112681615320943665' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112681615320943665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112681615320943665'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2005/09/metaborg-in-action.html' title='MetaBorg in Action'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-112594884650140583</id><published>2005-09-05T21:05:00.000+02:00</published><updated>2006-11-05T21:07:26.013+01:00</updated><title type='text'>Service Configuration Management</title><content type='html'>Today our sysadmin asked me to setup a new wiki for use in some course. (Due to early wiki enthusiasm I became wiki master in our department. In fact it took quite some time to convince people that not having a single web master was a good idea.) When I set up my first wikis, one for our &lt;a href="http://www.cs.uu.nl/wiki/Center"&gt;Software Technology&lt;/a&gt; research group and the other for &lt;a href="http://www.program-transformation.org"&gt;Program-Transformation.Org&lt;/a&gt;, it took me quite some time to get everything installed in the right place, customize the configuration file, and such misery. For instance, on the webserver of our department perl was not installed in &lt;code&gt;/usr/bin&lt;/code&gt; as was expected by the CGI scripts of TWiki, but rather in &lt;code&gt;/sw/bin&lt;/code&gt;. This required patching all scripts each time I upgraded the installation. Also the directories containing the site were mounted on a different path in the webserver than on the user server. Thus, scripts that were invoked via cron job (for example to update statistics) needed a different path configuration than scripts running on the server. As a result, updating the site was not something to look forward to, let alone adding new installations.

&lt;p&gt;

Today I didn't flinch a second when receiving the request to create a new wiki. I just copied the 60 line &lt;a href="http://www.cs.uu.nl/wiki/Trace/Nix"&gt;Nix&lt;/a&gt; file of another wiki, changed the name of the wiki, the directories in which to store the wiki data, the port at which to approach the wiki on the server, and customized a few other options. Then I called the install script, and there I had a new wiki set up and running. Well, actually I had to ask sysadmin to open the new port, but then it was just there. 

&lt;p&gt;

This is all thanks to &lt;a href="http://www.cs.uu.nl/wiki/Visser/ServiceConfigurationManagement"&gt;service configuration management&lt;/a&gt; with &lt;a href="http://www.cs.uu.nl/wiki/Trace/Nix"&gt;Nix&lt;/a&gt;. In this paper that
&lt;a href="http://www.cs.uu.nl/~eelco"&gt;Eelco Dolstra&lt;/a&gt; will present tomorrow morning at &lt;a href="http://www.cs.ucsc.edu/~ejw/scm12/"&gt;SCM-12&lt;/a&gt; in Lisbon (Portugal), we show that the management of services requires the integrated management of software &lt;em&gt;and&lt;/em&gt; configuration. By treating software configurations just like any other software components, rather than as state managed in global directories, one can uniquely and reproducibly describe a specific instance of a service. We have used this to succesfully deploy quite a few services already, including a &lt;a href="http://svn.cs.uu.nl"&gt;subversion&lt;/a&gt; version management server, a &lt;a href="https://bugs.cs.uu.nl/"&gt;Jira&lt;/a&gt; issue tracking server, a &lt;a href="http://nix.cs.uu.nl/"&gt;buildfarm and automatic release management system&lt;/a&gt;. The description of the machine specific parts of the deployment of these services is factored out into a small Nix expression, such that I could create a combined subversion/wiki server on my little home machine with the push of a button (well almost).

&lt;p&gt;

So if you don't have a chance to attend Eelco's talk tomorrow morning, at least have a look at the &lt;a href="http://www.cs.uu.nl/wiki/Visser/ServiceConfigurationManagement"&gt;paper&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-112594884650140583?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/112594884650140583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=112594884650140583' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112594884650140583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112594884650140583'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2005/09/service-configuration-management.html' title='Service Configuration Management'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-112565195868487492</id><published>2005-09-02T11:05:00.000+02:00</published><updated>2006-11-05T21:07:25.954+01:00</updated><title type='text'>Stratego/XT 0.16M1</title><content type='html'>The new translation scheme turned out quite well. On Linux it gives a slight performance improvement, on Macs it gives a major performance improvement; speedups of 3 times have been
observed. Good reason for a new release:
&lt;p&gt;
Stratego/XT 0.16M1 is now available from
&lt;blockquote&gt;
  &lt;a href="http://www.stratego-language.org/Stratego/StrategoRelease016M1"&gt;http://www.stratego-language.org/Stratego/StrategoRelease016M1&lt;/a&gt;
&lt;/blockquote&gt;
This release is the first milestone release (M1) towards the new major
release 0.16. (The zero-th milestone was called 0.15.) 
&lt;p&gt;
The purpose of the 0.16 development is a major overhaul of the language
and compiler internals. Release 0.15 introduced the Stratego Core
language and the corresponding refactoring and clean up of the compiler.
This release features a lot of fixes to the Stratego Core compiler and
lots of other small improvements. Noteworthy features include:
&lt;ul&gt;
&lt;li&gt; call(f|s*|t*) is a new language constructs that supports calling
strategies by name, i.e., f is a term that is interpreted as the name
of the strategy to call. Can be used for callbacks in libraries. 
&lt;li&gt; checksum strategy gives MD5 checksum of a term
&lt;/ul&gt;
Furthermore, this release already contains some features planned for
future milestones:
&lt;p&gt;
For 0.16M2: A new translation scheme for implementing choice. Rather
than using setjmp/longjmp the scheme now use NULL pointers to indicate
the failure of a strategy. This produces a slight performance
improvement on Linux and a great performance on Macs, where the
setjmp/longjmp feature is quite expensive to use.
&lt;p&gt;
For 0.16M3: A good number of improvements to the implementation of
dynamic rules. In particular, the compiler now detects overlapping
dynamic rules and forbids their use.  
&lt;p&gt;
While the 0.15 release was still rather experimental, the 0.16M1 release
is much improved and is fairly reliable. We are interested in your
experiences. Please report any problems such that we can solve these as
soon as possible. We plan to have a stable 0.16 release by the end of
September.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-112565195868487492?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/112565195868487492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=112565195868487492' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112565195868487492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112565195868487492'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2005/09/strategoxt-016m1.html' title='Stratego/XT 0.16M1'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-112465580217874364</id><published>2005-08-21T23:47:00.000+02:00</published><updated>2006-11-05T21:07:25.892+01:00</updated><title type='text'>Translating Failing Transformations</title><content type='html'>After deliberating about it for a long time (several years even), I finally implemented a new translation scheme for the Stratego Compiler. The old scheme used the C feature of setjmp/longjmp to  deal with failing transformations. This provided the opportunity to go from using C as an assembly language, where an entire Stratego program was compiled to a &lt;em&gt;single&lt;/em&gt; C function using gotos for control-flow, to a more idiomatic style of C programs in which each strategy definition was compiled to a C function. The setjmp/longjmp feature elegantly dealt with the notion of a failure by declaring a choice point (with setjmp) and jumping to it from anywhere (with longjmp). However, since choice points are &lt;em&gt;the&lt;/em&gt; control-flow mechanism in Stratego, the speed of programs depends heavily on the cost of this feature. On Intel machinery (running Linux) this is not a big issue, but on Apples and Suns (RISC machines) the number of registers saved at each choicepoint is quite expensive; at least that is a theory about possibilities for improving the performance of Stratego programs.
&lt;p&gt;
Eelco Dolstra suggested a long time ago to return NULL to indicate failure of a strategy. Indeed, this representation closely matches the &lt;a href="http://www.cs.uu.nl/research/techreps/UU-CS-2005-005.html"&gt;formal operational semantics of the language&lt;/a&gt;, in which the set of terms is extended with a failure value; exactly the ATerm data-type extended with an extra value (NULL). While conceptually simple, the idea seemed too disruptive to the run-time system, compiler, and native parts of the library to start work on, and there were always plenty of other things to do. (Especially considering the fact that the change does not add one bit of functionality.) 
&lt;p&gt;
After the recent Stratego Core refactoring and clean up of the intermediate representation and the compiler, and solving lots of outstanding issues, this translation scheme refactoring came into view again. Interestingly, it took less then a week &lt;em&gt;real time&lt;/em&gt; to achieve, which included a camping trip, a visit to Philips Research, and reading a couple of theses and articles. So either the problem was never that problematic to start with, or the recent drastic refactorings of the Stratego/XT source tree, configuration, and build system has paid off. Also the change to baseline-based bootstrapping (from self-based bootstrapping) has enormously simplified the process of changing the foundations of the compiler. Finally, the reliance on a solid continous build and release system gives one much more confidence in committing to a new version to bootstrap against. If there is a general lesson here: refactoring and continuous integration pay off.
&lt;p&gt;
As for the new translation itself; it is pretty standard fair. Have a look at &lt;a href="https://svn.cs.uu.nl:12443/repos/StrategoXT/trunk/StrategoXT/strc-core/spec/c/s2c-ng.str"&gt;s2c-ng.str &lt;/a&gt; and compare it to the classic &lt;a href="https://svn.cs.uu.nl:12443/repos/StrategoXT/trunk/StrategoXT/strc-core/spec/c/s2c-classic.str"&gt;s2c.str&lt;/a&gt;. The only flaw is that I had to resort to producing code with gotos. Noteworthy about the new version is the use of concrete syntax of Stratego and C almost everywhere, which makes a difference between night and day in maintaining the translation scheme. For example, the following rule defines the translation of the crucial guarded choice construct:

&lt;pre&gt;
  TranslateStrat(|S,F) :
    |[ s1 &amp;lt; s2 + s3 ]| -&gt;
    stm|[
      {
        ATerm ~id:x = t;
        ~stm:&amp;lt;translate-strat(|Next,F')&gt;s1
        ~stm:&amp;lt;translate-strat(|S,F)&gt;s2
        ~id:F' : t = ~id:x; 
        ~stm:&amp;lt;translate-strat(|S,F)&gt;s3
      }
    ]|
    where &amp;lt;not(Next)&gt; S; new =&gt; x; new =&gt; F'
&lt;/pre&gt;

Another interesting new feature is the collection of code &lt;em&gt;fragments&lt;/em&gt; using dynamic rules, and the synthesis of the target program from these fragments afterwards; in contrast to the old method in which the source program was traversed for each type of fragment `driven by' the target program.
&lt;p&gt;
I'm writing this blog while waiting for the bootstrap build to go through, but from the regression tests for the compiler the implementation seems to work fine. What is not clear yet, is the performance improvement this will bring, if any. Another feature of the current translation scheme that seems to have negative impact on the performance of Stratego programs, especially on Apples and Suns, is the use of nested functions in the target C code. This is a feature of GCC, and therefore fraught with portability and performance problems. The implementation using trampolines also does not go very well with the tendency to forbid executable code on the stack. So this aspect of the translation is next in line to be changed. The basic idea is again simple and the use of fragment collection was partly motivated by this change. More later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-112465580217874364?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/112465580217874364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=112465580217874364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112465580217874364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112465580217874364'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2005/08/translating-failing-transformations.html' title='Translating Failing Transformations'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-112374895467677866</id><published>2005-08-11T10:29:00.000+02:00</published><updated>2006-11-05T21:07:25.713+01:00</updated><title type='text'>Transforming Bibliographies</title><content type='html'>Among the useless things one can do in life, maintaining one or more publication lists ranks high. My tendency to waste time on my publication list probably dates back to my days as a PhD student when I badly needed publications to put on a list. On the other hand, as publications are  the measure of achievement in research, more researchers may have this problem.
&lt;p&gt;
Anyway, maintaining a list of publications can be quite tedious, in particular if you want to provide &lt;a href="http://www.cs.uu.nl/wiki/Visser/PublicationsByYear"&gt;multiple views&lt;/a&gt; on the publications. For example, a listing with &lt;a href="http://www.cs.uu.nl/wiki/Visser/PublicationsByYear"&gt;most recent publications&lt;/a&gt; first, one providing the &lt;a href="http://www.cs.uu.nl/wiki/Visser/KeyPublications"&gt;most important ones&lt;/a&gt; first, one organized by research topic, and finally a separate list for &lt;a href="http://www.cs.uu.nl/wiki/Visser/StrategoXT"&gt;each project&lt;/a&gt;. Also your department may require regular submission of lists. On the web version the entries should come with links to the pdf files and/or the webpage of the publisher, but these links should not be displayed in the version for printing, since they are quite useless there.

&lt;p&gt;

Being a computer scientist, I elevated the activity of maintaining content to maintaining a program for generating the various lists. This is still a waste of time, of course, but the excuse is that it will save me time in future. Another excuse is that I developed my program as a case study for the &lt;a href="http://www.stratego-language.org"&gt;transformation language Stratego&lt;/a&gt;.

&lt;p&gt;

In fact, the &lt;a href="http://www.stratego-language.org/Stratego/BibtexTools"&gt;bibtex-tools package&lt;/a&gt; has emerged over a long time, starting with a syntax definition  for BibTeX first written in 1999. It turns out that BibTeX has quite an intricate syntax that is not so easily formalized with a traditional approach based on a separate lexical analyzer and context-free parser. With the scannerless approach of &lt;a href="http://www.syntax-definition.org"&gt;SDF&lt;/a&gt; this poses no problems at all.

&lt;p&gt;

Also, the use of the Stratego to perform transformations on a structured representation of a BibTeX file is a definite improvement over directly transforming its text representation. Moreover, these transformations can be expressed quite concisely. For example, the following strategy definitions define an inliner for BibTeX that replaces occurrences of string identifiers with their body. (BibTeX allows the definition of strings such as &lt;code&gt;@string{LNCS={Lecture Notes in Computer Science}}&lt;/code&gt;, which can then be quoted in entry fields using the identifier, e.g., &lt;code&gt;series = LNCS&lt;/code&gt;.)
&lt;pre&gt;
  bib-inline = 
    bottomup(try(DeclareInlineString + InlineString + FoldWords))

  DeclareInlineString =
    ?String(_, StringField(key, value))
    ; rules( InlineString : Id(key) -&gt; value )

  FoldWords :
    ConcValue(Words(ws1), Words(ws2)) -&gt; Words(&lt;conc&gt;(ws1, ws2))
&lt;/pre&gt;
After having developed my own set of BibTeX tools using the Stratego transformation language over the last couple of years, I decided to make them into a proper software package that could be used by others, complete with a &lt;a href="http://nix.cs.uu.nl/dist/stratego/bibtex-tools-unstable-latest/bibtex-tools.pdf"&gt;manual&lt;/a&gt; that explains the LaTeX/BibTeX/Hevea techniques used to get a publication list into HTML. The currently availabe version is a pre-release of the first official release 0.2. I'm waiting for a new stable version of Stratego/XT and for some feedback from users before I make the release official.

&lt;p&gt;

So if you don't want to waste time on editing your publication list webpage, but instead want to wast time learnig to use my tools, you now know where to find them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-112374895467677866?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/112374895467677866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=112374895467677866' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112374895467677866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112374895467677866'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2005/08/transforming-bibliographies.html' title='Transforming Bibliographies'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-112197634822992841</id><published>2005-07-21T21:52:00.000+02:00</published><updated>2006-11-05T21:07:25.596+01:00</updated><title type='text'>Software Engineering News</title><content type='html'>Or niews rather. I'm warming up for another installment of our &lt;a href="http://www.cs.uu.nl/wiki/Swe"&gt;software engineering course&lt;/a&gt;, and browsing to see what is going on.  The monthly &lt;a href="http://www.serc.nl/senieuws"&gt;seniews&lt;/a&gt; newsletter written by members of &lt;a href="http://www.cibit.nl/"&gt;CIBIT&lt;/a&gt; (formerly SERC) provides pointers to developments in software engineering, and has an online archive. This month with a pointer to the new book &lt;a href="http://www.pragmaticprogrammer.com/titles/svn/"&gt;&lt;tt&gt;Pragmatic Version Control Using Subversion&lt;/tt&gt;&lt;/a&gt;, which might be recommendable reading for our students.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-112197634822992841?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/112197634822992841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=112197634822992841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112197634822992841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112197634822992841'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2005/07/software-engineering-news.html' title='Software Engineering News'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-112197496289135213</id><published>2005-07-21T21:19:00.000+02:00</published><updated>2006-11-05T21:07:25.532+01:00</updated><title type='text'>Software Deployment in the News</title><content type='html'>&lt;a href="http://developer.com/java/ent/article.php/3519186"&gt;``The deployment role is a role that is often overlooked much to the pain of the users. ''&lt;/a&gt; writes Robert  Bogue in a &lt;a href="http://www.developer.com/java/other/article.php/3490871"&gt;series about roles in software engineering&lt;/a&gt;. He forgets to mention the &lt;a href="http://www.cs.uu.nl/wiki/Trace/Nix"&gt;Nix Deployment System&lt;/a&gt; unfortunately. In Bogue's world (which is most of the world) software deployment is mostly a craft that has to be repeated for each and ever application to be installed, and one has to pray that a carefully crafted installation program will not break on the target machine. Nix expressions encode all the dependencies of an application, and once tested succesfully, deployment consists of transmitting the closure of those dependencies, in order to guarantee that everything is present at the target site.

&lt;p&gt;

&lt;a href="http://www.infoworld.com/article/05/07/12/29OPconnection_1.html"&gt;Managed desktops&lt;/a&gt;, the next step for &lt;a href="http://www.cs.uu.nl/wiki/Trace/Nix"&gt;Nix&lt;/a&gt;? Chad Dickerson &lt;a href="http://www.infoworld.com/article/05/07/12/29OPconnection_1.html"&gt;writes&lt;/a&gt; about outsourcing the management of desktop systems. We have been getting quite good at managing all aspects of services with Nix. That is, management of all software components &lt;em&gt;and&lt;/em&gt; their configuration in one formalism. Examples are our &lt;a href="http://svn.cs.uu.nl/"&gt;subversion&lt;/a&gt; and &lt;a href="http://www.cs.uu.nl/wiki"&gt;Wiki&lt;/a&gt; servers. It would be great if this can be expanded to an entire desktop environment.

&lt;p&gt;

By the way, I found these items on ACM's &lt;a href="http://www.acm.org/careernews/"&gt;careernews&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-112197496289135213?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/112197496289135213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=112197496289135213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112197496289135213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112197496289135213'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2005/07/software-deployment-in-news.html' title='Software Deployment in the News'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-112178308667306020</id><published>2005-07-19T15:27:00.000+02:00</published><updated>2006-11-05T21:07:25.470+01:00</updated><title type='text'>Transformations for Abstractions</title><content type='html'>I finally finished my &lt;a href="http://www.cs.uu.nl/%7Evisser/ftp/Vis05-tfa.pdf"&gt;keynote paper&lt;/a&gt; for &lt;a href="http://www.dcs.kcl.ac.uk/staff/mark/scam2005/"&gt;SCAM 2005&lt;/a&gt;, the worshop on Source Code Analysis and Manipulation, which will be held at the end of September in Budapest. This is a good occasion for finally making a start with my blog as well, as the title of the paper `Transformations for Abstractions' suggests that it is related to the topic of my blog. As the introduction states:
&lt;blockquote&gt;
What is common in the &lt;span style="font-style: italic;"&gt;transformations&lt;/span&gt; that &lt;a href="http://www.stratego-language.org/"&gt;we&lt;/a&gt; are exploring is that they are &lt;span style="font-style: italic;"&gt;for&lt;/span&gt; supporting &lt;span style="font-style: italic;"&gt;abstractions&lt;/span&gt;. That is, to enable programming at a higher-level of abstraction. Our aim is to integrate such transformations in the software development process and make them available to programmers. That is, create programming environments with full meta-programming support that let the (meta-) programmer extend the language, the compiler, and other aspects of the environment such as documentation generators. This requires the transformations provided by the programming environment to be extensible. The base programming language should be extensible with new constructs and/or with new (primitive) APIs implementing new abstractions. Likewise the compiler should be extensible with new transformations, and existing transformations should be extensible to new language constructs. New constructs may be implemented by reduction to the base language, or by extension of the back-end of the compiler. APIs may require domain-specific optimizations to ensure efficient execution.
&lt;/blockquote&gt;
The paper presents a small case study in the definition of extensible programming environments, where a programming environment is understood as consisting of a syntax definition of a language and a bunch of transformations on programs in that language. The programming environment in case is called TFA and is a tiny imperative language with a number of extensions.

&lt;p&gt;

A couple of highlights:

&lt;p&gt;

The language in the paper is strongly modularized. Each aspect such as built-in data types and language features are defined as a separate component. The framework provides a syntax definition and a number of transformations to be applied to programs in the language. Both the syntax definition and the implementation of the transformations in Stratego are modularized per extension. The transformations include desugarings, bound-variable renaming, evaluation (an interpreter), data-flow transformations, and function specialization.

&lt;p&gt;

Of course, the implementation of all the transformations use concrete syntax. For example, desugaring of for-loops is defined by the following rewrite rule:
&lt;pre&gt;
ForToWhile :
  |[ for x := e1 to e2 do st* end ]| -&gt;
  |[ begin
       var x : int; var y : int;
       x := e1; y := e2;
       while x &lt;= y do
           st* x := x + 1;
       end
     end ]|
  where new =&gt; y
&lt;/pre&gt;
A particularly cool extension is the embedding of the domain-specific language of regular expressions. In the regexps extension one can write /re/e to match the string resulting from evaluating the expression e to the regular expression re. This extension is implemented by means of a bunch of desugaring rewrite rules that use dynamic rules to create new function definitions that should be added to the program at top-level. For example, the following rule defines the assimilation of the Kleene star operator:
&lt;pre&gt;
ReKle : |[ /re*;f/ x ]| -&gt; |[ g(x) ]|
where new =&gt; g
    ; add-def(||[
        function g(a : string) : int
        begin
          return /re;g/a | f(a);
        end ]|)
&lt;/pre&gt;
The sources for TFA can be found at the &lt;a href="http://www.stratego-language.org/Stratego/TransformationsForAbstractions"&gt;Transformations For Abstractions&lt;/a&gt; page of the Stratego wiki (although they are currently in very alpha state).

&lt;p&gt;

So what is my blog going to be about then? (First of all, I'm getting really annoyed with this editor as I haven't seem to find the right way to include code snippets, so I may well give up and go back to good old wiki editing). Well, in the coming months at least, I intend to further explore the TFA framework to see how far I can get with extensibile transformations in Stratego. In the course of this project I intend to add new extensions, both in the area of traditional programming language features as in the area of domain-specific language embeddings, andincorporate more types of transformations. The end result should be an extensible programming environment that might actually become useful in itself, a catalogue of transformations, and a better insight in the problems of extensibility.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-112178308667306020?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/112178308667306020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=112178308667306020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112178308667306020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/112178308667306020'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2005/07/transformations-for-abstractions.html' title='Transformations for Abstractions'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13105375.post-111682856268824476</id><published>2005-05-23T08:05:00.000+02:00</published><updated>2006-11-05T21:07:25.379+01:00</updated><title type='text'>How does this blog?</title><content type='html'>An experimental post to see how this thing works and find out whether I'll be comfortable with putting content on some other server. (And is it possible to get the content out again?) I'd rather integrate a blog with my &lt;a href="http://www.cs.uu.nl/%7Evisser"&gt;wiki homepage&lt;/a&gt;, but that hasn't worked &lt;a href="http://www.cs.uu.nl/wiki/Visser/WebLog"&gt;so far&lt;/a&gt;.

&lt;hr /&gt;
Ok, checking the configuration options it turns out that everything is adaptable and that I can even store the blog on my own server (if i'd want that). So I'll leave things as they are and change them when I feel like it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13105375-111682856268824476?l=eelcovisser.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://eelcovisser.blogspot.com/feeds/111682856268824476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13105375&amp;postID=111682856268824476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/111682856268824476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13105375/posts/default/111682856268824476'/><link rel='alternate' type='text/html' href='http://eelcovisser.blogspot.com/2005/05/how-does-this-blog.html' title='How does this blog?'/><author><name>Eelco Visser</name><uri>http://www.blogger.com/profile/11638112536638562418</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://static.flickr.com/56/141569082_372ea07ea9_m_d.jpg'/></author><thr:total>0</thr:total></entry></feed>
