[icfp] specifying translations and correctness
This commit is contained in:
parent
a96bc36c46
commit
3d276633a4
|
@ -35,6 +35,7 @@
|
||||||
(define/short sigplan-notices "SIGPLAN Notices" (string-append ACM "SIGPLAN Notices"))
|
(define/short sigplan-notices "SIGPLAN Notices" (string-append ACM "SIGPLAN Notices"))
|
||||||
(define/short scheme-workshop "SFP" (string-append "Scheme and Functional Programming Workshop"))
|
(define/short scheme-workshop "SFP" (string-append "Scheme and Functional Programming Workshop"))
|
||||||
(define/short jfp "JFP" (string-append Journal "Functional Programming"))
|
(define/short jfp "JFP" (string-append Journal "Functional Programming"))
|
||||||
|
(define/short jsl "JSL" (string-append Journal "of Symbolic Logic"))
|
||||||
(define/short hosc "HOSC" "Higher-Order and Symbolic Programming")
|
(define/short hosc "HOSC" "Higher-Order and Symbolic Programming")
|
||||||
(define/short lfp "LFP" "LISP and Functional Programming")
|
(define/short lfp "LFP" "LISP and Functional Programming")
|
||||||
(define/short lsc "LSC" "LISP and Symbolic Computation")
|
(define/short lsc "LSC" "LISP and Symbolic Computation")
|
||||||
|
@ -1083,3 +1084,20 @@
|
||||||
#:author "Lennart Augustsson"
|
#:author "Lennart Augustsson"
|
||||||
#:location (proceedings-location icfp #:pages '(239 250))
|
#:location (proceedings-location icfp #:pages '(239 250))
|
||||||
#:date 1998))
|
#:date 1998))
|
||||||
|
|
||||||
|
(define f-popl-2016
|
||||||
|
(make-bib
|
||||||
|
#:title "Bindings as Sets of Scopes"
|
||||||
|
#:author "Matthew Flatt"
|
||||||
|
#:location (proceedings-location popl #:pages '(705 717))
|
||||||
|
#:date 2016))
|
||||||
|
|
||||||
|
(define c-jsl-1997
|
||||||
|
(make-bib
|
||||||
|
#:title "Three Uses of the Herbrand-Gentzen theorem in relating model theory and proof theory"
|
||||||
|
#:author "William Craig"
|
||||||
|
#:location (journal-location jsl
|
||||||
|
#:volume 22
|
||||||
|
#:number 3
|
||||||
|
#:pages '(269 285))
|
||||||
|
#:date 1957))
|
||||||
|
|
|
@ -69,12 +69,11 @@ Furthermore, we demonstrate applications to regular expression matching,
|
||||||
|
|
||||||
The key to our success--and also our weakness---is that we specialize
|
The key to our success--and also our weakness---is that we specialize
|
||||||
procedure call sites based on compile-time constant values.
|
procedure call sites based on compile-time constant values.
|
||||||
Run-time input foils our technique, but nonetheless we have found the idea useful
|
Run-time input foils the technique, but nonetheless we have found the idea useful
|
||||||
for many common programming tasks.
|
for many common programming tasks.
|
||||||
Moreover, our approach may be implemented as a library and used as a drop-in
|
Moreover, the approach may be implemented as a library and used as a drop-in
|
||||||
fix for existing code.
|
fix for existing code.
|
||||||
Simply importing the library overrides standard procedures with our specialized
|
Simply importing the library overrides standard procedures with specialized ones.
|
||||||
ones.
|
|
||||||
No further annotations are necessary; if specialization fails we default to
|
No further annotations are necessary; if specialization fails we default to
|
||||||
the program's original behavior.
|
the program's original behavior.
|
||||||
Put another way, our technique interprets the @emph{letter}
|
Put another way, our technique interprets the @emph{letter}
|
||||||
|
@ -95,21 +94,21 @@ The main requirement is that the language provides a means of altering the synta
|
||||||
Such tools are more formally known as @emph{macro} or @emph{syntax extension}
|
Such tools are more formally known as @emph{macro} or @emph{syntax extension}
|
||||||
systems.
|
systems.
|
||||||
At any rate, we sketch implementations for the five languages
|
At any rate, we sketch implementations for the five languages
|
||||||
listed above in our conclusion.
|
listed above in the conclusion.
|
||||||
|
|
||||||
Until that time when we must part, this pearl first describes our general
|
Until that time when we must part, this pearl first describes our general
|
||||||
approach in @Secref{sec:solution} and then illustrates the approach with
|
approach in @Secref{sec:solution} and then illustrates the approach with
|
||||||
specific examples in @Secref{sec:usage}.
|
specific examples in @Secref{sec:usage}.
|
||||||
We briefly report on practical experiences with our library
|
We briefly report on practical experiences with our library
|
||||||
in @Secref{sec:experience}.
|
in @Secref{sec:experience}.
|
||||||
Adventurous readers may enjoy learning about the details of our implementation
|
Adventurous readers may enjoy learning about implementation details
|
||||||
in @Secref{sec:implementation}, but everyone else is invited to skip to the
|
in @Secref{sec:implementation}, but everyone else is invited to skip to the
|
||||||
end and try implementing a letter-of-values analysis in their language of choice.
|
end and try implementing a letter-of-values analysis in their language of choice.
|
||||||
|
|
||||||
|
|
||||||
@; =============================================================================
|
@; =============================================================================
|
||||||
|
|
||||||
@parag{On Lineage}
|
@parag{Lineage}
|
||||||
|
|
||||||
Herman and Meunier demonstrated how Racket macros can propagate
|
Herman and Meunier demonstrated how Racket macros can propagate
|
||||||
information embedded in string values and syntax patterns to a
|
information embedded in string values and syntax patterns to a
|
||||||
|
@ -127,7 +126,7 @@ We also give a modern description of Racket's macro system and handle definition
|
||||||
|
|
||||||
@parag{Eager Evaluation}
|
@parag{Eager Evaluation}
|
||||||
|
|
||||||
Our implementation is freely available as a Racket package.
|
Our implementation is available as a Racket package.
|
||||||
To install the library, download Racket and then run @racket[raco pkg install ???].
|
To install the library, download Racket and then run @racket[raco pkg install ???].
|
||||||
The source code is on Github at: @url["https://github.com/???/???"].
|
The source code is on Github at: @url["https://github.com/???/???"].
|
||||||
Suggestions for a new package name are welcome.
|
Suggestions for a new package name are welcome.
|
||||||
|
|
|
@ -1,20 +1,98 @@
|
||||||
#lang scribble/sigplan
|
#lang scribble/sigplan @onecolumn
|
||||||
|
|
||||||
|
|
||||||
@require["common.rkt"]
|
@require["common.rkt"]
|
||||||
|
|
||||||
@title{How its made}
|
@title[#:tag "sec:solution"]{Interpretations and Translations}
|
||||||
|
|
||||||
|
The out-of-bounds reference in @code{[0,1,2] !! 3} is evident from the
|
||||||
|
definition of @code{!!} and the values passed to it.
|
||||||
|
We also know that @code{1 `div` 0} will go wrong because division by zero is
|
||||||
|
mathematically undefined.
|
||||||
|
Similar reasoning based on the meaning of @racket{%d} and the number of variables
|
||||||
|
bound by anonymous functions like @code{\ x y z -> x} can determine the correctness
|
||||||
|
of calls to @racket[printf] and @racket[curry].
|
||||||
|
|
||||||
|
In general, our analysis begins with a class of predicates for extracting
|
||||||
|
meta-information from expressions; for example the length of a
|
||||||
|
list value or arity of a procedure.
|
||||||
|
|
||||||
|
@exact|{$$\interp\ : \big\{\emph{expr} \rightarrow \emph{Maybe(value)}\big\}$$}|
|
||||||
|
|
||||||
|
Applying a function @code{f} @exact|{$\in \interp\ $}| to a syntactically
|
||||||
|
well-formed expression should either yield a value describing some aspect
|
||||||
|
of the input expression or return a failure result.@note{The name @emph{interp}
|
||||||
|
is a mnemonic for @emph{interpret} or @emph{interpolant}@~cite[c-jsl-1997].}
|
||||||
|
Correct predicates @code{f} should recognize expressions with some common
|
||||||
|
structure (not necessarily the expressions' type) and apply a uniform algorithm
|
||||||
|
to computer their result.
|
||||||
|
The reason for specifying @exact|{$\interp\ $}| over expressions rather than
|
||||||
|
values will be made clear in @Secref{sec:usage}.
|
||||||
|
|
||||||
|
Once we have predicates for extracting data from the syntax of expressions,
|
||||||
|
we can use the data to guide program transformations.
|
||||||
|
The main result of this pearl is defining a compelling set of such transformations.
|
||||||
|
|
||||||
|
@exact|{$$\trans : \big\{ \emph{expr} \rightarrow \emph{expr}\big\} $$}|
|
||||||
|
|
||||||
|
Each @exact|{${\tt g} \in \trans$}| is a partial function such that @exact|{${\tt (g~e)}$}|
|
||||||
|
returns either a specialized expression @exact|{${\tt e'}$}| or fails due to a value
|
||||||
|
error.
|
||||||
|
These transformations should be applied to expressions @exact|{${\tt e}$}| before
|
||||||
|
type-checking; the critera for correct transformations can then be given
|
||||||
|
in terms of the language's typing judgment @exact|{$\vdash {\tt e} : \tau$}|
|
||||||
|
and untyped evaluation relation @exact|{$\untyped{{\tt e}} \Downarrow {\tt v}$}|,
|
||||||
|
where @exact|{$\untyped{{\tt e}}$}| is the untyped erasure of @exact|{${\tt e}$}|.
|
||||||
|
We also assume a subtyping relation @exact|{$\subt$}| on types.
|
||||||
|
|
||||||
|
@itemlist[
|
||||||
|
@item{@emph{
|
||||||
|
If @exact|{$\vdash {\tt e} : \tau$}| and @exact|{$\vdash {\tt e'} : \tau'$}|
|
||||||
|
then @exact|{$\tau' \subt \tau$}| and both
|
||||||
|
@exact|{$\untyped{{\tt e}} \Downarrow {\tt v}$}| and
|
||||||
|
@exact|{$\untyped{{\tt e'}} \Downarrow {\tt v}$}|.
|
||||||
|
}}
|
||||||
|
@; e:t e':t' => t' <: t /\ e <=> e'
|
||||||
|
|
||||||
|
@item{@emph{
|
||||||
|
If @exact|{$\not\vdash {\tt e} : \tau$}| but @exact|{$\vdash {\tt e'} : \tau'$}|
|
||||||
|
then @exact|{$\untyped{{\tt e}} \Downarrow {\tt v}$}| and
|
||||||
|
@exact|{$\untyped{{\tt e'}} \Downarrow {\tt v}$}|.
|
||||||
|
}}
|
||||||
|
@; -e:t e':t' => e <=> e'
|
||||||
|
|
||||||
|
@item{@emph{
|
||||||
|
If @exact|{$\vdash {\tt e} : \tau$}| but @exact|{${\tt e'} = \bot$}|
|
||||||
|
or @exact|{$\not\vdash {\tt e'} : \tau'$}|
|
||||||
|
then @exact|{$\untyped{{\tt e}} \Downarrow \mathsf{wrong}$}| or diverges.
|
||||||
|
}}
|
||||||
|
@; e:t -e':t' => e^
|
||||||
|
]
|
||||||
|
|
||||||
|
If neither @exact|{${\tt e}$}| nor @exact|{${\tt e'}$}| type checks, then we have no guarantees
|
||||||
|
about the run-time behavior of either term.
|
||||||
|
The hope is that both diverge, but proving this fact in a realistic language is
|
||||||
|
more trouble than it is worth.
|
||||||
|
|
||||||
|
@; Erasure, moral, immoral
|
||||||
|
Finally, we say that a translation @exact|{${\tt (g~e) = e'}$}| is @emph{moral} if
|
||||||
|
@exact|{$\untyped{{\tt e}}$}| is @exact|{$\alpha$}|-equivalent to @exact|{$\untyped{{\tt e'}}$}|.
|
||||||
|
Otherwise, the tranlation has altered more than just type annotations and is
|
||||||
|
@emph{immoral}.
|
||||||
|
All our examples in @Secref{sec:intro} can be implemented as moral translations.
|
||||||
|
Immoral translations are harder to show correct, but also much more useful.
|
||||||
|
|
||||||
|
|
||||||
|
@; @section{Model}
|
||||||
|
@; Traditional descriptions of typed calculi follow a two-stage approach.
|
||||||
|
@; Expressions are first type-checked, then evaluated.
|
||||||
|
@; For our framework we need to introduce a first step, elaboration,
|
||||||
|
@; which takes place before type checking.
|
||||||
|
@;
|
||||||
|
@; To this end, we adapt the macro system model from Flatt@~cite[f-popl-2016]
|
||||||
|
@; with a simple type system.
|
||||||
|
@; Syntactically-valid expressions in the language are initially untyped.
|
||||||
|
@; The first set of
|
||||||
|
|
||||||
We describe our technique in terms of four functions on syntax objects.
|
|
||||||
Our implementation is in Typed Racket, but we believe
|
|
||||||
Clojure,
|
|
||||||
Haskell,
|
|
||||||
Javascript,
|
|
||||||
OCaml,
|
|
||||||
Rust,
|
|
||||||
and Scala
|
|
||||||
could reproduce our results.@note{We list two non-essential difficulties in
|
|
||||||
@todo{secref}.}
|
|
||||||
@; The hope in listing these languages up-front is to spark readers' imagination
|
|
||||||
@; before we give our own solution in Section 3
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
% Better horizontal rules
|
% Better horizontal rules
|
||||||
\usepackage{booktabs}
|
\usepackage{booktabs}
|
||||||
\usepackage{listings}
|
\usepackage{listings}
|
||||||
|
\usepackage{stmaryrd}
|
||||||
\lstset{language=ML}
|
\lstset{language=ML}
|
||||||
\usepackage[usenames,dvipsnames]{xcolor}
|
\usepackage[usenames,dvipsnames]{xcolor}
|
||||||
\usepackage{multicol}
|
\usepackage{multicol}
|
||||||
|
@ -28,3 +29,8 @@
|
||||||
\let\llcorner\relax
|
\let\llcorner\relax
|
||||||
\let\lrcorner\relax
|
\let\lrcorner\relax
|
||||||
\usepackage{amssymb}
|
\usepackage{amssymb}
|
||||||
|
|
||||||
|
\newcommand{\interp}{\llbracket\emph{interp}\rrbracket}
|
||||||
|
\newcommand{\untyped}[1]{\lfloor #1 \rfloor}
|
||||||
|
\newcommand{\trans}{\llbracket\emph{transform}\rrbracket}
|
||||||
|
\newcommand{\subt}{\mathbf{<:\,}}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user