[racket-dev] [plt] Push #27446: master branch updated
Our own Sam: one step ahead. :)
Robby
On Mon, Sep 9, 2013 at 7:55 PM, Sam Tobin-Hochstadt <samth at cs.indiana.edu>wrote:
> Not only did our own Sam write about this, but he thought that he changed
> Typed Racket to do this. Am I missing something here, or are you describing
> more optimization than we do already or ...?
>
> Sam
> On Sep 9, 2013 8:33 PM, "Robby Findler" <robby at eecs.northwestern.edu>
> wrote:
>
>> FWIW, this is something that's been studied in small calculi in the
>> literature. Nothing that will have to get thru all of the little details
>> that you have to get right to make it work in a real language design like
>> TR, but maybe you'll find some useful ways to look at the problem. (Mostly
>> the papers I'm thinking of have Jeremy Siek as a co-author but there are
>> others, including our own Sam.)
>>
>> Robby
>>
>>
>> On Mon, Sep 9, 2013 at 7:14 PM, Eric Dobson <eric.n.dobson at gmail.com>wrote:
>>
>>> I have ideas to remove about the contracts from TR code, but currently
>>> that is only prototyped.
>>>
>>> Example:
>>>
>>> #lang typed/racket
>>> (provide f)
>>> (: f (Number -> Number))
>>> (define (f x) x)
>>>
>>> Currently f is exported with the contract (number? . -> . number?),
>>> but this can be safely reduced to (number . -> . any). This is because
>>> the return value contract is checking things we have already ensured
>>> statically. IIRC checking return values of functions is much more
>>> expensive than just arguments, so this should reduce the cost of TR
>>> boundary cost, but I don't have any numbers.
>>>
>>> On Mon, Sep 9, 2013 at 10:57 AM, Sam Tobin-Hochstadt
>>> <samth at cs.indiana.edu> wrote:
>>> > On Mon, Sep 9, 2013 at 11:35 AM, Neil Toronto <neil.toronto at gmail.com>
>>> wrote:
>>> >> Nice, and thanks for the explanation. Just to make sure I get it:
>>> does this
>>> >> mean fully expanded TR modules are smaller?
>>> >
>>> > Yes.
>>> >
>>> >> Does it reduce the number of generated contracts?
>>> >
>>> > No.
>>> >
>>> >>
>>> >>
>>> >> On 09/08/2013 12:24 PM, Sam Tobin-Hochstadt wrote:
>>> >>>
>>> >>> Typed Racket has to expand into code that registers the type of each
>>> >>> module-top-level identifier in the global environment so that other
>>> >>> modules can find the types to typecheck with. For example, this
>>> >>> program:
>>> >>>
>>> >>> #lang typed/racket
>>> >>> (provide x)
>>> >>> (define: x : Integer 1)
>>> >>>
>>> >>> expands into (greatly simplified):
>>> >>>
>>> >>> #lang ...
>>> >>> (#%provide x)
>>> >>> (begin-for-syntax
>>> >>> (declare #'x Integer-rep))
>>> >>> (define-values (x) 1)
>>> >>>
>>> >>> but what is `Integer-rep`? It needs to be an expression that
>>> >>> _constructs_ the internal Typed Racket representation of the
>>> `Integer`
>>> >>> type. Previously, that looked something like this:
>>> >>>
>>> >>> (make-Union (sort (list Negative-Fixnum-rep Positive-Fixnum-rep
>>> >>> ...)))
>>> >>>
>>> >>> and so on and so forth for the components, all the way down to base
>>> >>> types. You can imagine how this gets quite large, especially for
>>> >>> large types.
>>> >>>
>>> >>> However, this is wasteful, because every Typed Racket program, at
>>> type
>>> >>> checking time, defines a constant that's the representation of the
>>> >>> `Integer` type, right here [1]. So instead of serializing an
>>> >>> expression that constructs the same thing as `-Int`, we can just
>>> >>> *reference* `-Int` in the expanded code. To make that possible,
>>> Typed
>>> >>> Racket now builds a hash table [2] mapping types (really, their
>>> >>> representations) to identifiers that denote those types. Then the
>>> >>> serializer just consults this table [3].
>>> >>>
>>> >>> It turns out that base types (but no others) already used basically
>>> >>> this mechanism, by storing the identifier *in* the type
>>> >>> representation. But that's now obsolete, and thus was removed in my
>>> >>> subsequent commit.
>>> >>>
>>> >>> As a result, the type serialization is much smaller.
>>> >>>
>>> >>> [1]
>>> >>>
>>> https://github.com/plt/racket/blob/master/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/numeric-tower.rkt#L107
>>> >>> [2]
>>> >>>
>>> https://github.com/plt/racket/blob/master/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/base-abbrev.rkt#L23
>>> >>> [3]
>>> >>>
>>> https://github.com/plt/racket/blob/master/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/env/init-envs.rkt#L51
>>> >>>
>>> >>> On Sat, Sep 7, 2013 at 3:20 PM, Neil Toronto <neil.toronto at gmail.com
>>> >
>>> >>> wrote:
>>> >>>>
>>> >>>> On 09/06/2013 04:14 PM, samth at racket-lang.org wrote:
>>> >>>>>
>>> >>>>>
>>> >>>>> 56b372c Sam Tobin-Hochstadt <samth at racket-lang.org> 2013-09-06
>>> 14:22
>>> >>>>> :
>>> >>>>> | Remember types that are defined, and use them in serialization.
>>> >>>>> |
>>> >>>>> | This extends a facility already available for base types,
>>> >>>>> | making that facility no longer strictly needed.
>>> >>>>> |
>>> >>>>> | Shrinks the zo size for the `math` package by almost 1MB.
>>> >>>>> :
>>> >>>>> M .../typed-racket/env/init-envs.rkt | 1 +
>>> >>>>> M .../typed-racket/typecheck/def-export.rkt | 7 +-
>>> >>>>> M .../typed-racket/typecheck/tc-toplevel.rkt | 31
>>> +++---
>>> >>>>> M .../typed-racket/types/abbrev.rkt | 36
>>> +++----
>>> >>>>> M .../typed-racket/types/base-abbrev.rkt | 12 ++-
>>> >>>>> M .../typed-racket/types/numeric-tower.rkt | 108
>>> >>>>> +++++++++----------
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>> Would you mind explaining this a little more? It sounds
>>> interesting, and
>>> >>>> the
>>> >>>> commit almost has my name in it. :)
>>> >>>>
>>> >>>> Neil ⊥
>>> >>>>
>>> >>
>>> >
>>> > _________________________
>>> > Racket Developers list:
>>> > http://lists.racket-lang.org/dev
>>>
>>> _________________________
>>> Racket Developers list:
>>> http://lists.racket-lang.org/dev
>>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/dev/archive/attachments/20130909/b90361e8/attachment-0001.html>