
Un intérprete BASIC es un software que permite a los usuarios escribir y ejecutar programas en lenguaje BASIC y, durante la primera parte de la era de los microordenadores , era la aplicación predeterminada que se ejecutaba en las computadoras. Se esperaba que los usuarios utilizaran el intérprete BASIC para escribir programas o cargarlos desde el almacenamiento (inicialmente cintas de casete y luego disquetes ).
Los intérpretes de BASIC tienen una gran importancia histórica. El primer producto de Microsoft fue un intérprete de BASIC ( Altair BASIC ), que sentó las bases del éxito de la compañía. Antes de Altair BASIC, los microordenadores se vendían en kits que debían programarse en código máquina (por ejemplo, el Apple I ). Durante la época de Altair, los intérpretes de BASIC se vendían por separado, convirtiéndose en el primer software vendido a particulares en lugar de a organizaciones; Apple BASIC fue el primer producto de software de Apple. Tras el MITS Altair 8800 , se esperaba que los microordenadores incluyeran sus propios intérpretes de BASIC (por ejemplo, el Apple II , que contaba con múltiples implementaciones de BASIC). El rechazo al precio de Altair BASIC de Microsoft también impulsó el desarrollo colaborativo de software, tanto para las implementaciones de Tiny BASIC en general como para Palo Alto Tiny BASIC en particular.
Los intérpretes de BASIC cayeron en desuso a medida que las computadoras aumentaban en potencia y sus programas asociados se volvían demasiado extensos para que escribirlos manualmente fuera un formato de distribución viable. El software se distribuía cada vez más precompilado en disquetes o mediante sistemas de tablones de anuncios , lo que redujo la necesidad de listados de código fuente. Además, las interfaces de línea de comandos cada vez más sofisticadas , como MS-DOS y la interfaz gráfica de usuario de Mac , se convirtieron en la interfaz principal , y la necesidad de que BASIC actuara como intérprete desapareció. El uso de intérpretes de BASIC como lenguaje principal e interfaz de sistemas prácticamente había desaparecido a mediados de la década de 1980.
Historia
BASIC contribuyó a impulsar la era del tiempo compartido, se popularizó en la era de los microordenadores, luego se desvaneció hasta convertirse en una aplicación más en la era de DOS y las interfaces gráficas de usuario, y hoy sobrevive en algunos nichos relacionados con el desarrollo de videojuegos, la informática retro y la enseñanza.
La era del tiempo compartido
Implementado inicialmente como un sistema de compilación y ejecución en lugar de un intérprete, BASIC surgió como parte de un movimiento más amplio hacia los sistemas de tiempo compartido . General Electric , tras haber trabajado en el Sistema de Tiempo Compartido de Dartmouth 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 atractivos. Otras empresas del sector emergente no tardaron en seguir su ejemplo. A principios de la década de 1970, BASIC era prácticamente universal en los ordenadores centrales de propósito general. [ 1 ]

BASIC, como lenguaje optimizado diseñado con edición de línea integrada en mente, se adaptaba naturalmente al mercado de las minicomputadoras , que surgía al mismo tiempo que los servicios de tiempo compartido. Estas máquinas tenían una memoria principal muy pequeña , quizás tan solo 4 KB en la terminología moderna, y carecían del almacenamiento de alto rendimiento, como los discos duros , que hacen prácticos a los compiladores. En cambio, un intérprete consumiría menos recursos informáticos, a costa del rendimiento. En 1968, Hewlett Packard presentó la HP 2000 , un sistema basado en su intérprete HP Time-Shared BASIC . [ 2 ] En 1969, Dan Paymar e Ira Baxter escribieron otro intérprete BASIC primitivo para la Data General Nova . [ 3 ]
Una de las empresas que se resistía era Digital Equipment Corporation (DEC), el principal proveedor de minicomputadoras. Habían lanzado un nuevo lenguaje conocido como FOCAL , basado en el anterior JOSS desarrollado en una máquina DEC en el Instituto de Investigación de Stanford a principios de la década de 1960. JOSS era similar a BASIC en muchos aspectos, y FOCAL era una versión diseñada para ejecutarse en sistemas con muy poca memoria, en particular la PDP-8 , que a menudo se distribuía con 4 KB de memoria principal . A finales de la década de 1960, los vendedores de DEC, especialmente en el departamento de ventas para el sector educativo, descubrieron que sus clientes potenciales no estaban interesados en FOCAL y buscaban otras alternativas para sus sistemas. Esto impulsó a David H. Ahl a contratar a un programador para crear un BASIC para la PDP-8 y otras máquinas DEC. En el plazo de un año, todo interés en alternativas como JOSS y FOCAL había desaparecido. [ 4 ]
era de las microcomputadoras
La introducción de los primeros microordenadores a mediados de la década de 1970 continuó el crecimiento explosivo de BASIC, que tenía la ventaja de ser bastante conocido entre los jóvenes diseñadores y aficionados a la informática interesados en los microordenadores, muchos de los cuales habían visto BASIC en miniordenadores o mainframes. BASIC era uno de los pocos lenguajes que era lo suficientemente de alto nivel como para ser utilizado por personas sin formación y lo suficientemente pequeño como para caber en los microordenadores de la época. En 1972, HP presentó la calculadora de escritorio programable HP 9830A con un intérprete de BASIC Plus en memoria de solo 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 ]

En enero de 1975, se anunció la Altair 8800, lo que dio inicio a la revolución de las microcomputadoras . Una de las primeras versiones de BASIC para microcomputadoras fue coescrita por Gates, Allen y Monte Davidoff para su recién formada compañía, Micro-Soft. Esta versión fue lanzada por MITS en formato de cinta perforada para la Altair 8800 poco después del lanzamiento de la propia máquina, [ 7 ] demostrando que BASIC era el lenguaje principal para las primeras microcomputadoras.
En marzo de 1975, Steve Wozniak asistió a la primera reunión del Homebrew Computer Club y comenzó a diseñar su propia computadora. Los miembros del club estaban entusiasmados con Altair BASIC. [ 8 ] Wozniak concluyó que su máquina tendría que tener su propio BASIC. En ese momento trabajaba en Hewlett Packard y utilizó su dialecto de minicomputadora TS-BASIC como base para su propia versión. Integer BASIC se lanzó en casete para la Apple I y se incluyó en ROM cuando se lanzó la Apple II en el verano de 1977. [ 9 ]
Otros miembros del Homebrew Computer Club comenzaron a distribuir copias de Altair BASIC en cinta de papel, lo que llevó a Gates a escribir su Carta Abierta a los Aficionados , quejándose de este primer ejemplo de piratería de software . En parte como respuesta a la carta de Gates, y en parte para crear un BASIC aún más pequeño que funcionara 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 simplificada 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 publicados en 1975 e implementaciones con código fuente publicadas en Dr. Dobb's Journal of Tiny BASIC Calisthenics & Orthodontia: Running Light Without Overbyte . Esto dio lugar a una amplia variedad de Tiny BASIC con características añadidas u otras mejoras, con versiones bien 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 animar a otros a copiar su código fuente. Aficionados y profesionales crearon sus propias implementaciones, lo que convierte 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 de BASIC. En 1976, SCELBI presentó SCELBAL para el 8008 [ 11 ] y la Universidad de Idaho y el Laboratorio Lawrence Livermore anunciaron que publicarían LLL BASIC en el dominio público, que incluía soporte para coma flotante. [ 12 ] En 1977, el Apple II y el TRS-80 Modelo 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.

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 comenzaron a aparecer nuevos microordenadores, como el Commodore PET , sus fabricantes licenciaron una versión de Microsoft BASIC, personalizada para las capacidades del hardware. Para 1978, MS BASIC era un estándar de facto y prácticamente todos los ordenadores domésticos de la década de 1980 lo incluían en 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, funciona rápido en ordenadores centrales y es mucho más funcional que los BASIC para microordenadores... Pero su número de usuarios era ínfimo 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 rebatir eso?» [ 14 ] (Véase Microsoft BASIC para la historia posterior de estas diferentes implementaciones).
Muchos proveedores "discutieron con eso" y usaron otras empresas o escribieron sus propios intérpretes. En septiembre de 1978, Shepardson Microsystems estaba terminando Cromemco 16K Structured BASIC para las máquinas de bus Cromemco S-100 basadas en Z80 . [ 15 ] [ 16 ] Paul Laughton y Kathleen O'Brien luego crearon Atari BASIC [ 17 ] como esencialmente una versión reducida de Cromemco BASIC portada al 6502. [ 18 ] En 1979, Warren Robinett desarrolló el cartucho de programación BASIC para Atari, Inc. , aunque solo admitía programas con 9 líneas de código (64 caracteres en total). También en 1979, Texas Instruments lanzó TI BASIC 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 evolucionó a BBC BASIC , uno de los primeros intérpretes en ofrecer programación BASIC estructurada, con procedimientos y funciones con nombre, bucles y estructuras inspiradas en COMAL . [ 19 ] [ 20 ] Jan Jones desarrolló SuperBASIC , otro BASIC británico que admite programación estructurada, para el Sinclair QL . En 1983, Randall Hyde desarrolló SmartBASIC para el Coleco Adam . [ 21 ] Richard Clayton, Chris Hall y Paul Overell desarrollaron Mallard BASIC para el BBC Micro y Locomotive BASIC para el Amstrad CPC , ambos compatibles con comandos para un sistema de archivos indexado ISAM . [ 22 ] En 1985, MetaComCo lanzó ABasiC para el Amiga y ST BASIC para el 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 ordenadores diferentes. En 1981, la segunda edición documentaba palabras clave de más de 250 ordenadores diferentes, lo que demostraba el crecimiento explosivo de la era de los microordenadores. [ 23 ]
Intérpretes como aplicaciones
Con el auge de los sistemas operativos de disco y, posteriormente , de las interfaces gráficas de usuario , los intérpretes de BASIC se convirtieron en una aplicación más entre muchas, en lugar de ser la primera opción que un usuario pudiera ver al encender un ordenador.
En 1983, debutó la computadora portátil TRS-80 Modelo 100 , cuya implementación de Microsoft BASIC destacó por dos razones. Primero, los programas se editaban usando el editor de texto simple TEXT, en lugar de escribirlos línea por línea (aunque aún se requerían números de línea). [ 24 ] Segundo, este fue el último producto de Microsoft que Bill Gates desarrolló personalmente. [ 25 ] [ 26 ]
También en 1983, Microsoft comenzó a incluir GW-BASIC con 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 ne plus ultra de la familia de BASIC numerados por línea de Microsoft que se remonta al Altair, y tal vez incluso de BASIC numerado por línea en general". [ 27 ] Con el lanzamiento de MS-DOS 5.0, el lugar de GW-BASIC fue ocupado por QBasic .
MacBASIC presentaba un entorno de desarrollo totalmente interactivo para la computadora 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 ciencias de la computación de Dartmouth College , para su uso en un curso de programación introductorio. Estaba condenado a ser el segundo BASIC desarrollado por Apple que fue descartado 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 para Apple II . [ 30 ] [ 31 ]

