bootstrapping meta-languages of language workbenches

109
Bootstrapping Meta-Languages of Language Workbenches Gabriël Konat Joint work with: Sebastian Erdweg, Eelco Visser

Upload: gabriel-konat

Post on 12-Apr-2017

146 views

Category:

Science


1 download

TRANSCRIPT

Page 1: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping Meta-Languages of

Language WorkbenchesGabriël Konat

Joint work with: Sebastian Erdweg, Eelco Visser

Page 2: Bootstrapping Meta-Languages of Language Workbenches

2

Tools and environment to develop languages

Page 3: Bootstrapping Meta-Languages of Language Workbenches

3

Spoofax Language Workbench

Page 4: Bootstrapping Meta-Languages of Language Workbenches

4

Domain-specific meta-languages

Syntax Name binding Type system Dynamic semantics

Page 5: Bootstrapping Meta-Languages of Language Workbenches

5

Bootstrap the meta-languages

Syntax Name binding Type system Dynamic semantics

Page 6: Bootstrapping Meta-Languages of Language Workbenches

6

Syntax Name binding Type system Dynamic semanticsHigher-level implementation

Page 7: Bootstrapping Meta-Languages of Language Workbenches

7

Syntax Name binding Type system Dynamic semanticsHigher-level implementation

Large-scale test case

Page 8: Bootstrapping Meta-Languages of Language Workbenches

8

Syntax Name binding Type system Dynamic semanticsHigher-level implementation

Large-scale test case

Coverage

Page 9: Bootstrapping Meta-Languages of Language Workbenches

9

Syntax Name binding Type system Dynamic semanticsHigher-level implementation

Large-scale test case

Coverage

Improvement dissemination

Page 10: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping Meta-Languages

Page 11: Bootstrapping Meta-Languages of Language Workbenches

11

SDFStratego

Page 12: Bootstrapping Meta-Languages of Language Workbenches

12

SDFStratego

context-free syntaxDef .Ent = <ent <Id> {<Decl*>}>Decl.Prop = <<Id>:<Type>>Type.Str = <String>

Page 13: Bootstrapping Meta-Languages of Language Workbenches

13

SDFStratego

context-free syntaxDef .Ent = <ent <Id> {<Decl*>}>Decl.Prop = <<Id>:<Type>>Type.Str = <String>

PT-gen PT

Page 14: Bootstrapping Meta-Languages of Language Workbenches

14

SDFStratego

context-free syntaxDef .Ent = <ent <Id> {<Decl*>}>Decl.Prop = <<Id>:<Type>>Type.Str = <String>

PT-gen PT

Parser ASTParseEnt("person",[ Prop("addr", Str())])

ent person { addr:String}

Page 15: Bootstrapping Meta-Languages of Language Workbenches

15

SDFStratego

context-free syntaxDef .Ent = <ent <Id> {<Decl*>}>Decl.Prop = <<Id>:<Type>>Type.Str = <String>

PT-gen PT

Parser ASTParseEnt("person",[ Prop("addr", Str())])

ent person { addr:String}

SigSig-gen

Types

signaturesEnt : Id * List(Decl) -> DefProp : Id * Type -> DeclStr : Type

Page 16: Bootstrapping Meta-Languages of Language Workbenches

16

SDFStratego

context-free syntaxDef .Ent = <ent <Id> {<Decl*>}>Decl.Prop = <<Id>:<Type>>Type.Str = <String>

PT-gen PT

Parser ASTParseEnt("person",[ Prop("addr", Str())])

ent person { addr:String}

SigSig-gen

Types

signaturesEnt : Id * List(Decl) -> DefProp : Id * Type -> DeclStr : Type

PP-gen

PP

Page 17: Bootstrapping Meta-Languages of Language Workbenches

17

SDFStratego

context-free syntaxDef .Ent = <ent <Id> {<Decl*>}>Decl.Prop = <<Id>:<Type>>Type.Str = <String>

PT-gen PT

Parser ASTParseEnt("person",[ Prop("addr", Str())])

ent person { addr:String}

SigSig-gen

