00:00
接下来我们要学习的这章内容呢,非常重要,可以说是skyla这本语言跟Java最大的区别啊,我们都知道前面也提到了,Skyla是基于Java发展起来的,那Java是一门面对对象的语言,所以skyla呢也拥有面对对象的特点,而且我们说它比Java做的更进一步啊,在类型系统上,在其他的一些细节上,它是更加纯粹的一门面对对象的语言,而与此同时呢,它还借鉴了函数式编程语言的一些特点,所以它还同时拥有函数式编程的风格。这一部分可以说跟Java是截然不同的啊,那大家之前可能对于Java比较熟悉,对于面对对象的特点是比较熟悉的,而函数式编程这一部分呢,接触比较少,所以我们在这章内容学习的过程当中,可能会有一些陌生,可能会有一些难度,所以这节课首先我们先来介绍一下函数式编程到底是怎么一回事。它跟大家熟悉的面对对象编程有哪些区别?它的主要思想是什么样?那首先呢,我们还是先来回顾一下面对对象编程,呃,那面向对象oop一般情况我们提到它的时候呢,是跟面象过程来做一个对比的,呃,大家回忆一下面对对象和面对象过程它们之间有哪些区别和联系呢?
01:22
那简单来讲的话,面向过程它其实就是按照步骤来解决问题的,一步一步按部就班,而面向过程呢,它不是按照步骤,它整体来讲是按照功能来划分问题的。具体来说,那就是我们首先要分解成不同的对象,然后呢,定义对象里边的行为和属性,最后我们解决问题的时候,是通过对象的行为调用来解决问题的,这就是面对对象的一个特点。啊,那呃,对于这个面向对象和面向过程,其实有一个非常经典的例子啊,可以说得很清楚,那就是做饭的例子,那面向面向对象写出来的程序其实就应该是一个一份盖浇饭,类似于一份盖浇饭,而面向过程呢,与之对应的那就是一份炒饭啊,比方说蛋炒饭,肉炒饭这样的一份一份炒饭,那具体的制作细节我们不去考虑啊,我们知道盖浇饭最大的特点是什么呢?其实就是。
02:23
饭菜分离啊,就是我们可以把饭单独准备好,然后呢,把菜单独准备好,最后一浇就是一份完整的盖浇饭了,而对于炒饭而言呢,它是要把饭和菜完整的混合在一起,就最后一步工序一定是均匀的混合在一起,炒匀啊,最后就可以得到一份炒饭,那他们的这样的一个制作过程和最后的特点到底哪一种更好呢?那要看具体分析的。具体的场景了,哎,我们能够想到啊,对于盖浇饭而言,它的最大的特点是什么?那其实是灵活性非常的高啊,如果我们对于这个饭不满意,那我们就换一份饭,如果是菜不满意,那我们就换换一份菜,对吧?啊,同样的一份饭浇上。
03:10
鱼香肉丝那就是鱼香肉丝盖饭,浇上宫爆鸡丁那就是宫爆鸡丁盖饭,诶,所以它如果要对应到我们的编程领域,在软件工程领域的话,那就是整个程序的可维护性比较好,整个饭和菜它是分离开的,藕合度比较低,如果说我们是呃做了一份炒饭的话,它是完全融合在一起的,那如果说我们想要替换其中的菜的话啊,那没有任何其他好方法啊,只有全部倒掉啊,就对应到我们的程序里面的话,你想解耦某一块代码出来做复用的话,可能很难。需求稍微有所变化,你就只能把整个代码全部全部重新写了啊,这就是他们对应的这个,呃,我们所说的面对对象的最主要的优势,那当然了,面对过程也不是说就没有好处,那面向过程对应的这个炒饭,它的特点最好的特点是什么呢?当然就是入味啊,炒的匀啊,叭盖饭吃起来更香,所以对应在我们的程序上的话,面向过程的程序其实执行起来会效率更高,因为它避免了我们整个架构上啊,面向对象的这些啊,对象啊,类啊,行为啊,这样的一些结构上的一些处理啊,所以整体来讲执行效率会更高,这是面向对象和面向过程的主要区别和类似的地方。
04:33
呃,那所以大家会发现我们软件工程发展的过程当中啊,呃,软件工程追求的目标之一其实就是可维护性嘛,所以说我们渐渐的就会发现,面向过程逐渐取代了,呃,面向对象逐渐取代了面向过程成为了我们现在软件工程的一个标准,那所谓的函数式编程又是一个什么样的概念呢?而简单来讲的话,函数式编程其实跟所谓的面对对象、面向过程其实都不太一样,那整体来讲的话,面向对象和面向过程其实都属于同一类,它们属于命令式编程。
05:14
啊,所以函数式编程跟命令式编程是整体完全不同的思路,那命令式编程指的是什么呢?指的就是我们最终不管你是拆解对象也好,还是直接按照步骤,按照过程,直接把程序定义也好也好,我们最终落脚点都是计算机具体执行。程序的具体的命令,具体解决问题的啊,每一道命令的步骤,而函数式编程呢,他并不关心计算机底层怎么样去处理这件事情,他最关心的是我们整个数据的映射关系是什么样的,那所以它为什么叫做函数式编程呢?因为它关心的是映射关系,这这里的函数指的其实就是数学意义上的函数,就是有自变量,有因变量,它们构成这样的一个映射,Y等于负X。
06:09
哎,这就是所谓的这个函数式编程的一个基本思想,那呃跟命令式编程它又有什么样的区别呢?诶,之前的这个命令是编程,大家就会发现了啊,所有的不管是面对对象还是面向过程,所有的这些语言,它在做编程设计的时候,我们用到的那些语法其实都是什么呢?它的基础其实都是面向计算机硬件的一些抽象,这是什么意思呢?就比如说我们在Java或者C代码里边定义一个变量,那这个变量是什么概念呢?变量其实大家注意呃,比方说我们随便Java里边int a等于一,那其实并不是我们数学上的A等于一,因为大家想数学上如果A等于一的话,那A的值就是一,接下来A和一是完全等价的一个关系,而在这个我们一般计算机编程的过程当中呢,A等于之后还可以A再等于二。
07:13
哎,大家想这还可以再继续改变它的值对吧?这在数学上是完全不可思议的,怎么可能A等于一,A之后又等于二呢?哎,所以我们这里的这个A其实并不是数学意义上的一个量,一个值,它是一个变量,这个变量其实对应的是计算机底层的一个内存空间,所以所谓的A等于一是一个赋值语句,这个赋值语句又代表什么呢?代表的是计算机底层把一个数据写入到内存对应的内存空间里边的这样的一条指令。啊,那所以后面这个就比较好理解了,我声明了这样的一个内存空间,赋了一个初值,后面再给他做另外的一个赋值,其实就是更改我这个内存空间里边的数据嘛,哎,所以大家看面对,呃,命令是编程啊,不管是面向对象还是面向过程,这些语言,我们在处理的过程当中,每一行语句,每一行代码,其实都能翻译成计算机底层执行的命令。
08:20
那或者像一些控制语句,像我们提到的这个for循环,对吧,If else,它都可以直接转换成一个计算机底层的跳转指令啊,所以这些都是一一对应的,而这些这些东西大家会发现啊,它其实对于计算机来讲,这就是最容易理解,最友好的语言。但是从另外一个角度讲呢,这样的语言其实对于对于人来讲并不是特别好理解啊,因为假如说我们是一个编程小白,之前并没有计算机相关的一些知识的话,那可能你看到这样的表达式就会非常的困惑,我们学过数学,哎,但是这里边的这个等号和数学上的概念完全不一样,这里边的这个A也并不是数学上的未知数,它这个变量的概念跟数学上也完全不一样。
09:09
所以说呃,我们看到这样一份代码,可能要非常清楚这个编程语言或者是计算机底层的逻辑,才能够把它理解透彻,诶,所以相对应的函数式编程是一个什么样的想法呢?那就是我们把它就当成一个数学题的求解,所以在真正的函数式编程语言里边,我们之前也提到了啊,它是没有变量的,就所有的值来了之后都是常量。都是一个值。A是一,它就是一,接下来不会再改了啊,那所以大家看到就是在skyla里边,我们也是推荐大家能用常量,能用Val的地方就都用Val啊,这也是符合函数式编程的一个基本想法的。把这个定义好之后呢,那接下来我们求解问题计算的过程,最后就是什么样的一个过程呢?哎,就是不停的表达式求值的一个过程,哎,可能一开始有一个A,然后接下来呢,可能有一个方程,我要求里边的某一个未知数,那未知数就相当于一个表达式嘛,我就是不停的在求表达式的值。
10:16
而而且大家就会发现了,在函数式编程里边,每一段程序它都有一个返回值,前面我们看if else,条件控制,条件分支控制,或者是这个for循环啊,它其实都有一个返回值,所以含真正的函数式编程语言里边,本质就是一个映射关系表达式,不停的求值,然后呢,做函数的映射关系,不停的Y等于FX,一个一个把它做转换,这就是函数式编程的本质。所以整体来看的话,函数式编程的,呃,对于大家没有编程基础的,掌握了数学的人来讲,其实是更好理解的一种编程方式,他并不关心计算机底层的实现,他对人更加的友好。当然与之对应的话,可能对于计算机来讲就不是那么好理解了啊,所以它的这个编译器可能要非常的复杂,可能要做很多额外的操作才能够的把它翻译成计算机可以理解的内容。
11:17
好,那所以对于这样的一些特性,我们自然就会想到了。所带来的这两种编程范式,我们把这种叫做不同的编程范式啊,他们的优缺点是什么呢?诶,那命令是编程,它对于计算机更好理解,所以它执行起来效率更高,而函数式编程呢,对于人更好理解,它的执行效率可能比较低。但是。程序员上手的难度比较低,他直接就可以上来之后看看着代码就可以,可以照着就写出自己的代码了,而且呢啊,就是我们在编程的过程当中,可以专注于业务逻辑,就不需要考虑太多计算机底层的处理过处理规则啊,这就是他们俩最大的一个区别,那函数式编程为什么在这个scla里面,它一定要借鉴这样的一些。
12:09
编程范式借鉴这样的一个思路呢,一方面就是希望还盖LA在设计的时候希望他能是一个。更好用的语言,能够对于程序员来讲啊,编程效率更高的语言,这是其一。那另外一方面呢,其实函数式编程有非常好的特性,它的特性是什么呢?就是因为我们这里边定义出一个函数来之后,其实它的功能就是确定的,函数式编程是拥有不可变性的。这什么意思呢?比如说我们这里边定义一个Y等于X的平方。那这里边其实定义了这样一个函数,我们这个X其实是可以变化的,这就对应着我们一个函数的输入参数嘛,对于这个函数而言,你可以任意的输入参数,但是只要你输入的是同一个参数,比方说你输入的是十。
13:01
那得到结果永远都是100,哎,所以对于这个函数而言,它是不可变的,得到的结果都是确定性的,哎,所以这个在我们函数做处理的过程当中就可以,哎,就可以直接把它做一个分布式的并行处理了。大家自然就想到了,在大数据应用场景下,我们一台机器如果处理不过来,数据量很大,那是不是就要做一个集群,把它进行分布式处理啊?那如果在处理的过程当中,它拥有不可变性,哎,而且我们这里边没有变量,所有的这个值呢,不会受外界的影响,那是不是就相当于我可以分布在不同的机器上直接运行,最后得到结果再汇总就可以了,彼此之间没有额外的影响,哎,这就是我们所说的函数式编程,是没有副作用的。它特别的适合用在大数据处理的这种分布式处理环境里边,提高并行处理能力的时候,使用函数式编程就非常的好用啊,那所以大家就会发现了,呃,Skyla它就借鉴了这样的一个函数式编程的特点,它也是可以说一门函数式编程语言,那所以呢,在大数据处理的过程当中,我们经常呃提到的这个大数据核心的处理框架Spark,它的底层就用skyla做了一个编写,那另外呢,还有一些工具,比方说用于构建这个高并发分布式应用的那个工具包阿卡,它的底层也是skyla写的啊,那当然了,还有一些大家耳熟能详的工具,比如说消息队列卡夫卡啊,它底层也是skyla啊,所以大家会发现就是这样的一种函数式编程的特性,再结合了Java的一些特点啊,面对对象的特点啊,GVM,基于GVM可移植性强的这些特点。最终就导。
14:52
至scla特别容易应用在。大数据的应用环境里边啊,这就是函数式编程这样一个思想的应用,以及scla特点的一个说明,Scla是一门面对对象的语言,同时也是一门函数式编程语言。
我来说两句