source: doc/proposals/modules-alvin/examples/graph/info.md@ c536f9d

Last change on this file since c536f9d was 7640ff5, checked in by Alvin Zhang <alvin.zhang@…>, 2 months ago

add graph example for modules proposal

  • Property mode set to 100644
File size: 3.6 KB
Line 
1Features:
2* Struct, function (no inline), variables
3 * The only definition we need to handle exporting here is struct. typedef, traits, forall, inline functions, we'll look into those later
4 * Also no `export import` (ie. modules that export other module's contents automatically)
5* int, int*, const int
6 * No extra built-in types considered here
7* No `#include`
8 * No manual control over headers demonstrated in example, everything handled in `module`, `import`, `export`
9* No forward decls
10 * All definitions within modules, with declarations automatically hoisted to the top
11 * Note: this requires top-level declarations to be context-free
12
13Stylistic choices:
14* `module;` doesn't specify a namespace (prefix with file path)
15* folder files like `graph.cfa` are outside their folders (simplifies the import file discovery algorithm)
16* `import` uses no quotes/angle brackets (unlike `#include`)
17* `import` automatically opens the namespace (keeping it closed can be tricky with transitive dependencies)
18* `stdio` and other standard C libraries have `import` versions
19* `main.cfa` is not a module (avoid module namespacing interfering with `main()` symbol discovery)
20
21Step-by-step:
22* `0_initial` is the code that is written by the developer
23 * Note how modules seem to have circular dependencies (eg. `graph/node.c` imports `graph/edge.c` and vice versa)
24 * Top-level declarations within modules can also be declared out-of-order (eg. using `a` before `const int a = 4;`)
25* `1_size_analysis` describes a mechanism for figuring out sizes and alignments of types
26 * There could also be an attribute system for indicating a desired size and alignment for a given type (not shown here)
27* `2_tshell` generates the type shell headers
28 * These allow importers to avoid unnecessary dependencies to other modules
29 * eg. if module `A` imports `B`, and `B` imports `C`, then a change to a function in `C` should not cause `A` to recompile
30* `3_export` generates the headers that are imported
31 * Type shells are used in the functions, variables, type definitions
32 * The actual type comes with an implicit zero-cost conversion between it and its type shell
33 * Also note an expansion of the constant `max_edges_per_node` in `graph/node__export.h`
34* `4_impl` generates the implementations
35 * Insert conversions whenever fields of a type are accessed (read or write, though constructors are tricky)
36 * Note that type-punning (eg. `(*(struct S*)&a)`) may not be safe due to [strict aliasing](https://cellperformance.beyond3d.com/articles/2006/06/understanding-strict-aliasing.html) and size/alignment rules not being enforced by the spec
37 * I also don't think I caught every cast (it's enough to compile)
38 * We also move constants and type definitions not already in `__export.h` to the top, as well as adding function declarations
39 * This is what allows top-level declarations to be out-of-order
40* `5_tweaking` alters the library imports to make it compile
41 * ie. `#include <stdio.h>` instead of `#include <stdio__export.h>`
42
43Advanced considerations:
44* No private fields, though opaque types can be made
45* Hoisting occuring at top-level, what about within functions?
46* How does update logic work?
47* No module interface logic here (ie. strong module split)
48* How much of compilation is centrally controlled (ie. by a file that keeps track of the entire project's dependencies)?
49 * `__tshell.h` changes every time a new type is added, but a central file can check if importing files actually need recompilation
50* Extra details: How to perform a unity build? Static/dynamic library generation and management?
51* Aside: Uniform function call syntax
Note: See TracBrowser for help on using the repository browser.