aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/manual/src/SUMMARY.md.in1
-rw-r--r--doc/manual/src/architecture/architecture.md77
2 files changed, 78 insertions, 0 deletions
diff --git a/doc/manual/src/SUMMARY.md.in b/doc/manual/src/SUMMARY.md.in
index 908e7e3d9..b386aa14b 100644
--- a/doc/manual/src/SUMMARY.md.in
+++ b/doc/manual/src/SUMMARY.md.in
@@ -59,6 +59,7 @@
@manpages@
- [Files](command-ref/files.md)
- [nix.conf](command-ref/conf-file.md)
+- [Architecture](architecture/architecture.md)
- [Glossary](glossary.md)
- [Contributing](contributing/contributing.md)
- [Hacking](contributing/hacking.md)
diff --git a/doc/manual/src/architecture/architecture.md b/doc/manual/src/architecture/architecture.md
new file mode 100644
index 000000000..24150fc2b
--- /dev/null
+++ b/doc/manual/src/architecture/architecture.md
@@ -0,0 +1,77 @@
+# Architecture
+
+This chapter describes how Nix works.
+It should help users understand why Nix behaves as it does, and it should help developers understand how to modify Nix and how to write similar tools.
+
+## Overview
+
+Nix consists of [hierarchical layers].
+
+[hierarchical layers]: https://en.m.wikipedia.org/wiki/Multitier_architecture#Layers
+
+```
++---------------------------------------------------------------+
+| Nix |
+| [ commmand line interface ]------, |
+| | | |
+| evaluates | |
+| | manages |
+| V | |
+| [ configuration language ] | |
+| | | |
+| +----------------------------|-------------------V----------+ |
+| | store evaluates to | |
+| | | | |
+| | referenced by V builds | |
+| | [ build input ] ---> [ build plan ] ---> [ build result ] | |
+| | | |
+| +-----------------------------------------------------------+ |
++---------------------------------------------------------------+
+```
+
+At the top is the [command line interface](../command-ref/command-ref.md), translating from invocations of Nix executables to interactions with the underlying layers.
+
+Below that is the [Nix language](../language/index.md), a [purely functional] configuration language.
+It is used to compose expressions which ultimately evaluate to self-contained *build plans*, used to derive *build results* from referenced *build inputs*.
+
+[purely functional]: https://en.m.wikipedia.org/wiki/Purely_functional_programming
+
+Command line interface and Nix language are what users interact with most.
+
+> **Note**
+> The Nix language itself does not have a notion of *packages* or *configurations*.
+> As far as we are concerned here, the inputs and results of a build plan are just data.
+
+Underlying these is the [Nix store](../glossary.md#gloss-store), a mechanism to keep track of build plans, data, and references between them.
+It can also execute build plans to produce new data.
+
+A build plan is a series of *build tasks*.
+Each build task has a special build input, which is used as *build instructions*.
+The result of a build task can be input to another build task.
+
+> **Important**
+> A build task in Nix is called [derivation](../glossary#gloss-derivation).
+
+```
++----------------------------------------------------------------------------------+
+| store .............................................. |
+| : build plan : |
+| : : |
+| [ build input ]---instructions-, : |
+| : | : |
+| : v : |
+| [ build input ]--------->[ build task ]-instructions-, : |
+| : | : |
+| : v : |
+| [ build input ]---instructions-, [ build task ]--->[ build result ] |
+| : | ^ : |
+| : v | : |
+| [ build input ]--------->[ build task ]--------------' : |
+| : ^ : |
+| : | : |
+| [ build input ]----------------' : |
+| : : |
+| :............................................: |
++----------------------------------------------------------------------------------+
+```
+