Fuzion Toolchain Modules
This page describes the internal design of the Fuzion Toolchain with its modules (Java packages) and their inter-dependencies.
Modules
The following modules should exist:
dev.flang.util
contains utilities used by most other modules.dev.flang.ast
the abstract syntax tree.dev.flang.parser
the parser, depends on ast, since it constructs the original AST of the front end.dev.flang.fe
the front end, depends on ast and mir since it transforms the abstract syntax tree into the module IR.dev.flang.ir
the abstract intermediate representation, provides common infrastructure for mir, air and fuir.dev.flang.mir
the module intermediate representation, based on ir, created by fe, taken as input by me.dev.flang.me
the middle end, creates air from mir.dev.flang.air
the application intermediate representation, based on ir, created by me, taken as input by opt.dev.flang.opt
the optimizer, creates fuir from air, uses backend dev.flang.be.interpreter for compile time constant evaluation.dev.flang.fuir
the fuzion intermediate representation, based on ir, created by opt, taken as input by be.*.dev.flang.be.*
the back ends, create platform dependent binaries from fuir.dev.flang.tools
the command line tools, depends on parser, fe, me, opt and be.
![tools modules](/design/images/tools_modules.png?sessionid=uVngrWnXpGRCMUo7LqwpQw)
An important aspects of this architecture is that later phases are fully separated from earlier ones:
- the middle end is independent of parsing and any syntactic sugar that was removed by the front end
- the optimizer is independent of aspects removed by the middle end such as generics in addition to the parsing and syntactic sugar processed by the front end.
- the back end is independent of aspects removed by the optimizer such as inheritance calls, dynamic binding, match expression, etc. in addition to front end and middle end details.