¿Por qué BASIC usó números de línea?

95

¿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ó?

DerMike
fuente
27
Si ya ha realizado un serio esfuerzo de investigación, no entierre información al respecto en los comentarios, edite su pregunta en consecuencia. Además, Google me llevó directamente aquí: stackoverflow.com/questions/541421/… y aquí stackoverflow.com/questions/2435488/…
Doc Brown
13
Estoy votando para cerrar esta pregunta como fuera de tema porque la respuesta ya está en stackoverflow .
Andres F.
66
Applesoft BASIC fue el primer lenguaje de programación que aprendí. Recuerdo haber escuchado que Pascal no tiene números de línea y decía "¿Pero cómo hago un GOTO sin números de línea? ¿Cómo se supone que funciona?"
Jens Schauder
14
Es curioso, la última vez que lo comprobé, estábamos evaluando si la pregunta era sobre un tema basado en su contenido, no en el contenido de otros sitios (y presumiblemente respuestas que yacen allí).
MatthewRock

Respuestas:

130

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:

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 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 RUNo LIST. 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
3
Buena salsa, me había olvidado del Mini Ensamblador. Eso trae recuerdos .
Blrfl
3
@Blrfl Si la memoria sirve ... ] CALL -936 * F666 G $ ... Sí, FP básico para empezar.
3
No, ese era el editor de línea. Los comandos se identificaron al no tener números de línea. Las declaraciones fueron precedidas por números de línea para indicar que eran declaraciones y para indicar dónde se fueron y / o qué línea sobrescribieron. Esa fue la parte incorporada del editor de línea de BASIC, no era una herramienta o entorno separado.
RBarryYoung
3
@RBarryYoung ] 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::
44
Como se señaló en el artículo de Wikipedia ( en.wikipedia.org/wiki/Dartmouth_BASIC ) " DTSS (Dartmouth Time Sharing System) implementó una temprana ... interfaz interactiva de línea de comando ... Cualquier línea que comience con un número de línea, se agregó a el 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ó de inmediato ... Este método de edición fue necesario debido al uso de teleimpresoras como unidades terminales para el sistema Dartmouth Timesharing. "
RBarryYoung
50

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ínea 90ingresó 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.

JacquesB
fuente
38
¿Editar una línea? ¡Lujo! Los primeros BASIC que utilicé te hicieron volver a escribir toda la línea. Lo cual realmente apestaba cuando tenías que renumerar una subrutina.
TMN
48
¿Pantalla? Que pantalla En mi primer Basic, la "pantalla" era un rollo de papel.
ddyer
18
@ddyer: ¡soñaba con tener un rollo de papel! Todo lo que teníamos era un montón de electrodos. Por la noche, cuando se suponía que el trabajo debía realizarse, tendríamos que alinearnos en una fila y observar quién se electrocutó, para ver si el programa funcionaba correctamente. ... - En serio, estoy asombrado de que la gente realmente lograra escribir programas de trabajo en aquellos días.
Leftaroundabout
26
¡Electricidad! Sangriento de lujo. Solíamos cincelar nuestros comandos en granito
Michael Durrant
10
@TMN y ddyer OK, ambos saben a dónde se dirige esto, ¿verdad ...? ;-D ==> dilbert.com/strip/1992-09-08 ==> imgs.xkcd.com/comics/real_programmers.png
Baard Kopperud
45

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:

FOR I=1 TO 42
PRINT I
NEXT I

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:

#FOR I=1 TO 42
#PRINT I
#NEXT I

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+1en 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:

10 FOR I=1 TO 42
20 PRINT I
30 NEXT I

Después de volver a ingresar la línea 20 con 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

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 GOTOAND GOSUB. 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-200para 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.

Hyde
fuente
44
Lo lograste. Tener una pantalla de varias líneas en lugar de solo una tty de impresión o una sola línea hace que sea más fácil, pero sin un concepto de archivo fuente todavía está orientado a la línea.
JDługosz
Sin embargo, el hecho de que el sistema sea una arquitectura de 8 bits no es realmente el factor limitante. Ahora bien, el hecho de que dicho sistema podría tener sólo unos pocos kilobytes de RAM y un puñado de kilobytes de ROM, y, posiblemente, incluso sin almacenamiento permanente (si su casette grabador de cinta se rompió) ...
una CVn
todavía es difícil imaginar la codificación sin un editor de texto
phuclv
@ LưuVĩnhPhúc Bueno, hay muchos emuladores para ejecutar "lo real", como casi cualquier computadora doméstica de 8 bits, o MSDOS y su GWBASIC con dosbox. Solo como ejemplo, puede obtener uno de los muchos emuladores C64 y luego Google para encontrar su Guía del usuario en PDF :-)
hyde
1
@phuclv: difícil de imaginar codificación sin un editor de texto ahora. En ese momento, es difícil imaginar las molestias de tener que usar un editor de texto, guardarlo y compilarlo antes de que pueda ejecutarse ... y eso es realmente lo que vino después al mundo de las PC; Pascal y C. Ambos lenguajes compilados, ambos libremente editables con un editor de texto, ambos definitivamente no son un entorno de programación en sí mismos (BASIC era tanto un entorno de programación como un entorno de tiempo de ejecución). Pascal fue mi siguiente idioma, y ​​en muchos sentidos bastante liberador. Definitivamente más poderoso. Pero de otras maneras, un poco menos emocionante.
DavidO
17

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.

