fbpx
Wikipedia

SAIL (programming language)

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
FamilyALGOL
Designed byDan Swinehart
Robert Sproull
DeveloperStanford University
First appeared1969; 55 years ago (1969)
PlatformPDP-10, others
Influenced by
ALGOL-60
Influenced
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 edit

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 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 edit

Basic structure and statements edit

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] SAIL did not include the equivalent of a PROGRAM block as in Pascal, nor a main as in C, execution started with the first line of code in the outermost block.[4]

Standard statements included IF...THEN...ELSE,[5] FOR...STEP...UNTIL...DO,[6] WHILE...DO for top-tested loops, WHILE...UNTIL for bottom-tested, and GOTO which used a label.[7] The CASE was similar to switch in C, but normally used a somewhat different syntax, like CASE i OF ("Zero","One","Two");, which returns the appropriate string based on the value of i.[5] If one wanted to test explicit values in the CASE, the values had to be in square brackets:

CASE I OF  BEGIN  [0] 10;  [4] 25;  [6][7] 50  END; 

This code will ignore values like 1 to 3, and only return a value for the listed values. Note that the last item cannot have a semicolon following.[8]

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]

Procedure declarations edit

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.[10]

In order to improve performance, SAIL added two procedure qualifiers, SIMPLE and RECURSIVE. RECURSIVE told the compiler that the procedure might call itself, and thus its local variables had to be written to the stack, not just the subroutine return information. SIMPLE did the opposite, demanding the procedure have no local variables at all, not allowing GOTO out of the function, and could not refer to enclosing procedure's variables. These directives could avoid the requirement of filling out a complete activation record, thereby improving performance.[11] This also had the side-effect of meaning that variables declared within a procedure that was not marked RECURSIVE would not be reset between calls,[11] acting similar to C's static.

SAIL also included the FORWARD qualifier, used to insert forward declarations, typically when two procedures call each other.[10] RETURN worked as in C, exiting the procedure and returning to the caller, as well as optionally returning a value if the procedure uses one.[12] Parameters passed to the procedures could be by VALUE or REFERENCE, the later allowing values to be passed back.[13]

Basic data types and operators edit

The basic variable types in SAIL are integers, reals (floating point), booleans, and strings.[14] Type conversions were automatic, so INTEGER i;i←SQRT(5); would convert the value 5 to a double as that is what SQRT requires, and then cast the result to an integer.[3] 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.[15]

The language used the left-arrow for assignment, , or the underscore on platforms that did not have Stanford ASCII.[16] 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.[17]

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.[18] 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,[5] the ampersand for concatenation, LENGTH, and LOP which removes the first character from the string.[18] There was no way to compare strings other than EQU, operators like < were defined only for numbers.[4]

Records and pointers edit

The concept of records as a data type had only recently been introduced when SAIL was being written. This feature thus shows the signs of being "bolted on" to the language syntax. For instance a record structure was defined using the RECORD!CLASS statement: RECORD!CLASS person (STRING name, address; INTEGER accountnum; REAL balance). This statement worked in a fashion similar to the RECORD statement in Pascal, defining the template for the record. To create a record, one used the NEW!RECORD statement, which returned a RECORD!POINTER. Pointers were typed, and could be typed to more than one type, for instance, RECORD POINTER (person,university) rp; defines rp, a pointer to either a person or university record.[19] Pointers could also be declared to point to ANY!CLASS.[20] Accessing the data in a record was similarly idiosyncratic; to print the name file of a person, for instance, the syntax was PRINT(person:name[rp]);.[20]

String scanner edit

In addition to basic string functionality, SAIL included a string scanner system as part of the basic language. SCAN worked on string variables, while the otherwise similar INPUT was used to scan strings being read from a file. Both used a system known as a "break table" which consisted of a set of characters that represented places to stop reading, examples include linefeeds, various whitespace, and punctuation. These tables were stored in special structures, and the system allowed only 54 of these, a number that is not explained in the documentation.[21]

