真正动态的动态语言
一加一等于几, 这是个问题
某些所谓的动态语言是名不副实的 - 我称之为伪动态语言. 这些伪动态语言之所以是伪的, 是因为它们只是在代码层面的变量是动态的, 而它们的类型系统并不是真正动态的, 一个简单的例子, 考虑字符串能否直接和整数进行拼接成为一个新的字符串.
当然, 语言维护者用另一个名词”类型强度(type strength)”来表示这种行为, 然后把这种本质上不动态的行为称为”强类型(strong typing)”, 把真正的动态称为”弱类型(weak typing)”, 这样, 它们就可以心安理得地继续辨称自己所喜欢的语言是动态语言.
但我认为, “动态语言”的概念应该重新定义, “动态”应该脱离字面的意义, 去探究真正本质的动态.
类型动态转换的动态语言
1 + “1″ = ?
考虑”不动态”的 Java 语言的例子:
int i = 1; String s = \"1\"; i + s; // ?
“i + s”应该表示什么? 是字符串拼接, 还是整数加法? 先跳过这个问题, 大部分被称为动态语言的编程语言都能这样表示:
i = 1; s = \"1\"; i + s; // ?
大部分编程语言声明变量时不需要声明类型, 这种字面上的”动态”没有太多的用处, 象征意义更大. 虽然变量本身没有类型, 但还是会遇到刚才的问题, 到底是字符串拼接整数加法? 看看主流的编程语言是如何处理的:
编程语言 | 行为 |
---|---|
Java | 编译时异常 |
Python | 运行时异常 |
JavaScript | 字符串拼接 |
PHP | 整数加法 |
Java 的表现很容易理解, 但 Python 却报运行时异常, 显然, Python 不够动态. JavaScript 看到只要有一个参数是字符串, 就认为是字符串拼接, 这样预期就可以固定(某些语言根据参数的顺序来动态决定是何种操作, 导致有不同的预期). 而 PHP 另辟蹊径, 使用点号(“.”)符号来表示字符串拼接, 完美地解决了决策问题.
当然, 某些人并不认为 PHP 的解决方案是完美的.
动态属性的动态语言
对待 a.b.c 的态度; null 也是对象.
对”a.b.c”的处理方式决定一种编程语言是否是动态的. “a.b.c”表示对象 a 的 b 属性(也是一个对象)的 c 属性. 如果要操作 a.b.c, 不同的编程语言如何处理?
Object a = null; Object v = a.b.c; // ?
编程语言 | 行为 |
---|---|
Java | 编译时异常 |
Python | 运行时异常 |
JavaScript | 运行时异常 |
PHP | v = null |
Java, Python 和 JavaScript 都报了异常, 只有 PHP 能正常执行(假设关闭了 E_NOTICE). 这一个小小细节, 体现了一种编程语言的(对程序员)友好程度. 对于报了异常的语言, 程序员必须繁琐地进行”是否定义”的判断, 例如 JavaScript:
a = null; if(a != undefined && a.b != undefined && a.b.c != undefined){ v = a.b.c; }
而 PHP 却非常简单:
$a = null; $v = $a->b->c;
PHP 处理方式有什么好处? 假设 a 是用户的 profile, b 是用户的配置, 而 c 是用户配置的其中一个配置项, 表示用户是否接收邮件通知. 那么, 业务上会有两种考虑: 是否需要用户明确地表示其接受或者拒绝之后, 才做判断是否发送?
如果业务需要, 用户必须配置过这个选项之后, 才决定是否发送邮件, 否则不发送(默认不发送). PHP 可以简单地判断:
if($a->b->c){ // sendmail }
或者业务需要, 只要用户不拒绝, 就发送邮件(默认发送). PHP 还是可以简单地判断:
if($a->b->c !== 0){ // 用了强类型判断 // sendmail }
PHP 的这种能力叫做”和业务逻辑的简单对应”, 也就是说, 人的每一项思维都可以用编程语言的一个表达式来很好地表示, 这才是真正的动态语言. 我想, 这也是 PHP 为什么如此流行的原因(我以前从不同的角度谈过PHP的优势). 当然, PHP 还有一些缺点, 例如不够对象化, 函数不是对象, GC 不成熟等.
所以, 我们还是需要一种新的动态语言, 但应该是足够”动态”的.
后记
脱离低级趣味的语言之争.
类型系统是编程语言最本质的因素, 语法是其外衣, 而类库的丰富程度是语言自身能力的最直接体现.
类型系统才是编程语言是否接近人类思维的判断标准, 而某些编程语言把关键字”null”改成”nothing”, “{}”改成”begin … end”类似的大量使用英文单词的做法, 无非是一种无关紧要的个人喜好, 如果非要说成是对人亲切, 那就是本末倒置了. 我们写”a * b”, 而不是写”甲乘以乙”, 就是同样的道理.
建议继续学习:
- 每个程序员都应该学习使用Python或Ruby (阅读:16250)
- 敲击最多的键和编程语言语法 (阅读:5781)
- 为什么Lisp语言如此先进?(译文) (阅读:5606)
- 编程语言的选择很重要 (阅读:4265)
- 编程语言的可读性 (阅读:3930)
- PHP很烂?我的看法 (阅读:3607)
- 几种计算机语言的评价(修订版) (阅读:3267)
- 分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发 (阅读:3155)
- php语言漫谈 (阅读:3137)
- 为什么我喜欢Lisp语言 (阅读:2966)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:ideawu 来源: idea's blog
- 标签: 动态语言 语言
- 发布时间:2012-07-30 23:52:19
- [68] Go Reflect 性能
- [68] 如何拿下简短的域名
- [67] Oracle MTS模式下 进程地址与会话信
- [62] IOS安全–浅谈关于IOS加固的几种方法
- [61] 图书馆的世界纪录
- [60] 【社会化设计】自我(self)部分――欢迎区
- [58] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [49] 给自己的字体课(一)——英文字体基础
- [48] 读书笔记-壹百度:百度十年千倍的29条法则