网教网

搜索
查看: 134|回复: 4

新流式编程(序)

[复制链接]

1

主题

2

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2022-12-9 20:54:58 | 显示全部楼层 |阅读模式
简介

一种全新的流式编程机制。本专栏将从零开始,深入浅出实现所有主要API,功能覆盖Java/Kotlin流式API的绝大部分,且显著提升性能。
在此基础上,更大的亮点是借助该机制,无需协程与CPS变换也可轻易实现生成器模式。不仅弥补了Java的重大缺陷,还额外带来许多实用的衍生功能。
其原理简单粗暴,API高度简洁,能增强任何支持闭包的编程语言。只要支持闭包即可,哪怕它简陋到连for循环都没有
专栏目录


  • 流的定义,一切都从forEach开始
  • 流的下标与中断,实现take/drop/takeWhile/dropWhile
  • 流的降维,实现flatMap
  • 流的组合,实现zip
  • 流的收集,基于fold/reduce实现toList/toSet/toMap/ join
  • 流的分组,基于fold/reduce实现groupBy
  • 流的缓存,实现cache以重复使用高开销流
  • 流的累加,实现 runningFold
  • 流的元素归一 ,实现any/all/none/first
  • 流的元素比较,实现 sort/max/min
  • 流的数学计算,实现 count/sum/average
  • 流生成器,依然从forEach开始
  • 基于流生成器,实现无限数列与多重笛卡尔积
  • 基于流生成器,实现流的元素追加append/appendAll/appendWith
  • 基于流生成器,将树的递归遍历直接转化为流
  • 基于流生成器,将任意DFS直接转化为流
  • 流的分段处理,前后两部分各做不同操作
  • 流的性能测试,benchmark力压Java/Kotlin原生API
  • 并发流,实现parallelMap/parallelForEach
  • 流的万金油价值:增强几乎所有语言
  • 流的应用,改良Java原生API,增强List/Set/Map
  • 流的应用,两种新的高性能的List
  • 流的应用,将File/Resource/InputStream转化为String流
  • 流的本地缓存
  • 流的应用,CSV阅读器:String流->List<String>流->Object流
  • 流的应用,CSV文件头解析
背景

最近搞出来一个很有意思也很有用的玩意儿。故事大概就是就是我为了游戏玩得爽,专门研究了下AutoHotKey_v2的脚本语言,好写一些带快捷键的自动化脚本。研究之后我很快发现这个语言实在有点弱鸡,几乎没有高阶函数支持,许多重要操作甚至还是过程式的,写起脚本来体验相当不好。我心想这哪能忍,干脆游戏也懒得玩了,琢磨着怎么给这个语言加特性。
结果出乎意料,特性加着加着,加出了一个我始料未及的东西,我将其称之为一种新型的流式编程机制。这个机制非常强大灵活,对语言特性的要求也很低,可以说是个万金油,啥语言都能上。所以我决定开一篇专栏,对其进行深入浅出的、体系化的探讨。嗯,二十篇文章起步吧,我目录都列好了。
正文

首先介绍一些前置概念。所谓流式编程,具体就是指基于一些流式API的编程风格,可以帮助用户便捷的进行批量数据操作以及流转控制,例如Java里的Stream,Kotlin里的Sequence ,Python里generator与列表推导。它们通常带有一些函数式编程里的经典函数,如map,filter,take,drop reduce,groupby,yield等等。 不同语言对这些函数的实现方式大同小异,大概来说,流相关的API往往借助迭代器iterator实现 ,而生成器generator与yield的功能往往依赖于语言本身的协程调度或者虚拟机上的CPS变换。
那么有没有一种可能,完全不用iterator但是却能实现流的API?毕竟不是所有语言都有迭代器。甚至更进一步的,有没有一种可能,没有协程支持也能实现生成器generator与yield?毕竟支持协程的语言更少——比方说大名鼎鼎的Java(19以前,还有以协程主要为卖点却依然没有生成器的Go(摊手。
好了,那咱就开门见山,说说我搞出来的这个流,都有哪些好。
核心特性1:可以不依赖迭代器iterator实现流。对弱鸡的过程式语言相当友好。
核心特性2:不依赖协程/函数挂起/CPS变换实现yield与generator。为Java和Go两位老爷接上断腿。
衍生特性:将树的递归遍历乃至任何DFS直接转化为流,不受调用栈约束,全网最强。
衍生优势:比相比Kotlin的Sequence和Java的Stream提升约20%~40%的性能。
在本专栏,我将从零开始,一步一步实现出完整的流式API,生成器,以及各种常见的应用场景。同时尽力展现这种新机制的各种奇妙特性。
敬请期待!
下一篇:流的定义,一切都从forEach开始
回复

使用道具 举报

3

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2022-12-9 20:55:14 | 显示全部楼层
其实continuation monad是万物之母[大笑],一切编程模型都是从它那里演化出来的。并没有什么新流式编程。
回复

使用道具 举报

1

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2022-12-9 20:55:34 | 显示全部楼层
高!
回复

使用道具 举报

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-12-9 20:55:44 | 显示全部楼层
所以你玩的什么游戏?
回复

使用道具 举报

1

主题

5

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-12-9 20:55:52 | 显示全部楼层
划水戏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表