编程语言_计算机术语扫盲(二)

编程语言不是简单的“谁高级谁落后”,而是不同的工程权衡——像选择不同风格的厨师,在软件世界观下重新认识各语言的定位与取舍。

文章目录[56]

二十一、现在再看编程语言:其实是在选择不同风格的“厨师”

建立完前面的世界观之后,再来看编程语言,就会比一开始直接比较语言容易得多。

不同语言并不是简单的:

“谁高级,谁落后。”

而是:

它们选择了不同的工程权衡。


1. C:后厨的“切配大师兼灶台控制员”

C 最大的特点就是:

离计算机很近。

操作数据

程序员可以直接面对最原始的内存。

就像:

精确知道每一块食材放在哪一格操作台上。

指针甚至允许程序直接处理:

内存地址。

这意味着非常强的控制能力。


调度计算机

C 可以非常直接地控制:

  • 内存;
  • 硬件;
  • 系统资源。

就像厨师可以直接控制:

  • 火候;
  • 燃气;
  • 刀具;
  • 灶台。

效率非常高。


代价

自由越大,责任也越大。

如果程序员操作失误,就可能:

  • 内存泄漏;
  • 越界访问;
  • 段错误;
  • 崩溃。

就像:

自己拿刀、自己开火,也意味着真的可能切到手。


典型场景

  • 操作系统内核;
  • 嵌入式设备;
  • 底层驱动;
  • 高性能系统组件。

一句话理解:

C 把最大的自由交给程序员,也把最大的责任交给程序员。


2. C++:现代中央厨房里的全能主厨

C++ 保留了 C 的底层控制能力,同时增加了大量高级抽象能力。

例如:

  • 面向对象;
  • 泛型;
  • 模板;
  • RAII;
  • STL;
  • 智能指针。

相当于:

在传统大师傅的厨房里加入大量自动化设备和现代管理系统。


优势

既可以:

自己拿刀切菜。

也可以:

使用高度自动化的切菜机。

它允许开发者在:

底层控制 ←────────→ 高级抽象

之间自由移动。


代价

C++ 的最大问题之一就是:

太强,也太复杂。

语言功能很多。

规则很多。

编译系统、模板、对象生命周期、内存模型都可能非常复杂。

就像:

一个中央厨房拥有世界上几乎所有厨具,但操作手册厚达上千页。


典型场景

  • 游戏引擎;
  • 高频交易;
  • 数据库;
  • 浏览器;
  • AI 底层框架;
  • 高性能系统。

3. Rust:拥有绝对安全协议的特种厨房工程师

Rust 试图解决一个非常困难的问题:

能不能拥有接近 C/C++ 的性能,同时尽可能避免它们危险的内存问题?

它的重要机制之一就是:

  • Ownership;
  • Borrowing;
  • Lifetime。

也就是:

所有权、借用和生命周期。


所有权

每一份数据必须明确:

到底谁负责它。

相当于每份食材必须登记:

当前负责人是谁?
谁可以暂时查看?
谁可以修改?
什么时候销毁?

编译器

Rust 编译器就像:

极其严苛的食品安全审查员。

如果代码可能存在某些:

  • 内存错误;
  • 生命周期错误;
  • 数据竞争;

编译器就可能直接拒绝:

不准营业。


优势

一旦通过严格检查:

可以获得很高的性能,同时减少大量内存安全风险。

并且不依赖传统垃圾回收。


代价

前期开发者经常会感觉:

自己不是在写程序,而是在和编译器谈判。

学习曲线明显较高。


典型场景

  • 系统软件;
  • 浏览器底层;
  • 高性能服务器;
  • WebAssembly;
  • 对安全与性能同时敏感的组件;
  • 部分区块链系统。

4. Java:大型连锁餐饮集团的标准化运营总监

Java 的核心气质是:

规范、稳定、工程化。

它非常强调:

  • 类型;
  • 类;
  • 对象;
  • 工程结构;
  • 长期维护。

就像一家大型连锁集团:

不允许每家店完全按照厨师个人喜好做事。

而是需要标准化流程。


JVM

