stringtranslate.com

Intérprete BASIC

Un ejemplo de cómo escribir un programa popular en un intérprete BASIC (en este caso, HAMURABI )

Un intérprete BASIC es un intérprete que permite a los usuarios introducir y ejecutar programas en el lenguaje BASIC y fue, durante la primera parte de la era de las microcomputadoras , la aplicación predeterminada que ejecutaban las computadoras. Se esperaba que los usuarios utilizaran el intérprete BASIC para introducir programas o para cargarlos desde un medio de almacenamiento (inicialmente, cintas de casete y, luego, disquetes ).

Los intérpretes BASIC tienen una importancia histórica. El primer producto de Microsoft que salió a la venta fue un intérprete BASIC ( Altair BASIC ), que allanó el camino para el éxito de la empresa. Antes de Altair BASIC, los microordenadores se vendían como kits que debían programarse en código de máquina (por ejemplo, el Apple I ). Durante el período de Altair, los intérpretes BASIC se vendían por separado, convirtiéndose en el primer software vendido a individuos en lugar de a organizaciones; Apple BASIC fue el primer producto de software de Apple. Después del MITS Altair 8800 , se esperaba que los microordenadores se entregaran con sus propios intérpretes BASIC (por ejemplo, el Apple II , que tenía múltiples implementaciones de BASIC). Una reacción negativa contra el precio del Altair BASIC de Microsoft también llevó al desarrollo temprano de software colaborativo, para implementaciones de Tiny BASIC en general y Tiny BASIC de Palo Alto en particular.

Los intérpretes de BASIC dejaron de usarse a medida que las computadoras crecían en potencia y sus programas asociados se volvían demasiado largos para escribirlos como un formato de distribución razonable. El software venía cada vez más precompilado y se transmitía en disquetes o a través de sistemas de tablones de anuncios , lo que hacía que la necesidad de listas de fuentes fuera menos importante. Además, los shells de comandos cada vez más sofisticados como MS-DOS y la GUI de Apple Macintosh se convirtieron en la interfaz de usuario principal , y la necesidad de que BASIC actuara como shell desapareció. El uso de intérpretes de BASIC como lenguaje principal e interfaz para los sistemas había desaparecido en gran medida a mediados de la década de 1980.

Historia

BASIC ayudó a impulsar la era del tiempo compartido, se volvió popular en la era de las microcomputadoras, luego se desvaneció para convertirse en otra aplicación en la era de DOS y GUI, y hoy sobrevive en algunos nichos relacionados con el desarrollo de juegos, la retrocomputación y la enseñanza.

La era del tiempo compartido

BASIC, que en un principio se implementó como un sistema de compilación y ejecución en lugar de como un intérprete, surgió como parte de un movimiento más amplio hacia los sistemas de tiempo compartido . General Electric , que había trabajado en el Dartmouth Time Sharing System y su asociado Dartmouth BASIC , escribió su propio sistema operativo subyacente y lanzó un sistema de tiempo compartido en línea conocido como Mark I que incluía un compilador BASIC (no un intérprete) como uno de sus principales puntos de venta. Otras empresas en el campo emergente siguieron rápidamente su ejemplo. A principios de la década de 1970, BASIC era prácticamente universal en los ordenadores mainframe de uso general. [1]

El sistema HP 2000 fue diseñado para ejecutar BASIC de tiempo compartido como su tarea principal.

BASIC, como lenguaje simplificado diseñado con edición de línea integrada en mente, era naturalmente adecuado para ser portado al mercado de minicomputadoras , que estaba surgiendo al mismo tiempo que los servicios de tiempo compartido. Estas máquinas tenían una memoria principal muy pequeña , quizás tan poco como 4 KB en la terminología moderna, y carecían del almacenamiento de alto rendimiento como los discos duros que hacen que los compiladores sean prácticos. En contraste, un intérprete ocuparía menos recursos computacionales, a expensas del rendimiento. En 1968, Hewlett Packard presentó el HP 2000 , un sistema que se basaba en su intérprete HP Time-Shared BASIC . [2] En 1969, Dan Paymar e Ira Baxter escribieron otro intérprete BASIC temprano para Data General Nova . [3]

Un reticente fue Digital Equipment Corporation (DEC), el principal vendedor de minicomputadoras. Habían lanzado un nuevo lenguaje conocido como FOCAL , basado en el JOSS anterior desarrollado en una máquina DEC en el Stanford Research Institute a principios de los años 1960. JOSS era similar a BASIC en muchos aspectos, y FOCAL era una versión diseñada para funcionar en sistemas de memoria muy pequeña, en particular el PDP-8 , que a menudo se entregaba con 4 KB de memoria principal . A finales de los años 1960, los vendedores de DEC, especialmente en el departamento de ventas educativas, descubrieron que sus clientes potenciales no estaban interesados ​​en FOCAL y buscaban sus sistemas en otra parte. Esto impulsó a David H. Ahl a contratar a un programador para producir un BASIC para el PDP-8 y otras máquinas DEC. En menos de un año, todo el interés en alternativas como JOSS y FOCAL había desaparecido. [4]

Era de los microordenadores

La introducción de los primeros microordenadores a mediados de los años 1970 continuó el crecimiento explosivo de BASIC, que tenía la ventaja de que era bastante conocido por los jóvenes diseñadores y aficionados a la informática que se interesaban por los microordenadores, muchos de los cuales habían visto BASIC en minis o mainframes. BASIC era uno de los pocos lenguajes que era a la vez lo suficientemente de alto nivel para ser utilizado por personas sin formación y lo suficientemente pequeño para caber en los microordenadores de la época. En 1972, HP presentó la calculadora de escritorio programable HP 9830A con un intérprete BASIC Plus en memoria de sólo lectura (ROM). [5]

En junio de 1974, Alfred Weaver, Michael Tindall y Ronald Danielson de la Universidad de Illinois en Urbana-Champaign demostraron que era posible producir "un intérprete de lenguaje BASIC para el microprocesador Intel 8008", en su artículo del mismo nombre, aunque su aplicación se implementó en un simulador 8008 para el IBM 360/75 y requirió 16 KB. [6]

Altair 8K BASIC en cinta de papel

En enero de 1975 se anunció el Altair 8800 , lo que desencadenó la revolución de los microordenadores . Gates, Allen y Monte Davidoff escribieron conjuntamente una de las primeras versiones de BASIC para microordenadores para su recién formada empresa, Micro-Soft. Esta versión fue lanzada por MITS en formato de cinta perforada para el Altair 8800 poco después de la propia máquina, [7] lo que demuestra que BASIC es el lenguaje principal de los primeros microordenadores.

En marzo de 1975, Steve Wozniak asistió a la primera reunión del Homebrew Computer Club y comenzó a formular el diseño de su propio ordenador. Los miembros del club estaban entusiasmados con Altair BASIC. [8] Wozniak concluyó que su máquina tendría que tener un BASIC propio. En ese momento trabajaba en Hewlett Packard y utilizó su dialecto de miniordenador, HP Time-Shared BASIC , como base para su propia versión. Integer BASIC se publicó en casete para Apple I y se suministró en ROM cuando se envió el Apple II en el verano de 1977. [9]

Otros miembros del Homebrew Computer Club comenzaron a hacer circular copias de Altair BASIC en cinta de papel, lo que provocó que Gates escribiera su Carta abierta a los aficionados , quejándose de este temprano ejemplo de piratería de software . En parte como respuesta a la carta de Gates, y en parte para hacer un BASIC aún más pequeño que pudiera funcionar de manera útil en máquinas de 4 KB, [a] Bob Albrecht instó a Dennis Allison a escribir su propia variación del lenguaje. Cómo diseñar e implementar una versión reducida de un intérprete para el lenguaje BASIC fue tratado en artículos de Allison en los primeros tres números trimestrales del boletín de People's Computer Company publicado en 1975 y las implementaciones con código fuente publicadas en Dr. Dobb's Journal of Tiny BASIC Calisthenics & Orthodontia: Running Light Without Overbyte . Esto condujo a una amplia variedad de Tiny BASIC con características agregadas u otras mejoras, con versiones conocidas de Tom Pittman y Li-Chen Wang , ambos miembros del Homebrew Computer Club. [10] Tiny BASIC se publicó abiertamente y Wang acuñó el término "copyleft" para alentar a otros a copiar su código fuente. Aficionados y profesionales crearon sus propias implementaciones, lo que convirtió a Tiny BASIC en un ejemplo de un proyecto de software libre que existía antes del movimiento del software libre .

Muchas empresas desarrollaron intérpretes BASIC. En 1976, SCELBI introdujo SCELBAL para el 8008 [11] y la Universidad de Idaho y el Laboratorio Lawrence Livermore anunciaron que publicarían en el dominio público LLL BASIC, que incluía soporte de punto flotante. [12] En 1977, el Apple II y el TRS-80 Model I tenían cada uno dos versiones de BASIC, una versión más pequeña introducida con los lanzamientos iniciales de las máquinas y una versión con licencia de Microsoft introducida más tarde a medida que aumentaba el interés en las plataformas.

¡Hola, mundo!, con video inverso y carácter de campana , ejecute y luego aparezca en Applesoft BASIC

Microsoft adaptó su intérprete al MOS 6502 , que rápidamente se convirtió en uno de los microprocesadores más populares de la era de los 8 bits. Cuando empezaron a aparecer nuevos microordenadores, como el Commodore PET , sus fabricantes licenciaron un Microsoft BASIC, personalizado para las capacidades del hardware. En 1978, MS BASIC era un estándar de facto y prácticamente todos los ordenadores domésticos de los años 1980 lo incluían en la ROM . En 1980, como parte de un acuerdo de licencia más amplio que incluía otros lenguajes y PC DOS , IBM rechazó una propuesta de Atari y en su lugar licenció MS-BASIC sobre su propia implementación, lanzando finalmente cuatro versiones de IBM BASIC , cada una mucho más grande que los intérpretes anteriores (por ejemplo, Cartridge BASIC ocupaba 40 KB). [13] Don Estridge , líder del equipo de IBM PC , dijo: "IBM tiene un BASIC excelente: es bien recibido, se ejecuta rápidamente en computadoras mainframe y es mucho más funcional que los BASIC de microcomputadoras... Pero [su] número de usuarios era infinitesimal comparado con el número de usuarios de Microsoft BASIC. Microsoft BASIC tenía cientos de miles de usuarios en todo el mundo. ¿Cómo se puede discutir eso?" [14] (Véase Microsoft BASIC para la historia posterior de estas diferentes implementaciones.)

Muchos vendedores "discutieron con eso" y usaron otras empresas o escribieron sus propios intérpretes. En septiembre de 1978, Shepardson Microsystems estaba terminando el BASIC estructurado de 16K de Cromemco para las máquinas de bus Cromemco S-100 basadas en Z80 . [15] [16] Paul Laughton y Kathleen O'Brien crearon entonces el BASIC de Atari [17] como esencialmente una versión reducida del BASIC de Cromemco trasladada al 6502. [18] En 1979, Warren Robinett desarrolló el cartucho de programación BASIC para Atari, Inc. , aunque sólo admitía programas con 9 líneas de código (64 caracteres en total). También en 1979, Texas Instruments lanzó el BASIC de TI con su TI-99/4 , que vendería casi 3 millones de sistemas cuando se renovó como TI-99/4A. Sinclair BASIC fue desarrollado para el ZX-80 por John Grant y Steve Vickers de Nine Tiles. En 1980, Sophie Wilson de Acorn Computers desarrolló Atom BASIC , que luego desarrolló en BBC BASIC , uno de los primeros intérpretes en ofrecer programación estructurada en BASIC, con procedimientos y funciones / con nombre, bucles y estructuras inspiradas en COMAL . [19] [20] Jan Jones desarrolló SuperBASIC , otro BASIC británico que soporta programación estructurada, para Sinclair QL . En 1983, Randall Hyde desarrolló SmartBASIC para Coleco Adam . [21] Richard Clayton, Chris Hall y Paul Overell desarrollaron Mallard BASIC para BBC Micro y Locomotive BASIC para Amstrad CPC , ambos con comandos de soporte para un sistema de archivos indexado ISAM . [22] En 1985, MetaComCo lanzó ABasiC para Amiga y ST BASIC para Atari ST . DEF PROCDEF FNREPEAT UNTILIF THEN ELSE