To build a new table, one first called GETBREAK which returned the next free slot in the table, or "table number". This would be followed by a SETBREAK, which took the table number, a string with the break characters, another string of "omit characters" which were simply ignored during reading (as if they were not in the string) and finally the "modes", flags that indicated how the system should work. Once set, the program could then repeatedly call SCAN or INPUT and be returned complete strings.[22] This included a reference parameter, normally brkchar, that contained the character that caused the break, allowing one to test, for instance, for end-of-file characters. The system is conceptually similar to C's strtok functionality, which is part of stdlib[23] as opposed to being part of the language itself as in SAIL.

Input/Output edit

SAIL's input/output system was based on the idea of numbered "channels" in a fashion somewhat similar to the scanner entries. To open a file, one first called GETCHAN to return a value of a free channel, and then OPENed it with various parameters to describe the file and modes of operation. RELEASE was equivalent to close. Once opened, the file could be read, subject to the scanning rules noted above, by calling INPUT and looking for the end-of-file. Files did not have names as part of the OPEN, instead, LOOKUP could be used to point a channel at a given file, ENTER made a new file associated with a channel, and RENAME allowed an existing file name to be changed.[24] One can open an existing file for writing using GETCHAN... OPEN... LOOKUP... ENTER.[25]

There were numerous special handlers and variables that were used during I/O. For instance, the INCHWL function was an INPUT hard-wired to the user terminal and always open, and it returns its break character in the system variable !SKIP!.[26] The PRINT function normally output to the same terminal channel, but could also be directed at any other opened channel.[27]

Compiler directives edit

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.[28] 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.[28] Another was to redefine the COMMENT statement to the shorter !.[29]

The system also included a conditional compilation system using statements, as opposed to pre-processor directives as found in C. IFCR would compile the blocks between the corresponding THENC and ELSEC or ENDC. The condition in the IFCR must be known at compile time, so, like C, was normally a DEFINEd value.[30]

LEAP data edit

The main difference between SAIL and other ALGOL-derived languages was its inclusion of the associative store from the LEAP language. This system provided a system that allowed data to be placed in record-like structures and then saved, retrieved and searched. In this respect it was similar to the data handling features in COBOL. The basis for the store was the association or triple, which allowed a data value to be associated with a named slot in a record. For instance, one might make a record of the type Family_Member with Name "Tom" and set the Father field to "Harry". This results in a triple of the form (Father, Tom, Harry). The associated libraries could then find all the Family_Members with "Harry" as the Father, perhaps returning "Tom" and "Alice".[31]

Example edit

The following code, found in the Tutorial, converts an input string to upper case.[10]

