the dynamic language is not enough

126
The Dynamic Language is not Enough Lukas Renggli

Upload: lukas-renggli

Post on 20-May-2015

1.335 views

Category:

Technology


1 download

DESCRIPTION

Most today's software is highly static, even if it is written in a dynamic language like Smalltalk. Developers are not encouraged to extend the frameworks they are using; and end-users are unable to change the features of their software without initiating a new development effort. In contrast, extensible software is designed for change; and customizable software can be adapted to new needs without requiring an in-depth knowledge of the underlying implementation domain. In this presentation I will investigate on how to write truly dynamic software and I will distill common patterns of software customizability. As running examples I present tools that I worked on during my path of discovering Smalltalk. One of these examples is Magritte, a dynamic meta-model that gives end-users the possibility to customize their applications without the need of an additional development effort. Another example is Helvetia, an infrastructure enabling on-the-fly customization of the programming language and development environment.

TRANSCRIPT

Page 1: The Dynamic Language is not Enough

The Dynamic Languageis not Enough

Lukas Renggli

Page 2: The Dynamic Language is not Enough
Page 3: The Dynamic Language is not Enough
Page 4: The Dynamic Language is not Enough
Page 5: The Dynamic Language is not Enough

Static Software

Page 6: The Dynamic Language is not Enough

Static Software

Constant

Page 7: The Dynamic Language is not Enough

Static Software

Constant

Fixed

Page 8: The Dynamic Language is not Enough

Static Software

Constant

FixedFinal

Page 9: The Dynamic Language is not Enough

Dynamic Software

Page 10: The Dynamic Language is not Enough

Dynamic Software

Adaptive

Page 11: The Dynamic Language is not Enough

Dynamic Software

Adaptive

Extensible

Page 12: The Dynamic Language is not Enough

Dynamic Software

Adaptive

Customizable

Extensible

Page 13: The Dynamic Language is not Enough

StaticLanguage

DynamicLanguage

Static

Softw

are

Dyn

amic

Softw

are

Page 14: The Dynamic Language is not Enough

