|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [MirageOS-devel] [ANN] IPv6 on Mirage!
On 20 Nov 2014, at 14:47, Mark Florisson <mbf24@xxxxxxxxx> wrote:
> This is very cool, so the idea is to have implementation
> modules/packages declare that they implement a certain interface which
> is provided as a separate package, and to have clients link to these
> implementations either through functors or by explicitly resolving a
> package ('cohttp<0.12')?
>
> The system you're proposing sounds like it is trying to provide
> "strong modularity", where implementations depend only on interfaces,
> and not on other implementations. There has been recent work on
> Backpack in Haskell which is trying to provide this with the help of
> basically a package DSL, where dependencies may remain 'abstract' to
> be satisfied by some other package (in ML you'd use functors for
> this).
Right, except we're not proposing this system -- it's already how
Mirage works. A unikernel is parameterised as a functor across Mirage
module types (see the examples in https://github.com/mirage/mirage-skeleton).
The question is how to break up the module types such that we can
assemble them independently of each other as we upgrade the system.
>
> I'm currently working on a module system in the trend of ML, that is
> attempting to provide strong modularity for both packages and modules.
> The main idea is to regard an interface as a specification that is
> independent of any implementation (that either requires or implements
> the functionality). Evolution of these interfaces can then be
> specified explicitly, through a nominal subtype relation between the
> different versions of the interface. Essentially, you can explicitly
> declare that a newer version of an interface is backwards compatible
> with an older one.
>
> Dependency resolution now only looks at interfaces, leaving versioning
> with the job of pinning specific implementations and excluding buggy
> ones. The nominal relation allows you to distinguish between semantic
> changes, as opposed to more superficial structures changes.
>
> Concretely, it uses separate signature packages as you mentioned, e.g.
> cohttp-types. You then have two ways of linking stuff: functors and
> imports. Functors work like
>
> functor MyFunctor (set : SetSig) ...
>
> where SetSig refers to a signature package (in your configuration, you
> might say SetSig=0.1). To then resolve concrete dependencies you do
>
> import HashSet as (set : SetSig, eq : Eq)
>
> grabbing some version of HashSet that is compatible with the
> interfaces SetSig and Eq. Both these constructs are a form of dynamic
> linking. The first allows any compatible version of any
> implementation, the second allows any version of a specific
> implementation. This can be further constrained with versions in
> configuration.
I was nodding along until I saw the "dynamic linking" :-) The import
that you are proposing is a combination of functor application and some
selection of the implementation (in OCaml, this could be done via
OPAM for example).
The mirage frontend tool currently generates a main.ml that does the
functor application, so you could frame it as a program stage rather than
dynamic linking...
-anil
_______________________________________________
MirageOS-devel mailing list
MirageOS-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/mirageos-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |