深入理解:The BEAM - Erlang 的虚拟机
本网站使用 cookies 我们使用 cookies 来个性化您的体验,并了解我们表现最好的内容。我们还会与我们的社交媒体、广告和分析合作伙伴分享关于您使用我们网站的匿名信息,他们可能会将其与您提供给他们的其他信息或他们通过您使用其服务收集的信息结合起来。要获取更多详细信息、修改或随时撤回您的同意,请访问 我们的 cookie 政策。 同意选择 必要 偏好 统计 营销 显示详情 详情
- 必要 18
必要的 cookies 通过启用页面导航和访问网站安全区域等基本功能,帮助网站可用。 没有这些 cookies,网站无法正常运行。
- Cloudflare1了解有关此供应商的更多信息
cf.turnstile.u 此 cookie 由 Cloudflare Turnstile 设置,这是一种安全和机器人保护服务,旨在验证访问者是人类而不是机器人。 它有助于防止欺诈或自动化流量,而无需 CAPTCHA 挑战。 该 cookie 存储一个令牌,用于验证用户会话并确保与网站的平稳交互。 最长存储时间 : 持久 类型 : HTML Local Storage
- Cookiebot1了解有关此供应商的更多信息
CookieConsent 存储用户对当前域的 cookie 同意状态 最长存储时间 : 1 年 类型 : HTTP Cookie
- Google2了解有关此供应商的更多信息
此供应商收集的一些数据用于个性化和衡量广告效果。 firebase-heartbeat-database#firebase-heartbeat-store 用于检测垃圾邮件并提高网站的安全性。 最长存储时间 : 持久 类型 : IndexedDB firebase-installations-database#firebase-installations-store 用于连接网站内容分发网络 (CDN) 的控制 cookie。 最长存储时间 : 持久 类型 : IndexedDB
- Pardot4了解有关此供应商的更多信息
visitor_id#-hash [x2] 用于加密和包含访问者数据。 这是用户数据安全所必需的。 最长存储时间 : 10 年 类型 : HTTP Cookie visitor_id# [x2] 与基于帐户的营销 (ABM) 结合使用。 该 cookie 注册数据,例如 IP 地址、在网站上花费的时间和访问的页面请求。 这用于重定向来自同一 IP 地址的多个用户。 ABM 通常有助于 B2B 营销目的。 最长存储时间 : 400 天 类型 : HTTP Cookie
- Stripe3了解有关此供应商的更多信息
__stripe_mid 此 cookie 对于在网站上进行信用卡交易是必需的。 该服务由 Stripe.com 提供,它允许在线交易而不存储任何信用卡信息。 最长存储时间 : 1 年 类型 : HTTP Cookie __stripe_sid 此 cookie 对于在网站上进行信用卡交易是必需的。 该服务由 Stripe.com 提供,它允许在线交易而不存储任何信用卡信息。 最长存储时间 : 1 天 类型 : HTTP Cookie m 确定用于访问网站的设备。 这允许相应地格式化网站。 最长存储时间 : 400 天 类型 : HTTP Cookie
- forms.erlangsolutions.com2 rc::a 此 cookie 用于区分人类和机器人。 这对网站有益,以便对网站的使用情况进行有效报告。 最长存储时间 : 持久 类型 : HTML Local Storage rc::c 此 cookie 用于区分人类和机器人。 最长存储时间 : 会话 类型 : HTML Local Storage
- m.stripe.com3了解有关此供应商的更多信息
_ab 此 cookie 对于在网站上进行信用卡交易是必需的。 该服务由 Stripe.com 提供,它允许在线交易而不存储任何信用卡信息。 最长存储时间 : 会话 类型 : HTML Local Storage _mf 此 cookie 对于在网站上进行信用卡交易是必需的。 该服务由 Stripe.com 提供,它允许在线交易而不存储任何信用卡信息。 最长存储时间 : 会话 类型 : HTML Local Storage id 此 cookie 由 Stripe 设置,用于促进支付处理和欺诈预防。 它有助于 Stripe 识别和验证用户、管理安全交易以及检测结帐过程中的可疑活动。 最长存储时间 : 会话 类型 : HTML Local Storage
- www.erlang-solutions.com2 timezone 存储用户的时区。 最长存储时间 : 会话 类型 : HTTP Cookie wpEmojiSettingsSupports 此 cookie 是用于内容传递和呈现的一组 cookie 的一部分。 这些 cookie 保持字体、博客/图片滑块、颜色主题和其他网站设置的正确状态。 最长存储时间 : 会话 类型 : HTML Local Storage
- Cloudflare1了解有关此供应商的更多信息
- 偏好 1
偏好 cookies 使网站能够记住改变网站行为或外观的信息,例如您的首选语言或您所在的地区。
- m.stripe.com1了解有关此供应商的更多信息
1 此 cookie 与支付窗口结合使用 - 该 cookie 对于在网站上进行安全交易是必需的。 最长存储时间 : 会话 类型 : HTML Local Storage
- m.stripe.com1了解有关此供应商的更多信息
- 统计 4
统计 cookies 通过匿名收集和报告信息来帮助网站所有者了解访问者如何与网站互动。
- Google4了解有关此供应商的更多信息
此供应商收集的一些数据用于个性化和衡量广告效果。 _ga [x2] 注册一个唯一的 ID,该 ID 用于生成访问者如何使用网站的统计数据。 最长存储时间 : 2 年 类型 : HTTP Cookie ga# [x2] 由 Google Analytics 用于收集有关用户访问网站次数以及首次和最近一次访问日期的数据。 最长存储时间 : 2 年 类型 : HTTP Cookie
- Google4了解有关此供应商的更多信息
- 营销 23
营销 cookies 用于跨网站跟踪访问者。 目的是展示与单个用户相关且引人入胜的广告,从而对发布商和第三方广告商更有价值。
- Google1了解有关此供应商的更多信息
此供应商收集的一些数据用于个性化和衡量广告效果。 NID 注册一个唯一的 ID,该 ID 标识返回用户的设备。 该 ID 用于定向广告。 最长存储时间 : 6 个月 类型 : HTTP Cookie
- Imgur1了解有关此供应商的更多信息
IMGURUIDJAFO 用于跟踪访问者对 GIF 的使用情况 - 这用于分析和营销目的。 最长存储时间 : 1 年 类型 : HTTP Cookie
- YouTube19了解有关此供应商的更多信息
#-# 注册一个唯一的 ID,以保存用户观看过的 YouTube 视频的统计信息。 最长存储时间 : 会话 类型 : HTML Local Storage __Secure-ROLLOUT_TOKEN 此 cookie 帮助管理 YouTube 上的功能推出或测试。 它确定为用户激活哪些实验性功能或特性。 它不会存储个人身份信息。 最长存储时间 : 180 天 类型 : HTTP Cookie iU5q-!O9@$ 注册一个唯一的 ID,以保存用户观看过的 YouTube 视频的统计信息。 最长存储时间 : 会话 类型 : HTML Local Storage LAST_RESULT_ENTRY_KEY 用于跟踪用户与嵌入式内容的互动。 最长存储时间 : 会话 类型 : HTTP Cookie LogsDatabaseV2:V#||LogsRequestsStore 用于跟踪用户与嵌入式内容的互动。 最长存储时间 : 持久 类型 : IndexedDB remote_sid 对于网站上 YouTube 视频内容的实施和功能是必需的。 最长存储时间 : 会话 类型 : HTTP Cookie ServiceWorkerLogsDatabase#SWHealthLog 对于网站上 YouTube 视频内容的实施和功能是必需的。 最长存储时间 : 持久 类型 : IndexedDB TESTCOOKIESENABLED 用于跟踪用户与嵌入式内容的互动。 最长存储时间 : 1 天 类型 : HTTP Cookie VISITOR_INFO1_LIVE 尝试估算页面上集成 YouTube 视频的用户的带宽。 最长存储时间 : 180 天 类型 : HTTP Cookie YSC 注册一个唯一的 ID,以保存用户观看过的 YouTube 视频的统计信息。 最长存储时间 : 会话 类型 : HTTP Cookie ytidb::LAST_RESULT_ENTRY_KEY 使用嵌入的 YouTube 视频存储用户的视频播放器偏好 最长存储时间 : 持久 类型 : HTML Local Storage YtIdbMeta#databases 用于跟踪用户与嵌入式内容的互动。 最长存储时间 : 持久 类型 : IndexedDB yt-remote-cast-available 使用嵌入的 YouTube 视频存储用户的视频播放器偏好 最长存储时间 : 会话 类型 : HTML Local Storage yt-remote-cast-installed 使用嵌入的 YouTube 视频存储用户的视频播放器偏好 最长存储时间 : 会话 类型 : HTML Local Storage yt-remote-connected-devices 使用嵌入的 YouTube 视频存储用户的视频播放器偏好 最长存储时间 : 持久 类型 : HTML Local Storage yt-remote-device-id 使用嵌入的 YouTube 视频存储用户的视频播放器偏好 最长存储时间 : 持久 类型 : HTML Local Storage yt-remote-fast-check-period 使用嵌入的 YouTube 视频存储用户的视频播放器偏好 最长存储时间 : 会话 类型 : HTML Local Storage yt-remote-session-app 使用嵌入的 YouTube 视频存储用户的视频播放器偏好 最长存储时间 : 会话 类型 : HTML Local Storage yt-remote-session-name 使用嵌入的 YouTube 视频存储用户的视频播放器偏好 最长存储时间 : 会话 类型 : HTML Local Storage
- forms.erlangsolutions.com2 pardot [x2] 与基于帐户的营销 (ABM) 结合使用。 该 cookie 注册数据,例如 IP 地址、在网站上花费的时间和访问的页面请求。 这用于重定向来自同一 IP 地址的多个用户。 ABM 通常有助于 B2B 营销目的。 最长存储时间 : 会话 类型 : HTTP Cookie
- Google1了解有关此供应商的更多信息
- 未分类 0 未分类的 cookies 是我们正在对个别 cookies 的提供商进行分类的 cookies。 我们不使用此类 cookies。
跨域同意[#BULK_CONSENT_DOMAINS_COUNT#] [#BULK_CONSENT_TITLE#] 您的同意所适用的域名列表:[#BULK_CONSENT_DOMAINS#] Cookie 声明上次更新时间:2025 年 5 月 4 日,由 Cookiebot [#IABV2_TITLE#] [#IABV2_BODY_INTRO#] [#IABV2_BODY_LEGITIMATE_INTEREST_INTRO#] [#IABV2_BODY_PREFERENCE_INTRO#] [#IABV2_LABEL_PURPOSES#] [#IABV2_BODY_PURPOSES_INTRO#] [#IABV2_BODY_PURPOSES#] [#IABV2_LABEL_FEATURES#] [#IABV2_BODY_FEATURES_INTRO#] [#IABV2_BODY_FEATURES#] [#IABV2_LABEL_PARTNERS#] [#IABV2_BODY_PARTNERS_INTRO#] [#IABV2_BODY_PARTNERS#] 关于 Cookies 是网站可以使用的小型文本文件,以提高用户的体验效率。法律规定,如果 cookies 对于本网站的运营是绝对必要的,我们可以将它们存储在您的设备上。 对于所有其他类型的 cookies,我们需要您的许可。 本网站使用不同类型的 cookies。 有些 cookies 由出现在我们页面上的第三方服务放置。 您可以随时在我们的网站上的 Cookie 声明中更改或撤回您的同意。 在我们的隐私政策中了解更多关于我们是谁、如何联系我们以及我们如何处理个人数据的信息。 当您就您的同意与我们联系时,请说明您的同意 ID 和日期。 不出售或分享我的个人信息 仅使用必要的 cookies 允许选择 自定义 允许所有 cookies
The BEAM-Erlang’s virtual machine
- Lorena Mireles
- 2025年1月13日
- 9 分钟阅读时间
注册我们的季度新闻通讯 及时了解最新消息、最佳实践和独家优惠。 不要错过。 在这里注册。 欢迎来到“Elixir,开始您的旅程的 7 个步骤”系列的第一章。 在我之前的文章中,我讨论了我的编程语言之旅。 在本章中,我们将讨论 Erlang 虚拟机,即 BEAM。 要理解为什么 Elixir 编程语言如此强大和可靠,我们必须理解它的基础, 这意味着要讨论 Erlang。 Elixir 运行在 Erlang 虚拟机 上,并继承了它的许多优点。 在这篇文章中,您将了解一些关于 Erlang 的历史,最初创建它的目标,以及为什么它对 Elixir 至关重要。
什么是 Erlang?
Erlang 作为一种编程语言
Erlang 是一种编程语言,由 Joe Armstrong、Robert Virding 和 Mike Williams 于 20 世纪 80 年代中期在 Ericsson 计算机科学实验室创建。 最初是为电信设计的,现在是一种通用语言。 它受到其他编程语言的影响,例如 ML 和 Prolog,并于 1998 年作为开源发布。 Erlang 的设计考虑了分布式、容错、大规模并发和软实时系统,使其成为当今系统的绝佳选择。 大多数人都在寻找这些特性,并且对 Erlang 在生产系统中的历史充满信心。 这种编程语言的一些特点是:
- 它是一种声明式语言,这意味着它基于描述_应该_计算什么而不是_如何_的原则。
- 模式匹配 在高级别以及位序列上都是可能的。
- Erlang 中的 函数 是第一类数据。
Erlang 作为开发生态系统
到目前为止,我们一直将 Erlang 称为编程语言; 然而,应该注意的是,Erlang 也可以指由以下部分组成的整个开发生态系统:
- Erlang 编程语言
- 框架 OTP
- 一系列工具以及
- 虚拟机,BEAM
Erlang 作为一个生态系统,明确地创建是为了支持高可用性系统,即使在发生错误或意外情况时也能提供服务,这归功于其虚拟机 (VM) 的许多特性。
因此,尽管 Erlang 作为一种编程语言本身就很酷,但真正的魔力发生在所有生态系统元素组合在一起时:编程语言、库、OTP 和虚拟机。
如果您想了解更多关于 Erlang 历史的信息,以下资源列表将非常有帮助。
资源
- Keynote: History of philosophy of Erlang with its creators | Code BEAM V America 2021
- 100 Years of Erlang | Quinn Wilton | Code BEAM America 2021
- Robert Virding – Hitchhiker’s Tour of the BEAM
- A brief introduction to BEAM
Erlang 虚拟机,BEAM
Erlang 虚拟机,通常被称为 BEAM,作为一个操作系统进程运行,负责执行 Erlang 代码。 它还负责创建、调度和管理 Erlang 进程,Erlang 进程是并发的基础。
由于 BEAM 调度器的存在,这些进程能够以最有效的方式执行,从而使系统具有高度的 可扩展性。 进程不共享内存; 它们通过异步消息传递进行通信。 这种机制是系统 容错性 的基础。 由于它们完全隔离,如果其中一个进程发生错误,其他系统进程不会受到影响。
BEAM 还负责并行化您的并发 Erlang 程序,从而最大限度地利用机器的资源。 最初,虚拟机模型是一个单运行队列。 然而,它演变成每个可用处理器的运行队列,确保没有瓶颈,并确保 Erlang 程序在任何系统上都能正确工作,无论机器核心的数量如何。
另一个特点是存储管理是自动化的。 垃圾回收是按进程实现的,这使得系统的响应时间始终保持在毫秒级,而不会降低性能。
最后,我最喜欢的功能之一是错误检测。 虚拟机提供了有效错误检测和处理所需的所有元素,从而促进了一个始终可用的系统,而不管发生什么故障。
总而言之,BEAM 负责系统的可扩展性、分布和响应能力:
- 管理它的并发性。
- 它具有错误检测和处理机制。
- 充分利用计算机的资源。
如果您想了解更多关于 Erlang 和 Elixir 这一组合的信息,请查看 “什么是 Elixir” 这篇文章。
BEAM 中的 Elixir
与 Erlang 一样,Elixir 也受到其他编程语言的影响,包括 Erlang 本身。 它的代码运行在 Erlang 虚拟机上,这意味着它利用了它的所有功能,并且可以使用所有 Erlang 库和 OTP 框架。
除了 Elixir 和 Erlang 之外,不同的编程语言也在 BEAM 中运行,但 Elixir 确保了 BEAM 和程序员之间的方法是流畅且易于理解的。
Elixir 代码被编译成在 BEAM 中运行的字节码,并且比 Erlang 代码更紧凑。 它的语法类似于我们日常交流的方式,即使您是第一次使用它进行编程,也可以尽早熟悉该语言。 它还减少了样板代码,并具有令人惊叹的文档。
因此,当使用 Elixir 编写代码时,我们拥有两全其美:一个坚实且经过实战考验的基础,使我们能够创建防故障系统;另一方面,它还具有漂亮的语法、定义明确的模式和代码简化等等。 因此,Elixir 得到了广泛的接受并迅速获得了普及。
Elixir 是一种很酷的编程语言,它使您可以编写易于理解和维护的代码,并利用 Erlang 并发模型,我们将在下一章中讨论。
> iex``iex(1)> list = [4,5,21,1,38]``iex(2)> erlang_example = :lists.sort(list);``[1, 4, 5, 21, 38]``iex(3)> elixir_example = ``Enum``.sort(list)``[1, 4, 5, 21, 38]
如何在交互式 Elixir shell 中运行 Erlang 和 Elixir 代码的示例
下一章
在下一篇文章“理解进程和并发”中,我们将讨论 Erlang 进程是如何工作的,以及它们在开发健壮且可扩展的系统中的重要性。 我们还将看到 Erlang 中并发是如何工作的,以及这与 Elixir 有何关系。 不要错过! 如果您想 更详细地讨论 Elixir,您可以 给团队留言。 ![Author avatar](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_250,h_250/https://www.erlang-solutions.com/wp-content/uploads/2023/0