虎之书
165 subscribers
4 photos
13 links
微信公众号同名,攒批异步更新
Download Telegram
Channel created
Channel photo updated
过于真实🌚好在毕业的早+跳出 ai 大坑
rust 要坚强啊!

没事咱有 ffi 🐣
No.1 Morning News

1. 🤩 myspaghetti/macos-virtualbox 一个可以一键安装 MacOS 虚拟机的 bash 脚本,支持 MacOS、Windows 和 Linux。

2. 🤙 Tutorial - Write a System Call 教你如何在 Linux 内核中实现一个简单的系统调用,可以学到系统调用的基本原理以及编译自己的 Linux 内核。作者此前还写过一个用 C 实现一个 shell 的教程,也非常值得一读。

3. 🥳 The 5.14 kernel has been released 在 30 周年庆祝的同时,Linux Kernel 5.14 发布了。

4. 📏 Rust Language Cheat Sheet 包含了 Rust 主要特性的快捷参考,图文并茂,追求效率的程序员应该收藏甚至制作自己的 cheat sheet。

Have a nice day!
🔀 Aadit Sheth 在近日的一串推文中表示,用的好的话,你的推特账号可能比你的学历更有用。你需要

1. 控制你关注的内容,99% 的人用推特来看新闻,这没什么不对,但它还可以是高质量信息的来源——前提是你自己控制好

2. 使用推特列表(Twitter Lists)来创建有的放矢的关注列表,这个列表不会被推特的推荐算法影响,而是忠实地以时间顺序列出你收集的账号的内容。

3. 使用高级搜索功能,譬如
> (from:aaditsh) min_faves:1000 marketing
可以搜索来自 aaditsh 这个账号点赞数超过 1000 的包含 “marketing” 关键字的推文,而

> (from:aaditsh) until:2021-09-01 since:2021-05-01
则可以列出特定时间范围内的内容

4. 屏蔽掉杠精和喷子(原词是 troll)

5. 打磨你的个人简介

6. 集成你的 Newsletter,用 newsletter 来写更有深度的文章

7. 使用推特串,把复杂的主题分解为简单可执行的小建议

8. 像本能一样般去建立关系,使用推特的 DM 去接触人

9. 使用名为 Minimal Twitter 的 Chrome 插件去除噪音
最近火起来的人生重启游戏的作者在知乎回答了背后开发的细节,一个非常小的创意竟然短时间内收获如此广泛的关注,足以说明:有趣的 + 能与受众共鸣的产品在当下是稀缺的。
Go 语言之父 Russ Cox 写过三篇关于内存模型(memory model)的文章,对于并发编程已经是必须的今天,任何一个系统程序员都应该对此有正确的认知,强烈推荐阅读。
C++ 中关于函数定义有三个非常容易混淆的概念,即 overload、overwrite 和 override。

overload 是定义具有不同参数类型的同名函数,相当于同一个名字背负了多个不同的函数,所以叫做重载(load 对应的中文是负载);

overwrite 发生在编译时多态,即子类定义了一个和父类非 virtual 函数相同名字的函数,那么父类的这个函数将被隐藏,所以叫做重写或者隐藏(write 就是写嘛);

而 override 则是我们实现虚函数的时候写的关键词,即运行时多态,可以实现通过父类指针调用子类方法的效果,所以称之为覆盖。

正确理解这三个关键词的前提是弄清楚 C++ 的多态机制以及调用函数时发生的 name resolution 机制。

类似这种需要厘清的概念在 C++ 中非常多,花时间自己总结和归纳是最好的学习方法。
Channel name was changed to «虎之书»
通常来说编译和运行在 Linux 上的 Rust 程序底层是依赖 libc 的,原生的系统调用需要通过 libc 抽象的接口才能被 Rust 调用。Rust programs written entirely in Rust 是一个有趣的尝试:移除 libc 这一层 C 的中间层,让 Rust 程序的执行自上而下都只经过 Rust。

为了达成这个目的,作者实现的 mustang 运行时通过短短几行嵌入汇编让程序启动后直接调用 rust 函数,使用 rsix 包提供的系统调用,并实现了 C ABI 兼容的 Rust 的标准库依赖的一些 libc、libpthread 等库的函数,最后使用自定义的 global_allocator 代替了默认的 malloc 作为 Rust 运行时的内存分配器,从而实现了一个可以打印 hello world 的 demo。

很难说这个 mustang 运行时是否有实际价值,但实现这样一个小项目一定是很有趣的 hack 经历。

回顾程序启动与运行,本质上都是 CPU 指令。

链接后的 ELF 可执行文件中会有一个特殊的地址作为操作系统返回到用户态开始执行程序的入口。

用户从 shell 中执行程序时,shell 会调用 execve 系统调用,同时压入 argc, argv 和 envp 的参数,把运行程序的任务交接给内核。

内核加载并解析 ELF 二进制后,返回用户态并跳转到程序入口。

这个入口是整个程序的执行开始的地方,由运行时提供(常见的运行时有 libc、musl、crt 等),通常需要初始化栈(即设置栈寄存器),以及调用一些初始化函数,当这些都完成后,就可以把执行交给 main 函数。

用户程序和内核交互需要通过系统调用,本质上是特殊的 CPU 指令配合内核相关的系统调用编号实现,直接操作会降低程序的可移植性,所以通常也会由运行时来提供一层抽象,一方面用户程序可以直接调用函数实现系统调用,另一方面可以通过换运行时重新编译在不同平台上移植程序。

这些是在操作系统课上学到的知识,可惜我只局限在知道,但从未真正实践过。Hack 的核心之一就是实践,这个项目还是很有启发意义的。
你的思维很有可能是被工具定义的。

譬如语言定义了你对概念的认知,学习一门新的语言会为你打开新世界的大门。同样成立的是信息时代的工具,你会使用什么样的创造力工具定义了你的想象力的疆界。

熟练使用视频剪辑工具,你可以把你的想法用视频表达;精通编程,你可以用程序创世;会使用 Figma,你可以想象更好的界面设计是什么样的;会使用 3D 设计工具,你可以利用 3D 打印设计很多精巧的小物件;会使用电路设计工具,你可以从电路布线到实体打样一个 PCB 制作自己的电子设施。这些可能性都是建立在你会使用某个工具的前提下的。

同时,以工具为前提的学习,往往更具有目的性和实操性,以点带面,可以迅速通晓一个领域的重点知识。

这就是我理解的工具主义。