Main Page | See live article | Alphabetical index

BASIC programming language

BASIC is a family of high-level programming languages. Originally devised as a teaching tool, it became widespread on home microcomputers in the 1980s, and remains popular to this day in a handful of heavily altered dialects.

BASIC's name, coined in classic computer science tradition to result in a nice acronym, stands for Beginner's All-purpose Symbolic Instruction Code,¹ tied to the name of an unpublished paper by the language's co-inventor Thomas Kurtz (the name thus having no relation to C. K. Ogden's series "Basic English"). Some critics have humorously called the language Bill's Attempt to Seize Industry Control in response to Microsoft's policies with respect to BASIC interpreterss included with early IBM PC compatibles.

Table of contents
1 History
2 The language
3 Availability and dialect variants
4 Examples
5 Dialects
6 Standards
7 External links
8 References and notes



Prior to the mid-1960s, computers were terribly expensive tools that were used only for special-purpose task, running a single "job" at a time. During the 1960s, however, computers started to drop in price to the point where even small companies could afford them, and the speed increased to the point where they often sat idle because there weren't enough jobs for them.

Programming languages of the era tended to be designed, like the machines they ran on, for specific purposes such as scientific formula processing. Since single-job machines were expensive, they also tended to consider execution speed to be the most important feature of all. In general they were hard to use, and tended to be somewhat "ugly".

It was at this time that the concept of time-sharing systems started to become popular. In such a system the processing time of the main computer was "sliced up" and each user was given a small amount in sequence. The machines were fast enough that most users would be fooled into thinking that they had a single fast machine to themselves. In theory timesharing reduced the cost of computing tremendously, as a single machine could be shared among, in theory at least, hundreds of users.

Birth and early years

The original BASIC language was invented in 1964 by John George Kemeny (1926-93) and Thomas Eugene Kurtz (1928-) at Dartmouth College. In the following years, as other dialects of BASIC appeared, Kemeny and Kurtz' original BASIC dialect became known as Dartmouth BASIC.

BASIC was designed to allow students to write programs using time-sharing computer terminals. BASIC intended to address the complexity issues of older languages with a new language designed specifically for the new class of users the time-sharing systems allowed – that is, a "simpler" user who was not as interested in speed as in simply being able to use the machine. The designers of the language also wanted it to remain in the public domain, which helped it to spread.

The eight design principles of BASIC were:

  1. Be easy for beginners to use
  2. Be a general-purpose language
  3. Allow advanced features to be added for experts (while keeping the language simple for beginners)
  4. Be interactive
  5. Provide clear and friendly error messages
  6. Respond fast for small programs
  7. Not require an understanding of computer hardware
  8. Shield the user from the operating system

The language was based partly on FORTRAN II and partly on Algol 60, with additions to make it suitable for timesharing and matrix arithmetic, BASIC was first implemented on the GE-265¹ mainframe which supported multiple terminals. Contrary to popular belief, it was a compiled language at the time of its introduction. Almost immediately after its release, computer professionals started to deride BASIC as being too slow and too simple.² Such elitism is a recurring theme in the computer industry.

BASIC nevertheless spread to a number of machines, and became fairly popular on newer minicomputers like the DEC PDP series and the Data General Nova. In these instances the language tended to be implemented as an interpreter instead of a compiler, or alternately, both were supplied.

Explosive growth

However it was the introduction of the Altair 8800 microcomputer in 1975 that truly spread BASIC. Most programming languages were too large to fit in the small memory most users could afford on these machines, and with the slow paper tape (or later audio cassette tape) storage (disks of any kind were not available at any price for some years) and the lack of suitable text editors, a small language like BASIC was a good fit. One of the first to appear for this machine was Tiny BASIC, a simple BASIC implementation originally written by Dr. Li-Chen Wang, and then ported onto the Altair by Dennis Allison at the request of Bob Albrecht (who later founded Dr Dobbs Journal). The Tiny BASIC design and the full source code was published 1976 in DDJ.

In 1977 Microsoft (then only two people -- Gates and Allen) released Altair BASIC. Versions then started appearing on other platforms under licence, and millions of copies and variants were soon in use; it became one of the standard languages on the Apple II. By 1979 Microsoft was in talks with several microcomputer vendors, including IBM, to license a BASIC interpreter for their computers. A version was included in the IBM PC's ROM chips and, for PCs without disks, was booted automatically on power up.

As newer companies attempted to follow the success of Altair, IMSAI, North Star, and Apple, and thus created the home computer revolution, BASIC became a standard feature of all but a very few home computers; most came with a BASIC interpreter in ROM (a feature pioneered by the Commodore PET in 1977). Soon there were many millions of machines running BASIC around the world, likely a far greater number than all of the users of all other languages put together. Many programs, especially those on the Apple II and IBM PC, depended on the presence of Microsoft's BASIC interpreter and would not run without it; thus, Microsoft used the copyright license on the BASIC interpreters to gain leverage in negotiations with the computer vendors.


