DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and...

22
DSL Summer School Intro Martin Odersky EPFL

Transcript of DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and...

Page 1: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

DSL Summer School Intro Martin Odersky

EPFL

Page 2: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Why DSLs?

1. Give users ways to express themselves in a notation tailored to their domain. à Better abstraction à Fewer errors à More concise and clearer notation (sometimes) 2. Allow new implementation capabilities that are specialized for a domain. à Higher performance à Non-traditional target platforms all DSLs have the purpose of productivity •  2) some are designed to achieve performance •  3) frameworks/platforms for implementing DSLs: are

divided into external •  and internal DSLs, several choices for the latter •  4) some DSLs are user facing, others not •  5) some DSLs are translated into standard PLs, others

not

2

Page 3: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

DSL

External Internal shallow embedding deep embedding.

New Syntax New Implementation

Better Performance New Targets

3

Implementation Decisions

Page 4: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Scala and DSLs

Scala has proven to be fertile ground for building DSLs

–  can be molded into new languages by adding libraries (domain specific or general)

See: “Growing a language” (Guy Steele, 1998)

Ecosystem provides many tools (parser combinators, macros, etc), to define new DSLs.

4

Page 5: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

A Growable Language

•  Flexible Syntax •  Flexible Types •  User-definable operators •  Higher-order functions •  Implicits ...

Make it relatively easy to build new DSLs on top of Scala And where this fails, we can always use the (experimental) macro system.

5

Page 6: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

A Growable Language

6

SBT

Chisel Spark

Spray Dispatch

Akka

ScalaTest Squeryl Specs

shapeless

Scalaz

Slick

Spiral Opti{X}

Page 7: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Growable = Good?

In fact, it’s a double edged sword. Growable is great because it does not presume that the language designers know everything a priori about the “right way” to program. But it has its challenges:

–  DSLs can fracture the user community

–  Besides, no language is liked by everyone, no matter whether its a DSL or general purpose.

–  Host languages get the blame for the DSLs they embed.

7

Page 8: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

import org.apache.spark.SparkContextimport org.apache.spark.SparkContext._

object InvertedIndex { def main(args: Array[String]) = {

val sc = new SparkContext( "local", "Inverted Index")

sc.textFile("data/crawl") .map { line => val array = line.split("\t", 2) (array(0), array(1)) } .flatMap { case (path, text) => text.split("""\W+""") map { word => (word, path) } } .map { case (w, p) => ((w, p), 1) } .reduceByKey { (n1, n2) => n1 + n2 } .map { case ((word,path),n) => (word,(path,n)) } .groupByKey .mapValues { iter => iter.toSeq.sortBy { case (path, n) => (-n, path) }.mkString(", ") } .saveAsTextFile(argz.outpath)

sc.stop() }}

8

Page 9: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

import org.apache.spark.SparkContextimport org.apache.spark.SparkContext._

object InvertedIndex { def main(args: Array[String]) = {

val sc = new SparkContext( "local", "Inverted Index")

sc.textFile("data/crawl") .map { line => val array = line.split("\t", 2) (array(0), array(1)) } .flatMap { case (path, text) => text.split("""\W+""") map { word => (word, path) } } .map { case (w, p) => ((w, p), 1) } .reduceByKey { (n1, n2) => n1 + n2 } .map { case ((word,path),n) => (word,(path,n)) } .groupByKey .mapValues { iter => iter.toSeq.sortBy { case (path, n) => (-n, path) }.mkString(", ") } .saveAsTextFile(argz.outpath)

sc.stop() }}

9

Page 10: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

import org.apache.spark.SparkContextimport org.apache.spark.SparkContext._

