Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
GHC
GHC
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 4,273
    • Issues 4,273
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
    • Iterations
  • Merge Requests 413
    • Merge Requests 413
  • Requirements
    • Requirements
    • List
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
  • Security & Compliance
    • Security & Compliance
    • Dependency List
    • License Compliance
  • Operations
    • Operations
    • Incidents
    • Environments
  • Analytics
    • Analytics
    • CI / CD
    • Code Review
    • Insights
    • Issue
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • Glasgow Haskell Compiler
  • GHCGHC
  • Issues
  • #17843

Closed
Open
Opened Feb 17, 2020 by John Ericson@Ericson2314Developer

Post type-checking interface files

Motivation

#14095 proposes we parallelize ghc --make to start type-checking downstream modules as soon as upstream ones are type checked (as opposed to fully compiled).

But, just doing this for ghc --make would be yet more drifting apart between the batch and one-shot modes, which is bad because it just increases a very hard to test surface area, and because it unfairly puts ghc --make alternatives at a disadvantage. [N.B. The ghc --make code is also quite hairy and the alternatives are in many case more principled implementation which we ought to foster as potential ghc --make replacements.]

We need file to convey the bare minimum interface of a module that's enough to type-check downstream modules.

Proposal

I think it would be good to write hi-tc modules in all cases with this information. We already write a regular interface file after type checking for backpack and hs-boot files, during which we can write a sort of "bare minimum" interface file similar to what is doing with no optimization. This would, at a bare minimum, be doing that in all cases. @bgamari points out in !2603 (comment 253208) in however that writing a file twice in one ghc --make invocation has loads of issues, especially on windows where it cannot be done atomicly.

The better alternative is to just write a different file. This avoids all the race conditions and unportability traps, while also working for build systems which don't do enough sandboxing for file mutation to be transformed into something better. Also, there is already a notion of a ModIface vs PartialModIface, which we also may someday wish to expose in the form of multiple files on disk.

Comparison to "fat" or extended dinterface files

#10871 proposes "fat" interface files, containing enough core to resume compilation. !1740 (closed) proposes arbitrary extra information in interface files. This proposal complements writing down more information, as those processes enable. Most build systems don't support "intermediate" build projects in that no dependency consumes the output of a build step until it terminates. In that case, to take advantage of the parallelism #14095 we'd want to write down both the interface, to enable downstream type checking as soon as possible, and module implementation, to be able to resume compilation were we left off in a downstream build step. Crucially, it is still good to keep those in separate files so the downstream modules aren't needlessly rebuilt when the implementation, but not interface, of the upstream module is rebuilt.

CC @osa1 @michaelpj @JoshMeredith

Edited Feb 17, 2020 by John Ericson
Assignee
Assign to
None
Milestone
None
Assign milestone
Time tracking
None
Due date
None
Reference: ghc/ghc#17843