惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
S
SegmentFault 最新的问题
Project Zero
Project Zero
D
DataBreaches.Net
I
InfoQ
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Vercel News
Vercel News
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
I
Intezer
The Hacker News
The Hacker News
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
Help Net Security
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Scott Helme
Scott Helme
T
Threatpost
爱范儿
爱范儿
N
Netflix TechBlog - Medium
D
Docker
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
K
Kaspersky official blog
H
Help Net Security
S
Secure Thoughts
T
Threat Research - Cisco Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
G
Google Developers Blog
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
B
Blog
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
Simon Willison's Weblog
Simon Willison's Weblog
S
Securelist
P
Privacy International News Feed
Spread Privacy
Spread Privacy
The Last Watchdog
The Last Watchdog

hsfzxjy 的博客

解决 VSCode + CMake + MSVC 编译器信息乱码的问题 使用 3090 部署 1.58bit 动态量化版 DeepSeek R1 671b 如何在 VS Code DevContainer 中配置 HTTP 代理 如何在跳板机背后的服务器上使用 VS Code Remote - Containers Cohesive Digests for Ints and Floats Rust 中的隐匿概念 —— Place(位置) 美术馆 一尺之槌,日取其半,1075日而竭 老生常谈:使用 Cloudflare 自选 IP 加速站点访问 辩义 State、Nation 与 Country 将 Base64 编码的数据快速转换为 Uint8Array 折腾 NPU·第1章 —— 搭建 Level Zero 开发环境 折腾 NPU·第0章 —— Intel NPU 概述与 Level-Zero 新增域名 monad.run CSS 中为特定字符设置不同字体 Arbitary Lifetime Transmutation via Rust Unsoundness Dijkstra 算法的延伸 Manacher 回文计数算法 硬卧 Go Fact: Zero-sized Field at the Rear of a Struct Has Non-zero Size Display *big.Rat Losslessly and Smartly in Golang 代码的仪式 Building Electron From Scratch 中式亲属称谓研究之一:构建半群 Some Notes on Kotlin Coroutines Git sparse-checkout and partial clones for Mega-Repos 辩义“封建” Diving from the CUDA Error 804 into a bug of libnvidia-container Modern Cryptography, GPG and Integration with Git(hub) Move the Root Partition of Ubuntu A New Programmer Kicks a Roadblock Git-based Dependencies in Dart and Go Reversy Naming 人类一败涂地 Invalid Golang Pointers Can Bite You Even If You Don't Dereference Side Project(副业) A Flaw of Promoting Complex Trait Bounds in Rust Initialize Process Pool Worker with Individual Value Rust - Python FFI From Scratch [Extending Hexo For My Site] Part 1 [Extending Hexo For My Site] Part 0 Debug a 'torch.tensor(1).cuda()' hanging 不自由的互联网 Retrieve Contents over HTTP without curl or wget [Unravelling mocona] Part 1 - Verbosity or Anti-Pattern [Unravelling mocona] Part 0 - Preface Understanding pickle in Python Rough Notes on Deploying Vaultwarden & NextCloud Bookmarks Demystify the randomness in CUDA kernels Performant Bulk Mutations in IndexedDB Auto Rebuild .pyx Files with pyximport Cython and Threads Obtain a Random Available TCP Port with Bash Information Theory: KL Divergence Information Theory: Entropy and Mutual Information 铁板烧 西郊线 Proof of the Gumbel Max Trick Option::as_ref Rc, RefCell and Interior Mutability Visualizing Correlation 三月十日杂感 三月一日杂感 二月十一日杂感 一月二十六日杂感 SS Configuration 一月七日杂感 四月·病 Haskell 笔记:State Monad Haskell 笔记:Monad 引论 Haskell 笔记:Applicative Haskell 笔记:Category Theory and Functor Haskell 笔记:data, type, newtype Haskell 笔记:folds 使用 Aria2 在 Ubuntu 中下载百度云资源 从伪并行的 Python 多线程说起 一个 Reentrant Error 引发的对 Python 信号机制的探索和思考 Linux 文件权限 HSFZMUN 4.0 部署小记 午后雨·科大 最后的雨夜·广州 揭秘·变态的平方根倒数算法 神坑·Python 装饰类无限递归 Python“黑魔法”之 Encoding & Decoding Ubuntu 重新映射键盘布局 为什么我要翻墙 Python“黑魔法”之 Generator Coroutines 数学美 之 判断线段相交的最简方法 除夕杂感 17 行代码实现的简易 Javascript 字符串模板 Python“黑魔法”之 Meta Classes 诗集 生活,需要被“发现” 家书·十八岁成人礼 炫技?还是需求? 【译】响应式图片的现状 【译】“为什么有这么多的编程语言?” Wisecity 商赛总结——也谈前端自动化测试 记一次 DoS 诈骗网站的经历 那一年,我们望向星空
语言狂热者与实用主义者
2021-07-08 · via hsfzxjy 的博客

