NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

编程语言:功能越强自由越少?

  • 2008-03-25
  • 本文字数:1604 字

    阅读完需:约 5 分钟

C#最近一直在增加新特性以变得更加强大,Java 也在步其后尘。当它向开发者提供更多的自由时,其是否会变得越来越强呢?一种语言是否需要提供高度的自由和灵活性才能变得强大?

Reg Braithwaite 深信未必如此。在回应 Azubuko Obele 的论调“希望语言变得强大的人们实际上是希望有更多的自由”时,Braithwaite 声称强大与自由之间根本没有因果关系,即使在很多语言中这两者都是相互关联的,比如 Ruby。根据 Reg 所述,Python 是“一个比 Java 强大的多的语言”,尽管这两者都是“根据如下哲学构建的:适当去除开发者的自由会生成更好的程序”。在 Python 中,特性之所以被去除不是因为他们可能被误用,而是由于他们被认为是不必要的。这既可能是因为已经存在了“一个完美的方案”来获得期望的结果,也可能是因为这些特性关心的是“不重要”的东西,比如“缩进”。但是如果这些特性能“适合 Python 的风格和设计艺术”,这种方式并不会阻止向语言中增加新的特性。

一些函数式语言也增加了严格的规则,但这并不意味着他们就不强大:

通常情况下,Haskell 可能是限制最严格的语言:一种方式可以做所有的事情,这就是数学上纯函数式语言。你有强大、富有表现力的静态类型 […]

同样,Factor 编程语言对开发者施加了一种单一的约束规则集:转向 Factor 的开发者必须放弃本地变量以获得 Factor 的更高层次的编程能力。

因此,Reg 认为“语言可以提供更强功能的同时也(自相矛盾地)提供了更多的规则以及更少的自由”。按照他的说法,真正重要的事情是遵循指导理念而且保持语言一致性的精心设计。那么语言就能以事半功倍的效果提供更多的能力,同时它还可以不断成长而不会“抛出更多 [通常是不相关的] 的特性”。

在任何领域,好的设计都会做到事半功倍。而在差的设计下,增加新的能力将需要添加更多的检查框、更多的特性、更多的做事方法(彼此间还会产生干扰)。

在分享 Braithwaite 的能力与自由并没有必然联系的观点时,评论员之一 Daniel 认为一种语言的能力不依赖于它施加到开发者上的规则,而是依赖于它所提供的“计算机语言定理”:

计算机语言并不类似于规则,而是类似于数学。[…] 所以可以将其与代数相比。你拥有的定理越多,你就会变得更强大。定理是自由的吗?当然不是。定理是基本的原理,我们可以将其组合起来以获得更多的成果。

根据 Daniel 所述,造成语言之间差异性的原因在于他们所提供的定理在多大程度上是人脑便于处理的结构:

例如,机器码中并没有我们所熟知的“for”循环。你可以使用的仅仅是基于 CPU 标志的条件跳转。 然而由此我们发明了一个非常有用的结构,这就是“for”循环。

现在,尽管“for”循环是一个非常强大的结构,但它也经常被滥用。很少有人真正能在他们脑子中模拟“for”循环,因此该结构中的错误不胜枚举。

现在,“foreach”(list iterator 或者 mapper)结构可能不像“for”结构那样灵活,但它更容易理解。

Daniel 提倡使用这种容易理解的结构,因为它降低了误用的风险并且使得语言更加“容易编写出正确的程序”。尽管这些结构可能“既强大又易用”,但事实并非总是如此,一些容易被误用的“定理”实际上更加强大。所以,自由与强大之间不但没有必然联系,而且我们很有可能为了代码质量而放弃一些强大的功能。

如果不考虑概念上的差异,这两种方式并不是截然对立的。基于 Reg 和 Daniel 的论点,我们可以得出如下结论:语言需要精心设计以保证不同特性之间的一致性,并且提供对人脑有意义的结构来降低误用的风险以及提升代码质量,这样的语言才是真正强大的语言。

查看英文原文: Programming Languages: More Powerful with Less Freedom? - - - - - -