Types

signaturesEnt : Id * List(Decl) -> DefProp : Id * Type -> DeclStr : Type

PP-gen

PPtransformation rulestojava: Ent(e, ds) -> Class(…)tojava: Prop(p, t) -> Field(…)tojava: Str() -> Type(…)

Page 18: Bootstrapping Meta-Languages of Language Workbenches

18

SDFStratego

context-free syntaxDef .Ent = <ent <Id> {<Decl*>}>Decl.Prop = <<Id>:<Type>>Type.Str = <String>

PT-gen PT

Parser ASTParseEnt("person",[ Prop("addr", Str())])

ent person { addr:String}

SigSig-gen

Types

signaturesEnt : Id * List(Decl) -> DefProp : Id * Type -> DeclStr : Type

PP-gen

PPtransformation rulestojava: Ent(e, ds) -> Class(…)tojava: Prop(p, t) -> Field(…)tojava: Str() -> Type(…)

ASTTransform

Page 19: Bootstrapping Meta-Languages of Language Workbenches

19

SDF

Sig-gen

PP-gen

Stratego

Page 20: Bootstrapping Meta-Languages of Language Workbenches

20

SDF Stratego (STR)Sig-gen

PP-gen

Page 21: Bootstrapping Meta-Languages of Language Workbenches

21

SDF STRSig-gen

PP-gen

Page 22: Bootstrapping Meta-Languages of Language Workbenches

22

SDF STRSig-gen

PP-gen

Page 23: Bootstrapping Meta-Languages of Language Workbenches

23

SDF STRSig-gen

PP-gen

Page 24: Bootstrapping Meta-Languages of Language Workbenches

24

SDF STRSig-gen

PP-gen

Page 25: Bootstrapping Meta-Languages of Language Workbenches

25

SDF STRSig-gen

PP-gen

Page 26: Bootstrapping Meta-Languages of Language Workbenches

26

SDF STR

Sig

SigSig-gen

PP-gen

Page 27: Bootstrapping Meta-Languages of Language Workbenches

27

SDF STR

Sig

Sig

PP

PP

Sig-gen

PP-gen

Page 28: Bootstrapping Meta-Languages of Language Workbenches

28

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Sig-gen : STR

PP-gen : STR

Page 29: Bootstrapping Meta-Languages of Language Workbenches

29

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Sig-gen : STR

PP-gen : STR

Sig : STR

Sig : STR

PP : STR

PP : STR

Page 30: Bootstrapping Meta-Languages of Language Workbenches

30

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Sig-gen : STR

PP-gen : STR

Sig : STR

Sig : STR

PP : STR

PP : STR

Page 31: Bootstrapping Meta-Languages of Language Workbenches

31

SDF STR

Multiple meta-languages

Page 32: Bootstrapping Meta-Languages of Language Workbenches

32

SDF STR

Self and mutual dependency

Page 33: Bootstrapping Meta-Languages of Language Workbenches

33

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Sig-gen : STR

PP-gen : STR

Sig : STR

Sig : STR

PP : STR

PP : STR

Generate files of each other

Page 34: Bootstrapping Meta-Languages of Language Workbenches

34

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Use files of each other

Sig-gen : STR

PP-gen : STR

Sig : STR

Sig : STR

PP : STR

PP : STR

Page 35: Bootstrapping Meta-Languages of Language Workbenches

35

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Complex to bootstrap

Sig-gen : STR

PP-gen : STR

Sig : STR

Sig : STR

PP : STR

PP : STR

Page 36: Bootstrapping Meta-Languages of Language Workbenches

36

SDF STR

Sig

Sig

PP

PP

Sig-gen

PP-gen

Sig-gen : STR

PP-gen : STRPP-gen* : STR

Sig : STR

Sig : STR

PP : STR

PP : STR

Page 37: Bootstrapping Meta-Languages of Language Workbenches

37

SDF STR

Sig

Sig

PP

PP

Sig-gen

PP-gen

Sig : STR

Sig : STR

PP : STR

PP : STR

Sig-gen : STR

PP-gen : STR PP : STRPP-gen* : STR

