[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

Slowo kluczowe export i kompilator g++-4.2

einstein5@vp.pl

3/16/2007 11:45:00 AM

Wiem ?e kompilator g++-4.2 jezyka c++ ignoruje s3owo kluczowe export
czy istnieje jaka? flaga kompilatora g++-4.2 która nie ignoruje to s3owo
kluczowe i tym samym kompiluje szablony to pliku obiektowego. Bya mo?e
istnieje jaka? niestabilna opcja w3?czana jak?? flaga,która w3?cza pe3n?
obs3uge export. Za ka?d? pomoc z góry dziekuje
5 Answers

Sektor van Skijlen

3/18/2007 10:35:00 PM

0

Na pl.comp.lang.c einstein5@vp.pl skrobie:
> Wiem ?e kompilator g++-4.2 jezyka c++ ignoruje s3owo kluczowe export
> czy istnieje jaka? flaga kompilatora g++-4.2 która nie ignoruje to s3owo
> kluczowe i tym samym kompiluje szablony to pliku obiektowego. Bya mo?e
> istnieje jaka? niestabilna opcja w3?czana jak?? flaga,która w3?cza pe3n?
> obs3uge export. Za ka?d? pomoc z góry dziekuje

Je?li masz w samochodzie zablokowany przycisk "wzno? sie w powietrze", to mo?e
istnieje jaka? mo?liwo?a, ?eby ten przycisk odblokowaa?

A na powa?nie: istnieje tylko kilka kompilatorów, które implementuj? "export"
(s3ysza3em o dwóch, w tym Comeau).

--
// _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com>
// \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~...
"Java is answer for a question that has never been stated"

einstein5@vp.pl

3/20/2007 1:06:00 AM

0

Sektor van Skijlen wrote:

> A na powa?nie: istnieje tylko kilka kompilatorów, które implementuj?
> "export" (s3ysza3em o dwóch, w tym Comeau).
>
To mnie martwi,?e istnieje taka niedoskona3o?a kompilatora g++ jezyka c++
?e ono nie posiada obs3ugi export!

einstein5@vp.pl

3/20/2007 1:08:00 AM

0

einstein5@vp.pl wrote:

> Sektor van Skijlen wrote:
>
>> A na powa?nie: istnieje tylko kilka kompilatorów, które implementuj?
>> "export" (s3ysza3em o dwóch, w tym Comeau).
>>
> To mnie martwi,?e istnieje taka niedoskona3o?a kompilatora g++ jezyka c++
> ?e ono nie posiada obs3ugi export!
A kiedy przypuszczasz, ?e kompilator g++ z pakietu gcc bedzie mia3 pe3n?
obs3uge s3owa kluczowego export?

Raf256

3/20/2007 1:16:00 AM

0

einstein5@vp.pl <etncce$me2$2@news.onet.pl> Tuesday 20 of March 2007 02:07

>> To mnie martwi,?e istnieje taka niedoskona3o?a kompilatora g++ jezyka c++
>> ?e ono nie posiada obs3ugi export!
> A kiedy przypuszczasz, ?e kompilator g++ z pakietu gcc bedzie mia3 pe3n?
> obs3uge s3owa kluczowego export?

Ale bez export templates naprawde da sie ?ya :) W czym problem?

Jedynie ?e udostepniaj?c swoj? biblioteke szablonow? musisz udostepnia jej
?ród3a 3?cznie z algorytmem implementacji a nie tylko interfejs... o to
chodzi>

--
Raf256

Sektor van Skijlen

3/21/2007 11:15:00 AM

0

Na pl.comp.lang.c einstein5@vp.pl skrobie:
> einstein5@vp.pl wrote:

> > Sektor van Skijlen wrote:
> >
> >> A na powa?nie: istnieje tylko kilka kompilatorów, które implementuj?
> >> "export" (s3ysza3em o dwóch, w tym Comeau).
> >>
> > To mnie martwi,?e istnieje taka niedoskona3o?a kompilatora g++ jezyka c++
> > ?e ono nie posiada obs3ugi export!
> A kiedy przypuszczasz, ?e kompilator g++ z pakietu gcc bedzie mia3 pe3n?
> obs3uge s3owa kluczowego export?

Podejrzewam, ?e nie bedzie mia3.

To "export" to jest bardziej niedoci?gniecie standardu, ni? niedoci?gniecie
kompilatorów.

Go?cie od standardu stwierdzili, ?e jezyk musi bya kompletny, a wiec je?li
mamy definicje jakiej? funkcji, to musi istniea w jezyku mo?liwo?a
umieszczenia jej w jednej jednostce kompilacji i uzyskanie do niej dostepu z
drugiej.

Zapomnieli tylko, ?e je?li chc? to uzyskaa, to w takim przypadku kompilator
C++ musi miea zmienione regu3y linkowania, musi miea w3asny linker, w3asny
format plików *.o (nie wiem, czy da sie nawet umie?cia w takim pliku *.o dane,
które czyta3by linker C++ i które ignorowa3by linker C) i wtedy mo?na miea
mo?liwo?a zrobienia takiego export.

