串和数值用不同的方法处理。这样的语言至少得有两种类型--一种用于字符串,另一种用于数值。多数语言具有多种类型。初看起来,类型是相当简单的,它们是把事情分成不同群体的方法。但是,不久它们就会变得复杂得多了--如果一个群体与另一个群体在某一方面"一样"怎么办?函数的类型又是什么?
静态类型和动态类型
类型可以是静态的或者是动态的。像Lisp或Python语言就有许多不同的类型,但当你看到一段代码时,并没有什么因素迫使一个变量"是"某种类型的数据。而在其他语言中,如ML或Eiffel语言,一个特定的变量总是与一个特定的、类型固定的某个值相联系。第一类语言(当程序被编译时,一切类型都未确定)具有动态类型;第二类语言具有静态类型。说静态类型好是因为程序中的某些错误能在早期被发现,说动态类型好是因为程序可以更灵活、更紧凑。当要计算的问题变得较大,你不得不和许多其他程序员一起完成项目时,静态类型变得较为重要。而当你自己做一个项目时,你可能更愿意选用动态类型的语言。
健壮类型和脆弱类型
类型可以是脆弱的,也以是健壮的。静态类型的语言都是健壮的类型,也就是说,当程序运行的时候,任何时刻一组特定数据的类型都是已知的。由于动态类型语言在编译时没有完整的类型信息,因此,如果它的类型是健壮的,它就必须在程序运行
期间跟踪不同值的类型,通常是通过值与它的类型信息封装在一起--然后,值和类型一起传递给程序。C语言的类型是脆弱的--有些变量可以指定数据的不同类型,甚至可以指定随机内存区域,因而程序不能判别一个对象所代表的类型是什么。变量是根据程序的上下文而被假定为某种特定类型的,但如果这一假定不正确,这很可能--也常常是造成程序出现令人困惑的错误的根源。Java是健壮的,但不是静态类型--类可以被转换,而且如果类型不匹配,就会出现一个运行错误。除此例外之外,java型系统可以认为是静态的或是"折衷的健壮静态类型"。
面向对象的程序设计
许多语言支持面向对象的程序设计。在OOP中,数据是在对象之间分配的。对象是类的个别实例(你可以在一个程序中有很多邮件对象,但它们都有由邮件类所指定的相同的基本结构)。通常这些对象会限制对数据的访问(封装)。类很像类型--类和类型之间的确切关系可能非常复杂,而且随着不同的语言而变化。通过继承,多级对象可以共享和修改特定的函数。你在一个类的代码中可以描述所有邮件要具有的性质,然后,在一个要包含图形的子类中增加显示图像的函数。在程序中,你会常常把一个邮件对象看成是父类(超类),这是因为不管该邮件是否包含图形、声音或是只包含文本,当要增加另一个邮件子类时,比如说包含电子支票的邮件子类时,就不用再修改代码了。
向对象的语言至少要有三种策略:
(1)方法:方法构成类的部分定义,语言的实现对每个类都将有一个连接函数与函数名称的表。继承和动态绑定是通过修改、复制和重新利用这个表来实现的。
(2)从类中分离出多方法:函数不能只关联一个类,因为对类的许多不同组合,函数可能具有不同的形式。
(3)原型:基于原型的语言利用一个已存在的对象作为一个例子(原型)来创建新的对象。
结论
除非证据十分明显,否则我们应尽量避免把一些特征标以"好"或"坏"。我们从每种语言中吸取的经验比起对某些语言的绝对断言要重要得多。这种多样化使我们能从新的角度来观察老的问题。观念的改变并不只是更新,它也能加深我们的理解能力并提醒我们选择不同的解决办法。虽然这种信念是好的,但推测将来也是件有趣的事情。哪些好的方面将能够胜出?这是一个很难回答的问题,特别是当好的建议相互矛盾时:静态类型和动态类型都有各自的优点,但按照定义,它们又是相互排斥的。许多语言都在向着相同的方向发展:减少持续不变状态的危险,并使程序更贴近说明书。面向对象的程序设计认识到了这种状态,并试图控制它的变化,但这与说明书却没有什么关系。性能一直是习俗的借口,很多年以来,人们一直在争论:在复杂而有效的GC算法存在的情况下,垃圾的自动回收太慢了。也许java的成功(目前的字节码解释程序并不快)会使人们相信一个"慢"的语言可能会实用。事物确实会变化,快速的处理器已把强调语言的速度放在了一边,而把程序员的效率和编码的可维护性提到了重要的位置。我们正在看到一个从"该语言特性花费太多的CPU时间吗?"到"使用没有这种特性的语言会花费太多的开发时间吗?"的转变。
为何要学习一种新语言?
虽然有迹象表明事物正在不断变化,但公平地说,选择一种语言来开发软件这件事仍然没有什么变化。学习一种新的语言可以使你成为一个更好的程序员。学习一种新语言有两个根本的理由:1)通过"向上发展"(例如:你原来使用C++,现在学习Java),你可以学到一些经验并能将其直接转化到你原来经常使用的语言中去。2)通过"横向发展"(通过一套完全不同的思想核心来学习一种语言),你可以拓宽视野,并学会一种新的方法,用来解决用你"通常的''语言解决起来似乎困难的问题。
向上发展
作为第一种情况的一个例子,让我们看一下如果你正在用c或C什进行程序设计而学习Java的理由吧:如果你起初不理解如何使用类和对象的话,就很难用Java编写程序--这一点与C抖不同,学习C++,你仍可以继续使用在C中使用过的相同的程序设计风格。因此,学习Java,将教会你什么是OOP。除了你的简历之外,理解OOP背后的原理将帮助你成为一个更好的程序员。
横向发展
从一个新视角来观察程序设计会带给你洞察能力,当你回到原来的观点时,这种洞察能力是会起作用的。不同语言用不同的方法来表达相同的模式(算法、方法、解答):通过不同的侧重点观察一个模式,能对它进行更彻底的理解。有时一个模式在一种语言中比在另一种语言中更清晰,然而一旦摸清了它的简单形式,它的更多的描述方法就变得清楚多了。模式部分地依赖于语言特征,部分地依赖于习惯--这种平衡随着语言的不同而不同。
如何学习一种新的语言
如何学习一种新的语言呢?最快的方法是当你不得不学习的时候。但如果你足够幸运的话,你可以有选择性地学习,你可以在业余时间里学,而且除非是你感兴趣,否则你也可以不学--所以,选一个有趣的项目吧。选择你想用新语言写什么比选择语言更重要。选择适合你项目的语言,或者,更好是选择你都喜欢的。例如,如果你想让你写出来的东西看起来好看,那么,就不要选择不支持图形的语言。在你开始试行动之前,先学一点那个语言,试着找出能发挥该语言新特性的解法。例如,如果你是第一次使用OOP,试想你的项目如何划分成对象。如果你是在寻求功能性程序设计,或许数值型的项目是一个好的开端(该建议并不是说功能性语言只适用于数值型的编码,只是大多数教材似乎都以数值型范例为特征--以便使这样的起点容易一些)。同时,对你自己要客观一些,不要野心太大--不要选择太难的项日,也不要选择太特殊的语言。通过任何语言你都可以学到一些新的东西:没有必要在智力上有一个巨大的跳跃。在一个你有某些熟悉概念的语言中将会更有成效,你可以依靠语言中这部分熟悉的概念着手工作。另一方面,如果你喜欢新的观点,也许你会喜欢完全不同的事情。支持也是重要的。如果你有问题想投寄usenet的话,它有适当的网络新闻组吗?它接受网络新手提出的问题吗?你最好要做的,是找一本关于电脑方面的好书,它是用某种语言以范例的形式写出的。关于向网络新闻组询问信息的一个注解:人们在谈论语言的准确性方面差别似乎是很大的,在一个系列中人们倾向于依赖于"潜意识"(或至少是"亚语言")直觉并愉快地误用术语以把"观点讲清楚"。而在另一个系列中人们则非常严格。毫无疑问,二者会对你如何学习产生矛盾的建议,而且有时会对问题给出明显矛盾的回答。最后,不要害怕改变方向。尽管你只涉猎了一点点,但仍然学到了东西--该论点不是说你必须在一种语言上学很长一段时间才能学到东西,而是说学习是延续的。学习一段时间,你能学到一些东西,学得长一些,你学到的东西就多一些--你什么都学会了那种绝妙的时刻是不存在的(这也是为什么程序设计是一个如此有回报的职业)。
??
??
??
??
-I-
上一篇:
vb车辆管理系统vb+access源代码+可执行程序+论文+开题报告+外文翻译+答辩ppt(论文和程序)
下一篇:
科研管理杂志简介