Search code examples
compiler-constructionterminology

Wanted: good definition of the term "lowering" in the context of compilers


Can anyone point me to a good definition of the term "lowering" in the context of compilers?

From what I can tell, it is the translation of a higher-level operation into an equivalent combination of lower-level operations, but I'm not really sure, and I can't find one after a few minutes of searching on Google. (There are a few usages of "lowering" e.g. in GCC or LLVM but no references to a definition.)


Solution

  • Dr. Dobbs just published an article by Walter Bright (of dlang fame), where he mentions the term:

    Lowering

    One semantic technique that is obvious in hindsight (but took Andrei Alexandrescu to point out to me) is called "lowering." It consists of, internally, rewriting more complex semantic constructs in terms of simpler ones. For example, while loops and foreach loops can be rewritten in terms of for loops. Then, the rest of the code only has to deal with for loops. This turned out to uncover a couple of latent bugs in how while loops were implemented in D, and so was a nice win. It's also used to rewrite scope guard statements in terms of try-finally statements, etc. Every case where this can be found in the semantic processing will be win for the implementation.

    If it turns out that there are some special-case rules in the language that prevent this "lowering" rewriting, it might be a good idea to go back and revisit the language design.

    Any time you can find commonality in the handling of semantic constructs, it's an opportunity to reduce implementation effort and bugs.