:-(

StaticLanguage

DynamicLanguage

Static

Softw

are

Dyn

amic

Softw

are

Page 15: The Dynamic Language is not Enough

:-(

:-|

StaticLanguage

DynamicLanguage

Static

Softw

are

Dyn

amic

Softw

are

Page 16: The Dynamic Language is not Enough

:-|

StaticLanguage

Dyn

amic

Softw

are

Page 17: The Dynamic Language is not Enough

:-|

StaticLanguage

Dyn

amic

Softw

are

Page 18: The Dynamic Language is not Enough

:-(

:-|

StaticLanguage

DynamicLanguage

Static

Softw

are

Dyn

amic

Softw

are

Page 19: The Dynamic Language is not Enough

:-(

:-|

:-S

StaticLanguage

DynamicLanguage

Static

Softw

are

Dyn

amic

Softw

are

Page 20: The Dynamic Language is not Enough

:-S

DynamicLanguage

Static

Softw

are

no support

easier

can always get

away with reflection

faster

don’t know how to do it

too complex

out-of-the-box

Page 21: The Dynamic Language is not Enough

:-(

:-|

:-S

:-)

StaticLanguage

DynamicLanguage

Static

Softw

are

Dyn

amic

Softw

are

Page 22: The Dynamic Language is not Enough

:-)

DynamicLanguage

Dyn

amic

Softw

are

Page 23: The Dynamic Language is not Enough

1

Subclassing

2

Extending

3

Meta-Modeling

4

Meta Meta-Modeling

5

Composing

6

Transforming

Page 24: The Dynamic Language is not Enough

Subclassing

2

Extending

3

Meta-Modeling

4

Meta Meta-Modeling

5

Composing

6

Transforming

Page 25: The Dynamic Language is not Enough

Subclassing Extending

3

Meta-Modeling

4

Meta Meta-Modeling

5

Composing

6

Transforming

Page 26: The Dynamic Language is not Enough

Subclassing Extending

Meta-Modeling

4

Meta Meta-Modeling

5

Composing

6

Transforming

Page 27: The Dynamic Language is not Enough

Subclassing Extending

Meta-Modeling Meta Meta-Modeling

5

Composing

6

Transforming

Page 28: The Dynamic Language is not Enough

Subclassing Extending

Meta-Modeling Meta Meta-Modeling

Composing

6

Transforming

Page 29: The Dynamic Language is not Enough

Subclassing Extending

Meta-Modeling Meta Meta-Modeling

Composing TransformingHe vetia

Page 30: The Dynamic Language is not Enough

1Subclassing

Page 31: The Dynamic Language is not Enough

The framework for developing sophisticated web applications in Smalltalk

Page 32: The Dynamic Language is not Enough

Add new functionality by adding a new subclass.

Page 33: The Dynamic Language is not Enough

WAComponent

renderContentOn:

Page 34: The Dynamic Language is not Enough

WAComponent

renderContentOn:

MyComponent

renderContentOn:

Page 35: The Dynamic Language is not Enough

Template Method

Page 36: The Dynamic Language is not Enough

ExtensibleCustomizable

Adaptable

Page 37: The Dynamic Language is not Enough
Page 38: The Dynamic Language is not Enough

WAToolPlugin

labelexecute

Page 39: The Dynamic Language is not Enough

WANewSession... WATiming...

WAToolPlugin

labelexecute

...

Page 40: The Dynamic Language is not Enough

WAToolPlugin

labelexecuteallPlugins

self  allSubclassescollect:  [  :each  |  each  new  ]

Page 41: The Dynamic Language is not Enough
Page 42: The Dynamic Language is not Enough

WAHaloPlugin

labelexecuteallPlugins

self  allSubclassescollect:  [  :each  |  each  new  ]

Page 43: The Dynamic Language is not Enough

Discussion

‣ Template Method Pattern

‣ Simple

‣ Lightweight

‣ Portable

‣ No extra infrastructure

Page 44: The Dynamic Language is not Enough

Other Users

‣ Monticello Repository Types

‣ OmniBrowser Commands

‣ Code Critics Rules

‣ TextLint Rules (later today)

‣ Pier Commands, Views, Structures

‣ Magritte Description Types

Page 45: The Dynamic Language is not Enough

2Extending

Page 46: The Dynamic Language is not Enough

Add new functionality by adding a new method.

Page 47: The Dynamic Language is not Enough
Page 48: The Dynamic Language is not Enough

menuCommandOn:  aBuilder   <worldMenu>

  (aBuilder  item:  'Shout  Workspace')     parent:  #Tools;     action:  [  self  open  ]

Page 49: The Dynamic Language is not Enough

menuCommandOn:  aBuilder   <worldMenu>

  (aBuilder  item:  'Shout  Workspace')     parent:  #Tools;     action:  [  self  open  ]

PragmaCollector  allSystemPragmas      select:  [  :each  |  each  keyword  =  #worldMenu  ]

}

Page 50: The Dynamic Language is not Enough

Discussion

‣ Simple

‣ Lightweight

‣ Long utility methods

‣ Encourages class-extensions

Page 51: The Dynamic Language is not Enough

Alternatives to Pragmas

‣ Naming convention for selector names

‣ Naming convention for protocol names

‣ All methods of a specific class

Page 52: The Dynamic Language is not Enough

Other Users

‣ Pier Value Links

‣ Pharo Compiler Primitives, System Settings

‣ OmniBrowser Commands, Obsolete Commands, and Browser Meta-Model

Page 53: The Dynamic Language is not Enough

3Meta-Modeling

Page 54: The Dynamic Language is not Enough

Create a first-class description of the domain.

Page 55: The Dynamic Language is not Enough
Page 56: The Dynamic Language is not Enough
Page 57: The Dynamic Language is not Enough
Page 58: The Dynamic Language is not Enough
Page 59: The Dynamic Language is not Enough

Environment

Page 60: The Dynamic Language is not Enough

Environment Category

Page 61: The Dynamic Language is not Enough

Environment Category

Page 62: The Dynamic Language is not Enough

Environment

Class

Comment

Metaclass

Category

Page 63: The Dynamic Language is not Enough

Environment

Class

Comment

MetaclassProtocol

CategoryAllProtocol

Page 64: The Dynamic Language is not Enough

Environment

Class

Comment

MetaclassProtocol

MethodCategoryAllProtocol

Page 65: The Dynamic Language is not Enough
Page 66: The Dynamic Language is not Enough

OB-Web

Page 67: The Dynamic Language is not Enough

OB-Mars

Page 68: The Dynamic Language is not Enough

Discussion

‣ UI independent

‣ Domain-specific reflection

‣ Extensible using subclassing/extending

‣ Can cause meta-confusion

‣ Can be limiting or slow

Page 69: The Dynamic Language is not Enough

Other Users

‣ GLORP Relational Object Mapping

‣ Glamour Browser Model

‣ Monticello Code Model

‣ Announcement Event Model

‣ Magritte Meta-Model

Page 70: The Dynamic Language is not Enough

4Meta Meta-Modeling

Page 71: The Dynamic Language is not Enough

Create a first-class description of the description of the

domain.

Page 72: The Dynamic Language is not Enough

Address Object

street = 'Schützenmattstrasse'plz = 3012place = 'Bern'canton = 'Bern'

:Address

Page 73: The Dynamic Language is not Enough

Address Description

street = 'Schützenmattstrasse'plz = 3012place = 'Bern'canton = 'Bern'

:Address

label = 'Street'

:StringDescription

label = 'PLZ'required = truerange = 1000..9999

:NumberDescription

label = 'Place'required = true

:StringDescription

label = 'Canton'required = truesorted = trueoptions = #( 'Bern' 'Zurich' ... )

:SingleOptionDescription

label = 'Address'

:Containerdescription

Page 74: The Dynamic Language is not Enough

result  :=  anAddress  asMorph   addButtons;   addWindow;   callInWorld

Morphic Interpreter

Page 75: The Dynamic Language is not Enough

result  :=  self  call:  (anAddress  asComponent   addValidatedForm;   yourself).

Seaside Interpreter

*

**

Page 76: The Dynamic Language is not Enough

Other “Interpreters”‣ Viewer building

‣ Editor building

‣ Report building

‣ Documentation

‣ Data validation

‣ Query processing

‣ Object filtering

‣ Object serialization

‣ Object copying

‣ Object indexing

‣ Object initialization

‣ Object extension

‣ Object adaption

‣ Object customization

and much more ...

Page 77: The Dynamic Language is not Enough

Domain Model

Metamodel

Meta-

Metamodel

<described-by>

<described-by>

Developer

End User

Page 78: The Dynamic Language is not Enough

Domain Model

Metamodel

Meta-

Metamodel

Magritte

Developer

<described-by>

<described-by>

Magritte

End User

Page 79: The Dynamic Language is not Enough

Component

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) MagritteComponent

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) Magritte

Component

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) Magritte

