四门语言是一条演化链:C 翻译成机器码、C++ 在 C 上加面向对象、Java 把编译目标改成字节码交给 JVM、C# 是微软对 Java 的回应——比较它们,本质是比较【编译到哪去、内存谁管】。
2-1 的【编译到哪】与 2-2 的【跨平台两条路】在此汇合成一张四语言的对照表。C++ 与 Java 你都完整学过(14. C++基础 16 章、11. Java基础 100 篇),本节把你身上的两门武功放进同一条时间线里看。
一、一条演化链看四门语言
| C | C++ | Java | C# | |
|---|---|---|---|---|
| 诞生 | 1972 | 1983(C with Classes 起于 1979) | 1995 | 2000 |
| 之父 | Dennis Ritchie | Bjarne Stroustrup | James Gosling(Sun) | Anders Hejlsberg(微软) |
| 编译目标 | 机器码 | 机器码 | 字节码 → JVM | 字节码(CIL)→ CLR |
| 内存管理 | 手动(malloc/free) | 手动(new/delete)+智能指针 | 垃圾回收 | 垃圾回收 |
| 指针 | 裸指针随处可用 | 有(可关) | 有引用无指针算术 | 受限(unsafe 才开) |
| 典型领地 | 内核、嵌入式 | 游戏、图形、高性能 | 企业后端、Android | Windows 生态、游戏(Unity) |
一句话串起来:C 解决【离硬件近】;C++ 往 C 上叠面向对象但坚持直接编译机器码;Java 干脆换编译目标(字节码+VM)换来跨平台与省心;C# 站在 Java 肩膀上再优化语言设计。
二、同一段需求,四张面孔
【把数组各元素加 1 后输出】,四门语言的签名对照:
/* C:手动管数组与循环,一切亲力亲为 */
int a[3] = {1, 2, 3};
for (int i = 0; i < 3; i++) {
a[i] = a[i] + 1;
}
printf("%d %d %d\n", a[0], a[1], a[2]);
// C++:容器与算法接管,内存交给 vector
#include <vector>
std::vector<int> a = {1, 2, 3};
for (int &x : a) x = x + 1;
// Java:没有指针算术,一切皆对象
int[] a = {1, 2, 3};
for (int i = 0; i < a.length; i++) a[i] = a[i] + 1;
// C#:LINQ 直接声明式(回收 2-4)
int[] a = {1, 2, 3};
var b = a.Select(x => x + 1);
读结果:同样的任务,C 写得最苦但离机器最近;C++ 用 vector 把内存收走;Java 全面对象化、.length 自带;C# 一句 Select 搞定——语言越晚出现,越把【机械劳动】从你手里拿走。
三、TIOBE 2026-09 的现实位次
Python 17.76% 居首之后,C(10.28%)、C++(8.67%)、Java(7.54%)、C#(4.22%)恰好包揽第 2~5 名——教材写作时【C/C++ 老而弥坚、Java 守企业、C# 守微软系】的格局到 2026 年依然成立。但注意两点新变化:
- C 在 2026 年反超了 C++(10.28% 对 8.67%)——嵌入式与内核领域的存量依旧庞大;
- Rust(1.34%,2026-07 首次挤进前十)正在以【内存安全】为卖点蚕食 C/C++ 的边际新增——C/C++ 社区也在做安全化改造(InfoWorld 2026-07 报道),这一仗还没打完。
四、动手 Demo:把【谁管内存】演给你看
Python 里你从不操心内存,但可以亲眼看到垃圾回收的现场:
import sys
a = [1, 2, 3]
print("a 的引用计数:", sys.getrefcount(a)) # 至少 2:a 本身+传参临时引用
b = a # 引用计数 +1
print("赋给 b 后:", sys.getrefcount(a))
del b # 引用计数 -1
print("del b 后:", sys.getrefcount(a))
看到什么算成功(数字随环境略有差异,趋势一致):
a 的引用计数: 2
赋给 b 后: 3
del b 后: 2
读结果:sys.getrefcount 返回的是【有多少个名字正指着这个对象】。Java/C# 的垃圾回收底层逻辑同源(对象没人指了就回收),只是实现策略不同(分代回收等)。C/C++ 里这套账要你自己记——new 出来的不用 delete 就是内存泄漏,C++ 课第十章析构函数与第十一章复制构造踩过的每个坑,根子都在【自己管内存】。
五、30 秒实验
在你的 Windows 电脑上找两个东西对比 30 秒:① 任意一个用 C/C++ 写的软件(几乎全部传统桌面软件都是);② Java 装了吗?没有的话看看手机——Android App 的底层就是 Java/Kotlin 跑在 ART 虚拟机上。四门语言的领地分布,此刻就在你手边。
六、常见误区
- 【C++ 是 C 加了个面向对象,其余全一样】——错。除 OOP 外还叠了模板、STL、异常、智能指针……C++ 是多范式语言,C 的很多写法在 C++ 里反而是反模式。
- 【Java 没有【指针】所以比 C++ 慢很多】——不准确。Java 没有指针算术,但对象引用本质是指针的安全封装;性能差距主要来自 JIT 预热与内存布局,稳态性能已非常接近(见 2-9)。
- 【C# 只能写 Windows 程序】——过时。自 .NET Core 起 C# 全面跨平台(Linux 服务器、macOS 都能跑),Unity 游戏更是跑遍所有平台。
自测三问(点开对答案)
1. **四门语言按编译目标排成一条什么链?** 答:C/C++ 直接编译成机器码;Java 编译成字节码交 JVM;C# 编译成 CIL 字节码交 CLR——后两者用【虚拟机】换跨平台与自动内存管理。 2. **内存管理上,C/C++ 与 Java/C# 的根本分歧是什么?** 答:前者手动管理(malloc/free、new/delete),后者由垃圾回收器自动回收没人引用的对象。 3. **2026 年 TIOBE 榜单上,这四门语言处在什么位置?有什么新变化?** 答:C/C++/Java/C# 依次居第 2~5 名;变化是 C 反超 C++ 居第 2,且 Rust 以内存安全为卖点首进前十。- ☐ 下一节(2-7)
相关笔记
- C++ 1.1.1 · 发展历程 —— 【C with Classes】起点的完整故事
- Java 1.4 · 运行机制 —— 字节码与 JVM 的正面讲解
- 计算机基础 06 · CPU —— 机器码的最终去向
- ⌨️ 编程原理 · 索引 —— 全课路线图