|
很多人感觉程序语言很难学,学了很久入不了门,也有很多人以大量的编码为代价勉强入门了,但在实际应用中不自如,是什么原因造成的呢?我们可以对比与程序类似的工具--数据库来发现问题。
大家知道学数据库的入门书,一般叫《数据库系统原理》这样的书,数据库系统原理里面介绍数据库的时侯是先从概念模型讲起,讲现实世界如何与概念模型建立映射,然后讲关系模型,关系模型是先讲关系代数而后才介绍具体的数据库语言,而后再介绍关系规范化和数据库设计、数据库管理系统等内容。通过《数据库系统原理》的学习,可以让没有接触过数据库的人有个大致的概念。从这里可以看出,介绍数据库语言之前是先有关系代数作铺垫,因此就把数据库语言的语义明确了。在数据库设计方面,先从独立于具体数据库模型的概念模型出发,而后根据选定的数据库模型进行转换,再根据选定的DBMS进行物理设计,整个设计流程非常明确。
而程序语言的入门书,却不是使用类似《程序语言原理》这样的书,而是采用一门具体语言的书,这使得学习程序时无法集中精力去理解程序固有的逻辑,而一下子陷入琐碎的细节中,而且程序语言的语言和语义远比数据库语言要复杂得多,所以这样的书自然无法像数据库那样能够光靠看书就能理解。很多人通过大量实践勉强理解了一部分但却无法应用自如的一个重要原因就是没有从程序语言中提取从程序固有的逻辑,从而在解决具体问题时陷入细节而抓不到关键。而设计硬件的VHDL语言也是先有数字逻辑作铺垫。可见,把语法和语义混在一起来教程序设计语言是使程序设计难以入门,难以应用自如的一个重要原因。一开始就陷入具体产品的学习也是不可取的(但可以通过具体产品获得感性认识),应该先学习程序语言的本质再学习具体产品。学习好程序语言的本质是入门的标志,然后用程序语言的本质指导具体产品的学习。
任何一个语言都有语义,语法和语用三个方面,对于程序语言来说这三个方面都是很复杂的,应该分开学习。
在语义方面,程序语言包括逻辑方面,实现方面和控制方面。
(1)逻辑方面的是指程序语言接近人的思维那部分,也就是和计算机无关的那部分。主要包括
①描述单个事物状态的:数据类型
②描述事物状态的单次变化的:数据操作
③描述多个事物状态的:数组,结构体
④描述事物状态多次变化的:顺序,条件,循环,函数
⑤把状态和变化抽象为中间层的:指针
⑥描述状态和变化的归属关系的:局部变量,全局变量
⑦描述变量存在的时间特性的:静态变量,动态变量
⑧并发程序的基本概念:同步,互斥,死锁
⑨描述与外界交流的:输入输出流
要说明的是这只是命令式语言的逻辑方面。
(2)实现方面是指程序语言接近计算机的那部分,但仅仅只是用来实现逻辑的那部分,比如内存,CPU(当然都只是逻辑上的概念),这一部分在抽象程度比较高的语言涉及较少,但各种语言多多少少还是会涉及到。主要包括
①内存部分,主要涉及数据在内存的空间分布,内存的管理
②CPU时间的部分
③与硬件和操作系统环境有关的部分
(3)控制方面的是指用程序控制的对象的部分,比如用程序控制硬盘的I/O,显卡的输出,网络的I/O等等。主要包括
①控制数据存储的部分:文件
②控制数据输入的部分:鼠标,键盘
③控制数据传输的部分:网络
④控制数据输出的部分:显卡,声卡
要说明的是实现方面和控制方面仅仅需要学习需要与程序打交道的数据部分
在语法方面,需要使用上下文无关文法来描述形式以及与语义如何对应,主要包括
①变量名,关键字,常量,符合表
②各种数据类型的文法
③各种语句的文法
④更名机制,即把变量名等的形式进行变换
⑤文法变更机制
⑥重载
在语用方面,主要是如何表达具体的问题,这一部分和数据库设计有类似之处,主要包括
①把具体的问题抽象成用通用的模型表示
②把通用的模型转化成某种语言的逻辑模型
③根据实现条件附加内容 |
|