Warning: Undefined global variable $debug in /var/www/ourcoders/tiny4cocoa/application/controllers/baseController.php on line 124
有个梨UGlee 2019-12-23 02:06:54 发布的技术动态 - OurCoders (我们程序员)
有个梨UGlee
2019-12-23 02:06:54 发布
throw的语言实现,其实你选择写一次语言解释器就明白了。所谓try catch就是在主函数栈之外再建一个try catch finally的栈,引用主栈,这样在遇到throw的时候,知道栈回卷到哪里,即哪些function frame直接抛了。

c语言没有throw定义,但c语言里实现throw一点也不麻烦,实际上有很多c/c++的变种语言用预处理器做这个功能。

java是有栈定义的。throw也理所应当。

但go是个另类,goroutine相当于在userspace做了一套thread,本来在plan9里这个货是kernel提供的,alef可以在userspace直接用;但是在其它操作系统上,没有类似plan9定义的那种thread支持,go只能在runtime里全搞一遍。

go是鼓励细粒度的goroutine的,每个goroutine有一块在堆内存上分配的栈,这件事情让throw的实现变得麻烦,goroutine本身也不是类似fiber的coroutine,go的runtime有权把两个goroutine放在一个线程里跑,也可以放在不同线程里跑,如果有throw支持,channel如何处理也会很麻烦。

所以我的理解是即使go的错误处理看起来很像C,但本质两回事。

++++

同样的问题在unix设计里没逃掉。Ritchie说过为什么unix程序的stdout和stderr分开,最初的设计不是分开的,后来发现没法用。

在go里问题本质是一样的,是用一个channel,还是两个channel。不好平衡。