什么是编程范式

什么是编程范式

0.1.4对象抽象简介

★面向对象编程范式是以人们熟悉的、习惯的现实世界和思维方式为 隐喻(metaphor) ,以概念/类型或其实例化的对象为思考单元,进行程序组织的 编程范式 。【这句话中包含4个关键词:编程范式、隐喻、概念/类型、组织。】

★面向对象编程范式是基于柏拉图(Plato)原则、Liskov原则和Parnas原则的编程范式。

【本文是对《编程导论(Java)·1.4.1范式》的浓缩和完善】


编程的“思想”,是一个很中国化的词汇。编程的思想,通常称为一门编程语言背后的 编程范式(Programming Paradigm) 。从教学的角度看,当用一门命令范式、函数范式或面向对象范式语言讲授编程时,该语言背后的范式体现为看待编程的观点、语言的逻辑和考虑问题的思路, 编程范式也许是学习任何一门编程语言时要理解的最重要的术语

0.2.1范式

范式,来自于托马斯•库恩的《科学革命的结构》,而斯坦福大学罗伯特•弗洛伊德(Robert W.Floyd)在1978年的图灵奖授奖演说《编程的各种范式》(The Paradigms of Programming ),使得编程范式成为计算机科学中常用的术语。

1. 范式的3个方面

按照库恩的范式论,范式是从一些核心观念出发,衍生出来的对一门学科的解释、认知和应用的体系,而 编程范式则是关于程序设计学科的范式 。《编程导论(Java)》中, 我把范式归纳为3个方面或层次:

观念范式(自然观/世界观) 。每一种范式都有自己的核心观念,一套根据特有的价值观念和标准所形成的、关于某学科的形而上的信念。 基于计算机科学之根 :一般递归函数、λ表达式、图灵机,形成了传统的3大编程范式。

  • 基于图灵机的过程/命令编程范式;
  • 基于λ运算(λ-calculus)的函数编程范式;
  • 基于一阶逻辑(First-order logic,一般递归函数)的逻辑编程范式。

观念范式是一个语言流派(如命令式语言)的共同信仰,是该流派程序员创造解域(软件)世界所需遵循的世界观和方法论。观念范式决定和影响了该范式的心理范式和规则范式。

例如,命令编程范式的核心观念: 以机器的运作方式看待一切 。从机器语言、汇编语言到高级语言如C,命令范式的程序观以CPU对指令的读取-执行循环(fetch-and-execute cycle)为基础、完全遵循计算机硬件按顺序执行指令这一事实, 秉承鲜明的物理学风格的实证主义 。因此,命令编程范式的程序开发,被视为一个命令/指令序列的开发。程序是一个语句的序列,这些指令通过操作数据而改变机器的状态。按照图灵机(Turing machine), “状态变化” 是命令编程范式的关键词汇,以至于SICP指出:"广泛采用赋值的程序设计被称为命令式程序设计"。在[0.2.2命令编程范式]中对此进行展开讨论。

那么,面向对象编程范式的核心观念是什么呢?不同于基于图灵机的命令范式和基于λ运算的函数范式,面向对象编程范式没有直接的计算理论模型来源。它之所以被称为一种范式,仅仅是因为它采用了完全不同的看待程序的视角。

★面向对象编程范式是以人们熟悉的、习惯的现实世界和思维方式为 隐喻 (metaphor),以概念/ 类型 或其实例化的对象为思考单元,进行 程序组织 编程范式

面向对象编程范式的核心观念是:以概念/类型建模一切。

因此,面向对象编程范式的程序开发,被视为 定义各种概念/类型 。程序是相互服务的类型的集合,程序中的类型因为提供服务才具有存在价值。

很多人比较命令编程范式和面向对象编程范式的异同。按照托马斯•库恩的范式论,『当范式改变时,不但从事科学研究的人更换了,评价选择的标准、整个社会心理、研究传统以及世界图式都改变了,新旧范式是不可通约的、不可比较的』;另一方面,Java等诸多面向对象编程语言,事实上是命令式面向对象语言。这说明 面向对象编程范式对于其他范式,并非取代,而是兼容

★面向对象编程范式在形成概念/类型时,不拘泥于采用命令范式还是函数范式。


心理范式(心理认知因素) 。托马斯•库恩指出,科学作为人类的一种社会事业,还必须考虑到认识领域以外的社会问题和心理学问题。

每一种范式的科学共同体对其范式的核心观念和逻辑体系,有着“虔诚的狂热”。争论语言的好坏,常常会导致网络互喷大战,表现出编程的宗派。因为每一种范式的群体,力图把自然界“强迫纳入”该范式所规定的思想框架内,从而展开卓有成效的研究活动;而对立范式之间的争吵经久不衰,因为"范式之间的竞争不是那种可用证明解决的战斗",你无法说服不想被你说服的人。需要注意的是,编程范式间的冲突,通常不是新旧范式的矛盾,而是并行范式的相互鄙视。