Los intérpretes de BASIC no fueron solo 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 solo de 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 alemana de informática 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. Varios autores lanzaron 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 de tercera generación orientado a eventos, conocido por su modelo de programación de objetos componentes (COM). [ 34 ] Visual Basic admitía el desarrollo rápido de aplicaciones (RAD) de interfaces gráficas 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 propias internas, así como aplicaciones publicadas.
Conceptos básicos de nicho
En 1993, Microsoft lanzó Visual Basic para Aplicaciones , un lenguaje de scripting para las aplicaciones de Microsoft Office , que reemplaza y amplía las capacidades de lenguajes de programación de macros específicos para 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 un entorno de desarrollo integrado (IDE) y herramientas de desarrollo que lo acompañaban. [ 37 ]
En 2001, SmallBASIC fue lanzado para la PDA Palm . [ 38 ] Otro intérprete de BASIC para Palm fue HotPaw BASIC, una derivación 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 ( OCaml ). [ 39 ]
En 2011, Microsoft lanzó Small Basic (distinto de SmallBASIC), junto con un plan de estudios [ 40 ] y una guía introductoria [ 41 ] , diseñados 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 , autocompletado 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 existe una implementación ampliamente bifurcada. [ 47 ] Otra implementación con el mismo nombre fue adaptada de Palo Alto Tiny BASIC en 1984 por Gordon Brandly para su 68000 Tiny BASIC, posteriormente portada a C por Mike Field. [ 48 ]

Actualmente, existen numerosos intérpretes de BASIC disponibles para teléfonos inteligentes y tabletas a través de la App Store de Apple o de Google Play para Android.
Hoy en día, programar intérpretes de BASIC se ha convertido en parte de la afición a la informática retro . Los lenguajes de programación de alto nivel en sistemas con amplia memoria RAM han simplificado la implementación de intérpretes de 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 arreglos asociativos y la ejecución de programas es sencilla con funciones eval . Como ejemplos, véanse los proyectos de código abierto Vintage BASIC, escrito en Haskell [ 49 ] , o Tiny BASIC en OCaml [ 39 ] .
Ventas y distribución
Inicialmente, los intérpretes se incluían con el hardware de la computadora o se desarrollaban como un servicio personalizado, antes de que surgiera una industria que producía software empaquetado de forma independiente para organizaciones a finales de la década de 1960. [ 50 ] Los intérpretes BASIC se vendieron primero por separado de las microcomputadoras, luego integrados, antes de volver a venderse como aplicaciones en la era de DOS.
A medida que el mercado se decantó por las ROM, el tamaño de estas pasó a ser un factor determinante en las decisiones sobre el tamaño máximo que podía tener un intérprete de BASIC. Dado que la RAM se vendía en chips de 4 KB, Altair BASIC se comercializó inicialmente en ediciones separadas para 4 KB, 8 KB y 12 KB; esta práctica se extendió a los chips ROM, ya que los fabricantes decidían cuántos chips ROM podían integrar en su diseño, teniendo en cuenta los objetivos de precio y otras limitaciones.
Compiladores frente a intérpretes
La primera implementación de BASIC, Dartmouth BASIC , fue un compilador. Generalmente, los compiladores analizan el programa completo en un proceso de varios pasos y generan un segundo archivo que se puede ejecutar directamente en el lenguaje de máquina del ordenador anfitrión sin necesidad de consultar el código fuente. Este código suele consistir en llamadas a rutinas predefinidas del sistema de ejecución del lenguaje . El ejecutable normalmente será más pequeño que el código fuente que lo generó.
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, genera un archivo de salida cada vez mayor que se almacena en memoria junto con el código fuente original. La memoria adicional para búsquedas temporales, especialmente para números de línea en el caso de BASIC, incrementa los requisitos de memoria. Los ordenadores de la época tenían muy poca memoria; en términos actuales, un ordenador central típico podría tener alrededor de 64 KB. En un sistema de tiempo compartido, como 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 contar con algún tipo de almacenamiento secundario de alto rendimiento , generalmente un disco duro . La edición de programas se realizaba 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 finalizaba y ejecutaba el compilador, que leía ese archivo y generaba el código ejecutable; finalmente, el compilador finalizaba y ejecutaba el programa resultante. Dividir la tarea de esta manera reducía la cantidad de memoria necesaria para cada componente del sistema BASIC; en cualquier momento dado, solo era necesario cargar el editor, el compilador o el entorno de ejecución, mientras que el resto se almacenaba en la memoria.
Si bien las computadoras centrales tenían poca memoria, las minicomputadoras tenían aún menos: en la década de 1960, lo habitual eran sistemas de 4 y 8 KB. Pero, lo que es mucho más importante, las minicomputadoras solían carecer de almacenamiento de alto rendimiento; la mayoría de los primeros diseños utilizaban cinta perforada como sistema de almacenamiento principal, y los sistemas de cinta magnética estaban reservados para la gama alta del mercado. En este contexto, 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.
En última instancia, los intérpretes realizan las mismas tareas básicas que los compiladores: leen el código fuente y lo convierten en instrucciones ejecutables que llaman a funciones de tiempo de ejecución. La principal diferencia radica en el momento en que realizan las distintas tareas. En el caso de un compilador, todo el código fuente se convierte en lo que para el usuario parece una única operación, mientras que un intérprete convierte y ejecuta el código fuente instrucción por instrucción. El código máquina resultante se ejecuta, en lugar de imprimirse, y luego 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 construye un ejecutable. La principal desventaja es que ya no se pueden separar las distintas partes del proceso general: el código necesario para convertir el código fuente en operaciones de máquina debe cargarse en la memoria junto con el entorno de ejecución necesario para realizarlo y, en la mayoría de los casos, también el editor de código fuente.
Crear un lenguaje con todos estos componentes que quepa en una pequeña cantidad de memoria y que aún tenga espacio 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 para la mayor parte de la historia de la revolución de las computadoras domésticas .
Desarrollo
Diseño de lenguaje
El diseño del lenguaje para los primeros intérpretes a menudo implicaba simplemente hacer referencia a otras implementaciones. Por ejemplo, las referencias de Wozniak para BASIC fueron un manual de HP BASIC y una copia de 101 BASIC Computer Games . Basándose en estas fuentes, Wozniak comenzó a esbozar una tabla de sintaxis para el lenguaje. [ 51 ] No sabía que el BASIC de HP era muy diferente de la variante DEC BASIC utilizada en 101 Games . Los dos lenguajes diferían principalmente en términos de manejo de cadenas y estructuras de control. [ 52 ] Data General Business Basic , una implementación solo de enteros, fue la inspiración para Atari BASIC. [ 53 ]
En contraste, Dennis Allison , 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 ] Bob Albrecht, del Homebrew Computer Club , lo instó a crear el estándar , pues había visto BASIC en minicomputadoras y pensó que sería la combinación perfecta para máquinas nuevas como la Altair. El diseño propuesto por Allison solo utilizaba aritmética de enteros y no admitía arreglos ni 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 se publicó en el número de septiembre de 1975 del boletín informativo de People's Computer Company (PCC).
La gramática se presenta a continuación en 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 gramatical de lenguajes de programación, la barra vertical (" |") distingue las alternativas, al igual que el hecho de estar listadas en líneas separadas. El símbolo " CR" denota un retorno de carro .
línea :: = número instrucción CR | instrucción CR instrucción :: = IMPRIMIR lista-expr SI expresión relop expresión ENTONCES instrucción GOTO expresión INPUT lista-var DEJAR var = expresión GOSUB expresión RETORNAR BORRAR LISTA EJECUTAR FIN 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, por simple que fuera, añadió una innovación: GOTOpodía GOSUBtomar una expresión en lugar de un número de línea, proporcionando un GOTO asignado [ 56 ] en lugar de la instrucción switch de la ON-GOTO/GOSUBestructura más típica de BASIC.
Sinclair BASIC utilizó como definición de lenguaje el estándar ANSI Minimal BASIC de 1978 del Instituto Nacional Estadounidense de Estándares (ANSI), pero era en sí mismo una implementación incompleta con aritmética de enteros únicamente. [ 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 ]
- Manejo de E/S e interrupciones
- Teclado y pantalla
- Entrada/salida de archivos (si corresponde)
- Rutinas de edición
- Línea de comandos
- Edición y almacenamiento de programas
- Rutinas de ejecución
- Análisis e interpretación
- Paquete aritmético
- Gestión de la memoria
- Tabla de símbolos (si la hay)
- Recogida de basura (si procede)
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 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 de Integer BASIC a mano, traduciendo las instrucciones del código ensamblador a sus equivalentes en código máquina y luego cargando el resultado en su ordenador. [ 61 ] (Debido a esto, el programa era muy difícil de modificar, y Wozniak no pudo modificarlo con la suficiente rapidez para Steve Jobs , quien posteriormente obtuvo la licencia de BASIC de Microsoft. [ 62 ] )
Gates y Allen no disponían de un sistema Altair para 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 un ordenador 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 el PDP-10 de Harvard. [ 63 ] Cuando Harvard dejó de usar este sistema, Gates y Allen compraron tiempo de ordenador 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 de 1976, que el valor del tiempo de ordenador durante el primer año de desarrollo del software fue de 40 000 dólares. [ 64 ]
No es que Allen no supiera programar a mano en lenguaje máquina. Durante la aproximación final al aeropuerto de Albuquerque, en un viaje para demostrar el intérprete, Allen se dio cuenta de que había olvidado escribir un programa de arranque para cargar la cinta en la memoria. Escribiendo en lenguaje máquina 8080, Allen terminó el programa antes de que aterrizara el avión. Solo cuando cargó el programa en un Altair y vio un mensaje solicitando 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 mnemónicos no estándar. Li-Chen Wang había programado su intérprete en un sistema de tiempo compartido con un ensamblador genérico.
Una excepción al uso del lenguaje ensamblador fue el uso de ALGOL 60 para el intérprete Paisley XBASIC para los grandes sistemas Burroughs . [ 67 ] Otra excepción, y programa de entrada de texto , fue Classic BASIC, escrito por Lennart Benschop en Forth y publicado en la revista holandesa Vijgeblad (número 42, 1993). [ 68 ]
El código fuente de los intérpretes solía ser de código abierto (como en el caso de Tiny BASIC) o publicado posteriormente por los autores. El código fuente completo y anotado, junto con las especificaciones de diseño de Atari BASIC, se publicaron en 1983 como The Atari BASIC Source Book. [ 69 ]
Máquinas virtuales
Algunos intérpretes de BASIC se codificaron en la representación intermedia de una máquina virtual para añadir una capa de abstracción y concisión por encima del lenguaje de máquina nativo .
Aunque se habían utilizado máquinas virtuales 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, en cambio, fue diseñado para implementarse como una máquina virtual que analizaba y ejecutaba (interpretaba) instrucciones BASIC; en dicha implementación, el intérprete de 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 consistían en 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 ella eran algo lentos. (Véase Tiny BASIC: Implementación en una máquina virtual para un extracto y comandos de ejemplo). 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 sí lo hicieron se incluyen 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 "Graphic Programming Language" (Lenguaje de Programación Gráfica). [ 74 ] (Aunque se le atribuye ampliamente el lento rendimiento de TI-BASIC , parte del problema radicaba en que la máquina virtual estaba almacenada en la ROM gráfica, que tenía una interfaz lenta de 8 bits). [ 75 ]
Un malentendido sobre las ROM del 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 bytecodes que se ejecutan dentro de una máquina virtual simple de 16 bits, por lo que la memoria podía direccionarse mediante punteros indirectos de 16 bits y funciones matemáticas de 16 bits calculadas sin necesidad de traducirlas al código subyacente de 8 bits del 6502 con múltiples instrucciones. [ 76 ] Sin embargo, SWEET16 no fue utilizado por el código BASIC principal, aunque posteriormente 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 funcionaban tanto como intérprete de lenguaje como editor de línea . Cuando BASIC estaba en ejecución, se mostraba un >indicador de comandos donde el usuario podía introducir instrucciones. [ 78 ] Esto se conocía como " modo directo ". Al arrancar, un intérprete de BASIC se configuraba por defecto en modo directo.
Las instrucciones que se introdujeron con números iniciales se almacenaron en la memoria del programa para su "ejecución diferida" [ 79 ] , ya sea como líneas nuevas o reemplazando cualquier línea que pudiera haber tenido el mismo número previamente [ 80 ] . Las instrucciones que se introdujeron sin número de línea se denominaron comandos y se ejecutaron inmediatamente. Los números de línea sin instrucciones (es decir, seguidos de un retorno de carro ) eliminaron una línea almacenada previamente.
Cuando un programa se encuentra en memoria y el usuario introduce un RUNcomando, el sistema entra en modo indirecto. En este modo, se coloca un puntero que apunta a la primera línea del programa, por ejemplo, la línea 10. El texto original de esa línea se recupera de la memoria y se ejecuta como si el usuario lo hubiera introducido en modo directo. A continuación, 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 AUTOcomando para ingresar 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 RAM y acelerar la ejecución, todos los intérpretes de BASIC codificaban algunos caracteres ASCII de las líneas en otras representaciones. Por ejemplo, los números de línea se convertían en enteros almacenados como bytes o palabras , y a las palabras clave se les asignaban tokens de un solo byte (por ejemplo, PRINTel valor de byte 145 en MS-BASIC). Estas representaciones se convertían luego de nuevo a 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: PRpara PRINT, INpara INPUT, RETpara RETURN. Las palabras clave completas y tradicionales no fueron aceptadas.
En cambio, Palo Alto Tiny BASIC aceptaba palabras clave tradicionales, pero permitía abreviar cualquier palabra clave a su cadena mínima única, con un punto al final. Por ejemplo, PRINTse podía escribir P., aunque PR.y otras variaciones también funcionaban. Este sistema se mantuvo en Level I BASIC para el TRS-80 , que usaba PATB, y también se encontró en Atari BASIC 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 proporcionada. Los comandos más utilizados aparecen primero en la lista de palabras reservadas, con REMal principio (se puede escribir como .). Cuando el programa se LISTejecuta posteriormente, normalmente escribirá las palabras completas. MS BASIC también permitía ?como forma abreviada de PRINT, pero la expandía al listarla, 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 texto original a diversos formatos específicos de la plataforma. Tiny BASIC era de los más sencillos: solo 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, lo que reducía su tamaño de almacenamiento en memoria y facilitaba su búsqueda en el código máquina (algunos diseños de Tiny BASIC permitían números de línea solo del 1 al 254 o 255, aunque la mayoría utilizaba valores de doble byte y números de línea de al menos el 1 al 999). El resto de la línea se mantenía 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 ]
MS-BASIC fue 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 más significativo activado para permitir que se distinguieran fácilmente en tiempo de ejecución. Todo lo demás en una línea se dejó en su formato original, por ejemplo, la línea:
10 PARA I=1 A 10
se tokenizaría como:
$64$81 I$B211$A410
Nótese que el espacio entre FORy Ipermanece en la línea tokenizada, y los nombres de las variables y las constantes no se tokenizan. El código que realizaba esta tokenización, conocido como "el fragmentador", simplemente copiaba todo lo que no reconocía como un token de vuelta a la salida, conservando los espacios tal cual. Esto significaba que PRINTAse almacenaba en dos bytes, mientras que PRINT Ase almacenaba en tres bytes, y eliminar los espacios era una forma común de mejorar el uso de la memoria. [ 89 ] Sinclair BASIC modificó esto ligeramente, eliminando los espacios del código almacenado e insertándolos en el código durante un LIST, de modo que PRINTAaún PRINT Ano ocupara el byte adicional en la memoria.
En contraste, Integer BASIC convertiría la línea 10 GOTO 100completamente en tokens que podrían leerse y ejecutarse inmediatamente. En MS-BASIC, la línea produciría $64 $89 100, y en tiempo de ejecución el "100" tendría que convertirse al formato de 16 bits cada vez que se encontrara. En contraste, Integer BASIC también tokenizaba las variables numéricas, evitando esta conversión y acelerando la ejecución. El valor resultante de dos bytes 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 en el valor original. Los literales de cadena, como "HELLO WORLD", se codificaban estableciendo el bit más significativo 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 más significativo activado, y cualquier dígito en el nombre representado por los correspondientes $B0 a $B9 , de modo que la variable se codificaría como $C1B5 (no se reducía a un token). [ 90 ] Hubo muchas otras optimizaciones; mientras que 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 analizador léxico de Atari BASIC analiza la línea completa cuando se introduce o modifica. Las constantes numéricas se analizan a su forma interna de 48 bits y luego se colocan en la línea en ese formato, mientras que las cadenas se mantienen en su formato original, pero con un byte prefijado que describe su longitud. Las variables se almacenan a medida que se encuentran, en lugar de en tiempo de ejecución, y su nombre se reemplaza por un puntero a su ubicación de almacenamiento en la memoria. Shepardson se refería a este concepto de análisis léxico temprano como un "intérprete de precompilación"; las instrucciones con errores de sintaxis no se podían almacenar realmente, y se le pedía al usuario que las corrigiera inmediatamente. [ 92 ]
Tokenización en el teclado

