🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #267820

Re: Ciemna strona C++

#267820
From: Sektor van Skijlen
Date: Mon, 26 Nov 2007 12:58
98 lines
6760 bytes
Dnia Sun, 25 Nov 2007 00:43:40 +0100, Marcin ?Qrczak? Kowalczyk skrobie:
> Pliki nagłówkowe zawierają istotne informacje, których nie ma ani
> w *.so, ani często nawet w standardowej dokumentacji danej biblioteki,
> a są potrzebne, żeby dało się tej biblioteki używać:

> - wartości stałych typów izomorficznych z liczbami całkowitymi
>   (typów wyliczeniowych, używanych też czasem jako zbiory bitów)

Powiedzmy.

> - rozkład pól w strukturach (nazwy pól, typy, ich kolejność)
>   i metod w klasach (w przypadku C++)

Nie. No co ty. Jak obsłużysz np. sytuację, gdy pole jest takiego typu, które
ma jakiś własny operator przypisania i robi różne dziwactwa? Co ci w takim
przypadku po znajomości delty pola?

Musisz jedynie znać metody i ich sygnatury. Metody powinny ci zaś zapewnić
dostęp. Musisz ewentualnie dodatkowo mieć jakieś "object factory", jeśli
chcesz, żeby z poziomu innego języka można było tworzyć obiekty takich klas.
Ale rozkład pól niech już pozostanie prywatną sprawą klasy - tyylko wyjątkowo
ewentualnie dostępną dla interfejsu w C++.

Przypominam zresztą na marginesie, że w Javie też nie masz dostępu do
informacji o delcie pola (tzn. inaczej - informacja ta jest teoretycznie
dostępna, wraz z nazwami pól i deskryptorami ich typów, tyle że z tej
informacji nie jesteś w stanie zrobić żadnego użytku). W kodzie metod używane
jest na żywca przesunięcie liczbowe względem początku obiektu. A prawa dostępu
do pól są rozwiązywane podczas kompilacji (co innego w przypadku metod). Jest
to sensowne, bo jeśli dobierasz się do obiektu w sposób statyczny, to
kompilator ci ewentualnie odrzuci kod, który jest niezgodny z prawem dostępu
do pola, a jeśli w sposób dynamiczny, to dostępu do pól i tak nie masz w
ogóle.

(Oczywiście osobna sprawa jest gdy masz kod JVM-owy w innym języku, niż Java.
Ja mam we wstępnych zamysłach C++ na JVM-a i tam to dopiero będzie się
działo!).

> - typy argumentów funkcji (w przypadku C; w przypadku C++ można
>   próbować to odmanglowywać), typy wyników funkcji (w przypadku C
>   i C++) i typy globalnych zmiennych

Moment, bo mam wrażenie, że kręcimy się w kółko.

Jeśli już podałeś Javę, jako przykład, to przypominam ci, że z pliku *.class
można otrzymać z powrotem DOKŁADNIE IDENTYCZNE ŹRÓDŁO danej klasy. No, z
dokładnością do optymalizacji (typu zwijanie String + String na StringBuffer)
oraz nazw zmiennych lokalnych (nie ma ich w ogóle, więc trzeba wygenerować).
Swoją drogą ja tak ostatnio odzyskiwałem kod w Javie, jak skasowałem sobie
przypadkiem źródła.

To m.in. oznacza, że w pliku *.class dostępne są te informacje, które w
przypadku C++ zawierają się również w pliku nagłówkowym, więc niewykluczone,
że sensowne stanie się niedługo wykombinowanie jakiejś metody na ZAPAKOWANIE
PLIKU NAGŁÓWKOWEGO (lub "zbazodanowanego") do pliku biblioteki dynamicznej.

Pytanie tylko, do czego potrzebujemy tych dodatkowych informacji.

Bo jeśli - powiedzmy - mamy SKĄDŚ dostępne te informacje i chcemy tylko
wywołać sobie jakąś funkcję/metodę - to nie ma problemu. Jeśli natomiast
chcemy sobie automatycznie wygenerować interfejs w innym języku do takiej
biblioteki (przypominam na marginesie, że wśród popularnych bibliotek, które
mają dowiązania w wielu językach, żadna nie posiada generowanego automatycznie
interfejsu), to oczywiście potrzebujemy pliku nagłównowego, ale nie rozumiem,
co w tym dziwnego.

