dynamic c#

28
by @AntyaDev DYNAMIC C#

Upload: antya-dev

Post on 07-Dec-2014

1.360 views

Category:

Technology


2 download

DESCRIPTION

Dynamic C#

TRANSCRIPT

Page 1: Dynamic C#

by @AntyaDev

DYNAMIC C#

Page 2: Dynamic C#

STATIC VS DYNAMIC

Page 3: Dynamic C#

The many faces of “dynamic”

Generate code at runtime

Changing types at runtime

No typesat all

Simplified deployment

Page 4: Dynamic C#

• Trend on non-schematized data

• Remember WSDL, SOAP, XSD?

• How about REST, JSON?

• The next browser war

• JavaScript on the web

• Optimized scripting engines

• Towards metaprogramming?

• Ruby community

• Code as data

IT’S A DYNAMIC WORLD

Page 5: Dynamic C#

DynamicLanguages

Simple and succinct

Implicitly typed

Meta-programming

No compilation

StaticLanguages

Robust

Performant

Intelligent tools

Better scaling

STATIC VS DYNAMIC

Page 6: Dynamic C#

DLR Hero• Jim Hugunin

Co-designer ASpectJ

Jython implementation• Python on the JVM

IronRuby implementation• Python on the .NET

Page 7: Dynamic C#

DLR Hero• John Lam

RubyCLRbridge between the Ruby interpreter and the CLR

IronRubyRuby on the .NET

Page 8: Dynamic C#

DLR Hero

Martin Maly

Common Language Runtime

Dynamic Language Runtime

Page 9: Dynamic C#

C# compiler teamChris Burrow, Sam Ng

Page 10: Dynamic C#

Action Python Ruby C# VB.NET

GetMember x.Foo x.Foo x.Foo x.Foo

SetMember x.Foo = y x.Foo = y x.Foo = y x.Foo = y

DeleteMember del d.Foo x.send :remove_instance_variable :@foo No syntax No syntax

UnaryOperation -x -x -x -x

BinaryOperation x + y x + y x + y x + y

Convert No syntax No syntax (Foo)x CType(x,Foo)

InvokeMember x.Foo(a,b) x.Foo(a,b) x.Foo(a,b) x.Foo(a,b)

Invoke x(a,b) x.call(a,b) x(a,b) x(a,b)

CreateInstance X(a,b) X.new(a,b) No syntax No syntax

GetIndex x[a,b] x[a,b] x[a,b] x(a,b)

SetIndex x[a,b] = y x[a,b] = y x[a,b] = y X(a,b) = y

DeleteIndex del x[a,b] No syntax No syntax No syntax

Common actions

Page 11: Dynamic C#

IDynamicMetaObjectProvider

public interface IDynamicMetaObjectProvider{ DynamicMetaObject GetMetaObject(Expression parameter);}

Page 12: Dynamic C#

DynamicMetaObject

public class DynamicMetaObject{ public BindingRestrictions Restrictions { get; }

public Expression Expression { get; }

public bool HasValue { get; }

public object Value { get; }

public Type RuntimeType { get; }

public virtual DynamicMetaObject BindGetMember(GetMemberBinder b); public virtual DynamicMetaObject BindSetMember(SetMemberBinder b, DynamicMetaObject value); public virtual DynamicMetaObject BindDeleteMember(DeleteMemberBinder b);

// Other bind operations…}

Page 13: Dynamic C#

System.Dynamic.DynamicObjectpublic class DynamicObject : IDynamicMetaObjectProvider

{

public virtual bool TryBinaryOperation(BinaryOperationBinder binder, object

arg, out object result);

public virtual bool TryConvert(ConvertBinder binder, out object result);

public virtual bool TryCreateInstance(CreateInstanceBinder binder, object[]

args, out object result);

public virtual bool TryGetIndex(GetIndexBinder binder, object[] indexes, out

object result);

public virtual bool TryGetMember(GetMemberBinder binder, out object result);

public virtual bool TryInvoke(InvokeBinder binder, object[] args, out object

result);

public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args,

out object result);

public virtual bool TrySetIndex(SetIndexBinder binder, object[] indexes,

object value);

public virtual bool TrySetMember(SetMemberBinder binder, object value);

}

