2af5d6d7f2cdb651fa88909ca66b175c06b14aa4
[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 mes libc: lib/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.x, unsorted
45   - mes+mescc: compile a mes-tcc that can compile gcc-4.7.
46   - mes: prepare src/mes.c for M2-Planet transpiler.
47   - mes: use more efficient scheme continuation stack (wip-array?)
48   - mes: drop SCM stack in C / implement call/cc a la guile-1.8 setjmp?
49   - mescc: refactor type(/ptr?) system; expr->type and ast-type->type.
50   - mescc: refactor initializers.
51   - mescc: record and support function types, and thus foo ()->bar, *foo ().
52   - mescc: refactor switch statement to support unpatched tinycc.
53   - mes/mescc: bootstrap a minimal-Guile
54     + libguile/{eval,init,list,strings,values,..}.c
55     + ice-9/eval.scm
56   - mescc: have mes-tcc pass all scaffold/tests, scaffold/tinycc tests.
57   - mescc: compile a mes-tcc that can compile gcc-4.7.
58   - mescc: refactor switch; support heterogeneous switch case.
59   - mescc: support sizeof any expr.
60   - mescc: support function-static.
61   - mescc: support/grok global static.
62   - mescc: support unsigned comparison, arithmetic.
63   - mescc: support long long.
64   - mescc: support bitfields.
65   - mescc: support floats.
66   - mescc: some success with 8cc,pcc,guile/libguile/eval.c.
67   - build: guile/guix/make.scm: add file-types, intermediate, hash all dependencies
68   - build: make.scm: imperative->declaritive
69   - mes: real module support, bonus for supporting Guile's define-module/define-public syntax.
70   - get full source syntax-case up (Andre van Tonder?) OR drop it.
71     https://srfi.schemers.org/srfi-72/srfi-72.html
72     psyntax/syntax-case and rewrite Nyacc without syntax-case+R7RS Ellipsis.
73   - mescc: split-off MesCC as as standalone Guile C compiler project.
74 *** release 1.0
75   - replace GuixSD's bootstrap binaries for x86.
76   - add x86_64, replace GuixSD's bootstrap binaries for x86_64.
77   - more architectures?
78 ** DONE
79 *** 0.12: Mes+MesCC now compiles mes.c (~3000LOC) in ~4min.
80 *** 0.11: MesCC now compiles a mes-tcc that passes 26/69 of mescc's C tests.
81 *** 0.10: Mescc now compiles a mes-tcc that compiles a trivial C to a running a.out.
82 *** 0.9: Mescc now writes M1 macro assembly files and compiles tcc.
83 *** 0.8: Mescc now writes object files in stage0's labeled hex2 format.
84 *** 0.7: Mescc supports -E, -c, -o options, include more complete set of header files,
85 eenough to work on compiling tinycc's tcc.c albeit a somewhat modified version.
86 *** 0.6: Work with unmodified, unbundled Nyacc; compile 33/55 tinycc's tests/test2 suite.
87 *** 0.5: Mutual self-hosting Scheme interpreter and C compiler: mes.c and mescc,
88          Support call-with-current-continuation, refactor catch/throw
89 *** 0.4: Support Nyacc, Gcc-compiled Mes compiles minimal main.c using nyacc
90 *** 0.3: Garbage collector
91 *** 0.2: Support psyntax
92 *** 0.1: Mes eval/apply feature complete; support syntax-rules, compile main.c using LALR, dump ELF
93
94 * Bugs
95 ** mes: remove pmatch-car/pmatch-cdr hack.
96 ** mes+mescc: parse tcc.c->tcc.E works, compile tcc.E -> tcc.M1 segfaults.
97   time GUILE_LOAD_PATH=/home/janneke/src/nyacc/module:$GUILE_LOAD_PATH ../mes/scripts/mescc.mes -E -o tcc.E -I . -I ../mes/lib -I ../mes/include -D 'CONFIG_TCCDIR="usr/lib/tcc"' -D 'CONFIG_TCC_CRTPREFIX="usr/lib:{B}/lib:."' -D 'CONFIG_TCC_ELFINTERP="/gnu/store/70jxsnpffkl7fdb7qv398n8yi1a3w5nx-glibc-2.26.105-g0890d5379c/lib/ld-linux.so.2"' -D 'CONFIG_TCC_LIBPATHS="/home/janneke/src/tinycc/usr/lib:{B}/lib:."' -D 'CONFIG_TCC_SYSINCLUDEPATHS="../mes/include:usr/include:{B}/include"' -D CONFIG_USE_LIBGCC=1 -D 'TCC_LIBGCC="/home/janneke/src/tinycc/usr/lib/libc+tcc-gcc.mlibc-o"' -D CONFIG_TCC_STATIC=1 -D ONE_SOURCE=yes -D TCC_TARGET_I386=1 -D BOOTSTRAP=1 tcc.c
98   time GUILE_LOAD_PATH=/home/janneke/src/nyacc/module:$GUILE_LOAD_PATH MES_ARENA=200000000 ../mes/scripts/mescc.mes -c -o tcc.M1 tcc.E
99 ** mes: with-fluids: tests/fluids.test test 7 fails with Mes.
100 ** mescc: 7n-struct-struct-array.c:  struct file f = {"first.h"};
101 ** test/match.test ("nyacc-simple"): hygiene problem in match
102 * OLD: Booting from LISP-1.5 into Mes
103
104 Mes started out experimenting with booting from a hex-coded minimal
105 LISP-1.5 (prototype in mes.c), into an almost-RRS Scheme.
106
107 When EOF is read, the LISP-1.5 machine calls loop2 from loop2.mes,
108 which reads the rest of stdin and takes over control.  The functions
109 readenv, eval and apply-env in mes.mes introduced define, define-macro
110 quasiquote and macro expansion.
111
112 While this works, it's amazingly slow.  We implemented a full reader
113 in mes.c, which makes running mes:apply-env mes:eval somewhat
114 bearable, still over 1000x slower than running mes.c.
115
116 Bootstrapping has been removed and mes.c implements enough of RRS to
117 run a macro-based define-syntax and syntax-rules.
118
119 loop.mes and mes.mes are unused and lagging behind.  Probably it's not
120 worth considering this route without a VM.  GNU Epsilon is taking the
121 more usual VM-route to provide multiple personas.  While that sounds
122 neat, Lisp/Scheme, bootstrapping and trusted binaries are probably not
123 in scope as there is no mention of such things; only ML is mentioned
124 while Guile is used for bootstrapping.
125
126 * Assorted ideas and info 
127 ** Using GDB on assembly/a.out
128 info registers
129 p/x $eax
130 p/x $edx
131 set disassemble-next-line on
132 gdb-display-disassembly-buffer
133 b *0x804a79d
134 ** Create memory dump with 32 bit Gcc compiled Mes
135 make out/i686-unknown-linux-gnu-mes
136 out/i686-unknown-linux-gnu-mes --dump < module/mes/read-0.mes > module/mes/read-0-32.mo
137 ** C parser/compiler
138 *** [[https://savannah.gnu.org/projects/nyacc][nyacc]]
139 *** PEG: [[http://piumarta.com/software/peg/][parse C using PEG]]
140 *** [[https://en.wikipedia.org/wiki/Tiny_C_Compiler][Tiny C Compiler]]
141 *** [[http://www.t3x.org/subc/index.html][Sub C]]
142 *** [[https://groups.google.com/forum/#!topic/comp.lang.lisp/VPuX0VsjTTE][C intepreter in LISP/Scheme/Python]]
143
144 ** C assembler/linker
145 *** [[http://www.tldp.org/HOWTO/Assembly-HOWTO/linux.html][Assembly HOWTO]]
146 *** ELF
147 7f 45 4c 46
148 *** [[http://www.muppetlabs.com/~breadbox/software/tiny/][Small ELF programs]]
149 *** [[http://www.cirosantilli.com/elf-hello-world/][Elf hello world]]
150 ** SC - c as s-expressions
151 sc: http://sph.mn/content/3d3
152 ** RNRS
153 *** [[http://www.scheme-reports.org/][Scheme Reports]] 
154 *** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-349.pdf][Scheme - Report on Scheme]]
155 *** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-452.pdf][RRS - Revised Report on Scheme]]
156
157 ** tiny schemes
158 http://forum.osdev.org/viewtopic.php?f=15&t=19937
159
160 http://www.stripedgazelle.org/joey/dreamos.html
161 http://armpit.sourceforge.net/
162 http://common-lisp.net/project/movitz/movitz.html
163
164 <civodul> janneke: https://github.com/namin/inc looks interesting  [15:18]
165 ** Orians Jeremiah
166 <OriansJ> janneke: also, if you look at
167           https://github.com/oriansj/stage0/tree/master/stage2/High_level_prototypes
168           [the garbage collected lisp I implemented], if there are any pieces
169           I could add to finish off your mes lisp bootstrap just let me know
170           because I would be more than happy to do that :D
171 <janneke> OriansJ: that's what I'm hoping for, that our efforts can be
172           complementary and we can work together
173 *** lfam (~lfam@2601:47:4180:2ffb:7c05:17de:cf5f:23ef) has quit: Ping timeout:
174     246 seconds  [00:22]
175 <janneke> exciting times!  [00:23]
176 <janneke> OriansJ: i looked a few times and saw 'LISP empty', so thanks for
177           the pointer!  [00:24]
178 <civodul> OriansJ, janneke: from that page, there's also:
179           https://web.archive.org/web/20160604035203fw_/http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html
180
181 ** C4/C500
182 https://web.archive.org/web/20160604041431/http://homepage.ntlworld.com/edmund.grimley-evans/cc500/cc500.c
183 https://github.com/rswier/c4/blob/master/c4.c
184 ** Compilers for free
185 http://codon.com/compilers-for-free
186 ** Small lisps
187 *** [[https://www.mirrorservice.org/sites/www.bitsavers.org/bits/TI/Explorer/zeta-c/][ZETA-C]]
188 ** Small C compilers
189 *** tinycc
190 *** [[https://github.com/rui314/8cc][8cc]] -- a C11 compiler, but simple
191 8cc is a compiler for the C programming language. It's intended to
192 support all C11 language features while keeping the code as small and
193 simple as possible.
194 *** pcc
195 *** early GCC?
196 https://miyuki.github.io/2017/10/04/gcc-archaeology-1.html
197 *** [[http://tack.sourceforge.net/][ack]]
198 <rain1> it may be possible to compile like this:  mes |> ack |> pcc |> tcc |>
199         gcc 4.7.4 |> gcc later version... up to modern
200 *** [[https://web.archive.org/web/20160402225843/http://homepage.ntlworld.com/edmund.grimley-evans/cc500/][cc500]]
201 ** rain1's Bootstrapping Wiki: https://bootstrapping.miraheze.org/wiki/Main_Page
202 ** rain1's hex86
203 https://notabug.org/rain1/hex86/src/master/tests/hex0b3.hex86
204