Pourquoi BASIC a-t-il utilisé des numéros de ligne?

95

Pourquoi les anciens BASIC (et peut-être d'autres langues) ont-ils utilisé des numéros de ligne dans le code source?

Je veux dire, quels problèmes at-il (essayé de) résoudre?

DerMike
la source
27
Si vous avez déjà fait un effort de recherche sérieux, n'enterrez pas les informations à ce sujet dans les commentaires, modifiez votre question en conséquence. De plus, Google m'a pris directement ici: stackoverflow.com/questions/541421/… et ici stackoverflow.com/questions/2435488/…
Doc Brown
13
Je vote pour fermer cette question comme hors sujet parce que la réponse est déjà sur stackoverflow .
Andres F.
6
Applesoft BASIC a été le premier langage de programmation que j'ai appris. Je me souviens avoir entendu dire que Pascal n'avait pas de numéro de ligne et qu'il disait "Mais comment faire un GOTO sans numéros de ligne? Comment cela est-il censé fonctionner ??"
Jens Schauder
14
C'est drôle, la dernière fois que j'ai vérifié, nous étions en train de juger si la question portait sur des sujets fondés sur son contenu, et non sur le contenu d'autres sites (et vraisemblablement sur les réponses qui s'y trouvent).
MatthewRock

Réponses:

130

BASIC doit être mis en contexte avec ses langages contemporains: débutant, débutant, assemblé.

À l'époque où je barbouillais l'assemblage 6502 sans étiquettes, cela signifiait que lorsque vous réalisiez que vous deviez ajouter une instruction quelque part au milieu d'un code très serré (j'ai ajouté plus tard des NOP ), vous deviez exécuter et refaire tous les sauts. adresses. Cela prenait du temps.

Fortran était un système numéroté par ligne qui précédait BASIC. Dans Fortran, les colonnes 1 à 5 étaient un numéro de ligne à utiliser pour les cibles pour la création de branches. L’important dans Fortran était que les compilateurs avaient tendance à être un peu plus intelligents que l’interprète BASIC et qu’ajouter quelques instructions consistait simplement à perforer des cartes et à les placer au bon endroit.

