e8782f60b88d95c2a82bf1ee7625535ebb09d19c
[mes.git] / HACKING
1 -*-mode:org-*-
2
3 * Fully source-based bootstrapping
4
5 ** R6RS-like scheme interpreter
6 This first part is prototyped in C by the mes.c core and Scheme
7 bootstrap code in module/.  Of course, while mes.c is pretty small it
8 cannot serve as a fully source-based solution.
9
10 The initial idea was to have the minimal core support LISP-1.5 (or
11 something very close to that as a tribute to John McCarthy) and extend
12 eval/apply from LISP-1.5 source with define, define-macro etc. and
13 metamorphose into R6RS.  It seemed to work but performance of the
14 LISP-intepreted RRS was so bad (~1000x slower than initial LISP-1.5)
15 that this track was abandoned after the initial ANNOUNCE.
16
17 The route changed, trying to strike a balance between core size and
18 performance: still writing as much as possible in Scheme but having a
19 mescc compiler that takes not more than some seconds to run.
20
21 Now that portable R6RS syntax-case runs and mes.c has grown to
22 ~1200LOC with another ~300LOC of optional C code, some effort must
23 probably be directed into making that smaller.
24
25 ** Move mes.c into hex?
26 One idea is to use OrianJ's amazing self-hosting [[https://github.com/oriansj/stage0][stage0]] hex assembler
27 and minimal bootstrap binaries and rewrite the mes.c core to directly
28 bootstrap into Scheme.
29
30 ** Rewrite mes.c and generate hex?
31 Another idea (thanks Rutger!) is to rewrite the mes.c core in a
32 C/Assembly variant and thave mescc produce the simple, annotated
33 bootstrap binary.
34
35 * Bugs
36 ** Core is too fat
37 mes.c is ~1500 lines (~10,000LOC Assembly) which seems much too big to
38 start translating it to assembly/hex.
39
40 ** (mes-use-module ...) is a fake, see module/mes/base.mes.
41 All top level scripts and test files (scripts/*.mes tests/*.test)
42 now include appropriate (mes-use-module ...) stanzas.
43
44 This hack allows for scripts/includes.mes to generate the list of
45 files to be prepended.  Previously, this information was put in
46 GNUmakefile.
47 ** Garbage collection?
48 Mes is using malloc without freeing anything, memory is patient these
49 days :-) Sadly, a factor 10^6 less patient than the future that SICP
50 authors were hoping for (we have 10^3 less memory and 10^3 more
51 instructions).
52
53 SICP's stop and copy Garbage Colletor (Jam Scraper?) algorithm is now
54 available, but it cannot be hooked up yet as even in boot mode the
55 core mes eval/apply is still running; it executes the Scheme based
56 eval/apply.
57 ** Actually do something useful, build: [[https://en.wikipedia.org/wiki/Tiny_C_Compiler][Tiny C Compiler]]
58 * OLD: Booting from LISP-1.5 into Mes
59
60 Mes started out experimenting with booting from a hex-coded minimal
61 LISP-1.5 (prototype in mes.c), into an almost-RRS Scheme.
62
63 When EOF is read, the LISP-1.5 machine calls loop2 from loop2.mes,
64 which reads the rest of stdin and takes over control.  The functions
65 readenv, eval and apply-env in mes.mes introduced define, define-macro
66 quasiquote and macro expansion.
67
68 While this works, it's amazingly slow.  We implemented a full reader
69 in mes.c, which makes running mes:apply-env mes:eval somewhat
70 bearable, still over 1000x slower than running mes.c.
71
72 Bootstrapping has been removed and mes.c implements enough of RRS to
73 run a macro-based define-syntax and syntax-rules.
74
75 loop.mes and mes.mes are unused and lagging behind.  Probably it's not
76 worth considering this route without a VM.  GNU Epsilon is taking the
77 more usual VM-route to provide multiple personas.  While that sounds
78 neat, Lisp/Scheme, bootstrapping and trusted binaries are probably not
79 in scope as there is no mention of such things; only ML is mentioned
80 while Guile is used for bootstrapping.
81
82 * Assorted ideas and info 
83 ** C parser/compiler
84 *** [[https://savannah.gnu.org/projects/nyacc][nyacc]]
85 *** PEG: [[http://piumarta.com/software/peg/][parse C using PEG]]
86 *** [[https://en.wikipedia.org/wiki/Tiny_C_Compiler][Tiny C Compiler]]
87 *** [[http://www.t3x.org/subc/index.html][Sub C]]
88 *** [[https://groups.google.com/forum/#!topic/comp.lang.lisp/VPuX0VsjTTE][C intepreter in LISP/Scheme/Python]]
89
90 ** C assembler/linker
91 *** [[http://www.tldp.org/HOWTO/Assembly-HOWTO/linux.html][Assembly HOWTO]]
92 *** System call clue bat
93 Basically, you issue an int 0x80, with the __NR_syscallname number
94 (from asm/unistd.h) in eax, and parameters (up to six) in ebx, ecx,
95 edx, esi, edi, ebp respectively.
96 *** ELF
97 7f 45 4c 46
98 *** [[http://www.muppetlabs.com/~breadbox/software/tiny/][Small ELF programs]]
99 *** [[http://www.cirosantilli.com/elf-hello-world/][Elf hello world]]
100
101 ** RNRS
102 *** [[http://www.scheme-reports.org/][Scheme Reports]] 
103 *** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-349.pdf][Scheme - Report on Scheme]]
104 *** [[ftp://publications.ai.mit.edu/ai-publications/pdf/AIM-452.pdf][RRS - Revised Report on Scheme]]
105