字幕表 動画を再生する 英語字幕をプリント We're going to do the final stage we're going to end up with the self compiling compiler Well in the previous video what we did was we developed a C compiler by writing it in assembler hypothetically anyway and The net result of that is you get a working C compiler that works on the particular chipset that's in your computer it could be ARM, it could be Intel, it could be whatever and It does what you were expected to do. It drinks in C program statements and it spits out at the other end. So it's code generator modules a Binary which when suitably packaged will become an executable on your particular piece of machinery Traditionally under UNIX and Linux. These are called a dot out files traditionally and under windows are called dot X's, aren't they? but it's basically something that is very very close to a loadable venable binary as Translation of your C program and we left it last time if you if you like you could say, this is our C compiler But we could almost call it the mark 1 because we're saying hypothetically We developed it via an assembler root so when it executes It's running assembler quality binary and it's also producing shall we say assembler? Quality binary I'll label that Compiler mark 1 so you say well what's wrong with that? Why not just stick like that. We've got a compiler that works. Well, it could be a variety of reasons It could be that's all though. It's running binary of quality a that binary could be not very good It could be slow. It could be a perfectly good compiler, but it seems to take forever Yeah That will be one good reason for doing it there might just possibly now You hope not be a very very hidden bug that for certain C imports It just crashes. You hope that testing and debugging have removed all those but you can never be sure so There's maybe another reason that certain sorts of constructs sometimes caused it to crash. You don't want that But what you're now saying is can we use a not top-quality thing to make a better instance of itself. Now this is not a new idea some of the commenters on my previous video have been pointing out the machine tool industry has been doing this for ages using a not very good tool that's on its last legs as a means of making something that's sharper and better you can imagine a 3d printer that has been produced in a component-wise way by other 3d printers and there is a vital cog in the middle of it, which Turns around a lot for some reason or another and gets worn and what you'd like to do is to improve the quality of that Vital cog near worried that it's gonna split apart and do it. So why not? program your machine to make that vital cog on the machine as it now is And just hope it withstands the stress until the piece is made and then when the piece is made it's got better Tolerances and so on. Hopefully then the bit is replacing So you take the bad piece out throw it away and put the new one in So you're actually feeding back into the machine itself a new instance of something that is vital to its running So even out there in the everyday world this business of eating yourself or producing a better version of yourself Has been around for a long time and we're gonna do something very similar here. What I'm saying is Ideally, I'd like to make Bin A be History and a thing of the past because I'd like to write a new version of the compiler Which we will call mark 2 so just to summarize This is a compiler running binary code of quality a at the moment and code generating binary of a similar sort of quality We now write a new version of the C compiler still written in C Which produces better quality binary we pay a lot of attention to the code generation modules, so we'll call it bin B Version 1 is a version to his be or you can think of the B meaning better best quality in some sense binary So that is what you initially write you write a new version of the C compiler which takes in C it Produces bin B. You spent a lot of time on that code generation modules And of course at this stage you think of it as being written in C Which it is you're writing a new C compiler in C But the burning question then comes well, I can't execute C directly on the hardware I don't have a C interpreter although in principle I suppose you could develop one know that C has got to be turned into binary. How do you turn that C? this is written in into binary when you are in the process of constructing the new thing and the answer is revert to the previous generation revert to the one that you've Hoping to leave behind as a means of propelling you forward as part of the bootstrap process What we're now saying is we do it like this we write C producing bin B the new version of the compiler written in C How do we compile that C we have already got the old Mark 1 version of the compiler? Which you'll remember from the top of the previous sheet takes in C runs on Bin A execute Bin A let's hope he doesn't fall over and squirts out binary of quality a But that's sufficient to show C going in there whirring round producing Binet. You've now got an executable Which takes in C produces much better binary of quality B it's only weakness is that it's still running itself on binary a Maybe it's still slow maybe binary a is congenitally slow. It's not being very well written at all But at least it works. It's there some final step. Yes, there is that would get rid of any vestigial remains of bin a in all this Process cycle. Yeah, that is exactly what you do next we've got a new version of the C compiler, but it's executable is only still of Bin A quality how to improve it feed the new version of the compiler to the Executable that you have just created And it would go like this Look, here's your new mark 2 version of the C compiler C compiler written in C producing bin B Feed it through The Previous thing that we developed at the end of the previous sheet what we ended up with if you remember is A version of the compiler now that can do C to Bin B so it's a new version the only little weakness inside it is it's running bin a But can you see that by feeding that into a binary? executable of itself What you do is your feed your C in this is running on Bin A, but it spits out bin B So what you collect in your dot exe or dot they doäôt file at the end is what you want C Producing bin B, but running on bin B so this is now our executable for the new version but the beautiful thing about it, is that that remaining weakness here where you use the old version running Bin A to produce a Version that doesn't have Bin A in this at all Final stage feed that back to itself and that our sound of trumpets C written and C producing bin B But as a result of the previous exercise, we've now got a version of the compiler. That is the binary instantiation of this We have got from over here a C producing Bin B written in bin B Well use it use it to recompile yourself And you end up? now with C written in bin B producing bin B any memories of the hell we went through with the Assembly version can now be forgotten you can throw that away and Carefully, of course store away your version now which only needs to get back to a Bin B level of history in order to regenerate itself and I suppose you could say therefore that this triumphant thing which I put three stars on here the product we were trying for all along you can say it's now a self-sufficient Compiler as well as being a self compiling compiler It's only needs a working and debug version of itself in Order to be a wondrous new replacement now things are never quite that perfect There's always a downside I've got I've got a question because he kind of sort of alluded to it though. It skips over it nicely Debugged right. I mean what happens if there are problems with this? You know, where do we go? You always have to retain the ability to go back further than you would wish. Of course you do It yeah, I think it is fair to say that Compiling a C compiler is a very heavy and demanding task for a C compiler to do You will get varieties of code Usages of data structures and all sorts in a Compiler that you will not likely find in a weather forecasting program. Let alone an events listing date calendar Whatever a compiler is a demanding thing to write is going to be a demanding thing to compile It may well be that just saying. Oh here's the old compiler that the old compiler just falls over when faced with the Unbelievable quality of the C you've written for the mark to the thing So yes that always happens you can feed it to itself and then itself falls over. What what do you do? Well, you've got to back off and do it again, but you can see that in the end It is the way to go get yourself Use the whole idea revealing something to yourself - how shall we say motivate the quality of the C that you write to be compilable and Giving a mind of course to efficiency and so on all the way along the chain But I do hope that this example for those of you maybe been a bit puzzle saying what is all this bootstrapping? One of the problems I think is that even sometimes when you see T diagram explanations They make it hard by not distinguishing if you like between Bin A and Bin B I've seen Explanations which just right bin and don't make it clear that it's a different sort of binary, you know And and that I think causes a lot of confusion So I hope this has helped. Is it possible that this goes through oodles more? That's the technical term, oodles more? Iterations, he got Bin C. Bin D, Bin E. Oh, yeah. Yes yes, if you decide that well bin B was fine for its time, but frankly, there's a witty new idea with interlocked Triple Ref pointers pointing to data structures that do this and not the other and that's Absolutely the way to write that next version of the C compiler then you can do exactly the same thing You be daft not to use the previous version of the compiler to compile yourself But what you must be careful of is that if you're in the process of as it were defining The subset of the language of the C compiler compiles your hope it will be total but there may be glitches in it You've got to try and write C that it's capable of compiling itself and you've got that in your mind all the time When you're doing this Worst case scenario. Yes, exactly Yes. Yes. I'm a fabulous compiler. But please don't feed me with myself all hell may break loose. Yeah. Yeah And the cube mouse click events We probably wouldn't get one whether the mouse is move If you think about as the mouse is being moved You've got lots and lots of events most of which you're not interested in You're probably only interested when a button is pressed or so on the only times pass that's different Is it cause for your dragging something around the screen?