Por que o BASIC usou números de linha?

95

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

Quero dizer, que problemas isso (tentou) resolver?

DerMike
fonte
27
Se você já fez algum esforço sério de pesquisa, não esconda informações sobre isso nos comentários, edite sua pergunta de acordo. Além disso, o Google me levou diretamente aqui: stackoverflow.com/questions/541421/… e aqui stackoverflow.com/questions/2435488/…
Doc Brown
13
Estou votando para fechar esta pergunta como off-topic, porque a resposta está no stackoverflow .
Andres F.
6
O Applesoft BASIC foi a primeira linguagem de programação que aprendi. Lembro-me de ouvir que Pascal não tem números de linha e dizer "Mas como faço um GOTO sem números de linha? Como isso funciona?"
Jens Schauder
14
Engraçado, da última vez que verifiquei, estávamos julgando se a pergunta estava no tópico com base em seu conteúdo, não no conteúdo de outros sites (e provavelmente respostas que estão lá).
MatthewRock 11/02

Respostas:

130

O BASIC precisa ser contextualizado com suas linguagens contemporâneas: fortran, cobol e assembly iniciais.

Quando estava mexendo na montagem 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 adicionei os NOPs ), precisava passar e refazer todo o salto endereços. Isso consumia tempo.

O Fortran era um sistema baseado em numeração de linhas anterior ao BASIC. No Fortran, as colunas 1 a 5 eram um número de linha a ser usado para destinos de ramificação. O principal com o Fortran era que os compiladores tendiam a ser um pouco mais inteligentes que o intérprete do BASIC, e adicionar algumas instruções era apenas uma questão de perfurar algumas cartas e colocá-las no baralho no lugar certo.

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

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

Tinha dois bytes para o endereço da próxima linha ( NN NN). Dois bytes para o número da linha desta linha ( TT TT) e, em seguida, uma lista de tokens ( AA BB CC DD .. ..) seguidos pelo marcador de fim de linha ( 00). (Isso é da página 84-88 de Por dentro da Apple // e )

Um ponto importante a ser observado ao observar 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 vinculada com um ponteiro de 'próxima linha' na estrutura. Isso facilitou a adição de novas linhas entre duas linhas - mas você precisava numerar cada linha para que funcionasse corretamente.

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

Essas duas informações identificam por que os números foram usados ​​- você pode obter muitas informações em 16 bits. Os rótulos baseados em cadeias exigiriam muito mais espaço e são mais difíceis de solicitar. Os números são fáceis de trabalhar, compreensíveis e fáceis de representar.

Os dialetos BASIC posteriores, onde você não estava no intérprete o tempo todo, foram capazes de eliminar todas as linhas numeradas e, em vez disso, precisavam apenas numerar as linhas que eram alvos de ramificação. Com efeito, rótulos.


fonte
3
Bom molho, eu tinha esquecido o Mini Assembler. Isso traz de volta memórias .
Blrfl
3
@Blrfl Se a memória servir ... ] CALL -936 * F666 G $ ... Sim, FP básico para começar.
3
Não, esse era o editor de linha. Os comandos foram identificados por não ter números de linha. As declarações foram precedidas por números de linha para indicar que eram declarações e para indicar se foram e / ou que linha substituíram. Esse era o editor de linha integrado do BASIC, não era uma ferramenta ou ambiente separado.
RBarryYoung
3
O @RBarryYoung ] PRINT "FOO"foi executado pelo intérprete do BASIC imediatamente. É uma afirmação. Se você quiser executá-lo mais tarde, você faria ] 10 PRINT "FOO"e depois ] RUN. No ambiente AppleSoft BASIC, todas as instruções BASIC podiam ser executadas imediatamente ou atrasadas - havia apenas alguns comandos fornecidos pelo DOS que não eram instruções BASIC válidas. A diferenciação entre uma instrução agora e uma instrução mais tarde era o número da linha. Você também pode modificar uma declaração atrasada reinserindo o número da linha correspondente. Você também pode colocar várias instruções em uma linha::
4
Conforme observado no artigo da Wikipedia ( en.wikipedia.org/wiki/Dartmouth_BASIC ) "O DTSS (Dartmouth Time Sharing System) implementou uma interface de linha de comando interativa antiga ... Qualquer linha que comece com um número de linha foi adicionada a o programa, substituindo qualquer linha anteriormente armazenada pelo mesmo número; qualquer outra coisa foi assumida como sendo um comando DTSS e imediatamente executada ... Esse método de edição foi necessário devido ao uso de tele-impressoras como unidades terminais do sistema Dartmouth Timesharing. "
RBarryYoung
50

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

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

