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