The End.

This is a summary

The soft deadline has passed and the hard deadline is not far away. Soon, what is likely to be my last GSoC will be over. And it was great! These three years I've had the summer job of my dreams. I worked on projects I was passionate about, using tools I liked and with people I liked.

I've learned a lot about many aspects of software development. Before GSoC, I had never worked with any version control system. I had never made a software release. I had never written any reasonably large program. I had never had to work with existing code, and make compromises for backwards compatibility or stability. I had never contributed patches, or otherwise coordinated with others.

I made many friends.

Missing a beat

For this project, I ended up having less time than I'd thought I would initially. This was partly my fault, and partly the fault of "the elements", like GSoC midway being late, UK uni ending too late and me not having any other source of income. The end result was that for the past few weeks, I had another job for 2 days/week, with the rest left for GSoC.

The good

I chose to use an existing Python parser (the 'ast' module). That was a great time-saver. I managed to write a very basic compiler in a day.

I chose Winxed for the bits I couldn't write in Python. Winxed is by far the best low-level Parrot language. Even outside the context of Parrot, it's a decent language.

I chose to focus on the object system, partly because it's what Pynie's missing, partly because it was more challenging and interesting. I wrote a guest object system in Winxed based on Parrot's Object/Class that behaves just like CPython's. There are a few differences (mainly that my object system is more flexible), but they wouldn't affect Python's semantics. It is also, obviously, very incomplete. For example, while I have full support for classes and metaclasses, you can't substract numbers (you can only add them).

I never had the delusion that I would be able to implement a significant part of Python. All throughout the project, I worked on a prototype, a subset, an incomplete implementation. Having realistic expectations helped.

Parrot works beautifully on ARM(el). I've been developing on an Efika MX Netbook for the past few weeks, and I've yet to encounter any ARM-specific issues.

The bad

I only used a ready-made parser. I should have forked an entire compiler even if not quite pure-python. PyPy's compiler would've been a good choice, since RPython is a strict subset of Python.

I should have targeted Python 2. There would've been more compilers to choose from (in particular PyPy's). Switching to Python 3 afterwards wouldn't have been hard, and I wouldn't bother implementing old-style classes anyway.

Perhaps I should have used 6model. From what I've seen of it so far, it'd be much more suitable. It's much, much more extensible than Object/Class. The reason I didn't use it was the lack of documentation, so perhaps I should have pestered Jonathan more about that.

Perhaps I didn't focus enough on the compiler. I still don't think it's particularly important to write it now (since I consider the object system much more important), but it would most certainly have been a more impressive demo than  a bunch of unit tests.

Parrot is a little slow. I know I'm the lasts person to worry about speed, but developing on an 800Mhz ARM machine makes one wish for more. A JIT would be welcome, but almost any optimisations done before that are entirely irrelevant.

The ugly

Some of this I've said before. Parrot's Object/Class is pretty bad, and the duality with PMCs isn't helpful. IMCC is terrible. It's the main reason I gave up on adding features to the compiler. I still don't know how I could fully control the namespacing mechanism without explicit namespaces/hashes, or the exception system without putting everything in one huge try.

This I've also said before: I didn't work on the project as much as I would've wanted. In particular, the project timeline was backloaded: the second half implied much more work than the first half. I hadn't realised this until quite late.

Parrot has no native, pervasive bool type. This is very annoying and can only promote ugly hacks, like what Winxed and Rosella.Test do, or like I did in my get_integer override. This particular issue also introduced at least one ugly, hard to find, bug in my code.

In general, I'm disillusioned with Parrot. I though it'd be better, but in my opinion the deprecation policy has really held it back.

I didn't blog enough. I really didn't, and it was entirely my fault. Sorry.

The future

I hope to keep working on puffin in my spare time. It was fun and interesting and challenging. I would like to get a better compiler and complete the object system. I think it would pay to switch to 6model, especially if NQP becomes optional at some point.

I would like to work on Parrot in the future. M0 and 6model seem of good design. I'd like to try writing an M0 interpreter in Python with PyPy, so I could get a JIT for free.

Thanks

Thank you whiteknight, NotFound, allison, benabik, jnthn, dukeleto, cotto and anyone else I'm forgetting. You were a real help and I'm happy to have met you.

Several puffins on a cliff

Did you really think I'd forget to post the quota of puffin pics? Here's a lovely bunch of puffins!