[fpc-devel] Parallel processing in the compiler
Hans-Peter Diettrich
DrDiettrich1 at aol.com
Wed Sep 8 03:10:11 CEST 2010
Florian Klaempfl schrieb:
>> I stopped searching after finding such code in aasmtai, aoptbase,
>> aoptobj, assemble, globals, nadd, ncgutil, nld, ogcoff, options,
>> optloop, pdecsub, pmodules, psub, symdef, systems.
>
> Well, I see no problem with it. Of course, one can do an overly complex
> design to avoid this but as I said before, I see no use in doing so. It
> makes only maintainance more complex.
That's why I suggested solutions other than $IFDEF or virtual methods.
Many $IFDEFs also occur in declarations and uses clauses. These parts
should be removed from the general compiler code, with all such details
encapsulated in the back-end class(es).
>> For logical (functional) grouping. Looking at the parser, a single unit
>> would be sufficient for every front-end.
>
> This is not logical to me. For me it is logical to group the parser by
> expression sub parser, declaration sub parser etc. and even split the
> declaration parser into type etc. one.
A parser structure should support the maintenance of the language, i.e.
syntax. In so far I'd group together e.g. directive handling, to ease
the maintenance in case of new directives. Your suggested structure
applies to the semantics of the language, which should be implemented
outside a concrete parser (front-end). It's also a bad idea to move
procedure processing into a different class (tprocinfo), and let it call
paser methods from there. That's turning things upside down, breaking
the recommended separation between front-ends and compiler :-(
In an OO design the parser methods must reside in one class, so that the
means for further structuring are very limited. That's why I suggested
local subroutines for parsing specific (non-reusable) parts of the language.
>>>> so that finally the compiler could be decomposed into a
>>>> small number of building blocks (packages...), with tiny interfaces to
>>>> each other.
>>> Counter example: your attempt of the OOP parser :)
>> What's wrong with the parser interface in TParser?
>
> That it inherits from TScanner.
It's only a matter of taste, whether the parser should be a member or
the base of the parser class. My choice of a base class allows to hide
many methods and fields from the public scanner interface, that shall be
used only by the parser. A member also introduces another reference
(indirection), and another (global) variable, so I decided to inherit
from the scanner class.
The next decision, of turning the parser units into include files, is
also only an intermediate step. When the semantics have been separated
from the parser, the code in these include files can be moved into the
language unit, and the remaining p* units will contain nothing but the
semantical interface to the intermediate data structures. *That* is the
place where your suggested structure makes sense, no doubt :-)
>> A formal separation of cpubase from cpuinfo is not helpful, unless it
>> has a logical (functional) justification.
>>
>
> It has for me a logical and formal one: cpuinfo contains info which is
> used by generic/common parts of the compiler. Cpubase contains the basic
> stuff which is used by the cpu specific part of the compiler. Of course,
> there are deviations from this rule due to laziness and simplicity and
> refactoring over time, but this is how it is used to be.
Thanks, I'll remember that for a later later refactoring. In my attempt
to unify the existing back-ends, I came across several abstract classes
(tai...), which look like the more "natural" candidates for back-end
base classes. When the cpubase (and more) information and procedures are
moved into the interface of these classes, unwanted references to
concrete cpu units can no more occur in both the compiler and external
tools.
DoDi
More information about the fpc-devel
mailing list