#py 周刊
#ts Mypy: 1.5
Mypy 是 Python 的静态类型检查工具,1.5 版本主要功能有: @overrride 、更灵活的 TypedDict(字面创建的 dataclass) 创建和更新、可显示错误代码的文档、改进了泛型函数的类型推断、
#ai 整理和预处理pdf文件,让GPT访问
- 杀死 ProcessPoolExecutor
Python 自身不适合处理 CPU 密集型任务,文章中项目原本使用进程池来规避 GIL 问题,后使用线程、C++ 扩展,内存使用量减少 50%,CPU 使用量减少约 20%
- 观点: Py 不适合编写100行以上的软件,因为弱类型、重构难和性能
- 上下文管理器
骗你的。Java式接口让人难以评价:
btw. 你可以用 %%showast 和 astor 查看算式的树状图和代码形式
- viztracer 提供了 DevTools profile 页
#datas 绘制多个直方图、折线图表
- #tex 对比"星星旗帜"的海龟画图 Python 来学习 PostScript
PostScript 广泛用于打印机、出版和图形设备。文章将可被
#java 如何编写简单的C模块,篡改 CPython 解释器的数字
导入一个模块后,如何让 print(8) 会打印出 9?只需要拿到整数对象池,交换两个大整数引用的值
在 py 文件中写上一句,执行这个文件,幕后都发生了什么呢?文章使用了 readelf 、strace 、ldd 、debugfs 、/proc 、ltrace 、dd 和 stat 等工具,详细解释了脚本被执行的过程。
主要涉及操作系统,GNU libc 相关的内容
推荐阅读
—
#js htmx: 强化的 form table dialog,交互式界面扩展
#php 🤯 Slack: 我们认真觉得PHP好用
#ts Mypy: 1.5
Mypy 是 Python 的静态类型检查工具,1.5 版本主要功能有: @overrride 、更灵活的 TypedDict(字面创建的 dataclass) 创建和更新、可显示错误代码的文档、改进了泛型函数的类型推断、
__slots__
的优化、步进 Python 3.12#ai 整理和预处理pdf文件,让GPT访问
from bot import Retriever, llm_reply#backend 用 numpy, 线程池 优化数学区间求和函数
- 杀死 ProcessPoolExecutor
Python 自身不适合处理 CPU 密集型任务,文章中项目原本使用进程池来规避 GIL 问题,后使用线程、C++ 扩展,内存使用量减少 50%,CPU 使用量减少约 20%
- 观点: Py 不适合编写100行以上的软件,因为弱类型、重构难和性能
from contextlib import suppress的妙用
with suppress(FileNotFoundError):
- 上下文管理器
from tenacity import Retrying, stop_after_attempt #AbortSignal:
for attempt in Retrying(3):
with attempt
骗你的。Java式接口让人难以评价:
for i in Retrying(stop=stop_after_attempt(3)):#visualize #plt LibCST: 遍历Python3代码树
with i:
print(f"🧨炸弹{'真的'*i.retry_state.attempt_number} 要炸了!")
try: time.sleep(2) # 按Ctrl+C !
except:pass
else: raise Exception("💥!")
btw. 你可以用 %%showast 和 astor 查看算式的树状图和代码形式
- viztracer 提供了 DevTools profile 页
#datas 绘制多个直方图、折线图表
- #tex 对比"星星旗帜"的海龟画图 Python 来学习 PostScript
PostScript 广泛用于打印机、出版和图形设备。文章将可被
convert -page 720x480 flag.ps flag.png
的程序,直译成对接到 matplotlib 的 Python 代码#java 如何编写简单的C模块,篡改 CPython 解释器的数字
导入一个模块后,如何让 print(8) 会打印出 9?只需要拿到整数对象池,交换两个大整数引用的值
swap( (PyLongObject*)PyLong_FromLong(8)->ob_digit[0] , (9) )#os #linux 在 execvp(["python3", “Hello World.py”]) 时,会发生什么?
在 py 文件中写上一句,执行这个文件,幕后都发生了什么呢?文章使用了 readelf 、strace 、ldd 、debugfs 、/proc 、ltrace 、dd 和 stat 等工具,详细解释了脚本被执行的过程。
主要涉及操作系统,GNU libc 相关的内容
推荐阅读
—
#js htmx: 强化的 form table dialog,交互式界面扩展
<form hx-put="/contact/1" hx-target="this" hx-swap="outerHTML">
#php 🤯 Slack: 我们认真觉得PHP好用
Telegram
Newlearnerの自留地
#Python潮流周刊 #Newsletter
Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?
🦄文章&教程
- 如何分析 FastAPI 异步请求的性能?
- 利用 FastAPI 的后台任务:增强性能和响应能力
- 使用 Python 创建直方图
- Mypy 1.5 发布了
- 在 Linux 上运行 Python 的“Hello World”脚本时,会发生什么?
- 通过对比 Python 来学习 PostScript
- Python 中不那么随意的性能优化
-…
Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?
🦄文章&教程
- 如何分析 FastAPI 异步请求的性能?
- 利用 FastAPI 的后台任务:增强性能和响应能力
- 使用 Python 创建直方图
- Mypy 1.5 发布了
- 在 Linux 上运行 Python 的“Hello World”脚本时,会发生什么?
- 通过对比 Python 来学习 PostScript
- Python 中不那么随意的性能优化
-…
#py 周刊
Python,YAML 的缩进为何比C系优秀
4、strictyaml:类型安全的 YAML 解析和校验库
用于解析 YAML 的受限子集,拒绝解析丑陋的、难以阅读和不安全的 YAML 简写,有严格的标记验证和直接的类型转换
TOML 文件格式有什么问题?
“改进的” INI 文件,是 pip 推荐的配置文件格式。但连 TOML 的作者也认为它是一种糟糕的格式!
12、Python Fire:自动生成命令行接口
谷歌开源的一个用于生成 CLI 的库,Github 25K star。这篇文章介绍了它的一般命令、组合命令、链式命令、复杂命令等用法。
5、facefusion:更先进的换脸工具
最新开源的一个人像换脸库,star 涨得飞快!(star 6.9K)
#tool 把网页转换成 Markdown 格式存储
一站式 LLM 底层技术原理入门指南
基于数学点乘的 Transformer原理引言
7、instagraph:将文本内容或 URL 转换为可视化的知识图谱
可以提取复杂信息中的名词实体,生成它们的关系图谱。使用了 GPT-3.5,以及 Flask
该以一种怎么样的心态对待开源
🐎 网易云音乐 Tango 低代码引擎正式开源!
文章集 Writing an #OS in Rust , 从linker-BIOS ABI到算法
Thorium.rocks : Chromium 改版
10、使用 Django 和 HTMX 开发一个数据库搜索项目
一篇详细的 Django 项目教程,实现一个全栈的项目。文中有作者的教程视频。
11、异步 SqlAlchemy 和多数据库管理
利用 asyncio 和 SqlAlchemy 库,文章探讨了如何有效地连接和管理多个数据库,获得可扩展且具有弹性的架构。文章介绍了两种实现方法。
前端新轮子 Nue JS,作者称要打造全新的 Web 生态 [docs]
tornado Web 框架 的协程调度原理
14、为什么 Python 代码在函数中运行得更快?
代码执行的工作原理是什么?如何测试与优化 Python 函数的性能?
13、我最爱的解 LeetCode 问题的 Python 技巧
#algorithm 玩转遗传算法
遗传算法(Genetic Algorithm)是一种受生物进化理论启发的优化算法,用于解决复杂的搜索和优化
9、调试 Python 中正则表达式的灾难性回溯
作者使用 py-spy 定位一个 CPU 100% 占用问题,找出了罪魁祸首的正则表达式
Python abc 类型提示的轻量化:接口
Python,YAML 的缩进为何比C系优秀
4、strictyaml:类型安全的 YAML 解析和校验库
用于解析 YAML 的受限子集,拒绝解析丑陋的、难以阅读和不安全的 YAML 简写,有严格的标记验证和直接的类型转换
TOML 文件格式有什么问题?
“改进的” INI 文件,是 pip 推荐的配置文件格式。但连 TOML 的作者也认为它是一种糟糕的格式!
12、Python Fire:自动生成命令行接口
谷歌开源的一个用于生成 CLI 的库,Github 25K star。这篇文章介绍了它的一般命令、组合命令、链式命令、复杂命令等用法。
5、facefusion:更先进的换脸工具
最新开源的一个人像换脸库,star 涨得飞快!(star 6.9K)
#tool 把网页转换成 Markdown 格式存储
一站式 LLM 底层技术原理入门指南
基于数学点乘的 Transformer原理引言
7、instagraph:将文本内容或 URL 转换为可视化的知识图谱
可以提取复杂信息中的名词实体,生成它们的关系图谱。使用了 GPT-3.5,以及 Flask
该以一种怎么样的心态对待开源
🐎 网易云音乐 Tango 低代码引擎正式开源!
文章集 Writing an #OS in Rust , 从linker-BIOS ABI到算法
Thorium.rocks : Chromium 改版
10、使用 Django 和 HTMX 开发一个数据库搜索项目
一篇详细的 Django 项目教程,实现一个全栈的项目。文中有作者的教程视频。
11、异步 SqlAlchemy 和多数据库管理
利用 asyncio 和 SqlAlchemy 库,文章探讨了如何有效地连接和管理多个数据库,获得可扩展且具有弹性的架构。文章介绍了两种实现方法。
前端新轮子 Nue JS,作者称要打造全新的 Web 生态 [docs]
tornado Web 框架 的协程调度原理
14、为什么 Python 代码在函数中运行得更快?
代码执行的工作原理是什么?如何测试与优化 Python 函数的性能?
13、我最爱的解 LeetCode 问题的 Python 技巧
#algorithm 玩转遗传算法
遗传算法(Genetic Algorithm)是一种受生物进化理论启发的优化算法,用于解决复杂的搜索和优化
9、调试 Python 中正则表达式的灾难性回溯
作者使用 py-spy 定位一个 CPU 100% 占用问题,找出了罪魁祸首的正则表达式
Python abc 类型提示的轻量化:接口
from typing import Protocol
@typing.runtime_checkable
class DuckLike(Protocol):
def walk(self, to: str) -> None: ...
Telegram
Newlearnerの自留地
#Python潮流周刊 #Newsletter
Python 潮流周刊#20:为什么代码在函数中运行得更快?
🦄文章&教程
1、三种对 Python 作基准测试的方法
2、舍弃 Poetry 和 PDM,切换成 Hatch
3、TOML 文件格式有什么问题?
4、用 Python 玩转遗传算法
5、现代 Python 的类型提示:Protocal 类
6、tornado 的协程调度原理
7、可视化 CPython 发布过程
8、如何用 PyObjC 与 Apple Vision 框架作文本识别
9、调试…
Python 潮流周刊#20:为什么代码在函数中运行得更快?
🦄文章&教程
1、三种对 Python 作基准测试的方法
2、舍弃 Poetry 和 PDM,切换成 Hatch
3、TOML 文件格式有什么问题?
4、用 Python 玩转遗传算法
5、现代 Python 的类型提示:Protocal 类
6、tornado 的协程调度原理
7、可视化 CPython 发布过程
8、如何用 PyObjC 与 Apple Vision 框架作文本识别
9、调试…
duangsuse::Echo
#FP #math 的一些 #statement #tool html bookmarklet data:text/html;utf8,<body ContentEditable> —10÷3=3…1 被大佬建议写成 =(3)3+1 即m=qn+r (r<q)形式的“短除法” ,理由是...没交换律 “理论家布尔巴基有个笑话: 1+2当然是2加1,因为整数对加法构成阿贝尔群” 当然,纠结这些除和除以工程意义不大 ax+i=b; x,i=divmod(b,a) 的可变量元组数学里可是没有。函数只是“关…
#learn #dalao async https://lutaonan.com/blog/my-coding-road/
#go #os https://accidentallyquadratic.tumblr.com/post/113405561337/debian-sbuild
异步,就是在此Thread之外完成res=sleep()等耗时任务。不在一个调栈上,它的retAddr就必须转回调参数;因要建多个Task监听res —如FJP式并行,调用者就该用 event queue "epoll"而非
OS内核使用分时「抢占式调度」,协程则主动休眠并pass出自己的回调,是单核并发 无「上文切换」开销
TS使用的async 是从yield协程co()得来的平等协程,它在yield Promise的位置,传入状态机即续体NEXT
假若 yield(x) 的续体没被写死为
co-routine 和closure 都是靠栈转堆 “把编译器当OS内核用”。经典模式
续体的局部变量+语句指针堆上分配,不占调用栈。语句走完后,触发then(retAddr)
占1线程应该 当队列 当CPU cycle。Go和Kt支持waitGroup,select "epoll" 也就是Promise.all,race 了,它们都给了协程作用域即错误边界
^FJP: ForkJoin, MapReduce
^如果
JSDOM的并发撤销很保守,“用不到=不用学”,而某些新语言和Rx移动端的很狂野,好像《我会自己上线程池》是智子加锁的API一样
所以JSPy简直后端界良心
#go #os https://accidentallyquadratic.tumblr.com/post/113405561337/debian-sbuild
异步,就是在此Thread之外完成res=sleep()等耗时任务。不在一个调栈上,它的retAddr就必须转回调参数;因要建多个Task监听res —如FJP式并行,调用者就该用 event queue "epoll"而非
while(!res.ok)
C线程就是内核调度的协程,即「有栈协程」或虚拟线程,好在没await传染性OS内核使用分时「抢占式调度」,协程则主动休眠并pass出自己的回调,是单核并发 无「上文切换」开销
TS使用的async 是从yield协程co()得来的平等协程,它在yield Promise的位置,传入状态机即续体NEXT
假若 yield(x) 的续体没被写死为
self.value=x,next=NEXT
,异步可直接传入回调NEXTco-routine 和closure 都是靠栈转堆 “把编译器当OS内核用”。经典模式
while()yield
就取代了class Iterator{},这类似Linux cat .txt|less
毕竟文件流有时相当于SIG{HUP,CONT}续体的局部变量+语句指针堆上分配,不占调用栈。语句走完后,触发then(retAddr)
占1线程应该 当队列 当CPU cycle。Go和Kt支持waitGroup,select "epoll" 也就是Promise.all,race 了,它们都给了协程作用域即错误边界
^FJP: ForkJoin, MapReduce
^如果
int waitpid()
能发扬fork()的魔术 返回JSON的话,多线程或许都会晚些到来呢?JSDOM的并发撤销很保守,“用不到=不用学”,而某些新语言和Rx移动端的很狂野,好像《我会自己上线程池》是智子加锁的API一样
所以JSPy简直后端界良心
Lutaonan
我的编程经历 | Randy's Blog
About life, technology and reading
#wasm #os #linux
https://telegra.ph/Linux-中-RISC-V-的-mmap-的重大问题-01-29
冷知识Q&A
> RISC-V Linux 内存页表(vm_area)适配问题在供应链的什么层级?
首先man 上写的支持sv48,但代码支持不到 且语义错误 这不符合Linus的严谨度
答:在JVM,gcc-libs 层级,影响交叉编译
mmap还用于0copy fwrite() ,拒绝在用户态搞 IO Buffers
brk 是ELF体系下自带的内存池,暂存碎片化的小对象(4K分页后 lazy分配的)。其实 open() fd 也是个Refcount对象,因此,rm -rf 不像NT总提示文件未close()拒绝访问(还有内存不能BE READ ,坐和放宽,哈哈)
> x64 等ISA更费内存吗
确实,每个指针都占8byte,.so.text 段也会膨胀,只是整数计算和GPU无需这么高精度。(.rodata/bss 段不会,因为依然 int=i32,char=u8 , 另外这些段Addr<heap)
这不利于嵌入式,每条指令都耗电的。但SSE等特性、游戏的流畅度需要大量内存,所以32转64是种进步,更何况小白用户眼里下载 1G值1刀啊
.so段可以用
> 47bit?
在 webVM.io 试玩Linux(su密码是 password)是查不了这种运维命令:它只实现 ext2fs(on http byterange) 和 net 的沙盒
> 寻址?
对CPU和内存分时复用(并发,容器化..统一设备格式API)是kernel的基本功。
btw. sshfs,squashfs,overlayfs,snap 不是必须链接到FUSE,这只是微/宏内核之辩,类似于Android的反GPL C/S架构: system_server-AIDL-HAL.sysfs.dts
https://xiaolincoding.com/os/2_os_structure/linux_vs_windows.html#linux-的设计
线程,就是完全共享内存的多进程,使用strace 就会发现main()线程只是个进程组。免root gdb 据此实现AOP
内存段,能下载内存条~如swap分区就是时间换空间,反义词是ramdisk=rd
WinXP 启用/PAE后多进程可以突破4G内存限制。在分段寻址数组的DOS, size_t < void*
获取堆起始只需在putenv,asprintf,. 前调用 sbrk(0)。 stack可以在 gdb cat 里看 bt; 或
tcmalloc等堆分配器不会比GC简单。它们不会线性地查找4~?KB空闲链表或建正好够大的块,从而减少难以复用的碎片。这里不是说二叉"堆"算法,但它涉及 Hash桶,BitSet,Trie,线段树,SortedSet(RBt)—反正 Doug Lea 都会!
> BIT(38)?
作者希望一直使用sv48 MMU 模式,和x86一致
不然就需要先if(mmap) 一下,看是否支持sv57,我猜的
AI: 当 mmap 的文件大小超过虚拟地址空间的大小时,RISC-V 会返回 -ENOMEM 错误,而其他架构会返回成功。可能会给 RISC-V 的软件移植带来一些灾难问题。
> mmap() 到的bytes比read()更快吗?
从编程范式来讲,read+write(另存为式) IO 反而是最FP、最全拷贝的做法,而 mremap(mount,但挂载是对象树) 更适合随处+单次修改增长
FP的性能都很差。mmap 除了对碎片(npm,pip缓存..) 慢,不适合 line/request-buffered 等IO 需求(.sock vs SHM),它可以表示任何文件格式
只有从 load即拷贝+dump(csv/ini/bytes) 统一为单YAML编辑指针,才能完全避免
说人话: Linux 内存分页器和 FAT 等文件系统间只是算法的差异。今天,睡休眠已经取代开关机,内存和磁盘何必隔着序列化?像CRIU那样进程快照如何? C对数据结构的僵化早该退场了
#暴论 OSdev一点不比各语言的stdlib人聪明。 Linux内存段本该是C对象(不止有bytes)、而进程本该是C协程(不止能exit0),你看 ps|head 就知道那是
async 说白了,就是拿retAddr闭包"链表"当线程栈用,手动
只是DOM把内核允许死循环的洞补好罢了,让parallel,SIMD被严谨的 numpy,ForkJoin(PySpark~多线下载) 取代,用
DOM渲染器和linux/sched就是一类东西。如果学习WASM拒绝int指针,检查每次索引越界,userspace 内存地址完全隔离有鬼用?直接拿inode改文件内容,核内核外大和谐
反正Android,Web框架也必须做权限和apt管理,fd,cookie那就是RPC句柄嘛。SQL注入不就本来是想传bool函数来RPC,无奈PHP的operator重载力(DSL悟性)太差 只好去eval代码致RCE。 markdown 渲染杀死了评论区XSS。剩下的复杂性就是libs表现欲过剩,矫枉过正。我这就是唱Powershell 打POSIX
再比如eBPF抓包,这种程度的AOP,ruby js DevTools 玩烂了的东西,换API集 换到 globalThis=ld-linux(ver.so) 就变科技了,其实就是工具链烂 语法丑 👎
C 编译器总是做能截断struct val 的访问,做不检查接口的union{}多态,暴露不含size的list(美其名曰buffer&支持多返回),CLR和Go可没有,RESTful 则更加安全。py只靠ctypes+Rc 就干爆了strcat和各种野指针
C也没有匿名函数,所以
如果我们摒弃所有术语,只从语意和用户需求,自顶向下地谈,IT和CS的技术,往往只是被不断地跨端复制 👎
btw. so文件是 Singleton Object 的缩写 \: section-segment 则是常量池和堆。 gcc -static 只会打包有符号表的.o 汇编,是做tar 不涉及ld导出表
https://telegra.ph/Linux-中-RISC-V-的-mmap-的重大问题-01-29
冷知识Q&A
> RISC-V Linux 内存页表(vm_area)适配问题在供应链的什么层级?
首先man 上写的支持sv48,但代码支持不到 且语义错误 这不符合Linus的严谨度
答:在JVM,gcc-libs 层级,影响交叉编译
glibc.malloc() 会请求 brk(<128KB)或 mmap(-1=/dev/mem)
py.mmap(*fpage, access=PROT_EXEC); fpage=fd+len+offset
mmap(vaddr+len, PROT_EXEC, MAP_PRIVATE, fd+offset); MAP_FIXED=dup2=replace
mmap还用于0copy fwrite() ,拒绝在用户态搞 IO Buffers
brk 是ELF体系下自带的内存池,暂存碎片化的小对象(4K分页后 lazy分配的)。其实 open() fd 也是个Refcount对象,因此,rm -rf 不像NT总提示文件未close()拒绝访问(还有内存不能BE READ ,坐和放宽,哈哈)
> x64 等ISA更费内存吗
确实,每个指针都占8byte,.so.text 段也会膨胀,只是整数计算和GPU无需这么高精度。(.rodata/bss 段不会,因为依然 int=i32,char=u8 , 另外这些段Addr<heap)
这不利于嵌入式,每条指令都耗电的。但SSE等特性、游戏的流畅度需要大量内存,所以32转64是种进步,更何况小白用户眼里下载 1G值1刀啊
.so段可以用
readelf -Sd; ldd
查询, Termux.dev waydro.id MSYS2.org 能够跨 glibc,bionic,msvc libc 平台, just like webVM.io 😋 #recommend > 47bit?
2**32 /1024**3 =4GB, fat32单文件最大
2**47 /1024**4 =128TB, linux v6.6 单进程最大工作集
cat /proc/cpuinfo
可以看到CPU最大寻址范围在 webVM.io 试玩Linux(su密码是 password)是查不了这种运维命令:它只实现 ext2fs(on http byterange) 和 net 的沙盒
> 寻址?
对CPU和内存分时复用(并发,容器化..统一设备格式API)是kernel的基本功。
sudo cat /proc/self/maps|grep ]
里,地址从低到高是 heap(brk) stack vsyscall(类似 fakeroot,libfuse 等AOP)btw. sshfs,squashfs,overlayfs,snap 不是必须链接到FUSE,这只是微/宏内核之辩,类似于Android的反GPL C/S架构: system_server-AIDL-HAL.sysfs.dts
https://xiaolincoding.com/os/2_os_structure/linux_vs_windows.html#linux-的设计
线程,就是完全共享内存的多进程,使用strace 就会发现main()线程只是个进程组。免root gdb 据此实现AOP
内存段,能下载内存条~如swap分区就是时间换空间,反义词是ramdisk=rd
WinXP 启用/PAE后多进程可以突破4G内存限制。在分段寻址数组的DOS, size_t < void*
获取堆起始只需在putenv,asprintf,. 前调用 sbrk(0)。 stack可以在 gdb cat 里看 bt; 或
info proc all
tcmalloc等堆分配器不会比GC简单。它们不会线性地查找4~?KB空闲链表或建正好够大的块,从而减少难以复用的碎片。这里不是说二叉"堆"算法,但它涉及 Hash桶,BitSet,Trie,线段树,SortedSet(RBt)—反正 Doug Lea 都会!
> BIT(38)?
作者希望一直使用sv48 MMU 模式,和x86一致
不然就需要先if(mmap) 一下,看是否支持sv57,我猜的
AI: 当 mmap 的文件大小超过虚拟地址空间的大小时,RISC-V 会返回 -ENOMEM 错误,而其他架构会返回成功。可能会给 RISC-V 的软件移植带来一些灾难问题。
> mmap() 到的bytes比read()更快吗?
从编程范式来讲,read+write(另存为式) IO 反而是最FP、最全拷贝的做法,而 mremap(mount,但挂载是对象树) 更适合随处+单次修改增长
FP的性能都很差。mmap 除了对碎片(npm,pip缓存..) 慢,不适合 line/request-buffered 等IO 需求(.sock vs SHM),它可以表示任何文件格式
只有从 load即拷贝+dump(csv/ini/bytes) 统一为单YAML编辑指针,才能完全避免
malloc(手动"黏包"BUFSIZE)
和样板代码。但最前沿的,JSON的增量性序列化库 tree-sitter 都不好用。 为了0拷去用strcat,printf()
而拒绝模板字符串亏大了说人话: Linux 内存分页器和 FAT 等文件系统间只是算法的差异。今天,睡休眠已经取代开关机,内存和磁盘何必隔着序列化?像CRIU那样进程快照如何? C对数据结构的僵化早该退场了
#暴论 OSdev一点不比各语言的stdlib人聪明。 Linux内存段本该是C对象(不止有bytes)、而进程本该是C协程(不止能exit0),你看 ps|head 就知道那是
def pipe(): yield line
,再比较下 Promise.{all,race}
与O_NONBLOCK的 epoll 呢?async 说白了,就是拿retAddr闭包"链表"当线程栈用,手动
for(;;)getEvListeners(events.poll轮询)()
跑这些小线程,只为了更轻量(隔绝于竞态的 SIGINT等抢占式异步)只是DOM把内核允许死循环的洞补好罢了,让parallel,SIMD被严谨的 numpy,ForkJoin(PySpark~多线下载) 取代,用
job或yield(x).then(回调自身)
而无所谓"线程" "阻塞" 🐴DOM渲染器和linux/sched就是一类东西。如果学习WASM拒绝int指针,检查每次索引越界,userspace 内存地址完全隔离有鬼用?直接拿inode改文件内容,核内核外大和谐
反正Android,Web框架也必须做权限和apt管理,fd,cookie那就是RPC句柄嘛。SQL注入不就本来是想传bool函数来RPC,无奈PHP的operator重载力(DSL悟性)太差 只好去eval代码致RCE。 markdown 渲染杀死了评论区XSS。剩下的复杂性就是libs表现欲过剩,矫枉过正。我这就是唱Powershell 打POSIX
再比如eBPF抓包,这种程度的AOP,ruby js DevTools 玩烂了的东西,换API集 换到 globalThis=ld-linux(ver.so) 就变科技了,其实就是工具链烂 语法丑 👎
C 编译器总是做能截断struct val 的访问,做不检查接口的union{}多态,暴露不含size的list(美其名曰buffer&支持多返回),CLR和Go可没有,RESTful 则更加安全。py只靠ctypes+Rc 就干爆了strcat和各种野指针
C也没有匿名函数,所以
pthread_create(fn,必须绑定arg)
。对象和闭包都是代码+数据 是双指针。OOP就是FP,class是共享构造参数的多函数如果我们摒弃所有术语,只从语意和用户需求,自顶向下地谈,IT和CS的技术,往往只是被不断地跨端复制 👎
btw. so文件是 Singleton Object 的缩写 \: section-segment 则是常量池和堆。 gcc -static 只会打包有符号表的.o 汇编,是做tar 不涉及ld导出表
Telegraph
Linux 中 RISC-V 的 mmap 的问题
目前RISC-V Linux的mmap出现了一个和x86/arm都不一样的行为,我提交了一个patch希望得到一些Linux Kernel开发者声援,比较希望得到关注尽快合并进6.8 Kernel,否则可能随着sv48/sv57的机器越来越普及,rv的软件移植会带来一些灾难问题,也会影响一些内存需求较大的软件在RISC-V平台上的使用。 之前在linux v6.6的时候有人交了一个patch希望把rv上的mmap默认返回47bit以内的虚拟地址空间,因为一些JIT翻译的应用可能使用虚拟地址指针的高位用于…
duangsuse::Echo
#wasm #os #linux https://telegra.ph/Linux-中-RISC-V-的-mmap-的重大问题-01-29 冷知识Q&A > RISC-V Linux 内存页表(vm_area)适配问题在供应链的什么层级? 首先man 上写的支持sv48,但代码支持不到 且语义错误 这不符合Linus的严谨度 答:在JVM,gcc-libs 层级,影响交叉编译 glibc.malloc() 会请求 brk(<128KB)或 mmap(-1=/dev/mem) py.mmap(*fpage…
#os malloc 空闲链表讲解 https://youtu.be/CulF4YQt6zA?t=106
ref:
https://hackliza.gal/en/posts/r2heap/ 调试器最懂OS
#wasm https://github.com/thi-ng/tinyalloc
https://github.com/microsoft/mimalloc 用8k行(jemalloc 10%) 可实现高性能, 不压缩碎片的GC
kwd: Zig heap memScoped
ref:
https://hackliza.gal/en/posts/r2heap/ 调试器最懂OS
#wasm https://github.com/thi-ng/tinyalloc
https://github.com/microsoft/mimalloc 用8k行(jemalloc 10%) 可实现高性能, 不压缩碎片的GC
kwd: Zig heap memScoped
YouTube
i wrote my own memory allocator in C to prove a point
Malloc sucks. Memory leaks, use after free? What ELSE is there to say? Instead of suffering through using malloc, I decided to write my own heap.
Heaps are, interesting. I learned alot here. Lets find out more together.
🏫 COURSES 🏫 Learn to code in C at…
Heaps are, interesting. I learned alot here. Lets find out more together.
🏫 COURSES 🏫 Learn to code in C at…
#os #embed #learn http://www.bilibili.com/video/BV1JM4m1U71z
总结:os就是对cpu,mem的分时复用,然后支持ip,io,fs
用过嵌入式都知道dts设备树
usb2,iic,uart有D+D-,sDA sCLK,tx rx 二线传输数据,spi是 di do cl cs 四线
vga 有RGB HVg六线,这些都叫io。 linux用/dev/mouse0 这样的已解析数据作为接口,但更简单的内核上,直接用函数也是可行的
然而,为何有syscall这种“RPC手段”,为何非得把对象opaque type(inline class)化为“句柄”,而不能使用OOP的封装-例如pwsh的ps命令,那要怪C的指针-mmap模型为何允许捏造一个地址去访问,为何不记录数组长度、子项引用计数,
带来所谓空指针、野指针、未free、内核态上文切换栈拷贝 的问题
其实哪怕把愚钝的for(int i..) 换成区间迭代 (0~9):(i) 错误也会少很多
但是多少C系程序员沉溺于此啊?
像JVM,js.permissions 以及 unikernel.org ,微内核,虽然也是一种“虚拟地址空间vma”实现,却不需要划分所谓Ring0,1的隔离。
app写成的驱动,照样不能像DOS那样越权擦磁盘,这就是编程语言的主导意义了。内核级的Lua,就和rust一样安全
总结:os就是对cpu,mem的分时复用,然后支持ip,io,fs
用过嵌入式都知道dts设备树
usb2,iic,uart有D+D-,sDA sCLK,tx rx 二线传输数据,spi是 di do cl cs 四线
vga 有RGB HVg六线,这些都叫io。 linux用/dev/mouse0 这样的已解析数据作为接口,但更简单的内核上,直接用函数也是可行的
然而,为何有syscall这种“RPC手段”,为何非得把对象opaque type(inline class)化为“句柄”,而不能使用OOP的封装-例如pwsh的ps命令,那要怪C的指针-mmap模型为何允许捏造一个地址去访问,为何不记录数组长度、子项引用计数,
带来所谓空指针、野指针、未free、内核态上文切换栈拷贝 的问题
其实哪怕把愚钝的for(int i..) 换成区间迭代 (0~9):(i) 错误也会少很多
但是多少C系程序员沉溺于此啊?
像JVM,js.permissions 以及 unikernel.org ,微内核,虽然也是一种“虚拟地址空间vma”实现,却不需要划分所谓Ring0,1的隔离。
app写成的驱动,照样不能像DOS那样越权擦磁盘,这就是编程语言的主导意义了。内核级的Lua,就和rust一样安全
Bilibili
口袋操作系统:CPU 虚拟化 | 内存虚拟化 | 持久化 | 并发 | 标准库 | 系统调用_哔哩哔哩_bilibili
「OSTEP 英文版」https://pages.cs.wisc.edu/~remzi/OSTEP/「视频代码仓库」https://github.com/efficlab/Pocket-OS, 视频播放量 24567、弹幕量 154、点赞数 1296、投硬币枚数 613、收藏人数 2201、转发人数 69, 视频作者 EfficLab实验室, 作者简介 从硬件到软件,我们生产最好的计算机技术视频。,相关视频:制作一个CPU来运行程序,再见,VUE3!,利用300行代码实现文件系统,加深对底层的理解快速了…
#learn #kt Benny霍评论区
协程 async。自动传回调、var都打包到其class因为,比如传给sleep()后自己要return。协程对象就比()->闭包多留个switch(nthStmt){}
把sleep()外提为赋值语句,以保留和恢复调用栈而已,linux单核调度多线程,甚至你调用IO时为了鉴权,也会这么干。 cat|head 不就会await您的键盘吗? read()就会suspend 1个C语言的“有栈”协程。
之所以要async,只是想节省pthread_create,因为你要拿mainloop去poll(定期/卡http的轮询) 触摸屏事件,设备资源是独占的。这和内核驱动(/dev/WebUSB) 才能导致死机蓝屏是一个道理
如果系统,比如Web APIs吧,只提供回调而禁止while(1),哪怕只支持epoll(查看监听)/select(poll多项),就根本不存在线程一词 -就像C里你并不知道read()本质上await在pipe前“生成器”的write()
--也有人叫它yield,那是因为我们不能靠return写入“文件变量”、不能重赋值函数参数以返回多个值.. 为此jspy还发明了“async*()=>生成器”..
完美复刻UI层State(val).onvar[]的轮子呢!可惜是难用难复用的阉割版。
VSCode只加两个js线程,就能运行得很稳,这难道不是App设计的常态吗?难道那些小程序比code更“架构”?
至于免锁或基于资源.transferTo()的多线程,WebGL/numpy/MapReduce(ForkJoin) 不需要重造OS 1Dispatcher:N Continuation(该叫class CPU: ()->isFinished吧)的轮子配什么池化,就能实现前后端们无法想象的性能提升。
ES5的 yield cont=>setTimeout(cont,1s) ,由awaiter链接timeout和g.next,已经是免编译协程API的巅峰了,Promise.then 只是省得你传cont回调。 当然,timeout也可能返回cont=> 所以then要能接受async()
另:JS是视 fetch(u,{abort:Signal}) 取消任务的,我不认为app里会需要一堆 coroScope{} 这样图文不符的结构。kt在UIUX界敢能和H5相比么?为什么语言多项功能,app的功能却少的可怜!
kt的结构化并发不比Go的WaitGroup(semaphore)有用,但新词一大堆,初心全忘了,开始比java还八股了。真可笑,屠龙者终成恶龙
那些比Promise更繁琐的,是毫无语意的知识,迟早被py AI自动完成。看来科学界也不喜欢代码圈整这些无聊的class
就问 https://python-future.org/ 2to3这么聪明又简洁的lib,java人们啥时候能学会?态度问题,不是智商低 #statement
协程线程进程,都是Job
jobs的管理上,除了^Z SIGHUP再 fg bg 恢复,内核还支持swap(整个系统的)内存页到SSD,甚至用CRIU直接把进程快照为文件。 这样的快照不仅能多拍,还可通过网络传输,简直易如截屏,又像 Termux.dev / Waydro.id / webvm.io 那样神奇;然而这样超越运行期的“时间魔法”,90%的编译器根本做不到,只能用reflect或asm模板这样的残次品搪塞;同理90%的语言里“函数值”都没有相等性--所谓闭包“值捕获”却并不能自动内联JSON,所谓RPC,protobuf还不如微软的COM,pwsh.NET普适
#os 在这一点上可比 #plt 的孤岛、围城,先进太多了
https://t.me/dsuse/19341
https://kotlinlang.org/docs/coroutines-overview.html
https://github.com/youngyangyang04/TechCPP/blob/master/problems/为什么用户态和内核态的相互切换过程开销比较大.md
http://cht.sh/podman
https://t.bilibili.com/948850441406382096
协程 async。自动传回调、var都打包到其class因为,比如传给sleep()后自己要return。协程对象就比()->闭包多留个switch(nthStmt){}
把sleep()外提为赋值语句,以保留和恢复调用栈而已,linux单核调度多线程,甚至你调用IO时为了鉴权,也会这么干。 cat|head 不就会await您的键盘吗? read()就会suspend 1个C语言的“有栈”协程。
之所以要async,只是想节省pthread_create,因为你要拿mainloop去poll(定期/卡http的轮询) 触摸屏事件,设备资源是独占的。这和内核驱动(/dev/WebUSB) 才能导致死机蓝屏是一个道理
如果系统,比如Web APIs吧,只提供回调而禁止while(1),哪怕只支持epoll(查看监听)/select(poll多项),就根本不存在线程一词 -就像C里你并不知道read()本质上await在pipe前“生成器”的write()
--也有人叫它yield,那是因为我们不能靠return写入“文件变量”、不能重赋值函数参数以返回多个值.. 为此jspy还发明了“async*()=>生成器”..
完美复刻UI层State(val).onvar[]的轮子呢!可惜是难用难复用的阉割版。
VSCode只加两个js线程,就能运行得很稳,这难道不是App设计的常态吗?难道那些小程序比code更“架构”?
至于免锁或基于资源.transferTo()的多线程,WebGL/numpy/MapReduce(ForkJoin) 不需要重造OS 1Dispatcher:N Continuation(该叫class CPU: ()->isFinished吧)的轮子配什么池化,就能实现前后端们无法想象的性能提升。
ES5的 yield cont=>setTimeout(cont,1s) ,由awaiter链接timeout和g.next,已经是免编译协程API的巅峰了,Promise.then 只是省得你传cont回调。 当然,timeout也可能返回cont=> 所以then要能接受async()
另:JS是视 fetch(u,{abort:Signal}) 取消任务的,我不认为app里会需要一堆 coroScope{} 这样图文不符的结构。kt在UIUX界敢能和H5相比么?为什么语言多项功能,app的功能却少的可怜!
kt的结构化并发不比Go的WaitGroup(semaphore)有用,但新词一大堆,初心全忘了,开始比java还八股了。真可笑,屠龙者终成恶龙
那些比Promise更繁琐的,是毫无语意的知识,迟早被py AI自动完成。看来科学界也不喜欢代码圈整这些无聊的class
就问 https://python-future.org/ 2to3这么聪明又简洁的lib,java人们啥时候能学会?态度问题,不是智商低 #statement
协程线程进程,都是Job
jobs的管理上,除了^Z SIGHUP再 fg bg 恢复,内核还支持swap(整个系统的)内存页到SSD,甚至用CRIU直接把进程快照为文件。 这样的快照不仅能多拍,还可通过网络传输,简直易如截屏,又像 Termux.dev / Waydro.id / webvm.io 那样神奇;然而这样超越运行期的“时间魔法”,90%的编译器根本做不到,只能用reflect或asm模板这样的残次品搪塞;同理90%的语言里“函数值”都没有相等性--所谓闭包“值捕获”却并不能自动内联JSON,所谓RPC,protobuf还不如微软的COM,pwsh.NET普适
#os 在这一点上可比 #plt 的孤岛、围城,先进太多了
https://t.me/dsuse/19341
https://kotlinlang.org/docs/coroutines-overview.html
https://github.com/youngyangyang04/TechCPP/blob/master/problems/为什么用户态和内核态的相互切换过程开销比较大.md
http://cht.sh/podman
podman run -dt -name cnt busybox /bin/sh -c 'i=0; while true; do echo $i; i=$((i + 1)); sleep 1; done'
podman container checkpoint cnt
podman container restore cnt
https://t.bilibili.com/948850441406382096
Telegram
duangsuse::Echo
#java #code serde codegen
用jshell API 实现了一个ini序列化,大概比直接靠javac 简单
>以下代码实现了 dumps(Pair::class) (Pair(0,0), mutableMapOf("first" to 3))
fun dumps(T:KClass<*>, ld:T=JS("(void)(${T} o, java.util.Map<String,Object> m){"+
T.memberProperties.joinToString(""){"…
用jshell API 实现了一个ini序列化,大概比直接靠javac 简单
>以下代码实现了 dumps(Pair::class) (Pair(0,0), mutableMapOf("first" to 3))
fun dumps(T:KClass<*>, ld:T=JS("(void)(${T} o, java.util.Map<String,Object> m){"+
T.memberProperties.joinToString(""){"…
#os #wasm #backend https://www.bilibili.com/video/BV1oE421w7Vt
猜猜为什么jvm里没有malloc这种概念,只提供了 byte[N]?
因为C语言允许从随机的整数构造指针, 导致每次读写数据结构都像SQL注入一样不安全,各种能越过内核鉴权
C还没有标准的序列化手段(除了 criu.org 按mmap来封送),一个Rc归还内存被cpp弄出魔法的效果
哪怕send(一个bytes[]) 到tcp都要序列化,而C对此的实现,居然是\0结尾字符串😅
不过呢,C struct是和二进制文件对应最好的,指针紧随数据,免重定向就类似于序列化了,但是C没有利用好这个等价关系,那至少需要sizeof的值
这么弱智的数据模型,所以只能用一些4K page实现虚拟地址了,越界就要中断,约等于内核vma就是虚拟机,哈哈。把一个越界检查和union多型整成了页表映射那么臃肿
WASM的JIT就完全不需要这种概念,app和内核驱动一样安全,线程和协程一样轻量
unikernel.org 还不是能跑起来
猜猜为什么jvm里没有malloc这种概念,只提供了 byte[N]?
因为C语言允许从随机的整数构造指针, 导致每次读写数据结构都像SQL注入一样不安全,各种能越过内核鉴权
C还没有标准的序列化手段(除了 criu.org 按mmap来封送),一个Rc归还内存被cpp弄出魔法的效果
哪怕send(一个bytes[]) 到tcp都要序列化,而C对此的实现,居然是\0结尾字符串😅
不过呢,C struct是和二进制文件对应最好的,指针紧随数据,免重定向就类似于序列化了,但是C没有利用好这个等价关系,那至少需要sizeof的值
这么弱智的数据模型,所以只能用一些4K page实现虚拟地址了,越界就要中断,约等于内核vma就是虚拟机,哈哈。把一个越界检查和union多型整成了页表映射那么臃肿
WASM的JIT就完全不需要这种概念,app和内核驱动一样安全,线程和协程一样轻量
unikernel.org 还不是能跑起来
Bilibili
虚拟内存是什么? Lunaix内部设计之再论虚拟内存(上)_哔哩哔哩_bilibili
欢迎来到系列《Lunaix内部设计》的第一期视频。这个系列不算是一个全新的系列,相反,这是对我的另一个系列:《从零自制操作系统》的拓展与延伸,起到一个互补的作用。“再论虚拟内存” - 是该系列的第一集内容,主要是带大家走进 Lunaix 内核中虚拟内存模型的设计,以及背后的动机和理论。而本视频是上半部分,我们将会从头回顾虚拟内存的概念,阐述我们的动机,以及介绍对页表层级的抽象。LunaixOS源代, 视频播放量 2914、弹幕量 1、点赞数 178、投硬币枚数 74、收藏人数 146、转发人数 5, 视频作者…
duangsuse::Echo
#security 回顾 regreSSHion: RCE in OpenSSH server<9.8 https://www.bilibili.com/video/BV11U411U78q 这一漏洞的描述听起来像是 WannaCry(SMB) 和 Log4Shell 级别的。实际上,该漏洞的利用不太可能。 2014年,OpenSSL加密库中的一个缓冲区溢出漏洞被公开。该缺陷被称为“心脏出血”,这次是它的回归 由glibc free() 数据竞争,导致heap链表 use-after-free 而使得glibc…
#os #design 作为编程语言爱好者,谈谈RCE这些bug的根源吧: 程序员没做错, Dennis Ritchie 们错了 😅
为什么“溢出”基本上是C的专属呢?因为老冯的时代,“汇编器是在浪费 CPU cycle” 这种反人性的设计,被推崇为《程序员的自我修养》 (x86汇编的应用与骇客少,不讨论单片机界的情况) #recommend
就像JS人不懂
初学C的人很奇怪为啥 1+1 可以而 "a"+"b" 却不行(还必须 strcat 或 sprintf), 'a'+'a' 更是居然==194!厘清
不过,随着对 x=1; (X==1) 以及从0开始数
但我们先回到"基础类型"。C的 struct,union,[] 是有严重安全隐患的,「这只是性能的牺牲品」?
#rust 已经告诉我们 redox-os.org/ 这样复杂的系统也能默认内存安全, Python 则证明了仅仅靠运算符重载、Rc<T> 这样幼稚的引用计数,就能组装出了不起的AI应用
struct{} 的问题是“地址相关性”。就为了与x86的一些硬件地址对接(1% cases),C让一切数据类型都与 bytes(char*) 直接对应,以便映射到某个内存页位置、通过
(alloc相当于单实例版的现代
这就造成了 memleak, segfault(空指针和类型错误的cast, 例如把小结构cast成大结构) 甚至 "更适合C语言体制的SQL注入"
这里说的,就是子类型里的
并且,哪怕你能够通过一些信息压缩掉int Tag ,用
比如,为什么ES6要推荐一个“凑字数”的 const x= 而不是 let+let mut x? 为啥 Java 到处都是 public final 🔘 Str wtf() ?
你可能是第一次意识到“subtyping” 保存着type tag,但这些真的是编程里的基础(你设计任何"前后端"时都应该考虑的),或许,只是在像XML那样复杂的上层框架里这并不直观。
C99(ISO9899,P61)甚至专门定义了“退化到指针” 和'\0'结尾字符串的行为-它还好意思把这当特性! gcc 实现了常量区间的越界检查,这是说谎:
gcc的"静态检查"只是对stdlib的缺陷涂脂抹粉,并没有消除过度追求低内存,所带来的隐患
并且,只要区分定义
连Ruby 💎和WebKit的作者们都知道可以这样("污点值" taint 和 TrustedTypes),今天有人称其为 contract{}.. 也行吧
然而,即便有了OS的ASLR/Nx保护,stack/heap overflow 今天还是个问题。如果你写
所以
与for和if 对应的数据结构!!它们的重要性无需多言: 如果数据能随意纂改,fn{} 这些代码块、甚至只是算式 的正确语意就无法得到保障。
至少你还能庆幸,与 main(..) 等调用对应的
OOP只不过是把C的病态类型修了一修,它自己还有“读json都要搞反射,但Class对象被认为性能低”所造成的一堆问题
log4j 们是把bug的产生从“代码的语法” “内存结构的语法”往上提高了一层,并没有消灭问题。 能消灭问题的,恐怕只有少写代码,多思考吧。
从某种意义上,缓冲区溢出、反射低性能、线程(ret2调用栈)与 async(ret2回应函数)间的鸿沟,都是『两种语言问题』,即C,Java,JS 这样的语言为了解决框架们的需求
它们原来的心智模型,无法跨越 编译期/运行期、 堆内存/栈内存/json、本机/远程、可信数据/需验证数据,甚至仅仅是 正确/错误 (Object/Error和null) 而一致地存在,就产生了许多需要学习的class libs,以及与它们的宣传不相称的复杂性和log4j那种bug
我最近在设计的逻辑式编程范式,就是为了从心智模型的层面统一这所有的『两种语言」。 祝我成功吧 🌚
实际上呢, linux 这些内核所提供的虚拟内存段(vma https://t.me/dsuse/19844) 实现,通过把内存解释为对象图,这种4K页隔离也完全能删掉, ELF, SHM, CRIU.org 那些高深的结构也就会和普通的JVM对象(对比下"class" PATH?)、多线程、序列化 一样朴素
因为C会和WASM那样安全,没有驱动程序的“引用”,就不能越过内核调用rm -rf 那种事情(yinwang 2013)。 所以fd,socketfd 这些“RPC对象号” 也就不必存在; 线程就只是让while(1) 每隔几千次暂停1次的协程,调度器、主循环evpoll 也可以消失。
用 eBPF 的人都知道我在说什么,现在有足够多的中间表示比x86指令集更优秀,甚至更简单,完全能从汇编上来做“虚拟化”
学内核本质上就是学"4件套",而这4项任何一个普通极客都有所认识: 👀
byte format: ELF,EXT4,boot process(cpio), .. 这是用户最关心的: exe,so,apk 互不兼容,尽管他们的系统“一样高级”,C盘D盘容量一大一小,哪怕你的SSD是512G的
net: AP, Bluetooth Peering, tcp实现, 自然需要多线程和管道, 要考虑"异步" 也就是回调地狱的解决;最重要的是,Web的API和格式(FTP..)是超越运行时差异的存在,它比加了私货的SDK文档更能体现问题的本质
usb: hid键鼠触摇, hdi显示与摄像, 声音, ACPI SMART, 各种传感器.. 或许它们的“设备总线”不是USB,但我们只关心硬件的性能 而非接口!
vm:
不过编程本身是无关于计算机的,就像天文无关于望远镜。
“编程赞歌是组合搭配的赞歌,框架伟大是拆分置换的伟大。代码是流动的数据,内存是暂停的程序——感想”
为什么“溢出”基本上是C的专属呢?因为老冯的时代,“汇编器是在浪费 CPU cycle” 这种反人性的设计,被推崇为《程序员的自我修养》 (x86汇编的应用与骇客少,不讨论单片机界的情况) #recommend
就像JS人不懂
1+"1", 1-"1"
为啥会不同,初学C的人很奇怪为啥 1+1 可以而 "a"+"b" 却不行(还必须 strcat 或 sprintf), 'a'+'a' 更是居然==194!厘清
return struct{}
与*alloc、class Reader{}与UTF16编码,以及它们在C++的平替,就需要更久了不过,随着对 x=1; (X==1) 以及从0开始数
for(i=0) use(a[i])
的区分,常量级语法和"基础类型" 就不再是问题,转而学习函数对象、链表、fopen()、KV 这些有语意的类型了但我们先回到"基础类型"。C的 struct,union,[] 是有严重安全隐患的,「这只是性能的牺牲品」?
#rust 已经告诉我们 redox-os.org/ 这样复杂的系统也能默认内存安全, Python 则证明了仅仅靠运算符重载、Rc<T> 这样幼稚的引用计数,就能组装出了不起的AI应用
struct{} 的问题是“地址相关性”。就为了与x86的一些硬件地址对接(1% cases),C让一切数据类型都与 bytes(char*) 直接对应,以便映射到某个内存页位置、通过
malloc(N) free(obj)
链表来瓜分glibc mmap(brk)到的进程内存(alloc相当于单实例版的现代
memScoped{}
即 zig ArenaAllocator 。C的"弱类型"设计错误有多深远?直到2004 Linux 2.6.8 才支持Nx 即heap默认不可执行的"保护"..)这就造成了 memleak, segfault(空指针和类型错误的cast, 例如把小结构cast成大结构) 甚至 "更适合C语言体制的SQL注入"
这里说的,就是子类型里的
Animal() as Duck, Rect(1,2) as Square
,要么是表格验证的语意错误,要么从语法上就不该对struct Animal {
enum Tag{Duck,Cat}
union v {
struct Duck{int beck} //实现上会移到外部且把继承的项前置(便于在Animal{}外扩充),以及有virtual vs final 的虚表双指针,顺便用于实现闭包
}
}
并且,哪怕你能够通过一些信息压缩掉int Tag ,用
rawtypeof<Animal> xx; xx(1).beck
也比默认强转好太多了。 "默认行为"的重要性被严重轻视了比如,为什么ES6要推荐一个“凑字数”的 const x= 而不是 let+let mut x? 为啥 Java 到处都是 public final 🔘 Str wtf() ?
你可能是第一次意识到“subtyping” 保存着type tag,但这些真的是编程里的基础(你设计任何"前后端"时都应该考虑的),或许,只是在像XML那样复杂的上层框架里这并不直观。
int a[]={1,2};
这样的“数组”,它的长度只能用静态的sizeof得知,也就是 a[N]
里N必须是个常数,对它的求值才是安全的。C99(ISO9899,P61)甚至专门定义了“退化到指针” 和'\0'结尾字符串的行为-它还好意思把这当特性! gcc 实现了常量区间的越界检查,这是说谎:
range(A=0,B)
类型的缺失从一开始就是个错误。实际上,2int=1long ,区间slice有的内存开销,与它能带来的软件安全是不成比例的。gcc的"静态检查"只是对stdlib的缺陷涂脂抹粉,并没有消除过度追求低内存,所带来的隐患
并且,只要区分定义
a[int32_t], a[index_t]
的实现,对后者只定义一些编译期检查(private constructor),就既安全又高效。连Ruby 💎和WebKit的作者们都知道可以这样("污点值" taint 和 TrustedTypes),今天有人称其为 contract{}.. 也行吧
然而,即便有了OS的ASLR/Nx保护,stack/heap overflow 今天还是个问题。如果你写
sprintf(buf, "%d",0)
编译器会提醒你改用 sprintf_s
或cout,sstream<<所以
main(int narg, char** aarg){}
用什么替换? main(vector<str>)
吗? 恭喜你重新发明了“很慢的” Python,只是还没有它好用与for和if 对应的数据结构!!它们的重要性无需多言: 如果数据能随意纂改,fn{} 这些代码块、甚至只是算式 的正确语意就无法得到保障。
至少你还能庆幸,与 main(..) 等调用对应的
cli_args a0={.raw = new string[]{"/bin/echo",}}
"构造器"只是不太好写🥰,没有RCE那么严重的缺陷 OOP只不过是把C的病态类型修了一修,它自己还有“读json都要搞反射,但Class对象被认为性能低”所造成的一堆问题
log4j 们是把bug的产生从“代码的语法” “内存结构的语法”往上提高了一层,并没有消灭问题。 能消灭问题的,恐怕只有少写代码,多思考吧。
从某种意义上,缓冲区溢出、反射低性能、线程(ret2调用栈)与 async(ret2回应函数)间的鸿沟,都是『两种语言问题』,即C,Java,JS 这样的语言为了解决框架们的需求
它们原来的心智模型,无法跨越 编译期/运行期、 堆内存/栈内存/json、本机/远程、可信数据/需验证数据,甚至仅仅是 正确/错误 (Object/Error和null) 而一致地存在,就产生了许多需要学习的class libs,以及与它们的宣传不相称的复杂性和log4j那种bug
我最近在设计的逻辑式编程范式,就是为了从心智模型的层面统一这所有的『两种语言」。 祝我成功吧 🌚
实际上呢, linux 这些内核所提供的虚拟内存段(vma https://t.me/dsuse/19844) 实现,通过把内存解释为对象图,这种4K页隔离也完全能删掉, ELF, SHM, CRIU.org 那些高深的结构也就会和普通的JVM对象(对比下"class" PATH?)、多线程、序列化 一样朴素
因为C会和WASM那样安全,没有驱动程序的“引用”,就不能越过内核调用rm -rf 那种事情(yinwang 2013)。 所以fd,socketfd 这些“RPC对象号” 也就不必存在; 线程就只是让while(1) 每隔几千次暂停1次的协程,调度器、主循环evpoll 也可以消失。
用 eBPF 的人都知道我在说什么,现在有足够多的中间表示比x86指令集更优秀,甚至更简单,完全能从汇编上来做“虚拟化”
学内核本质上就是学"4件套",而这4项任何一个普通极客都有所认识: 👀
byte format: ELF,EXT4,boot process(cpio), .. 这是用户最关心的: exe,so,apk 互不兼容,尽管他们的系统“一样高级”,C盘D盘容量一大一小,哪怕你的SSD是512G的
net: AP, Bluetooth Peering, tcp实现, 自然需要多线程和管道, 要考虑"异步" 也就是回调地狱的解决;最重要的是,Web的API和格式(FTP..)是超越运行时差异的存在,它比加了私货的SDK文档更能体现问题的本质
usb: hid键鼠触摇, hdi显示与摄像, 声音, ACPI SMART, 各种传感器.. 或许它们的“设备总线”不是USB,但我们只关心硬件的性能 而非接口!
vm:
内存和CPU的分时复用
,按上面的说法,这是专门为掩饰C语言的缺陷所设计的。 难道Linux所提供的功能,比JS靠WebKit能利用的还多吗?为什么vscode只需要单线程,一些服务却总爱“加塞”,这其实就是C语言没办法“注册回调闭包” 导致的卡线程与线程池优化.. 全是与IO的业务逻辑无关的东西!不过编程本身是无关于计算机的,就像天文无关于望远镜。
“编程赞歌是组合搭配的赞歌,框架伟大是拆分置换的伟大。代码是流动的数据,内存是暂停的程序——感想”
www.redox-os.org
Redox - Your Next(Gen) OS - Redox - Your Next(Gen) OS
The Redox official website
duangsuse::Echo
#linux #design #statement 最近在设计OSon(一个基于JSON的类lisp计算图语言) 的一种强类型根rootfs 标准,打算用cbor(json zip),flatbuf 作为sysfs和etc的标准编码,它们的标准很简洁, cbor甚至只用0b111(7)种情况编码了可变结构 https://cstriker1407.info/blog/cbor-simple-note/ https://flatbuffers.dev/flatbuffers_internals.html#…
https://blog.csdn.net/dog250/article/details/100998838 #net #os #design
POSIX 中实际上有3种类型的文件: hex=block=buffer读写, ktty=char=内核终端文件, ptty=基于pid的终端文件, syn=socket=分pid/fd生成的文件
分别用于管理磁盘和内存(/dev/mem)、kmodule(ioctls)、虚拟终端(就是有width的,能控速的hex, $ stty)、socket(tcp/udp)
“一切皆文件”和其它的原则比如“组合小程序”等是相辅相成的。如果“一切皆文件”被破坏,那么便很难简单串接小程序实现复杂逻辑
socket没有标准文件的open和close操作,不能cat一个socket,也没法向一个socket里echo数据。因此就出现了socat,netcat这种大家都说好,但实际上没有必要的微型网络程序。
系统内核,其实就是会用MMU 4K页表保护自己的libc。
这就像,js要用 eval() import PATH 里的模块对象,同时需要沙箱技巧(setInterval..) 保证自身的设备和CPU不被独占
但因为C的代码都是unsafe{}, 需要用一种丑陋的方法隔离"syscall, ioctl" 这些类似于HTTP的调用,不能像WASM那样,内核和PATH里的代码存在一个地方。
你们可能听说过 gopkg/mvn 和 goroutine/jvm线程 ,那就是safe的PATH/函数对象和线程(池)调度器,这些虚拟机都有等同于操作系统的功能
而且更快速,例如, Looper() 调度不同的 ()=>函数 不需要保存和恢复>4K调用栈, 仅仅=闭包.call(返回地址在回调里)
这也是为什么有libuv这些东西
POSIX 中实际上有3种类型的文件: hex=block=buffer读写, ktty=char=内核终端文件, ptty=基于pid的终端文件, syn=socket=分pid/fd生成的文件
分别用于管理磁盘和内存(/dev/mem)、kmodule(ioctls)、虚拟终端(就是有width的,能控速的hex, $ stty)、socket(tcp/udp)
“一切皆文件”和其它的原则比如“组合小程序”等是相辅相成的。如果“一切皆文件”被破坏,那么便很难简单串接小程序实现复杂逻辑
socket没有标准文件的open和close操作,不能cat一个socket,也没法向一个socket里echo数据。因此就出现了socat,netcat这种大家都说好,但实际上没有必要的微型网络程序。
系统内核,其实就是会用MMU 4K页表保护自己的libc。
这就像,js要用 eval() import PATH 里的模块对象,同时需要沙箱技巧(setInterval..) 保证自身的设备和CPU不被独占
但因为C的代码都是unsafe{}, 需要用一种丑陋的方法隔离"syscall, ioctl" 这些类似于HTTP的调用,不能像WASM那样,内核和PATH里的代码存在一个地方。
你们可能听说过 gopkg/mvn 和 goroutine/jvm线程 ,那就是safe的PATH/函数对象和线程(池)调度器,这些虚拟机都有等同于操作系统的功能
而且更快速,例如, Looper() 调度不同的 ()=>函数 不需要保存和恢复>4K调用栈, 仅仅=闭包.call(返回地址在回调里)
这也是为什么有libuv这些东西
blog.csdn.net
Linux socket文件系统体现“一切皆文件”-CSDN博客
文章浏览阅读1.3w次,点赞12次,收藏46次。来自《实例演绎Unix/Linux的"一切皆文件"思想》大家习惯了使用socket来编写网络程序,socket是网络编程事实上的标准。我们知道,在Unix/Linux系统中“一切皆文件”,socket也被认为是一种文件,socket被表示成文件描述符。但socket的行为并不很像文件。比如:无法用 “open一个路径” 的方式打开一个socket,必须用socket系统调用来创建。文件..._linux socket文件