STRING PROCEDURE upper(STRING rawstring);  BEGIN "upper"  STRING tmp;  INTEGER char;  tmpNULL;  WHILE LENGTH(rawstring) DO  BEGIN  charLOP(rawstring); COMMENT LOP returns the first character and moves the pointer past it  tmptmp&(IF "a" LEQ char LEQ "z" THEN char-'40 ELSE char);  END;  RETURN(tmp);  END "upper"; 

Uses edit

A number of interesting software systems were coded in SAIL, including some early versions of FTP and TeX, a document formatting system called PUB,[32] and BRIGHT, a clinical database project sponsored by the National Institutes of Health.[33][34][35][36][37][38][39][40][41]

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 edit

References edit

  1. ^ Slimick 1971, p. 22.
  2. ^ a b Reiser 1976, p. iii.
  3. ^ a b c Smith 1976, p. 13.
  4. ^ a b Smith 1976, p. 48.
  5. ^ a b c Smith 1976, p. 11.
  6. ^ Smith 1976, p. 15.
  7. ^ Smith 1976, p. 17.
  8. ^ Smith 1976, p. 19.
  9. ^ Smith 1976, p. 18.
  10. ^ a b c Smith 1976, p. 21.
  11. ^ a b Smith 1976, p. 22.
  12. ^ Smith 1976, p. 23.
  13. ^ Smith 1976, p. 24.
  14. ^ Smith 1976, p. 2.
  15. ^ Smith 1976, p. 4.
  16. ^ Smith 1976, p. 5.
  17. ^ Smith 1976, p. 6.
  18. ^ a b Smith 1976, p. 12.
  19. ^ Smith 1976, p. 40.
  20. ^ a b Smith 1976, p. 41.
  21. ^ Smith 1976, p. 27.
  22. ^ Smith 1976, p. 28.
  23. ^ "strtok() and strtok_r() functions in C with examples".
  24. ^ Smith 1976, p. 32.
  25. ^ Smith 1976, p. 33.
  26. ^ Smith 1976, p. 30.
  27. ^ Smith 1976, pp. 2, 38.
  28. ^ a b Smith 1976, p. 25.
  29. ^ Smith 1976, p. 26.
  30. ^ Smith 1976, p. 44.
  31. ^ Reiser 1976, p. 83.
  32. ^ . Nomodes.com. Archived from the original on 5 February 2005. Retrieved 30 December 2017.
  33. ^ 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.
  34. ^ Stetten, DeWitt (10 May 2014). NIH: An Account of Research in Its Laboratories and Clinics. Academic Press. ISBN 9781483277554 – via Google Books.
  35. ^ "STANFORD UNIVERSITY MEDICAL EXPERIMENTAL COMPUTER RESOURCE : RR - 00785 : ANNUAL REPORT - YEAR 05". Profiles.nlm.nih.gov. Retrieved 30 December 2017.
  36. ^ "Annual report : National Institutes of Health. Division of Computer Research and Technology". Archive.org. Bethesda, Md. Retrieved 30 December 2017.
  37. ^ 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.
  38. ^ "PUFF/VM PROJECT : Section 4.1.6". Profiles.nlm.nih.gov. Retrieved 30 December 2017.
  39. ^ "Section 9.2.6 : PUFF/WI Project". Profiles.nlm.nih.gov. Retrieved 30 December 2017.
  40. ^ "Section 4.1.7 : PUFF/VM Project". Profiles.nlm.nih.gov. Retrieved 30 December 2017.
  41. ^ "STANFORD UNIVERSITY MEDICAL EXPERIMENTAL COMPUTER RESOURCE : RR - 00785 : ANNUAL REPORT -YEAR 05" (PDF). Profiles.nlm.nih.gov. Retrieved 30 December 2017.

Bibliography edit

  • Reiser, John (August 1976). SAIL (PDF) (Technical report). Stanford Artificial Intelligence Laboratory.
  • Smith, Nancy (October 1976). SAIL Tutorial (PDF) (Technical report). Stanford Artificial Intelligence Laboratory.
  • Slimick, John (October 1971). "Current Systems Implementation Languages: One User's View" (PDF). ACM SIGPLAN Notices. 6 (9): 20–28. doi:10.1145/942596.807056.

Further reading edit

  • 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.

External links edit

  • A SAIL Tutorial from the DECUS PDP-10 library tapes
  • Stanford Artificial Intelligence Lab Memo AIM-289/SAILON 57.4: SAIL Manual August 1976

sail, programming, language, sail, stanford, artificial, intelligence, language, developed, swinehart, sproull, stanford, originally, large, algol, like, language, decsystem, language, combined, earlier, language, gogol, compiler, essentially, integer, only, v. 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 SAILFamilyALGOLDesigned byDan SwinehartRobert SproullDeveloperStanford UniversityFirst appeared1969 55 years ago 1969 PlatformPDP 10 othersInfluenced byALGOL 60InfluencedMAINSAIL 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 Contents 1 History 2 Description 2 1 Basic structure and statements 2 2 Procedure declarations 2 3 Basic data types and operators 2 4 Records and pointers 2 5 String scanner 2 6 Input Output 2 7 Compiler directives 2 8 LEAP data 3 Example 4 Uses 5 See also 6 References 6 1 Bibliography 7 Further reading 8 External linksHistory editThe 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 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 editBasic structure and statements edit 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 SAIL did not include the equivalent of a PROGRAM block as in Pascal nor a main as in C execution started with the first line of code in the outermost block 4 Standard statements included IF THEN ELSE 5 FOR STEP UNTIL DO 6 WHILE DO for top tested loops WHILE UNTIL for bottom tested and GOTO which used a label 7 The CASE was similar to switch in C but normally used a somewhat different syntax like CASE i OF Zero One Two which returns the appropriate string based on the value of i 5 If one wanted to test explicit values in the CASE the values had to be in square brackets CASE I OF BEGIN 0 10 4 25 6 7 50 END This code will ignore values like 1 to 3 and only return a value for the listed values Note that the last item cannot have a semicolon following 8 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 Procedure declarations edit 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 10 In order to improve performance SAIL added two procedure qualifiers SIMPLE and RECURSIVE RECURSIVE told the compiler that the procedure might call itself and thus its local variables had to be written to the stack not just the subroutine return information SIMPLE did the opposite demanding the procedure have no local variables at all not allowing GOTO out of the function and could not refer to enclosing procedure s variables These directives could avoid the requirement of filling out a complete activation record thereby improving performance 11 This also had the side effect of meaning that variables declared within a procedure that was not marked RECURSIVE would not be reset between calls 11 acting similar to C s static SAIL also included the FORWARD qualifier used to insert forward declarations typically when two procedures call each other 10 RETURN worked as in C exiting the procedure and returning to the caller as well as optionally returning a value if the procedure uses one 12 Parameters passed to the procedures could be by VALUE or REFERENCE the later allowing values to be passed back 13 Basic data types and operators edit The basic variable types in SAIL are integers reals floating point booleans and strings 14 Type conversions were automatic so INTEGER i i SQRT 5 would convert the value 5 to a double as that is what SQRT requires and then cast the result to an integer 3 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 15 The language used the left arrow for assignment or the underscore on platforms that did not have Stanford ASCII 16 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 17 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 18 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 5 the ampersand for concatenation LENGTH and LOP which removes the first character from the string 18 There was no way to compare strings other than EQU operators like lt were defined only for numbers 4 Records and pointers edit The concept of records as a data type had only recently been introduced when SAIL was being written This feature thus shows the signs of being bolted on to the language syntax For instance a record structure was defined using the RECORD CLASS statement RECORD CLASS person STRING name address INTEGER accountnum REAL balance This statement worked in a fashion similar to the RECORD statement in Pascal defining the template for the record To create a record one used the NEW RECORD statement which returned a RECORD POINTER Pointers were typed and could be typed to more than one type for instance RECORD POINTER person university rp defines rp a pointer to either a person or university record 19 Pointers could also be declared to point to ANY CLASS 20 Accessing the data in a record was similarly idiosyncratic to print the name file of a person for instance the syntax was PRINT person name rp 20 String scanner edit In addition to basic string functionality SAIL included a string scanner system as part of the basic language SCAN worked on string variables while the otherwise similar INPUT was used to scan strings being read from a file Both used a system known as a break table which consisted of a set of characters that represented places to stop reading examples include linefeeds various whitespace and punctuation These tables were stored in special structures and the system allowed only 54 of these a number that is not explained in the documentation 21 To build a new table one first called GETBREAK which returned the next free slot in the table or table number This would be followed by a SETBREAK which took the table number a string with the break characters another string of omit characters which were simply ignored during reading as if they were not in the string and finally the modes flags that indicated how the system should work Once set the program could then repeatedly call SCAN or INPUT and be returned complete strings 22 This included a reference parameter normally brkchar that contained the character that caused the break allowing one to test for instance for end of file characters The system is conceptually similar to C s strtok functionality which is part of stdlib 23 as opposed to being part of the language itself as in SAIL Input Output edit SAIL s input output system was based on the idea of numbered channels in a fashion somewhat similar to the scanner entries To open a file one first called GETCHAN to return a value of a free channel and then OPENed it with various parameters to describe the file and modes of operation RELEASE was equivalent to close Once opened the file could be read subject to the scanning rules noted above by calling INPUT and looking for the end of file Files did not have names as part of the OPEN instead LOOKUP could be used to point a channel at a given file ENTER made a new file associated with a channel and RENAME allowed an existing file name to be changed 24 One can open an existing file for writing using GETCHAN OPEN LOOKUP ENTER 25 There were numerous special handlers and variables that were used during I O For instance the INCHWL function was an INPUT hard wired to the user terminal and always open and it returns its break character in the system variable SKIP 26 The PRINT function normally output to the same terminal channel but could also be directed at any other opened channel 27 Compiler directives edit 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 28 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 28 Another was to redefine the COMMENT statement to the shorter 29 The system also included a conditional compilation system using statements as opposed to pre processor directives as found in C IFCR would compile the blocks between the corresponding THENC and ELSEC or ENDC The condition in the IFCR must be known at compile time so like C was normally a DEFINEd value 30 LEAP data edit The main difference between SAIL and other ALGOL derived languages was its inclusion of the associative store from the LEAP language This system provided a system that allowed data to be placed in record like structures and then saved retrieved and searched In this respect it was similar to the data handling features in COBOL The basis for the store was the association or triple which allowed a data value to be associated with a named slot in a record For instance one might make a record of the type Family Member with Name Tom and set the Father field to Harry This results in a triple of the form Father Tom Harry The associated libraries could then find all the Family Members with Harry as the Father perhaps returning Tom and Alice 31 Example editThe following code found in the Tutorial converts an input string to upper case 10 STRING PROCEDURE upper STRING rawstring BEGIN upper STRING tmp INTEGER char tmp NULL WHILE LENGTH rawstring DO BEGIN char LOP rawstring COMMENT LOP returns the first character and moves the pointer past it tmp tmp amp IF a LEQ char LEQ z THEN char 40 ELSE char END RETURN tmp END upper Uses editA number of interesting software systems were coded in SAIL including some early versions of FTP and TeX a document formatting system called PUB 32 and BRIGHT a clinical database project sponsored by the National Institutes of Health 33 34 35 36 37 38 39 40 41 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 update See also editStanford Extended ASCII SEASCII References edit Slimick 1971 p 22 a b Reiser 1976 p iii a b c Smith 1976 p 13 a b Smith 1976 p 48 a b c Smith 1976 p 11 Smith 1976 p 15 Smith 1976 p 17 Smith 1976 p 19 Smith 1976 p 18 a b c Smith 1976 p 21 a b Smith 1976 p 22 Smith 1976 p 23 Smith 1976 p 24 Smith 1976 p 2 Smith 1976 p 4 Smith 1976 p 5 Smith 1976 p 6 a b Smith 1976 p 12 Smith 1976 p 40 a b Smith 1976 p 41 Smith 1976 p 27 Smith 1976 p 28 strtok and strtok r functions in C with examples Smith 1976 p 32 Smith 1976 p 33 Smith 1976 p 30 Smith 1976 pp 2 38 a b Smith 1976 p 25 Smith 1976 p 26 Smith 1976 p 44 Reiser 1976 p 83 PUB Manual Nomodes com Archived from the original on 5 February 2005 Retrieved 30 December 2017 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 Stetten DeWitt 10 May 2014 NIH An Account of Research in Its Laboratories and Clinics Academic Press ISBN 9781483277554 via Google Books STANFORD UNIVERSITY MEDICAL EXPERIMENTAL COMPUTER RESOURCE RR 00785 ANNUAL REPORT YEAR 05 Profiles nlm nih gov Retrieved 30 December 2017 Annual report National Institutes of Health Division of Computer Research and Technology Archive org Bethesda Md Retrieved 30 December 2017 Zhulin Denis Larionov amp 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 PUFF VM PROJECT Section 4 1 6 Profiles nlm nih gov Retrieved 30 December 2017 Section 9 2 6 PUFF WI Project Profiles nlm nih gov Retrieved 30 December 2017 Section 4 1 7 PUFF VM Project Profiles nlm nih gov Retrieved 30 December 2017 STANFORD UNIVERSITY MEDICAL EXPERIMENTAL COMPUTER RESOURCE RR 00785 ANNUAL REPORT YEAR 05 PDF Profiles nlm nih gov Retrieved 30 December 2017 Bibliography edit Reiser John August 1976 SAIL PDF Technical report Stanford Artificial Intelligence Laboratory Smith Nancy October 1976 SAIL Tutorial PDF Technical report Stanford Artificial Intelligence Laboratory Slimick John October 1971 Current Systems Implementation Languages One User s View PDF ACM SIGPLAN Notices 6 9 20 28 doi 10 1145 942596 807056 Further reading editBeebe 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 External links editDocumentation for MAINSAIL A SAIL Tutorial from the DECUS PDP 10 library tapes Stanford Artificial Intelligence Lab Memo AIM 289 SAILON 57 4 SAIL Manual August 1976 Retrieved from https en wikipedia org w index php title SAIL programming language amp oldid 1188899390, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.