程序的基本元素(个人感觉)

本文纯属个人在看了一点儿资料后的感想,本人并未对里面的内容进行过仔细地考证,因此希望读者能进行批判地阅读。里面肯定有很多错误,还望大家不吝赐教。

 

要使一台计算机成功地进行计算,一般只需要两种元素:operator & operands。operator在开始时只有“+“,后来发展到了各种以加法为基础的四则运算,用的方法就是我们要经常遇到的”封装“。

 

数字和字符:

数字对于计算机而言,其本质就是符号,因此,数字天然就可以表示字符等其他符号。由于原始的计算机计算能力有限,只能计算八位,因此它所能处理的信息量就是0~256这样一个范围(IBM是0~127,这与IBM当年的卡片机也有一些关系)。不过发明计算机的美国人并不认为这是什么困难,因为英文字符一共只有26个。即使加上一些符号,也不会超过256。因此,计算机就有了操作字符的能力。

从此,计算机就有了操作数字和字符的能力,或者简单地说,它拥有了操作符号的能力。

 

数组(tuple):

定义一个字符很简单,但如果连续定义字符,还是很麻烦的。为了方便,人们就使用了数组(tuple)这种工具,简化操作。一个数组之所以能通过下标进行访问,一个很重要的原因就是数组在内存空间里是连续存储,因此只要将指针按设定的方向移动一定的距离,就可以 <script src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script> <script src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script> 找到下一个字符。

 

字符串(String)

指针的跳转是一种很厉害的机制,它是实现映射(Map)的一个重要途径。我猜想String就是这样实现的。它是对字符数组的一种封装,由于是人为的封装,因此在String上可以进行的操作就很多了,如选择,分割等。

 

字典(dictionary)

这是python里面的一种数据类型,有些像java里面的map,我觉得和JavaScript中的json格式如出一辙,都是实现了一个对象到另一个对象的映射(这里的对象是广义的对象,而不仅仅是计算机里面面向对象模型中的对象)。

字符串与字符串之间映射的实现,我猜想是这样的:首先进行逐个字符的匹配,在找到一个字符串后,按照约定的偏移,使用前一个字符串的地址加上这个偏移量,就是另一个字符串的地址。这种方法的优点是简单,效率高。缺点是需要固定的存储空间,并且要对字符串长度进行限制。而这种限制如果过大,就会导致空间的巨大浪费,如果过小,则不适用于大多数的情况。不过对于解释型程序,问题倒也不是很大,解释型程序要么比较小,不会使用大量内存,要么有内存回收机制,不怕内存溢出。

刚才想了想,这种实现映射方法确实不便。或者可以在每个关键字(key)字符串后加一个指针,找到这个关键字(key)字符串后,就可以拿到那个指针,然后找到另一个字符串。这种方法的优点是灵活,缺点是空间占用稍大。

 

Statement

这个不知道如何翻译,但在程序中我们经常使用,如def,print,assignment,if,while等。我觉得statement和operator一样,是对汇编的那些操作符的封装,他们是各种操作的基础,利用他们可以操作外设,内存等。如何确定statement的数量,使其既满足操作计算机所需的能力,又满足数量最小,程序员最容易掌握,是个学问。

我想,Statement所需定义的操作至少有这几个:

在计算机内部的操作:

  • 在寄存器中移动字符
  • 算术运算的封装
  • 内存空间的分配,修改和回收操作

与外设的交换

  • 接受键盘,鼠标等外设的输入(input)
  • 在显示装置上进行显示(output)

关于封装

对于一个计算机程序来说,上面所说的那些元素,operator,number,String和Statement就足够了,使用它们,我们可以实现任何一个计算机程序。实际上,计算机程序也正是由这些元素组成的。但人们为什么还发明了很多其他工具呢?原因很简单,随着程序的无限复杂,人们越来越难以控制程序的正确性和可靠性。为了解决这个问题,人们想到了封装。

最基础的封装,就是对operator和Statement这些元素的封装。另外一种重要的封装,就是数据类型。对于计算机这种只能进行语法分析的形式系统而言,数据类型是没有意义的。数据类型是对人的限制,它决定了数据的表示范围和可对其进行的操作,这样一方面可以防止对一些数据的破坏,另一方面又简化了程序员的操作,所增加的困难在编译器那一端。

 

关于调试(debug)

一个程序中的bug可以分为三类,分别是语法错误,语义错误和运行时错误。

语法错误:这类错误很明显,一般来说编译器都会给我们找出来。

语义错误:这类错误一般很难发现,需要进行不断地测试。但仍可能犯错,因为计算机程序面对的世界很复杂,很难写出一个在复杂情况下仍能保持其健壮性的程序。一个减少错误的方法是限制输入,减少与外界的交互。

运行时错误:这类错误往往和语义错误在一起。在有些情况下,如规定的运行环境与现实中的运行环境不一致,也可能导致运行时错误,如内存不够等。

由此可见,程序中bug的主要来源在于语义错误,即程序员在逻辑上的错误。减少这种错误的有效方法是对程序进行不断地封装,通过封装减小程序的复杂性,同时也使程序员更容易找到bug。另外,详细和明确的注释和文档也是一个好程序的标志,它可以最大限度地减少因为对同一个事物的理解不同而造成的语义错误。

 

自然语言与形式语言

自然语言:特点是与语境紧密相关,并且需要很多内容才能表达一个准确地信息。

形式语言:与语境无关,每个元素都有一个明确地信息

由此可见,人们所使用的自然语言与机器所使用的形式语言之间就有一道鸿沟,这也是为什么程序员不愿意写文档的一个重要原因。但也正因

为这个原因,我们需要更好地文档。另外,对一些自然语言进行加工,成为”术语“,用它们来在这道鸿沟上架座桥,也是人们常用的方法。这

是很多自然科学所面临的问题,因此也可以借鉴他们的方法来解决这一问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值