关闭。这个问题需要更多focused .它目前不接受答案。
想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .
5 个月前关闭。
Improve this question
几乎每个人都在使用它们,但包括我在内的许多人都认为它们只是工作是理所当然的。
我正在寻找高质量的 Material 。我使用的语言是:Java、C、C#、Python、C++,所以这些是我最感兴趣的。
现在,C++ 可能是一个很好的起点,因为您可以用该语言抛出任何东西。
此外,C 接近装配。如何使用纯 C 结构而不使用汇编来模拟异常?
最后,听说谷歌员工出于速度的考虑,不会对某些项目使用异常。这只是谣言吗?没有他们,任何实质性的事情怎么可能完成?
谢谢你。
最佳答案
异常只是高级非本地流控制构造的更一般情况的一个特定示例。其他例子是:
GOTO
形式,在高级、高阶语言中很流行),GOTO
. (我确定还有很多我错过了。)
这些结构的一个有趣特性是它们在表达能力上大致相当:如果你有一个,你可以很容易地构建所有其他的。
因此,如何最好地实现异常取决于您有哪些其他可用的结构:
GOTO
,因此,如果必须,您始终可以退回到那个位置。 setjmp
/longjmp
它们基本上是 MacGyver 的延续(由胶带和牙签制成,不是真正的东西,但如果你没有更好的东西,至少可以让你摆脱眼前的麻烦)。 一个非常有趣的用例,无论是异常的使用还是异常的实现都是 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/