duangsuse::Echo
LL 是什么呢,我举道『编译原理(指模式匹配机)』题 (大写代表规则=非终结符) 在分词器即”不需要stack“的N/DFA状态机走完一步action,就拿到1token,喂给解析器;所有喂完没报错,应该就组织出了语法树(没错,不能用调用栈组织AST) tok=[],i=0; st = [S] // S 是根语法. LL(1)匹配 while((it=st.top) !=null) if(it !in G)//终结符 if(t==tok[i++])pop(); //匹配一项 else 回退或error;…
王垠对CS科班编译原理侧重点的质疑是对的(然而并没暖用,就像教育也不只是为培育人才一样;你没法让所有人相信简单是对的
倒不如说是老师举例和对照的方法不好,LL 这样入门级的程序编号化还是比较好教的,可是他们一举例就是很生硬,非常莫名其妙的常量 也不先说目标,上来就“贴代码”、贴做的图(也不简洁、记流水帐),让人很迷糊:
③ T → FT ' FIRST ( T ) = { ( id }
④ T' → *FT ' |ε FIRST ( T' ) = {* ε }
⑤ F → (E)|id FIRST ( F ) = { ( id }
……
以下的内容全都是流水帐,没有任何解释和其他等价形式,学起来非常麻烦
https://zhuanlan.zhihu.com/p/70895051 这个人教的SSA就很好,公共子表达式消除CSE、常量折叠、死代码消除 都是SSA(执行序节点图)的直接优点,他对指令选择的解释”烧水,做菜,切菜 顺序..“一点没有专业人士的架子,对基本块BB x=1; if(q){k=1; a=k+x} else a=c+d; 里前 a 相当于 x+1 和放大SSA BB范围 x=1; if(!q)goto B; k=1;a=k+1; .. 还有范围分析,就说得好实际
”最近在做一个 x86 到 x86 的 jit 编译器…… 中间表示一般有两种形式,树:[+a t1=[+b c] d] 或者展开的序列表示:t1 = b + c; a = t1 + d;
……
当追踪不了的时候只要按照最保守的范围进行优化就能保证程序正确性。同时这也可以用于程序静态分析,比如未初始化变量的分析。
数据流分析可以对各种数据进行分析,比如在变量有别名(比如指针)的时候,纯粹的数值分析就会有问题,因为你并不知道指针会指向哪儿,这个时候就可以对指针所指的目标做数据流分析,继而对对应的数值进行分析。“
他还解释了这里的SSA形状
-相同的名字不出现两遍(无重赋值
-每个节点下面(最多)只有两个节点
-父节点的值直接依赖子节点的值
的原因:具体的说每一行只能有两个输入变量和一个输出变量,也就是 z = x op y,从树表示到结果,我们只要先子节点的遍历整棵树,在每个节点上输出一行对应的操作语句就好了。
在语义阶段结束后程序就变成统一IR组:跳转基本块BB,有入出口、前后项,分析都在基本块
https://zhuanlan.zhihu.com/p/47099755 然后这个 #ce #reveng 反编译原理也非常好。 如果按执行的方式把 if(q) a; else b; 即
推荐 http://zneak.github.io/fcd/2016/11/25/revisiting-regions.html
Dom树是入口到某一BB 的必经点 -及这些的必经点在前 -构成的树 ;最简解O(nm) 是枚举+BFS ,最常是 Iterative(20行 O(nn) )
https://blog.csdn.net/Dong_HFUT/article/details/121375025 列了一大堆实现,L-T支配树构造法本身代码比Dij搜索长3倍, O(logn+M)
两点互有路称强联通,然后还有强联通子集(分量,=SCC),tarjan 法(N+节点数M) 就能求一点的集
https://security.tencent.com/index.php/blog/msg/112] CFG Flatten 是利用运行期switch派发器的方法混淆代码 🤔都是些基于 CFG(控制流图) 的东西,对正常编程而言其实优化分析都是虚的,代码写好才最重要,不过这些还挺有意思的,至少比把程序打散为编号强
高级的科班编译原理除了龙书还有虎书鲸书,但语言的设计不需要懂太多知识,王垠在前也怼过 CFG analysis ,确实这些对编程并不重要,不通用的工具做着还是容易的,但它们也是个领域啊
倒不如说是老师举例和对照的方法不好,LL 这样入门级的程序编号化还是比较好教的,可是他们一举例就是很生硬,非常莫名其妙的常量 也不先说目标,上来就“贴代码”、贴做的图(也不简洁、记流水帐),让人很迷糊:
③ T → FT ' FIRST ( T ) = { ( id }
④ T' → *FT ' |ε FIRST ( T' ) = {* ε }
⑤ F → (E)|id FIRST ( F ) = { ( id }
……
以下的内容全都是流水帐,没有任何解释和其他等价形式,学起来非常麻烦
https://zhuanlan.zhihu.com/p/70895051 这个人教的SSA就很好,公共子表达式消除CSE、常量折叠、死代码消除 都是SSA(执行序节点图)的直接优点,他对指令选择的解释”烧水,做菜,切菜 顺序..“一点没有专业人士的架子,对基本块BB x=1; if(q){k=1; a=k+x} else a=c+d; 里前 a 相当于 x+1 和放大SSA BB范围 x=1; if(!q)goto B; k=1;a=k+1; .. 还有范围分析,就说得好实际
”最近在做一个 x86 到 x86 的 jit 编译器…… 中间表示一般有两种形式,树:[+a t1=[+b c] d] 或者展开的序列表示:t1 = b + c; a = t1 + d;
……
当追踪不了的时候只要按照最保守的范围进行优化就能保证程序正确性。同时这也可以用于程序静态分析,比如未初始化变量的分析。
数据流分析可以对各种数据进行分析,比如在变量有别名(比如指针)的时候,纯粹的数值分析就会有问题,因为你并不知道指针会指向哪儿,这个时候就可以对指针所指的目标做数据流分析,继而对对应的数值进行分析。“
他还解释了这里的SSA形状
-相同的名字不出现两遍(无重赋值
-每个节点下面(最多)只有两个节点
-父节点的值直接依赖子节点的值
的原因:具体的说每一行只能有两个输入变量和一个输出变量,也就是 z = x op y,从树表示到结果,我们只要先子节点的遍历整棵树,在每个节点上输出一行对应的操作语句就好了。
在语义阶段结束后程序就变成统一IR组:跳转基本块BB,有入出口、前后项,分析都在基本块
https://zhuanlan.zhihu.com/p/47099755 然后这个 #ce #reveng 反编译原理也非常好。 如果按执行的方式把 if(q) a; else b; 即
q ?not B; a; ?jmp C; B:b C:
切BB再反编译规约,(符号执行)只能得到q为true 或false 的语法树,较好的方法就是 Node Split ,即对两个枝都继续,匹配出 if 结构再规约出表达式(纯符号执行估计不行.. 嵌套几个if就会爆炸吧(引文 Handling Irreducible Loops),此外 DJ-graph (支配前驱|可能前驱) 的BB切分也比较好推荐 http://zneak.github.io/fcd/2016/11/25/revisiting-regions.html
Dom树是入口到某一BB 的必经点 -及这些的必经点在前 -构成的树 ;最简解O(nm) 是枚举+BFS ,最常是 Iterative(20行 O(nn) )
https://blog.csdn.net/Dong_HFUT/article/details/121375025 列了一大堆实现,L-T支配树构造法本身代码比Dij搜索长3倍, O(logn+M)
两点互有路称强联通,然后还有强联通子集(分量,=SCC),tarjan 法(N+节点数M) 就能求一点的集
https://security.tencent.com/index.php/blog/msg/112] CFG Flatten 是利用运行期switch派发器的方法混淆代码 🤔都是些基于 CFG(控制流图) 的东西,对正常编程而言其实优化分析都是虚的,代码写好才最重要,不过这些还挺有意思的,至少比把程序打散为编号强
高级的科班编译原理除了龙书还有虎书鲸书,但语言的设计不需要懂太多知识,王垠在前也怼过 CFG analysis ,确实这些对编程并不重要,不通用的工具做着还是容易的,但它们也是个领域啊
知乎专栏
编译器优化了什么
[经 @污博士 提醒,我决定把题目改了…]最近在做一个 x86 到 x86 的 jit 编译器,因之前大多接触的是编译器前端知识,所以重新学习了一遍中后端原理,做个整理,也欢迎交流拍砖。 这里不打算涉及具体的工程细节,…
duangsuse::Echo
王垠对CS科班编译原理侧重点的质疑是对的(然而并没暖用,就像教育也不只是为培育人才一样;你没法让所有人相信简单是对的 倒不如说是老师举例和对照的方法不好,LL 这样入门级的程序编号化还是比较好教的,可是他们一举例就是很生硬,非常莫名其妙的常量 也不先说目标,上来就“贴代码”、贴做的图(也不简洁、记流水帐),让人很迷糊: ③ T → FT ' FIRST ( T ) = { ( id } ④ T' → *FT ' |ε FIRST ( T' ) = {* ε } ⑤ F → (E)|id FIRST ( F…
https://zhuanlan.zhihu.com/p/99509681 #reveng #recommended #ce 虚拟机壳都弱爆了,不影响性能的OLLVM多好(那自动重构命名和类全名 的岂不是仍不够强 草..
在纵向70% state= angr汇编符号执行, -3行: 若执行踏入了 相关块addrs, 返回其目标地址,否则忽略此分支(消除无用块. hook地址是块内最后call)
然后会修复真实块间加jmp
把假条件 cmovz(zf?1:2) 改成jz +jmp 后随地址
在纵向70% state= angr汇编符号执行, -3行: 若执行踏入了 相关块addrs, 返回其目标地址,否则忽略此分支(消除无用块. hook地址是块内最后call)
然后会修复真实块间加jmp
把假条件 cmovz(zf?1:2) 改成jz +jmp 后随地址
https://zhuanlan.zhihu.com/p/385042207 #ce
看完我算是满意但又比较失望的。 其实他的AST可视化(是用 pyecharts. 一个children;text 的结构)做得好,但就最开始的那篇博文就走偏了
我以为那个计算机是逆波兰栈的(据说现在一些大学这样教, iseki 表示他上过课来问群朋友,当时吓得我以为是几百行代码才能做,赶紧抱紧那个民科优先级算法... 😂)
他的计算器只能算 "1+2", (很可惜递归下降不适合解决优先级) 但把分词/解析的职责和求值流程教了下,感觉鸡肋(因为30行parse()就算个加法..)。我不满意的是这个Python 实现没有简洁性, interpreter 会构造大量 dataclass ,故这个人每期代码都4,5百行
https://zhuanlan.zhihu.com/p/24035780 这是 #JS React 的爱好者写的,他举的 Expr+Factor=>Expr+'('+Expr+')'=>1+(2*3) 展开和 if Expr then BB (else BB)? 很实际,Java 里 if() if()a;else b; 的else是就近原则,但 LL里要写明 if() WithElse else Stmt 这样
然后左递归 A='a'|A'b' 就是 A='a'|'a'A1 ;A1='b'A1|null
可惜这种写法有多少层优先级就要有多少调用栈,在 Kotlin 里都有快10种,规则不重要,最终代码你要全部手写我敬你 😐
而且组织AST的方法也有点怪,是用
最后 visit 的方法也是依赖 + * 的层次性的,不可能推广到同层次 +-或 */ ,命名也不简洁
200赞。。。应该说在流行编程界教这些东西会更好…… 贺师俊 hex老也来了
https://zhuanlan.zhihu.com/p/208906640 #Go .这个的原理一样,但解析时求值了
https://zhuanlan.zhihu.com/p/331794661 他们的那套编译原理的真理论( 🤷♂️
https://zhuanlan.zhihu.com/p/26660940 #JS 这个和我最近设计的一个有点像... 不过也不够简洁(20行深拷贝... 30行都能实现miniKanren了),但非常直白
#learn 那我就讲下 N/D Finite Automaton (状态机,别瞎听他们加绝对前缀,没意义),下简称 N/D
N是一个状态列表,从列表:起始/begin状态号到含完成/final 状态,一次匹配就成功。 每状态有 CharClass 对应,成功则转移到许多?状态,否则原位
abc , a[be]c , \d\w+ 都可写成字符类的状态机,^$ 蛮特殊的,它断言当前在输入首尾
N不如D适合 match ,N的所有状态是平级的,ab?c 时状态会回退a,类似 when 变 if-else 会更实际些f
a[bc]*$ 里, (S0 a (S1 [b b1-S1] [c c1-S1] ) $) b,b1 这些"连接态"是等价的,a和$ 是等价的
把 通过S0通过a 能走到(transit)的态记为 q1, q1通过b 滤出q2 ,而只要q里包含 finalCell 就是结束态 ,继续下去可把N转为D。
“ 在这里是 {n5} 。之后求它的边界, 即每一个元素都通过 ε 走到能走到的所有状态,记为 q1 的闭包。” ... 其实就是BFS/DFS
“不动点算法:算法可以提前运行终止,因为状态数是有限的” ...
在mivik的正则库里,
在流程构造里 begin,end 是常被extend()的, link(cell, final)是状态尾部
repeat(1..2) 是最有趣的,repeatAtLeast 只是把 m.copy() extend N遍然后 m*,rep(a..b) 则是在a后放 b-a 个可跳end 的单元,遇到不在内的自然就跳出了
讲不完... 🤪 没有精力了,图形学应用还鸽着呢
正则能不能直接变DFA?
最魔怔的就是直接替换为规则集的规则 a=b|c|$ ;bc=c;cb=b; 还有cb$ ,'b' 本身没喂对可以不转移,也能等价它link到的字,这是什么构造.. 1字符1转移都没会还要整理这个 🤪
看完我算是满意但又比较失望的。 其实他的AST可视化(是用 pyecharts. 一个children;text 的结构)做得好,但就最开始的那篇博文就走偏了
我以为那个计算机是逆波兰栈的(据说现在一些大学这样教, iseki 表示他上过课来问群朋友,当时吓得我以为是几百行代码才能做,赶紧抱紧那个民科优先级算法... 😂)
他的计算器只能算 "1+2", (很可惜递归下降不适合解决优先级) 但把分词/解析的职责和求值流程教了下,感觉鸡肋(因为30行parse()就算个加法..)。我不满意的是这个Python 实现没有简洁性, interpreter 会构造大量 dataclass ,故这个人每期代码都4,5百行
https://zhuanlan.zhihu.com/p/24035780 这是 #JS React 的爱好者写的,他举的 Expr+Factor=>Expr+'('+Expr+')'=>1+(2*3) 展开和 if Expr then BB (else BB)? 很实际,Java 里 if() if()a;else b; 的else是就近原则,但 LL里要写明 if() WithElse else Stmt 这样
然后左递归 A='a'|A'b' 就是 A='a'|'a'A1 ;A1='b'A1|null
可惜这种写法有多少层优先级就要有多少调用栈,在 Kotlin 里都有快10种,规则不重要,最终代码你要全部手写我敬你 😐
而且组织AST的方法也有点怪,是用
let p1=new Node("Mul"); p.push(p1); readTerm(); p=p1;
,没有用参数 也没提及 p=p1;
得每次readXX 重设最后 visit 的方法也是依赖 + * 的层次性的,不可能推广到同层次 +-或 */ ,命名也不简洁
200赞。。。应该说在流行编程界教这些东西会更好…… 贺师俊 hex老也来了
https://zhuanlan.zhihu.com/p/208906640 #Go .这个的原理一样,但解析时求值了
https://zhuanlan.zhihu.com/p/331794661 他们的那套编译原理的真理论( 🤷♂️
https://zhuanlan.zhihu.com/p/26660940 #JS 这个和我最近设计的一个有点像... 不过也不够简洁(20行深拷贝... 30行都能实现miniKanren了),但非常直白
#learn 那我就讲下 N/D Finite Automaton (状态机,别瞎听他们加绝对前缀,没意义),下简称 N/D
N是一个状态列表,从列表:起始/begin状态号到含完成/final 状态,一次匹配就成功。 每状态有 CharClass 对应,成功则转移到许多?状态,否则原位
abc , a[be]c , \d\w+ 都可写成字符类的状态机,^$ 蛮特殊的,它断言当前在输入首尾
N不如D适合 match ,N的所有状态是平级的,ab?c 时状态会回退a,类似 when 变 if-else 会更实际些f
a[bc]*$ 里, (S0 a (S1 [b b1-S1] [c c1-S1] ) $) b,b1 这些"连接态"是等价的,a和$ 是等价的
把 通过S0通过a 能走到(transit)的态记为 q1, q1通过b 滤出q2 ,而只要q里包含 finalCell 就是结束态 ,继续下去可把N转为D。
“ 在这里是 {n5} 。之后求它的边界, 即每一个元素都通过 ε 走到能走到的所有状态,记为 q1 的闭包。” ... 其实就是BFS/DFS
“不动点算法:算法可以提前运行终止,因为状态数是有限的” ...
while(que.size)得到 (S0 a (S1 [b [S2 bb bc] ] [c [S3 cc cb] ] ) )
q=que.pop()
for(c in q)
G[q,c] =t=dfs(links(q,c))
if(t not in Q)// Q = {q0, q1} , workList = [q1]
Q.add(t);que.add(t)
在mivik的正则库里,
NFA.from(append="a").oneOrMore
是 NFA的Builder ,StaticNFA.toDFA . CellList=StateList ;因为 outs 是 BitSet (IntSet) 还支持序列化所以很乱,但这个算法就难..在流程构造里 begin,end 是常被extend()的, link(cell, final)是状态尾部
repeat(1..2) 是最有趣的,repeatAtLeast 只是把 m.copy() extend N遍然后 m*,rep(a..b) 则是在a后放 b-a 个可跳end 的单元,遇到不在内的自然就跳出了
讲不完... 🤪 没有精力了,图形学应用还鸽着呢
正则能不能直接变DFA?
a(b|c)*$
转NFA还好, a 喂b,c 或$ 会转移,而 cb,bc 是互相转移的最魔怔的就是直接替换为规则集的规则 a=b|c|$ ;bc=c;cb=b; 还有cb$ ,'b' 本身没喂对可以不转移,也能等价它link到的字,这是什么构造.. 1字符1转移都没会还要整理这个 🤪
知乎专栏
一起来写个简单的解释器(七):抽象语法树AST
本章,我们会推翻之前解释器的实现方法,将用“树”这种数据结构来实现解释器。为什么会用树来实现?因为算术表达式最适合用树这种数据结构来描述了。比如6/3*2+4*5,可以通过不断叠加的二叉树来表达: 这种树叫做…
duangsuse::Echo
我太阳,才发现这个别人能发博文的东西,我竟然连标题和名字都没起,试运行成功贴上就pass了…… 这不是在线教SICP(程序的构造和解释)吗🤪 #lisp #fp #zhihu #statement 放到以前我绝对搞大新闻一样,就像之前仿造(但也没成功)Lice 时专门建了项目画了logo,然后文档拼缀别人的,最后模板代码写完不会了 🙈 但说起来,元编程最后也不过是编程。你了解编程语言,很好,但语言只是载体,美丽的、各种各样的应用才是我们的最终目的。 你能写编译器,很好,但也不过是完成了文本模式和树遍历,加上一些理论。…
尽管王某这篇不够简洁,作为同道的我觉得,这囊括住了上面冰封喜欢一大堆术语的 HOAS ,许多人讲过一切关于解释器的理论,而且没有遮遮掩掩、没有复古命名,与目前我对程序解释的基础认知完全吻合 #plt #ce #recommend
他写这一篇就够了。其他东西没必要再讲了,已经胜过许多人分享捕风捉影的东西了。 全网那么多自称知识的社区,就R大和王垠的多分享最干货,其他的大佬,都仍迷惑在语法和名词上。 我开始了解程序语言理论这三年,所获得的也不过如此嘛。
唯一的缺点是不够明确,只有Racket的版本, Lexical Scope 当年我问冰封他没回答,但看这篇我也没看懂,就只知道不能 getA=(a)=>()=>a 了。其实这些在编译原理都有更直接的解释(函数指针+upvalues外层量)
毕竟当时就是嵌套表都只知道
如果说王某招生的愿打愿挨(在语言理论人看来就)是在躺着圈钱,那么”学院派“大佬的知乎就是站着昂着脸受拜 ,如果想开培训班过好生活是割韭菜,作为既有能力又看不惯的人,不该反思下这种现象为何存在?
虽然我不会干这种事(未来还是打算做后端),但如果博客做到此科普名气水准,我想做点轻松的职业也不该受到道德苛责吧
偶像崇拜不应该是单向的,尝试接受和质疑大佬的布道也很重要
如果一个人给人不接受质疑的感觉,那么他只是暗示自己有这个资格而已
他写这一篇就够了。其他东西没必要再讲了,已经胜过许多人分享捕风捉影的东西了。 全网那么多自称知识的社区,就R大和王垠的多分享最干货,其他的大佬,都仍迷惑在语法和名词上。 我开始了解程序语言理论这三年,所获得的也不过如此嘛。
唯一的缺点是不够明确,只有Racket的版本, Lexical Scope 当年我问冰封他没回答,但看这篇我也没看懂,就只知道不能 getA=(a)=>()=>a 了。其实这些在编译原理都有更直接的解释(函数指针+upvalues外层量)
毕竟当时就是嵌套表都只知道
Map<K,List<V>>
或其翻过来这样"虚表"式查找,不知道eval(e,d) 本身就是ds:List栈.. 更不知道名字!=UUID ,=arg$1 这回事;说白了就是编译原理不是显学,看半天揉杂太多语言特性和C,Lisp之类博文语言的麻烦如果说王某招生的愿打愿挨(在语言理论人看来就)是在躺着圈钱,那么”学院派“大佬的知乎就是站着昂着脸受拜 ,如果想开培训班过好生活是割韭菜,作为既有能力又看不惯的人,不该反思下这种现象为何存在?
虽然我不会干这种事(未来还是打算做后端),但如果博客做到此科普名气水准,我想做点轻松的职业也不该受到道德苛责吧
偶像崇拜不应该是单向的,尝试接受和质疑大佬的布道也很重要
如果一个人给人不接受质疑的感觉,那么他只是暗示自己有这个资格而已
Telegram
duangsuse::Echo
AST with Scope - 脚趾头的文章 - 知乎
https://zhuanlan.zhihu.com/p/75073557
SKI 是”替换、重命名、即得“的意思吗, de Bur.xx Indices 是拿编号替代参数?
代表一个变量的索引 为 距离 该变量所定义的 作用域之间 的距离(之间嵌套了多少个作用域),比如:
这tm不就是词法域编译期变换吗? de Bur .. 干掉了α-conversion(重命名. eta是规约=单步),还干掉了shadow和capture (层叠域和 dict.copy)…
https://zhuanlan.zhihu.com/p/75073557
SKI 是”替换、重命名、即得“的意思吗, de Bur.xx Indices 是拿编号替代参数?
代表一个变量的索引 为 距离 该变量所定义的 作用域之间 的距离(之间嵌套了多少个作用域),比如:
这tm不就是词法域编译期变换吗? de Bur .. 干掉了α-conversion(重命名. eta是规约=单步),还干掉了shadow和capture (层叠域和 dict.copy)…
duangsuse::Echo
http://amid.fish/karplus-strong #math #signal 对对,这就是我想要的那种博客 😭 #recommend 能改参数预览的那种 #video #tools 顺便: https://natrongithub.github.io/ 是开源的VFX合成台-目前只有Fedora 有打包,支持 ShaderToy.com GLSL 和 GMIC.eu ,可以在ghproxy下载 基于处理节点和关键帧动画,支持2D动追(可惜这类软件都不能从摄像头Input.. 😒 这个都支持…
#dev 信号(波)处理:能满足你一切遐想的领域。 你觉得非常厉害的3D渲染光追、2D绘制图示、动画缓动、纹理着色、物理粒子和GPU加速计算 在信号处理科普文里像活动手指一般自然。 不需要框架和多余的公式,作者手写就能实现,对”不知名“web技术的使用大大简化了无关原理的流程 🤪
当你写下
什么是「非==」的应用呢?平时看的各种页面或是”app“形式页面,其代码都是基于「从API或文件树/配置obj/IPC其他应用 读写信息」「过滤与展示数据的子集」「检查/填默认值」,如果没有突破「数据子集」的列表处理,就属于(==)类应用,在我的观念里,可改写数据绑定到UI是没有Element外的名词的,因此编程任务只是设计模型和检查及UI,自动生成一个API,给页面链接上一些其他功能,本来是属于很模板化的代码,应用的特点一个文件能定义完的那种。 当然因为工程习惯,冗杂许多就是了
代码在某种程度上都可以称为在绑定概念:编译器是把变量和函数绑定到具体位置与规范:文本与求值序绑定,应用是给各种数据struct 做UI+平台套版代码 :obj与交互绑定、图形学是把各种位置绑定到数学函数(尽管看起来不是等号关系);但编程的目的是找一个概括性的对应关系,如果在同质模型上太磨叽就忽略程序里真正不同的地方。 绑定的原义就是同名符号指代相同位置。基于 [a,b]=p; p==a[0] 这样的关系,它并不复杂
许多应用通过lib(甚至有HTTP收费API)能实现有趣的功能,但终究是不够优雅。 许多实现了非常简单效果的库(例如定义个八分音表,放sin波) 占用了极大行数,而且有很无序的API 。许多时候问题有更好编程解法,就需要手动面对最底下的每次计算单帧
#plt #ce 刚刚也想了 suspend fun 实现的问题,现在是有状态机化和 call=inline-tail 两种方法可选
A: 我觉得在平直块里 yield() 类<3次就内联,否则状态机化。 列<> filter takeWhile forEach 这样 API只内联,用户可指定调用是否内联?
B: 啥叫平直?块都是嵌套的, if(q) a; else b; 的a 里yield 也是在语句块里,然而CPS 的话 If 后的代码也要复制一份,有 while 变 ifgoto 完也麻烦
A: 那就只允许fun{} 内<3的内联,这样翻译起来也简单。把 val a=1+f1()+2 改成 var a=1; f{a=a+it+2} 就行了(状态机化的pass),然后末尾先收集,切分代码交给直到第[0]suspend
B: 就是 Haskell 的 do <- 那种咯,那状态机化呢
A: 闭包序列化基础上加 st:Int ,表达式切分后,入口=0 ,休眠一次+1 ,函数头部加 switch 跳转表,直到最后一块真 return
B:
当你写下
g.arc(x,y,l, 0,2pi)
时,怎么会知道 length(P+ p-l)
和极座标系弧度atan2也能定义一个圆呢,其实说到底关于「现实世界」程序员知之甚少,如果能结合物理几何来编程,就能做到更多、更多有趣的事,可比在 DevTools 里调个颜色排版设计模板要好玩不少什么是「非==」的应用呢?平时看的各种页面或是”app“形式页面,其代码都是基于「从API或文件树/配置obj/IPC其他应用 读写信息」「过滤与展示数据的子集」「检查/填默认值」,如果没有突破「数据子集」的列表处理,就属于(==)类应用,在我的观念里,可改写数据绑定到UI是没有Element外的名词的,因此编程任务只是设计模型和检查及UI,自动生成一个API,给页面链接上一些其他功能,本来是属于很模板化的代码,应用的特点一个文件能定义完的那种。 当然因为工程习惯,冗杂许多就是了
代码在某种程度上都可以称为在绑定概念:编译器是把变量和函数绑定到具体位置与规范:文本与求值序绑定,应用是给各种数据struct 做UI+平台套版代码 :obj与交互绑定、图形学是把各种位置绑定到数学函数(尽管看起来不是等号关系);但编程的目的是找一个概括性的对应关系,如果在同质模型上太磨叽就忽略程序里真正不同的地方。 绑定的原义就是同名符号指代相同位置。基于 [a,b]=p; p==a[0] 这样的关系,它并不复杂
许多应用通过lib(甚至有HTTP收费API)能实现有趣的功能,但终究是不够优雅。 许多实现了非常简单效果的库(例如定义个八分音表,放sin波) 占用了极大行数,而且有很无序的API 。许多时候问题有更好编程解法,就需要手动面对最底下的每次计算单帧
#plt #ce 刚刚也想了 suspend fun 实现的问题,现在是有状态机化和 call=inline-tail 两种方法可选
A: 我觉得在平直块里 yield() 类<3次就内联,否则状态机化。 列<> filter takeWhile forEach 这样 API只内联,用户可指定调用是否内联?
B: 啥叫平直?块都是嵌套的, if(q) a; else b; 的a 里yield 也是在语句块里,然而CPS 的话 If 后的代码也要复制一份,有 while 变 ifgoto 完也麻烦
A: 那就只允许fun{} 内<3的内联,这样翻译起来也简单。把 val a=1+f1()+2 改成 var a=1; f{a=a+it+2} 就行了(状态机化的pass),然后末尾先收集,切分代码交给直到第[0]suspend
B: 就是 Haskell 的 do <- 那种咯,那状态机化呢
A: 闭包序列化基础上加 st:Int ,表达式切分后,入口=0 ,休眠一次+1 ,函数头部加 switch 跳转表,直到最后一块真 return
B:
Promise.all
其实(半)已经能做了,主要还是没做过,解释器模式上不知有啥该改
moke 的 日常分享、吐槽和动态
百度 xss 漏洞 site:a=<script>/**/alert(111)//
#security #baidu 😅已修复
下方是一个后端程序员推荐的
👆是 #ce #rust 一个C-like编译器
👇这个群体约有1w人 #china
终于被删了
现在已经专家组 https://telegra.ph/接苗患白血病群体的第二封公开信-湘江评论-05-28
白血病又称血癌,是自身骨髓异常产生假白细胞所致。急性与慢性急发期无关,《我不是药神》里的高价靶向药可以抑制错误染色体,杀死癌细胞
https://www.zhihu.com/question/499149980
是确有其事还是样本焦点效应,有待统计(不过我觉得这个疫苗生理盐水一样的,感染统计学曲线都压不下来(O毒株影响),然后还闹幺蛾子。。。
https://www.zhihu.com/question/483566795
当然还是要看是否耦合而已了
下方是一个后端程序员推荐的
👆是 #ce #rust 一个C-like编译器
👇这个群体约有1w人 #china
终于被删了
现在已经专家组 https://telegra.ph/接苗患白血病群体的第二封公开信-湘江评论-05-28
白血病又称血癌,是自身骨髓异常产生假白细胞所致。急性与慢性急发期无关,《我不是药神》里的高价靶向药可以抑制错误染色体,杀死癌细胞
https://www.zhihu.com/question/499149980
是确有其事还是样本焦点效应,有待统计(不过我觉得这个疫苗生理盐水一样的,感染统计学曲线都压不下来(O毒株影响),然后还闹幺蛾子。。。
https://www.zhihu.com/question/483566795
当然还是要看是否耦合而已了
Telegraph
接苗患白血病群体的第二封公开信-湘江评论
来源:卫柏兴说医改 我们是一群白血病患者,来自全国30多个省市自治区。这两年,我们在接种新冠疫苗之后,不约而同地患上了白血病。 2022年5月初,我们在网上发布了《疑接苗患白血病群体的公开信》,公开信发布之后,十几万阅读、400多网友评论,几乎无一例外地提到自身或家人接种疫苗出现白血病。这封公开信流传到微博上,仅一天就上千条评论,大量网友对此评论。 我们深知发出真实声音的困难,仅在卫柏兴医改平台,这封公开信就被黑客攻击了几十次,反复被删又反复地修复,而流传到微博的公开信仅热搜一天,即被和谐。 …
#statement ChatGPT 不是编译领域的,但能解决这一类问题, 编译的那堆术语它大概有记忆
虽然可能要中篇提示词,它也能做代码的变形,毕竟它对语言就能做代入归纳 ,是有逻辑链的,能在不说话时偷偷思考
虽然我主要学的元编程,在编译上只使用最简单的实现途径(只是工具),不需要AI对算法提建议,但还是感觉挺微妙🌚
只能说, #ce 领域是为应用层编程服务的。 大众有眼力、有热情,研究是为方便他们的创作、日常操作,避免他们涉足和不涉足实现细节时的难度。 #plt 就不能practical点吗
#AI https://vxtwitter.com/virushuo/status/1627589883400159233
另外, 中文语料库其实只有英文的 0.1% 🌝它能推测B站投币API, css爬虫这种内容
虽然可能要中篇提示词,它也能做代码的变形,毕竟它对语言就能做代入归纳 ,是有逻辑链的,能在不说话时偷偷思考
虽然我主要学的元编程,在编译上只使用最简单的实现途径(只是工具),不需要AI对算法提建议,但还是感觉挺微妙🌚
只能说, #ce 领域是为应用层编程服务的。 大众有眼力、有热情,研究是为方便他们的创作、日常操作,避免他们涉足和不涉足实现细节时的难度。 #plt 就不能practical点吗
#AI https://vxtwitter.com/virushuo/status/1627589883400159233
另外, 中文语料库其实只有英文的 0.1% 🌝它能推测B站投币API, css爬虫这种内容
vxTwitter
virushuo @huoju@m.devep.net (@virushuo)
可能人们对中文占gpt训练的比例有个误解,大致感觉是 你英文有50%内容,中文好歹有个10%吧?
但实际上可能让你吃一惊 https://github.com/openai/gpt-3/tree/master/dataset_statistics
💖 4 🔁 1
但实际上可能让你吃一惊 https://github.com/openai/gpt-3/tree/master/dataset_statistics
💖 4 🔁 1
#recommend #ce 不可能单单靠 #bing 的建议实现解释器,甚至(逆波兰)计算器。
它的回答太零散,而且分不清AST解释(对象的重写) 和代码字面,更难以解释语法为何设计如此;但可询问语言的构成 #plt
它的回答太零散,而且分不清AST解释(对象的重写) 和代码字面,更难以解释语法为何设计如此;但可询问语言的构成 #plt
https://tttttt.me/rynif/30026 #science vs. #tech 🌚🤔
按这个来说, 我也是离开 #cs #plt 计算机科学 加入了 #algor #sp #ce #cg #web 等具体应用,用 #py #js 去解读许多概念
并且回看之前的知识术语,也没有感觉什么不同👌 。主要是以所见即所得为重 ,体系性可以另起炉灶 从实践中来
按这个来说, 我也是离开 #cs #plt 计算机科学 加入了 #algor #sp #ce #cg #web 等具体应用,用 #py #js 去解读许多概念
并且回看之前的知识术语,也没有感觉什么不同👌 。主要是以所见即所得为重 ,体系性可以另起炉灶 从实践中来
Telegram
&'a ::rynco::UntitledChannel
【Science:#AI竞赛学术界输了#】
AI领域,重心已从学术界转移到了产业界,并且失衡还在继续。
Science在最新一期正刊上发了一篇文章,整理了近几年AI领域的相关数据,结果也是一目了然:
AI竞赛,学术界输了。
Science统计了论文、AI最大模型以及SOTA模型在各个领域的占比。
从2016年开始,产业界在领先的人工智能会议上发论文的占比开启了野蛮生长的趋势。
4年时间,在论文数量上,产业界几乎从学术界“夺取”了20%。
AI领域的10大模型,2013年之前还都是学术界居于主导地位。…
AI领域,重心已从学术界转移到了产业界,并且失衡还在继续。
Science在最新一期正刊上发了一篇文章,整理了近几年AI领域的相关数据,结果也是一目了然:
AI竞赛,学术界输了。
Science统计了论文、AI最大模型以及SOTA模型在各个领域的占比。
从2016年开始,产业界在领先的人工智能会议上发论文的占比开启了野蛮生长的趋势。
4年时间,在论文数量上,产业界几乎从学术界“夺取”了20%。
AI领域的10大模型,2013年之前还都是学术界居于主导地位。…
map({it+1},[0])|{[*it]}, 1|{it+1}
为何是有效 Python 🤔#tool #py #ce ✅帮我写个python重构工具,把
{it+1} 改成 lambda it:it+1
,把 1|{it+1} 改成 (it:=1, it+1)[-1]
;用match✅给我些基础 lib2to3 fixer, 如把 "abc" 加上 '+' 前缀 ;另外再用 ipywidget 给lib2to3 一个UI (+5对话)
❌写个python重构工具,把 def 和其内的def 转换为class,如
def Point(x,y):
def len(k):x*y*k
变成@dataclass
class Point:
x:int; y:int
def len(k):return self.x*self.y*k
❌ 编程处理def f的 defaults 。请以参数名设置默认值:参数名为n则 default=1, 为s=""
✅利用 astor 做for循环展开,例如将
for x in evals([1,2]): f(x) 1句改为 f(1);f(2)
2句 。只要for x in 的集合是 evals(e) 就对e进行求值,并将x替换为repr✖️ 用 astor 重构,实现函数内联。
@evals
def f(x): x+=1; return x
f(f(0))
变成
x=0; x+=1; x1=x; x1+=1; x1
❌整理我发给你的gist链接里的代码
💢请以py实现 1+1 这种运算链的栈化并进行 linux x86_64 JIT汇编编译和执行。如 cal("1+1+$0")(3)=5 :尝试用asmjit执行pushpop汇编
🤔https://tttttt.me/kotlin_cn/21458
https://tttttt.me/Javaer/893241 #kt #ce #dotnet
Forwarded from dnaugsuz
bmp[x,y]=RGB ; 很正常的语法
#code #ce https://github.com/JetBrains/kotlin/blob/master/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt#L176
对,比如 BufferedImage.setRGB 就可以扩充一下,变成3参的[]=调用
话说 kt分词都做不好?😅 getUrl 和 getURL 应该都2个词
#code #ce https://github.com/JetBrains/kotlin/blob/master/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt#L176
对,比如 BufferedImage.setRGB 就可以扩充一下,变成3参的[]=调用
话说 kt分词都做不好?😅 getUrl 和 getURL 应该都2个词
duangsuse::Echo
#ai #code https://jsbin.com/divoxufajo/edit?js,output 可以试玩一下AI编程的质量😒 。全程没4句话,全网找不到类似代码,是 #Bing 从算法原文据位运算知识翻译的。 人家就是复现算法原文,也比工业界写的强。 什么叫 🐮🍺 ,就是大家实现同1个算法,结果AI不仅快,而且简明,而且每一根毛都看得清算法原文 #game AI generate 还能缝合棋盘 puzzle (UX有bug, 请按 Hint 键体验. 这个键也是AI实现的 pong, gpt2
#statement
人能活几十年,计算机界也有70岁, 对技术怎么就这么短视😒。 过几年再看看,会觉得吵的是毫无收获,你新写的东西真的是唯一的吗?世界上甚至有人实用过。也有无数种视角你没做过,这并不能作为什么谈资
自己做CS,科学,搞得跟信教了一样,主动提AI,主动骂狗shit ,你拿什么荔枝?
#ce #reveng #sb https://tttttt.me/Javaer/895034
哦,刚刚想起来 跳转Block 的层级也是可以做混淆的,但这是 #security 领域的东西,一般人只会用加壳脱壳扫内存,这种技术根本没有普及,业界倾向于选择无法软破解的DRM
obfuscator, 比如,把所有 if else 块变成 while() switch(flag) 的格式,就能让反汇编或retdec 很难读懂。 如果用动态分析找到Block的跳转集散点做记录,就可以反混淆
我就想,正向工程,尚没有什么复制不了的业务功能,何况需要ELF文件才能开展的RE呢? 好好写定义式的专业框架、C-FFI 不香吗
觉得低能我当然理解,“安全论坛”base族不过是入门教程,但这只是我涉足领域的10% ,触类旁通罢了
我是从问题创作自己的解法, 而不是知道问题和“正确的”解法、或知道哪类解法该在什么对线里拿来炫耀 ;那是对编程的玷污🙄
用比上不足比下有余的心态看待技术,真的…… 比你强的大老牛一堆, 比你菜的js框架一堆,挣钱嘛,不寒碜
无非你是会冷门领域,然后 #AI 提供的搜索结果能涉足你领域一些“菜鸟技能”,让你要拼命掩饰它是种威胁了。
但那些根本不是“技术”,只是别个领域里前人做过,而你碰巧重做了。对你而言似是其非、表达不出,勉强在test上通过了,故自以很厉害,
但究其原理就那样,前人的正确错误都犯到,连冗杂都不是原创。
AI只是暴露了这苗头,AI只是向你证明了没有信息差时,那些堆砌就根本不是“技术”;你们硬要喷别人蠢。它就是蠢,但未来就是能干死“只有你懂”的伪门槛。 你可以不信,但最好停止狭技居奇,看看pancake的r2利用好了多少“蠢”领域的技术吧? 强如Haskell又有几个pandoc ?
要是所有程序员早设计好
我爱旧知,但我更爱真理
我爱算法,但我更敢组合
连API和DSL都写不好的程序员 在用XX范式里百年未变的概念,写模式匹配->更单调语言 的重构器,自以掌握了所有编程里的变与不变,看透了
#PL 人这天才病,可真得养好再上网吧。天才,就要有自己的话语体系?笑料。
大家都写列表处理,都琢磨图求解图重构,就你
ref: 开头 - 开头1
被骂了code
导致误会的disclaimer
我的反思 - 我导致被骂的观点
人能活几十年,计算机界也有70岁, 对技术怎么就这么短视😒。 过几年再看看,会觉得吵的是毫无收获,你新写的东西真的是唯一的吗?世界上甚至有人实用过。也有无数种视角你没做过,这并不能作为什么谈资
自己做CS,科学,搞得跟信教了一样,主动提AI,主动骂狗shit ,你拿什么荔枝?
#ce #reveng #sb https://tttttt.me/Javaer/895034
哦,刚刚想起来 跳转Block 的层级也是可以做混淆的,但这是 #security 领域的东西,一般人只会用加壳脱壳扫内存,这种技术根本没有普及,业界倾向于选择无法软破解的DRM
obfuscator, 比如,把所有 if else 块变成 while() switch(flag) 的格式,就能让反汇编或retdec 很难读懂。 如果用动态分析找到Block的跳转集散点做记录,就可以反混淆
我就想,正向工程,尚没有什么复制不了的业务功能,何况需要ELF文件才能开展的RE呢? 好好写定义式的专业框架、C-FFI 不香吗
觉得低能我当然理解,“安全论坛”base族不过是入门教程,但这只是我涉足领域的10% ,触类旁通罢了
我是从问题创作自己的解法, 而不是知道问题和“正确的”解法、或知道哪类解法该在什么对线里拿来炫耀 ;那是对编程的玷污🙄
用比上不足比下有余的心态看待技术,真的…… 比你强的大老牛一堆, 比你菜的js框架一堆,挣钱嘛,不寒碜
无非你是会冷门领域,然后 #AI 提供的搜索结果能涉足你领域一些“菜鸟技能”,让你要拼命掩饰它是种威胁了。
但那些根本不是“技术”,只是别个领域里前人做过,而你碰巧重做了。对你而言似是其非、表达不出,勉强在test上通过了,故自以很厉害,
但究其原理就那样,前人的正确错误都犯到,连冗杂都不是原创。
AI只是暴露了这苗头,AI只是向你证明了没有信息差时,那些堆砌就根本不是“技术”;你们硬要喷别人蠢。它就是蠢,但未来就是能干死“只有你懂”的伪门槛。 你可以不信,但最好停止狭技居奇,看看pancake的r2利用好了多少“蠢”领域的技术吧? 强如Haskell又有几个pandoc ?
要是所有程序员早设计好
二进制可视化和RE的IDE插件
等API与脚本化,许多难题甚至都不会出现。编译器。呵呵。我爱旧知,但我更爱真理
我爱算法,但我更敢组合
连API和DSL都写不好的程序员 在用XX范式里百年未变的概念,写模式匹配->更单调语言 的重构器,自以掌握了所有编程里的变与不变,看透了
虚表多态、符号解析、跳转回填、闭包和可暂停化、流控图/Val引用、片段地址和二进制、typing、ptrace/mmap、Locks
等深奥模型,其实连母语 都讲不利索,能称为设计者吗🙄。未知生,焉知死。总结不出自己做了啥学了啥,不是个人肉copilot吗? #PL 人这天才病,可真得养好再上网吧。天才,就要有自己的话语体系?笑料。
大家都写列表处理,都琢磨图求解图重构,就你
NodeGraph<E= CFG_Block>
高人一等,那就永远别做技术交流、别做有工程意义的工具,术语内卷、套路通胀,让这个领域自生自灭吧。ref: 开头 - 开头1
被骂了code
导致误会的disclaimer
Deleted Account:
天天手撮LLVM pass這叫寫不了
我寫編譯器的時候你在幹嘛?
沒意思,天天打稻草人,一句話幾個 非形式謬誤(论证素材虚构/不相干)
(😅原来AST walker+IRBuilder 是啥了不起的技术我的反思 - 我导致被骂的观点
Telegram
Deleted Account in Java 编程语言
我撮pass混淆native code的時候你在哪?
👎3
#py 周刊
#learn visualize 交互式py学习
numpy-pandas, cupy-cuDF
from rich import inspect: py版的 devtools
textual.binding UI: 手动实现命令行 ChatGPT
命令行 MSPaint
#web #ml 支持向量列的数据库
asyncio 用线程池优化文件读取
Mpire: A Python package for easier and faster multiprocessing https://github.com/sybrenjansen/mpire
#rust py异步流读取 JSON
py的元编程FFI:
jupyterSQL 教程
java
#ce CPython如何编译源代码
#learn visualize 交互式py学习
conda install -c conda-forge lpython
在使用dict时比 numba.njit 编译快一倍 . cython3 最近更新就不提了numpy-pandas, cupy-cuDF
pip install jupyter-ai
可以用 %%ai chatgpt -f math,html,.
免费访问AI,避免复制粘贴了match case:
已经可替代 elif from rich import inspect: py版的 devtools
textual.binding UI: 手动实现命令行 ChatGPT
命令行 MSPaint
#web #ml 支持向量列的数据库
asyncio 用线程池优化文件读取
Mpire: A Python package for easier and faster multiprocessing https://github.com/sybrenjansen/mpire
#rust py异步流读取 JSON
py的元编程FFI:
jupyterSQL 教程
java
from jpype import startJVM, shutdownJVM, java
startJVM(convertStrings=False)
java.lang.System.out.println("hello world")
java.util.Random().nextInt(10)
js import pythonmonkey as js; js.eval("console.log")('hello, world')
#ce CPython如何编译源代码
Telegram
Newlearnerの自留地
#Python潮流周刊 #Newsletter
👉Python 潮流周刊#14:Lpython 高性能编译器、Python 与 JavaScript 实现互通
🦄文章&教程
1、LPython:新颖、高性能、适用于多平台的 Python 编译器
2、Cython 3.0.0 的文档
(附详解历时五年的 Cython3.0 都发生了哪些变化 )
3、Python 中使用 Pandas 和 NumPy 计算变异系数
4、Jupyter 中的生成式 AI
5、Python 中的结构化模式匹配
6、使用 Rich…
👉Python 潮流周刊#14:Lpython 高性能编译器、Python 与 JavaScript 实现互通
🦄文章&教程
1、LPython:新颖、高性能、适用于多平台的 Python 编译器
2、Cython 3.0.0 的文档
(附详解历时五年的 Cython3.0 都发生了哪些变化 )
3、Python 中使用 Pandas 和 NumPy 计算变异系数
4、Jupyter 中的生成式 AI
5、Python 中的结构化模式匹配
6、使用 Rich…
#js #code 再来说个有趣的:动态作用域 🥰
这里有3个深先规则,猜猜看?
[rv], [rv, vs] 引用-重赋值
[[args], funs] 箭头函数
[0,rv, fn] 向箭头赋值
对不会递归的人:
如果在递归后顺便修改.A.B,就能显示求值步骤
对不会 parse() 的人:
就是正则解构+转换。吃流吐KV,调用者组合出数组,实践上就是调用栈:
附近几条消息,会提及如何实现+-*/与调用链、语句块和更多同类解析算法
当然,用[a,1] 赋值是表示不了 a,b=b,a 解构的,最好是支持变量作为值,那无关动态域。
先简单地映射到js词法域: eval(`(a)=>${'a+1'}`)
逆波兰算符重排=易解析的四则计算,但一般只把「动态域」和求值序算作解释器,理解它的好处是可以破除性能迷信、作为你“滥用”闭包/yield/async 的背景知识
解释器并不特殊,它的转化&解决、局部化哲学和节点图,Scratch 很搭。而“游戏指令语言” “机器人脚本”即便支持变量也叫做shell。按下文just()式接口就能做它们
a=3>请把程序写成数组的形式 (也就是“更易做”正则替换)
- f(a)=a+1
f(1), a //2, 3
with(DSL) $dyn=[在这个解释器里,$=, ()=>[] 就是内联宏啦,反正函数不能跳转 无需语句外提。
[a,3],
[f, [[a], [0, [a],1,['+'] ]] ],
[r0, [0, 1,[f]], [a]]
]
DSL=new Proxy({},{get:(o,k)=>k, has:(o,k)=>k[0]!='$'})
这里有3个深先规则,猜猜看?
[rv], [rv, vs] 引用-重赋值
[[args], funs] 箭头函数
[0,rv, fn] 向箭头赋值
对不会递归的人:
when- SumPairAB不需要单独考虑两边即下一层,不要去匹配
Pair(A:Sum,B:Sum)
N(x:Int)
- as=when this:
N:x ; Pair: A()+B()
f(a,b,没有123)
等特例。 你要归纳函数的返回类型;从基线条件去举例如果在递归后顺便修改.A.B,就能显示求值步骤
对不会 parse() 的人:
就是正则解构+转换。吃流吐KV,调用者组合出数组,实践上就是调用栈:
File(s.{i=0})=[Stmt,.]=AST
流.next() 相当于 str[i++], 拿C写也一样,而ANTLR用虚拟机避免了递归,更慢附近几条消息,会提及如何实现+-*/与调用链、语句块和更多同类解析算法
当然,用[a,1] 赋值是表示不了 a,b=b,a 解构的,最好是支持变量作为值,那无关动态域。
()=>[]
宏借助了编译期的变量。但若通过“语法树模板化^^”, 编译和内联/推导类型都是方便的。 编译的本质就是重排重构,不是查表先简单地映射到js词法域: eval(`(a)=>${'a+1'}`)
kv={['+']:(a,b)=>funcSignature} //全局定义
//生成JS eval(),来实现此数组的语义
cg=([e,...v])=>{let N,f,x,
opc=[ //折叠(非函数/变量)语法
(a,r="",st=[])=>{for(x of a)x=see(x),
((f=x.v||x)&&f.call? r+=call(x,st.splice(n(st)-n(f),n(f)))
:st.push(x)) //N元运算^逆波兰
return r}],
call=(k,a)=>/\w/.test(k)? `(${k})`+vs(a) : a[0]+k+a[1], //具体执行f(ab),a+b
vs=(a,p='()')=>p[0]+a.map(see).join()+p[1],
see=x=>n(x)?cg(x):x, n=x=>x.length //递归辅助
return e.substr? ( // [v], [v,valOrFn], [,tuple]
(N=n(v))==0? Object.assign(e,{v:kv[e]})
:N==1?(v=see(v[0]), v.call?(kv[e]=v):0, `${e}=${v}`)
:`${e}=${vs(v,'[]')}`
) // [[arg], ], [opc指令, ]
:e.push? eval(`(${e.join()})=>${vs(v)}` )
:opc[e](v)
}
btw. SQsu 也是基于深先遍历逆波兰算符重排=易解析的四则计算,但一般只把「动态域」和求值序算作解释器,理解它的好处是可以破除性能迷信、作为你“滥用”闭包/yield/async 的背景知识
解释器并不特殊,它的转化&解决、局部化哲学和节点图,Scratch 很搭。而“游戏指令语言” “机器人脚本”即便支持变量也叫做shell。按下文just()式接口就能做它们
Telegram
duangsuse::Echo
#ce #plt 带步骤的四则计算器。递归逆波兰。22行代码
浅先=`;=;+ -;* / %`
流=(a, _s=[...a].values())=>()=>_s.next().value
切2D=(s,sp0,sp1)=>s.split(sp0).map(s=>s.split(sp1) )
{let t={},k; 切2D(浅先,';',' ').forEach((x,i)=>{for(k of x)t[k]=i}); 符深大=t}
符链=(s,l)=>{let a=[],add=x=>a.push(x)…
浅先=`;=;+ -;* / %`
流=(a, _s=[...a].values())=>()=>_s.next().value
切2D=(s,sp0,sp1)=>s.split(sp0).map(s=>s.split(sp1) )
{let t={},k; 切2D(浅先,';',' ').forEach((x,i)=>{for(k of x)t[k]=i}); 符深大=t}
符链=(s,l)=>{let a=[],add=x=>a.push(x)…
螺莉莉的黑板报
https://roriri.one/2024/05/12/alice-run-1/ 文章出来了
👆#ce 幽默 loop unroll (Duff's switch do{case} device)
x86在memcpy上是有rep movsb这个特殊优化的,如果是要做IO,恐怕瓶颈就不在程序跳转上了😅
#tool #game https://fsr.alicerun.pages.dev
https://pdf-to-podcast.com
https://github.com/LuisYeah1234-hub/NativeLinux #linux xp
https://github.com/mljar/mercury huggingface webui
https://github.com/ItzCrazyKns/Perplexica
x86在memcpy上是有rep movsb这个特殊优化的,如果是要做IO,恐怕瓶颈就不在程序跳转上了😅
#tool #game https://fsr.alicerun.pages.dev
https://pdf-to-podcast.com
https://github.com/LuisYeah1234-hub/NativeLinux #linux xp
https://github.com/mljar/mercury huggingface webui
https://github.com/ItzCrazyKns/Perplexica
GitHub
GitHub - LuisYeah1234-hub/NativeLinux: Linux in the Windows Native Mode (chkdsk screen env)??
Linux in the Windows Native Mode (chkdsk screen env)?? - LuisYeah1234-hub/NativeLinux
Manjusaka 的碎碎念(以及摇曳露营 S4 制作确定!)
https://github.com/rui314/chibicc 安利个东西,这个库用核心 6k 行左右的 C 语言实现了一个完整可以自举的 C 编译器(编译 git/sqlite 也能过测试), Commit Message 写的非常牛逼,每个 commit 都是一个完整的 bug free 的功能叠加。有兴趣的可以看一下
https://www.fxzhihu.com/question/544124280/answer/2587927808
#plt #ce tcc 8cc c4 . 虽然 C 类型不是内存安全/心智模型合理的设计,但这个日本人很厉害!
Notepad++ 是一个台湾人写的,也可以说是工匠精神 #dalao
在粒子加速器领域,绕不开一个软件:TRACEWIN,这是美国人开发的。追踪粒子在电磁场下的轨迹。
是怎么开发这个软件的呢?他们没有立项。没有想突破封锁。 只是某天3,4个行业内都不出名的研究员看到了一个amazing的粒子路径追踪公式,
在维持原有工作的情况下!历时数年,根据同行们的贡献协助,
仅仅因为一时兴起,美国就多了一个能垄断一个小行业的软件。
把人当人,而不是资源!人会创造,资源不会!
我们对标的软件应该叫TripleWin 😎
嗯,“到各个985高校抽20个数学教授,20个物理学教授。再来几个程序员”
#plt #ce tcc 8cc c4 . 虽然 C 类型不是内存安全/心智模型合理的设计,但这个日本人很厉害!
Notepad++ 是一个台湾人写的,也可以说是工匠精神 #dalao
在粒子加速器领域,绕不开一个软件:TRACEWIN,这是美国人开发的。追踪粒子在电磁场下的轨迹。
是怎么开发这个软件的呢?他们没有立项。没有想突破封锁。 只是某天3,4个行业内都不出名的研究员看到了一个amazing的粒子路径追踪公式,
在维持原有工作的情况下!历时数年,根据同行们的贡献协助,
仅仅因为一时兴起,美国就多了一个能垄断一个小行业的软件。
把人当人,而不是资源!人会创造,资源不会!
我们对标的软件应该叫TripleWin 😎
嗯,“到各个985高校抽20个数学教授,20个物理学教授。再来几个程序员”
FxZhihu / Fixup Zhihu
为什么日本工匠精神在软件开发上没有体现? - @匿名用户 | FxZhihu
[图片] Rui Ueyama 日本程序员。前谷歌雇员。专长编译相关技术。链接器mold 的作者。 [图片] 同是他还有一个可自举,可编译sqlite 等真实项目的玩具编译器 8cc ,实现短小精悍。而且为了方便他人学习,他的每个commit 都经过精心设计。读者可以从头看到这个编译器的演进过程。 [图片] 另外他还打算出一本关于编译原理的新书。具体链接可以见 通知订阅 反正我是挺期待的
https://news.ycombinator.com/from?site=maskray.me #dalao #ce LLVM
https://maskray.me/blog/2024-12-31-summary
👇歺厅玻玏,油㲺喷咀。粘土动画,门靣设计。仃车标识,诚伩优恵。
“聚众” 取乑, 乑形似背靠背, 仅在眾里出现
“羽翼” 羽異, 異声旁
https://maskray.me/blog/2024-12-31-summary
👇歺厅玻玏,油㲺喷咀。粘土动画,门靣设计。仃车标识,诚伩优恵。
“聚众” 取乑, 乑形似背靠背, 仅在眾里出现
“羽翼” 羽異, 異声旁
MaskRay
2024年总结
一如既往,主要在工具链领域耕耘。 Blogging I have been busy creating posts, authoring a total of 31 blog posts (including this one). 7 posts resonated on Hacker News, garnering over 50 points. (https://news.ycombinato
yihong0618 和朋友们的频道:
#selected #py #ce
https://youtu.be/ltCNkcl9HGI
duangsuse:
省流: py 3.11~3.13 有三种解释
1. {.0: iter, k:0}
2. {k:0}
3. segfault
1. 里的'.0'是k=new cellvar(0) ,相当于创建闭包的def所占用的 this.0
也可能是因为[for]被优化外提为语句,语法糖展开创建的yield状态机
2. 是最好理解的,因为 for (local k) in 0 最先执行
3. 可能是因为(upval k) 被提前回收造成的。在js里 var k 的声明提前早被禁止了,py也有 nonlocal k 才能左值捕获的要求,不过 for x in .. 不涉及scope也是一种八股文题目
哦。。 1. 里的 .0==old_k
这正是3. 的for (local k) in 不新建scope造成的,因为 [for] 没有for的这个问题……
3. 报错是因为[for] inline 优化的bug,k 其实是 nonlocal,但[for]写入时改变了这层包装没更新meta,然后反射就挂了
还真是…… 屎,全用filterMap栏目答不就没这些破事
还真别说,用lambda建模scope可以实现 伪递归、同签名调用优化、在无需跳转时inline 等等,根本不会有py贪便宜学excel造成的 [for] for 语义差异和bug
#selected #py #ce
https://youtu.be/ltCNkcl9HGI
duangsuse:
省流: py 3.11~3.13 有三种解释
1. {.0: iter, k:0}
2. {k:0}
3. segfault
1. 里的'.0'是k=new cellvar(0) ,相当于创建闭包的def所占用的 this.0
也可能是因为[for]被优化外提为语句,语法糖展开创建的yield状态机
2. 是最好理解的,因为 for (local k) in 0 最先执行
3. 可能是因为(upval k) 被提前回收造成的。在js里 var k 的声明提前早被禁止了,py也有 nonlocal k 才能左值捕获的要求,不过 for x in .. 不涉及scope也是一种八股文题目
哦。。 1. 里的 .0==old_k
这正是3. 的for (local k) in 不新建scope造成的,因为 [for] 没有for的这个问题……
3. 报错是因为[for] inline 优化的bug,k 其实是 nonlocal,但[for]写入时改变了这层包装没更新meta,然后反射就挂了
还真是…… 屎,全用filterMap栏目答不就没这些破事
还真别说,用lambda建模scope可以实现 伪递归、同签名调用优化、在无需跳转时inline 等等,根本不会有py贪便宜学excel造成的 [for] for 语义差异和bug
YouTube
这五行Python程序的结果,谁都不可能猜得到
短短的五行程序都猜不到结果?这里面可有不少学问。从PEP 709到PEP 667,多少个改动凑到一起才触发了这个特殊的案例?