什么是编程.pdf
《什么是编程.pdf》由会员分享,可在线阅读,更多相关《什么是编程.pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Articles of 兮软兮软什么是编程什么是编程(工程工程,模式模式)2011-09-20 08:09:28 minlearn什么是平台,语言,及对应的编程既然是谈编程,自然有“编程到底难不难”,“学习编程到底应该怎么进行”诸如这样的话题的产生1,这些话题很自然地都会导到一个最基本的话题“什么是编程”,只有对编程有一个公共并格定一致的理解,我们才能进一步讨论那些稍微高级一点的话题而不必经常回到这个个人狭小的境地.什么是被解决了的问题?(被解决了的问题不应是成功个人的私人体会之类的见识而应是大家都承认并能理解的某种共识,比如“桌子是什么”,这样的问题才算是被解决了的问题).编程也可以成为这样
2、的被解决了的问题,然而这需要很多铺垫。但是正如对对任何严肃问题的讨论都不能庞而统之一样,对于什么是编程,我们应从涉及到它的所有子概念开始讨论。TOC1 编程是一种人类工程1.1 PC系统工程1.2 程序与语言工程(映射工程)1.3 数据结构与算法工程1.4 应用建模工程1.5 为什么要用上面的方式解说什么是编程2 运行模型与语言模型,设计模型2.1 运行模式:为计算机引入一个编程层面,做进计算机2.2 语言模式2.3 语言模型用于实现平台模型3 编程语言3.1 平台与语言3.2 三种编程3.3 语言选择编程是一种人类工程编程是一种人类工程首先,什么是编程,从最直观的意义来说,编程是一种活动,当
3、然这句话说了等于没说,然而这也正只是因为它没有继续把话说破,如果着眼于编程活动中出现的各大主体,那么编程实际上可以表述为:由人进行的,利用编程语言写系统逻辑或应用逻辑.针对计算机的,完成从方案域到应用域的一个变换的活动.这样的说法虽然也比较空白,但它至少提到了“计算机,人,应用,语言”,这就开始涉及了一些对编程的理解较为本质的东西.因为任何人类活动,它必定首先是个人类工程。只有从工程的眼光去看,那么,就抓住了总纲。一切活动都是人类的工程,编程作为人类工程,一般子多个人类子工程一步一步而来,这些子工程可以总结如下:PC系统工程;程序与语言语言工程;数据结构与算法工程系统;桌面编程基础建设工程;通
4、用应用编程系统。以上实际上每个工程内部也存在着大量子工程,要实现这些工程,如果按照人的观点,那么从PC系统工程到通用应用编程系统是从难入易,反之如果按照机器的观点,则是由易入难。PC系统工程首先,对于PC系统工程来说,编程要通过计算机解决编程能解决的问题,它就必须(在功能层面)首先解决对于计算机系统本身的实现手段问题(硬件的实现和软件的OS);硬件方面,包括给PC提供一套数学理论模型支持(图灵理论),利用电子技术实现它(冯氏机器)。至于编程,最初的PC内部并没有一个天然集成的编程层面,它主要是作为裸机来运作的,指令来自外部,被输入进PC供执行。这种编程主要是面向硬件的汇编,比如硬件控制,或处理
5、简单数值,文字的低级编程。软件方面,包括将PC本身(CPU和内存组成的存储体系)和越来越多的加入到PC体系中的硬件统一到一个更易于管理,更加强大的层面。并把以前PC仅能管理机器逻辑,简单数值,文字的能力扩展到能处理这些经过强化了的硬件逻辑的程度。这个层面就是软件层面。为什么需要出现一个软件系统呢?这是因为PC本身就是善于处理强大抽象的机器(数值,文字,机器逻辑,只是PC能表达的抽象的初级形态),它作为裸机使用的层面(裸机和汇编完成的简单任务)实际上是它功能的一小部分。于是,将硬件转为软件的第一步就是将硬件抽象为软件上可用的东西,更多的详情(实现一个OS),在对应的章节有详述。对应于裸机和汇编,
6、软件系统实际上是平台加编程方式的全新升级,这样,PC就可以提供更多的功能(除了强化了的硬件逻辑,在这个基础上,还可以发展更多的抽象),接入更强大的编程方式 编程语言并运行这种语言产生的程序的支持。这样,PC就作为了同时整合了编程层面和平台层(软件层面是作为PC功能平台存在的层面,作为PC的一部分存在的)的机器。注:其实裸机下也有软件和软件系统的概念,比如软件包括写有0,1的纸带,代替人力管理机器的重启,暂停等汇编程序也是软件系统,但一般不承认它们是软件和软件系统,最初的软件系统一般指OS,软件一般指OS上运行的程序。但是,编程首先要通过计算机解决编程能解决的问题,它就必须在系统层面解决编程的结
7、果 程序的表达和程序的运行问题,即编程和建造程序运行所在的平台,这二个问题实际上联系在一起的,PC系统(可能是硬件的,或软件的)要提供给程序一个执行路径对于程序的表达问题,编程要从根本上需要解决程序成不成立的事,这就是数学“可计算”,“可否形式化”问题的任务,这就是图灵理论解决停机问题的那一块。属于离散数学的内容。如果一个问题被证明为在有限步完成,它就被图灵理论所支持,能被形式化,适合被PC处理,等到以后,语言能用算法来映射现实生活的问题的形式化过程(这种过程称为离散化),所有这些都在以后有述。然后,PC要解决通过PC解决在软件层面运行程序的问题,即计算机系统(可能是硬件的,或软件的)要提供给
8、程序一个执行路径.联系中的主体联系中的主体联系联系执行路径中的栈式2数据和代码静态数据栈式代码3子程序抽象运行体代码或数据暂且你不必明白以上图表表示的是什么意思,也不必理解软件的OS是如何运行编程结果-程序的运行问题的,这需要以后再说。程序与语言工程(映射工程)软件和软件编程的理想是好的,当软件平台搭建好的的时候(它能运行高级语言编成的程序),我们还需要提供一种映射手段,即程序与程序语言,这样方能实现一步一步实现最初的软件编程。然后是制造编译器完成映射的事;这就是说,现代的编程必然跟语言有关4,所以它必须首先解决语言的问题,它属于编程工程中的映射工程,它包括解决语言的内部实现问题(比如语法,语
9、义)。以后会谈到语言的外部问题;这里你要着重看到语言这个字眼,通俗来说,这就是人们常常说的,编程就是学一门语言.这里的联系在于:联系中的主联系中的主体体联系联系语言与语法语义语言作为其内部实现的二大支撑概念,是用编译器理论来解决的;语言与人语言是由人来学的,要注意一个学习曲线问题语言与应用比如语言如何在语言内部实现的基础上表达并解决问题,以及形成一种做法标准,满足工业化快速开发的需要语言与人,语言与应用,参照下面“应用建模工程”节;数据结构与算法工程这一切导致了“软件编程”。以上解决了程序和编写程序的事情,还没有解决如何写程序的问题;这就是说,需要一种方式保证(可能是在理论层论证)这种开发方式
10、是否可行的问题;编程要通过计算机解决编程能解决的问题,需要解决开发本身的问题,即理论层论证这种开发方式是否可行,比如统一使用数据结构和算法来解决功能开发上的问题,即编程首先是对于计算机的实现.而这个实现,在冯氏系统上(冯氏系统是一种本质上的数据处理系统),是通过一种数据化模式(先是以抽象类型的方式达到描述一种数据化的模式,再是数据结构)来进行的.这里你要着重看到冯氏系统,类型和数据结构这二个字眼.以及它们之间的联系,归纳如下:联系中的主体 联系 冯氏系统和类型 以抽象类型的方式达到描述一种数据化的模式(在编程层提供给冯氏系统更强大的编码能力)类型与数据结构 在抽象类型的基础上,用组织数据形成数
11、据结构的方法来解决开发中的问题 冯氏系统和代码结构 在编程层提供给冯氏系统某种代码,让其操作处理经类型化的数据.所以对类型和代码的抽象,都是基于人的要求来的,同时编译器做了计算机与人之间的媒介应用建模工程上面说了,语言问题还包括它的外部,因为语言是由人来学的,所以对语言设计的考虑还包括着眼于它的外部,考虑其语法对于人的简单性和简单入阶性,语义映射到应用的那些能力;语言对于工业的统一性和强度性要求等.这就是说,编程是通过计算机来解决问题(这里侧重说的是问题)的,故它必须在语言的基础上抽象应用,解决对于应用端,问题端的抽象问题,比如对应用的设计问题.即设计模式.在一个大的范围里来说,应用问题本身是
12、可以脱离语言被独立考虑的,但具体到用编程的方式来体现它,必然要涉及到如何用这种语言来体现上述应用与设计的问题.业界主要是用OO来解决这个问题的;经过大量争论,但经过OO多年的发展,它已经成了这个时代编程的基础,被沉淀作为基础知识5.比如语言能力中的class和设计中的OOAOOD,几乎是现代编程的代名词.这个时代不再是用不用的问题,而是一定要用的问题,这个问题早过时了,这些在语言之争中有述。对于编程者将编程机制接上现实概念的手段,比如,在用数据结构知识解决实现问题的时候,由于不够抽象,所以只能直接用内存的方法来抽象数据,那个时候是数据编程,这个手段在后来会越来越被抽象掉,甚至全然没有数据的概念
13、,比如OO OO算起来还带有一点UDT到ADT的转变,而面向接口编程(它可以于OO来表现,即advanced oo 手段)将数据编程发展到了一个新的阶段等)这里你要着重看到设计模式和应用.这里的联系在于:联系中的主体 联系 问题与人 对于问题,编程如何解决人与它产生的设计关系 设计与语言 语言如何更好体现设计模式 对于软工问题,还有一个是处理大量人之间关系的学问,编程是大量人来进行的,所以它还必须解决它关于人6的要求的那些东西,即解决写法上的问题和对逻辑的表达方面的问题,设计上的问题和解决大规模开发的问题.即软工问题(它还包括分工等问题,软件过程问题),甚至调试问题(加入人对软件的后期干预因素
14、)故软件调试不属于编程,而属于编程工程,现在的汇编承担着二种角色,即编程语言的角色(汇编编程或联合C混合编程),和作为编程工程中的调试工程的角色。这里你要着重看到人和设计.这里的联系在于:联系中的主体 联系 语言与对逻辑的表达 编译实现里面的类型对数据的产生模式 语言与写法 编译实现里面的,对写法的产生模式,对代码的组织模式 人和设计 综合考虑全部因素 最后编程,如果往深处说,它还应处理跟用户7有关的事,这个用户是产生软件需求的人,它不懂任何语言或库,你可以想象django中的template语言,这个用户使用无语法的声明性“代码”,这就将编程层次上升到了用户,将设计的任务从编程层次(我们说过
15、,编程有运行层,语言层和设计层)中独立出来.即,对跟领域密切有关的设计的支持,可以不是语法编程要做的事,也可以不是程序员的事,它可以做到用户层和语法语言外面.比如,用一种类UML的接口语言转成语言的类体系(但是,迫切需要一种比OO还要高阶的语法语言,作为这种UML的目标,我们会在后面南辕北辙的UML加以详细讨论)所以说我们所指的编程绝非简单的二个字,而是由以上一切综合而成的一种人类活动,还以为“什么是编程”这个问题很简单吗?再加上这些问题都不是独立的而是联系着的,澄清它们是一个巨大的工程,为什么要用上面的方式解说什么是编程所以,如果说问题与问题之间总是关联着的,所以怎么样向他们去简单地说明白一
16、件事呢?比如什么是编程。答案其实早就出来了,既然语言都面向综合解决编程中出现的这些问题,是个由人出发并终止于人的需求的系统活动,那么实际上对编程的概念的负责任的探索只能是一个无尽的过程,因为需要一切都综合而论,比如,谈对于一门编程语言的学习,一旦谈到了语言,即使在不谈到任何语言要素的情况下,选择什么样的语言这个小话题8实际上都会是一个巨大的问题,因为选择语言,它首先要解决如上我们谈到的几大问题,而只有弄清了这些,才能正确选好一门语言,而这只是编程的第一步,但问题是:初学者不可能对所有这些都有一个他们的理解,(我们这里谈到的编程是狭义的,即选择某种编程语言写系统逻辑或应用逻辑,而实际上还有广义的
17、编程).也许我们只能从某些侧面和“形式”,“唯度”去说明.我们永远做不到把握事情真相的全部.即使有全世界那么多的纸张,“什么是人生”这样简单的问题我们也坚信写不完.但是对于人生,我们至少可以给出下面这样一些描述性的唯度,就像我们在本节的开头导出对于编程的那个描述性概念一样.”人生是一场由出生到死亡的存在”,”人生是一场梦想与财富的追逐”还比如,什么是计算机,这个问题其实跟什么是人生一样简单常见但是难解,但是我们可以站在计算机抽象组成的角度,给出一个足够简单的答案,计算机=硬件架构+软件OS,只要了解了硬件架构和软件OS,那么我们就可以说我们理解计算机了(当然,只是在某个唯度上而已,而且,具体到
18、硬件架构和软件OS,又有巨大的唯度),让我们进入我们还没有完成的话题继续深入,什么是编程,在本章的开头已经给出了一个初步的概念,在那里,我们选择的抽象和唯度的组合是:程序被编程和被产生,被执行的主体与客体:即,编程的根本在于工程和抽象.本书即在站在这个大角度来讨论所有的大小唯度.要谈的工程 编程(整体上的编程是一种工程,以产出产品为目的)要谈的抽象 编程(具体的编程是一种抽象,以抽象概念和具化概念为手段)选取的唯度 程序被执行的宿主和编程语言,写程序的人和程序针对的应用 本书是以抽象为线,讲解平台,语言及基于平台语言的映射,即编程,这是本书的宗旨既然编程是一个工程,因此对任何编程问题的讨论都不
19、可同日而论,故至少地,我们可以选择“平台与语言的关系”这个维度开始谈,因为任何开发实际上都是以先后顺序解决平台问题,语言问题和人的问题的过程,即,执行模型,语法模型,和设计模型的三段式过程.关于这个三个模型,后面还会有更深的讲解.于是,分清一切的首先是分清计算机,软件,与编程的区别。计算机科学的本质是由数学来完成的,它可分为硬件和软件系统,软件的本质是抽象,它可分为实现抽象(数结与算法)和组织抽象(对问题经抽象后形成的软件方案域),编程的本质是映射手段,映射和设计,更多地是一种艺术,这三者是相互渗透的,比如编程语言实际代表着几重角色的身份。运行时代表着它作为计算机系统和角色,语法代表着它能表达
20、抽象和映射,用于设计的角色。但是正如系统跟语言不可分开写一样,应用和设计也不可能被分开讨论,其实这四个部分都是相互连接的不可分解的9,这又造成了讨论的复杂性。编程绝对不止是这样一个泛而论之的话题,因为在每个客体和主体的内部,又存在数量巨大的唯度和抽象,但我们可以照样根据找唯度的方法去理解它们.以下我们将极力从以上唯度中找到一些我们常见的词汇,以它们为根据,深入到这些词汇内部进行对编程的探讨.并附带讨论什么是最简单的语言,怎么样学习编程,为什么要这样学.于是我愿意只用上述列举出的表格和一些描述性的概念来表达它们.运行模型与语言模型运行模型与语言模型,设计模型设计模型模式其实指代一种对待问题的高层
21、工程思想模型,对于上面在工程部分提到的五个工式程,在编程界存在三种模式,即,问题模式(比如数据结构和算法),设计模式(应该算是结合了问题和代码模式的综合模式了),代码模式(比如OO,高级语言机 制),这三者存在着巨大的联系,比如OO中的class是一种数据抽象而不是数据结构一样。还比如,过程式语法被证明可以构成任何图灵程序,其实也可能存在其它方案,也就是说,过程和函数只是万千可行方案中的一种。先来说说为什么说这三者其实是联系在一起的.运行模式:为计算机引入一个编程层面,做进计算机pc不但是作为应用平台存在的,而且是作为开发平台存在的,即它不但是应用机,而且是开发机,将编程集成进pc内部的编程最
22、初的情况,远非我们今天看到的那样,而是经过了一步一步发展的才发展到我们能今天看到的样子的.其实只要拥有获取到程序的手段,计算机就可以执行这些程序完成它的事(这是计算机存在的唯一意义和必要条件,最初的解决手段是利用纸带编程,计算机内部并没有一个编程层面,这种模式是编程跟执行完全分离的模式),最初的计算机是不存在直接在计算机内部写程序的编程方式的.人们用0,1和纸带方式编程.编程层面处在运行层面之外.不过后来我们人类是通过编程来制造程序的而已,而且是在计算机内部进行的.这就为整个计算机在执行层面引入了一个编程层面,这样,计算机就引入了一个带执行和语言系统的编程层面了(即OS和高级语言)。不过,在能
23、出现OS和高级语言的组合之前,还有一些更初始的应用平台和开发平台的组合.开发问题的解决过程实际上是同时解决平台问题和开发问题的综合过程.这二者是相辅相承的.只要存在一种平台,那么对其的开发支持就必不可少,任何平台上的任何开发都包括三个部分,平台层 也即运行层,解决平台实现的内核编程层,语言层,即编译层,和设计层,即对于人,程序员层)还记得我们在书一开始把人类自身比做“计算机”的话题吗?不妨接着想象一下,如果我们人也是电器化的东西,也有控制器等等,比如我们人可以是一个生物硬盘,那么当人们被接入计算机时,编程的工作,也就变成了用0,1组成代码,即,机器语言就是高级语言,编译原理这样的知识根本不用去
24、学.因为用不着编译器和汇编器这样的转换用的东西.人机高度统一,而且思想一致,直接交流即行,这样的话,世界也许不是像现在这样.因为我们毕竟不是生物硬盘,我们具备不了机器分辨位而且能做到巨细无差的能力,而且我们也不能选择改造机器(我们的科技水平只能做出这样的计算机),我们只拥有一种能识别0,1硅材料组合的计算机,这种硬件上的裸机是可编程的,写上0,1的纸带是可以给裸机编程驱动它工作的,编程也的确可以做到机器内部,然而这未免太折磨人.如果不改造这二个东西,计算机将会是一个毫无生气的世界.除了在软件上提出一种像样点的高级机器解决机器的问题之外,我们还得需要一种能脱离了机器层面的编程工作.即,我们要同时
25、改造平台和语言,那么熟先熟后呢?几种编程模式 先不说解决平台还是语言的问题谁先谁后,至少,通过上面的讨论,我们得出纸带,机器语言和裸机是这样的组合的第一步,以前的机器都是用这种机器指令驱动的,硬件程序员用0,1编程,我们在前面讲到了这种局限性,这种局限性不光来自语言,还来自硬件平台的低级性(它也导致在这种平台上不可能有什么高级形式的语言),1950s早期,数学家Grace Hopper 发明了symbolic语言,即assembly.这种语言使人们用助记符的形式替代传统的直接写0,1的方式,然而,它只解决了问题的一部分(它还是机器语言,解决的还是低级的硬件问题),我们在前面也一再提到了会编语言
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 什么是 编程
限制150内