Reinstallable - base
Ben Gamari
ben at well-typed.com
Fri Oct 20 10:17:19 UTC 2023
Simon Peyton Jones <simon.peytonjones at gmail.com> writes:
> Dear GHC devs
>
> Given the now-agreed split between ghc-internal and base
> <https://github.com/haskellfoundation/tech-proposals/pull/51>, what stands
> in the way of a "reinstallable base"?
>
> Specifically, suppose that
>
> - GHC 9.8 comes out with base-4.9
> - The CLC decides to make some change to `base`, so we get base-4.10
> - Then GHC 9.10 comes out with base-4.10
>
We thought about this quite a bit at the Well-Typed meeting this week.
In short, I suspect that after the `ghc-internal` split is merged and
some further work we will be able to use multiple `base` versions with
a single compiler version.
I imagine this would be done in roughly three phases. The first two
phases can happen in the short term; the last is a bit further off.
I'll describe these in turn below.
# Phase 1: Reinstallable `base`
Specifically, (in the absence of TH) we need to...
* Give `base` a proper unit ID. This is necessary as GHC may allow
multiple versions of a single package in a single build; under the
status quo this would result in overlapping symbol names.
* Ensure that all known-key and wired-in declarations are placed in
`ghc-internal`, not `base`. This is necessary as wired-in and
known-key declarations are detected by their `Name`, which we cannot
know a priori if `base` has a proper unit ID.
* Teach `Cabal` that `base` is a reinstallable package (`ghc-internal`
will remain non-reinstallable)
* With each GHC version, provide minor releases of `base` which can be
built against the new GHC's `ghc-internal`
With this done, we can offer (limited) compatibility across GHC/`base`
version pairs. Naturally, changes in semantics of things defined in
`ghc-internal` will make general compatibility difficult or impossible.
However, Simon suggests, limited compatibility is much better than the
status quo.
# Phase 2: Template Haskell
The above story is made considerably messier by `template-haskell`.
Specifically, `template-haskell` depends upon `base`. Typically (i.e.
when not using the external interpreter) values (e.g., splice results)
are communicated between the splice and the compiler as heap objects;
since these heap objects may be of types defined in `base` we must
guarantee that `template-haskell` and `ghc` are built against the same
`base` ABI. Since GHC doesn't have a notion of ABI stability, this would
render reinstallable `base` unusable for a majority of programs.
The first step to fixing this would be to eliminate the ABI dependency
between `template-haskell` and `ghc`. We can do this by either:
* using the external interpreter (`-fexternal-interpreter`), in which
case splice results are communicated by serialisation
* teaching the internal interpreter to communicate using the same
serialisation mechanism used in the external interpreter
However, `template-haskell` suffers from the same problem as `base` in
that it contains definitions of known-key declarations. For this reason,
we must apply the same approach that we used in `base` above, moving all
known-key definitions into a new `template-haskell-internal` package
against which `template-haskell` can link.
At this point we can teach `Cabal` that `template-haskell` can be
reinstalled and users will be able to build packages using
`TemplateHaskell` while linking against arbitrary `base` versions.
# Phase 3: Compatibility across `template-haskell` versions
One of the major compatibility headaches of moving between GHC versions
is accommodating changes in the `template-haskell` package. While there
are various interface-level changes which we can use to alleviate some
of this pressure (#20828, #24021), being able to provide compatibility
with multiple `template-haskell` versions would be very convenient.
Once we have split `template-haskell-internal` and `template-haskell`,
we can potentially use a similar approach to that proposed above:
support for multiple `template-haskell` major versions can be provided
for each compiler.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 487 bytes
Desc: not available
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20231020/8ef172e2/attachment.sig>
More information about the ghc-devs
mailing list