BASIC, d'autre part, devait garder toutes ses instructions commandées. Il n'y avait pas beaucoup de concept de "continuation de la ligne précédente". Au lieu de cela, dans Applesoft BASIC (l'un des dialectes largement utilisés que je connais et que je peux trouver des informations), chaque ligne en mémoire était représentée par:

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

Il avait deux octets pour l'adresse de la ligne suivante ( NN NN). Deux octets pour le numéro de ligne de cette ligne ( TT TT), puis une liste de tokens ( AA BB CC DD .. ..) suivie du marqueur de fin de ligne ( 00). (Ceci est tiré de la page 84-88 de À l'intérieur de la pomme // e )

Un point important à prendre en compte lorsque vous regardez cette représentation en mémoire est que les lignes peuvent être stockées dans la mémoire dans l’ordre. La structure de la mémoire était celle d'une liste chaînée avec un pointeur «ligne suivante» dans la structure. Cela facilitait l'ajout de nouvelles lignes entre deux lignes - mais vous deviez numéroter chaque ligne pour que celle-ci fonctionne correctement.

Plusieurs fois, lorsque vous travailliez avec BASIC, vous travailliez réellement dans BASIC lui-même. En particulier, une chaîne donnée était soit un numéro de ligne et des instructions BASIC, soit une commande destinée à l'interpréteur de base pour RUNou LIST. Cela a rendu facile la distinction du code des commandes - tout code commence par des nombres.

Ces deux informations identifient pourquoi les nombres ont été utilisés - vous pouvez obtenir beaucoup d'informations en 16 bits. Les étiquettes basées sur des chaînes prendraient beaucoup plus d'espace et sont plus difficiles à commander. Les chiffres sont faciles à utiliser, compréhensibles et faciles à représenter.

Plus tard, les dialectes BASIC pour lesquels vous n’êtes pas tout le temps dans l’interprète ont pu supprimer toutes les lignes numérotées et n’avaient besoin que de numéroter les lignes qui étaient des branches cibles. En effet, les étiquettes.


la source
3
Bonne sauce, j'avais oublié le Mini Assembler. Cela ramène des souvenirs .
Blrfl
3
@Blrfl Si la mémoire sert ... ] CALL -936 * F666 G $ ... Ouais, FP basique pour commencer.
3
Non, c'était l'éditeur de ligne. Les commandes ont été identifiées par l'absence de numéros de ligne. Les déclarations étaient précédées de numéros de ligne pour indiquer qu’il s’agissait de déclarations et pour indiquer où elles allaient et / ou quelle ligne elles remplaçaient. C’était la partie éditeur de ligne intégrée à BASIC, ce n’était pas un outil ou un environnement séparé.
RBarryYoung
3
@RBarryYoung a ] PRINT "FOO"été immédiatement géré par l'interprète BASIC. C'est une déclaration. Si vous vouliez l'exécuter plus tard, vous le feriez ] 10 PRINT "FOO"et ensuite ] RUN. Dans l'environnement AppleSoft BASIC, chaque instruction BASIC pouvait être exécutée immédiatement ou différée. Seules quelques commandes fournies par DOS n'étaient pas des instructions BASIC valides. La différence entre une déclaration maintenant et une déclaration ultérieure était le numéro de ligne. Vous pouvez également modifier une instruction différée en ressaisissant le numéro de ligne correspondant. Vous pouvez également mettre plusieurs déclarations sur une même ligne::
4
Comme indiqué dans l'article de Wikipedia ( en.wikipedia.org/wiki/Dartmouth_BASIC ), " DTSS (système de partage du temps de Dartmouth) implémentait une ... interface de ligne de commande interactive. ... Toute ligne commençant par un numéro de ligne était ajoutée à le programme, en remplaçant toutes les lignes précédemment stockées par le même numéro; toute autre commande étant supposée être une commande DTSS et exécutée immédiatement ... Cette méthode de montage était nécessaire en raison de l'utilisation de téléimprimeurs en tant qu'appareils terminaux du système Dartmouth Timesharing. "
RBarryYoung
50

Au début, l’édition était basée sur les lignes. Vous ne pouvez pas simplement vous déplacer librement dans le code source et le modifier. Vous avez une seule ligne au bas de l'écran où vous pouvez taper des commandes et entrer le code. Le reste de l'écran était constitué de listes de codes en lecture seule et d'une sortie de commande. Si vous voulez éditer, dites la ligne 90 dans le programme que vous avez écrit " EDIT 90", et le contenu de la ligne est 90entré dans le tampon d'édition d'une seule ligne. Lorsque vous avez modifié la ligne que vous avez appuyée, entrez, et la liste des programmes a été mise à jour. Vous avez donc besoin de numéros de ligne pour pouvoir modifier le programme.

Lorsque les éditeurs de code sont devenus plus avancés et vous ont permis de déplacer le curseur dans la liste de codes, vous n'avez plus besoin des numéros de ligne.

JacquesB
la source
38
Modification d' une ligne? Luxe! Les premiers BASIC que j'ai utilisés vous ont demandé de ressaisir toute la ligne. Ce qui était vraiment nul quand vous avez dû renuméroter un sous-programme.
TMN
48
Écran? Quel écran? Dans ma première base, "l'écran" était un rouleau de papier.
Ddyer
18
@ddyer: J'avais l'habitude de rêver d'avoir un rouleau de papier! Tout ce que nous avions était un tas d'électrodes. Le soir où le travail devait être terminé, nous devions nous aligner et observer qui avait été électrocuté pour voir si le programme fonctionnait correctement. ... - Sérieusement, je suis émerveillé par le fait que les gens ont réussi à écrire des programmes de travail à l'époque.
leftaroundabout
26
Électricité! Luxe sanglant. Nous avions l'habitude de ciseler nos commandes dans le granit
Michael Durrant
10
@TMN & ddyer OK, vous savez tous les deux où ça va, non ...? ;-D ==> dilbert.com/strip/1992-09-08 ==> imgs.xkcd.com/comics/real_programmers.png
Baard Kopperud le
45

