Go Programming talk [OT]
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Mon Jun 7 04:42:36 PDT 2010
On 06/07/2010 06:36 AM, Kagamin wrote:
> Andrei Alexandrescu Wrote:
>
>> I think an honest discussion - as I hope is the tone in TDPL -
>> serves the language and its users better than giving half of the
>> story.
>>
> An honest advertisement is an unusual thing. I saw none. You think,
> TDPL is the first one. There're many features in other languages no
> speak of costs, and every forgotten cost is a lie.
Agreed. Well, we'll see. I try to discuss costs, tradeoffs, and
alternative approaches that were considered and rejected (and why) for
all major features of D.
For example, few books give a balanced view of dynamic polymorphism; in
some you'll find the nice parts, in others you'll find the not-so-nice
parts. I tried to discuss both in TDPL:
====================
\dee's reference semantics approach to handling class objects is
similar to that found in many object-oriented languages. Using
reference semantics and \idx{garbage collection} for class objects has
both positive and negative consequences, among which the following:
\begin{itemize*}
\item[+]\index{polymorphism}\emph{\textbf{Polymorphism.}} The level
of indirection brought by the consistent use of references enables
support for \idx{polymorphism}. All references have the same size,
but related objects can have different sizes even though they have
ostensibly the same type (through the use of inheritance, which
we'll discuss shortly). Because references have the same size
regardless of the size of the object they refer to, you can always
substitute references to derived objects for references to base
objects. Also, arrays of objects work properly even when the actual
objects in the array have different sizes. If you've used C++, you
sure know about the necessity of using pointers with
\idx{polymorphism}, and about the various lethal problems you
encounter when you forget to.
\item[+]\emph{\textbf{Safety.}} Many of us see \idx{garbage
collection} as just a convenience that simplifies coding by
relieving the programmer of managing memory. Perhaps surprisingly,
however, there is a very strong connection between the infinite
lifetime model (which \idx{garbage collection} makes practical) and
memory safety. Where there's infinite lifetime, there are no
dangling references, that is, references to some object that has
gone out of existence and has had its memory reused for an unrelated
object. Note that it would be just as safe to use value semantics
throughout (have \cc{auto a2 = a1;} duplicate the @A@ object that
@a1@ refers to and have @a2@ refer to the copy). That setup,
however, is hardly interesting because it disallows creation of any
referential structure (such as lists, trees, graphs, and more
generally shared resources).
\item[--]\emph{\textbf{Allocation cost.}} Generally, class objects
must reside in the \index{garbage collection}garbage-collected heap,
which generally is slower and eats more memory than memory on the
stack. The margin has diminished quite a bit lately but is still
nonzero.
\item[--]\emph{\textbf{Long-range coupling.}} The main risk with
using references is undue aliasing. Using reference semantics
throughout makes it all too easy to end up with references to the
same object residing in different---and unexpected---places.
In~Figure~\vref{fig:aliasing}, @a1@ and @a2@ may be arbitrarily far
from each other as far as the application logic is concerned, and
additionally there may be many other references hanging off the same
object. Interestingly, if the referred object is immutable, the
problem vanishes---as long as nobody modifies the object, there is
no coupling. Difficulties arise when one change effected in a
certain context affects surprisingly and dramatically the state as
seen in a different part of the application. Another way to
alleviate this problem is explicit duplication, often by calling a
special method @clone@, whenever passing objects around. The
downside of that technique is that it is based on discipline and
that it could lead to inefficiency if several parts of an
application decide to conservatively clone objects ``just to be
sure.''
\end{itemize*}
Contrast reference semantics with value semantics \`a~la @int at . Value
semantics has advantages, notably equational reasoning: you can always
substitute equals for equals in expressions without altering the
result. (In contrast, references that use method calls to modify
underlying objects do not allow such reasoning.) Speed is also an
important advantage of value semantics, but if you want the dynamic
generosity of \idx{polymorphism}, reference semantics is a must. Some
languages tried to accommodate both, which earned them the moniker of
``impure,'' in contrast to pure object-oriented languages that foster
reference semantics uniformly across all types. \dee is impure and
up-front about it. You get to choose at design time whether you
use~OOP for a particular type, in which case you use \kidx{class};
otherwise, you go with @struct@ and forgo the particular~OOP amenities
that go hand in hand with reference semantics.
====================
Andrei
More information about the Digitalmars-d
mailing list