En informática , un número de línea es un método utilizado para especificar una secuencia particular de caracteres en un archivo de texto . El método más común para asignar números a las líneas es asignar a cada línea un número único, comenzando en 1 para la primera línea y aumentando en 1 para cada línea sucesiva.
En el lenguaje de programación C, el número de línea de un código fuente es uno mayor que el número de caracteres de nueva línea leídos o introducidos hasta ese punto. [1]
Los programadores también podían asignar números de línea a las sentencias en lenguajes de programación más antiguos , como Fortran , JOSS y BASIC . En Fortran, no todas las sentencias necesitaban un número de línea y los números de línea no tenían que estar en orden secuencial. El propósito de los números de línea era la ramificación y la referencia mediante sentencias de formato.
Tanto JOSS como BASIC hicieron de los números de línea un elemento obligatorio de la sintaxis . La razón principal de esto es que la mayoría de los sistemas operativos de la época carecían de editores de texto interactivos ; dado que la interfaz del programador generalmente se limitaba a un editor de líneas , los números de línea proporcionaban un mecanismo por el cual se podían hacer referencias a líneas específicas del código fuente para su edición, y por el cual el programador podía insertar una nueva línea en un punto específico. Los números de línea también proporcionaban un medio conveniente para distinguir entre el código que se debía ingresar en el programa y los comandos de modo directo que se ejecutaban inmediatamente cuando el usuario los ingresaba (que no tienen números de línea).
En gran medida debido a la prevalencia de la edición de texto interactiva en los sistemas operativos modernos , los números de línea no son una característica de la mayoría de los lenguajes de programación, incluso los modernos Fortran y Basic. [2]
En Fortran , como se especificó por primera vez en 1956, los números de línea se usaban para definir patrones de entrada/salida, para especificar instrucciones que se repetirían y para la ramificación condicional. Por ejemplo: [3]
DIMENSIÓN ALFA ( 25 ), RHO ( 25 ) 1 ) FORMATO ( 5 F12 . 4 ) 2 ) LEER 1 , ALFA , RHO , ARG SUMA = 0.0 HACER 3 I = 1 , 25 SI ( ARG - ALFA ( I )) 4 , 3 , 3 3 ) SUMA = SUMA + ALFA ( I ) 4 ) VALOR = 3.14159 * RHO ( I - 1 ) IMPRIMIR 1 , ARG , SUMA , VALOR IR A 2
Al igual que el lenguaje ensamblador anterior, Fortran no suponía que cada línea necesitaba una etiqueta (número de línea, en este caso). Solo las declaraciones a las que se hacía referencia en otro lugar requerían un número de línea:
READ
comando en la línea 2 y el comando posterior PRINT
hacen referencia a esta línea.DO
bucle ejecuta la línea 3.Si bien en este ejemplo los números de línea son secuenciales, en el primer "programa [Fortran] completo pero simple" publicado los números de línea están en la secuencia 1, 5, 30, 10, 20, 2. [4]
También se pueden asignar números de línea a variables de punto fijo (por ejemplo, ASSIGN
i TO
n ) para hacer referencia a ellas en instrucciones GO TO asignadas posteriormente (por ejemplo, GO TO
n,(n1,n2,...nm) ).
En COBOL , los números de línea se especificaban en los primeros seis caracteres (el área del número de secuencia ) de las tarjetas perforadas . Esto se utilizó originalmente para facilitar la clasificación mecánica de tarjetas para asegurar la secuencia de código de programa deseada después de la manipulación manual. En realidad, el compilador ignoraba los números de línea.
En 1962, DOPE (Dartmouth Oversimplified Programming Experiment) se convirtió en uno de los primeros lenguajes de programación en requerir un número de línea para cada instrucción y en utilizar un orden secuencial de números de línea. Los números de línea se especificaron como destinos para dos comandos, C (operación de comparación, un IF aritmético) y T (operación de destino, un GO TO).
En 1963, JOSS hizo que los números de línea fueran obligatorios para cada instrucción de un programa y ordenó las líneas en orden secuencial. JOSS introdujo la idea de un único editor de línea de comandos que funcionaba como lenguaje interactivo y editor de programas. Los comandos que se escribían sin un número de línea se ejecutaban inmediatamente, en lo que JOSS denominaba "modo directo". Si la misma línea tenía como prefijo un número de línea, se copiaba en el área de almacenamiento de código del programa, lo que JOSS denominaba "modo indirecto".
A diferencia de FORTRAN antes de él o BASIC después de él, JOSS requería que los números de línea fueran números de punto fijo que consistieran en un par de números enteros de dos dígitos separados por un punto (por ejemplo, 1.1). La parte del número de línea a la izquierda del punto se conoce como "página" o "parte", mientras que la parte a la derecha se conoce como "línea"; por ejemplo, el número de línea 10.12
se refiere a la página 10, línea 12. Las ramificaciones pueden apuntar a una página o a una línea dentro de una página. Cuando se utiliza el formato posterior, la página y la línea combinadas se conocen como "paso".
Las páginas se utilizan para definir subrutinas , que regresan cuando la siguiente línea está en una página diferente. Por ejemplo, si una subrutina para calcular la raíz cuadrada de un número está en la página 3, uno podría tener tres líneas de código 3.1, 3.2 y 3.3, y se llamaría usando Do part 3.
El código regresaría a la declaración después de Do cuando llegue a la siguiente línea en una página diferente, por ejemplo, 4.1. No hay necesidad del equivalente de a RETURN
al final, aunque si se requiere un retorno temprano, Done
logra esto. Ejemplo:
*Rutina para pedirle al usuario un valor positivo y repetir hasta obtener uno01.10 Exige X como "Ingresa un valor positivo mayor que cero".01.20 Hecho si X>0.01.30 Al paso 1.1
Introducido en 1964, Dartmouth BASIC adoptó números de línea obligatorios, como en JOSS, pero los convirtió en números enteros, como en FORTRAN. Tal como se definió inicialmente, BASIC solo usaba números de línea para GOTO
y GOSUB
(ir a la subrutina, luego regresar). Algunas implementaciones de Tiny BASIC admitían expresiones numéricas en lugar de constantes, mientras que las instrucciones switch estaban presentes en diferentes dialectos ( ON
GOTO
; ON
GOSUB
; ON ERROR GOTO
).
Los números de línea rara vez se usaban en otros lugares. Una excepción era permitir que el puntero usado por READ
(que iteraba a través de DATA
las instrucciones) se estableciera en un número de línea específico usando RESTORE
.
1 REM RESTORE PODRÍA USARSE SI A UN BASIC LE FALTARAN MATRICES DE CADENAS 2 DIM M$ ( 9 ) : REM DEFINE LONGITUD DE 9 CARACTERES 5 INPUT "MES #?" ; M : SI M < 1 O M > 12 ENTONCES 5 7 RESTORE 10 * M : LEER M$ : IMPRIMIR M$ 10 DATOS "ENERO" 20 DATOS "FEBRERO" 30 DATOS "MARZO" ...
En las primeras ediciones de Dartmouth BASIC, THEN
solo podía ir seguido de un número de línea (para un GOTO implícito ), no (como en implementaciones posteriores) de una declaración.
El rango de números de línea válidos variaba ampliamente de una implementación a otra, dependiendo de la representación utilizada para almacenar el equivalente binario del número de línea (uno o dos bytes; con signo o sin signo). Mientras que Dartmouth BASIC admitía de 1 a 99999, la implementación típica de microcomputadoras admitía de 1 a 32767 (una palabra con signo de 16 bits).
1) Si bien QBASIC hace uso de programación estructurada y, por lo tanto, no necesita números de línea, aún es posible ejecutar código con números de línea en QBASIC.
En estos lenguajes, dejar espacios entre los números de línea sucesivos era una cuestión de estilo de programación , si no una necesidad absoluta; es decir, un programador usaría la secuencia (10, 20, 30, ...) en lugar de (1, 2, 3, ...). Esto permitía al programador insertar una línea de código en un momento posterior. Por ejemplo, si se omitió una línea de código entre las líneas 20 y 30, el programador podría insertar la línea olvidada en la línea número 25. Si no se dejaron espacios en la numeración, el programador tendría que renumerar la línea 3 y todas las líneas posteriores para insertar la nueva línea después de la línea 2. Por supuesto, si el programador necesitaba insertar más de nueve líneas adicionales, sería necesario renumerar incluso con la numeración más dispersa. Sin embargo, esta renumeración se limitaría a renumerar solo 1 línea por cada diez líneas agregadas; Cuando el programador descubre que necesita agregar una línea entre 29 y 30, solo será necesario renumerar la línea 30 y la línea 40 podría dejarse sin cambios.
Algunos BASIC tenían un comando RENUM , que normalmente recorría el programa (o una parte específica del mismo) y reasignaba los números de línea en incrementos iguales. También renumeraba todas las referencias a esos números de línea para que siguieran funcionando correctamente.
En un programa grande que contenga subrutinas , cada una de ellas comenzaría normalmente en un número de línea lo suficientemente grande como para dejar espacio para la expansión del programa principal (y de las subrutinas anteriores). Por ejemplo, las subrutinas podrían comenzar en las líneas 10000, 20000, 30000, etc.
En lenguajes de programación "no estructurados" como BASIC , se utilizaban números de línea para especificar los objetivos de las instrucciones de ramificación . Por ejemplo:
1 S = 0 : N = -1 2 INPUT "INGRESE UN NÚMERO PARA SUMAR, O 0 PARA FINALIZAR" ; I 3 S = S + I: N = N + 1 : SI I <> 0 ENTONCES IR A 2 4 IMPRIMIR "SUMA=" ; S: IMPRIMIR "PROMEDIO=" ; S / N
La ramificación de estilo GOTO puede llevar al desarrollo de código espagueti . (Véase Considerado perjudicial , Programación estructurada ). Incluso en algunas versiones posteriores de BASIC que todavía exigían números de línea, el uso de GOTO controlados por números de línea se eliminó gradualmente siempre que fue posible a favor de construcciones más limpias como el bucle for y el bucle while .
Muchos lenguajes modernos (incluidos C y C++ ) incluyen una versión de la declaración GOTO; sin embargo, en estos lenguajes el objetivo de un GOTO se especifica mediante una etiqueta de línea en lugar de un número de línea.
Si un programador introduce un error de sintaxis en un programa, el compilador (o intérprete ) le informará que el intento de compilación (o ejecución) falló en el número de línea indicado. Esto simplifica enormemente la tarea de encontrar el error para el programador.
El uso de números de línea para describir la ubicación de los errores sigue siendo estándar en las herramientas de programación modernas, aunque nunca se requiere que los números de línea se especifiquen manualmente. Es una cuestión simple para un programa contar las nuevas líneas en un archivo de origen y mostrar un número de línea generado automáticamente como la ubicación del error. En IDE como Microsoft Visual Studio , Eclipse o Xcode , en los que el compilador suele estar integrado con el editor de texto, el programador puede incluso hacer doble clic en un error y ser llevado directamente a la línea que contiene ese error.
{{cite book}}
: |last1=
tiene nombre genérico ( ayuda )