Si vous songez aux dialectes BASIC des micro-ordinateurs domestiques 8 bits des années 80, ces ordinateurs n’avaient pas d’éditeur de texte (à moins que vous n’ayez acheté une application de traitement de texte). Il n'y avait aucun moyen d'avoir le code source entier du programme BASIC "ouvert dans un éditeur", comme vous le feriez avec la programmation d'aujourd'hui. Le programmeur ne penserait même pas au programme comme un fichier de code source, ou un texte, vraiment.

Exemple de problème

Alors, disons que vous avez un programme simple sans numéros de ligne dans votre tête:

FOR I=1 TO 42
PRINT I
NEXT I

Vous démarrez votre ordinateur. Vous avez une invite "prêt" ou quelque chose comme ça, et le curseur assis dans la ligne suivante. Cela ressemble beaucoup aux environnements REPL actuels de différents langages de script, bien qu'ils ne soient pas aussi strictement basés sur des lignes, mais plutôt sur des écrans. Donc, pas tout à fait comme les REPLs d'aujourd'hui, mais proches.

Maintenant, si vous commencez à entrer dans le programme, vous risquez d'obtenir une erreur après la première ligne, parce que l'interpréteur BASIC essaie de l'exécuter immédiatement (et de l'oublier), et cela n'a pas de sens si NEXT ne met pas fin à la boucle. Ce n'est pas un éditeur de texte où vous éditez du texte, c'est ici que vous donnez des commandes à l'ordinateur!

Solution partielle

Donc, vous avez besoin d'un moyen de dire, c'est la ligne de programme, stockez-le! Vous pouvez avoir une commande spéciale ou juste un symbole disant que c'est une ligne de programme, stockez-la. Imaginons ceci:

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

Ok, notre interprète BASIC imaginaire a maintenant enregistré le programme et vous pouvez le lancer. Mais maintenant, vous voulez éditer la ligne PRINT. Comment faites-vous? Vous n'êtes pas dans un éditeur de texte, vous ne pouvez pas simplement déplacer le curseur sur la ligne et la modifier. Ou vous voulez ajouter une autre ligne comme LET COUNT=COUNT+1dans la boucle. Comment indiquez-vous où la nouvelle ligne doit être insérée?

Solution de travail

Les numéros de ligne permettent de résoudre ce problème très facilement, bien que plutôt klunky. Si vous entrez une ligne de programme avec un numéro qui existe déjà, l'ancienne ligne est remplacée. Maintenant, l'environnement REPL basé sur un écran devient utile car il vous suffit de déplacer le curseur sur la liste des programmes à l'écran, de modifier la ligne à l'écran et d'appuyer sur ENTREE pour le stocker. On dirait que vous modifiez la ligne, alors que vous éditez du texte à l’écran puis que vous remplacez la ligne entière par une nouvelle à partir de l’écran. En outre, l'insertion de nouvelles lignes devient facile si vous laissez des numéros inutilisés entre les deux. Démontrer:

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

Après avoir réintégré la ligne 20 avec les modifications et ajouté de nouvelles lignes, il pourrait être

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

Plus de problèmes que nous venons de résoudre

Il y a l'avantage (ou la malédiction, car il permet le fameux code spaghetti BASIC) de pouvoir utiliser les numéros de ligne comme construction de langage, au moins comme cible des commandes GOTOAND GOSUB. Cela pourrait être remplacé par des étiquettes, mais l'utilisation de numéros de ligne est beaucoup plus simple à implémenter dans un interpréteur BASIC, ce qui était tout de même un avantage certain pour un ordinateur domestique typique à 8 bits des années 80.

