Week 6
本周群聊
解释 “程序的执行” 的两种方式
深夜,群里开启了哲学模式:什么是 “程序的执行” 呢?
如果一名程序员想对其他人解释程序是如何执行的,大概率他会开始一步一步地 模拟 那个程序; 此时他是在尝试用更底层的概念来构建程序的意义。顺着这条道路走,要想掌握程序的运行,就得取学计组,然后学 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
中查找。经过研究,群友发现了问题的关键:spike
和 pk
要在同一个目录下。于是随手 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 扩展,还有多光标支持,只要五刀一月。
万能收藏夹
了解字体的基础知识
使用开源工作流自动化工具 n8n 打造个人助理
https://codelc.com/post/dev/tools/n8n/