Page 38: Bootstrapping Meta-Languages of Language Workbenches

38

Bootstrap to find defects

SDF STR

Sig

Sig

PP

PP

Sig-gen

PP-gen

Sig : STR

Sig : STR

PP : STR

PP : STR

Sig-gen : STR

PP-gen : STR PP : STRPP-gen* : STR

Page 39: Bootstrapping Meta-Languages of Language Workbenches

39

SDF STRSig-genPP-gen PP

Baseline

Page 40: Bootstrapping Meta-Languages of Language Workbenches

40

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1Fixpoint bootstrapping

Page 41: Bootstrapping Meta-Languages of Language Workbenches

41

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

String(s)->Op("S", [Str(s), Str(";")])

String(s)->Op("S", [Str(s)])

Page 42: Bootstrapping Meta-Languages of Language Workbenches

42

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

String(s)->Op("S", [Str(s), Str(";")])

String(s)->Op("S", [Str(s)])

Hidden defect

Page 43: Bootstrapping Meta-Languages of Language Workbenches

43

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

pp-Decl : Signature(t) -> [ H([ SOpt(HS(), "0") , S("signatures") , S(";") ]) , <pp-Sig> t]

Page 44: Bootstrapping Meta-Languages of Language Workbenches

44

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

pp-Decl : Signature(t) -> [ H([ SOpt(HS(), "0") , S("signatures") , S(";") ]) , <pp-Sig> t]

Page 45: Bootstrapping Meta-Languages of Language Workbenches

45

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

module; signatures/sorts/Sorts-sigsignatures; :; String ->; SortSort :; Sort ->; SymbolPSort :; Sort *; List(;Symbol); ->; Symbol

Defect found

Page 46: Bootstrapping Meta-Languages of Language Workbenches

46

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

module; signatures/sorts/Sorts-sigsignatures; :; String ->; SortSort :; Sort ->; SymbolPSort :; Sort *; List(;Symbol); ->; Symbol

Defect found

Page 47: Bootstrapping Meta-Languages of Language Workbenches

47

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

modulesignatures SortPSort

47

Dynsem

NaBL2

TSNaBL

ESV

Stratego

SDF3

SDF2

Page 48: Bootstrapping Meta-Languages of Language Workbenches

48

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

modulesignatures SortPSort

Fixpoint bootstrapping

Page 49: Bootstrapping Meta-Languages of Language Workbenches

49

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

modulesignatures SortPSort

Fixpoint bootstrapping

Binary comparison

Page 50: Bootstrapping Meta-Languages of Language Workbenches

50

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

modulesignatures SortPSort

Fixpoint bootstrapping

Binary comparison

Existing baseline

Page 51: Bootstrapping Meta-Languages of Language Workbenches

51

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

modulesignatures SortPSort

Fixpoint bootstrapping

Binary comparison

Existing baseline

Deterministic compilers

Page 52: Bootstrapping Meta-Languages of Language Workbenches

52

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

modulesignatures SortPSort

Fixpoint bootstrapping

Binary comparison

Existing baseline

Deterministic compilers

Produce baselines

Page 53: Bootstrapping Meta-Languages of Language Workbenches

53

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

modulesignatures SortPSort

Fixpoint bootstrapping

Binary comparison

Existing baseline

Deterministic compilers

Produce baselines

Roll back on defects

Page 54: Bootstrapping Meta-Languages of Language Workbenches

54

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

modulesignatures SortPSort

Fixpoint bootstrapping

Binary comparison

Existing baseline

Deterministic compilers

Produce baselines

Roll back on defects

General

Page 55: Bootstrapping Meta-Languages of Language Workbenches

Systematic Meta-Language Bootstrapping

Page 56: Bootstrapping Meta-Languages of Language Workbenches

Model

56

SDF1SDF1

Language definition

Page 57: Bootstrapping Meta-Languages of Language Workbenches

Model

57

SDF1SDF1VersioningLanguage definition

Page 58: Bootstrapping Meta-Languages of Language Workbenches

Model

58

SDF1SDF1

