静态语言 or 动态语言

写给已经掌握不止三门语言的程序员看

静态语言 or 动态语言

  1. 强类型语言(静态类型语言): 需要进行变量/对象类型声明的语言,一般情况下需要编译执行。例如C/C++/Java/C#
  2. 弱类型语言(动态类型语言): 不需要进行变量/对象类型声明的语言,一般情况下不需要编译(但也有编译型的)。例如 Ruby/Python/Perl/JavaScript/UnixShell等等。

动态语言在概念上属于运行时的范畴,静态验证在概念上属于编译的范畴

引子

记得当初(大概今年五月份左右)看了《黑客与画家》虽然很佩服文中所说的动态语言的“威力”——可以以静态语言1/5内的代码量完成同样的事。但还是很迷惑,为何这样。

js、python 读《黑客与画家》之前我也学过一点,不过只能算是知道语法,代码不超过1k 行,门都不算入了吧。那时候我还是一个安卓开发者,熟读 thinkinjava,还写过 右边的博客系列笔记,还经常分享给java 已入门想要初步进阶的人看。

《黑客与画家》: 一百年后的语言

章节全文

摘录:

很难预测一百年后的人类生活,只有少数几件事是可以确定的。那时,汽车将具备低空飞行能力,城市规划的法规将放宽,大楼可以造到几百层,大街上一天到晚看不见太阳,女性个个都学过防身术。本文只想讨论其中的一个细节:一百年后,人们使用什么语言开发软件?

我认为,编程语言就像生物物种一样,存在一个进化的脉络,许许多多分支最终都会成为进化的死胡同。这种现象已经发生了。Cobol语言曾经流行一时,但是现在看来没有任何后续语言继承它的思想。它就像尼安德特人①一样,进化之路已经走到了尽头。

我的判断是,那些内核最小、最干净的编程语言才会存在于进化的主干上。一种语言的内核设计得越小、越干净,它的生命力就越顽强。

你可能认为只有那些自以为是的人才会去预言一百年后的技术。但是,请不要忘记,软件发展的历史已经走过了50年。在这50年中,编程语言的进化其实是非常缓慢的,因此展望一百年后的语言并不是虚无缥缈的想法。

编程语言进化缓慢的原因在于它们并不是真正的技术。语言只是一种书写法,而程序则是一种严格符合规则的描述,以书面形式记录计算机应该如何解决你的问题。所以,编程语言的进化速度更像数学符号的进化速度,而不像真正的技术(比如交通或通信技术)的进化速度。数学符号的进化是缓慢的渐变式变化,而不是真正技术的那种跳跃式发展。

既然在现实中一些应用程序本身的效率较低,而另一些应用程序会耗尽硬件提供的所有运算能力,那么有了更快速的计算机就意味着编程语言不得不应付更多的极端情况,涵盖更大范围的效率要求。我们已经看到这种情况发生了。要是以几十年前的标准衡量,有一些使用新语言开发的热门应用程序对硬件资源的浪费非常惊人。

不仅编程语言有这种现象,这实际上是一种普遍的历史趋势。随着技术的发展,每一代人都在做上一代人觉得很浪费的事情。30年前的人要是看到我们今天如此随意地使用长途电话,一定会感到震惊。100年前的人要是看到一个普通的包裹竟然也能享受一天内从波士顿发件、途经孟菲斯、抵达纽约的待遇,恐怕就要更震惊了。

恍然大悟

后来暑假写了一个多月的 python, 一个知乎第三方 pc 客户端,也就是 zhihurss 项目 写的也是呕心沥血——主要是当时学校里的数据库课程让我写 sql 写恶心了,然后自己一时冲动不用数据库了,自己维护了一个小型的用 json 储存数据(九月的时候学了学 node,发现原来我写的和 mongodb 几乎是一个东西啊……不过我的那个是微型的)。

除此之外我是实实在在感受到了,动态语言的威力了的,于是乎弃掉 静态语言的代表 java 了。

