From 4f8fb321369ff5a1018c648c0838f2fb9179d08e Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Wed, 21 Sep 2022 17:21:41 +0200 Subject: [PATCH] some docs about compiler internal architecture --- docs/source/prog8compiler.odg | Bin 0 -> 31243 bytes docs/source/prog8compiler.svg | 490 ++++++++++++++++++++++++++++++++++ docs/source/technical.rst | 26 ++ docs/source/todo.rst | 1 - 4 files changed, 516 insertions(+), 1 deletion(-) create mode 100644 docs/source/prog8compiler.odg create mode 100644 docs/source/prog8compiler.svg diff --git a/docs/source/prog8compiler.odg b/docs/source/prog8compiler.odg new file mode 100644 index 0000000000000000000000000000000000000000..afc1d19f8591b2a6391c85c23d43cdf5defedc88 GIT binary patch literal 31243 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 V4ams<+{Q@wh!a%w7ymzJ{|hmiU}pdT literal 0 HcmV?d00001 diff --git a/docs/source/prog8compiler.svg b/docs/source/prog8compiler.svg new file mode 100644 index 000000000..9923a781f --- /dev/null +++ b/docs/source/prog8compiler.svg @@ -0,0 +1,490 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + antlr + + + + + + + + Read module.p8 + + + + + + + + Tokenize + + + + + + + + Convert to AST + + + + + + + + Semantic and Type checking + + + + + + + + Preprocess AST + + + + + + + + + + + + + + + + + + + + + + + + + + + + + importmodule + + + + + + + + + + + + + + + + + + + + + + Optimize + + + + + + + + Postprocess AST + + + + + + + + + + + + + + + + + + + + + + Parse + + + + + + + + + + + + + (optional step) + + + + + + + + Select CodeGenfor target + + + + + + + + + + + + + + (if assembly generation is selected) + + + + + + + + Make Intermediate AST + + + + + + + + + + + + + + + Generate IR + + + + + + + + + + + + + + + Optimize IR + + + + + + + + + + + + + + + Generate 6502 Asm + + + + + + + + + + + + + (depends on codegen) + + + + + + + + Assemble (64tass) + + + + + + + + + + + + + + + hello.p8 + + + + + + + + + + + + + + + hello.prg + + + + + + + + + + + + + + + Generate VM code + + + + + + + + hello.p8virt + + + + + + + + + + + + + + + + + + + + + + + + + + + (future) + + + + + + + + \ No newline at end of file diff --git a/docs/source/technical.rst b/docs/source/technical.rst index 7dc83755d..ea2295792 100644 --- a/docs/source/technical.rst +++ b/docs/source/technical.rst @@ -119,3 +119,29 @@ Prog8 also provides some help to deal with this: - you should use a ``clobbers(X)`` specification for asmsub routines that modify the X register; the compiler will preserve it for you automatically when such a routine is called - the ``rsavex()`` and ``rrestorex()`` builtin functions can preserve and restore the X register - the ``rsave()`` and ``rrestore()`` builtin functions can preserve and restore *all* registers (but this is very slow and overkill if you only need to save X) + + +Compiler Internals +------------------ + +Here is a diagram of how the compiler translates your program source code into a binary program: + +.. image:: prog8compiler.svg + +Some notes and references into the compiler's source code modules: + +#. The ``compileProgram()`` function (in the ``compiler`` module) does all the coordination and basically drives all of the flow shown in the diagram. +#. ANTLR is a Java parser generator and is used for initial parsing of the source code. (``parser`` module) +#. Most of the compiler and the optimizer operate on the *Compiler AST*. These are complicated + syntax nodes closely representing the Prog8 program structure. (``compilerAst`` module) +#. For code generation, a much simpler *intermediate AST* has been defined that replaces the *Compiler AST*. + Most notably, node type information is now baked in. (``codeCore`` module) +#. An *Intermediate Representation* has been defined that is generated from the intermediate AST. This IR + is more or less a machine code language for a virtual machine - and indeed this is what the built-in + prog8 VM will execute if you use the 'virtual' compilaton target and use ``-emu`` to launch the VM. + (``intermediate`` and ``codeGenIntermediate`` modules, and ``codeGenVirtual`` and ``virtualmachine`` module for the VM related stuff) +#. Currently the 6502 ASM code generator still works directly on the *Compiler AST*. A future version + should replace this by working on the IR code, and should be much smaller and simpler. + (``codeGenCpu6502`` module) +#. Other code generators may either work on the intermediate AST or on the IR. Selection of what code generator + to use is mostly based on the compilation target, and is done in the ``asmGeneratorFor()`` function. diff --git a/docs/source/todo.rst b/docs/source/todo.rst index 86b3159bf..499a55bd8 100644 --- a/docs/source/todo.rst +++ b/docs/source/todo.rst @@ -3,7 +3,6 @@ TODO For next release ^^^^^^^^^^^^^^^^ -- write some documentation about the compiler architecture and where to plug a code generator onto. - vm: implement remaining sin/cos functions in virtual/math.p8 and merge tables ...