object InvertedIndex { def main(args: Array[String]) = {

val sc = new SparkContext( "local", "Inverted Index")

sc.textFile("data/crawl") .map { line => val array = line.split("\t", 2) (array(0), array(1)) } .flatMap { case (path, text) => text.split("""\W+""") map { word => (word, path) } } .map { case (w, p) => ((w, p), 1) } .reduceByKey { (n1, n2) => n1 + n2 } .map { case ((word,path),n) => (word,(path,n)) } .groupByKey .mapValues { iter => iter.toSeq.sortBy { case (path, n) => (-n, path) }.mkString(", ") } .saveAsTextFile(argz.outpath)

sc.stop() }}

10

((word1, path1), n1)((word2, path2), n2)...

Page 11: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Pitfalls

•  The Lisp Curse

•  Syntactic Flexibility

•  Interpretation Indirection

•  Tooling

11

Page 12: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

The Lisp Curse

“The power of Lisp is its own worst enemy”

~

“Lisp is so powerful that problems which are technical issues in other programming languages are social issues in Lisp.”

(Rudolf Winestock)

•  0123456789 10

12

Page 13: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Syntactic Flexibility

•  What is the single thing people have complained most about Scala programs?

13

Page 14: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

HTTP Dispatch Library

14

Page 15: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Syntactic Flexibility

•  What is the single thing people have complained most about Scala programs?

Symbolic Names!

Symbolic names are great for people who know a DSL inside out. They are terrifying for everyone else.

15

Page 16: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

The Story of SBT

•  SBT –  was: Simple Build Tool –  now: Scala Build Tool (because people find it anything but

simple).

•  SBT 0.7: Essentially a Scala library to write programs that do builds. Direct mapping of all features

•  SBT 10.x: Essentially a new language very cleverly embedded in Scala –  Build definitions manipulate global maps of settings and tasks (in

an imperative way! –  Strange syntax –  Hard to debug builds because of interpretation indirection.

16

Page 17: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

SBT Example

This was version 0.11, later versions have simplified the syntax.

17

Page 18: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

A Story about Macros

•  Scala 2.10 got experimental macros •  Could invoke arbirary Scala code during compilation. •  The Play framework designers had a really clever idea:

A macro that would automatically validate a query against a database schema. –  When seeing a query, go to the database, get the schema,

validate the query text against it. –  What could go wrong?

–  In an IDE the typechecker is run on every keystroke. –  So the macro expansion also happens on every keystroke. à IDE slows to a crawl. à Consider Tooling for DSLs

18

Page 19: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Problems with Slick

•  Slick is a database connectivity layer for Scala. •  Allows data to be expressed as Scala case classes that

correspond to some database schema. •  Allows queries to be expressed in terms of for-

expressions (which translate to map/flatmap/filter).

Challenges: -  Compilation times due to encodings of HLists and

HMaps -  Error messages for type errors involving schemas.

19

Page 20: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Some Research Directions

•  How can we balance expressiveness and uniformity?

•  How can we restrict capabilities of DSLs?

•  How can we ensure DSL tooling (e.g. error diagnostics, IDE experience, debugging) is as good as for the host language?

20

Page 21: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Contents of the Program

Platforms: What are good ways to define and implement DSLs? Exploiting Domain Knowledge for

–  Performance: How can we leverage domain-specific knowledge to get faster programs?

–  New Targets: What are good techniques to translate DSL source code to non-standard targets?

21

Page 22: DSL Summer School Intro - GitHub Pagesvjovanov.github.io/.../monday/intro/martin.pdf · Scala and DSLs Scala has proven to be fertile ground for building DSLs – can be molded into

Program

22

Declare your language

Visser

Quoted DSLs

Wadler

DSL Embedding in Scala

Rompf

DSL Embedding in Racket

Flatt

DSL Embedding in Haskell

Newton

Exploiting DS Knowledge: Databases and Data Analytics

Koch

Exploiting DS Knowledge: Spiral

Püschel & Ofenbeck

Hetero-geneous Computing

Olukotun

Dynamic Compilation

Wuerthinger

Re-configurable Computing

Bachrach

Mon Tue Wed Thu Fri

Platforms Performance New Targets