Sig-gen : STR

Grammar : SDFSource artifacts

Page 59: Bootstrapping Meta-Languages of Language Workbenches

Model

59

SDF1SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0 Language product

Page 60: Bootstrapping Meta-Languages of Language Workbenches

Model

60

SDF1SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0 Language productBaseline: set of products

Page 61: Bootstrapping Meta-Languages of Language Workbenches

Model

61

SDF1SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR Export artifacts

Page 62: Bootstrapping Meta-Languages of Language Workbenches

Model

62

SDF1SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR Export generators

Page 63: Bootstrapping Meta-Languages of Language Workbenches

Model

63

SDF1SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR

Dependency

Page 64: Bootstrapping Meta-Languages of Language Workbenches

Model

64

SDF1SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

Page 65: Bootstrapping Meta-Languages of Language Workbenches

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

65

SDF1Compile

Page 66: Bootstrapping Meta-Languages of Language Workbenches

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

66

SDF1CompileGrammar : SDF

Page 67: Bootstrapping Meta-Languages of Language Workbenches

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

67

SDF1CompileGrammar : SDF

SDF0

Page 68: Bootstrapping Meta-Languages of Language Workbenches

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

68

SDF1CompileGrammar : SDF

SDF0

Sig-gen : SDF ⇒ STR

Page 69: Bootstrapping Meta-Languages of Language Workbenches

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

69

SDF1CompileGrammar : SDF

SDF0

Sig-gen : SDF ⇒ STR

Sig : STR

Page 70: Bootstrapping Meta-Languages of Language Workbenches

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

Sig : STR

SDF1Compile

70

Sig-gen : STR

Page 71: Bootstrapping Meta-Languages of Language Workbenches

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

Sig : STR

SDF1Compile

71

Sig-gen : STR

STR0

STR2Java : STR ⇒ JAR

Page 72: Bootstrapping Meta-Languages of Language Workbenches

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

Sig : STR

SDF1Compile

72

Sig-gen : STR

STR0

STR2Java : STR ⇒ JAR

SDF0

Sig : STR

Page 73: Bootstrapping Meta-Languages of Language Workbenches

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

Sig : STR

SDF1Compile

73

Sig-gen : STR

STR0

STR2Java : STR ⇒ JAR

SDF0

Sig : STR

Sig-gen : SDF ⇒ STR

Page 74: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping

Page 75: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping - inputs

Page 76: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping - inputs

76

STR0

SDF0*

Set of language definitions

Page 77: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping - inputs

77

STR0

SDF0*

STR0

SDF0

Baseline

Page 78: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping - inputs

78

STR0

SDF0*

STR0

SDF0

Baseline

Page 79: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping - inputs

79

STR0

SDF0*

STR0

SDF01

Version number

Page 80: Bootstrapping Meta-Languages of Language Workbenches

80

STR0

SDF0*

STR1

SDF1*

STR0

SDF0

Bootstrapping - first iteration

Apply version number

Page 81: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping - first iteration

81

STR0

SDF0*

STR1

SDF1* SDF1

STR1STR0

SDF0

Compile

Page 82: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping - first iteration

82

STR0

SDF0*

STR1

SDF1*

STR0SDF0

SDF1

STR1

Store baseline

Page 83: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping - first iteration

83

STR0

SDF0

STR0

SDF0*

STR1

SDF1*

STR0SDF0

STR1

SDF1

Use compiled products

Page 84: Bootstrapping Meta-Languages of Language Workbenches

Bootstrapping - first iteration

84

STR0

SDF0

STR0

SDF0*

STR1

SDF1*

STR0SDF0

STR1

SDF1

Use compiled products

Page 85: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

85

STR0

SDF0

STR0

SDF0*

STR1

SDF1* SDF1

STR1

STR0SDF0

STR1

SDF1

Page 86: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

86

STR0

SDF0

STR0

SDF0*

STR1

SDF1* SDF1

STR1

STR0SDF0

STR1

SDF1

STR0

SDF0

STR1

SDF1

STR1

SDF1

Binary comparison

