[GHC] #10871: Implement "fat" interface files which can be directly compiled without source (was: Implement "buildable" interface files which can be directly compiled without source)
GHC
ghc-devs at haskell.org
Sat Sep 19 01:57:15 UTC 2015
#10871: Implement "fat" interface files which can be directly compiled without
source
-------------------------------------+-------------------------------------
Reporter: ezyang | Owner: ezyang
Type: feature request | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.11
Resolution: | Keywords: backpack
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Revisions:
-------------------------------------+-------------------------------------
Comment (by ezyang):
Posting a little update about the tiresome root main function: the root
main function is a special implicit binding that is added to Haskell
programs during type checking and serves as the "well known" entry point
to enter a Haskell program. Currently, it is named `:Main.main` (i.e.
`ZCMain_main`): unusually, it is a binding in a Haskell program that can
have a different `Module` than the module actually being compiled.
Because of this, it has to be treated specially when we serialize it out
to an interface file: namely, we have to know /which/ binding is the root
main binding (so it doesn't clobber the user-written main binding), as
interface file serialization doesn't record `Module`, only the `OccName`.
In our last phone call, we proposed two fixes, but I don't think either of
them will work:
1. Move the binding to be injected during tidying, rather than
typechecking. This is tiresome because `main` is to have type `IO a`,
where `a` is anything we want. We'd have to extract out this type to make
a well-formed core binding (this is marginally easier in the typechecker,
where the current code does unification to pull it out.) We are also only
given the `RdrName` of the function which is supposed to be main; we have
to consult the `GlobalRdrEnv` to turn this into an actual `Name`. So we
also have to make sure to preserve this information until the final
tidying so that we can point to the correct main function, which means yet
another thing to record in `ModGuts`. Finally, we can't really eliminate
`checkMain`, since we need to give errors when appropriate. So this is a
large amount of work for a questionable amount of benefit.
2. Rename the main `OccName` to something special, e.g. `$main`, so we can
identify it in the interface file. If we do this, it means the name that
you must refer to for a Haskell program for main, `ZCMain_main_closure`,
has to be renamed to `ZCMain_zdmain_closure`. This is pretty gratuitous
and will break any C-Haskell bridges for no good reason. So I'd like not
to do that.
I think my current plan is to just have a flag in `IfaceBinding` which
says if this is "main" or not, and then we just typecheck it accordingly
one way or another. A small amount of code, no penalty for normal
interface files, and very simple.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10871#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list