bs is a programming language and a compiler/interpreter for modest-sized programs on UNIX systems. The bs command can be invoked either for interactive programming or with a file containing a program, optionally taking arguments, via a Unix shell, e.g., using a Shebang (Unix) #!/usr/bin/bs.
An early man page states, "[<kbd>bs</kbd>] is a remote descendant of Basic [sic] and SNOBOL4, with a little C thrown in."
The bs command appears in UNIX System III Release 3.0 (1980), first released outside of Bell Labs in 1982. It was written by Dick Haight (Richard C. Haight) circa 1978, who recounts it as follows:[1] The Release 3.0 manual mentions bs prominently on page 9 (emphasis added):While not released outside prior to System III, the bs command was present internally in UNIX/TS 1.0 (November 1978),[2] PWB/UNIX 2.0 (June 1979),[2] and CB UNIX editions 2.1 (November 1979)[3] [4] and 2.3 (1981).[5] The bs command does not appear in some earlier internal releases, e.g., the UNIX Support Group’s March 1977 release,[2] nor the PWB/UNIX manual dated May, 1977,[6] suggesting its creation circa 1978. It does not appear in any version of Research Unix nor the Berkeley Software Distribution.
Subsequently and into the 1990s, bs was included in a variety of System III-derived or System V-derived commercial operating systems including, but not limited to: PC/IX; UNIX System V Releases 2 & 3: SVR2, SVR3, SVR3.2 (1986); HP-UX; AIX; and A/UX.(The User's Manual for the AT&T UNIX PC (3B1) specifically mentions that the bs command is not available, but that it is available on SVR3.2.)
Occasionally, bs was touted as one of the primary programming languages for development under UNIX.[7] However, bs is not included in the POSIX.1 commands and utilities (the standard List of Unix commands) nor in the Single UNIX Specification and is not provided with most contemporary operating systems. For example in Linux, similar syntax and functionality is provided by bc, Perl, and POSIX shell.
In the 21st century, bs is present in, at least, HP-UX Release 11i (2000), as well as AIX versions 6.1 (2007) and 7.2 (2018), likely due to their UNIX System V heritage.
The bs man page, ostensibly the programming language's only specification, characterizes it as follows:
A bs program is compiled and executed differently from programs written in the other principal Unix programming languages of the time: C, FORTRAN, and assembly language, whose respective commands compile program source code to executable assembler output (a.out). Instead, a bs program is, first, converted by the bs command to an internal reverse Polish (RPN) intermediate representation and then executed by the command's internal virtual stack machine.[8] The bs language, thus, is a hybrid interpreter and compiler and a divergence in Unix programming from Ancient Unix. The bs language shares some features and syntax with BASIC, SNOBOL, and C, the two former presumably inspiring its name. Like BASIC, it can be used interactively, either executing statements immediately or collecting them into a program to be executed subsequently. Like in SNOBOL4, the assignment operator (=) is used for I/O and bs can execute code in strings, using its eval function. It also includes SNOBOL's interrogation operator (?) used to test whether an expression evaluation succeeds or not. The built-in format function, limited to one argument, supports a subset of C's printf format conversion specifiers, e.g., "%f".
The language has some conspicuous elements. For instance, its program functions are defined using the fun ... nuf syntax and its functions can have local variables. Also, bs can operate in two modes, either interpreting (and executing) statements and programs or compiling them, and switching between the two using compile and stop. Otherwise, its functionality is unique only collectively (in one language), since individual features are redundant with those of coexisting tools, such as the Unix Shell, e.g., file I/O and loops, and AWK, e.g., associative arrays and Regular expression matching.
The bs language was meant for convenient development and debugging of small, modular programs. It has a collection of syntax and features from prior, popular languages but it is internally compiled, unlike a Shell script. As such, in purpose, design, and function, bs is a largely unknown, modest predecessor of hybrid interpreted/compiled languages such as Perl and Python.
The following examples are derived from an A/UX bs(1) man page.
This example uses bs as a calculator:
This example is the outline of a typical bs program:
This example demonstrates I/O:
The following is a sample bs program that emits the words to the song 99 Bottles of Beer using /usr/bin/bs.[9]