Jump to content

SAIL (programming language)

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Maury Markowitz (talk | contribs) at 00:12, 1 November 2023 (Description). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

SAIL, the Stanford Artificial Intelligence Language, was developed by Dan Swinehart and Bob Sproull of the Stanford AI Lab. It was originally a large ALGOL 60-like language for the PDP-10 and DECSYSTEM-20. The language combined the earlier PDP-6/-10 language GOGOL compiler, essentially an integer-only version of ALGOL, with the associative store from the LEAP language. The first release was in November 1969 and it saw continued development into the 1980s, including a commercial derivative, MAINSAIL.

SAIL's main feature is a symbolic data system based upon an associative store based on LEAP by Jerry Feldman and Paul Rovner. Items may be stored as unordered sets or as associations (triples). Other features include processes, procedure variables, events and interrupts, contexts, backtracking and record garbage collection. It also has block-structured macros, a coroutining facility and some new data types intended for building search trees and association lists.

History

The GOGOL compiler was originally written by Bill McKeeman on the PDP-1. It was essentially an integer-only version of ALGOL-60 with a number of additions to provide direct access to the memory and other hardware to allow it to be used as a systems programming language. It reduced arrays to a single dimension, removed any ability to perform dynamic memory allocations, but did add some additional string functionality. A greatly updated version by John Sauter, GOGOL II, was written as part of a port of the underlying operating system from ODIN to THOR. When the Stanford AI Lab received their PDP-6, Sauter, Pettit and (mostly) Dan Swinehart wrote GOGOL III for the new machine.[1]

Swinehart, joined by Robert Sproull, merged the GOGOL syntax with additions from the contemporary versions of the LEAP language language to produce the first version of SAIL in November 1969. The main feature of LEAP as a language was its use of associative storage, more commonly known today as a Map or Dictionary. In LEAP, one could set the value of a field in a type using a triple, with the first entry being the variable name, the second being the field name, and the third the value.[2]

Further improvements were added by Russell Taylor, Jim Low and Hana Samet, who added processes, procedure variables, interrupts, context, matching procedures, a new macro system, and other features. Development then passed to Taylor, John Reiser and Robert Smith, who added a debugger, a system-level print statement, records, and performed the conversion from Standord's own SUAI to TENEX. It was later ported to DEC's TOPS-10 as well, while the original TENEX version worked without modification under TOPS-20.[2]

Description

Like many ALGOL systems, and the later Pascal, the basic structure of SAIL is based on the block, which is denoted by the code between the keywords BEGIN and END. Within a block there is further structure, with the declarations of local variables at the top, if any, and the code, or statements, following. In contrast to most dialects, SAIL allowed one to place a string after the BEGIN, like BEGIN "program", and then end the block with END "program". The compiler would use these, if entered, to check for proper bracketing.[3]

The basic variable types in SAIL are integers, reals (floating point), booleans, and strings.[4] Any of these types can be turned into an array by adding the ARRAY qualifier and placing the array bounds in brackets, for instance, REAL ARRAY weeks[1:52]);. SAIL supported 1-d and 2-d arrays.[5] Type conversions were automatic, so INTEGER i;i←SQRT(5); would convert the value 5 to a double as that is what SQRT requires.[3]

Standard statements included IF...THEN...ELSE,[6] FOR...STEP...UNTIL...DO,[7] WHILE...DO for top-tested loops, WHILE...UNTIL for bottom-tested, and GOTO which used a label.[8] A curious statement was CASE, which took an integer value and then ran one of the following statements, like CASE i OF ("Zero","One","Two");, which returns the appropriate string based on the value of i.[6] DONE exited from a block, typically used in loops, and CONTINUE returned to the top of the block. An infinite loop was typically implemented with WHILE TRUE DO....[9]

Procedures were implemented in a fashion similar to the C programming language, with the return type, if any, in front of the name, for instance, STRING PROCEDURE toUpper(STRING originalStr);BEGIN.... Note the uncommon use of the semicolon here, whereas PASCAL would immediately follow with a block, typically a BEGIN. In order to improve performance, SAIL added two qualifiers, SIMPLE and RECURSIVE. If a procedure did not specifically say RECURSIVE, when the procedure was called it would not create an activation record, thereby improving performance. SAIL also included the FORWARD qualifier, used to insert forward declarations, typically when two procedures call each other.[10] RETURN worked as in C, both exiting the procedure and returning to the caller, as well as returning a value if the procedure uses one.[11] Parameters passed to the procedures could be by VALUE or REFERENCE, the later allowing values to be passed back.[12]

As a systems programming language, performance was important and to help with this, SAIL included a DEFINE which used string-replacement in a fashion similar to C's #define macros.[13] A difference was that the delimiters around the substitution had to be defined, for instance REQUIRE "[][]" DELIMITERS;DEFINE maxSize=[100];. One common use of these macros was to define character constants like CRLF, as these were not part of the basic language.[13] Another was to redefine the COMMENT statement to the shorter !.[14]

The language used the left-arrow for assignment, or the underscore on platforms that did not have Stanford ASCII.[15] It included a number of standard functions like square root, all of the common math operators, and was otherwise similar to most ALGOL derivatives for normal programming.[16]

