TVL depot development (mail to depot@tvl.su)
 help / color / mirror / code / Atom feed
* Tvix code structure
@ 2023-01-30  7:27 Vincent Ambo
  2023-01-31 11:01 ` Florian Klink
  0 siblings, 1 reply; 3+ messages in thread
From: Vincent Ambo @ 2023-01-30  7:27 UTC (permalink / raw)
  To: depot

We should start thinking about how to clean up the code structure of 
Tvix, some things are a bit ad-hoc. It's not a problem right now, and 
not something we need to fix in the next week or so, but something to 
keep in the back of our minds.

Tvix currently consists of the following subprojects:

* //tvix/eval: Language evaluator with no knowledge about building, 
dependencies and so on. It is just an implementation of the Nix 
language, the pure builtins, and some generalised impure builtins behind 
the `EvalIO` interface.

* //tvix/serde: Implementation of a serde::Deserializer using 
//tvix/eval to deserialise Rust data structures from Nix code. Can be 
used for e.g. tools that use configuration files written in Nix.

* //tvix/derivation: Implementation of data structures for the Nix 
derivation concept, and serialisation (to ATerm)/validation logic.

* //tvix/nar: A serialiser for the NAR archive format (*not* a 
deserialiser).

* //tvix/nix_cli: C++ Nix compatibility CLI, using clap to parse the 
same argument structure as C++ Nix. This is not wired up to anything 
right now.

* //tvix/proto: Evaluator proto only, not used at the moment.

* //tvix/store: Protobuf for stores, and initial implementation of the 
store service. However, also contains types like `StorePath` which are 
used in different places.

* //tvix/cli: Currently, Tvix REPL implementation and the place where 
things like `builtins.derivation` are implemented. Currently depends on 
almost everything from above (including e.g. the store *service*!)

I want the language evaluator to be independent from any build-related 
concerns (so that the language can be used for other use-cases). That 
means that //tvix/eval should never depend on any of the crates 
implementing C++ Nix concepts, should not "know" about derivations (more 
than where absolutely necessary for correct functioning of the language, 
e.g. printing values) and so on. For this reason I've been resisting 
putting things like `builtins.derivation` into eval.

At the same time, putting it into a crate called "cli" also feels wrong. 
There's also clearly a bug in that //tvix/store implements a service, 
and exports a widely used type, and that ends up dragging in hundreds 
(!) of dependencies on any crate using that type.

My current thinking is that what we actually want is something like this:

* //tvix/eval: as above
* //tvix/serde: as above
* //tvix/nix-compat: types and logic related to compatibility with C++ 
Nix: NARs, derivations, store paths and so on.
* //tvix/store: store backend (!) implementation
* //tvix/cli: REPL and CLI interface tying the above together

This would involve merging the nar and derivation crates, and moving the 
store path logic in there, too, to create the nix-compat crate.

Doing this would also allow us to have a clear boundary where it's 
visible what is legacy from C++ Nix, and show where we have the ability 
to come up with substitute concepts (or decide that that is not necessary).

Any thoughts are welcome!

//V

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Tvix code structure
  2023-01-30  7:27 Tvix code structure Vincent Ambo
@ 2023-01-31 11:01 ` Florian Klink
  2023-01-31 11:11   ` Florian Klink
  0 siblings, 1 reply; 3+ messages in thread
From: Florian Klink @ 2023-01-31 11:01 UTC (permalink / raw)
  To: Vincent Ambo; +Cc: depot


>We should start thinking about how to clean up the code structure of 
>Tvix, some things are a bit ad-hoc. It's not a problem right now, and 
>not something we need to fix in the next week or so, but something to 
>keep in the back of our minds.

Agreed! I'm not too happy with the current structure either, but
we discovered some things as we went.

For example, implementing `builtins.derivation` in a nixcpp-compatible
way, with all the ATerm hashing needed way less store interaction than
we initially thought.
So it's only normal this did grow a bit organically :-)

>Tvix currently consists of the following subprojects:
>
>* //tvix/eval: Language evaluator with no knowledge about building, 
>dependencies and so on. It is just an implementation of the Nix 
>language, the pure builtins, and some generalised impure builtins 
>behind the `EvalIO` interface.
>
>* //tvix/serde: Implementation of a serde::Deserializer using 
>//tvix/eval to deserialise Rust data structures from Nix code. Can be 
>used for e.g. tools that use configuration files written in Nix.
>
>* //tvix/derivation: Implementation of data structures for the Nix 
>derivation concept, and serialisation (to ATerm)/validation logic.
>
>* //tvix/nar: A serialiser for the NAR archive format (*not* a 
>deserialiser).

Not yet. If we were to implement nar-bridge in Rust as well (or speak
the nix daemon protocol for `ssh-ng://`), we'd also need to add a reader
here.