En 1978, David Lien publicó la primera edición de The BASIC Handbook: An Encyclopedia of the BASIC Computer Language , que documentaba palabras clave de más de 78 computadoras diferentes. En 1981, la segunda edición documentaba palabras clave de más de 250 computadoras diferentes, lo que mostraba el crecimiento explosivo de la era de las microcomputadoras. [23]

Los intérpretes como aplicaciones

Con el surgimiento de los sistemas operativos de disco y, posteriormente, de las interfaces gráficas de usuario , los intérpretes de BASIC se convirtieron en solo una aplicación entre muchas, en lugar de proporcionar el primer mensaje que un usuario podría ver al encender una computadora.

En 1983, debutó el ordenador portátil TRS-80 Modelo 100 , con su implementación en Microsoft BASIC digna de mención por dos razones. En primer lugar, los programas se editaban utilizando el sencillo editor de texto TEXT, en lugar de escribirse línea por línea (aunque todavía se requerían los números de línea). [24] En segundo lugar, este fue el último producto de Microsoft que Bill Gates desarrolló personalmente. [25] [26]

También en 1983, Microsoft comenzó a incluir GW-BASIC en el DOS. Funcionalmente idéntico a IBM BASICA , su intérprete BASIC era un ejecutable completamente autónomo y no necesitaba la ROM Cassette BASIC que se encontraba en el IBM PC original . Según Mark Jones Lorenzo, dado el alcance del lenguaje, "GW-BASIC es posiblemente el non plus ultra de la familia de BASIC de numeración de línea de Microsoft que se remonta al Altair, y quizás incluso del BASIC de numeración de línea en general". [27] Con el lanzamiento de MS-DOS 5.0, el lugar de GW-BASIC fue ocupado por QBasic .

MacBASIC ofrecía un entorno de desarrollo totalmente interactivo para el ordenador Macintosh original y fue desarrollado por Donn Denman, [28] Marianne Hsiung, Larry Kenyon y Bryan Stearns. [29] MacBASIC se lanzó como software beta en 1985 y se adoptó para su uso en lugares como el departamento de informática del Dartmouth College , para su uso en un curso introductorio de programación. Estaba condenado a ser el segundo BASIC desarrollado por Apple que se canceló en favor de un BASIC de Microsoft. En noviembre de 1985, Apple terminó abruptamente el proyecto como parte de un acuerdo con Microsoft para extender la licencia de BASIC en el Apple II . [30] [31]

BASIC llegó a algunas consolas de videojuegos, como la Nintendo Famicom .

Los intérpretes de BASIC no fueron sólo un desarrollo estadounidense/británico. En 1984, Hudson Soft lanzó Family BASIC en el mercado japonés para la consola de videojuegos Family Computer de Nintendo, una implementación de solo números enteros diseñada para la programación de juegos, basada en Hudson Soft BASIC para Sharp MZ80 (con palabras clave en inglés). [32] Turbo-Basic XL es un superconjunto compatible de Atari BASIC, desarrollado por Frank Ostrowski y publicado en la edición de diciembre de 1985 de la revista informática alemana Happy Computer , lo que lo convierte en uno de los últimos intérpretes publicados como un programa de escritura . El lenguaje incluía un compilador además del intérprete y presentaba comandos de programación estructurada. Otros autores lanzaron varias versiones modificadas que funcionaban con diferentes sistemas DOS. En Francia, François Lionet y Constantin Sotiropoulos desarrollaron dos intérpretes de BASIC con un enfoque en multimedia: STOS BASIC para Atari ST , en 1988, [33] y AMOS BASIC para Amiga , en 1990.

En mayo de 1991, Microsoft lanzó Visual Basic , un lenguaje de programación controlado por eventos de tercera generación conocido por su modelo de programación Modelo de objetos componentes (COM). [34] Visual Basic admitía el desarrollo rápido de aplicaciones (RAD) de aplicaciones de interfaz gráfica de usuario (GUI) , el acceso a bases de datos mediante objetos de acceso a datos , objetos de datos remotos u objetos de datos ActiveX , y la creación de controles y objetos ActiveX . Visual Basic se utilizó para desarrollar aplicaciones internas propietarias, así como aplicaciones publicadas.

Conceptos básicos de nicho

En 1993, Microsoft lanzó Visual Basic para Aplicaciones , un lenguaje de programación para aplicaciones de Microsoft Office , que reemplaza y amplía las capacidades de lenguajes de programación de macros específicos de aplicaciones anteriores , como WordBASIC de Word (que se había introducido en 1989).

En 1996, Microsoft lanzó VBScript como una alternativa a JavaScript para agregar funcionalidad interactiva del lado del cliente a las páginas web vistas con Internet Explorer . [35]

En 1999, Benoît Minisini lanzó Gambas como una alternativa para los desarrolladores de Visual Basic que habían decidido migrar a Linux . [36]

En 2000, Lee Bamber y Richard Vanner lanzaron DarkBASIC , un sistema de creación de juegos para Microsoft Windows , con IDE y herramientas de desarrollo adjuntos. [37]

En 2001, se lanzó SmallBASIC para Palm PDA . [38] Otro intérprete de BASIC para Palm fue HotPaw BASIC, una rama de Chipmunk Basic .

En 2002, Emmanuel Chailloux, Pascal Manoury y Bruno Pagano publicaron un Tiny BASIC como ejemplo de desarrollo de aplicaciones con Objective Caml . [39]

En 2011, Microsoft lanzó Small Basic (distinto de SmallBASIC), junto con un plan de estudios de enseñanza [40] y una guía introductoria [41] diseñada para ayudar a los estudiantes que han aprendido lenguajes de programación visual como Scratch a aprender programación basada en texto. [42] El IDE asociado proporciona un entorno de programación simplificado con funcionalidades como resaltado de sintaxis , finalización inteligente de código y acceso a la documentación en el editor. [43] El lenguaje tiene solo 14 palabras clave. [44] En 2019, Microsoft anunció Small Basic Online (SBO), que permite a los estudiantes ejecutar programas desde un navegador web . [45] [46]

En 2014, Robin H. Edwards lanzó Arduino BASIC para Arduino , y ahora una implementación ampliamente bifurcada. [47] Otra implementación que usa el mismo nombre fue adaptada de Palo Alto Tiny BASIC en 1984 por Gordon Brandly para su 68000 Tiny BASIC, luego portado a C por Mike Field. [48]

BASIC Móvil para Android

Muchos intérpretes BASIC ahora están disponibles para teléfonos inteligentes y tabletas a través de la App Store de Apple o la tienda Google Play para Android.

Hoy en día, la codificación de intérpretes BASIC se ha convertido en parte del hobby de la retroinformática . Los lenguajes de programación de nivel superior en sistemas con amplia memoria RAM han simplificado la implementación de intérpretes BASIC. Por ejemplo, la gestión de líneas es sencilla si el lenguaje de implementación admite matrices dispersas , la gestión de variables es sencilla con matrices asociativas y la ejecución del programa es fácil con funciones eval . Como ejemplos, véase el proyecto de código abierto Vintage BASIC, escrito en Haskell [49] o el OCaml Tiny BASIC.

Ventas y distribución

Inicialmente, los intérpretes se incluían con el hardware de las computadoras o se desarrollaban como un servicio personalizado, antes de que a fines de los años 1960 surgiera una industria que producía software empaquetado de forma independiente para organizaciones. [50] Los intérpretes BASIC primero se vendieron por separado de las microcomputadoras, luego se integraron, antes de volver a venderse como aplicaciones en la era DOS.

A medida que el mercado se fue orientando hacia las ROM, el tamaño de las mismas pasó a dominar las decisiones sobre el tamaño que podía tener un intérprete de BASIC. Como las RAM se vendían en chips de 4 KB, Altair BASIC se presentó inicialmente en ediciones separadas para 4K, 8K y 12K; esto se trasladó a los chips ROM, ya que los fabricantes decidían cuántos chips ROM podían incluir en su diseño, en función de los objetivos de precio y otras limitaciones.

Compiladores vs. intérpretes

La primera implementación de BASIC, Dartmouth BASIC , fue un compilador. Generalmente, los compiladores examinan el programa completo en un proceso de varios pasos y producen un segundo archivo que se puede ejecutar directamente en el lenguaje de máquina subyacente del ordenador anfitrión sin hacer referencia al código fuente. Este código suele estar formado por llamadas a rutinas preescritas en el sistema de ejecución del lenguaje . El ejecutable normalmente será más pequeño que el código fuente que lo creó.

La principal desventaja de los compiladores, al menos en el contexto histórico, es que requieren grandes cantidades de memoria temporal. A medida que el compilador trabaja, va produciendo un archivo de salida en constante crecimiento que se guarda en la memoria junto con el código fuente original. La memoria adicional para búsquedas temporales, en particular los números de línea en el caso de BASIC, aumenta el requisito de memoria. Las computadoras de la época tenían cantidades muy pequeñas de memoria; en términos modernos, un mainframe típico podría tener del orden de 64 KB. En un sistema de tiempo compartido, el caso de la mayoría de los BASIC de la década de 1960, esa memoria se compartía entre muchos usuarios.

Para que un compilador funcionara, los sistemas debían tener algún tipo de almacenamiento secundario de alto rendimiento , normalmente un disco duro . La edición de programas se llevaba a cabo en un entorno dedicado que escribía el código fuente del usuario en un archivo temporal. Cuando el usuario ejecutaba el programa, el editor salía y ejecutaba el compilador, que leía ese archivo y producía el código ejecutable, y finalmente el compilador salía y ejecutaba el programa resultante. Dividir la tarea de esta manera reducía la cantidad de memoria necesaria para cualquiera de las partes del sistema BASIC en general; en un momento dado, solo se tenía que cargar el editor, el compilador o el entorno de ejecución, el resto estaba en el almacenamiento.

Mientras que los mainframes tenían pequeñas cantidades de memoria, los miniordenadores tenían cantidades aún más pequeñas: los sistemas de 4 y 8 KB eran típicos en la década de 1960. Pero lo que es mucho más importante, los miniordenadores tendían a carecer de cualquier forma de almacenamiento de alto rendimiento; la mayoría de los primeros diseños utilizaban cintas perforadas como sistema de almacenamiento primario, y los sistemas de cinta magnética estaban destinados a la gama alta del mercado. En este entorno, un sistema que escribiera el código fuente, lo compilara y luego ejecutara el resultado habría tardado minutos. Debido a estas limitaciones, proliferaron los intérpretes.

Los intérpretes realizan básicamente las mismas tareas básicas que los compiladores: leen el código fuente y lo convierten en instrucciones ejecutables que invocan funciones de tiempo de ejecución. La principal diferencia es el momento en que realizan las distintas tareas. En el caso de un compilador, todo el código fuente se convierte durante lo que al usuario le parece una única operación, mientras que un intérprete convierte y ejecuta el código fuente una instrucción a la vez. El código de máquina resultante se ejecuta, en lugar de generarse, y luego ese código se descarta y el proceso se repite con la siguiente instrucción. Esto elimina la necesidad de algún tipo de almacenamiento secundario mientras se crea un ejecutable. La principal desventaja es que ya no se pueden separar las diferentes partes del proceso general: el código necesario para convertir el código fuente en operaciones de máquina se debe cargar en la memoria junto con el tiempo de ejecución necesario para realizarlo y, en la mayoría de los casos, también el editor de código fuente.

