- 命令式/过程式(Imperative/Procedural)
代表语言
Fortran/Pascal/C
核心概念
命令/过程(Command/Procedure)
运行机制
命令执行
关键突破
突破单一主程序和非结构化程序的限制
实现原理
引入逻辑控制和子程序
主要目的
模拟机器思维,实现自顶向下的模块设计
常见应用
交互式、事件驱动型系统、数值计算等
主要缺点
过程式编程的数据和代码脱节,不方便维护
- 函数式/应用式(Functional/Applicative)
代表语言
Scheme /Haskell
核心概念
函数(Function)
运行机制
表达式计算
关键突破
突破机器思维的限制
实现原理
引入高阶函数,将函数作为数据处理
主要目的
模拟数学思维,简化代码、减少副作用
常见应用
微积分计算、数学逻辑、博弈等
主要缺点
函数式和逻辑式编程的代码开发效率一般比过程式要高,但允许效率和表现力有所不及
- 逻辑式(Logic)
代表语言
Prolog/Mercury
核心概念
断言(Predicate)
运行机制
逻辑推理
关键突破
突破逻辑和控制粘合的限制
实现原理
利用推理引擎在已知事实和规则基础上做逻辑推理
主要目的
专注逻辑分析,减少控制代码
常见应用
机器证明、专家系统、自然语言处理、语义网(semantic web)、决策分析、业务规则管理等
主要缺点
同函数式编程
- 对象式(Object-Oriented)
代表语言
Smalltalk/Java
核心概念
对象(Object)
运行机制
对象间信息交互
关键突破
突破数据与代码分离的机制
实现原理
引入封装、继承和多态机制
主要目的
迎合人类的认知模式,提高软件的易用性和重用性
常见应用
大型复杂交互式系统等
主要缺点
在数学计算、符号处理等对象特征不明显的领域,在心理上缺乏认知基础,在运行效率上不如过程式,开发效率上不如函数式
- 并发式/并行式(Concurrent/Parallel)
代表语言
Elang/Oz
核心概念
进程/线程(Process/Thread)
运行机制
进程/线程间通信和同步
关键突破
突破串行的限制
实现原理
引入并行的线程模块及模块间的通信和同步机制
主要目的
充分利用资源、提升运行效率、提高软件响应能力
常见应用
图形用户界面、IO处理、多任务系统如操作系统、网络服务器等,实时系统、嵌入式系统,计算密集型系统如科学计算、人工智能等
主要缺点
增加了代码的复杂度,加重了程序员的负担
- 泛型式(Generic)
代表语言
Ada/Eiffel/C++
核心概念
算法(Algorithm)
运行机制
算法实例化(多发生于编译期)
关键突破
突破静态类型语言的限制
实现原理
利用模板推迟类型指定
主要目的
提高算法的普适性
常见应用
普适性算法如排序、搜索,集合类容器等
主要缺点
影响代码的可读性,过度使用模块还可能造成代码膨胀(Code bloat)
- 元编程(Metaprogramming)
代表语言
Lisp/Ruby/JavaScript
核心概念
元程序(Metaprogram)
运行机制
动态生成代码或自动修改执行指令
关键突破
突破语言的常规语法限制
实现原理
利用代码生成或语言内建的反射、动态等机制,将程序语言当做数据来处理
主要目的
减少手工编码,提升语言级别
常见应用
自动代码生成、定义结构化配置文件、IDE、编译器、解释器,人工智能、模型驱动架构(MDA)、领域特定语言(DSL)等
主要缺点
元编程过于强大,使用不当,易造成脱离程序员的控制,应谨慎使用
- 切面式(Aspect-Oriented)
代表语言
AspectJ/AspectC++
核心概念
切面(Aspect)
运行机制
在接入点处执行建议
关键突破
突破横切关注点无法模块化的限制
实现原理
通过编织将附加行为嵌入主体程序
主要目的
实现横切关注点分离
常见应用
日志输出、代码跟踪、性能监控、异常处理、安全检查、事务管理等
主要缺点
减少了程序的可测试性和可控制性,同时增加了代码的调试难度,还可能造成性能上的损失
- 事件驱动(Event-Driven)
代表语言
C#/VB.NET
核心概念
事件
运行机制
监听收到事件通知后做出响应
关键突破
突破顺序、同步的流程限制
实现原理
引入控制反转和异步机制
主要目的
调用者和被调用者在代码和时间上双重解耦
常见应用
用户图形界面、网络应用、服务器、操作系统、IoC框架、异步输入、DOM等
主要缺点
虽然也能用于同步的流程应用,但机制更复杂,没有普通的流程式代码自然易懂