JacquesB
fonte
38
Editando uma linha? Luxo! Os primeiros BASICs que usei fizeram você digitar novamente toda a linha. O que realmente foi péssimo quando você teve que renumerar uma sub-rotina.
TMN
48
Tela? Qual tela? No meu primeiro Basic, a "tela" era um rolo de papel.
Ddyer
18
@ ddyer: Eu sonhava em ter um rolo de papel! Tudo o que tínhamos era um monte de eletrodos. À noite, quando o trabalho deveria ser feito, teríamos de nos alinhar em uma fila e observar quem foi eletrocutado, para ver se o programa funcionava corretamente. ... - Sério, estou impressionado que as pessoas realmente conseguiram escrever programas de trabalho naqueles dias.
leftaroundabout
26
Eletricidade! Luxo sangrento. Nós utilizado para esculpir nossos comandos em granito
Michael Durrant
10
@TMN & ddyer OK, vocês dois sabem para onde isso está indo, certo ...? ;-D ==> dilbert.com/strip/1992-09-08 ==> imgs.xkcd.com/comics/real_programmers.png #
Baard Kopperud
45

Se você está pensando em dialetos BASIC dos microcomputadores domésticos de 8 bits dos anos 80, esses computadores não tinham editores de texto (a menos que você comprou algum aplicativo de processador de texto). Não havia como ter todo o código-fonte do programa BASIC "aberto em um editor", como você faria ao programar hoje. O programador nem pensaria no programa como um arquivo de código-fonte, ou texto, realmente.

Problema de exemplo

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 REPL atuais de diferentes linguagens de script, embora não sejam tão estritamente baseados em linhas, mais parecidos com telas. Portanto, não é muito parecido com os REPLs de hoje, mas perto.

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

Solução parcial

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

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

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

Solução de trabalho

Os números das linhas resolvem isso de uma maneira muito fácil, embora bastante 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 a lista de programas 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 substituindo a linha inteira por uma nova na tela. Além disso, a inserção de novas linhas se torna fácil se você deixar números não utilizados no meio. Para demonstrar:

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

Após entrar novamente na 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

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

Mais importante, da perspectiva da experiência do usuário, os números de linha são realmente uma interface surpreendentemente fácil, porém 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-200para mostrar as linhas 100-200. Para editar uma linha, liste-a na tela, edite o texto na tela e digite novamente a linha. Para remover uma linha, edite-a para que fique vazia, ou seja, dê o número da linha sem nada depois dela. Um parágrafo para descrever isso. Compare a tentativa de descrever o uso de editores de texto antigos, como o edlin do DOS ou o ed ou ex do Unix: você precisa de um parágrafo (apenas um pouco de hipérbole) apenas para explicar como o usuário pode sair deles quando iniciado acidentalmente!

Conclusão

Outras respostas explicam como os números de linha foram criados. Estou tentando abordar aqui, por que os números de linha sobreviveram, desde que sobreviveram, como 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 que os editores de texto em tela cheia adequados e fáceis de usar se tornaram a maneira principal de editar código, tanto com as limitações de hardware desaparecendo quanto com a superação da inércia das pessoas que adaptavam coisas novas, os dialetos BASIC baseados em número de linha desapareceram rapidamente do uso, porque o principal problema de usabilidade que eles resolveram não era mais um problema.