Producir un lenguaje con todos estos componentes que pueda caber en una pequeña cantidad de memoria y aún tenga lugar para el código fuente del usuario es un gran desafío, pero elimina la necesidad de almacenamiento secundario y fue la única solución práctica para las primeras minicomputadoras y la mayor parte de la historia de la revolución de las computadoras domésticas .

Desarrollo

Diseño del lenguaje

El diseño de lenguajes para los primeros intérpretes a menudo implicaba simplemente hacer referencia a otras implementaciones. Por ejemplo, las referencias de Wozniak para BASIC eran un manual de HP BASIC y una copia de 101 BASIC Computer Games . Basándose en estas fuentes, Wozniak comenzó a esbozar un diagrama de sintaxis para el lenguaje. [51] No sabía que el BASIC de HP era muy diferente de la variedad DEC BASIC utilizada en 101 Games . Los dos lenguajes se diferenciaban principalmente en términos de manejo de cadenas y estructuras de control. [52] Data General Business Basic , una implementación de solo números enteros, fue la inspiración para Atari BASIC. [53]

En contraste, Dennis Allison , un miembro de la facultad de Ciencias de la Computación de la Universidad de Stanford , escribió una especificación para una versión simple del lenguaje. [54] Allison fue instado a crear el estándar por Bob Albrecht del Homebrew Computer Club , quien había visto BASIC en minicomputadoras y sintió que sería la combinación perfecta para nuevas máquinas como Altair. El diseño propuesto por Allison solo usaba aritmética de números enteros y no admitía matrices o manipulación de cadenas. El objetivo era que el programa cupiera en 2 a 3 kilobytes de memoria. El diseño general de Tiny BASIC fue publicado en la edición de septiembre de 1975 del boletín de People's Computer Company (PCC).

La gramática se enumera a continuación en la forma Backus-Naur . [55] En la lista, un asterisco (" *") denota cero o más del objeto a su izquierda, excepto el primer asterisco en la definición de " term", que es el operador de multiplicación; los paréntesis agrupan objetos; y un épsilon (" ε") significa el conjunto vacío. Como es común en la notación de gramática de lenguajes informáticos, la barra vertical (" |") distingue alternativas, al igual que el hecho de estar enumerados en líneas separadas. El símbolo " CR" denota un retorno de carro .

 línea  :: = número declaración CR | declaración CR declaración :: = PRINT lista-expr IF expresión relop expresión THEN declaración GOTO expresión INPUT lista-var LET var = expresión GOSUB expresión RETURN CLEAR LIST RUN END lista-expr :: = ( cadena | expresión ) ( , ( cadena | expresión ) ) * lista-var :: = var ( , var ) * expresión :: = ( +|-|ε ) término (( +|- ) término ) * término :: = factor (( * | / ) factor ) * factor :: = var | número | ( expresión ) var :: = A | B | C ... | Y | Z número :: = dígito dígito * dígito :: = 0 | 1 | 2 | 3 | ... | 8 | 9 relop :: = < ( >| =) | > ( <| =) | =                                                                                                              

Esta sintaxis, tan simple como era, agregó una innovación: GOTOpodía GOSUBtomar una expresión en lugar de un número de línea, proporcionando un GOTO [56] asignado en lugar de la declaración switch de la ON-GOTO/GOSUBestructura más típica de BASIC.

Sinclair BASIC utilizó como definición de lenguaje el estándar Minimal BASIC del American National Standards Institute (ANSI) de 1978, pero en sí mismo era una implementación incompleta con solo aritmética de números enteros. [57] El estándar ANSI se publicó después del diseño de la primera generación de intérpretes para microcomputadoras.

Arquitectura

Componentes comunes de un intérprete BASIC: [58]

Codificación

Los primeros microordenadores carecían de herramientas de desarrollo y los programadores desarrollaban su código en miniordenadores o a mano. Por ejemplo, Dick Whipple y John Arnold escribieron Tiny BASIC Extended directamente en código de máquina, utilizando octal . [59] Robert Uiterwyk escribió a mano MICRO BASIC para el SWTPC (un sistema 6800 ) en un bloc de notas. [60] Steve Wozniak escribió el código para Integer BASIC a mano, traduciendo las instrucciones del código ensamblador a sus equivalentes en código de máquina y luego cargando el resultado en su ordenador. [61] (Debido a esto, el programa era muy difícil de cambiar y Wozniak no pudo modificarlo lo suficientemente rápido para Steve Jobs , quien posteriormente licenció BASIC de Microsoft. [62] )

Gates y Allen no tenían un sistema Altair en el que desarrollar y probar su intérprete. Sin embargo, Allen había escrito un emulador Intel 8008 para su proyecto anterior, Traf-O-Data , que se ejecutaba en una computadora de tiempo compartido PDP-10 . Allen adaptó este emulador basándose en la guía del programador de Altair, y desarrollaron y probaron el intérprete en la PDP-10 de Harvard. [63] Cuando Harvard dejó de utilizar este sistema, Gates y Allen compraron tiempo de computadora a un servicio de tiempo compartido en Boston para completar la depuración de su programa BASIC. Gates afirmó, en su Carta abierta a los aficionados en 1976, que el valor del tiempo de computadora para el primer año de desarrollo de software era de $ 40.000. [64]

No es que Allen no supiera programar a mano en lenguaje de máquina. Mientras se encontraba en la aproximación final al aeropuerto de Albuquerque en un viaje para demostrar el funcionamiento del intérprete, Allen se dio cuenta de que había olvidado escribir un programa de arranque para leer la cinta en la memoria. Escribiendo en lenguaje de máquina 8080, Allen terminó el programa antes de que el avión aterrizara. Sólo cuando cargó el programa en un Altair y vio un mensaje que le preguntaba por el tamaño de la memoria del sistema supo que el intérprete funcionaba en el hardware del Altair. [65] [66]

Una de las versiones más populares de Tiny BASIC fue Palo Alto Tiny BASIC, o PATB para abreviar. PATB apareció por primera vez en la edición de mayo de 1976 de Dr. Dobbs , escrita en un lenguaje ensamblador personalizado con mnemotecnia no estándar. Li-Chen Wang había codificado su intérprete en un sistema de tiempo compartido con un ensamblador genérico.

Una excepción al uso del ensamblaje fue el uso de ALGOL 60 para el intérprete Paisley XBASIC para los grandes sistemas de Burroughs . [67] Otra excepción, y programa de escritura en lenguaje natural , fue Classic BASIC, escrito por Lennart Benschop en Forth y publicado en la revista holandesa de Forth Vijgeblad (número 42, 1993). [68]

El código fuente de los intérpretes era a menudo de código abierto (como en el caso de Tiny BASIC) o lo publicaban posteriormente los autores. El código fuente completo y anotado y las especificaciones de diseño de Atari BASIC se publicaron en The Atari BASIC Source Book en 1983. [69]

Maquinas virtuales

Algunos intérpretes BASIC fueron codificados en la representación intermedia de una máquina virtual para agregar una capa de abstracción y concisión por encima del lenguaje de máquina nativo .

Aunque las máquinas virtuales se habían utilizado en sistemas de compilación y ejecución como BASIC-PLUS , estas solo servían para ejecutar código BASIC, no para analizarlo. [70] Tiny BASIC, por el contrario, se diseñó para implementarse como una máquina virtual que analizara y ejecutara (interpretara) sentencias BASIC; en una implementación de este tipo, el intérprete Tiny BASIC se ejecuta en un intérprete de máquina virtual. [71] La longitud de todo el programa intérprete era de solo 120 operaciones de máquina virtual, que constaban de 32 comandos. [72] Por lo tanto, la elección de un enfoque de máquina virtual economizó espacio de memoria y esfuerzo de implementación, aunque los programas BASIC que se ejecutaban en él se ejecutaban algo lentamente. (Véase Tiny BASIC: Implementación en una máquina virtual para un extracto y comandos de muestra). Aunque la intención del diseño era que Tiny BASIC utilizara una máquina virtual, no todas las implementaciones lo hicieron; entre las que lo hicieron se encontraban Tiny BASIC Extended, 6800 Tiny BASIC, [73] y NIBL.

Para sus computadoras TI-99/4 y TI-99/4A , Texas Instruments diseñó una máquina virtual con un lenguaje llamado GPL, por "lenguaje de programación gráfica". [74] (Aunque se le culpó ampliamente por el lento desempeño de TI-BASIC , parte del problema era que la máquina virtual estaba almacenada en una ROM gráfica, que tenía una interfaz lenta de 8 bits.) [75]

Un malentendido sobre las ROM de Apple II llevó a algunos a creer que Integer BASIC utilizaba una máquina virtual, un lenguaje ensamblador personalizado contenido en las ROM de Apple y conocido como SWEET16 . SWEET16 se basa en códigos de bytes que se ejecutan dentro de una simple máquina virtual de 16 bits, por lo que la memoria podría ser direccionada a través de punteros indirectos de 16 bits y funciones matemáticas de 16 bits calculadas sin la necesidad de traducirlas al código subyacente de múltiples instrucciones de 8 bits 6502. [76] Sin embargo, SWEET16 no fue utilizado por el código BASIC central, aunque más tarde se utilizó para implementar varias utilidades, como una rutina de renumeración de líneas. [77]

Edición y almacenamiento de programas

Edición de programas

La mayoría de las implementaciones de BASIC de la época actuaban como intérprete de lenguaje y editor de líneas . Cuando se ejecutaba BASIC, se mostraba un > símbolo del sistema en el que el usuario podía introducir instrucciones. [78] Esto se conocía como " modo directo ". Al iniciarse, un intérprete de BASIC pasaba por defecto al modo directo.

Las sentencias que se ingresaban con números iniciales se ingresaban en el almacenamiento del programa para su "ejecución diferida", [79] ya sea como líneas nuevas o reemplazando cualquiera que pudiera haber tenido el mismo número anteriormente. [80] Las sentencias que se ingresaban sin un número de línea se denominaban comandos y se ejecutaban inmediatamente. Los números de línea sin sentencias (es decir, seguidos de un retorno de carro ) eliminaban una línea almacenada previamente.

Cuando un programa estaba presente en la memoria y el usuario teclea el RUNcomando, el sistema entra en "modo indirecto". En este modo, se establece un puntero para que apunte a la primera línea del programa, por ejemplo, la línea 10. El texto original de esa línea se recupera del almacén y se ejecuta como si el usuario lo acabara de teclear en modo directo. Luego, el puntero avanza a la siguiente línea y el proceso continúa.

Diferentes implementaciones ofrecían otras capacidades de edición de programas. Altair BASIC 8K tenía un EDITcomando para cambiar a un modo de edición para una línea. Integer BASIC, también incluía el comando para AUTOingresar automáticamente números de línea en un número inicial dado como AUTO 100, agregando 10 al último número con cada nueva línea. AUTO 300,5comenzaría a numerar en la línea 300 de cinco en cinco; 300, 305, etc. La numeración automática se desactivaba ingresando MAN. [81] Algunos intérpretes ofrecían comandos o utilidades de renumeración de líneas.

Tokenización y codificación de líneas

Para ahorrar memoria RAM y acelerar la ejecución, todos los intérpretes de BASIC codificaban algunos caracteres ASCII de líneas en otras representaciones. Por ejemplo, los números de línea se convertían en números enteros almacenados como bytes o palabras , y a las palabras clave se les podían asignar tokens de un solo byte (por ejemplo, almacenándolos PRINTcomo el valor de byte 145, en MS-BASIC). Estas representaciones se convertían luego de nuevo en texto legible al LISTejecutar el programa.

Abreviaturas

