编程语言范式,动态静态,强弱类型的概念

编程语言范式,动态静态,强弱类型的概念

​ 在学习一门语言的时候,经常会碰到几个概念,比如Java是面向对象的语言,C是面向过程的语言,Lisp是函数式编程语言,Scala是静态语言,这些都是什么意思?惰性计算,高阶,Currying都是什么意思?本文将一一给以解答。

一、编程范式

​ 编程范型、编程范式或程序设计法(英语:Programming paradigm),(范即模范、典范之意,范式即模式、方法),是一类典型的编程风格,是指从事软件工程的一类典型的风格(可以对照方法学)。如:函数式编程程序编程面向对象编程指令式编程等等为不同的编程范型。

主要是范式有以下几类

  • 结构化编程
  • 非结构化编程
  • 命令式编程
  • 宣告式编程
  • 消息传递编程
  • 函数式编程
  • Value-level programming
  • Function-level programming
  • 流程驱动编程
  • 事件驱动编程
  • 纯量编程
  • 阵列编程
  • 面向对象编程
  • 基于原型编程(在面向对象编程的上下文中)
  • 基于组件编程(如OLE)
  • 面向方面编程(如AspectJ)
  • 符号式编程(如Mathematica)
  • 面向表格编程(如Microsoft FoxPro)
  • 管道编程(如Unix命令中的管道)
  • Post-object programming
  • 面向主题编程
  • 自省编程或称反射编程

这些范式就好比武林中的各个门派,各个门派之间的武功心法是不一样的。

编程范型提供了(同时决定了)程序员程序执行的看法。例如,在面向对象编程中,程序员认为程序是一系列相互作用的对象,而在函数式编程中一个程序会被看作是一个无状态的函数计算的序列。

正如软件工程中不同的群体会提倡不同的“方法学”一样,不同的编程语言也会提倡不同的“编程范型”。一些语言是专门为某个特定的范型设计的(如SmalltalkJava支持面向对象编程,而HaskellScheme则支持函数式编程),同时还有另一些语言支持多种范型(如Ruby、[Common Lisp](https://baike.baidu.com/item/Common Lisp)、PythonOz)。

这里我们主要介绍下两种常用的范式“面向对象”和“函数式编程”

面向对象编程 OOP

​ 并不是使用类才是面向对象编程。如果你专注于状态改变和密封抽象,你就是在用面向对象编程。类只是帮助简化面向对象编程的工具,并不是面向对象编程的要求或指示器。封装是一个过程,它分隔构成抽象的结构和行为的元素。封装的作用是分离抽象的概念接口及其实现。类只是帮助简化面向对象编程的工具,并不是面向对象编程的要求或指示器。

​ 随着系统越来越复杂,系统就会变得越来越容易崩溃,分而治之,解决复杂性的技巧。面对对象思想的产生是为了让你能更方便的理解代码。有了那些封装,多态,继承,能让你专注于部分功能,而不需要了解全局。

​ 代表语言:Java

函数式编程 Functional

​ 当谈论函数式编程,会提到非常多的“函数式”特性。提到不可变数据,第一类对象以及尾调用优化,这些是帮助函数式编程的语言特征。提到mapping(映射),reducing(归纳),piplining(管道),recursing(递归),currying(科里化),以及高阶函数的使用,这些是用来写函数式代码的编程技术。提到并行,惰性计算以及确定性,这些是有利于函数式编程的属性。

​ 最主要的原则是避免副作用,它不会依赖也不会改变当前函数以外的数据。

​ 声明式的函数,让开发者只需要表达 “想要做什么”,而不需要表达 “怎么去做”,这样就极大地简化了开发者的工作。至于具体 “怎么去做”,让专门的任务协调框架去实现,这个框架可以灵活地分配工作给不同的核、不同的计算机,而开发者不必关心框架背后发生了什么。

​ 代表语言:Lisp python

面向过程式编程Procedural

​ 过程式编程和面向对象编程的区别并不在于是否使用函数或者类,也就是说用到类或对象的可能是过程式编程,只用函数而没有类的也可能是面向对象编程。那么他们的区别又在哪儿呢?

​ 面向过程其实是最为实际的一种思考方式,可以说面向过程是一种基础的方法,它考虑的是实际地实现。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。当程序规模不是很大时,面向过程的方法还会体现出一种优势。因为程序的流程很清楚,按着模块与函数的方法可以很好的组织。

命令式编程、面向对象编程、函数式编程,虽然受人追捧的时间点各不相同,但是本质上并没有优劣之分。 面向对象和函数式、过程式编程也不是完成独立和有严格的界限,在抽象出各个独立的对象后,每个对象的具体行为实现还是有函数式和过程式完成。
现代的程序员应该很少有门派之见了,应该集百家之所长,学习其它范式(语言)的优秀设计理念,集成到自己的代码(产品、语言)中,提升工作效率。

二、语言的动态和静态

静态类型语言:

变量定义时有类型声明的语言,这样编译器就可以确定运行时需要的内存总量,例如:C、Scala、Java、F#语言是静态类型语言。

(1)变量的类型在编译的时候确定

(2)变量的类型在运行时不能修改

动态类型语言:

变量定义时无类型声明的语言,例如:python、Javascript、Ruby语言是动态类型语言。

(1)变量的类型在运行的时候确定

(2)变量的类型在运行可以修改

三、语言的强弱类型

强类型定义语言

强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

弱类型定义语言

数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。

结合动态静态以及强弱存在如下关系:

希望我的整理能帮助到您。

posted @ 2020-11-20 18:15  风清扬,心飘扬  阅读(240)  评论(0编辑  收藏  举报