【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

  • 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:13627
用户头像

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

关注

评论

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

云中谁寄锦书来,免费生成一封七夕情书吧

郭旭东

阿里云 七夕 云效

区块链数字钱包定制开发,数字货币钱包开发费用

13530558032

智能化转型将加速数字经济变革

CECBC

人工智能 数字经济

Python3 单例模式

王坤祥

Python Singleton

CECBC区块链专委会副主任吴桐主讲成都市委宣传部区块链和数字

CECBC

区块链 数字货币

ARTS 挑战打卡第十四周(200810-200816)

老胡爱分享

ARTS 打卡计划

区块链承兑商支付系统开发,USDT支付软件搭建

13530558032

话题讨论 | 作为一名程序员,沟通能力是否重要?

InfoQ写作社区官方

程序员 写作平台 话题讨论

Tencent AI Lab 日常实习生招聘

InfoQ_d00afcd122a8

招聘

永续合约交易系统源码开发,合约交易所开发

13530558032

银行热衷拿区块链专利 背后有何意图

CECBC

区块链 银行

有益思考一则:框架性思维

石君

学习 方法论

SpreadJS 纯前端表格控件应用案例:资料填报系统

葡萄城技术团队

为什么会出现零代码开发平台?

代码制造者

编程语言 低代码 企业信息化 零代码 编程开发

一次开零售店的经历(1)

石云升

零售店

云算力挖矿平台APP,一站式云算力挖矿系统开发

13530558032

一次开零售店的经历(2)

石云升

零售店

第11周学习总结

赵龙

青山不改,绿水长流

escray

学习 面试

PostgreSQL函数、索引和视图操作Demo展示

王坤祥

postgresql

阿里为什么推荐使用LongAdder,而不是volatile?

王磊

Java 性能 volatile

悬挂引用是如何被Rust消灭的?

袁承兴

rust 内存模型 指针 引用 泛型

Java中的volatile关键字

王坤祥

Java volatile

用Emoji解释编程语言中的map、filter、reduce

王坤祥

Python Python PEP

第11周作业

赵龙

SpreadJS 纯前端表格控件应用案例:PtLims云平台

葡萄城技术团队

SpreadJS 纯前端表格控件应用案例:物业行业全面预算管理系统

葡萄城技术团队

游戏运营方法论

石云升

游戏化运营 运营创新

oeasy教你玩转linux010104灵魂之问whatis

o

有它的加持,单机玩转百亿大数据不是梦!

易观大数据

ARTS 挑战打卡第十五周(200817-200823)

老胡爱分享

ARTS 打卡计划

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