Plus important encore, du point de vue de l'expérience utilisateur, les numéros de ligne constituent une interface étonnamment simple mais complète pour l'édition du code. Il suffit de taper une ligne commençant par un nombre pour insérer le nouveau code. Utilisez LIST 100-200pour afficher les lignes 100-200. Pour modifier une ligne, affichez-la à l'écran, modifiez le texte à l'écran et entrez à nouveau la ligne. Pour supprimer une ligne, éditez-la pour qu'elle soit vide, c'est-à-dire donnez simplement le numéro de ligne suivi de rien. Un paragraphe pour décrire cela. Comparez en essayant de décrire l'utilisation d'anciens éditeurs de texte comme edlin de DOS, ed ou ex d'Unix: vous avez besoin d'un paragraphe (seule une légère hyperbole) pour expliquer comment l'utilisateur peut les quitter, lorsqu'il est démarré accidentellement!

Conclusion

D'autres réponses expliquent comment les numéros de ligne ont été créés. J'essaie de décrire ici pourquoi les numéros de ligne ont survécu aussi longtemps, comment ils ont continué à résoudre un problème concret: ils ont proposé un moyen très simple de faire la programmation proprement dite sans véritable éditeur. Une fois que les éditeurs de texte plein écran appropriés et faciles à utiliser sont devenus le moyen habituel d’éditer le code, à la fois avec la disparition des limitations matérielles et la suppression de l’inertie des personnes adaptant de nouvelles fonctionnalités, les dialectes BASIC basés sur les numéros de ligne ont rapidement disparu, car le problème de convivialité principal qu'ils ont résolu n'était plus un problème.

Hyde
la source
4
Vous avez réussi. Avoir un écran multiligne plutôt que juste un tty ou une ligne d'impression facilite les choses, mais sans concept de fichier source, il reste orienté ligne.
JDługosz
Le fait que le système soit une architecture 8 bits n'est toutefois pas vraiment un facteur limitant. Maintenant, le fait que ledit système pourrait avoir seulement quelques kilo-octets de RAM et une poignée de kilo-octets de ROM, et peut-être même pas de stockage permanent (si votre magnétophone à cassettes est en panne) ...
un CVn
il est encore difficile d'imaginer un codage sans éditeur de texte
phuclv
@ LưuVĩnhPhúc Il existe de nombreux émulateurs permettant d'exécuter "la réalité", tels que presque tous les ordinateurs domestiques 8 bits, ou MSDOS et son GWBASIC avec dosbox. À titre d'exemple, vous pouvez obtenir l'un des nombreux émulateurs C64, puis Google trouver son guide de l'utilisateur au format PDF :-)
hyde
1
@phuclv - Difficile d'imaginer un codage sans éditeur de texte maintenant. À l'époque, il était difficile d'imaginer l'inconvénient de devoir utiliser un éditeur de texte, de le sauvegarder et de le compiler avant de pouvoir le lancer ... et c'est vraiment ce qui a suivi le monde des PC; Pascal et C. Les deux langages compilés, tous deux librement modifiables à l'aide d'un éditeur de texte, ne constituent absolument pas un environnement de programmation en soi (BASIC était à la fois un environnement de programmation et un environnement d'exécution). Pascal était ma prochaine langue et, à bien des égards, assez libératrice. Certainement plus puissant. Mais à d'autres égards, un peu moins excitant.
DavidO
17

À la place et à l'époque où Basic a été développé, le meilleur périphérique d'E / S disponible était un télétype. La modification d'un programme consistait à imprimer (sur papier) une liste de l'intégralité du programme ou de sa partie intéressante, puis à saisir des lignes de remplacement avec des numéros de ligne.

