Is Sound Gradual Typing Dead?
Asumu Takikawa Daniel Feltey Ben Greenman Max S. New Jan Vitek Matthias Felleisen
Is Sound Gradual Typing Dead? Asumu Takikawa Daniel Feltey Ben - - PowerPoint PPT Presentation
Is Sound Gradual Typing Dead? Asumu Takikawa Daniel Feltey Ben Greenman Max S. New Jan Vitek Matthias Felleisen Gradual typing thesis 1. People write untyped code 2. Static types help maintain software 3. Sound types can be added
Asumu Takikawa Daniel Feltey Ben Greenman Max S. New Jan Vitek Matthias Felleisen
The meaning of soundness
#lang typed/racket/unsound ; fact.rkt (provide fact) (: fact (-> Integer Integer)) (define (fact n) (if (zero? n) 1 (* n (sub1 n))))
#lang racket ; use.rkt (require "fact.rkt") (fact "ill-typed call")
The meaning of soundness
#lang typed/racket/unsound ; fact.rkt (provide fact) (: fact (-> Integer Integer)) (define (fact n) (if (zero? n) 1 (* n (sub1 n))))
#lang racket ; use.rkt (require "fact.rkt") (fact "ill-typed call") ; zero?: contract violation ; expected: number? ; given: "ill-typed call" ; [,bt for context]
The meaning of soundness
#lang typed/racket ; fact.rkt (provide fact) (: fact (-> Integer Integer)) (define (fact n) (if (zero? n) 1 (* n (sub1 n))))
#lang racket ; use.rkt (require "fact.rkt") (fact "ill-typed call")
The meaning of soundness
#lang typed/racket ; fact.rkt (provide fact) (: fact (-> Integer Integer)) (define (fact n) (if (zero? n) 1 (* n (sub1 n))))
#lang racket ; use.rkt (require "fact.rkt") (fact "ill-typed call") ; fact: contract violation ; expected: Integer ; given: "ill-typed call" ; in: the 1st argument of ; (-> Integer any) ; contract from: "fact.rkt" ; blaming: "use.rkt"
#lang racket/base (provide (struct-out stream) make-stream stream-unfold stream-get stream-take) (struct stream (first rest)) (define (make-stream hd thunk) (stream hd thunk)) (define (stream-unfold st) (values (stream-first st) ((stream-rest st)))) (define (stream-get st i) (define-values (hd tl) (stream-unfold st)) (cond [(= i 0) hd] [else (stream-get tl (sub1 i))])) (define (stream-take st n) (cond [(= n 0) '()] [else (define-values (hd tl) (stream-unfold st)) (cons hd (stream-take tl (sub1 n)))])) #lang racket/base (require "streams.rkt") (define (count-from n) (make-stream n (lambda () (count-from (add1 n))))) (define (sift n st) (define-values (hd tl) (stream-unfold st)) (cond [(= 0 (modulo hd n)) (sift n tl)] [else (make-stream hd (lambda () (sift n tl)))])) (define (sieve st) (define-values (hd tl) (stream-unfold st)) (make-stream hd (lambda () (sieve (sift hd tl))))) (define primes (sieve (count-from 2))) (define (main) (printf "The ~a-th prime number is: ~a\n" 100 (stream-get primes 99))) (time (main))
Prime number sieve
#lang racket/base (provide (struct-out stream) make-stream stream-unfold stream-get stream-take) (struct stream (first rest)) (define (make-stream hd thunk) (stream hd thunk)) (define (stream-unfold st) (values (stream-first st) ((stream-rest st)))) (define (stream-get st i) (define-values (hd tl) (stream-unfold st)) (cond [(= i 0) hd] [else (stream-get tl (sub1 i))])) (define (stream-take st n) (cond [(= n 0) '()] [else (define-values (hd tl) (stream-unfold st)) (cons hd (stream-take tl (sub1 n)))])) #lang racket/base (require "streams.rkt") (define (count-from n) (make-stream n (lambda () (count-from (add1 n))))) (define (sift n st) (define-values (hd tl) (stream-unfold st)) (cond [(= 0 (modulo hd n)) (sift n tl)] [else (make-stream hd (lambda () (sift n tl)))])) (define (sieve st) (define-values (hd tl) (stream-unfold st)) (make-stream hd (lambda () (sieve (sift hd tl))))) (define primes (sieve (count-from 2))) (define (main) (printf "The ~a-th prime number is: ~a\n" 100 (stream-get primes 99))) (time (main))
Prime number sieve
A Typed Racket demo - prime number sieve
#lang typed/racket/base (provide (struct-out stream) make-stream stream-unfold stream-get stream-take) (struct: stream ([first : Natural] [rest : (-> stream)])) (: make-stream (-> Natural (-> stream) stream)) (define (make-stream hd thunk) (stream hd thunk)) (: stream-unfold (-> stream (values Natural stream))) (define (stream-unfold st) (values (stream-first st) ((stream-rest st)))) (: stream-get (-> stream Natural Natural)) (define (stream-get st i) (define-values (hd tl) (stream-unfold st)) (cond [(= i 0) hd] [else (stream-get tl (sub1 i))])) (: stream-take (-> stream Natural (Listof Natural))) (define (stream-take st n) (cond [(= n 0) '()] [else (define-values (hd tl) (stream-unfold st)) (cons hd (stream-take tl (sub1 n)))])) #lang racket/base (require "streams.rkt") (define (count-from n) (make-stream n (lambda () (count-from (add1 n))))) (define (sift n st) (define-values (hd tl) (stream-unfold st)) (cond [(= 0 (modulo hd n)) (sift n tl)] [else (make-stream hd (lambda () (sift n tl)))])) (define (sieve st) (define-values (hd tl) (stream-unfold st)) (make-stream hd (lambda () (sieve (sift hd tl))))) (define primes (sieve (count-from 2))) (define (main) (printf "The ~a-th prime number is: ~a\n" 100 (stream-get primes 99))) (time (main))
Prime number sieve
A Typed Racket demo - prime number sieve
#lang typed/racket/base (provide (struct-out stream) make-stream stream-unfold stream-get stream-take) (struct: stream ([first : Natural] [rest : (-> stream)])) (: make-stream (-> Natural (-> stream) stream)) (define (make-stream hd thunk) (stream hd thunk)) (: stream-unfold (-> stream (values Natural stream))) (define (stream-unfold st) (values (stream-first st) ((stream-rest st)))) (: stream-get (-> stream Natural Natural)) (define (stream-get st i) (define-values (hd tl) (stream-unfold st)) (cond [(= i 0) hd] [else (stream-get tl (sub1 i))])) (: stream-take (-> stream Natural (Listof Natural))) (define (stream-take st n) (cond [(= n 0) '()] [else (define-values (hd tl) (stream-unfold st)) (cons hd (stream-take tl (sub1 n)))])) #lang racket/base (require "streams.rkt") (define (count-from n) (make-stream n (lambda () (count-from (add1 n))))) (define (sift n st) (define-values (hd tl) (stream-unfold st)) (cond [(= 0 (modulo hd n)) (sift n tl)] [else (make-stream hd (lambda () (sift n tl)))])) (define (sieve st) (define-values (hd tl) (stream-unfold st)) (make-stream hd (lambda () (sieve (sift hd tl))))) (define primes (sieve (count-from 2))) (define (main) (printf "The ~a-th prime number is: ~a\n" 100 (stream-get primes 99))) (time (main))
Prime number sieve
Anecdotes from users
“The end-product appears to be a 50%-performance hybrid due to boundary contracts”
“At this point, about one-fifth of my code is now typed. Unfortunately, this version is 2.5 times slower”
“On my machine, it takes *twelve seconds* ... ... the time taken is 1ms”
Bad programming / isolated incidents? Bad implementation / design? Fundamental issue with gradual typing?
Suffixtree benchmark with 6 modules
Reminder: incremental addition of types
Paths in lattice are gradual migration paths
Reveals the cost of boundaries in gradual programs Shows paths from untyped to typed
data label lcs main structs ukkonen
231570 ms / 88.72x
data label lcs main structs ukkonen
195755 ms / 75x
Data / Label boundary is costly
data label lcs main structs ukkonen
33294 ms / 12.76x
data label lcs main structs ukkonen
22203 ms / 8.51x
When Data / Label have same color, it's more ok
8x
a b c d1.25x
a b c d10.38x
a b c d1.25x
a b c d7x
a b c d2.63x
a b c d5.13x
a b c d5.38x
a b c d2.75x
a b c d8.38x
a b c d11.88x
a b c d2.88x
a b c d11.5x
a b c d5.88x
a b c d2.25x
a b c d1x
Version 1
a b c d0.08x
a b c d0.71x
a b c d0.54x
a b c d1.26x
a b c d1.12x
a b c d1.24x
a b c d0.85x
a b c d0.59x
a b c d0.31x
a b c d0.14x
a b c d1.1x
a b c d0.19x
a b c d1.04x
a b c d0.87x
a b c d0.95x
a b c d1x
Version 2
8x
a b c d1.25x
a b c d10.38x
a b c d1.25x
a b c d7x
a b c d2.63x
a b c d5.13x
a b c d5.38x
a b c d2.75x
a b c d8.38x
a b c d11.88x
a b c d2.88x
a b c d11.5x
a b c d5.88x
a b c d2.25x
a b c d1x
Version 1
a b c d0.08x
a b c d0.71x
a b c d0.54x
a b c d1.26x
a b c d1.12x
a b c d1.24x
a b c d0.85x
a b c d0.59x
a b c d0.31x
a b c d0.14x
a b c d1.1x
a b c d0.19x
a b c d1.04x
a b c d0.87x
a b c d0.95x
a b c d1x
Version 2 Summarize by proportion of “deliverable” configurations
Even at 20x, no paths from untyped to typed
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100
Green line is at 3x-deliverable Shallow slope = bad
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100
Steep slope = good
4.14x
a b c d2.09x
a b c d3.09x
a b c d4.18x
a b c d3.82x
a b c d2.86x
a b c d4.14x
a b c d0.95x
a b c d3.14x
a b c d1.05x
a b c d2.27x
a b c d3.27x
a b c d2.64x
a b c d1.23x
a b c d0.32x
a b c d1x
a b c d0.64x
a b c d0.04x
a b c d0.76x
a b c d0.33x
a b c d0.42x
a b c d0.95x
a b c d0.65x
a b c d0.11x
a b c d0.56x
a b c d1.02x
a b c d0.19x
a b c d0.48x
a b c d0.37x
a b c d0.46x
a b c d0.49x
a b c d1x
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100 Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100
Synth
1%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100Snake
2%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100Quad
3%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100Suffixtree
9%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100Tetris
25%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100KCFA
25%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100Sieve
50%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100Zordoz
62%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100Gregor
69%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100MBTA
100%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100LNM
100%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100Morse code
100%
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100
6.2
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100
6.4.0.4 9% to 19% improvement in 3-deliverability
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100
6.2
Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Overhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100
6.4.0.4 25% to 29% improvement in 3-deliverability
Helps measure improvements between versions
O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100 O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) O verhead (vs. untyped) Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable Percentage deliverable 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 6x 6x 6x 6x 6x 6x 6x 10x 10x 10x 10x 10x 10x 10x 10x 10x 15x 15x 15x 15x 15x 15x 15x 15x 15x 20x 20x 20x 20x 20x 20x 20x 20x 20x 20 20 20 20 20 20 20 20 20 40 40 40 40 40 40 40 40 40 60 60 60 60 60 60 60 60 60 80 80 80 80 80 80 80 80 80 100 100 100 100 100 100 100 100 100Can inspect lattice for bad configs
data label lcs main structs ukkonen
195755 ms / 75x
Initial steps: contract profiler [St-Amour et al 2015]
Evaluation method helps GT system implementors Tools for avoiding GT performance pitfalls
Paper & Datasets:
http://www.ccs.neu.edu/racket/pubs/#popl16-tfgnvf
Evaluation method helps GT system implementors Tools for avoiding GT performance pitfalls
Paper & Datasets:
http://www.ccs.neu.edu/racket/pubs/#popl16-tfgnvf
Other research implementations of gradual typing
2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 Safe TypeScript StrongScript Gradualtalk Reticulated Python Typed Racket
Challenge: adapt this method to your chosen sound GT system