当前位置: 首页 > 面试题库 >

幕后如何实施例外?

海保臣
2023-03-14
问题内容

几乎每个人都使用它们,但是包括我在内的许多人只是简单地认为它们只是在起作用。

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

现在,C ++可能是一个不错的起点,因为您可以使用该语言编写任何东西。

而且,C接近组装。如何使用纯C构造而不使用汇编来模拟异常?

最后,我听说有传言称,出于速度考虑,Google员工在某些项目中不使用例外。这只是谣言吗?没有它们,如何才能取得实质性成就?

谢谢。


问题答案:

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

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

(我肯定还有很多其他的我想念的。)

这些构造的一个有趣的特性是它们的表达能力大致相同:如果您拥有 一个 ,则可以很容易地构建所有其他构造。

因此,如何最好地实现异常取决于可用的其他构造:

  • 每个CPU都有GOTO,因此,如果必须的话,您总是可以退一步。
  • C具有setjmp/longjmp基本上是MacGyver的延续(由胶带和牙签制成,不是很真实,但是如果没有更好的选择,至少可以使您摆脱直接的麻烦)。
  • JVM和CLI具有自己的异常,这意味着,如果您语言的异常语义与Java / C#匹配,则您可以自由使用(但如果不匹配,则很麻烦)。
  • Parrot VM作为例外和延续。
  • Windows有其自己的异常处理框架,语言实现者可以使用该框架在顶部构建自己的异常。

一个非常有趣的使用情况,无论是的 使用 异常 ,并实施
例外的是微软Live实验室的沃尔特项目。(现在不存在了。)Volta的目标是只需按一下按钮即可为Web应用程序提供体系结构重构。因此,只需将一些[Browser][DB]属性放在.NET代码中,就可以将一层Web应用程序转换为两层或三层应用程序,然后这些代码将自动在客户端数据库中运行。为此,显然必须将.NET代码转换为JavaScript源代码。

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

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

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

因此,回答您的原始问题:

幕后如何实施例外?

具有例外的是,具有讽刺意味的是!至少在这种非常特殊的情况下。

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



 类似资料:
  • 在Perl中,使用Moo,可以围绕sub实现sub,它将围绕类中的其他方法。 如何在Raku中实现这种行为,最好使用角色?

  • 我正在尝试实现身份验证 可以请求任何微服务的API网关。 用户微服务-我存储所有用户的地方。实现在此微服务中对用户进行身份验证。按应有的方式工作,登录路由返回我用于在此微服务中对用户进行身份验证的令牌。 其他5个微服务,未经任何身份验证或授权。 问题是:使用身份验证的正确方法是什么

  • 问题内容: 在简要回顾了Go语言规范,有效的Go和Go内存模型之后,我仍然不清楚Go通道是如何工作的。 它们是什么样的结构?它们的行为有点像线程安全队列/数组。 它们的实现取决于体系结构吗? 问题答案: 通道的源文件位于/src/pkg/runtime/chan.go中(从您的源代码根目录开始)。 是通道的中央数据结构,带有发送和接收链接列表(持有指向其goroutine和data元素的指针)和一

  • 问题内容: 什么是实现注释的有效用例? 在设计主要基于注释的配置系统时,我有时需要创建实现代码生成或程序配置的注释的类。 另一种选择是将批注中包含的数据镜像到DTO中,这似乎是一项开销。 这是一个例子: 与实施 我为此收到编译器警告,但是对于许多用例来说,它似乎是一个有效的工具。 上面示例的警告是 注释类型Id不应用作IdImpl的超级接口 编辑: 我刚刚从Guice找到了这个例子: 从Names

  • 我正在尝试理解HK2工厂在泽西应用程序中的实现。 null 每个请求都会创建MyFactory的两个对象 单例工厂,我的理解是,工厂(MyFactory)的一个单一对象,它在注入时提供某种对象。 所以(1)应该工作还是我遗漏了什么? 当位置在下方时,位置在上方的NPE 在以下位置时,在上面位置无NPE

  • 在新gem的初始起草中,我需要保留一些方法实现为空(将在下一步中实现) 因此,我想发出“尚未实现”异常的信号 我想知道是否有特定于Ruby语言的最佳实践或标准约定来编码这种占位符/异常。 例如:类似于: Java中的操作异常 在. net框架(C#)中没有实现异常