9708f3fa1dd9c4d2b79a300de99076a8e5437171
[mes.git] / HACKING
1 -*-mode:org-*-
2
3 * SETUP
4     guix environment -l guix.scm     #64 bit + 32bit
5     guix environment --system=i686-linux -l guix.scm #32 bit only
6 * BUILD
7 There are two major modes to build Mes: true bootstrap and
8 development.
9
10 ** DEVELOPMENT BUILD
11 To help development we assume ./configure sets these variables for make
12
13    CC    -- gcc
14    CC32  -- i686-unknown-linux-gnu-gcc (or on x86, also gcc)
15    GUILE -- guile
16    MES   -- unset
17
18 Mes is supposed to serve as a full equivalent for GUILE, however mes is much, much
19 slower than guile.  That's why we usually don't use mes during development.
20
21 gcc is used to verify the sanity of our C sources.
22
23 i686-unknown-linux-gnu-gcc is used to compare hex/assembly, to test
24 the gcc variant of mlbic: mlibc/libc-gcc.c and steal ideas.
25
26 guile is used to develop mescc, the C compiler in Scheme that during
27 bootstrapping will be executed by mes.
28
29 ** BOOTSTRAP BUILD
30 In bootstrap mode, we don't have gcc (CC), we don't have pa 32 bit gcc
31 (CC32), we have no guile (GUILE)...but we should have a bootstrap mes
32 (MES).  FIXME.
33
34 mes is built from src/*.c and some out/src/*.h files that are snarfed from
35 src/*.c by build-aux/mes-snarf.scm.
36
37 Also, during bootstrap we don't have make.  Running `make build-scripts'
38 generates several recipies of sh build scripts in out/.
39
40 * ROADMAP
41 ** TODO 
42 *** release 0.8
43   - produce ELF_sym and ELF_str tables from hex2; nicer for objdump -d, gdb
44 *** release 0.x, unsorted
45   - simplify [at least the bootstrap] build process.
46   - seamless connection to stage0.
47   - mescc: compile tcc.c.
48   - mescc: support unsigned comparison, arithmetic.
49   - mescc: support bitfields.
50   - mescc: support unions.
51   - mescc: support anonymous unions.
52   - mescc: refactor compiler.mes, esp. (decl ..) bits.
53   - rewrite src/mes.c in stage0's stage2 LISP.
54   - and/or: rewrite src/mes.c in [annotated] assembly.
55   - and/or: rewrite src/mes.c in annotated hex2.
56   - and/or: connect to GNU Epsilon's VM
57   - and/or: compile Scheme to C, rewrite Mes.c into Mes.scm.
58   - real module support, bonus for supporting Guile's define-module/define-public syntax
59   - get full source syntax-case up (Andre van Tonder?) OR drop
60     psyntax/syntax-case and rewrite Nyacc without syntax-case+R7RS Ellipsis
61   - support regexp OR rewrite Nyacc without regexps
62   - split-off Guile C compiler as standalone Guile project, still
63     respecting no-syntax-case bootstrap requirement
64 *** Compile the [[https://en.wikipedia.org/wiki/Tiny_C_Compiler][Tiny C Compiler]]
65   - build tcc (tinycc)
66 *** release 1.0
67   - work to replace GuixSD's bootstrap binaries for x86
68   - more architectures?
69 ** DONE
70 ** 0.7: Mescc supports -E, -c, -o options, include more complete set of header files,
71 enough to work on compiling tinycc's tcc.c albeit a somewhat modified version.
72 ** 0.6: Work with unmodified, unbundled Nyacc; compile 33/55 tinycc's tests/test2 suite.
73 ** 0.5: Mutual self-hosting Scheme interpreter and C compiler: mes.c and mescc,
74         Support call-with-current-continuation, refactor catch/throw
75 ** 0.4: Support Nyacc, Gcc-compiled Mes compiles minimal main.c using nyacc
76 ** 0.3: Garbage collector
77 ** 0.2: Support psyntax
78 ** 0.1: Mes eval/apply feature complete; support syntax-rules, compile main.c using LALR, dump ELF
79
80 * Bugs
81 ** eval_apply/gc + Nyacc bug
82 scripts/messc.mes intermittently exposes a bug in eval_apply/gc when
83 Nyacc parses mes.c-sized source.  Running 
84
85     MES_MAX_ARENA=<another-size> scripts/mescc.mes
86
87 may [un]cover the bug.  So there is probably some eval_apply-construct
88 that Nyacc uses, possiblby indirectly via with-fluid, like (call/cc,
89 call-with-current-continuation), that breaks when GC triggers at the
90 wrong time.
91 ** mescc can only compile itself, it cannot compile tcc, gcc or guile
92 ** mes.mes cannot read sexps, only --dump's, mes.mes cannot --dump
93 ** Bootstrap binary mes is too big and opaque to be considered source
94 68kB ELF binary which can be disassembled (objdump -d mes.mes).
95 ** Psyntax is too big and opaque to be considered source
96 And needs a patched Guile-1.8 to [re]generate.
97 ** test/match.test ("nyacc-simple"): hygiene problem in match
98 ** Performance
99 *** mes is slow
100 *** The Scheme reader is very slow.
101 *** mescc is slow
102 **** compiling mes.c takes mescc.mes 2h30'
103 mescc.scm which runs on Guile takes 30"
104 ** Fluids are a hack for Nyacc.
105 *** Translate C-prototype mes.c into annotated hex?
106 One idea is to use OriansJ's amazing self-hosting [[https://github.com/oriansj/stage0][stage0]] hex assembler
107 and minimal bootstrap binaries and rewrite the mes.c core to directly
108 bootstrap into Scheme.
109
110 *** Rewrite mes.c in Schemy/Sexp-C and generate annotated hex?
111 Another idea (thanks Rutger!) is to rewrite the mes.c core in a s-exp
112 C/Assembly variant and thave mescc produce the simple, annotated
113 bootstrap binary.
114
115 *** Compile the [[https://en.wikipedia.org/wiki/Tiny_C_Compiler][Tiny C Compiler]]
116
117 ** Build tools do not run on mes
118 *** configure needs Bash, Guile
119 *** GNUmakefile needs Bash, Guile
120 *** build-aux/mes-snarf.scm needs Guile
121 *** build-aux/git-changelog needs Perl
122 * OLD: Booting from LISP-1.5 into Mes
123
124 Mes started out experimenting with booting from a hex-coded minimal
125 LISP-1.5 (prototype in mes.c), into an almost-RRS Scheme.
126
127 When EOF is read, the LISP-1.5 machine calls loop2 from loop2.mes,
128 which reads the rest of stdin and takes over control.  The functions
129 readenv, eval and apply-env in mes.mes introduced define, define-macro
130 quasiquote and macro expansion.
131
132 While this works, it's amazingly slow.  We implemented a full reader
133 in mes.c, which makes running mes:apply-env mes:eval somewhat
134 bearable, still over 1000x slower than running mes.c.
135
136 Bootstrapping has been removed and mes.c implements enough of RRS to
137 run a macro-based define-syntax and syntax-rules.
138
139 loop.mes and mes.mes are unused and lagging behind.  Probably it's not
140 worth considering this route without a VM.  GNU Epsilon is taking the
141 more usual VM-route to provide multiple personas.  While that sounds
142 neat, Lisp/Scheme, bootstrapping and trusted binaries are probably not
143 in scope as there is no mention of such things; only ML is mentioned
144 while Guile is used for bootstrapping.
145
146 * Assorted ideas and info 
147 ** Using GDB on assembly/a.out
148 info registers
149 p/x $eax
150 p/x $edx
151 set disassemble-next-line
152 gdb-display-disassembly-buffer
153 b *0x804a79d
154 ** Create memory dump with 32 bit Gcc compiled Mes
155 make out/i686-unknown-linux-gnu-mes
156 out/i686-unknown-linux-gnu-mes --dump < module/mes/read-0.mes > module/mes/read-0-32.mo
157 ** C parser/compiler
158 *** [[https://savannah.gnu.org/projects/nyacc][nyacc]]
159 *** PEG: [[http://piumarta.com/software/peg/][parse C using PEG]]
160 *** [[https://en.wikipedia.org/wiki/Tiny_C_Compiler][Tiny C Compiler]]
161 *** [[http://www.t3x.org/subc/index.html][Sub C]]
162 *** [[https://groups.google.com/forum/#!topic/comp.lang.lisp/VPuX0VsjTTE][C intepreter in LISP/Scheme/Python]]
163
164 ** C assembler/linker
165 *** [[http://www.tldp.org/HOWTO/Assembly-HOWTO/linux.html][Assembly HOWTO]]
166 *** ELF
167 7f 45 4c 46
168 *** [[http://www.muppetlabs.com/~breadbox/software/tiny/][Small ELF programs]]
169 *** [[http://www.cirosantilli.com/elf-hello-world/][Elf hello world]]
170 ** SC - c as s-expressions
171 sc: http://sph.mn/content/3d3
172 ** RNRS
173 *** [[http://www.scheme-reports.org/][Scheme Reports]] 
174 *** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-349.pdf][Scheme - Report on Scheme]]
175 *** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-452.pdf][RRS - Revised Report on Scheme]]
176
177 ** tiny schemes
178 http://forum.osdev.org/viewtopic.php?f=15&t=19937
179
180 http://www.stripedgazelle.org/joey/dreamos.html
181 http://armpit.sourceforge.net/
182 http://common-lisp.net/project/movitz/movitz.html
183
184 <civodul> janneke: https://github.com/namin/inc looks interesting  [15:18]
185 ** Orians Jeremiah
186 <OriansJ> janneke: also, if you look at
187           https://github.com/oriansj/stage0/tree/master/stage2/High_level_prototypes
188           [the garbage collected lisp I implemented], if there are any pieces
189           I could add to finish off your mes lisp bootstrap just let me know
190           because I would be more than happy to do that :D
191 <janneke> OriansJ: that's what I'm hoping for, that our efforts can be
192           complementary and we can work together
193 *** lfam (~lfam@2601:47:4180:2ffb:7c05:17de:cf5f:23ef) has quit: Ping timeout:
194     246 seconds  [00:22]
195 <janneke> exciting times!  [00:23]
196 <janneke> OriansJ: i looked a few times and saw 'LISP empty', so thanks for
197           the pointer!  [00:24]
198 <civodul> OriansJ, janneke: from that page, there's also:
199           https://web.archive.org/web/20160604035203fw_/http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html
200
201 ** C4/C500
202 https://web.archive.org/web/20160604041431/http://homepage.ntlworld.com/edmund.grimley-evans/cc500/cc500.c
203 https://github.com/rswier/c4/blob/master/c4.c
204 ** Compilers for free
205 http://codon.com/compilers-for-free
206 ** Small lisps
207 *** [[https://www.mirrorservice.org/sites/www.bitsavers.org/bits/TI/Explorer/zeta-c/][ZETA-C]]
208 ** Small C compilers
209 *** tinycc
210 *** [[https://github.com/rui314/8cc][8cc]] -- a C11 compiler, but simple
211 8cc is a compiler for the C programming language. It's intended to
212 support all C11 language features while keeping the code as small and
213 simple as possible.
214 *** pcc
215 *** early GCC?
216 *** [[http://tack.sourceforge.net/][ack]]
217 <rain1> it may be possible to compile like this:  mes |> ack |> pcc |> tcc |>
218         gcc 4.7.4 |> gcc later version... up to modern
219 *** [[https://web.archive.org/web/20160402225843/http://homepage.ntlworld.com/edmund.grimley-evans/cc500/][cc500]]
220 ** rain1's Bootstrapping Wiki: https://bootstrapping.miraheze.org/wiki/Main_Page
221 ** rain1's hex86
222 https://notabug.org/rain1/hex86/src/master/tests/hex0b3.hex86
223