Developer | Dan Lewis and Frank Bracher,Tymshare |
---|---|
First appeared | 1968; 57 years ago (1968) |
Influenced by | |
Dartmouth BASIC,JOSS,CAL | |
Influenced | |
BASIC-PLUS |
SUPER BASIC, sometimesSBASIC for short, is an advanced dialect of theBASIC programming language offered onTymshare'sSDS 940 systems starting in 1968 and available well into the 1970s.
Like theDartmouth BASIC it was based on, SUPER BASIC was acompile and go language, as opposed to aninterpreter. In addition to offering most of the commands and functions from Dartmouth BASIC Version 4, in including matrix math commands, SUPER BASIC also included a number of features from the seminalJOSS language developed atRand Corporation,[1] via Tymshare's version,CAL, and added a variety of new functions,complex numbers as a built-in type, anddouble precision support.
SUPER BASIC also greatly improvedstring handling over the rudimentary system in Dartmouth, introducing theLEFT
,MID
andRIGHT
string functions, simplestring concatenation and other features. These were later used inDEC'sBASIC-PLUS, which was later used as the basis for the originalMicrosoft BASIC that saw widespread use in the 1980s.
The originalDartmouth BASIC was released in 1964 but was largely experimental at the time. It went through several revisions before becoming truly useful with the Fourth Edition when it was ported to theGE 635 machine and was published in 1968. Dartmouth specifically placed the underlying design in the public domain, so that anyone could port it to their platforms and call it BASIC. Its spread was further helped by the tireless efforts of its authors to promote it. However, as the code was designed to run on theDTSS operating system, some porting was required to run it on production systems. This led to a proliferation of versions with minor differences.[2]
Tymshare was formed within theUniversity of California, Berkeley, initially renting out time on the University's computers on off-hours. Tymshare's original BASIC, simply Tymshare BASIC, was based onsource code "from elsewhere" in the University,[3] that Dan Lewis began enhancing. Frank Bracher added the routines for file input/output (I/O), which made it far more practical than the original Dartmouth code that relied purely onDATA
statements embedded in the program. Dartmouth's workflow wastape based so loading and saving individual files was not practical and direct I/O was not addressed until later versions. Bracher's I/O code had originally been developed for Tymshare'sSUPER FORTRAN offering.[2]
One oft-noted feature of the system was the documentation, written by Caroline Diehl. The manuals were written in a conversational style.[3]
Tymshare maintained SUPER BASIC through the 1970s, but as the market for rented timeshare programming services dwindled the system went into maintenance and Lewis and Bracher left to do SUPER BASIC consulting for those companies still using it. Maintenance within Tymshare passed primarily to Walter Main.[3]
Tymshare filed for a trademark on SUPER BASIC on 7 January 1970, and refreshed it on 17 October 1977, which became the property ofMcDonnell Douglas in 1984 when the company purchased Tymshare.[3]
Like most BASIC systems of the era, SUPER BASIC had a singlecommand line editor that worked both as an interactive language and a program editor. Commands that were typed without a line number were executed immediately, which they referred to as "direct mode".[a] If the same line was prefixed with a line number, it was instead copied into the program code storage area, known as "indirect mode". New lines were added to the program if the line number was unique, replaced existing lines with the same number, or removed from the program if an existing line number was typed in without any code following it.[4]
Line numbers ran from 0 to 999999.[5] TheDELETE
(or short-formDEL
) could be used to delete a range of lines using typicalLIST
notation, for instance,DELETE 5,10-50
.[4] TheENTER
command started an automatic line-number system. It took two optional parameters, a starting line number and a step, separated withBY
. The starting number was assumed to be zero if not provided, and the step was 10. For instance,ENTER
would produce 0,10,20,...,ENTER BY 5
would produce 0,5,10,..., andENTER 10 BY 10
would produce 10,20,30...[6]RENUMBER
took three parameters, a new starting line number, a range of lines to renumber (like 20-100) and the step.[7]
Although the built-in editor loaded and saved only the lines in the program itself, the user could edit the resulting text file to add additional commands that would run in direct mode. A common example was to edit a program and addRUN
on its own line at the end of the file. When loaded, the system would see theRUN
and immediately compile and start the program on loading.[8] This is unusual for BASIC systems, although this was commonly used in JOSS.
In keeping with the overallDartmouth BASIC concept, SUPER BASIC was acompile and go system that compiled the source code when the program was run. SUPER BASIC had two commands for this, the typicalRUN
seen in most BASICs, as well asSTART
which did the same thing.[9] Remarks could be placed anywhere using!
.[10]
SUPER BASIC expanded theFOR
statement in several ways. A minor change was to allowBY
in place ofSTEP
, and allowed the step to be placed at the end as in most BASICs, or in the middle as in JOSS and other languages. ThusFORI=1TO10BY2
andFORI=1BY2TO10
were both valid.[11] Additionally, SUPER BASIC provided alternate forms of the range definition usingWHILE
andUNTIL
, whereas most other languages used completely separate loop structures for these. For instance,FORX=1WHILEX<Y
will continue as long as X<Y, whileFORX=1UNTILX<Y
stops when the condition is met.[12] As inMicrosoft BASIC, multiple loops could end with a singleNEXT I,J
,[12] although it did not include the feature of later version of MS where the index variable could be left off entirely. Finally, in JOSS fashion, one could replace the typical range specifier1 TO 10
with an explicit list of values,FORI=1,4,5,6,10
.[13]
A more major change, following the JOSS model, was the concept of "statement modifiers" that allowed anIF
orFOR
to be placed after the statement it controlled. For instance,PRINT"IT IS"IFX=5
is equivalent toIFX=5THENPRINT"IT IS"
. This can make some commonly found use-cases easier to understand.[14] It also included thesyntactic sugarUNLESS
which was anIF
with the opposite sense; for instance,PRINT"IT IS NOT FIVE"UNLESSX=5
. One could also use a loop in these cases, which made single one-statement loops easy to implement, for instancePRINTXFORX=1TO10
.[15] One could also use a "bare"WHILE
orUNTIL
without the for,X=X+2UNTILX>10
. The modifiers could also be ganged,PRINT"YES"IFA=BUNLESSN=0
.[16]
Variable names could consist of one or two letters or one letter and a digit. SUPER BASIC did not require variables to be typed, a variable could hold a number at one point and astring at another, a side-effect of the way they were stored. This required the system to test the variable type at runtime duringINPUT
andPRINT
for instance, which reduced performance. This could be addressed by explicitly declaring the variable type using a variety of commands.[17]
In most dialects of BASIC, variables are created on-the-fly as they are encountered in the code, and generally set to zero (or the empty string) when created. This can lead to problems where variables are supposed to be set up by previous code that is not being properly called, but at run time it can be difficult to know if 0 is an uninitialized value or one with the perfectly legal 0 values. SUPER BASIC addressed this with theVAR
command. There were two primary forms,VAR=ZERO
which made all undefined variables automatically get the value zero when accessed, which is the normal pattern for BASIC, andVAR=UNDEF
which would instead cause a "VARIABLE HAS NO VALUE" error to occur when a previously unseen variable was used in a way that attempted to access its value. The later is very useful indebugging scenarios, where the normal behavior can hide the fact that a variable being used in a calculation has not been correctly initialized.[18]
Unless otherwise specified, variables were stored in a 48-bitsingle precisionfloating point format with eleven digits of precision. One could also explicitly define a variable asREAL A
, which was the single-precision format. This was not a consideration in other BASICs where some sort of suffix, like$
, indicated the type wherever it was encountered.[17]
When required, adouble precision format with seventeen digits, stored in three 24-bit words instead of two, could be used by declaring a variable withDOUBLE A
.[19] An existing single precision value or expression could be converted to double using theDBL(X)
function. For instance, one could force an expression to evaluate using double precision usingDBL(10+20)
.[20]
Likewise, one could declareINTEGER A
to produce a one-word 24-bit integer value.[17]
A more unusual addition was direct support forcomplex numbers. These were set up in a fashion similar to other variables, usingCOMPLEX I,J
to set aside two single precision slots. When encountered in programs, other statements likeINPUT
would trigger alternative modes that asked for two numbers instead of one, with similar modifications toREAD
(used withDATA
statements),PRINT
and others. A single complex number could be created from two singles using theCMPLX(X,Y)
function, whileREAL(I)
andIMAG(I)
extracted the real and imaginary parts, respectively, into singles. A small number of additional utility functions were also offered.[21]
There were seven basic math operators:[22]
↑
for exponents - the exponent is converted to a 12-bit integer*
for multiplication/
for divisionMOD
for modulo, the remainder of an integer divisionDIV
for integer division+
for addition-
for subtractionSUPER BASIC's list of mathematical functions was longer than most BASICs, including a series ofinverse trigonometric functions andlogarithms for base 2 and 10.[22]
RND(X),returnsarandomnumberusingafixedsequence,canbeseededwithRND(-1)ABS(N),absolutevalueSQR(N)orSQRT(N),squarerootSINCOSTANASINACOSATNorATANATN/ATANwithtwovariables,(y,x)calculatesy/xandreturnsATNofthatSINHCOSTHTANHLOGLGT/LOG10LOG2EXPEXP2INT,asinBASIC,alwaystruncatesdownwardFIX,similartoINTbutsimplytruncatingthedecimalROUND,roundsthevaluetoclosest,unlikeINTCOMP(X,Y)COMPare,combinesasubtractionandSGN,soifX>Y=1,X=Y=0,X<y+-1PDIF(X,Y)PositiveDIFference,returnsdifference(X-Y)ifX>Y,0otherwise
SUPER BASIC included a number of functions from JOSS as well:[23]
IP(),IntegerPart,equivalenttoINTFP(),FractionPart,sameasX-INT(X)MAX(...)returnsthemaximumvaluefromalistofentriesMIN(...)returnstheminimum
In addition to basic math, SUPER BASIC included array functionality like many other BASIC implementations. One couldDIM A(5,5)
to make a two-dimensional array, and as a consequence of the way they were stored, all variables otherwise undeclared were actually DIMed to have ten indexes, so one couldLET B(5)=20
without previously DIMing B.[24]
In contrast with other BASICs, SUPER BASIC allowed one to define the range of one or both of the dimensions, assuming 1 if not defined. So A in the example above has indexes 1..5, but one might alsoDIM A(-5:5,0:5)
to produce an array that has 11 indexes from -5 to +5 for X, and 0 to +5 for Y. One could also use theBASE
command to change the default, soBASE 0
, for example, makes all dimensions start at 0.[24]
In addition to these traditional BASIC concepts, SUPER BASIC also included most of the matrix math features found in later versions of Dartmouth BASIC. These were invoked by adding the keywordMAT
to the front of other commands. For instance,MAT A=B*C
multiplies all the items in array B by their corresponding item in C, whereasMAT A=B*5
multiplies all the elements in B by 5. Functions for common matrix operations like inversion and identity were included.[25]
As in most versions of BASIC, SUPER BASIC included the standard set of comparison operators,=
,<>
,>=
,<=
,>
and<
, as well as boolean operatorsOR
,AND
andNOT
. In addition,#
could be used as an alternate form of<>
, a form that was found on a number of BASIC implementations in that era.[14] SUPER BASIC also addedXOR
,EQV
for "equivalence" (equals) andIMP
for "implication".[26]
To this basic set, SUPER BASIC also added three new commands for comparing small differences between numbers, these were>>
,<<
and=#
. The much-greater-than and much-less-than operators compared the values of the two operands, for instance, A and B in the expressionA >> B
. If adding B to A results in A being unchanged after the inherent rounding,>>
returned true. Internally this was performed byIFA=A-B
.=#
, the close-to-equals, simply compared both values to an internal meta-variable,EPS
, performingABS(A/B-1)<EPS
.[14]
Most dialects of BASIC allow the result of such logical comparisons to be stored in variables, using some internal format to represent the logical value, often 0 for false and 1 or -1 for true. SUPER BASIC also allowed this, which resulted in the somewhat confusing behavior ofLETA=B=5
, which, following operator precedence, assigns 5 to B and then returns true or false if A=B. SUPER BASIC also added true logical variables, declared in a similar fashion as doubles or complex, usingLOGICAL A
, and other variables could be conveyed to logical usingL()
.[27]
In contrast to logical comparisons and operators, SUPER BASIC also added a number of bitwise logical operators. These applied a basic logical operation to the individual bits in a word. These includedBAN
,BOR
andBEX
, for and, or and exclusive or. Additional functions includeLSH(X)
andRSH(X)
for bit-shifting left and right, respectively. To ease the entry of binary values, constants could be entered inoctal format[b] by prefixing a number with an "O", likeLETA=O41
.[28]
SUPER BASIC allowed string constants (literals) to be enclosed with single or double quotes, so one could usePRINT "HELLO, WORLD!"
orPRINT 'HELLO, WORLD!'
.[29]
In contrast to later dialects of BASIC, one could assign a string to any variable and the$
signifier was not used, soA="HELLO, WORLD!"
was valid. This could lead to some confusion when a user provided a value combining digits and letters, and SUPER BASIC assumed anything starting with a digit was a number. To guide the system when this might result in confusing input, one could explicitly declare string variables usingSTRING A
. As with all variables in SUPER BASIC, these could be arrays,STRING A(5)
. Additionally, SUPER BASIC added the additional statementTEXT
which took a second parameter to define the length of the string elements, soTEXT A(12):10
makes an array with 12 elements of 10 characters each, whileTEXT B(5:10):15
is an array of six elements, 5..10, each 15 characters long.[30]
SUPER BASIC included operators for=
for comparison and+
for concatenation. It included the following functions:[31]
ASC(S), returns the ASCII number for the first character in the stringCHAR(N), returns a string with a single ASCII character, same as MS CHR()COMP(A,B), compares two strings, returns -1,0,1 depending on which is "bigger"INDEX(A,B), returns the index of B within A. Optional 3rd parameter is an offset starting pointLENGTH(A), length of the stringSPACE(X), returns a string consisting of X number of spacesVAL(A), looks through the string for a number and returns itSTR(N), converts a number into a stringLEFT, as in MSRIGHTSUBSTR, as MS's MID
Typical utility functions are also included:[32]
POSreturnsthecolumnoftheprintheadPOS(X)returnsthepositioninafileTAB(X)movestheprintheadtocolumnXTAB(X,N)thesameinfilenumberNDATETIME
SUPER BASIC also included pseudo-variables forPI
andDPI
, the later being double-precision, as well as the previously mentionedEPS
to represent the smallest possible value.
SUPER BASIC included two forms of print formatting that could be used with thePRINT
statement.PRINT IN IMAGE X:
used a format string, in this case stored inX
, in a fashion similar to what other BASICs implemented usingPRINT USING
or the more common examples found inC and its follow-ons. Field type included integers,[33] specified decimal formats, and exponents, as well as strings and text.%
signs indicated a single digit in either an integer or real field, and#
indicated a digit in an E field.[34]*
and$
could be used to prefix any value.[35]
PRINT IN FORMAT
worked generally the same way, the difference being that spaces had to be explicitly defined usingB
. Thus the format string"%% BBB %%.%%"
would print two numerical values with three spaces between them, whereas if this was an image the"BBB"
would be printed out with a space on either side. TheFORMAT
version supported a wider variety of format strings and included items like inline carriage returns, but the examples given in the manuals do not make it clear why there are two such systems when they accomplish the same thing in the end.[36]
Interestingly, the same format commands could be used forINPUT
, not justPRINT
. In this case the user input would be properly formatted based on the string, so1.2345
might be truncated to1.2
if the format is%.%
.[37]
SUPER BASIC included a file input/output system based onINPUT ON X
andPRINT ON X
whereX
is file handle, a number. The number was assigned usingOPENfilenameFOR[INPUT|OUTPUT]ASFILEX
.WRITE ON X
was provided as an alternative toPRINT ON X
, but they are identical internally. When complete, the file can be released withCLOSE X
orCLOSE filename
.[38] When working with files, one could read the next-read location usingLOC(X)
and change it usingLOCATE 100 ON 2
.[39]POS(X)
returned the position within a form ifIN FORM
was being used.[40]SIZE(N)
returned the file size.[41] TheENDFILE(X)
could be used in loops to test whether the end of the file was reached during reads.[42]
The system also included a functionTEL
that returned whether or not there was input waiting in the terminal. SUPER BASIC programs often included code like
100WAIT(1);IFNOTTELTHEN100
to wait for user input and test it every second before continuing.[43] Additionally, it included a pseudo-filename"TEL"
that could be opened for reading and writing usingOPEN"TEL"FOROUTPUTAS2
and thenWRITEON2"HELLO WORLD"
.[44] In addition to"TEL"
, both"T"
and"TELETYPE"
also referenced the command teletype.[45]