 This is Jan Neuenhausen who actually started with Geeks last for them and is now a major contributor. So, welcome Jan. Thank you. Yes, well, I was a major contributor, but my talk is about something that has to do with Geeks and is not Geeks. It has derailed my contributions a bit. I worked on the cross compilation infrastructure, specifically building MinGW cross-compiler and had a lot of help and fun from Manolis who is working on the herd. His talk is next. But this is something completely different. I was inspired to look at Geeks last year. I started playing. I was running Debian and I've run Geeks for Geeks as a package manager on Debian for I think three or four months and in that time I migrated all the packages that I needed for my own development and for my client's development that I worked so far for until everything was packaged in Geeks and then I took the plunge. That's a nice way of doing it. Going off the deep end can also be inspiring I guess because using Geeks on Debian can be done but it's also it has fragility aspects so I don't know. So when I started doing, so what is mess? Mess is full-source bootstrapping. So what is bootstrapping? Do I need to explain that here for who doesn't know about bootstrapping, the bootstrapping problem? Okay, most of you know so it's the question where do compilers come from who compiled the compiler or the chicken and egg problem? So how am I going to do full-source bootstrapping? My idea was to write a tiny scheme interpreter in Hex or in simple C and there it gets fuzzy. That's why this talk. And when I have the scheme interpreter in Hex, what do we do in scheme? I write a C compiler and the C compiler then compiles GCC or maybe Gile or and that's another messy point. Maybe you have ideas and when mess has a C compiler then we have mess CC. Which is the name of the C compiler? So I have something that actually works but I look at it as being a strategy to test things out and there are many decisions that could be made and for me I need something that works to be able to see the next step. So it's not a goal in itself. I have something like a proof of concept. It's not a general purpose scheme although it has aspects of being close to R6RS and it has major gaps and it's not an alternative for Gile but I'm loading and using Gile modules. So Piotr said it, inspiration that's what happened to me last year inspired by Geeks but now I'm doing mess. So what do you want? So as a human being hacker I'm looking for meaning for autonomy but also co-creation. Want to do something meaningful and fun. So one of the great things and if the goal is greater than my inspiration rises. So an inspiring goal for me is a planet of enlightened beings. Why not? So what do I do? I look inward. I try to be happy and try to be helpful. Another crazy idea which goes in the same direction as far as I'm concerned is a world where all software is free. Totally crazy idea. What I do is I support GNU and I create free software. So why am I here at this talk? Geeks really inspired me. I've looked at the hurt 10 or 15 years ago and I wanted to run GNU but I didn't manage it. And Geeks feels to me like running GNU finally. So I just had to do that. The Four Freedoms, if you don't know them, read them. It's terribly inspiring for me. So that was actually the seed, the Four Freedoms by Richard Stallman. For me, it got the whole thing started. A lot of things happened but in 2013, before I knew about it, Debian started the Reproducible Builds, a reprobills project. It didn't have that website. But the idea was, well, I want to, all software is free. But how do I know that the binary that I run actually was produced from the source that is free? Is there any way to certain that? Well you can study the compiler and you can see what assembly comes out. You can, that goes, but that's very cumbersome. You will have to do that if you compile the program twice. You would maybe have to do that again because it looks different. So Reproducibility gives you a very easy test whether you can, if you cannot reproduce the same binary twice from a piece of source code, are there differences? Are they interesting? How are you going to do that? So I thought Reprobills is a very inspiring idea. And then Geeks came along and I have a small summary here for why Reprobills are so nice. Actually there are means to an end. We want autonomy and safety. That's basically it. So how did we get here? Why is Reproducibility and Geeks so nice? Of course we had NixOS who gave us functional package management. And that made it possible to go, or very easy, to go from source to reproducible binaries and have the full list of dependencies and be bit for bit identical. One of the great things about Geeks as a user is something that I like to call binary and source transparency. If you have a program, it's very easy to package that and deploy it only for yourself. It's almost no effort. But you cannot distinguish it from the rest of the system. So philosophically when you install a package you build it from source. But usually we use the binary substitute which makes it a bit quicker. But I will get the same binary as I would have gotten if I had to build it from source. So it feels like building from source but actually everything feels like building from source. So that's great. We have GNU, we have all source, we build everything from source. But there's this bootstrap binaries thing. And that annoyed me. It's only a tiny spec. I mean everything is source, everything. So here's our bootstrap graph which is in the manual. So what are we talking about if we talk about bootstrap binaries? It's too small to read here but it's a dependency graph to build the first bootstrap binaries. And here's the text. I was wondering well what kind of binaries are we talking about? It's only 28 megabytes zipped. So the bootstrap binaries are 200 megabytes. It's not a real problem. We can reproduce them and we do that. But it seems terribly big too. So I was wondering about that and then Orians Jay came along and told us about his hex-assembler, a self-hosting hex-assembler. And I thought wow that's great. If you have a self-hosting hex-assembler maybe we can do away with all sources. But I was still going hex and then I had to see compiler and I didn't really see it. I'll just skip this bit. So I was looking at the bootstrap problem and that was the hex-assembler and the bootstrap binaries would fit in Geeks but I didn't see it. And then I stumbled upon an article from Alan Kay in an interview with Alan Kay where he said the big revelation to me was when I finally understood that the half-page of code on the bottom half of page 13 in the Lisp 1.5 manual was Lisp in itself. These were the Maxwell equations of software. So I thought if you want a bootstrap system and you want to do that in the most convenient and small way, well then maybe use something Lispy. Yeah, so shorted path from hex to GCC is obviously using the Maxwell equations of software. If they are really the Maxwell equations then it should be the prettiest path that you can imagine otherwise we have to look for better equations. So that's where the mess comes in. So I looked up the article and this is the bottom half of page 13. To be honest I had a copy of Sick P and I read some stuff until the exercises come and then I gave up. So there's this evil apply thing in the wizard and I was going, yeah I don't know, am I a wizard, an evil apply, what does it mean? But so it looks interesting but I need to see it and play with it to get a feel for what it does. But I was inspired enough to try that and naive enough. So this is evil and apply and what happens is, well you want an expression evaluated, you give it to evil and evil says, well it has multiple components. The start could be a function so let's evaluate that and the parameters should be evaluated and then hand it to apply and apply will say, oh that's a function, let's execute the function something. And so you have some primitive functions, scar, good or cons, atom. It's very simple but it's not hard to imagine to add a built-in or a primitive function and extend this guy with C functions or something like that. So you have evil and apply in the core and then you have some helpers which are not really interesting, well they're interesting but they're not interesting. So Asok, Paoloz, Afkon and you have the primitives atom, kar, kudur, cons and ik. So this is the first thing I wrote, I just started to type that in in guile. I made a module where I removed everything from the guile module and tried to make sure that I was only running this so here you have apply. It's literally the same as on the page 13 and there is evil and not so interesting functions. So great, I can write my own evil and apply that can execute only the basic primitives and I can write that in guile and execute it, beautiful. So the next step was to write that in C. Well I need to go to hex but that seemed to be two big steps so I decided to cheat and start with a C implementation, a C prototype. And very soon I found out that Lisp 1.5 is really nice and I had this evil apply layout until the beginning of December and maybe I still want to go back to that but first I wanted to bootstrap using Lisp 1.5 and then on top of that implement a full scheme because it's these really are the Maxwell equations. I have a prototype that does that so then in scheme you would extend, add macros and stuff to evil and not touch these Maxwell equations but that really didn't perform so I started messing with the Maxwell equations and then you have something like closures and difference between symbols and keywords and specials and how do you do macros and well that's the syntax rules thing so what I wanted to do is when I had the thing running in C I wanted to have my own C compiler. So first shortest path to success, dump an elf binary that I can execute, starting from a simple main function in C. And Rutger who is sitting here I've had a lot of help from him describing my problems he said well what you're doing is great but you need a garbage collector and I said well I don't know I bought 16 gig. Let's see, so I took a sick pee and I started reading about the garbage collector and then I read a footnote from Abelson and Sussman where they say well maybe memories may get large enough so that it would be impossible to run out of free memory and I thought well great let's go for that. Here's my minimal NCC parser so I had to extend or extended the prototype in C and a lot of functions in scheme just enough that I could run the Lullar parser by Dominique Boucher and I could parse this guy and dump an elf binary and run it and it would print hello world. That was in August and I was going whoa now I'm done. Well it's not totally true, the mess could run the Lullar parser and it could parse a simple a very not C but a simple parentheses example and when I start watching this I'm going to parse this guy it's sac faulted and I couldn't, there were a lot of problems that I fixed but it kept self sac faulting. It ran for five minutes and then it sac faulted. Well turned out that when I accidentally ran top in five minutes it was concing through my 16 gigs. So then I came back to Rutger and I implemented the garbage collector which took me two months to get all the bugs out but now I could look at NIOC which is a full C parser that we have, well we have and I should speed up I guess. So where are we now? We have a full C parser and what I'm doing now is writing the, I have a smaller version of mess which is 700 lines of C and the compiler that I wrote in Scheme can compile that guy and it can, so where are we? I'm just skipping ahead here. It's called a tiny version of, well I divided the problem up in smaller parts. I have a tiny mess which can be, is a C compiler that can be executed by mess and it can read a dumped file which has an S expression and can print it. So mess can compile, yeah compile a C program of 300 lines that does that and then I have the next step which I'm still working on. This guy can the C compiler in Scheme when I execute that with Kyle can compile K-1. And compile a binary that runs this. It reads an S expression that reads cons O-1 and execute that and give the cons. Mess cannot at the moment do this and I'm working on that. There are some statements that are still not parsed by mess. There is a geeks package, it's not in geeks itself. I wanted to have the compiler really working so that it's self-hosting. Expect that in one or two months to have a self-hosting C compiler in Scheme. Yes, so where to go next when we have that? Is that useful at all? That's actually my biggest question. I can imagine it's nice to have a C compiler in Geil but a serious C compiler project in Geil would mean that if I use that in mess, mess would have to be more mature and I don't want to rebuild Geil because we already have that. So maybe make Geil so easy that it can self-host itself. I don't. And then there's Chris Weber who said, well you have the, have you looked at pre-scheme because your prototype is in C? Why not start from a Schemish language or you have a compiler anyway? So take the work on pre-scheme and don't throw away the C source. I should probably explain what pre-scheme is because I don't think many people do. Oh, yeah. Yes, so I'm going to give you an example. I'm going to give you an example of what I'm going to do. I'm going to give you an example of what I'm going to do. I'm going to give you an example of what I'm going to do. Yeah, so pre-scheme is a subset of Scheme which is part of Scheme 48 and Scheme 48 will take pre-scheme and compile that to C. And then the C compiles out. Yeah, Scheme is taken as a source library. But as we have a C compiler, we don't need to go to C. We can take that as an intermediate stage. Yeah, so that's what I'm trying to do. Get rid of the bootstrap binaries and I have something that works, but I'm wondering if it's useful at all and what the next smart step could be. So, questions? Good question and I know that you've said that, right? I want to thank you and say it's very important what you're doing. I mean, my dream is exactly the same thing. You have a self-built outward and running, so before the bootstrap goes like this. There's only one way to do it, which is to be your tool is, and sometimes when you're working with, because what we do is quite a little assembling thing, little inter-pressure. You keep around the rest of the night belt. So my suggestion if you want to play with that, I would try to write three assembly versions for different platforms like army, you know, info, 32-bit, 64-bit, and bootstrap from this and try to get a list running out of business and because the only reason you need to see is portability, right? Yeah. It would be actually much cooler to have a little machine code bootstrap running micro-list, well, risky, maybe, I don't know, whatever, and then just run from there and you can, but because it is just your portability. Okay. Thank you. Thank you. Let's talk about that. Yep. Do you think it's right that the ENIAC compiler running on guy can compile mess, right? Yes. But the ENIAC compiler running on mess can... No, no, no, sorry. No. It can compile the tiny mess thing, the thing that reads the expression and display it. The one that runs cons needs some more constructions in C, but that's just more work. I said it's really important that I appreciate what you're doing. Thank you.