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?
language-design
history
source-code
DerMike
fonte
fonte
Respostas:
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:
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
RUN
ouLIST
. 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
] CALL -936
* F666 G
$ ...
Sim, FP básico para começar.] 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::
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 linha90
entrou 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.
fonte
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:
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:
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+1
no 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:
Após entrar novamente na linha 20 com alterações e adicionar novas linhas, pode ser
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
GOTO
ANDGOSUB
. 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-200
para 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.
fonte
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.
fonte
ren
comando ' ', para renumerar. Uma chamada típica eraren 10, 10
(renumerar começando em dez, incrementando em dez - o comportamento padrão se apenas digitadoren
. Os comandosgoto
andgosub
ethen (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."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
GOTO
instruçõ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 asswitch
instruçõ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
/GOSUB
declarações) provavelmente foi uma decisão de design feita por esse motivo.fonte
goto array_of_labels[some_computation()];
GOTO
(ouASSIGN
) e aritmética original, também conhecidos como trêsIF
, e (raramente usados) retornos alternativosCALL
e tipos de alvos (indiscutivelmente delimitadores) deDO
eFORMAT
declarações. Em outras declarações, eles eram opcionais.GOTO 1000+N*100
para emular umaswitch
declaração.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.
fonte
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.
fonte
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 ).
fonte
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.
fonte