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