mirror of
https://github.com/nim-lang/Nim.git
synced 2026-01-10 15:04:59 +00:00
* reworked ID handling * the packed AST now has its own ID mechanism * basic serialization code works * extract rodfiles to its own module * rodfiles: store and compare configs * rodfiles: store dependencies * store config at the end * precise dependency tracking * dependency tracking for rodfiles * completed loading of PSym, PType, etc * removed dead code * bugfix: do not realloc seqs when taking addr into an element * make IC opt-in for now * makes tcompilerapi green again * final cleanups Co-authored-by: Andy Davidoff <github@andy.disruptek.com>
42 lines
1.5 KiB
ReStructuredText
42 lines
1.5 KiB
ReStructuredText
====================================
|
|
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.
|
|
|
|
|
|
|
|
Global state
|
|
------------
|
|
|
|
Global persistent state will be kept in a project specific `.rod` file.
|
|
|
|
Rod File Format
|
|
---------------
|
|
|
|
It's a simple binary file format. `rodfiles.nim` contains some details.
|