Thoughts on the design of External Core

Aaron Tomb atomb at soe.ucsc.edu
Wed Feb 14 19:49:37 EST 2007


Over the last few days, I've put some more thought into the overall  
design of External Core. I looked through some of the GHC code some  
more, and I'm leaning toward a preference for using IfaceSyn  
throughout the whole External Core processing path.

Simon, feel free to digest this at your leisure when you return.

I also welcome feedback from anyone else. I don't assume that either  
of the following lists is complete or fully correct, and would like  
to hear any comments or criticism.

Now, on to what I see as the pros and cons of using the Iface  
infrastructure for all aspects of External Core.

Pros:

* The input segment of this path is largely complete already. It  
needs a little fixing up (some of which I've already done), but the  
general design seems sound.

* The code in HscMain that calls emitExternalCore is in the middle of  
the Iface processing pipeline. So, full Iface information is already  
available. If I understand things correctly, this means that all of  
the code of the current module is already in scope in IfaceSyn  
format. Maybe I'm wrong, though, and only type signatures are fully  
present?

* Though I hear that the Iface typechecker generally assumes the  
absence of errors, the best long-term design decision might be to  
beef it up to the point where it can really tell you what's wrong  
when given ill-typed input. It is an external representation, after  
all. Currently, it's only likely to have come from GHC itself.  
Perhaps in the future other tools will also manipulate .hi files,  
however. Using IfaceSyn for External Core would encourage us to  
improve the typechecker, which would make interfacing with such tools  
more viable.

* It looks like it would be straightforward to pretty-print IfaceSyn  
in ExternalCore format directly. It has almost exactly the same set  
of data constructors as (the old) ExternalCore does. The conversion  
from Core -> Abstract ExternalCore -> Concrete ExternalCore seems  
unnecessary. We could just do IfaceSyn -> Concrete ExternalCore.

Cons:

* If the Iface typechecker is indeed less than helpful in the face of  
errors, it will need to be improved.

* I may be missing complications that would make the picture less  
rosy than I've implied.

* One approach to the architecture of GHC (which I had in mind  
originally) is that all "source code", in whatever format, should  
somehow go through the HsSyn portion of the compiler. Thus, this part  
of the compiler does all of the real error checking, whereas the rest  
can assume certain correctness properties. Using IfaceSyn for  
External Core would violate this architectural assumption.

Aaron



More information about the Glasgow-haskell-users mailing list