summary refs log tree commit diff stats
path: root/compiler/ic/design.rst
blob: 1a33f6a27b783cc9fb018f17442eb8703728d9a7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
====================================
  Incremental Recompilations
====================================

We split the Nim compiler into a frontend and a backend.
The frontend produces a set of `.rod` files. Every `.nim` module
produces its own `.rod` file.

- The IR must be a faithful representation of the AST in memory.
- The backend can do its own caching but doesn't have to.
- We know by comparing 'nim check compiler/nim' against 'nim c compiler/nim'
  that 2/3 of the compiler's runtime is spent in the frontend. Hence we
  implement IC for the frontend first and only later for the backend. The
  backend will recompile everything until we implement its own caching
  mechanisms.

Advantage of the "set of files" vs the previous global database:
- By construction, we either read from the `.rod` file or from the
  `.nim` file, there can be no inconsistency. There can also be no
  partial updates.
- No dependency to external packages (SQLite). SQLite simply is too
  slow and the old way of serialization was too slow too. We use a
  format designed for Nim and expect to base further tools on this
  file format.

References to external modules must be (moduleId, symId) pairs.
The symbol IDs are module specific. This way no global ID increment
mechanism needs to be implemented that we could get wrong. ModuleIds
are rod-file specific too.


Configuration setup changes
---------------------------

For a MVP these are not detected. Later the configuration will be
stored in every `.rod` file.


Global state
------------

Global persistent state will be kept in a project specific `.rod` file.