Component

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) Magritte

Page 80: The Dynamic Language is not Enough

Component

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) MagritteComponent

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) Magritte

Component

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) Magritte

Component

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) Magritte

Page 81: The Dynamic Language is not Enough

Component

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) MagritteComponent

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) Magritte

Component

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) Magritte

Component

TypeComponent

Property

TypeProperty

1 *

1

*

*1

*

1

Type Object

Type Object

(a) Type-Square

Object

Description

Typ

e

Ob

ject

*

*

descrip

tio

n

attributes

1 *

(b) Magritte

Page 82: The Dynamic Language is not Enough

Adaptive Object Model

Run-time

Page 83: The Dynamic Language is not Enough

End userscustomizability

Page 84: The Dynamic Language is not Enough

Demo

Page 85: The Dynamic Language is not Enough

Discussion

‣ Very powerful and flexible

‣ Runtime adaptive code

‣ End-user programmable code

‣ Can cause meta meta-confusion

‣ Can be slow

Page 86: The Dynamic Language is not Enough

Other Users

‣ Gjallar Issue Tracker

‣ DabbleDB Online Database

Page 87: The Dynamic Language is not Enough

5Composing

Page 88: The Dynamic Language is not Enough

Build something new by composing existing

parts.

Page 89: The Dynamic Language is not Enough
Page 90: The Dynamic Language is not Enough

