相关疑难解决方法(0)

C++中的异常是否真的很慢

我正在观看C++中的系统错误处理 - Andrei Alexandrescu他声称这Exceptions in C++非常非常慢.

我想知道这是否仍然适用 C++98

c++

83
推荐指数
4
解决办法
4万
查看次数

OCaml内部:例外

我很想知道如何在OCaml运行时处理异常以使它们如此轻量级.他们使用setjmp/longjmp还是在每个函数中返回一个特殊值,然后传播它?

在我看来,longjmp会给系统带来一点压力,但只有当引发异常时,检查每个函数的返回值才需要在调用函数后检查每个值和每个值,这在我看来会很多检查和跳跃,似乎表现最差.

通过查看OCaml如何与C接口(http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc142),并查看callback.h,似乎通过使用标记异常对象的内存对齐(#define Is_exception_result(v)(((v)&3)== 2)).这似乎表明它的实现不使用longjmp并在每次函数调用后检查每个函数结果.是吗?或者C函数已经尝试捕获任何异常,然后将其转换为这种格式?

谢谢!

compiler-construction ocaml exception internals longjmp

21
推荐指数
1
解决办法
1952
查看次数

学习F#:使用其他编程语言的书籍可以翻译成F#来学习功能概念吗?

我现在花了几个月的时间学习F#,学习F#的最大资产是将John Harrison的" 实用逻辑和自动推理手册 "(WorldCat)中的OCaml代码翻译成F#.

由于这是一种非常有效的学习方法,我计划将更多书籍中的代码翻译成F#,但书籍主要关注功能概念真实世界应用程序,这些应用程序通常以使用AI,编译器,定理证明等函数语言编写而闻名.推理助理.

虽然人们会认为将一个程序从一种语言翻译成另一种语言可能是一项微不足道的任务,但实际上,当这样做时,不仅会遇到语言差异,还会考虑环境和工具,这些差异也必须学习和理解才能进行翻译.人们需要探索两种语言及其环境的深度,这些语言在阅读时通常不会被考虑.例如,在将Ocaml翻译为F#时,我学习了顶级,ocamldebug和时间旅行,跟踪和希望F#有这个,camlp4以及它在F#中是如何存在的,异常处理性能差异,以及类型推断的方式迫使我通过用F#试验或阅读书籍,以我不会拥有的方式理解F#对应物.

您是否知道任何其他使用/包含源代码的书籍,最好是功能性的,涵盖函数式编程的概念,或者是通常用函数式语言编写的实际应用程序,通过翻译源代码来帮助学习函数式编程到F#?

为了保持这个目标而不是主观,答案必须解释为什么它很重要,你必须使用这本书而不仅仅是浏览这本书.我正在寻找多年来一直从事函数式编程的人的答案,并且已经找到了通过这样一本书来完成函数式编程的关键.答案的例子:

f# functional-programming

8
推荐指数
1
解决办法
894
查看次数

为什么OCaml使用异常而不是用求和类型表示错误?

我已经阅读了/sf/answers/851336251/,它在性能方面解决了OCaml异常,并提到有人可能会使用异常来故意操纵控制流。

但是,我想从语言设计/历史角度了解为具有一流的Sum Types的语言添加例外的背后原理。

我的理解(如果我弄错了,请纠正我)是,OCaml中的异常会破坏类型系统,从而使推理程序的特定状态变得更加困难。与对总和类型进行匹配不同,编译器将不会检查是否处理了所有可能的错误情况,尤其是如果对库函数的修改引入了新的错误状态时,这可能会成为问题。例如,这就是为什么Zig编程语言强制执行错误处理并提供用于检查所有可能的错误情况的编译器强制构造(https://ziglang.org/#A-fresh-take-on-error-handling)。

鉴于以上所述,并且考虑到可能存在绕过多个堆栈框架的情况,我可以想象一个不同的语言构造(也许类似于标记中断),其角色与错误处理没有语义关联。 。

是否有(很多?)情况下处理错误的异常优于显式的,经过编译器检查的错误处理?

我尤其不理解Hashtbl.find抛出异常之类的东西。鉴于Hashtbl.find_opt几年前已经引入的方法,这是否表示在不破坏现有程序的情况下向标准库设计方向的某种转变?

OCaml和标准库中的异常是否是设计OCaml时的产物(例如,当时流行的异常/未完全理解其后果),和/或该语言是否有理由存在异常?

ocaml language-design

7
推荐指数
2
解决办法
175
查看次数