【问题标题】:Why did we bother with line numbers at all? [closed]为什么我们要为行号而烦恼? [关闭]
【发布时间】:2010-10-07 04:27:35
【问题描述】:

当你用 BASIC 写东西时,你需要使用行号。喜欢:

10 PRINT "HOME"
20 PRINT "SWEET"
30 GOTO 10

但我想知道:到底是谁提出了使用行号的想法?真是令人讨厌,并在发展中(双关语)世界中留下了相当大的“回声”!

【问题讨论】:

  • 伟大的网名,remco!喜欢颠倒的人物
  • 是的,你是怎么把你的名字倒过来显示的?
  • @gnovice:它是通过使用看起来像其他字符颠倒的 unicode 字符来完成的。例如,请参阅revfad.com/flip.html
  • @DavidD,gnovice:它使用了一些特殊的 unicode 字符,参见 www.flipmytext.com

标签: basic line-numbers


【解决方案1】:

在Basic中,如果您没有行号,如何执行

GOTO 10 

那是一种跳线的方式,一种在 20 多年前被发现的好方式!

今天,这些行帮助我们捕获错误/异常,因为调试引擎会向我们发送消息,即我们在第 xxx 行遇到异常,我们立即跳转到它!

想象一个没有行号的世界……如果没有行号,记者如何获得报酬?

“既然你知道了小说,你必须写一个不超过50行的摘要”

还记得吗?即使在学校,我们也会了解行号!

如果它没有被发明,那么已经有人再次发明了,所以我们可以很好地使用它:)

【讨论】:

  • 标签不是基本行号的原因,它们只是这样说的副作用。
  • @ypnos,你搞错了。数字作为标签早于 BASIC - 例如,在 FORTRAN 中,但在 BASIC 中,它们具有编辑/插入功能。
  • 在 FORTRAN 中,您不会在程序的每一行之前写下行号。这就是我们在这里谈论的内容:)
【解决方案2】:

当时的想法是,您可以通过使用适当的行号轻松地在程序中的任何位置添加代码。这就是为什么每个人都使用行号 10、20、30.. 所以还有空间:

10 PRINT "HOME"
20 PRINT "SWEET"
30 GOTO 10
25 PRINT "HOME"

在 BASIC 可用的第一个界面上,没有闪亮的编辑器,甚至没有 vi 或 emacs(或 DOS 编辑,呵呵)之类的东西。您只能在控制台上打印出您的程序,然后通过首先给出适当的行号来添加新行或替换它们。您无法像现在习惯的那样使用光标浏览“文件”(程序保存在内存中,尽管您可以在磁盘上保存一份副本)。

因此,行号不仅需要作为臭名昭著的 GOTO 的标签,而且确实需要告诉解释器您正在编辑的程序流中的哪个位置。

【讨论】:

  • 这就是我学习编程的方式——通过重新输入进行编辑。
  • 这让我想起了在我父母 AT&T PC6300 上编写 GW-BASIC 应用程序...
  • 我记得想在第 24 行和第 25 行之间添加一行的相当大的问题,当时无法重新编号行(在 Commodore PET 上)。
  • 我在 Acorn 电子上学习了 BASIC,它具有您描述的界面,我完全忘记了这一点!为回忆+1!
  • 这在code golf中使用过
【解决方案3】:

我喜欢飞出个未来的机器人教堂,墙上写着类似

10 SIN
20 GOTO HELL

在 Speccy 上,您无法在没有行号的情况下编辑行。