说实在的,动态语言真的潜力无限,我列举几点优点吧,也可以当做上文的 “可以以静态语言1/5内的代码量完成同样的事” 的我的理解吧。

我理解的动态语言的好处

一、灵巧

  1. 大部分动态支持函数对象,可以把函数作为参数传递。
  2. 函数的参数列表对参数类型无要求,这样就摆脱了静态语言的庞大的类型系统的限制(尤其在 xx 框架里编程时)。
  3. 可以运行 REPL , 使得写代码本身可以变的很灵巧。
  4. mixin 特性:比如运行时能动态的增加类的属性方法、甚至更改继承结构等等

二、更具表达力

  1. 省代码,代码量越少,bug 出现的可能性也会相应少。
  2. 更具表达力,编程所关心的不再是变量的类型,而是变量能做什么。
讨论

蛇神:静态本身不限制表达力,表达力和语言的设计有关

我:是动态语言的设计很方便进化吧,无论是语言标准,还是第三方库的扩充语言本身。

蛇神:不能归因于静态动态

我:采铜的话就是 不能归咎于单因素的原因。
所以现代编程语言(scala、 python等),都应该具有超强的表达力,无论静态还是动态

我所理解的坏处

  1. 动态类型 导致不利于自动补全、不能做类型检查会隐藏错误(所以应当养成一边写一边调试的好习惯,其实无论动静态)
  2. 不利于优化导致运行效率相对低(这个可以依赖黑科技来加速,比如 pypyv8引擎)

我的总结

所以语言的选择上并不是有高低之分的,每一种当下流行的语言,自有它本身独一无二的价值,而且除了语言本身,语言发展的沃土是平台(linux、web、安卓、ios),语言本身也在不断进化中,特别是 js 最近几年进化不少。

而程序员可以根据自己的喜好选择,也应该根据需求。

一些说的不错的观点

来自Steve Yegge的观点

Steve Yegge一直以来致力于提倡和推广动态语言。他在斯坦福大学的一个发言对动态语言进行了深入的阐述,最近他将此发言的文稿贴在了博客上,不料此话题在博客圈子里引起了不小的反响。他认为静态语言已经发展到了极限,而动态语言相对来说却能给开发者提供更大的空间。虽然承认目前动态语言在性能、可维护性和开发工具上都存在一些问题,但他认为这些问题都不是无法解决的,动态语言推广的主要障碍是业界对尝试新语言的态度不是很积极。

动态语言为什么不够火

他认为目前动态语言在性能、可维护性和开发工具上都存在一些问题,但他认为这些问题都不是无法解决的,动态语言推广的主要障碍是业界对尝试新语言的态度不是很积极。

动态语言的优势

他认为静态语言已经发展到了极限,而动态语言相对来说却能给开发者提供更大的空间

Ted Newward

选择语言的标准应该是:

  1. 拥有表达人脑中概念的能力
  2. 拥有随着人脑中概念的演进而演进的能力

Ola Bini

也发表了类似的观点。他认为每种语言——强静态、弱静态和动态——都有各自的优势和缺点,生拉硬扯的比较是没有意义的。我们应该选择最适合目标应用的语言

文章目录
  1. 1. 静态语言 or 动态语言
    1. 1.1.
      1. 1.1.1. 引子
        1. 1.1.1.1. 《黑客与画家》: 一百年后的语言
          1. 1.1.1.1.1. 摘录:
      2. 1.1.2. 恍然大悟
      3. 1.1.3. 我理解的动态语言的好处
        1. 1.1.3.1. 一、灵巧
        2. 1.1.3.2. 二、更具表达力
          1. 1.1.3.2.1. 讨论
      4. 1.1.4. 我所理解的坏处
      5. 1.1.5. 我的总结
    2. 1.2. 一些说的不错的观点
      1. 1.2.1. 来自Steve Yegge的观点
        1. 1.2.1.1. 动态语言为什么不够火
        2. 1.2.1.2. 动态语言的优势
      2. 1.2.2. Ted Newward
        1. 1.2.2.1. 选择语言的标准应该是:
      3. 1.2.3. Ola Bini
,