- 标记语言分为几类
- 文档/技术写作: MediaWiki 标记
- 通用文档/网页:Markdown、HTML、XML、XHTML、SGML
- 排版/科学:LaTeX、Texinfo、troff/groff
- 二进制/富文本:DOCX/ODT 、RTF、HTML5
- 数据/配置:YAML、TOML、JSON
- 专用/领域:SRT(字幕)、EPUB(电子书)、Mermaid(图标)
编程语言
为什么会有这么多门语言
核心答案一句话:语言是”硬件、人、问题”三者之间的折中,而折中方案不可能唯一。硬件要求效率,人要可读性,具体问题要求表达力——这三者在同一门语言里没法同时拉满。任何语言设计,本质上都是在给一个多维空间选点:离机器多近、内存谁来管、类型多严格、并发怎么表达、写起来多快。这个空间里没有一个点能全面压过其他点,所以语言家族不是一条进化链,而是一片”帕累托前沿”——每门语言都是在一个维度上押注:要么押速度(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 个节点,作为笔记的脊柱:
- 1957 Fortran — 第一个高级语言,科学计算
- 1958 Lisp — 符号处理/AI,函数式之祖
- 1959 COBOL — 商业数据处理
- 1960 ALGOL 60 — 语法教科书,影响一切后继者
- 1964 BASIC — 教学入门
- 1967 Simula 67 — 第一个面向对象语言
- 1972 C — 为写 Unix 而生,系统编程之王
- 1973 ML — 强类型函数式,类型系统标杆
- 1974 SQL — 关系数据查询
- 1980 Smalltalk — 纯面向对象(PARC)
- 1983 C++ — C + 类,兼容 C 的 OOP
- 1987 Perl — 文本处理与”胶水”
- 1991 Python — 可读性至上,胶水语言之王
- 1995 Java — 平台无关 + 垃圾回收主流化
- 1995 JavaScript — 浏览器脚本,10 天写出
- 1995 Ruby — 程序员幸福感
- 2000 C# — 微软的 Java
- 2009 Go — 简单 + goroutine 并发
- 2015 Rust — 无 GC 的内存安全(2010 初版)
- 2014 Swift / 2012 TypeScript — 给旧生态”补课”的现代语言
这条线你自己读一遍就能看出规律:每个时代只产生”当下瓶颈的解法”,解法积累下来就成了多样性。等你哪天想真正落笔整理笔记,随时告诉我,我可以帮你把它组织成正式笔记结构。
什么是语法糖?什么又是表达力?
语法糖 = 甜写法,代价是学习和实现成本,不是编译速度;表达力 = 代码与想法的距离。强表达力一定好懂,好懂不一定短。 糖是手段,表达力是目的——Astro、Markdown、Python 这些”用着舒服”的东西,本质上都是在这两件事上做到了平衡。
Markdown 不是一个单一语法,而是一组“方言”和扩展的集合。
1. 核心语法
这些属于 CommonMark 等核心规范,跨工具兼容性最好。CommonMark 规范
| 类型 | 写法 |
|---|---|
| 段落 | 直接写文字,空行分段 |
| 标题 | # 一级标题 |
| 斜体 | *文字*、_文字_ |
| 加粗 | **文字**、__文字__ |
| 行内代码 | `code` |
| 代码块 | 三个反引号 |
| 无序列表 | - 项目、* 项目 |
| 有序列表 | 1. 项目 |
| 引用 | > 引用内容 |
| 链接 | [文字](https://example.com) |
| 图片 |  |
| 分割线 | ---、*** |
| 转义 | \*、\# |
| 原始 HTML | <span>文字</span> |
例如:
# 标题
这是 **加粗**、*斜体* 和 `代码`。
> 这是一段引用。
- 项目一
- 项目二
[访问网站](https://example.com)
2. 常见扩展语法
这些不是最初 Markdown 核心规范的一部分,但已经被 GitHub、Astro、Obsidian、Typora 等大量工具支持。GFM 规范
| 类型 | 写法 | 说明 |
|---|---|---|
| 表格 | ` | A |
| 删除线 | ~~文字~~ | GFM 扩展 |
| 任务列表 | - [ ] 待办 | GFM 扩展 |
| 自动链接 | https://example.com | 不写 < > 也能识别 |
| 脚注 | [^1]、[^1]: 内容 | GitHub / remark-gfm 等支持 |
| Emoji | :smile: | 工具扩展 |
| 数学公式 | $x^2$、$$...$$ | 通常由 KaTeX/MathJax 扩展 |
| YAML Frontmatter | --- 包裹的元数据 | Astro、Jekyll 等使用 |
GitHub 官方文档也把脚注作为扩展功能来支持;remark-gfm 则明确包含表格、脚注、删除线、任务列表等扩展。GitHub 脚注文档、remark-gfm
3. 各种工具自己的扩展
这一层就不再是统一标准了,具体取决于工具:
==高亮==
> [!note]
> 这是一个提示框
[[另一篇笔记]]
```mermaid
graph TD
A --> B
常见例子包括:
- `==高亮==`
- Obsidian 的 `[[双链]]`
- Callout / Admonition 提示框
- Mermaid 图表
- 数学公式
- 上标、下标
- Wiki 链接
- 自定义容器
- MDX 的 `<Component />`
这些语法在 Obsidian、Typora、GitHub、Astro 之间并不一定互相兼容。
## 4. 你现在这个项目属于哪一层?
你现在使用的是:
```md
三项[^定值习惯]
[^定值习惯]:
1. 每天喝 2L 水
2. 启动一件有 DDL 的事情
这里要拆成两部分:
[^定值习惯]本身是常见的扩展脚注语法,不是我们发明的。- 把脚注渲染成悬浮框,是 DevNotes 自己定义的渲染行为。
所以更准确地说:
这是“标准扩展脚注语法 + DevNotes 自定义悬浮框渲染”。
而:
==高亮==
在当前站点里则属于真正的项目自定义语法,由 rehype-mark.mjs 处理。
脚注悬浮框则由 rehype-popover.mjs 处理。
可以简单记成:
Markdown 核心语法 → GFM 常见扩展 → 工具扩展 → 项目自定义语法/渲染。