Java 不直接针对某一台机器运行。

中间有:

JVM(Java Virtual Machine)。

可以理解成:

万能翻译官 + 后勤总管。

Java 程序运行在 JVM 上,而 JVM 再负责适配不同操作系统。

因此产生了 Java 著名的理念:

Write Once, Run Anywhere.

即:

一次编写,到处运行。


代价

因为需要 JVM,以及:

  • GC;
  • 类加载;
  • Runtime;

整个运行环境相对更重。


典型场景

  • 大型企业系统;
  • 银行;
  • 金融核心系统;
  • 大规模 Web 后端;
  • Android 生态;
  • 大数据生态。

5. C#:装备精良的全能型行政总厨

C# 在很多设计理念上和 Java 有一定相似性,但它持续加入大量现代语言特性。

例如:

  • LINQ;
  • async / await;
  • 泛型;
  • 强大的类型系统;
  • .NET 生态。

它可以理解成:

工具齐全、使用体验很好的现代中央厨房。


.NET Runtime

C# 通常依赖 .NET Runtime。

因此和 Java + JVM 类似:

C#
 ↓
.NET
 ↓
操作系统

跨界能力

C# 可以开发:

  • Windows 桌面软件;
  • Web 后端;
  • 游戏;
  • 移动应用;
  • 云服务;
  • IoT。

因此它像:

一个总厨,同时能够管理堂食、外卖、预制菜和连锁门店。


典型场景

  • Windows 软件;
  • ASP.NET Web 服务;
  • Unity 游戏;
  • 企业系统。

6. Go:现代外卖平台的高效并发调度主管

Go 的哲学非常鲜明:

简单。

它刻意避免大量复杂语言特性。

例如它不像某些传统面向对象语言一样强调复杂继承体系。

更倾向:

组合,而不是继承。


核心能力:并发

Go 的标志性工具:

Goroutine。

让它可以比较轻松地处理大量:

  • 网络连接;
  • API;
  • 服务请求;
  • 后台任务。

工程体验

Go 还强调:

  • 编译快;
  • 部署简单;
  • 单个二进制文件;
  • 工具链统一。

这使它非常适合现代服务器基础设施。


代价

为了保持简单,Go 会主动舍弃一些复杂高级抽象。

因此处理某些特别复杂的业务模型时:

代码可能显得比较直接甚至重复。


典型场景

  • Docker;
  • Kubernetes;
  • 云原生;
  • API 网关;
  • 微服务;
  • 高并发后端;
  • 基础设施软件。

7. Python:高级管家与预制菜大师

Python 最大的优势不是:

CPU 跑得最快。

而是:

开发者写程序非常快。

程序员不需要天天处理:

  • 指针;
  • 手动内存;
  • 大量类型声明;
  • 复杂底层机制。

相当于:

老板只需要告诉管家要做什么。

至于:

  • 食材在哪;
  • 内存怎么分;
  • 垃圾什么时候清理;

很多事情由系统处理。


优点

代码:

  • 简洁;
  • 可读;
  • 开发快;
  • 库多;
  • 非常适合实验。

代价

抽象层越高,通常意味着更多运行开销。

因此纯 Python 在大量 CPU 计算中通常不像 C/C++ 那么快。

同时传统 CPython 还涉及 GIL 等并发限制。


为什么 AI 大量使用 Python?

一个重要原因并不是:

Python 本身擅长计算矩阵。

恰恰相反。

很多真正重型的计算实际上由:

  • C;
  • C++;
  • CUDA;

等底层代码完成。

Python 更像:

站在上层指挥整个流水线的总管。

例如:

model.train()

看起来只是一行 Python。

下面可能已经调动:

Python
 ↓
PyTorch
 ↓
C++
 ↓
CUDA
 ↓
GPU

大量底层系统。


典型场景

  • AI;
  • 数据分析;
  • 自动化;
  • 科学计算;
  • Agent;
  • 快速 MVP;
  • 脚本工具。

8. JavaScript / TypeScript:大堂经理与互联网世界的核心语言

JavaScript 最核心的阵地仍然是:

浏览器。

