已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
--数据,算法,过程,对象与程序设计

    1958年,人类社会的计算机界发生了一件大事,Algol语言诞生了。

    Algol原名IAL(International Algebraic Language),后被更名为Algol(ALGOrithmic Language)以表示其真正的用途。

    Algol语言是由ACM小组和联邦德国应用数学与力学协会共同开发的,旨在定义一套严谨而精确的符号系统,使之能够满足在计算机上的算法描述与实践,1960年改进的Algol60代码看起来是这个样子:
    procedure Absmax(a) Size[s:2]n, m) Result[s:2]y) Subscripts[s:2]i, k);
            value n, m; array a; integer n, m, i, k; real y;
    begin integer p, q;
           y := 0; i := k := 1;
            for p:=1 step 1 until n do
            for q:=1 step 1 until m do
                if abs(a[p, q]) > y then
                        begin y := abs(a[p, q]);
                        i := p; k := q
                        end
    end Absmax

    有编程基础的认可能会发现,这种语言与另一种古老的语言——Pascal有着一定的相似性。确实,尽管Algol的诞生在人类社会中是极其低调的一步,但她的影子确实存在于之后诞生的众多计算机语言中,并且在很长一段时间里在各类程序语言的设计上起着指导作用。

    之所以认为Algol是革命性的,是因为她第一次将程序员与计算机系统工程师分离,使得人们不必那么了解数据在内存中的组织方式就能够操作数据,不必了解每种型号的CPU指令集就可以描述算法。Algol第一次将人类的思想从计算机实现原理的牵绊解放出来。

    这一过程被描述为一个具像到抽象的过程,数据在计算机中的表述方式是具像的,面对这种具像时(比如用机器码或汇编编程),你可以直接看到一组二进制是怎样模拟特定数据的行为,同时你操作这些数据必须通过直接操作这种二进制码(或操作存储器)来实现。当这些表示被抽象成单纯的数据时,那么你便不需要花费过多精力注意数据如何实现了。当你面对的是数据本身而非数据的实现的时候,你就可以以人类解决数学题的方式,将所有的精力放在问题构建和解决方案上。

    同时,Algol也是第一个真正跨机器的语言,在Algol之前的时代,由于不同计算机有着不同的架构(不同的存储器结构,不同的CPU寄存器组织,不同的指令集),在一个机器上编写的程序往往不能在其他机器上运行。而Algol通过将数据在存储器中的表现方式以及表达式所对应的具体指令变得不透明而很好地解决了这一问题。程序员只需要专注于数据与算法本身,而数据、算法的转换过程可以通过不同计算机上的专有程序(编译器)实现。

    自此,程序设计的中心从存储器与指令转变为数据与算法,而Algol将数据在算法中的变化通过“描述过程”的方式实现 —— 将程序的行号作为时间轴,以命令的方式描述数据在计算机时空中的每个时间点如何变化,这种编程方式所派生出的各类编程语言,多称为面向过程的程序设计语言。

    面向过程的程序设计语言的主体是过程,我们可以粗略的将过程定义为数据(状态)在计算机时间尺度上的一种动态转变。比如一个整数由1变成2,或者一个断言从真变成假。在面向过程的程序设计中,几乎所有的语句(表达式)都是对某个过程的一种描述,通过描述过程操作数据,并获取最终结果。而少数并非描述过程的表达式(比如判断一个数是否为1),也是以描述过程作为目的的(比如作为先决条件决定接下来激活哪一个过程)

    也正因为如此,面向过程的编程语言含有一些并不符合常人思想的部分(比如数据必须被声明之后才能存在,比如 “a = 1” 并不是一个状态,而是一个另a与1相等的过程,同时取值也是过程而非状态),这也是编程语言比自然语言难学的原因之一了。

    60年代末诞生的Simula67被视做第一种面向对象的语言(与很多人认为的不同,smalltalk并不是第一种面向对象的语言,后文会提到)。面向对象的思想非常容易理解——计算机的诞生时为了处理现实世界的问题,而现实世界中没有哪个具体事物“是”一个数据。

    面向对象的思想最早在1960年在MIT被提出,其将现实世界的事物归结为由数据表述的对象,使得程序更加易于编写、更加易于理解。

    就如同二进制比特位能够在存储器中描述数据一样,我们可以将数据视做描述现实世界事物的一种工具 —— 比如通过半径、高度、底面厚度、壁厚来表述一个杯子,世界上人类所能触手可及的物体似乎都能被一组数据所描述。
    对象可以被赋予一组行为(方法),比如小明作为一个对象,可以打碎一个叫做杯子的对象,在多数面向对象的语言中,这被表示为 小明.打碎(杯子),同时对象可以被分类(小明和小张都属于男生分类,小明小张和小明他爸都属于男人,小明小张和他们的父母都属于人类),而一个分类的所有个体都可以拥有相同的行为和数据组织方式(比如所有人类都有身高体重三围,都可以吃喝拉撒打家睡觉XXOO)。这样的方式似乎可以描述整个世界了。
    
    “这样的方式似乎可以描述整个世界了”,这一思想后来直接催生了一种叫做SmallTalk的语言,在SmallTalk中,所有的表达式操作的都是对象,包括组成对象的数据,比如整数是一个对象所属的类,那么加法只是整数的一个行为(方法),而1,2,3,4又是整数类中的一个个体(实例)。

    后来诞生的很多面向对象的语言都借鉴了SmallTalk的思想,包括Java、Ruby等,表达式所操作的东西不再是单个数据,表达式所描述的也不再是数据本身如何变化。而变成了“谁做了什么”的模式,这种面向对象的思想被发扬光大之后,程序代码似乎一瞬间变得更加符合这个世界运行方式的描述了,变得更加容易编写,更加容易理解,更加具备表达力。一个过程不需要在解决类似问题的时候被反复书写——只要把这些问题所涉及的对象收容进同一个类(或者接口——如果他们之间不是那么相似的话)就可以了。软件工程也在这个时候开始突飞猛进,UML在面向对象的思想下被催生,更重要的是,面向对象的程序设计思想完成了又一次抽象,软件在架构的时候可以将对象与对象在数据层的实现分开设计了,可以向建筑一般从基础开始一步步向搭建了(从具像的基层开始,向抽象的表述搭建),而顶层的程序设计人员只需要明白对称需有些许了解,就能通过操作别人写好的对象来完成最后的封顶工作。流水线模式第一次真正进驻软件的搭建过程,面向对象的程序设计思想彻底改变了软件工程的实践方式。
  
    这种变革使得面向对象思想在很多人的心目中忽然成为了一个近乎神圣的东西,变成了一种信仰。一些程序员开始强迫自己将面向对象用于任何领域任何场合,更有大量的面向对象书籍开始宣扬“一切皆对象”理论,大有当年“万物皆数”的风范。面向过程的程序设计方式突然被一些激进分子视为了需要被弃掷的糟粕。有些语言甚至如此排斥数据,将对象中的所有数据都封装成了控制数据的方法。

    然而面向过程真的被推翻了吗? 我们回到面向过程的程序设计方式来,看看当初我们是怎么对“过程”进行粗略的定义的。“数据(状态)在计算机时间尺度上的一种动态转变。” 而面向过程的编程语言所有表达式所描述的都是操作数据的过程。那么面向对象的程序设计语言呢?我们不过是将对象作为主语,使得表达式所描述的主体从数据的变换过程变成了一个(或一组)对象对另一个(或一组)对象的操作过程,而这种操作过程依旧是一种状态变换,将一个对象的状态(比如属性值)改变,或者将对象的行为从未触发变为以出发。所有这些依旧是过程,编程语言依旧是面向这些东西在时间尺度上如何一步一步改变的,如果将对象视为整体,那么数据就是对象。

    所以,说到最后,面向过程的语言,面向对象的语言本质上描述的都是过程,只是过程的主体不同罢了。

    那么接下来,“一切皆对象”的宣言也开始动摇起来,如同罗素悖论动摇了“数学的主体是集合”一般,如果程序所描述的永远是过程,那么组成程序的这些表达式,以及这些表达式所描述的过程本身是不是对象呢? 如果是,应该怎样才能实现呢?毕竟,一个有数据、对象、过程三种分离的元素所组成的程序还是太过于复杂了。这样的问题并不是为了成全“一切皆对象”这样美好的信念,也不是为了追求“一切只由一种元素支配”的梦想,而是我们必须寻根求源,才能够明白程序究竟是怎样描述世界的——或者说,世界究竟应该怎样被表述。
