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
duangsuse::Echo
使用效果(跗注: 这是拉黑我一个 #Bilibili up 主的视频封面 🌚
#ce 反正建议大家不要信这些东西。 学了总是会有用的,但绝对不如直接吃元编程/代码生成 香 🌝
数学也能帮到编程啊,但还不如直接用 Desmos.com 🌑

这个『晓舟杂谈』的视频就是营销号,我稍微提了一句不尊重从业者,就给我拉黑了 🌝

然后他的视频呢,就是找了点old-school 的教材和一个 C++ Tree-IR 编译-执行 的视频(作者=CPP语言律师),对流程毫无了解 就敢说1天学会,真的服气。
有种你做独立App开发者、做科普 我倒敬你知名,也别来瞎碰瓷啊 🙉

我只是在扯淡(但是扯淡的人也不会教你 Racket外语言的实现.. 😂 应该说确实有些做法需要点明,但照LLVM的实例来就可以了。
在编译器前端最 native 的就是文本按 文件级,函数级, 代码块转化变量-计算图,而不是翻译到另外的高级语言文本、或解释执行啥的(那样就是计算器, 带if-部分求值也能做)
其实许多编译器的routine 用元编程也可,比如 C# 的隐式转换 implicit operator int(byte b) => widen(b) 貌似就能实现数值拓宽
如果不懂元编程(如new=按type分配&call-init,实例虚方法查找),编译器无非就是把文本做个解析,检查下类型,安排下地址,这些根本没啥有趣的,递归到常量变量节点就成

>许多框架实现的糖写法根本不需要创建新语言或者XML,问题是对只会模仿的人连 printf() 是 va_arg 和 cout« 不是“语法”都不知道,连语言=思维的实质都没分清谈何革命呢; 也幸好他们不懂编译原理,不然就会有一大堆莫名其妙的“Groovy”或DSL出现 :\

不清楚『语言』和编程语言是一回事,就会像Perl和bash 一样,“内部”功能越加越多,用户越来越少;我可不会以学写那样的语言为荣☹️,应该让机器生成那种东西
或者像Groovy ,IDEA支持烂得离谱,唯一的REPL试用也要被jshell取代了。 歧义和零散功能太多就造成这种问题

编译器真的没啥,只是一些人前缀解析器都不会写(准确的说是把显式状态机当必需品了,因此整个框架会过大),如果我2行写完S-expr 的解析, 那附带深先树重写,乃至名字解析、闭包啥的只是对内存结构的理解问题 :\ #js #code
let a="(1 (2 3))".split(/([()\s])/g).filter(s=>s!=''),i=0;
层=(tk)=>{for(let x,q;x=a[i];){i++;if(x==')')break;q=x=='('; tk.push(q?(x=[]):x); if(q)层(x)} }
层(树根=t0=[])

解析要么词条(跳空白的字符)流动,要么程序执行位置被动,肯定是程序驱动前缀消耗,而不是输入驱动程序执行; 让状态号决定行为 能凑整一些代码,让调用栈决定 能复用更多,设计和使用 compiler compiler (ANTLR,YaCC啦)就是行为艺术,可惜对外行它被传为必须,所以大家入门都难(而Lua等的手写递归下降又太长, 简单说就是科普阵地被魔法师占领了,反倒是成熟的更易学)。
现在有 coroutine 了,也能写数据驱动程序的解析器 且无需CGen,不过毫无意义。按文本读取的用途 哪怕用线程都不需要协程

当年我看PEG.js 左递归简直烧脑要死啊,还能优化?现在用着简写版逆波兰重排,我才懒得问左边递归为啥是循环,以及 Mul=Add|Add'*'Add 到底想干啥(js split&map版我也写过😂)。——为啥非得照你的做法抄啊
又长又烂还不方便,算个四则起一大堆名字,好像最后不是对应 eval(a{op}b) 一样
——为啥非得照你的API啊
按用途文档;元编程重构不好看吗?
功能弱鸡概念还那么多,滚吧😋


不能指望 #zhihuyinwang.org , ice1000.org 的大佬教这些东西,其实他们自己也只写过一两次,不管现在是做到什么程度,未必能拓宽过往的认知

越聪明的人反而越难科普,因为他们每件事都是一遍过。演讲是带稿还是脱稿好呢? 嘛,从未演讲过的人与稿子无缘,也没机会检查自己的语言问题,这是与思路多清晰关系不大的。(他们都算前辈.动机不多猜)
#ce 看到new WebAudio 就想到Blender 着色器节点,节点能不能表达为 f(a,f1(b)) 的形式呢?即便无关执行序(新旧值问题),不行,因为f1的输出可复制多个

SSA单赋值正是带执行序的 Node图,只是节点图里变量都是靠连接表示,而程序变量是有时序指代的,例如 a=1; if(q)a=a+1; f(a) 间这个a就是运行时不同,在LLIR里 c=phi a,a1 就是把来自不同前BB(if,.)的计算整合,当然你也可以直接store&load,就没有SSA问题了;IR form也就是为便于优化,现在在函头alloca mem2reg就成。
https://www.zhihu.com/question/24992774

SSA本来是无关内存变量或寄存器的,全交给分配器解决是放哪。(Lua)是干脆算计算栈最大深度,然后编号位置 不复用,而FFI(native函数)的 CDEF 调用约定和 struct{} 靠指针 load/store 就行了,也是SSA Value;现在的做法或许更好,C语言里for(;;)也不止能迭代1变量,变量值源自哪个{} 就是很难区分的

#statement 我觉得好的程序应该是一个模板,填哪里的哪种数据都能用的那样,仿佛只是数据的脚本和限制,话筒交给程序输入
程序不该内嵌有太多常量
我开始用对照输入输出的方法设计程序、以其他的领域方法和视角思考API能描述的问题
心中的程序没必要符合什么不得了的约束
因为代码也是数据啊