diff options
Diffstat (limited to 'misc/compile_time_execution_problems.md')
| -rw-r--r-- | misc/compile_time_execution_problems.md | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/misc/compile_time_execution_problems.md b/misc/compile_time_execution_problems.md new file mode 100644 index 000000000..8cfeca4e4 --- /dev/null +++ b/misc/compile_time_execution_problems.md @@ -0,0 +1,55 @@ +# Compile Time Execution Problems (Metaprogramming) +2016-11-02 + +## Memory and Types + +Compile time execution (CTE) is a stage of the compiler which runs any Odin code the +user requests before the creation of the executable. The data modified and generated +by this stage will be used as the initialization data for the _compiled_ code. + +The CTE stage is an interpreter running the generated _single static assignment_ (SSA) +tree for the requested code. When using the memory generated by the interpreter for the +compiled code, there are a few problems. The main problem being: pointers will point +to invalid memory addresses. This is becaused the memory space of the interpreter is +completely different to the memory space of the executable (compiled code). + +The table below presents which data types are safe for transferal and which are not. + +Key: + +* Y - Yes +* N - No +* D - Dependent on elements +* ? - Highly depends on a lot of factors (most likely no) + +| Type | Safe? | +|-----------|------------------------------------------------------------------------| +| boolean | Y | +| integer | Y | +| float | Y | +| pointer | N - Maybe safe if never changed | +| string | Y - Even though (ptr+int) interally, still safe to convert to constant | +| any | N - (ptr+ptr) | +| array | D | +| vector | Y - Elements can only be boolean, integer, or float (thus safe) | +| slice | N - Internally (ptr+int+int) | +| maybe | D | +| struct | D | +| enum | Y | +| union | N - (blob+int) | +| raw_union | N - ^^^ | +| tuple | D | +| proc | ? - Need to solve the next problem | + + +## Calling procedures (external and internal) + +If all the procedures are only from within the code itself, i.e. not a loaded pointer, +then it is "safe". However, calling external procedures and passing procedures from the +interpreter to external programs _will_ cause problems as many of the procedures are not +stored in _real_ memory. This causes numerous problems. + +**TODO:** + +* Look at how other languages solve this problem (e.g. LUA) +* ??? |