>
>* //tvix/nix_cli: C++ Nix compatibility CLI, using clap to parse the 
>same argument structure as C++ Nix. This is not wired up to anything 
>right now.
>
>* //tvix/proto: Evaluator proto only, not used at the moment.
>
>* //tvix/store: Protobuf for stores, and initial implementation of the 
>store service. However, also contains types like `StorePath` which are 
>used in different places.
>
>* //tvix/cli: Currently, Tvix REPL implementation and the place where 
>things like `builtins.derivation` are implemented. Currently depends 
>on almost everything from above (including e.g. the store *service*!)

Yeah, `//tvix/store` is pulled in because `StorePath` lives in there,
and that is used by `//tvix/derivation`.

>I want the language evaluator to be independent from any build-related 
>concerns (so that the language can be used for other use-cases). That 
>means that //tvix/eval should never depend on any of the crates 
>implementing C++ Nix concepts, should not "know" about derivations 
>(more than where absolutely necessary for correct functioning of the 
>language, e.g. printing values) and so on. For this reason I've been 
>resisting putting things like `builtins.derivation` into eval.

I'd be very careful with this until we are able to evaluate nixpkgs a
bit further - and confirm we actually don't need any more complicated
string context tracking. If we would need it, it might become a bit more
of a "language feature" and creep into `//tvix/eval`.

>At the same time, putting it into a crate called "cli" also feels 
>wrong.

We also don't do any of the "eval tests" for anything
derivation-related, which is a bummer. I'm still a bit on the fence on
whether this should be a separate, feature-gated module in
`//tvix/eval`, or a separate crate.

>There's also clearly a bug in that //tvix/store implements a 
>service, and exports a widely used type, and that ends up dragging in 
>hundreds (!) of dependencies on any crate using that type.

As I said, that's mostly due to `//tvix/derivation` pulling in
`//tvix/store` via `StorePath`, and `//tvix/store` being a bit of a
monolith right now (no proper separation between client code and
server implementations).

>My current thinking is that what we actually want is something like this:
>
>* //tvix/eval: as above
>* //tvix/serde: as above
>* //tvix/nix-compat: types and logic related to compatibility with C++ 
>Nix: NARs, derivations, store paths and so on.
>* //tvix/store: store backend (!) implementation
>* //tvix/cli: REPL and CLI interface tying the above together
>
>This would involve merging the nar and derivation crates, and moving 
>the store path logic in there, too, to create the nix-compat crate.

>
>Doing this would also allow us to have a clear boundary where it's 
>visible what is legacy from C++ Nix, and show where we have the 
>ability to come up with substitute concepts (or decide that that is 
>not necessary).

Even with different concepts for calculating output paths, I'd still
assume our store paths will probably look very similar, and we might
need to end up keeping other functionality too.

I'd be more in favor of keeping `derivation` and `nar` a separate crate
for now. I'll send a CL splitting out `StorePath` from `//tvix/store`,
that should solve the immediate concerns w.r.t. things pulled into eval
directly.

We can make sure we split things up further once we get to actually
talking to the store from nix-compat or cli (as a client).

flokli

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Tvix code structure
  2023-01-31 11:01 ` Florian Klink
@ 2023-01-31 11:11   ` Florian Klink
  0 siblings, 0 replies; 3+ messages in thread
From: Florian Klink @ 2023-01-31 11:11 UTC (permalink / raw)
  To: Vincent Ambo; +Cc: depot

>>My current thinking is that what we actually want is something like this:
>>
>>* //tvix/eval: as above
>>* //tvix/serde: as above
>>* //tvix/nix-compat: types and logic related to compatibility with 
>>C++ Nix: NARs, derivations, store paths and so on.
>>* //tvix/store: store backend (!) implementation
>>* //tvix/cli: REPL and CLI interface tying the above together
>>
>>This would involve merging the nar and derivation crates, and moving 
>>the store path logic in there, too, to create the nix-compat crate.
>
>>
>>Doing this would also allow us to have a clear boundary where it's 
>>visible what is legacy from C++ Nix, and show where we have the 
>>ability to come up with substitute concepts (or decide that that is 
>>not necessary).
>
>Even with different concepts for calculating output paths, I'd still
>assume our store paths will probably look very similar, and we might
>need to end up keeping other functionality too.
>
>I'd be more in favor of keeping `derivation` and `nar` a separate crate
>for now. I'll send a CL splitting out `StorePath` from `//tvix/store`,
>that should solve the immediate concerns w.r.t. things pulled into eval
>directly.
>
>We can make sure we split things up further once we get to actually
>talking to the store from nix-compat or cli (as a client).

Alright, I tried this, but obviously nixbase32 is a dependency on
StorePath.

Let's put both these things in `nix-compat`, but let's make sure this
stays a library-only crate. Having CLI entrypoints there would be
confusing.

I'll leave a potential move of `//tvix/derivation` and `//tvix/nar` to
there as a followup, I need to think a bit more about the ergonomics.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-01-31 11:11 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-01-30  7:27 Tvix code structure Vincent Ambo
2023-01-31 11:01 ` Florian Klink
2023-01-31 11:11   ` Florian Klink

Code repositories for project(s) associated with this public inbox

	https://code.tvl.fyi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).