[racket-dev] [plt] Push #27446: master branch updated

From: Sam Tobin-Hochstadt (samth at cs.indiana.edu)
Date: Mon Sep 9 13:57:49 EDT 2013

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 ⊥
>>>
>


Posted on the dev mailing list.