【讨论】:

    【解决方案4】:

    它们起源于 FORTRAN,BASIC 就是从它衍生而来的。但是,在 FORTRAN 中,只有其他行(如 GOTO 目标)引用的行需要数字。在 BASIC 中,它们还有一个次要用途,即允许编辑特定的行。

    【讨论】:

    • 此外,FORTRAN 行号是任意的,更像是数字标签而不是行号。
    【解决方案5】:

    它有着悠久的历史。

    行号实际上来自达特茅斯 BASIC,它是 BASIC 编程语言的原始版本,是所谓的达特茅斯时间共享系统的组成部分。那个 DTSS 有一个基本的 IDE,只不过是一个交互式命令行。

    因此,在这个“IDE”中键入的每一行,并以行号开头,都被添加到程序中,用相同的数字替换任何先前存储的行;其他任何内容都被假定为 DTSS 命令并立即执行。

    【讨论】:

    • +1 - this 是正确答案。在同一环境中将行编辑器和立即执行相结合可能是 BASIC 最重要的贡献。
    【解决方案6】:

    在过去,您还没有像 emacs 或 vi 这样的二维编辑器。你只有命令行。

    您的程序存储在内存中,您可以输入单行命令来编辑单行。

    如果您是 Unix 大神,您可以使用 ed 或其他东西来完成,但对于 C-64、VIC-20 或 TRS-80 上的 BASIC,您只需覆盖该行。

    所以会话可能如下所示:

    $10 PRINT "Hellow World"
    $20 GOTO 10
    $10 PRINT "Hello World"
    

    现在程序可以正常运行了。

    一些较旧的大型机甚至有没有屏幕的线路终端。您的整个会话都用 ink 打印在 paper 上!

    【讨论】:

      【解决方案7】:

      我发现它们在配对时非常有用。当我的配对有键盘时,我不必指向一行,我可以说,“在第 74 行,那不应该是 getMoreBeer() 吗?”

      【讨论】:

      • 我认为问题在于您必须自己输入行号的语言。我同意编辑器自动显示的行号非常有用。
      • 是的,你是对的。似乎有些人想要摆脱它们,但有些人仍然觉得它们很有用,所以我想我会提一下。
      【解决方案8】:

      我猜它来自汇编程序,其中每条指令都有一个地址,可以被另一条指令跳转到。

      此外,第一台计算机没有太多内存,存储行号只需要两个字节(如果处理得当的话)。写入标签会占用更多内存,首先是定义该标签的位置,然后是任何跳转命令。

      在过去的美好时光里,终于没有花哨的编辑了。唯一的“编辑器”是一个简单的命令行界面,它将以数字开头的所有内容视为程序的一部分,并将其他所有内容视为立即执行的命令。最突出的例子应该是 Commodore 64。

      Basic 的较新方言不再需要行号。

      【讨论】:

      • 连续行号的另一个优点是您不必执行第一遍来获取标签及其位置 - 您只需解释程序并在同一遍中运行它。
      【解决方案9】:

      在出现 VDT(视频显示终端)之类的东西之前,我们是在打孔卡上编程的老前辈。打孔卡为序列号保留第 72-80 列 - 如果您丢弃了卡片组并且它们都出现故障,您可以将卡片组放入卡片分类器中,该分类器将根据这些序列号对卡片进行排序。在许多方面,BASIC 行号与那些序列号相似。

      BASIC 世界的另一个优势是,在过去,BASIC 在运行时被解释。对分支使用标签而不是连续的行号将需要第一次通过以获取所有标签及其位置,就像您使用行号一样,解释器知道它是否需要开始向前或向后扫描目的地。

      【讨论】:

      • 这是唯一正确的答案!
      • 这不是无关紧要的,而是历史。你认为你的父母无关紧要,因为他们不是你吗?
      • BASIC 出现在 1970 年代......并且有打孔卡提供的基本实现。小时候,我通过为 CS 专业购买打孔卡赚取 D&D,包括一些 BASIC。
      • 是的,我同意。这肯定是打孔卡的心态。此外,由于大多数早期的家用计算机都内置了编号为基本的行号(Apple、Commodore 等),因此它变得非常普遍。有趣的是,这还允许您以非顺序方式输入程序,这有助于它们有限的编辑能力。我用 BASIC 写的第一件事是一个文本编辑程序。但是,当我接触到带有 Extended BASIC 的 Vax 时,我很高兴再也看不到行号。
      • 另外,BASIC 最初是作为编译器实现的,而不是解释器(类似于许多 LISP 实现在执行之前编译每个表达式的方式),因此解释器内部也无关紧要。
      【解决方案10】:

      最初的 DOS 编辑器是一个很棒的实用程序,名为 edlin。您只能编辑一行。为了让 BASIC 的许多版本中的生活更加有趣,您可以无序键入行,第 10、20、30、25、5 行,执行将按行号而不是按出现顺序。

      【讨论】:

        【解决方案11】:

        并非所有版本的 BASIC 都需要行号。例如,QBasic 支持标签。然后,您可以跳转到使用 GOTO 的那些(暂时忽略 Dijkstra 的“Go To Statement Considered Harmful”)。

        【讨论】:

        • QBasic 是第一个不需要行号的 BASIC 版本。它带有一个程序,可以从 GW-BASIC 代码中删除不需要的行号。
        【解决方案12】:

        答案已经在上面了。 Paul Tomblin 写了它(对 zabzonk 有一个警告)。

        实际上,我认为任何没有提到“打孔卡”的答案都是不完整的,如果它既没有提到打孔卡也没有提到 FORTRAN,那就错了。我可以说这绝对是正确的,因为我的父母都经常使用打孔卡(他们从 FORTRAN 66 和 77 开始),然后在 80 年代迁移到 Basic 和 COBOL。

        【讨论】:

          【解决方案13】:

          早在 50 年代,当高级编程语言刚刚起步时,没有终端,没有编辑器,没有监视器(是的,没有监视器),只有打卡机和读卡器(用于将卡片内容写入和读取到计算机的内存)和打印机(自然用于打印结果)。 后来介绍了磁带,但那是另一回事了。

          每张穿孔卡都有自己的编号。有几个原因;从纯粹保持它们的顺序,到确定执行顺序。每张卡都是一行代码(以今天的术语)。由于当时还没有 if..then..else 之类的构造,或者任何类似的变体,因此必须以某种方式确定执行顺序。因此引入了 GOTO 语句。它们是循环的基础。 “意大利面条代码”一词也来自那个时期,因为写得不好的代码相对难以理解,就像盘子里的意大利面条:)

          【讨论】:

            【解决方案14】:

            “谁?”将是发明者 Kemeney 和 Kurtz。

            阅读回复后,我检查了Wikipedia entry 的“Dartmouth BASIC”,得知后很惊讶

            第一个编译器是在分时系统准备好之前产生的。它被称为 CardBASIC,旨在用于基于标准读卡器的批处理系统。

            所以,看起来 Paul Tomblin “得到了广场”。

            【讨论】:

            • 在高中时,我们有一个“调制解调器”,可以让我们拨入达特茅斯的电脑,亲身体验这个奇迹。
            • 这是一个原型,作为实验实现,而该语言设计的基于电传打字的界面仍在开发中。虽然我没有任何直接证据,但我敢打赌(a)第一个版本没有强制行号(如 Fortran)或(b)使用行号来提供程序编辑而不是立即执行已经已经计划好了。
            【解决方案15】:

            在早期,大多数节目都是通过打孔卡进入的。穿孔卡片通常按顺序输入,通常每张卡片一个指令,标签(JMP/JSR 目标)是单独的指令卡片。

            要编辑您的程序,您更换了卡。

            后来的实现在该行的右端添加了一个可选的序列号,以便当/如果它们出现乱序时,它们可以由自动阅读器重新排序。

            Fortran 使用左侧的数字目标标签 (col 1-5) 并在右侧 (73-80) 留下一个保留块用于序列或注释。

            最初编写 BASIC 时,决定将序列号向左移动,进入 FORTRAN 的标签字段,并允许覆盖先前卡的内存占用……作为一种编辑模式。这是为交互式开发环境设计的,但也适用于卡片。出于各种原因,在一些早期的实现中使用了卡片。

            请记住:直到 1970 年代后期,许多计算机都是读卡器和打印机接口。即使有交互模式基础,也经常使用打卡的基础程序。由于许多只是简单地输入 IDE,因此它们的工作方式完全相同。包括最后需要一张“跑步”卡。在这种情况下,可以简单地粘贴一张修正卡和另一张运行卡,以对某个变量进行更改重新运行;同样,在复杂的程序中,只需在运行前添加一个更正的卡片行就足以编辑掉问题,而无需花费宝贵的时间来查找错误的卡片本身。

            【讨论】:

              【解决方案16】:

              Paul Tomblin 的回答是最全面的,但我很惊讶没有人提到 BASIC 项目最初目标的很大一部分是使用分时提供一个初学者友好的交互式环境。 (Kurtz 和 Kemeny 对“所有学生的普遍访问”的愿景在这方面远远领先于当时的时代。)

              为实现这一目标而开发的 BASIC 系统采用 Teletype ASR-33(以及后来的其他)打印终端。当连接到具有分时功能的操作系统时,它们允许在交互模式下编辑和运行 BASIC 程序(与使用穿孔卡片不同),但它们不是光标可寻址的。行号是一种对初学者友好的方式,既可以指定程序语句的顺序,又可以在没有屏幕编辑器的情况下进行明确的编辑。 “行编辑器”的 Wikipedia 条目进一步解释了,任何曾经尝试使用行编辑器(例如 Un*x 'ed')的人都可以理解为什么应该感谢 Kurtz 和 Kemeny 让初学者免于学习神秘以这种方式编辑文本所需的命令序列。

              【讨论】:

              • 现在(2014 年初)是 BASIC 诞生 50 周年!
              猜你喜欢
              • 2011-01-22
              • 1970-01-01
              • 2010-09-30
              • 2011-05-27
              • 1970-01-01
              • 1970-01-01
              • 2016-09-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多