GNUstep Frequently Asked Questions with Answers
***********************************************

Last updated 3 March 1996. Maintained by Andrew McCallum <mccallum@gnu.ai.mit.edu>, with contributions by Pascal Forget <pascal@wsc.com>, Scott Christley <scottc@ocbi.com>, and Randy Chapman <chapman@u.washington.edu>. Please send corrections to <mccallum@gnu.ai.mit.edu>.

The intended audience of this FAQ is future and present code developers for GNUstep.  This FAQ serves a purpose complementary to the GNUstep WWW pages---since it is written and maintained directly by those writing code for GNUstep, it emphasizes (although not exclusively): (1) technical details and organization, (2) the functionality is coded and working now.  This FAQ is intended to provide a succinct document in which to find GNUstep information without hype.

GNUstep General Information
===========================

 1. What is GNUstep?

     GNUstep is the Free Software Foundation's effort to implement NeXT Computer Inc.'s OpenStep Standard.  The project is not finished, however some components are useable now.

     The GNUstep project consists of the following sub-projects:

       * GNUstep Base Library - code for non-graphical objects, such as strings, collections, archiving support and distributed objects messaging.  (Including functionality similar to OpenStep's FoundationKit.)

       * GNUstep GUI Library - code for graphical objects used in making a Graphical User Interface (GUI).  This includes buttons, sliders, text fields, windows, menus, etc.  (Including functionality similar to OpenStep's AppKit.)

       * GNUstep DisplayGhostScript Server - a server that draws PostScript graphics to the screen, and receives events from the keyboard and mouse.  It is based on GhostScript.

       * GNUstep Interface Modeller Application - an application for graphically assembling application interfaces.

     More detailed information about each of these sub-projects can be found in their own sections below.

     There are several projects related to GNUstep that are not officially part of the GNU project and GNUstep, but may become so in the future. These include: the G3DKit project, (contact Thoman Engle <tsengel@cip.informatik.uni-erlangen.de>); an application library based on OpenGL, (contact Georg Tuparev <Tuparev@EMBL-Heidelberg>); and ProjectCenter, a source code management and development environment, (contact unknown).  If you know of others, please contact the FAQ maintainer.

     The initial target platforms for GNUstep are Linux and other UN*X's. There has been some OS/2 WARP work, but I have not seen any ongoing work on this platform.

 2. What is the OpenStep standard?

     OpenStep is an Application Programming Interface (API) for creating applications using the Objective C language.  It was published by NeXT Computer Inc. in 1994.  It is being used by Sun Microsystems as part of their Common Desktop Environment (CDE).

     OpenStep consists of three parts: the FoundationKit, a library of non-graphical objects; the AppKit, a library of objects usful in creating graphical applications; and DisplayPostscript, an interface for drawing to the screen using the PostScript graphics language.

     You can obtain a copy of the OpenStep standard in

       * texinfo at http://www.dartmouth.edu/~ajones/Projects/ OpenStepSpec.tar.gz.

       * HTML at http://www.nmr.embl-heidelberg.de/GNUstep/ GNUOpenStep/OpenStepSpec/OpenStepSpec.html.

       * PostScript and RTF at ftp://ftp.next.com/pub/OpenStepSpec/.

 3. Who is currently involved in writing GNUstep code?

     For the sake of being social and getting to know each other, here is a list of the folks who are currently, actively contributing GNUstep code. The list includes a brief descriptions of each person's background and involvement in the GNUstep coding efforts.

       * Adam Fedor <fedor@mode.colorado.edu> continues his excellent, long service as user, tester, and code contributor to both the Base Library and the GUI Library.

       * Andrew McCallum <mccallum@gnu.ai.mit.edu> was appointed chief maintainer of the GNUstep project by Richard Stallman in January 1996. He has been involved and hacking in the NeXT community since NeXTSTEP version 0.8; he has been working on GNU Objective C and the Base Library since 1993.

       * Pascal Forget <pascal@wsc.com> is working on the GUI Library in conjunction with Scott Christley.  He has worked with Randy Chapman's DisplayGhostScript and X Windows as a GNUstep GUI backend.

       * Randy Chapman <chapman@u.washington.edu> has been working on the GNUstep DisplayGhostScript Server, adding DPS extensions to GhostScript, including pswrap work.

       * Scott Christley <scottc@ocbi.com> is in charge of the InterfaceModeler project, which is currently in the design stages.  He is working on the GUI Library in conjunction with Pascal Forget.  He has already written much of the GUI Library frontend.

     There are many others who have made significant contributions to GNUstep, but who are not currently contributing code, (such as Kresten Thorup and Paul Kunz).  For more information about GNUstep history, see the GNUstep WWW pages.

     There are also several others who have contributed individual classes to GNUstep, but who are not actively contributing to general GNUstep work. This list is not intended to be a complete list of GNUstep code contributors; that information is available in each of the GNUstep code packages.

     There are also other code developers who are writing Objective C code related to GNUstep, but for projects that are not officially part of the GNU project and GNUstep.  We hope that some of these projects will join the GNU project and GNUstep in the future.

     Please send corrections to the FAQ maintainer.

 4. Is there a WWW site for GNUstep?  Are there mailing lists for GNUstep?

     There is a WWW site at http://www.gnustep.org, (and its mirror
     http://www.NMR.EMBL-Heidelberg.DE/GNUstep), that contains many
     useful pointers.  The technical information in this FAQ may be more up
     to date than the WWW pages since this FAQ is maintained directly by the
     people who are developing GNUstep code.

     There are several mailing lists:

       * discussion@gnustep.org is a mailing list for general discussion of GNUstep developments.  Announcements about GNUstep progress are also made there.  The list is maintained by Georg Tuparev <Tuparev@EMBL-Heidelberg.de>.

          To join, send mail to discussion-request@gnustep.org.

       * webmasters@gnustep.org is a mailing list for discussion of the GNUstep WWW site.

          To join, send mail to webmasters-request@gnustep.org.

       * g3dkit@gnustep.org is a mailing list for discussion of a library for drawing 3D graphics; it is based on OpenGL and RenderMan. The Free Software Foundation is hoping that this work can become an official part of the GNU project and the GNUstep project.

          To join, send mail to g3dkit@gnustep.org.

       * There is also a private mailing list for the core active developers of GNUstep.  Those people who contribute large sections of code and who are interested in making and planning further contributions may be invited to join.  We apologize in advance, but, for the sake of efficient communication, the list is not open to people who are not actively contributing significant coding work to the project; don't bother asking to be added unless you have already been in contact with Andrew McCallum about source code contributions.  If you would like to make code contributions, by all means, contact McCallum.  This list is maintained by McCallum <mccallum@gnu.ai.mit.edu>.

 5. What is the current state of the project?  When can I expect it to be completed?

     The Base Library is about 85 percent done.  Significant useful work can already be done using the library.  The GUI library is a little less than half done.  It can already put up windows with working buttons, sliders and textfields, but significant work needs to be done before it is ready for generic application development work.  The DisplayPostscript and drawing support is in transition now.

     More detailed information about the state of each of the sub-projects can be found below.

     With free software, you should never, ever, believe promises about when a project will be finished.  ...However, that said: there are certain GNUstep developers that are counting on having useful Base and GUI libraries working by Summer 1996.

 6. How can I help?

     If you have a specific piece of functionality that you would like to contribute, or if you would like to ask for suggestions about what coding work you can do to help, contact the GNUstep Chief Maintainer, Andrew McCallum <mccallum@gnu.ai.mit.edu>.

More detailed inforation about each of the GNUstep sub-projects can be found below.

GNUstep Base Library
====================

 1. What is the GNUstep Base Library?

     The GNUstep Base Library is a library of general-purpose, non-graphical Objective C objects.  For example, it includes classes for strings, collections, byte streams, typed coders, invocations, notifications, notification dispatchers, times, network ports, remote object messaging support, and random number generators.

     It provides functionality that aims to implement the FoundationKit portion of the OpenStep standard.  In many cases, the NS* classes are implemented as wrappers around more featureful GNU classes.

     There is more (although perhaps out-of-date) information available at the libobjects homepage at http://www.cs.rochester.edu/u/mccallum/libobjects.

 2. What is its current state of development?

     It is about 85 percent of the way to having all the OpenStep classes. Significant useful work can already be done using the library since the missing 15 percent are the less-often-used classes, such as NSByteStore. Over 60,000 lines of code have already been written.

     The following OpenStep classes and class clusters are pretty much done and usable: NSArchiver, NSArray, NSAssertionHandler, NSAutoreleasePool, NSBitmapCharSet, NSBundle, NSCharacterSet, NSCoder, NSCountedSet, NSData, NSDate, NSDictionary, NSEnumerator, NSException, NSInvocation, NSLock, NSMethodSignature, NSNotification, NSNotificationCenter, NSNumber, NSObject, NSProcessInfo, NSSet, NSString, NSThread, NSTimeZone, NSValue.

     Most of the C functions are also implemented, including NSHashTable and NSMaptable.

     A GNU implementation of Distributed Object works.  However, the wrappers for creating the NSConnection, NSDistantObject, NSProxy wrappers have not yet been made.

     The following classes are unstarted or unusable: NSBTreeBlock, NSBTreeCursor, NSByteStore, NSByteStoreFile, NSCalendarDate, NSDeserializer, NSRunLoop, NSScanner, NSSerializer, NSTimer, NSUserDefaults.

 3. In what ways is the Base Library different from OpenStep's FoundationKit?

     It contains several enhancements:

      1. OpenStep has a single NSInvocation class, which is based on sending a message to an object.  The GNUstep Base Library has a heirarchy of Invocation classes with various capabilities.  Two of the Invocation subclasses can cause C functions to be called, instead of sending messages to objects; these subclasses are useful when one would otherwise have to write a new class and method to implement some simple, stateless functionality.  Other subclasses of Invocation could hold GUILE or TCL code to be run, or could record their invocation information to a file.

          All of them respond to a new method called -invokeWithObject: that is useful for enumerations.

      2. I have been told that OpenStep's NSNotificationCenter is slow. GNUstep's NotificationDispatcher class is based on interesting use of linked lists and hash tables in such a way that it should be comparatively very fast.

          OpenStep notifications must be method selectors sent to objects. GNUstep notifications can invoke an Invocation instead, thus taking advantage of the flexbility and context-holding capability of Invocation objects.

      3. OpenStep takes a disconnected ``class forest'' approach to collection classes.  GNUstep has all the OpenStep collection classes, however they are build from underlying GNU collection classes that are organized as a deep class heirarchy.  Because of the deep heirarchy, there is a built-in uniformity of method names, and there are common abstract superclasses in which to add new common functionality.

          Unlike OpenStep, the Base Library also has additional collection classes for heaps, stacks, queues, trees and linked lists.  There is also a rich variety of enumeration methods based on invocations.

      4. OpenStep's archiving mechanism provides only one choice of backend format.  By backend format, I mean a format for writing C types, such as ints, floats and C strings.  The GNUstep archiving mechanism has a clear separation between frontend and backend.  Different backends backend's are provided.  One writes in human-readable and human-editable ASCII text, (including programmer-provided text name labels for each of the items.)  Another writes in a compact, stream machine-independent bits. A third writes in an even more compact stream of machine-dependent bits; this is useful for a distributed objects connection on machines of the same architecture.

          I'm not sure how OpenStep's archiving system implements forward references, (that is, calls to -encodeConditionalObject: for which the object argument has not yet been encoded, but will be encoded later.) According to its restricted interface, NeXT's implementation must either (1) make two passes through all the -encodeWithCoder: methods of the objects to be encoded, or (2) not handle forward references with -encodeConditionalObject:, only backward references.  GNU's archiving system, on the other hand, implements forward references efficiently, without making two passes.  It does this by using an object decoding method (-decodeObjectAt:...) that back-patches id-pointers when the conditionally encoded objects are found in the coded stream.

      5. OpenStep's distributed objects mechanism requires four network ``hops'' when sending and responding to each new method---one to send the request, one for the server to request the method type from the client, one for the client to respond with the method type, and one to respond with the return value of the method call.  GNUstep distributed objects takes advantage of the superior GNU Objective C runtime, which includes the method type locally with the selector.  Since the method type can already be found on the server, there is no need to ask the client for the type, and GNU distributed objects takes two less network hops.

      6. NeXT's Objective C runtime becomes very slow when thread-safety is turned on since the runtime must acquire a global mutual-exclusion lock each time an Objective C message is sent.  GNUstep takes advantage of the superior GNU Objective C runtime, which is requires zero extra time to send a message when thread safe---not even one instruction more is required for a thread-safe message send.  Mutual exclusion locks are only necessary in the relatively infrequent times in which classes are initialized or +poseAs: is called.  Galen Hunt implemented the patches to make the runtime thread-safe.

 4. What is the general organization of the non-OpenStep, GNU classes?

     (This FAQ does not describe the OpenStep standard classes, because a detailed description of those can be found in the OpenStep documentation.)

     Here are some of the public GNU classes.  See the source header files for more information.

          The collection class heirarchy:
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          Collection                 Root all the collection classes (abstract)
            Set                      Unordered collection, no duplicates
            Bag                      Unordered collection, may have duplicates
            KeyedCollection          Contents accessible by object key (abstract)
              Dictionary             Concrete implementation
              MappedCollection       One collection maps into another
            IndexedCollection        Contents accessible by integer (abstract)
              BinaryTree             Basic, sorted binary tree
                RBTree               Red-Black tree, sorted, more balanced
                SplayTree            Splay operation keeps tree balanced
              OrderedCollection      Can insert at arbitrary index (abstract)
                Array                Basic array
                  Queue              First in, first out
                  Stack              First in, last out
                  GapArray           Efficient handle middle insert and delete
                LinkedList           More efficient than arrays for many ops

          Strings (as in Smalltalk, part of the collection class heirarchy):
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                ConstantString        Root of string classes, not changable
                  String              contents can be changed
                  *CString            Strings based on 1-byte characters

          Writing/reading bytes, C-type variables, and connected groups of objects:
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          Stream                     Source and Destination for stream of bytes
            StdioStream              Stream based on FILE* (files, pipes, etc)
            MemoryStream             Stream based on memory buffer
          CStream                    Write/Read C-type variables on stream
            TextCStream              use human-readable format
            BinaryCStream            use compact machine independent format
            RawCStream               use even more compact machine depedent format
          Coder                      Write/Read groups of objects on CStream
            Encoder                  Writing
              Archiver               for files
              ConnectedEncoder       for distributed objects
            Decoder                  Reading
              Unarchiver             for files
              ConnectedDecoder       for distributed objects

          Holding code to be run on request:
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          Invocation                 Contains code that can be run
            ArgframeInvocation       based on gcc __builtin_apply()
              MethodInvocation       invokes a method on an object
              ObjectMethodInvocation the method takes at least one object arg
            ObjectFunctionInvocation calls a function with type (id(*)(id))
            VoidFunctionInvocation   calls a functions with type (void(*)())

          Posting information about happenings:
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          Notification               for posting information others may want
          NotificationRequest        a record of an observers request
            NotificationInvocation   will be posted by invoking an Invocation
            NotificationPerformer    will be posted by -perform:withObject
          NotificationDispatcher     distributes Notification's among requestors

          Distributed Objects Support:
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          Connection                 between two machines on which messages sent
          Proxy                      Representative of a remote object
          Port                       A mailbox for packets
            InPort                   for receiving packets
            OutPort                  for sending packets
              Tcp*Port               based on TCP/IP
              Udp*Port               based on UDP/IP
              Mach*Port              based on Mach ports
          Packet                     holds data and reply port

 5. Where can I get a copy?

     The most recently released ``official'' version can be obtained from ftp://prep.ai.mit.edu.

     The most recently released alpha version can be obtained from ftp://alpha.gnu.ai.mit.edu.

     The most recent developer's snapshot can be obtained from ftp://ftp.cs.rochester.edu/pub/u/mccallum/libobjects.  These releases are there for exchange between active GNUstep coders, and for curious code-readers, not for naive users; read the README.first file in the FTP directory.

GNUstep GUI Library
===================

 1. What is the GUI Library?

     The GNUstep GUI Library is a library of objects useful for writing graphical applications.  For example, it includes classes for windows, menus, buttons, sliders, text fields, and events.

     It provides functionality that aims to implement the AppKit portion of the OpenStep standard.

 2. What is its current state of development?

     Much of the front-end is implemented, including...

     The X Window / DPS back-end ...

 3. Explain the organization of the front- and back-ends.

     The GNUstep GUI Library is divided into a front- and back-end.  The front-end contains the majority of implementation, but leaves out the low-level drawing and event code.  A back-end can override whatever methods necessary in order to implement low-level drawing event receiving.  Different back-ends will make GNUstep available on various platforms.  The default GNU back-end will run on top of X Windows and the DisplayGhostScript Server.  Other back-ends could allow GNUstep to run on OpenGL, OS/2, WindowsNT, graphics/event platforms.  Much work will be saved by this clean separation between front- and back-end, because it allows different platforms to share the large amount of front-end code.

     The front-end does not specify what mechanism to use in order to "plug in" the back-end---that is the back-end implementor's choice.  At least two backends will use +poseAs: method, for example, running [XDPSWindow poseAs: [NSWindow class]].  Using +poseAs: is more flexible than using Categories because it allows the the back-end implementor to choose what to override in the front-end, instead of having the interface between front- and back-end fixed by the front-end.

 4. Where can I get a copy?

     It is not yet publically available.  When it is available you will be able to find it in ftp://alpha.gnu.ai.mit.edu/gnu.

GNUstep DisplayGhostScript Server
=================================

 1. What is the DisplayGhostScript Server?

 2. What is its current state of development?

 3. What is the relationship between the DisplayGhostScript Server and X Windows?

GNUstep Interface Modeller Application
======================================

 1. What is the Interface Modeller?

 2. What is its current state of development?

     It is in the planning stages.

     [Notes to FAQ contributors: Be succinct.  Stick to the facts.  Emphasize
     technical features that are already implemented; avoid writing about
     vague features without concrete ideas about their implementation; (the
     IM section, for example, may be short?).  Your audience is future and
     present code contributors to GNUstep, not managers or publicity people.]

     All trademarks mentioned on in this FAQ belong to their respectful
     owners.