duangsuse::Echo
583 subscribers
4.12K photos
118 videos
579 files
6.13K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
#ML #media #DNN 人工神经网络 视频动画插值
橘橘橘子汁 & 🍊
https://zhuanlan.zhihu.com/p/707493606 虽然确实是可行的但是这是什么玩意😇
#您知道吗#cs #dnn #wasm 计科长青树一瞥:递归下降、梯度下降 (1)

*编程的赞歌就是(组合compose)的赞歌,软工的伟大就是(复用reuse)的伟大!*
复用就是腾讯嘛!但,什么是组合?流行乐队是组合?

在《几何原本》里有这样一条公理:“整体”是由部分构造堆上去的。 无论物理的原子分子、化学的单质单剂、生物的组织系统、儿童编程的二分查找,甚至您编写的{语句}(算式) 定义表(),总少不了分治算法的影子;而与递归对应得最直观的树,除了带kwarg的视图描述树XML、文件夹管理和正则匹配的前/后缀树Trie、OIer的必修KMP图(: Trie+FailGoto),更有梗图里常被实现为SortedSetOrMap的红黑树RBTree(: AVL) --作为按int KHash()预分组K-V查找的一种补充。

不过,今天咱调戏的不是高深的算法或数理化,而是程序员的自我修养:表达式、解释、编译、类型检查和推理。
🤓不少语法看似是ES6,Kotlin,Java20+,C++里高深莫测的新特性,其实,只是因为它们的设计混乱带来的大误会! 软件工程界的基岩,原本很简单?

- 计算器🧮("1+1"):数据值 是不支持forif或(vars)=>函数/JSON文档的解释器,最简单的理解是 x=1; eval[+,1]。对内存的利用方式过于单一,就像🔑C语言的.o .so 只是靠LD互调用的object{static{}},或者VB一代难加函数的"红石命令",毫无扩展性还要另写头文件 自然被淘汰
- 解释📠("expr(1+1)"):值或行为 程序员唯一必须调用的接口。tree-walk(递归遍历算式)非解释器的专利、VM不是编译器的秘技。对x86汇编的执行也叫硬件解释,旧安卓通过转译arm汇编.so库到x86做兼容,就像IKVM对“JVM汇编”仍能再次转译到IL
- 编译 就是解释器的缓存📑:记住自顶向下遍历时的套路,直接自底向上组装值(lisp转RPN),很像二叉树vs(堆,一种树状数组)!这除了要重新实现重复/判定/ret&&break跳转的流控,还可将RPN栈指令集优化为局部读写-按类型复用。
要求手动编译的语言均属慢速原型,会标注或推理出类型签名,从而🔑以限界实现提速和多态(重写重载、记住变量名的指针,即担保栈size恒定)。 ANTLR等“状态机”编译器的输出便是自底向上,正好颠倒于主动read()流到js栈的PEG,不过,它们其实是慢的虚拟机。

类型的本质是简洁的🔑常量「黑盒测试」,它与表达式同构,执行方法也相同!
- 类型检查 就是只解释 def f(x:T):R 里":右侧"的算式,以插入 (f T R) 这样的SQL行。x编译后是arg[0]:一个空悬指针,但T.fns却是有血有肉的"反射"常量。把每个 x:T=1 换为 x=T!
x+x 的语意为查询 (+ T T)、1+"" 查找函数签名 (+ int str)、 u.id (.id User Ret?) 便能检查误拼写和空指针
不难发现,这些都是效仿numpy重载个运算符就能实现的,并不需要学编译原理写解析器!这也是 hamcrest.org http Test库断言组合器的原理

泛型class/fn/var和赋值 的推理规则是一样的。
例如把 <TR> as([Box, T], T=>R):R 与 as(Box(1), str) 深度重合时,新建两个TypeVar(void),它们会在 Int==T, R==str 的检查时被向上赋值,从而填充[Box,int]里的类型T、as调用里的R,并照顾到 i32->i64等转换及子类规则
同为编译期遍历,你还可以思考下 let[x0,x1]=a 如何被实现的,以及在运行期是否能模拟?

学习元编程有何好处🌝?因为可以从根源理解yield/await、纯函数、模式匹配、模板宏等“新”特性,凭什么能简化旧实践!
- 闭包和协程closure&coro 便是编译比解释好实现的两个特性。 compiler 通过{let;}的动态作用域(原型链..) 区分符号的LEGB来源(Local Enclosed外层局部 Global Builtin常量),从而能把 (x=>y=>x+y) 化为对象值 f_y=((x,y)=>).bind(x);Lua能查出跳转到表达式的指针,y=yield x 便能在return前,把函数的局部栈保存回 g.next/pr.then
- 模板constexpr 让闭包关于常量创建,如何? ((x,y)=>x+y).bind(1) 就是 1+y, ((k,s)=>s[read+k]() ).bind("Int") 就是readInt,*[map(print,0~9)] 就是循环展开,这些就是预处理的价值!反射和const只是对eval(并缓存)之「二段求值」的阉割
- 副作用effects #FP bros异常抨击print这种“无法被值存储的、有非局部干扰的赋值”并推广他们的赎罪券:Monad……这却是因为他们并不懂「定义式编程」!
React signal(x=0) (1) 就是一个不纯的赋值,但,它导致的x=1却能被广播为参数、被保存和复现!🔑这还能叫“状态变更泄露难题”么?
并且,它还偷走了"FP独有的模式匹配"。对赋值副作用的录制,更是bash,vimrc类格式经久不衰的原因

说准点,这些都是 #SQL 的老大Prolog所原创并推崇的-:变量作为值,逻辑式编程!
*整体大于局部;与另一结构重合的结构,之中的值相等 --几何原本*

在通读本文时,也可以参考以下实例:
coroutine=由用户run()的线程
*调用栈是数组,协程栈是回调构成的链表
诸分治排序可视化
手动babel脱糖一个async函数
知乎:分词解析vs解释
实现一个HTTP DSL
Var(signalObj)如何跨越进程和网络:句柄、登录cookie、JWT
def(): return this 是何方神圣?
在解释时缓存代码的Tk GUI
Trie们和字典输入法的实现
关于class Visitor {se(e:Add_AB), se(e:Int)} 和Eval/Dump接口的融合
实现文本流递归下降、四则运算逆波兰、 JSON.org
Prolog binop #parser
计科原神:认识WASM/LLVM IR和JIT, webVM.io