⌨️ 第二章 编程语言都有什么不同
📄 一句话概括

四门语言是一条演化链: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 年依然成立。但注意两点新变化:

四、动手 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 虚拟机上。四门语言的领地分布,此刻就在你手边。

六、常见误区

  1. 【C++ 是 C 加了个面向对象,其余全一样】——错。除 OOP 外还叠了模板、STL、异常、智能指针……C++ 是多范式语言,C 的很多写法在 C++ 里反而是反模式。
  2. 【Java 没有【指针】所以比 C++ 慢很多】——不准确。Java 没有指针算术,但对象引用本质是指针的安全封装;性能差距主要来自 JIT 预热与内存布局,稳态性能已非常接近(见 2-9)。
  3. 【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 以内存安全为卖点首进前十。

相关笔记