¿Por qué los viejos BASIC (y quizás otros idiomas) usaban números de línea como parte del código fuente?
Quiero decir, ¿qué problemas resolvió?
language-design
history
source-code
DerMike
fuente
fuente
Respuestas:
BASIC necesita ser tomado en contexto con sus lenguajes contemporáneos: fortran temprano, cobol y ensamblaje.
Cuando estaba incursionando en el ensamblaje 6502 sin etiquetas, esto significaba que cuando descubría que necesitaba agregar una instrucción en algún lugar en el medio del código apretado (luego agregué NOP ), necesitaba pasar y rehacer todo el salto direcciones. Esto llevó mucho tiempo.
Fortran era un sistema basado en una línea numerada anterior a BASIC. En Fortran, las columnas 1 a 5 eran un número de línea que se utilizaría para los objetivos de ramificación. Lo importante con Fortran era que los compiladores tendían a ser un poco más inteligentes que el intérprete BASIC y agregar algunas instrucciones era solo cuestión de perforar algunas cartas y colocarlas en el mazo en el lugar correcto.
BASIC, por otro lado, tenía que mantener todas sus instrucciones ordenadas. No había mucho concepto de una 'continuación de la línea anterior'. En cambio, en Applesoft BASIC (uno de los dialectos ampliamente utilizados con el que estoy familiarizado y puedo encontrar información) cada línea en la memoria se representó como:
Tenía dos bytes para la dirección de la siguiente línea (
NN NN
). Dos bytes para el número de línea de esta línea (TT TT
), y luego una lista de tokens (AA BB CC DD .. ..
) seguida del marcador de fin de línea (00
). (Esto es de la página 84-88 de Inside the Apple // e )Un punto importante a tener en cuenta al mirar esa representación de memoria es que las líneas se pueden almacenar en la memoria fuera de orden. La estructura de la memoria era la de una lista vinculada con un puntero de 'próxima línea' en la estructura. Esto facilitó la adición de nuevas líneas entre dos líneas, pero tuvo que numerar cada línea para que funcione correctamente.
Muchas veces cuando trabajabas con BASIC, en realidad estabas trabajando en BASIC. En particular, una cadena dada era un número de línea e instrucciones BÁSICAS, o un comando para el intérprete básico para
RUN
oLIST
. Esto facilitó la distinción del código de los comandos: todo el código comienza con números.Estas dos piezas de información identifican por qué se utilizaron los números: puede obtener mucha información en 16 bits. Las etiquetas basadas en cadenas tomarían mucho más espacio y son más difíciles de ordenar. Los números son fáciles de trabajar, comprensibles y más fáciles de representar.
Los dialectos BÁSICOS posteriores en los que no estaba en el intérprete todo el tiempo pudieron eliminar todas las líneas numeradas y, en cambio, solo necesitaban numerar las líneas que eran blancos de ramificación. En efecto, etiquetas.
fuente
] CALL -936
* F666 G
$ ...
Sí, FP básico para empezar.] PRINT "FOO"
fue ejecutado por el intérprete BASIC de inmediato. Es una declaración. Si quisieras ejecutarlo más tarde, lo harías] 10 PRINT "FOO"
y luego] RUN
. En el entorno BASIC de AppleSoft, cada instrucción BASIC podría ejecutarse de inmediato o retrasarse; solo había unos pocos comandos proporcionados por DOS que no eran instrucciones BASIC válidas. La diferenciación entre una declaración ahora y una declaración posterior fue el número de línea. También puede modificar una declaración demorada al volver a ingresar el número de línea correspondiente. También puede poner varias declaraciones en una línea::
En los primeros microordenadores, la edición se basaba en líneas. No podría simplemente moverse libremente en el código fuente y editar. Tenía una sola línea en la parte inferior de la pantalla donde podía escribir comandos e ingresar código. El resto de la pantalla era listados de códigos de solo lectura y salida de comandos. Si desea editar, diga la línea 90 en el programa que escribió "
EDIT 90
", y el contenido de la línea90
ingresó en el búfer de edición de una sola línea. Cuando editó la línea, presionó Intro y se actualizó la lista de programas. Entonces necesitabas números de línea para poder editar el programa.Cuando los editores de código se hicieron más avanzados y le permitieron mover el cursor en la lista de códigos, ya no necesitaba números de línea.
fuente
Si está pensando en dialectos BÁSICOS de las microcomputadoras domésticas de 8 bits de los años 80, esas computadoras no tenían editores de texto (a menos que haya comprado alguna aplicación de procesador de textos). No había forma de tener todo el código fuente del programa BASIC "abierto en un editor", como lo haría al programar hoy. El programador ni siquiera pensaría en el programa como un archivo de código fuente, o texto, realmente.
Problema de ejemplo
Entonces, supongamos que tiene un programa simple sin números de línea en su cabeza:
Arrancas tu computadora. Tiene un mensaje "listo" o algo así y un cursor sentado en la línea siguiente. Esto es muy parecido a los entornos REPL actuales de diferentes lenguajes de scripting, aunque en realidad no es tan estrictamente basado en líneas, sino más bien como basado en pantalla. Así que no se parecen mucho a las REPL de hoy, pero están cerca.
Ahora, si comienza a ingresar al programa, es posible que obtenga un error después de la primera línea, porque el intérprete BASIC intenta ejecutarlo inmediatamente (y olvidarlo), y no tiene sentido sin NEXT para finalizar el ciclo. Este no es un editor de texto donde editas texto, ¡aquí es donde le das comandos a la computadora!
Solución parcial
Así que necesita alguna forma de decir, esta es la línea del programa, ¡guárdela! Podría tener un comando especial o simplemente un símbolo que le diga: hey, esta es la línea del programa, guárdela. Imaginemos esto:
Ok, ahora nuestro intérprete BASIC imaginario almacenó el programa y puedes ejecutarlo. Pero ahora desea editar la línea IMPRIMIR. ¿Cómo lo haces? No está en un editor de texto, no puede simplemente mover el cursor a la línea y editarlo. O desea agregar otra línea como
LET COUNT=COUNT+1
en el bucle. ¿Cómo se indica dónde se debe insertar la nueva línea?Solución de trabajo
Los números de línea resuelven esto de una manera muy fácil, aunque bastante poco convincente. Si ingresa una línea de programa con un número que ya existe, la línea anterior se reemplaza. Ahora el entorno REPL basado en pantalla se vuelve útil, ya que puede mover el cursor a la lista de programas en la pantalla, editar la línea en la pantalla y presionar ENTER para almacenarla. Parece que está editando la línea, cuando de hecho está editando texto en la pantalla y luego reemplazando toda la línea por una nueva desde la pantalla. Además, insertar nuevas líneas se vuelve fácil si deja números no utilizados en el medio. Demostrar:
Después de volver a ingresar la línea 20 con cambios y agregar nuevas líneas, podría ser
Más problemas que acabamos de resolver
Existe el beneficio (o la maldición, ya que permite el famoso código de espagueti BASIC) de poder usar números de línea como una construcción de lenguaje, al menos como un objetivo de comandos
GOTO
ANDGOSUB
. Esto podría ser reemplazado por etiquetas, pero el uso de números de línea es mucho más simple de implementar en el intérprete BASIC, que todavía era una ventaja definitiva en una computadora hogareña típica de 8 bits de los años 80.Más importante aún, desde la perspectiva de la experiencia del usuario, los números de línea realmente son una interfaz sorprendentemente fácil pero completa para editar el código. Simplemente escriba una línea que comience con un número para insertar un nuevo código. Use
LIST 100-200
para mostrar líneas 100-200. Para editar una línea, enumerarla en la pantalla, editar texto en la pantalla y volver a ingresar la línea. Para eliminar una línea, edítela para que esté vacía, es decir, simplemente dé el número de línea sin nada después. Un párrafo para describir esto. Compare el intento de describir el uso de editores de texto antiguos como edlin de DOS, o ed o ex de Unix: necesita un párrafo (solo una ligera hipérbole) solo para explicar cómo el usuario puede salir de ellos, cuando se inicia accidentalmente.Conclusión
Otras respuestas explican cómo surgieron los números de línea. Estoy tratando de cubrir aquí, por qué los números de línea sobrevivieron tanto como lo hicieron, cómo continuaron resolviendo un problema del mundo real: ofrecieron una forma de hacer la programación real sin un editor real, de una manera muy simple. Una vez que los editores de texto de pantalla completa adecuados y fáciles de usar se convirtieron en la forma principal de editar código, desaparecieron las limitaciones de hardware y cuando se superó la inercia de las personas que adaptaban cosas nuevas, los dialectos BASIC basados en números de línea desaparecieron rápidamente del uso, porque El problema central de usabilidad que resolvieron ya no era un problema.
fuente
En el lugar y época en que se desarrolló Basic, el mejor dispositivo de E / S disponible era un teletipo. La edición de un programa se realizó imprimiendo (en papel) una lista de todo el programa, o la parte interesante del mismo, y luego escribiendo líneas de reemplazo con números de línea.
Esa es también la razón por la cual la numeración de línea predeterminada era 10, por lo que habría números no utilizados entre las líneas existentes.
fuente
ren
' comando, para renumerar. Una invocación típica eraren 10, 10
(renumerar a partir de las diez, por incremento a diez - el comportamiento predeterminado si uno acaba de escribirren
. Elgoto
egosub
ythen (linenumber)
. Comandos se actualizan automáticamente, pero esto definitivamente no estaba disponible en los primeros básico, pero IIRC, estaba disponible en Apple. Integer Basic, Applesoft FP basic, TI Basic / Extended Basic, MS Basic / GW Basic, etc."Números de línea" significa algunas cosas diferentes.
En primer lugar, tenga en cuenta que el concepto de "líneas" no ha existido desde siempre. Muchos lenguajes de programación en esta época usaban tarjetas perforadas , y tener números de secuencia (generalmente en las últimas columnas de la tarjeta) lo ayudó a recuperar su mazo en el orden correcto si lo dejó caer, o sucedió algo horrible en el lector de tarjetas. Había máquinas para hacer esto automáticamente.
Los números de línea para usar como objetivos de
GOTO
declaraciones son un concepto totalmente diferente. En FORTRAN IV, eran opcionales y precedieron a la declaración (en las columnas 1-5). Además de ser más fácil de implementar que las etiquetas de forma libre, también existía el concepto de GOTO calculado y asignado , que le permitía saltar a un número de línea arbitrario. Esto era algo que la mayoría de los lenguajes de programación modernos no tienen (aunque lasswitch
declaraciones se acercan), pero era un truco familiar para los programadores de ensambladores.BASIC se derivó de FORTRAN, y tenía la intención de ser más simple de implementar y comprender, por lo que obligar a cada "línea" a tener un número de línea (tanto para la secuencia como para el objetivo de
GOTO
/GOSUB
declaraciones) fue probablemente una decisión de diseño tomada por esa razón.fuente
goto array_of_labels[some_computation()];
GOTO
(oASSIGN
) y el original también conocido como aritmética, también conocido como tripartitoIF
, y (raramente usado) retornos alternativosCALL
y tipo de objetivos (posiblemente delimitadores)DO
yFORMAT
declaraciones. En otras declaraciones fueron opcionales.GOTO 1000+N*100
para emular unaswitch
declaración.Comencé a programar en COBOL que usaba números de línea en las columnas 1-6 de cada línea. Debido a que no había IDE en la década de 1970, todo se hizo a través de tarjetas perforadas y el número de línea se usó para identificar qué líneas en la fuente original se iban a reemplazar y qué líneas nuevas se agregaron. Solíamos incrementar los números de línea en 100 para darnos espacio para agregar más líneas.
fuente
BASIC surgió más tarde que FORTRAN, en la era de la línea terminal. Presentaba un entorno read-exe-print-loop que era más interactivo que una baraja de cartas.
Aprendí a programar, en BASIC, en una pantalla de una línea que contenía 24 caracteres. Los números de línea eran una forma natural de especificar dónde quería que fuera una línea, ya sea editando una o insertando entre otras.
Realmente no puedo imaginar cómo lo harías.
fuente
Un punto que nadie ha mencionado aún es que es más fácil para los principiantes razonar sobre el flujo del programa donde los objetivos de las ramas son explícitos. Entonces, en lugar de tener que hacer coincidir (posiblemente anidadas) las declaraciones BEGIN / END (o cualquier delimitador de bloque utilizado), era bastante obvio dónde iba el flujo de control. Esto probablemente fue útil dado el público objetivo de BASIC ( después de todo, es el Código de Instrucción Simbólica para Principiantes ).
fuente
Dartmouth Time Sharing System utilizaba una interfaz de teletipo. Por lo tanto, utilizó una interfaz basada en comandos. Originalmente, los números de línea solo se usaban como un medio para editar el programa. Puede insertar, reemplazar o eliminar utilizando un número de línea. No parece que la versión anterior usara números de línea para las instrucciones goto, pero esta fue una adición posterior al lenguaje.
fuente