?eby to by3o zrobione porz?dnie, to musia3oby sie to odbywaa w ten sposób:

1. Ka?dy plik *.o zawiera to, co normalnie, plus definicje export templates.
Je?li nie jest mo?liwe dodanie ignorowanej przez linker C sekcji, to trzeba te
definicje wrzucia do jeszcze osobnego pliku (nazwijmy go *.co).

2. Podczas wi?zania, je?li zostanie u?yty wzorzec funkcji/metody, gdy mamy
jego zapowied? (kompilator umie?ci3 odpowiednie ??danie rozwi?zania symbolu),
odpowiedni eksportowany template musi bya pobrany z pliku *.co,
skonkretyzowany, i wyprodukowany z tego kod do3?czony do ca3ego zestwu
kompilacji.

?eby by3o jasne - kompilator Comeau porz?dnie nie robi. Kompilator Comeau robi
to w ten sposób, ?e w przypadku odwo3ania do odpowiedniego zewnetrznego
wzorca, wyszukuje _?ród3a_, w których wzorzec jest zdefiniowany. To znaczy,
nie posiada czego? takiego, jak zrzut bazy danych, w którym ma skompilowany
wzorzec. W efekcie wprowadza on dodatkowe wymaganie, które nie jest ujete w
standardzie C++ - podczas kompilacji kodu, który u?ywa export template,
kompilator musi miea dostep do ?róde3, w których jest definicja export
template.

Dla mnie to jest nieco ?mieszne i w3a?ciwie mo?na stwierdzia, ?e implementacja
tego przez Comeau to jedynie "proof of concept". Nikt tego na powa?nie nie
u?ywa. Zrobili to chyba tylko po to, ?eby sie pochwalia, ?e w 100%
implementuj? standard (co i tak nie jest prawd?).

Ale pociesze cie: istnieje koncepcja zwana "extern template", bya mo?e dodadz?
to do nastepnego standardu, ale ta funkcjonalno?a jest dostepna w wielu
kompilatorach (w tym gcc, tylko nie na wszystkich platformach - tylko na tych,
na których jest u?ywany GNU ld) ju? dzi?. Oczywi?cie bez jawnego
specyfikowania "extern template".

Polega to na tym, ?e jak masz zapowied?:

template <class T> void Funkcja( T );

To jej u?ycie generuje ??danie rozwi?zania symbolu. Symbol ten jest tworzony w
sposób jednoznaczny, wiec bedzie pasowa3 do symbolu, który zostanie
wygenerowany w pliku, w którym znajduje sie definicja tej funkcji.

Tylko jedna uwaga - symbol mo?e zostaa wygenerowany tylko ze SKONKRETYZOWANEJ
funkcji. To oznacza, ?e je?li chcesz u?ywaa tej powy?szej funkcji z typami,
powiedzmy, 'int' i 'std::string', to musisz w pliku, w którym jest definicja
funkcji, dodatkowo zamie?cia:

template<> void Funkcja( int );
template<> void Funkcja( std::string );

Spowoduje to ??danie wygenerowania konkretyzacji, a te konkretyzacje bed?
mia3y zewnetrzne symbole.

Jednak tak ogólnie - moim skromnym zdaniem u?ywanie wzorców do tworzenia
d3ugich funkcji, które maj? bya skonkretyzowane, nie ma ?adnego sensu. Wzorce
funkcji powinny bya krótkie i wy3?cznie inline, a d3u?sze cze?ci powinny bya
zdefiniowane za pomoc? osobnych funkcji. Oczywi?cie, ?e najlepiej by by3o,
gdyby kompilator potrafi3 wygenerowaa funkcje "jak najmniejszym kosztem" i w
miare mo?liwo?ci, ?eby nie generowa3 osobnego kodu funkcji dla ka?dego zestawu
konkretyzuj?cych parametrów, i "export template" temu w3a?nie mia3o s3u?ya.
Ale niestety nikt z twórców implementacji C++ sie o to nie pokusi3.

Swoj? drog?, zrobienie tego wedle "porz?dnego" opisu przedstawionego wy?ej
bya mo?e by3oby proste w gcc ju? dzi?, dzieki istnieniu funkcjonalno?ci
"precompiled headers". Skoro potrafi? robia zrzut bazy danych do pliku i
skorzystanie z niej pó?niej, to bya mo?e mogliby to samo zrobia z
eksportowanymi wzorcami. Oczywi?cie i tak nie obejdzie sie bez wywo3ywania
kompilatora przez linker i zmianach w linkerze - ale przynajmniej nie bedzie
takiego ograniczenia, jak w Comeau, ?e musi bya dostep do ?róde3.


--
// _ ___ Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `| /^\ ,() <ethouris(O)gmail.com>
// \_ |\ \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~...
"Java is answer for a question that has never been stated"