它天生和:

  • DOM;
  • 用户点击;
  • 网络请求;
  • 页面状态;

联系在一起。

通过 Node.js 之后,它又进入后端。

于是 JS / TS 最终形成了:

Browser
   ↓
JavaScript / TypeScript
   ↓
Node.js
   ↓
Backend

也就是说:

同一套语言能够横跨前端和后端。


优势

  • Web 生态极大;
  • 全栈统一;
  • 开发效率高;
  • 异步 I/O 非常成熟;
  • TypeScript 可以提供更强工程约束。

局限

如果让主线程连续执行大型 CPU 计算:

就像让大堂经理突然停止服务所有客人,然后站在那里切几万个土豆。

整个服务可能被阻塞。

所以它更擅长:

消息、事件、I/O 与交互。


二十二、八种主要语言放在一起看

语言硬件控制能力开发效率运行性能内存管理核心哲学
C极高低极快手动给程序员最大自由
C++高中极快手动 + RAII / 智能指针高性能 + 高级抽象
Rust极高前期较低极快编译期安全机制性能与内存安全兼得
Java较低中高较快GC标准化、跨平台、企业工程
C#中高快GC开发体验与完整生态
Go中高快GC简单、并发、云原生
Python较低极高相对较慢GC开发者效率优先
JavaScript / TypeScript较低高中到较快GCWeb、事件驱动、异步 I/O

需要注意:

这张表是帮助建立直觉的工程化简化,并不是严格的 benchmark 排名。

实际性能还会受到:

  • Runtime;
  • 编译器;
  • 框架;
  • 算法;
  • 硬件;
  • 编码方式;

等大量因素影响。


二十三、.NET 到底是什么?

很多初学者第一次看到:

C#
.NET
.NET Runtime
.NET Framework
.NET Core

很容易混在一起。

最简单的理解是:

C# 是语言,.NET 是整套开发平台。

餐厅模型中:

C# = 菜谱语言
.NET = 整个中央厨房生态

.NET 包含:

  • 编程语言;
  • Runtime;
  • 标准库;
  • 开发工具;
  • Web 框架;
  • 桌面框架;
  • 云生态。

常见语言包括:

  • C#;
  • F#;
  • VB.NET。

.NET Framework → .NET Core → .NET 5+

可以简单理解为一段平台演化历史。

.NET Framework

早期主要绑定 Windows。

像:

一套只在某个城市能够运营的老中央厨房系统。


.NET Core

微软开始推进:

跨平台。

Linux、macOS 等环境逐渐成为正式目标。


.NET 5+

现代 .NET 进一步统一生态。

可以运行在:

  • Windows;
  • Linux;
  • macOS;
  • Docker;
  • 云服务器。

因此现代 C# 已经不再只是:

“Windows 软件语言”。


二十四、LINQ:C# 的智能点菜系统

LINQ 全称:

Language Integrated Query。

它允许开发者直接使用 C# 语法操作数据集合。

例如:

var expensiveDishes = dishes
    .Where(d => d.Price > 100)
    .OrderByDescending(d => d.Sales);

意思非常直接:

找出价格超过 100 元的菜,然后按照销量从高到低排序。

这就像:

智能点菜与筛选系统。

它能够处理:

  • 数组;
  • List;
  • 数据集合;
  • 数据库查询。

优势之一是:

查询逻辑直接进入语言和类型系统。

相比手工拼接大量字符串式 SQL,编译器也能够帮助发现一部分问题。


二十五、C# 的“跨界调度能力”

C# + .NET 可以覆盖:

Windows Desktop
        ↓
WPF / WinForms

Web Backend
        ↓
ASP.NET Core

Mobile
        ↓
.NET MAUI

Game
        ↓
Unity

Cloud
        ↓
Azure / .NET Services

IoT
        ↓
.NET nanoFramework 等

因此它的一个核心优势就是:

一个技术栈能够覆盖非常广泛的软件开发场景。

这对于大型组织尤其有价值。

因为团队可以共享:

  • 语言;
  • 工具链;
  • 工程经验;
  • 类库;
  • 人才体系。

