¿Por qué los BASIC antiguos (y quizás otros idiomas) utilizan números de línea como parte del código fuente?
Quiero decir, ¿qué problemas resolvió (intentó) resolver?
¿Por qué los BASIC antiguos (y quizás otros idiomas) utilizan números de línea como parte del código fuente?
Quiero decir, ¿qué problemas resolvió (intentó) resolver?
BASIC debe ser tomado en contexto con sus lenguajes contemporáneos: temprano fortran, cobol y ensamblaje.
Anteriormente cuando era dabbling en 6502 assembly sin etiquetas, esto significaba que cuando descubrió que necesitaba agregar una instrucción en algún lugar en medio de un código bien empaquetado (más tarde agregué NOP s) necesitabas pasar y rehacer todas las direcciones de salto. Esto consumía mucho tiempo.
Fortran era un sistema basado en líneas numeradas que era anterior al BÁSICO. En Fortran, las columnas 1-5 eran un número de línea que se usaba para los objetivos para la bifurcación. La clave con Fortran era que los compiladores solían ser un poco más inteligentes que el intérprete de BASIC y agregar algunas instrucciones era solo cuestión de perforar algunas tarjetas y colocarlas en el mazo en el lugar correcto.
BÁSICO, por otro lado, tenía que mantener todas sus instrucciones ordenadas. No había mucho de un concepto de "continuación de la línea anterior". En cambio, en Applesoft BASIC (uno de los dialectos más utilizados con los que estoy familiarizado y en el que puedo encontrar información), cada línea en la memoria se representaba como:
NN NN TT TT AA BB CC DD .. .. 00
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 final de línea ( 00
). (Esto es de página 84-88 de Inside the Apple // e )
Un punto importante a tener en cuenta cuando se mira esa representación de la 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 enlazada con un puntero de 'línea siguiente' 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, al trabajar con BASIC, en realidad estaba trabajando en BASIC. En particular, una cadena dada era un número de línea e instrucciones BÁSICAS, o un comando al intérprete básico para RUN
o LIST
. Esto facilitó la distinción entre el código y los comandos: todo el código comienza con números.
Estas dos piezas de información identifican por qué se usaron los números: puede obtener mucha información en 16 bits. Las etiquetas basadas en cadenas necesitarían mucho más espacio y son más difíciles de ordenar. Los números son fáciles de trabajar, comprensibles y fáciles de representar.
Más tarde, los dialectos BÁSICOS en los que no era en el intérprete todo el tiempo podían eliminar todas las líneas numeradas y solo se necesitaban para numerar las líneas que eran objetivos de sucursales. En efecto, las etiquetas.
En los primeros microcomputadores, la edición estaba basada en líneas. No puedes moverte 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 el código. El resto de la pantalla eran listas de códigos de solo lectura y salida de comando. Si desea editar, diga la línea 90 en el programa que escribió " EDIT 90
", y el contenido de la línea 90
ingresó en el búfer de edición de una sola línea. Cuando haya editado la línea, pulse Intro y se actualizó la lista de programas. Así que necesitabas números de línea para poder editar el programa.
Cuando los editores de código pasaron a ser más avanzados y le permitieron mover el cursor en la lista de códigos, ya no necesitaba más números de línea.
Si está pensando en dialectos BÁSICOS de las microcomputadoras domésticas de 8 bits de los 80, entonces esas computadoras no tenían editores de texto (a menos que comprara alguna aplicación de procesador de textos). No había manera de tener el código fuente del programa BASIC completo "abierto en un editor", como lo haría cuando programara hoy. El programador ni siquiera pensaría en el programa como un archivo de código fuente, o texto, realmente.
Entonces, digamos que tienes un programa simple sin números de línea en tu cabeza:
FOR I=1 TO 42
PRINT I
NEXT I
Usted arranca su computadora. Tiene un mensaje "listo" o algo así, y el cursor está en la línea siguiente. Esto es muy parecido a los REPL de hoy en día de diferentes lenguajes de scripting, aunque no realmente tan estrictamente basado en línea, más como basado en pantalla Así que no es como los REPL de hoy, pero están cerca.
Ahora, si comienza a ingresar al programa, podría obtener un error después de la primera línea, porque el intérprete BÁSICO intenta ejecutarlo (y olvidarlo) de inmediato, y no tiene sentido sin SIGUIENTE terminar el ciclo. Este no es el editor de texto donde editas texto, ¡aquí es donde le das comandos a la computadora!
Así que necesitas una manera de decir, esta es la línea del programa, ¡guárdala! Podría tener un comando especial o simplemente un símbolo que diga que hey, esto es línea de programa, guárdelo. Imaginemos esto:
#FOR I=1 TO 42
#PRINT I
#NEXT I
Bien, ahora nuestro intérprete BÁSICO imaginario almacenó el programa y puede ejecutarlo. Pero ahora desea editar la línea de impresión. ¿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 indica dónde debe insertarse la nueva línea?
Los números de línea resuelven esto de una manera muy fácil, aunque un tanto torpe. Si ingresa una línea de programa con un número que ya existe, se reemplaza la línea anterior. Ahora el entorno REPL basado en pantalla se vuelve útil, porque puede simplemente mover el cursor para programar listado en la pantalla, editar la línea en la pantalla y presionar ENTER para almacenarlo. Parece que está editando la línea, cuando en realidad está editando texto en la pantalla y luego reemplaza la línea completa por una nueva desde la pantalla. Además, la inserción de nuevas líneas se vuelve fácil si deja números no utilizados en el medio. Para demostrar:
10 FOR I=1 TO 42
20 PRINT I
30 NEXT I
Después de volver a ingresar la línea 20 con los cambios y agregar nuevas líneas, podría ser
5 LET COUNT=0
10 FOR I=1 TO 42
20 PRINT "Index", I
25 LET COUNT=COUNT+1
30 NEXT I
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 objetivo de los comandos GOTO
AND GOSUB
. Esto podría ser reemplazado por etiquetas, pero el uso de números de línea es mucho más sencillo de implementar en el intérprete BASIC, que aún era una ventaja definitiva en una computadora doméstica típica de 8 bits de los años 80.
Y lo que es más importante, 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 las líneas 100-200. Para editar una línea, enumérela en la pantalla, edite el texto en la pantalla y vuelva a ingresar la línea. Para eliminar una línea, edítela para que esté vacía, es decir, simplemente asigne un número de línea sin nada después. Un párrafo para describir esto. Compare tratando 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 pequeña hipérbole ) ¡solo para explicar cómo el usuario puede salir de ellos, cuando se inicia accidentalmente!
Otras respuestas explican cómo llegaron 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 resolvieron un problema del mundo real: ofrecieron una manera de hacer la programación real sin un editor real, de una manera muy simple. Una vez que fueron correctos, los editores de texto de pantalla completa y fáciles de usar se convirtieron en la forma principal de editar el código, tanto con la desaparición de las limitaciones de hardware como cuando se superó la inercia de las personas que adaptan nuevas cosas, luego los dialectos BÁSICOS basados en el número de línea desaparecieron rápidamente de uso, porque el problema principal de usabilidad que resolvieron ya no era un problema.
En el lugar y la é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 de él, y luego escribiendo Líneas de reemplazo con números de línea.
También es por eso que la numeración de líneas predeterminada era de 10, por lo que habría números no utilizados entre las líneas existentes.
"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 era utilizaron 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 algo horrible pasó en el lector de tarjetas. Había máquinas para hacer esto automáticamente.
Los números de línea para uso como objetivos de GOTO
enunciados es un concepto totalmente diferente. En FORTRAN IV, eran opcionales y precedían a la declaración (en las columnas 1 a 5). Además de ser más fáciles de implementar que las etiquetas de formato libre, también existía el concepto de GOTO calculado y asignado , que le permitió 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 las declaraciones switch
se acercan), pero fue un truco familiar para los programadores de ensambladores.
BASIC se derivó de FORTRAN, y se diseñó para que fuera más fácil de implementar y entender, por lo que forzar a cada "línea" a tener un número de línea (tanto para la secuenciación como para el objetivo de GOTO
/ GOSUB
) fue Probablemente una decisión de diseño tomada por esa razó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 existían IDE en la década de 1970, todo se hizo mediante tarjetas perforadas y el número de línea se usó para identificar qué líneas de la fuente original debían reemplazarse y qué nuevas líneas se agregaron. Solíamos incrementar los números de línea en 100 para darnos espacio para agregar más líneas.
BASIC se produjo más tarde que FORTRAN, en la era de la línea de terminales. Presentaba un entorno de lectura-impresión-bucle que era más interactivo que un mazo 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 desea que vaya una línea, ya sea editando una o insertándola entre otras.
Realmente no puedo imaginar de qué otra manera lo harías.
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 sucursales son explícitos. Así que, en lugar de tener que coincidir (posiblemente anidadas) con las instrucciones BEGIN / END (o cualquier otro delimitador de bloque que se usara), era bastante obvio dónde se dirigía el flujo de control. Probablemente esto fue útil dado el público objetivo de BASIC (después de todo, es el Código de instrucción simbólico de uso múltiple Principiante ).
El sistema de tiempo compartido de Dartmouth usaba una interfaz de teletipo. Por lo tanto, utiliza 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 declaraciones de goto, pero esto fue una adición posterior al lenguaje.
Lea otras preguntas en las etiquetas history language-design source-code