noren@dinl.uucp (Charles Noren) (06/15/90)
About a week ago I posted a response to a query about Object Oriented graphics tools. I had some questions about the vendor and my e-mail responses to each of the equirer's has bounced, so I'm posting this article. We have been evaluating for over a week now the Objective-C compiler and support tools, which include a browser, the standard foundation class library (ICpak101) and their graphics class library (ICpak201). Objective-C is made by: The Stepstone Corporation 75 Glen Road, Sandy Hook, CT 06482 (203) 426-1875 We are working on a Sun 3/470 with a color monitor using SunOS 4.0.3. We have also tried it out on a Sun 3/260, and a Sun 3/50 with only 4MB RAM and a monochrome monitor. The tools work fine on all machines tested including our dog 3/50 (the graphics package makes some nice assumptions about patterns in place of colors on a monochrome screen). In fact, on the 3/50 the graphics windowing package seemed more responsive than the SunView windowing environment underneath it. Some specific comments about the Objective-C environment: o Objective-C, the language. For a C programmer, I've found this language to be very easy to learn. The documentation, which includes a tutorial and examples, is a pleasure to read. The OO extensions are very simple to understand and I was able to write my first Objective-C program within an hour of first reading the manual. The OO extensions are Smalltalk-like, including the late binding mechanisms of the objects. This Smalltalk-like paradigm is very powerful and easy to learn and is one of Objective-C strengths over C++. The langauge does have a couple of worts. One is that the current version does not support class variables. I am told that this will be added possibly in the next version of the compiler. The other item missing is that Objective-C, like Smalltalk, does not have multiple-inheritence. For me this is no problem, although I know there is *strong* opinions on both sides of this issue. o The Browser. The Objective-C browser is WONDERFUL! It comes up in the look and feel of the Objective-C graphics package (ICpak201). It is currently a read-only browser, but a read/write browser is due to come out soon. I'm not bothered right now by a read-only browser because I run with SunView along with the browser and can always quickly pop open a window when I need to do edits. I've never worked with a browser before, but the very day I installed it I found I could not live without it. One of the difficulties of an OO environment is that the code implementing a class (along with the documentation of the class) is very narrow, showing only the definitions and redefinitions inside that class. A browser opens up the entire inherited world of an object and quickly shows all sorts of information, including the source code of the particular method of interest. o ICpak101, the foundation class library. This class library provides many classes that are very useful in program development. Classes include: arrays, collections (ordered collections, stack, set, dictionary), "balanced node" for the support of binary trees, points and rectangles that support primative graphics. o ICpak201, the window class library. This class provides window management. It runs on top of X-Windows (X11R3) and some of the native windowing environments on many of the host systems it runs on (including SunTools). The class library nicely supports: windows (including scrollable and resizable windows), a variety of menus, buttons, notifiers, prompters, icons, color maps, and more. The sample code provided includes a useable icon editor, menu-prototyper, and color edit facilities that can be easily built into applications. The class definitions are organized well, but I find that the browser is needed to really get a good feel of how the class library is put together. o The 2-D graphics library. I don't have a copy of this, but this is in beta test at this moment. I can't wait to try this out. o Documentation. The documentation set that comes with this is one of the best document sets I've seen. It is complete, accurate (I did find one minor pice of information missing in one spot), and a pleasure to read. The binders are about 11 inches by 9 inches, which I found a convenient size. o Installation. This was a breeze! For the compiler, ICpak101, and ICpak201 you merely tar off from a tape and run. For the browser, you tar off, edit a file, and then build the browser symbol tables for all the installed class libraries. This was one of the easiest installs of a software package I've ever done. o Technical support. Stepstone provides strong, friendly, responsive support, showing no evidence of impatience for a beginner in the language that I am. I have talked with them about things such as my favorite compiler flags on the Sun C compiler and they have been very helpful in showing how I can perform the same functionality with their product. o Database support. Currently there is no support to an Object-Oriented Database, other what you can normally interface with in the C language. However, there is a rumor that they are working with Servio Logic (makers of Gemstone OODBMS) to provide an OO interface with their databse. All-in-all, Objective-C is a very nice language and one that should be considered in evaluating OO langauges. (Note: while cross-posted in both comp.object and comp.lang.c++, followups are directed to comp.object). -- Chuck Noren NET: ncar!dinl!noren US-MAIL: Martin Marietta I&CS, MS XL8058, P.O. Box 1260, Denver, CO 80201-1260 Phone: (303) 971-7930
lgm@cbnewsc.att.com (lawrence.g.mayka) (06/27/90)
In article <55443@microsoft.UUCP> jimad@microsoft.UUCP (Jim ADCOCK) writes: >low level programming tasks. Ideally, one would have a language that would >seamlessly handle the full range of programming tasks -- one would never have >to break into assembler. No standard language quite handles that. Languages >that cannot do a good job of programming in the small require that the >low level "chip" libraries be written in a different language, and provided >as part of a compiler's implementation. In practice, all compilers have a It depends what you mean by a "different" language. Lisp on a Symbolics workstation can indeed "seamlessly handle the full range of programming tasks," from DEFINE-PROGRAM-FRAMEWORK in the Dynamic Windows package all the way down to %POINTER-DIFFERENCE in the System package. Certainly not all of this is defined in standard Common Lisp, of course: The highest-level constructs have not yet been standardized throughout the industry; the lowest-level constructs violate trusted Common Lisp abstractions and their very standardization might encourage their use beyond what is absolutely necessary. Nevertheless, all constructs great and small follow the usual syntactic patterns of the Lisp language - functions, macros, and special forms - and "are" Lisp to the same extent that the extra library functions a particular C implementation might include "are" C. In another sense, of course, your statement is somewhat naive, in that no one uses a single language for all aspects of computation, all the way down to microcoding, chip cell placement, gate connection, etc. (Though the Symbolics microprocessor designers may have come close if their microcoding language and chip cell placement language were Lisp-like!) Lawrence G. Mayka AT&T Bell Laboratories lgm@iexist.att.com Standard disclaimer.
andyk@stpstn.UUCP (Andy Klapper) (06/27/90)
In article <55443@microsoft.UUCP> jimad@microsoft.UUCP (Jim ADCOCK) writes: > ... A number of things on what he feels Brad Cox is saying when he talks > about different levels of integration. I think you missed the point. It's not so much what kinds of libraries come with a language but the relative level of abstraction that the binding technology allows you the use. An example of simular 'programming' languages with two different binding levels and two different focuses of use may prove useful. The C language and the Unix C-shell language provide two different levels of binding. The C language provides a much lower, tighter, and faster binding level than a Unix C-shell language. In Brad's terminology the C language is chip level and the C-shell language is board level. Why board level ? The pipe and filter mechanism of Unix allows the user to slap a bunch of standard shells together to get a new shell tool where the thread of execution can be different for each shell. Is this useful ? Sure, I've seen people put together a few shells together on the command line and be done with. The process would have taken at least half a day to write in C. (which is not a lot of time for a C program of even simple complexity) Is it slow ? As sin. (or at least can be depending on the task). Is it simpler than C, you bet ! Is it better ? That depends on what you want to do. The biggest advantage is that it takes less time to train somebody to use C-shells than it is to use C (especially if you add in all the tools that the average C user uses (compiler, linker, editor, debugger, profiler ...) This example falls apart in that C-shells are not as easy to use as they could be. If somebody put a nice UI around them that would allow the user to place a bunch of shells on the screen and draw lines between them to show the data flow from grep to sort to filter ... then you have something closer to National Instruments(?) Lab View program that lets the user be the programmer. And that is the goal of the Software Industrial Revolution. Once the user becomes the programmer there will be many more programmers. Granted less skilled ones. (Take a look at the number of people 'programming' their spread sheets and you will see a hint of what the future may hold). Smalltalk, Objective-C and Eiffle offer a binding level somewhere between C and a C-shell. C++ offers a binding level somewhere between C and Objective-C. If I go any farther with this I will enter into a language war. Since language wars are counter productive I'd like to avoid that. Use the right tool for the right task. APL maybe the best at complex mathematical manipulation of data but I wouldn't want to use it to write a graphical user interface for a military command and control system. As a correllary to 'use the right tool', let me state that any tool can be used incorrectly, or bad code can be written in any language. One thing that I would like to know is why you feel that simple languages friendly to the neophyte programmer cannot be used in the large commercial projects ? I always thought simple & elegant was better than complex and and confused. When my code gets big and complex I don't want to be fighting with the structures and syntax that a language forces on me. On the other hand I don't want to have to fight with a language to let me do something that I need to do. (I admit it, I want everything !) -- The Stepstone Corporation Andy Klapper 75 Glen Rd. andyk@stepstone.com Sandy Hook, CT 06482 uunet!stpstn!andyk (203) 426-1875 fax (203)270-0106
jmaloney@cs.washington.edu (John Maloney) (06/28/90)
In reply to Brad Cox's statement:
> what about a C-based varient of Smalltalk Blocks?
I think that blocks (or "closures", to be technical) are an extremely
valuable language mechanism. They allow all sorts of customized control
structures to be synthesized without extending the language semantics at all.
For example, the Smalltalk-80 *language* has no control flow mechanisms
other than blocks. Everything else -- if-then-else, loops, iteration over
collections -- is implemented using blocks.
While we're wishing: I think that end-user customization is going to be
increasingly desirable, especially in user interfaces. That is, end-users
will increasingly write little mini-programs to tailor applications to their
precise needs. What language should they use to do this? Why not Smalltalk,
Objective-C, or Lisp -- i.e. the language of the base application? This obviates
the need for a custom language and its interpreter. In Smalltalk, it is quite
easy to compile a string typed by the user into a custom code fragment that
can be executed by the application at appropriate times. For example, the
user might customize the behavior of a button or add a new item to a menu.
What I'm suggesting is that programs like HyperCard would not need to
supply a "HyperTalk" language if they could use C++ or Objective-C as the
customization languague. Smalltalk and Lisp already allow this. It is harder
to achieve in the C-based OOP dialects because:
a) the compiler is not usually part of the run-time system, and
b) symbol table information needed for variable bindings is often
removed during compilation.
I would thus like to add "dynamic compilation and binding" to the wish-list.
-- John
cox@stpstn.UUCP (Brad Cox) (06/28/90)
In article <5281@stpstn.UUCP> andyk@stpstn.UUCP (Andy Klapper) writes: >In article <55443@microsoft.UUCP> jimad@microsoft.UUCP (Jim ADCOCK) writes: > >> ... A number of things on what he feels Brad Cox is saying when he talks >> about different levels of integration. > >I think you missed the point. My point is really just common sense, but does involve a paradigm shift to understand it. What's a paradigm shift? It is what Copernicus did when he moved the center of the universe from the earth to the sun. The silver bullet for the astronomy/calendar crisis of that era was not a technology. It was a paradigm shift, which moved mankind from the center of the universe out towards the periphery. The silver bullet for the software crisis is a paradigm shift that moves the center of the software universe from *processes* to *products*, from *producers* to *consumers*, from *languages* to *components*; from us as programmers to our customers. Gasp, yes! That's actually what I said. Moving us programmers out of God's eye at the center of the universe to out there at the periphery, revolving around our customers interests, not our own. The terrifying thing to me is that I'm afraid that we're going to find this so troubling, that we'll overlook that this is actually why the Japanese are managing to build software right now, using extremely 'poor' software development technologies by our standards, and are routinely beating us on quality and time-to-market by factors of *one to two orders of magnitude*. To see what I mean, notice the number of standards bodies screwing around with standard processes (Ada, C++, 2167, Cleanroom), and the absence of standards bodies defining standard *products* of these processes; i.e. a standard Stack, Queue, Customer, Kahlman filter object, etc. Notice the lack of a marketplace for such objects, comparable to the plumbing supply marketplace. And notice the lack of a commonly understood vocabulary for discussing and understanding different software architectural levels, comparable to the understandings that underlie tangible products. With a bolt, for example, we immediately understand that it will be used as a binding mechanism for something larger, like a tractor. And we immediately understand that the bolt is composed of something smaller, probably built by somebody else, such as a steel rod, which is in turn built by somebody else, a steel refinery, which is a customer for steel ore provided by somebody else. The bolt is produced by, and is consumed within, a marketplace; a vehicle for distributing complexity over time and space, which has no robust counterpart in software, where everything tends to be built from first principles 'for efficiency'. None of this is hard to understand, other than to accept that the common sense mechanisms that apply in the tangible domain of everyday experience can, *should*, and *must* be allowed to apply in the abstract/concrete swamp of software development. Better standard *processes* will never eliminate the software crisis. But standard *products* might. This is precisely the difference between Objective-C and C++. Objective-C is a name for an environment of standard products, called Software ICs. C++ is the name for yet another of a long line of standard *processes*, which will have the same impact on the software crisis as its predecessors; which is none at all. -- Brad Cox; cox@stepstone.com; CI$ 71230,647; 203 426 1875 The Stepstone Corporation; 75 Glen Road; Sandy Hook CT 06482
jimad@microsoft.UUCP (Jim ADCOCK) (06/28/90)
In article <5281@stpstn.UUCP> andyk@stpstn.UUCP (Andy Klapper) writes: >One thing that I would like to know is why you feel that simple languages >friendly to the neophyte programmer cannot be used in the large commercial >projects ? I always thought simple & elegant was better than complex and >and confused. When my code gets big and complex I don't want to be fighting >with the structures and syntax that a language forces on me. On the other >hand I don't want to have to fight with a language to let me do something >that I need to do. (I admit it, I want everything !) Well, perhaps you can suggest a simple language friendly to the neophtye programmer that can be used for large commercial projects? In my experience, they don't work. You need rigor built into the language for large projects, for small single-writer projects that rigor is just a pain. Ideally, one wants a language that is simple as possible while still covering the vast majority of the tasks at hand, but no simpler. It is a royal pain trying to "fake it" in a language that doesn't have quite the features one needs -- which is reality. Quick, single programmer projects can be legitimately written in "write-only" scripting languages. Clearly that is unacceptable in large projects.
cox@stpstn.UUCP (Brad Cox) (06/30/90)
In article <12396@june.cs.washington.edu> jmaloney@cs.washington.edu (John Maloney) writes: >I would thus like to add "dynamic compilation and binding" to the wish-list. You're asking for an Objective-C *interpreter*. Such a facility, which supported dynamic compilation (of source files) and dynamic linking (of compiled binary files: isn't this what you mean by binding? The compiler and the interpreter have always supported dyanmic *binding*, but the compiler relies on a separate linker utility for linking) already exists for Objective-C releases through 3.0. The interpreter has not yet been upgraded to version 4.0. -- Brad Cox; cox@stepstone.com; CI$ 71230,647; 203 426 1875 The Stepstone Corporation; 75 Glen Road; Sandy Hook CT 06482
jimad@microsoft.UUCP (Jim ADCOCK) (07/03/90)
In article <5286@stpstn.UUCP> cox@stpstn.UUCP (Brad Cox) writes: >Better standard *processes* will never eliminate the software crisis. But >standard *products* might. This is precisely the difference between >Objective-C and C++. Objective-C is a name for an environment of standard >products, called Software ICs. C++ is the name for yet another of a long >line of standard *processes*, which will have the same impact on the >software crisis as its predecessors; which is none at all. Well, for what its worth, my several years experience with ObjC, and with C++, is the exact opposite of Brad's claims. All of which means, I suppose, is, as always, caveat emptor.
kim@spock (Kim Letkeman) (07/03/90)
In article <5286@stpstn.UUCP>, cox@stpstn.UUCP (Brad Cox) writes: | | Better standard *processes* will never eliminate the software | crisis. But standard *products* might. This is precisely the | difference between Objective-C and C++. Objective-C is a name for an | environment of standard products, called Software ICs. C++ is the | name for yet another of a long line of standard *processes*, which | will have the same impact on the software crisis as its | predecessors; which is none at all. I was with you right until this last paragraph. If I understand your paradigm shift correctly, you are asking software people to look at the forest rather than concentrating on the trees. Consider larger blocks of functionality (e.g. Objective C with its software IC's) rather than a low level tool to build software (e.g. a C++ compiler.) I agree that if everyone accepted Objective C and Stepstone's class libraries as the standard for reusable software then great strides toward alleviating the software crisis would be made. The combination of OOP's reusable paradigm coupled with a standard set of classes that *everyone* used would be unbeatable. But in reality, the same effect would be gained if *any* OOP language and library of classes were chosen as standard (assuming the language supports OOP to a high degree.) This is where I differ with your (implied) criticism of C++. C++ will be (is?) just as good when a fully featured, high quality and highly integrated set of library classes become available and widely used. I do agree with the essence of your posting however. I hope that the paradigm shift does happen as it is probably our best hope to eventually see eye to eye in the software world. I think the biggest problem with software (reusable or otherwise) is that it is wetware. It exists in infinite variation in our minds. No one likes to be constrained to a single solution to a problem, and very few people see things in the same way. I hope we can find a way to get more acceptance of the common denominator, but we have to get people to remove the thought of "lowest common denominator" from their minds first. Kim -- Kim Letkeman mitel!spock!kim@uunet.uu.net
pkr@media01.UUCP (Peter Kriens) (07/05/90)
In article about a review of Objective-C I read the following statement: | I agree that if everyone accepted Objective C and Stepstone's class | libraries as the standard for reusable software then great strides | toward alleviating the software crisis would be made. The combination | of OOP's reusable paradigm coupled with a standard set of classes that | *everyone* used would be unbeatable. | | But in reality, the same effect would be gained if *any* OOP language | and library of classes were chosen as standard (assuming the language | supports OOP to a high degree.) This is where I differ with your | (implied) criticism of C++. C++ will be (is?) just as good when a | fully featured, high quality and highly integrated set of library | classes become available and widely used. I absolutely do not agree that a "standard" class library for C++ would allow the ideal IC/board level approach. The C++ language is much more targeted at making many "stand-alone" objects. Most C++ class libraries define their own hierarchy which means that it is almost impossible to come to 1 class tree for all third party software. This means that the "connectivity" of the software IC's in C++ will always be much harder to implement in comparising to Objective C, Smalltalk or CO2, which are all languages that build their classes from one root. This single root allows for a common behavior that is used by the general classes like collections. In C++ you have it is too natural to build low level objects that each have their own root behaviour. If we go back to the IC/board level metaphor, in C++ you will be using ECL, TTL, DDL (remember?) MOS and few hundred other standards, which means converters etc. In the languages which use one root and use dynamic binding you can specify a common behaviour which means that you only use one interface specification. So, though in theory it would probably be possible to standardize on one class library in C++. But the number of options and possible incompatibilities would be so overwhelming that we would need a standard committee to figure out what works how. And we all know how long it takes to get all C compilers to work alike using ANSI. I am a strong believer in the IC idea. Not that I believe that the complexity of a hardware even comes close to software. The number of dimensions in hardware is much smaller. In hardware you repeat the same building blocks to build a bigger system. In software every component is unique. But by encapsulation and using a generic software interface I have seen that it is possible to build systems faster. And I think that languages like Smalltalk, Objective C and CO2 are much more productive in this area then C++. Peter Kriens
lgm@cbnewsc.att.com (lawrence.g.mayka) (07/05/90)
In article <3814@kim> kim@spock (Kim Letkeman) writes: >But in reality, the same effect would be gained if *any* OOP language >and library of classes were chosen as standard (assuming the language >supports OOP to a high degree.) This is where I differ with your >(implied) criticism of C++. C++ will be (is?) just as good when a >fully featured, high quality and highly integrated set of library >classes become available and widely used. I think this glosses over some very significant differences in language design goals and ambient culture/environment which affect the feasibility, utility, and practicality of such libraries. >very few people see things in the same way. I hope we can find a way >to get more acceptance of the common denominator, but we have to get >people to remove the thought of "lowest common denominator" from their >minds first. Indeed, one of the great dangers of standardization is the tendency to gravitate toward the "lowest common denominator" (what the laziest vendor is willing to implement, what the most primitive development environment can support, what the most obsolete hardware can run, what the most stubborn programmer is willing to use, what the dustiest decks are compatible with, etc.). The other extreme, of course, is to agree to a standard that has not been shown to be feasible, useful, and practical. Lawrence G. Mayka AT&T Bell Laboratories lgm@iexist.att.com Standard disclaimer.
cox@stpstn.UUCP (Brad Cox) (07/07/90)
In article <1278@media01.UUCP> pkr@media01.UUCP (Peter Kriens) writes:
:In article about a review of Objective-C I read the following
:statement:
:
:I absolutely do not agree that a "standard" class library
:for C++ would allow the ideal IC/board level approach.
Wonderfully said! But I would like to steer this conversation away
from a confrontational approach between the two philosophies that
tend to polarize such debates, and point out that mature domains
seldom indulge in panacea A versus panacea B debates.
The whole point of my gate/block level integration (C++) versus
chip-level integration (Objective-C) versus card-level integration
(Fabrik, Metaphor, LabView) terminology was to emphasize that *all*
of them have a role to play for different constituencies of any
robust software components marketplace.
Just try to imagine where the hardware industry would be today if
they'd "standardized" on silicon fabrication technologies for *all*
levels of their marketplace, without ever deploying chip and card
level technologies.
:I am a strong believer in the IC idea. Not that I believe that the
:complexity of a hardware even comes close to software. The
:number of dimensions in hardware is much smaller. In hardware you repeat
:the same building blocks to build a bigger system. In software every
:component is unique. But by encapsulation and using a generic software
:interface I have seen that it is possible to build systems faster. And
:I think that languages like Smalltalk, Objective C and CO2 are
:much more productive in this area then C++.
But I absolutely do not agree that software's complexity has to be
greater than that of hardware. Admittedly, it certainly is today,
but isn't that precisely because we still invent and implement
everything from first principles, rather than by relying on and
supporting a marketplace in interchangeable software components.
Just imagine how complex hardware engineering would be if each
designer mined raw silicon and proceeded from there.
--
Brad Cox; cox@stepstone.com; CI$ 71230,647; 203 426 1875
The Stepstone Corporation; 75 Glen Road; Sandy Hook CT 06482
db@lfcs.ed.ac.uk (Dave Berry) (07/13/90)
In article <55517@microsoft.UUCP> jimad@microsoft.UUCP (Jim ADCOCK) writes: >Well, perhaps you can suggest a simple language friendly to the neophtye >programmer that can be used for large commercial projects? You can find some useful ideas in Standard ML. This is taught as a first language by several colleges, and is also being used for large commercial projects. The reason it works is that it's expression based, so integers, functions and modules can all be typed straight to the system (usually an incremental compiler). Neophytes can write simple programs without having to write module interfaces and the like. Also, the core language (i.e. the non-module part) uses type inference, so people don't even have to specify the types of their variables. Mistakes occasionally cause confusing error messages, at least with existing implementations, but in many ways type inference is a win. I'm not claimning that Standard ML will meet your every need. But some of its features do seem to support the distinction between large and small projects. If you're interested in that, I'd recommend taking a look. Dave Berry, LFCS, Edinburgh Uni. db%lfcs.ed.ac.uk@nsfnet-relay.ac.uk "ML don't stand for nothing! ML *is* ML" -- Spike Lee.
nick@lfcs.ed.ac.uk (Nick Rothwell) (07/16/90)
In article <5156@castle.ed.ac.uk>, db@lfcs (Dave Berry) writes: >In article <55517@microsoft.UUCP> jimad@microsoft.UUCP (Jim ADCOCK) writes: >>Well, perhaps you can suggest a simple language friendly to the neophtye >>programmer that can be used for large commercial projects? > >You can find some useful ideas in Standard ML. This is taught as a first >language by several colleges, and is also being used for large commercial >projects. > >The reason it works is that it's expression based, so integers, functions >and modules can all be typed straight to the system (usually an incremental >compiler). Neophytes can write simple programs without having to write >module interfaces and the like. Also, being almost purely functional, there is little need to reason about state in the various modular components. Hence, the type inference system serves as an informal verification, if you like, of the system - if it typechecks, then the chances are it'll work. This is an interesting difference from OO languages where local state is quite an important concept. > Dave Berry, LFCS, Edinburgh Uni. Nick. -- Nick Rothwell, Laboratory for Foundations of Computer Science, Edinburgh. nick@lfcs.ed.ac.uk <Atlantic Ocean>!mcsun!ukc!lfcs!nick ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ ~~ Ich weiss jetzt was kein Engel weiss