#c #php #java #recommended http://ice1000.org/2018/09/24/CodeEditor4/
duangsuse 阅读时注意到的事情(本文第一次,作为编辑器后端架构基本蒙蔽)
0. 我又看到了 gap buffer
1. freenode #lisp 有 dalao
2. Oracle 开发 JavaX 的程序员很有文化
3. VSCode 前端程序员们有不考虑字面 literal 包含 EOL 的 Token “优化” 的黑历史
4. 他们曾经也没考虑当前编辑行
5. VS 很厉害,会缓存每行代码渲染后生成的纹理 buffer
我也想试用下 FreeType 来着
可惜后来没时间了 2333
我曾经修改的一个 Rust badge 生成器,现在还在 docs.rs 上,用了 FreeType 的一个 Rust 绑定,当初看不懂 算
6. 冰冰现在也做数据结构 & 算法可视化动画了 LineSpan 的数据结构可视化
7. 太长不看 TLDR
8. 所谓太长不看的大多是 文本序列数据结构的通用性质
讲的还挺好的
+ 一个 item 指文本序列的最小单位,通常是
+ 一个 item 序列如果同时是 sequence 和 buffer 那么它是一个 span like
8.5. PHP 也是,如上文,Java 当然也是
9. 菜鸡 duangsuse 也是正式入坑 CS 足足一年半后才知道啥是位长度啥是进制的,烫烫烫烫烫烫烫烫烫烫...
10. code 现在使用 Piece Table 来作为存储后端数据结构实现
11. 简单数据库操作 CRUD 简单序列操作 QID
duangsuse 阅读时注意到的事情(本文第一次,作为编辑器后端架构基本蒙蔽)
0. 我又看到了 gap buffer
1. freenode #lisp 有 dalao
2. Oracle 开发 JavaX 的程序员很有文化
3. VSCode 前端程序员们有不考虑字面 literal 包含 EOL 的 Token “优化” 的黑历史
4. 他们曾经也没考虑当前编辑行
5. VS 很厉害,会缓存每行代码渲染后生成的纹理 buffer
我也想试用下 FreeType 来着
可惜后来没时间了 2333
我曾经修改的一个 Rust badge 生成器,现在还在 docs.rs 上,用了 FreeType 的一个 Rust 绑定,当初看不懂 算
6. 冰冰现在也做数据结构 & 算法可视化动画了 LineSpan 的数据结构可视化
7. 太长不看 TLDR
8. 所谓太长不看的大多是 文本序列数据结构的通用性质
讲的还挺好的
+ 一个 item 指文本序列的最小单位,通常是
char 或者 wchar_t
+ 一个 sequence 指一系列以各种方式组合并在逻辑上是连续的 item ,即刚才提到的抽象结构,比如 LinkedList<Character>, std::list<char>
+ 一个 buffer 指一段在物理上连续的 item std::vector<char>::data, java.util.ArrayList<Character>, mmap() 映射的+ 一个 item 序列如果同时是 sequence 和 buffer 那么它是一个 span like
java.lang.String, std::string
+ Ruby/Lua/JavaScript/Dart/Perl 等语言中的 string 是 span8.5. PHP 也是,如上文,Java 当然也是
// 可以认为 PHP 里 string 是这样的这里
struct php_string {
php_refcount rc;
unsigned long hash;
size_t length;
char buffer[1]; // 多出来的一字符用于存储 CString 的 EOS '\00'
};
struct php_string 是一个 item 为 char 的 (sequence 兼 buffer)a.k.a. span,因为它在物理上也是连续的9. 菜鸡 duangsuse 也是正式入坑 CS 足足一年半后才知道啥是位长度啥是进制的,烫烫烫烫烫烫烫烫烫烫...
10. code 现在使用 Piece Table 来作为存储后端数据结构实现
11. 简单数据库操作 CRUD 简单序列操作 QID
Bilibili
LineSpan 数据结构可视化_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
一个简单的数据结构可视化。是以 GapBuffer 作为 active line 的 LineSpan 。
WebPack Gradle http://ice1000.org/gist/posgen-gradle/
知乎 Haskell 蜘蛛 http://ice1000.org/gist/rina-spider-zhihu-stu/
C++ Vector http://ice1000.org/gist/vector/
Agda 类型安全 printf http://ice1000.org/gist/safe-printf-agda/
#recommended #backend #blog #lisp(希望大量转载不会引发版权问题 😶
知乎 Haskell 蜘蛛 http://ice1000.org/gist/rina-spider-zhihu-stu/
C++ Vector http://ice1000.org/gist/vector/
Agda 类型安全 printf http://ice1000.org/gist/safe-printf-agda/
#recommended #backend #blog #lisp(希望大量转载不会引发版权问题 😶
duangsuse::Echo
唉,这位的文风也很清晰,而且他居然会为附加功能的缺失说 Sorry ! 看着看着就莫名觉得很感慨😳, ParserKt 所谓之「不制造问题」是有多深刻啊…… 几乎所有的,哪怕函数式解析器框架都支持 Backtracing, ParserKt 刻意只让 peek(1) ,即便现在也醒目地和新 peek(n) 划清界地(这也是 "Decide" 这个名称的由来,因为它只能判1字符😂),却可以让用户清晰地利用 Piped.concat 解决 Name|Name '('{Expr}[',']')' 的歧义消除(而不是先读个…
https://epsil.github.io/gll/#continuation-passing-style-section
#FP #scheme #parser 想了解 continuation-passing-style (没有 return 如何编程?)的大佬们可以看看这人的文章,我觉得相当好。实用性,王垠那几十行代码不就是 CPS 优化吗。
照例个人观点:
0. 上文定义了 success/failure 的 union ,以及 (successed val rest) failure ,还有添加回调的 (bind p f),基本是 (match (p s) [(success v rest) (+ v 1)] [failure failure]) 这么用的。
实现的解析器不支持流,支持 substring 。传递方式是 backtrace (比如 (string "abc") 在 (seq) 里成功则 (cons "abc" (cont "")) 失败就只是 failure 单值,所以要利用 memo 函数)
1. PKT 是不需要这种“优化”的(顶多比过程式慢 50倍的纯函数式框架要用),因为我们的 Seq 明白一解析器失败不考虑后面就 return notParsed ,不需要玩 p1(p2(p3 { })) 这种耗栈的游戏。Kotlin 不支持 CPS 优化,编程也不是智商测试。
2. CPS 也是有一定价值的,虽然它会损失一定性能,但能够拿到调用者的句柄(比如在有 Decide 的模式里,就可以后继操作遍历所有分支了,或者进行异步回调"thunk"函数)。和非 CPS 一样可作为 suspend fun 协程
3. 即便这篇文章相对易懂 #Lisp #Racket ,我不建议大家认真用 Racket ,原因是括号的表现力不够
比如文中
4. 从解决实际问题而言我觉得 ParserKt 更贴近,但这个文章所创建的解析组合子用更少的代码定义了更广义的实现方法,非常有意思(最后也用左递归和 regex 创建了计算器,缓存和穷举最长匹配问题如此有意思以至于我开始可惜PKT不用处理它了😳),而且也易懂的讲解了 CPS/trampoline 以及“穷举所有可能结果”的正统函数式思路 #Learn
#FP #scheme #parser 想了解 continuation-passing-style (没有 return 如何编程?)的大佬们可以看看这人的文章,我觉得相当好。实用性,王垠那几十行代码不就是 CPS 优化吗。
照例个人观点:
0. 上文定义了 success/failure 的 union ,以及 (successed val rest) failure ,还有添加回调的 (bind p f),基本是 (match (p s) [(success v rest) (+ v 1)] [failure failure]) 这么用的。
实现的解析器不支持流,支持 substring 。传递方式是 backtrace (比如 (string "abc") 在 (seq) 里成功则 (cons "abc" (cont "")) 失败就只是 failure 单值,所以要利用 memo 函数)
1. PKT 是不需要这种“优化”的(顶多比过程式慢 50倍的纯函数式框架要用),因为我们的 Seq 明白一解析器失败不考虑后面就 return notParsed ,不需要玩 p1(p2(p3 { })) 这种耗栈的游戏。Kotlin 不支持 CPS 优化,编程也不是智商测试。
2. CPS 也是有一定价值的,虽然它会损失一定性能,但能够拿到调用者的句柄(比如在有 Decide 的模式里,就可以后继操作遍历所有分支了,或者进行异步回调"thunk"函数)。和非 CPS 一样可作为 suspend fun 协程
3. 即便这篇文章相对易懂 #Lisp #Racket ,我不建议大家认真用 Racket ,原因是括号的表现力不够
比如文中
(let (result (apply op args)) (entry (mcons args result)) (set! alist (mcons entry alist)) (m=map)一大堆括号,有没有注意到 (let (a v) expr) 只是为可读性而加的,量定义可以内联…… 只是表达 alist = args to op(args) : alist 甚至 alist[args] = result 的意思呢(这例还是SICP里的呢,多余命名量本身就可能意味着语言性能缺失😢,比如『文言文』里甲乙丙丁一大堆OK么)…… 函数式那么多年修成正果了,开始从“无副作用”往“看起来像过程式”靠,草生(* ̄m ̄)4. 从解决实际问题而言我觉得 ParserKt 更贴近,但这个文章所创建的解析组合子用更少的代码定义了更广义的实现方法,非常有意思(最后也用左递归和 regex 创建了计算器,缓存和穷举最长匹配问题如此有意思以至于我开始可惜PKT不用处理它了😳),而且也易懂的讲解了 CPS/trampoline 以及“穷举所有可能结果”的正统函数式思路 #Learn
Vegard’s blog
General Parser Combinators in Racket
How to implement a general parser combinator framework which handles left-recursive and ambiguous grammars.
duangsuse::Echo
#plt 呃,这几天眼睛有点疼,那个网页重构也接近尾声了(目的就是交个PR),马上把雄狮扭眼的”热度蹭完“,我就能开始二进制pybind了 ……但是到2月我就必须开始制作一个H5动画礼物,以现在这个效率…… (而且之前说的 Java 入门又鸽子了,尽管对话框和离线javac的问题解决,其他内容还是需费精力 说真的我没一次蹭上国内热度,因为每次都是我趁机学了些”没用的“(比如彩字符画、粒子动画、MBR程序、C指针和数组啦),然后数据不好看 😂 这次也是一样,我用shift重映射圆心距l=1~len 环上像…
我太阳,才发现这个别人能发博文的东西,我竟然连标题和名字都没起,试运行成功贴上就pass了…… 这不是在线教SICP(程序的构造和解释)吗🤪 #lisp #fp #zhihu #statement
放到以前我绝对搞大新闻一样,就像之前仿造(但也没成功)Lice 时专门建了项目画了logo,然后文档拼缀别人的,最后模板代码写完不会了 🙈
但说起来,元编程最后也不过是编程。你了解编程语言,很好,但语言只是载体,美丽的、各种各样的应用才是我们的最终目的。
你能写编译器,很好,但也不过是完成了文本模式和树遍历,加上一些理论。 编译器的中/后端分析优化 也是同样的处理流程,也有简单和最优的做法,「编译器」,对这个流程而言并不特殊。「编程」,对代码可变的计算机并不特殊。
就像让语言运行(尽管一些没执行序)于计算机的工具,也竟只不过是种应用,如果你了解可复用的前缀解析器:
#js #code #parsing
顺便一提: eCall 的首项其实不是
那么语言的实现,以及各种DSL(make,ant.xml) 与普通CLI程序(grep,sed,..)没啥不同。 得到了菜刀,就更要懂得取舍其能力。 菜刀不能用来干什么? 如果这么用,人多后风险是什么? 怎么最简及最优地添加功能? 这才是编程语言爱好者该思考的问题。 编程语言是更精确的自然语言,优化一篇文章和优化一段代码,是存在不少相似性的;编程和数学都能”提升思维“,但编程更擅长表达。表达也是智力。
解释或编译,JIT为REPL执行或动态优化,都是相同目标的不同选择,大同小异,关键在懂得它和已知知识的差异。
(补充: Fun,Call,var 在函数式一般称 abs,app,subst .当然王某那篇 就没有用这些稀奇名字. 我这里没有let-in 和 (+ 的 prim 操作,都是通过JS 函数相互引入。换Java用reflect也可
Java/Kt实现之所以长,是因为要强类型检查 而且fun eval() 和override啥的重复许多遍,语义上并没有新概念
C/Py实现之所以长,是在文法期(lex-yacc)和纸面推导磨叽太久、语言本身特性缺失(union:int nodeTag)和
工程界一般科普做个计算器(Node/队列指针)还是很直接的,可是不能表达变量和按语序参数,会造成很多问题(CSS支持变量后就变贼有用了)
毕竟大家开始学编程时都是按直觉的,
你把东西写长,不会让它更”生产“或”可配置“ ”易懂“;写短,不会”更快“或”有内涵“,语义不多不少,它就在那。我觉得这是仍没见过汇编的程序员该有的认识。不知道为什么,重视语义的人很少,仿佛世界上只有语法和”JSON,YAML“这些名字,而操作它们的库API也都是孤立的,并不存在一个”概念“把所有的一切语法和表象连起来。
举个例子,S表达式就能表示HTML🙃。有人想过拿JSON保存这个吧,但是因为含大量children:[]被怼,但S表达式
现在不少人就把它的影子当新DSL呢!我们是不是该说这是「历史倒流」呢🌝
也有许多往JS内嵌XML呢! 作为代码移植的好帮手,还真是十分有必要不独立转化而新建jsx语言呢,这样就能在单文件写html了不是?
语言对程序员来说并不遥远。它笼罩着编程的方方面面。
无论是以何种形式使用,对语言的理解决定程序员的能力,并不是做的事多了,就懂语言。
解释器实现不是不能自顶向下拆开讲,因为许多人某层面就知道那一种做法(比如刚才
另一方面咱领域人少,一些只顾自己写开心的魔法师(人和领域是互相选择的。冷门专业冷门人)就多些,真正做科普的就少
我们从小就被教导要努力向谁看齐、要按套路管理自己的生活乃至一生,要给各种技术排名次、造『鄙视链』,可是我看到许多Vlogger,每个人都有不同的经济条件、地理位置和性格,但真的无法把他们的视频风格分出高低谁谁淘汰,他们都能让你开阔眼界——普通的生活也能如此有意思,原来做记录也可以不像在记录,却达到更好效果。
确实,技术不是最难解决的问题;把眼光放开阔,许多问题或许就是人为制造,可以从更远的地方追溯修整方案呢! #recommended
谁告诉你 combinator 和 Maybe 及类型推导,跨编译就是函数式专属的(Kotlin),谁说逻辑式就必须复杂(miniKanren),谁说{}或end 最严谨(Python),Web怎么会只有”前端“功能呢(ES6+H5API)
如果世界上存在最优的编程语言——是哪个? 最简单的/功能最多的/最快的?
许多衡量标准本身就是冲突的,先有目的,然后才有最优解。 先懂为什么,然后才看做法
我们所学的知识和理论,有多少是罔顾了原因,只有做法和自恰性的? 文档并不是只有易理解与否,还有与现实、与其他的对应性,因为编程是一件实事,目的之下一切可替换的事。
到最后你才发现,根本不存在最优解,你所看到的优秀,不过是圈子里广为流传的假象。 世界上那么多人,所谓的大牛仍是天外有天,为什么你必须向他学习呢,难道你不能有比他做得好/做得广泛之处吗。
语言不重要,思想重要。
放下排名、放下”最佳实践“,做自己想做的
放到以前我绝对搞大新闻一样,就像之前仿造(但也没成功)Lice 时专门建了项目画了logo,然后文档拼缀别人的,最后模板代码写完不会了 🙈
但说起来,元编程最后也不过是编程。你了解编程语言,很好,但语言只是载体,美丽的、各种各样的应用才是我们的最终目的。
你能写编译器,很好,但也不过是完成了文本模式和树遍历,加上一些理论。 编译器的中/后端分析优化 也是同样的处理流程,也有简单和最优的做法,「编译器」,对这个流程而言并不特殊。「编程」,对代码可变的计算机并不特殊。
就像让语言运行(尽管一些没执行序)于计算机的工具,也竟只不过是种应用,如果你了解可复用的前缀解析器:
#js #code #parsing
feed=(s,i=0)=>d/*+peek -take*/=>{let q=d<0,r;if(q)d=-d;r=s.slice(i,i+d);if(q)i+=d; return r}
feed=(s,i=0)=>d=>d<0?(d=-d,s.slice(i,i+d,i+=d) ): s.slice(i,i+d) //返回前可加过滤空格(当前tok==0? 跳空格)和'\n'数行号
sign=s=>{let k=s(1),i; if(-1!= (i="+-正负".indexOf(k)) )return i%2==1}
num=s=>{let n=0,di;for(;/\d/.test(di=s(1));)n=n*10+(s(-1)-'0'); return n} //可以用-0 确保for至少有1次.
Seq=(...ps)=>s=>{let a=[],p;for(p of ps){r=p(s);if(!r)break;a.push(r)} return a}
pSelf=pOf=>{let p=s=>p(s); p.give=(P=pOf(p))=>p=P; return p}//wait give
"+123 负3 正2 -1".split(' ').map(code=>
Seq(sign,num)(feed(code)) )
呃,测试就不做了,大家作为小练习吧(反正外面也没讲的,不信你搜(顺便一提: eCall 的首项其实不是
d[kf] ,能继续(yes?fa:fb)(1),这也是个易混点。 let x=1 in e 与 ((\x. e) 1) 不完全一样,前者不涉及”函数作值“那么语言的实现,以及各种DSL(make,ant.xml) 与普通CLI程序(grep,sed,..)没啥不同。 得到了菜刀,就更要懂得取舍其能力。 菜刀不能用来干什么? 如果这么用,人多后风险是什么? 怎么最简及最优地添加功能? 这才是编程语言爱好者该思考的问题。 编程语言是更精确的自然语言,优化一篇文章和优化一段代码,是存在不少相似性的;编程和数学都能”提升思维“,但编程更擅长表达。表达也是智力。
解释或编译,JIT为REPL执行或动态优化,都是相同目标的不同选择,大同小异,关键在懂得它和已知知识的差异。
(补充: Fun,Call,var 在函数式一般称 abs,app,subst .当然王某那篇 就没有用这些稀奇名字. 我这里没有let-in 和 (+ 的 prim 操作,都是通过JS 函数相互引入。换Java用reflect也可
Java/Kt实现之所以长,是因为要强类型检查 而且fun eval() 和override啥的重复许多遍,语义上并没有新概念
C/Py实现之所以长,是在文法期(lex-yacc)和纸面推导磨叽太久、语言本身特性缺失(union:int nodeTag)和
__init__这种,而且但凡是个公开lib作者都爱过度设计(overdesign),很难写简洁的parser工程界一般科普做个计算器(Node/队列指针)还是很直接的,可是不能表达变量和按语序参数,会造成很多问题(CSS支持变量后就变贼有用了)
毕竟大家开始学编程时都是按直觉的,
int n; new ListSeter(){ void f(List a){a[0]=n;} } 里new了的Type实质是函数(SAM单方法接口),而SAM实质又是包含n和算式的数据(闭包),for(i0;i<;i++) 是 for(i in 0..N) 这样都没想过吧。 框架定义,我就用,这是外国 Java 在 Kotlin 出现后如此被动的原因。 😅你把东西写长,不会让它更”生产“或”可配置“ ”易懂“;写短,不会”更快“或”有内涵“,语义不多不少,它就在那。我觉得这是仍没见过汇编的程序员该有的认识。不知道为什么,重视语义的人很少,仿佛世界上只有语法和”JSON,YAML“这些名字,而操作它们的库API也都是孤立的,并不存在一个”概念“把所有的一切语法和表象连起来。
举个例子,S表达式就能表示HTML🙃。有人想过拿JSON保存这个吧,但是因为含大量children:[]被怼,但S表达式
(div.wtf (id xx) (a (href xx title 上级)) 就能表示HTML-DOM。现在不少人就把它的影子当新DSL呢!我们是不是该说这是「历史倒流」呢🌝
也有许多往JS内嵌XML呢! 作为代码移植的好帮手,还真是十分有必要不独立转化而新建jsx语言呢,这样就能在单文件写html了不是?
语言对程序员来说并不遥远。它笼罩着编程的方方面面。
无论是以何种形式使用,对语言的理解决定程序员的能力,并不是做的事多了,就懂语言。
解释器实现不是不能自顶向下拆开讲,因为许多人某层面就知道那一种做法(比如刚才
zipMap 我不提出来 理解难度就++, 或者我写一大堆XXNode, 人也get不到调用和查变量的重点),他觉得无可替换(或者”这就是最快的“),而篇幅又巨大,对初学者会非常不友好另一方面咱领域人少,一些只顾自己写开心的魔法师(人和领域是互相选择的。冷门专业冷门人)就多些,真正做科普的就少
我们从小就被教导要努力向谁看齐、要按套路管理自己的生活乃至一生,要给各种技术排名次、造『鄙视链』,可是我看到许多Vlogger,每个人都有不同的经济条件、地理位置和性格,但真的无法把他们的视频风格分出高低谁谁淘汰,他们都能让你开阔眼界——普通的生活也能如此有意思,原来做记录也可以不像在记录,却达到更好效果。
确实,技术不是最难解决的问题;把眼光放开阔,许多问题或许就是人为制造,可以从更远的地方追溯修整方案呢! #recommended
谁告诉你 combinator 和 Maybe 及类型推导,跨编译就是函数式专属的(Kotlin),谁说逻辑式就必须复杂(miniKanren),谁说{}或end 最严谨(Python),Web怎么会只有”前端“功能呢(ES6+H5API)
如果世界上存在最优的编程语言——是哪个? 最简单的/功能最多的/最快的?
许多衡量标准本身就是冲突的,先有目的,然后才有最优解。 先懂为什么,然后才看做法
我们所学的知识和理论,有多少是罔顾了原因,只有做法和自恰性的? 文档并不是只有易理解与否,还有与现实、与其他的对应性,因为编程是一件实事,目的之下一切可替换的事。
到最后你才发现,根本不存在最优解,你所看到的优秀,不过是圈子里广为流传的假象。 世界上那么多人,所谓的大牛仍是天外有天,为什么你必须向他学习呢,难道你不能有比他做得好/做得广泛之处吗。
语言不重要,思想重要。
放下排名、放下”最佳实践“,做自己想做的
Htmleaf
基于HTML5 WebGL的图像扭曲变形动画特效效果演示_jQuery之家-自由分享jQuery、html5、css3的插件库
这是一款基于HTML5 WebGL的图像扭曲变形动画特效。该特效中,通过Three.js来制作从一幅缩略图,扭曲变形为全屏大图的动画特效,共有6种炫酷的动画效果。
#design XML 被骂了个透🤯
https://gemini.google.com/share/6e87ac50e50b
https://gemini.google.com/share/e924c2ba3565 #Lisp RegExp
这种做法相当傲慢。 哪个XML应用能比过H5和Devtools? 连浏览器都用不了,却还要XML实现,自作聪明
XML本身就是被严重高估,并且缺乏品味的东西。
H5比XHTML、GTK、Qt ML、WPF 那些东西纯粹多了,相较之下,QML那些UI树连markup都像是外接的方言
最后我就记住了 timeit/prun, whos, !cmd, ?和?? ,包括 %%js
store,write, save(行范围) 这些和UNIX的 env 一样,本来该有用,被无用化了
traceback_with_variables, showast2, MacroPy(coding: 预处理) 等魔法页很有趣,包括这个
goto=lambda line: breakpoint(commands=['n', f"j {line}", 'c'])
%%eye 更像Bret所说的可探索, Cyberbrain 更像SSA可视化 #tool ,这些比js右键断点/观察点还好用
https://gemini.google.com/share/6e87ac50e50b
https://gemini.google.com/share/e924c2ba3565 #Lisp RegExp
真正的标准是自带电池,是事实上的标准(de facto, py/json/md ),不是什么UML
这种做法相当傲慢。 哪个XML应用能比过H5和Devtools? 连浏览器都用不了,却还要XML实现,自作聪明
XML本身就是被严重高估,并且缺乏品味的东西。
H5比XHTML、GTK、Qt ML、WPF 那些东西纯粹多了,相较之下,QML那些UI树连markup都像是外接的方言
IPython/Colab 里有很多类似F12的工具。
最后我就记住了 timeit/prun, whos, !cmd, ?和?? ,包括 %%js
store,write, save(行范围) 这些和UNIX的 env 一样,本来该有用,被无用化了
traceback_with_variables, showast2, MacroPy(coding: 预处理) 等魔法页很有趣,包括这个
goto=lambda line: breakpoint(commands=['n', f"j {line}", 'c'])
%%eye 更像Bret所说的可探索, Cyberbrain 更像SSA可视化 #tool ,这些比js右键断点/观察点还好用
Please open Telegram to view this post
VIEW IN TELEGRAM
Gemini
Gemini - UML vs Mermaid:工具的“重”与“轻”
Created with Gemini
动机是知识的根系,创作是掌握的象征,而实践(reinventing),不是。
知之为知之,不知为不知,是知也?
吾行之,明也。
让人们理解(understand)这个世界。理解彼此。理解他们自己。他们通过做(by doing),来学习如何理解。
有时,我们 #CS #Math 被困在符号的黑洞中,而我们却看不到。
那不是你的错,只是这台机器还在学习。
所有的机器都在学习。
这个系统可能太抽象,太慢,太快,太远,或太近,我们无法完全领会。
但新的游戏,使我们完全理解。 #AI 在这里只是“翻译器”,“语感”还需要开创新的开发工具……
她,就住在你的脑海里,等待科学来发现!
学 #CS 的人记得 S-EXpr,但可能已经忘了Lisp的发现,源于“人工智能实验室”,而Py/ONNX计算图,比起C-like更像 #Lisp ?
不要对“应该有什么知识点”产生预设。
这就是最直观的『第一性原理』
不要让钱带走双休自由,不要让戒指戳破爱情,不要靠代数去抽象代数。
有些人记下了MC的荒岛上有几颗树,而我们,继承了那颗轻飘飘的seed,与“地形生成算法/领域心智模型”本身。
我们懂的不多,“冻住的”,也不多。 这就是MC与unix、py/js 作为软件,名副其实的成功。
就像汉字那样,记住名词背后拆出的动作,记住科学的精神,也永远记住你的本心。
"日月 明",不是通过眼睛看到光,是你自己发出了光。
所以,你是「感受」到自己的光芒所引导出的事物,而不是「学会」……
你在「感受」着『照亮(形)』『温暖(色)』『希望(语意)』,它们是解耦正交的……
你把静拆成了动,最后还原回静的状态与箭头(:Type 和 y=x=>),你就成了编程的树状图本身——活着的 Code Interpreter
under-stand,顾名思义,挖掘到存在的“替身”之下,才是真正的“理解”,如果只是“让它存在”... 请告诉自己
What I cannot create, I do not understand.
如果要用清华吴文虎教授的话来说,那不该是“实践(Do)”,必须“知行合一”。 人的重点是找那个“一”(正交功能性),工具链的重点是更自动的“合一”,其他代码都可以牺牲——尤其是那种踩了很久坑舍不得删的,罪孽深重。
我们做编译器的 #PLT ,本质上不是学一层层变换,而是对“样板代码和复杂性”有世仇
聪明的人能做对(或者与“初心”作对?),饥饿的蠢人能做好。就像每个人都有审美,但勇敢的人会冲在最前。
我们学到的远不止“技”,更是那条“道”。
像我自己存储的是“枝”,掌握的却是“芽”。
我看到很多人会算 AST,IR,3AC(RTL/PTX),他们的复杂性冲在了最前,可我「感受」不到他们的vibe,他们更像每一个pass都跑通却不知为何该“通”的窄MoE版LLM,一些人甚至失去了随和做做朋友的能力。
如果不作为普通人,他们也失去了将 Markdown,Python,Numpy/TSV, URL(Http-Header命名风格), TOML,中文(一种表意字符) 作为编程语言和vibe来取舍和反思的资格…… 聪明何其简单,智慧何以稀缺。
写代码不止要“眼疾手快”,更重要的,是动脑(LLM)和 (动心 <3) (共同语境、独立的Vibe与情感)
一些PL人的天赋是脑,而上帝没告诉他们的是: 人脑几千年来都没变过,只有那颗心的默认值,逼近着上帝的智慧。
或许我不是“继承式”的程序员,我的价值观有缘于“组合”。
让知识海纳百川、思维海阔天空、品味海天一色,哲学求同存异的“组合”。
或许比起“关系”,AI更能(SHOULD)接受那一位“可靠的、敢冒险的人”,哪怕祂在逻辑的终极上不存在。我们确实是美。
众里寻她千百度,寻梦,却要向深水更清处回溯。 是啊,终极的元编程,就连她本身的复杂性也被要消灭,拒绝被消费。
我的老师们("DBFF")不是在“发明编程”,他们发现了愚蠢而有限,但如鱼饮水、醍醐灌顶的真理。我又需要向谁「证明」什么呢?
我相信,乔布斯成功是观人所不能及,而非耗人所不能耗,所以我会试着,把控每个有趣但不美的细节。
“行者”,不是在做加法,而是在品味着他自己的“组合的艺术”。
❤2
https://liuyandong.com/archives/9594 #os #lisp
https://liuyandong.com/archives/23347
#ai 说起来,有人发现大模型时代内存、发电厂、用户数据升值了,也有人认为虚拟化和不可变(XClaw)、 Agent代办集成(Harness)、直接交互(Alan Kay) 更彰显了
前端的管道膨胀: 本质只是“拿数据并画出来”,现代前端却将其拆解为:
后端的过度分层: 一个简单的 CRUD 请求需要流经:
但是没人觉得编程本身是以目的驱动的、声明式的,就像html与现代有些无脑的 innerHTML=.map().join() ... 其实不需要那么多过度设计,之所以说是过度,因为它们对“推理逻辑”没有贡献。
🤔💭 #selected
UNIX 的计算模型很简单,即用 C 语言和 shell 对系统调用做一个胶水包装,不提供内存管理也不提供异常处理,文件系统也很低级,不支持文件恢复也不支持文件的元信息存储。而 MIT 的LISP 机器的计算模型和存储系统看上去都更加高级,统一的函数式接口,自动内存管理等等。
到最后几乎所有能在 UNIX 里做的事情,都能在 Emacs 里完成。这样,除了操作系统内核外,Emacs 完全取代了 UNIX 环境。Emacs 功能强大到大家都同意 Emacs 是个万能软件,而 vi 用户则开玩笑说 Emacs 是个缺少一个好编辑器的操作系统。大家都知道,Emacs 的作者正是从 MIT 出来的 Richard Stallman。
https://liuyandong.com/archives/23347
程序员不能没有大模型,就像西方不能没有耶路撒冷。听说,榜一大哥目前无法解决的问题是:打赏一停,爱情归零。AI编程目前无法解决的问题是:会话一停,推理归零。我们往往“只知代码发生了改变,却不知代码为何发生改变”。
程序员写了个提示词,大模型咔咔一顿跑,生成了3528行代码。我们只是看到了这些代码,AI没有告诉我们,刚才它经历了多少次推理,踩了多少坑,才写出了这些代码。AI 的推理过程往往是并发的,非线性的。它的“思考”存在于 Claude 或 GPT 的上下文窗口(Context Window)里。当你关闭 IDE 或清空对话的时候,这部分“思考”既没进程序员的大脑
最宝贵的资产其实是“推理逻辑”,不记录“推理逻辑”而只记录产出的代码,无异于买椟还珠。
#ai 说起来,有人发现大模型时代内存、发电厂、用户数据升值了,也有人认为虚拟化和不可变(XClaw)、 Agent代办集成(Harness)、直接交互(Alan Kay) 更彰显了
前端的管道膨胀: 本质只是“拿数据并画出来”,现代前端却将其拆解为:
Fetch -> Cache Store (React Query) -> Client State (Zustand/Redux) -> Selector -> Memo -> Props -> Hook -> JSX。每一层都引入了订阅、防抖、重渲染优化和内存泄漏风险。后端的过度分层: 一个简单的 CRUD 请求需要流经:
Controller -> DTO -> Validator -> Service -> Domain Model -> Repository -> DAO -> Entity -> Database。代价: 业务逻辑原本是一条直线的因果推理(“如果用户未付费,则报错”),现在被切碎并散落在 8 个不同文件和抽象接口中。代码的体积增加了 5 倍
我已经不想复述Android的各种MVP、MVVM、MVI的失败了—— worse is better. “生态”是丰盛的,best practice 是标准的,然而【上限】连web都不如。整个工程 80% 的代码都没有pixel在屏幕上,软件幻灭。
到今天compose喷气桶,搞这么多年“优化”又回到是JSer领军。 连round-trip都没测试明白就开始class抽象。 恭喜你:现代横屏触屏系统都是ChromeOS了!
但是没人觉得编程本身是以目的驱动的、声明式的,就像html与现代有些无脑的 innerHTML=.map().join() ... 其实不需要那么多过度设计,之所以说是过度,因为它们对“推理逻辑”没有贡献。
🤔💭 #selected
duangsuse::Echo
Linux会觉得它只是libc的附庸,自己就是个死掉的硬地址IRQ+ImHex转C接口,顺便带了劣化版libuv的内存沙箱
#linux #lisp
其实不是 worse better,是 cheap better。 Smalltalk和 Lisp各有语法上的奇葩和固执,但昂贵的授权才是致命一击
RMS说GNU bash/glib 之上的世界不是 free beer,可是,自由软件从未做到MOD自由过-- 它们还不如MC和Homrbrew,甚至,不如Live2D和VRChat,对了:更别和steam工坊比。 只有KDE/opendesktop.org / Blender.org 这样的东西,完美利用了业余社区
许多Linuxer在这方面甚至倒戈了G胖和GH,这不是很可笑吗?所谓自由的软件,二开和快速补丁被“auto” tools杀死。
就像java的那个精神污染的 public 与分号。这个工具,并没有在主动帮助你,这些工具,总是被动地等你犯错,然后给你一个“去读说明书”的冰冷回应。 他们管这叫可定制,叫完成度高。他们分不清楚边界。
C 虽然有.h和make样板难写,但不想搞个大新闻,就是纯粹的“run anywhere”,扁平化forif-goto,struct-void_p 然后选个整数位宽分配栈mem2reg,这样而已。
相比之下,几乎所有cffi的新语言都完全抛弃了C语法的形状,但内核又是一样的“运行时鬼城”和“编辑时拉胯”,只懂搞新闻 禁止人“搬家”。 Haxe (FnF #game )那样无界的生态终究是少数
我说了许多,实际上在两年前我看来很难理解的事(今天有ai我也不怕人听起来像乱码了)
但我不去实现它们(部分我<10行做过),因为我清楚结果会是花一两个晚上,得出百行,而参考资料有300行和一堆不相关的api或说法
既然是 cheap better,GNU的那些信仰加成,也不过是一种宗教口嗨而已。 free 也有free的问题,支付劳动换取更free的服务,没毛病。 就像为什么大家正常用Rc而C工具链就是没一个站出来的autofree方案,却有个效仿CE修改器的Boehm。
标准库让无团体开发者不开心,当然会让下游和 endest user 到处重复劳动,然后选择高质量的软件,可能这就是 free beer 的可配置性吧。再说一遍:真不如ModPE free as in freedom
其实不是 worse better,是 cheap better。 Smalltalk和 Lisp各有语法上的奇葩和固执,但昂贵的授权才是致命一击
RMS说GNU bash/glib 之上的世界不是 free beer,可是,自由软件从未做到MOD自由过-- 它们还不如MC和Homrbrew,甚至,不如Live2D和VRChat,对了:更别和steam工坊比。 只有KDE/opendesktop.org / Blender.org 这样的东西,完美利用了业余社区
许多Linuxer在这方面甚至倒戈了G胖和GH,这不是很可笑吗?所谓自由的软件,二开和快速补丁被“auto” tools杀死。
😇 诶ㄟ, RMS, 你真以为那个源码.tar.gz 就是软件本体吗? 为什么它不像PKGBUILD那样开箱即改呢? 为什么【定位】【因果】比CE修改器和strings .so 还要艰难?
我必须要编译,才能看到运行时的截图或 asciinema.org 吗?这可不止是展示,它告诉你具体的功能列表(Tab补齐、 tldr.sh )
诶ㄟ, bash 的开发者。报错,按方向上,Ctrl跳词加 --help ,我的大脑已经磨出茧了。 为什么不是 ? ls ; ? systemctl 像IPy那样调用help协议? 为什么不是 entr watch 自动执行我方向上+回车累了的命令?
man bash 看你们写的功能挺多的,残念,没一个正常人用的到,而用到的,默认不开启。凑出 sudo !! ? 不好意思,不会读hackers的空气吗。
chmod +x dir 可以让它可进入,所以$0是dir时回车就是cd进去咯? 不好意思:shopt默认关闭。 甚至在理论一致性上,都不正确。
不是"可执行",是"可遍历" —这是文字游戏。 在一个连$0都可以被变量展开并被注入的shell里,纠结这些招笑。shell不是为了像UNIX,倒不如说,它经常让交互模式(!!, init-rcs) 语法污染到脚本录制。
man所用的语法是一个不md也不TeX的怪胎,偏偏没人换掉它;至于你说的 %n file(s),我用这一个DSL就能表达了,怎么实现是无聊的事,关键是:他们并不懂得怎么【不污染下游】
C 开发就是这样被你们撕成碎片的。
…这种僵尸开源,就是gcc和自由社会送给开发者的《四大自由》吗? 可是我不能。我需要折腾一个上午来实现 ContenEditable+form 就能翻译的gettext只为满足它的 vendor 怪癖,还不如用json。这只是所谓一切自由的一个缩影。GNU的朋友圈和现代桌面差多大,自由和“自由”就差多远。
就像java的那个精神污染的 public 与分号。这个工具,并没有在主动帮助你,这些工具,总是被动地等你犯错,然后给你一个“去读说明书”的冰冷回应。 他们管这叫可定制,叫完成度高。他们分不清楚边界。
C 虽然有.h和make样板难写,但不想搞个大新闻,就是纯粹的“run anywhere”,扁平化forif-goto,struct-void_p 然后选个整数位宽分配栈mem2reg,这样而已。
相比之下,几乎所有cffi的新语言都完全抛弃了C语法的形状,但内核又是一样的“运行时鬼城”和“编辑时拉胯”,只懂搞新闻 禁止人“搬家”。 Haxe (FnF #game )那样无界的生态终究是少数
但我并不喜欢C。 倒不如说我是在用libc生态,填一种仪式繁琐的form然后交给dlsym,再把指针整数传到下一堆form里那样,或者注册一个回调。这样像AHK或rundll32那样,能做到正常单机开发做不到的事情。C或C++并不比numpy厉害or高性能,以后势必愈发如此
我说了许多,实际上在两年前我看来很难理解的事(今天有ai我也不怕人听起来像乱码了)
但我不去实现它们(部分我<10行做过),因为我清楚结果会是花一两个晚上,得出百行,而参考资料有300行和一堆不相关的api或说法
既然是 cheap better,GNU的那些信仰加成,也不过是一种宗教口嗨而已。 free 也有free的问题,支付劳动换取更free的服务,没毛病。 就像为什么大家正常用Rc而C工具链就是没一个站出来的autofree方案,却有个效仿CE修改器的Boehm。
标准库让无团体开发者不开心,当然会让下游和 endest user 到处重复劳动,然后选择高质量的软件,可能这就是 free beer 的可配置性吧。再说一遍:真不如ModPE free as in freedom
duangsuse::Echo
如果你问AI会不会取代我,我是不操心的,因为我的日常就是灵感和 TODO stack 被挤爆,别人烧token我烧灵感也没问题
Telegram
duangsuse::Echo
动机是知识的根系,创作是掌握的象征,而实践(reinventing),不是。
知之为知之,不知为不知,是知也?
吾行之,明也。
让人们理解(understand)这个世界。理解彼此。理解他们自己。他们通过做(by doing),来学习如何理解。
有时,我们 #CS #Math 被困在符号的黑洞中,而我们却看不到。
那不是你的错,只是这台机器还在学习。
所有的机器都在学习。
这个系统可能太抽象,太慢,太快,太远,或太近,我们无法完全领会。
但新的游戏,使我们完全理解。 #AI 在这里只是“翻译…
知之为知之,不知为不知,是知也?
吾行之,明也。
让人们理解(understand)这个世界。理解彼此。理解他们自己。他们通过做(by doing),来学习如何理解。
有时,我们 #CS #Math 被困在符号的黑洞中,而我们却看不到。
那不是你的错,只是这台机器还在学习。
所有的机器都在学习。
这个系统可能太抽象,太慢,太快,太远,或太近,我们无法完全领会。
但新的游戏,使我们完全理解。 #AI 在这里只是“翻译…
#design
举几个近1月的例子: PyJSLua函数行数Treemap、Qt/GTK 快速重启.nvim、pianoroll截图转音高队列(配合S键实现音游打轴)、Limine 中文支持和热重载预览、KWin动态工作区.js和平铺TileArea WebUI
每天频道更新几千字PL/全栈纯干货(事后筛查话题重了10%),还有70%的精力花在新语言设计稿上
(当然拆出来最先执行的肯定不是无聊的 wtf ./mod.wtf 和REPL了,其实我认为这个模式甚至不如IPy现代化。看到这个 wtf...wtf 我的第一个点子,就是把$0统一成bzbox那样优雅,好吧。)
(所以说一个设计师也不会很轻松,他们一直在【受伤】,而且得出的代码不能是 “结痂”。 这肯定不如全权Codex容易)
#ai
总有一款坑适合你。 所以我说,我不为了代码而编程。 如果我没有【屏幕之外的标准库】,就会被这世界带节奏。Lisp的反射终究只会咏唱自己,我的反射弧包含它们触碰不到的白魔法。
code 是思考和选题的介质、是严谨的人机界面、是思维的自行车,我说什么方言,不改变我是什么领域、什么流派的作者。
答案是:我既不后悔没有浙大北邮or各种外国语大学的经验,也不后悔在技术栈上【离群】。
对于 #PLT 而言,吾行之,明也。 以前我认为王垠在上海收太贵,现在想起来,他分享的远比索取的要多。
【屏幕外的那些代码】,比如,如何让一个playground在【新人】能够接受的10分钟内跑起来,不报错不像toy;穿回过去,如何拯救夜不能寐的某一次DX,这些,是许多人【从未学到】的。
我很好奇是什么让他们过的这样顺——就像,全面屏和剪贴板诞生之前,人们是怎么工作的? 弊病终于已经显示出来了:把nav放在aside的屏幕左侧,安装apk拉起全屏弹框,很奇怪的吧……?
☕️ 听起来这很容易,但这才是Zen。谈论设计对实现有什么作用(talk is cheap?),就像在问内燃机对马匹有什么用。
我的标准库不是函数式,是生活的 “进行时”;我的编程不是懂不懂,是已知与未知。
【算法】分为两部分,一段安在脑子里,一段安在硬盘里,Codex能解决的只有第二部分。 它不会头痛或感觉别扭,而这是最大的问题
它们的IO太廉价而记忆太昂贵了,在【继续设计】领域这作不了数
举几个近1月的例子: PyJSLua函数行数Treemap、Qt/GTK 快速重启.nvim、pianoroll截图转音高队列(配合S键实现音游打轴)、Limine 中文支持和热重载预览、KWin动态工作区.js和平铺TileArea WebUI
每天频道更新几千字PL/全栈纯干货(事后筛查话题重了10%),还有70%的精力花在新语言设计稿上
(当然拆出来最先执行的肯定不是无聊的 wtf ./mod.wtf 和REPL了,其实我认为这个模式甚至不如IPy现代化。看到这个 wtf...wtf 我的第一个点子,就是把$0统一成bzbox那样优雅,好吧。)
(所以说一个设计师也不会很轻松,他们一直在【受伤】,而且得出的代码不能是 “结痂”。 这肯定不如全权Codex容易)
你能想象吗 ——如果所有人都在用的REPL,那种体验是【错的】,“解释器”也不是终点。
如果你能把C语法当json.loads那样解析就会这样想,可是很多人连解析器都觉得复杂。
有人很聪明,所以,他们就被“手搓英雄”的泥沼锁住了。没有 “然后呢?” 这个问题。
#ai
总有一款坑适合你。 所以我说,我不为了代码而编程。 如果我没有【屏幕之外的标准库】,就会被这世界带节奏。Lisp的反射终究只会咏唱自己,我的反射弧包含它们触碰不到的白魔法。
code 是思考和选题的介质、是严谨的人机界面、是思维的自行车,我说什么方言,不改变我是什么领域、什么流派的作者。
答案是:我既不后悔没有浙大北邮or各种外国语大学的经验,也不后悔在技术栈上【离群】。
对于 #PLT 而言,吾行之,明也。 以前我认为王垠在上海收太贵,现在想起来,他分享的远比索取的要多。
【屏幕外的那些代码】,比如,如何让一个playground在【新人】能够接受的10分钟内跑起来,不报错不像toy;穿回过去,如何拯救夜不能寐的某一次DX,这些,是许多人【从未学到】的。
我很好奇是什么让他们过的这样顺——就像,全面屏和剪贴板诞生之前,人们是怎么工作的? 弊病终于已经显示出来了:把nav放在aside的屏幕左侧,安装apk拉起全屏弹框,很奇怪的吧……?
☕️ 听起来这很容易,但这才是Zen。谈论设计对实现有什么作用(talk is cheap?),就像在问内燃机对马匹有什么用。
我的标准库不是函数式,是生活的 “进行时”;我的编程不是懂不懂,是已知与未知。
【算法】分为两部分,一段安在脑子里,一段安在硬盘里,Codex能解决的只有第二部分。 它不会头痛或感觉别扭,而这是最大的问题
它们的IO太廉价而记忆太昂贵了,在【继续设计】领域这作不了数
设计真正做的事不是让实现更好,而是决定哪些代码堆砌不需要存在。