Como alternativa a la tokenización, para ahorrar RAM, las primeras implementaciones de Tiny BASIC como Extended Tiny BASIC, [82] Denver Tiny BASIC [83] y MINOL [84] truncaron las palabras clave: PRfor PRINT, INfor INPUT, RETfor RETURN. Las palabras clave completas y tradicionales no fueron aceptadas.

Por el contrario, el Tiny BASIC de Palo Alto aceptaba las palabras clave tradicionales pero permitía que cualquier palabra clave se abreviara a su cadena única mínima, con un punto final. Por ejemplo, PRINTse podía escribir P., aunque PR.y otras variaciones también funcionaban. Este sistema se mantuvo en el BASIC de nivel I para el TRS-80 , que utilizaba PATB, y también se encontró en el BASIC de Atari y en el BASIC de varias computadoras de bolsillo Sharp . [85]

Para expandir una abreviatura, el tokenizador de Atari BASIC busca en su lista de palabras reservadas para encontrar la primera que coincida con la parte suministrada. Los comandos más utilizados aparecen primero en la lista de palabras reservadas, con REMal principio (se puede escribir como .). Cuando el programa se LISTedita más tarde, normalmente escribirá las palabras completas. Los BASIC de MS también permitían ?una forma abreviada de PRINT, pero la expandían al enumerarla, tratándola como una abreviatura, no como un sinónimo.

Tokenización

La mayoría de los intérpretes de BASIC realizan al menos alguna conversión del formato de texto original a varios formatos específicos de la plataforma. Tiny BASIC era el más simple: sólo convertía el número de línea de su formato decimal a binario. Por ejemplo, el número de línea "100" se convertía en un valor de un solo byte, $64, haciéndolo más pequeño para almacenar en la memoria y más fácil de buscar en código de máquina (algunos diseños de Tiny BASIC permitían números de línea de sólo 1 a 254 o 255, aunque la mayoría usaban valores de doble byte y números de línea de al menos 1 a 999). El resto de la línea se dejaba en su formato de texto original. [86] De hecho, Dennis Allison argumentó que, dadas las limitaciones de memoria, la tokenización requeriría más código para implementarse del que ahorraría. [87]

Los MS-BASIC fueron un poco más allá, convirtiendo el número de línea en un valor de dos bytes y también convirtiendo palabras clave, como FORo PRINT, en un valor de un solo byte, el "token". [88] El valor del token tenía el bit alto configurado para permitir que se lo distinguiera fácilmente en tiempo de ejecución. Todo lo demás en una línea se dejaba en su formato original, así que, por ejemplo, la línea:

10 PARA I=1 A 10

Sería tokenizado como:

64 81 I B211 A410

Tenga en cuenta que el espacio entre FORy Ipermanece en la línea tokenizada, y los nombres de las variables y las constantes no están tokenizadas. El código que realizó esta tokenización, conocido como "el chunker", simplemente copió todo lo que no reconoció como un token en la salida, conservando los espacios tal como estaban. Esto significaba que PRINTAse almacenaba en dos bytes, mientras que PRINT Ase almacenaba en tres bytes, y eliminar espacios era una forma común de mejorar el uso de la memoria. [89] Sinclair BASIC modificó esto ligeramente, eliminando espacios del código almacenado e insertándolos en el código durante un LIST, de modo que PRINTAapareciera como PRINT Aaún no ocupa el byte adicional en la memoria.

En cambio, el BASIC entero convertía la línea 10 GOTO 100entera en tokens que podían leerse y ejecutarse inmediatamente. En el BASIC MS, la línea produciría $64 $89 100, y en tiempo de ejecución el "100" tendría que convertirse a formato de 16 bits cada vez que se encontrara. En cambio, el BASIC entero también tokenizaba las variables numéricas, evitando esta conversión y acelerando la ejecución. El valor de dos bytes resultante se insertaba en el código tokenizado junto con un byte de prefijo que indicaba un número seguido. El prefijo era un valor entre $B0 y $B9 , siendo el último nibble del valor el primer dígito decimal del valor original. Los literales de cadena, como "HELLO WORLD", se codificaban en cambio configurando el bit alto de cada carácter para que se almacenara como $C1 . Los nombres de las variables se convertían de la misma manera, con las letras codificadas para tener su bit alto activado y todos los dígitos del nombre representados por los $B0 a $B9 correspondientes , de modo que la variable se codificara como $C1B5 (no se redujera a un token). [90] Hubo muchas otras optimizaciones; donde Microsoft BASIC tenía un token para la palabra clave , Integer BASIC tenía tres tokens: uno si la palabra clave no iba seguida de argumentos, uno si iba seguida de una expresión aritmética y uno si iba seguida de un literal de cadena. [91]AA5PRINT

Llevando esto aún más lejos, el tokenizador de Atari BASIC analiza la línea completa cuando se ingresa o modifica. Las constantes numéricas se analizan en su forma interna de 48 bits y luego se colocan en la línea en ese formato, mientras que las cadenas se dejan en su formato original, pero se les antepone un byte que describe su longitud. Las variables tienen un almacenamiento reservado a medida que se encuentran, en lugar de en tiempo de ejecución, y su nombre se reemplaza con un puntero a su ubicación de almacenamiento en la memoria. Shepardson se refirió a este concepto de tokenización temprana como un "intérprete de precompilación"; las declaraciones con errores de sintaxis en realidad no se podían almacenar, y el usuario era inmediatamente incitado a corregirlas. [92]

Tokenización en el teclado

Teclado Sinclair ZX Spectrum
Se utilizan combinaciones de teclas para ingresar palabras clave BÁSICAS.

Algunos intérpretes, como los sistemas Sinclair, básicamente hacían que el usuario hiciera la tokenización proporcionando pulsaciones de teclas especiales para introducir palabras reservadas. Los comandos más comunes necesitan una sola pulsación de tecla; por ejemplo, pulsar solo Pal principio de una línea en un Spectrum produce el comando completo PRINT. Los comandos menos frecuentes requieren secuencias de teclas más complejas. [93] Como cada línea comienza con una palabra clave, LETno es opcional, después de que se escribe una palabra clave el sistema vuelve a aceptar texto carácter por carácter. Una ventaja de este enfoque es que el tokenizador no puede confundir cadenas con palabras clave. Por ejemplo, permite nombrar una variable PRINTy mostrar su valor con PRINT PRINT.

De manera similar, muchas " computadoras de bolsillo " utilizan una pulsación de una tecla (a veces precedida por varios tipos de teclas de mayúsculas) para producir un byte (el token de la palabra clave) que representa una palabra clave BASIC completa, como EXP, SQR, IF o PEEK , como los conjuntos de caracteres de las computadoras de bolsillo Sharp y TI-BASIC . La expansión BASIC para Bally Astrocade también utiliza esto.

Gestión de línea

Los números de línea válidos variaban de una implementación a otra, pero normalmente eran del 1 al 32767.

La mayor parte de la memoria utilizada por los intérpretes de BASIC se destinaba a almacenar la lista de programas en sí. Las instrucciones numeradas se almacenaban en orden secuencial en una matriz dispersa implementada como una colección lineal (técnicamente no era una lista , ya que ningún número de línea podía aparecer más de una vez).

Muchas implementaciones de Tiny BASIC almacenaban líneas de la siguiente manera:

Microsoft BASIC, a partir de Altair BASIC, almacenó líneas de la siguiente manera: [94]

LLL BÁSICO: [95]

La longitud máxima de una línea variaba: 64 caracteres en Palo Alto Tiny BASIC, incluida la representación decimal del número de línea; 120 caracteres en Atari BASIC; 128 caracteres en Integer BASIC; [96] y 255 caracteres en MS-BASIC (sin incluir el número de línea).

Los intérpretes buscarían en el programa una línea a la vez, observando cada número de línea. Si fuera menor que el nuevo número de línea, las líneas posteriores se moverían en la memoria para hacer lugar al espacio requerido para la nueva línea. Si fuera el mismo número de línea, y no exactamente la misma longitud, las líneas subsiguientes tendrían que moverse hacia adelante o hacia atrás. [97] (Como el orden secuencial siempre se mantenía en la memoria, estas no eran listas enlazadas ).

En Tiny BASIC, estas búsquedas requerían comprobar cada byte de una línea: el puntero se incrementaba una y otra vez hasta que se encontraba un retorno de carro, para encontrar el byte antes de la siguiente línea. En Altair BASIC y LLL BASIC, por otro lado, el puntero se establecía en el inicio de la siguiente línea secuencial; esto era mucho más rápido, pero requería dos bytes por línea. Dado que se suponía que los programas Tiny BASIC tenían un tamaño de 4 KB o menos, esto se ajustaba a la filosofía de diseño general de Tiny BASIC de sacrificar el rendimiento a favor de minimizar el uso de memoria.

Cuando el usuario escribía LISTen la línea de comando, el sistema recorría la matriz de líneas, utilizando uno de estos métodos, convertía el número de línea nuevamente a formato decimal y luego imprimía el resto del texto en la línea, decodificando cualquier token u otras representaciones codificadas.

A medida que los desarrolladores agregaron construcciones de programación estructurada a BASIC, a menudo eliminaron por completo la necesidad de números de línea y agregaron editores de texto y, más tarde, entornos de desarrollo integrados .

Variables y tipos de datos

Nombres de variables

Dartmouth BASIC y HP-BASIC limitaban los nombres de las variables a un máximo de dos caracteres (una sola letra o una letra seguida de un dígito; p. ej., de la A a la Z9). MS-BASIC permitía nombres de variables compuestos por una letra seguida de una letra o un dígito opcional (p. ej., de la A a la ZZ), pero ignoraba los caracteres subsiguientes: por lo tanto, era posible escribir inadvertidamente un programa con las variables "LOSS" y "LOAN", que se tratarían como si fueran la misma; asignar un valor a "LOAN" sobrescribiría silenciosamente el valor previsto como "LOSS".

El BASIC de enteros era inusual en cuanto a que admitía nombres de variables de cualquier longitud (por ejemplo, SUM, GAMEPOINTS, PLAYER2), siempre que no contuvieran una palabra reservada. [98] En muchos de los primeros BASIC no se podían usar palabras clave en variables; "SCORE" se interpretaría como "SC" OR "E", donde OR era una palabra clave.

Las variables de cadena se distinguen generalmente en muchos dialectos de microcomputadoras de BASIC por tener $ como sufijo en su nombre, y los valores se identifican a menudo como cadenas al estar delimitados por "comillas dobles". Las implementaciones posteriores utilizarían otros signos de puntuación para especificar el tipo de una variable: A% para entero, A! para precisión simple y A# para precisión doble .

Con excepción de las matrices y (en algunas implementaciones) las cadenas, y a diferencia de Pascal y otros lenguajes de programación más estructurados, BASIC no requiere que se declare una variable antes de hacer referencia a ella. Los valores normalmente tendrán como valor predeterminado 0 (con la precisión adecuada) o la cadena nula.

Tabla de símbolos

Como Tiny BASIC sólo utilizaba 26 variables de una sola letra, las variables podían almacenarse como una matriz sin almacenar sus nombres correspondientes, utilizando una fórmula basada en el valor ASCII de la letra como índice. Tiny BASIC de Palo Alto llevó esto un paso más allá: los valores de dos bytes de las variables se ubicaban en la RAM dentro del programa, desde los bytes 130 (ASCII 65, 'A', multiplicado por dos) hasta 181 (ASCII 90, 'Z', multiplicado por dos, más uno por el segundo byte). [85]

La mayoría de los BASIC preveían la posibilidad de tener mucho más de 26 variables y, por lo tanto, necesitaban tablas de símbolos que reservaran capacidad de almacenamiento solo para aquellas variables utilizadas.

En LLL BASIC, cada entrada en la tabla de símbolos se almacenaba de la siguiente manera: [99]