ddyer
fuente
1
En realidad, los lectores de tarjetas (acompañados de teclados) y la impresora de línea eran mejores dispositivos de E / S que una teleimpresora, pero las teleimpresoras eran mucho más baratas.
supercat
La numeración de líneas por 10 era un estándar de facto, no un requisito riguroso. Y muchos BÁSICOS tenían un ' ren' comando, para renumerar. Una invocación típica era ren 10, 10(renumerar a partir de las diez, por incremento a diez - el comportamiento predeterminado si uno acaba de escribir ren. El gotoe gosuby then (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.
DavidO
13

"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 GOTOdeclaraciones 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 las switchdeclaraciones 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/ GOSUBdeclaraciones) fue probablemente una decisión de diseño tomada por esa razón.

Mike Harris
fuente
2
Ah, gotos calculados y asignados. Memorias de matrices de variables de etiqueta en PL / 1, recorriendo una matriz para encontrar una coincidencia y luego usando ese índice de matriz de coincidencias como el índice en la matriz de variables de etiqueta para hacer un goto. O Cobol alteró los gotos. ¡Y tampoco usando números de línea! BBC basic tenía una declaración de renumeración que fue muy útil.
Kickstart
GCC permite GOTO calculados como una extensión (aunque no con un número de línea directamente, por supuesto), puede hacer cosas comogoto array_of_labels[some_computation()];
user253751
Menor: FORTRAN requirió etiquetas para objetivos de GOTO(o ASSIGN) y el original también conocido como aritmética, también conocido como tripartito IF, y (raramente usado) retornos alternativos CALLy tipo de objetivos (posiblemente delimitadores) DOy FORMATdeclaraciones. En otras declaraciones fueron opcionales.
dave_thompson_085
Algunos BÁSICOS (por ejemplo, el de Atari) incluso permitieron el uso de expresiones numéricas arbitrarias en las declaraciones GOTO. Entonces, con una convención de numeración de línea adecuada, podría escribir GOTO 1000+N*100para emular una switchdeclaración.
dan04
6

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.

Keith Miller
fuente
14
COBOL no usó esos números de línea. Eran estrictamente convenientes, de modo que cuando un pobre schlub dejó caer su mazo, y las cartas se fueron a todas partes, él podía simplemente recogerlas y pasarlas por el clasificador de tarjetas para que volvieran al orden correcto. NO estaba obligado a marcar los números de línea en las tarjetas. (Los estudiantes no. Las tiendas de producción sí.)
John R. Strohm
5

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.

JDługosz
fuente
2
Esto no parece ofrecer nada sustancial sobre los puntos hechos y explicados en las 4 respuestas anteriores
mosquito
2
Eso lo hace malo? Creo que Jaques realmente no cubrió la esencia de la edición de una línea con respecto a la inserción de líneas y el seguimiento mental del código.
JDługosz
1
@jameslarge ¿Echo de menos ese punto en el párrafo que comienza con "Muchas veces cuando trabajo con BASIC ..."? También dudo en llamar a BASIC el sistema operativo. Eso fue DOS. Y DOS no necesitaba BASIC, es justo en lo que tenía la mayor parte del tiempo para trabajar.
2
@ Ian, si bien es cierto, fue diseñado para un sistema que utilizaba teletipos para io (el Sistema de Tiempo Compartido de Dartmouth).
Jules
3
@MichaelT, ¡Uy! Retiraré la mitad de mi comentario, pero mantendré la parte de que BASIC es el sistema operativo en algunas computadoras. Estoy pensando; Apple] [, TI 99/4, IBM 5100, HP 9830a, Compucolor 8001, TRS-80 Modelo 1, Comodore Vic20, Sinclair ZX80 y otros. Todo arrancado en BASIC desde ROM. Algunos tenían un sistema operativo opcional que podía cargarse desde un casete de audio o desde un disquete si pagaba el $$ extra por una unidad de disquete.
Solomon Slow
1

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 ).

TMN
fuente
1

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.

C. Fugate
fuente