C'est aussi pourquoi la numérotation des lignes par défaut était de 10, de sorte qu'il y aurait des numéros inutilisés entre les lignes existantes.

Ddyer
la source
1
En fait, les lecteurs de cartes (accompagnés de touches) et les imprimantes par ligne étaient de meilleurs périphériques d’E / S qu’un téléimprimeur, mais les téléimprimeurs étaient beaucoup moins chers.
Supercat
La numérotation des lignes par 10 était une norme de facto et non une exigence rigoureuse. Et beaucoup de BASIC avaient une rencommande ' ', à renuméroter. Une invocation typique était ren 10, 10(numéroter à partir de dix, incrémenter par dix - le comportement par défaut si l' on tapés ren. Le gotoet gosubet then (linenumber). Les commandes seront mises à jour automatiquement , mais ce fut certainement pas disponible dans les premiers BASICs Mais IIRC, était disponible dans Apple. Entier de base, Applesoft FP de base, TI de base / étendu, MS de base / GW de base, etc.
DavidO
13

"Numéros de ligne" signifie quelques choses différentes.

Tout d’abord, gardez à l’esprit que le concept de «lignes» n’a pas existé depuis toujours. De nombreux langages de programmation de cette époque utilisaient des cartes perforées et le fait de disposer de numéros de séquence (généralement dans les dernières colonnes de la carte) vous permettait de récupérer votre jeu dans le bon ordre si vous le laissiez tomber ou si quelque chose de terrible se produisait dans le lecteur de carte. Il y avait des machines pour le faire automatiquement.

Les numéros de ligne à utiliser comme cibles d' GOTOénoncés sont un concept totalement différent. Dans FORTRAN IV, ils étaient facultatifs et précédaient l’instruction (dans les colonnes 1 à 5). En plus d'être plus facile à implémenter que les étiquettes de forme libre, il existait également le concept de GOTO calculé et attribué , qui vous permettait de passer à un numéro de ligne arbitraire. C'était quelque chose que la plupart des langages de programmation modernes n'ont pas (bien que les switchdéclarations s'en approchent), mais qui était un truc familier pour les programmeurs assembleurs.

BASIC était dérivé de FORTRAN et devait être plus simple à implémenter et à comprendre. Ainsi, forcer chaque "ligne" à avoir un numéro de ligne (à la fois pour le séquencement et comme cible de GOTO/ GOSUBstatement) était probablement une décision de conception prise pour cette raison.

Mike Harris
la source
2
Ah, calculés et assignés. Mémoires de tableaux de variables d'étiquette dans PL / 1, parcourant un tableau pour trouver une correspondance, puis utilisant cet indicateur de tableau comme indice dans le tableau de variables d'étiquette à effectuer. Ou Cobol modifié gotos. Et ni en utilisant des numéros de ligne! BBC Basic avait une déclaration de renumérotation très utile.
Kickstart
GCC autorise les GOTO calculés en tant qu'extension (mais pas avec un numéro de ligne directement bien sûr) - vous pouvez faire des choses commegoto array_of_labels[some_computation()];
user253751
Mineur: FORTRAN exigeait des étiquettes pour les cibles GOTO(ou ASSIGN) et l'arithmétique alias d'origine, à trois voies IF, et (rarement utilisé) les retours alternatifs CALL, et les sortes (avec des délimiteurs discutables) DO, et les FORMATdéclarations. Sur d'autres déclarations, elles étaient facultatives.
dave_thompson_085
Certains BASIC (par exemple, ceux d'Atari) autorisaient même l'utilisation d'expressions numériques arbitraires dans les instructions GOTO. Ainsi, avec une convention de numérotation des lignes appropriée, vous pouvez écrire GOTO 1000+N*100pour imiter une switchinstruction.
dan04
6

J'ai commencé à programmer en COBOL en utilisant les numéros de ligne des colonnes 1 à 6 de chaque ligne. Comme il n'y avait pas d'IDE dans les années 1970, tout était fait avec des cartes perforées et le numéro de ligne était utilisé pour identifier les lignes de la source d'origine qui devaient être remplacées et les nouvelles lignes ajoutées. Nous avions l'habitude d'incrémenter les numéros de ligne de 100 pour nous permettre d'ajouter plus de lignes.

Keith Miller
la source
14
COBOL n'a pas utilisé ces numéros de ligne. Ils étaient strictement pratiques. Ainsi, lorsqu'un pauvre schlub lâchait son jeu et que les cartes allaient partout, il pouvait simplement les rassembler et les faire passer dans le trieur de cartes pour les remettre dans le bon ordre. Vous n'étiez PAS obligé d'inscrire les numéros de ligne dans les cartes. (Les étudiants ne l'ont pas fait. Les ateliers de production l'ont fait.)
John R. Strohm
5

BASIC est venu plus tard que FORTRAN, à l’ère des terminaux. Il présentait un environnement de lecture-exe-print-loop plus interactif qu’un jeu de cartes.

J'ai appris à programmer, en BASIC, sur un afficheur d'une ligne contenant 24 caractères. Les numéros de ligne étaient un moyen naturel de spécifier l’endroit où vous vouliez aller, qu’il s’agisse de le modifier ou de l’insérer entre les autres.

Je ne peux vraiment pas imaginer comment vous le feriez autrement.

JDługosz
la source
2
cela ne semble rien offrir de substantiel sur les points soulevés et expliqués dans les 4 réponses précédentes
gnat
2
Ça fait mal? Je pense que Jaques n’a pas vraiment abordé l’essence de l’édition d’une ligne en ce qui concerne l’insertion de lignes et le suivi mental du code.
JDługosz 10/02/2016
1
@jameslarge Est-ce que je manque ce point dans le paragraphe commençant par "Plusieurs fois en travaillant avec BASIC ..."? J’hésite également à appeler BASIC le système d’exploitation. C'était DOS. Et DOS n’a pas besoin de BASIC, c’est exactement ce que vous aviez la plupart du temps à travailler.
2
Bien que cela soit vrai, @Ian a été conçu pour un système utilisant des télétypes pour io (le système de partage de temps Dartmouth).
Jules
3
@MichaelT, Oups! Je vais retirer la moitié de mon commentaire, mais je maintiendrai le fait que BASIC est le système d'exploitation de certains ordinateurs. Je pense; Apple] [, TI 99/4, IBM 5100, HP 9830a, Compucolor 8001, TRS-80 modèle 1, Comodore Vic20, Sinclair ZX80 et autres. Tous ont démarré dans BASIC à partir de ROM. Certains avaient un système d' exploitation optionnel qui pouvait être chargé à partir d'une cassette audio ou d'une disquette si vous payiez les dollars supplémentaires pour un lecteur de disquettes.
Salomon Slow
1

Un point que personne n’a encore mentionné est qu’il est plus facile pour les débutants de raisonner sur le déroulement du programme lorsque les cibles de branche sont explicites. Ainsi, plutôt que de devoir faire correspondre les instructions BEGIN / END (éventuellement imbriquées) (ou les délimiteurs de bloc utilisés), il était assez évident de savoir où allait le flux de contrôle. Cela était probablement utile étant donné le public cible de BASIC (après tout, il s'agit du code d'instruction symbolique polyvalent du débutant ).

RGT
la source
1

Le système de partage du temps de Dartmouth utilisait une interface de télétype. Ainsi, il utilisait une interface basée sur des commandes. À l'origine, les numéros de ligne n'étaient utilisés que pour modifier le programme. Vous pouvez insérer, remplacer ou supprimer en utilisant un numéro de ligne. Il ne semble pas que la version précédente utilisait des numéros de ligne pour les instructions goto, mais il s’agissait d’un ajout ultérieur à la langue.

C. Fugate
la source