文号 / 439180

万流景仰
名片发私信
学术分 21
总主题 345 帖总回复 2157 楼拥有证书:学者 机友 笔友
注册于 2007-07-10 01:49最后登录 2024-02-22 11:04
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步

个人简介

暂未填写
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

插入资源
全部
图片
视频
音频
附件
全部
未使用
已使用
正在上传
空空如也~
上传中..{{f.progress}}%
处理中..
上传失败,点击重试
等待中...
{{f.name}}
空空如也~
(视频){{r.oname}}
{{selectedResourcesId.indexOf(r.rid) + 1}}
处理中..
处理失败
插入表情
我的表情
共享表情
Emoji
上传
注意事项
最大尺寸100px,超过会被压缩。为保证效果,建议上传前自行处理。
建议上传自己DIY的表情,严禁上传侵权内容。
点击重试等待上传{{s.progress}}%处理中...已上传,正在处理中
空空如也~
处理中...
处理失败
加载中...
草稿箱
加载中...
此处只插入正文,如果要使用草稿中的其余内容,请点击继续创作。
{{fromNow(d.toc)}}
{{getDraftInfo(d)}}
标题:{{d.t}}
内容:{{d.c}}
继续创作
删除插入插入
插入公式
评论控制
加载中...
文号:{{pid}}
加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}
ID: {{user.uid}}