2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

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

关注

评论

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

掉入成功的深渊

Shinta

微服务从代码到k8s部署应有尽有系列(三、鉴权)

万俊峰Kevin

微服务 web开发 鉴权 go-zero Go 语言

MongoDB 数据实时同步利器-Tapdata Cloud 免费上手指南

MongoDB中文社区

mongodb

Flow vs Jenkins 实操对比,如何将Java应用快速发布至ECS

阿里云云效

Java 阿里云 cicd 云原生 ECS

如何应对数千微服务组件带来的挑战?

云智慧AIOps社区

php 架构 微服务 微服务架构 运维

ESLint-源码分析

Tone荣

前端 eslint

等保2.0政策之物联网安全扩展要求包括哪四个?

行云管家

云计算 物联网 等保 等保2.0 扩展要求

Flink 新一代流计算和容错——阶段总结和展望

Apache Flink

大数据 flink 开源 编程 实时计算

网易数帆大数据场景下的DataOps实践

网易数帆

大数据 数据治理 DataOps

网站开发进阶(六十二)最强大的 CSS 布局——Grid 布局

No Silver Bullet

页面布局 2月月更 Grid

快上车!第十七届全国大学生智能汽车竞赛百度创意组来啦

百度大脑

低代码实现探索(三十三)前端脚本公式

零道云-混合式低代码平台

MongoDB在信息资源共享建设的应用实践

MongoDB中文社区

mongodb

互联网应用开发如何搭上AI的快车?来厦门开发者Meetup一探究竟

百度大脑

Kaggle冠军解读:风电场短期风况预测任务方案

百度大脑

如何更好的使用TypeScript

Tone荣

前端 js ts js 转 ts

原生JavaScript灵魂拷问,你能答上多少(一)

战场小包

JavaScript 前端 2月月更

我提交了一个 pr,竟然是为了吃

AlwaysBeta

GitHub 开源 程序员 生活 程序员人生

震坤行工业超市研发效能提升之路

阿里云云效

云计算 阿里云 DevOps 云原生 研发

手把手教学电瓶车进电梯检测、多类别车辆追踪、异常行为检测产业级应用

百度大脑

Go学习笔记——复合数据类型

为自己带盐

Go 学习笔记 2月月更

向工程腐化开炮 | manifest治理

阿里巴巴终端技术

App 客户端开发 腐化治理 manifest

容器化 | 在 KubeSphere 中部署 MySQL 集群

RadonDB

MySQL 数据库 高可用 RadonDB KubeSphere

外包学生管理系统架构设计文档

Geek_36cc7c

中国 PostgreSQL 分会加入龙蜥社区,携手共建基础软件开源新生态

OpenAnolis小助手

postgresql Linux 开源

web前端开发Nodejs的C++ 拓展开发_前端培训

@零度

node.js 前端开发

全面解析湖仓一体与大数据演进历程|内含技术工具选型策略

云智慧AIOps社区

数据库 大数据 数据湖 Clickhouse 大数据运维

java培训:Netty的内存管理

@零度

Java Netty

堡垒机哪家好?贵不贵?作用是什么?

行云管家

堡垒机 等级保护 过等保 等保2.0

StarRocks Contributor 人数破百!极速统一,你我协力!

StarRocks

数据库 数据分析 StarRocks

网络标准之:永远是1.0版本的MIME

程序那些事

Java 网络协议 程序那些事 2月月更

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