Page 87: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

87

STR0

SDF0

STR0

SDF0*

STR1

SDF1* SDF1

STR1

STR0SDF0

STR1

SDF1

STR0

SDF0

STR1

SDF1

STR1

SDF1

Binary comparison

STR1

SDF1

STR1

SDF1

Page 88: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

88

STR0

SDF0

STR0

SDF0*

STR1

SDF1* SDF1

STR1

STR0SDF0

STR1

SDF1

STR0

SDF0

STR1

SDF1

STR1

SDF1

STR1

SDF1

STR1

SDF1

Binary comparison

Page 89: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

89

STR0

SDF0

STR0

SDF0*

STR1

SDF1* SDF1

STR1

STR0SDF0

STR1

SDF1

STR0

SDF0

STR1

SDF1

STR1

SDF1

STR1

SDF1

STR1

SDF1

STR1SDF1

Page 90: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

90

STR0

SDF0

STR0

SDF0*

STR1

SDF1* SDF1

STR0SDF0

STR1

SDF1

Found defects

Page 91: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

91

STR0

SDF0*

STR1

SDF1*

STR0SDF0

Discard products

Page 92: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

92

STR0

SDF0*

STR1

SDF1*

STR0

SDF0

Rollback

Page 93: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

93

STR0

SDF0*

STR0

SDF0

Undo version changes

Page 94: Bootstrapping Meta-Languages of Language Workbenches

Fixpoint Bootstrapping

94

STR0

SDF0*

STR0

SDF0 SDF0*

Store error

Page 95: Bootstrapping Meta-Languages of Language Workbenches

STR0

SDF0

STR0

SDF0* SDF1

STR1

STR0SDF0

9595

General (language-parametric)

Page 96: Bootstrapping Meta-Languages of Language Workbenches

STR0

SDF0

STR0

SDF0* SDF1

STR1

STR0SDF0

9696

General (language-parametric)

Fully automated

Page 97: Bootstrapping Meta-Languages of Language Workbenches

97

-- Model for languages, language definitions with sources, and language products with artifacts and generators.

type Version = Int

type Lang = String

data LangID = LangID { name :: Lang, version :: Version }

data Artifact = Artifact { aname :: String, alang :: Lang, acontent :: String }

data LangDef = LangDef { dlang :: LangID, dsources :: [Artifact], dartDeps :: [LangID], dgenDeps :: [LangID] }

data Generator = Generator { gname :: String, gsource :: Lang, gtarget :: Lang, generate :: Artifact -> Artifact }

data LangProd = LangProd { plang :: LangID, partifacts :: [Artifact], pgenerators :: [Generator] }

type Baseline = [LangProd]

getProd :: LangID -> Baseline -> LangProd

getProd lang baseline = fromJust $ find (\prod -> lang == plang prod) baseline

-- Compile. Sort languages by generator source/target and run relevant generators against relevant artifacts.

compile :: LangDef -> Baseline -> LangProd

compile def baseline = createLangProd def (runGenerators sortedLangs generators inputs)

where inputs = dsources def ++ [ a | l <- dartDeps def, a <- partifacts (getProd l baseline) ]

generators = [ g | l <- dgenDeps def, g <- pgenerators (getProd l baseline) ]

sortedLangs = topsort [ l | LangID l _ <- dgenDeps def ] [ (gsource g,gtarget g) | g <- generators]

runGenerators :: [Lang] -> [Generator] -> [Artifact] -> [Artifact]

runGenerators [] gens inputs = inputs

runGenerators (lang:langs) gens inputs = runGenerators langs gens (inputs ++ runGeneratorsFor lang gens inputs)

runGeneratorsFor :: Lang -> [Generator] -> [Artifact] -> [Artifact]

runGeneratorsFor lang gens inputs = [ generate g a | g <- gens, a <- inputs, gsource g == lang, alang a == lang ]

createLangProd :: LangDef -> [Artifact] -> LangProd -- Implemented by the language workbench

-- Fixpoint bootstrap language definitions with a baseline. Update versions in the first iteration, then fixpoint.

