
我是——编程世界的函数,不是数学中的幂,指,对和三角函数等等,但是和f(x)又有着千丝万缕的关系。
我是代码中的最小执行组织,但不是最小执行单元。最小的执行单元是一条条语句,这些语句有机地组合起来完成一个或多个功能并且可以复用,这才是我——函数。
内存与堆栈和我之间是啥关系?有无参数的我有何异同?我的简洁性?复杂度如何评估?我的高阶与递归有啥区别?我的回调和匿名是一回事么?对象中的方法是我么?控制对象的行为方式有哪些呢?为什么说类型错误只是异常处理的一种方式?面对数据密集型应用和并发场景,我有何作用?......
且听一个函数的自白,从函数的角度看编程的方式。
我眼中的大环境——内存

空山不见人 但闻人语响
代码最终都要加载到内存中执行,组成函数的代码同样如此。内存容量是受限的,需要考虑一个函数在内存中所需要处理和生成的数据量。内存中没有变量名或签名的内存地址,只有以数字表示的内存地址。考虑“什么将存入内存”,“什么存入硬盘”以及“何时将内存内容存入硬盘”,这些考量都与性能优化息息相关。
而现代编程语言强调透明的内存管理,关注处理中不断增长的数据规模,这很容易失去对内存消耗的控制,从而导致运行时性能的下降。对我所采用的不同内存使用策略,所带来的不同结果给予适当的关注,是件有意义的好事情。
我的运行环境——堆栈

明月松间照 清泉石上流
由于内存中的东西太多了,于是把我运行环境中的内存称为堆栈。对于栈,所有操作都针对栈中的数据,堆用于存储后续操作所需的数据。堆中数据需要入栈进行操作,最终出栈回到堆。栈溢出是内存耗尽的情况。
通常对程序员来说,栈是不可见的,几乎在每个现代的编程语言中,栈都是支持线程执行的内存区域。 堆是许多现代编程语言实现中的另一重要内存区域,用于动态内存的分配和释放,例如创建列表和对象。不要将这里的堆栈与数据结构中的概念混淆,数据结构中的堆是一个基于树的数据结构。
有一种执行环境叫栈机器,使用了栈而不是寄存器来支持程序表达式的计算,许多现代虚拟机都是这样的,例如JVM。
我源自面向过程的抽象——过程函数

大事化小 小事易了
程序员们通常会把复杂问题分解为若干个较小的容易问题,这是一种面向过程的抽象,一个过程是实现某一功能的我,我可能接收输入,但未必产生输出。极端一点的我既没有输入参数,也没有返回值,是纯粹的过程函数。每个过程函数独立做一件事,完成一项任务,过程函数一般不返回数据,只操作共享数据。人们把这种编程方式叫做结构化编程。
幂等性: 若一个函数或过程是幂等的,对其进行多次调用将观察到同样的效果,
与一次调用的效果是相同的。
而且,采用全局变量也一直被认为是一个馊主意,然而在系统层面,架构中的组件共享其实和全局变量类似,这让我有时候感到无语。
我和伙伴们组合起来——复合嵌套

但远山长 云山乱 晓山青
当程序员把复杂问题分解成若干小问题的时候,一般都是把我接收的输入形成输出,这样就可以把所有任务都视为输入集合到输出集合的映射关系了。嗯,f(x)的味道来了。
这时候,函数间无状态共享,类似于数学中的复合函数。特殊的,把函数作为输入或者输出的函数被称为高阶函数。多个参数的函数可以通过柯里化技术转化为一系列的单参数高阶函数。
这种串行话处理的一个知名应用就是Unix Shell 中的管道,编译器及其他语言处理器也很适合这种方式,且倾向于利用图和树等数据结构组合过程。类似的,还有单元测试和开发部署。
构成我的代码简洁性

天街小雨润如酥 草色遥看近却无
程序员通常把简洁作为编程技艺的标志之一,但是当代码简洁成为唯一目标的时候,每行代码又往往会变得冗长且难以理解,这是因为需要利用编程语言的许多高级特性和库来实现。无论好坏,源代码行数(SLOC)还是可以用来估算成本和开发效率的,也可以评估可维护性和其他许多管理指标。例如,CoCoMO就是基于SLOC的成本评估模型,至今还被采用。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-80890-1.html
中国