什么是自举?


636

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


8
根据Wikipedia的说法,“ bootstrapping”一词在计算方面有四种用法-en.wikipedia.org/wiki/Bootstrapping#Computing
Thomas Owens

1
我刚刚用此更新了HeDinges帖子。我一直在寻找有关Alex正在查看哪种形式的引导程序的说明。
Thomas Owens

在软件开发中,它是指依次开发更复杂,更快的编程环境。
幸运

在.NET软件开发中,我的理解是它指的是应用程序将在其中运行的环境的设置,例如需要注册或加载的任何服务。
Neo

Answers:


318

“引导”来自术语“用自己的引导程序拉起自己”。你可以从Wikipedia那里得到很多。

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

“ Bootstrapping”也用作使用自身(或更正确地说是其前身版本)构建系统的术语。例如,ANTLR版本3是使用ANTLR版本2开发的解析器编写的。


8
哇,我几乎忘记了PDP上的前面板开关。谢谢给的回忆!!
Jeff Hornby,

7
如果我错了,请纠正我。尽管此答案说明了可以进行引导的技术细节,但从未在问题的上下文中回答原始问题。
jayscript

5
@jayscript-您将如何选择回答这个问题?这是一种惯用语,惯用语通常是使用它们的社会团体所理解的,并且在其外是不可理解的。我试图以身作则,我相信这是尝试翻译成语的几种方法之一。

3
@kdgregory我来这里寻找答案时,我无法回答这个问题。我推测自举这个词本身就是几个松散相关的不同技术概念的隐喻,这可能是造成混淆的原因。
jayscript

2
PDP 11 ?!我没有意识到我们这里有老人。:P
约翰·雷德

255

在某些Web框架中有一个引导示例。您调用index.php(引导程序),然后它加载框架帮助程序,模型,配置,然后加载控制器并将控制权转交给它。

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


50
在Web开发方面(这是原始问题的背景),我认为这是最好的答案。
cartbeforehorse 2015年

似乎与Laravel有关,但Laravel在2009
。– LppEdd

@Wajdan Ali不,这不应该被接受。这是术语“引导”的新用法的微观视图,有人认为这实际上是对更早术语的滥用。“引导”是指通过引导来振作起来,即,利用某种东西的力量来发挥自己的作用。它是“启动计算机”一词的由来。Web开发中当前的流行用法不是单词的唯一(或原始)用法。许多其他答案可以适当地解决这个问题。
Kallaste

3
@Kallaste,很好,但这是我要寻找的答案,并且,根据原始问题(“应用程序开发”)的上下文,它似乎是已经指出的最合适的答案。
bynary

@ aaron.bynum,不,给出的答案适用于Web开发框架,绝对不适用于应用程序开发。答案是误导性的和有缺陷的,因为它依赖于对引导程序的实际含义和来源的普遍误解。它只是散布错误信息。如果那是您来这里寻找的东西,那很好,但是SO总体上看重正确的信息。因此,我的评论。
Kallaste

51

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

有一节和链接解释了在计算中的含义。它在该领域有四种不同用途。

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

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

“引导”一词的另一种用法是使用编译器自行编译,方法是先用现有语言编写一小部分新编程语言的编译器,然后再编译用该新语言编写的新编译器的更多程序。”


6
您能否引用或解释一下,这样读者就不必遍历多个网站来获得答案?
Kurt W. Leucht 09年

5
“软件行业:合法销售不合格商品并对其升级收取费用的独特业务。”
SteinÅsmul2014年

我正在寻找一个在Compiler中引导的答案。这很有帮助。
Siraj Alam

48

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

例如:

  • 您如何编译用C编写的C编译器?
  • 如果尚未运行操作系统,如何启动操作系统初始化过程?
  • 您如何启动一个分布式(点对点)系统,在该系统中,客户端依靠其当前已知的对等方来查找系统中的新对等方?

在那种情况下,自举是指一种打破循环依赖的方法,通常借助于外部实体,例如

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

等等


4
这确实成为问题的核心。如果其他两个答案完全遗漏了。
Arturo Hernandez