hyde
fonte
4
Você acertou em cheio. Ter uma tela com várias linhas, em vez de apenas imprimir uma linha tty ou simples, facilita, mas sem o conceito de arquivo de origem, ele ainda é orientado para a linha.
JDługosz
O fato de o sistema ser uma arquitetura de 8 bits não é realmente o fator limitante. Agora, o fato de que esse sistema possa ter apenas alguns kilobytes de RAM e alguns kilobytes de ROM, e possivelmente até mesmo armazenamento permanente (se o seu gravador de cassetes quebrou) ...
um CVn
ainda é difícil imaginar codificação sem um editor de texto
phuclv
@ LưuVĩnhPhúc Bem, existem muitos emuladores para executar "a coisa real", como quase qualquer computador doméstico de 8 bits, ou o MSDOS e seu GWBASIC com dosbox. Apenas como exemplo, você pode obter um dos muitos emuladores C64, e, em seguida, o Google para encontrar Guia seu usuário, tendo PDF :-)
Hyde
1
@phuclv - Difícil imaginar a codificação sem um editor de texto agora. Na época, era difícil imaginar o inconveniente de ter que usar um editor de texto, salvá-lo e compilá-lo antes que ele pudesse ser executado ... e foi exatamente isso que veio ao mundo dos PCs; Pascal e C. Ambas as linguagens compiladas, ambas livremente editáveis ​​com um editor de texto, definitivamente não são um ambiente de programação em si mesmas (o BASIC era o ambiente de programação e o ambiente de tempo de execução). Pascal era minha próxima língua e, em muitos aspectos, bastante libertador. Definitivamente mais poderoso. Mas de outras maneiras, um pouco menos emocionante.
DavidO 3/09
17

No local e época em que o Basic foi desenvolvido, o melhor dispositivo de E / S disponível era um teletipo. A edição de um programa era feita imprimindo (em papel) uma lista de todo o programa, ou a parte interessante, e digitando as linhas de substituição com os números das linhas.

É também por isso que a numeração de linhas padrão é 10, para que haja números não utilizados entre as linhas existentes.

