写点什么

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

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

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

关注

评论

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

开发一套高容错分布式系统

JAVA活菩萨

Java 程序员 后端 java程序员 java编程

荣耀发布开发者服务平台,智慧生态合作提速

荣耀开发者服务平台

荣耀互联对外开放,赋能智能硬件合作伙伴,促进全场景生态产品融合

荣耀开发者服务平台

倒数 3 天|RocketMQ 能力全景图即将发布,定义下一代消息队列未来方向

阿里巴巴云原生

阿里云 RocketMQ 云原生 消息队列

【K8s入门必看】第三篇 —— K8s必备基础概念大梳理

Albert Edison

Docker Kubernetes 容器 云原生 8月月更

服务器

武师叔

8月月更

字节二面被问到mysql事务与锁问题,我蚌埠住了

程序员小毕

Java MySQL 数据库 程序员 面试

JWT主动校验Token是否过期

源字节1号

软件开发 后端开发

框架整合(二)- 使用Apache ShardingSphere实现数据分片

大菠萝蜜

MySQL 8月月更

基于 eBPF 的 Kubernetes 可观测实践

阿里巴巴云原生

阿里云 Kubernetes 云原生 可观测

web前端培训课程哪个比较好?

小谷哥

基于YOLOV5行人跌倒检测实验

阿炜小菜鸡

8月月更 行人检测

《机器学习的随机矩阵方法》

计算机与AI

Python 机器学习 数学

【注册荣耀开发者】赢【荣耀70】手机

荣耀开发者服务平台

开发者 手机 活动 应用 荣耀

什么是内部客户服务?

Geek_da0866

正畸MIA微种植体支抗技术中国10周年交流会在沈举办

联营汇聚

全新出品!Github总榜排行第七的SpringCloud生态全栈笔记我粉了

JAVA活菩萨

Java 程序员面试 大厂技能 秋招 大厂面经

【web自动化测试】Playwright快速入门,5分钟上手

和牛

自动化 测试 playwright Python. 8月月更

OpenInfra Days China 2022|SelectDB与你共享 Apache Doris 在互联网广告业务中的实践

SelectDB

MySQL 数据库 数据仓库 数据湖 Doris

WEB前端面授培训课程

小谷哥

荣科科技:未来主要围绕在线互联化、生态化和智能大数据运营这三个方向发展

BeeWorks

深圳大数据培训多长时间可以找工作

小谷哥

企业即时通讯软件有哪些功能?对企业有什么帮助?

BeeWorks

数据库治理的探索与实践

阿里巴巴云原生

数据库 阿里云 微服务 云原生

如何模拟后台API调用场景,很细!

Liam

前后端分离 开发 Postman API 前后端协作

目标检测的发展与现状

阿炜小菜鸡

目标检测 8月月更

视频目标检测

阿炜小菜鸡

8月月更 视频目标检测

经验分享|盘点企业进行知识管理时的困惑类型

Baklib

《机器学习理论到应用》电子书免费下载

计算机与AI

Python 机器学习 数据科学

运力升级助力算力流转,中国数字经济的加速时刻

脑极体

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