Article View: pl.comp.objects
Article #15708Re: pl.comp.objects FAQ (Frequently Asked Questions and more)
From: Sektor van Skijlen
Date: Sat, 03 Mar 2007 14:03
Date: Sat, 03 Mar 2007 14:03
78 lines
5786 bytes
5786 bytes
Dnia Sat, 03 Mar 2007 12:26:28 +0100, Mariusz Lotko skrobie: > Czy możesz podać jakieś źródła mówiące o typach wartościowych i > niewartościowych? Google na takie pytanie odpowiada wyłącznie Twoimi > postami z usenetu. Problem w tym, że wiedza na ten temat jest aktualnie na etapie "odkrywamy, że w języku nagle jest coś, czego twórca nie wymyślił". Natomiast tak dokładniej sprawa polega na tym, że o istnieniu wartości od dłuższego czasu wszyscy wiedzieli, tylko że nie bardzo wiedzieli, jak się mają do tego zabrać. Przykładowo, od zawsze wiedziano, że takie 'int' i 'Car' różni coś więcej, niż tylko zestaw dozwolonych operacji. Ale w większości języków niestety sprowadzono to do specjalnego traktowania liczb całkowitych (tak jest w Smalltalku i w Javie), a co za tym idzie, uniemożliwiono tworzenie własnych typów wartościowych. W Javie po prostu stwierdzono, że wszystkie typy wartościowe to będą typy wbudowane (czyli, najprościej mówiąc, są to wszystkie rzeczy, których nie tworzy się przez new) i użytkownik nie może definiować własnych. Tematem się raczej nikt nie zajął i raczej nikt go nie opracował - wiedziałbym o tym, bo po takim wałkowaniu tematu, jakie zorganizowałem na pl.comp.lang.c, myślę że ktoś dobrze obyty z ogólnie dostępną wiedzą nt. informatyki już by to zgłosił. Może nikt nie uważa go za wart uwagi. Co jeszcze ciekawsze, większość języków (nie tylko Smalltalk i Java, ale również wiele funkcjonalnych) ma dziwnie "uniwersalne" podejście do tych obiektów i usiłuje zaciemnić ten podział. W Smalltalku przykładowo (a także np. w OCamlu) masz każdy obiekt zapisany na czterech bajtach. W tych czterech bajtach są jednak wyznaczone odpowiednie bity, które odróżniają liczbę całkowitą od wskaźnika na obiekt. W ten sposób liczba całkowita jest takim samym obiektem, jak każdy inny, a fakt, że nie następuje przydział pamięci przy tworzeniu, jest szczegółem implementacyjnym. Jednak podział na "wartości" i "obiekty" bierze się nie z samej konstrukcji języków, tylko z pojęć używanych również w codziennym życiu. Wszystko zależy od tego, co oznacza dla nas stwierdzenie "ten sam". Przykładowo, jeśli mówimy "ten sam samochód", to chodzi nam o ten sam egzemplarz samochodu, a nie o inny samochód tylko identyczny. Jeśli mówimy "ten sam kolor" albo "ten sam producent" (!) - chodzi o to, że samochód został pomalowany farbą o tym samym kodzie koloru, a w drugim przypadku, że identyfikator producenta jest identyczny. Identyfikator i kolor nie mogą mieć egzemplarzy, więc to są wartości. Identyfikator akurat dodatkowo obrazuje nam coś, co jest odpowiednikiem "referencji", która też jest typem wartościowym. Z podziałem na typy wartościowe i niewartościowe wiąże się również kwestia porównywania, nie tylko kopiowania.Przykładowo, porównywanie powinno się odbywać tylko dla typów wartościowych, a to powinno konkretnie stwierdzić, czy oba obiekty posiadają tą samą wartość. Porównanie obiektów typów niewartościowych nie ma sensu - albo uznajemy go za obiekt wartościowy (tzn. taki, gdzie kopiowanie z innego czyni go identycznym z tym innym), albo niewartościowy, więc nie ma tu czego porównać. Niestety języki próbujące iść w poprzek tego podziału dostają nadmiernej komplikacji. Nie pamiętam nawet dokładnie, jakie języki to mają, ale jest ich wiele. Chodzi o osobne wręcz operatory do porównania osobno wartości i tożsamości - i tu mamy wiele różnych kombinacji, jak <> i != (dla nierównych), czasem jest = i == itd. Muszą być wprowadzone, bo sam język nie rozróżnia typów obiektowych i wartościowych. Programista zwykle rozróżnia, nawet bezwiednie, ale i tak teoretycznie da się zrobić taką głupotę, jak obiekt wartościowy z własną tożsamością. Ale tu ciekawostka - Java np. nie posiada takiego rozróżnienia i to jest w niej pozytywne. Problem z Javą jednak leży gdzie indziej - jej typ String jest typem obiektowym, a nie wartościowym (podczas gdy String moim zdaniem należy właśnie do typów wartościowych i takim jest np. w C++). -- // _ ___ 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:
<esbv7t$7o$1@kujawiak.man.lodz.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!agh.edu.pl!news.agh.edu.pl!newsfeed.silweb.pl!news.man.lodz.pl!not-for-mailReferences:
<pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.pl> <pan.2007.02.22.19.13.55.43827@go2.pl> <erl5gf$bi2$1@inews.gazeta.pl> <eru75v$dmm$1@bandai.magma-net.pl> <ervbaa$am4$1@inews.gazeta.pl> <pan.2007.02.26.21.12.45.8078@go2.pl> <es6b6u$2ls$1@kujawiak.man.lodz.pl> <esbllu$51n$1@bandai.magma-net.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.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.objects
Subject: Re: pl.comp.objects FAQ (Frequently Asked Questions and more)
Date: Sat, 3 Mar 2007 14:03:41 +0000 (UTC)
Organization: LODMAN - Metropolitan Area Network in LODZ, Poland
Lines: 78
Sender: Michal Malecki <sektor@zly.kis.p.lodz.pl>
Message-ID: <esbv7t$7o$1@kujawiak.man.lodz.pl>
References: <pl-comp-objects-faq-1-1166202604@ict.pwr.wroc.pl> <pan.2007.02.22.19.13.55.43827@go2.pl> <erl5gf$bi2$1@inews.gazeta.pl> <eru75v$dmm$1@bandai.magma-net.pl> <ervbaa$am4$1@inews.gazeta.pl> <pan.2007.02.26.21.12.45.8078@go2.pl> <es6b6u$2ls$1@kujawiak.man.lodz.pl> <esbllu$51n$1@bandai.magma-net.pl>
NNTP-Posting-Host: zly.kis.p.lodz.pl
Mime-Version: 1.0
X-Trace: kujawiak.man.lodz.pl 1172930621 248 212.191.89.2 (3 Mar 2007 14:03:41 GMT)
X-Complaints-To: abuse@man.lodz.pl
NNTP-Posting-Date: Sat, 3 Mar 2007 14:03:41 +0000 (UTC)
User-Agent: tin/1.6.2-20030910 ("Pabbay") (UNIX) (SunOS/5.9 (sun4u))
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit