Por que o BASIC usou números de linha?

92

Por que antigos BASICs (e talvez outros idiomas) usam números de linha como parte do código-fonte?

Quero dizer, quais problemas resolveram (tentar)?

    
por DerMike 10.02.2016 / 15:36
fonte

9 respostas

128

O BASIC precisa ser levado em conta com suas linguagens contemporâneas: fortran, cobol e assembly.

De volta, quando eu estava mexendo na montagem do 6502 sem etiquetas, isso significava que quando você descobriu que precisava adicionar uma instrução em algum lugar no meio do código compactado (mais tarde eu adicionei NOP s) você precisava percorrer e refazer todos os endereços de salto. Isso foi demorado.

Fortran era um sistema baseado em numeração de linha que precedia o BASIC. Em Fortran, as colunas 1-5 eram um número de linha a ser usado para alvos para ramificação. A principal coisa com Fortran era que os compiladores tendiam a ser um pouco mais inteligentes do que o interpretador BASIC e adicionar algumas instruções era apenas uma questão de perfurar algumas cartas e colocá-las no baralho no lugar certo.

O BASIC, por outro lado, teve que manter todas as suas instruções ordenadas. Não havia muito de um conceito de 'continuação da linha anterior'. Em vez disso, no Applesoft BASIC (um dos dialetos amplamente usados com os quais estou familiarizado e posso encontrar informações), cada linha na memória era representada como:

NN NN   TT TT   AA BB CC DD .. .. 00

