Diseñado por | Dennis Allison |
---|---|
Apareció por primera vez | 1975 |
Lenguaje de implementación | IL (lenguaje interpretativo) |
Licencia | Dominio público |
Dialectos | |
Denver Tiny BASIC, Enhanced 6800 Tiny BASIC, MINOL, Lenguaje básico industrial nacional, Palo Alto Tiny BASIC, 6800 Tiny BASIC, TBI68K, Tiny BASIC extendido | |
Influenciado por | |
Dartmouth BÁSICO , 8008 BÁSICO | |
Influenciado | |
Astro BASIC , Atari BASIC , Nivel I BASIC |
Tiny BASIC es una familia de dialectos del lenguaje de programación BASIC que pueden caber en 4 KB o menos de memoria . Tiny BASIC fue diseñado por Dennis Allison y la People's Computer Company (PCC) en respuesta a la carta abierta publicada por Bill Gates en la que se quejaba de que los usuarios pirateaban Altair BASIC , que se vendía por 150 dólares. Tiny BASIC estaba destinado a ser una versión completamente libre de BASIC que se ejecutaría en los mismos microordenadores iniciales .
Tiny BASIC se publicó como una especificación, no como una implementación, en la edición de septiembre de 1975 del boletín PCC. El artículo invitaba a los programadores a implementarlo en sus máquinas y enviar la implementación en lenguaje ensamblador resultante para su inclusión en una serie de tres boletines planificados. Li-Chen Wang , autor de Palo Alto Tiny BASIC, acuñó el término " copyleft " para describir este concepto. La respuesta de la comunidad fue tan abrumadora que el boletín se relanzó como Dr. Dobb's Journal , la primera publicación periódica regular centrada en el software de microcomputadoras. Dr. Dobb's duró en forma impresa durante 34 años y luego en línea hasta 2014, cuando su sitio web se convirtió en un archivo estático.
El pequeño tamaño y el código fuente gratuito hicieron que estas implementaciones fueran invaluables en los primeros días de las microcomputadoras a mediados de la década de 1970, cuando la RAM era cara y el tamaño típico de la memoria era de solo 4 a 8 KB. Si bien la versión mínima de Altair BASIC de Microsoft también se ejecutaba en máquinas de 4 KB, dejaba solo 790 bytes libres para los programas BASIC. Más espacio libre era una ventaja significativa de Tiny BASIC. Para cumplir con estos estrictos límites de tamaño, los dialectos de Tiny BASIC generalmente carecían de una variedad de características que se encuentran comúnmente en otros dialectos, por ejemplo, la mayoría de las versiones carecían de variables de cadena , carecían de matemáticas de punto flotante y solo permitían nombres de variable de una sola letra.
Hoy en día todavía se utilizan pequeñas implementaciones de BASIC para programar microcontroladores como el Arduino .
Los primeros microordenadores , como el MITS Altair 8800 , no tenían por lo general ninguna entrada/salida (E/S) integrada más allá de los interruptores del panel frontal y las lámparas LED . Para que fuera útil, generalmente se requería la adición de una tarjeta de expansión de E/S y el uso de algún tipo de terminal . En aquella época, los terminales basados en vídeo eran muy caros, costaban mucho más que el ordenador, por lo que muchos usuarios recurrían a dispositivos mecánicos como el teletipo modelo 33. El modelo 33, como la mayoría de los teletipos de la época, incluía un sistema de perforación de cinta destinado a permitir a los operadores grabar previamente sus mensajes y luego reproducirlos a "alta velocidad", más rápido de lo que la mayoría de las personas podían escribir el mensaje en vivo. Para los primeros microordenadores, esto proporcionaba un formato de almacenamiento de datos informáticos conveniente , que permitía a los usuarios escribir programas en cinta de papel y distribuirlos a otros usuarios. [1]
El Homebrew Computer Club se reunió por primera vez en marzo de 1975, y sus miembros pronto utilizaron las reuniones para intercambiar software en cintas perforadas. En la reunión de junio, desapareció una cinta que contenía una versión pre-lanzada de Altair BASIC . La cinta fue entregada a Steve Dompier, quien se la pasó a Dan Sokol, quien tenía acceso a una perforadora de cinta de alta velocidad. En la siguiente reunión, aparecieron 50 copias de Altair BASIC en cinta de papel en una caja de cartón. [2] Cuando Ed Roberts , fundador de MITS, se enteró de esto, declaró: "Cualquiera que esté usando una copia robada de MITS BASIC debería identificarse como lo que es, un ladrón". [3] Bill Gates lo hizo más formal, escribiendo " Una carta abierta a los aficionados ", quejándose de que "Como la mayoría de los aficionados deben saber, la mayoría de ustedes roban su software". [4]
La queja no fue bien recibida. Entre las muchas respuestas, Bob Albrecht, otro miembro de Homebrew y fundador de People's Computer Company (PCC), sintió que la mejor respuesta sería producir su propio BASIC que fuera completamente libre de usar por cualquiera. Se acercó a Dennis Allison , un miembro de la facultad de Ciencias de la Computación de la Universidad de Stanford , para escribir una especificación para una versión de BASIC que cupiera en 2 a 3 kilobytes de memoria. [a] Para ayudar a la portabilidad , el diseño se basó en un lenguaje intermedio (IL), un intérprete para el intérprete, lo que significaba que solo una pequeña parte del código total tenía que ser portado.
El diseño inicial de Allison fue publicado en la edición de septiembre de 1975 del boletín del PCC, junto con una versión Intel 8080 del intérprete IL. El artículo instaba a los programadores a implementar el diseño en su ordenador y enviar la versión resultante en lenguaje ensamblador al PCC. Expresaron sus planes de publicar tres boletines especiales que contuvieran estas versiones enviadas por los usuarios, junto con correcciones de errores, programas escritos en el nuevo BASIC y sugerencias y mejoras. El concepto ganó más notoriedad cuando fue republicado en la edición de enero de 1976 del Grupo de Interés Especial sobre Lenguajes de Programación de la ACM . [5] Las propuestas llegaron en masa. Entre las primeras versiones notables estaba Tiny BASIC Extended de Dick Whipple y John Arnold, que se ejecutaba en 3K de RAM, añadía bucles FOR...NXT y permitía una única matriz numérica. Evitaron el uso del IL y lo escribieron directamente en código de máquina, utilizando octal . [6]
El primero de los tres boletines planeados, con el título "Dr. Dobb's Journal of Computer Calisthenics & Orthodontia, Running Light Without Overbyte", se publicó en enero de 1976. [6] Comienza con una nota de Albrecht, bajo el seudónimo "the dragon", sugiriendo que tres ediciones no serían suficientes y preguntando a los lectores si les gustaría que continuara. También reimprimió el artículo original sobre Tiny BASIC de PCC, incluyó la lista completa de Extended TB e incluyó una serie de pequeños programas BASIC que incluían consejos y trucos de Allison. [7] La respuesta al primer número fue tan impresionante que la introducción al segundo número decía que ya habían decidido continuar publicando el nuevo boletín bajo el nombre simplificado Dr. Dobb's Journal . Durante los siguientes números, se publicaron versiones adicionales del lenguaje y comenzaron a aparecer artículos similares en otras revistas como Interface Age .
A mediados de 1976, los intérpretes Tiny BASIC estaban disponibles para los procesadores Intel 8080 , Motorola 6800 y MOS Technology 6502. Este fue un precursor del desarrollo colaborativo de la comunidad de software libre antes de que Internet permitiera una transferencia fácil de archivos, y fue un ejemplo de un proyecto de software libre antes del movimiento del software libre . [9] Los aficionados a las computadoras intercambiaban cintas de papel, casetes o incluso reescribían los archivos de las listas impresas. [10]
Jim Warren, editor de Dr. Dobb's , escribió en el boletín de ACM Programming Language de julio de 1976 sobre las motivaciones y los métodos de este exitoso proyecto. Empezó diciendo: "Hay una alternativa viable a los problemas planteados por Bill Gates en su furiosa carta a los aficionados a la informática sobre el 'robo' de software. Cuando el software es gratuito, o tan barato que es más fácil pagar por él que duplicarlo, entonces no será 'robado'". La carta de Bill Gates se escribió para convertir el software en productos . El método alternativo era que un profesional experimentado hiciera el diseño general y luego esbozara una estrategia de implementación. Los aficionados expertos implementarían el diseño para una variedad de sistemas informáticos. Warren predijo que esta estrategia continuaría y se expandiría. [10]
El número de mayo de 1976 de Dr. Dobbs tiene el Palo Alto Tiny BASIC de Li-Chen Wang para el 8080. La lista comienza con el título, el nombre del autor y la fecha, pero también tiene "@ COPYLEFT ALL WRONGS RESERVED". [11] Un miembro del Homebrew Computer Club , Roger Rauskolb, modificó y mejoró el programa de Wang y esto se publicó en el número de diciembre de 1976 de la revista Interface Age . [8] Roger agregó su nombre y conservó el Aviso de COPYLEFT.
El diminuto BASIC fue diseñado para utilizar la menor cantidad de memoria posible, y esto se refleja en la escasez de características y detalles de su sistema de interpretación . Los primeros microordenadores carecían de RAM y almacenamiento secundario para un compilador BASIC , lo que era más típico de los sistemas de tiempo compartido.
Como la mayoría de los BASIC de la época, Tiny Basic era interactivo, ya que el usuario tecleaba instrucciones en una línea de comandos. Como las microcomputadoras de la época se utilizaban a menudo con máquinas de teletipo o terminales "tontas", no era posible editar directamente el texto existente y, en su lugar, el editor utilizaba caracteres de eliminación, a menudo la barra invertida, para indicar dónde retrocedía el usuario para editar el texto existente.
Si el usuario escribía una instrucción en la línea de comandos, el sistema la examinaba para ver si comenzaba con un número. Si no era así, la línea se analizaba y se operaba inmediatamente, generando potencialmente una salida a través de PRINT
. Esto se conocía como "modo directo".
Si la línea se ingresaba con un número inicial, el número se convertía del formato decimal, como "50", a un valor de 8 bits, en este caso, $32
hexadecimal . Este número se usaba como índice en un área de almacenamiento similar a una matriz donde el resto de la línea se almacenaba exactamente en el formato en el que se escribía. Cuando el usuario escribía LIST
en la línea de comandos, el sistema recorría la matriz, convertía el número de línea nuevamente a formato decimal y luego imprimía el resto del texto en la línea.
Cuando un programa estaba presente en la memoria y el usuario teclea el RUN
comando, el sistema entra en "modo indirecto". En este modo, se establece un puntero para que apunte a la primera línea del programa, por ejemplo, 10 ( $0A hex ). El texto original de esa línea se recupera del almacén y se ejecuta como si el usuario lo acabara de teclear en modo directo. Luego, el puntero avanza a la siguiente línea y el proceso continúa.
La gramática se enumera a continuación en la forma Backus–Naur , casi exactamente como se especificó en la Nota de diseño. [12] 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 la cadena vacía. Como es común en la notación de gramática del lenguaje de computadora, la barra vertical (" |
") distingue las alternativas, al igual que su inclusión en líneas separadas. El símbolo " CR
" denota un retorno de carro (generalmente generado por la tecla "Enter" de un teclado). Un BREAK desde la consola interrumpirá la ejecución del programa.
línea :: = número declaración CR | declaración CR declaración :: = PRINT lista-expr IF expresión relop expresión THEN declaración GOTO expresión INPUT lista-var LET var = expresión GOSUB expresión RETURN CLEAR LIST RUN END lista-expr :: = ( cadena | expresión ) ( , ( cadena | expresión ) ) * lista-var :: = var ( , var ) * expresión :: = ( +|-|ε ) término (( +|- ) término ) * término :: = factor (( * | / ) factor ) * factor :: = var | número | ( expresión ) var :: = A | B | C ... | Y | Z número :: = dígito dígito * dígito :: = 0 | 1 | 2 | 3 | ... | 8 | 9 relop :: = < ( >| = |ε ) | > ( <| = |ε ) | = cadena :: = " ( |!|#|$ ... -|.|/|dígito|: ... @|A|B|C ... |X|Y|Z)* "
Tenga en cuenta que la cadena no se definió en la nota de diseño.
Esta sintaxis, tan simple como era, agregó una innovación: GOTO
y GOSUB
podía tomar una expresión en lugar de solo un número de línea, proporcionando un GOTO asignado [13] en lugar de la declaración switch de GOTO/GOSUB ... OF ...
, una estructura que entonces era compatible con HP Time-Shared BASIC y anterior a ON ... GOTO
. La sintaxis que permitía IF-THEN statement
(en lugar de solo un número de línea a la cual ramificarse) aún no era compatible con Dartmouth BASIC en ese momento, pero había sido introducida por Digital [14] y copiada por Microsoft.
La nota de diseño especificaba una máquina virtual , en la que el intérprete Tiny BASIC se ejecutaba a su vez en un intérprete de máquina virtual. La idea del diseñador de utilizar una máquina virtual de aplicaciones se remonta a Val Schorre (con META II , 1964) y Glennie (Syntax Machine). 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 se ejecutaban con cierta lentitud. [15]
Entre los dialectos que utilizaban la máquina virtual se encontraban Tiny BASIC Extended, Tiny BASIC de Tom Pittman [16] y NIBL. Otros dialectos como Denver Tiny BASIC (DTB) y Palo Alto Tiny BASIC eran intérpretes directos. Algunos programadores, como Fred Greeb con DTB, trataban el programa IL (lenguaje interpretativo) como pseudocódigo para el algoritmo que se iba a implementar en lenguaje ensamblador; Denver Tiny BASIC no utilizaba una máquina virtual, pero sí seguía de cerca el programa IL.
Este es un extracto representativo del programa IL de 120 líneas:
S1: TST S3 , 'IR' ; ¿IR A O SUBIR? TST S2 , 'A' ; SÍ... A, O... SUB LLAMADA EXPR ; TERMINAR ETIQUETA ; ERROR SI CR NO ES SIGUIENTE XFERIR ; CONFIGURAR Y SALTAR S3: TST S8 , 'IMPRIMIR' ; IMPRIMIR.
Un patrón común en el programa es probar una palabra clave o parte de una palabra clave y luego actuar en base a esa información. Cada prueba es una afirmación sobre lo que sigue en el búfer de línea. Si la afirmación falla, el control salta a una etiqueta posterior (generalmente buscando una nueva palabra clave o token). Aquí el sistema avanza su cursor de búfer sobre cualquier espacio y prueba GO y si no lo encuentra, salta a la línea S3 . Si lo encuentra, la ejecución continúa con el siguiente comando IL. En este caso, el sistema prueba TO y salta a la línea S2 si falla (una prueba SUB para ver si en cambio se trata de un comando GOSUB ). Si pasa, el control continúa; en este caso, llama a una subrutina IL que comienza en la etiqueta EXPR , que analiza una expresión. En Tiny BASIC, (un GO TO calculado) es tan legal como y es la alternativa al ON-GOTO de implementaciones BASIC más grandes. La subrutina EXPR coloca el resultado de la expresión en la pila aritmética (en este caso, el número de línea). DONE verifica que no haya otro texto después de la expresión y, si lo hay, da un error. XFER extrae el número de la pila y transfiere la ejecución (GOES TO) al número de línea correspondiente, si existe.GOTO X*10+100
GOTO 100
La siguiente tabla proporciona una lista parcial de los 32 comandos de la máquina virtual en la que se escribió el primer intérprete Tiny BASIC. [17]
Tom Pittman , hablando del lenguaje de interpretación, dice: "El intérprete TINY BASIC fue diseñado por Dennis Allison como un analizador sintáctico descendente recursivo . Parte de la elegante simplicidad de este diseño se perdió con la adición de azúcar sintáctica al lenguaje, pero la forma básica permanece. El lenguaje de interpretación es especialmente adecuado para el análisis sintáctico descendente recursivo de TINY BASIC debido a la naturaleza recursiva general de sus procedimientos y la simplicidad de los tokens de TINY BASIC. El lenguaje de interpretación está optimizado de manera efectiva para la interpretación de TINY. La experiencia ha demostrado que la dificultad de agregar nuevas características al lenguaje está totalmente fuera de proporción con la naturaleza de las características. Por lo general, es necesario agregar subrutinas de lenguaje de máquina adicionales para admitir las nuevas características. A menudo, la dificultad supera las ventajas". [19]
Al definir Tiny BASIC para el Homebrew Computer Club, Pittman escribió: "Tiny BASIC es un subconjunto adecuado de Dartmouth BASIC, que consta únicamente de los siguientes tipos de instrucciones: LET, PRINT, INPUT, IF, GOTO, GOSUB, RETURN, END, CLEAR, LIST, RUN. La aritmética se realiza únicamente con números enteros de 16 bits con los operadores + - * / y paréntesis anidados. Sólo hay 26 nombres de variable de una sola letra A, B, ...Z, y no hay funciones. No hay cadenas ni matrices... Tiny BASIC especifica números de línea menores que 256". [20] Luego pasó a describir su implementación: "Este lenguaje se ha ampliado para incluir las funciones RND, USR, y PEEK y POKE, lo que da al usuario acceso a todos los componentes de su sistema en el 6800 desde el programa BASIC".
Muchos implementadores incorporaron sus propias experiencias con HP Time-Shared BASIC o DEC BASIC-PLUS a sus diseños y relajaron la especificación formal del lenguaje Tiny BASIC. De las siete implementaciones destacadas publicadas en 1977:
RND()
. Aunque no estaba incluida en la especificación, un artículo del boletín anterior a la Nota de diseño para Tiny BASIC solicitaba solo esta función.LET
para ser opcionales y la mayoría de las expresiones let en las declaraciones de asignación contienen operadores relacionales .:
aunque normalmente se usaba TBX $
y PATB ;
.IF
las declaraciones, todas, excepto MINOL, eliminaron la necesidad de que las expresiones contuvieran operadores relacionales (por ejemplo, era válido). Las implementaciones lo eliminaron por completo o lo hicieron opcional o lo admitieron solo para cláusulas implícitas . Ninguna admitió cláusulas.IF X THEN LET Y=X
THEN
GOTO
ELSE
PRINT
para soportar zonas de impresión, usando ,
para ir a la siguiente zona y ;
no para avanzar el cursor.NEW
.SZE
, DTB y PATB tenían SIZE
, L1B tenía MEM
y NIBL tenía TOP
.DIM
matrices dimensionables en TBX y DTB.REM
declaración ark.FOR
bucle: PATB, NIBL y L1B lo ofrecieron FOR-TO-STEP/NEXT
, mientras que TBX no lo admitió STEP
y usó la palabra clave NXT
para finalizar un bucle.DO/UNTIL
a pesar del lamento de Allison en el Número 2 sobre los problemas con BASIC.Como alternativa a la tokenización, para ahorrar RAM, TBX, [21] DTB, [22] y MINOL [23] truncaron las palabras clave: PR
for PRINT
, IN
for INPUT
, RET
for RETURN
. Las palabras clave completas y tradicionales no fueron aceptadas. En contraste, PATB permitió las palabras clave tradicionales aceptadas, pero también permitió que cualquier palabra clave se abreviara a su cadena única mínima, con un punto final. Por ejemplo, PRINT
se podía escribir P.
, aunque PR.
y otras variaciones también funcionaban. Este sistema se mantuvo en el BASIC de nivel I para el TRS-80 , que usaba PATB, y también se encontró más tarde en Atari BASIC y el BASIC de varias computadoras de bolsillo Sharp . [24]
Los dialectos más destacados de Tiny BASIC fueron el Design Note original, Tiny BASIC Extended, Palo Alto Tiny BASIC y 6800 Tiny BASIC. Sin embargo, existían muchas otras versiones de Tiny BASIC.
Tiny BASIC se publicó por primera vez en un boletín de noticias de People's Computer Company , un boletín que luego se convirtió en Dr. Dobb's Journal , una revista de informática de larga trayectoria. Se publicaron alrededor de diez versiones en la revista.
Fecha de publicación | Asunto | Dialecto | Autor | Procesador | Tamaño |
---|---|---|---|---|---|
Diciembre de 1975 | 1 [25] | Nota de diseño | Dennis Allison | — | — |
Febrero de 1976 | 2 [21] | Tiny BASIC Extendido (TBX) | Dick Whipple y John Arnold | 8080 | 2.9K |
Marzo de 1976 | 3 [22] | Denver Tiny BASIC (DTB) | Fred Greeb | 8080 | 2,75 mil |
Marzo de 1976 | 3 [26] | 6800 Tiny BÁSICO (6800 TB) | Tom Pittman | 6800 | 2K [27] |
Abril de 1976 | 4 [23] | MÍNOL | Eric T. Mueller | 8080 | 1,75 mil |
Mayo de 1976 | 5 [28] | Palo Alto Tiny BASIC (PATB) | Li Chen Wang | 8080 | 1,77 mil |
Noviembre de 1976 | 10 [29] | Lenguaje básico industrial nacional (NIBL) | Mark Alexander y Steve Leininger | SC/MP | 4K |
Octubre de 1980 | 49 [30] | 6800 Tiny BASIC mejorado | Roberto Hudson | 6800 | — |
Febrero de 1985 | 100 [31] | TBI68K | Gordon Brandly | 68000 | — |
Enero de 2006 | 351 [32] | El regreso de Tiny BASIC | Tom Pittman | — ( C ) | — |
TBX también se conocía como Texas Tiny BASIC. [33]
Tanto SCELBAL [34] como 6800 Tiny BASIC fueron anunciados en la revista pero no se publicó su código fuente.
Revelador | El rey Li Chen |
---|---|
Apareció por primera vez | 1976 |
Licencia | Dominio público |
Dialectos | |
Control básico 3K | |
Influenciado por | |
Nota de diseño de Tiny BASIC, Tiny BASIC ampliado | |
Influenciado | |
Astro BASIC , Nivel I BASIC , Sharp PC-1211 BASIC |
Una de las versiones más populares de Tiny BASIC fue Palo Alto Tiny BASIC, o PATB para abreviar, de Li-Chen Wang . PATB apareció por primera vez en la edición de mayo de 1976 de Dr. Dobbs , escrita en un lenguaje ensamblador personalizado con mnemotecnia no estándar. Esto condujo a más puertos que funcionaban con ensambladores convencionales en el 8080. [24] La primera versión del intérprete ocupaba 1,77 kilobytes de memoria y suponía el uso de una máquina de teletipo (TTY) para la entrada/salida del usuario . Una errata del artículo original apareció en la edición de junio/julio de Dr. Dobb's (Vol. 1, No 6). Este artículo también incluía información sobre cómo agregar dispositivos de E/S adicionales, utilizando el código para la pantalla de video VDM de Processor Technology como ejemplo.
Wang fue uno de los primeros en utilizar la palabra copyleft . En el aviso de distribución de Tiny BASIC de Palo Alto, había escrito "@COPYLEFT TODOS LOS ERRORES RESERVADOS". [35] Tiny BASIC no se distribuyó bajo ninguna forma formal de términos de distribución copyleft, sino que se presentó en un contexto en el que el código fuente se compartía y modificaba. De hecho, Wang había contribuido anteriormente con ediciones a Tiny BASIC Extended antes de escribir su propio intérprete. [21] Animó a otros a adaptar su código fuente y publicar sus adaptaciones, como con la versión de PATB de Roger Rauskolb publicada en Interface Age . [8] También publicó una tercera versión en el Reference Book of Personal and Home Computing de PCC . [36]
Uno de los cambios más notables en PATB es la incorporación del bucle FOR...NEXT . En el TB original, los bucles solo se podían implementar utilizando IF
y GOTO
. Al igual que en Microsoft BASIC , los límites superior e inferior del bucle se establecían al ingresar al bucle y no cambiaban durante el bucle, por lo que si uno de los límites se basaba en una expresión variable, cambiar la variable no cambiaba el límite. El STEP
modificador era opcional, como en MS. [24]
Otro cambio significativo fue la posibilidad de colocar varias sentencias en una sola línea. Por razones que no se explican, PATB utilizó el punto y coma ;
para separar las sentencias, en lugar de los dos puntos ya habituales :
.
Otros cambios incluyen la adición de una única matriz numérica, con el nombre de variable @
, STOP
además de END
, y el uso de #
para los no iguales en las comparaciones, en lugar de <>
. [24] [b]
PATB utilizaba palabras en lugar de números para los mensajes de error. Para reducir la cantidad de memoria necesaria, solo había tres mensajes y consistían en palabras individuales. El sistema respondía con WHAT?
en el caso de errores de sintaxis, HOW?
errores de tiempo de ejecución como GOTO a una línea que no existía o desbordamientos numéricos, y SORRY
en el caso de problemas de falta de memoria. [24]
Wang también escribió un programa STARTREK en su Tiny BASIC que apareció en la edición de julio de 1976 del People's Computer Company Newsletter . [37] [38]
Más tarde adaptó el lenguaje a 3K Control Basic para Cromemco , agregando nombres de variables en el formato letra-dígito (por ejemplo, A0
to Z9
), funciones lógicas ( AND()
, OR()
, XOR()
), un CALL
comando para ejecutar rutinas de lenguaje de máquina, más PRINT
opciones de formato y otras ( GET()
y PUT()
en lugar de PEEK
y POKE
; funciones del puerto de E/S). [39]
Palo Alto Tiny BASIC fue adaptado para muchas otras implementaciones, incluyendo BASIC Nivel I (1977), BASIC para la computadora de bolsillo Sharp PC-1211 (1980) y Astro BASIC (1982, por Jamie Fenton ). [40]
Escrito por un estudiante de secundaria, MINOL fue la única implementación que no admitía la Nota de diseño completa, ya que carecía de precedencia de operadores , solo tenía tres repeticiones (<, =, #), omitiendo GOSUB
y RETURN
. Solo admitía precisión de 8 bits sin signo (en contraste con la precisión de 16 bits con signo de todas las demás implementaciones) y números de línea de 0 a 254.
No se permitían espacios excepto en cadenas; !
devuelve un número aleatorio, $
antes de que una expresión cargue una cadena en esa dirección; OS
vuelve al sistema operativo. La memoria era direccionable como si fuera una matriz bidimensional de bytes altos y bajos (por ejemplo, "(0,0)" a "(255,255)"); CALL
ejecuta una subrutina de lenguaje de máquina. [23]
Muchos dialectos aparecieron en varias otras publicaciones.
Inspirado por la petición de PCC de Tiny BASICs, Robert Uiterwyk escribió MICRO BASIC 1.3 para el sistema SWTPC 6800 , que SWTPC publicó en la edición de junio de 1976 del boletín de SWTPC. Uiterwyk había escrito a mano el lenguaje en una tableta legal. Más tarde amplió el lenguaje a 4K, añadiendo soporte para punto flotante; esta implementación fue única entre los intérpretes de BASIC al utilizar Decimal Codificado Binario con 9 dígitos de precisión, con un rango de hasta 10 99 , y al ser publicada de forma gratuita como un inserto de revista "Floppy ROM" . Una versión de 8K añadió variables de cadena y funciones trigonométricas . SWTPC vendió las versiones de 4K y 8K. En enero de 1978, Uiterwyk vendió los derechos del código fuente a Motorola . [41] [42]
Thomas F. Waitman escribió un Tiny BASIC en 1976 para los terminales Hewlett-Packard HP-2640 y HP-2645 (que utilizaban los procesadores Intel 8008 y 8080), que fue publicado en el Hewlett-Packard Journal .
En la edición de diciembre de 1976 de Interface Age se publicó el BASIC de LLL ( Lawrence Livermore Laboratory ), cuyo primer borrador fue desarrollado por Steve Leininger a partir de la especificación de Allison antes de que Leininger dejara National Semiconductor para irse a Tandy Corporation . El intérprete final fue desarrollado por John Dickenson, Jerry Barber y John Teeter en la Universidad de Idaho bajo contrato con LLL. Ocupaba 5K e incluía un paquete de punto flotante, desarrollado por David Mead, Hal Brand y Frank Olken. El programa fue puesto en el dominio público por LLL, que desarrolló el sistema bajo los auspicios de la Administración de Investigación y Desarrollo Energético de los Estados Unidos. [43]
Altair BASIC , 4K BASIC, podría ejecutarse dentro de una máquina con 4 KB de RAM, dejando solo unos 790 bytes libres para el código del programa. [44] [45] La iniciativa Tiny BASIC comenzó en respuesta al cargo de $150 por Altair 4K BASIC.
En 1975, Steve Wozniak se unió al recién formado Homebrew Computer Club , que tenía como miembros a Li-Chen Wang (Palo Alto Tiny BASIC) y Tom Pittman (6800 Tiny BASIC). Wozniak concluyó que su máquina tendría que tener un BASIC propio, que, con suerte, sería el primero para el procesador MOS Technology 6502. Como el lenguaje necesitaba 4 KB de RAM, hizo que esa fuera la memoria mínima para el diseño. [46] Integer BASIC se publicó originalmente en Compact Cassette en 1976.
En 1977, Radio Shack (como se la conocía entonces) lanzó su primer ordenador, el TRS-80 , un sistema Z80 con BASIC de nivel I en una ROM de 4 KB. Steve Leininger, empleado de Tandy, había escrito el primer borrador del intérprete NIBL (National Industrial Basic Language) para el SC/MP mientras trabajaba en National Semiconductor . [29] Como no pudo llevarse consigo ese código fuente, adaptó el Palo Alto Tiny BASIC de Li-Chen Wang para el prototipo original del TRS-80 Modelo I. Revisó exhaustivamente el intérprete, añadiendo soporte de punto flotante, gráficos simples en blanco y negro y READ/DATA/RESTORE
declaraciones. [47]
Originalmente desarrollado en 1979, Sinclair 4K BASIC , escrito por John Grant, utilizó como definición de lenguaje el estándar Minimal BASIC del American National Standards Institute (ANSI) de 1978, pero era en sí mismo una implementación incompleta de 4 KB con solo aritmética de números enteros. [48]
Se han adaptado pequeñas implementaciones de BASIC para el control de procesadores y microcontroladores como Arduino :
En 2002, Emmanuel Chailloux, Pascal Manoury y Bruno Pagano publicaron un Tiny BASIC (sin GOSUB
/ RETURN
) en Desarrollo de aplicaciones con Objective Caml como un ejemplo de aplicación Objective Caml . [53]
En 2013, Alex Yang publicó una implementación en Python . [54]
En 2019, Sergei Kuznetsov publicó una versión en Ruby . [55]
También en 2019, Oscar Toledo Gutiérrez publicó bootBASIC, que cabe en los 512 bytes del sector de arranque de una máquina 8086/8088, lo que lo convierte en la implementación de BASIC más pequeña hasta el momento. Para lograr esto, el lenguaje elimina los operadores relacionales (las declaraciones IF funcionan con valores distintos de cero), limita las líneas de código a 19 caracteres o menos y no actualiza la pantalla cuando se presiona la tecla de retroceso. [56] Además, carece de GOSUB y RETURN, pero sí incluye una función RND (sin argumentos, que devuelve un valor entre 0 y 255). [57] El lenguaje utiliza una matriz para almacenar líneas de programa, lo que requiere 20.000 bytes para hacerlo. [58]
En 2023, Gordon Henderson publicó una implementación de Tiny Basic en ensamblador 6502. Está influenciada por NIBL y puede ejecutarse en tan solo 3,5 KB de ROM, lo que requiere al menos 1 KB de RAM para el almacenamiento de datos y programas. Admite DO/UNTIL, FOR/NEXT, cadenas simples y peek/poke de memoria (byte o palabra de 16 bits), GOSUB/RETURN, CALL, RND con funciones para entrada y salida hexadecimal. [59]
La siguiente tabla compara las características del lenguaje de las implementaciones de Tiny BASIC con las de otros BASIC destacados que los precedieron.
Fecha de publicación | Dialecto | Programador(es) | Procesador | Tipo | APORTE | DEJAR | IMPRIMIR | IR A | SI...ENTONCES | GOSUB | DEVOLVER | FIN | CORRER | LISTA | CLARO | NUEVO | movimiento rápido del ojo | PARA/SIGUIENTE | LEER / DATOS / RESTAURAR | Se agregaron comandos BASIC | Personalizaciones | Expresiones | reubicar | Funciones | RND | Función de memoria | Números de línea | Delimitador de declaración | Errores | Precisión | Aritmética | Variables | Matrices | Instrumentos de cuerda |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Octubre de 1964 | DTSS Dartmouth BASIC (versión 2) [60] | (Estudiantes de Dartmouth) | GE-225 | Compilar y listo | N / A [!] | LET var = expresión | IMPRIMIR lista-expr { , / ; / } | IR AL número | SI expresión reubicar expresión ENTONCES número de línea | Número GOSUB | DEVOLVER | FIN | CORRER | LISTA--inicio | — | NUEVO [solicita el nombre del programa] | movimiento rápido del ojo | PARA / HASTA / PASO / SIGUIENTE | LEER, DATOS | DETENER | — | precedencia, ^ | < <= = >= > <> | INT, SIN, COS, TAN, ATN, EXP, LOG, ABS, SQR, DEF FN | RND(0) 0..1 | — | 1 a 99999 | Ninguno | 22 definido | 9 dígitos | ±999,999,999; Notación E base 2 -256 a +255 (E±76). | A–Z, A0–Z9 | DIM (nombre de una letra, dos dimensiones); si se omite, se supone que va de 0 a 10; hasta 1500 elementos en todas las matrices | Ninguno (agregado en la versión 4) |
Febrero de 1970 | DEC BASIC-8 [61] | (Personal del DEC) | PDP-8 | Compilar y listo | ENTRADA lista de variables | LET var = expresión | IMPRIMIR lista-expr { , / ; / } | IR AL número | Expresión IF expresión relop [ENTONCES/IR A] número de línea | Número GOSUB | DEVOLVER | FIN | CORRER | LISTA (primero (, último)) | — | NUEVO [solicita el nombre del programa] | movimiento rápido del ojo | PARA / HASTA / PASO / SIGUIENTE | LEER, DATOS, RESTAURAR | DETENER, VIEJO, GUARDAR, DESAGUARDAR | ELIMINAR (primero (, último)), ADIÓS | precedencia, ^ | < <= = >= > <> | INT, SGN, SEÑADO, COS, TAN, ATN, EXP, LOG, ABS, SQR, DEF FN | RND(0) 0..1 | — | 1 a 2045 | Ninguno | 23 definido | ? | ±134.217.727; 14E-38<N<1.7E38 | A–Z, AA–Z9 | DIM (nombre de una letra, dos dimensiones) | Ninguno |
Junio de 1974 | UIUC BÁSICO [62] | Alfred Weaver, Michael Tindall y Ronald Danielson | 8008 | Intérprete | ENTRADA <variable> {, <variable>}* | LET var = fórmula | IMPRIMIR <cadena> / <fórmula> {, <cadena> / <fórmula>}* | IR AL número | Expresión SI ENTONCES número de línea | Número GOSUB | DEVOLVER | FIN | CORRER | no documentado | no documentado | no documentado | movimiento rápido del ojo | PARA / HASTA / PASO / SIGUIENTE | — | DEF FN, DETENER | — | precedencia, ^ | < <= = >= > # Y O NO | FNA..Z, SIN, COS, LOG, SQR, EXP, ATN | — | — | 0 a 999 | Ninguno | no documentado | Mantisa de 4 bytes y exponente de 1 byte [paquete aritmético de punto flotante Datapoint 2200] | no documentado | A–Z, A0–Z9 | DIM (nombre de una letra, tres dimensiones) | Ninguno |
1975 | Altair 4K BÁSICO [63] | Bill Gates, Paul Allen y Monte Davidoff | 8080 | Intérprete | ENTRADA ("cadena",) lista-var | (LET) var = expresión | IMPRIMIR lista-expr { , / ; } | Número GOTO | Expresión SI ENTONCES número de línea/declaración | Número GOSUB | DEVOLVER | FIN | CORRER | LISTA (inicio) | — | NUEVO | movimiento rápido del ojo | PARA / HASTA / PASO / SIGUIENTE | LEER, DATOS, RESTAURAR | DETENER | — | precedencia | < <= = >= > <> | ABS, INT, SGN, SQR, TAB, USR | RND(X) <0, nuevo usando X como semilla; =0, repetir; >0, siguiente | — | 1 a 65535 | : | 12 definido | Operando flotante de 40 bits | ? | ? | DIM (una dimensión) | Ninguno |
Diciembre de 1975 | Nota de diseño [64] | Dennis Allison | — | Intérprete | ENTRADA lista de variables | LET var = expresión | IMPRIMIR lista de expresiones | Expresión GOTO | Expresión IF expresión relop ENTONCES declaración | Expresión GOSUB | DEVOLVER | FIN | CORRER | LISTA | [eq. a NUEVO] | — | — | — | — | — | — | precedencia | < <= = >= > <> >< | Ninguno | Ninguno | — | 1 a 255 | Ninguno | 8 definido | 16 bits | ±32767 | ARIZONA | Ninguno | Ninguno |
Febrero de 1976 | BASIC diminuto ampliado [65] | Dick Whipple y John Arnold | 8080 | Intérprete | EN | (LET) var = expresión | ;} | IR A | Expresión IF [no hay instrucción THEN] | IR A SUB | RETIRADO | FIN | CORRER | LST (nombre (, apellido)) | — | NUEVO | — | FOR-NXT (sin PASO) | DTA (matriz LET) | — | — | precedencia | < <= = >= > <> >< | Espacios TB() en la impresión | RN (aleatorio 0-10000) | SZE | 1 a 65535 | $ | 14 definido | 16 bits | ±32767 | ARIZONA | DIM, 1 o 2 dimensiones, 255 x 255 máx. | Ninguno |
Marzo de 1976 | Denver Tiny BASIC [66] | Fred Greeb | 8080 | Intérprete | EN | (LET) var = expresión | ;} | IR A | Expresión IF [no hay instrucción THEN] | GOSUB | RETIRADO | FIN | CORRER | LISTA (primero último) | [eq. a NUEVO] | — | — | — | — | CINTA [GUARDAR], CARGAR | CLRS [CLS] | precedencia | < <= = >= > <> >< | RND(0), RND(1) | TAMAÑO | 2 a 255 | : | 20 definido | 16 bits | ±32767 | A–Z, A1 a A6 a Z6 | DIM, 1 dimensión | Ninguno | |
Marzo de 1976 | 6800 BÁSICO diminuto [66] | Tom Pittman | 6800 | Intérprete | ENTRADA (expresión) lista-var | LET var = expresión | IMPRIMIR lista-expr { , / ; } | Expresión GOTO | Expresión IF expresión relop ENTONCES declaración | Expresión GOSUB | DEVOLVER | FIN | CORRER | LISTA (primero último) | [eq. a NUEVO] | — | movimiento rápido del ojo | — | — | — | — | precedencia | < <= = >= > <> >< | USR() | Función aleatoria () | — | 1 a 65535 | Ninguno | 53 definido | 16 bits | ±32767 | ARIZONA | Ninguno | Ninguno |
Abril de 1976 | MINOL [67] | Eric T. Mueller | 8080 | Intérprete | EN | (LET) var = expression | PR expr-list {;} | [ salta al inicio de la declaración directa]GOTO 0 | IF expression relop expression ; statement | — | — | FIN | CORRER | LISTA | BORRAR [solo variables] | NUEVO | — | — | — | — | No se permiten espacios excepto en cadenas | Sin precedencia de operadores | < = # | $ [CHR$] | ! [RND] | — | 1 a 254 | : | 6 definido | 8 bits | 0 a 255 | ARIZONA | (H,L) ubicación de memoria | un solo carácter |
Mayo de 1976 | Palo Alto Tiny BASIC [68] | Li Chen Wang | 8080 | Intérprete | ENTRADA [(expresión) var]* | (LET) var = expresión | IMPRIMIR lista de expresiones | Expresión GOTO | Expresión IF [no hay instrucción THEN] | Expresión GOSUB | DEVOLVER | DETENER | CORRER | LISTA (inicio) | — | NUEVO | movimiento rápido del ojo | PARA / HASTA / PASO / SIGUIENTE | — | DETENER | — | precedencia | < <= = >= > # | abdominales() | Función aleatoria () | TAMAÑO | 1 a 32767 | ; | 3 definido | 16 bits | ±32767 | ARIZONA | @(1 matriz de 1 dimensión) | Ninguno |
Noviembre de 1976 | NIBL [69] | Mark Alexander y Steve Leininger | SC/MP | Intérprete | ENTRADA ($)var | (LET) var = expresión | Lista de expresiones PR/PRINT | Expresión GOTO | Declaración IF (THEN) | Expresión GOSUB | DEVOLVER | FIN | CORRER | LISTA (inicio) | BORRAR [variables y pila] | NUEVO | movimiento rápido del ojo | PARA / HASTA / PASO / SIGUIENTE | — | HACER/HASTA | Direccionamiento de memoria (@ [PEEK/POKE], STAT, PAGE) | precedencia | < <= = >= > <> | MOD(), Y, O, NO, | RND(A,Z) | ARRIBA | 0 a 32767 | : | 13 definición de cuatro caracteres | 16 bits | ±32767 | ARIZONA | direccionamiento de memoria | INPUT$, PRINT$, $exp=exp |
Agosto de 1977 | Nivel I BÁSICO [70] | Steve Leininger | Z80 | Intérprete | ENTRADA (#dígito) [(expresión) var]* | (LET) var = expresión | IMPRIMIR (#dígito) lista de expresiones | Número GOTO | Expresión IF declaración THEN | Número GOSUB | DEVOLVER | FIN | CORRER (iniciar) | LISTA (inicio) | — | NUEVO | movimiento rápido del ojo | PARA / HASTA / PASO / SIGUIENTE | LEER, DATOS, RESTAURAR | DETENER, CONTINUAR, ENCENDER-GOTO/GOSUB | CLOAD, CSAVE, CLS, ESTABLECER, RESTABLECER | precedencia | < <= = >= > <> >< | ABS(), INT(), MEM, PUNTO(X,Y) | Función aleatoria () | MIEMBRO | 1 a 32767 | : | 3 definido | 16 bits | ±32767 | ARIZONA | A(1 matriz de 1 dimensión) | A$, B$ |
Junio de 1976 | MICRO BÁSICO 1.3 [71] | Robert Uiterwyk | 6800 | Intérprete | ENTRADA lista de variables | (LET) var = expresión | IMPRIMIR lista-expr { , / ; } | Expresión GOTO | Expresión IF expresión relop ENTONCES declaración | Expresión GOSUB | DEVOLVER | FIN | CORRER | LISTA (primero (, último)) | — | NUEVO | — | PARA/HASTA/SIGUIENTE (sin PASO) | — | PESTAÑA() | — | precedencia | < <= = >= > <> >< | RND, TAMAÑO | RND [devuelve 1-32762] | TAMAÑO (declaración que imprime bytes utilizados y bytes libres) | 1 a 65535 | Ninguno | 17 definido | 16 bits [¡más tarde BCD!] | ±32767 | ARIZONA | DIM (dos dimensiones, tamaño máximo de 255) | Ninguno |
Junio de 1976 | Lenguaje Básico Elemental Científico (SCELBAL) [72] [34] | Mark Arnold y Nat Wadsworth | 8008 | Intérprete | ENTRADA lista de variables | (LET) var = expresión | IMPRIMIR lista-expr {, / ; / } | Número GOTO | Declaración THEN | Número GOSUB | DEVOLVER | FIN | CORRER | LISTA | — | Rascar] | movimiento rápido del ojo | PARA / HASTA / PASO / SIGUIENTE | — | GUARDAR, CARGAR | UDF [USR] | precedencia, ^ | < <= = >= > <> | INT, SGN, ABS, SQR, CHR [utilizable solo en PRINT], TAB | RND(0) 0..1 | — | 1 a 999999 | Ninguno | 18 definido | Operando de 32 bits de punto flotante o fijo | ±134.217.727; 14E-38<N<1.7E38 | ? | DIM (nombre de una letra, una dimensión; hasta 4 matrices de hasta 64 entradas en total) | Ninguno |
Octubre de 1976 | Apple I BASIC [73] | Steve Wozniak | 6502 | Intérprete | ENTRADA ("cadena",) lista-var | (LET) var = expresión | IMPRIMIR lista-expr { , / ; } | Expresión GOTO | Expresión IF expresión relop ENTONCES número de línea/declaración | Expresión GOSUB | DEVOLVER | FIN | CORRER (iniciar) | LISTA (primero (, último)) | — | SCR | movimiento rápido del ojo | PARA / HASTA / PASO / SIGUIENTE | — | AUTO, DEL, POKE | TAB (comando), LLAMAR | precedencia | < <= = >= > <> # Y O NO MOD | SGN, ABS, PEEK(), LEN() | RND(X) 0..X (o X..0!) | HIMEM, LOMEM | 1 a 32767 | Ninguna [versión temprana, entonces :] | 16 definido | 16 bits | ±32767 | A–Z seguido de cualquier número de caracteres alfanuméricos | DIM (una dimensión) | dimensionado |
Diciembre de 1976 | LLL BÁSICO [74] | (Personal de la Universidad de Idaho) | 8080 | Intérprete | ENTRADA lista de variables | (LET) var = expresión | IMPRIMIR lista-expr { , / ;} | IR AL número | Instrucción IF expresión relop expresión (THEN) | Número de GO SUB | DEVOLVER | FIN | CORRER | LISTA | — | SCR | movimiento rápido del ojo | PARA/HASTA/SIGUIENTE (sin PASO) | — | DETENER | Llamar, obtener(), poner() | precedencia | < <= = >= > <> >< | ¿Sin RND? | — | 0 a 32767 | : | 14 definido | Operando de punto flotante de 32 bits | ? | A–Z, A0–Z9 | DIM (solo números enteros, nombre de una letra, una dimensión, tamaño máximo de 255) | Ninguno | |
Enero de 1980 | Sinclair 4K BÁSICO [75] | Juan beca | Z-80 | Intérprete | variable de entrada | LET var = expresión | IMPRIMIR lista-expr { , / ;} | IR AL número | Expresión IF declaración THEN | Número de GO SUB | DEVOLVER | — | CORRER (número) | LISTA | CLARO | NUEVO | movimiento rápido del ojo | PARA/HASTA/SIGUIENTE (sin PASO) | — | DETENER | METER | precedencia | < = > | ABS, CHR$, CÓDIGO, PEEK, RND, STR$, TL$, USR | RND, ALEATORIZAR | — | 1 a 9999 | — | 10 definido | Entero de 16 bits | Entero de 16 bits | A–Z seguido de cualquier número de caracteres alfanuméricos | DIM AZ (solo números enteros, nombre de una letra, una dimensión, tamaño máximo de 255) | De la A a la Z |
;*********************************;; PEQUEÑO BASICO PARA INTEL 8080; VERSIÓN 2.0; POR LI-CHEN WANG; MODIFICADO Y TRADUCIDO; A LA MNEMONICIDAD INTELIGENTE; POR ROGER RAUSKOLB; 10 DE OCTUBRE DE 1976; @COPYLEFT; TODOS LOS ERRORES RESERVADOS;;*********************************
El movimiento de software abierto fue fundado por Dennis Allison con su lanzamiento de Tiny BASIC en 1975.
PEQUEÑO BASIC PARA INTEL 8080VERSIÓN 1.0POR LI-CHEN WANG10 DE JUNIO DE 1976@COPYLEFTTODOS LOS ERRORES RESERVADOSLa fecha de junio en el número de mayo es correcta. La revista estaba retrasada, por lo que se combinaron los números de junio y julio para ponerse al día.
CRLF
símbolo allí simboliza un retorno de carro seguido de un salto de línea .{{cite book}}
: |first1=
tiene nombre genérico ( ayuda ){{cite web}}
: Falta o está vacío |title=
( ayuda )