LUG Weekly

HITsz LUG 每周的奇闻轶事

Week 6

2022-04-17

本周群聊

解释 “程序的执行” 的两种方式

深夜,群里开启了哲学模式:什么是 “程序的执行” 呢?

如果一名程序员想对其他人解释程序是如何执行的,大概率他会开始一步一步地 模拟 那个程序; 此时他是在尝试用更底层的概念来构建程序的意义。顺着这条道路走,要想掌握程序的运行,就得取学计组,然后学 OS 跟体系结构等学科。事实上这就是很正常的计科学习路线。

但是,其实要想理解程序的执行,还有第二条路可走 – 定义所谓 “程序” 的 (数学/归纳) 结构,尝试为程序构建一个心智上而不是跟现实里的计算机绑定的模型。在这种情况下,“程序” 其实根本就不会也不能 “执行” – 它只是我们的想法的一种记号,是先在脑子里有了结果才开始构思程序的。

其实换个角度想,学编程就是在一直改进自己对 “程序” 的理解,而对程序的理解很大一部分就是对程序是如何执行的理解。因此欲登编程之巅,大抵也有两条路可走。一条是计组方向,从组成原理学到编译链接,从操作系统学到体系结构,如同 CSAPP 一般,向底学去。另一条是 PL 方向,从数理逻辑学到指称语义,从通用的抽象与组合学到各种各样的语言特性,如同 SICP, EOPL 一样,向高学去。

某种意义上,这两条路就好像玄幻小说里的炼体/炼气一样。走计组的,好比炼体,根基扎实,拳拳到肉,生命力顽强 (不管面对啥千奇百怪的 bug 都可以解决), 但是修炼起来比较枯燥无味,而且灵巧不足。走 PL 的,好比炼气,思绪灵动,花样十足 (多样性强), 适用性广 (能炼丹炼器布阵,啥问题到手都可以轻松分而治之,设计出优雅的程序), 但是修炼起来容易走火入魔 (学歪来), 而且一旦被炼体近身基本上秒杀。

不过小说里的主角大抵都是两个都修炼的,所以作为正常的程序员,最好两条路都去走一走,两边都了解过大概了,再选一条适合自己的路精进。

群友锐评:

群友 B: 有的人自学自然而然往 os 走,我这种人自学自然而然往 pl 方向走

群友 B: (PL 道路) 很偏向数学,很优雅,但是 (在初学阶段) 除了可以让人头脑清晰以外没有什么用

