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