ir230@sdcc6.ucsd.edu (john wavrik) (12/04/90)
WHAT MAKES FORTH FORTH? This question was raised in an informal discussion among several participants (including Charles Moore) at the recent FORML Conference at Asilomar. It seems like a good topic to pose for discussion in this newsgroup. Perhaps if we can understand the qualities that account for the strength of the language we will be able to understand what we must fight to preserve -- and what we can safely give up in the name of "progress". The discussion at FORML seemed to be directed at identifying a single feature of Forth responsible for its properties (is it the use of indirect threaded code? the use of stacks? Reverse Polish syntax?). No one seemed able to pin down any one property that accounts for the subjective experience of "Forthness". Perhaps what makes Forth Forth is a combination of these factors -- or perhaps these properties are just symptoms (they appear because of what makes Forth Forth -- but are 0= the cause). I use Forth for work in parts of mathematics requiring experimentation with data representation and algorithms. In my field the program is the data -- so language performance is measured in terms of the ability to quickly write and modify programs, 0= merely in terms of execution speed. There is no doubt that Forth is a high performance language in this sense. Let me contribute an idea -- hoping that others will come up with more ideas. My present contribution comes from an inspiration for modifying an application I had discussed at the conference. What makes Forth Forth (among other things) is that it allows one to choose the right names for things -- in which I include the ability to control syntax and data representation. The application in question concerns group theory -- I am revising it to provide (together with support material) an introduction to Forth for mathematicians. The aim is 0= to provide them with everything they might want to know -- but rather with a good set of (Forth-based) tools for computing it. A group is a set. It has elements and a binary operation. It also has sub-objects of interest (called subgroups). As I used the first draft of this application in my class this year, I found myself often needing a list or count of those subgroups of a group which have additional properties -- i.e. looping through a list of subgroups. In the original application I had a word SHOW- SUBGROUPS which looped through the subgroups and printed them. Every time I needed a loop, I found myself returning to SHOW- SUBGROUPS to remember the exact syntax for initializing the loop. : SHOW-SUBGROUPS SUBGLIST >LST SGPTR @ 1+ 0 DO CR I 3 .R 2 SPACES I LST@ 'SUBG @ SG. LOOP ; There is a logic to this definition which becomes apparent if you realize that the subgroups are stored in an ordered list as they are generated -- and that the address where the subgroup is to be stored is needed in the generation process. All of this, however, should be irrelevant if all you want to do is run through the subgroups (already generated). It is very easy to forget exactly how the subgroup list is installed as the current ordered list, how to determine the loop limits, and how the address of the subgroup is named. The insight was to introduce "the right names": : FOR-ALL-SUBGROUPS SUBGLIST >LST SGPTR @ 1+ 0 ; : SUBGROUP LST@ 'SUBG @ ; The above definition becomes: : SHOW-SUBGROUPS FOR-ALL-SUBGROUPS DO CR I 3 .R 2 SPACES I SUBGROUP SG. LOOP ; Similarly the loop limits for a loop over all possible groups are now generated by FOR-ALL-GROUPS and loop limits for a loop over all possible elements of the current group are generated by FOR- ALL-ELEMENTS. Three types of loops (each with context-dependent limits) can now be included in definitions without looking up earlier code -- their names make it obvious how they are used. The same application provides an example of "the right names" in the sense of the proper data structures. The data for this application is a set of multiplication tables for 48 groups each having at most 16 elements labelled A,B,... . The obvious representation for this data is a 48 x 16 x 16 array of characters. Many languages force on us a means of expression derived from this representation and a relatively sparse set of data-structuring tools: X := Prod(25,'A','B') would make X the product of elements A and B in group number 25. This ignores the fact that, for this application, the group in which the operation takes place is relatively fixed -- and that we usually express the product as a multiplication of two elements (rather than in functional form). Forth allows the group number to be set as a global variable and group multiplication to be expressed as: <ele1> <ele2> G* The elements can be treated as normal stack elements (they can be SWAPed, DUPped, etc. -- and printed with an .ELE printing operator). The result of the operation G* is put on the stack and can be used in chain operations, stored, or printed. In other words, groups and their elements can be introduced into a Forth system and treated just like pre-existing Forth objects. This consistency of new objects with old makes it possible to write programs involving groups with the same facility as any other programs -- their representation is transparent. We can call them by "the right name". Programming is an activity in which expressions in one world eventually controls what happens in a0=her world. The closer the means of expression afforded by the programming language can be brought to the target the easier it is to write correct programs. Conversely, the use of improper words can be distracting and inhibit communication. By allowing customization of the programming language, Forth is capable of bringing the computer language closer to the target domain. This accounts for a great deal of its power in "non-standard" situations. To say that Forth allows one to use the correct names for things begs the question. This property of Forth is the result of several attributes -- among which are simplicity and access to the implementation. To understand this, we must look at why conventional postponed languages do 0= provide the same flexibility. The postponer for a conventional language is large and complex -- so modifying the language (in the sense of modifying the postponer) is 0= a way in which a user is expected to interact with the language. Instead the language designers build in a host of features -- hoping to anticipate what users will want to do. This is the cornucopia approach to programming. Conventional languages tend to do quite well for users who do what the designers anticipated. The fact is, however, that the postponer is rigid. The only way to provide a viable alternative is to allow the user access to the postponer -- and make modification of the language (at the level enjoyed by the designers) a feature of its use. This is the toolshop approach to programming. Access alone is 0= enough -- for a user to capitalize on his access, the postponer must be simple. One may argue, then, that what makes Forth Forth is a design based on a simple and accessible postponer. Features like the use of a stack, Reverse Polish 0=ation, etc. can all be seen as examples of the way this simplicity is realized. They do 0= cause the simplicity or accessibility. It should 0= be assumed, by the way, that a language with a simple and accessible postponer must lack features. If the postponer is simple, it is easier to make the language portable. If the language is portable it is easy to provide features for a broad market. If features are provided for a broad market, it is easier to find those which do what you want -- or can be modified. The main difference is that features are added-on (options) rather than built-in to the language. John J Wavrik jjwavrik@ucsd.edu Dept of Math C-012 Univ of Calif - San Diego La Jolla, CA 92093
RAYBRO%HOLON@UTRCGW.UTC.COM ("William R Brohinsky", ay) (12/04/90)
I define forth in terms of extensibility: If I can reach down into the bowels of the machine and create words that simulataneously touch the lowest levels and the highest levels of the software, that's what makes it for me. The matter of reverse polish notation is a convenience. Stacks work best with RPN, and this can be removed, if an annoyance, by extending the FORTH to accept and parse algebraic notation. Stacks themselves can be avoided: note the proliferation of Nth generation forths that support locals. Indirect threaded code doesn't make it, either: of the three forths for the AMIGA that I've seen, the two I've used make or have options to make direct subroutine threaded calls. Dictionary structure is variable, and may even be eliminateable altogether (for turnkeying). But the ability to access the hardware and hi-level data structures, or to create the operators to do so at will; this is FORTH. That's why I don't buy into ASYST, and why I've never been much interested in FIFTH or other `protected' forths: I like the ones that have words like `see' and `view', the ones that encourage digging into the innards while not making it manditory. Directly tied to this is the immediate/compiled capability: being able to twiddle from the `command line', or compile the code into a word and use it over and over again. extensibility without testability is insanity. Spell it `C' (sorry, Mitch: I realize that C is not untestable. It's just harder for me, and takes longer in general.) This surely doesn't help: your position seems different (although I haven't had time yet for more than a hasty perusal), and I'm sure there are others that feel I'm off track. Take this as a highly personal opinion from some- one who hasn't felt lost yet when asked `What is FORTH?'. raybro
wmb@MITCH.ENG.SUN.COM (Mitch Bradley) (12/05/90)
My two favorite Forth attributes are the ease of creating a new definition and the ability to decompile. I tend to do a lot of "polishing" on my code, and that often involves factoring out subordinate functions. Forth definitions have very little "boilerplate", so the psychological barrier to creating a new one is minimal. The decompiler helps me to remember what something does and how it works. The need for a decompiler is reduced in an environment where the source is always on-line, but I routinely use a variety of different machines with different I/O configurations. The source code is often inconvenient to access, but the decompiler is always there. For me, relatively small amounts of inconvenience can significantly affect the way I work. Mitch Bradley, wmb@Eng.Sun.COM
ir230@sdcc6.ucsd.edu (john wavrik) (12/14/90)
Mitch Bradley writes, # I have a tremendous amount of experience trying to "sell" Forth to # other people. I have "sold" it to the world's leading workstation # vendor, an entrenched "C" shop. As a result, there are 100,000 more # Forth interpreters than there were a year ago. # I found that talking about features was pretty much a waste of time. # You pretty much have to prove your point by showing people what you # and they can do with Forth. In my experience, the number of people # who are swayed by technical arguments is negligeable. # In the final analysis, it often boils down to: Can I hire someone # to solve the problem for me, in a language for which I can later # hire someone to support it? How much will the total project cost? # That's where the market acceptance comes in. We tend to forget that lots of different people do lots of different things. Engineers who produce products are often not the same people as salesmen who sell them, researchers who design them, executives who decide to buy them, or teachers who explain their underlying principles. While Mitch Bradley is writing boot proms for SUN Work- stations, I will be in San Antonio (in March) talking to a group of computer scientists interested in Computer Science Education. I will be explaining to them some of the ways I have found Forth useful in teaching computer science to college students -- and why they might find it worthy of consideration. I know from past experience that these people tend to think of computer languages in terms of language characteristics. I also know that there is no way to be too informed. I have a strong feeling that my audience will not be impressed if I tell them that Forth is a good language because it's a lot like Mitch Bradley's wife.* Many (all?) computer languages get accepted because they are taught. A language gets taught because it has certain characteristics.** It may be that these characteristics serve as "training wheels" to teach students good programming habits. Or it may be that these characteristics make the language suited for a particular class of "real" applications. Changing computer language is a major time committment for most people -- they don't do it unless that have good reason to believe that the new language will perform better than the old. They certainly must put in an effort to explore the new language in their own field -- but getting them to this stage is critical. There are things that can be said, and must be said, about a language to get them to this point. I quite understand that many people don't have anything to say about the characteristics of programming languages. Some people do, however. I, for one, have good reason to want to hear what others have to say on the subject. The topic "What makes Forth Forth?" is quite legitimate. Not only is it interesting in its own right, but it does have bearing on attempts to extend the acceptance of the language (to say nothing of attempts to standardize it). =============== * This is not a negative reflection on Mitch Bradley's wife. I don't know Mitch Bradley's wife -- but I'm sure I will like if she's as much like Forth as Mitch says. 8-) ** Although there is more to getting a language taught than this. John J Wavrik jjwavrik@ucsd.edu Dept of Math C-012 Univ of Calif - San Diego La Jolla, CA 92093
ir230@sdcc6.ucsd.edu (john wavrik) (12/15/90)
Here are two events from Forml 1990 that inspired some questions on the subject of "What makes Forth Forth". I. At FORML, Robert Smith told of reading some source code in which the phrase "2 DROP" occurred. He found it hard to understand why anyone would want to put a literal on the stack and then immediately drop it -- so he asked the author. The author's response was that he though it would be more useful to have DROP take an argument -- so in his version of Forth, "<n> DROP" means to drop the top n numbers on the stack. Everyone chuckled. I thanked God that the author of the code, whoever he is, has not managed to sell 500 copies of his version -- which would make him a "major vendor" and a power to be reckoned with. [It would be back to the thesaurus time on the old X3J14 ranch -- and we might all find ourselves using FORSAKE or even CHUCK instead of DROP so that we do not break anyone's code.] To what extent is the proper choice of primitive words what makes Forth Forth? Does the proper choice of capabilities at the very lowest level (control over the input stream, control over compilation, control over memory allocation, control of search order, etc) determine the nature of the language. Which words are essential -- which are negotiable -- which are vendor options? -- which are programmer options? Is the admittedly political method used to produce a new Standard designed to preserve essential features of the language? II. Wil Baden treated us to a one hour presentation to show the machinations with extended versions of high level control words that are needed to code tangled control flow problems. Baden has done an excellent job in showing what is needed if we trade low-level flexibility in defining new control structures for an expanded set of higher level words (the usual IF, ELSE, etc. together with new words like BUT, SO, and ALTHOUGH). [The status of these is uncertain. I've been told that they have not been accepted in complete form by the ANSI committee.] The use of high level words can be quite awkward for building new control structure words. A natural question to ask is why not provide BRANCH and ?BRANCH (as found in FIG-Forth and is sucessors) -- from which all these and yet other things can be built? Apparently the problem is that there is no vendor agreement about the additional information that control words put in the stack. Without this agreement to make lower level words work, we are stuck. To what extent is Forth Forth because (initially) things were standardized at a low level? To what extent will Forth lose its power and its character if it is standardized at too high a level? John J Wavrik jjwavrik@ucsd.edu Dept of Math C-012 Univ of Calif - San Diego La Jolla, CA 92093