Template:Short description Template:Infobox programming language BASIC-PLUS is an extended dialect of the BASIC programming language that was developed by Digital Equipment Corporation (DEC) for use on its RSTS/E time-sharing operating system for the PDP-11 series of 16-bit minicomputers in the early 1970s through the 1980s.
BASIC-PLUS was based on BASIC-8 for the TSS/8,<ref name="computer-engineering">Template:Cite book</ref> itself based very closely on the original Dartmouth BASIC. BASIC-PLUS added a number of new structures, as well as features from JOSS concerning conditional statements and formatting. In turn, BASIC-PLUS was the version on which the original Microsoft BASIC was patterned.<ref name=manes>Template:Cite book</ref>
Notable among the additions made to BASIC-PLUS was the introduction of string functions like Template:Mono and Template:Mono, in addition to Dartmouth's original all-purpose Template:Mono command. In future versions of the language, notably Microsoft's, Template:Mono was removed and BASIC-PLUS's string functions became the only ways to perform these sorts of operations. Most BASICs to this day follow this convention.
The language was later rewritten as a true compiler as BASIC-Plus-2, and was ported to the VAX-11 platform as that machine's native BASIC implementation. This version survived several platform changes, and is today known as VSI BASIC for OpenVMS.
HistoryEdit
In the mid-1960s, DEC won a sale for a PDP-6 mainframe computer to the RAND Corporation who were looking for a faster machine to run their interactive JOSS programming language. The next year, DEC introduced the much smaller PDP-8, generally considered the first successful minicomputer. For this machine they developed a cut-down version of JOSS known as FOCAL, which became popular on the PDP-8, one of the best-selling computers of the era.Template:Sfn
The same year that RAND introduced JOSS, Dartmouth University introduced the first version of Dartmouth BASIC. This was soon ported to several other platforms, and by the late 1960s it was making major inroads to the computer industry as an interactive language intended to be used with timesharing systems. By the late 1960s, most vendors were introducing a BASIC for their platform, including IBM and the major online timesharing companies like Tymshare's SUPER BASIC.
DEC continued to push FOCAL to their customers, as much for not invented here reasons as any technical advantage. By the late 1968s, DEC's educational department was finding it increasingly difficult to pitch FOCAL to prospective customers as BASIC began to take over. Management was uninterested, so in 1969 David H. Ahl took it upon himself to hire a programmer to write BASIC-8 for the PDP-8. It was an immediate success and became one of DEC's biggest software sellers.Template:Sfn
The same year, DEC began the design effort for a new computer that emerged as the PDP-11.Template:Sfn The first operating system for the platform was DOS-11, a single user system later retargeted for batch processing. Timesharing was a major goal for the new machine, so a second system, MUM-1 for Multi-User Monitor, was developed based on DOS, along with a BASIC-11 that ran on top. The result was very slow.Template:Sfn
The company eventually concluded it needed an entirely new timesharing OS, and put Tom Barnett and Nathan Teicholtz in charge of developing it. They formed a new team to develop what was then known as IOX, Input Output eXecutive, on 11 June 1970. Teicholtz, the technical lead, was formerly part of the TSS-8 effort on the PDP-8. Among the many new concepts IOX was to include was the idea of using a programming language that could act as a command shell programming system as well. An argument broke out in the company about what language it should be based on. Some suggested it be FOCAL, largely because DEC felt they should do their own thing. Others felt that not supporting BASIC would be a major problem for the machine's popularity. As there seemed to be no overwhelming argument either way on technical grounds, the decision was left to the marketing department, who chose BASIC.Template:Sfn In the end, they decided to do both, and have a BASIC dialect that would add some features from FOCAL as well.Template:Sfn
As the OS side of the project grew, the engineering load took over all of the available programming time and there was no one working on the BASIC.Template:Sfn At a chance meeting while buying an airplane, Tim Hart found the seller worked at DEC and they ended up talking about the problems DEC was having. Through this opening, Hart, along with two long-time friends Tom Evans and Tom Griffiths who had formed EGH Inc., received a tender from DEC on 25 August. Because they thought it would be a fun project, they put in a very low bid at $10,500 on 4 September. To their surprise they won the contract on 18 September, but DEC realized the price was too low and offered to make it up through a $3000 bonus clause.Template:Sfn
Previously, DEC had introduced several different BASIC dialects for their different platforms, and these were both different enough to require conversion when moving between machines, as well as generally underwhelming compared to other platforms.Template:Sfn BASIC-PLUS introduced many new features that made it among the more complete dialects, including matrix math, file handing, and other features previously only see on the mainframe system. BASIC-PLUS would go on to be the basis for all future dialects from the company.
The original concept was that EGH would write only the compilerTemplate:Efn and related utilities, while DEC would write the runtime system which would be separate. The idea was that systems with limited amounts of memory and secondary storage would be supplied only with the runtime and small size of the runtime and the intermediate language (IL) code from the compiler would allow it to run. Development would require a machine with more resources, but simply running the resulting programs would work even on the smallest machines. EGH was initially supposed to write only the compiler, but over time they were put in charge of the entire system, which they delivered in January 1971. The idea of a runtime-only system was later dropped.Template:Sfn
IOX was eventually renamed RTST-11, and shipped with BASIC-PLUS in 1971.Template:Sfn
OperationEdit
Users would sit at a terminal and type in programming language statements. The statements could either be entered into the system's command interpreter directly, or entered into a text editor, saved to a file, and loaded into the command interpreter from the file. Errors in source code were reported to the user immediately after the line was typed.
As a smart terminal with cursor control could not be guaranteed, BASIC-PLUS used the common system of prefixing all source code with a line number. The code was edited by typing in the number and then changing the contents of the following code. A line of code could be removed by typing in its line number and nothing else, thereby setting it to an empty line.
The virtual address space of an RSTS/E user was limited to a little less than 64KB of space. Using BASIC-PLUS, about half of this virtual address space was used by the combined command interpreter and run-time library (named the Run Time System on RSTS/E). This limited user programs to about 32 kB of memory.
Large programs were broken into separate executable pieces by use of the <syntaxhighlight lang="text" class="" style="" inline="1">CHAIN</syntaxhighlight> statement, and programs could chain to specific line numbers in a secondary program to indicate that a program should begin execution at a different point from its first line. This feature of chaining to a certain line number allowed programs to signal to each other that they were being called from another program. The use of a shared memory section called core common also allowed programs to pass data to each other as needed. Disk files could also be used but were slower.
To conserve memory, the system included a garbage collecting memory manager, used for both string data and byte-code.
A running program could be interrupted, have variables examined and modified, and then be resumed.
Syntax and featuresEdit
BASIC-PLUS is patterned closely on later versions of Dartmouth BASIC, including its powerful MAT
commands. On top of this, DEC added a number of unique flow-control structures.
EditingEdit
Line numbers were positive integers from 1 to 32767.Template:Sfn Logical lines of code could be continued on multiple physical lines by using a line feed at the end of a line instead of the normal carriage return character.Template:Sfn For ease of external editing of the source file, later versions of BASIC-PLUS also allowed the <syntaxhighlight lang="text" class="" style="" inline="1">&</syntaxhighlight> character as a line continuation character.
Multiple statements could be placed on a single line using <syntaxhighlight lang="text" class="" style="" inline="1">:</syntaxhighlight> as the statement separator.Template:Sfn The system allowed tabs to be used as inline whitespace, and was used to make loops more clear, as in modern languages.Template:Sfn Comments used either the <syntaxhighlight lang="text" class="" style="" inline="1">REM</syntaxhighlight> keyword or the <syntaxhighlight lang="basic" class="" style="" inline="1">!</syntaxhighlight> character,Template:Sfn as opposed to MS BASICs, which used <syntaxhighlight lang="text" class="" style="" inline="1">REM</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">'</syntaxhighlight>.
Standard statementsEdit
The <syntaxhighlight lang="text" class="" style="" inline="1">PRINT</syntaxhighlight> command divided the screen into regions 14 spaces wide, and the comma was used to move between these locations; <syntaxhighlight lang="text" class="" style="" inline="1">PRINT 1,2,3</syntaxhighlight> would output 1, 2 and 3 in a spaced-out fashion,Template:Sfn while <syntaxhighlight lang="text" class="" style="" inline="1">PRINT 1;2;3</syntaxhighlight> would leave a single space and produce "1 2 3".Template:SfnTemplate:Efn <syntaxhighlight lang="text" class="" style="" inline="1">INPUT</syntaxhighlight> allowed a prompt string to be specified, but used the semicolon to separate it rather than the comma; Template:Nowrap
Strings could be delimited by single or double quotes.Template:Sfn In addition to the <syntaxhighlight lang="text" class="" style="" inline="1">CHR</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">ASCII</syntaxhighlight> functions that converted single characters to and from string format,Template:Sfn BASIC-PLUS also supported Dartmouth's <syntaxhighlight lang="text" class="" style="" inline="1">CHANGE</syntaxhighlight> command. <syntaxhighlight lang="text" class="" style="" inline="1">CHANGE</syntaxhighlight> iterated the string and returned each character's ASCII value as a slot in a numeric array. For instance, <syntaxhighlight lang="text" class="" style="" inline="1">CHANGE 'HELLO' TO X</syntaxhighlight> would return an array with the five ASCII codes, 110, 105, 114, 114, 105, in elements 1 through 5, and the number 5, the length of the string, in element 0.Template:Sfn One could reverse the operation as well, <syntaxhighlight lang="text" class="" style="" inline="1">CHANGE X TO A$</syntaxhighlight> would read the individual numbers in the X array and convert it to a string.Template:Sfn
Statement modifiersEdit
BASIC-PLUS added the concept of "statement modifiers", JOSS-like conditions that could be applied to any statement. For instance, <syntaxhighlight lang="basic" class="" style="" inline="1">PRINT I IF I <> 10</syntaxhighlight> is the equivalent of <syntaxhighlight lang="basic" class="" style="" inline="1">IF I <> 10 THEN PRINT I</syntaxhighlight>Template:Sfn The opposite was also provided, <syntaxhighlight lang="basic" class="" style="" inline="1">PRINT I UNLESS I = 10</syntaxhighlight> was the equivalent of <syntaxhighlight lang="basic" class="" style="" inline="1">IF I <> 10 THEN PRINT I</syntaxhighlight>.Template:Sfn
<syntaxhighlight lang="text" class="" style="" inline="1">FOR</syntaxhighlight> loops worked as in other versions of BASIC, and the <syntaxhighlight lang="text" class="" style="" inline="1">NEXT</syntaxhighlight> command could not be used in an expression to exit early.Template:Sfn Instead, the <syntaxhighlight lang="text" class="" style="" inline="1">UNTIL</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">WHILE</syntaxhighlight> keywords could be used to control early exits. For instance, <syntaxhighlight lang="basic" class="" style="" inline="1">FOR I=1 UNTIL I=10</syntaxhighlight> continue looping until I=10, with the assumption that following code would set the value of I,Template:Sfn meaning it might not exit after 10 iterations but as soon as the code set I to 10.Template:Sfn Modifiers could also be used to build compact one-line loops, for instance, <syntaxhighlight lang="basic" class="" style="" inline="1">X=X+1 WHILE X<100</syntaxhighlight> would loop until X was 100.Template:Sfn
Variables, expressions and matrixesEdit
Variable names in the early versions of BASIC-PLUS could be a single letter or a single letter followed by a single digit.Template:Sfn With the inclusion of "Extend mode" in later versions, variable names could be up to 29 characters long, and dot (.) was added as a permitted character. Every variable name still had to begin with a letter.Template:Efn As in most versions of BASIC, the <syntaxhighlight lang="text" class="" style="" inline="1">LET</syntaxhighlight> keyword, for variable assignment, was optional. It could set multiple variables to a single value, like <syntaxhighlight lang="basic" class="" style="" inline="1">LET A,B,C=10</syntaxhighlight>.Template:Sfn
The language supported three data types; floating-point numbers, integers, and strings. Variables with no suffix were floating point (8 bytes, range 0.29Template:X10^ to 1.7Template:X10^, up to 16 digits of precision). Integer variables (16-bit, range −32768 to +32767) were indicated with a <syntaxhighlight lang="text" class="" style="" inline="1">%</syntaxhighlight> suffix,Template:Sfn string variables (variable length) were indicated with a <syntaxhighlight lang="text" class="" style="" inline="1">$</syntaxhighlight> suffix.Template:Sfn
The list of mathematical and logical operators was typical of most BASICs, with some extensions. For math, <syntaxhighlight lang="text" class="" style="" inline="1">+</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">-</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">*</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">/</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">^</syntaxhighlight> were supported, along with <syntaxhighlight lang="text" class="" style="" inline="1">**</syntaxhighlight> as an alternate form of <syntaxhighlight lang="text" class="" style="" inline="1">^</syntaxhighlight> for computer terminals that might not have that character. Standard logical comparisons were <syntaxhighlight lang="text" class="" style="" inline="1">=</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1"><</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">></syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1"><=</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">>=</syntaxhighlight>, and <syntaxhighlight lang="text" class="" style="" inline="1"><></syntaxhighlight>. One interesting addition was the <syntaxhighlight lang="text" class="" style="" inline="1">==</syntaxhighlight> operator, for "approximately equal". This would return true if the two numbers would be printed the same, that is, their six most significant digits were the same.Template:Sfn Logical operators included the typical <syntaxhighlight lang="text" class="" style="" inline="1">NOT A</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">A AND B</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">A OR B</syntaxhighlight>, along with <syntaxhighlight lang="text" class="" style="" inline="1">A XOR B</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">A EQV B</syntaxhighlight> which return true if both A and B are true or both are false, and <syntaxhighlight lang="text" class="" style="" inline="1">A IMP B</syntaxhighlight> which is false if A is true and B is false and otherwise always true.Template:Sfn
The <syntaxhighlight lang="text" class="" style="" inline="1">DIM</syntaxhighlight> statement could allocate one-dimensional and two-dimensional arrays of any of the three data types. The range of subscripts always began with 0 (but <syntaxhighlight lang="text" class="" style="" inline="1">MAT</syntaxhighlight> statements did not set elements in row 0 or column 0).Template:SfnTemplate:Sfn
The language also included a number of <syntaxhighlight lang="text" class="" style="" inline="1">MAT</syntaxhighlight> commands to work with the entire array (or MATrix). The <syntaxhighlight lang="text" class="" style="" inline="1">MAT READ</syntaxhighlight> command would fill the matrix with values in a <syntaxhighlight lang="text" class="" style="" inline="1">DATA</syntaxhighlight> statement,Template:Sfn <syntaxhighlight lang="text" class="" style="" inline="1">MAT INPUT</syntaxhighlight> would fill the array with user-typed values, and <syntaxhighlight lang="text" class="" style="" inline="1">MAT PRINT</syntaxhighlight> would print out the elements in a 1D or 2D format.Template:Sfn <syntaxhighlight lang="text" class="" style="" inline="1">MAT</syntaxhighlight> could also be used to set default values in a matrix using associated keywords, for instance, <syntaxhighlight lang="text" class="" style="" inline="1">MAT A=ZER</syntaxhighlight> would fill the A array with zeros.Template:Sfn <syntaxhighlight lang="text" class="" style="" inline="1">TRN</syntaxhighlight> would transpose an entire matrix, and <syntaxhighlight lang="text" class="" style="" inline="1">INV</syntaxhighlight> would invert it.Template:Sfn Additionally, <syntaxhighlight lang="text" class="" style="" inline="1">+</syntaxhighlight>, <syntaxhighlight lang="text" class="" style="" inline="1">-</syntaxhighlight>, and <syntaxhighlight lang="text" class="" style="" inline="1">*</syntaxhighlight> could be used on matrixes, performing the associated matrix operation.Template:Sfn
File processingEdit
The <syntaxhighlight lang="text" class="" style="" inline="1">DIM#</syntaxhighlight> "virtual DIM" statement could map "virtual data array(s)" or "virtual array(s)" to a disk file, which allowed arrays larger than the computer's available memory (or even its address space), and allowed use of array elements to read, write, and extend disk files (persistent storage). They called this arrangement "virtual data storage" and "virtual core", but it did not use the modern approach of allocating the arrays and a memory-mapped file. Instead, a single buffer was used to store 512 bytes of data at a time, and when an entry in the virtual array was accessed, the corresponding data was read, and old data written, as required. The <syntaxhighlight lang="text" class="" style="" inline="1">CLOSE</syntaxhighlight> statement caused the buffer to be written back (if necessary) before closing the file. Because no additional sectors were cached, accessing data in the "wrong" order could multiply the number of disk accesses. Additional rules were imposed on virtual arrays, such that one datum could never span a record boundary: Each data type was aligned to a multiple of its size. Virtual strings were stored as fixed-length ASCIIZ data, with sizes restricted to 2, 4, 8, 16, 32, 64, 128, 256, or 512 bytes, and were accessed using <syntaxhighlight lang="text" class="" style="" inline="1">LSET</syntaxhighlight> and <syntaxhighlight lang="text" class="" style="" inline="1">RSET</syntaxhighlight>.Template:Sfn
Virtual machineEdit
BASIC-PLUS was not an interpreter but a compile and go system: each line of BASIC was translated into "PPCODE" (Push-Pop Code) as it was entered, for subsequent fast execution on its virtual machine. These translations did not tokenize the BASIC lines but rewrote them for use on a stack machine; you could not translate these representations back to BASIC statements. This avoided the need to repeatedly decode the keywords as strings: once converted to PPCODE the keywords were numbers that pointed to routines to run that function. BASIC-PLUS included a <syntaxhighlight lang="text" class="" style="" inline="1">COMPILE</syntaxhighlight> command, but this was not a true compiler; this simply saved the program's PPCODE representation so that it did not have to be recompiled when the BASIC program was next loaded into memory. The system stored a user's program in two formats. One was the editable source code in text format, created using the <syntaxhighlight lang="text" class="" style="" inline="1">SAVE</syntaxhighlight> command and normally placed in a .BAS file. The other was the PPCODE version of the program created by the <syntaxhighlight lang="text" class="" style="" inline="1">COMPILE</syntaxhighlight> command and saved to a .BAC file; .BAC files were smaller and loaded and ran faster, but could not be edited.<ref>{{#invoke:citation/CS1|citation |CitationClass=web }}</ref>
BASIC Plus 2Edit
{{#invoke:Labelled list hatnote|labelledList|Main article|Main articles|Main page|Main pages}} A related product called Basic Plus 2 ("BP2" or BASIC-Plus-2), was later developed by DEC to add additional features and increased performance.
It used true compilation into threaded code and wrote its output to object files compatible with the machine code object files produced by the assembler and other language systems. These object files could be kept in libraries. A linker (the TKB, also known as the taskbuilder) then created executable files from object files and the libraries. TKB also supported overlays; this allowed individual routines to be swapped into the virtual address space as needed, overlaying routines not currently being used.
Additionally, BP2 programs ran under the RSX Run Time System; this RTS only occupied 8KB of the user's virtual address space, leaving 56KB for the user's program.<ref>Template:Cite book</ref> (RSTS/E version 9 introduced separate Instruction and Data space, and the "disappearing" RSX Run Time System, permitting up to 64KB of each of instruction code and data.) These two factors allowed individual BP2 programs to be much larger than BASIC-PLUS programs, often reducing the need for CHAINing among multiple programs.
Unlike BASIC-PLUS (which was only available on RSTS/E), BP2 was also available for the RSX-11 operating system. BP2 programs were also more compatible with the later VAX BASIC.
Comparison to MS BASICEdit
Microsoft BASIC was patterned very closely on BASIC-PLUS.<ref name=manes/> Earlier versions of MS BASIC, the 1.x series, lacked integer variables, but these were added in the 2.x series that was found on many machines, including the later models of the Commodore PET and Commodore 64. The ability to place logical and loop commands in-line, like <syntaxhighlight lang="text" class="" style="" inline="1">I = I + 1 UNTIL I = 10</syntaxhighlight> was not copied over and does not appear on any common version of microcomputer BASIC. MS BASIC also lacked the matrix commands.