1
我觉得这种解释通常与软件开发最相关。真正为我带来了这个概念
万斯·帕拉西奥

23

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

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


4
我从未听说过在特定情况下使用的“引导”一词。
孟买2009年

通常用于php应用程序(例如使用Composer完成此操作)
AturSams,2014年

15

亚历克斯,这几乎是计算机启动时的工作。(“引导”计算机实际上来自引导一词)

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

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


2
尽管我阅读了所有答案(对术语进行了扩展,并投了赞成票),但这种简单的“引导”(又称“引导”)比较为我提供了阅读所有其他内容的最佳动力。Srsly,这就像向一个5岁的孩子讲一个复杂的话题,他们明白了。谢谢。
克里斯22年

14

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


1
相对较新?至少在15年前,这是我进行统计教育的一部分。
Toon Krijthe 09年

6
这就是为什么我说“相对”的原因:Efron的最初文章来自1980年代初期,而不是说健壮性文献始于1960年代。
Dirk Eddelbuettel,2009年

4

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



2

引导学习强化学习的上下文中还有另一种含义,除了在软件开发中的使用(大多数答案,例如,由kdgregory提供)以及在Dirk Eddelbuettel讨论的统计中的使用之外,对于开发人员来说可能也是有用的。

萨顿和巴托出发:

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

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

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

请注意,这与引导过程中维基百科页面上提到的引导程序聚合和智能爆炸有所不同。


1

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

开发人员只需将其加载(引用)到Web应用程序中,即可无缝集成CSS Twitter Bootstrap主题的默认副本。哇!然后,您可能需要覆盖其中的某些更改,但是您可以采用这样的方法,使资源/组件保持不变并且可以完全重用。

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

注意:在使用MBR进行计算引导时,在UNIX中,它需要特殊的引导程序或管理器,它是ROM中的一个小程序,可以将OS加载到RAM中。如果您考虑一下,引导加载程序将检查此MBR并基于此表加载OS,这是在操作系统不知道会发生这种情况的情况下发生的。


0

我属于一代人,他们拨动开关进入启动程序。在1980年代初期,我研究了由印度电子公司(ECIL)开发的微型计算机Micro-78。它是Altair 8800的一种复制品。我清楚地记得使用拨动开关输入一个小的启动程序并按一个按钮执行时会发生什么情况。该程序读取软盘的第一磁道中包含的第二个引导程序,并以使第二个引导程序开始执行以加载磁盘操作系统的方式对其进行覆盖。我认为术语“引导程序”是指第一个引导程序在自身上读取并覆盖第二个引导程序的过程,以“拉起自身”的方式使用第二个引导程序的附加功能。


-3

作为编程界的谦虚初学者,在看到这个词在不同地方以明显不同的方式大量使用后,我翻阅了这里的所有答案,我发现阅读了有关Bootstrapping的Wikipedia页面(du!我没想到(无论是一开始)还是非常有帮助的,以了解该词在用法上的差异。难道是……在极少数情况下……维基百科对某些术语的解释可能比……(已编辑)更好?他们会在Wikipedia上带来代表点吗?

对我而言,似乎所有含义都与之相关:从尽可能简单的Thing1开始,使该Thing2变得更复杂,现在您可以使用Thing2比您可以更高效,更快速地执行某种任务最初与Thing1。然后无限重复从Thing2到Thing 3 ...

我认为它与生物进化和“抽象层”紧密相连(像我这样的新手,ahem,Wikipedia,咳嗽)-1940年代带有开关,机器代码,汇编,C,Python和AI的计算机的进化各种复杂的说明,例如用醉酒语英语或亚马逊部落方言“使%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 Junior版本,这时编程社区决定Surly Junior的“问题”(软件术语和隐喻术语!)值得花足够的时间解决,以便长期接受,或抛弃它们(不确定在这里进行类比)。

如果是的话,那么Thing2从婴儿期到成年期已经(可能几次)“陷入僵局”:“孩子是男人的父亲”(华兹华斯,建议不要尝试使用引号或Stack Overflow上的作者) 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.