duangsuse::Echo
412 subscribers
3.85K photos
105 videos
574 files
5.15K links
duangsuse技术相干订阅
这是 @duangsuse 与技术有关的发布频道
duangsuse 的另外有 throws 闲杂频道
@dsuset
转载频道 @dsusep
duangsuse 有coding,github,gitlab帐号和bilibili帐号

极小可能会有批评zf的消息 如有不适可以退出

suse的小站:https://piped.stream
ps 另有别名 popf.rip
ʕ•̀ω•́ʔ✧ 🐶🍎🏠生死🐜
(>ω<)岂因祸福避趋之 一鿕
Download Telegram
#life #dev duangsuse 落实 10:30 准时睡觉『政策』。 🐱

考虑到健康原因(不让自己的努力白费),每晚 10:30(h:m) 必须立即睡觉

== duangsuse::Echo 参考 #Telegram hashtags

duangsuse::Echo 常年利用 hastags 标记消息所含知识领域,并且,这也会为未来 Echo 频道进行简单准确的数据统计带来可能(不然,我也有其他手段,比如 NLP、统计预测)

以下是新的标签实例(不区分大小写、不能保证消息只含这些标签):

== 消息平台部分
#Telegram #zhihu #Github #so #Coolapk #book #wiki

== 注释部分
#life #China #School #Statement #lib #recommended #low #fix
#project #blog #share #Learn #paper
#dev #tech #art #meetUp #conference
#Moha #Haha
#gnu
#Microsoft #Mozilla #WeChat #QQ #Weibo #Tencent #Baidu #Ali #Qihoo
#tools #code

== 程序设计语言部分
#Kotlin #Java #JavaScript #JavaScript_ES6 #TypeScript
#Rust #Go #Swift #Dart #Crystal
#Ruby #Python #Perl #Tcl #Lua #PHP
#C #D #Cplusplus #CSharp #Objc
#Pascal #Fortran #Delphi #Ada #Basic #VisualBasic
#Scheme #Haskell #Scala #Clojure
#TeX #Graphviz
#Octave #Matlab
#Shell
(有些写出来是为了鼓励我去写,其实不一定真的写过)

== 软件平台部分
#Android #Windows #Win32 #MacOS #Java #Java_JVM #CLR #Qt #GTK #Tk #WxWidgets
#CSS #XML #JSON #KDE #Postgres #dotnet

== 软件技术领域部分

#backend #sysadmin #frontend #sysadmin_net

#OI #CS #IT #Informatics

#stat #ann #ann_dnn #machl
#math #math_linearAlgebra #math_discrete
#se #se_dia #se_ci #se_ee
#comm #net #www #web #http #html #mail #wireless
#circuit #embedded #os #db #db_relAlgebra #SQL
#bin #encoding #encoding_audio #encoding_image #encoding_video #encoding_text
#hpc #parallelism #distributed #simd #gpgpu #crypto
#pl #pl_plt #ce_vee #ce #ce_optimize #fp_monad #fp_proof #fp #oop #oop_arch #sp #parser
#algorithm #struct #lists #maps #sets
#security #security_lowlevel
#signalProc #nlp #phonetic
#cg #cg_dip #cg_3d #cg_2d #cg_lowlevel
#gui #gui_animation #gui_layouts #cli #visualization
#Go #Qt #Cplusplus 🤔 让我想到了 int main(int argc, char **argv) { QApplication app(argc, argv); return app.exec(); }
#Go #async 🤔 不知道此例有什么意义,原子性操作?
唉,不知道是不是 snake_case 更适合人类,我中国人可能没有什么感觉

但是世界上其实也有不少出于好的目的做的事,最后却事与愿违的例子,但愿不会有这样

不过我是真觉得 #Kotlin 的 fun 比 #Rust 的 fn, #Go 的 func, #Python 的 def 好看,总感觉就这一词的选择,不谈 val/var 的对仗,已高下立判。

或许是因为那个“乐趣”真的很吸引眼球吧,对子程序的利用,本身就是非常有意思的事情
https://github.com/wkgcass/Latte-lang#%E4%B8%AD%E6%96%87%E7%89%88-chinese-version-readme #recommend #plt #jvm Latte ,记住了. Java6 的class编译实现