心理范式在程序员学习语言以及在编程实践中,起着潜移默化的作用。例如一些人在首先学习了C语言,再学习面向对象编程时会遭受痛苦的“范式迁移”,即使学习C++和Java这种命令式面向对象语言也倍感困扰。

心理范式在面向对象普及中,起到重要作用。把人们熟悉的、习惯的现实世界作为思考和编程的背景知识( 隐喻), 成为面向对象普及的助推剂。

规则范式 (学科的逻辑体系)。从核心观念出发,将会演绎出、或者说为了支持核心观念而形成各种被公认的规范,如定律、理论、应用以及工具等等,组成了一个逻辑体系。

命令范式从“状态”出发,将变量、数据集合(数组、结构体)、函数均视为内存中的实体,可以直接和间接访问它们,于是指针成为其有力的工具。

对象技术以概念/类型建模一切,在[0.3PLP详解]中将对对象技术进行展开讨论。这里先提出一个问题: 面向对象技术最大的优势是什么?庞大的类库

正因为以概念/类型建模一切,所以人们可以按照不同的领域,并行地展开各自的研究,从而形成庞大的类库。例如Java平台(Java Platform)提供的庞大的标准类库,帮助程序员进行图形处理、数学计算、字符串处理、网络应用等方方面面的工作。全世界的Java程序员可以按照其研究领域,设计出各种各样的类型(Java类和接口)。而这些类型——作为标准类库和第三方库,可以作为其他程序员使用的“建筑砖块”。

如果不能够认识到这一点,不知道面向对象技术最大的优势,就不可能真正理解对象技术的逻辑体系 ,而对象技术的逻辑体系的基石是类层次和里氏替换原则(Liskov Substitution Principle、LSP)。

2. 范式的教学问题

托马斯•库恩认为:范式通过专业教育,为从事该领域的人——科学共同体,规定了思考框架,并形成一种科学习惯和科学传统。科学共同体从同一模型(规则范式)中学习专业基础,因此他们不会再在基本原则方面碰到重大分歧。

但是从编程范式的要求看,编程语言的教学令人失望,语法派教学大行其道。如C语言教学中居然完全不涉及接口与实现相分离原则;在讲授/学习对象技术时,普遍缺乏明确的起点和清晰的学习思路,很多人进行过几门面向对象的语言教学或学习,居然不知道LSP,更不必说什么是面向对象编程范式。在他们眼里,谈及 面向对象,马上回应出6个大字封装继承多态 ,这种用三个特性解释面向对象编程范式,如同用递归闭包解释函数编程范式,用穿衣使用工具解释人, 挂一漏万,较为肤浅

编程范式相关议题比较抽象,需要在整个教学体系中细化并突出。尤其需要注意将观念范式和心理范式纳入教学中,而非单单讲授学科的逻辑体系。


1.说明

编程范式,程序员的编程世界观 -- 简明现代魔法

编程范式也许是学习任何一门编程语言时要理解的最重要的术语 ”。这句话早在2005年出版《Java程序设计》(宋中山,严千钧编著,清华大学出版社)中写过。但是,

"托马斯.库恩提出“科学的革命”的范式论之后,Robert Floyd在1979年图灵奖的颁奖演说中使用了编程范式一词。 编程范式一般包括三个方面,以OOP为例:..... ",好像在《编程导论(Java)》出版之前,仅仅在我上课的PPT中写过。除了关于编程范式的文字引用,该楼主其他的文字,并非我想说的。如果他是我的学生,要打他的屁屁。

编程范式包括“三个方面”,其实是我在阅读很多哲学文章后形成的。

2.资料

单词paradigm并不是通过查字典就能够翻译的。 虽然paradigm的原意是example示例、pattern模式 or model.典范、范例、模型。 在有些计算机书籍中,将paradigm称为“范例”——“指一种示范性的模型或例子,它提供了一种组织信息的形式;面向对象的范例强调以行为和责任为基础来组织信息”【Timothy Budd,《面向对象Java编程思想》(修订版),清华大学出版社,2002-8】。

真正使paradigm广为流行的原因是1962年,美国科学史学家和科学哲学家托马斯·库恩(Thomas S. Kuhn)所著的著名书籍The Structure of Scientific Revolutions(《科学革命的结构》),其核心——范式论在自然科学家中引起强烈的共鸣,并波及社会科学的广泛领域。在李宝恒、纪树立翻译的《科学革命的结构》中, paradigm翻译为“规范” ,而在大量的哲学、社会科学文献中,一般称为“范式”。

编辑于 2021-03-22 23:56

文章被以下专栏收录