home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / comp / object / 5093 < prev    next >
Encoding:
Internet Message Format  |  1993-01-28  |  8.1 KB

  1. Path: sparky!uunet!news.univie.ac.at!scsing.switch.ch!univ-lyon1.fr!ghost.dsi.unimi.it!rpi!usc!elroy.jpl.nasa.gov!ames!agate!doc.ic.ac.uk!uknet!gdt!aber!aberfa!pcg
  2. From: pcg@aber.ac.uk (Piercarlo Grandi)
  3. Newsgroups: comp.object
  4. Subject: Procedures and their instances (objects in traditional OO languages)
  5. Message-ID: <PCG.93Jan27160420@csthor.aber.ac.uk>
  6. Date: 27 Jan 93 16:04:20 GMT
  7. References: <1993Jan13.061114.18430@netcom.com> <PCG.93Jan14154212@decb.aber.ac.uk>
  8.     <1993Jan15.033713.27130@netcom.com> <PCG.93Jan19235921@decb.aber.ac.uk>
  9.     <DAVIS.93Jan22105234@passy.ilog.fr>
  10. Sender: news@aber.ac.uk (USENET news service)
  11. Organization: University College of Wales, Aberystwyth
  12. Lines: 170
  13. In-Reply-To: davis@passy.ilog.fr's message of 22 Jan 93 09: 52:34 GMT
  14. Nntp-Posting-Host: thor.dcs.aber.ac.uk
  15. X-Old-Subject: Re: FAQ  Part 1 (of 2) [ objects, closures, continuations ]
  16.  
  17. >>> On 22 Jan 93 09:52:34 GMT, davis@passy.ilog.fr (Harley Davis) said:
  18.  
  19. Davis> In article <PCG.93Jan19235921@decb.aber.ac.uk> pcg@aber.ac.uk
  20. Davis> (Piercarlo Grandi) writes:
  21.  
  22. pcg> (Bob Hathaway) said:
  23.  
  24.    pcg> More precisely objects are values of a procedure instance
  25.    pcg> (closure/continuation) record type.
  26.  
  27.    objsys> Since the FAQ will typically be for newcomers, could you
  28.    objsys> please put the last sentence in English and/or give
  29.    objsys> references?
  30.  
  31. pcg> The references are easily produced: "Hierarchical Program
  32. pcg> Structures", in "Structured Programming", Academic Press, and
  33. pcg> "Structure and Interpretation of Computer Programs", MIT Press.
  34.  
  35. pcg> In particular they show that (in class based OO languages) classes
  36. pcg> are procedures, and objects are procedure instances; closures if
  37. pcg> the language is a traditional OO one, and continuations if the
  38. pcg> language is an actor OO one.
  39.  
  40. Davis> Classes and objects are not procedures;
  41.  
  42. First, this is not what I wrote; I wrote:
  43.  
  44. pcg> (in class based OO languages) classes are procedures, and objects
  45. pcg> are procedure instances
  46.  
  47. Both the qualification in parenthesis and the dictinction between
  48. procedures and procedure instances are important (even if for the sake
  49. of extreme brevity, and I regret that, I did not make the first explicit
  50. in the very short frase: "More precisely objects are values of a
  51. procedure instance (closure/continuation) record type.").
  52.  
  53. Second, classes and objects are procedures and procedure instances in
  54. two very real senses; that this is how historically they were
  55. 'invented', both in capability systems (the PDP-1) and in OO languages
  56. (Simula 67); and that this is how they actually behave, even if this is
  57. disguised by syntax and foggy terminology (the very special status of a
  58. C++ constructor can only be fully understood if it is considered the
  59. body of its class seen as a procedure, and even its invocation syntax is
  60. inspired to that).
  61.  
  62. Davis> rather, they can be implemented or, perhaps, thought of as
  63. Davis> procedures in some languages for some OO models.
  64.  
  65. Indeed: implemented *and* thought of as procedures in most OO languages
  66. for the dominant OO model, the one originating from Simula 67 (and
  67. virtually all capability systems, I am sorry to report; I wish it were
  68. different).
  69.  
  70. Davis>  Two reasons:
  71.  
  72. Davis> 1. In latently typed languages with first-class procedures, most
  73. Davis>    objects (except for real procedures) will return false when asked
  74. Davis>    if their type is procedure.
  75.  
  76. So what, except in Simula 67 even the syntax does not resemble much that
  77. of a procedure definition or invocation, but this should not fool us.
  78.  
  79. Davis> 2. The simplistic SICP OO implementation in terms of closures does not
  80. Davis>    account for multi-methods.
  81.  
  82. The simplistic SICP OO "implementation" is isomorphic with how classes
  83. and objects are implemented *and* behave in 90% of current OO languages,
  84. e.g. C++, Objective C, Eiffel, Smalltalk, and so on; so whetther
  85. simplistic or not, it has some historical and practical importance.
  86.  
  87. On the other hand I completely agree that such a simplistic, Simula 67
  88. derived notion of class and object does not account for multimethods,
  89. and indeed that this is regrettable. I had written:
  90.  
  91. pcg> (in class based OO languages)
  92.  
  93. where maybe I should have written 'in Simula 67 derived OO languages'.
  94. IMNHO with multimethods OO languages are not as class based as
  95. hierarchically oriented ones.
  96.  
  97. I had indeed gone further than this in a subsequent article:
  98.  
  99. pcg> * Having objects be procedure instances and classes be procedures has
  100. pcg>   the unfortunate effect of being constrained by the nested scope
  101. pcg>   properties of procedures in conventional languages. This results in
  102. pcg>   difficulties with non hierarchical program structures: not by chance
  103. pcg>   the seminal paper on the OO decomposition paradigm by Dahl an Hoare
  104. pcg>   has title "Hierarchical Program Structures". After CLOS I think it it
  105. pcg>   is apparent (to me at least) that getting to OO via the more direct
  106. pcg>   overloading route is more flexible, as overloading can be made to
  107. pcg>   depend on multiple parameters, not just on that of the procedure
  108. pcg>   instance.
  109.  
  110. Well, we now know all this is apprent to you as well as me. Wonderful. :-)
  111.  
  112. Davis> Also, what is the difference between a "procedure" and a
  113. Davis> "procedure instance"?
  114.  
  115. I really meant "procedure instance". A procedure is one thing, an
  116. instantiated procedure (a closure or a continuation) is quite another
  117. thing.
  118.  
  119. Davis> Perhaps you meant to say that a class can be thought
  120. Davis> of as a procedure which returns procedures.
  121.  
  122. No, I did not mean this. What returns procedure _instances_ (objects)
  123. given a procedure (class) is the 'NEW' operator.
  124.  
  125. I believe, from your background, that you know the distinction, so maybe
  126. I am expressing myself poorly. I will try to be more explicit:
  127.  
  128. A procedure is a tuple consisting of a context (the parameters and the
  129. local variables) and a block.
  130.  
  131. Calling a procedure involves four  steps (as far as I know only the
  132. obscure SL5 language is "reflective" enough to allow the programmer to
  133. distinguish them):
  134.  
  135.     1 a new tuple is created with a copy of the context and
  136.       the same block ('copying')
  137.  
  138.     2 it is transformed into a closure by setting up the binding
  139.       between the names of the parameters in the context and the
  140.       values of the arguments ('filling')
  141.  
  142.     3 it is transformed into a continuation by associating with
  143.       it an inactive thread state. ('making')
  144.  
  145.     4 the inactive thread state is continued/resumed by the current
  146.       thread. ('continuining')
  147.  
  148. Usually only #2 and #3 are called procedure instances; and the term
  149. procedure instance is most often used in the literature in the context
  150. of recursive procedures, where the same procedure can have as many
  151. instances as there are recursion levels (contour model and all that).
  152.  
  153. To make it clearer, I will give come examples:
  154.  
  155. * 'function'/'closure' in Lisp gives the programmer a handle on the result
  156.   of step #2 (in shallow bound Lisps one can choose which bindings are
  157.   put into the context, while in deep bound Lisps the entire environment
  158.   is).
  159.  
  160. * 'call/cc' in Scheme gives the programmer a handle on the result of
  161.   step #3.
  162.  
  163. * freezing arguments (aka partial application) in Pop-2 performs #1 and
  164.   #2 _only_.
  165.  
  166. * 'NEW' in Simula 67 performs steps #1-4, and 'DETACH' and 'RESUME'
  167.   operate at the step #4 level; so in Simula 67 objects can be either
  168.   closures (the body of the class contains no 'DETACH' was empty) or
  169.   continuations (after a 'DETACH'). Thus it can be said that Simula 67
  170.   gave birth to both the closure (passive object ?) and actor (active
  171.   object?) based OO language families (typically programs in Simula 67
  172.   are written in closure based style for non simulation applications,
  173.   and in actor based style for discrete simulation application -- this
  174.   is very clear from the original Simula 67 reference manual).
  175.  
  176. * 'new' in C++ does steps #1-4, but there is no primitive to suspend and
  177.   resume the instance/object (the constructor must run to completion),
  178.   so in C++ objects are all closures (like in Eiffel, Objective C, and
  179.   so on).
  180.  
  181. * Under Unix 'exec' performs steps #1-2, 'fork' is steps #3-4 (in a
  182.   rather funny way, let me say), and 'pause' and 'kill' operate at the
  183.   step #4 level.
  184.  
  185. * protected procedures/type managers in capability architectures are
  186.   the result of performing steps #1-3.
  187.