二十六、从技术选型角度,应该怎么选择语言?

实际开发中,很少存在:

“整个世界只用一种语言。”

真正的工程系统通常是混合的。

可以按照系统发展阶段理解。


阶段 1:MVP 与快速验证

目标通常是:

尽快证明这个产品到底有没有价值。

优先考虑:

  • Python;
  • JavaScript;
  • TypeScript。

原因:

  • 开发快;
  • 库丰富;
  • 生态成熟;
  • 人力成本低;
  • 修改速度快。

这个阶段真正珍贵的不是:

每秒再快 20%。

而是:

能不能尽快验证用户需求。


阶段 2:Web 产品与用户交互

前端一般自然进入:

HTML
CSS
JavaScript / TypeScript
React / Vue 等

因为浏览器生态基本围绕这套体系构建。

因此:

JS / TS 长期守住的是“大堂”。


阶段 3:高并发服务与云原生

当系统开始面临:

  • 大量网络请求;
  • 大量微服务;
  • API 网关;
  • 基础设施;
  • 高并发任务;

Go 会变得非常有吸引力。

它非常适合:

高效管理大量同时发生的网络任务。


阶段 4:大型企业系统

当业务开始包含:

  • 权限;
  • 财务;
  • 复杂工作流;
  • 计费;
  • 审批;
  • 大型团队协作;
  • 长期维护;

Java / C# 的强类型和企业生态就会体现价值。

它们的核心优势往往不是:

写第一版最快。

而是:

五年以后还有一百个人在维护的时候,系统仍然能够被控制。


阶段 5:性能瓶颈

如果系统某个模块真的遇到了:

  • 超高性能;
  • 超低延迟;
  • 图像计算;
  • 浏览器重型计算;
  • 数据库核心;
  • 系统级能力;

则可以考虑:

  • C;
  • C++;
  • Rust;
  • CUDA;
  • WebAssembly。

一个非常实用的工程思想是:

不需要为了 1% 的性能需求,把 100% 的系统全部改成底层语言。

完全可以只针对真正的瓶颈模块优化。

也就是:

定点爆破。


二十七、把整个技术栈重新放回餐厅里

至此,可以画出完整的“软件餐厅地图”。

                           用户 / 顾客
                               │
                               ▼
┌──────────────────────────────────────────────────┐
│                Frontend / 餐厅大堂               │
│                                                  │
│   HTML        CSS        JavaScript / TypeScript │
│   骨架        装修        大堂经理 / 服务员       │
│                               │                  │
│                         DOM / Virtual DOM        │
└───────────────────────────────┬──────────────────┘
                                │
                          API / 点单系统
                                │
                                ▼
┌──────────────────────────────────────────────────┐
│                 Backend / 后厨                   │
│                                                  │
│   Python     Go      Java      C#       Node.js  │
│   管家      调度员   运营体系   总厨      JS 后厨 │
│                                                  │
│                Microservices / 专业档口          │
└───────────────────────┬──────────────────────────┘
                        │
                        ▼
               Runtime / 后勤系统
        JVM       .NET       Go Runtime      V8
                        │
                        ▼
                 Operating System
                  操作系统 / 总管
                        │
          ┌─────────────┼──────────────┐
          ▼             ▼              ▼
         CPU           RAM           Disk
       灶台厨师        操作台          仓库
          │
          ▼
      GPU / CUDA
    矩阵流水线厨房

如果系统规模继续扩大:

一个后厨
   ↓
多个微服务
   ↓
大量容器
   ↓
Kubernetes
   ↓
自动部署 / 调度 / 扩容 / 故障恢复

二十八、整套比喻的最终映射表

