KDE a sdilene knihovny (Was Re: Programovani - shared libraries na Linuxu)
Lubos Lunak
l.lunak na sh.cvut.cz
Neděle Září 9 15:10:00 CEST 2001
Pavel Kankovsky wrote:
> On Wed, 5 Sep 2001, Lubos Lunak wrote:
>
[snip]
>
>> Treba odklon od pouzivani CORBA (jo jo, KDE zkouselo tuhle vec
>> pouzivat jeste pred GNOME), byt ted KDE zalozene na CORBA, asi by se
>> to ani do 128MB pocitace slusne neveslo.
>
> Ovsem GNOME ji pouziva porad (AFAIK) a do 128 MB se v pohode vejde.
Ovsem GNOME nedostava od gcc/ld premii pres 0,5MB pameti na proces.
[snip]
>
>> Moje teorie je takova, ze gcc si obcas moc nevi rady s vecmi jako
>> sablony, virtualni tabulky, inline metody a podobne a pro jistotu je v
>> nekterych pripadech emituje vic nez jednou. Sice jsou jako
>> LINK_ONCE_DISCARD, takze ve vysledne knihovne jsou tyhle symboly jen
>> jednou, ale linker uz se neobtezuje (nebo mozna ani nemuze) podivat,
>> ze tyhle symboly uz existuji v nejake knihovne, s kterou se tahle
>> vysledna linkuje. Takze vsechny veci jsou pekne zduplikovane a dopadne
>> to jak s tou libtc nahore.
>
> Aaaa...asi jsme uhodili hrebicek na hlavicku. C++, your second name is
> bloat. Cele je to totiz *vrozeny* defekt C++.
Nechtel bych se takhle umet trefovat hrebickum na hlavicku. Mel bych z
toho moc casto zavazany palec. Doporucuji k precteni Stroustrupovo 'Design
and Evolution of C++', C++ je navrzeno tak, ze muze byt stejne efektivni
jak rychlostne tak pametove jako C; vlastnosti, ktere v C nemaji
ekvivalent, jsou tak efektivni, jako ekvivaletni C kod, nepouzite C++
vlastnosti nemusi pridat nic navic. To, ze lidi od gcc jeste u nekterych
veci porad na to neprisli, jeste neznamena, ze to nejde. To je takova hezka
smycka :
1) _implementace_ C++ je neefektivni
2) lidi si reknou, ze C++ je neefektivni a nepouzivaji ho
3) je malo lidi pouzivajicich C++, je malo lidi, kteri maji zajem na
zlepsovani implementance C++
4) pokracujte bodem 1)
>
> Zacalo to v C: jednotlive moduly jsou de facto uplne nesouvisejici kusy
> zdrojoveho kodu, ktere se zcela samostatne zkompiluji a nakonec slinkuji.
> Pritom veci jako definice typu (napr. struct) prestavaji po kompilaci
> existovat a dokonce je mozne, ze ruzne moduly si pod stejnym jmenem
> predstavuji ruzne typy (a dokonce je mozne, ze to bude ve vysledku
> fungovat).
>
> Drhnout to pochopitelne zacalo pri generovat ladicich informaci, protoze
> ty musi definice typu obsahovat, ale kompilator nema tuseni, ktery
> z modulu typ definuje (ve smyslu rozdilu deklarace a definice)...ony ho
> totiz ve skutecnosti definuji vsechny, ktere ho pouzivaji. Takze kazdy *.o
> vyrobeny ze zdrojaky pracujiciho se stdio obsahuje v ladicich informacich
> kompletni definici FILE. (Tohle mozna nekterym lidem vysvetli zahadu, proc
> -g zpusobi tak ukrutny narust velikosti po kompilaci.)
>
> A ted do toho prislo C++, kde definice trid, konstant (pres const) a
> inline funkci ci metod (nemluve o sablonach, ale ty pro jednoduchost
> nebudu rozvadet) vede ke generovani *skutecneho* kodu a/nebo dat bez toho,
> aby bylo jasne urceno, ktery modul je vlastne ten pravy (srovnejte to
> napr. s moduly v jinych jazycich: Turbo Pascal, Delphi, Ada...tam vsude je
> vztah kompilacnich jednotek a definic jasne urcen). Cili nezbyva nez to
> vlastne vygenerovat pri *kazde* kompilaci a pak doufat, ze to linker nejak
> chytre posklada dohromady. Vyskytly se take snahy (zvlaste u sablon), ze
> by kompilator automaticky udrzoval umele moduly, do kterych by takove veci
> ukladal, ale nebyly moc uspesne (aspon pokud vim). GNU C++ extenze #pragma
> interface a #pragma implementation byly take pokus o reseni tohoto
> problemu.
>
> Nejhorsi je situace samozrejme v pripade dynamickeho linkovani, protoze
> tady ten bordel musi do znacne miry uklidit az dynamicky linker. Kdyz
> vyrabite dynamickou knihovnu, tak ld predem *nevi*, s cim dalsim bude
> slinkovana, a tudiz musi predpokladat nejhorsi -- tj. tam nahazet vsechno,
> co je potreba. Dynamic linker pak pochopitelne uvidi vicenasobne definice
> tehoz a musi to nejak vyresit.
No jasne, ze ja na to neprisel hned, za vsechno muze jazyk. Kdyz se
podivame treba na tohle ( zestrucneny realny priklad, B je QCString ) :
class A
{
public:
virtual ~A();
};
class B
: public A
{
public:
void f();
};
Naprosto regulerni C++ kod. B samozrejme potrebuje vtable, protoze kvuli
dedeni z A ma virtualni destruktor implicitne generovany prekladacem. Jenze
gcc v B nikde zadnou non-inline virtualni metodu nenajde, vedle ktere by
emitoval tu vtable a nenapadne ho nic lepsiho nez emitovat vtable kdykoliv
je treba. Pritom mi trvalo asi tak 10 sekund vymyslet, ze vtable se da v
pohode emitovat jen v modulu implementujicim B::f() .
A je vic takovych pripadu, kdy gcc generuje zbytecne vic vyskytu pro veci
s 'vague linkage'. Vazne nechapu, proc se musi vicekrat emitovat virtual
thunk pro nektere metody tridy QWidget, kdyz se pro ni emituje vtable jen
jednou, nebo proc zrejme existuje ve vice vyskytech __pure_virtual (coz je
tedy naprosta perla, nemuzu si pomoct).
[snip]
>
> P.S. Dovolil bych si pozadat, aby byly dopisy citovany zpusobem, ktery
> nebude u ctenaru vyvolavat dojem, ze nekdo (ja) rekl neco, co rekl nekdo
> uplne jiny.
>
Pardon. Nechtelo se mi se opakovat do dvou zprav za sebou a kdyz jsem
presouval ty nektere useky, tak jsem pred ne dal o jedno mene '>'. Dam si
priste pozor.
Lubos Lunak
--
l.lunak na email.cz ; l.lunak na kde.org
http://dforce.sh.cvut.cz/~seli
Další informace o konferenci Linux