← 返回知识库

综述:编程语言

标记语言

  • Markdown:一种通过文本符号表示格式的轻量级标记语言

编程语言

为什么会有这么多门语言

核心答案一句话:语言是”硬件、人、问题”三者之间的折中,而折中方案不可能唯一。硬件要求效率,人要可读性,具体问题要求表达力——这三者在同一门语言里没法同时拉满。任何语言设计,本质上都是在给一个多维空间选点:离机器多近、内存谁来管、类型多严格、并发怎么表达、写起来多快。这个空间里没有一个点能全面压过其他点,所以语言家族不是一条进化链,而是一片”帕累托前沿”——每门语言都是在一个维度上押注:要么押速度(C、汇编),要么押安全(Rust、Java),要么押写起来爽(Python、Ruby),要么押某个领域(SQL 管数据、R 管统计、MATLAB 管数值)。 其次,语言的诞生几乎全是”痛点驱动”,不是有人闲来无事想发明语言,而是某群人被现状逼得受不了了。Fortran 是因为 50 年代科学家用手写汇编算弹道太痛苦;Java 是因为 90 年代分布式设备上 C++ 的指针错误太频繁;Go 是 2000 年代末 Google 嫌 C++ 编译太慢、并发太难写;Rust 是 Mozilla 发现浏览器里的内存漏洞几乎全是 C++ 的锅。每一代语言,本质上是上一代语言在某个新瓶颈面前暴露的短板清单。 还有一个容易被忽略的原因:语言不会死,只会积压。一门语言一旦有了生态——库、社区、存量代码、招得到的人——替换它的成本就高得离谱,所以新语言不是”取代”旧语言,而是”叠加”在它旁边。Fortran 1957 年诞生,今天还在跑科学计算;COBOL 比 C 还老,银行核心系统至今还在用它。于是时间越久,语言的总数只增不减。

需求是怎么来的:瓶颈的四次变迁

可以把需求按”时代的瓶颈”切成四段。第一段瓶颈是硬件太傻(40-50 年代):机器只认二进制,人写汇编像在跟机器说耳语。于是诞生了第一批高级语言——注意,它们一出生就是按”用户人群”分的:Fortran 给科学家算数值,COBOL 给商人做报表,Lisp 给研究者做符号处理。领域分化从第一天就开始了,因为不同人群需要不同的表达形状。 第二段瓶颈是软件太复杂(60-80 年代):程序从几百行长到几万行,goto 满天飞,没人能看懂自己的代码。于是结构化编程(ALGOL、Pascal)和面向对象(Simula、Smalltalk、C++)相继出现——它们回答的不是”怎么算得快”,而是”怎么把大程序组织得让人看得懂、改得动”。这一代语言的敌人是混乱,不是速度。 第三段瓶颈是网络与交付太快(90 年代-2000 年代):网页需要脚本,脚本需要粘合,Java 喊出”一次编写、到处运行”,Python/Ruby/Perl 追求”写代码像写散文”。这一代语言统一押注开发速度,代价是执行效率和内存开销——它们用”更慢的跑”换”更快的写”。 第四段瓶颈是规模化之后的安全与并发(2010 年代至今):服务器多了,内存安全问题和并发问题变成大头。Go 用”简单 + goroutine”回答并发,Rust 用”所有权”回答内存安全,TypeScript 用”给 JS 补类型”回答大型前端工程。这一代的特点是”回头补课”:把早期为了速度或便利丢掉的东西(类型、安全)重新捡回来,只是用了更聪明的机制。

先后顺序:按时代走一遍

按时间线讲:40 年代末到 50 年代是萌芽期——Plankalkül(1943-45)还停留在纸上从未实现,Fortran 1957 年第一个真正落地,紧接着 Lisp(1958)、COBOL(1959),ALGOL 60 则是学术界的语法教科书,今天几乎所有语言的语法骨架都源自它。60 年代进入理论成型期:Simula 67 发明了”类”(面向对象的祖父),BASIC 1964 年为了让学生上手而生,C 语言 1972 年在贝尔实验室为了写 Unix 而生。70 年代是结构化与类型的年代:Pascal 用来教编程,Smalltalk 把 OOP 做到纯粹,SQL(1974)统治了数据查询,ML(1973)给类型系统立了高标杆。80 年代是工程化年代:C++(1983)给 C 加上类,Perl(1987)成为系统管理员的瑞士军刀,Erlang(1986)为电信级并发而生,MATLAB(1984)给工程师做数值计算。 90 年代是爆发期,也是今天主力语言的出生潮:Python(1991)、Java(1995)、JavaScript(1995,只用了 10 天写出来)、Ruby(1995)、PHP(1995)、Haskell(1990)。进入 2000 年代以后,语言开始”修正上一代”:C#(2000)是微软对 Java 的回答,Go(2009)、Rust(2010 初版、2015 稳定)、Kotlin(2011)、Swift(2014)、TypeScript(2012)——它们各自的使命,几乎都是”保留前代优点、修掉前代痛点”。


你既然要整理笔记,这里确实是”避不开列表”的地方——给你一条时间线骨架,20 个节点,作为笔记的脊柱:

  1. 1957 Fortran — 第一个高级语言,科学计算
  2. 1958 Lisp — 符号处理/AI,函数式之祖
  3. 1959 COBOL — 商业数据处理
  4. 1960 ALGOL 60 — 语法教科书,影响一切后继者
  5. 1964 BASIC — 教学入门
  6. 1967 Simula 67 — 第一个面向对象语言
  7. 1972 C — 为写 Unix 而生,系统编程之王
  8. 1973 ML — 强类型函数式,类型系统标杆
  9. 1974 SQL — 关系数据查询
  10. 1980 Smalltalk — 纯面向对象(PARC)
  11. 1983 C++ — C + 类,兼容 C 的 OOP
  12. 1987 Perl — 文本处理与”胶水”
  13. 1991 Python — 可读性至上,胶水语言之王
  14. 1995 Java — 平台无关 + 垃圾回收主流化
  15. 1995 JavaScript — 浏览器脚本,10 天写出
  16. 1995 Ruby — 程序员幸福感
  17. 2000 C# — 微软的 Java
  18. 2009 Go — 简单 + goroutine 并发
  19. 2015 Rust — 无 GC 的内存安全(2010 初版)
  20. 2014 Swift / 2012 TypeScript — 给旧生态”补课”的现代语言 这条线你自己读一遍就能看出规律:每个时代只产生”当下瓶颈的解法”,解法积累下来就成了多样性。等你哪天想真正落笔整理笔记,随时告诉我,我可以帮你把它组织成正式笔记结构。

什么是语法糖?什么又是表达力?

语法糖 = 甜写法,代价是学习和实现成本,不是编译速度;表达力 = 代码与想法的距离。强表达力一定好懂,好懂不一定短。 糖是手段,表达力是目的——Astro、Markdown、Python 这些”用着舒服”的东西,本质上都是在这两件事上做到了平衡。