Newer and more powerful BASIC versions were created in this time period. Microsoft sold several versions of BASIC for MSDOS / PCDOS including BASICA, GW-BASIC (a BASICA-compatible version that didn't need IBM's ROM), and Quick BASIC. Turbo Pascal-publisher Borland published Turbo BASIC 1.0 in 1985 (successor versions are still sold under the name of PowerBASIC by another company). Various extensions of home computer BASICs appeared, typically with graphics, sound, and DOS commands, as well as facilities for structured programming. Other languages used the widely-understood BASIC syntax as the basis for otherwise completely different systems, GRASS being one example.

However by the latter half of the 1980s newer computers were far more complex and included features (such as graphical user interfaces) that made BASIC less and less suitable for programming them. At the same time computers were progressing from hobbyist interest to tools used primarily for running applications written by others, and programming as a whole became less important for the growing majority of users. BASIC started to fade, although numerous versions remained available.

BASIC's fortunes reversed once again with the introduction of Visual Basic from Microsoft. Although it is somewhat difficult to consider this language to be BASIC (despite its using many familiar BASIC keywords) it has gone on to become one of the most used languages on the Windows platform, and is said to represent some 70 to 80% of all commercial development. Visual Basic for Applications (VBA) was added to Microsoft Excel 5.0 in 1993 and to the rest of the Microsoft Office product line in 1997. Windows 98 included a VBScript interpreter. The most recent Visual Basic version is called VB.NET. The OpenOffice suite includes a BASIC variant reportedly less powerful than its MS counterpart.

The language


Statements are terminated by line endings unless there is a line continuation character. A very minimal BASIC syntax only needs the LET, PRINT, IF and GOTO commands. An interpreter which executes programs with this minimal syntax doesn't need a stack. Some early microcomputer implementations were this simple. If one adds a stack, nested FOR-loops and the GOSUB command can be added. A BASIC interpreter with these features requires the code to have line numbers.

Line numbers were a very distinctive aspect of classic home computer BASICs. Alas, use of line numbers has the disadvantage of requiring the programmer to guesstimate ahead of program entry how many lines a given program part will take. This need is most often met by habitually incrementing successive line numbers by a regular interval, say 10, but naturally leads to problems as soon as code added at a later time exceeds the place available between the original lines. To alleviate this problem with early BASIC interpreters, expert users soon wrote their own utility programs for renumbering their programs after initial entry. Some BASIC interpreters later appeared with a built-in RENUMBER command, thus eliminating the most pressing problem with line numbers.

Modern BASIC dialects have abandoned line numbers, and support most (or all) of the structured control and data declaration constructs as known in other languages like C and Pascal (note that there were also some advanced versions of line number based home computer BASICs incorporating such constructs to good effect):

Recent variants such as Visual Basic have introduced object-oriented features, and even inheritance in the latest version. Memory management is easier than in many other procedural programming languages because of the commonly included garbage collector (for which one presumably has to pay a run-time performance penalty, however).

The wealth of variants shows that the language is an "organic" one and that it may be seen as a subculture dealing with computer programming rather than as a fixed set of syntactic rules. The same applies to other "old" computer languages like COBOL and FORTRAN as well, although the BASIC movement is by far the largest; this may be explained by the large numbers of IT professionals who cut their teeth at BASIC programming during the home computer era in the 1980s.

Procedures and flow control

BASIC doesn't have a standard external library like other languages such as C. Instead, the interpreter (or compiler) contains an extensive built-in library of intrinsic procedures. These procedures include most of the tools a programmer needs to learn programming and write simple applications including functions for math, strings, console input and output, graphics and file manipulation.

Some BASIC dialects do not allow programmers to write their own procedures. Programmers must instead write their programs with large numbers of GOTO statements for branching. This can result in very confusing source commonly referred to as spaghetti code. GOSUB statements branch to simple kinds of subroutines without parameters or local variables. Most modern versions of BASIC such as Microsoft QuickBASIC have added support for full subroutines and functions. This is another area where BASIC varies from many other programming languages. BASIC, like Pascal, makes a distinction between a procedure which does not return a value (called a subroutine) and a procedure which does (called a function). Many other languages (notably C) make no distinction and consider everything a function (with some returning a "void" value).

While functions in the larger sense of subroutines returning values were a latecomer to BASIC dialects, many early systems supported the definition of one-line mathematical functions with DEF FN ("DEFine FunctioN"). The original Dartmouth BASIC also supported Algol-like functions and subroutines from an early date.

Data types

BASIC is well known for its good string manipulation functions. Already early dialects had a set of fundamental functions (LEFT$, MID$, RIGHT$) to deal with strings easily. As strings are often used in everyday applications this was a considerable advantage over other languages at the time of its introduction.

The original Dartmouth BASIC supported only numeric and string data types. There was no integer type. All numeric variables were floating point. Strings were dynamic length. Arrays of both numbers and strings were supported, as well as matrices (two dimensional arrays).

Every modern BASIC dialect at least has the integer and string data types. Data types are usually distinguished with a following character; string identifiers end in $, whereas integers do not. In some dialects, variables must be declared (with DIM) on first usage; other dialects do not require this, but have the option to enforce it -- typically using a directive such as Option Explicit. Many dialects also support additional types, such as 16 and 32-bit integers and floating-point numbers. Additionally some allow the definition of user-defined types, similar to Pascal "records" or C "structs".

