现代编程语言简单了解

前言

马哲说,事物是不断变化的,随着世界的变化,一个事物也会随之发展变化,编程语言也是一样的。
70年代C语言,80年代(接近)的C++语言,90年代的JAVA,它们诞生都已经几十年了,也都成为了经典的语言,到现在也十分的流行,占据着庞大的市场,或者成为很多领域必须使用的语言。

随着软硬件环境的变化,各种现代的语言也有很多的发展,更加适用于新的软硬件环境,提供更好的编程效果。

软硬件环境的变化包括:

硬件:

更好的硬件性能(内存大小计算速度等)
并行运行的流行(包括多核CPU,现在移动端一般都是6-8核),GPU,TPU,服务器上面的并行,分布式就不说了。
高速互联网

软件:

底层语言的铺垫,语言也是一层层铺垫的
汇编语言运行在机器码上面,C/C++基于汇编运行在机器码上面,Java和Python运行在C/C++做的虚拟机上,JS运行在浏览器上面,浏览器也相当于一个C/C++的虚拟机,更进一步的Kotlin直接基于Java运行在Java虚拟机上面。
Go语言不依赖虚拟机,可以直接编译成机器码,也可以编译成浏览器支持的运行文件。

大数据和云的生态

容器

ide 的进化:
ide 也是不断的进化,自动打包编译,调试支持等就不说了,从代码提示,省掉记忆API,再到AI提示,省掉很大部分Google百度,还有代码分析,代码运行分析,编译脚本支持等等。

依赖于更好的ide,可以支持更高级的语言。比如ide的开发商JetBrains就直接设计一个语言kotlin,让它包含了高级特性,然后集成到Java体系里面。

现代语言的特性:

简洁明了的代码(减少样板代码)
内置的并发支持
空指针安全
类型推断
简洁的功能集
降低学习难度
融合多种编程范式的最佳功能

编程范式

命令式编程与声明式编程

命令式和声明式两者是一个相对的概念,并不是一个绝对的区分。距离机器执行逻辑越远,离人的思维逻辑越近就越是命令式的语言,反之就越是命令式语言。
命令式编程命令式是关于“how to do”,主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。
声明式是关于“what to do”的,它的主要思想是告诉计算机应该做什么,但不指定具体要怎么做。

小记:命令式编程来源于图灵机的结构,有数学意义上的精确定义:一台有状态的机器,根据明确的指令(instruction)一步步的执行。而所谓的声明式,它可以看作是命令式的反面。曾有人言:一切非imperative,皆是declarative。从这个意义上说,越是偏离图灵机的图像越远的,就越是声明式的。

声明式编程特点:

表达与运行分离,并行化
表达时的先后顺序不等于运行顺序,表达了可以不执行,可以表达未来

如果将命令式编程看作是一种“忠实的”表达,表达了就要执行,而且所表达的正是要执行的内容,那么声明式编程就是相当不老实的表达,可以惰性求值,现代编程语言中标配的Promise对象,就可以把它在程序中传来传去,在变量第一次被使用时才进行计算

而在传统的命令式编程概念中,函数的返回就表示执行完毕,如果是异步执行,则只能通过回调函数获取通知,在概念层面上我们并无法直接定义和使用“未来的值”。

整个软件开发生态环境正在不断向着声明式和命令式交融的方向发展。以前,为了突出声明式的部分,我们会选择模板语言,即在描述性内容中嵌入少量的命令式控制逻辑。而在今天,出现了JSX这种直接将描述性内容嵌入到命令式上下文中的技术。更进一步,类似SwiftUI这种基于通用程序语言直接实现声明式表达的技术正快步向我们走来

函数式编程

简介:

函数式编程中函数就是数学中那个函数,可以看成是面向数学的抽象,关心数据的映射,而命令式编程关心解决问题的步骤,是计算机的体系结构抽象。面向对象算是一种命令式编程。 函数式编程和命令式编程有一定的关联,都强调做什么而不是怎么做。

一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。

在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。

变量也不是命令式编程语言中的变量,而是代数中的变量,值是不可变的(immutable),即一个值的名称,也就是说不允许像命令式编程语言中那样多次给一个变量赋值。 由于变量值是不可变的,对于值的操作并不是修改原来的值,而是修改新产生的值,原来的值保持不变。

函数式语言没有条件循环等控制语句,语言中的实现只是函数式语言的语法糖,比如在Scala语言中,if else不是语句而是三元运算符,是有返回值的。

优点:

  • 不可变的好处,可以方便的并行,这来源于函数式编程额不可变性质,函数即不依赖外部的状态也不修改外部的状态,函数调用的结果不依赖调用的时间和位置,这样写的代码容易进行推理,不容易出错。这使得单元测试和调试都更容易。 由于(多个线程之间)不共享状态,不会造成资源争用(Race condition) 问题

  • 代码可以写得更精简,大大减少了键盘的损耗,不用写一个类(Kotlin里面的一些函数化的接口)

  • 面向对象中接口的优点
    注意一点,函数类似于面向对象中的接口,所以它有接口编程的优点,不依赖于具体的实现,实现是可变的
    比如集合类处理还可以在内部并行化实现!

  • 高阶函数 **就是参数为函数或返回值为函数的函数。**有了高阶函数,就可以将复用的粒度降低到函数级别,相对于面向对象语言,复用的粒度更低。可以把这个理解成数学中的复合函数或者中间函数。函数参数就可以看成一个中间函数。
    函数参数和方便的实现依赖注入,还有各种集合类的处理,比如map,reduce,filter,即集合的映射,累积操作,过滤等.

缺点:
纯函数式编程有它的局限性,比如不能for循环
通常还是要和其它编程范式一起使用。

并发性

注意,这里的并发不是说同时执行的那个并行,并发不一定并行。

现代语言不推荐采用共享内存和锁的方式实现并发,因为那样过于复杂。

GO的宣言:
不要通过共享内存来通信,而应通过通信来共享内存。

并发性的核心问题是不确定性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值