Fundamental differences between languages
Written on: 4/10/2026
完整地列一下我涉及过的语言:
C:
最初是在工厂里面自学的时候接触的语言, 后续在培训时加强过, 但基本没有使用过
C++
在工作中高度使用过, 主要是游戏的服务器, 用它写功能和算法
C++ 很优秀, 它能让你接触到底层, 几乎所有都由你控制. 足够灵活, 性能也足够强
但我应该不会主动去接触这门语言了, 无他, 写起来的心智负担很大, 做事情效率有些慢
ASM(x86, arm)
在早期工作的时候接触过, 听说如果要了解语言的底层细节就需要了解汇编, 于是去学习了这门语言
主要依靠2本书, 一本王爽的《汇编语言》, 另一本《汇编语言程序设计》
结果上来说很成功, 我能看懂 C++ 和 Golang 的汇编脱离不了这些基础
至今汇编任是我认为很优美的语言, 指令的功能和作用非常明了, 所有高级特性全由此展开, 从中可以看到非常多的巧思
比如类的本质, 虚函数/虚指针的实现, 堆栈内存的区别, 函数调用是什么, 函数和方法的区别, static, switch 等关键字如何实现…
Lisp
在看 MIT 《计算机程序的构造和解释》中了解到的语言, 当然也只是了解
Lua
Lua 语言本身个人觉得似乎没有什么好说的, 主要使用它写一些工具
不同于其他涉及到的脚步语言, 我真的觉得 Lua 很一般…
但 Lua 在游戏中较受欢迎, 即使在 C++ 较为没落的今日, Lua 也还算流行, 尤其是和 C++ 相关的程序
JavaScript/TypeScript
灵活得有些过头的语言. 严格来说我直接使用的是 TypeScript, 我并不了解 JavaScript
它符合我对于脚步语言的幻想:
脚本语言不同于编译语言, 其由运行时解释, 他应当提供更灵活可用的类型, 更丰富的操作方法
它速度可以很慢, 但它一定要好用, 同时生态要足够完善
而 JS/TS 在 web 中的使用几乎无处不在, 几乎所有相关的功能都可以用其实现
Python
使用过他写一些脚步, 但并没有过多涉及, 它似乎是非程序员中最受欢迎的语言之一, 在 AI 时代, 它似乎也是广为使用的语言
或许我该更多去了解一下了, 但应该了解哪些方面呢, 似乎它并不是以技术而出名的语言…
Golang
目前最喜欢的语言, Runtime 足够好用, routine, channel, GC, package manager, go.mod …
在工程化上非常省心的语言, 开箱可用, 易用.
Rust
最憧憬的语言, 大刀阔斧的创新. 多家公司都有使用说明了其能力
可是在国内极难找到相关工作, 我大抵这辈子都难涉及到相关工作内容了…
回到问题本身, 语言根本性的不同在哪些地方? 或者说为什么要使用这门语言做这件事?
封装, 原则
我觉得最明显的应当是封装层级, 计算机执行的是二进制, 而将其封装则是语言的工作
汇编封装了指令, 定义了基础的复合类型操作
编译行语言封装了编程所需的基础概念: 值, 函数, 条件, 循环. 随着封装层级的不同, 类, 对象. 再往上提供了更多的功能性, 多态, 模版…
再其之上是脚步语言, 由编译型语言实时执行, 这又是一层封装, 提供了更多更好用的功能性, 将过程的实现从编译和平台上解脱了出来
即使是同类型的语言, 由于其语言特性本质, 也提供了不同层级的封装
C/C++ 由自己管理内存, RAII 并未根本性将程序员从内存管理的深渊中解脱出来. 对比的是 Golang 的 GC (甚至 Rust Owner 也算是一种)
C/C++ 中获取到的进程是原生的进程, 需要自己手动管理, 而 mutex 也相对更重. 对比的是 Golang 的 routine, channel, mutex
(说到这里我似乎在捧 Golang, 贬低 C++. 有一定程度上我在这么做, 但这并非语言本身的问题, 而是其是否适用我所处的开发环境)
语言本身的理念也会一定程度影响封装层级, 比如 C++ 的 zero-overhead. C++ 当然可以做得更多, 但这或许是因为违背了其本身的理念所以并没有做, 就像 Golang 被诟病的错误处理 (这就像双刃剑, 它避免语言设计走向歧途, 又天然避免了“歧途”)
环境/生态
其次是环境和生态, 这极大概率和技术无关, 而是计算机发展的历史进程所决定的, 就好像为什么大多数人的惯用手是右手
复杂难用的语言注定无法服务大众, 其生态也只会越来越小直至被摒弃
用在现实生活则是: 往往积硅步的事情最终因为大家的助力和日夜的努力而强于开始很强势但缺少维护和发展的事情
再细一点的话:
简单的事情比起复杂的事情总是能让更多人接受, 也更容易产生生态(更容易去做, 去发展)
这一点极其重要, 因为你不止要让有经验的人去这些事情, 同时也要补充社区的新鲜血液
新鲜血液的重要性的根本在于2点:
- 人是懒惰的, 热情是有限的, 生命是有限的
- 知识是会过期的
基于这两点, 有经验的人员会处于无法继续学习的状态, 无论是热情煺去还是拿着锤子找钉子的思维惯性
知识/经验/认知同时是一种“诅咒”, 它扎根于“经验”, 天然排斥“变化和创新“
学习的过程就好比使用有限的精力在无限的知识前进行花费, 长久的点滴远甚于一时的爆发, 即使他们的累积是一样的(因为知识是会过期的)
(实际这个结论会被相当多的因素会破坏, 比如初始平台的高低, 精力虽有限但并不恒定)