技术概念餐厅比喻
Computer / Server餐厅建筑
CPU灶台与厨师
GPU大规模流水线厨房
CUDAGPU 特种矩阵流水线系统
RAM厨房操作台
Disk仓库 / 冷库
Network进货与配送通道
OS总后勤主管
Data食材 / 菜品
Code菜谱 / SOP
Programming Language编写菜谱的语言
Compiler提前翻译整本菜谱的翻译官
Interpreter边做边翻译的随身翻译
Runtime后勤支持系统
Garbage Collection自动清洁工
Frontend大堂
Backend后厨
API点单系统 / 传菜窗口
HTML大堂骨架
CSS装修与灯光
DOM真实家具
Virtual DOM大堂沙盘 / 草稿
JavaScript大堂经理 / 服务员
TypeScript给食材盒贴标签的 JS
Node.js让 JS 进入后厨
Event Loop服务员的便签调度机制
GIL唯一的灶台钥匙
Goroutine微型服务员
WebAssembly空运的高性能料理模块
Microservice专业档口
Kubernetes集团中央调度系统
Native App为一个商场定制的旗舰店
Cross-platform App一套菜谱,多地开店
Dart支持试菜和正式营业双模式的菜谱语言
.NET微软的完整中央厨房平台
LINQ智能数据点菜系统
Developer Platform加盟总部 + 供应链 + 商场运营中心

二十九、最终理解:编程语言真正争论的是什么?

学到这里之后,会发现:

编程语言之间真正的区别,并不是简单的“谁更先进”。

真正的问题是:

开发者愿意把多少控制权交给系统?

可以想象一条光谱:

更多机器控制权
←────────────────────────────────────→
更多开发便利性

C / C++ / Rust
        Go
             Java / C#
                       Python / JS

越靠左:

  • 更接近硬件;
  • 控制更多;
  • 性能上限更高;
  • 程序员承担更多责任。

越靠右:

  • 抽象更多;
  • 开发速度更快;
  • 系统帮程序员处理更多事情;
  • 底层控制能力相对减少。

因此很多语言设计,本质上都在回答同一个问题:

哪些事情应该让程序员自己控制,哪些事情应该让编译器、Runtime 和框架帮他解决?


三十、真正的软件系统,本来就是“混合厨房”

实际工程不会要求一家大型餐厅:

所有员工都必须会干所有事情。

同样,一个大型软件系统也完全可能是:

用户界面
→ TypeScript + React

普通 API
→ TypeScript / Go

AI Agent
→ Python

核心业务
→ Java / C#

性能模块
→ Rust / C++

GPU 计算
→ CUDA

浏览器高性能模块
→ WebAssembly

基础设施
→ Go + Kubernetes

每一门语言负责它最擅长的位置。

因此一个更接近真实软件工程的总结是:

用 JavaScript / TypeScript 守住用户交互的“大堂”;

用 Python / Go 建设快速、高效运转的“后厨”;

用 Java / C# 支撑复杂、长期运行的“连锁管理体系”;

当出现真正的极端性能问题时,再请 C / C++ / Rust 这样的特种工程师定点爆破;

需要大规模 AI 计算时,则把工作交给 GPU / CUDA 的矩阵流水线。


结语:不要背术语,要先知道它在系统里“站在哪里”

学习软件工程最容易遇到的困难之一,是突然同时看到:

Node.js
Runtime
V8
DOM
Virtual DOM
GC
GIL
Goroutine
CUDA
Wasm
K8s
JVM
.NET

如果逐个死记,它们看起来毫无关系。

但是一旦把整个系统建立起来:

顾客
 ↓
大堂
 ↓
点单
 ↓
后厨
 ↓
厨师 / Runtime
 ↓
操作系统
 ↓
CPU / 内存 / GPU

这些名词就开始拥有位置。

以后再学习一个新的技术概念,可以先问四个问题:

  1. 它运行在哪里?
  2. 它管理什么东西?
  3. 它替开发者解决了什么问题?
  4. 它为此付出了什么代价?

如果这四个问题能够回答出来,那么通常就已经抓住了一个技术最重要的工程本质。

最终,软件开发没有那么神秘。

它无非是:

开发者这个老板,用某一种编程语言写下菜谱;编译器、解释器和 Runtime 把菜谱变成能够执行的动作;操作系统负责协调厨房资源;CPU 和 GPU 真正加工数据;后端完成核心业务;API 把结果送出后厨;前端最终把它呈现在用户面前。

这,就是整个“现代化软件餐厅”真正运转起来的过程。