> - treść funkcji inline

Bzdura - do funkcji inline z biblioteki nie mają dostępu aplikacje kompilowane
osobno. Jeśli biblioteka UDOSTĘPNIA określoną funkcję, jako samo *.so, to ma
jej wersję outline.

> - definicje makr

I jak przepraszam przetłumaczysz treść takiego makra na, powiedzmy, Pythona?

> - treść szablonów (w przypadku C++)

Praktycznie wszystko to, co opisałeś wyżej, to są narzędzia służące TYLKO C++.
Jeśli zostały użyte, to znaczy że nikt nie przewidywał dostępu z żadnej innej
perspektywy, niż C++ (do tego celu często pisane są dowiązania do C).

> Można próbować ręcznie kopiować potrzebne informacje z plików
> nagłówkowych, ale efekt jest po pierwsze pracochłonny i błędogenny,
> a po drugie wrażliwy na binarnie niekompatybilne zmiany w oryginalnej
> bibliotece - i to w najgorszy możliwy sposób, czyli z niekontrolowaną
> kaszaną w przypadku rozjechania się.

Albo generować automatycznie. Nie jest to żadna wielka filozofia, skoro od lat
tak właśnie robi SWIG.



-- 
//  _    ___         Michal "Sektor" Malecki <sektor(whirl)kis.p.lodz.pl>
\\ L_ |/ `|  /^\ ,()                         <ethouris(O)gmail.com>
// \_ |\  \/ \_/ /\ C++ bez cholesterolu: http://www.intercon.pl/~sektor/cbx
"Java is answer for a question that has never been stated"
Technical Details
Message-ID: <fiefu7$faq$1@kujawiak.man.lodz.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!newsfeed.silweb.pl!news.man.lodz.pl!not-for-mail
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl> <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl> <fi27ds$gt1$1@kujawiak.man.lodz.pl> <fi458p$fmv$1@bozon2.softax.pl> <fi9ckc$2u5$1@kujawiak.man.lodz.pl> <1195918508.27382.40.camel@qrnik> <fi9hmg$dct$1@news.vectranet.pl> <1195922067.12235.1.camel@qrnik> <fia74t$28b$1@news.vectranet.pl> <1195947820.12235.76.camel@qrnik>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!newsfeed.silweb.pl!news.man.lodz.pl!not-for-mail
From: Sektor van Skijlen <ethouris@guess.if.gmail.com.is.valid.or.invalid>
Newsgroups: pl.comp.lang.c
Subject: Re: Ciemna strona C++
Date: Mon, 26 Nov 2007 12:58:47 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 98
Sender: Michal Malecki <sektor@student.kis.p.lodz.pl>
Message-ID: <fiefu7$faq$1@kujawiak.man.lodz.pl>
References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgtb6j$nur$1@news.vectranet.pl> <fgv6ba$k14$1@bozon2.softax.pl> <fgvkne$u3b$1@news.vectranet.pl> <fh1tjd$dtt$1@bozon2.softax.pl> <fh2lj6$qkh$1@news.vectranet.pl> <fha3as$pap$1@bozon2.softax.pl> <fhaj8u$e02$1@news.vectranet.pl> <fhf09d$ohq$1@bozon2.softax.pl> <fhfi9l$640$1@news.vectranet.pl> <fhurmu$5d9$1@bozon2.softax.pl> <fhv020$8k1$1@news.vectranet.pl> <fi1bs4$nn3$1@bozon2.softax.pl> <fi27ds$gt1$1@kujawiak.man.lodz.pl> <fi458p$fmv$1@bozon2.softax.pl> <fi9ckc$2u5$1@kujawiak.man.lodz.pl> <1195918508.27382.40.camel@qrnik> <fi9hmg$dct$1@news.vectranet.pl> <1195922067.12235.1.camel@qrnik> <fia74t$28b$1@news.vectranet.pl> <1195947820.12235.76.camel@qrnik>
NNTP-Posting-Host: student.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1196081927 15706 212.191.89.21 (26 Nov 2007 12:58:47 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Mon, 26 Nov 2007 12:58:47 +0000 (UTC)
User-Agent: tin/1.8.3-20070201 ("Scotasay") (UNIX) (FreeBSD/6.2-RELEASE-p3 (sparc64))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit