728

我一直在讨论应用程序开发时提到“引导”。它似乎既广泛又重要,但我还没有遇到对自举实际上是什么的糟糕解释。相反,似乎每个人都应该知道这意味着什么。不过,我不知道。据我所知,它与启动时应用程序所需的初始化任务有关,但我可能完全错了。谁能帮我理解这个想法?

4

14 回答 14

358

“引导程序”来自“通过自己的引导程序将自己拉起来”一词。你可以从维基百科得到这么多。

在计算中,引导加载程序是机器启动时运行的第一段代码,负责加载操作系统的其余部分。在现代计算机中,它存储在 ROM 中,但我记得 PDP-11 上的引导过程,您可以通过前面板开关戳位以将特定磁盘段加载到内存中,然后运行它。不用说,引导加载程序通常很小。

“引导”也被用作使用自身构建系统的术语 - 或者更准确地说,是前身版本。例如,ANTLR版本 3 是使用在 ANTLR 版本 2 中开发的解析器编写的。

于 2009-08-10T12:21:35.107 回答
309

自举的一个例子是在一些 web 框架中。您调用 index.php(引导程序),然后它加载框架助手、模型、配置,然后加载控制器并将控制权传递给它。

如您所见,它是一个启动大型进程的简单文件。

于 2009-08-10T16:13:45.853 回答
101

术语“引导”通常适用于系统依赖自身启动的情况,有点像鸡和蛋的问题。

例如:

  • 如何编译用 C 编写的 C 编译器?
  • 如果您还没有运行操作系统,您如何启动操作系统初始化过程?
  • 您如何启动一个分布式(点对点)系统,其中客户端依赖其当前已知的对等点来了解系统中的新对等点?

在这种情况下,引导是指一种打破循环依赖的方法,通常在外部实体的帮助下,例如

  • 您可以使用另一个 C 编译器来编译(引导)您自己的编译器,然后您可以使用它重新编译自己
  • 您使用单独的代码来设置初始过程,而不依赖于操作系统提供的任何功能
  • 您使用初始对等点的硬编码列表或提供对等点列表的硬编码跟踪器 URL

等等

于 2017-12-18T17:58:16.460 回答
53

请参阅关于引导的 Wikipedia 文章。

有一个部分和链接解释了它在Computing中的含义。它在该领域有四种不同的用途。

这里有一些引用,但要获得更深入的解释和替代含义,请参阅上面的链接。

“……是一种简单的计算机程序激活更复杂的程序系统的技术。”

“引导这个术语的另一种用法是使用编译器来编译自己,首先用现有语言编写新编程语言的编译器的一小部分,以编译用新语言编写的新编译器的更多程序。”

于 2009-08-10T12:18:53.000 回答
30

在应用程序开发的上下文中,“引导”通常在谈论模块化和/或可自动更新的软件时出现。

而不是用户下载整个应用程序,包括他不需要的功能,并在有更新时重新下载并手动更新它,用户只下载并启动一个小的“引导”可执行文件,然后下载并安装那些用户需要的应用程序的一部分。此外,引导组件能够在每次启动时查找更新并安装它们。

于 2009-08-10T12:29:29.837 回答
18

亚历克斯,这几乎就是您的计算机启动时所做的事情。(“引导”计算机实际上来自引导这个词)

最初,您的 BIOS 中的小程序会运行。它包含足够的机器代码来加载和运行更大、更复杂的程序。

第二个程序可能类似于 NTLDR(在 Windows 中)或 LILO(在 Linux 中),然后执行并能够加载并运行操作系统的其余部分。

于 2009-08-10T14:08:38.403 回答
15

为了完整起见,它也是统计学中一种相当重要(且相对较新)的方法,它使用重采样/模拟从样本中推断总体属性。它有自己的关于引导(统计)的冗长的 Wikipedia 文章

于 2009-08-10T12:26:18.463 回答
4

Bootstrapping 字典的意思是用最少的资源启动。在操作系统的上下文中,一旦开机自检 (POST) 确定唤醒 CPU 是安全的,操作系统应该能够快速加载。引导代码将从 BIOS 运行。BIOS 是一个小型 ROM。通常,它是将操作系统加载到 RAM 的指令集的跳转指令。跳转的目标是硬盘中的引导扇区。一旦 bios 程序检查它是一个有效的引导扇区,它包含存储的操作系统的起始地址,即它是否是一个有效的 MBR(主引导记录)。如果它是有效的 MBR,则操作系统将从那里复制到内存 (RAM),操作系统负责内存和进程管理。

于 2015-09-08T10:31:13.760 回答
3

除了在软件开发中的使用(这里的大多数答案,例如kdgregory )和Dirk Eddelbuettel所讨论的在统计中的使用之外,引导程序在强化学习的上下文中还有另一个含义,可能对开发人员有用。

萨顿和巴托

Widrow、Gupta 和 Maitra (1973) 修改了 Widrow 和 Hoff (1960) 的最小均方 (LMS) 算法,以生成可以从成功和失败信号而不是从训练示例中学习的强化学习规则。他们将这种学习形式称为“<strong>选择性引导适应”,并将其描述为“与批评家一起学习”而不是“与老师一起学习”。他们分析了这条规则并展示了它如何学会玩二十一点。这是 Widrow 对强化学习的一次孤立尝试,他对监督学习的贡献要大得多。

这本书描述了各种强化算法,其中目标值基于先前的近似值作为引导方法:

