🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.objects
Article #15708

Re: pl.comp.objects FAQ (Frequently Asked Questions and more)

#15708
From: Sektor van Skijlen
Date: Sat, 03 Mar 2007 14:03
78 lines
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-mail
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>

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