Judith Bishop Research

2001 2002 2003 2004 2005 2006 2007 2008 2009 2010

C# 1.0 C# 2.0 C# 3.0 C#4.0 Spec#1.0 Spec# Code CodeCont .5 1.0.6 Contracts racts 1.4 Java 1.5 F# Java 6 F# in VS F# C Ruby on LINQ Python Rails 3.0

Firefox 2 Firefox 3 IE6 Safari 1 IE7 Safari 4 IE8 Safari 5

Windows Windows DLR beta Windows DLR 1.0 XP Vista 7 .NET Rotor 1.0 .NET 2 Rotor 2.0 .NET 3.5 .Net 4.0 Mac OS Mac OS Mac OSX Mac OS X X Intel Leopard XSnow.

VS 2003 VS 2005 VS2008 VS2010 Eclipse Eclipse Eclipse 1.0 3.0 3.6

Advantages Uses • Rapid feedback loop (REPL) • Scripting applications • Simultaneous top-down and • Building web sites bottom-up development • Test harnesses • Rapid refactoring and code • Server farm maintenance changing • One-off utilities or data • Easy glue code crunching

C# 1.0 2001 C# 2.0 2005 C# 3.0 2007 C# 4.0 2009 structs generics implicit typing dynamic lookup properties anonymous anonymous types named and foreach loops methods object and array optional autoboxing iterators initializers arguments delegates and partial types extension COM interop events nullable types methods, variance indexers generic lambda operator delegates expressions overloading query expressions enumerated types (LINQ) with IO in, out and ref parameters formatted output API Serializable std generic Reflection delegates

The (DLR) is a runtime environment that adds a set of services for dynamic languages – and dynamic featues of statically typed languages – to the (CLR)

• Dynamic Lookup • Calls, accesses and invocations bypass static type checking and get resolved at runtime • Named, default and optional parameters • COM interop • Variance • Extends type checking in generic types • E.g. IEnumerable is also IEnumerable

• If d is a standard .NET object, and the operation will be dispatched using reflection on its type and a C# “runtime binder”

dynamic d1 = GetDynamicObject(); dynamic d2 = new Bar(); string s; d1.M(s, d2, 3, null);

• Compiled as: Perform an instance method call of M with second arg. dynamic • DLR has an fast caching mechanism to keep the reflection efficient • d’s class can implement the interface IDynamicObject and completely change the meaning of dynamic operations • The DLR is invisible unless you implement IDynamicObject • Used with IronPython and IronRuby (and C# and F#)

IList list1 = new List(); IList list2 = list1;

Disallowed so that e.g. an int cannot be put into list2, and then extracted from list1.

• But when objects cannot be inserted, then assignment should be allowed

IEnumerable list2 = list1;

Variance allows assignment to work when it is safe. class Animal { } • Support for method groups with class Cat : Animal { } matching method signatures class Program { delegate T Func1(); with delegate types. delegate void Action1(T a); • Covariance static void Main(string[] args) { • Preserves assignment compatibility // Covariance Func1 cat = • Contravariance () => new Cat(); • Reverse it Func1 animal = cat; // Contravariance Action1 act1 = (ani) => { Console.WriteLine(ani); }; Action1 cat1 = act1; } } • COM is not going away! static void Main() { • Everything is passed by ref Word.Application app = new Word.Application();

// GOOD static void Main() { app.Documents.Add(Type.Missing, Word.Application app = Type.Missing, Type.Missing); new Word.Application(); object m = Type.Missing; // BEST app.Documents.Add(ref m, ref m, app.Documents.Add(); ref m); } }

• Dynamic • JavaScript is the only cross- • dynamic typing browser language • object based • Non-language factors matter • run-time evaluation too • Functional • first-class functions • inner functions and closures • Prototype-based • prototypes instead of classes for inheritance • functions as object constructors • functions as methods • Yermolovich, Wimmer and Franz 2009