Algunos intérpretes, como los sistemas Sinclair, básicamente hacían que el usuario realizara la tokenización proporcionando pulsaciones de teclas especiales para introducir palabras reservadas. Los comandos más comunes solo necesitan una 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 escribir 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.
Muchos " ordenadores de bolsillo " utilizan de forma similar una sola pulsación de tecla (a veces precedida por varias teclas Mayús) para generar un byte (el token de palabra clave) que representa una palabra clave BASIC completa, como EXP, SQR, IF o PEEK , como los conjuntos de caracteres de los ordenadores de bolsillo Sharp y TI-BASIC . La expansión BASIC para el Bally Astrocade también utiliza este método.
Gestión de línea
Los números de línea válidos variaban de una implementación a otra, pero normalmente iban del 1 al 32767.
La mayor parte de la memoria utilizada por los intérpretes de BASIC se destinaba a almacenar el propio listado del programa. 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 las líneas de la siguiente manera:
- Equivalente binario del número de línea (uno o dos bytes, según el rango de números de línea válidos admitidos).
- Declaración de código fuente ASCII (longitud variable)
- Retorno de carro (un byte, establecido en 13)
Microsoft BASIC, comenzando con Altair BASIC, almacenaba las líneas de la siguiente manera: [ 94 ]
- Puntero a la siguiente línea (dos bytes)
- Equivalente binario del número de línea (dos bytes, sin signo)
- Declaración fuente tokenizada (longitud variable)
- Nulo (un byte, establecido en 0)
LLL BÁSICO: [ 95 ]
- Equivalente binario del número de línea (dos bytes)
- Puntero hacia adelante a la siguiente línea secuencial (dos bytes)
- Longitud de la instrucción fuente ASCII (un byte)
- Declaración de código fuente ASCII (longitud variable)
La longitud máxima de una línea variaba: 64 caracteres en Palo Alto Tiny BASIC, incluyendo 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 buscaban en el programa línea por línea, examinando cada número de línea. Si era menor que el número de la nueva línea, las líneas posteriores se movían en la memoria para dejar espacio para la nueva línea. Si era el mismo número de línea, pero no de la misma longitud, las líneas subsiguientes debían moverse hacia adelante o hacia atrás. [ 97 ] (Dado que el orden secuencial siempre se mantenía en la memoria, no se trataba de listas enlazadas ).
En Tiny BASIC, estas búsquedas requerían comprobar cada byte de una línea: el puntero se incrementaba repetidamente hasta encontrar un retorno de carro para localizar el byte anterior a la siguiente línea. En Altair BASIC y LLL BASIC, en cambio, el puntero se colocaba al 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 presumía que los programas de Tiny BASIC tenían un tamaño de 4 KB o menos, esto estaba en consonancia con la filosofía de diseño general de Tiny BASIC, que priorizaba la minimización del uso de memoria sobre el rendimiento.
Cuando el usuario escribía LISTen la línea de comandos, el sistema recorría la matriz de líneas, utilizando uno de estos métodos, convertía el número de línea de nuevo a formato decimal y, a continuación, imprimía el resto del texto de la línea, decodificando cualquier token u otra representación codificada.
A medida que los desarrolladores añadían estructuras de programación estructurada a BASIC, a menudo eliminaban por completo la necesidad de números de línea y añadían 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; por ejemplo, de la A a la Z9). MS-BASIC permitía nombres de variables que consistían en una letra seguida de una letra o un dígito opcional (por ejemplo, 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 destinado a "LOSS".
Integer BASIC era inusual por admitir nombres de variables de cualquier longitud (por ejemplo, SUM, GAMEPOINTS, PLAYER2), siempre que no contuvieran una palabra reservada. [ 98 ] No se podían usar palabras clave en las variables en muchas versiones tempranas de BASIC; "SCORE" se interpretaría como "SC" OR "E", donde OR era una palabra clave.
En muchos dialectos de BASIC para microcomputadoras, las variables de cadena se distinguen generalmente por tener el símbolo $ añadido a su nombre, y los valores suelen identificarse como cadenas al estar delimitados por comillas dobles. Las implementaciones posteriores usarí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 la excepción de los arreglos y (en algunas implementaciones) las cadenas de caracteres, y a diferencia de Pascal y otros lenguajes de programación más estructurados, BASIC no requiere que una variable se declare antes de ser referenciada. Los valores por defecto suelen ser 0 (con la precisión adecuada) o la cadena vacía.
Tabla de símbolos
Debido a que Tiny BASIC solo usaba 26 variables de una sola letra, las variables podían almacenarse como una matriz sin almacenar sus nombres correspondientes, usando una fórmula basada en el valor ASCII de la letra como índice. Palo Alto Tiny BASIC fue un paso más allá: los valores de dos bytes de las variables se ubicaban en la RAM dentro del programa, desde el byte 130 (ASCII 65, 'A', dos veces) hasta el 181 (ASCII 90, 'Z', dos veces, más uno para el segundo byte). [ 85 ]
La mayoría de los lenguajes BASIC permitían tener muchas más de 26 variables, por lo que necesitaban tablas de símbolos , que reservaban capacidad de almacenamiento solo para las variables utilizadas.
En LLL BASIC, cada entrada en la tabla de símbolos se almacenaba de la siguiente manera: [ 99 ]
- Nombre de la variable (byte 1: letra ASCII; byte 2: ASCII 0-9 o binario 0)
- Puntero hacia adelante (2 bytes)
- Valor (4 bytes por elemento, 1 elemento si es una variable escalar, de lo contrario tantos elementos como DIMENSIONED para una matriz)
A diferencia de la mayoría de los intérpretes de BASIC, UIUC BASIC tenía una función hash , que realizaba el hash por la letra del nombre de la variable/función/matriz, y luego llevaba a cabo una búsqueda lineal a partir de ahí. En UIUC BASIC, una entrada de la tabla de símbolos era: [ 58 ]
- Bandera (bit 0: entrada en uso; bit 6: función definida por el usuario; bit 7: matriz)
- Nombre de variable (byte 1: letra ASCII; byte: 0-9 ASCII, " ", o "(") o nombre de función (byte 1: letra ASCII o token 154 para
FN; letra ASCII) - Valor (5 bytes):
- Valor de punto flotante para un escalar
- Definición de matriz (últimos 3 bytes: dimensión superior de la primera, segunda y tercera dimensión; se supone que todas comienzan en 0).
- Función de usuario (los primeros 2 bytes contienen la dirección de la función; el byte 3 es el desplazamiento de la tabla de símbolos al parámetro de variable ficticia en la definición de la función).
En Atari BASIC, un conjunto de punteros (direcciones) indicaba diversos datos: los nombres de las variables se almacenaban en la tabla de nombres de variables (VNTP – 82, 83 16 ) y sus valores en la tabla de valores de variables (apuntados en VVTP – 86, 87 16 ). Al inferir los nombres de las variables de esta manera, una referencia a una variable solo necesitaba un byte para acceder a su entrada en la tabla correspondiente. Las variables de cadena tenían su propio espacio.
Una de las optimizaciones de rendimiento de BBC BASIC consistió en utilizar varias 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 escasa capacidad de RAM de la mayoría de los sistemas utilizados originalmente para ejecutar intérpretes BASIC, fue necesario emplear técnicas ingeniosas de gestión de memoria. Altair BASIC permitía a los usuarios recuperar el espacio destinado a las 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 su uso con el RSTcódigo de operación 8080 de 1 byte en lugar del de 3 bytes CALL. En LLL BASIC, algunas variables ocupaban las mismas ubicaciones de memoria, en los casos en que las diferentes variables se utilizaban únicamente en modo comando o solo en tiempo de ejecución. [ 100 ]
El vídeo solía ser direccionable en memoria, y ciertas funciones esotéricas estaban disponibles manipulando valores en direcciones de memoria específicas. Por ejemplo, las direcciones 32 a 35 contenían las dimensiones de la ventana de texto (a diferencia de la ventana gráfica) en Applesoft BASIC. El POKEcomando y la PEEKfunción (adaptados de monitores de código máquina como el monitor DECsystem-10 [ 101 ] ) proporcionaban acceso directo a la memoria, para diversos fines, [ 102 ] especialmente para modificar registros de hardware mapeados en memoria para controlar funciones particulares del ordenador, 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 , siendo uno de los mapas de memoria más conocidos el libro Mapping the Atari , escrito por Ian Chadwick.
Algunas implementaciones del intérprete de Microsoft, como las que se ejecutaban en los modelos TRS-80 I/III, requerían que el usuario especificara la cantidad de memoria que utilizaría el intérprete. Esto permitía reservar una región de memoria para la instalación de subrutinas en lenguaje máquina que podían ser llamadas por el programa interpretado, lo que aumentaba la velocidad de ejecución. Al encender los modelos I/III, el usuario veía el mensaje "¿Tamaño de la memoria?" para este propósito.
Matemáticas
Integer BASIC, como su nombre indica, utiliza números enteros como base para su paquete matemático. Estos se almacenaban internamente como números de 16 bits, little-endian (al igual que el 6502). Esto permitía un valor máximo para cualquier cálculo entre -32767 y 32767. Los cálculos que arrojaban valores fuera de ese rango producían un error. [ 103 ]
La mayoría de los intérpretes de Tiny BASIC (así como Sinclair BASIC 4K) solo admitían operaciones matemáticas con números enteros, sin soporte para coma flotante . El uso de enteros permitía almacenar números en un formato de 16 bits mucho más compacto, que se leía y procesaba con mayor rapidez que los formatos de coma flotante de 32 o 40 bits presentes 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,4 x 10^14).
En ocasiones se utilizaban otros formatos numéricos informáticos . Por ejemplo, el MINOL Tiny BASIC solo admitía bytes sin signo [ 84 ] y el MICRO-BASIC Tiny BASIC utilizaba el formato binario codificado decimal [ 104 ] . Pero el formato de punto flotante acabaría predominando.
Punto flotante
Una anécdota resume por qué se consideraba tan importante el cálculo de punto flotante. El prototipo original del TRS-80 Modelo I ejecutaba la versión de dominio público de Tiny BASIC de Li-Chen Wang . Esta requería solo 2 KB de memoria para el intérprete , dejando un promedio de otros 2 KB libres para programas de usuario en las configuraciones de memoria comunes de 4 KB de las primeras máquinas. Durante una demostración para ejecutivos, el entonces presidente de Tandy Corporation , Charles Tandy, intentó introducir su salario, pero no pudo. Esto se debía a que Tiny BASIC utilizaba enteros con signo de 2 bytes con un valor máximo de 32.767. El resultado fue una solicitud de aritmética de punto flotante para la versión de producción. [ 105 ] Esto llevó a que Steve Leininger, empleado de Tandy, reemplazara el código de enteros de 16 bits existente por una versión que utilizaba números de punto flotante de precisión simple de 32 bits . [ 106 ]
SCELBAL utilizaba 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 del byte intermedio y luego el más significativo con el signo en el bit más significativo. El exponente se colocaba al final, también con el signo en el bit más significativo. [ 107 ] El manual proporciona código ensamblador bien documentado para todo el paquete matemático, incluyendo puntos de entrada y notas de uso. [ 108 ]
Por lo general, se recurría a consultores para manejar 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 las computadoras centrales. Cuando Allen y Gates estaban desarrollando Altair BASIC, su compañero de Harvard, Monte Davidoff, los convenció de cambiar de la aritmética de enteros . Contrataron a Davidoff para escribir un paquete de punto flotante que aún pudiera ajustarse a 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 agregar 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 obtuvo la licencia de un paquete de punto flotante Datapoint 2200. [ 111 ]
En cambio, los sistemas de tiempo compartido a menudo dependían del hardware. Por ejemplo, el GE-235 fue elegido para implementar la primera versión de Dartmouth BASIC precisamente porque contaba con una " Unidad Aritmética Auxiliar " para cálculos de punto flotante y 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:
- Bit de signo : 1 bit
- Ancho del exponente : 8 bits
- Precisión significativa : 24 bits (23 almacenados explícitamente)
Aquí está el valor 0.15625 almacenado en este formato: ![]()
Si bien los formatos de 32 bits eran comunes en esta época, 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 normalmente incluían +(suma), -(resta), *(multiplicación), /(división) y exponente usando el ^carácter. Las operaciones relativas incluían el conjunto estándar de =, >, <, >=, <=, y para "distinto de" <>o el inspirado en HP-TSB# . [ 115 ] Los operadores binarios, como AND, ORy NOT, no estaban en todas las implementaciones, y algunas hacían álgebra booleana y otras 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, devolviendo 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 de una sola línea, que luego se denominarían FNA(), FNB(), etc.
Esta RNDfunción fue la más extendida entre las que se admitían en las primeras versiones de BASIC, aunque las implementaciones variaban:
- Dartmouth
RNDignoró el parámetro y siempre devolvió un nuevo número pseudoaleatorio entre 0 y 1. - Altair BASIC y versiones posteriores de Microsoft BASIC utilizaban el signo del parámetro: Para RND(X), "X<0 inicia una nueva secuencia de números aleatorios usando X. Llamar a RND con el mismo X inicia la misma secuencia de números aleatorios. X=0 da el último número aleatorio generado." [ 116 ]
- Al no poder devolver un valor decimal, los BASIC que solo admitían enteros utilizaban el valor del parámetro, normalmente para especificar un límite superior para la aleatorización; por ejemplo, en el propio Integer BASIC,
RND(6)+1se simulaba el lanzamiento de un dado, devolviendo valores del 1 al 6. - En cambio, en algunos BASIC de TRS-80, el parámetro era el límite superior que se podía devolver; por ejemplo,
RND(6)devolvería un valor de 1 a 6, yRND(1)siempre devolvería 1. [ 117 ]
Matrices
La segunda versión de Dartmouth BASIC admitía matrices y operaciones matriciales , útiles para la solución de sistemas de ecuaciones algebraicas lineales simultáneas; MATse admitían operaciones matriciales como la asignación, la suma, la multiplicación (de tipos de matrices compatibles) y la evaluación de un determinante.
En contraste, Tiny BASIC, tal como fue diseñado inicialmente, ni siquiera tenía matrices, debido a la memoria principal limitada disponible en los primeros microordenadores , a menudo 4 KB, que tenía que incluir tanto el intérprete como el programa BASIC. Palo Alto Tiny BASIC agregó una única matriz de enteros de longitud variable , cuyo tamaño no tenía que dimensionarse, sino que utilizaba RAM no utilizada por el intérprete o 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 únicamente por la memoria disponible. [ 118 ] Tiny BASIC Extended admitía matrices bidimensionales de hasta 255 x 255. Altair BASIC 4K solo admitía matrices (de una dimensión), mientras que la versión 8K admitía matrices de hasta 34 dimensiones. [ 119 ]
Muchas implementaciones respaldaban la práctica de Dartmouth BASIC de no requerir que se dimensionara una matriz, 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 dope de los arreglos variaba de una implementación a otra. Por ejemplo, el vector dope de un arreglo Altair BASIC 4K: [ 94 ]
- Nombre de la variable (2 bytes)
- Tamaño de los elementos de la matriz en bytes (2 bytes, es decir, 4 veces el número de elementos, que era el límite superior más uno).
Luego, los valores de la matriz en sí:
- Valor del elemento 0 (4 bytes)
- Valor del elemento 1 (4 bytes)
- ...
- Valor del elemento N (4 bytes)
Las implementaciones que admitían matrices debían registrar el número de dimensiones y el límite superior de cada una. Además, dado que algunos intérpretes solo tenían un tipo de dato (ya fuera de coma flotante o entero), el vector de datos solo necesitaba registrar el número de dimensiones y el límite superior de cada una. Los intérpretes con múltiples tipos de datos debían registrar el tipo de dato de la matriz.
Aunque Microsoft y otros sistemas BASIC admitían matrices, las operaciones con matrices no estaban integradas, sino que debían programarse explícitamente sobre los elementos de la matriz.
Instrumentos de cuerda
Las implementaciones originales de Dartmouth BASIC, algunas de sus sucesoras inmediatas y Tiny BASIC carecían de manejo de cadenas de caracteres. Surgieron dos enfoques distintos para el manejo de cadenas, impulsados por HP y DEC, aunque posteriormente aparecieron otros. Estos requerían estrategias de implementación diferentes.
El manejo de cadenas más simple copiaba HP Time-Shared BASIC y definía las variables de cadena como matrices de caracteres que debían DIMdeclararse antes de su uso. En HP TSB, las cadenas se tratan como una matriz de caracteres, hasta 72 en total, en lugar de un único objeto de varios caracteres. Por defecto, se les asigna un carácter en memoria, y si se necesita una cadena de mayor longitud, debe declararse. Por ejemplo, se configurará una cadena que puede contener un máximo de 10 caracteres. [ 120 ]DIMA$[10]
Se accede a las subcadenas dentro de las cadenas mediante una notación de " segmentación ": 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 los arrays y las subcadenas 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. Posteriormente adoptada por ANSI BASIC, la notación de HP también se puede utilizar en el lado de destino de una instrucción LETo INPUTpara modificar parte de un valor de cadena existente, por ejemplo o , lo que no se puede hacer con las primeras implementaciones de .100A$[3,5]="XYZ"120B$[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 el CHANGEcomando que convertía la cadena a y desde valores ASCII equivalentes. (Posteriormente adoptado tal cual por DEC y adaptado por HP, que cambió la palabra clave a CONVERT. [ 120 ] ) Además, se podía usar la comilla simple para convertir una constante numérica a un carácter ASCII, lo que permitía construir una cadena por partes; A$='65 '66 '67 "DEF"producía la cadena "ABCDEF", sin necesidad de la CHR$()función. [ 120 ] La sexta edición de Dartmouth BASIC 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 a su vez 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 implementaciones de Tiny BASIC admitían uno o más arreglos de enteros predefinidos, que podían usarse para almacenar códigos de caracteres, siempre que el lenguaje tuviera la funcionalidad para ingresar y generar códigos de caracteres (por ejemplo, Astro BASIC tenía KPy TVpara este propósito).
Recogida de basura

El hecho de que las cadenas utilicen una cantidad fija de memoria independientemente del número de caracteres que contengan, hasta un máximo de 255 caracteres, puede haber supuesto un desperdicio de memoria [ 124 ] , pero tenía la ventaja de evitar la necesidad de implementar la recolección de basura del montón , una forma de gestión automática de memoria que se utiliza para recuperar la memoria ocupada por cadenas que ya no se utilizan. Las cadenas cortas que se liberaban podían almacenarse en medio de otras cadenas, impidiendo que esa memoria se utilizara cuando se necesitaba una cadena más larga.
En los primeros microordenadores, con su memoria limitada y procesadores lentos, la recolección de basura de BASIC a menudo podía causar pausas aparentemente aleatorias e inexplicables en medio de la operación del programa. Algunos intérpretes de BASIC, como Applesoft BASIC en la familia Apple II , escaneaban repetidamente los descriptores de cadena para encontrar la cadena con la dirección más alta para compactarla hacia la memoria alta, lo que resultaba en un rendimiento O(n 2 ) , que podía introducir pausas de varios minutos en la ejecución de programas intensivos en cadenas. La recolección de basura era notoriamente lenta o incluso defectuosa en otras versiones de Microsoft BASIC. [ 125 ] Algunos sistemas operativos que admitían tareas en segundo plano controladas por interrupciones, como TRSDOS/LS-DOS 6.x en el TRS-80 Modelo 4 , explotaban períodos de inactividad del usuario (como los períodos de milisegundos entre pulsaciones de teclas y los períodos posteriores a la actualización de la pantalla de vídeo) para procesar la recolección de basura durante las ejecuciones de programas BASIC.
Otras funcionalidades
Gráficos y sonido
La mayoría de los intérpretes de BASIC diferían enormemente en cuanto a gráficos y sonido, que variaban drásticamente de un microordenador a otro. Altair BASIC carecía de comandos gráficos o de sonido, al igual que las implementaciones de Tiny BASIC, mientras que Integer BASIC ofrecía un amplio conjunto de ellos.
El BASIC de nivel I para el TRS-80 tenía el conjunto más mínimo posible: CLS, para borrar la pantalla; SET(X,Y), que iluminaba una ubicación en la pantalla; RESET(X,Y), que la apagaba; y POINT(X,Y), que devolvía 1 si una ubicación estaba iluminada, 0 si no lo estaba. Las coordenadas podían ser cualquier expresión y abarcaban desde 0 hasta 127 para el eje X y desde 0 hasta 47 para el eje Y. Solo se admitía la visualización en blanco y negro. [ 126 ]
En contraste, Integer BASIC admitía gráficos en color, sonido simple y controladores de juegos. El modo gráfico se activaba con la GRinstrucción y se desactivaba con TEXT. [ 127 ] El dibujo era modal y normalmente se iniciaba emitiendo un comando para cambiar el color, lo cual se lograba estableciendo una pseudovariable; COLOR=12establecería el color de dibujo en 12, verde claro. Luego se podía PLOT 10,10producir un solo punto de ese color, [ 128 ]HLIN 0,39 AT 20 dibujar una línea horizontal en la fila 20 que abarcara la pantalla, o VLIN 5,15 AT 7dibujar una línea vertical más corta hacia abajo en la columna 7. [ 129 ]A=SCRN X,Y devolvía el color de la pantalla en X,Y. [ 130 ] [ b ]

Los fabricantes de hardware a menudo incluían soporte propietario para semigráficos , formas simples e iconos tratados como caracteres especiales . Algunos ejemplos incluían los gráficos de bloques del ZX-81 y los símbolos de cartas ♠, ♣, ♥ y ♦ en el conjunto de caracteres PETSCII de Commodore International . BASIC podía generar estos símbolos usando .PRINT CHR$();
Microsoft añadió muchos comandos gráficos a IBM BASIC : LINE, PSET(establecer píxel), PRESET(restablecer píxel), GET(almacena un rectángulo de la pantalla en una matriz), PUT(muestra un segmento rectangular almacenado), LOCATE(para mover el cursor de texto) y DRAW, que dibuja formas usando una sintaxis similar a LOGO . Bill Gates y Neil Konzen escribieron DONKEY.BAS , un juego incluido, para demostrar los gráficos en color y el sonido del intérprete . [ 131 ]
Entrada/salida
Otra área en la que las implementaciones divergieron fue en las palabras clave para trabajar con soportes multimedia (casetes y disquetes), entrada de teclado y controladores de juegos (si los había).
Dado que los intérpretes BASIC basados en ROM a menudo funcionaban como shells para cargar otras aplicaciones, las implementaciones añadieron comandos relacionados con cintas de casete (por ejemplo, CLOADy CSAVE), archivos binarios de disco (por ejemplo, BLOAD, BSAVE, y BRUN) y programas BASIC en disco (por ejemplo, LOAD, SAVE, y CATALOG). Las implementaciones de BASIC para empresas añadieron comandos para archivos de acceso aleatorio. (Incluso los intérpretes BASIC basados en ROM no fueron diseñados ni concebidos para ser utilizados como sistemas operativos, y los microordenadores más pequeños simplemente carecían de cualquier sistema operativo. [ 132 ] )
Dartmouth BASIC carecía de un comando para obtener entrada del teclado sin pausar el programa. Para admitir videojuegos , los BASIC agregaron comandos propietarios para hacerlo: INKEY$era una función en Microsoft BASIC que devolvía una cadena vacía si no se presionaba ninguna tecla o, de lo contrario, un solo carácter; KP(para KeyPress ) devolvía el valor ASCII de la entrada en Astro BASIC .
Palo Alto Tiny BASIC carecía de cadenas de caracteres, pero permitía a los usuarios introducir expresiones matemáticas como respuesta a INPUTlas instrucciones; al establecer variables, como Y=1; N=0, el usuario podía responder "Y" o "1" o incluso "3*2-5" a una pregunta de sí/no.
Algunos sistemas admitían controladores de juegos. Astro BASIC admitía JX()(posición horizontal del joystick especificada), JY()(posición vertical del joystick), KN()(estado del botón) y TR()(estado del gatillo). Integer BASIC admitía un controlador de juegos , un controlador de paleta , que tenía dos controladores en un solo conector. La posición del controlador se podía leer usando la PDLfunción, pasando el número del controlador, 0 o 1, como A=PDL(0):PRINT A, devolviendo un valor entre 0 y 255. [ 133 ] [ c ]
Integer BASIC carecía de comandos de entrada/salida personalizados, y también carecía de la DATAinstrucción y el asociado READ. Para introducir y extraer datos de un programa, la funcionalidad de entrada/salida se redirigía a una ranura de tarjeta seleccionada con PR#xy IN#x, que redirigían la salida o la entrada (respectivamente) a la ranura numerada. A partir de entonces, se podían enviar datos a la tarjeta usando PRINTcomandos convencionales y leerlos desde ella usando INPUT. [ 130 ] La producción de sonidos se lograba mediante PEEKla ubicación mapeada en memoria de un simple "beeper", −16336. [ d ]
Programación estructurada
Aunque Kemeny y Kurtz conocían la programación estructurada , a través de los ejemplos de ALGOL 58 y ALGOL 60WHILE...WEND , cuando diseñaron BASIC, solo adaptaron el bucle for, ignorando la instrucción else, el bucle while, el bucle repeat, los procedimientos con nombre, el paso de parámetros y las variables locales. Como resultado, los dialectos posteriores a menudo diferían drásticamente en la redacción utilizada para las técnicas estructuradas. Por ejemplo, (en Microsoft BASIC ), WHILE...ENDWHILE(en Turbo-Basic XL ), DO...LOOP WHILEe incluso WHILElas cláusulas (ambas en BASIC-PLUS ).
De las implementaciones de Tiny BASIC, solo el National Industrial Basic Language (NIBL) ofrecía algún tipo de comando de bucle DO/UNTIL. [ 135 ] Esto a pesar de que el inventor de Tiny BASIC, Dennis Allison, lamentaba públicamente el estado de BASIC. [ 136 ]
BBC BASIC fue uno de los primeros intérpretes de microcomputadoras en ofrecer programación BASIC estructurada, con procedimientos y funciones con nombre, DEF PROCbucles y estructuras inspiradas en COMAL . Las versiones de segunda generación de BASIC —por ejemplo, SBASIC (1976), BBC BASIC (1981), True BASIC (1983), Beta BASIC (1983), QuickBASIC (1985) y AmigaBASIC (1986)— introdujeron una serie de características en el lenguaje, principalmente relacionadas con la programación estructurada y orientada a procedimientos. Por lo general, la numeración de líneas se omite del lenguaje y se reemplaza con etiquetas (para GOTO ) y procedimientos para fomentar un diseño más fácil y flexible. [ 137 ] Además, se introdujeron palabras clave y estructuras para admitir la repetición, la selección y los procedimientos con variables locales.DEF FNREPEAT UNTILIF THEN ELSE
El siguiente ejemplo está en Microsoft QBASIC, la tercera implementación de Microsoft de un BASIC estructurado (después de Macintosh BASIC en 1984 y Amiga BASIC en 1985). [ 138 ]
Ejemplo de REM QBASICREM Declaración anticipada: permite que el código principal llame a una subrutina REM que se define más adelante en el código fuente DECLARE SUB PrintSomeStars ( StarCount! )REM El programa principal continúa con DO INPUT "¿Cuántas estrellas quieres? (0 para salir) " , NumStars CALL PrintSomeStars ( NumStars ) LOOP WHILE NumStars > 0 ENDREM definición de subrutina SUB ImprimirAlgunasEstrellas ( StarCount ) REM Este procedimiento utiliza una variable local llamada Estrellas$ Estrellas$ = CADENA$ ( StarCount , "*" ) IMPRIMIR Estrellas$ FIN SUBOrientado a objetos
Inicialmente, la compatibilidad con la programación orientada a objetos solo permitía la reutilización de objetos creados con otros lenguajes, como la compatibilidad de Visual Basic y PowerBASIC con el Modelo de Objetos Componentes de Windows . A medida que los intérpretes de BASIC evolucionaron, añadieron compatibilidad con características de la programación orientada a objetos, como métodos , constructores , asignación dinámica de memoria , propiedades y asignación temporal.
Ensamblador incluido
Las ROM Integer BASIC también incluían un monitor de código máquina , un "mini- ensamblador " y un desensamblador para crear y depurar programas en lenguaje ensamblador . [ 90 ] [ 139 ] [ 140 ]
Una de las características únicas de BBC BASIC era el ensamblador integrado , que permitía a los usuarios escribir programas en lenguaje ensamblador para el 6502 y, posteriormente, para el Zilog Z80 , el NS32016 y el ARM . El ensamblador estaba completamente integrado en el intérprete de BASIC y compartía variables con él, las cuales podían incluirse entre los caracteres [ y ], guardarse mediante *SAVE y *LOAD, y llamarse mediante los comandos CALL o USR. Esto permitía a los desarrolladores escribir no solo código en lenguaje ensamblador, sino también código BASIC que generaba código ensamblador, lo que posibilitaba el uso de técnicas de generación de código e incluso la creación de compiladores sencillos en BASIC.
Ejecución
Depuración
Como en la mayoría de los BASIC, los programas se iniciaban con el RUNcomando y, como era común, se podían dirigir a un número de línea particular como RUN 300. [ 141 ] La ejecución podía detenerse en cualquier momento usando + [ 142 ] (o BREAK como en el TRS-80) y luego reiniciarse con inue ( en Integer BASIC). [ 143 ] Aprovechando las capacidades únicas de los programas interpretados (el código se procesa en tiempo real una instrucción a la vez, a diferencia de los compiladores ), el usuario en la consola podía examinar los datos de las variables usando la instrucción PRINT y cambiar dichos datos sobre la marcha, para luego reanudar la ejecución del programa.CtrlCCONTCON
Para la ejecución paso a paso, la instrucción TRON`or` TRACEpodía utilizarse en la línea de comandos o insertarse dentro del propio programa. Al activarse, se imprimían los números de línea de cada línea que visitaba el programa. Esta función podía desactivarse de nuevo con ` TROFFor` NOTRACE. [ 144 ]
Algunas implementaciones, como los intérpretes de Microsoft para los distintos modelos TRS-80, incluían el comando ON ERROR GOSUB. Esto redirigía la ejecución del programa a un número de línea específico para un manejo especial de errores.
A diferencia de la mayoría de los BASIC, Atari BASIC analizaba la línea de programa recién ingresada e informaba de los errores de sintaxis inmediatamente. Si se encontraba un error, el editor volvía a mostrar la línea, resaltando el texto cercano al error en vídeo inverso .
En muchos intérpretes, incluido Atari BASIC, los errores se muestran como códigos numéricos, con las descripciones impresas en el manual. [ 145 ] Muchos MS-BASIC usaban abreviaturas de dos caracteres (por ejemplo, SN para ERROR DE SINTAXIS). Palo Alto Tiny BASIC y Level I BASIC usaban tres palabras para los mensajes de error: "QUÉ?" para errores de sintaxis, "CÓMO?" para errores de tiempo de ejecución como GOTO a una línea que no existía o desbordamientos numéricos, y "LO SIENTO" para problemas de falta de memoria.
Análisis sintáctico
Si bien el lenguaje BASIC tiene una sintaxis simple, las expresiones matemáticas no la tienen, ya que admiten diferentes reglas de precedencia para los paréntesis y los distintos operadores matemáticos. Para admitir dichas expresiones, es necesario implementar un analizador sintáctico descendente recursivo . [ 146 ]
Este analizador sintáctico se puede implementar de varias maneras:
- Como máquina virtual, tal como se mencionó anteriormente para muchas implementaciones de Tiny BASIC. El valor de la iniciativa Tiny BASIC radicaba en especificar una implementación de un analizador sintáctico.
- Como una máquina de estados finitos , como en UIUC BASIC IUC, donde se implementó como una tabla de control . [ 147 ]
- Directamente en el código, como en Palo Alto Tiny BASIC e Integer BASIC. En Integer BASIC, el intérprete de tiempo de ejecución utilizaba dos pilas para la ejecución: una para las palabras clave de las instrucciones y otra para evaluar los parámetros. A cada instrucción se le asignaban dos prioridades: una que indicaba dónde debía aparecer en una operación de varios pasos, como una cadena de operaciones matemáticas para proporcionar el orden de las operaciones , y otra que sugería cuándo debía producirse la evaluación, por ejemplo, al calcular los valores internos de una fórmula entre paréntesis. Cuando se encontraban variables, se analizaba su nombre y se buscaba en la tabla de símbolos. Si no se encontraba, se añadía al final de la lista. La dirección del almacenamiento de la variable, posiblemente recién creada, se colocaba entonces en la pila de evaluación. [ 90 ]
Actuación
La variedad de decisiones de diseño que se tomaron al programar un intérprete de BASIC a menudo se ponía de manifiesto a través de las diferencias de rendimiento.
Las implementaciones de gestión de líneas a menudo afectaban el rendimiento y normalmente utilizaban la búsqueda lineal . En Tiny BASIC y otros, para encontrar una línea, el sistema tenía que leer cada byte del código fuente buscando un CR, que indicaba que el siguiente elemento era un número de línea. Esto significaba que el sistema tenía que leer todo el programa hasta encontrar su destino para un GOTO o GOSUB, lo que imponía una gran penalización en el rendimiento. MS-BASIC y sus muchos derivados almacenaban un puntero a la siguiente línea, de modo que si se veía que un número de línea no coincidía, podía pasar inmediatamente al siguiente. Atari BASIC utilizaba una longitud de línea de 8 bits en lugar de un puntero, ahorrando un byte. Muchas implementaciones siempre buscaban un número de línea para saltar desde el inicio del programa; MS-BASIC buscaba desde la línea actual si el número de línea de destino era mayor. Pittman añadió un parche a su Tiny BASIC para 6800 para utilizar una búsqueda binaria. [ 148 ]
Trabajar únicamente con matemáticas de enteros proporciona otro gran aumento de velocidad. Como muchos benchmarks de computadoras de la época eran pequeños y a menudo realizaban matemáticas simples que no requerían punto flotante, Integer BASIC superó a la mayoría de los otros BASIC. [ e ] En uno de los primeros benchmarks de microcomputadoras conocidos, los benchmarks Rugg/Feldman , Integer BASIC fue más del doble de rápido que Applesoft BASIC en la misma máquina. [ 150 ] En Byte Sieve , donde las matemáticas eran menos importantes pero el acceso a matrices y el rendimiento de bucles dominaban, Integer BASIC tardó 166 segundos mientras que Applesoft tardó 200. [ 151 ] No apareció en Creative Computing Benchmark , que se publicó por primera vez en 1983, momento en el que Integer BASIC ya no se suministraba por defecto. [ 152 ] La siguiente serie de pruebas, tomadas de ambos artículos originales de Rugg/Feldman, [ 150 ] [ 149 ] muestran el rendimiento de Integer en relación con BASIC derivado de MS en la misma plataforma.
MS-BASIC solo convertía los números de línea y un conjunto de palabras clave en tokens, un proceso que denominaban "procesamiento". Esto significaba que elementos como los números de línea en las instrucciones GOTO se mantenían en formato ASCII y debían reconvertirse cada vez que se encontraban. En contraste, varios intérpretes convertían todo al formato de tiempo de ejecución, como Atari BASIC y Sinclair BASIC. En teoría, esto aceleraría enormemente el rendimiento en comparación con los intérpretes de estilo MS, ya que muchos bits del programa que serían ASCII puro no tenían que analizarse en tiempo de ejecución. Sin embargo, en general, estos dialectos solían ser mucho más lentos por diversas razones. Por ejemplo, en dos pruebas de rendimiento ampliamente utilizadas en la época, la Sieve of Eratosthenes de la revista Byte y la prueba de rendimiento de Creative Computing escrita por David H. Ahl , Atari terminó casi al final de la lista en términos de rendimiento y fue mucho más lento que el Apple II o el Commodore PET contemporáneos . [ 153 ]
Véase también
Notas
- ↑ Microsoft BASIC dejaba 780 bytes libres para el código del programa de usuario y los valores de las variables en una máquina de 4 KB, y eso que se trataba de una versión reducida que carecía de variables de cadena y otras funcionalidades.
- ↑ Nótese la extraña sintaxis del SCRN, que técnicamente es una función porque devuelve un valor, pero no utiliza una sintaxis similar a la de una función, que sería
A=SCRN(X,Y). - ↑ El manual sugiere, pero no afirma explícitamente, que el rango real de valores es menor que 0 a 255. [ 133 ]
- ↑ El número negativo es un efecto secundario de que los enteros se almacenen en formato con signo, por lo que cualquier ubicación de memoria superior a 32767 aparecía como un valor negativo en BASIC. [ 134 ]
- ↑ Bill Gates se quejó de esto, afirmando que era injusto comparar Integer BASIC con un BASIC "real" como MS. [ 149 ]
Referencias
- ↑ "IBM contra el mundo: así son las cosas" . Computerworld . 5 de diciembre de 1973.
- ↑ "Descripción del procesador Hewlett-Packard 2100, 1972" (PDF) . Consultado el 18 de agosto de 2020 .
- ↑ "¿Podemos obtener una cronología completa del sistema operativo IRIS para Data General Novas?" . Consultado el 5 de agosto de 2020 .
- ↑ Savetz, Kevin (abril de 2013). "Dave Ahl y Betsy Ah" (Entrevista).
- ↑ "Ordenadores antiguos: HP-9830A" . Consultado el 18 de agosto de 2020 .
- ↑ Un intérprete de lenguaje BASIC para el microprocesador Intel 8008. Departamento de Ciencias de la Computación, Universidad de Illinois en Urbana-Champaign (publicado en 1974). Junio de 1974.
- ↑ "Tenemos un BASIC" . Museo de Historia Natural y Ciencia de Nuevo México . Archivado del original el 30 de noviembre de 2012. Recuperado el 18 de abril de 2007 .
- ↑ Fisk, Nathan (2009). Comprender la piratería en línea . ABC-CLIO. pág. 14. ISBN 9780313354748.
- ↑ Hertzfeld 1985 .
- ↑ Pittman, Tom. "Tenías que pagar 5 dólares por adelantado para conseguirlo..." . www.ittybittycomputers.com . Consultado el 14 de junio de 2017 .
- ↑ Arnold, Mark; Wadsworth, Nat (febrero de 1976a). "SCELBAL: un lenguaje de alto nivel para sistemas 8008/8080" . Dr. Dobb's Journal . Vol. 1. págs. 30–34 .
- ↑ "Parte 1 del intérprete BASIC LLL 8080" (PDF) .
- ↑ Lorenzo 2017 , pág. 118.
- ↑ Curran, Lawrence J.; Shuford, Richard S. (noviembre de 1983). "Estridge de IBM" . BYTE . págs. 88–97 . Recuperado el 19 de marzo de 2016 .
- ↑ Wilkinson 1982 , págs. iv–v.
- ↑ Cromemco 1978 .
- ↑ Wilkinson 1982 , pág. ix.
- ↑ Wilkinson 1982 , p. v.
- ↑ "Procesador de vídeo para ordenador Acorn/BBC" . BBC News . Consultado el 30 de noviembre de 2010 .
- ↑ "BBC Micro reaviva recuerdos de revolución" . BBC News . 21 de marzo de 2008. Consultado el 30 de noviembre de 2010 .
- ↑ "ECN - Julio/Agosto de 1985" . Archivado del original el 7 de marzo de 2018. Consultado el 4 de agosto de 2020 .
- ↑ Smith, Tony (12 de febrero de 2014). "No estás despedido: La historia del increíble CPC 464 de Amstrad" . The Register . Consultado el 17 de febrero de 2014 .
- ↑ Lien, David (1981). The BASIC Handbook (Segunda edición). San Diego, CA: Compusoft Publishing. p. contraportada. ISBN 0-932760-00-7.
- ↑ Lorenzo 2017 , pág. 83.
- ↑ Gates, Bill . "Entrevista a Bill Gates" . Museo Nacional de Historia Americana, Instituto Smithsonian (Entrevista). Entrevistado por David Allison . Consultado el 10 de abril de 2013 .
- ↑ Malloy, Rich (mayo de 1983). "Little Big Computer / The TRS-80 Model 100 Portable Computer" . BYTE . pág. 14. Consultado el 19 de octubre de 2013 .
- ↑ Lorenzo 2017 , pág. 122.
- ↑ Williams, Gregg (febrero de 1984). "El ordenador Apple Macintosh". BYTE . pág. 30.
- ↑ "Mac GUI :: Re: Re: MAC Basic vs MS Basic?" . macgui.com . Consultado el 23 de enero de 2015 .
- ↑ Manes, Stephen; Andrews, Paul (21 de enero de 1994). Gates: Cómo el magnate de Microsoft reinventó una industria y se convirtió en el hombre más rico de Estados Unidos: Stephen Manes, Paul Andrews: 9780671880743: Amazon.com: Libros . Touchstone. ISBN 0671880748.
- ↑ Entrevista a Bill Atkinson en el programa de televisión Triangulation de la cadena TWiT.tv.
- ↑ "¿Era Family BASIC para NES/Famicom lo suficientemente potente como para crear juegos y aplicaciones completas?" . Consultado el 27 de agosto de 2020 .
- ↑ Thomas, Neil (19 ago. 2019). "STOS & Amos - Francois Lionet | Retro Tea Break" . YouTube . Recuperado el 11 mar . 2020 .
- ↑ Plant, Robert T.; Murrell, Stephen (2007). Guía para ejecutivos sobre tecnología de la información . Cambridge University Press . pág . 343. ISBN 978-0-521-85336-1
Resumen de aspectos positivos: Visual Basic es fácil de aprender y está ampliamente disponible
. - ↑ " La historia de Visual Basic" . www.johnsmiley.com
- ↑ Frank Wieduwilt (octubre de 2008). "Programación con el IDE Gambas Basic" . Linux Pro Magazine . Consultado el 10 de diciembre de 2011 .
- ↑ "Acerca de los creadores del juego - TheGameCreators" .
- ↑ "Descarga básica pequeña" . 19 de noviembre de 2018. Consultado el 7 de septiembre de 2020 .
- 1 2 Chailloux, Emmanuel; Manoury, Pascal; Pagano, Bruno (2002). Desarrollo de aplicaciones con Objective Caml . Francia: O'Reilly. ISBN 2841771210.
- ↑ Price, Ed (29 de abril de 2014). "Small Basic Curriculum" . TechNet . Microsoft . Recuperado el 9 de febrero de 2014 .
- ↑ Price, Ed; Takahashi, Nonki (25 de febrero de 2014). "Guía básica de inicio rápido" . TechNet . Microsoft . Consultado el 12 de febrero de 2015 .
- ↑ "Small Basic" . Consultado el 6 de septiembre de 2020 .
- ↑ Price, Ed (22 de octubre de 2012). "Las características únicas de Small Basic" . Small Basic . TechNet. Microsoft. Archivado del original el 28 de abril de 2015. Recuperado el 22 de abril de 2015 .
- ↑ Price, Ed (8 de octubre de 2012). "¿Cuáles son las 14 palabras clave de Small Basic?" . Small Basic . Blogs de MSDN. Microsoft . Consultado el 9 de febrero de 2014 .
- ↑ "Anuncio de Small Basic Online 1.0 – Vista previa pública" . 20 de febrero de 2019.
- ↑ "Microsoft Small Basic Online v1.0 (CS): Guía de instalación" . Microsoft TechNet . Consultado el 8 de enero de 2022 .
- ↑ "Colaboradores de robinhedwards/ArduinoBASIC" . GitHub .
- ↑ "BleuLlama/TinyBasicPlus: Implementación AC de Tiny Basic, con énfasis en el soporte para Arduino" . GitHub . Consultado el 11 de septiembre de 2020 .
- ↑ "Vintage BASIC" . Consultado el 11 de septiembre de 2020 .
- ↑ Ensmenger, Nathan (2010). The Computer Boys Take Over . MIT Press. pág. 55. ISBN 978-0-262-05093-7.
- ↑ Wozniak 2014 .
- ↑ Manual del lenguaje BASIC-PLUS (PDF). Maynard, Massachusetts: Digital Equipment Corporation. 1972. págs. 3–13 .
- ↑ Lorenzo 2017 , pág. 106.
- ↑ Allison, Dennis (julio de 1976). "Notas de diseño para TINY BASIC" . SIGPLAN Notices . 11 (7). ACM: 25–33 . doi : 10.1145/987491.987494 . S2CID 18819472 . El Grupo de Interés Especial en Lenguajes de Programación (SIGPLAN) de la ACM reimprimió las notas de diseño de Tiny Basic publicadas en la revista Tiny BASIC de enero de 1976.
- ↑ Allison, Dennis (1976). "Construye tu propio BASIC" . Dr. Dobb's Journal . Vol. 1, n.º 1, pág. 9.
- ↑ Allison, Dennis (1976). "Guía de referencia rápida para Tiny BASIC" . Dr. Dobb's Journal . Vol. 1, n.º 1, pág. 6.
- ↑ "ZX80 – ACTUALIZACIÓN DE ROM BASIC 8K" .
- 1 2 Un intérprete de lenguaje BASIC para el microprocesador Intel 8008. Departamento de Ciencias de la Computación, Universidad de Illinois en Urbana-Champaign (publicado en 1974). Junio de 1974. págs. 16–19 .
- ↑ "Hoja de código TB". Revista de ejercicios informáticos y ortodoncia del Dr. Dobb, Running Light Without Overbyte . 1 (1). Diciembre de 1975.
- ↑ «Micro Básico de Robert Uiterwyk» .
- ↑ Weyhrich 2001 , El BASIC [Integer], que distribuimos con los primeros Apple II, nunca fue ensamblado , jamás. Había una copia manuscrita, todo escrito a mano, todo ensamblado a mano.
- ↑ Wozniak 2018 .
- ↑ Wallace, James; Jim Erickson (1992). Disco duro: Bill Gates y la creación del imperio Microsoft . John Wiley & Sons. págs. 81–83 . ISBN 0-471-56886-4.
- ↑ Gates, Bill (enero de 1976). "Una carta abierta a los aficionados" . Boletín del Homebrew Computer Club . 2 (1). Mountain View, California: Homebrew Computer Club: 2.
- ↑ "Tenemos un BASIC" . Museo de Historia Natural y Ciencia de Nuevo México. Archivado del original el 23 de marzo de 2012. Consultado el 18 de abril de 2007 .
- ↑ Wallace, James; Jim Erickson (1992). Disco duro: Bill Gates y la creación del imperio Microsoft . John Wiley & Sons. pág . 78. ISBN 0-471-56886-4.
- ↑ "XBASIC -- Un intérprete conversacional de BASIC" . GitHub . Consultado el 7 de septiembre de 2020 .
- ↑ Lennart Benschop (8 de marzo de 2002). «Intérprete BÁSICO Versión 1.22» . Consultado el 23 de septiembre de 2020 .
- ↑ Wilkinson, O'Brien y Laughton 1983 .
- ↑ "¿Los operadores en línea de BASIC-PLUS realmente tienen sentido?" . Consultado el 5 de agosto de 2020 .
- ↑ Allen, Dennis. "TINY BASIC". People's Computer Company . Vol. 4, n.º 3.
- ↑ Greening, Bernard (1976). "Corrección de Tiny BASIC IL" . Dr. Dobb's Journal . Vol. 1, n.º 1, pág. 12.
- ↑ Veit, Holger. "El pequeño BASIC 6800 de Tom Pittman" . Consultado el 2 de mayo de 2017 .
- ↑ Nouspikel, Thierry. "GPL: Graphic Programming Language" . Consultado el 2 de agosto de 2020 .
- ↑ "Crecí y aprendí BASIC en una TI-99/4a. Fue una época maravillosa y sencilla..." Hacker News . Consultado el 2 de agosto de 2020 .
- ↑ Wozniak 1977 , pág. 43.
- ↑ Ayuda para programadores de Apple (PDF) . Apple. 1978.
- ↑ Raskin 1978 , pág. 11.
- ↑ Raskin 1978 , pág. 46.
- ↑ Raskin 1978 , págs. 49–55.
- ↑ Raskin 1978 , págs. 65–67.
- ↑ "Tiny BASIC Extended". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte . 1 (2). Febrero de 1976.
- ↑ "Denver Tiny BASIC". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte . 1 (3). Marzo de 1976.
- 1 2 "MINOL". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte . 1 (4). Abril de 1976.
- 1 2 Rauskolb, Roger (diciembre de 1976). "Dr. Wang's Palo Alto Tiny BASIC" (PDF) . Interface Age . págs. 92–108 .
- ↑ Allison, Dennis (enero de 1976). "Notas de diseño para Tiny BASIC" . Dr. Dobb's Journal . Vol. 1, n.º 1, pág. 9.
- ↑ Allison, Dennis (enero de 1976). "Construye tu propio BASIC" . Dr. Dobb's Journal . Vol. 1, n.º 1, pág. 8.
- ↑ Steil, Michael (13 de enero de 2015). "Código fuente original de Microsoft BASIC para 6502" .
- ↑ Hardiman, Roger. "Altair BASIC 3.2 (4K) – Desensamblaje anotado" . pág. 1.11. Archivado del original el 5 de noviembre de 2001.
- 1 2 3 Wozniak 1977 , pág. 42.
- ↑ Paul R. Santa-Maria. "Desensamblaje de Integer Basic de Apple II" (PDF) . Consultado el 14 de septiembre de 2020 .
- ↑ Wilkinson, O'Brien y Laughton 1983 , pág. 5.
- ↑ Vickers 1983 , págs. 7–8.
- 1 2 "El intérprete BASIC - Explicado" . Consultado el 15 de septiembre de 2020 .
- ↑ "Parte 1 del intérprete BASIC LLL 8080" (PDF) .
- ↑ Raskin 1978 , pág. 118.
- ↑ Wang, Li-Chen (mayo de 1976). "Palo Alto Tiny BASIC". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte . 1 (5): 12– 25.
- ↑ Raskin 1978 , pág. 38.
- ↑ "Parte 1 del intérprete BASIC LLL 8080" (PDF) .
- ↑ "Parte 1 del intérprete BASIC LLL 8080" (PDF) .
- ↑ "¿Cuál es la referencia más antigua a PEEK, POKE y USR?" . Consultado el 15 de agosto de 2020 .
- ↑ Manual de referencia de BASIC para Altair 8800 (1975) , página 68 del PDF: "Mediante la función PEEK y la instrucción OUT de BASIC 8K, el usuario puede escribir un programa de volcado binario en BASIC. Con INP y POKE es posible escribir un cargador binario. PEEK y POKE se pueden usar para almacenar información orientada a bytes. Al inicializar BASIC, responda a la pregunta ¿TAMAÑO DE MEMORIA? con la cantidad de memoria de su ALTAIR menos la cantidad de memoria que desea usar para almacenar datos con formato de byte."
- ↑ Raskin 1978 , pág. 27.
- ↑ «BÁSICO de Robert Uiterwyk» .
- ↑ Welsh, David; Welsh, Theresa (2007). Priming the Pump: How TRS-80 Enthusiasts Helped Spark the PC Revolution . p. 7.
- ↑ Reed, Matthew. "Nivel I BÁSICO" . TRS-80.org . Consultado el 27 de agosto de 2017 .
- ↑ Arnold y Wadsworth 1976 , pág. 10.1.
- ↑ Arnold y Wadsworth 1976 , Capítulo 10.
- ↑ "Rutinas de punto flotante para el 6502". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte . 1 (7). Agosto de 1976.
- ↑ "Parte 1 del intérprete BASIC LLL 8080" (PDF) .
- ↑ Un intérprete de lenguaje BASIC para el microprocesador Intel 8008. Departamento de Ciencias de la Computación, Universidad de Illinois en Urbana-Champaign (publicado en 1974). Junio de 1974. pág. 20.
- ↑ "Documentos GE-2xx" . www.bitsavers.org . CPB-267_GE-235-SystemManual_1963.pdf , pág. IV-4.
- ↑ Lorenzo 2017 , pág. 149.
- ↑ Steil, Michael (20 de octubre de 2008). "Crea tu propia versión de Microsoft BASIC para 6502" .
- ↑ Raskin 1978 , pág. 61.
- ↑ MITS Altair BASIC . Albuquerque, NM: MITS. 1975. pág. 37.
- ↑ Lien, David (1986). Manual básico (Tercera ed.). San Diego, CA: Compusoft. pág. 589. ISBN 0-932760-33-3.
- ↑ Raskin 1978 , pág. 94.
- ↑ MITS Altair BASIC . Albuquerque, NM: MITS. 1975. pág. 31.
- 1 2 3 Manual de referencia de HP 2000/Access BASIC (PDF) . Hewlett Packard. Mayo de 1976., Número de pieza 22687-90001
- ↑ North Star BASIC versión 6 (PDF) . North Star Corporation. 1977. Archivado del original (PDF) el 5 de marzo de 2020. Consultado el 1 de agosto de 2020 .
- ↑ Manual de referencia de ATARI BASIC . Atari Inc. 1980. Archivado del original el 1 de mayo de 2005. Consultado el 1 de agosto de 2020 .
- ↑ "Variables enteras, de punto flotante y de cadena". Manual del programador de C64 . Commodore. Marzo de 2020.
- ↑ Raskin 1978 , pág. 89.
- ↑ "Crea tu propia versión de Microsoft BASIC" .
- ↑ Lien, David (1977). Manual del usuario para el nivel I (Primera ed.). Fort Worth, TX: Tandy Corporation. pp. 105–108 , 137. Recuperado el 9 de agosto de 2020 .
- ↑ Raskin 1978 , pág. 31.
- ↑ Raskin 1978 , pág. 32.
- ↑ Raskin 1978 , pág. 33.
- 1 2 Raskin 1978 , pág. 120.
- ↑ Lorenzo 2017 , pág. 120.
- ↑ "¿Algunos intérpretes de BASIC para microcomputadoras podrían considerarse sistemas operativos?" . Consultado el 7 de agosto de 2020 .
- 1 2 Raskin 1978 , pág. 36.
- ↑ Mini 1977 , pág. 18.
- ↑ "NIBL". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte . 1 (10). Noviembre de 1976.
- ↑ "Problemas con BASIC". Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte . 1 (2). Febrero de 1976.
- ↑ "Diferencias entre GW-BASIC y QBasic" . 12 de mayo de 2003. Archivado del original el 19 de octubre de 2013. Consultado el 28 de junio de 2008 .
- ↑ Lorenzo 2017 , pág. 137.
- ↑ Helmers 1978 , pág. 18.
- ↑ Weyhrich 2001 .
- ↑ Raskin 1978 , pág. 100.
- ↑ Raskin 1978 , pág. 15.
- ↑ Raskin 1978 , pág. 52.
- ↑ Raskin 1978 , pág. 107.
- ↑ Manual 1980 , Apéndice B.
- ↑ "¿Qué tipo de intérprete utilizaban la mayoría de las implementaciones de BASIC de 8 bits?" . Consultado el 9 de agosto de 2020 .
- ↑ Un intérprete de lenguaje BASIC para el microprocesador Intel 8008 (PDF) . Departamento de Ciencias de la Computación, Universidad de Illinois en Urbana-Champaign (publicado en 1974). Junio de 1974. págs. 24–36 .
- ↑ Pittman, Tom (1981). "The First Book of Tiny BASIC Programs" . Retrotechnology.com . Itty Bitty Computers . Recuperado el 5 de agosto de 2020. Debido
a que TA es tan grande (19.703 bytes), descubrí que la ejecución se volvía extremadamente lenta, simplemente debido al escaneo de memoria para GOTO, GOSUB y RETURN. Un parche simple al intérprete lo convierte en un
algoritmo de búsqueda binaria
, para una aceleración de aproximadamente un orden de magnitud en el tiempo de ejecución. Los cambios necesarios se enumeran en el Apéndice.
- 1 2 Rugg, Tom; Feldman, Phil (octubre de 1977). "Comparaciones de sincronización BÁSICAS... revisadas y actualizadas" . Kilobaud . págs. 20-25 .
- 1 2 Rugg, Tom; Feldman, Phil (junio de 1977). "Comparaciones básicas de sincronización... información para fanáticos de la velocidad" . Kilobaud . págs. 66-70 .
- ↑ Gilbreath, Jim (septiembre de 1981). "Un referente para lenguajes de alto nivel" . Byte . pág. 192.
- ↑ Ahl, David (noviembre de 1983). "Prueba de comparación de referencia" . Creative Computing . pág. 260.
- ↑ Ahl, David (noviembre de 1983). "Prueba de comparación de referencia" . Creative Computing . págs. 259–260 .
Bibliografía
- Manual del Apple II Mini . Apple. 1977.
- Arnold, Mark; Wadsworth, Nat (1976). SCELBAL: Un lenguaje de alto nivel para sistemas 8008/8080 (PDF) . SCELBI Computer Consulting.
- Manual de referencia de ATARI BASIC . Atari Inc. 1980. Archivado del original el 1 de mayo de 2005.
- Crawford, Chris (1982). De Re Atari . Intercambio de programas de Atari.
- Cromemco 16K Extended BASIC (PDF) . Cromemco. 1978.
- Helmers, Carl (marzo de 1978). "Una manzana para bytear" . Byte . págs. 18–24 , 30–32 , 35, 40–46 .
- Hertzfeld, Andy (junio de 1985). "La triste historia de MacBasic" . Folklore .
- Lorenzo, Mark (2017). Bucle infinito: La historia del lenguaje de programación BASIC . Filadelfia: SE Books. ISBN 978-1974-27707-0.
- Raskin, Jef (1978). Manual de programación BASIC para Apple II (PDF) . Apple Computer.
- Vickers, Steven (1983). Programación BASIC para Sinclair ZX Spectrum (2.ª ed.). Sinclair Research.
- Weyhrich, Steven (12 de diciembre de 2001). "Historia parte 3: El Apple II" . Recuperado el 16 de septiembre de 2007 .
- Wilkinson, Bill (1982). Inside Atari DOS . Optimized Systems Software, Inc. ISBN 0-942386-02-7. Consultado el 4 de abril de 2009 .
- Wilkinson, Bill (febrero de 1985). "INSIGHT: Atari" . Creative Computing . págs. 139–140 .
- Wilkinson, Bill; O'Brien, Kathleen; Laughton, Paul (1983). The Atari BASIC Source Book . Compute! Books. ISBN 0-942386-15-9.
- Williams, Gregg; Moore, Rob (diciembre de 1984). "La historia de Apple / Parte 1: Historia temprana" . Byte . págs. A67– A71 . Recuperado el 23 de octubre de 2013 .
- Wozniak, Steven (mayo de 1977). "Descripción del sistema / El Apple-II" . Byte . págs. 34–43 .
- Wozniak, Steven (1 de mayo de 2014). "Cómo Steve Wozniak escribió BASIC para el Apple original desde cero" . Gizmodo .
- Wozniak, Steven (3 de enero de 2018). "Apple BASIC" . Woz.org .
Lecturas adicionales
Código fuente y documentos de diseño, en orden cronológico de publicación de las implementaciones de BASIC:
- Weaver, Alfred; Tindall, Michael; Danielson, Ronald (junio de 1974). Un intérprete de lenguaje BASIC para el microprocesador Intel 8008. Departamento de Ciencias de la Computación, Universidad de Illinois en Urbana-Champaign (publicado en 1974).
- Arnold, Mark (1977). Suplemento de funciones matemáticas de SCELBAL . SCELBI Computer Consulting.
- Arnold, Mark (1977). Suplemento de cadenas de SCELBAL . SCELBI Computer Consulting.
- "Altair BASIC 3.2 (4K) - Desensamblaje anotado" .
- Revista de Calistenia Computacional y Ortodoncia del Dr. Dobb, Volumen 1. People's Computer Company. 1976.
- Rauskolb, Roger (diciembre de 1976). "El Tiny BASIC de Palo Alto del Dr. Wang" (PDF) . Interface Age . págs. 92–108 .
- Pittman, Tom (1977). Kit de experimentación Tiny BASIC .
- Santa-Maria, Paul. "Desensamblaje de Integer Basic para Apple II" (PDF) .
- Intérpretes BÁSICOS
- Software para microcomputadoras