什么是自举?

时间:2009-08-10 12:16:29

标签: bootstrapping

我一直看到在应用程序开发的讨论中提到的“bootstrapping”。它似乎既广泛又重要,但我还没有看到一个关于实际引导的错误解释;相反,似乎每个人都应该知道这意味着什么。不过,我没有。我可以说,它与启动时应用程序所需的初始化任务有关,但我可能完全错了。任何人都可以帮我理解这个想法吗?

14 个答案:

答案 0 :(得分:287)

“Bootstrapping”来自于“通过自己的引导来提升自己”这个术语。你可以从Wikipedia得到那么多。

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

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

答案 1 :(得分:226)

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

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

答案 2 :(得分:51)

请参阅有关bootstrapping的维基百科文章。

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

以下是一些引用,但有关更深入的解释和其他含义,请参阅上面的链接。

  

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

     

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

答案 3 :(得分:29)

术语" bootstrapping"通常适用于系统依赖于自身启动的情况,即鸡和蛋的问题。

例如:

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

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

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

答案 4 :(得分:22)

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

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

答案 5 :(得分:14)

为了完整性,它在统计学中也是一种相当重要(且相对较新)的方法,它使用重采样/模拟来从样本中推断出种群属性。它有自己冗长的Wikipedia article on bootstrapping (statistics)

答案 6 :(得分:14)

Alex,它几乎就是你的电脑启动时所做的事情。 ('启动'计算机实际上来自bootstrapping这个词)

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

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

答案 7 :(得分:4)

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

答案 8 :(得分:2)

恕我直言,关于How was the first compiler written?

的事实没有更好的解释

目前,操作系统加载是最常见的过程,称为Bootstrapping

答案 9 :(得分:1)

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

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

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

注意:在计算引导处理MBR时,在UNIX中它需要一个特殊的引导加载程序或管理器,它是ROM中的一个小程序,它将操作系统加载到RAM中。如果你考虑一下,同样的概念发生在引导加载程序的操作中,检查MBR并基于该表加载操作系统,而OS不会发生这种情况。

答案 10 :(得分:1)

Bootstrapping在强化学习的背景下还有另一个意义,除了在软件开发中的使用之外,对于开发人员来说可能是有用的(这里的大多数答案,例如kdgregoryDirk Eddelbuettel讨论了它在统计中的用途。

来自Sutton and Barto

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

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

  

最后,我们注意到了    DP [动态编程]方法的最后一个特殊属性。所有这些都会更新估算值   基于后继值估计的状态值   状态。也就是说,他们会根据其他情况更新估算值   估计。我们将此概念称为 bootstrapping 。许多加固   学习方法执行自举,即使那些没有   要求,如DP所要求的,完整和准确的模型   环境。

请注意,这与引导时wikipedia page上提到的引导程序聚合和情报爆炸不同。

答案 11 :(得分:1)

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

<块引用>

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

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

答案 12 :(得分:0)

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

答案 13 :(得分:-3)

作为编程领域的一个谦逊的初学者,在看到这个词在不同的地方以明显略有不同的方式使用后,点击这里的所有答案,我发现在Bootstrapping上阅读维基百科页面(呃!我没有' (首先想到它)对于理解使用这个词的差异非常有用。难道......在极少数情况下......维基百科甚至可能对某些术语有更好的解释而不是....(编辑)?他们会在维基百科上带来代表点吗?

对我而言,似乎所有意义都与之相关:从尽可能简单的东西开始Thing1,使Thing2做一些稍微复杂的东西,现在你可以使用Thing2更高效,更快地完成某些任务比你最初使用Thing1。然后无限地从Thing2重复到Thing 3 ......

我认为它与生物进化和'抽象层'密切相关(像我这样的新手,咳嗽,维基百科,咳嗽) - 从1940年开发的计算机与开关,机器代码,汇编,C,Python,AIs的演变你可以提供各种复杂的指示,比如“让%4 ^%的晚餐达到我的默认价格和^ $%的要求并清理地板你%$£”@:〜“醉酒俚语英语或亚马逊部落方言没有它们“提出异常”(对于新手再次......你猜对了) - 因为简单的无知而错过了很多链接。

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

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

如果是的话,那么从童年到成年,Thing2本身(可能是几次)“自我引导”:“孩子是男人的父亲”(华兹华斯,建议不要试着查看引文或作者Stack Overflow)。