<?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-3304484534461096867</id><updated>2011-08-06T02:35:12.529-07:00</updated><title type='text'>Tales From Boxcat Junction</title><subtitle type='html'>Technical mutterings about dynamic languages, the JVM and anything else which comes to hand.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-6698783102551248235</id><published>2010-10-07T14:48:00.000-07:00</published><updated>2010-10-07T14:53:54.590-07:00</updated><title type='text'>Book Update</title><content type='html'>I can't believe how busy it's been on the book front recently.&lt;br /&gt;&lt;br /&gt;We have a new site live for it: &lt;a href="http://bit.ly/a7H67J"&gt;http://bit.ly/a7H67J&lt;/a&gt; and Martijn and I have recently been looking at some possible cover designs (will post as soon as they're finalized and we can share).&lt;br /&gt;&lt;br /&gt;There's also been a slight title change - we're now working on "The Well-Grounded Java Developer" (with "Covers Java 7" as the subtitle). The reason for that is we want to emphasize that the book is about more than just the Java 7 syntax changes - we're talking about a lot of the other shifts in the Java landscape, about multi-language, and lots of other things.&lt;br /&gt;&lt;br /&gt;The links to our first "Green Paper" and other new content should go live soon, and after that - Early Access. It's all quite exciting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-6698783102551248235?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/6698783102551248235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=6698783102551248235' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/6698783102551248235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/6698783102551248235'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2010/10/book-update.html' title='Book Update'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-600533678587006686</id><published>2010-09-05T06:57:00.000-07:00</published><updated>2010-09-05T07:11:17.378-07:00</updated><title type='text'>Forthcoming Book</title><content type='html'>I'm very pleased to announce that my new book "The Well-Grounded Java 7 Developer" will be published by Manning, for release in Spring 2011.&lt;br /&gt;&lt;br /&gt;My co-author is Martijn Verburg - his announcement post is &lt;a href="http://martijnverburg.blogspot.com/2010/08/well-grounded-java-7-developer.html"&gt;here&lt;/a&gt; - and we'll be making further posts as we develop this project. It's a concept that we've been developing together since late last year, and we're both really excited about it.&lt;br /&gt;&lt;br /&gt;The next big step forward will be when our drafts hit the Manning Early Access Program (MEAP), which should be in a few weeks time - I'll be sure to update with links when we're live.&lt;br /&gt;&lt;br /&gt;Now, back to writing chapter 7.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-600533678587006686?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/600533678587006686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=600533678587006686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/600533678587006686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/600533678587006686'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2010/09/forthcoming-book.html' title='Forthcoming Book'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-8738352001055082085</id><published>2010-05-15T05:58:00.001-07:00</published><updated>2010-05-16T04:04:43.196-07:00</updated><title type='text'>Thoughts on Diaspora / Distributed Social Networks</title><content type='html'>&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://bit.ly/bEX3Se"&gt;This post&lt;/a&gt;, by Matt Asay, decries Diaspora (the forthcoming Open Source Distributed Social network which seeks to disintermediate FB and other centralised social networks in favour of personal 'seeds' - services which directly connect to each other and aggregate content from services, essentially externalizing the social graph into links between seeds).&lt;br /&gt;&lt;br /&gt;He makes some good points, largely that this is a geek toy for geeks (although he misses the obvious corollary that in this game, that's how everything &lt;span style="font-style: italic;"&gt;starts&lt;/span&gt;, but if Gibson's to be believed, the street finds its own uses for things. Isn't that what happened with Twitter?) and that the technical nous required to set up a seed is going to be too high (which is a problem the scene can solve).&lt;br /&gt;&lt;br /&gt;His fundamental fallacy, though, is that ordinary people just don't care about the privacy and safety aspects of their data, and that they value the aggregation of "everything in one place" ie FB.&lt;br /&gt;&lt;br /&gt;This simply isn't true. It's not just that survey after survey is coming out showing that the so-called digital native generation do care about their privacy, they just feel that they have no option but to use FB. It's not just that Zuckerpunched has entered the lexicon, to mean being tricked into revealing more information than you intended to.&lt;br /&gt;&lt;br /&gt;The basic fallacy "ordinary people value aggregation over privacy" is disproved by looking at people's plans for their birthday (and it's mine next week - send me cake :) ). Most people will have two or three (or even more) separate celebrations for their birthday - there'll be drinks with colleagues after work one evening, there'll be a family meal and a gathering for friends.&lt;br /&gt;&lt;br /&gt;Those partitions of the social graph exist for ordinary people, and they represent groups in which ordinary people may well display different aspects of themselves, and it's that which Matt's missing, and it's that which is a huge stumbling block  for FB. They don't segregate your data into sets which accurately represent your aspects and groups of connections. They don't, because they &lt;span style="font-style: italic;"&gt;can't&lt;/span&gt;. I don't mean technically, because of course they could with enough engineering resource. They can't, because they're a slave to the needle now, baby. Monetizing your info is the only thing that's going to keep their VC investors happy, and by now, everyone has such high expectations (4sq turned down 100M - and if that's not the dictionary definition of delusional, I don't know what is) that they have to scrabble to get every last cent out of you, and that means mining all of your information.&lt;br /&gt;&lt;br /&gt;Perhaps in a few years, we'll come to look back on the idea that the social graph should be monetized separately by many sites, all of which seek to lock up and treat as proprietary the connections between human beings - perhaps we'll come to see this as a strange passing fancy from which a mature market awakened. One thing seems certain, however - the current situation in which the social graph is replicated imperfectly across dozens or hundreds of sites is incredibly inefficient, and with the 800-pound Facebook gorilla failing to provide a functionality which the overwhelming majority of people want (the ability to manage multiple aspects of your personal graph), then the situation is ripe for upset.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-8738352001055082085?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/8738352001055082085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=8738352001055082085' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/8738352001055082085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/8738352001055082085'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2010/05/thoughts-on-diaspora-distributed-social.html' title='Thoughts on Diaspora / Distributed Social Networks'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-3208681856023216613</id><published>2010-03-03T00:42:00.000-08:00</published><updated>2010-03-03T00:44:40.860-08:00</updated><title type='text'>Introduction to OSS Event</title><content type='html'>Announcing an Introduction to Open Source day on April 17th in IBM's flagship offices on the South Bank. Full details are: &lt;a href="http://bit.ly/GOSJL2010"&gt;here&lt;/a&gt;. We opened registration to our existing membership base on Friday, and the event is half-full already, so we expect this to fill up fast.&lt;br /&gt;&lt;br /&gt;The day will consist of short introductions to our participating projects, then a full day working on real project tasks (fixing bugs, coding new features, improving the test coverage, improving the documents that go along with the project). At the end of the day, we hope everyone's contributions will be finished and will be committed to the project - and they will become an official contributor.&lt;br /&gt;&lt;br /&gt;So, if you're a student or relatively recent graduate who has always wanted to try out Open Source development, please think about coming along. It's going to be a really stimulating day, makes a great talking point for your CV / any interviews, and you'll meet not only a very bright group of your peers, but also a number of senior and very experienced software experts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-3208681856023216613?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/3208681856023216613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=3208681856023216613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/3208681856023216613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/3208681856023216613'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2010/03/introduction-to-oss-event.html' title='Introduction to OSS Event'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-3348822103729547940</id><published>2010-02-28T01:41:00.000-08:00</published><updated>2010-02-28T12:10:54.190-08:00</updated><title type='text'>Thoughts on Free / Open Source Software</title><content type='html'>This post is intended to provide a basic introduction to some of the concepts and motivations of Free / Open Source Software (F/OSS). The intended audience is students who are on the path to becoming professional developers - either final year undergrads or recent graduates beginning their first job.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;A Definition of Open Source&lt;/span&gt;&lt;br /&gt;Open Source software is software which meets these criteria:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Everyone can download and use the software as-is for any purpose they like, without any royalty or license payments.&lt;/li&gt;&lt;li&gt;Everyone can study the source code and make changes if they like&lt;/li&gt;&lt;li&gt;Everyone can give the software to anyone they like - with or without changes (but you can't take credit for things you didn't write, and you have to provide source code and the same rights as you received)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Notice that the above definition leads to a situation where for practical purposes, Open Source software is made available without charge - because even if the original developer asked for money (eg to cover the cost of bandwidth) then anyone who downloaded it, could redistribute it free of charge.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Free Software and Open Source Software&lt;/span&gt;&lt;br /&gt;There are two major points of view regarding what is the most important aspect of this movement in the software world. One viewpoint is that the access to the source code, and the availability of the software without charge are the most important aspects. This view is usually the one in which businesses are most interested in when they consider Open Source.&lt;br /&gt;&lt;br /&gt;However, the other viewpoint chooses to emphasise the user’s intellectual freedoms to use and modify the software as they see fit. Many people in this part of the movement prefer the term ‘Free Software’ to ‘Open Source’ for this reason.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"When we call software 'free', we mean that it respects the users' essential freedoms: the freedom to run it, to study and change it, and to redistribute copies with or without changes. This is a matter of freedom, not price, so think of 'free speech', not 'free beer'."&lt;/span&gt; - Richard Stallman&lt;br /&gt;&lt;br /&gt;The term "Free Software" view holds that it's not simply the access to the source code and lack of a price tag on the code which matters - the freedoms of the user of the software are seen as a major point of principle and central to the entire development practice.&lt;br /&gt;&lt;br /&gt;Free Software and Open Source Software are two schools of thought which share many common goals, but which have different philosophies and emphasis. Despite these difference in approaches, however, virtually all software which is Open Source is also Free, and for practical purposes, all Free Software is Open Source.&lt;br /&gt;&lt;br /&gt;More importantly, most of the time this distinction does not matter to the majority of people who use and develop Open Source or Free Software. The different philosophical approaches that individual developers take do not usually matter in terms of their ability and willingness to work together - people with very different views on the underlying philosophy can and do work very effectively on the same project, to the same goals.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How does this fit into the modern software industry?&lt;/span&gt;&lt;br /&gt;These days virtually all companies will use F/OSS for at least some of their software needs, and F/OSS is contained in a very large number of consumer devices, such as wireless routers and HD televisions from major manufacturers.&lt;br /&gt;&lt;br /&gt;F/OSS has become a major presence in the software world and is now widely used in all sectors of the industry, particularly to provide infrastructure solutions or libraries to build upon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What are some examples of Open Source / Free Software?&lt;/span&gt;&lt;br /&gt;The Linux operating system. The Apache web server. Java (eg OpenJDK or Apache Harmony). The PHP web programming language.&lt;br /&gt;&lt;br /&gt;The important thing to note here is that when F/OSS provides a platform on which to run other code (the business applications), then the source code for the business applications does not usually need to be released. For example, just because PHP is Free Software, does not mean that the source code to Facebook (and every other web application which uses PHP) needs to be available.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How does Open Source / Free Development work?&lt;/span&gt;&lt;br /&gt;The source code is usually made available at all stages of development after the initial announcement - quite often through allowing public (read-only) access to the source repository.&lt;br /&gt;&lt;br /&gt;In addition to the source code, projects will usually produce official releases, on whatever timescale they deem appropriate.&lt;br /&gt;&lt;br /&gt;Individual developers can then join the project, by joining the project forums (eg mailing lists, bug trackers, etc) and getting up to speed and then starting to participate. This participation can take a number of forms - not just coding tasks. For example, developers who can write good tests or lucid project documents are in demand in virtually all large Open Source projects. Discussions about design and direction of the project will take place on the project mailing list, and people are welcome to contribute - although as with most projects a developer’s experience and standing in the community will be a factor in how seriously their views are taken.&lt;br /&gt;&lt;br /&gt;Developers will usually tackle the tasks which interest them the most, although this can lead to duplication of effort, as several people may choose to stat attacking the same interesting-seeming problem. Sometimes developers who are new to the project will ask experienced devs what would be good starter tasks - and this can be a good way to get into a new project.&lt;br /&gt;&lt;br /&gt;These open and decentralised approaches to development make it a very different environment from that found in many commercial workplaces. This is to be expected as the typical Open Source developer is not directly compensated (in material terms) for the work they do.&lt;br /&gt;&lt;br /&gt;The primary reasons that developers have for being involved in Free or Open Software are very varied - but common motivations include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Recognition by one’s peers&lt;/li&gt;&lt;li&gt;Satisfaction of scratching a personal “development itch”&lt;/li&gt;&lt;li&gt;Learning a new language / technology area&lt;/li&gt;&lt;li&gt;Contributing to one’s community&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-3348822103729547940?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/3348822103729547940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=3348822103729547940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/3348822103729547940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/3348822103729547940'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2010/02/thoughts-on-free-open-source-software.html' title='Thoughts on Free / Open Source Software'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-5358024511448273802</id><published>2009-12-30T13:27:00.000-08:00</published><updated>2009-12-30T13:28:56.129-08:00</updated><title type='text'>New Talk</title><content type='html'>&lt;a href="http://skillsmatter.com/podcast/cloud-grid/making-every-millisecond-count-jvm-performance-tuning-in-the-real-world"&gt;Here&lt;/a&gt; is my recent talk on JVM Performance Tuning at the Skills Matter Open Source In Finance Exchange.&lt;br /&gt;&lt;br /&gt;Thanks to Alan Hardy and the Skills Matter people for organising, and for all the great feedback from the attendees.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-5358024511448273802?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/5358024511448273802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=5358024511448273802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/5358024511448273802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/5358024511448273802'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/12/new-talk.html' title='New Talk'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-559603975831885394</id><published>2009-11-30T15:23:00.001-08:00</published><updated>2009-11-30T15:32:37.677-08:00</updated><title type='text'>Round-Up</title><content type='html'>It's been a very few weeks round at Boxcat Junction.&lt;br /&gt;&lt;br /&gt;I was lucky enough to get to Devoxx 2009 in Antwerp a couple of weeks ago - and was very impressed by the presentations and people I met there.&lt;br /&gt;&lt;br /&gt;Particular props are due to Brian Goetz and Alex Buckley from Sun, James Strachan for his OSS ESB talk and Holly Cummins (superb performance talk), Zoe Slattery and Robin Fernandes from IBM.&lt;br /&gt;&lt;br /&gt;This was followed last weekend by the London Java Community's first Unconference, graciously hosted by IBM at their Southbank location - organised by Barry Cranford and Zoe Slattery. The format went off really well, although I think next time I'd like to see more sessions using less traditional teaching methods (eg group discussions, fishbowl, etc). I hope to make my slides for my Performance talk available soon.&lt;br /&gt;&lt;br /&gt;Next week sees me in St Petersburg, meeting with Russian colleagues, and then I'm attending (and speaking at) the SkillsMatter Open Source in Finance Exchange on December 15th.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-559603975831885394?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/559603975831885394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=559603975831885394' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/559603975831885394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/559603975831885394'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/11/round-up.html' title='Round-Up'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-82205158183464868</id><published>2009-09-12T01:26:00.000-07:00</published><updated>2009-09-12T01:37:20.572-07:00</updated><title type='text'>Knew I Couldn't Stay Away</title><content type='html'>In &lt;a href="http://boxcatjunction.blogspot.com/2009/08/thanks-for-all-fish.html"&gt;this post&lt;/a&gt;, I said that I was done with language hacking for a while.&lt;br /&gt;&lt;br /&gt;Well, I guess I can't stay away from it. Mattia Barbon has been running the Language::P project for a while now, &lt;a href="http://github.com/mbarbon/language-p/tree/master"&gt;over on github&lt;/a&gt;, and I've agreed to give him a hand with the Java backend pieces of that project.&lt;br /&gt;&lt;br /&gt;The current state is that he has a Perl5 parser, which covers a reasonable (and improving) subset of P5. The parser is written in Perl5, and currently outputs a packed bytecode format (consisting of P5ish opcodes).&lt;br /&gt;&lt;br /&gt;He has a branch containing a .NET backend which uses DLR expression trees, and I've started work on a Java backend.&lt;br /&gt;&lt;br /&gt;My initial target is an interpreter, but I have several pieces which I would hope to use in an eventual compiler.&lt;br /&gt;&lt;br /&gt;The current aim is to support enough of P5 for the Language::P parser to parse itself, and from there to bootstrap parsers in the target backends. For an interpreted backend, such as my current Java prototype, this will mean shipping a packed bytecode parser for the interpreter to fire up. For compiled backends, other avenues are possible.&lt;br /&gt;&lt;br /&gt;Both the .NET and Java parts are currently on private branches, but I hope to make the code available soon, and merge to HEAD.&lt;br /&gt;&lt;br /&gt;If anyone wants to help, please leave a comment / email me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-82205158183464868?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/82205158183464868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=82205158183464868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/82205158183464868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/82205158183464868'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/09/knew-i-couldnt-stay-away.html' title='Knew I Couldn&apos;t Stay Away'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-6265822582547792948</id><published>2009-08-25T15:02:00.000-07:00</published><updated>2009-08-25T15:06:17.782-07:00</updated><title type='text'>Spring 2.5 and Eclipse 3.5 JUnit Problems</title><content type='html'>&lt;p&gt;&lt;span style="font-size:100%;"&gt;Spring 2.5 test classes (eg those that use @RunWith(SpringJUnit4ClassRunner.class) ) implicitly rely on a class which was removed in JUnit 4.5&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;See this Jira: &lt;/span&gt;&lt;a href="http://jira.springframework.org/browse/SPR-5145" target="_blank"&gt;&lt;span style=";font-size:100%;color:blue;"  &gt;&lt;u&gt;http://jira.springframework.org/browse/SPR-5145&lt;/u&gt;&lt;/span&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;Unfortunately, the latest Eclipse (3.5) ships JUnit 4.5 by default, meaning that the newly-production Eclipse version is broken for running tests written for the current production Spring version.&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;No workaround is currently available (and "use Spring 3.0" as a resolution isn't very helpful for production stuff - it's still in beta) - I will investigate with the Eclipse people as to whether anything (eg a downgrade of the JUnit plugin to 4.4 would be feasible) but don't hold out much hope.&lt;/span&gt; &lt;/p&gt;&lt;span style="font-size:100%;"&gt;For now, looks like it's back to running Spring tests from the command-line with a local JUnit 4.4 jar on your classpath.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(Btw, if anyone does have a good workaround, please let me know.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-6265822582547792948?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/6265822582547792948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=6265822582547792948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/6265822582547792948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/6265822582547792948'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/08/spring-25-and-eclipse-35-junit-problems.html' title='Spring 2.5 and Eclipse 3.5 JUnit Problems'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-369680429473380609</id><published>2009-08-16T03:49:00.000-07:00</published><updated>2009-08-16T05:09:03.548-07:00</updated><title type='text'>Thanks For All The Fish</title><content type='html'>One of the major themes of the blog so far has been my attempts to write a version of (perhaps a subset of) Perl 5 that will run on the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JVM&lt;/span&gt;, and/or find out what makes this a difficult exercise. And, to have fun while doing so.&lt;br /&gt;&lt;br /&gt;For reasons which I outline in this post, I think it's time to give up, and I would strongly encourage anyone reading who is tempted to have a go at carrying on where I'm leaving off to think again. The code we wrote is out there, but I would suggest that anyone who's really interested contact me first.&lt;br /&gt;&lt;br /&gt;So, here's the lowdown on the problems we faced.&lt;br /&gt;&lt;br /&gt;There are really two separate sets of issues - first of all there are issues related to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;nullability&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Because Perl does not require brackets around function parameters, and has functions which do not need to specify their prototypes, then this line of code:&lt;br /&gt;&lt;br /&gt;my $a = dunno + 4;&lt;br /&gt;&lt;br /&gt;can be parsed in one of two ways:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;$a gets 4 + the result of calling the function dunno(), which takes no arguments. That is, + is treated as a binary operator&lt;/li&gt;&lt;li&gt;$a gets the result of calling dunno(4), where dunno takes at least one argument. That is, the + is treated as a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;unary&lt;/span&gt; operator on 4.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;This line of argument is expanded upon significantly by Jeffrey &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Kegler&lt;/span&gt; at &lt;a href="http://www.perlmonks.org/?node_id=663393"&gt;http://www.perlmonks.org/?node_id=663393&lt;/a&gt; - where he links it to Halting. I have not fully satisfied myself of the full implications yet, but the initial points amount to a hugely significant parsing problem, with no real good solution.&lt;br /&gt;&lt;br /&gt;The second source of problems is that Perl 5 is old (1994) - and dates from a time when automated language tools were rather more lacking than they are today. When Larry Wall was working on the first versions of p5, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;lex&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;yacc&lt;/span&gt; were pretty much the state of the art in terms of what was practical for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;autogeneration&lt;/span&gt;, and a skilled practitioner could outperform them by modifying the output, or writing from scratch.&lt;br /&gt;&lt;br /&gt;Perl wasn't written with formal parser theory in mind, and has now reached the stage where the implementation is really all we have. It does not fit well into a rigorous model of language, and during its development flexible language features were considered to be more important than linguistic concerns (such as static analysis).&lt;br /&gt;&lt;br /&gt;Simply put, there's no grammar, and attempting to write something which matches the only existing implementation is a major undertaking - no existing automated language tools will help much, it's largely a matter of needing to completely &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;reimplement&lt;/span&gt; the existing C code in Java (or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;bytecode&lt;/span&gt;). This is a huge amount of work, if it's possible at all, and is not going to be fun - and will be likely to be very frustrating for a large chunk of the time spent on it.&lt;br /&gt;&lt;br /&gt;So, here we are. I've had a lot of fun working on this (and particular thanks to James &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Laver&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Shevek&lt;/span&gt;, both of  whom provided insight, help and encouragement - and to the many other people in the Perl, Java and Ruby worlds with whom I had interesting and sometimes amazing conversations) and I'd like to close with a short summary of what I've learned from this project:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Too much backwards-compatibility is a huge millstone&lt;/li&gt;&lt;li&gt;Always ensure that the people you're talking to have the same definitions you do&lt;/li&gt;&lt;li&gt;If you're going to use formal language, you must have proofs available. Declaring a problem to be in a particular class by fiat does not help anyone.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Perl's block / closure / subroutine definitions are too overlapping and unclear. This is a major problem&lt;/li&gt;&lt;li&gt;Indirect object syntax in Perl 5 was a misstep&lt;/li&gt;&lt;/ul&gt;So, that's it for now.&lt;br /&gt;&lt;br /&gt;I'll be moving on to other problems on my stack now, so my next posts will be about broader topics than just language design / implementation  but I'm sure I'll return to language design in due course - after all, I just can't seem to stay away from it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-369680429473380609?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/369680429473380609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=369680429473380609' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/369680429473380609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/369680429473380609'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/08/thanks-for-all-fish.html' title='Thanks For All The Fish'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-1243733449750929263</id><published>2009-08-01T05:02:00.000-07:00</published><updated>2009-08-01T05:16:22.165-07:00</updated><title type='text'>My Interview Checklist</title><content type='html'>Someone asked me recently about what sort of job interview prep I do, and having recently found myself a new job, I thought I'd post a sample here.&lt;br /&gt;&lt;br /&gt;This is the bare bones of what I polished before my most recent job hunt. It's skewed towards Java for some of the actual technology bits, but the CS fundamentals should be language-independent.&lt;br /&gt;&lt;br /&gt;My attitude is that the working practitioner should have a good command of a lot of this (especially the CS topics) at all times, and should only need to briefly revisit each subject to ensure the polish and the details are 100% there.&lt;br /&gt;&lt;br /&gt;The books I used most heavily were "Introduction to Algorithms" (Rivest et al) and Doug Lea's "Concurrent Programming in Java".&lt;br /&gt;&lt;br /&gt;Comments and suggestions for things other people have found useful would be most welcome.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Algorithms&lt;/span&gt;&lt;br /&gt;Details of order notation (eg Omega etc)&lt;br /&gt;Mergesort&lt;br /&gt;Quicksort&lt;br /&gt;String Matching&lt;br /&gt;NP / NP-completeness&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Trees&lt;/span&gt;&lt;br /&gt;Basic Trees and Tree Construction&lt;br /&gt;Red / Black Trees&lt;br /&gt;Hashing / Hashtable&lt;br /&gt;HashMap / TreeMap&lt;br /&gt;B-Trees&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Graphs&lt;/span&gt;&lt;br /&gt;Representations of Graphs in code (object / pointers, matrix, adjacency list)&lt;br /&gt;Graph Traversal (BFS, DFS)&lt;br /&gt;Minimal Spanning Tree&lt;br /&gt;Dijkstra&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Discrete Maths / Probability / "Logic Puzzles"&lt;/span&gt;&lt;br /&gt;Probability Exercises&lt;br /&gt;Decision Trees Exercises&lt;br /&gt;n-choose-k Problems&lt;br /&gt;Permutation Groups, Cycle, Reprns, etc&lt;br /&gt;"Perfectly Logical Beings" puzzles&lt;br /&gt;Decision / Ply problems (eg Monty Hall)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DB / Hibernate&lt;/span&gt;&lt;br /&gt;Normal Form&lt;br /&gt;Having clause&lt;br /&gt;Outer joins&lt;br /&gt;XML Form of Hibernate - Basics&lt;br /&gt;JPA / Hibernate&lt;br /&gt;Indexes and Optimisation&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Java Internals and Details&lt;/span&gt;&lt;br /&gt;Bitwise operators&lt;br /&gt;Collections / Generics nitty-gritty (ie to bytecode level)&lt;br /&gt;OO nitty-gritty (and nasty edge cases)&lt;br /&gt;Annotations nitty-gritty&lt;br /&gt;Arrays nitty-gritty&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;OS/Concurrency details&lt;/span&gt;&lt;br /&gt;Safety, Liveness, Performance, Reusability&lt;br /&gt;Permanent Fail: Deadlock, Missed Signals, Nested Monitor Locks, LiveLock, Starvation, Resource Exhaustion, Distributed Fail&lt;br /&gt;Immutability&lt;br /&gt;Block-structured Locking, Synchronisation, JMM, Fully Synchronized Objects&lt;br /&gt;Other Constructs: Mutex, Latch, Futures, Callable / Command Adapter&lt;br /&gt;Real-world multithreaded application development&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Future Web Tech&lt;/span&gt;&lt;br /&gt;HTML 5&lt;br /&gt;ECMAScript 4 hassles&lt;br /&gt;Flex vs Silverlight (ref issues with LCDS and the Adobe approach)&lt;br /&gt;Asynch Messaging for webapps&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-1243733449750929263?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/1243733449750929263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=1243733449750929263' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/1243733449750929263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/1243733449750929263'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/08/my-interview-checklist.html' title='My Interview Checklist'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-9196775143253538856</id><published>2009-06-11T06:11:00.000-07:00</published><updated>2009-06-11T06:22:11.478-07:00</updated><title type='text'>Last Night's Dynamic Languages Meeting</title><content type='html'>Yesterday evening, a group of us gathered to talk about dynamic languages, at the &lt;a href="http://www.bcs.org/"&gt;British Computer Society&lt;/a&gt; in London. The format of the evening was lightning talks - ie 5 minutes per talk - on any subject connected with dynamic languages.&lt;br /&gt;&lt;br /&gt;There were a lot of great talks given - from using Ruby for systems programming to improving the test coverage of PHP.&lt;br /&gt;&lt;br /&gt;I spoke about the JVM / MLVM as a platform for dynamic languages - my slides are &lt;a href="http://dl.getdropbox.com/u/973503/dyn_langs_bcs_2009-06.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It was really great to meet a lot of people from different parts of the dynamic languages world - especially &lt;a href="http://nicholsr.blogspot.com/"&gt;Rob&lt;/a&gt; and &lt;a href="http://zoomsplatter.blogspot.com/"&gt;Zoe&lt;/a&gt; from IBM's sMash / Zero implementation of PHP.&lt;br /&gt;&lt;br /&gt;Many thanks to the &lt;a href="http://www.bcs.org/"&gt;BCS&lt;/a&gt; for hosting, Leon from London.pm for organising it and Billy for being the liason with the BCS. Hopefully there'll be another similar event soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-9196775143253538856?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/9196775143253538856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=9196775143253538856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/9196775143253538856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/9196775143253538856'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/06/last-nights-dynamic-languages-meeting.html' title='Last Night&apos;s Dynamic Languages Meeting'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-9150614035161688851</id><published>2009-06-10T05:57:00.000-07:00</published><updated>2009-06-10T06:00:40.546-07:00</updated><title type='text'>Status Update</title><content type='html'>It's been a while since last update, largely being driven by my not having many cycles.&lt;br /&gt;&lt;br /&gt;The grammar rewrite for p5vm is coming on well, but is still being debugged. &lt;br /&gt;&lt;br /&gt;If there's anyone reading who is very good with SableCC (or shift-reduce parsers in general) and could spare a few hours helping us debug the new grammar, please &lt;a href="mailto:benjamin.john.evans@gmail.com"&gt;get in touch&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm giving a lightning talk at the British Computer Society tonight about some of the work being done to put dynamic languages on the JVM - slides will appear here tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-9150614035161688851?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/9150614035161688851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=9150614035161688851' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/9150614035161688851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/9150614035161688851'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/06/status-update.html' title='Status Update'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-8643801670128050035</id><published>2009-04-20T01:27:00.000-07:00</published><updated>2009-04-20T05:43:11.588-07:00</updated><title type='text'>State of Play for Perlish PoC</title><content type='html'>First off, the slides from my talk are &lt;a href="http://dl.getdropbox.com/u/973503/lpm-2009-04-talk.pdf"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A tarball of a Mac MLVM (OpenJDK7 with invokedynamic) dating from 2009-04-10 is &lt;a href="http://dl.getdropbox.com/u/973503/openjdk7-sdk-darwin-i386-20090410.tar.gz"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So, where are we with the code?&lt;/b&gt;&lt;br /&gt;The current codebase uses &lt;a href="http://sablecc.org/"&gt;SableCC&lt;/a&gt;, an &lt;a href="http://en.wikipedia.org/wiki/SableCC"&gt;automated parser generator&lt;/a&gt; to transform an EBNF grammar into a parser, lexer, etc.&lt;br /&gt;&lt;br /&gt;I'm not saying that's the most powerful way to do it, or that it will ultimately suffice for a reasonable stab at getting Perl onto the JVM. It was simply what was to hand that I had a modicum of experience with and with which I could up to speed with some necessary chunks of parser theory in order to get off the ground.&lt;br /&gt;&lt;br /&gt;My current grammar has a number of deficiencies, mostly because I cobbled it together by cribbing from some pre-existing grammars which parse Java and PHP.&lt;br /&gt;&lt;br /&gt;Longer term we may need either or both of: a more subtle grammar and/or a parser written in Java (basically, a port of the existing C-based parser to Java, but one which tries to stay out of the later phases of compilation).&lt;br /&gt;&lt;br /&gt;In terms of code generation, I have two branches - one which uses a homegrown ASM codegen, and one which translates the AST to JRuby's AST, and then uses JRuby's codegen (which is also based on ASM).&lt;br /&gt;&lt;br /&gt;Going forward, the semantic differences between Perl and Ruby (notably Everything-Is-An-Object and string handling) probably make AST translation not viable as a long-term strategy. &lt;br /&gt;&lt;br /&gt;However, one thing which did occur is if there are parts of the JRuby codegen libs which could be refactored out into a separate package that we could use for Perl / other langs, that would be helpful. &lt;br /&gt;&lt;br /&gt;In addition, when designing the AST for use with a homegrown ASM-based codegen, a good hard look at the JRuby AST seems like a good plan - the scoping constructs that they use are directly relevant to Perl, for example (although I'm aware that for performance reasons, they may need to optimise how they handle scope constructs).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Places to get started&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;A better grammar. One quick way to improve the current situation is to improve the quality of the EBNF grammar. The current grammar is &lt;a href="http://dl.getdropbox.com/u/973503/purr.sable"&gt;here&lt;/a&gt;. It may not be the long term plan, but making progress with what we've got in advance of a parser port should help to figure out issues and will help momentum&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Design session for how to handle Perlish dispatch in full generality. This is probably the most fundamental design issue which needs to get nailed right now. I have some ideas about how to do it, but they need validating and the input of others. If there's interest, I suggest we get together in the back room of a pub or cafe in London one afternoon and thrash this out.&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Test cases. Having a set of test cases (grouped by complexity - ie low-hanging fruit first) would be very useful. Ultimately, we want to run as much of the test suite as possible, but little acorns are the first step...&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Starting up a wiki or similar to track know issues with syntax and semantic issues (eg the semantic issues around 'new', GC, etc)&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Help from a guru who understands the OP representations. This would be really useful in starting to think about the  ultimate form of the parser.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;If any of these are appealing, especially the dispatch design task, please &lt;a href="mailto:benjamin.john.evans@gmail.com"&gt;get in touch&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-8643801670128050035?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/8643801670128050035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=8643801670128050035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/8643801670128050035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/8643801670128050035'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/04/state-of-play-for-perlish-poc.html' title='State of Play for Perlish PoC'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-6418007844660237411</id><published>2009-04-19T05:21:00.000-07:00</published><updated>2009-04-19T05:45:56.698-07:00</updated><title type='text'>invokedynamic on OS X - Update</title><content type='html'>OK, so the big news is that the Sun guys (John Rose and co) have formally switched to working primarily off the bsd-port tree, rather than the mainline. &lt;br /&gt;&lt;br /&gt;This has the advantage that as a lot of the people on mlvm-dev are on Macs, the patches should just work.&lt;br /&gt;&lt;br /&gt;Based on this, I have also confirmed that at present, something appears to be preventing OpenJDK7 from self-hosting, ie that currently, on OSX at least you have to use Java 6 (ie SoyLatte) for builds.&lt;br /&gt;&lt;br /&gt;Thus, the sequence is that of &lt;a href="http://wikis.sun.com/display/mlvm/Building"&gt;http://wikis.sun.com/display/mlvm/Building&lt;/a&gt;, but making sure that you start of with this line:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;hg fclone http://hg.openjdk.java.net/bsd-port/bsd-port sources&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt; &lt;br /&gt;if you're on a Mac - ie download the bsd-port branch, not mainline as the source base.&lt;br /&gt;&lt;br /&gt;For the actual build step, ie the gnumake build line, I recommend that you adapt John's build script from here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.sun.com/jrose/resource/davinci-build.sh"&gt;http://blogs.sun.com/jrose/resource/davinci-build.sh&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The project should then build cleanly. If you do manage to get it to build cleanly on a Mac using an OpenJDK7 as the bootstrapping JVM, please let me (and the mlvm-dev group) know.&lt;br /&gt;&lt;br /&gt;With all this in place, it should build cleanly. Install the resulting SDK somewhere sensible (I use /usr/local, labelled something like: openjdk7-sdk-darwin-i386-20090410).&lt;br /&gt;&lt;br /&gt;This should now be available to be installed as a primary JVM for your Java IDE (I use Eclipse). You will have to explicitly enable MethodHandle functionality for now. In Eclipse, this is under Preferences &gt; Java &gt; Installed JREs. Highlight the new JRE, and click 'Edit".&lt;br /&gt;&lt;br /&gt;Within the IDE detail, you need to add -XX:+EnableMethodHandles to the Default VM arguments.&lt;br /&gt;&lt;br /&gt;With all of this done, you should be ready to test.&lt;br /&gt;&lt;br /&gt;Remi Forax has posted &lt;a href="http://weblogs.java.net/blog/forax/archive/2009/01/method_handles.html"&gt;here&lt;/a&gt; with a description of a simple test case.&lt;br /&gt;&lt;br /&gt;Download the zip file from &lt;a href="http://weblogs.java.net/blog/forax/archive/method-handle-closure.zip"&gt;here&lt;/a&gt; and unpick it - if you've built a JVM as above, all you'll need is a snippet of the code in the src directory of the zip file. &lt;br /&gt;&lt;br /&gt;Import the package fr.umlv.davinci.test into a suitable test project. It will not compile, because the class 'Magic' does not exist yet - there's no Java-language source representation of a dynamic invocation like: Magic.invoke(mh, element)&lt;br /&gt;&lt;br /&gt;Instead, run the MagicPatcher class. This will generate a binary-only Magic.class file, which you should put on the build path of your project. Refreshing and rebuilding the Eclipse project and the IDE should now be happy, and you should be able to run MethodHandleTest.&lt;br /&gt;&lt;br /&gt;For any Perl people who are here - the point which should leap out is the similarity of the second invdyn call (ie the one involving the Java Sum class) to a Perl closure. It's this ability which is motivating my interest from a Perl perspective in this area (I have other interests from a Java perspective, but that's another story). &lt;br /&gt;&lt;br /&gt;Now I've got all this down on electrons, I'll move to trying to explain where my proof-of-concept baby-Per-lish dynlang is at, how I see possible approaches from here, and try to flesh out the slides from my talk a bit more so that they make a bit more sense without me talking to them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-6418007844660237411?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/6418007844660237411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=6418007844660237411' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/6418007844660237411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/6418007844660237411'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/04/invokedynamic-on-os-x-update.html' title='invokedynamic on OS X - Update'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-2243482569456248902</id><published>2009-04-07T01:24:00.000-07:00</published><updated>2009-04-07T02:34:25.224-07:00</updated><title type='text'>Akamai IP Application Accelerator</title><content type='html'>This post is all about a PoC I did with Akamai's IP Application Accelerator technology.&lt;br /&gt;&lt;br /&gt;The basic idea is that you change your DNS entries for your services (and think services other than just websites here - this is a Layer 3 solution) to be CNAMEs for Akamaised DNS entries (which will of course resolve to IPs which are close to your end users) and the solution then opens a tunnel over Akamai's private network, which does not use standard Internet routing (and also uses a technique where multiple copies of each packet are sent by diverse routes) or the main exchanges, until the packets are reassembled close to the real origin servers. NATting is used heavily (both SNAT and DNAT) to ensure that this is invisible to the application. &lt;br /&gt;&lt;br /&gt;Note that this seamlessness is from an IP perspective - but this does not cover all corner cases completely, and there may be problems with load balancers and integrating fully with your DNS - depending on the details.&lt;br /&gt;&lt;br /&gt;Joel Spolsky has written up his description of it here: &lt;a href="http://www.joelonsoftware.com/items/2009/02/05.html"&gt;http://www.joelonsoftware.com/items/2009/02/05.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Akamai's description of it is here: &lt;a href="http://www.akamai.com/ipa"&gt;http://www.akamai.com/ipa&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So how did we find it? Well, it definitely has a place for some companies. Joel's setup and customer distribution seem to highlight the upside quite well, so I'll leave you to read that on his site. &lt;br /&gt;&lt;br /&gt;Some of the problems we found with it:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;It only really works well if your destination is in a different "logical metro". This one probably isn't too surprising - if you're in the same city or data centre you wouldn't expect there to be any gain by routing onto the Akamai network and back again.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It has to be either on for all customers, or off for all customers - there's no way to have it only switched on for (say) just Middle Eastern customers with sucky connectivity.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It's charged for both by number of concurrent sessions, and by total bandwidth. Make sure you tie Akamai down about exactly how the costs are calculated - some of the salespeople we spoke to were overly evasive about the costs.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Taking these together means that you may well have to know more about the geographic distribution of your users and their bandwidth usage patterns than you currently do.&lt;br /&gt;&lt;br /&gt;What's also worth noting is the use of the phrase "logical metro". Sure, LA customers might see a speedup back to an NY datacentre (Joel's example), but let's suppose you have 3 regional datacentres (NY, LN, TK) covering the Americas, EMEA and Asia respectively.&lt;br /&gt;&lt;br /&gt;It's likely that virtually none of your customers in Europe will see any meaningful speedup (leaving aside outages where you fail those customers over to another region) - and certainly no-one in the LN / Paris / ADM / BRX / Frankfurt area will. The links back to the LN datacentre should just be too damned good for the Akamai solution to be able to shave any time off.&lt;br /&gt;&lt;br /&gt;Also, it's plausible that your concentration of Asian customers could be in HK / TK / Shanghai so similar remarks could apply about routing back to TK from within Asia.&lt;br /&gt;&lt;br /&gt;Akamai didn't give us a straight answer when we asked a question like: "OK, so suppose we only have a very slight, not user-visible speedup. At what stage will the product not route over the Akamai network (and thus not charge us for an acceleration that didn't really do anything)?"&lt;br /&gt;&lt;br /&gt;Given that for customers within a logical metro where you have a datacentre, this is the norm, this is absolutely critical for finding out how much this is really going to cost.&lt;br /&gt;&lt;br /&gt;In the end, we decided not to go for it, simply because when we'd analysed where our customers were in the world, we realised we'd be paying a lot of money to speed up about 2% of our mid-range customers.&lt;br /&gt;&lt;br /&gt;If you are thinking of deploying this tech consider these points as well:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;Consider how your failover model works in the event of complete loss of a datacentre. Do your customers fail across to another region? What is the impact of that? How often do events like that occur? What is the typical duration?&lt;/li&gt;&lt;br /&gt; &lt;li&gt;Load balancing and the details of how your DNS is setup. You may be surprised by how much detail you need to understand of this in order to get this tech to work smoothly. Do not assume that it will necessarily be straightforward for an enterprise deployment&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Is there a point here? I guess just that you have to see the acceleration tech in context of your application architecture, understand where your customers are coming from, test it out and check that it's not going to cost the company an arm and a leg.&lt;br /&gt;&lt;br /&gt;New technologies like this can be a real benefit, but they must always be seen in context of the business, and in this case - in the geographic and spend distribution of your customers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-2243482569456248902?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/2243482569456248902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=2243482569456248902' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/2243482569456248902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/2243482569456248902'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/04/akamai-ip-application-accelerator.html' title='Akamai IP Application Accelerator'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-6109833923187004106</id><published>2009-03-16T05:52:00.000-07:00</published><updated>2009-03-17T05:42:32.253-07:00</updated><title type='text'>Tail Call Optimisation on the JVM</title><content type='html'>It looks like an initial cut of tail-call optimisation (TCO) on the MLVM is in.&lt;br /&gt;&lt;br /&gt;This is important, both for general optimisation and also for implementing languages like Scheme on the JVM. The Scheme case is particularly important, because the Scheme standard requires optimisation of tail recursion (as this is the standard idiom for implementing iteration in Scheme).&lt;br /&gt;&lt;br /&gt;The basic form of a tail call which we would want to optimise, looks like this in C:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;void foo() {&lt;br /&gt; // stuff&lt;br /&gt; // ....&lt;br /&gt;&lt;br /&gt; bar();&lt;br /&gt; return;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The call to bar() is followed immediately by a return, so if we don't optimise, we're growing the stack unnecessarily. The idea of TCO is to rewrite the current stack frame (and so avoid growing the stack) and then issue an unconditional jump to start executing the callee.&lt;br /&gt;&lt;br /&gt;Now, in Java we don't have direct access to modify the current stack frame, so we instead need to have some bytecode which has the semantic meaning of the JVM of "this call must be implemented as a hard tail call". This change requires changes to compiler and interpreter, and is currently implemented like this:&lt;br /&gt;&lt;br /&gt;The bytecode for a optimised tail call would look something like this in the patched HotSpot:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;0xc4   wide&lt;br /&gt;0xb6   invokevirtual&lt;br /&gt;0x00   // high byte of index of method to call&lt;br /&gt;0x03   // low byte of index of method to call&lt;br /&gt;0xb0   areturn&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The &lt;i&gt;wide&lt;/i&gt; bytecode is used to indicate that the opcode immediately following it (the embedded instruction) is operating in a variant mode. Correctly implementing interpreters will verify the correctness of the instruction form of wide, parse the form and then evaluate the instruction.&lt;br /&gt;&lt;br /&gt;That is, the embedded instruction is considered an operand to &lt;i&gt;wide&lt;/i&gt; - not all forms which follow it are legal bytecode as they stand - so in particular, there should never be a jump directly to an embedded instruction. See &lt;a href="http://java.sun.com/docs/books/jvms/second_edition/html/Instructions2.doc15.html"&gt;this link&lt;/a&gt; for more details.&lt;br /&gt;&lt;br /&gt;The form of &lt;i&gt;wide&lt;/i&gt; above is a new, experimental form for supporting TCO (if you look at the current documentation for &lt;i&gt;wide&lt;/i&gt; you'll see that all the embedded opcodes it currently supports are of type load / store / inc, so a form which supported invoke* would have to be a new form). To become standardised, the TCO change needs to pass the JCP, which first requires evidence that this will be of sufficient benefit to justify the changes by vendors to support it, so it might be a while - this is a fairly hot-off-the-presses change.&lt;br /&gt;&lt;br /&gt;Next up, I'll discuss how to get the TCO patches switched on (and confirm that you have) and some test results for some preliminary cases.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-6109833923187004106?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/6109833923187004106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=6109833923187004106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/6109833923187004106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/6109833923187004106'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/03/tail-call-optimisation-on-jvm.html' title='Tail Call Optimisation on the JVM'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-2776285910780868</id><published>2009-03-16T04:14:00.000-07:00</published><updated>2009-03-16T04:27:39.388-07:00</updated><title type='text'>Codegen Update</title><content type='html'>Since my last post (gosh, a couple of months ago), I've actually been investigating the codegen's for both Kawa and JRuby, and I've come to the conclusion that while Kawa has some very nice features, it was too hard to get it to play nicely with the AST that I'm outputting from sablecc.&lt;br /&gt;&lt;br /&gt;The documentation being sparse was also a problem, as was the fact that the classes that Kawa produces are a long way from being usable as regular Java types - and still display a large amount of their Scheme heritage.&lt;br /&gt;&lt;br /&gt;I've found that JRuby does a lot better - in some ways it is a lot closer to the AST that I'm producing. In addition, the code is quite easy to follow, and the low-level generation is all handled with ASM.&lt;br /&gt;&lt;br /&gt;I have some basic examples of programmatically generating a JRuby AST and then compiling it - there's no nice API method to do it, but by cribbing from the compiler source it's relatively easy.&lt;br /&gt;&lt;br /&gt;Adapting this method for purr, in the Main class of the purr compiler, we now have some code like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Lexer lexer = new Lexer (new PushbackReader(new BufferedReader(new FileReader(filename)), 1024));&lt;br /&gt;&lt;br /&gt;Parser parser = new Parser(lexer);&lt;br /&gt;Start ast = parser.parse();&lt;br /&gt;&lt;br /&gt;SemanticAnalyzer sem = new SemanticAnalyzer();&lt;br /&gt;ast.apply(sem);&lt;br /&gt;&lt;br /&gt;NodeMapper nmap = new NodeMapper(sem);&lt;br /&gt;ast.apply(nmap);&lt;br /&gt;nmap.stitchTree(ast);&lt;br /&gt;             &lt;br /&gt;Node jHead = nmap.getNodeMap(ast);&lt;br /&gt;compile(jHead);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;where the compile method is as simple as:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    private static void compile(Node ast) {&lt;br /&gt;       &lt;br /&gt;          try {&lt;br /&gt;                String classname = JavaNameMangler.mangledFilenameForStartupClasspath(filename);&lt;br /&gt;&lt;br /&gt;                ASTInspector inspector = new ASTInspector();&lt;br /&gt;                inspector.inspect(ast);&lt;br /&gt;&lt;br /&gt;                StandardASMCompiler asmCompiler = new StandardASMCompiler(classname, filename);&lt;br /&gt;                ASTCompiler compiler = new ASTCompiler();&lt;br /&gt;                compiler.compileRoot(ast, asmCompiler, inspector, false, false);&lt;br /&gt;       &lt;br /&gt;                File file = new File(filename);&lt;br /&gt;                asmCompiler.writeClass(file);&lt;br /&gt;            }&lt;br /&gt;            catch (Exception x) {&lt;br /&gt;                System.out.println(x.toString());&lt;br /&gt;            }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, still quite a way to go (especially with figuring out all the details of NodeMapper, which is the class which transforms from purr's AST to JRuby's) - but some good progress.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-2776285910780868?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/2776285910780868/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=2776285910780868' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/2776285910780868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/2776285910780868'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/03/codegen-update.html' title='Codegen Update'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-5049181118164312467</id><published>2009-01-05T13:29:00.000-08:00</published><updated>2009-01-05T14:04:24.481-08:00</updated><title type='text'>Which Codegen and IR to use?</title><content type='html'>I know I haven't really explained much about why I want to build out a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JVM&lt;/span&gt; with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;InvokeDynamic&lt;/span&gt;, so I thought I'd try and put some of my thoughts down.&lt;br /&gt;&lt;br /&gt;Broadly, I'd like to be able to write a compiler for a dynamic language, consisting of a modest subset of Perl 5's syntax. This is largely just to teach myself more about the internals of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;JVM&lt;/span&gt;, and about language design and implementation in general, but it might come in handy for other people as well - who knows.&lt;br /&gt;&lt;br /&gt;I have been getting to grips with the &lt;a href="http://sablecc.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;sablecc&lt;/span&gt;&lt;/a&gt; parser generator toolkit, and already have a grammar for a working subset of the language (although there's quite a long way to go yet).&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Sablecc&lt;/span&gt; has some features which rather surprised me at first - its Node is an abstract class rather than an interface and the classes which represent terminals in the abstract syntax are all declared final.&lt;br /&gt;&lt;br /&gt;This makes it rather hard to use Decorator to annotate the abstract parse tree (as for a Decorator-type approach one would subclass the abstract parse tree terminals).&lt;br /&gt;&lt;br /&gt;After a bit of head scratching, I'm now generating a set of Analyzer classes, each of which are obtained by visiting the tree, and storing additional context information in the Analyzer classes themselves.&lt;br /&gt;&lt;br /&gt;Each Analyzer instances can now be though of as being a self-consistent set of annotations about the parse tree - all the annotations relevant to a particular type of analysis can be represented as one Analyzer, but there may be multiple Analyzers corresponding to different, disjoint classes of semantic information.&lt;br /&gt;&lt;br /&gt;With this now reasonably well understood, I'm turning my attention to the IR and code generation stages. I'm weighing up 2 possible tools and approaches.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://asm.objectweb.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;ASM&lt;/span&gt;&lt;/a&gt;. This has a lot of advantages - it is reasonably well documented, once you're over the initial hump, and seems to have good low-level control as well as consistent use of the Visitor pattern to help with conceptual consistency.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The &lt;a href="http://www.gnu.org/software/kawa/api/index.html"&gt;gnu.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;bytecode&lt;/span&gt;&lt;/a&gt; and gnu.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;expr&lt;/span&gt; packages from &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Kawa&lt;/span&gt;. These are part of &lt;a href="http://www.gnu.org/software/kawa/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Kawa&lt;/span&gt;&lt;/a&gt; (a Scheme-orientated package for producing &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;bytecode&lt;/span&gt;).&lt;/li&gt;&lt;/ol&gt;At the moment I'm still trying to decide which I'm going to opt for. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Kawa&lt;/span&gt; has the advantage that several other languages are already using it, so it may have better performance for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;repl&lt;/span&gt; and similar approaches (which will be necessary if I want to support &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;eval&lt;/span&gt; STRING as a case). It also seems to have a relatively consistent set of classes which could be targeted as an IR (which so far, I don't really see ASM having).&lt;br /&gt;&lt;br /&gt;However, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Kawa&lt;/span&gt; doesn't (so far) to be very well documented - I've found myself having to dig through the source code several times already just to find out whether method names need to be specified as package names or internal names, etc. The conceptual framework doesn't seem to be quite as consistent somehow. I'm also slightly scared by the use of bare integers in some places in the gnu.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;bytecode&lt;/span&gt; package - I'd prefer a symbolic constant for each &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;opcode&lt;/span&gt;, which I can pull in with a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;wildcarded&lt;/span&gt; static import.&lt;br /&gt;&lt;br /&gt;Still, I'll post more as I investigate further.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-5049181118164312467?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/5049181118164312467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=5049181118164312467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/5049181118164312467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/5049181118164312467'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2009/01/which-codegen-and-ir-to-use.html' title='Which Codegen and IR to use?'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-828347983883170814</id><published>2008-12-18T07:27:00.000-08:00</published><updated>2008-12-18T07:52:03.960-08:00</updated><title type='text'>Some Updates to the Build Process</title><content type='html'>Thanks to the bsd-port-dev mailing list for removing some cryft from the build process.&lt;br /&gt;&lt;br /&gt;One important thing is that the latest repo seems to now be broken with SoyLatte. Bootstrapping with an earlier OpenJDK 7 (eg the ones on Landon Fuller's page: &lt;a href="http://landonf.bikemonkey.org/code/java/OpenJDK_7_Binaries.20080820.html"&gt;http://landonf.bikemonkey.org/code/java/OpenJDK_7_Binaries.20080820.html&lt;/a&gt;) now seems to be essential.&lt;br /&gt;&lt;br /&gt;The current repo is now working on Mac OS X again, providing that you apply the patches provided by Michael Franz (see: &lt;a href="http://mail.openjdk.java.net/pipermail/bsd-port-dev/2008-December/000189.html"&gt;http://mail.openjdk.java.net/pipermail/bsd-port-dev/2008-December/000189.html&lt;/a&gt; for the post, the attachment with the patch is: &lt;a href="http://mail.openjdk.java.net/pipermail/bsd-port-dev/attachments/20081213/9b7550d6/attachment-0001.obj"&gt;http://mail.openjdk.java.net/pipermail/bsd-port-dev/attachments/20081213/9b7550d6/attachment-0001.obj )&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It still fails over the "Queens.java" issue mentioned by Karen Kinnear (&lt;a href="http://mail.openjdk.java.net/pipermail/bsd-port-dev/2008-September/000044.html"&gt;http://mail.openjdk.java.net/pipermail/bsd-port-dev/2008-September/000044.html&lt;/a&gt;) - to work around this, find sources/hotspot/make/bsd/makefiles/buildtree.make and edit it, so that the test_gamma target is simply:&lt;br /&gt;&lt;br /&gt;test_gamma:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(ie, so that test_gamma is now an empty target). The build will still fail, complaining that:&lt;br /&gt;&lt;br /&gt;build/bsd-i586/hotspot/outputdir/bsd_i486_compiler2/product/test_gamma does not exist.&lt;br /&gt;&lt;br /&gt;Create this as an empty file, with executable permission and rerun the make command. It will pick up where it left off and then fail because:&lt;br /&gt;&lt;br /&gt;build/bsd-i586/hotspot/outputdir/bsd_i486_compiler1/product/test_gamma does not exist.&lt;br /&gt;&lt;br /&gt;These are, presumably the server and client JVMs respectively. Repeat the fix, creating an empty test_gamma in the compiler1 tree, and all should be well.&lt;br /&gt;&lt;br /&gt;This JVM should be saved somewhere (/usr/local seems like a good place) and can be used for testing. I've rerun the build using a JDK generated like this, and it seems happy.&lt;br /&gt;&lt;br /&gt;(Btw, patches for the above build process, especially that ungainly test_gamma hack, would be very welcome).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-828347983883170814?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/828347983883170814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=828347983883170814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/828347983883170814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/828347983883170814'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2008/12/some-updates-to-build-process.html' title='Some Updates to the Build Process'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-3313506268403641061</id><published>2008-12-16T06:56:00.000-08:00</published><updated>2008-12-16T07:13:46.814-08:00</updated><title type='text'>Building OpenJDK 7 On Mac OS X 10.5</title><content type='html'>i) OK, first off OpenJDK 7 is still a moving target, and will require use of the source control systems it is stored in - this is Mercurial (rather than svn or CVS) - usually abbreviated hg (as per the symbol for the element mercury).&lt;br /&gt;&lt;br /&gt;ii) The Mac user is also at a disadvantage as we're dependent on the BSD port, which may lag behind the Linux and Windows builds.&lt;br /&gt;&lt;br /&gt;iii) All of this requires Leopard. Tiger's compilers and build tools are simply a world of pain (and may actually be completely impossible). Just give it up and upgrade - you also need XCode 3.1.&lt;br /&gt;&lt;br /&gt;Check you do actually have XCode installed - just checking for the presence of gcc from a command line does not do this - it is possible to have ended up with gcc installed but not  XCode. If XCode is not installed, the eventual build step will fail with a cryptic error (possibly about fonts or FreeType) which does not clearly indicate that XCode is missing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Getting Started&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Get Mercurial&lt;/span&gt;&lt;br /&gt;Mercurial is a relatively simple, modern version control and patching system. It's written in Python and will install to /usr/local/bin (plus a few well-behaved extensions in the standard python place).&lt;br /&gt;&lt;br /&gt;See: &lt;a href="http://openjdk.java.net/guide/repositories.html#installConfig"&gt;http://openjdk.java.net/guide/repositories.html#installConfig&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You want version 0.9.4 or 0.9.5 - not any of the post-1.0 versions&lt;br /&gt;&lt;br /&gt;The instructions on getting Forest are missing one very important step. They don't tell you how to actually get the extension itself.&lt;br /&gt;&lt;br /&gt;There seem to be two ways:&lt;br /&gt;&lt;br /&gt;1) Go to the public repository (&lt;a href="http://hg.akoha.org/hgforest/"&gt;http://hg.akoha.org/hgforest/&lt;/a&gt;), and click on the top link, then the 'files' link on the changeset description page, then the 'raw' link at the top and save it with the other extensions (/Library/Python/2.5/site-packages/hgext/ on a Mac)&lt;br /&gt;&lt;br /&gt;2) Some way to use hg itself to pull the latest version from the repository but I figured I'd done enough yak shaving by this point and didn't figure out how to do this. Instructions on how to do this part very welcome.&lt;br /&gt;&lt;br /&gt;Once you have Forest set up you should be able to continue with the instructions from installConfig, but please ensure that you also add the line:&lt;br /&gt;&lt;br /&gt;hgext.mq=&lt;br /&gt;&lt;br /&gt;to the end of your extensions section. This tells Mercurial to activate the Mercurial Queues extension, which is used for patching. It's always referred to as MQ in the Mercurial docs, which makes it difficult to find any useful information about it, as that acronym is hopelessly overloaded, and is swamped by hits from IBM's messaging middleware product.&lt;br /&gt;&lt;br /&gt;Note: If you fail to activate this line in .hgrc, then the main patching step will inexplicably fail with a cryptic error message later.&lt;br /&gt;&lt;br /&gt;With all of this done, you should have a working hg install. Test it out with a couple of:&lt;br /&gt;&lt;br /&gt;hg version&lt;br /&gt;hg showconfig&lt;br /&gt;hg help&lt;br /&gt;&lt;br /&gt;and if all seems well, change to your work directory and check out the main Mac source:&lt;br /&gt;&lt;br /&gt;hg fclone http://hg.openjdk.java.net/bsd-port/bsd-port&lt;br /&gt;&lt;br /&gt;This could take a while, depending on your connection speed.&lt;br /&gt;&lt;br /&gt;Next, we want to build this version to ensure that our build process is nice and clean before patching for invokedynamic.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Building a Vanilla OpenJDK7&lt;/span&gt;&lt;br /&gt;First we need to download SoyLatte, which is an older Java 6 port for Mac. This is to allow us to bootstrap the compilation of OpenJDK 7.&lt;br /&gt;&lt;br /&gt;See:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://landonf.bikemonkey.org/code/java/SoyLatte_Meets_OpenJDK.20080819.html"&gt;http://landonf.bikemonkey.org/code/java/SoyLatte_Meets_OpenJDK.20080819.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and&lt;br /&gt;&lt;br /&gt;&lt;a href="http://landonf.bikemonkey.org/static/soylatte/"&gt;http://landonf.bikemonkey.org/static/soylatte/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;to download the actual binary JDK - we want the 32-bit version for now.&lt;br /&gt;&lt;br /&gt;If you've followed the notes from Landon Fuller above, you should now be ready to build. This step is:&lt;br /&gt;&lt;br /&gt;make ALT_JDK_IMPORT_PATH=/usr/local/soylatte16-i386-1.0.3 ALT_BOOTDIR=/usr/local/soylatte16-i386-1.0.3 ALT_BINARY_PLUGS_PATH=$HOME/jdk-7-icedtea-plugs ALT_FREETYPE_HEADERS_PATH=/usr/X11R6/include ALT_FREETYPE_LIB_PATH=/usr/X11R6/lib ALT_CUPS_HEADERS_PATH=/usr/include ANT_HOME=/usr/share/ant NO_DOCS=true HOTSPOT_BUILD_JOBS=1&lt;br /&gt;&lt;br /&gt;If all goes well, you should now have a build of OpenJDK 7, which you should save to /usr/local - and save the source tree too just in case.&lt;br /&gt;&lt;br /&gt;The current state of the repo is that this build is failing, and is being actively worked on, so I'll stop here, and will carry on next time with details of how to apply the invokedynamic patches to build what we need for mlvm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-3313506268403641061?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/3313506268403641061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=3313506268403641061' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/3313506268403641061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/3313506268403641061'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2008/12/building-openjdk-7-on-mac-os-x-105.html' title='Building OpenJDK 7 On Mac OS X 10.5'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-8422457765083913860</id><published>2008-12-07T11:08:00.000-08:00</published><updated>2008-12-07T13:30:22.106-08:00</updated><title type='text'>Dynamic Languages on Managed Runtimes</title><content type='html'>Dynamic Languages have been around for a long time (Perl 5 was released in 1994).&lt;br /&gt;&lt;br /&gt;They have traditionally run on top of loosely-defined C runtimes, which are custom to each language. Sometimes they have a type of virtual machine used for execution - but not one which corresponds closely with the Java or .NET VMs.&lt;br /&gt;&lt;br /&gt;For many reasons, not least of which taking advantage of the more enterprise features of the VMs, and interoperating with modules written in other languages, there are many groups and developers interested in running dynamic languages on the general purpose VMs.&lt;br /&gt;&lt;br /&gt;The problems involved in doing this are manifold - the most valuable languages (ie those with most developer marketshare) were not designed with the Java or .NET VM in mind - and the VMs were designed with type and dispatch systems which are not at first glance suitable for dynamic languages.&lt;br /&gt;&lt;br /&gt;In the .NET case, the Compilers group at MSFT are producing extra functionality for dynamic dispatch for C# 4.0, and with IronPython and IronRuby are producing a new component called the Dynamic Languages Runtime. John Lam's blog at http://www.iunknown.com/ is a good place to start for the .NET side of things.&lt;br /&gt;&lt;br /&gt;For Java, the work is centred around JSR 292 (see http://jcp.org/aboutJava/communityprocess/edr/jsr292/) - and while initially attention was focused around a new bytecode invokedynamic (to add to invokevirtual and friends) there is some debate as to whether a new opcode is the right approach - or whether the same end could be achieved by using invokeinterface as the opcode, and a special class (in the java.dyn package, perhaps) which was treated in a special way by the runtime.&lt;br /&gt;&lt;br /&gt;This second approach (classes with special treatment by the runtime) is apparently already used by the implementations of other VM features in HotSpot, so may prove to be the approach used. People still talk about invokedynamic as a name for the featureset, even without the new bytecode.&lt;br /&gt;&lt;br /&gt;Next time I'll post my build instructions for trying to get OpenJDK 7 with invokedynamic on Mac. This will only work on Leopard, as Tiger's build infrastructure is not quite up to it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-8422457765083913860?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/8422457765083913860/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=8422457765083913860' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/8422457765083913860'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/8422457765083913860'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2008/12/dynamic-languages-on-managed-runtimes.html' title='Dynamic Languages on Managed Runtimes'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3304484534461096867.post-4648744269503608795</id><published>2008-12-07T11:05:00.000-08:00</published><updated>2008-12-07T11:07:59.764-08:00</updated><title type='text'>Intro</title><content type='html'>Hello,&lt;br /&gt;&lt;br /&gt;This is my technical blog.&lt;br /&gt;&lt;br /&gt;In it, I'll talk about my work with dynamic languages, the JVM and whatever else comes to mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3304484534461096867-4648744269503608795?l=boxcatjunction.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://boxcatjunction.blogspot.com/feeds/4648744269503608795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3304484534461096867&amp;postID=4648744269503608795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/4648744269503608795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3304484534461096867/posts/default/4648744269503608795'/><link rel='alternate' type='text/html' href='http://boxcatjunction.blogspot.com/2008/12/intro.html' title='Intro'/><author><name>Ben</name><uri>http://www.blogger.com/profile/08179596002060438043</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
