-
Notifications
You must be signed in to change notification settings - Fork 187
Description
The current Rust compiler contains two IRs before GENERIC:
- HIR for type-checking
- MIR for borrow-checking and some pre-optimizing.
My previous experiences are more about functional programming language's compiler. That's relatively easier for coding, since there's pattern matching, and there're fewer side-effects (or even no) so that the optimizing is pretty easy: find the correct pattern, and inline the function or closure, then execute the rewriting rules. This process can cover many common optimizing, say, constant-fold, dead-variable-elimination, and dead-function-elimination, etc. For Rust, I think they're doing similar rewriting, but I need more researches.
The Rust compiler is written in Rust, so there's pattern matching. I guess we have to write more code for the tree node matching. After all, pattern matching is just syntax sugar, which expands more code that we have to write in C++.
I'm not sure if we can follow the exact design of HIR and MIR, since C++ may not be possible to cover the expressiveness exactly so that it's better to design a similar IR for taking advantage of C++ features. I'm just guessing, and I need more researches for the conclusion.
So I think the plan could be:
- Implementing HIR according to Rust's design
- Type-checking in HIR
- Implementing MIR
- HIR->MIR
- Borrow-checking
- Other pre-optimizing
- MIR->GENERIC
That's a rough plan, there're more things, including memory management, library interfaces, exceptions handling, etc. But I'm not sure where to put them in the pipeline. So I just listed them.
Comments?