More C#/.NET Generics Research Project History – The MSR white paper from mid-1999

A bit more C#/.NET generics research project history.

Attached is the “Ext-VOS” white paper from back in 1999. We passed this around to many Project-7 members at the time.

Way back in the dark, dark days of object-oriented fundamentalism (i.e. the 1990s), for the big, typed languages like Java there were no function values, no delegates, no closures. There were no generic types, no tuple types, no Task<T>, no IEnumerable<T>, no IQueryable<T>, no List<T>, no Dictionary<Key,Value>. There was no LINQ, and couldn’t be, because it ultimately required generics. In truth, there was not much of anything. It was classes, classes, classes, and nothing else but classes. Oh, and an awful lot of inheritance. There were some proposals for improving things for Java – Pizza and GJ being the most important.

In late 1998, a group of us (Andy Gordon, Nick Benton, Simon Peyton Jones, Cedric Fournet, Luca Cardelli, myself) arrived at Microsoft Research in Cambridge. Somewhat keen to make contact with the company who had hired us, we bit off the task of proposing to incorporate functional language features into what was then called the “COM+ Runtime” and later became the .NET Common Language Runtime.

In our various ways we spent the first part of 1999 working with the product teams to understand what “COM+” was, what “delegates” were, what “value types” were (then being implemented in the COM+ Runtime), what “Project 7” was, what “Project 42” was, what “Lightning” was and how it differed to “COM+” and how that differed to “NGWS” and so on.  Concretely, this was partly done through what became the “Abstract IL” project, where I and some interns (Colin, you remember) did an idealized implementation of the COM+ Runtime, which allowed us to see the architectural details of the virtual machine design and runtime verification rules cleanly.  Simon Peyton Jones also made a trip to Redmond where he proposed adding the “tail” instruction to CIL, a proposal that was accepted. Andy Gordon proposed merging the “newobj” and “initobj” instructions, again accepted.

Coming straight out of a PhD where I’d done formal models of subsets of Java-like languages, I took the decision to propose ways in which the type system (then called “VOS” – Virtual Object System” – this is Microsoft after all) of the COM+ Runtime (and of the proposed “Cool” language) could be improved. At the suggestion of Jim Miller, who had been appointed to a PM role with responsibilities for academic liason and specifications, we wrote these suggestions up as a white paper.

This led to many internal discussions at MSR Cambridge, some of which are described briefly here.

The eventual form that the white paper took is attached (there are earlier versions, they are also quite amusing!). Nick, Simon and Cedric gave lots of feedback, as did people in Redmond, and we all put our names on it to show their was unity from the Cambridge group.  It was the first time I’d ever written something like this, the schedules are perhaps the oddest part. Also, in truth, the things we really cared about were generics and function types – the other suggested features were sort of there to fill things out and to show we had considered the options and to keep pushing that the product teams needed to innovate in languages. 

Eventually, again at the suggestion of Jim Miller, we went ahead and hired Andrew Kennedy full-time,  and he did a prototype implementation directly in the COM+ Runtime codebase, and I did the implementation in what was then the C# compiler. Both were transferred to the product teams.  That part of the story is taken up here.





Comments (2)

  1. says:

    This is very cool Don. Nice work 10 years ago and now.

  2. Jeroen Frijters says:

    Thanks for posting the white paper Don. Very interesting to read. I remember wanting Compound Types in Java back in the day. It's probably good they and structural delegates didn't make it in, because they both can be easily simulated with generics.

    I'm actually glad that nominal delegates survived for another reason, the current model allows a delegate to implement interfaces and add methods, this makes it easy to bridge the delegate and interface based worlds (aka .NET and Java).