我眼中的程序

背景

随着程序越写越多,接触的语言逐渐广泛,开始思考程序到底是什么,怎样编写程序。以下是个人的一些理解,并非权威定义,欢迎探讨与批判。

通常介绍

尼古拉斯·沃斯算法+数据结构=程序

我的理解

算法:对于0个或多个输入数据进行一系列有限步骤之后得出1个或以上的输出结果。本质上是一个行为说明书
数据结构:对数据以及数据之间的关联关系的描述。本质上就是数据
程序:通过上面的理解,可以认为程序=数据+行为

  • 这样说或许比较抽象,可以参考一个例子:
  • 我从商场买了回来一个吊扇,现在我要把她装到我的床上:
  • 那么:
  • 数据:里面的螺丝、扇翼等基本配件可以认为是数据。
  • 行为:介绍如可安装电风扇的说明说就是行为。

程序在编程语言上的体现

编程语言大致可以分为三种:


  • 面向过程:
  1. 对于一个问题,详细描述解决问题的过程。
  2. 典型代表,C语言
  • 面向对象:
  1. 重在数据,通过封装将数据抽象化,将方法应用于特定抽象化数据。
  2. 工业界主流,C++、Java、Python等
  • 函数式编程:
  1. 重在行为,将行为定义成函数,函数可作为参数传递以及作为返回值返回。
  2. schema、erlang、scala等。

可以看到实际上面向对象实际上将重点放在数据的组织上,让程序看起来就像是现实世界上不同个体与整体的映射。
而函数式编程这是重在行为,意看起来是将现实中的种种方法步骤以函数作为载体映射到程序里。
至于面向过程,我使用较少,不做评论。


那么有没有数据和行为都重点关注的语言呢?
有的,如

  • python:面向对象语言,把一切看做对象,函数也是对象。
  • scala:函数式编程语言,运行于Java虚拟机。虽然推崇函数式编程,但也提供了对象的封装。

编程语言的两个极端

  • Lisp:计算的需求,也就是行为的体现。
  • C:抽象的需求,也就是数据的体现。