Strings were manipulated using array slicing, with aStr[i TO j] returning the substring with characters from i to j, or aStr[i FOR j] which returned the substring starting at i and running for j characters.[17] The INF(inity) keyword represented the end of the string, so one could aStr[i TO INF] to return everything from i on.[3] String functions and operators included EQU for testing if two strings were equal,[6], the ampersand for concatenation, LENGTH and LOP which removes the first character from the string.[17]

Uses

A number of interesting software systems were coded in SAIL, including some early versions of FTP and TeX, a document formatting system called PUB,[18] and BRIGHT, a clinical database project sponsored by the National Institutes of Health.[19][20][21][22][23][24][25][26][27]

In 1978, there were half a dozen different operating systems for the PDP-10: ITS (MIT), WAITS (Stanford), TOPS-10 (DEC), CMU TOPS-10 (Carnegie Mellon), TENEX (BBN), Tymcom-X (Tymshare), and TOPS-20 (DEC, based on TENEX).

SAIL was ported from WAITS to ITS so that MIT researchers could make use of software developed at Stanford University. Every port usually required the rewriting of I/O code in each application.

A machine-independent version of SAIL called MAINSAIL was developed in the late 1970s and was used to develop many eCAD design tools during the 1980s. MAINSAIL was easily portable to new processors and operating systems, and was still in limited use as of 2005.

See also

References

  1. ^ Slimick 1971, p. 22.
  2. ^ a b Reiser 1976, p. iii.
  3. ^ a b c Smith 1976, p. 13.
  4. ^ Smith 1976, p. 2.
  5. ^ Smith 1976, p. 4.
  6. ^ a b c Smith 1976, p. 11.
  7. ^ Smith 1976, p. 15.
  8. ^ Smith 1976, p. 17.
  9. ^ Smith 1976, p. 18.
  10. ^ Smith 1976, p. 21.
  11. ^ Smith 1976, p. 23.
  12. ^ Smith 1976, p. 24.
  13. ^ a b Smith 1976, p. 25.
  14. ^ Smith 1976, p. 26.
  15. ^ Smith 1976, p. 5.
  16. ^ Smith 1976, p. 6.
  17. ^ a b Smith 1976, p. 12.
  18. ^ "PUB Manual". Nomodes.com. Archived from the original on 5 February 2005. Retrieved 30 December 2017.
  19. ^ Rodbard, D.; Cole, B. R.; Munson, P. J. (1983). "Development of a Friendly, Self-Teaching, Interactive Statistical Package for Analysis of Clinical Research Data: The BRIGHT STAT-PACK". Proc Annu Symp Comput Appl Med Care. 8 (3): 701–704. doi:10.1007/BF02224505. PMC 2578281. PMID 6384409.
  20. ^ Stetten, DeWitt (10 May 2014). NIH: An Account of Research in Its Laboratories and Clinics. Academic Press. ISBN 9781483277554 – via Google Books.
  21. ^ "STANFORD UNIVERSITY MEDICAL EXPERIMENTAL COMPUTER RESOURCE : RR - 00785 : ANNUAL REPORT - YEAR 05". Profiles.nlm.nih.gov. Retrieved 30 December 2017.
  22. ^ "Annual report : National Institutes of Health. Division of Computer Research and Technology". Archive.org. Bethesda, Md. Retrieved 30 December 2017.
  23. ^ Zhulin, Denis Larionov & Alexander. "Read the eBook Annual report : National Institutes of Health. Division of Computer Research and Technology (Volume 1981-83) by National Institutes of Health (U.S.). Division of online for free (page 4 of 56)". Ebooksread.com. Retrieved 30 December 2017.
  24. ^ "PUFF/VM PROJECT : Section 4.1.6". Profiles.nlm.nih.gov. Retrieved 30 December 2017.
  25. ^ "Section 9.2.6 : PUFF/WI Project". Profiles.nlm.nih.gov. Retrieved 30 December 2017.
  26. ^ "Section 4.1.7 : PUFF/VM Project". Profiles.nlm.nih.gov. Retrieved 30 December 2017.
  27. ^ "STANFORD UNIVERSITY MEDICAL EXPERIMENTAL COMPUTER RESOURCE : RR - 00785 : ANNUAL REPORT -YEAR 05" (PDF). Profiles.nlm.nih.gov. Retrieved 30 December 2017.

Bibliography

Further reading

  • Beebe, Nelson H. F. (2005). "Proceedings of the Practical TEX 2005 Conference: The design of TEX and METAFONT: A retrospective" (PDF). TUGboat. 26 (1). Salt Lake City, Utah, USA: University of Utah, Department of Mathematics: 39–40. Retrieved 2017-03-07. The underscore operator in SAIL source-code assignments printed as a left arrow in the Stanford variant of ASCII, but PDP-10 sites elsewhere just saw it as a plain underscore. However, its use as the assignment operator meant that it could not be used as an extended letter to make compound names more readable, as is now common in many other programming languages. The left arrow in the Stanford variant of ASCII was not the only unusual character.