我正在观看C++中的系统错误处理 - Andrei Alexandrescu他声称这Exceptions in C++非常非常慢.
我想知道这是否仍然适用 C++98
我很想知道如何在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函数已经尝试捕获任何异常,然后将其转换为这种格式?
谢谢!
我现在花了几个月的时间学习F#,学习F#的最大资产是将John Harrison的" 实用逻辑和自动推理手册 "(WorldCat)中的OCaml代码翻译成F#.
由于这是一种非常有效的学习方法,我计划将更多书籍中的代码翻译成F#,但书籍主要关注功能概念或真实世界应用程序,这些应用程序通常以使用AI,编译器,定理证明等函数语言编写而闻名.和推理助理.
虽然人们会认为将一个程序从一种语言翻译成另一种语言可能是一项微不足道的任务,但实际上,当这样做时,不仅会遇到语言差异,还会考虑环境和工具,这些差异也必须学习和理解才能进行翻译.人们需要探索两种语言及其环境的深度,这些语言在阅读时通常不会被考虑.例如,在将Ocaml翻译为F#时,我学习了顶级,ocamldebug和时间旅行,跟踪和希望F#有这个,camlp4以及它在F#中是如何存在的,异常处理性能差异,以及类型推断的方式迫使我通过用F#试验或阅读书籍,以我不会拥有的方式理解F#对应物.
您是否知道任何其他使用/包含源代码的书籍,最好是功能性的,涵盖函数式编程的概念,或者是通常用函数式语言编写的实际应用程序,通过翻译源代码来帮助学习函数式编程到F#?
为了保持这个目标而不是主观,答案必须解释为什么它很重要,你必须使用这本书而不仅仅是浏览这本书.我正在寻找多年来一直从事函数式编程的人的答案,并且已经找到了通过这样一本书来完成函数式编程的关键.答案的例子:
类型推断 - 本杰明·C·皮尔斯的" 类型和编程语言 "(WorldCat).重要性:帮助理解如何解决类型推断编译器错误,从而导致更好的方法来解决错误并产生更好的代码.
CPS - 由Andrew W. Appel 编写的"使用Continuations进行编译 "(WorldCat) - 重要性:帮助在递归中删除堆栈的使用,从而堆栈溢出并提高性能.我认为尾部调用优化是优化函数,CPS是优化程序.
术语重写 - " 重写和所有那些 "(WoldCat)由Franz Baader和Tobias Nipkow重要性:ATP和Proof助手通常使用功能语言编写并依赖术语重写,如果术语重写不正确则证明引擎是无效.
Lambda演算 - " 通过Lambda演算进行功能编程的介绍 "(WorldCat)作者:Greg …
我已经阅读了/sf/answers/851336251/,它在性能方面解决了OCaml异常,并提到有人可能会使用异常来故意操纵控制流。
但是,我想从语言设计/历史角度了解为具有一流的Sum Types的语言添加例外的背后原理。
我的理解(如果我弄错了,请纠正我)是,OCaml中的异常会破坏类型系统,从而使推理程序的特定状态变得更加困难。与对总和类型进行匹配不同,编译器将不会检查是否处理了所有可能的错误情况,尤其是如果对库函数的修改引入了新的错误状态时,这可能会成为问题。例如,这就是为什么Zig编程语言强制执行错误处理并提供用于检查所有可能的错误情况的编译器强制构造(https://ziglang.org/#A-fresh-take-on-error-handling)。
鉴于以上所述,并且考虑到可能存在绕过多个堆栈框架的情况,我可以想象一个不同的语言构造(也许类似于标记中断),其角色与错误处理没有语义关联。 。
是否有(很多?)情况下处理错误的异常优于显式的,经过编译器检查的错误处理?
我尤其不理解Hashtbl.find抛出异常之类的东西。鉴于Hashtbl.find_opt几年前已经引入的方法,这是否表示在不破坏现有程序的情况下向标准库设计方向的某种转变?
OCaml和标准库中的异常是否是设计OCaml时的产物(例如,当时流行的异常/未完全理解其后果),和/或该语言是否有理由存在异常?