1 | ---
|
2 | in_progress: true
|
3 | ---
|
4 |
|
5 | Notes on Oils Architecture
|
6 | ===========================
|
7 |
|
8 | This doc is for contributors or users who want to understand the Oils codebase.
|
9 | These internal details are subject to change.
|
10 |
|
11 | <div id="toc">
|
12 | </div>
|
13 |
|
14 | ## Links
|
15 |
|
16 | - [Contributing][] (wiki) helps you change the code for the first time.
|
17 | - [README](oils-repo/README.html) describes how the code is organized.
|
18 | - [Interpreter State](interpreter-state.html) describes the interpreter's user-facing data
|
19 | structures.
|
20 | - [Parser Architecture](parser-architecture.html)
|
21 | - [OSH Word Evaluation Algorithm][word-eval] (wiki) describes shell's complex
|
22 | word evaluation. Oils uses [Simple Word Evaluation](simple-word-eval.html)
|
23 | instead.
|
24 |
|
25 | [Contributing]: https://github.com/oilshell/oil/wiki/Contributing
|
26 | [word-eval]: https://github.com/oilshell/oil/wiki/OSH-Word-Evaluation-Algorithm
|
27 |
|
28 | ## Source Code
|
29 |
|
30 | ### Build Dependencies
|
31 |
|
32 | - Essential: [libc]($xref)
|
33 | - Optional: GNU [readline]($xref) (TODO: other line editing libraries).
|
34 | - Only in the OVM build (as of March 2020): [yajl]($xref)
|
35 |
|
36 | ### Borrowed Code
|
37 |
|
38 | - [ASDL]($oils-src:asdl/) front end from [CPython]($xref:cpython) (heavily
|
39 | refactored)
|
40 | - [frontend/tdop.py]($oils-src): Adapted from tinypy, but almost no original code
|
41 | remains
|
42 | - [pgen2]($oils-src:pgen2/)
|
43 | - All of OPy (will be obsolete)
|
44 | - compiler2 from stdlib
|
45 | - byterun
|
46 | - Build Dependency: [MyPy]($xref:mypy)
|
47 |
|
48 | ### Metaprogramming / Generated Code
|
49 |
|
50 | - Try `ls */*_def.py */*_gen.py`
|
51 | - The `def.py` files are abstract definitions. They're not translated by
|
52 | [mycpp]($xref).
|
53 | - The `gen.py` files generate source code in Python and C++ from these
|
54 | definitions.
|
55 | - For example, we define the core `Id` type and the lexing rules abstractly.
|
56 | - *TODO: Details on each `def` / `gen` pair*.
|
57 | - See [build/dev.sh]($oils-src) and [build/codegen.sh]($oils-src)
|
58 |
|
59 |
|
60 | ## Other Cross-Cutting Observations
|
61 |
|
62 | ### Where $IFS is Used
|
63 |
|
64 | - Splitting of unquoted substitutions
|
65 | - The [read]($help) builtin
|
66 | - To split words in `compgen -W` (bash only)
|
67 |
|
68 | ### Shell Function Callbacks
|
69 |
|
70 | - Completion hooks registered by `complete -F ls_complete_func ls`
|
71 | - bash has a `command_not_found` hook; OSH doesn't yet
|
72 |
|
73 | ### Where Unicode is Respected
|
74 |
|
75 | See the doc on [Unicode](unicode.html).
|
76 |
|
77 | ### Parse-time and Runtime Pairs
|
78 |
|
79 | In OSH:
|
80 |
|
81 | - `echo -e '\x00\n'` and `echo $'\x00\n'` (OSH shares lexer rules between them)
|
82 | - `test` / `[` and `[[` (OSH shares the parser and evaluator)
|
83 | - Static vs. Dynamic Assignment. `local x=$y` vs. `s='x=$y'; local $s`.
|
84 | - All shells have both notions!
|
85 |
|
86 | Other Pairs:
|
87 |
|
88 | - `expr` and `$(( ))` (`expr` not in shell)
|
89 | - Later:
|
90 | - [printf]($help) can have a static variant like `${myfloat %.3f}`
|
91 | - `find` and our own language (although this may be done with blocks)
|
92 |
|
93 | ## State Machines
|
94 |
|
95 | - `$IFS` splitting in `osh/split.py`
|
96 | - [compadjust]($help) needs to split partial `argv` by user-defined delimiters,
|
97 | e.g. `:=`
|
98 |
|
99 | The point of a state machine is to make sure all cases are handled!
|
100 |
|
101 | <!--
|
102 | Idea:
|
103 | - Model the prompt state and completion as a state machine (?)
|
104 | - vtparse is another good example
|
105 | -->
|
106 |
|
107 | ## Error Locations and Fallbacks
|
108 |
|
109 | - `ExecuteAndCatch` uses mem.CurrentLocation()
|
110 | - `Failglob` uses mem.CurrentLocation()
|
111 | - `mem.GetVar $LINENO` uses `current_tok`, but it can be buggy
|
112 | - this is difference than `BASH_LINENO`, which is for the call stack!
|
113 |
|
114 | Other:
|
115 |
|
116 | - `ui.ctx_Location`
|
117 | - So builtins can call `errfmt.Print_()` without locations
|
118 | - `alloc.ctx_SourceCode` for assigning `source_t` to tokens
|
119 |
|
120 | ## Other Topics
|
121 |
|
122 | - [Dependency Injection]($xref:dependency-injection)
|
123 |
|