scanIdentifier self step. ((currentCharacter between: $A and: $Z) or: [ currentCharacter between: $a and: $z ]) ifTrue: [ [ self recordMatch: #IDENTIFIER. self step. (currentCharacter between: $0 and: $9)or: [ (currentCharacter between: $A and: $Z) or: [ currentCharacter between: $a and: $z ] ] ] whileTrue. ^ self reportLastMatch ]

Page 91: The Dynamic Language is not Enough

#(#[1 0 9 0 25 0 13 0 34 0 17 0 40 0 21 0 41] #[1 0 9 0 25 0 13 0 34 0 93 0 76 0 157 0 112] #[1 2 38 0 21 2 38 0 25 2 38 0 26 0 13 0 34] #[0 1 154 0 16 0 21 0 25 0 26 0 34 0 40 0 41] #[0 1 210 0 76 0 81] #[0 1 214 0 76 0 81] #[1 0 173 0 76 0 177 0 81] #[0 1 134 0 16 0 21 0 25 0 26 0 34 0 40 0 41] #[1 1 46 0 21 1 46 0 25 1 46 0 26 1 69] #[1 1 54 0 21 1 54 0 25 1 54 0 26 1 54 0 34] #[0 2 102 0 21 0 25 0 26 0 34 0 40 0 41 0 76]

#[0 2 50 0 21 0 25 0 26 0 76 0 79] #[1 1 13 0 76 2 85 0 124 1 21 0 125] #[1 2 89 0 17 2 30 0 21 2 30 0 82] #[1 2 93 0 21 2 97 0 82] )

Page 92: The Dynamic Language is not Enough

ScannerlessParser Combinator

Page 93: The Dynamic Language is not Enough

a..z a..z

0..9

ID  ::=  letter  {  letter  |  digit  }  ;

Page 94: The Dynamic Language is not Enough

letter

letter digit

sequence

choice

many

ID  ::=  letter  {  letter  |  digit  }  ;

Page 95: The Dynamic Language is not Enough

letter

letter digit

sequence

choice

many

id  :=  #letter  ,  (#letter  /  #digit)  star

Page 96: The Dynamic Language is not Enough

letter

letter digit

sequence

choice

many

id  :=  #letter  asParser  ,  (#letter  asParser  /  #digit  asParser)  star

Page 97: The Dynamic Language is not Enough

Smalltalk

+ SQL Language

+ Regular Expression

= Customized Smalltalk

Page 98: The Dynamic Language is not Enough

Discussion

‣ The LEGO model

‣ New parts can be easily created

‣ Smalltalk provides elegant composition with binary operators

Page 99: The Dynamic Language is not Enough

Other Users

‣ Brazil Widgets in Newspeak

‣ Seaside and Pier Widgets

‣ Refactoring Engine Change Objects

Page 100: The Dynamic Language is not Enough

6Transforming

He vetia

Page 101: The Dynamic Language is not Enough

Build something new by transforming existing

parts.

Page 102: The Dynamic Language is not Enough

LanguageScope

LanguageConcern

LanguageChange

LanguageBox

Page 103: The Dynamic Language is not Enough

Language Scope

Active?

Page 104: The Dynamic Language is not Enough

Language Scope

Page 105: The Dynamic Language is not Enough

‣ System

‣ Packages

‣ Classes

‣ Methods

Language Scope

Page 106: The Dynamic Language is not Enough

Language Concern

Semantics

Page 107: The Dynamic Language is not Enough

Language Concern

Transformation

Page 108: The Dynamic Language is not Enough

Language Concern

Context Menus

Navigation Search

Code Expansion

Code Completion

Error Correction

Custom Inspector

Refactorings

Code Folding

Highlighting

Code Execution

Page 109: The Dynamic Language is not Enough

Language Change

Syntax

Page 110: The Dynamic Language is not Enough

Language Change

Smalltalk

Page 111: The Dynamic Language is not Enough

Language Change

Smalltalk

+ SQL Language

Page 112: The Dynamic Language is not Enough

Language Change

Smalltalk

+ SQL Language

+ Regular Expression

Page 113: The Dynamic Language is not Enough

Smalltalk

+ SQL Language

+ Regular Expression

= Custom Host Language

Language Change

Page 114: The Dynamic Language is not Enough
Page 115: The Dynamic Language is not Enough

Demo

Page 116: The Dynamic Language is not Enough

Discussion

‣ Very generic and powerful

‣ Usually requires extra infrastructure (for example Helvetia)

‣ Might be difficult to learn and apply

Page 117: The Dynamic Language is not Enough

Other Users

‣ Refactoring Engine Rewrite Rules

‣ Compiler Hacks (ok, not really)

‣ XML, XSD Transformations

‣ SOUL, IntensiVE

Page 118: The Dynamic Language is not Enough

?Anything Else?

Page 119: The Dynamic Language is not Enough

‣ Subclassing

‣ Extending

‣ Meta-Modeling

‣ Meta Meta-Modeling

‣ Composing

‣ Transforming}How to make “tools”

and “languages” extensible?

Page 120: The Dynamic Language is not Enough

How to make the “object model” extensible?

Page 121: The Dynamic Language is not Enough

AlbedoJorge Ressia

Page 122: The Dynamic Language is not Enough

Object

Class

Page 123: The Dynamic Language is not Enough

Object

StructuralMeta-object

Class

Page 124: The Dynamic Language is not Enough

Object

StructuralMeta-object

Class

BehavioralMeta-object

Page 125: The Dynamic Language is not Enough

:-(

:-|

:-S

:-)

StaticLanguage

DynamicLanguage

Static

Softw

are

Dyn

amic

Softw

are

Page 126: The Dynamic Language is not Enough

:-)lukas-renggli.ch

@renggli

Dynamic Software