Release 0.22.
[mes.git] / HACKING
1                                                               -*- org -*-
2 #+TITLE: Hacking GNU Mes
3
4 * SETUP
5     guix environment -l guix.scm     #64 bit + 32bit
6
7     CC=i686-unkown-linux-gnu-gcc ./configure
8 or
9     ./configure
10
11 The 64bit bootstrap is not supported; MesCC needs work to be able to
12 compile a functional tinycc.
13
14 * BUILD
15
16 GNU Guile can be used as a replacement for Mes.  It's faster and has
17 much better error handling.
18
19    #+BEGIN_SRC bash
20    make MES=guile
21    make check MES=guile
22    #+END_SRC
23
24 Configure to compile with Tiny CC
25
26    #+BEGIN_SRC bash
27    ./configure CC=tcc --host=i686-unknown-linux-gnu --with-courage
28    #+END_SRC
29
30 * DEBUG
31   MES_DEBUG=<level> mes
32 ** Levels
33   1) Informational:
34      - MODULEDIR
35      - included SCM modules and sources
36      - result of program
37      - gc stats at exit
38   2) opened files
39   3) runtime gc stats
40   4) detailed info
41      - parsed, expanded program
42      - list of builtins
43      - list of symbol
44      - opened input strings
45      - gc details
46   5) lots of data
47      - usage of opened input strings
48      - bytes read
49   6) globals
50
51 * Bugs
52 ** mes: performance, Mes is now 2-10x slower than Guile.
53 ** mes/mescc lack support for fork/exec on the Hurd.
54 ** mes: gcc-x86_64 compiled mes segfaults with small arena, or gc_up_arena.
55 ** mes: gcc-x86 compiled, tests/srfi-13.test number->string INT-MIN fails:
56 test: number->string INT-MIN: fail
57 expected: -2147483648
58 actual: -./,),(-*,(
59 ** tcc: tcc-built lib/libc+tcc.c segfaults with mes, with tcc.
60 ** mes: remove pmatch-car/pmatch-cdr hack.
61 ** mescc: softcode stack frame size, now hardcoded and very large
62 ** mes+mescc: parse tcc.c->tcc.E works, compile tcc.E -> tcc.M1 segfaults.
63   time GUILE_LOAD_PATH=/home/janneke/src/nyacc/module:$GUILE_LOAD_PATH ../mes/scripts/mescc -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
64   time GUILE_LOAD_PATH=/home/janneke/src/nyacc/module:$GUILE_LOAD_PATH MES_ARENA=200000000 ../mes/scripts/mescc -c -o tcc.M1 tcc.E
65 ** mescc: 64 bit compiled mes loses top 4 bytes
66 *** 64 bit mescc-compiled mes:
67   #x100000000 => 0
68   (modulo 1 #x100000000) => divide-by-zero
69 *** 64 bit gcc-compiled mes:
70   #x100000000 => 0
71   (modulo 1 #x100000000) => 1
72 ** mescc: 7n-struct-struct-array.c:  struct file f = {"first.h"};
73 ** test/match.test ("nyacc-simple"): hygiene problem in match
74 * OLD: Booting from LISP-1.5 into Mes
75
76 Mes started out experimenting with booting from a hex-coded minimal
77 LISP-1.5 (prototype in mes.c), into an almost-RRS Scheme.
78
79 When EOF is read, the LISP-1.5 machine calls loop2 from loop2.mes,
80 which reads the rest of stdin and takes over control.  The functions
81 readenv, eval and apply-env in mes.mes introduced define, define-macro
82 quasiquote and macro expansion.
83
84 While this works, it's amazingly slow.  We implemented a full reader
85 in mes.c, which makes running mes:apply-env mes:eval somewhat
86 bearable, still over 1000x slower than running mes.c.
87
88 Bootstrapping has been removed and mes.c implements enough of RRS to
89 run a macro-based define-syntax and syntax-rules.
90
91 loop.mes and mes.mes are unused and lagging behind.  Probably it's not
92 worth considering this route without a VM.  GNU Epsilon is taking the
93 more usual VM-route to provide multiple personas.  While that sounds
94 neat, Lisp/Scheme, bootstrapping and trusted binaries are probably not
95 in scope as there is no mention of such things; only ML is mentioned
96 while Guile is used for bootstrapping.
97
98 * Assorted ideas and info
99 ** Using GDB on assembly/a.out
100 info registers
101 p/x $eax
102 p/x $edx
103 set disassemble-next-line on
104 gdb-display-disassembly-buffer
105 b *0x804a79d
106 ** Create memory dump with 32 bit Gcc compiled Mes
107 make out/i686-unknown-linux-gnu-mes
108 out/i686-unknown-linux-gnu-mes --dump < module/mes/read-0.mes > module/mes/read-0-32.mo
109
110 x/s *((char **)($rsp+8))
111
112 ** C parser/compiler
113 *** [[https://savannah.gnu.org/projects/nyacc][nyacc]]
114 *** PEG: [[http://piumarta.com/software/peg/][parse C using PEG]]
115 *** [[https://en.wikipedia.org/wiki/Tiny_C_Compiler][Tiny C Compiler]]
116 *** [[http://www.t3x.org/subc/index.html][Sub C]]
117 *** [[https://groups.google.com/forum/#!topic/comp.lang.lisp/VPuX0VsjTTE][C intepreter in LISP/Scheme/Python]]
118
119 ** C assembler/linker
120 *** [[http://www.tldp.org/HOWTO/Assembly-HOWTO/linux.html][Assembly HOWTO]]
121 *** ELF
122 7f 45 4c 46
123 *** [[http://www.muppetlabs.com/~breadbox/software/tiny/][Small ELF programs]]
124 *** [[http://www.cirosantilli.com/elf-hello-world/][Elf hello world]]
125 ** SC - c as s-expressions
126 sc: http://sph.mn/content/3d3
127 ** RNRS
128 *** [[http://www.scheme-reports.org/][Scheme Reports]]
129 *** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-349.pdf][Scheme - Report on Scheme]]
130 *** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-452.pdf][RRS - Revised Report on Scheme]]
131
132 ** tiny schemes
133 http://forum.osdev.org/viewtopic.php?f=15&t=19937
134
135 http://www.stripedgazelle.org/joey/dreamos.html
136 http://armpit.sourceforge.net/
137 http://common-lisp.net/project/movitz/movitz.html
138
139 <civodul> janneke: https://github.com/namin/inc looks interesting  [15:18]
140 ** Orians Jeremiah
141 <OriansJ> janneke: also, if you look at
142           https://github.com/oriansj/stage0/tree/master/stage2/High_level_prototypes
143           [the garbage collected lisp I implemented], if there are any pieces
144           I could add to finish off your mes lisp bootstrap just let me know
145           because I would be more than happy to do that :D
146 <janneke> OriansJ: that's what I'm hoping for, that our efforts can be
147           complementary and we can work together
148 *** lfam (~lfam@2601:47:4180:2ffb:7c05:17de:cf5f:23ef) has quit: Ping timeout:
149     246 seconds  [00:22]
150 <janneke> exciting times!  [00:23]
151 <janneke> OriansJ: i looked a few times and saw 'LISP empty', so thanks for
152           the pointer!  [00:24]
153 <civodul> OriansJ, janneke: from that page, there's also:
154           https://web.archive.org/web/20160604035203fw_/http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html
155
156 ** C4/C500
157 https://web.archive.org/web/20160604041431/http://homepage.ntlworld.com/edmund.grimley-evans/cc500/cc500.c
158 https://github.com/rswier/c4/blob/master/c4.c
159 ** Compilers for free
160 http://codon.com/compilers-for-free
161 ** Small lisps
162 *** [[https://www.mirrorservice.org/sites/www.bitsavers.org/bits/TI/Explorer/zeta-c/][ZETA-C]]
163 ** Small C compilers
164 *** tinycc
165 *** [[https://github.com/rui314/8cc][8cc]] -- a C11 compiler, but simple
166 8cc is a compiler for the C programming language. It's intended to
167 support all C11 language features while keeping the code as small and
168 simple as possible.
169 *** pcc
170 *** early GCC?
171 https://miyuki.github.io/2017/10/04/gcc-archaeology-1.html
172 *** [[http://tack.sourceforge.net/][ack]]
173 <rain1> it may be possible to compile like this:  mes |> ack |> pcc |> tcc |>
174         gcc 4.7.4 |> gcc later version... up to modern
175 *** [[https://web.archive.org/web/20160402225843/http://homepage.ntlworld.com/edmund.grimley-evans/cc500/][cc500]]
176 ** rain1's Bootstrapping Wiki: https://bootstrapping.miraheze.org/wiki/Main_Page
177 ** rain1's hex86
178 https://notabug.org/rain1/hex86/src/master/tests/hex0b3.hex86
179 ** <pdewacht> janneke, have you ever tried testing mescc with csmith?  [10:55]
180 ** <pdewacht> e.g. as described here
181            https://jamey.thesharps.us/2016/07/15/testing-strategies-for-corrode/
182            ("Randomized testing with Csmith and C-Reduce")  [10:58]
183 ** linux syscalls: https://fedora.juszkiewicz.com.pl/syscalls.html
184 * legalese
185
186 Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
187
188   Copying and distribution of this file, with or without modification,
189   are permitted in any medium without royalty provided the copyright
190   notice and this notice are preserved.