zig,red; scala.js RustPython moonscript nelua jsweet java2script
https://zserge.com/posts/jvm/ 这个是 #go #bin 实现读classfile常量池&栈执行
https://github.com/axkr/symja_android_library #math #android #tool 符号代数/绘图工具
https://github.com/JacksonTian/stone-lang/tree/master/src/chap12 适合小白读物配套(确信
https://github.com/enso-org/enso 图形编程,可视化, enso.org
https://vlang.io/ 类Go C目标语言,默认no-mut,支持内部序列化. 作者貌似做了C的双向翻译
https://github.com/lclang/LittleCat 用法不错,支持闭包
https://github.com/tern-lang/tern 含游戏示例. 文档太细节
livescript.net 含IDE插件示例
https://github.com/tonysparks/leola 支持协程, namespace: 是啥鬼

https://github.com/cqfn/eo 奇奇怪怪的XML语言.. jolie-lang.org 奇奇怪怪的 Swagger??


https://www.zhihu.com/question/27831730 RednaxelaFX大在这里手撕 #java 编译与反编译器,🐮
你R大永远是你R大🤪

https://www.zhihu.com/question/39400401 还是R大谈CLR-JVM=真泛型&in-out,delegate,P/Invoke&unsigned&Valtype,unsafe和受检溢出,无classloader 树 ,其他人就知道tailrec和jit,gc这些还说混了

不愧是R大 真不是盖的
一己之力拉高 #zhihu 编译原理水平
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的方法也有点怪,是用 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)   
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)
得到 (S0 a (S1 [b [S2 bb bc] ] [c [S3 cc cb] ] ) )

在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转移都没会还要整理这个 🤪
#Rust 的 struct/impl-fn 设计非常好(好像还能作union.. ) ,也支持闭包
std 有一些 box,ref,Vec,Map 的对C++ 习惯也很直接,而且有unsafe 能取代C
值类型&mut和(i8,i8)、流控匹配, FFI 和 Emscripten 也很好 (尽管不如Kt重视语义性
总之和 #Go 这种民科语言是完全不同的,mivik/kamet,rin 都是以rs 为原型(尽管不支持匹配解构)

但是设置环境是要花时间的,如果你的程序就那样,用什么语言其实没必要。 Rust 的分配期推导越来越好了,语言工具也完善内部。基本可以直接从其他语言翻译,但是什么语言其实都一样的..
https://t.me/kotlin_cn/25220 #kotlin #go 面向job/task计算称 #concurrent ,和完全平行(如滤镜图片)不同
bench=repeat(10_000);o=Any()
c=Channel<Any>()
runBlocking {withContext(Default){
launch{bench{ c.send(o) }}
launch{bench{ c.receive() }}
}}
//c.close(); launch.join()

Channel 和调度器 Dispatcher ,在浏览器有 worker.postMessage 和 onmessage

var wg sync.WaitGroup;wg.Add(2)
var token struct{}
c:=make(chan struct{})
go func(){
defer wg.Done()
bench{c<-token}
}
go func(){
defer wg.Done()
bench{<-c}
}
wg.Wait()
defer WaitGroup 在凑齐2项时传输(循环看错位)?其实是用计数看是否有job存活,都Done掉退出时再继续主线程

runBlocking{//limitedParallelism,newFixedThreadPool,single..
val produce=produce(Default){
bench{launch{send(1)}}
}
var n=0
produce.consumeEach{n+=it}
}

也有把 Channel 异步序列变得友好的做法

线程切换 >> 函数调用(没有线程切换下的协程切换) > batch之后的函数调用

>分别对应于代码实现的Dispatchers.Default + 无buffer (如果你写对了的话), coroutineScope + 无buffer , coroutineScope + buffer
Exectors singleThread asCoroutineDispatcher
>wait是指blocking的wait么?没看到channel的代码,但是可以断言里面不可能线程停住等待
>不, 是指协程底层在无可调度时的wait;能看到一半是无锁链表,一半是LockSupport.park
之前和他的差这么多,估计是被调度到一个线程上去了,不知道Default里边的策略是什么样的
#learn #ts #kt 子类型 vs 组合, in/out参数
https://t.me/dsuses/5194

总之,trait类型的交集 还是需要in/out,这不是子类型带来的麻烦。
a=append(a,x) 与 copy(a,src) 类型上是一样的,前者也并不能“把a修正为更窄接口”。 Go必须把list+=单项 写出来, 因为缺少型变

func main() {
var src []interface{} = []any{1, 2, 3, 4, 5}
var dst []int = make([]int, len(src))
copy(src,dst) //错:没有共同接口

func copy[T any](dst []T, src []T) {
for i := range dst {
dst[i] = src[i]
}
}

更多关于 #rust #go #plt 的原理
https://t.me/kotlin_cn/74484

https://rustmagazine.github.io/rust_magazine_2021/chapter_4/ant_trait.html#向上转型upcast #recommend

https://rustmagazine.github.io/rust_magazine_2021/chapter_10/lisp-in-rust.html