Dartmouth BASIC es la versión original del lenguaje de programación BASIC . Fue diseñado por dos profesores del Dartmouth College , John G. Kemeny y Thomas E. Kurtz . Con el Dartmouth Time Sharing System (DTSS) subyacente, ofrecía un entorno de programación interactivo para todos los estudiantes universitarios, así como para la comunidad universitaria en general.
Se produjeron varias versiones en Dartmouth, implementadas por estudiantes universitarios y funcionando como un sistema de compilación y funcionamiento . La primera versión se publicó el 1 de mayo de 1964 y se abrió a los usuarios generales en junio. Siguieron actualizaciones que culminaron con la séptima y última versión en 1979. Dartmouth también introdujo una versión dramáticamente actualizada conocida como Structured BASIC (o SBASIC ) en 1975, que agregó varios conceptos de programación estructurada . SBASIC formó la base de los esfuerzos del estándar ANSI Standard BASIC a principios de la década de 1980.
La mayoría de los dialectos de BASIC remontan su historia a la Cuarta Edición (que agregó, por ejemplo, variables de cadena, que la mayoría de los usuarios de BASIC dan por sentado, aunque el original podía imprimir cadenas), pero generalmente omiten características más esotéricas como las matemáticas matriciales. A diferencia de los compiladores de Dartmouth, la mayoría de los demás BASIC se escribieron como intérpretes . Esta decisión les permitió ejecutarse en la memoria principal limitada de las primeras microcomputadoras . Microsoft BASIC es un ejemplo, diseñado para ejecutarse en sólo 4 KB de memoria. A principios de la década de 1980, decenas de millones de ordenadores domésticos ejecutaban alguna variante del intérprete de MS. Se convirtió en el estándar de facto para BASIC, lo que llevó al abandono de los esfuerzos de ANSI SBASIC. Kemeny y Kurtz formaron más tarde una empresa para desarrollar y promover una versión de SBASIC conocida como True BASIC .
Muchos de los primeros juegos de mainframe tienen su historia en Dartmouth BASIC y el sistema DTSS. Una selección de estos se recopiló, en versiones HP Time-Shared BASIC , en el libro de People's Computer Company What to Do After You Hit Return . [1] Muchas de las listas de fuentes originales en BASIC Computer Games y trabajos relacionados también remontan su historia a Dartmouth BASIC.
John G. Kemeny se unió al departamento de matemáticas de Dartmouth College en 1953 y más tarde se convirtió en su presidente de departamento. En 1956 obtuvo acceso a un IBM 704 gracias a los esfuerzos del Centro Regional de Computación de Nueva Inglaterra del MIT . Ese año escribió el lenguaje DARSIMCO , una versión de ensamblador que simplificaba la programación de operaciones matemáticas. Lo ayudó Thomas E. Kurtz , quien se unió al departamento ese año. [2]
DARSIMCO quedó olvidado cuando se instaló el primer compilador de FORTRAN en la máquina en 1957. La llegada de FORTRAN dejó una lección importante. Kurtz, después de haber sido adoctrinado en que FORTRAN era lento, pasó varios meses escribiendo un programa en ensamblador 704 que había requerido aproximadamente una hora de tiempo de CPU para depurarlo y todavía no se estaba ejecutando. Dándose por vencido, lo reescribió en FORTRAN y lo puso en funcionamiento en cinco minutos. La lección fue que los lenguajes de alto nivel podían ahorrar tiempo, independientemente de su desempeño medido. [2]
En 1959, la escuela recibió su primera computadora, la LGP-30 con batería . Un estudiante escribió un lenguaje inspirado en FORTRAN llamado DART para la máquina. Esto llevó a un esfuerzo por producir un compilador ALGOL 58, pasando a ALGOL 60 cuando se finalizó esa definición. Escribir el compilador fue difícil debido al tamaño muy pequeño de la memoria, 32 KB en términos modernos, y era extremadamente lento, basándose en la velocidad del tambor de 3600 rpm. Sin embargo, pudieron producir una versión funcional reducida conocida como ALGOL 30 . [3] Un mayor desarrollo produjo SCALP, el "Procesador Algol autónomo", un compilador de un solo paso que estaba listo para ejecutar el programa compilado tan pronto como la cinta perforada terminara de leer en la fuente. Inmediatamente aparecerían los resultados del programa o cualquier mensaje de error. Este estilo de operación de compilar y listo sería utilizado más tarde por BASIC. [3] [4]
En 1962, Kemeny y el estudiante de secundaria Sidney Marshall [5] comenzaron a experimentar con un nuevo lenguaje, DOPE (Dartmouth Oversimplified Programming Experiment) . Este usaba líneas numeradas para representar instrucciones, por ejemplo, para sumar dos números, DOPE usó:
5 + ABC
Lo que significaba "en la línea 5, realizar una suma de los valores de las variables A y B y poner el resultado en C". Aunque su diseño es algo críptico, se puede ver la base del futuro lenguaje BASIC. [6] Además de las operaciones matemáticas básicas, el lenguaje incluía SQR, EXP, LOG, SIN y una construcción de ramificación simple. [7]
Kemeny y Kurtz coincidieron en la necesidad de alfabetizar en programación entre los estudiantes fuera de los campos tradicionales STEM ; Sólo el 25% de los estudiantes de Dartmouth tomaron cursos relacionados con STEM, pero se utilizó algún nivel de matemáticas en casi todos los campos. Además, a medida que las computadoras adquirieron mayor importancia en la sociedad, se preguntaron: "¿Cómo pueden tomar decisiones sensatas sobre la informática y su uso personas esencialmente ignorantes de ella?" [7]
Kemeny señaló más tarde que "nuestra visión era que todos los estudiantes del campus tuvieran acceso a una computadora, y que cualquier miembro del cuerpo docente debería poder usar una computadora en el aula cuando fuera apropiado. Era tan simple como eso". [8] Pero hacerlo sería en gran medida imposible dado con qué tenían que trabajar; el tiempo de respuesta en una ejecución típica de SCALP fue de aproximadamente 15 minutos, y los lenguajes eran demasiado difíciles de usar para tareas básicas para usuarios que no eran usuarios de STEM. [7]
El problema no era simplemente la complejidad, sino todo el concepto del procesamiento por lotes . Los estudiantes prepararían sus programas en tarjetas perforadas o cinta de papel, los enviarían a los operadores de computadora y luego, en algún momento futuro, recibirían su resultado. Esto a menudo revelaría un error que requería repetir todo el proceso. Como dijeron más tarde: "Si se necesita alrededor de 1 día para un intento, el estudiante perderá el interés o olvidará cuáles fueron los problemas. En el mejor de los casos, perderá el tiempo esperando a que aparezcan los resultados del día. " [9] [un]
En 1959, debido en gran parte a la reputación de Kemeny como innovador en la enseñanza de matemáticas, el departamento ganó un premio de la Fundación Alfred P. Sloan por 500.000 dólares para construir un nuevo edificio del departamento. [10]
Durante una visita al MIT en 1961, conocieron el PDP-1 y su sistema operativo experimental de tiempo compartido recientemente completado . John McCarthy preguntó a Kurtz por qué no compartían el tiempo en sus esfuerzos por llevar la informática a las masas. Kurtz regresó a Dartmouth y le dijo a Kemeny "deberíamos compartir el tiempo", a lo que Kemeny respondió inmediatamente "OK". [11]
En un experimento para probar si el concepto era viable, los estudiantes se dividieron en grupos de cinco y se les dio turnos en el LGP-30 usando SCALP. [4] El tiempo de computadora se dividió en sesiones de 15 minutos y a cada grupo de cinco se le dio una sesión y luego se la entregó al siguiente grupo. Se descubrió que los estudiantes generalmente podían completar sus programas en dos o tres "turnovers" durante una sola sesión. Esto sugería claramente que un sistema interactivo permitiría a cientos de usuarios utilizar con éxito una sola máquina. [12]
La llegada del teleimpresor Teletype Modelo 33 que utilizaba el recién introducido ASCII a través de líneas telefónicas resolvió el problema de acceso; Los programadores ya no tendrían que enviar los programas en tarjetas o cintas de papel, ahora usarían el Modelo 33 para escribir directamente en la computadora. Todo lo que se necesitaba era una nueva máquina que fuera lo suficientemente rápida para albergar un sistema de tiempo compartido y un lenguaje sencillo para que lo usaran los programadores. [13]
Cuando el tema del lenguaje simple comenzó a considerarse seriamente, Kemeny inmediatamente sugirió escribir uno nuevo. Kurtz estaba más interesado en una versión reducida de FORTRAN o ALGOL. [14] Pero estos lenguajes tenían tantas idiosincrasias que Kurtz llegó a estar de acuerdo con Kemeny:
Si hubiéramos corregido las feas características de FORTRAN, ya no tendríamos FORTRAN. De mala gana tuve que estar de acuerdo con John en que sí, se necesitaba un nuevo lenguaje. [15]
Con el tiempo, surgieron cuatro elementos clave; el sistema utilizaría el tiempo compartido, se necesitaría un nuevo lenguaje, para que los usuarios ingresaran al sistema, nuevos cursos introducirían la programación como complemento de otras materias y, finalmente, las terminales estarían abiertas a todos los usuarios. [dieciséis]
El proyecto comenzó oficialmente en septiembre de 1963. El objetivo era desarrollar el lenguaje y el sistema operativo en una computadora disponible en el mercado. [17] A principios de 1964, se acercaron a la Fundación Nacional de Ciencias (NSF) en busca de financiación. La NSF envió las propuestas, una para el sistema de tiempo compartido y otra para el idioma, para revisión por pares. Las revisiones sugirieron invariablemente que no entendían la dificultad de lo que estaban intentando. A pesar de estos comentarios negativos, la NSF siguió adelante con ambas subvenciones. Los descuentos educativos disponibles de General Electric llevaron a la compra de una computadora GE-225 , en una era en la que no "convertirse en IBM" todavía estaba lleno de peligros. [18]
El GE-225 se combinó con la máquina DATANET-30 (DN-30), mucho más simple, y un disco duro conectado a ambas máquinas para compartir programas. [19] El DN-30 carecía de documentación de programación en ese momento, ya que nunca estuvo previsto que saliera de fábrica sin un programa ya instalado. [18] Incluía una característica clave, el acceso directo a memoria (DMA) a las máquinas GE más grandes. Esto significaba que pequeños mensajes podían pasarse rápidamente entre las máquinas, permitiendo que los comandos escritos por el usuario fueran ejecutados inmediatamente por el 225. [20]
El sistema funcionaría haciendo que el DN-30 ejecutara los terminales y guardara el trabajo del usuario en el disco. Cuando el usuario escribía RUN
, el DN-30 usaría DMA para enviar ese comando al GE-225. El 225 leería ese archivo, lo compilaría, lo ejecutaría y devolvería los resultados al DN-30, que imprimiría la salida en el terminal. [21]
En el verano de 1963, a la espera de la compra de la computadora, GE proporcionó acceso a uno de sus GE-225. Kemeny comenzó a trabajar en un compilador prototipo. Los estudiantes Michael Busch y John McGeachie comenzaron a trabajar en el diseño del sistema operativo ese otoño. Tanto el lenguaje como el sistema operativo se modificaron ampliamente durante este período, aunque los objetivos básicos siguieron siendo los mismos y se publicaron en forma de borrador en noviembre. [19]
La máquina de la escuela llegó la última semana de febrero de 1964, [22] estaba operativa a mediados de marzo, [23] y se entregó oficialmente el 1 de abril. En ese momento, el diseño del sistema operativo ya estaba bien desarrollado. La mayoría de los estudiantes de programación que trabajaban en el sistema operativo lo hacían 50 horas a la semana, además de su carga académica normal. [22] El lenguaje se desarrolló en paralelo con tiempo prestado en otra máquina 225. [24] El sistema operativo se completó en abril y todo el sistema que se ejecuta en tres terminales Modelo 33 estuvo listo a finales de mes. John Kemeny y John McGeachie ejecutaron el primer programa BASIC el 1 de mayo de 1964 a las 4 am ET . [23]
No está del todo claro cuáles fueron los primeros programas. Muchas fuentes, incluido Dartmouth, afirman que se trataba de este sencillo programa: [25]
IMPRIMIR 2 + 2
Una historia posterior del lenguaje afirma que se teclearon dos programas al mismo tiempo, uno por Kemeny y otro por otro programador anónimo. Escribieron sus programas, escribieron RUN
al mismo tiempo y recibieron los resultados correctos. [26] Kurtz era un madrugador y ya se había ido a casa y "se perdió toda la diversión". [27]
Durante el mes siguiente, el sistema fue probado mediante programas de prueba de clase de análisis numérico en el sistema. Durante este período, la máquina permaneció funcionando correctamente durante un promedio de cinco minutos. [28] Los problemas se resolvieron rápidamente y en junio se decidió aumentar el número de terminales a once. Fue por esta época cuando un GE-235 más rápido reemplazó al 225. Para el otoño, 20 terminales estaban en uso. [19]
GE comenzó a referirse a la combinación de GE-235 y DN-30 como GE-265, [29] sumando sus números de modelo. GE construyó alrededor de 75 ejemplares adicionales del GE-265, [30] muchos de ellos para su negocio de oficina de servicios . GE se refirió a estos como sus sistemas de tiempo compartido Mark I. [31]
Uno de los objetivos originales del programa era integrar la programación en otros cursos. Esto fue un éxito, pero ejerció una presión considerable sobre el sistema y quedó claro que no tenía espacio para crecimiento futuro. [32]
En 1965, el equipo se acercó a GE en busca de apoyo para el desarrollo continuo. En septiembre, el vicepresidente Louis Rader ofreció el nuevo GE-635 , que funcionaba aproximadamente 10 veces más rápido e incluía dos CPU. Además, se añadiría un segundo DN-30 para atender más líneas, suficiente para 150 usuarios simultáneos. [32] Para albergarlo, se necesitarían instalaciones más grandes que el sótano de College Hall donde funcionaba el 265. Peter Kiewit, promoción del 22, junto con el apoyo adicional de la NSF, llevaron a la construcción del Centro de Computación Kiewit, que se inauguró en diciembre de 1966. [32]
Mientras se esperaba que llegara esta máquina, en el verano y otoño de 1966 se utilizó un GE-635 en el Centro de Desarrollo Aéreo de Roma para desarrollar MOLDS, el "Sistema de depuración en línea para múltiples usuarios". El GE-635 estaba operativo a principios de 1967 y, utilizando MOLDS, el nuevo sistema operativo estaba completamente funcional en septiembre, momento en el que se vendió el GE-265. [33]
GE proporcionó la máquina de forma gratuita durante tres años como parte de un acuerdo más amplio según el cual Dartmouth desarrollaría nuevas versiones de BASIC mientras GE la usaba para desarrollar una nueva versión de su sistema operativo. [33] Esta colaboración resultó ser un éxito; GE comenzó a implementar estas máquinas como sus sistemas de tiempo compartido Mark II, [34] y al final de la década eran uno de los proveedores de tiempo compartido más grandes del mundo. [32]
Cuando este sistema "Fase I" entró en funcionamiento, el equipo de Dartmouth comenzó a desarrollar la "Fase II", el sistema operativo ideal. Este se instaló en marzo de 1969 y poco después cambió su nombre por el de Dartmouth Time Sharing System . Cuando terminó el período de tres años, GE regaló la máquina a la universidad. Aunque los dos equipos permanecieron en contacto y se hicieron varios intentos de buena fe para continuar la relación, se produjo poca colaboración y la asociación terminó oficialmente el 20 de septiembre de 1972. [33]
Una revisión realizada en 1968 señaló que el 80% de los estudiantes y el 70% del profesorado hacían algún uso del sistema. Cientos de terminales estaban repartidas por todo el campus, desde el hospital hasta la escuela de negocios. El 57% del tiempo de CPU se utilizó para trabajos de curso, el 16% para investigación y el 27% restante para "uso recreativo"; Dartmouth animó activamente a los usuarios a jugar como una forma de practicar el uso y superar el miedo a la computadora. [35]
A partir de otra subvención de la NSF, en 1967 Dartmouth también comenzó a colocar terminales en ubicaciones fuera del campus, incluidas las escuelas secundarias de la zona. En términos de número de usuarios, estos terminales albergaron el 69% del total de usuarios, aunque utilizaron menos tiempo de ordenador. [35] En 1971 había 79 terminales remotas, tan lejos como Nueva Jersey y Bangor, Maine . Estos estaban respaldados por sistemas multiplexores que permitían soportar hasta 12 terminales a través de una única línea telefónica de calidad de voz. Además, varias de estas líneas estaban disponibles para uso telefónico con un módem . [36]
El tiempo compartido fue un área importante de investigación en la década de 1960, y muchos en la industria informática predijeron que la potencia informática sería económica y generalizada. John McCarthy afirmó esto de manera muy famosa: "algún día la informática podrá organizarse como un servicio público, del mismo modo que el sistema telefónico es un servicio público". [37]
Si bien otros idiomas estaban disponibles en DTSS, en 1972 [actualizar]el 98% de sus programas estaban escritos en BÁSICO. [38] Con BASIC, los servicios informáticos se volvieron mucho más accesibles para los usuarios finales cuyas tareas tardarían demasiado en codificarse para que fueran adecuadas para resolverlas en una computadora. Esto llevó a que varios fabricantes introdujeran ordenadores diseñados específicamente para este mercado de usuarios que querían resolver tareas de pequeña o mediana escala y no estaban tan preocupados por el rendimiento absoluto. En particular, dos máquinas destinadas directamente a este mercado se convirtieron en "los pequeños sistemas de tiempo compartido más utilizados jamás desarrollados". [34]
El HP 2000 ejecutaba HP Time-Shared BASIC , una combinación de BASIC y sistema operativo de tiempo compartido casi idéntica a la configuración DTSS. El sistema admitía hasta 32 usuarios simultáneos, utilizando una CPU HP 2100 de gama baja para ejecutar los terminales de la misma manera que el Datanet-30 de la configuración GE-265 original, mientras que los programas se ejecutaban en un modelo de gama alta del misma máquina, que normalmente se diferenciaba en que tenía más memoria central . BASIC de HP utilizó un formato tokenizado semicompilado para almacenar programas, lo que mejoró los tiempos de carga y significó que las "compilaciones" fueran en tiempo cero. [39]
Digital Equipment Corporation adoptó un enfoque diferente, utilizando una oferta de máquina única basada en su línea PDP-11 existente con el nuevo sistema operativo RSTS/E y BASIC-PLUS . BASIC-PLUS siguió más de cerca la Quinta Edición, incluidos los MAT
comandos, pero se implementó como un intérprete puro a diferencia del compilador Dartmouth o el formato tokenizado de HP. También incluía una serie de estructuras de control siguiendo el modelo JOSS , como . [40] Tymshare SUPER BASIC también admitía estructuras de estilo JOSS y matemáticas matriciales, pero conservaba la operación original de compilación y listo.PRINT I IF I > 10
Prácticamente todos los proveedores de la época ofrecieron alguna solución a este mismo problema, aunque es posible que no fueran tan similares al original. Cuando Kurtz comenzó a considerar la formación de un estándar ANSI para BASIC en 1973, descubrió que la cantidad de oficinas de servicios de tiempo compartido con BASIC disponibles era mayor que cualquier otro idioma. Desafortunadamente, este éxito también fue un problema; En ese momento, había tantas variaciones que un estándar parecía imposible. [34]
Kemeny fomentó activamente los juegos en la plataforma DTSS y lo consideró una de las principales razones del éxito del sistema DTSS. [38] Probablemente fue el autor de uno de los primeros juegos para mainframe . Aunque Kemeny no se atribuyó el mérito, más tarde se refirió a FTBALL afirmando que "fue escrito el domingo después de cierto partido entre Dartmouth y Princeton en 1965, cuando Dartmouth ganó el trofeo Lambert . Es una especie de programa conmemorativo". El juego fue una sorpresa para Princeton, el gran favorito. [41] [b]
A medida que el sistema se expandió, especialmente después de agregar el manejo de cadenas en BASIC, el sistema DTSS se convirtió en una plataforma importante para el desarrollo de muchos juegos basados en texto . A principios de la década de 1970, People's Computer Company comenzó a publicarlos en su revista, generalmente convertida al HP BASIC, más disponible. Muchas de estas listas se recopilaron en su libro de 1975, Qué hacer después de presionar regresar . Aunque se publican en formato HP BASIC, la mayoría de ellos tienen su historia en DTSS o en el Lawrence Hall of Science de California, donde se instaló una máquina similar, conocida como DECISION. [43]
Una colección más famosa es BASIC Computer Games de 1978, donde aproximadamente la mitad de los programas del libro fueron escritos en Dartmouth, incluido otro por Kemeny, Batnum o, más comúnmente, una de las muchas escuelas secundarias que estuvieron conectadas a ella después de 1968. Una escuela secundaria particularmente prolífica fue la Lexington High School en Massachusetts , pero también aparecen muchas otras escuelas. Varios de los programas no enumeran sus ubicaciones originales, pero provienen de autores que probablemente estaban conectados al sistema a través de una escuela o proyectos públicos como Project SOLO. [44]
Los videojuegos multijugador se hicieron posibles en BASIC cuando Stephen Garland y John McGeachie desarrollaron la interfaz de terminal en línea múltiple MOTIF para DTSS. Para iniciar un juego, un usuario escribía ENLACE seguido del nombre de una sesión en lugar de EJECUTAR, lo que permitía a otros usuarios conectarse al juego escribiendo UNIRSE seguido del nombre de la sesión. Luego, MOTIF multiplexó la entrada y salida para el programa BASIC, anteponiendo un identificador de cadena al comienzo de cada línea de entrada y salida. Los primeros programas desarrollados con esta interfaz fueron una versión de FTBALL para dos personas y un juego de póquer para cinco personas. Más serio fue un juego de gestión que permitía a hasta diez estudiantes de la Escuela de Administración de Empresas Amos Tuck competir en la producción y comercialización de un solo producto. [45]
La versión original, conocida retroactivamente como versión uno, admitía los comandos LET
, PRINT
, END
, FOR...NEXT
, GOTO
, GOSUB...RETURN
, IF...THEN
, DEF
, READ
, y DATA
. Incluía instrucciones matemáticas básicas, , y , así como la flecha hacia arriba para los exponentes "... ya que en una máquina de escribir teletipo es imposible imprimir superíndices". [46] En las variedades modernas, la flecha hacia arriba normalmente se reemplaza por el carácter "sombrero" . Los exponentes tomaban el valor absoluto del número antes del cálculo, por lo que para calcular había que utilizar . Hubo otro problema en la función exponente que trataba en contraposición al orden correcto de las operaciones , que no se corrigió hasta la tercera versión. [46] La función siempre se trunca hacia cero. [47]DIM
REM
+-*/^-X^3
X*X*X
-X^2
(-X)^2
-(X^2)
INT()
El idioma tenía una serie de idiosincrasias propias. A diferencia de versiones posteriores, el LET
comando era requerido en todas las declaraciones que carecían de otro comando, por lo que no era válido en esta versión. [47] La declaración utilizó la coma al imprimir múltiples variables, avanzando a la siguiente de cinco "zonas". La coma no era necesaria en el caso de que se imprimiera un valor único y rápido, por lo que era válida. Una característica un tanto oculta era que todas las variables eran capaces de representar matrices (vectores) de hasta diez elementos (subíndices del 1 al 10, cambiados del 0 al 9 en la segunda edición) sin ser declarados de esa manera usando . solo era necesario si se requería un tamaño de vector diferente. [48] [c]10 A=5*5
PRINT
PRINT "value of A is "A
DIM
DIM
Los nombres de las variables se limitaron a una sola letra o una letra seguida de un dígito (286 nombres de variables posibles). Las funciones de usuario solo pueden tener una sola letra, por lo tanto FNA
a través de FNZ
. Todas las operaciones se realizaron en punto flotante . En el GE-225 y GE-235, esto produjo una precisión de aproximadamente 30 bits (aproximadamente diez dígitos) con un rango de exponente de base 2 de -256 a +255. [49]
Además, debido a que el tamaño de palabra del GE-235 es de 20 bits y utiliza un código de caracteres de seis bits , el lenguaje consagró el uso de nombres de funciones de tres letras porque eso permitía el almacenamiento de tres caracteres de seis bits en un código de 20 bits. palabra (usando 18 bits). Es por esto que las funciones BASIC son tres letras, como INT
o SQR
, algo que permaneció en las muchas variedades del lenguaje mucho después de que abandonaran el GE-235. [47]
La Segunda Edición de BASIC (aunque no se la mencionaba como tal en ese momento) solo realizó cambios mínimos. Lanzado en octubre de 1964, podía iniciar matrices en el subíndice 0 en lugar de 1 (útil para representar polinomios ) y agregaba el punto y coma, a la declaración. [50] A diferencia de implementaciones posteriores donde esto dejaba espacio entre elementos, el punto y coma avanzaba la impresión al siguiente múltiplo de tres caracteres, lo que era útil para "empaquetar" más números en una línea de salida que el separador de coma existente. [51] El tamaño de tres caracteres fue un efecto secundario del tamaño de palabra de 20 bits del GE-235 , que almacenaba tres caracteres de seis bits. Saltar a la siguiente columna de tres caracteres se lograba simplemente pasando a la siguiente palabra en la memoria. [52];PRINT
La versión de octubre también incluyó una definición separada para CARDBASIC, que era simplemente una versión de BASIC para usar en flujos de trabajo basados en tarjetas. CARDBASIC era casi idéntico a la versión interactiva, con la excepción de que no incluía matrices de base cero. Más importante para el futuro del lenguaje, CARDBASIC agregó los MAT
comandos que funcionaban con matrices numéricas. CARDBASIC no se desarrolló más, ya que toda la idea de BASIC era ser interactivo. [50]
La Tercera Edición, lanzada en 1966 y la primera en utilizar el nombre "edición", fue la primera diseñada específicamente con la intención de ejecutarse en la nueva computadora GE-635 que llegaría en breve. Esta versión incluye las MAT
funciones de CARDBASIC y ahora pueden usar 0 como subíndice. [53]
La nueva SGN
función dio el signo de su argumento (¿positivo?0 y negativo?1), mientras que RESTORE
se agregó para "rebobinar" la posición de READ/DATA
. El problema de exponenciación se solucionó, por lo que -X^2
se interpretaría como -(X^2)
. [53] Además, la INT
función se cambió para que fuera un piso verdadero, en lugar de recortar hacia cero, lo que permitió implementar el redondeo con INT(X+0.5)
. [47]
El cambio principal en esta versión fue la nueva INPUT
declaración, que analizaba valores numéricos, haciendo que el lenguaje fuera verdaderamente interactivo durante la ejecución por primera vez; Anteriormente, el único control que se tenía durante la ejecución era escribir STOP
en el monitor. Además, el sistema ahora permitía y fomentaba la sangría de los bucles, una característica que no se veía en la mayoría de las otras versiones de BASIC. [54]
La Tercera Edición permaneció en uso durante toda la vida útil del GE-235 hasta el otoño de 1967. Sin embargo, cuando se hicieron planes para recibir el GE-635, se creó una versión experimental en el 635 en la primavera de 1967. Esta versión fue una asociación entre GE y Dartmouth, con GE contribuyendo con un nuevo sistema operativo, así como una serie de características de BASIC de sus propios esfuerzos Mark 1 BASIC. [54]
Esta versión, publicada inicialmente como suplemento de la tercera edición, agregó el RANDOMIZE
comando para "iniciar" la RND
función y el ON...GOTO
"goto calculado" que coincidía estrechamente con una característica similar en FORTRAN. Esta versión también lo permitía ON...THEN
, argumentando que IF...THEN
no lo requería, GOTO
entonces no sería requerido aquí. La nueva TAB
función movió la impresión a una columna determinada, de 0 a 74. [54] Otro cambio interno fue cambiar nuevamente la función MAT
para que esté basada en 1; se podría usar el índice 0, pero normalmente los distintos comandos lo ignorarían. [55]
La principal adición para esta versión fueron las variables de cadena, junto con cambios en las READ/DATA
declaraciones que podían almacenar cadenas en ellas y la INPUT
declaración para leerlas de forma interactiva. Una característica del sistema de cadenas era que los espacios finales se ignoraban deliberadamente en las comparaciones, de modo que "SÍ" y "SÍ" se consideraban iguales. [56] Más tarde se comprendió que esto era un grave error. [55] Las variables de cadena se indicaban con el signo de dólar, por ejemplo A$
, simplemente porque se estaban quedando sin caracteres que se podían encontrar en la mayoría de los teclados. Alguien señaló que el $ se parecía a la S de "String", y eso fue todo. [57]
La manipulación de cadenas se manejó mediante el nuevo CHANGE
comando. Esto convirtió el valor de cadena en una variable al conjunto equivalente de valores ASCII. Luego, la matriz numérica podría manipularse y convertirse nuevamente en una cadena. Por ejemplo, este código produce "es" en la consola:
100 LET S$ = "Ahora es el momento" 110 CAMBIAR S$ A S 120 LET T ( 1 ) = S ( 5 ) 130 LET T ( 2 ) = S ( 6 ) 140 LET T ( 0 ) = 2 150 CAMBIAR T A T$ 160 IMPRIMIR T$
La línea 140 establece la longitud de la cadena en 2, que debe ser administrada por el usuario. El primer carácter está en T(1). Si bien este sistema es flexible, de ninguna manera fue cómodo de usar. Las versiones posteriores abordarían esto con nuevas funciones. [58]
Los cambios menores en esta versión cambiaron el punto y coma en PRINT
las declaraciones para hacer un "empaquetado cerrado" de la salida sin espacios, [52] [59] y el uso del apóstrofo como forma abreviada REM
. [60] [d]
La cuarta edición oficial no apareció hasta 1968, que añadió varias características nuevas además de las anteriores. Esto incluía la capacidad de definir funciones de varias líneas con el DEF
comando y la poderosa CHANGE
declaración que trataba las cadenas como matrices de códigos tipo ASCII para que se pudieran operar con caracteres individuales sin recorrer toda la cadena. [55] Esta era también la única función de manipulación de cadenas; para extraer un solo carácter o subcadena, había que usar CHANGE
para convertirlo en una matriz de números, manipular esa matriz y luego convertirla nuevamente. Ésta fue la razón por la que MAT volvió a estar basado en 1; la longitud de la cadena se colocó en la ubicación cero y era necesario ignorarla normalmente. [61]
La Quinta Edición, de finales de 1970, comenzó nuevamente como dos suplementos de la Cuarta Edición, de febrero y abril de 1969. [55]
El cambio más importante fue la introducción del manejo de archivos. Anteriormente, cualquier dato predefinido que tuviera que usarse en el programa debía colocarse en las líneas de DATOS y luego leerse uno a la vez usando el comando READ . Esta función podría usarse para leer archivos de manera similar. El comando INPUT ahora podía leer un solo elemento de un archivo e PRINT podía escribir uno. [62]
Los archivos se abrieron mediante la nueva FILES
palabra clave, seguida de una lista de constantes de cadena que describen los nombres de los archivos. Como se trataba de constantes, cambiar el nombre del archivo exigía cambiar el código para que coincidiera. A los nombres se les asignaron números, el primer nombre se convirtió en el archivo n.° 1, y así sucesivamente. Se admitieron dos formatos de archivo, acceso aleatorio y lineal. Un archivo lineal se trataba como lo sería un archivo de texto hoy en día: se podía LINPUT #1: A$
leer una línea de texto en una variable de cadena y luego PRINT A$
enviarla al terminal. [62] Las versiones posteriores agregaron FILE $1,name$
para permitir que los archivos se especifiquen mediante cadenas, aunque durante un tiempo esto requirió un FILES *
cerca de la parte superior del programa para indicar que estaba usando este formato. [63]
Para los archivos de acceso aleatorio, el nombre tenía que especificar el tipo de datos que contenía; %
indicó que contenía datos binarios, mientras que $num
indicó que debía leerse como cadenas con una longitud máxima de num
. [62] LEER y ESCRIBIR se podían colocar en cualquier lugar de un archivo de acceso aleatorio con el comando RESET , mientras que la función LOC devolvía la ubicación actual y la longitud del archivo LOF . Durante las lecturas secuenciales, también se puede probar si estaba al final del archivo usando . [64]IF END THEN...
Otro cambio importante fue la capacidad de un programa BÁSICO de llamar a otro usando el comando CHAIN y pasarle variables usando la lista COMÚN . Más tarde se descubrió que este concepto básico tenía varios problemas, pero aun así se utilizó para escribir algunos programas grandes. [64]
El manejo de cadenas recibió una actualización importante. El nuevo SEG$
comando devolvió una nueva cadena recortada de otra. En el ejemplo anterior, la cadena "is" se extrae de una cadena más grande. Usando el nuevo comando, esto se puede reducir a , que funciona de manera similar a la función que se encuentra en la mayoría de los dialectos ( ). SEG$ utiliza el primer y último índice; MID$ utiliza el primer índice y la longitud. devolvía la longitud de una cadena, que ahora se manejaba internamente y no requería cálculo en la mayoría de los casos, y devolvía la posición de una cadena dentro de otra, que en la mayoría de los dialectos era manejada por . El signo comercial , se introdujo para la concatenación de cadenas . [58]LET T$ = SEG$(S$,5,6)
MID$
MID$(S$,5,2)
LEN
POS
SUBSTR
&
También se agregaron muchos cambios menores más. Entre ellos se encontraban matrices de cadenas bidimensionales, a diferencia de las unidimensionales de la versión anterior, así como la capacidad de usar DEF para definir funciones basadas en cadenas y matemáticas. Las nuevas funciones orientadas al sistema incluían CLK$ , DAT$ para trabajar con horas y fechas, TIM que devolvía el tiempo transcurrido y USR$ que devolvía el número de usuario, lo que hoy sería el nombre de usuario. Las nuevas funciones de cadena incluyen STR$ , VAL , ASC , que son comunes en los dialectos BASIC modernos. La forma abreviada de REM también apareció en esta versión. [64]'
El trabajo en la sexta edición comenzó en el otoño de 1969 antes de que se finalizara la quinta edición. Se redactó de antemano una especificación completa para la nueva versión. Esto contrasta con versiones anteriores donde los documentos de especificación se basaban en los cambios en el compilador. Kemeny y Kurtz trabajaron en esta versión, así como varios ex alumnos que regresaron como profesores: Stephen Garland, John McGeachie y Robert Hargraves. Se le dio un tiempo considerable para madurar, con una versión beta funcionando durante tres meses durante el verano de 1971, antes de que finalmente fuera lanzado el 21 de septiembre de 1971. Como resultado de esta madurez, Kurtz lo describió como "probablemente el mejor diseñado y El sistema de software más estable que Dartmouth jamás haya escrito". [sesenta y cinco]
Uno de los mayores cambios fue la sustitución del CHAIN
concepto anterior por uno mucho mejor definido CALL
que funcionaba de forma similar a GOSUB
, pero se refería a un nombre de función en lugar de un número de línea. Las funciones se definieron usando SUB...SUBEND
y tomaron parámetros arbitrarios en la llamada en lugar de usar variables globales a través de COMMON
declaraciones. Otro cambio importante fue el uso de identificadores de archivos (números) creados con el FILE
comando que es similar al OPEN
que se encuentra en la mayoría de los BASIC modernos. PRINT USING
proporcionó salida formateada de una manera algo similar a FORTRAN, [66] mientras que LINPUT
aceptó entrada sin interpretación, permitiendo escribir comas, punto y coma e incluso código BÁSICO. [67]
La Sexta Edición fue esencialmente la última versión del concepto BASIC original. Se mantuvo sin cambios durante muchos años. Las versiones posteriores eran idiomas significativamente diferentes. [sesenta y cinco]
En 1976, Stephen Garland recopiló una serie de adiciones de programación estructurada para crear Dartmouth Structured BASIC o SBASIC. [68] El objetivo principal era reemplazar las estructuras de control basadas en IF...THEN
y GOTO
con una variedad de estructuras orientadas a bloques. Lo hizo utilizando un precompilador que tomó el código fuente de SBASIC, lo convirtió a la sexta edición de BASIC y luego lo compiló y ejecutó normalmente. SBASIC también agregó una serie de funciones gráficas, basadas en el PLOT
comando que habían agregado otros programadores. [69]
Las estructuras de bloques terminaban mediante declaraciones coincidentes como era el caso en ALGOL 68 , a diferencia de las estructuras de bloques genéricas que se encuentran en lenguajes como Pascal o C. Por ejemplo, DO WHILE...
abarcó varias líneas hasta que terminó con un LOOP
. [70] También se puede salir del DO
bucle desde abajo quitando WHILE
o UNTIL
y colocando el condicional en la parte inferior de LOOP
. Se admitieron bucles infinitos usando DO FOREVER
o LOOP FOREVER
. [71]
El Dartmouth BASIC "original" no permitía declaraciones después de un THEN
, solo un número de línea al que pasar. SBASIC permitía cualquier declaración, por ejemplo . [72] Esta expansión básica del , iniciada en 1972 con BASIC-PLUS , [73] ya era ampliamente compatible con la mayoría de los BASIC en ese momento, incluidas las versiones para microcomputadoras que se estaban lanzando en ese momento. Además de esto, SBASIC agregó orientación a bloques colocando en una línea separada y luego terminando el bloque con . [74] Además de esto, SBASIC agregó el mecanismo que sobrevive hasta el día de hoy en Visual Basic .NET . [75]IF X < 5 THEN X=X+1
IF...THEN
IF
THEN
CONTINUE
SELECT CASE
SBASIC también agregó una serie de comandos gráficos destinados a ser utilizados con trazadores . Esto requirió que PLOTTER "plottername"
dirigiera los comandos posteriores a un dispositivo seleccionado y que WINDOW...
configurara sus parámetros. A partir de entonces, PLOT X,Y
produciría puntos en el trazador seleccionado, mientras que agregar el punto y coma al final de la declaración, como se usa en PRINT
, dejaría el lápiz sobre el papel y produciría una línea, por ejemplo PLOT 10,10;20,20
. [76] [77]
SBASIC eventualmente formó la base del Estándar ANSI X3.113-1987 de 1987 para Básico Completo , que amplió el Estándar ANSI X3.60-1978 anterior de 1978 para Básico Mínimo. El largo retraso en producir ese estándar, junto con la falta de consideración entre los científicos informáticos por el Básico no estructurado, llevó al comité del College Board que desarrolló el Curso de Colocación Avanzada en Ciencias de la Computación , que presidía Garland, a optar por exigir Pascal y no permitir el Básico como estándar. idioma para el curso. [78] [79]
Garland usó SBASIC para impartir el curso de introducción a la informática en Dartmouth, [80] [81] pero reescribió su libro de texto para el curso en Pascal [82] para que pudiera usarse para impartir el curso AP.
SBASIC de Garland era un precompilador escrito en el propio código fuente de SBASIC. El sistema leería la fuente SBASIC, escribiría el código correspondiente de la sexta edición y luego compilaría esa salida. La séptima edición, lanzada en 1980, era una versión de SBASIC que era un compilador independiente. Agregó una serie de adiciones propias. La mayoría de los cambios fueron elaboraciones adicionales sobre el sistema para llamar a programas externos y "superposiciones" que podrían usarse para dividir un programa en partes. En esta versión, SUB
los usuarios que comparten un solo archivo comparten efectivamente datos entre ellos. Esto proporcionó un mínimo de datos ocultos dentro del grupo de rutinas. Esta separación hoy se conocería como módulo. [83]
Además, esta edición agregó manejo de errores estructurado y matemáticas matriciales arbitrarias en LET
las declaraciones, por lo que se podría LET A = M*4
decir que M era una variable de matriz y la declaración generaría otra matriz en A con todos los elementos en M escalados en 4. Finalmente, otra actualización importante Fue el uso de registros de activación para subrutinas lo que hizo posible la recursividad . [83]
A principios de la década de 1970, el número de implementaciones de BASIC había aumentado a docenas, y todas ellas tenían sus propios cambios al concepto básico introducido en la versión original. La mayoría de ellos se basaron en la quinta edición, aunque a menudo carecían de instrucciones MAT y de la capacidad de sangrar el código. GE fue una de estas empresas; lanzaron sus sistemas Mark II con la quinta edición en lugar de esperar a que llegara la sexta unos meses después. [84] BASIC-PLUS en la plataforma DEC fue quizás la implementación más cercana, incluidos los comandos MAT, por ejemplo, pero luego agregó una serie de cambios que no eran compatibles con versiones anteriores. [40]
Después del lanzamiento de la sexta edición, Kurtz se involucró en un esfuerzo por definir un BASIC estándar. En enero de 1974 se formó un grupo de trabajo del Instituto Nacional Estadounidense de Estándares (ANSI), X3J2, y en septiembre de ese año se formó el correspondiente grupo de la Asociación Europea de Fabricantes de Computadoras (ECMA), TC21. El objetivo en aquel momento era producir dos normas relacionadas. El BASIC mínimo sería similar a la Segunda Edición, pero agregando cadenas, un estándar al que prácticamente todos los BASIC ya podrían ajustarse. El BASIC estándar agregaría más funcionalidades para producir algo más acorde con las variedades BASIC reales que se ven en el mercado. [84]
El proceso fue lento y el primer borrador de Minimal BASIC no se publicó hasta enero de 1976, lo que llevó a que fuera adoptado oficialmente en diciembre de 1977 por ECMA y en 1979 por ANSI como X3.60-1978. Minimal BASIC era similar a la tercera edición, incluidas variables de cadena, pero carecía de MAT y otras funciones avanzadas. [85] Por el contrario, el BASIC estándar tenía muchas características nuevas que no existían en otros BASIC, y muchas de ellas fueron mal consideradas y fueron objeto de algunas críticas. Por ejemplo, el estándar incluía un carácter de continuación de línea, pero eligió el signo comercial, que también se usaba para la concatenación de cadenas. Usarlos en una sola línea podría generar un código muy confuso. [86]&
Para entonces, el lanzamiento de los primeros sistemas de microcomputadoras en 1975 había llevado rápidamente a la introducción de Altair BASIC , la primera versión de lo que pronto se conocería como Microsoft BASIC . MS BASIC se basó en BASIC-PLUS y, por lo tanto, en última instancia, en la quinta edición, pero carecía de sangría, MAT y otras características. También agregó las funciones LEFT$
y RIGHT$
, rompiendo la convención de tres letras. A medida que el número de microcomputadoras creció y se convirtió en el mercado de computadoras domésticas a fines de la década de 1970, MS BASIC se convirtió en el estándar de facto . [84]
Con este rápido cambio en el mercado, el esfuerzo del Estándar BASIC se desaceleró aún más y no fue ratificado formalmente hasta 1987 como X3.113-1987. En ese momento, los estándares no tenían ningún propósito real; MS BASIC no sólo estaba en todas partes, sino que a mediados de la década de 1980 el uso de BASIC estaba disminuyendo a medida que el software de envoltura retráctil reemplazaba a los programas de escritura. Finalmente ambas normas fueron retiradas. [84]
A pesar del eventual fracaso de los esfuerzos de ANSI, el borrador del Estándar BASIC se implementó en Dartmouth como octava edición en 1982. [83]
DTSS implementó uno de los primeros entornos de desarrollo integrado (IDE): una interfaz de línea de comandos interactiva . Esto proporcionó una serie de comandos de control de trabajo y de usuario. Por ejemplo, un terminal inactivo podría conectarse a una cuenta de usuario escribiendo HELLO
y cerrar sesión nuevamente con BYE
. [mi]
Cualquier línea ingresada por el usuario y que comenzara con un número de línea se agregaba al programa, reemplazando cualquier línea previamente almacenada con el mismo número; se asumió que cualquier otra cosa era un comando DTSS y se ejecutó inmediatamente. Las líneas que consistían únicamente en un número de línea no se almacenaban, pero se eliminaban cualquier línea previamente almacenada con el mismo número. Este método de edición fue necesario debido al uso de teleimpresores como unidades terminales.
Cada cuenta de usuario podría tener cualquier cantidad de programas BASIC almacenados sin conexión, mientras que las cuentas de administrador también podrían dejar programas en almacenamiento permanente. Cualquiera de estos estaba activo en un momento determinado para una cuenta de usuario determinada y, si no se había cargado ningún programa, se suponía que había un programa nuevo. Se accedía a los programas almacenados mediante comandos que hoy en día son más conocidos como partes del propio lenguaje BASIC; por ejemplo, el LIST
comando indicó a DTSS que imprimiera el programa actualmente activo.
HELLO
BYE
BASIC
NEW
OLD
LIST
RUN
STOP
TEST
LINK
JOIN
SAVE
UNSAVE
REPLACE
CATALOG
SCRATCH
RENAME
FRI
NFR
EXP
Los usuarios a menudo creían que los comandos eran parte del lenguaje BASIC, pero, de hecho, eran parte del sistema de tiempo compartido y también se usaban al preparar programas ALGOL o FORTRAN a través de terminales DTSS.
Alrededor del 80% de todos los estudiantes de Dartmouth a finales de la década de 1960 tomaron dos cursos de matemáticas y aprendieron Básico en el segundo curso, ya sea en cálculo o en matemáticas finitas. Recibieron dos conferencias de una hora sobre Básico cerca del comienzo de estos cursos y luego tuvieron que escribir cuatro programas en Básico, desde programas para aproximar π o encontrar una raíz de un polinomio quíntico hasta programas para resolver una ecuación diferencial o encontrar (por simulación) la probabilidad límite en una cadena de Markov. El sistema TEACH/Test ayudó a los estudiantes a completar estas tareas. Cuando pensaron que tenían un programa funcional, escribieron el comando PRUEBA y un programa escrito por un instructor aprobó lo que habían escrito o les proporcionó una pista sobre dónde podrían haberse equivocado. Los estudiantes debían entregar una lista de cada programa, un RUN de muestra y una aprobación del sistema TEACH/Test. El sistema no calificaba las tareas ni mantenía un registro de cuántas veces un estudiante tecleaba TEST; simplemente ayudó a los estudiantes y sus instructores. [87] [88]
La primera versión implementó los siguientes tipos de declaraciones, tomando algunos de sus operadores y palabras clave de FORTRAN II y algunos de ALGOL 60 . En general, el lenguaje sigue más de cerca el modelo FORTRAN, [46] en el sentido de que generalmente tiene una declaración por línea de código, carece de los "bloques" de ALGOL para agrupar el código (estas construcciones de programación estructuradas fueron una razón principal para el desarrollo de ALGOL) y el uso de GOTO para controlar el flujo del programa.
De ALGOL se tomaron los FOR...TO...STEP
bucles de estilo que reemplazaron las declaraciones difíciles de manejar de FORTRAN DO...CONTINUE
. [47] BASIC también simplificó la IF...THEN
construcción para permitir comparaciones simples como , a diferencia de FORTRAN . [47] El estilo "SI calculado" de FORTRAN se reintrodujo con el comando en versiones posteriores.IF X>5 THEN GOTO 20
IF (X-5) 20,20,30
ON...GOTO
Los nombres de las variables se limitaron a A a Z, A0 a A9, B0 a B9, ..., Z0 a Z9, dando un máximo de 286 posibles variables distintas. Se eliminó el extraño sistema de FORTRAN para configurar las variables I a N como números enteros y el resto como punto flotante, y se supuso que todas las variables eran punto flotante y dimensionadas con hasta 10 elementos. El DIM
comando sólo era necesario si la matriz contenía más de diez elementos. [47] Los nombres de las matrices se restringieron únicamente de la A a la Z.
DEF
DIM
END
STOP
FOR / TO / STEP
NEXT
GOSUB
RETURN
GOTO
IF / THEN
LET / =
PRINT
DATA
READ
REM
También implementó variables numéricas y aritméticas de punto flotante.
ABS
ATN
COS
EXP
INT
LOG
RND
SIN
SQR
TAN
Las primeras versiones de BASIC no tenían la capacidad de leer ni escribir archivos externos. Para representar listas de datos que normalmente se leerían de un archivo, BASIC incluía la DATA
palabra clave, que podía ir seguida de una lista arbitrariamente larga de elementos, terminando sólo en el límite de la longitud de la línea. El DATA
no era ejecutable y se omitió si se encontraba. READ
Los comandos consumirían los datos uno por uno, manteniendo un registro de su ubicación dentro de la colección completa de DATA
elementos en un puntero interno. En la versión 3, RESTORE
se agregó un comando para restablecer el puntero al primer DATA
comando de un programa.
En este ejemplo, "los primeros tres valores de datos se leen en X, Y y Z respectivamente. El valor -1 se lee en N. Los siguientes 11 valores, de 0,1 a 0,3, se leen en los 11 elementos de la matriz B ". [89]
15 LEER X , Y , Z 20 LEER N 24 PARA I = 0 A 10 25 LEER B ( I ) 26 SIGUIENTE I 40 DATOS 4.2 , 7.5 , 25.1 , -1 , .1 , .01 , .001 , .0001 45 DATOS .2 , .02 , .002 , .0002 , .015 , .025 , .3 , .03 , .003
A diferencia de la mayoría de los BASIC posteriores, Dartmouth BASIC, desde la tercera edición en adelante, tenía una palabra clave de matriz, MAT
que podía anteponer una serie de otros comandos para operar en conjuntos completos de datos con un solo comando. En este ejemplo, del manual de 1968, se utiliza [90] MAT INPUT V
para ingresar una serie de variables. Cuando el usuario no ingresa nada en una línea, este proceso finaliza y se accede al número total de elementos en la NUM
pseudovariable. [f] Luego, el código suma todos los elementos individuales de la matriz y calcula el promedio. La tercera edición también añadió sangría, que se utiliza aquí para aclarar la estructura del bucle.
5 DEJE S = 0 10 ENTRADA MAT V 20 DEJE N = NUM 30 SI N = 0 ENTONCES 99 40 PARA I = 1 A N 45 DEJE S = S + V ( I ) 50 SIGUIENTE I 60 IMPRIMIR S / N 70 IR A 5 99 FINAL
NUM
no se implementó como una función como LEN()
, es un misterio.