编程语言“颜色”难题:异步与同步困境,Go语言如何破局?
一种新语言
为写博客假设一门新语言,语法类似JS,支持一等函数,高阶函数实用,可用于测试框架和数据解析,开启函数狂欢。
你的函数是什么颜色的?
这门语言函数有红、蓝两色,定义和调用有规则,高阶函数编写棘手,核心库部分函数为红色,带来诸多麻烦。
这是函数式编程的错!
即便不用高阶函数,拆分程序为独立函数时也会出现颜色问题,如Dijkstra算法代码提取成函数时颜色难定。
一个色彩寓言
红色函数即异步函数,以Node.js上JavaScript编程为例,说明异步函数带来“回调地狱”,人们创建异步库解决问题。
我保证未来会更好
Node社区用Promise解决回调函数问题,但仍有局限,无法完全解决异步与同步代码的麻烦。
我在期待一个解决方案
C#用“await”关键字调用异步函数,异步 - 等待让异步代码编写变容易,但仍存在颜色问题,影响代码库。
哪种语言没有 “颜色”?
JS、Dart、C#、Python等语言有颜色问题,Java、Go、Lua、Ruby无此问题,它们共同点是有可切换的多个独立调用栈。
对过往操作的回忆
异步IO需展开并丢弃C调用栈,Node用延续传递风格解决问题,但手动具现化步骤麻烦,Promise和future作用有限。
期待生成式解决方案
异步 - 等待进行CPS转换,编译器将代码编译成链式闭包,生成器也有类似作用,但最终仍会将异步函数拆成闭包。
具现化的调用栈
线程可避免异步带来的麻烦,Go语言在这方面表现出色,消除同步和异步代码区别,解决颜色问题带来的麻烦。