群友 B: 不过当有了 (一定的计组) 基础之后,头脑清晰就比较重要了(

原始对话:

群友 B: 算是两种对“程序的运行”的解释吧

群友 B: 一种是从底层开始,类似 csapp 一样教你计组

群友 B: 另一种是像数学一样给你公理,然后完全用递归定义跟结构归纳“描述”出程序,那么程序的“运行”其实根本就跟时间没有关系,只不过是一系列推导

群友 B: 或者说所谓程序的运行,就是这个推导本身在现实世界的表示而已

群友 B: 要是电波对上了第二种解释就很带感

群友 B: 然而我觉得还是第一种比较适合正常人(

群友 B: 而且不管怎么样作为基本功都得学计组的

群友 A: 其实是抽象的解释先出现的

群友 A: 祭祖只是个有点费劲的 implement

群友 C: 你是否在找:图灵机

群友 B: 这可比图灵机早一点(

群友 B: church 的 lambda 演算顺下来的传统

群友直呼 魏晋清谈

清谈,又称清言,流行于魏晋时期。汉末黄巾之乱,中央政权瓦解,地方势力抬头,儒家经典随之衰落,乱世之中,老庄思想逐渐抬头,一般文人不谈俗事,不谈民生,祖述老庄立论,大振玄风,最常谈的是《周易》、《老子》、《庄子》称为“三玄”。何晏、王弼、夏侯玄、王衍、郭象等人皆有辩才。何晏“好老庄言”,认为“天地万物,皆以无为为本”,和夏侯玄、王弼等倡导玄学,成为一时风气,往往废寝忘食,甚至可以把人累病谈死。“当时名士清谈,特如斗智。”是后世国学大师钱穆对当时清谈的叙述。

群友 B: 太玄学了,都快到空谈了

群友 B: 睡觉

群友 A: 这下魏晋了

润周

鉴于 LUG 周报的更新速度平均每周慢半天,群友仿照闰秒,创新性地提出了 “润周” 的概念:

群友 A: 我觉得按照你群周报的更新速度

群友 A: 说不定要引入润周了

群友 A: 每周慢半天

群友 A: 每 14 周就要润一周

群友 B: 润,都可以润

Crash

群友 A: 来点 Linux Crash Course

群友 B: crash,指人 crash

群友 B: 浇删库

群友 A: ?

所以人和代码要么同时 crash,要么同时不 crash

即,人和代码得同或 crash (

下一步

(群友 A 在用虚拟机装 Ubuntu,下面是他的大脑虚拟机界面发生的变化)

群友 A: 现在的问题是

群友 A: 下一步呢

群友 A:(哭)

其实把 Virtual Box 的窗口拉大一点就能看到了

开源强迫症

群友 A: 感觉陷入了开源坑

群友 A: 啥都想开源自建

手上有鸡,看啥都想自建

缝·诺伊曼架构

群友 A: 现代内核基本都算混合的了

群友 B: 大家都爱缝合怪

群友 B: cpu 也缝

群友 B: 内核也缝

群友 B: 语言也缝

群友 A: nt 那些 dcom 什么的,真的看不出是什么高明的设计

群友 B: 全都可以缝

群友 B: 我理解了

群友 B: 这就是 缝·诺伊曼 架构

Modern C++ 之 Fold expression

来看看 C++ 17 加入的为了 “简化不定参数的使用” 的更新:

template<typename... T>
void println(std::ostream &out, T... args) {
    (out << ... << args);
    out << std::endl;
}

这被称为折叠表达式,具体概念可参考 CppReference: 折叠表达式.

小惊喜:去掉括号就编译不了了哦

unknown vs unkonwn vs unknonw

到底是哪个呢 (:з」∠)

反了反了

(群里正在讨论汇编里的 Load/Store 指令)

群友 A: 看了半天 risc-v,sw 跟 lw 全看反了

群友 B: sw 跟 lw 是啥

群友 A: 就是 store 和 load

群友 B: 哦

群友 B: 啊?

群友 A: 正好是反着来的

群友 B: 这两个还能反??

群友 B: arm 的 load 是 load 寄存器 内存,把内存里的值加载到寄存器里

群友 A: 哦没事了

群友 B: store 是 store 寄存器 内存,把寄存器里的值存到内存里

群友 A: 我看反了反了

所以要准时睡觉哦

你群新词

计算机建筑学: computer architecture

高表演计算: high performance compute

高兴能计算:基于人的情感的高级计算

看电影同步

群友 A: 昨天给 npy 写了个看电影同步

群友 A: 错过了实验 ddl

群友 B: 电影同步?是 notion 那个么

群友 A: 看电影进度同步(在线电影院

群友 C: 可以支持多高并发啊

群友 A: 感觉可以高并发

群友 A: 因为视频可以放本地

群友 D: 视频是本地的

群友 A: 项目只同步进度条

群友 D: 同步进度条

群友 D: 看起来其实蛮爽的

群友 C: 项目已 fork, npy 哪里找?

这就组织 LUG 线上观影会!

项目链接: https://github.com/VaalaCat/movie-sync

贴心的终端

群友问:请问这样打印出来为什么会多一个百分号呢

群友 A: 因为终端觉得换行了你看起来比较舒服

群友 A: 但是它实际上没有换行

群友 A: 所以打个百分号提醒你

群友 A: “这里没有换行,但是我自己换了让你看着舒服点”

群友 B: 贴心终端

群友 C: 好像我在用哪个终端的时候

群友 C: 真的不换行

所以要不要给周报加个 “本周你问我答” 栏目呢 (

本周旧闻慢递

MSRA 停招国防七子及北邮学生

知乎问题链接: https://www.zhihu.com/question/527623669

GitHub 封禁了一些俄罗斯开发者

IT 之家: https://www.ithome.com/0/613/439.htm

本周奇怪 Bug

Spike 之谜

在交流计组实验的时候,群友发现了一个奇怪的现象:

$ spike $(which pk) 1.exec
$ spike pk 1.exec

上面的第一条命令可以正常运行,但是第二条就不行。

这种情况首先怀疑的是 spike 的查找策略 – 有可能它并不在 PATH 中查找。经过研究,群友发现了问题的关键:spikepk 要在同一个目录下。于是随手 ln 一下解决问题。

群友 B: 为啥不直接 alias pk=$(which pk) 呢

本周看了啥

前端低代码框架 AMIS

AMIS:https://github.com/baidu/amis

由百度团队牵头。前端低代码框架,通过 JSON 配置就能生成各种页面。支持 SDK 和 React 两种方式调用。

一个项目本来想照例手搓前端,奈何精力不足,deadline 在即,只能投靠低码框架。

来自 sudo 的训诫

sudoers(5): https://man.archlinux.org/man/sudoers.5.en

这个 manual 的“SUDOERS OPTIONS”小节提到了“lecture”——用户使用 sudo 时终端输出的简短文本,默认情况下只会在某个用户未曾正确输入密码的情况下显示。

而未指定 lecture 时所使用的内置文本(locale 为 en_US.utf8)如下:

We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things:

#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.

相信每一个系统管理员都曾看过这段话,这段话堪比医学中的希波克拉底誓词。希望大家都能将其精神牢记在心,与君共勉。

中文版本

我们信任您已经从系统管理员那里了解了日常注意事项 总结起来无外乎这三点:

#1) 尊重别人的隐私 #2) 输入前要先考虑 (后果和风险) #3) 权力越大,责任越大

Slidev

一个简单的用 Markdown 写幻灯片的框架。通过跟 StackBlitz 的集成可以做到直接在线写在线放。

官网: https://sli.dev/

Linux 命令速查

链接: https://262235.xyz/linux-command

基本上是青春版 man, 支持离线下载,可以下一套自己部署。

新时代垃圾车

群友 A: https://github.com/vercel/pkg

群友 A: electron 往你电脑里塞 114 个 chromium

群友 A: 这个能往你电脑里塞 514 个 nodejs

群友 B: 还有 1918 个 node_modules

深入一点的 C 读物

https://hackmd.io/@sysprog/c-prog/%2F%40sysprog%2Fc-programming

这样 2ndC project 就可以名正言顺地咕咕咕了

I Can Die Now

标题可翻译为: (朝闻道,) 夕可死焉

LTT 参观晶圆厂: https://www.youtube.com/watch?v=2ehSCWoaOqQ

工厂里看起来简直就像科幻小说。

Cloudmusic

在 VS Code 里放网易云!

插件链接: https://marketplace.visualstudio.com/items?itemName=yxl.cloudmusic

VSCode OS

在某群友发了自己的二次元歌单截图之后:

群友 A: 来点二次元入门教程

群友 B: 好想要三维环绕编辑器

群友 B: 二次元入门建议听我 (不是

群友 B: 要我说

群友 B: oi 量产二次元

群友 A: 不是 OIer(

群友 B: 话说

群友 B: 算了我去咕噜咕噜好了

群友 A: 算法倒数

群友 C: 确实

群友 C: OI 全是些 2 次元

群友 D: OI 全是些 2 次元

群友 E: OI 全是些 2 次元

群友 F: OI 全是些 2 次元

群友 D: 呐呐,大哥哥是不是三次元不如意才去打 OI 呀

群友 F: 来点二次元 talk

味太冲了

Inkdrop

新的笔记软件来辣!

特性:多端同步 (Win/Mac/Linux/ios/Android), 各种各样的 md 扩展,还有多光标支持,只要五刀一月。

官网: https://www.inkdrop.app/

万能收藏夹

https://github.com/jarun/buku

了解字体的基础知识

https://sspai.com/post/71957

使用开源工作流自动化工具 n8n 打造个人助理

https://codelc.com/post/dev/tools/n8n/

华为社会招聘心理综合测评攻略

http://www.libin.mobi/?p=2000