Most BASIC dialects beyond the most primitive also support arrays of integers or other types. In some, arrays must be preallocated before they can be used (with the DIM statement). Support for two and higher-dimensional arrays, as well as arrays of non-integer types, are common.

DIM myIntArray(100) AS INTEGER
DIM myNameList(50) AS STRING
Depending on the dialect of BASIC and on use of the Option Base statement, values can range from myIntArray(0) to myIntArr(100), from myIntArr(1) to myIntArr(100) or from myIntArray(LowInteger) to myIntArray(HighInteger). However, in Visual Basic .NET, all arrays are zero-indexed, meaning the first element has an index of 0, as in the first of the above examples.

Relational and logical operators

 =  equal           <=  less than or equal        NOT  logical negation
<>  not equal       >=  greater than or equal     AND  logical conjunction
 <  less than                                     OR   logical disjunction
 >  greater than

(Notice that there is no lexical distinction between the equality operator and the assignment operator in BASIC)

Availability and dialect variants

BASIC is available for nearly every microprocessor platform made. One free interpreted version that is compliant with standards and highly cross-platform is Bywater BASIC (bwBASIC). The interpreter is written in C and comes under a GNU license. It is meant for text console programs, and as such does not include a builder for creating graphical user interfaces (GUIs). A free BASIC which does include a GUI builder, is similar to Visual Basic and runs on Windows and Linux is Phoenix Object Basic.

The best known compiled versions are Microsoft's Quick BASIC product line and QBASIC (a version which does not generate standalone programs.) Some versions of Visual Basic are also compiled, although Microsoft has kept Visual Basic at least minimally compatible with even early versions of its own BASICs.

Other versions include PowerBASIC's PowerBASIC programming language, as well as True BASIC's True BASIC, which is compliant with the latest official standards for BASIC. (True BASIC Inc. was founded by the original creators of Dartmouth BASIC.)

REALbasic is a variant available for the Apple Macintosh which also generates executables for Microsoft Windows. A variant of a simple BASIC dialect for the parrot virtual machine shows how a BASIC interpreter is implemented in an assembly-like language. PureBasic is a variant with a simple syntax but which produces fast and tiny executable files for Windows and Linux. It can as well compile in-line assembly instructions. SmallBASIC is a dialect which runs on many platforms (Win32, DOS, Linux and PalmOS) and comes under a GNU license (GPL).


Sample 1: Unstructured original BASIC (Applesoft BASIC) ---------- Sample 2: Modern Structured BASIC

 10 INPUT "What is your name: "; U$               INPUT "What is your name"; UserName$
 20 PRINT "Hello "; U$                            PRINT "Hello "; UserName$
 25 REM                                           DO
 30 INPUT "How many stars do you want: "; N          INPUT "How many stars do you want"; NumStars
 35 S$ = ""                                          Stars$ = ""
 40 FOR I = 1 TO N                                   Stars$ = REPEAT$("*", NumStars) '<- ANSI BASIC
 50 S$ = S$ + "*"                                    --or--
 55 NEXT I                                           Stars$ = STRING$(NumStars, "*") '<- MS   BASIC
 60 PRINT S$                                         PRINT Stars$
 65 REM                                              DO
 70 INPUT "Do you want more stars? "; A$                INPUT "Do you want more stars"; Answer$
 80 IF LEN(A$) = 0 GOTO 70                           LOOP UNTIL Answer$ <> ""
 90 A$ = LEFT$(A$, 1)                             LOOP WHILE UCASE$(LEFT$(Answer$, 1)) = "Y"
100 IF (A$ = "Y") OR (A$ = "y") THEN GOTO 30
110 PRINT "Goodbye ";                             PRINT "Goodbye ";
120 FOR I = 1 TO 200                              FOR I = 1 TO 200
130 PRINT U$; " ";                                   PRINT UserName$; " ";
140 NEXT I                                        NEXT I
150 PRINT                                         PRINT



External links

References and notes

Per correspondence with Thomas E. Kurtz.

  • In a 1968 article Edsger Dijkstra considered programming languages using GOTO statements for program structuring purposes harmful for the productivity of the programmer as well as the quality of the resulting code (Communications of the ACM Volume 11, 147-148. 1968, reprinted here). This article does not mention any particular programming language. It merely states that the overuse of GOTO is a Bad Thing and gives the technical reasons why this should be so.

    In a 1975 tongue-in-cheek article, published in Sigplan Notices Volume 17 No. 5, How do We Tell Truths that Might Hurt (reprinted here), he gives a list of uncomfortable truths, including his opinion of several programming languages of the time, such as BASIC. It appears that many people confuse the two articles and conclude that Dijkstra particularly hated BASIC as a result of its GOTO statement. However BASIC receives no worse treatment than PL/I, COBOL or APL in his articles.

  • Based on an article originally written for Nupedia by Peter Fedorow