在以前的讨论中,robbin曾经发起过关于静态语言和动态语言优势比较的帖子:
http://www.iteye.com/topic/33971
关于静态语言和动态语言的定义请看上面的帖子。
我想谈一下自己的观点。
我个人觉得,静态语言相对于动态语言有如下几个优势:
1. 运行的性能优势
2. 代码的可读性
3. 代码质量的安全、可靠和可预测性
而这些优势决定了静态语言更适合用于开发大型系统。
先看第一点,运行性能。尽管现在许多动态语言可以使用类似JIT的技术来优化运行效率,但是由于其动态变化的能力(如动态增加方法、属性等)使得其性能的优化无法达到象Java这种动态优化的程度。而对于很多大型软件系统来说,性能无疑是非常重要的质量要素。
再看第二点,代码的可读性。这里的代码可读性并不是指代码量多少的问题,有的时候代码少并不一定好读,而代码多也不一定难度。举一个简单的例子,用Java定义一个类如下:
public class People {
String name;
int age;
List addresses;
public String getName() {
return name;
}
......
}
在其他类的方法中,可以使用该类:
public void printPeople(People people) {
String name = people.getName();
......
}
而在一些动态语言中,我们可以动态生成People类(譬如从数据库的元数据中,或者某些配置文件中),并且也可以使用如下:
function void printPeople(people) {
String name = people.name;
......
}
显然,动态语言使得我们可以不定义People,不过这时问题来了,我们除了从上面的方法参数名字上知道可能是一个People实例以外,很难获得更多的信息,并且,即时知道了这是一个People实例,我们也不知道这个类到底有什么属性可以访问,有什么方法可以调用,我们可能需要去查阅数据库的表定义,或者相关文档,但是直接从代码中我们无法知道这些信息。
对于大型系统来说,代码可读性的重要程度有时并不比文档和测试低,系统要能够很好的维护,就需要有较好的可读性。
第三点是代码质量的安全、可靠和可预测性。其实这一条是最重要的。代码的可靠和结果可预测对大型的软件系统来说至关重要。但是为什么说动态语言会在这方面存在问题呢?并且即使测试也无法解决呢?因为动态语言太灵活了,以至于你无法预测很多的行为。
我们还是以上面的printPeople函数作为例子,简单的一个people参数,我们来看看到底有多少情况是我们无法确定的:
1. people真的是People的实例吗?
2. People类真的是我们期望的People类吗?没有别的程序修改了它的属性定义或者方法的定义?如果有别的程序在运行时修改了这个类的定义怎么办?
3. 随着整个系统的发展,People类本身会发生怎样的变化,这个变化和printPeople这个函数相关吗?
显然这些不确定是我们无法用单元测试解决的,而集成测试我们通常只能遍历最常见的组合路径,所以测试无法有效的覆盖这些不确定性。
为什么会有这么多的无法确定的事情呢,因为动态语言缺乏强制的约定(或者协议),这种约定的缺乏形成了动态语言的动态特性。而在静态语言中,静态类型的约束的重要性不在于它在编译时的的类型检查,而在于它在使用者和定义者两者之间建立了一种约定,而这种约定保证了他们之间的行为的可预测性。
当然,对动态语言来说,这三个缺点并不是没有办法,有一些办法可以缓解这些问题,如果性能问题可以通过增加硬件的方法缓解,可读性问题可以通过注释和文档来缓解,而可靠和可预测性可以通过统一的约定以及组建一个开发风格一致的团队来缓解。
然而总体来言,这些缺陷制约了动态语言用于大型系统的可能,试想一个代码行数超过几十万行,生命周期为5-10年或者更长的软件系统,用动态语言来实现还是需要承担相当大的风险的。
分享到:
- 2007-10-05 13:48
- 浏览 3834
- 评论(9)
- 论坛回复 / 浏览 (9 / 2875)
- 查看更多
相关推荐
本文将深入探讨内部类和静态内部类的概念、应用场景及优缺点。 首先,我们来了解内部类的基本概念。内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。在这里,我们重点关注成员内部类和静态...
通过使用JAVA编程语言,开发者可以实现基于图像路径的二维动画,将静态图片动态衔接,并且能够丰富图像内容和色彩。JAVA编程语言在这一领域中所表现出的性能优势,为动画设计师提供了强大的工具,使得他们能够创作出...
在编程世界中,类型策略是决定语言特性和开发者体验的关键因素。本文主要探讨了静态类型和动态类型这两种主要的类型...理解不同类型策略的优缺点,可以帮助开发者更好地选择合适的工具,以实现高效且可靠的软件开发。
JavaScript是一种动态类型的脚本语言,广泛应用于Web开发。在JavaScript中,对象的创建和方法的定义有两种主要方式:静态属性和原型属性。本文将深入探讨这两种属性及其在JavaScript中的使用。 首先,静态属性...
通过与SQL(结构化查询语言)的结合,ASP可以实现对数据库内容的动态查询、修改、插入和删除操作。 SQL是一种专门用来访问和处理数据库的标准编程语言。在数据库系统开发中,SQL扮演了核心角色,因为它提供了对...
同时,软件的菜单功能强大,操作简便,无论是静态网页还是动态网页,都能轻松完成设计和制作。 在网页设计的过程中,色彩搭配和布局设计同样至关重要。网页的配色需要创新且符合用户体验,避免单一色调带来的审美...
常见的编程语言如Java、PHP、.NET、Python和Ruby各有优缺点。对于初创公司,PHP因其易于学习、快速开发和良好的前端支持而受到青睐。然而,Java提供了成熟的工具链和强大的类型系统,有助于避免某些低级错误,但可能...
后者结合了静态页面的速度优势和动态内容的更新便利性,成为企业网站建设的热门选择。 4. **企业网站制作流程**:从业务洽谈到网站交付,详述了企业网站制作的全过程,强调了美工设计、技术实施和客户反馈的重要性...
通过动态的多媒体资源,如影视片段、Flash动画、Webrint等,可以使教材内容变得生动有趣,静态的文字和图片转化为动态的画面,使得课堂信息量大增,提高学习效率。制作精良的多媒体课件应具备灵活性、美感和广泛参与...
1. **静态礼仪**:主要涉及应聘者的穿着和形象。男士应选择简洁、庄重的职业装,如深色西裤、皮鞋、浅色衬衫,夏季可穿带有淡色暗条纹的衬衫,避免佩戴过多装饰品。女士则需保持纯朴大方,夏季可穿长度适中的裙子...
Matplotlib是Python最常用的可视化库,能生成各种静态、动态、交互式的图表,帮助科学家直观地理解数据。此外,Seaborn、Plotly、Bokeh等库提供了更多高级的可视化选项,满足了不同场景下的需求。 在机器学习和人工...
1. **考察现有环境**:在设计新数据库前,分析当前系统的优缺点,了解业务流程和数据流转,这有助于避免重复劳动并识别潜在问题。 2. **定义标准命名规范**:制定统一的命名规则,如表名的单复数、别名长度和格式,...
此外,MATLAB的可视化建模和仿真功能支持复杂系统的建模和动态仿真,而图形功能则允许用户绘制出各种静态和动态的图形,包括二维、三维、极坐标和对数坐标图形等。 在数学分析教学与研究中,使用MATLAB可以更加方便...
随着软件开发领域对多语言协作的需求日益增长,不同编程语言间的相互调用成为了实现高效开发的重要手段之一。本文将深入探讨C#与MATLAB混合编程的方法及其应用场景。 #### MATLAB与C#混合编程的意义 - **提高效率*...
语言语言 语言 C# 未来 未来未来 未来 5 年 年年 年 我们的目标就 我们的目标就我们的目标就 我们的目标就是超 是是 是 越今天各自为营的 超越今天各自为营的超越今天各自为营的 超越...