我们身边的并发编程

我们身边的并发编程

2024 南京大学《操作系统:设计与实现》
我们身边的并发编程

Visual Studio Code (2015)

听说你不用?

center

2024 南京大学《操作系统:设计与实现》
我们身边的并发编程

互联网的开始:Web 1.0

从 PC 时代到互联网时代 (1990s)

  • Amazon (1994), Yahoo (1994), eBay (1995), Google (1998)
  • HTTP (对,没有 HTTPS), HTML,但没有 CSS
    • 中国互联网初代 “三巨头”:新浪、搜狐、网易诞生
    • <font>, <table>, vbscript 和切图工程师一统天下

center

2024 南京大学《操作系统:设计与实现》
我们身边的并发编程

从 Web 1.0 到 Web 2.0

Asynchronous JavaScript and XML (Ajax; ~1999)

  • 允许网页实现 “后台刷新”
    • 悄悄请求后端,然后更新 DOMTree
    • “应用” 可以做的,网页也都可以做了!
  • (你没看错,竟然不是 JSON)
    • 原因:后端 (Java) 应用广泛使用 XML

jQuery $ (2006)

  • 允许 Javascript 代码优雅地修改 DOMTree
  • $('h3').replaceWith('XXX');
2024 南京大学《操作系统:设计与实现》
我们身边的并发编程

从此,做 “任何事” 都只要浏览器就行

center

甚至诞生了 ChromeOS

  • HTML + CSS 构建应用的方便程度超过传统 GUI 编程
  • GTK, Qt, MFC 谁用谁知道 😂
2024 南京大学《操作系统:设计与实现》
我们身边的并发编程

Web 2.0 时代的并发编程

Challenges

  • 线程 (在 1990s) 开销很大
  • 线程同步很难写对

Solution: Event-based concurrency (动态计算图)

  • 允许随时创建计算节点
    • 例如网络请求、定时器
  • 禁止计算节点并行
    • 网络访问占大部分时间;浏览器内计算只是小部分
  • 以事件为单位调度
    • 事件可以在浏览器里看到!
2024 南京大学《操作系统:设计与实现》
我们身边的并发编程

混沌时代的计算图

“Callback hell (回调地狱)”

  • 2024 年,教务系统里还能看到明文 💩🏔️
$.ajax({
    url: '/api/user',
    success: function(user) {
        $.ajax({
            url: `/api/user/${user.id}/friends`,
            success: function(friends) {
                $.ajax({
                    url: `/api/friend/${friends[0].id}`,
                    ...
                });
            },
            error: function(err) { ... }
        });
    }, ...
});
2024 南京大学《操作系统:设计与实现》
我们身边的并发编程

从 “前端” 到 “全栈”

ECMAScript 2015 (ES6)

  • 一统第三方库 “军阀混战” 的局面
  • 开源生态开始起飞

现代前端的代表作品

  • Angular, React, Vue
  • Express.js, Next.js
  • Bootstrap, Tailwindcss
  • Electron (vscode)
2024 南京大学《操作系统:设计与实现》
我们身边的并发编程

Web 2.0 时代的并发编程 (cont'd)

Promise: 描述动态计算图

useEffect(() => {
    fetch(`/api/localhost/?action=demo&path=${path}`)
        .then(response => response.json())
        .then(fetchedData => setData(fetchedData))
}, []);
Promise.all([
    fetch(...).then(...),
    fetch(...).then(...),
    fetch(...).then(...),
]).then(
    // succeeded
).catch(
    // error handling (catches exceptions in the fetch)
)
2024 南京大学《操作系统:设计与实现》
我们身边的并发编程

我们看到历史车轮碾过

PC → Web → Web 2.0 (UGC) → AI (AGI)

  • “框架” 是驱动技术发展的原动力
  • 我们需要好的抽象来表达人类世界中的需求
    • 简单可靠,聚集大量行业开发者
    • 灵活通用,构造各种应用程序

单机 → 互联网 → 移动计算 → ???

  • 机遇和不确定
  • 风险和回报
2024 南京大学《操作系统:设计与实现》