最后,我们注意到 DP [动态编程] 方法的最后一个特殊属性。它们都基于对后续状态值的估计来更新对状态值的估计。也就是说,他们根据其他估计更新估计。我们称这种一般想法为引导。许多强化学习方法都执行自举,即使是那些不需要(如 DP 所要求的)完整且准确的环境模型的方法。

请注意,这与维基百科关于引导的页面上提到的引导聚合和智能爆炸不同。

于 2018-01-31T10:27:15.003 回答
3

随着问题的回答。用于网络开发。到目前为止,我在 Laravel doc 中找到了关于 bootsrapping 的一个很好的解释。这是链接

一般来说,我们的意思是注册事物,包括注册服务容器绑定、事件监听器、中间件,甚至路由。

希望它对学习Web应用程序开发的人有所帮助。

于 2021-02-13T06:56:23.530 回答
2

就使用流行的 Twitter Bootstrap 而言,我觉得这种类型的引导是将模块化组件集成到 Web 应用程序中的操作,而 Web 应用程序甚至不必承认模块化组件的存在,直到它需要它或引用它.

开发人员只需将 CSS Twitter Bootstrap 主题的默认副本加载(引用)到 Web 应用程序中即可无缝集成它。呜拉!然后您可能需要覆盖其中的一些更改,但您可以这样做,使资源/组件不受影响并且完全可重用。

Web 开发人员如何实现 jQuery API 等也是同样的概念,但开发人员并没有真正将其表达为引导程序本身。它所做的是提高了灵活性和可重用性,同时允许隔离应用程序的不同组件/资源,以自由地驻留在同一服务器上或可能驻留在 CDN 上。

注意:在计算引导处理与 MBR 和 UNIX 中,它需要一个特殊的引导加载程序或管理器,它是 ROM 中的一个小程序,用于将操作系统加载到 RAM 中。如果您考虑一下,在引导加载程序检查 MBR 并根据此表加载操作系统的操作中会发生相同的概念,而操作系统根本不知道会发生这种情况。

于 2015-11-16T04:48:33.200 回答
2

恕我直言,没有比第一个编译器是如何编写的更好的解释了?

如今,操作系统加载是最常见的过程,称为引导

于 2015-12-31T18:12:47.213 回答
2

我属于拨动开关进入引导程序的一代。在 1980 年代初期,我在印度电子公司 (ECIL) 开发的名为 Micro-78 的微型计算机上工作。它是 Altair 8800 的一种克隆。我清楚地记得使用拨动开关输入一个小型引导程序并通过按下按钮执行时会发生什么。该程序读取包含在软盘第一个磁道中的第二个引导程序,并以这样的方式将其覆盖在自身上,以使第二个引导程序开始执行以加载磁盘操作系统。我认为术语“引导程序”是指第一个引导程序读取和覆盖其自身的第二个引导程序的过程,以某种方式“拉起自己”与第二个引导程序的附加功能。

于 2019-03-13T19:25:08.987 回答
-5

作为编程领域的一个不起眼的初学者,在看到这个词在不同地方以明显略有不同的方式使用了很多之后,在这里浏览所有答案,我发现阅读了 Bootstrapping 上的维基百科页面(呃!我没想到或者一开始)对于理解这个词的使用差异非常有用。会不会……在极其罕见的情况下……维基百科对某些术语的解释甚至可能比……(已编辑)更好?他们会在维基百科上引入代表点吗?

对我来说,似乎所有的意义都与此有关:从尽可能简单的事物 1 开始,用事物 2 使事物稍微复杂一些,现在您可以使用事物 2 比您更有效、更快地完成某种任务最初与 Thing1。然后从 Thing2 无限重复到 Thing 3...

我认为它与生物进化和“抽象层”密切相关(像我这样的新手看到,咳咳,维基百科,咳嗽)——从 1940 年的计算机进化而来,带有开关、机器代码、汇编、C、Python、你可以提供的人工智能各种复杂的指令,比如用醉酒的俚语英语或亚马逊部落方言“把 %4^% 晚餐按我的默认 &^$% 要求打扫地板,%$£”@:~”,而不会引发例外' (对于新手来说......你猜对了) - 由于简单的无知而错过了很多链接。

然后在某些特定的软件含义: 含义1:Thing1 用于加载最新版本的Thing2(因为当然Thing2 会比Thing1 大,就像Thing3 会比Thing2 大)。

含义2:Thing1是低级语言(比print("Hello, ", user.name)更接近1001011100....011001)用来写一点点Thing2的高级语言,那么这点点Thing2就是用于将 Thing2 本身从婴儿词汇级别扩展到成人词汇级别(Thing2 开始被婴儿版本本身(它是一个聪明的婴儿!)处理,或者使用正确的技术术语“编译”),而婴儿版本的 Thing2它本身当然只能由 Thing1 编译,因为它在存在之前就不能存在,对吧!),然后 Thing2 的子版本编译 Thing2 的 Surly Teenager 版本,此时编程社区决定 Surly Teenager 的“问题”(软件术语和隐喻术语!)值得花足够的时间解决长期接受,或放弃他们(不知道在哪里进行类比)。

如果是,那么 Thing2 本身(可能几次)从婴儿期到成年期都有“自举”:“孩子是男人的父亲”(华兹华斯,建议不要尝试在 Stack Overflow 上查找引文或作者) .

于 2017-11-01T16:47:02.453 回答