126
The Dynamic Language is not Enough Lukas Renggli

The Dynamic Language is not Enough

Embed Size (px)

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.

Citation preview

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