Mailing lists / fpc-devel / 2017-04
Discussion about "Dynamic packages"
11 messages · 6 people · –
- SSven Barth 4
- BBishop 3
- Ggabor 1
- MMarco van de Voort 1
- MMattias Gaertner 1
- MMichael Van Canneyt 1
Reply by email Subscribe to this list Your subscription
Read-only archive. Use j and k to move between messages.
Bishop wrote 24 lines
Dynamic Packages will in each case be optional, they will not be not mandatory.
Michael.
Am 13.04.2017 08:44 schrieb "Bishop via fpc-devel" <
: At first I would like to designate a circle of tasks which in principle
can effectively decide by means of system of dynamic packets. Lets remember for what DLL`s and SO`s was be created. It was for memory saving (by sharing code and static conts parts from many applications in memory). Now there is so many memory even on phones, that this almoust have no sence (its still work for things like LibC, ZLib and so.). But this kind of libraries better make with C-style interface (or use COM/CORBA interfaces like in DirectX if it`s realy needed). Yes, sometimes someone make libraries for C++ only, but it because of a dominant position of this language. Pascal didn`t have it. So, as i think, dynamic packages can be usefull only for something like plugin system in editors like 3Ds Max, Photoshop and etc.
The intended purpose of dynamic packages (and libraries in general) is not to save memory (in fact a binary plus packages would be much larger than the statically compiled binary), but to share *binary* code so that this code does not need to reside in multiple executables.
But Sven Bart wrote that "Package libraries can however only be used by a
binary compiled with the same compiler as they rely on quite a bit of compiler magic.", so they be usefull only for projects that target to have plugins writed in pascal only. I try to say, that there is not so many situations that we realy need this system. I dont say that we dont need it at all, no. But disadvantages from this system must no effect on all other projects. This why i have some propositions.
Yes, they are specifically for Pascal code and more specifically only FPC code as you can't use a Delphi dynamic package with FPC or the other way round.
Plugin systems are indeed one of the uses of dynamic packages (with the main benefactor probably being Lazarus), but as I wrote above sharing of binary code is also an important point. Especially if your own "product" consists of multiple executables that share the same code.
Во время моего общения с Sven Barth он писал "With dynamic packages you
can share classes, strings, memory, etc. between the modules (the main binary and the different package libraries)". Let's look at the most widespread operating systems. This will be Windows and Unix-family. In Windows every application starts from ntdll.dll and walk via kernel32.dll and only after that go to "main"-function in EXE file. So kernel32.dll always loaded. And its already have not bad memory manager (Process heap functions group). Why dont use it? It allow share memory with C code too (and strings with pascal code). Its already exist in application memory. In Linux if application use shared libraries it use libdl.so witch need libc.so. So we already have libc heap. As i know in FreeBSD and Solaris situation same.
It isn't merely the memory management. The Object Pascal RTL exists of much more than just memory management: there is exception handling, the RTTI, resource strings, unit initialization and finalization. This are all thing that other languages either have no clue about (e.g. C) or have their own implementations anyway.
Also while using the memory manager of the system (which you can by the way by using the "cmem" unit) will allow you to share strings (and other allocated memory) between libraries it doesn't magically allow C or C++ code to understand Pascal strings.
And the second of my proposal it make dynamic packages like 2nd way in
compiler (like it maked in MSVS where we can select link CRT staticaly or dunamicaly). Add some switch to compiler (and have 2 compiler variants of RTL, now we have this in RTL source with {$IFDEF FPC_3_0_0} macro) that will allow generate or not generate compiler magic for dynamic packages. They need in not so many cases, but all this indirect memory accesses make all applications slow (memory, first of all memory latency, in bottleneck of all today computers).
Units are compiled in a way that they can be used inside a package and (as it is now) outside of it. Whether your executable uses dynamic packages or not is determined merely by a compile time option of your executable (namely if you specify to use a dynamic package using -FP, e.g -FPrtl).
Regards,
Sven
Show quoted text 5 lines
'What do we need them for? What's "special" about packages?':
[...] It isn't merely the memory management. The Object Pascal RTL exists of much more than just memory management: there is exception handling, the RTTI, resource strings, unit initialization and finalization.
Good examples. I added them.
Mattias
"Mattias Gaertner" wrote 6 lines
not
Show quoted text 7 lines
>[...] > It isn't merely the memory management. The Object Pascal RTL exists of
much
> more than just memory management: there is exception handling, the RTTI, > resource strings, unit initialization and finalization. Good examples. I added them.
Thanks.
Though I should probably take the time somewhen and clean up that article a bit to reflect the current state a bit more.
Regards,
Sven
Bishop wrote 12 lines
No, those changes are not optional, though in those cases where the compiler can avoid them (e.g. inside the same unit) it already tries to. And for global variables you can use {$importdata off}. Please not that our threadvars are *not* allocated by the linker. Each access to a threadvar goes through the fpc_relocate_threadvar function (just check the assembler code to see what I mean).
Show quoted text 18 lines
Delphi uses these indirect accesses from the beginning. Do you hear anyone really complain about performance problems due to indirect accesses?
And it's not about saving RAM or disk memory! It's about *binary code reuse*, the ability to fix a bug in multiple executables by merely fixing the one bug in a package.
Show quoted text 27 lines
These special sections are executed by the C runtime. We don't link against the C runtime at least on Windows and on Linux however which reduces the dependencies.
Show quoted text 8 lines
No, the FPC specific parts are there for a reason. They aren't there just for the fun of it.
Show quoted text 8 lines
No. This will needlessly complicate things.
Regards,
Sven
In our previous episode, Sven Barth via fpc-devel said:
And it's not about saving RAM or disk memory! It's about *binary code reuse*, the ability to fix a bug in multiple executables by merely fixing the one bug in a package.
And for extensions too. If a program has a package N that governs plugins, all plugins can also link to that N and work with it as if it was part of the main program (with some minor limitations), sharing all library state and compiler generated tables.
Being able to deliver parts only to some customers, or parts developed after the main application has been delivered is a major feature.
No, those changes are not optional, though in those cases where the compiler can avoid…
W dniu 2017-04-13 o 22:27, Sven Barth via fpc-devel pisze:
And it's not about saving RAM or disk memory! It's about *binary code reuse*, the ability to fix a bug in multiple executables by merely fixing the one bug in a package.
Should not all packages depend on the "fixed" package also be recompiled in this case?
Regards, Michał.
"gabor" wrote 11 lines
in this case?
As long as the fix is only in the implementation then you don't (except for inline routines).
Regards,
Sven