bootstrap :: Version -> [LangDef] -> Baseline -> (Baseline, [LangDef])

bootstrap v defs baseline =

let firstBuild = [ compile (setVersion v def) baseline | def <- defs ] in

bootstrapFixpoint (prepareFixpoint v defs) firstBuild

bootstrapFixpoint :: [LangDef] -> Baseline -> (Baseline, [LangDef])

bootstrapFixpoint defs baseline =

let newBaseline = [ compile def baseline | def <- defs ] in

if baseline == newBaseline

then (newBaseline, defs)

else bootstrapFixpoint defs newBaseline

setVersion :: Version -> LangDef -> LangDef

setVersion v (LangDef (LangID l _) srcs gdeps adeps) = LangDef (LangID l v) srcs gdeps adeps

prepareFixpoint :: Version -> [LangDef] -> [LangDef]

prepareFixpoint v defs = [ prepareFixpointDef v bootstrappedLangs def | def <- defs ]

where bootstrappedLangs = [ l | LangDef (LangID l _) _ _ _ <- defs ]

prepareFixpointDef :: Version -> [Lang] -> LangDef -> LangDef

prepareFixpointDef v langs (LangDef (LangID l _) srcs adeps gdeps) =

LangDef (LangID l v) srcs [ updateDep v langs dep | dep <- adeps ] [ updateDep v langs dep | dep <- gdeps ]

updateDep :: Version -> [Lang] -> LangID -> LangID

updateDep v langs (LangID l vold) = if l �elem� langs then LangID l v else LangID l vold

Figure 2. Model for sound bootstrapping, with algorithms for compilation and fixpoint bootstrapping, encoded in Haskell.

3.3 Fixpoint Bootstrapping

We can now use compilation to define fixpoint bootstrapping.In general, there is no way to know how many bootstrappingiterations are required before it is safe to stop. Therefore, weiteratively bootstrap meta-languages until reaching a fixpoint.We define a general fixpoint bootstrapping algorithm usingthe model and compilation algorithm from above.

Function bootstrap takes the version of the new baseline,a list of meta-language definitions, and an existing baseline,and it produces a new baseline of the given version. The basicidea of the algorithm is to compile meta-language definitionsin iterations, until we reach a fixpoint. However, to avoidbuilding against the old baseline repeatedly, we have to updatethe versions of the language definitions in the first iteration.

6 2016/10/12

Source Code in our paper

55 lines of Haskell code

Model Compilation algorithm

Bootstrapping algorithm

Page 98: Bootstrapping Meta-Languages of Language Workbenches

Implementation

Page 99: Bootstrapping Meta-Languages of Language Workbenches

Implementation in Spoofax

99

Page 100: Bootstrapping Meta-Languages of Language Workbenches

Implementation in Spoofax

100

Page 101: Bootstrapping Meta-Languages of Language Workbenches

Implementation in Spoofax

101

Page 102: Bootstrapping Meta-Languages of Language Workbenches

Evaluation

Page 103: Bootstrapping Meta-Languages of Language Workbenches

103

Dynsem

NaBL2

TSNaBL

ESV

Stratego

SDF3

SDF2

Bootstrapped 8 of Spoofax’s

Meta-languagesDynsem

NaBL2

TSNaBL

ESV

Stratego

SDF3

SDF2

Page 104: Bootstrapping Meta-Languages of Language Workbenches

104

Dynsem

NaBL2

TSNaBL

ESV

Stratego

SDF3

SDF2

Bootstrapped 8 of Spoofax’s

Meta-languages

Complex dependencies

Page 105: Bootstrapping Meta-Languages of Language Workbenches

105

Dynsem

NaBL2

TSNaBL

ESV

Stratego

SDF3

SDF2

Bootstrapped 8 of Spoofax’s

Meta-languages

Complex dependencies

Results in paper and online

Page 106: Bootstrapping Meta-Languages of Language Workbenches

35

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Complex to bootstrap

Sig : STR

Sig : STR

PP : STR

PP : STR

Sig-gen : STR

PP-gen : STR

44

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

