`
slangmgh
  • 浏览: 5695 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

再谈静态语言对动态语言的优势

阅读更多
在以前的讨论中,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年或者更长的软件系统,用动态语言来实现还是需要承担相当大的风险的。

分享到:
评论
9 楼 Godlikeme 2007-10-07  
lz,发这种帖子,讲道理,用心是好的,但是没用的,这种言论属于不受欢迎行列。省省心干点有用的吧。
8 楼 gigix 2007-10-06  
slangmgh 写道
我说过,我们讨论的是语言,不是框架。

另外在网上能够看到的各自开源的Java框架都是通用的框架,特别是经过几个版本之后,会增加很多看似有用,实际没有的功能,这种框架用于特定行业的系统开发其实效率并不高,相反很多公司都有自己的Java开发框架,经过多年的积累后,使用这些框架的开发效率并不低。

逻辑,同志,注意逻辑。
Rails和MonoRails,同样的框架设计,用不同的语言做出来,使用的代码量仍然有明显的差距。这不是语言的差距,是什么?
我在做语言之间的比较,你却非要扯到框架上,非要把很多公司内部使用的Java开发框架拿出来说事。第一我不确定这些框架是不是真的有效提高开发效率。就算是吧,要和它们做比较的话,你就得找到对等的、公司内部使用的、针对特定应用场景优化的动态语言框架来比较才行。
开源通用框架对比开源通用框架,内部专用框架对比内部专用框架,你才能看到在同样的框架底下,语言能带来多大的影响。我们讨论的是语言,不是框架。
7 楼 slangmgh 2007-10-06  
gigix 写道
引用
借助于明确的约定和代码生成,用Java开发一个类似或者接近Rails的框架真的是不可能的吗?在这种情况下,代码量的差别就不会那么大了吧。

你去看看MonoRails就知道了。这种事情不需要猜,事实证据都摆在那里。


我说过,我们讨论的是语言,不是框架。

另外在网上能够看到的各自开源的Java框架都是通用的框架,特别是经过几个版本之后,会增加很多看似有用,实际没有的功能,这种框架用于特定行业的系统开发其实效率并不高,相反很多公司都有自己的Java开发框架,经过多年的积累后,使用这些框架的开发效率并不低。
6 楼 gigix 2007-10-06  
引用
借助于明确的约定和代码生成,用Java开发一个类似或者接近Rails的框架真的是不可能的吗?在这种情况下,代码量的差别就不会那么大了吧。

你去看看MonoRails就知道了。这种事情不需要猜,事实证据都摆在那里。
引用
我说的大型系统是类似银行核心业务系统这样的系统,这种系统运行5-10年是很正常的,可能还会更长。

这样的系统就会一直用它现在的工具来开发,就好像嵌入式系统就会一直用C来开发一样
问题是,这样的系统开发会越来越少,越来越机械化
5 楼 slangmgh 2007-10-06  
gigix 写道
引用
即时知道了这是一个People实例,我们也不知道这个类到底有什么属性可以访问,有什么方法可以调用,我们可能需要去查阅数据库的表定义,或者相关文档,但是直接从代码中我们无法知道这些信息。

用Java你就能知道?
就算Eclipse给你提示,你就知道这些方法都是干什么用的?就不用查文档?


确实如此,对方法的理解首先是根据方法的名称和参数名称来的,只有通过名称无法准确了解其含义的时候,我们才会去查相关文档或者注释。另外我指的是如果People类是动态生成的会产生这个问题,如果是静态产生的或者自动代码产生的,就不存在这个问题,因为和静态语言一样,你可以找到它的定义。

引用
证据?
没有证据之前,我的直觉是:代码越少越容易维护。
另一方面的证据表明,同样功能的web应用,用Ruby on Rails开发所需的代码量大约是Java的10%~15%。换句话说,代码行数几十万行的Rails应用,其对应的J2EE应用将有几百万行代码。
那么问题一:维护几百万行规模的J2EE应用,风险又是如何?
问题二:你干嘛要把一个应用做那么大?


代码越少越容易维护,当然我也这么认为。不过:
第一,我们讨论的是静态语言和动态语言的优势和劣势对开发大型系统的影响,而不是框架。因为语言是相对稳定的,而框架的发展却是太快了。今天Rails开发在工作量上很有优势,但是借助于明确的约定和代码生成,用Java开发一个类似或者接近Rails的框架真的是不可能的吗?在这种情况下,代码量的差别就不会那么大了吧。

第二,应用大并不是因为我们希望把它做大,而是因为业务复杂,对一般的互联网应用来说,功能相对简单,但是对于一些企业业务系统,其业务逻辑的复杂度还是相当高的。

引用
补充:99%的考虑采用Ruby on Rails开发的web应用,根本就不会有持续发展5~10年、堆积几十万行代码的机会。它们需要考虑的问题是能不能在第一个半年里活下来。
再补充:robbin会告诉你,就算JavaEye活到10年,它也堆不出几十万行代码。


可能是我们对大型系统的理解有一些不一致,我说的大型系统是类似银行核心业务系统这样的系统,这种系统运行5-10年是很正常的,可能还会更长。

另外,我一点也没有贬低Rails的意思,相反我很喜欢Rails,不过只是希望没有偏见的来讨论一下在面对大型系统的时候,静态语言和动态语言各自的优势而已。
4 楼 slangmgh 2007-10-06  
walkandsing 写道
语言之争挺没意思的,静态语言和动态语言各有各的优势,所以也就有其各自擅长的领域,我们要做的就是在正确的时候用正确的语言。对于小型的B/S结构来说,动态语言是有优势的,这也是为什么ror在java社区引起轰动的原因,但对于大型的、mission critical的B/S结构,Java EE仍具有统治意义


语言之争的目的本来就不是说哪个语言好,哪个语言不好,语言本身没有好坏之分;语言之争的目的是通过比较,了解各种语言本身的优点和缺点,使得架构师在决策的适合能够选择适合项目的语言而已。另外,世界是变化的,所以现在Java EE具有统治地位,并不说明过几年还是如此,只有通过了解其背后的原因,我们才更有可能预测今后会有怎样的发展。
3 楼 yiding_he 2007-10-05  
现在的 IDE 对动态语言的支持已经相当不错了。大项目也应该不成问题。
2 楼 gigix 2007-10-05  
引用
即时知道了这是一个People实例,我们也不知道这个类到底有什么属性可以访问,有什么方法可以调用,我们可能需要去查阅数据库的表定义,或者相关文档,但是直接从代码中我们无法知道这些信息。

用Java你就能知道?
就算Eclipse给你提示,你就知道这些方法都是干什么用的?就不用查文档?
引用
总体来言,这些缺陷制约了动态语言用于大型系统的可能,试想一个代码行数超过几十万行,生命周期为5-10年或者更长的软件系统,用动态语言来实现还是需要承担相当大的风险的。

证据?
没有证据之前,我的直觉是:代码越少越容易维护。
另一方面的证据表明,同样功能的web应用,用Ruby on Rails开发所需的代码量大约是Java的10%~15%。换句话说,代码行数几十万行的Rails应用,其对应的J2EE应用将有几百万行代码。
那么问题一:维护几百万行规模的J2EE应用,风险又是如何?
问题二:你干嘛要把一个应用做那么大?

补充:99%的考虑采用Ruby on Rails开发的web应用,根本就不会有持续发展5~10年、堆积几十万行代码的机会。它们需要考虑的问题是能不能在第一个半年里活下来。
再补充:robbin会告诉你,就算JavaEye活到10年,它也堆不出几十万行代码。
1 楼 walkandsing 2007-10-05  
语言之争挺没意思的,静态语言和动态语言各有各的优势,所以也就有其各自擅长的领域,我们要做的就是在正确的时候用正确的语言。对于小型的B/S结构来说,动态语言是有优势的,这也是为什么ror在java社区引起轰动的原因,但对于大型的、mission critical的B/S结构,Java EE仍具有统治意义

相关推荐

    浅谈内部类与静态内部类的应用

    本文将深入探讨内部类和静态内部类的概念、应用场景及优缺点。 首先,我们来了解内部类的基本概念。内部类可以分为四类:成员内部类、局部内部类、匿名内部类和静态内部类。在这里,我们重点关注成员内部类和静态...

    浅谈计算机软件开发的JAVA编程语言.pdf

    通过使用JAVA编程语言,开发者可以实现基于图像路径的二维动画,将静态图片动态衔接,并且能够丰富图像内容和色彩。JAVA编程语言在这一领域中所表现出的性能优势,为动画设计师提供了强大的工具,使得他们能够创作出...

    浅谈Java模型以外的类型策略

    在编程世界中,类型策略是决定语言特性和开发者体验的关键因素。本文主要探讨了静态类型和动态类型这两种主要的类型...理解不同类型策略的优缺点,可以帮助开发者更好地选择合适的工具,以实现高效且可靠的软件开发。

    浅谈Javascript的静态属性和原型属性

    JavaScript是一种动态类型的脚本语言,广泛应用于Web开发。在JavaScript中,对象的创建和方法的定义有两种主要方式:静态属性和原型属性。本文将深入探讨这两种属性及其在JavaScript中的使用。 首先,静态属性...

    浅谈ASP技术结合SQL语句在数据库系统开发中的应用.pdf

    通过与SQL(结构化查询语言)的结合,ASP可以实现对数据库内容的动态查询、修改、插入和删除操作。 SQL是一种专门用来访问和处理数据库的标准编程语言。在数据库系统开发中,SQL扮演了核心角色,因为它提供了对...

    _浅谈Dreamweaver在网页设计中的应用.pdf

    同时,软件的菜单功能强大,操作简便,无论是静态网页还是动态网页,都能轻松完成设计和制作。 在网页设计的过程中,色彩搭配和布局设计同样至关重要。网页的配色需要创新且符合用户体验,避免单一色调带来的审美...

    试谈百万级访问网站前期的技术准备.doc

    常见的编程语言如Java、PHP、.NET、Python和Ruby各有优缺点。对于初创公司,PHP因其易于学习、快速开发和良好的前端支持而受到青睐。然而,Java提供了成熟的工具链和强大的类型系统,有助于避免某些低级错误,但可能...

    网页制作与设计

    后者结合了静态页面的速度优势和动态内容的更新便利性,成为企业网站建设的热门选择。 4. **企业网站制作流程**:从业务洽谈到网站交付,详述了企业网站制作的全过程,强调了美工设计、技术实施和客户反馈的重要性...

    浅谈网络XX环境下小学英语课堂有效性教学.pdf

    通过动态的多媒体资源,如影视片段、Flash动画、Webrint等,可以使教材内容变得生动有趣,静态的文字和图片转化为动态的画面,使得课堂信息量大增,提高学习效率。制作精良的多媒体课件应具备灵活性、美感和广泛参与...

    试谈公务员面试礼仪.doc

    1. **静态礼仪**:主要涉及应聘者的穿着和形象。男士应选择简洁、庄重的职业装,如深色西裤、皮鞋、浅色衬衫,夏季可穿带有淡色暗条纹的衬衫,避免佩戴过多装饰品。女士则需保持纯朴大方,夏季可穿长度适中的裙子...

    浅谈Python在科学计算中的应用.zip

    Matplotlib是Python最常用的可视化库,能生成各种静态、动态、交互式的图表,帮助科学家直观地理解数据。此外,Seaborn、Plotly、Bokeh等库提供了更多高级的可视化选项,满足了不同场景下的需求。 在机器学习和人工...

    数据库设计经验谈.pdf

    1. **考察现有环境**:在设计新数据库前,分析当前系统的优缺点,了解业务流程和数据流转,这有助于避免重复劳动并识别潜在问题。 2. **定义标准命名规范**:制定统一的命名规则,如表名的单复数、别名长度和格式,...

    用MATLAB解决数学分析中的图形问题.pdf

    此外,MATLAB的可视化建模和仿真功能支持复杂系统的建模和动态仿真,而图形功能则允许用户绘制出各种静态和动态的图形,包括二维、三维、极坐标和对数坐标图形等。 在数学分析教学与研究中,使用MATLAB可以更加方便...

    浅谈C#与matlab的混合编程

    随着软件开发领域对多语言协作的需求日益增长,不同编程语言间的相互调用成为了实现高效开发的重要手段之一。本文将深入探讨C#与MATLAB混合编程的方法及其应用场景。 #### MATLAB与C#混合编程的意义 - **提高效率*...

    C#微软培训资料

    语言语言 语言 C# 未来 未来未来 未来 5 年 年年 年 我们的目标就 我们的目标就我们的目标就 我们的目标就是超 是是 是 越今天各自为营的 超越今天各自为营的超越今天各自为营的 超越...

Global site tag (gtag.js) - Google Analytics