News for hackers. Stuff that matters.
Re:Let’s Build a Compiler (1995) by einpoklum on Monday February 17, 2020 @06:38AM (#22346971)
I would be a bit wary of a 30-year-old book on compiler construction. If it were more on the theoretical side then fine, but this sounds kind of hands-on. "Let's build a compiler with 1980s tools!" doesn't sound very appealing.

That is just a shallow impression though. Convince me I'm wrong?

Re:Let’s Build a Compiler (1995) by makotoNagano on Monday February 17, 2020 @07:01AM (#22347074)
Sometimes learning on older technologies is very helpful to learning more of the fundamentals than learning practical skills directly.

For example I studied how to program assembly code for an STM32F0 microprocessor. Would never do that in practice. but worked wonders in teaching me the intricacies of a processor at a very low level.

Re:Let’s Build a Compiler (1995) by Athas on Monday February 17, 2020 @07:30AM (#22347215)
Old techniques are not necessarily more fundamental, they are just more primitive. (And often, but not always, more efficient.)

In particular, old compiler texts will often do things like emit code directly from the parser, try to minimise the number of AST passes, or keep complex global symbol tables separate from the AST. These are mostly workarounds for technical limitations that are no longer relevant, and in fact only obscure the principles being taught (code generation during parsing is my pet example of this).

Re:Let’s Build a Compiler (1995) by msla on Monday February 17, 2020 @11:54AM (#22348928)
This is pointedly not about the Old Techniques in compiler writing.

For example, the author doesn't divide the compiler into multiple passes, so it can fit in RAM; he assumes you have "enough" RAM for a simple compiler to fit, and goes from there.

Similarly, he jumps right into recursive code, because that's simpler, and he assumes your computer has a stack of reasonable depth. (Go back far enough and computers had really shallow stacks. Go back farther and computers didn't have call stacks at all.)

Finally, his compiler doesn't optimize the code, because he assumes that the obvious code will run sufficiently fast. A fairly modern idea, and one which removes the complexity which would otherwise drive the design and force things like multiple passes and complex internal representation.

Re:Let’s Build a Compiler (1995) by bakery2k on Monday February 17, 2020 @07:34AM (#22347233)
Isn't code generation during parsing still common today? In particular, bytecode generation in interpreters (and JIT compilers) for scripting languages, e.g. Lua?
Re:Let’s Build a Compiler (1995) by Athas on Monday February 17, 2020 @07:50AM (#22347292)
It's sometimes a good idea to do it that way in practice, but it's still a conflation of two conceptually distinct processes. I think it is a bad approach when teaching compiler implementation, as it means you avoid the extremely core concept of an abstract syntax tree.
Re:Let’s Build a Compiler (1995) by badsectoracula on Monday February 17, 2020 @12:52PM (#22349270)
But it isn't a core concept if you do not need it. And an AST builder can be "injected" between the parser and codegen at a later point in time, if needed. You do not even need to do it in one go, e.g. if your compiler has something like a "ParseExpression" (assuming recursive descent parsing that spits out code as it parses), you can start by making a partial AST just for the expressions and leave everything else (e.g. declarations, control structures, assignments - assuming those aren't part of an expression, etc) as-is.

This is useful for both practical and teaching purposes: for practical because it keeps things simple in case the additional complexity isn't needed (e.g. scripting languages) and for teaching purposes because someone learns both ways (which are used in real world problems) while at the same time learning why one might be preferable to the other. And if you do the partial AST bit you even introduce the idea of an AST gradually by building off existing knowledge and experience the student has acquired.

Re:Let’s Build a Compiler (1995) by bakery2k on Monday February 17, 2020 @07:57AM (#22347328)
Thanks, that makes sense.
Re:Let’s Build a Compiler (1995) by vidarh on Monday February 17, 2020 @07:45AM (#22347273)
Yes, it is. It also doesn't really make much difference per se, as e.g. Wirth-style compilers still maintain careful separation of the code generation and parsing.

And if you want to/need to later, you can trivially introduce an AST in those compilers by replacing the calls to the code-generator with calls to a tree builder, and then write a visitor-style driver for the code generation.

Re:Let’s Build a Compiler (1995) by mcejp on Tuesday February 18, 2020 @11:37AM (#22357264)
"trivially"?
Re:Let’s Build a Compiler (1995) by vidarh on Wednesday February 19, 2020 @01:52PM (#22368714)
Yes, it's work of course, but it's quite mechanical work that requires little thought.

Instead of calling the code emitter, you call an AST builder.

Then you build a tree walker that call the code emitter.

At least the Wirth Oberon compiler was retrofitted with an AST by at least one student in Wirth's group as part of experiments with optimization passes.

Re:Let’s Build a Compiler (1995) by kragen on Monday February 17, 2020 @08:43AM (#22347608)
I don't know, an STM32F0 sounds like one of the places where writing your code in assembly in 2020 might most likely be a reasonable choice. You write it in C, you don't get guaranteed timings.
Re:Let’s Build a Compiler (1995) by makotoNagano on Monday February 17, 2020 @11:41AM (#22348843)
Agreed for very specific applications. General purpose stuff, C is more than sufficient imo
Re:Let’s Build a Compiler (1995) by chooseaname on Monday February 17, 2020 @10:24AM (#22348290)
>That is just a shallow impression though. Convince me I'm wrong?

When developers ask, "I am curious about compilers, where should I start?", a common answer, even today, is "the dragon book". This is just bad advice. There are better introductory texts on the subject. However, if we step back , there's no reason not to suggest "Let's Build a Compiler" even though it seems dated at this point. Why is that? Because the dev is only curious and the content of "Let's Build a Compiler" is still, to this day, generally a good introduction to what compilers actually do. It's lite on theory and heavier on practicality and can easily satiate curiosity.

Re:Let’s Build a Compiler (1995) by einpoklum on Tuesday February 18, 2020 @03:00PM (#22359740)
But theory is long-lasting (well, relatively speaking), while the practice changes a lot, not just compilers become more sophisticated and meet stronger demands, but because surrounding technology changes and makes various things easier. IIUC, you're suggesting we take the 1980s practicality in a non-literal, and thus not quite practical, sense.
Re:Let’s Build a Compiler (1995) by EamonnMR on Monday February 17, 2020 @04:32PM (#22351021)
This sort of tutorial is best not to follow exactly, but rather use it as a framework to, for example, implement a script you invent in a language you're learning. Oh, and it's a bunch of fun, really.
Re:Let’s Build a Compiler (1995) by Riverheart on Monday February 17, 2020 @07:36AM (#22347242)
You could just take the code as pseudo code and translate it to the language of your choice. I personally like hand-ons tutorials regardless of complexity or best practice because there's value in basic comprehension of any subject. Gives you a better foundation to learn more modern stuff.
Re:Let’s Build a Compiler (1995) by userbinator on Monday February 17, 2020 @03:20PM (#22350376)
The basics haven't changed. In some ways, technology has gone backwards over time, in many cases adding more complexity for no real gain. It's good to start from simplicity.