Page 14: Dynamic C#

PythonBinder

RubyBinder

COMBinder

JavaScriptBinder

ObjectBinder

DYNAMIC LANGUAGE RUNTIME (DLR)

Dynamic Language RuntimeDLR Trees Dynamic Dispatch Call Site Caching

IronPython IronRuby C# VB.NET Others…

Page 15: Dynamic C#

CALL SITES

• Old Idea: Polymorphic Inline Cache• Implemented with delegates and generics• No changes in CLR runtime engine (today)

• Major Addition: Multiple languages on CLR• Interop for sharing objects across languages• Customization to work for each language• Customization for library writers

• System.Runtime.CompilerServices

Page 16: Dynamic C#

CLR

ExeCompile Run

Bind call

Expression Tree

Dynamic CallDelegate

DLR

Cache

COM Binder

IronPython Binder

C# Runtime Binder

HOW DYNAMIC WORKS

Page 17: Dynamic C#

CALLSITE<T>

static CallSite<Func<CallSite, object, int, bool>> _site = …;

if (_site.Target(_site, x, 0)) { … }

if (x == 0) { … }

static bool _0(Site site, object x, int y) { return site.Update(site, x, y); //tailcall}

As strongly typed as possible

Cache is learning

Page 18: Dynamic C#

CALLSITE<T>

static CallSite<Func<CallSite, object, int, bool>> _site = …;

if (_site.Target(_site, x, 0)) { … }

if (x == 0) { … }

static bool _2(Site site, object x, int y) { if (x is int) { return (int)x == y; } else if (x is BigInteger) { return BigInteger.op_Equality((BigInteger)x, y); } else { return site.Update(site, x, y); //tailcall }}

Page 19: Dynamic C#

DynamicMetaObject

public class DynamicMetaObject{ public BindingRestrictions Restrictions { get; }

public Expression Expression { get; }

public bool HasValue { get; }

public object Value { get; }

public Type RuntimeType { get; }

public virtual DynamicMetaObject BindGetMember(GetMemberBinder b); public virtual DynamicMetaObject BindSetMember(SetMemberBinder b, DynamicMetaObject value); public virtual DynamicMetaObject BindDeleteMember(DeleteMemberBinder b);

// Other bind operations…}

Page 20: Dynamic C#

Show me Dynamic C#

Page 21: Dynamic C#

Ruby’s Markup Builder is an example of what can be achieved with

method missing

b = Builder::XmlMarkup.newhtml = b.html { b.head { b.title "XML Builder Test" } b.body { b.h1 "Title of Page“ b.p "Sample paragraph text“ b.p "Sample paragraph text“ }}

<head> <title>XML Builder Test</title> - <body> <h1>Title of Page</h1> <p>Sample paragraph text</p> <p>Sample paragraph text</p> </body></head>

Page 22: Dynamic C#

class User < ActiveRecord::Base; end

users = User.find_all_by_state("TX")

user = User.find_or_create_by_email("[email protected]")

Page 23: Dynamic C#

Send Message

Receive Message

Page 24: Dynamic C#

by @AntyaDev

Page 25: Dynamic C#

OakFrictionless development for ASP.NET MVC single page web apps. Prototypical and dynamic capabilities brought to C#.

Page 26: Dynamic C#

STATIC TYPING WHERE POSSIBLE, DYNAMIC TYPING WHEN NEEDED

Page 27: Dynamic C#

LINKS

• KingAOP: https://github.com/AntyaDev/KingAOP• Simple.Data: https://github.com/markrendle/Simple.Data• Massive: https://github.com/robconery/massive• CarealBox: https://github.com/JonCanning/CerealBox• Oak: http://amirrajan.github.io/Oak/

Page 28: Dynamic C#

https://twitter.com/AntyaDev

https://github.com/AntyaDev

http://antyadev.blogspot.com/

THANK YOU!