译者简介:张龙,同济大学软件工程硕士,现就职于理光软件研究所。主要从事文档工作流和办公自动化解决方案的研发工作。热衷于 Java 轻量级框架的研究,对敏捷方法很感兴趣。曾有若干年的 J2EE 培训讲师经历。参与 InfoQ 中文站内容建设,请邮件至 china-editorial[at]infoq.com

2008-03-25 04:13635
用户头像

发布了 88 篇内容, 共 258.6 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

Mybatis【16】-- Mybatis多对一关联查询

秦怀杂货店

数据库 mybatis

传统线程互斥技术 synchronized

武哥聊编程

Java 多线程 synchronized 28天写作

深入浅出Android!阿里P7深入Binder原理讲解,论程序员成长的正确姿势

欢喜学安卓

android 程序员 面试 移动开发

架构师训练营第 2 期 第 7 周 作业一

老腊肉

架构师训练营第2期

阿里一线架构师甩出“源码阅读指南”,从源码到实战,一键搞定

比伯

Java 编程 程序员 架构 计算机

BAT面试Spring全家桶:Spring+SpringBoot+SpringCloud+SpringMVC

Java架构之路

Java 程序员 架构 面试 编程语言

阿里内部Redis宝典意外流出极致经典:源码+实战+理论

比伯

Java 编程 程序员 架构 面试

奇葩java迭代器笔试题,做对算你厉害

田维常

迭代器模式

面试官问:ZooKeeper是强一致的吗?怎么实现的?

Java 编程 程序员 面试 分布式

成长篇-结构思考力笔记(完整版)

小诚信驿站

程序员 刘晓成 小诚信驿站 成长笔记 28天写作

谁,是产品的利益相关方?

不离

极客大学认识产品经理 极客大学产品经理训练营 跟着二爷学产品

软件教练说:性能优化与性能设计,“相亲相爱”的一对

华为云开发者联盟

架构 性能优化 设计 程序 软件教练

产业互联网业务与团队的思考

陈俊

蚂蚁金服二面被血虐,鬼知道面试的我经历了什么?

Java架构之路

Java 程序员 架构 面试 编程语言

JVM笔记 -- Java跨平台和JVM跨语言

秦怀杂货店

JVM JVM笔记

半导体芯片小白基础知识(2) (28天写作 Day23/28)

mtfelix

集成电路 28天写作 晶圆 光刻机 晶圆代工

贪心算法

en

算法 贪心算法

jdk8 String和StringBuilder对象创建所在位置

ilovealt

Java string StringBuilder

《小狗钱钱》读书笔记

架构精进之路

读书笔记 七日更 28天写作

Redis击穿、穿透、雪崩产生原因以及解决思路

Java架构师迁哥

学习JAVA8个月,成功跳槽,外包进阿里成功定级P7,太牛了!

Java 编程 程序员 面试

产品经理训练营笔记-产品思维和产品意识(下)

.nil?

产品经理训练营

架构师训练营第 2 期 第 8 周 作业一

老腊肉

架构师训练营第2期

故乡的年

熊斌

28天写作

老外程序员的Java性能优化方式是什么?JVM调优策略+工具+技巧

Java架构追梦

Java 学习 架构 面试 jvm调优

30+程序员竞争力从哪里来?

我心依然

程序员 竞争力

真狠!涵盖了Netty+Spark+Hadoop+分布式五部分!讲的清清楚楚!

996小迁

redis hadoop 架构 面试 Netty

Java学习笔记整理:Spring+tomcat+Kafka+多线程面试笔记

Java架构之路

Java 程序员 架构 面试 编程语言

NeoKylin-Server-5.0离线部署etcd+flannel集群,实现docker容器跨主机网络通信

星河寒水

Docker etcd flannel 麒麟操作系统 离线部署

《程序员修炼之道》- 务实的方法(5)

石云升

程序员 28天写作 评估工作量

真正牛逼的人,都是极简主义者!!

冰河

产品 程序 极简主义

编程语言:功能越强自由越少?_Java_Sadek Drobi_InfoQ精选文章