A diferencia de la mayoría de los intérpretes de BASIC, UIUC BASIC tenía una función hash , que hacía un hash por la letra del nombre de la variable/función/matriz y luego realizaba una búsqueda lineal a partir de ahí. En UIUC BASIC, una entrada de la tabla de símbolos era: [58]

En Atari BASIC, un conjunto de punteros (direcciones) indicaban diversos datos: los nombres de las variables se almacenaban en la tabla de nombres de variables (VNTP – 82, 83 16 ) y sus valores se almacenaban en la tabla de valores de las variables (apuntada en VVTP – 86, 87 16 ). Al indirigir los nombres de las variables de esta manera, una referencia a una variable necesitaba solo un byte para direccionar su entrada en la tabla apropiada. Las variables de cadena tenían su propia área.

Una optimización del rendimiento de BBC BASIC incluyó el uso de múltiples listas enlazadas para la búsqueda de variables en lugar de una única lista larga, como en Microsoft BASIC .

Gestión de la memoria

Debido a la pequeña capacidad de RAM de la mayoría de los sistemas utilizados originalmente para ejecutar intérpretes BASIC, se tuvieron que emplear técnicas de gestión de memoria inteligentes. Altair BASIC permitía a los usuarios recuperar el espacio para funciones trigonométricas si no se utilizaban durante una sesión. PATB colocaba el inicio de las subrutinas más comunes al principio del programa para que las utilizara el RSTcódigo de operación 8080 de 1 byte en lugar del CALLcódigo de operación de 3 bytes. En LLL BASIC, algunas variables ocupaban las mismas ubicaciones de memoria, en los casos en que las diferentes variables se utilizaban solo en modo de comando o solo en tiempo de ejecución. [100]

El vídeo era a menudo direccionable desde la memoria, y ciertas funciones esotéricas estaban disponibles manipulando valores en valores de memoria específicos. Por ejemplo, las direcciones 32 a 35 contenían las dimensiones de la ventana de texto (en oposición a la ventana de gráficos) en Applesoft BASIC. El POKEcomando y la PEEKfunción (adaptados de monitores de código de máquina como el monitor DECsystem-10 [101] ) proporcionaban acceso directo a la memoria, para una variedad de propósitos, [102] especialmente para modificar registros de hardware especiales mapeados en memoria para controlar funciones particulares de la computadora como los periféricos de entrada/salida. Los "mapas de memoria" (en el sentido arcaico de listas de direcciones de memoria y sus funciones) eran populares para su uso con PEEK y POKE , y uno de los mapas de memoria más conocidos es el libro Mapping the Atari , escrito por Ian Chadwick.

Algunas implementaciones del intérprete de Microsoft, por ejemplo las que se ejecutan en los modelos I/III de TRS-80 , requerían que el usuario especificara la cantidad de memoria que utilizaría el intérprete. Esto era para permitir que una región de memoria se reservara para la instalación de subrutinas de lenguaje de máquina que pudieran ser llamadas por el programa interpretado, para una mayor velocidad de ejecución. Cuando se encienden los modelos I/III, el usuario recibe el mensaje "¿Tamaño de memoria?" para este propósito.

Matemáticas

El BASIC de enteros, como su nombre lo indica, utiliza números enteros como base para su paquete matemático. Estos se almacenaban internamente como un número de 16 bits, little-endian (como el 6502). Esto permitía un valor máximo para cualquier cálculo entre −32767 y 32767. Los cálculos que daban como resultado valores fuera de ese rango producían un error. [103]

La mayoría de los intérpretes Tiny BASIC (así como Sinclair BASIC 4K) admitían operaciones matemáticas utilizando únicamente números enteros, sin compatibilidad con coma flotante . El uso de números enteros permitía almacenar números en un formato de 16 bits mucho más compacto que podía leerse y procesarse más rápidamente que los formatos de coma flotante de 32 o 40 bits que se encontraban en la mayoría de los BASIC de la época. Sin embargo, esto limitaba su aplicabilidad como lenguaje de propósito general.

Las implementaciones de Business BASIC , como Data General Business Basic , también eran solo de números enteros, pero normalmente con una precisión mayor: "doble precisión", es decir, 32 bits (más o menos 2.147.483.648) y "triple precisión" (más o menos 1,4x10^14).

En ocasiones se utilizaron otros formatos de números informáticos . Por ejemplo, el MINOL Tiny BASIC sólo admitía bytes sin signo , [84] y el MICRO-BASIC Tiny BASIC utilizaba el formato decimal codificado en binario . [104] Pero el formato de punto flotante acabaría predominando.

Punto flotante

Una historia resume por qué el punto flotante se consideró tan importante. El prototipo original del TRS-80 Model I ejecutaba la versión de dominio público de Tiny BASIC de Li-Chen Wang . Esto requería solo 2 KB de memoria para el intérprete , dejando un promedio de otros 2 KB libres para programas de usuario en diseños de memoria comunes de 4 KB de las primeras máquinas. Durante una demostración a los ejecutivos, el entonces presidente de Tandy Corporation, Charles Tandy, intentó ingresar su salario pero no pudo hacerlo. Esto se debió a que Tiny BASIC usaba números enteros con signo de 2 bytes con un valor máximo de 32,767. El resultado fue una solicitud de matemáticas de punto flotante para la versión de producción. [105] Esto llevó a la sustitución del código entero de 16 bits existente con una versión que usaba números de punto flotante de precisión simple de 32 bits por parte del empleado de Tandy, Steve Leininger. [106]

SCELBAL utilizó rutinas de punto flotante publicadas por Wadsworth en 1975 en Machine Language Programming para el 8008 basadas en un formato de 32 bits (cuatro bytes) para cálculos numéricos, con una mantisa de 23 bits , un signo de 1 bit para la mantisa, un exponente de 7 bits y un signo de 1 bit para el exponente. Estas rutinas estaban organizadas en orden inverso, con el byte menos significativo de la mantisa en el primer byte, seguido por el byte del medio y luego el más significativo con el signo en el bit alto. El exponente venía al final, nuevamente con el signo en el bit alto. [107] El manual proporciona un código ensamblador bien documentado para todo el paquete matemático, incluidos los puntos de entrada y las notas de uso. [108]

Los consultores solían encargarse de la aritmética de punto flotante , un dominio especializado bien estudiado y desarrollado para las aplicaciones científicas y comerciales que habían caracterizado a los mainframes. Cuando Allen y Gates estaban desarrollando Altair BASIC, su compañero de estudios de Harvard Monte Davidoff los convenció de que cambiaran de la aritmética de números enteros . Contrataron a Davidoff para que escribiera un paquete de punto flotante que pudiera caber dentro de los límites de memoria de 4 KB. Steve Wozniak recurrió a Roy Rankin de la Universidad de Stanford para implementar las funciones trascendentales LOG, LOG10 y EXP; [109] sin embargo, Wozniak nunca terminó de añadir soporte de punto flotante a Integer BASIC. LLL BASIC , desarrollado en la Universidad de Idaho por John Dickenson, Jerry Barber y John Teeter, recurrió a David Mead, Hal Brand y Frank Olken para su soporte de punto flotante. [110] Para UIUC BASIC, se licenció un paquete de punto flotante Datapoint 2200. [111]

En cambio, los sistemas de tiempo compartido solían depender del hardware. Por ejemplo, el GE-235 fue elegido para implementar la primera versión de Dartmouth BASIC específicamente porque incluía una " unidad aritmética auxiliar " para cálculos de punto flotante y de doble precisión. [112] [113]

Los primeros intérpretes utilizaban formatos de 32 bits, similares al formato binario de punto flotante de precisión simple IEEE 754 , que especifica:

Aquí está el valor 0,15625 almacenado en este formato:

Si bien los formatos de 32 bits eran comunes en esta era, las versiones posteriores de BASIC, comenzando con Microsoft BASIC para el MOS 6502 , generalmente adoptaron un formato de 40 bits (cinco bytes) para mayor precisión. [114]

Operadores y funciones

Los operadores infijos incluían típicamente +(suma), -(resta), *(multiplicación), /(división) y exponente usando el ^carácter . Las operaciones relativas incluían el conjunto estándar de =, >, <, >=, <=, y para "no igual" <>o el , inspirado en HP-TSB# . [115] Los operadores binarios, como AND, ORy NOT, no estaban en todas las implementaciones, y algunos hacían álgebra booleana y otros no.

La edición inicial de Dartmouth BASIC incluía las siguientes funciones: ABS( valor absoluto ), ATN( arcotangente ), COS( coseno ), EXP( e elevado a la potencia), INT(trunca cualquier valor fraccionario y devuelve un entero), LOG( logaritmo ), RND( generador de números pseudoaleatorios ), SIN( seno ), SQR( raíz cuadrada ) y TAN( tangente ). También incluía la DEF FNinstrucción para declarar funciones unilineales, que luego se denominarían FNA(), FNB(), etc.

Esta RNDfunción fue la función más extendida en ser admitida en los primeros BASIC, aunque las implementaciones variaron:

Matrices

La segunda versión de Dartmouth BASIC admitía matrices y operaciones con matrices , útiles para la solución de conjuntos de ecuaciones algebraicas lineales simultáneas; MATse admitían operaciones con matrices como asignación, suma, multiplicación (de tipos de matrices compatibles) y evaluación de un determinante.

Por el contrario, Tiny BASIC, tal como fue diseñado inicialmente, ni siquiera tenía matrices, debido a la limitada memoria principal disponible en los primeros microordenadores , a menudo de 4 KB, que tenía que incluir tanto al intérprete como al programa BASIC. Tiny BASIC de Palo Alto añadió una única matriz de longitud variable de números enteros, cuyo tamaño no tenía que ser dimensionado, pero utilizaba RAM que no utilizaban el intérprete ni el listado del programa A().

SCELBAL admitía múltiples matrices, pero en conjunto estas matrices no podían tener más de 64 elementos. Integer BASIC admitía matrices de una sola dimensión, limitadas en tamaño solo por la memoria disponible. [118] Tiny BASIC Extended admitía matrices bidimensionales de hasta 255 por 255. Altair BASIC 4K admitía solo matrices (de una dimensión) mientras que la versión 8K admitía matrices de hasta 34 dimensiones. [119]

Muchas implementaciones respaldaron la práctica de Dartmouth BASIC de no requerir que una matriz esté dimensionada, en cuyo caso se asumía que tenía 11 elementos (0 a 10); por ejemplo, {{{1}}}crearía la matriz de 11 elementos como un efecto secundario.

El vector de dopaje de las matrices variaba de una implementación a otra. Por ejemplo, el vector de dopaje de una matriz Altair BASIC 4K: [94]

Luego los valores de la matriz en sí:

Las implementaciones que admitían matrices tenían que registrar la cantidad de dimensiones y el límite superior de cada dimensión. Además, como algunos intérpretes solo tenían un tipo de datos (ya sea de punto flotante o entero), el vector de datos solo necesitaba registrar la cantidad de dimensiones y el límite superior de cada dimensión. Los intérpretes con múltiples tipos de datos tenían que registrar el tipo de datos de la matriz.

Aunque Microsoft y otros BASIC admitían matrices, las operaciones con matrices no estaban integradas, sino que debían programarse explícitamente en los elementos de la matriz.

Instrumentos de cuerda

El BASIC Dartmouth original, algunos de sus descendientes inmediatos y las implementaciones de Tiny BASIC carecían de manejo de cadenas. Se desarrollaron dos escuelas de manejo de cadenas que competían entre sí, iniciadas por HP y DEC, aunque luego surgieron otros enfoques que requerían estrategias de implementación diferentes.