Ele tinha dois bytes para o endereço da próxima linha ( NN NN ). Dois bytes para o número de linha dessa linha ( TT TT ) e, em seguida, uma lista de tokens ( AA BB CC DD .. .. ) seguida pelo marcador de fim de linha ( 00 ). (Isto é de página 84-88 de Inside the Apple // e )

Um ponto importante a ser observado quando se olha para essa representação de memória é que as linhas podem ser armazenadas na memória fora de ordem. A estrutura da memória era a de uma lista encadeada com um ponteiro de 'próxima linha' na estrutura. Isso facilitou a adição de novas linhas entre duas linhas, mas você precisou numerar cada linha para que ela funcionasse corretamente.

Muitas vezes, ao trabalhar com o BASIC, você estava realmente trabalhando em em BASIC. Em particular, uma determinada string era um número de linha e instruções BASIC, ou um comando para o interpretador básico para RUN ou LIST . Isso facilitou a distinção entre o código e os comandos - todo código começa com números.

Essas duas informações identificam porque os números foram usados - você pode obter muita informação em 16 bits. Os rótulos baseados em seqüências de caracteres precisariam de muito mais espaço e seriam mais difíceis de serem pedidos. Os números são fáceis de trabalhar, compreensíveis e fáceis de representar.

Mais tarde, os dialetos do BASIC onde você não estava em o intérprete o tempo todo foram capazes de eliminar todas as linhas numeradas e, em vez disso, só precisaram numerar as linhas que eram os destinos das ramificações. Com efeito, rótulos.

    
por 10.02.2016 / 16:04
fonte
49

Nos primeiros microcomputadores, a edição era baseada em linhas. Você não pode simplesmente se mover livremente no código-fonte e editá-lo. Você tinha uma única linha na parte inferior da tela onde você poderia digitar comandos e digitar o código. O resto da tela era de listagens de código somente leitura e saída de comando. Se você quisesse editar a linha 90 no programa, você escreveu " EDIT 90 " e o conteúdo da linha 90 entrou no buffer de edição de linha única. Quando você editou a linha que você pressionou, digite e a listagem do programa foi atualizada. Então você precisava de números de linha para poder editar o programa.

Quando editores de código se tornaram mais avançados e permitiram que você movesse o cursor pela listagem de código, você não precisava mais de números de linha.

    
por 10.02.2016 / 16:20
fonte
43

Se você está pensando nos dialetos BASIC dos microcomputadores domésticos de 80-bit dos anos 80, então esses computadores não tinham editores de texto (a menos que você comprasse alguma aplicação de processador de texto). Não havia como ter todo o código-fonte do programa BASIC "aberto em um editor", como você faria na programação de hoje. O programador nem pensaria no programa como um arquivo de código-fonte ou texto, na verdade.

Exemplo de problema

Então, digamos que você tenha um programa simples sem números de linha na sua cabeça:

FOR I=1 TO 42
PRINT I
NEXT I

Você inicializa seu computador. Você tem um prompt "pronto" ou algo parecido, e o cursor na próxima linha. Isso é muito parecido com os ambientes de hoje REPL de diferentes linguagens de script, embora não realmente tão estritamente baseado em linha, mais como tela baseada. Então não exatamente como REPLs de hoje, mas perto.

Agora, se você começar a digitar o programa, poderá receber um erro após a primeira linha, porque o interpretador BASIC tenta executá-lo (e esquecê-lo) imediatamente, e não faz sentido sem NEXT finalizar o loop. Este não é um editor de texto onde você edita texto, é aqui que você dá comandos ao computador!

Solução parcial

Então você precisa de alguma maneira de dizer, esta é a linha do programa, armazene-a! Você poderia ter um comando especial ou apenas um símbolo dizendo que, ei, esta é a linha do programa, armazene-a. Vamos imaginar isso:

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

Ok, agora nosso intérprete BASIC imaginário armazenou o programa e você pode executá-lo. Mas agora você quer editar a linha PRINT. Como você faz isso? Você não está em um editor de texto, você não pode simplesmente mover o cursor para a linha e editá-lo. Ou você deseja adicionar outra linha como LET COUNT=COUNT+1 no loop. Como você indica onde a nova linha deve ser inserida?

Solução de trabalho

Os números de linha resolvem isso de uma maneira muito fácil, embora um pouco desajeitada. Se você inserir uma linha de programa com um número que já existe, a linha antiga será substituída. Agora o ambiente REPL baseado em tela se torna útil, porque você pode simplesmente mover o cursor para programar listando na tela, editar a linha na tela e pressionar ENTER para armazená-lo. Parece que você está editando a linha, quando na verdade você está editando texto na tela e depois substituindo toda a linha por uma nova da tela. Além disso, a inserção de novas linhas torna-se fácil se você deixar números não utilizados entre eles. Para demonstrar:

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

Depois de reinserir a linha 20 com alterações e adicionar novas linhas, pode ser

5 LET COUNT=0
10 FOR I=1 TO 42
20 PRINT "Index", I
25 LET COUNT=COUNT+1
30 NEXT I

Mais problemas que acabamos de resolver

Há o benefício (ou a maldição, pois permite o famoso código de espaguete BASIC) de poder usar números de linha como uma construção de linguagem, pelo menos como um alvo dos comandos GOTO AND GOSUB . Isso poderia ser substituído por rótulos, mas usar números de linha é muito mais simples de implementar no interpretador BASIC, que ainda era um bônus definido em um computador doméstico de 8 bits típico dos anos 80.

Mais importante, do ponto de vista da experiência do usuário, os números de linha realmente são uma interface surpreendentemente fácil, mas completa, para editar o código. Basta digitar uma linha começando com um número para inserir um novo código. Use LIST 100-200 para mostrar as linhas 100-200. Para editar uma linha, liste-a na tela, edite o texto na tela e insira novamente a linha. Para remover uma linha, edite-a para ficar vazia, isso é simplesmente dar o número da linha sem nada depois dela. Um parágrafo para descrever isso. Compare tentando descrever o uso de editores de texto antigos como edlin do DOS, ou ed ou ex do Unix: você precisa de um parágrafo (apenas uma hipérbole pequena ) apenas para explicar como o usuário pode sair deles, quando iniciado acidentalmente!

Conclusão

Outras respostas explicam como os números de linha vieram a ser. Eu estou tentando cobrir aqui, porque os números de linha sobreviveram tanto quanto eles, como eles continuaram resolvendo um problema do mundo real: Eles ofereceram uma maneira de fazer a programação real sem um editor real, de uma maneira muito simples. Uma vez editores de texto de tela inteira adequados e fáceis de usar se tornaram a maneira mais comum de editar código, ambos com limitações de hardware desaparecendo e quando a inércia das pessoas adaptando novas coisas foi superada, então os dialetos BASIC desapareceram de uso rapidamente, porque o problema central de usabilidade que eles resolveram não era mais um problema.

    
por 11.02.2016 / 07:30
fonte
17

No lugar e na época em que o Basic foi desenvolvido, o melhor dispositivo de E / S disponível era um teletipo. A edição de um programa foi feita imprimindo (em papel) uma listagem de todo o programa, ou a parte interessante do mesmo, e depois digitando linhas de substituição com números de linha.

Essa também é a razão pela qual a numeração de linha padrão era 10, então não haveria números não utilizados entre as linhas existentes.

    
por 10.02.2016 / 21:09
fonte
13

"Números de linha" significam algumas coisas diferentes.

Em primeiro lugar, tenha em mente que o conceito de "linhas" não existe há muito tempo. Muitas linguagens de programação nesta época usavam cartões perfurados , e ter números de seqüência (geralmente nas últimas colunas da placa) ajudava a recuperar o seu deck na ordem correta se você caiu, ou algo terrível aconteceu no leitor de cartões. Havia máquinas para fazer isso automaticamente.

Números de linha para uso como alvos de GOTO declarações são um conceito totalmente diferente. No FORTRAN IV, eles eram opcionais e precediam a instrução (nas colunas 1-5). Além de ser mais fácil de implementar do que os rótulos de formato livre, havia também o conceito de GOTO computado e atribuído , o que lhe permitiu saltar para um número de linha arbitrário. Isso era algo que as linguagens de programação mais modernas não tinham (embora as instruções switch estivessem próximas), mas era um truque familiar aos programadores montadores.

O BASIC foi derivado do FORTRAN, e pretendia ser mais simples de implementar e entender, forçando cada "linha" a ter um número de linha (tanto para seqüenciamento quanto como o destino de GOTO / GOSUB declarações) provavelmente uma decisão de design feita por esse motivo.

    
por 10.02.2016 / 16:08
fonte
6

Comecei a programar em COBOL que usava números de linha nas colunas 1-6 de cada linha. Como não havia IDEs nos anos 70, tudo era feito através de cartões perfurados e o número da linha era usado para identificar quais linhas na fonte original seriam substituídas e quais novas linhas seriam adicionadas. Costumávamos incrementar o número de linhas em 100 para nos dar espaço para adicionar mais linhas.

    
por 10.02.2016 / 15:51
fonte
5

O BASIC surgiu depois do FORTRAN, na era dos terminais de linha. Ele apresentava um ambiente de leitura-exe-impressão-loop que era mais interativo do que um baralho de cartas.

Aprendi a programar, em BASIC, em uma exibição de uma linha que continha 24 caracteres. Os números de linha eram um modo natural de especificar para onde você queria que uma linha fosse editada ou inserida entre outras pessoas.

Eu realmente não consigo imaginar o que mais você faria.

    
por 10.02.2016 / 17:20
fonte
1

Um ponto que ninguém mencionou ainda é que é mais fácil para os iniciantes raciocinarem sobre o fluxo do programa, onde os alvos de ramificação são explícitos. Então, em vez de ter que corresponder (possivelmente aninhado) instruções BEGIN / END (ou qualquer delimitador de bloco usado), era bem óbvio para onde o fluxo de controle ia. Isso provavelmente foi útil dado o público-alvo do BASIC (afinal de contas, é o Código de Instruções Simbólicas para Todos os Propósitos do Iniciante ).

    
por 12.02.2016 / 16:51
fonte
1

O Dartmouth Time Sharing System usou uma interface de teletipo. Assim, usou uma interface baseada em comandos. Originalmente, os números de linha eram usados apenas como meio de editar o programa. Você pode inserir, substituir ou excluir usando um número de linha. Não parece que a versão inicial usou números de linha para instruções goto, mas esta foi uma adição posterior à linguagem.

    
por 25.08.2016 / 04:09
fonte