编程语言界有着一场旷日持久的争论。人们会为了一种(或一类)语言,或是自己熟用的,或是自己所欣赏的,与他人吵得不可开交。而争论的起点,可能只是某人一句小小的抱怨。各方各为其主,剑拔弩张,俨然一次声势浩大的圣战。

尽管众语言不可一概而论,我们还是可以粗略地将争论的人群分为两个派别:语言狂热者与实用主义者。这是光谱的两个极端。语言狂热者关注语言本身,或是钟情于新的、现代化的语言特性,并据此评判一种语言;实用主义者则侧重于语言的工程实践,常会以语言的生态、业界使用率反驳他人。当然,也不乏两者兼具的人,对双方的意见各持有一定比例。

语言狂热者通常是学院派,多少接触过一些编程语言理论(PLT)。PLT 通常是从 $\lambda$ 演算展开论述的,因此他们也偏爱函数式编程,并希望语言有相关的概念或语法糖支持、简化函数式编程。他们会关注语言是否有完备的类型系统,是否有一等函数,是否有完备的泛型支持等。其中有一定工业背景的,还会考察是否有协程支持、零开销抽象及元编程能力等问题。从广义上看,这里面的大多数都属于语法糖。一门图灵完备的语言都可以实现以上特性,只是冗杂与否的不同罢了。语言狂热者关注语言的抽象能力,函数式编程有助于抽象高阶的逻辑,类型系统则有助于建模问题,为程序的优化与检查提供信息。这是支撑大部分狂热者行动的背后逻辑。但也不乏只注重表象者,单纯为了语法糖而语法糖,为了函数式而函数式。他们支持语法糖的理由是「酷炫」,同时会在实践中滥用函数式编程,甚至攻击其他的编程范式。

实用主义者则通常不太关心语言的特性。相反,他们会考察语言的生态、使用频度与工业部署能力。如果一门语言有强大的生态,使用人数多,或是工业部署方便,那它就是好的语言。至于语言特性,够用就行。实用主义者常常会认为语言狂热者花里胡哨,认为其所关注的问题并不能带来生产力的提升。他们认为语言能发展到如此体量,语言本身肯定是完备的,「如无必要,勿增实体」。而事实上,影响语言流行度的不止有语言本身的因素,还有社会学的因素。简单的语言通常门槛更低,可以让更多的人涌入相关行业,从而带动整个生态。但这也意味着语言能力有限,或多或少有些恼人的缺点。而其设计中的不足,或是因为创建的年代过于久远,没有现代编程语言理论的指导,或是由于历史包袱,或是由于创建者的个人品味。这些问题算不上致命,否则这些语言也不会达到如此大的体量。但它们冷不丁会出来烦扰你,让你感觉不是滋味。为此,在语言的发展过程中,其使用者会做出许多努力以弥补这些缺陷。如对于抽象能力不足的语言,使用者会总结出各种设计模式为工程解耦服务。当今所流行之设计模式,有好些就是 Java 所专有的。一个语言的设计缺陷也许在另一个语言中已经被解决了,自然也就不需要相关的设计模式。极端的实用主义者同时也是保守主义者,排斥或是抵触其他新兴语言,甚至对待本语言中的新特性也是如此。

这其中并没有哪一者是「绝对正确」的。语言狂热者的主张是美好的,但基于这些主张的语言通常有着陡峭的学习曲线,以致曲高和寡。而学习门槛的上升通常也意味着更高的人力成本。现代软件工程不只是一个技术问题,更是一个社会问题。如果两种解决方案都能达到同样的目的,资本家会选择成本更低,风险更小的一种。而实用主义者所青睐的语言有着更大的使用者基数,以及因此带来的大规模生态,这通常是资本家所需要的。语言狂热者善于从历史中发现各语言优秀的一面,并依此引导编程语言的改进。实用主义者则致力于发展生态,而其中一些建设性的东西往往是为了弥补语言的缺陷——这通常也为语言狂热者带来新的思考。二十年前几乎没有语言内置了对协程的语法支持,这是由当时硬件条件所限。而为了更有效地利用多核资源,各语言的生态中都先后出现了类似「绿色线程」的库,这也是协程的雏形。现代语言的协程语法正是脱胎于此。

但两个阵营中都有趋于封闭保守的成员,他们通常也是争论的发起者。一方是形而上「现代编程语言」的爱好者,一方则是满足于现状。他们在实践中更容易做无用功。前者会过度或盲目使用语言的特性,会将问题复杂化;而后者则会因语言抽象不足设计出繁冗的程序,即便有更简洁的解决方案。这些立场都是无益的,需要我们有所规避。


作者:hsfzxjy
链接:
许可:CC BY-NC-ND 4.0.
著作权归作者所有。本文不允许被用作商业用途,非商业转载请注明出处。