El manejo de cadenas más simple copió el BASIC de tiempo compartido de HP y definió las variables de cadena como matrices de caracteres que debían ser DIMensionadas antes de su uso. Las cadenas en HP TSB se tratan como una matriz de caracteres, hasta 72 en total, en lugar de un único objeto de múltiples caracteres. De manera predeterminada, se les asigna un carácter en la memoria y, si se necesita una cadena de mayor longitud, se deben declarar. Por ejemplo, se configurará una cadena que puede contener un máximo de 10 caracteres. [120]DIM A$[10]

Se accede a las subcadenas dentro de cadenas mediante una notación de " slicing ": o , donde la subcadena comienza con el carácter más a la izquierda especificado por el índice L y continúa hasta el carácter más a la derecha especificado por el índice R, o la forma donde la subcadena comienza en el carácter más a la izquierda especificado por el índice L y continúa hasta el final de la cadena. TSB acepta () o [] indistintamente. Los índices de matriz y subcadena comienzan con 1.A$(L,R)A$[L,R]A$[L]

Esto contrasta marcadamente con los BASIC que siguen el patrón DEC que utilizan funciones como LEFT$(), MID$()y RIGHT$()para acceder a subcadenas. Adoptada posteriormente por ANSI BASIC, la notación de HP también se puede utilizar en el lado de destino de una instrucción LETor INPUTpara modificar parte de un valor de cadena existente, por ejemplo or , lo que no se puede hacer con las primeras implementaciones de .100 A$[3,5]="XYZ"120 B$[3]="CHANGE ALL BUT FIRST TWO CHARS"LEFT$/MID$/RIGHT$

Las versiones posteriores de Dartmouth BASIC sí incluían variables de cadena. Sin embargo, no utilizaban las LEFT$/MID$/RIGHT$funciones para manipular cadenas, sino que utilizaban el CHANGEcomando que convertía la cadena a y desde valores ASCII equivalentes. (Posteriormente adoptado tal como está por DEC y adaptado por HP, que cambió la palabra clave a CONVERT. [120] ) Además, se podía utilizar la comilla simple para convertir una constante numérica en un carácter ASCII, lo que permitía construir una cadena en partes; A$='23 '64 '49 "DEF"producía la cadena "ABCDEF", sin necesidad de la CHR$()función. [120] Dartmouth BASIC Sexta Edición admitía SEG$(para MID$) y POS(para INSTR).

Integer BASIC, North Star BASIC [121] y Atari BASIC [122] imitaron el enfoque de HP, que nuevamente contrastaba con el estilo encontrado en los BASIC derivados de DEC , incluido Microsoft BASIC , donde las cadenas son un tipo intrínseco de longitud variable. [123]

Algunas de las implementaciones de Tiny BASIC admitían una o más matrices de enteros predefinidas, que podían usarse para almacenar códigos de caracteres, siempre que el lenguaje tuviera funcionalidad para ingresar y emitir códigos de caracteres (por ejemplo, Astro BASIC tenía KPy TVpara este propósito).

Recolección de basura

An example of external fragmentation

Having strings use a fixed amount of memory regardless of the number of characters used within them, up to a maximum of 255 characters, may have wasted memory[124] but had the advantage of avoiding the need for implementing garbage collection of the heap, a form of automatic memory management used to reclaim memory occupied by strings that are no longer in use. Short strings that were released might be stored in the middle of other strings, preventing that memory from being used when a longer string was needed.

On early microcomputers, with their limited memory and slow processors, BASIC garbage collection could often cause apparently random, inexplicable pauses in the midst of program operation. Some BASIC interpreters, such as Applesoft BASIC on the Apple II family, repeatedly scanned the string descriptors for the string having the highest address in order to compact it toward high memory, resulting in O(n2) performance, which could introduce minutes-long pauses in the execution of string-intensive programs. Garbage collection was notoriously slow or even broken in other versions of Microsoft BASIC.[125] Some operating systems that supported interrupt-driven background tasks, such as TRSDOS/LS-DOS 6.x on the TRS-80 Model 4, exploited periods of user inactivity (such as the milliseconds-long periods between keystrokes and periods following video screen refresh) to process garbage collection during BASIC program runs.

Other functionality

Graphics and sound

Most BASIC interpreters differed widely in graphics and sound, which varied dramatically from microcomputer to microcomputer. Altair BASIC lacked any graphics or sound commands, as did the Tiny BASIC implementations, while Integer BASIC provided a rich set.

Level I BASIC for the TRS-80 had as minimal a set as possible: CLS, for CLear Screen; SET(X,Y), which lit a location on the display; RESET(X,Y), which turned it off; and POINT(X,Y), which returned 1 if a location was lit, 0 if it was not. The coordinates could be any expression and ranged from 0 to 127 for the X-axis and 0 to 47 for the Y-axis. Only black-and-white display was supported.[126]

In contrast, Integer BASIC supported color graphics, simple sound, and game controllers. Graphics mode was turned on with the GR statement and off with TEXT.[127] Drawing was modal and normally started by issuing a command to change the color, which was accomplished by setting a pseudo-variable; COLOR=12 would set the drawing color to 12, light green. One could then PLOT 10,10 to produce a single spot of that color,[128] HLIN 0,39 AT 20 to draw a horizontal line at row 20 that spanned the screen, or VLIN 5,15 AT 7 to draw a shorter vertical line down column 7.[129] A=SCRN X,Y returned the color of the screen at X,Y.[130][b]

text block graphics set of the ZX-81

Hardware manufacturers often included proprietary support for semigraphics, simple shapes and icons treated as special characters. Examples included the block graphics of the ZX-81, and the card symbols of ♠, ♣, ♥ and ♦ in the Commodore International PETSCII character set. BASIC could generate these symbols using PRINT CHR$();.

Microsoft added many graphics commands to IBM BASIC: LINE, PSET (Pixel SET), PRESET (Pixel RESET), GET (stores a rectangle of the screen to an array), PUT (displays a stored rectangular segment), LOCATE (to move the text cursor), and DRAW, which sketches shapes using a LOGO-like syntax. Bill Gates and Neil Konzen wrote DONKEY.BAS, a bundled game, to demonstrate the interpreter's color graphics and sound.[131]

Input/output

Another area where implementations diverged was in keywords for dealing with media (cassettes and floppy disks), keyboard input, and game controllers (if any).

Since ROM-based BASIC interpreters often functioned as shells for loading in other applications, implementations added commands related to cassette tapes (e.g., CLOAD and CSAVE), binary disk files (e.g., BLOAD, BSAVE, and BRUN), and BASIC programs on disk (e.g., LOAD, SAVE, and CATALOG). Business BASIC implementations added commands for random-access files. (Even ROM-based BASIC interpreters were not designed or intended to be used as operating systems, and smaller microcomputers simply lacked any OS at all.[132])

Dartmouth BASIC lacked a command for getting input from the keyboard without pausing the program. To support videogames, BASICs added proprietary commands for doing so: INKEY$ was a function in Microsoft BASIC that would return an empty string if no key was pressed or otherwise a single character; KP (for KeyPress) returned the ASCII value of the input in Astro BASIC.

Palo Alto Tiny BASIC lacked strings but would allow users to enter mathematical expressions as the answer to INPUT statements; by setting variables, such as Y=1; N=0, the user could answer “Y” or “1” or even "3*2-5" at a yes/no prompt.