module; signatures/sorts/Sorts-sigsignatures; :; String ->; SortSort :; Sort ->; SymbolPSort :; Sort *; List(;Symbol); ->; Symbol

Defect found

Page 107: Bootstrapping Meta-Languages of Language Workbenches

35

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Complex to bootstrap

Sig : STR

Sig : STR

PP : STR

PP : STR

Sig-gen : STR

PP-gen : STR

44

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

module; signatures/sorts/Sorts-sigsignatures; :; String ->; SortSort :; Sort ->; SymbolPSort :; Sort *; List(;Symbol); ->; Symbol

Defect found

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

Sig : STR

SDF1Compile

71

Sig-gen : STR

STR0

STR2Java : STR ⇒ JAR

SDF0

Sig : STR

Sig-gen : SDF ⇒ STR

Fixpoint Bootstrapping

86

STR0

SDF0

STR0

SDF0*

STR1

SDF1* SDF1

STR1

STR0SDF0

STR1

SDF1

STR0

SDF0

STR1

SDF1

STR1

SDF1

STR1

SDF1

STR1

SDF1

STR1SDF1

Page 108: Bootstrapping Meta-Languages of Language Workbenches

35

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Complex to bootstrap

Sig : STR

Sig : STR

PP : STR

PP : STR

Sig-gen : STR

PP-gen : STR

44

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

module; signatures/sorts/Sorts-sigsignatures; :; String ->; SortSort :; Sort ->; SymbolPSort :; Sort *; List(;Symbol); ->; Symbol

Defect found

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

Sig : STR

SDF1Compile

71

Sig-gen : STR

STR0

STR2Java : STR ⇒ JAR

SDF0

Sig : STR

Sig-gen : SDF ⇒ STR

Fixpoint Bootstrapping

86

STR0

SDF0

STR0

SDF0*

STR1

SDF1* SDF1

STR1

STR0SDF0

STR1

SDF1

STR0

SDF0

STR1

SDF1

STR1

SDF1

STR1

SDF1

STR1

SDF1

STR1SDF1Implementation in Spoofax

99 104

Dynsem

NaBL2

TSNaBL

ESV

Stratego

SDF3

SDF2

Bootstrapped 8 of Spoofax’s

Meta-languages

Complex dependencies

7 changes

Page 109: Bootstrapping Meta-Languages of Language Workbenches

35

SDF STRSig-gen

PP-gen

Sig

Sig

PP

PP

Complex to bootstrap

Sig : STR

Sig : STR

PP : STR

PP : STR

Sig-gen : STR

PP-gen : STR

44

SDF STRSig-genPP-gen PP

Baseline

STR

PP

Iteration 1 SDF

Sig-genPP-gen*

Sig

SDF STRSig

Sig-genPP-gen PP

Iteration 2

SDF STRSig

Sig-genPP-gen PP

Iteration 3

SDF Sig

Sig-genPP-gen

Iteration 4

module; signatures/sorts/Sorts-sigsignatures; :; String ->; SortSort :; Sort ->; SymbolPSort :; Sort *; List(;Symbol); ->; Symbol

Defect found

Compilation

SDF1

Sig-gen : STR

Grammar : SDF

SDF0 STR0

Sig : STR

Sig-gen : SDF ⇒ STR STR2Java :

STR ⇒ JAR

Sig : STR

SDF1Compile

71

Sig-gen : STR

STR0

STR2Java : STR ⇒ JAR

SDF0

Sig : STR

Sig-gen : SDF ⇒ STR

Fixpoint Bootstrapping

86

STR0

SDF0

STR0

SDF0*

STR1

SDF1* SDF1

STR1

STR0SDF0

STR1

SDF1

STR0

SDF0

STR1

SDF1

STR1

SDF1

STR1

SDF1

STR1

SDF1

STR1SDF1Implementation in Spoofax

99 104

Dynsem

NaBL2

TSNaBL

ESV

Stratego

SDF3

SDF2

Bootstrapped 8 of Spoofax’s

Meta-languages

Complex dependencies

7 changes

Systematic Meta-Language Bootstrapping