dynamic: don’t be afraid - goto conferencegotocon.com/.../hadihariri_dynamicdontbeafraid.pdf ·...

64
DYNAMIC: DON’T BE AFRAID Hadi Hariri JetBrains

Upload: others

Post on 24-Aug-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DYNAMIC: DON’T BE AFRAID

Hadi Hariri

JetBrains

Page 2: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

The What, the Why, the How

Agenda

Page 3: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

A tale as old as time…

A Tale as Old as Time...

Page 4: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Static vs Dynamic

Static vs Dynamic

Page 5: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Blog

Posts

Discussion

Threads

Blog Posts

and more blog

posts

Page 6: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

• Types can be implicit or explicit (var)

• Compiler Safety

• Early Binding

In the Static World

Page 7: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

• Types defined at runtime

• No Compiler (Usually)

• Late Binding

• Interpreted (Not always)

In a Dynamic World

Page 8: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

What Dynamic Developers think of Static Developers…

Page 9: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

I need my compiler!

Page 10: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

What Static Developers think of Dynamic Developers…

Page 11: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

http://nimblepros.com/products/software-craftsmanship-2012-calendar.aspx

Page 12: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

"You cannot build serious business applications in

dynamic languages"

Page 13: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond
Page 14: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond
Page 15: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond
Page 16: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

They both have Good and Bad Things

Page 17: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DLR & C# 4

Page 18: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

• dynamic keyword

• Classes/Binders and interfaces to work with

dynamic types

C# added...

Page 19: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Hosting API Debugging API

Interop Binders Dynamic

Objects

Call-Site

Caching Expressions

Expression Compiler

/ Interpreter IL Code Generator

DLR added…

Page 20: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DLR

IronRuby IronPython C# VB.NET

Bindings

.NET Ruby Python Office

The Big Picture

Page 21: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

http://www.flickr.com/photos/bitjungle

Page 22: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

GET YOUR STINKING

DYNAMIC TYPES OFF

OF MY STATIC

LANGUAGE

Page 23: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

IS THERE A NEED?

Page 24: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Readability

Page 25: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond
Page 26: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Interoperability

Page 27: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Interoperability with other languages

• IronPython

• Interpreted

• Can be compiled

• IronRuby

• Interpreted

• Your own language

Page 28: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond
Page 29: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond
Page 30: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond
Page 31: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DEMO

TALKING RUBY

Page 32: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Interoperability

• Talking to COM

• Need a type-library beforehand

• Use Method Invocation

Page 33: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DEMO

TALKING COM

Page 34: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

The Case of the DTO

Page 35: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Creating Dynamic Objects in C#

Page 36: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Options

• ExpandObject

• DynamicObject

• IDynamicMetaObjectProvider

Page 37: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Expando Object

• Built-in Dynamic Object. Works out of the box

• Benefits over Dictionary

• More Fluent

• Support for Methods

• Supports Hierarchies

• Implements INotifyPropertyChanged

• Limitations • Index Access

Page 38: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DEMO

ON THE FLY: BASICS OF DYNAMIC

Page 39: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DEMO

EXPANDOS

Page 40: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DynamicObject

• Moving Beyond an Expando

• Built-in class which implements IDynamicMetaObjectProvider

• Allows easy creation of Dynamic types

Page 41: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DEMO

MVC – V IEWBAG, DYNAMICOBJECTSIMPLE

Page 42: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

IDynamicMetaObjectProvider

• Meta Object that performs binding

• Allows decoupling from class

• Uses DLR Expressions

• Returns DynamicObject

Page 43: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DEMO

DYNAMICPROVIDER

Page 44: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Undetermined API

Page 45: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Aspects of MetaProgramming

• Adding / Removing Methods

• Creating Instance Methods

• Creating Static / Class Methods

• Query Classes

Page 46: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond
Page 47: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DEMO

DYNAMICMETHODMISSING – S IMPLE DATA

Page 48: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Consuming the ever-changing

Page 49: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DEMO

CONSUMINGJSON

Page 50: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DSL's and Fluent API's

Page 51: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

A QUICK LOOK UNDER THE HOOD…

Page 52: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

The backbone of dynamic support

DLR

Language Semantics

via DLR EXpression

Define Late Binding

Logic

Page 53: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DLR Expression

• Superset of Linq.Expression

• Common to multiple Languages

• DLR Expression is to DLR Languages what IL is to CLR languages

C# VB.NET

IL

CLR

IronPython IronRuby

DLR Expression

DLR Runtime

Page 54: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Late Binding

• We only know the types at runtime

• We have to figure out how to call those methods at runtime

• It’s not embedded in the “IL”

• It’s potentially slower

Page 55: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Late Binding

• Using Binders and Call Sites

• Using Dynamic Expression (uses former internally)

Page 56: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Late Binding

Page 57: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

DEMO

DYNAMICCONVERSION

Page 58: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

SUMMING UP…

Page 59: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

The Disadvantages

• There is no compile type-checking*

• Potentially slower (even with caching)

• There is no Intellisense*

* Partially incorrect – It’s about the tooling

Page 60: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Reasons to not not use dynamic

Page 61: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Reasons to not not use dynamic

• There’s no compiler

• There’s no intellisense (Emphasis on Unit Tests)

• You shouldn’t mix dynamic and static languages

Page 62: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Reasons to use dynamic

Page 63: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Reasons to use Dynamic

• Interoperability • COM

• Consuming Dynamic Languages • Ruby

• JavaScript

• Fluent API’s and DSL

• Consuming the *unknown*

• Dynamic Structures

• Avoiding unnecessary “class explosion”

Page 64: DYNAMIC: DON’T BE AFRAID - GOTO Conferencegotocon.com/.../HadiHariri_DynamicDontBeAfraid.pdf · DEMO ON THE FLY: BASICS OF DYNAMIC . DEMO EXPANDOS . DynamicObject •Moving Beyond

Thank you