c++ - 异常是如何在幕后实现的?

标签 c++ python c exception

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

5 个月前关闭。




Improve this question




几乎每个人都在使用它们,但包括我在内的许多人都认为它们只是工作是理所当然的。

我正在寻找高质量的 Material 。我使用的语言是:Java、C、C#、Python、C++,所以这些是我最感兴趣的。

现在,C++ 可能是一个很好的起点,因为您可以用该语言抛出任何东西。

此外,C 接近装配。如何使用纯 C 结构而不使用汇编来模拟异常?

最后,听说谷歌员工出于速度的考虑,不会对某些项目使用异常。这只是谣言吗?没有他们,任何实质性的事情怎么可能完成?

谢谢你。

最佳答案

异常只是高级非本地流控制构造的更一般情况的一个特定示例。其他例子是:

  • 通知(异常的概括,最初来自一些旧的 Lisp 对象系统,现在在 CommonLisp 和 Ioke 中实现),
  • 延续(一种更结构化的 GOTO 形式,在高级、高阶语言中很流行),
  • 协程(子程序的泛化,尤其在 Lua 中流行),
  • 生成器 à la Python(本质上是一种受限形式的协程),
  • 纤维(合作轻量线)当然还有已经提到的
  • GOTO .

  • (我确定还有很多我错过了。)

    这些结构的一个有趣特性是它们在表达能力上大致相当:如果你有一个,你可以很容易地构建所有其他的。

    因此,如何最好地实现异常取决于您有哪些其他可用的结构:
  • 每个 CPU 都有 GOTO ,因此,如果必须,您始终可以退回到那个位置。
  • C有setjmp/longjmp它们基本上是 MacGyver 的延续(由胶带和牙签制成,不是真正的东西,但如果你没有更好的东西,至少可以让你摆脱眼前的麻烦)。
  • JVM 和 CLI 有它们自己的异常,这意味着如果您的语言的异常语义与 Java 的/C# 匹配,那么您就可以自由自在(但如果不是,那么您就完蛋了)。
  • Parrot VM 作为异常(exception)和延续。
  • Windows 有自己的异常处理框架,语言实现者可以使用该框架在上面构建自己的异常。

  • 一个非常有趣的用例,无论是异常的使用还是异常的实现都是 Microsoft Live Lab 的 Volta Project。 (现已不复存在。)Volta 的目标是通过按一下按钮为 Web 应用程序提供架构重构。因此,您只需放置一些 [Browser] 就可以将您的一层 Web 应用程序变成两层或三层应用程序。或 [DB] .NET 代码上的属性,然后代码会自动在客户端或数据库中运行。为了做到这一点,.NET 代码显然必须转换为 JavaScript 源代码。

    现在,您可以只用 JavaScript 编写一个完整的 VM,并在未修改的情况下运行字节码。 (基本上,将 CLR 从 C++ 移植到 JavaScript。)实际上有一些项目这样做(例如 HotRuby VM),但这既低效又与其他 JavaScript 代码互操作性不强。

    因此,相反,他们编写了一个编译器,将 CIL 字节码编译为 JavaScript 源代码。但是,JavaScript 缺少 .NET 具有的某些功能(生成器、线程以及两个异常模型不是 100% 兼容的),更重要的是它缺少编译器编写者喜欢的某些功能(GOTO 或延续)并且可能用于实现上述缺失的功能。

    但是,JavaScript 确实有异常(exception)。因此,他们使用 JavaScript Exceptions 来实现 Volta Continuations,然后他们使用 Volta Continuations 来实现 .NET Exceptions、.NET Generators 甚至 .NET Managed Threads(!!!)

    所以,要回答你原来的问题:

    How are exceptions implemented under the hood?



    具有讽刺意味的是,异常(exception)!至少在这个非常具体的情况下,无论如何。

    另一个很好的例子是 Go 邮件列表上的一些异常提议,它们使用 Goroutines(类似于并发协程和 CSP 进程的混合)实现异常。另一个例子是 Haskell,它使用 Monads、惰性求值、尾调用优化和高阶函数来实现异常。一些现代 CPU 还支持用于异常的基本构建块(例如专为 Azul Systems Java Compute Accelerators 设计的 Vega-3 CPU)。

    关于c++ - 异常是如何在幕后实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1995734/

    相关文章:

    Python 2.7x 生成器返回 bool 列表中 "False"的索引

    python - pandas groupby 以一列为条件来填充另一列

    c - 用C语言从M68k ram地址中获取特定的十六进制

    c - 如何在 C 中通过 make 更改宏定义

    c++ - 在 OpenCV 中保存图像

    c++ - 如何在模板类中使用友元运算符?

    c++ - WinInet CFtpConnection::openfile 多个文件

    python - 如何通过选择不相交的列集合来构建 Pandas 数据框的子集?

    c - 免费 - SP16 缓冲器

    c++ - 类模板SFINAE