[HN Gopher] Why take a compiler course? (2010)
       ___________________________________________________________________
        
       Why take a compiler course? (2010)
        
       Author : signa11
       Score  : 156 points
       Date   : 2023-03-24 05:52 UTC (1 days ago)
        
 (HTM) web link (blog.regehr.org)
 (TXT) w3m dump (blog.regehr.org)
        
       | yeetaway1111 wrote:
       | It will teach most of the good programming and software
       | engineering practices that apply to any nearly any project.
        
       | AstixAndBelix wrote:
       | >why the hell should I take an electromagnetism course as a
       | physics undergrad? I want to work in fluid dynamics dammit!
       | 
       | unfortunately there are too many people who think a CS curriculum
       | should be an advanced coding bootcamp instead of a place where
       | you actually explore how your software works
        
       | ramg wrote:
       | We use gcc/javac/etc almost daily and having some understanding
       | of what your toolchain is likely to be very beneficial. Here are
       | a few things I've done with my compiler knowledge:
       | 
       | 1. Wrote a simulator of sorts for a 68xx CPU. User passed in
       | assembly files and I simulated the execution and spat out cycle
       | counts. The real-time application had a fixed time window it
       | could not exceed. I did this in my first year out of college with
       | compilers fresh on my mind.
       | 
       | 2. Wrote an automated test tool for a proprietary protocol. The
       | protocol had the usual opcodes but they could only be played in a
       | certain order (cannot send B before C or can send B any number of
       | times and have it be idempotent). The QA engineers were doing
       | this by hand. I asked them if they could automated the test case
       | generation and they looked at me as though I was an idiot. I
       | developed a tool with its own simplified grammar that they could
       | use to build test cases which exercised all
       | combinations/permutations of the opcodes. Saved us a ton of time
       | and made the developers more productive.
       | 
       | 3. My hackiest project was an SGML parser that was used to
       | generate hypertext documents. Tech writer wrote docs in
       | FrameMaker. My hacky parser found the places where the TOC and
       | the Index could be linked and inserted hypertext links. Net
       | result is we had a document that could be printed and viewed
       | online. Think 1993/1994.
       | 
       | I've sat with a number of engineers who thought the compiler was
       | wrong and sat down and looked at the assembly with them and
       | mapped it back to C only for them to realize the bug was in their
       | code.
       | 
       | Compilers are fun. You should take a compiler course just for
       | that!
        
       | saghm wrote:
       | Despite the fact that my algorithms course was ostensibly about
       | learning how to come up with efficient solutions to various
       | problems, the two courses I took that have helped me the most
       | with writing performant code in my career were my compilers
       | course and my architecture course. The compilers course gave me a
       | much stronger understanding of what actually happens when running
       | a line of code I wrote and helped me understand better what types
       | of optimizations could potentially be performed based on the way
       | I write an algorithm, and the architecture course taught me about
       | how a modern CPU actually works with regards to caching, out-of-
       | order processing, branch prediction, etc.
       | 
       | On the other hand, the types of things we discussed in my
       | algorithms course felt very hit-or-miss with regards to whether
       | they actually felt useful or not. I'm not just talking about
       | high-level abstractions that can miss important details in the
       | real world like "memory can be accessed in constant time" either,
       | but solving problems that were so contrived to the point of being
       | almost implausible. The example I always remember is that in one
       | of our problems sets, we were asked to write an algorithm that
       | sorted an array of size N with each element within K indices of
       | the correct sorted position in O(n*log(k)) time. I can't think of
       | any situation where I'd have data so large with a small enough
       | strict upper bound on K that such an algorithm would be
       | necessary, but even if I did find myself in that situation,
       | that's the exact type of input that the naive quicksort
       | implementation would perform more efficiently on!
       | 
       | Maybe someday we'll have powerful enough tools that we can
       | generate code that's performant without needing to do it
       | ourselves, but at least for now, writing code that a computer
       | executes efficiently is much easier when you actually understand
       | what's being run on the computer and how it runs it, and a
       | compilers course is a great way to start learning about the first
       | half of that.
        
       | WalterBright wrote:
       | While one may not be interested in writing compilers, the
       | techniques are applicable elsewhere.
       | 
       | For example, I once wrote a date/time "compiler" that could read
       | dates and times in various human formats and construct a time_t
       | from it. It's a giant mess if you approach it in an ad-hoc
       | fashion. But if you approach it from a lexing then parsing
       | standpoint, things work a lot better.
       | 
       | I see too many attempts at reading a textual data format that are
       | done ad-hoc. Even worse are the attempts to _design_ a data
       | format where the designer clearly had no awareness of lexing and
       | parsing - the format is just one ad-hoc kludge after another.
        
       | agiacalone wrote:
       | Uni CS lecturer here. One of my mentors in grad school was the
       | compiler professor, and I learned a lot from him. I also got a
       | chance to actually teach compilers for the fist time last year
       | and it was one of the most difficult courses I have ever taught.
       | Used the dragon book and had my students create their own
       | lexer/parser based on an invented language that I came up with.
       | 
       | Compilers is one of the few topics that none of my colleagues
       | seem care about, but IMHO it's so very important to learn how to
       | do. In my Uni, the course only gets taught once every few years
       | (it didn't help that our last department chair didn't care for
       | the course at all and never scheduled it).
       | 
       | I count the day that I finished my LL(1) parser and lexer for my
       | own compiler course as a student as the day I "earned" my chops.
       | 
       | Edit: Since there seems to be some discussion on this thread,
       | I'll throw in the actual project that I gave my students (warts
       | and all). https://github.com/agiacalone/cecs-444-semester-project
        
         | ethicalsmacker wrote:
         | Most never "earn their chops" in a traditional sense. These
         | days, it would seem earning your chops is done by running
         | create react app, cobbling together several dozen random
         | javascript libraries and putting out a laughably designed
         | website in a few days.
        
           | havblue wrote:
           | The Georgia Tech cs2130 class, languages and translation, the
           | third required cs class for the major, was notorious as being
           | a weeder course around 1999. The professor made it clear that
           | there would be no partial credit for code that could be core
           | dumped by the teaching assistants. If you weren't good at the
           | class you should probably look forward to writing business
           | applications for IBM, allegedly. So some people used to be
           | hardcore on this subject.
        
             | agiacalone wrote:
             | We have a similar course too which focuses specifically on
             | language design without the compiler part (they do get a
             | bit of compiler theory) which satisfies that "requirement"
             | for graduation. It is much more popular than the compiler
             | course which is perceived as "harder" (it probably _is_
             | when I teach it). ;)
        
           | fsckboy wrote:
           | when I use those sites I think, in a very traditional sense
           | (the French Revolution and the Reign of Terror), "oooh,
           | they've earned their chops!"
        
             | vram22 wrote:
             | Veering a bit more off-topic:
             | 
             | - La Guillotine
             | 
             | - Madame Defarge and friends
             | 
             | - etc.
             | 
             | from A Tale of Two Cities.
             | 
             | IIRC (may be wrong, read as a kid), those ladies used to
             | signal which aristocrats should be chopped vs. not, by
             | signalling with their knitting needles, or a nod or shake
             | of the head, or some such - while sitting in the front row
             | before the guillotine.
             | 
             | Ghoulish. Of course, as a kid, you (I) lap up and relish
             | that stuff, like breakfast cereal.
             | 
             | Edit: Links:
             | 
             | https://en.m.wikipedia.org/wiki/Madame_Defarge
             | 
             | https://en.m.wikipedia.org/wiki/A_Tale_of_Two_Cities
             | 
             | Wow, I did not know before just now seeing the Wikipedia
             | article above, that, to quote it:
             | 
             | [ As Dickens's best-known work of historical fiction, A
             | Tale of Two Cities is said to be one of the best-selling
             | novels of all time. ]
        
         | skitter wrote:
         | I'm curious, why focus entirely on parsing? I only read parts
         | of the Dragon Book, but it didn't go in much detail about other
         | topics, such as types, either. Couldn't you just use a very
         | simple syntax such as S-expressions or even start from an AST
         | directly?
        
           | mathisfun123 wrote:
           | people hyperfocus on parsing because it's far and away the
           | easiest part of a compiler - type inference, optimization,
           | target codegen are infinitely harder and deeper wells to
           | plumb.
        
           | murdoze wrote:
           | FORTH ;)
        
           | agiacalone wrote:
           | A few reasons, although you are only seeing part of the
           | picture with the project. The lectures were all theory-based
           | (more along what you would find in the book).
           | 
           | 1. I had a whopping _three weeks_ to prepare this course from
           | scratch (welcome to Uni teaching) and it was what I could
           | scrape together in that time.
           | 
           | 2. Parsing is highly useful, and I felt my students could
           | benefit from it.
           | 
           | 3. It was what I did in undergrad.
           | 
           | 4. It was not _too_ difficult to accomplish, and a project
           | like this can easily get out of hand for a semester project.
        
             | markus_zhang wrote:
             | I agree with you that parsing, for most people, or even
             | most software engineering people, are much more useful then
             | the other stages. Code generation is also interesting and
             | could be useful too but that's pretty much the two of them.
             | All the "interesting" stuffs people spoke about (e.g.
             | optimization) actually has very few use cases unless you
             | are working on it directly.
        
         | anta40 wrote:
         | From a practical standpoint, compiler dev job is very nice-ish,
         | not typically in high demand, like developing mobile or web
         | apps.
         | 
         | But that's what us, software developers, relied to. No compiler
         | means no app.
         | 
         | Which means some folks gotta maintain the GCC, Go, FPC, etc
         | etc...
        
       | einpoklum wrote:
       | My two answers - based also on personal experience - would be:
       | 
       | 1. If you are ever concerned with code performance, you need to
       | know what the compiler (/interpreter) is doing with your code.
       | With a compiler course, you'll get a basic understanding - enough
       | to later actually look at what the compiler is doing with your
       | real-life code.
       | 
       | 2. If you write a software system which can handle computation
       | tasks that are not fully known at compile-time - such as user
       | queries in some domain-specific language - then you are likely to
       | end up implementing a compiler in your software system. If you
       | haven't learned about compilers, you'll (a.) may fail to realize
       | that and (b.) are likely to do it more poorly than if you have.
       | 
       | ---
       | 
       | My beef with compiler courses, though, is the excessive focus on
       | parsing. Text parsing, look-ahead grammars etc may be interesting
       | in themselves, but IMHO they're mostly self-contained and not
       | what you will be concerned with in the life-scenarios I've
       | described above. I would have liked, in hindsight, to have more
       | time devoted to optimization selection, passes and what goes in
       | each of them, optimization work on the AST vs work on the IR etc.
        
       | pyrolistical wrote:
       | Compilers also show an application of pipelines which can be used
       | architecturally at all levels.
       | 
       | I'm a happy coder if I can translate my problem to a pipeline
       | problem. Each pipeline step can be modelled as a pure function.
       | Each artifact between each step can be inspected and cached.
       | Pipeline failures can be resumed at the last valid artifact
        
       | saagarjha wrote:
       | IMO compilers are a bit like kernel development in that the real
       | learning was the friends you made along the way, rather than
       | actually being able to understand how a compiler works, which is
       | a nice side effect. For example, when you write an OS you learn a
       | lot about how code interfaces with hardware. A compiler is many
       | people's first and only introduction to soundness and formal
       | analysis. Being able to put on the hat of a compiler author can
       | be useful in many fields that have nothing to with compiler
       | development, and that's even if you go beyond "I just want to see
       | what my code is being transformed into".
        
       | UltimateEdge wrote:
       | As a Mathematics undergraduate I am not allowed by my university
       | to officially take (and receive credit for taking) most non-
       | beginner Computer Science courses, including Compilers. At least
       | I'm allowed to attend the lectures and cram it in alongside my
       | other pure math classes!
        
         | epgui wrote:
         | Good on you for being more academically-minded than your
         | university, and shame on them for not encouraging more cross-
         | disciplinary credits!
         | 
         | I went to a relatively small school in Canada, but they were
         | very good about staying out of the way if you tried to take
         | extra courses (with credit).
        
       | the_snooze wrote:
       | The big value I got from taking compilers as an undergrad was
       | that it brought everything together. It's basically where
       | computer architecture, theoretical CS, and software engineering
       | (and a hint of systems security) collide in a very practical
       | manner. Compilers make it very clear how all those seemingly
       | disparate topics apply in real non-trivial systems.
        
         | varrock wrote:
         | These are precisely the type of "ahas" I hope to experience,
         | too, when I begin studying computer science. I've been taking
         | introductory college math courses at my community college to
         | fulfill some prerequisites, and a way for me to stay
         | disciplined in my studies is knowing that concepts like the
         | ones you mentioned are coming. Thank you for sharing!
        
         | 908B64B197 wrote:
         | > Compilers make it very clear how all those seemingly
         | disparate topics apply in real non-trivial systems.
         | 
         | Combined with a proper OS class, it's the first time a student
         | can truly understand all the levels of abstraction from the
         | language to the logic gate.
         | 
         | And it also helps to recognize and solve parsing problems. How
         | many programs end-up containing a parser, even if rudimentary,
         | to read non-trivial input of perform validation? No, you can't
         | use regex for that...
        
         | josephg wrote:
         | I feel the same way about taking Operating Systems. It's a
         | revelation seeing how all the pieces fit together!
        
       | forinti wrote:
       | I've had the chance to build parsers for work.
       | 
       | Once for a templating engine for SQL (taking values from the
       | environment and using them queries). This was really nice for
       | productivity and an intern could churn out dozens of reports a
       | day. That was written with javacc.
       | 
       | Another time by using a parser (written with Antlr) to extract
       | bits of PLSQL packages (procedures, functions) and move them from
       | one environment to another without having to send the whole
       | package.
       | 
       | Although this type of job is rare, it can be really useful when
       | it shows up.
        
       | LtWorf wrote:
       | I've written a compiler that people actually use[1]!
       | 
       | Studying compilers at university was highly beneficial. Before
       | that course the code was a mess...
       | 
       | [1] https://ltworf.github.io/relational/
        
       | geophile wrote:
       | I was in grad school, 77-83. The first year was part time at NYU,
       | and then I went back full time elsewhere, for a PhD.
       | 
       | In that one year at NYU, I took two compiler courses, from RBK
       | Dewar, of Spitbol and Ada fame. My specialty is not languages or
       | compilers, but those courses were incredibly fascinating, and the
       | exposure to the topics I learned has been useful throughout my
       | career.
       | 
       | - I learned about lexing and parsing. I no longer remember the
       | details of LALR, for example. But I understand the basic ideas
       | well enough to construct lexing/parsing software whenever I need
       | it, often using parser generator tools, but also rolling my own
       | on occasion.
       | 
       | - I learned about code optimization, which is a fascinating
       | topic. At the time, Dewar was working on SETL, a set-oriented
       | language. And I remember the power of having sets as a builtin
       | type, and how powerful that was for expressing flow analysis, for
       | example. Those ideas combined nicely with what I later learned
       | about relational algebra, and query optimization. (Codd's paper
       | on the relational model was only seven years old when I started
       | grad school!)
       | 
       | - Exposure to the ideas of interpreters and code generators, and
       | even more fundamentally, the idea of code as a thing that can be
       | manipulated programatically, has been useful throughout my
       | career.
       | 
       | - Oh, and by the way, Dewar was a great teacher.
        
       | ethicalsmacker wrote:
       | I really enjoy low level development... things like OS and
       | compiler design. Emulation, simulation, etc. It's sad there's
       | very little place for these "hobbies" anymore, other than that, a
       | hobby.
        
         | fear91 wrote:
         | You can contribute to open source compilers. It's both fun and
         | beneficial.
        
           | namaria wrote:
           | And just like child rearing and homemaking, another line of
           | work fundamental to the well being of society goes
           | unrecognized, underpaid and expected to be done out of love
           | while other profit from it.
        
       | jonstewart wrote:
       | I did not take a compilers class when I was in college. Many
       | years later, feeling the lack, I bought the Dragon book. I didn't
       | make it past Chapter 4 because I was inspired to write a new
       | library and tool, which then brought me a modicum of career
       | success.
       | 
       | Regehr is right on the money here: parsers and interpreters are
       | everywhere. Once you learn how approachable and applicable they
       | are, you can solve problems faster and better.
       | 
       | I now always recommend to college interns that they take their CS
       | department's compilers course their senior year (along with their
       | English department's Shakespeare course).
        
       | nt591 wrote:
       | I'm currently in a part time masters program for fun and taking
       | the compilers course. I'm sure John's experience is different
       | than mine, but it seems the question should be put to
       | universities. The professor of my course, by his own admission,
       | hasn't studied compilers other than his undergrad decades ago and
       | as far as I can tell was assigned the course to teach. As a
       | result the syllabus is relatively dates. I think I'm 8 weeks in
       | and we've only discussed parsing theory. As far as I can tell
       | there won't be time for detailed study of code gen,
       | optimizations, type checking, etc.
        
       | wolf550e wrote:
       | (2010), though as relevant as ever
        
       | frej wrote:
       | How can a compiler course not be requeried for a comp.sci degree?
       | We had that. And i'm surprised others do not.
        
         | bombolo wrote:
         | We didn't have compilers in undergrad, but we had formal
         | languages being required.
        
       | HervalFreire wrote:
       | Anyone know of any good free courses?
        
         | ajanicij wrote:
         | Stanford Compilers course:
         | https://learning.edx.org/course/course-v1:StanfordOnline+SOE...
        
         | stefanos82 wrote:
         | I currently study https://github.com/DoctorWkt/acwj which is
         | quite interesting I have to admit.
         | 
         | I'm interested in this topic, because I want to participate in
         | TinyC compiler's development; I use it quite often to run C
         | demos of mine and its execution is instant.
         | 
         | The least I can do is to either fix bugs or extend it to
         | support more C99, C11, C17 features, and why not even C23 as
         | soon as it gets approved?
         | 
         | All I need is to gain the necessary knowledge and experience to
         | jump right in and start fixing things.
        
         | erichocean wrote:
         | I would do the _Crafting Interpreters_ book to begin with. It
         | 's free online.
        
           | KineticLensman wrote:
           | Agree! Learned a lot from doing it myself. Now trying out the
           | techniques I learned there to write a VM for lisp
        
       | thriftwy wrote:
       | See also https://steve-yegge.blogspot.com/2007/06/rich-
       | programmer-foo...
        
       | vishnugupta wrote:
       | I have done my share of compilers work a long time ago, my
       | masters thesis was on this topic.
       | 
       | The article mentioned a very important but not well known aspect
       | right at the end which is compilers is not a homogeneous topic
       | but has a fairly independent parts. Front end, optimizers, and
       | target code generation. I dabbled little bit in optimizers and a
       | lot in target code generation. It was quite fun to figure out how
       | to produce optimal machine instructions, or use as few registers
       | as possible etc. Along the way I also got to learn a bit about
       | the OS because one has to know an executable file's layout, how
       | to utilize heap, make sure not to over run stack etc.
       | 
       | And some fun algorithms too, such as a smart way to traverse tree
       | by pointer reversal to avoid recursion as one can't use recursion
       | (extra space) while garbage collection.
        
       | adrianmonk wrote:
       | My unexpected side benefit: some compiler error messages became
       | comprehensible.
       | 
       | Oh, an lvalue is required? Since I now actually know WTF that
       | means, I can deal with it.
       | 
       | It also cleared up a situation that had always confused the hell
       | out of me: sometimes I'd compile and get 1 or 2 errors, so I'd
       | make corrections and try compiling again, but then I'd get 8 or
       | 10 errors! Seeing that whatever I did made everything much worse,
       | I'd conclude those most not be the right corrections, and I'd
       | feel lost and maybe even get stuck.
       | 
       | After taking compilers, I finally understood why: compilers have
       | phases, and my corrections allowed the parsing phase to complete,
       | which meant the semantic analysis phase could happen and give me
       | errors. So for example, if I finally fix enough syntax errors
       | that the compiler can tell I've written a function with some
       | variables in it, then it can start giving me errors that they're
       | not the right types.
        
         | einpoklum wrote:
         | > Oh, an lvalue is required? Since I now actually know WTF that
         | means, I can deal with it.
         | 
         | That's not so much a compiler thing as it's a language thing.
         | Perhaps even a C (and C++) language thing...
         | 
         | https://en.cppreference.com/w/cpp/language/value_category
        
         | [deleted]
        
         | NineStarPoint wrote:
         | Agreed on this, by far the largest benefit from a utility
         | standpoint from my programming language design course was
         | increased understanding of errors.
        
       | jll29 wrote:
       | Compiler construction is a part of practical computer science
       | that includes
       | 
       | - formal languages, Chomsky hiearchy and automata (DFAs, NFAs)
       | 
       | - algorithms & data structures (syntax trees, symbol tables &
       | hashing)
       | 
       | - parsing algorithms
       | 
       | - asymptotic complexity (of automata recognition/acceptance and
       | parsing algorithms)
       | 
       | - software architecture (single pass versus multi-pass,
       | abstractions)
       | 
       | - operations research (graph coloring based register allocation)
       | 
       | - assembler & automatic code generation
       | 
       | - virtual machines & interpreters
       | 
       | It is a field where theory and practice come together beautifully
       | (and works like the Aho et al. "Dragon Book" or Wirths
       | "Compilers" are masterpieces that lucidly lay things out so after
       | reading Chapter 2 of the former, or all of the latter short
       | volume (barely 100 pages), a compiler is basically demystified to
       | any undergrad).
        
         | hardware2win wrote:
         | Imo
         | 
         | Formal langs theory is too weird and formal
         | 
         | And dragon book is too focused on formal math
        
       | erichocean wrote:
       | If you are interested in modern compiler infrastructure that
       | subsumes a lot of recent PhD level research topics, I can highly
       | recommend MLIR.
       | 
       | It's under the LLVM Foundation umbrella.
       | 
       | If you just want to deal with lexing, parsing, and interpretation
       | (from scratch) for a reasonably complex class-based language, I
       | recommend doing the (free) online book _Crafting Interpreters_.
       | 
       | The second half of that book re-implements the same language in C
       | with garbage collection and a fast byte code interpreter.
        
       ___________________________________________________________________
       (page generated 2023-03-25 23:00 UTC)