什么是面向过程 一个函数的自白:从函数的角度看编程的方式(5)

电脑杂谈  发布时间:2018-02-16 19:49:21  来源:网络整理

所有现代高级编程语言都有一个类型系统,在开发和执行过程中的不同节点检测数据类型。什么是面向过程静态类型的语言如Java 和 Haskell,动态类型如JS,python等等。参数类型分为显示类型和隐式类型,相关的逻辑操作包括强制类型装换,类型推理和类型安全。

我可以专注于数据计算

无边落木萧萧下 不尽长江滚滚来

如果我专注于数据计算的话,会有一些特殊的约束。首先是隔离,核心函数不要有任何副作用,所有IO行为都最好和纯粹的函数明确区分开来,所有包含IO的函数最好从主程序中调用。这样做的主要目的是避免或最小化IO操作,尽量隔离IO操作,因为IO操作在大型系统中是个大问题。

典型的数据密集型应用是,数据独立于程序执行,能够被多个程序使用,存储易于快速检索,通过对数据查询来解决问题。对某些数据的规范处理可能包含数据列及公式,某些数据可能由其他数据通过公式决定。当数据改变时,相关联数据将自动改变,例如中的视图,触发器和存储过程等。

如果数据的可用形式是流,我就是数据流的过滤器/变换器,根据下游的需求,对上游的数据进行处理。流式处理适用于支持的语言,对于Java 这些不支持的语言,可以通过迭代器实现。

我也可以适应并发处理场景

水深草茂群蛙怒 日出风和宿麦秋

面向高并发的场景,每个对象都存在一个队列,用于放置向其他对象发送的消息。每个对象都是一个数据封装,仅公开其接收消息的接口,用于前述队列,每个对象运行于独立的线程中。每个对象主动轮询各自的消息队列,一次处理一条消息,当队列为空时,阻塞当前线程。这大概就是Actor模型了。

当一个或多个并发单元,同时配备了一个或多个数据空间,数据空间用于并发单元的数据存储和检索,并发单元之间只能通过数据空间进行数据交换。 尤其是当任务需要横向开展的时时候,这种基于数据空间交换的方式,也是适合于数据密集型并行处理的。

对于流式数据而言,输入的数据流被分成若干块,map函数对每个数据块运用worker,通常过程是并行的。而 reduce 函数得到各个worker函数的结果,并重组成相关输出。 这种基于MapReduce的函数处理方式,极其适用于可以单独拆分和处理数据的数据密集型操作,其局部结果在最后被重组。如果将worker 函数的结果重组,第二次map以重组后的数据作为reduce函数的参数的话,就是双重MapReduce方式了。

一般的,map可以并行,而reduce不行,hadoop将map的结果列表重组并打乱,使后续reduce函数的调用可以对数据重组进行修改,从而reduce也成了可以并行化的。

至于restful,不过是将我们函数的思想用于子系统,更关注扩展性,去中心化和独立组件开发而已。

结尾的告白

谁人在处望风烟 芸芸众生吾自潜

函数是程序中最小的有序时空,运转于内存堆栈。

关于参数,没有输入参数和返回值就是纯过程函数, 而同时有参数和返回值才可能实现幂等性。多参数的我可以柯里化为单参数高阶函数,而参数中是函数的话可以形成处理管道,或者回调函数。我自己调用自己,就是递归函数。

关于对象,我长在对象上变成了方法,进一步可以提升为抽象对象。对象间的远程调用一般用消息机制,对象间的行为操控可以说是控制反转,而通过对本身的自省可以形成反射,AOP 可以看作有条件的反射。对于插件,几乎是函数组装之集大成者。

关于错误,一般采用防御式编程,也可以采用消极的方式,无论是否采用全局捕获,调用栈都是异常信息的重要部分。

关于特定场景,不论是密集数据计算还是高并发情况,都最终落实到函数的层面。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-80890-5.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 王馨怡
      王馨怡

      别用这样的新闻来误导读者

    • 蔡盛杰
      蔡盛杰

      听着看着感动的哭了

    • 马暠璐
      马暠璐

      不存在蛆虫生存条件

    热点图片
    拼命载入中...