Some systems supported game controllers. Astro BASIC supported JX() (specified joystick's horizontal position), JY() (joystick vertical position), KN() (knob status), and TR() (trigger status). Integer BASIC supported a game controller, a paddle controller, which had two controllers on a single connector. The position of the controller could be read using the PDL function, passing in the controller number, 0 or 1, like A=PDL(0):PRINT A, returning a value between 0 and 255.[133][c]

Integer BASIC lacked any custom input/output commands, and also lacked the DATA statement and the associated READ. To get data into and out of a program, the input/output functionality was redirected to a selected card slot with the PR#x and IN#x, which redirected output or input (respectively) to the numbered slot. From then on, data could be sent to the card using conventional PRINT commands and read from it using INPUT.[130] Producing sounds was accomplished by PEEKing the memory-mapped location of a simple "beeper", −16336.[d]

Structured programming

While structured programming, through the examples of ALGOL 58 and ALGOL 60, were known to Kemeny and Kurtz when they designed BASIC, they adapted only the for-loop, ignoring the else-statement, while-loop, repeat loop, named procedures, parameter passing, and local variables. As a result, subsequent dialects often differed dramatically in the wording used for structured techniques. For instance, WHILE...WEND (in Microsoft BASIC), WHILE...ENDWHILE (in Turbo-Basic XL), DO...LOOP WHILE and even WHILE clauses (both in BASIC-PLUS).

Of the Tiny BASIC implementations, only National Industrial Basic Language (NIBL) offered a loop command of any sort, DO/UNTIL.[135] This was despite the inventor of Tiny BASIC, Dennis Allison, publicly lamenting the state of BASIC.[136]

BBC BASIC was one of the first microcomputer interpreters to offer structured BASIC programming, with named DEF PROC/DEF FN procedures and functions, REPEAT UNTIL loops, and IF THEN ELSE structures inspired by COMAL. Second-generation BASICs—for example, SBASIC (1976), BBC BASIC (1981), True BASIC (1983), Beta BASIC (1983), QuickBASIC (1985), and AmigaBASIC (1986) -- introduced a number of features into the language, primarily related to structured and procedure-oriented programming. Usually, line numbering is omitted from the language and replaced with labels (for GOTO) and procedures to encourage easier and more flexible design.[137] In addition keywords and structures to support repetition, selection and procedures with local variables were introduced.

The following example is in Microsoft QBASIC, Microsoft's third implementation of a structured BASIC (following Macintosh BASIC in 1984 and Amiga BASIC in 1985).[138]

REM QBASIC exampleREM Forward declaration - allows the main code to call aREM subroutine that is defined later in the source codeDECLARE SUB PrintSomeStars (StarCount!)REM Main program followsDO INPUT "How many stars do you want? (0 to quit) ", NumStars CALL PrintSomeStars(NumStars)LOOP WHILE NumStars>0ENDREM subroutine definitionSUB PrintSomeStars (StarCount) REM This procedure uses a local variable called Stars$ Stars$ = STRING$(StarCount, "*") PRINT Stars$END SUB

Object oriented

Initial support for object-oriented programming provided only the re-use of objects created with other languages, such as how Visual Basic and PowerBASIC supported the Windows Component Object Model. As BASIC interpreters continued to evolve, they added support for object-oriented features such as methods, constructors, dynamic memory allocation, properties and temporary allocation.

Included assembler

The Integer BASIC ROMs also included a machine code monitor, "mini-assembler", and disassembler to create and debug assembly language programs.[90][139][140]

One of the unique features of BBC BASIC was the inline assembler, allowing users to write assembly language programs for the 6502 and, later, the Zilog Z80, NS32016 and ARM. The assembler was fully integrated into the BASIC interpreter and shared variables with it, which could be included between the [ and ] characters, saved via *SAVE and *LOAD, and called via the CALL or USR commands. This allowed developers to write not just assembly language code, but also BASIC code to emit assembly language, making it possible to use code-generation techniques and even write simple compilers in BASIC.

Execution

Debugging

As in most BASICs, programs were started with the RUN command, and as was common, could be directed at a particular line number like RUN 300.[141] Execution could be stopped at any time using Ctrl+C[142] (or BREAK such as on the TRS-80) and then restarted with CONTinue (CON in Integer BASIC).[143] Taking advantage of the unique capabilities of interpreted programs (code is processed in realtime one statement at a time, in contrast to compilers), the user at the console could examine variable data using the PRINT statement, and change such data on-the-fly, then resume program execution.

For step-by-step execution, the TRON or TRACE instruction could be used at the command prompt or placed within the program itself. When it was turned on, line numbers were printed out for each line the program visited. The feature could be turned off again with TROFF or NOTRACE.[144]

Some implementations such as the Microsoft interpreters for the various TRS-80 models included the command ON ERROR GOSUB. This would redirect program execution to a specified line number for special error handling.

Unlike most BASICs, Atari BASIC scanned the just-entered program line and reported syntax errors immediately. If an error was found, the editor re-displayed the line, highlighting the text near the error in inverse video.

In many interpreters, including Atari BASIC, errors are displayed as numeric codes, with the descriptions printed in the manual.[145] Many MS-BASIC used two-character abbreviations (e.g., SN for SYNTAX ERROR). Palo Alto Tiny BASIC and Level I BASIC used three words for error messages: "WHAT?" for syntax errors, "HOW?" for run-time errors like GOTOs to a line that didn't exist or numeric overflows, and "SORRY" for out-of-memory problems.

Parsing

While the BASIC language has a simple syntax, mathematical expressions do not, supporting different precedence rules for parentheses and different mathematical operators. To support such expressions requires implementing a recursive descent parser.[146]

This parser can be implemented in a number of ways:

Performance

The range of design decisions that went into programming a BASIC interpreter were often revealed through performance differences.

Line-management implementations often affected performance and typically used linear search. Delimiting each line with a CR would make a GOTO or GOSUB to a later line would take longer, as the program would need to iterate over all the lines to find the target line number. In some implementations, such as Atari BASIC, the length of each line was recorded and stored after the line number, so that the program did not have to scan each character of the line to find the next carriage return. Many implementations would always search for a line number to branch to from the start of the program; MS-BASIC would search from the current line, if the destination line number was greater. Pittman added a patch to his 6800 Tiny BASIC to use a binary search.[148]

Working solely with integer math provides another major boost in speed. As many computer benchmarks of the era were small and often performed simple math that did not require floating-point, Integer BASIC trounced most other BASICs.[e] On one of the earliest known microcomputer benchmarks, the Rugg/Feldman benchmarks, Integer BASIC was well over twice as fast as Applesoft BASIC on the same machine.[150] In the Byte Sieve, where math was less important but array access and looping performance dominated, Integer BASIC took 166 seconds while Applesoft took 200.[151] It did not appear in the Creative Computing Benchmark, which was first published in 1983, by which time Integer BASIC was no longer supplied by default.[152] The following test series, taken from both of the original Rugg/Feldman articles,[150][149] show Integer's performance relative the MS-derived BASIC on the same platform.

In theory, Atari BASIC should have run faster than contemporary BASICs based on the Microsoft pattern. Because the source code is fully tokenized when it is entered, the entire tokenization and parsing steps are already complete. Even complex mathematical operations are ready-to-run, with any numerical constants already converted to its internal 48-bit format, and variables values are looked up by address rather than having to be searched for. In spite of these theoretical advantages, in practice, Atari BASIC is slower than other home computer BASICs, often by a large amount.[153] In practice, this was not borne out. On two widely used benchmarks of the era, Byte magazine's Sieve of Eratosthenes and the Creative Computing benchmark test written by David H. Ahl, the Atari finished near the end of the list in terms of performance, and was much slower than the contemporary Apple II or Commodore PET,[154] in spite of having the same CPU but running it at roughly twice the speed of either. It finished behind relatively slow machines like the Sinclair ZX81 and even some programmable calculators.[155]

Most of the language's slowness stemmed from three problems.[153] The first is that the floating-point math routines were poorly optimized. In the Ahl benchmark, a single exponent operation, which internally loops over the slow multiplication function, was responsible for much of the machine's poor showing.[153] Second, the conversion between the internal floating-point format and the 16-bit integers used in certain parts of the language was relatively slow. Internally, these integers were used for line numbers and array indexing, along with a few other tasks, but numbers in the tokenized program were always stored in binary-coded decimal (BCD) format.[156] Whenever one of these is encountered, for instance, in the line number in GOTO 100, the tokenized BCD value has to be converted to an integer, an operation that can take as long as 3500 microseconds.[157] Other BASICs avoided this delay by special-casing the conversion of numbers that could only possibly be integers, like the line number following a GOTO, switching to special ASCII-to-integer code to improve performance. Third was how Atari BASIC implemented branches and FOR loops. To perform a branch in a GOTO or GOSUB, the interpreter searches through the entire program for the matching line number it needs.[158] One minor improvement found in most Microsoft-derived BASICs is to compare the target line number to the current line number, and search forward from that point if it is greater, or start from the top if less. This improvement was missing in Atari BASIC.[153] Unlike almost all other BASICs, which would push a pointer to the location of the FOR on a stack, so when it reached the NEXT it could easily return to the FOR again in a single branch operation, Atari BASIC pushed the line number instead. This meant every time a NEXT was encountered, the system had to search through the entire program to find the corresponding FOR line. As a result, any loops in an Atari BASIC program cause a large loss of performance relative to other BASICs.[153]

See also

Notes

  1. ^ Microsoft BASIC left 780 bytes free for user program code and variable values on a 4 KB machine, and that was running a cut-down version lacking string variables and other functionality.
  2. ^ Note the odd syntax of the SCRN, which is technically a function because it returns a value, but does not use function-like syntax which would be A=SCRN(X,Y).
  3. ^ The manual suggests, but does not outright state, that the actual range of values is less than 0 to 255.[133]
  4. ^ The negative number is a side-effect of the integers being stored in signed format, so any memory location over 32767 appeared as a negative value in BASIC.[134]
  5. ^ Bill Gates complained about this, stating that it was unfair to compare Integer BASIC to a "real" BASIC like MS.[149]

References

  1. ^ "IBM VS the World: That's How It Is". Computerworld. 5 December 1973.
  2. ^ "Hewlett-Packard 2100 Processor Description, 1972" (PDF). Retrieved 2020-08-18.
  3. ^ "Can we get a complete timeline on the IRIS Operating System for Data General Novas?". Retrieved 2020-08-05.
  4. ^ Savetz, Kevin (April 2013). "Dave Ahl and Betsy Ah" (Interview).
  5. ^ "Old Computers: HP-9830A". Retrieved 2020-08-18.
  6. ^ A BASIC Language Interpreter for the Intel 8008 Microprocessor. Department of Computer Science, University of Illinois at Urbana-Champaign (published 1974). June 1974.
  7. ^ "We have a BASIC". New Mexico Museum of Natural History and Science. Archived from the original on November 30, 2012. Retrieved April 18, 2007.
  8. ^ Fisk, Nathan (2009). Understanding Online Piracy. ABC-CLIO. p. 14. ISBN 9780313354748.
  9. ^ Hertzfeld 1985.
  10. ^ Pittman, Tom. "you had to pay $5 up front to get it…". www.ittybittycomputers.com. Retrieved June 14, 2017.
  11. ^ Arnold, Mark; Wadsworth, Nat (February 1976a). "SCELBAL - A Higher Level Language for 8008/8080 Systems". Dr. Dobb's Journal. Vol. 1. pp. 30–34.
  12. ^ "Part 1 Of LLL 8080 BASIC Interpreter" (PDF).
  13. ^ Lorenzo 2017, p. 118.
  14. ^ Curran, Lawrence J.; Shuford, Richard S. (November 1983). "IBM's Estridge". BYTE. pp. 88–97. Retrieved 19 March 2016.
  15. ^ Wilkinson 1982, pp. iv–v.
  16. ^ Cromemco 1978.
  17. ^ Wilkinson 1982, p. ix.
  18. ^ Wilkinson 1982, p. v.
  19. ^ "Video processor for Acorn/BBC computer". BBC News. Retrieved 30 November 2010.
  20. ^ "BBC Micro ignites memories of revolution". BBC News. 21 March 2008. Retrieved 30 November 2010.
  21. ^ "ECN - July/Aug. 1985". Archived from the original on 2018-03-07. Retrieved 2020-08-04.
  22. ^ Smith, Tony (12 February 2014). "You're NOT fired: The story of Amstrad's amazing CPC 464". The Register. Retrieved 17 February 2014.
  23. ^ Lien, David (1981). The BASIC Handbook (Second ed.). San Diego, CA: Compusoft Publishing. p. inside cover. ISBN 0-932760-00-7.
  24. ^ Lorenzo 2017, p. 83.
  25. ^ Gates, Bill. "Bill Gates Interview". National Museum of American History, Smithsonian Institution (Interview). Interviewed by David Allison. Retrieved April 10, 2013.
  26. ^ Malloy, Rich (May 1983). "Little Big Computer / The TRS-80 Model 100 Portable Computer". BYTE. p. 14. Retrieved October 19, 2013.
  27. ^ Lorenzo 2017, p. 122.
  28. ^ Williams, Gregg (February 1984). "The Apple Macintosh Computer". BYTE. p. 30.
  29. ^ "Mac GUI :: Re: Re: MAC Basic vs MS Basic?". macgui.com. Retrieved 23 January 2015.
  30. ^ Manes, Stephen; Andrews, Paul (21 January 1994). Gates: How Microsoft's Mogul Reinvented an Industry--and Made Himself the Richest Man in America: Stephen Manes, Paul Andrews: 9780671880743: Amazon.com: Books. Touchstone. ISBN 0671880748.
  31. ^ Bill Atkinson interviewed on the TV show Triangulation on the TWiT.tv network
  32. ^ "Was Family BASIC for the NES/Famicom powerful enough to create full games and applications?". Retrieved 2020-08-27.
  33. ^ Thomas, Neil (19 Aug 2019). "STOS & Amos - Francois Lionet | Retro Tea Break". YouTube. Retrieved 11 Mar 2020.
  34. ^ Plant, Robert T.; Murrell, Stephen (2007). An executive's guide to information technology. Cambridge University Press. p. 343. ISBN 978-0-521-85336-1. Summary of positive issues: Visual Basic is easy to learn and widely available.
  35. ^ "The History of Visual Basic". www.johnsmiley.com.
  36. ^ Frank Wieduwilt (October 2008). "Programming with the Gambas Basic IDE". Linux Pro Magazine. Retrieved 2011-12-10.
  37. ^ "About the Game Creators - TheGameCreators".
  38. ^ "Small Basic download". 19 November 2018. Retrieved 2020-09-07.
  39. ^ Chailloux, Emmanuel; Manoury, Pascal; Pagano, Bruno (2002). Developing Applications with Objective Caml. France: O'Reilly. ISBN 2841771210.
  40. ^ Price, Ed (29 April 2014). "Small Basic Curriculum". TechNet. Microsoft. Retrieved 9 February 2014.
  41. ^ Price, Ed; Takahashi, Nonki (25 February 2014). "Small Basic Getting Started Guide". TechNet. Microsoft. Retrieved 12 February 2015.
  42. ^ "Small Basic". Retrieved 6 September 2020.
  43. ^ Price, Ed (22 October 2012). "The Unique Features of Small Basic". Small Basic. TechNet. Microsoft. Retrieved 22 April 2015.
  44. ^ Price, Ed (8 October 2012). "What are the 14 Keywords of Small Basic?". Small Basic. MSDN Blogs. Microsoft. Retrieved 9 February 2014.
  45. ^ "Announcing Small Basic Online 1.0 – Public Preview". 20 February 2019.
  46. ^ "Microsoft Small Basic Online v1.0 (CS): Installation Guide". Microsoft TechNet. Retrieved 8 January 2022.
  47. ^ "Contributors to robinhedwards/ArduinoBASIC". GitHub.
  48. ^ "BleuLlama/TinyBasicPlus: A C implementation of Tiny Basic, with a focus on support for Arduino". GitHub. Retrieved 2020-09-11.
  49. ^ "Vintage BASIC - Home". Retrieved 2020-09-11.
  50. ^ Ensmenger, Nathan (2010). The Computer Boys Take Over. MIT Press. p. 55. ISBN 978-0-262-05093-7.
  51. ^ Wozniak 2014.
  52. ^ BASIC-PLUS Language Manual (PDF). Maynard, Massachusetts: Digital Equipment Corporation. 1972. pp. 3–13.
  53. ^ Lorenzo 2017, p. 106.
  54. ^ Allison, Dennis (July 1976). "Design notes for TINY BASIC". SIGPLAN Notices. 11 (7). ACM: 25–33. doi:10.1145/987491.987494. S2CID 18819472. The ACM Special Interest Group on Programming Languages (SIGPLAN) reprinted the Tiny Basic design notes from the January 1976 Tiny BASIC Journal.
  55. ^ Allison, Dennis (1976). "Build Your Own BASIC". Dr. Dobb's Journal. Vol. 1, no. 1. p. 9.
  56. ^ Allison, Dennis (1976). "Quick Reference Guide for Tiny BASIC". Dr. Dobb's Journal. Vol. 1, no. 1. p. 6.
  57. ^ "ZX80 – 8K BASIC ROM UPGRADE".
  58. ^ a b A BASIC Language Interpreter for the Intel 8008 Microprocessor. Department of Computer Science, University of Illinois at Urbana-Champaign (published 1974). June 1974. pp. 16–19.
  59. ^ "TB Code Sheet". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte. 1 (1). December 1975.
  60. ^ "Robert Uiterwyk's Micro Basic".
  61. ^ Weyhrich 2001, The [Integer] BASIC, which we shipped with the first Apple II's, was never assembled — ever. There was one handwritten copy, all handwritten, all hand-assembled..
  62. ^ Wozniak 2018.
  63. ^ Wallace, James; Jim Erickson (1992). Hard Drive: Bill Gates and the Making of the Microsoft Empire. John Wiley & Sons. pp. 81–83. ISBN 0-471-56886-4.
  64. ^ Gates, Bill (January 1976). "An Open Letter To Hobbyists". Homebrew Computer Club Newsletter. 2 (1). Mountain View, California: Homebrew Computer Club: 2.
  65. ^ "We have a BASIC". New Mexico Museum of Natural History and Science. Archived from the original on March 23, 2012. Retrieved 2007-04-18.
  66. ^ Wallace, James; Jim Erickson (1992). Hard Drive: Bill Gates and the Making of the Microsoft Empire. John Wiley & Sons. p. 78. ISBN 0-471-56886-4.
  67. ^ "XBASIC -- A Conversational BASIC Interpreter". GitHub. Retrieved 2020-09-07.
  68. ^ Lennart Benschop (March 8, 2002). "BASIC interpreter Version 1.22". Retrieved 2020-09-23.
  69. ^ Wilkinson, O'Brien & Laughton 1983.
  70. ^ "BASIC-PLUS inline operators, do they actually make sense?". Retrieved 2020-08-05.
  71. ^ Allen, Dennis. "TINY BASIC". People's Computer Company. Vol. 4, no. 3.
  72. ^ Greening, Bernard (1976). "Corrected Tiny BASIC IL". Dr. Dobb's Journal. Vol. 1, no. 1. p. 12.
  73. ^ Veit, Holger. "Tom Pittman's 6800 tiny BASIC". Retrieved 2 May 2017.
  74. ^ Nouspikel, Thierry. "GPL: Graphic Programming Language". Retrieved 2 August 2020.
  75. ^ "I grew up and learned basic on a TI-99/4a. It was a wonderful and simple time..." Hacker News. Retrieved 2 August 2020.
  76. ^ Wozniak 1977, p. 43.
  77. ^ Apple Programmers Aid (PDF). Apple. 1978.
  78. ^ Raskin 1978, p. 11.
  79. ^ Raskin 1978, p. 46.
  80. ^ Raskin 1978, pp. 49–55.
  81. ^ Raskin 1978, pp. 65–67.
  82. ^ "Tiny BASIC Extended". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte. 1 (2). February 1976.
  83. ^ "Denver Tiny BASIC". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte. 1 (3). March 1976.
  84. ^ a b "MINOL". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte. 1 (4). April 1976.
  85. ^ a b Rauskolb, Roger (December 1976). "Dr. Wang's Palo Alto Tiny BASIC" (PDF). Interface Age. pp. 92–108.
  86. ^ Allison, Dennis (January 1976). "Design notes for Tiny BASIC". Dr. Dobb's Journal. Vol. 1, no. 1. p. 9.
  87. ^ Allison, Dennis (January 1976). "Build Your Own BASIC". Dr. Dobb's Journal. Vol. 1, no. 1. p. 8.
  88. ^ Steil, Michael (13 January 2015). "Microsoft BASIC for 6502 Original Source Code".
  89. ^ Hardiman, Roger. "Altair BASIC 3.2 (4K) – Annotated Disassembly". p. 1.11. Archived from the original on 5 November 2001.
  90. ^ a b c Wozniak 1977, p. 42.
  91. ^ Paul R. Santa-Maria. "Apple II Integer Basic Disassembly" (PDF). Retrieved 2020-09-14.[permanent dead link]
  92. ^ Wilkinson, O'Brien & Laughton 1983, p. 5.
  93. ^ Vickers 1983, p. 7–8.
  94. ^ a b "The BASIC Interpreter - Explained". Retrieved 2020-09-15.
  95. ^ "Part 1 Of LLL 8080 BASIC Interpreter" (PDF).
  96. ^ Raskin 1978, p. 118.
  97. ^ Wang, Li-Chen (May 1976). "Palo Alto Tiny BASIC". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte. 1 (5): 12–25.
  98. ^ Raskin 1978, p. 38.
  99. ^ "Part 1 Of LLL 8080 BASIC Interpreter" (PDF).
  100. ^ "Part 1 Of LLL 8080 BASIC Interpreter" (PDF).
  101. ^ "What is the oldest reference to PEEK, POKE, and USR?". Retrieved 15 August 2020.
  102. ^ Altair 8800 BASIC Reference_Manual 1975, Page 68 of PDF, "Using the PEEK function and OUT statement of 8K BASIC, the user can write a binary dump program in BASIC. Using INP and POKE it is possible to write a binary loader. PEEK and POKE can be used to store byte oriented information. When you initialize BASIC, answer the MEMORY SIZE? question with the amount of memory in your ALTAIR minus the amount of memory you wish to use as storage for byte formatted data."
  103. ^ Raskin 1978, p. 27.
  104. ^ "Robert Uiterwyk's BASIC".
  105. ^ Welsh, David; Welsh, Theresa (2007). Priming the Pump: How TRS-80 Enthusiasts Helped Spark the PC Revolution. p. 7.
  106. ^ Reed, Matthew. "Level I BASIC". TRS-80.org. Retrieved 27 August 2017.
  107. ^ Arnold & Wadsworth 1976, p. 10.1.
  108. ^ Arnold & Wadsworth 1976, Chapter 10.
  109. ^ "Floating Point Routines for the 6502". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte. 1 (7). August 1976.
  110. ^ "Part 1 Of LLL 8080 BASIC Interpreter" (PDF).
  111. ^ A BASIC Language Interpreter for the Intel 8008 Microprocessor. Department of Computer Science, University of Illinois at Urbana-Champaign (published 1974). June 1974. p. 20.
  112. ^ "GE-2xx documents". www.bitsavers.org. CPB-267_GE-235-SystemManual_1963.pdf, p. IV-4.
  113. ^ Lorenzo 2017, p. 149.
  114. ^ Steil, Michael (20 October 2008). "Create your own Version of Microsoft BASIC for 6502".
  115. ^ Raskin 1978, p. 61.
  116. ^ MITS Altair BASIC. Albuquerque, NM: MITS. 1975. p. 37.
  117. ^ Lien, David (1986). The Basic Handbook (Third ed.). San Diego, CA: Compusoft. p. 589. ISBN 0-932760-33-3.
  118. ^ Raskin 1978, p. 94.
  119. ^ MITS Altair BASIC. Albuquerque, NM: MITS. 1975. p. 31.
  120. ^ a b c HP 2000/Access BASIC Reference Manual (PDF). Hewlett Packard. May 1976., Part No. 22687-90001
  121. ^ North Star BASIC version 6 (PDF). North Star Corporation. 1977. Archived from the original (PDF) on 2020-03-05. Retrieved 2020-08-01.
  122. ^ The ATARI BASIC Reference Manual. Atari Inc. 1980. Archived from the original on 2005-05-01. Retrieved 2020-08-01.
  123. ^ "Integer, Floating Point and String Variables". C64 Programmer's Manual. Commodore.
  124. ^ Raskin 1978, p. 89.
  125. ^ "Create your own Version of Microsoft BASIC".
  126. ^ Lien, David (1977). User's Manual for Level I (First ed.). Fort Worth, TX: Tandy Corporation. pp. 105–108, 137. Retrieved 9 August 2020.
  127. ^ Raskin 1978, p. 31.
  128. ^ Raskin 1978, p. 32.
  129. ^ Raskin 1978, p. 33.
  130. ^ a b Raskin 1978, p. 120.
  131. ^ Lorenzo 2017, p. 120.
  132. ^ "Would some BASIC interpreters for microcomputers be considered operating systems?". Retrieved August 7, 2020.
  133. ^ a b Raskin 1978, p. 36.
  134. ^ Mini 1977, p. 18.
  135. ^ "NIBL". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte. 1 (10). November 1976.
  136. ^ "Problems with BASIC". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte. 1 (2). February 1976.
  137. ^ "Differences Between GW-BASIC and QBasic". 2003-05-12. Archived from the original on 2013-10-19. Retrieved 2008-06-28.
  138. ^ Lorenzo 2017, p. 137.
  139. ^ Helmers 1978, p. 18.
  140. ^ Weyhrich 2001.
  141. ^ Raskin 1978, p. 100.
  142. ^ Raskin 1978, p. 15.
  143. ^ Raskin 1978, p. 52.
  144. ^ Raskin 1978, p. 107.
  145. ^ Manual 1980, Appendix B.
  146. ^ "What type of interpreter were most 8-bit BASIC implementations?". Retrieved August 9, 2020.
  147. ^ A BASIC Language Interpreter for the Intel 8008 Microprocessor. Department of Computer Science, University of Illinois at Urbana-Champaign (published 1974). June 1974. pp. 24–36.
  148. ^ Pittman, Tom (1981). "The First Book of Tiny BASIC Programs". Retrotechnology.com. Itty Bitty Computers. Retrieved August 5, 2020. Because TA is so large (19,703 bytes), I found that execution became excruciatingly slow, simply due to the memory scan for GOTOs, GOSUBs, and RETURNs. A simple patch to the interpreter converts it to a binary search algorithm, for about an order of magnitude speedup in execution time. The necessary changes are listed in the Appendix.
  149. ^ a b Rugg, Tom; Feldman, Phil (October 1977). "BASIC timing comparisons… revised and updated". Kilobaud. pp. 20–25.
  150. ^ a b Rugg, Tom; Feldman, Phil (June 1977). "BASIC Timing Comparisons… information for speed freaks". Kilobaud. pp. 66–70.
  151. ^ Gilbreath, Jim (September 1981). "A High-Level Language Benchmark". Byte. p. 192.
  152. ^ Ahl, David (November 1983). "Benchmark Comparison Test". Creative Computing. p. 260.
  153. ^ a b c d e Wilkinson 1985, p. 139.
  154. ^ Ahl, David (November 1983). "Benchmark comparison test". Creative Computing. pp. 259–260.
  155. ^ Ahl, David (January 1984). "Creative Computing Benchmark". Creative Computing. p. 12.
  156. ^ Wilkinson, O'Brien & Laughton 1983, p. 17.
  157. ^ Crawford 1982, p. 8.45.
  158. ^ Winner, Lane (1982). "De Re Atari, Chapter 10: Atari BASIC". Atari, Inc.

Bibliography

Further reading

Source code and design documents, in chronological order of the release of the BASIC implementations: