mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
2330 字
6 分钟
对编程语言的一些思考
2026-03-04
统计加载中...

前言#

今天在学习 Java 语言的时候,老师一直在强调 Java 是从面向过程到面向对象的转变,我们必须学会面向对象的思维。

我当时的第一想法是:什么面向对象,C++ 里面的 std::cin 不也是面向对象吗。

我在之前接触过许多语言,但一直对 Java 这种八股文形式的语言有着极大的偏见,于是便起了兴趣。


从汇编到 Java#

原始人时代 - 汇编#

最早的程序员是在纸带上打孔,直接写 01 的机器码来控制庞大且昂贵的计算机,当然也有通过磁芯绳索存储器来进行物理级“编”程的。

但是人类的大脑根本不是为记忆海量二进制指令而生的,这要是错了点啥,整个系统 boom~

这种低级的效率使人们发明了汇编语言,它用简单的英文助记符(比如 MOVADDJMP)代替了冰冷的二进制串。

从这个时候开始,计算机里面才有了语言的影子。

汇编语言的编译器会将汇编语言的指令转换成二进制指令,然后交给 CPU 执行。

但是吧,随着计算机的普及,市面上开始出现大量不同架构的 CPU,而汇编语言的编译器只能针对某一个架构的 CPU,也就是我们常说的 CPU 指令集。

总不可能每个 CPU 都重新写一份程序吧?于是新的时代出现了。

大航海时代 - C 语言#

我省略了很多细节,只是大概说明一下发展过程

可能是因为重复造轮子导致产能枯竭,汇编那种代码居然跟不上硬件的发展速度,所以以 C 语言为代表的高级结构化语言横空出世。

其实到这里已经体现了抽象的思路:抽象了底层的寄存器和内存,引入了函数、变量、if/while 等控制流,并交由“编译器”去翻译成不同 CPU 的汇编。

所以说我们基本上从一开始就展现出了抽象,但那时是对于汇编语言的抽象,而 C 语言更符合我们直觉中的思路,所以也就是现在所说的面向过程编程。

流水线 - Java#

面向对象的思路出现了,它将人们从简单的思维过程,转向了对象;从算法(第一步做什么,第二步做什么)到了实体(系统里有哪些角色?它们之间有什么关系?)

明明我们有了 C 语言,甚至后来发展出了 C++,但为什么还需要 Java 这种极致的面向对象(OOP)语言的诞生?

Java 对 C++ 的真正“革命”不在于发明了 OOP,而在于做减法和加法。

一个项目达到一定规模的时候,谁改了全局变量、谁忘记释放内存,谁写的代码有什么问题,根本查不清,这对注重效率和产能的团队来说,是致命的。

  • 减法(降低心智负担):砍掉了 C++ 里极其容易出错的指针操作和手动内存管理(引入了垃圾回收机制 GC)。你前面提到的“谁忘记释放内存根本查不清”,正是 Java 解决的核心痛点。

  • 加法(跨平台):引入了 JVM(Java 虚拟机),真正实现了“一次编写,到处运行”。

Java 把编程从“个人英雄主义的艺术创作”变成了“标准化、可替换的工业流水线”。它通过极其严格的规范和面向对象的抽象,限制了程序员的自由发挥,从而降低了大型项目开发中的心智负担。它不依赖单个天才的灵光一现,而是保证了一个百人团队即使水平参差不齐,也能像齿轮一样咬合,拼凑出庞大且能稳定运行的商业系统。

所以说我们学习 OOP,本质在于妥协,妥协性能,妥协底层的设计,然后换来了极大的工程效率(更容易协作、更容易测试、更容易在大规模团队中维护)。

就好像为了代码的拓展添砖加瓦。

因为它不需要你有想法,有创意,有足够的优化,也允许你足够平庸,因为换来的是大型项目的落地。


从 Java 到新兴语言#

语言的设计是在不断发展的,任何语言都有它自己的特点,但它们往往和时代需求高度相似。

如果说 Java 是为了解决企业大型协作而诞生的笨重框架,那么随着云原生、前端工程化以及 AI 时代的到来,新的语言展现出了为某种特定需求而极致偏科的妥协。

云原生的流水线 - Go#

这算是我最喜欢用的一门语言,我的所有后端程序基本都是用 Go 写的,高性能,编译快,写起来简单。

但从整体来看,这依旧是一门足够妥协,甚至有些“独裁”的语言,就像 Go 语言之父 Rob Pike 早就明说过:

“The key point here is our programmers are Googlers, they’re not researchers. They’re typically, fairly young, fresh out of school, probably learned Java, maybe learned C or C++, probably learned Python. They’re not capable of understanding a brilliant language but we want to use them to build good software. So, the language that we give them has to be easy for them to understand and easy to adopt. – Rob Pike 1”

“It must be familiar, roughly C-like. Programmers working at Google are early in their careers and are most familiar with procedural languages, particularly from the C family. The need to get programmers productive quickly in a new language means that the language cannot be too radical. – Rob Pike 2”

大意就是:Go 就是为了解决 Google 内部那些刚毕业、水平参差不齐的年轻程序员把 C++ 写得像屎一样的问题而诞生的。

他极度阉割了语言的特性、强制统一的代码格式、极其简陋的错误处理,换来的是极快的编译速度、极低的心智负担,以及自带的 Goroutine 并发模型。

这是一种为了云原生流水线量身定做的妥协:不追求单兵作战的优雅,而是成千上万的协作开发,并且系统不会因为某个天才的奇技淫巧而全盘崩溃。

或许这就是为什么后端写起来这么舒服,因为这是一个量身定做的语言,让所有使用这门语言的人都能如预期发展。

工程化束缚 - TypeScript#

TypeScript 是 JavaScript 的超集,它允许你使用 JavaScript 的语法,但同时添加了类型系统。

但最终呢?TS 并没有改变 JS 作为动态解释型语言的本质。编译后还是那层在运行时裸奔的 JS

有些人说这是前端工程化救星,但这不是揭示了束缚的必要性。或者说,这是为了新时代 AI 时代而做的束缚妥协。

Rust#


新时代 AI#

如今语言的发展,看上去在规范化工程化,但实际上是在给予 AI 时代的约束。

AI有幻觉,但是vibe Coding开发速度远超人类,为了生成效益,这些新出现的规则和编译器级别的纠错让AI开发的准确性大大提高。

这也算一种新时代的妥协:用语言的严密性去为AI兜底代码生成的不确定性。


产品与市场#

在开发的最大的悲哀,就是陷入对写出的代码的自我感动。

无论我用什么要高性能的开发设计思路,但最后只是为了一点小功能或者小群体服务,这无疑是脑残。

在如今AI产能过剩的时代,这种“自嗨式开发”简直是自杀。

如果一行 SQL 在 Handler 里就能跑通,且未来毫无复用可能,非要分出 Controller、Service、Repository 三层,那真是脑残。

还有些喜欢搞什么 Clean Architecture、DDD,如果不是大型项目简直就是自杀。

如非必要,勿增实体。

到现在依然适用。

产品的本质是服务于客户,服务于市场。

如果你的产品是必须的,尽管再卡UI再简陋,依然有大把的人用。


后言#


先写这么多,后面慢慢完善修饰吧~也可能就弃坑了,想法是完整的,但是写出来实在是太麻烦了。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

对编程语言的一些思考
https://blog.dorimu.cn/posts/codethought/
作者
Dorimu
发布于
2026-03-04
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00