在以前的讨论中,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
- 浏览 3841
- 评论(9)
- 论坛回复 / 浏览 (9 / 2876)
- 查看更多
相关推荐
在当今的算法竞赛和软件开发领域中,动态序列问题和动态树问题的解决方法是两类常见的数据结构应用场景。本文将从理论上和实践上探讨这些问题的解决之道,并详细介绍几种常用的平衡二叉树型数据结构,如线段树、伸展...
本文将深入探讨内部类和静态内部类的概念、应用场景及优缺点。 首先,我们来了解内部类的基本概念。内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。在这里,我们重点关注成员内部类和静态...
通过使用JAVA编程语言,开发者可以实现基于图像路径的二维动画,将静态图片动态衔接,并且能够丰富图像内容和色彩。JAVA编程语言在这一领域中所表现出的性能优势,为动画设计师提供了强大的工具,使得他们能够创作出...
在编程世界中,类型策略是决定语言特性和开发者体验的关键因素。本文主要探讨了静态类型和动态类型这两种主要的类型...理解不同类型策略的优缺点,可以帮助开发者更好地选择合适的工具,以实现高效且可靠的软件开发。
本文将对C++与其他编程语言进行比较,以便读者更好地理解C++的特点及其适用场景。 首先,让我们从C++的设计哲学谈起。C++不仅保持了C语言的高效性和接近硬件的操作能力,还通过引入类和对象的概念,支持面向对象...
- **内存管理技术**:介绍不同的内存管理策略(如分页、分段等),并讨论它们的优缺点。 #### 1.5 命令式编程 - **编程范式**:命令式编程是一种通过告诉计算机执行特定命令来解决问题的方法。 - **实际应用**:...
JavaScript是一种动态类型的脚本语言,广泛应用于Web开发。在JavaScript中,对象的创建和方法的定义有两种主要方式:静态属性和原型属性。本文将深入探讨这两种属性及其在JavaScript中的使用。 首先,静态属性...
通过与SQL(结构化查询语言)的结合,ASP可以实现对数据库内容的动态查询、修改、插入和删除操作。 SQL是一种专门用来访问和处理数据库的标准编程语言。在数据库系统开发中,SQL扮演了核心角色,因为它提供了对...
同时,软件的菜单功能强大,操作简便,无论是静态网页还是动态网页,都能轻松完成设计和制作。 在网页设计的过程中,色彩搭配和布局设计同样至关重要。网页的配色需要创新且符合用户体验,避免单一色调带来的审美...
常见的编程语言如Java、PHP、.NET、Python和Ruby各有优缺点。对于初创公司,PHP因其易于学习、快速开发和良好的前端支持而受到青睐。然而,Java提供了成熟的工具链和强大的类型系统,有助于避免某些低级错误,但可能...
传统的教学模式中,教具多以静态的图片、卡片为主,而畅言智能语音教具系统的引入,则将静态的教具转变为动态的互动式学习工具。教师能够借助系统播放儿歌、对话等音频内容,使得教学过程充满韵律与趣味,极大地激发...
每种方式都有其适用的场景和优缺点。例如,饿汉式单例在类加载时就完成了初始化,因此内存使用上可能造成浪费,但它的线程安全无需额外的同步控制;而懒汉式单例则延迟了实例化过程,节省了内存,但需要考虑线程安全...
- 阻塞与非阻塞操作的优缺点及其适用场景。 ### 总结 本文集精选了一系列关于嵌入式C和C++语言的重要知识点,覆盖了从基本概念到高级主题的广泛内容。无论是对于初学者还是经验丰富的开发者,都能够从中获得有...
后者结合了静态页面的速度优势和动态内容的更新便利性,成为企业网站建设的热门选择。 4. **企业网站制作流程**:从业务洽谈到网站交付,详述了企业网站制作的全过程,强调了美工设计、技术实施和客户反馈的重要性...
Matplotlib是Python最常用的可视化库,能生成各种静态、动态、交互式的图表,帮助科学家直观地理解数据。此外,Seaborn、Plotly、Bokeh等库提供了更多高级的可视化选项,满足了不同场景下的需求。 在机器学习和人工...
比如,对于一些复杂的概念,教师可以先用传统的语言讲解,再通过多媒体技术进行深入阐释。 其次,教师在运用多媒体技术的同时,还应考虑将其与传统的教学手段有机结合。例如,在讲述一些抽象的概念时,教师可以在...
1. **考察现有环境**:在设计新数据库前,分析当前系统的优缺点,了解业务流程和数据流转,这有助于避免重复劳动并识别潜在问题。 2. **定义标准命名规范**:制定统一的命名规则,如表名的单复数、别名长度和格式,...
- **解决方案**:提供了几种不同的解题方法,并比较了各自的优缺点。 - **扩展思考**:引导读者思考如何进一步改进解决方案,或将其应用于其他类似的问题。 #### 11. C/C++结构体的一个高级特性――指定成员的位数 ...