ddyer
fonte
1
Na verdade, os leitores de cartão (acompanhados de digitações) e a impressora de linha eram melhores dispositivos de E / S do que um teleprinter, mas os teleprinters eram muito mais baratos.
Supercat
A numeração de linha por 10 era um padrão de fato, não um requisito rigoroso. E muitos BASICs tinham um rencomando ' ', para renumerar. Uma chamada típica era ren 10, 10(renumerar começando em dez, incrementando em dez - o comportamento padrão se apenas digitado ren. Os comandos gotoand gosube then (linenumber)seriam atualizados automaticamente. Mas isso definitivamente não estava disponível nos primeiros BASICs. Mas o IIRC estava disponível na Apple Integer Basic, Applesoft FP basic, TI Basic / Extended Basic, MS Basic / GW Basic, etc.
DavidO
13

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

Primeiro, lembre-se de que o conceito de "linhas" não existe há muito tempo. Muitas linguagens de programação nessa época usavam cartões perfurados , e ter números de sequência (geralmente nas últimas colunas da carta) ajudava a recuperar o seu baralho na ordem correta, se você o deixasse cair, ou algo horrível aconteceu no leitor de cartões. Havia máquinas para fazer isso automaticamente.

Os números de linha a serem usados ​​como alvos de GOTOinstruções são um conceito totalmente diferente. No FORTRAN IV, eles eram opcionais e precederam a declaração (nas colunas 1-5). Além de ser mais fácil de implementar do que os rótulos de forma livre, havia também o conceito do GOTO computado e atribuído , que permitia saltar para um número de linha arbitrário. Isso era algo que a maioria das linguagens de programação modernas não possui (embora as switchinstruções cheguem perto), mas era um truque familiar para os programadores de assembler.

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

Mike Harris
fonte
2
Ah, gotos computados e atribuídos. Memórias de matrizes de variáveis ​​de rótulo em PL / 1, fazendo um loop através de um array para encontrar uma correspondência e, em seguida, usando esse índice de array como o índice no array de variáveis ​​de rótulo para ir para. Ou Cobol alterou os gotos. E nem usando números de linha! A BBC basic teve uma declaração de renumeração que foi muito útil.
Kickstart
O GCC permite GOTOs computados como uma extensão (embora não com um número de linha diretamente, é claro) - você pode fazer coisas comogoto array_of_labels[some_computation()];
user253751
Menor: FORTRAN exigia rótulos para alvos de GOTO(ou ASSIGN) e aritmética original, também conhecidos como três IF, e (raramente usados) retornos alternativos CALLe tipos de alvos (indiscutivelmente delimitadores) de DOe FORMATdeclarações. Em outras declarações, eles eram opcionais.
Dave_thompson_085
Alguns BASICs (por exemplo, da Atari) até permitiram que expressões numéricas arbitrárias fossem usadas nas instruções GOTO. Portanto, com uma convenção de numeração de linha adequada, você pode escrever GOTO 1000+N*100para emular uma switchdeclaração.
dan04
6

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

Keith Miller
fonte
14
COBOL não usou esses números de linha. Eles eram estritamente uma conveniência, de modo que, quando algum pobre schlub derrubou seu baralho e as cartas foram para todos os lugares, ele poderia reuni-las e executá-las no classificador de cartas para colocá-las na ordem correta. Você NÃO era obrigado a inserir os números das linhas nos cartões. (Estudantes não lojas de Produção fez..)
John R. Strohm
5

O BASIC surgiu mais tarde que o FORTRAN, na era do terminal de linha. Apresentava um ambiente de leitura-exe-impressão-loop que era mais interativo do que um baralho de cartas.

Aprendi a programar, no BASIC, em uma tela de uma linha com 24 caracteres. Os números de linha eram uma maneira natural de especificar para onde você queria ir, editando uma ou inserindo entre outras.

Realmente não consigo imaginar de que outra forma você faria isso.

JDługosz
fonte
2
este não parece oferecer nada substancial sobre os pontos feitos e explicado na anterior 4 respostas
mosquito
2
Isso faz mal? Acho que Jaques realmente não abordou a essência da edição de uma linha no que diz respeito à inserção de linhas e ao rastreamento mental do código.
JDługosz
1
@jameslarge Sinto falta desse ponto no parágrafo que começa com "Muitas vezes ao trabalhar com o BASIC ..."? Também hesito em chamar o BASIC de sistema operacional. Esse foi o DOS. E DOS não precisa BASIC, é apenas o que você dominou o tempo para trabalhar.
2
@Ian, enquanto isso é verdade, foi projetado para um sistema que usava teletipos para io (o Dartmouth Time Sharing System).
Jules
3
@MichaelT, Oops! Retirei metade do meu comentário, mas defenderei a parte de o BASIC ser o sistema operacional em alguns computadores. Estou pensando; Apple] [, TI 99/4, IBM 5100, HP 9830a, Compucolor 8001, TRS-80 Modelo 1, Comodore Vic20, Sinclair ZX80 e outros. Tudo inicializado no BASIC a partir da ROM. Alguns tinham um sistema operacional opcional que poderia ser carregado a partir de um cassete de áudio ou, a partir de um disquete, se você pagasse o $$ extra por uma unidade de disquete.
Solomon Slow
1

Um ponto que ninguém mencionou ainda é que é mais fácil para os iniciantes raciocinar sobre o fluxo do programa em que os destinos das ramificações são explícitos. Portanto, em vez de ter que corresponder às instruções BEGIN / END (possivelmente aninhadas) (ou quaisquer delimitadores de bloco usados), era bastante óbvio para onde ia o fluxo de controle. Isso provavelmente foi útil, dado o público-alvo do BASIC ( afinal, é o Código de Instruções Simbólico para Todos os Objetivos do Iniciante ).

TMN
fonte
1

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

C. Fugate
fonte