[fpc-devel] RIP NoGlobals
DrDiettrich1 at aol.com
Thu Sep 30 18:52:25 CEST 2010
Jonas Maebe schrieb:
> There are more things that prevent that, not in the least that almost
> any source code error will result in lots of memory leaks from the
IMO just such problems can be reduced by moving global variables into
classes. When e.g. a single Compiler object holds the references to all
other heap objects, an entire cleanup can be performed in the destructors.
This is where the Pascal "singleton" hack (units for classes) differs
from true OOP, because units can not be "destroyed". The many
constructors and destructors of such compiler singletons (InitCompiler,
DoneCompiler...) should be callable (and actually be called) after every
>> For compiler development and debugging purposes it would be very nice,
>> when all targets are covered in one compile.
> It increases the compiler build time, which is not nice.
Building an compiler for all targets can be done in e.g. make fullcycle,
or in an according .lpi, while the default compiler still can be built
for only the specified target. As before, every target has to be
included explicitly, by referencing its "root" unit.
> And I
> personally, as a compiler developer and debugger, think it's very nice
> that everything is cleanly separated and that it's not possible to have
> accidental cross-target dependencies, which could result in changes in
> the constants/types for one target to suddenly impact a completely
> different target.
The target specific types etc. have to be encapsulated, so that they can
not be used by accident. This is not hard to manage (still hard to
implement ;-), because the conflicting target-specific units and types
have to be renamed for "parallel" use. Since this disallows to use
target specific types in general compiler code, proper virtualization is
enforced by that renaming, so that many of your problems will disappear
> Until FPC is developed by perfect programmers that never make any
> errors, I think that minimising the way in which things can get
> entangled is the best way.
A good OOP language and development system shall not only *allow* for OO
programming, it also should *encourage* the use of OOP. When compiler
developers state that their OOP compiler is constructed in an non-OO
way, for performance or other reasons, this IMO is only an excuse for
not understanding the pros of OOP, or for bad use or implementation of
the support for objects and related types (dynamic strings...).
It's possible that the use of OO features, together with spaghetti code,
can result in a performance degradation. But OTOH performance can
improve as well, when *all* (related) parts of a project cooperate by
using OO features.
In detail I still doubt that the use of dynamic strings *everywhere*
will really result in an much slower compiler - the opposite may be true
as well. It's known that stringhandling in an OO way can result in poor
performance (see .NET strings), due to clumsy overloading of the string
operators - but such overhead can be reduced by using more compiler
magics, instead of general overloading. Also arguments like "FillChar
takes a long time", as an argument against using classes (InitInstance),
IMO is only a misinterpretation of the profiling information - it might
come as well from the page faults, that occur on the first access to new
heap objects, and only becomes *visible* in the use of a common
(FillChar...) procedure, while otherwise the page faults are added to
arbitrary code, that accesses an heap object for the first time.
More information about the fpc-devel