技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 编程语言 --> 真正动态的动态语言

真正动态的动态语言

浏览:1629次  出处信息

    一加一等于几, 这是个问题

    某些所谓的动态语言是名不副实的 - 我称之为伪动态语言. 这些伪动态语言之所以是伪的, 是因为它们只是在代码层面的变量是动态的, 而它们的类型系统并不是真正动态的, 一个简单的例子, 考虑字符串能否直接和整数进行拼接成为一个新的字符串.

    当然, 语言维护者用另一个名词”类型强度(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”, 而不是写”甲乘以乙”, 就是同样的道理.

建议继续学习:

  1. 每个程序员都应该学习使用Python或Ruby    (阅读:16334)
  2. 敲击最多的键和编程语言语法    (阅读:5933)
  3. 为什么Lisp语言如此先进?(译文)    (阅读:5680)
  4. 编程语言的选择很重要    (阅读:4291)
  5. 编程语言的可读性    (阅读:3956)
  6. PHP很烂?我的看法    (阅读:3634)
  7. 几种计算机语言的评价(修订版)    (阅读:3293)
  8. 分清“语言/规范”以及“平台/实现”,以及跨平台.NET开发    (阅读:3232)
  9. php语言漫谈    (阅读:3160)
  10. 为什么我喜欢Lisp语言    (阅读:2992)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:浅谈编码
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1