duangsuse::Echo
我太阳,才发现这个别人能发博文的东西,我竟然连标题和名字都没起,试运行成功贴上就pass了…… 这不是在线教SICP(程序的构造和解释)吗🤪 #lisp #fp #zhihu #statement 放到以前我绝对搞大新闻一样,就像之前仿造(但也没成功)Lice 时专门建了项目画了logo,然后文档拼缀别人的,最后模板代码写完不会了 🙈 但说起来,元编程最后也不过是编程。你了解编程语言,很好,但语言只是载体,美丽的、各种各样的应用才是我们的最终目的。 你能写编译器,很好,但也不过是完成了文本模式和树遍历,加上一些理论。…
#cs #statement #recommend 过去杂谈
计算机科学的讨论,好像是只收集晨露的人和饮水的「普通人」
晨露的每一粒、每个专有名词都是原理的侧面。就像对企鹅与鸵鸟,强化了鸟的一部分,却存在相似的周期和度量衡;对于算法,则存在相同的输入输出和差异化中间数据
水的每一滴,都有相似和不同的形态成分。相似成分像晨露,人却无法将其分离,甚至不觉得可能分离
喜欢晨露的人、喜欢水的人,都搞不清微小迷茫或庞大 都只是水而已;厉害或老土,只是附加的情感
水不喝,就可以有很多形态花样;而对真正想研究「水」的人,掌握交换互通的技术,晨露和饮水有何区别、原理或巨型有多难,都是无谓的问题。
编程的核心不是思想,而是语言。思想不独立于语言而存在,一切抽象归于文本,却应是最反映本质的文本。语言能做帮大家少走弯路的设计,这比折磨人和计算机的面向报错编程更值得、更有力
知道原理的缘由、知道堆砌的模式,是『编程语言』人对自己必须的要求。 空有原理或疲于堆砌都不能帮助程序走向更好,优美的「语义」才是最初目的。
有露水到饮用水的「语言和工具」,才能看清各种层级的目的,把美与高效融为一体
在刚才的故事里,饮用和观赏外的统一目的并不存在。 语言并不是目的,但能为其目的优化;语言不是唯一的,有选面向人或计算机
编程就是一件既要识大体,又应顾小局的事。 爱好语言,未必要做编译器。 PLT是种方法,方法是比程序乃至框架要「大」的方案
说到底语言并不存在,存在的只有编码集和思想。语言就是编码的哲学,只是它简化于人的思想和目的
与其说我是研究语言,不如说是在概况一类问题。这没什么了不起,因为问题间相同点很少——但这就是我爱做的,即便领域有这样或那样的约定俗成。
编程是把领域联起来,变成一个大领域晾出去;好的程序直观反映其处理数据的结构;程序集处理、代码亦数据;特例不比规律特殊 ,这些都是对某类代码段的优评,但只是「语言」内一瞥。解决问题的方法有很多,转化代码、描述程序、发布代码,有没有计算机意义的问题,都是语言能优化的问题。 好比算法于计算机。语言即智慧
明明能用 rect(xywh)x step 30 这样的定义,为什么要 ctx.draw_(x,y,..) 呢?明明是用来处理绘制,叫ctx干什么? 代码里类似的地方数不胜数,
只因为懂了OOP和物理VecN,懂内存与复制、重绘队列于线协程,才知道自己代码的责任和hack,因此知道最适合的命名;语言人,不死板
作为最大的领悟应该是做过一切后能发现其「简单」,就像物理式一样 I=UR,E=mc^2 ,创新和表象千变万化、运行期数据不可捉摸,不可或缺之原理恒常如新。这简单却不能是自我陶醉,对知识放下傲气,用踏实的语言描述优美的事物概念
所以像编程语言那样的东西我又不先弄了,转而弄些绘制和数处的应用、从 Stream RWer到二进制值绑定的框架等等
计算机科学的讨论,好像是只收集晨露的人和饮水的「普通人」
晨露的每一粒、每个专有名词都是原理的侧面。就像对企鹅与鸵鸟,强化了鸟的一部分,却存在相似的周期和度量衡;对于算法,则存在相同的输入输出和差异化中间数据
水的每一滴,都有相似和不同的形态成分。相似成分像晨露,人却无法将其分离,甚至不觉得可能分离
喜欢晨露的人、喜欢水的人,都搞不清微小迷茫或庞大 都只是水而已;厉害或老土,只是附加的情感
水不喝,就可以有很多形态花样;而对真正想研究「水」的人,掌握交换互通的技术,晨露和饮水有何区别、原理或巨型有多难,都是无谓的问题。
编程的核心不是思想,而是语言。思想不独立于语言而存在,一切抽象归于文本,却应是最反映本质的文本。语言能做帮大家少走弯路的设计,这比折磨人和计算机的面向报错编程更值得、更有力
知道原理的缘由、知道堆砌的模式,是『编程语言』人对自己必须的要求。 空有原理或疲于堆砌都不能帮助程序走向更好,优美的「语义」才是最初目的。
有露水到饮用水的「语言和工具」,才能看清各种层级的目的,把美与高效融为一体
在刚才的故事里,饮用和观赏外的统一目的并不存在。 语言并不是目的,但能为其目的优化;语言不是唯一的,有选面向人或计算机
编程就是一件既要识大体,又应顾小局的事。 爱好语言,未必要做编译器。 PLT是种方法,方法是比程序乃至框架要「大」的方案
说到底语言并不存在,存在的只有编码集和思想。语言就是编码的哲学,只是它简化于人的思想和目的
与其说我是研究语言,不如说是在概况一类问题。这没什么了不起,因为问题间相同点很少——但这就是我爱做的,即便领域有这样或那样的约定俗成。
编程是把领域联起来,变成一个大领域晾出去;好的程序直观反映其处理数据的结构;程序集处理、代码亦数据;特例不比规律特殊 ,这些都是对某类代码段的优评,但只是「语言」内一瞥。解决问题的方法有很多,转化代码、描述程序、发布代码,有没有计算机意义的问题,都是语言能优化的问题。 好比算法于计算机。语言即智慧
明明能用 rect(xywh)x step 30 这样的定义,为什么要 ctx.draw_(x,y,..) 呢?明明是用来处理绘制,叫ctx干什么? 代码里类似的地方数不胜数,
只因为懂了OOP和物理VecN,懂内存与复制、重绘队列于线协程,才知道自己代码的责任和hack,因此知道最适合的命名;语言人,不死板
作为最大的领悟应该是做过一切后能发现其「简单」,就像物理式一样 I=UR,E=mc^2 ,创新和表象千变万化、运行期数据不可捉摸,不可或缺之原理恒常如新。这简单却不能是自我陶醉,对知识放下傲气,用踏实的语言描述优美的事物概念
所以像编程语言那样的东西我又不先弄了,转而弄些绘制和数处的应用、从 Stream RWer到二进制值绑定的框架等等
#cs #dev #statement 我终于理解Dijkstra说的,“编程不关于计算机”。自古以来,编程不是件事务,而是思考的习惯;简明不是卖点,它是生存的条件
这些人写的都是什么跟什么?base64和base32 竟然不是一个pkg? C语言1.4k行共写了1个算法 0次复用?各种编码模式能ctrlcv出4个函数来?
拿Rust“设计模式”了一堆struct{} 然后说自己只支持base64,也没有并行优化??
base64 不是很简单的3:4字节重组算法吗? 它..算是问题吗
它..值得花几千行、400次提交,修补3年吗
这就是所谓的“静态编译优于脚本”?在我眼里,这些人以脚本级的思路,用等编译的态度编程,不算自讨苦吃?😨
写这种代码一开始就用js,py好了,移植个什么劲。哦,原来是编译器垃圾,不能“肉眼可见”地把py译为C
所以要那种编程语言干嘛?制造隔阂、另起炉灶、妨碍计算机的进步?
几星期的操心,只是为解决5行级的传输编码?这能叫编程吗?
如果大部分是这种代码的话,大家都别编程算了,交给AI吧,人家思路至少是清晰、条理有序的。比en-wiki质量还高 🌚🌝 再比中文百度
所以我讨厌看重编程和代码排版。 人应该做的,是享受科技革命后的日常生活、轻易地高质量创作,不是以 重复先人的成就及错误为荣🙄
这些人写的都是什么跟什么?base64和base32 竟然不是一个pkg? C语言1.4k行共写了1个算法 0次复用?各种编码模式能ctrlcv出4个函数来?
拿Rust“设计模式”了一堆struct{} 然后说自己只支持base64,也没有并行优化??
base64 不是很简单的3:4字节重组算法吗? 它..算是问题吗
它..值得花几千行、400次提交,修补3年吗
这就是所谓的“静态编译优于脚本”?在我眼里,这些人以脚本级的思路,用等编译的态度编程,不算自讨苦吃?😨
写这种代码一开始就用js,py好了,移植个什么劲。哦,原来是编译器垃圾,不能“肉眼可见”地把py译为C
所以要那种编程语言干嘛?制造隔阂、另起炉灶、妨碍计算机的进步?
几星期的操心,只是为解决5行级的传输编码?这能叫编程吗?
如果大部分是这种代码的话,大家都别编程算了,交给AI吧,人家思路至少是清晰、条理有序的。比en-wiki质量还高 🌚🌝 再比中文百度
所以我讨厌看重编程和代码排版。 人应该做的,是享受科技革命后的日常生活、轻易地高质量创作,不是以 重复先人的成就及错误为荣🙄
https://t.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年之前还都是学术界居于主导地位。…
duangsuse::Echo
#statement 人能活几十年,计算机界也有70岁, 对技术怎么就这么短视😒。 过几年再看看,会觉得吵的是毫无收获,你新写的东西真的是唯一的吗?世界上甚至有人实用过。也有无数种视角你没做过,这并不能作为什么谈资 自己做CS,科学,搞得跟信教了一样,主动提AI,主动骂狗shit ,你拿什么荔枝? #ce #reveng #sb https://t.me/Javaer/895034 哦,刚刚想起来 跳转Block 的层级也是可以做混淆的,但这是 #security 领域的东西,一般人只会用加壳脱壳扫内…
#ai 这个多少有点恶心了, #PL 人都这么抽象的吗?🙄
#zhihu 回答大意:
GPT不能说是编程语言,因为套路和准确度都不够统一 也没有生态和社区,但可以帮更多人更简短的完成任务,所以说是最好也没有错。
《程序员的心理疾病》
☝️文中提到的礼貌问题GPT全解决了,所以帮人用好它的人,就成了被口诛笔伐的“蠢货”
唉,不论是非只论善恶,也难怪中国的PL人都要出去留学呢
没点素质,真润出去的PL大佬哪会在意这点细节?多是一群连parser和IR都没构造过、OOP和trait多态都不知咋实现的愤青,看到自己模式匹配和English terminology 的技能被AI“抢”了,就破防到跨领域无论据追捕
#cs 的学生成千上万,但文化程度这么低的也是第二次见 👏😓
#zhihu 回答大意:
GPT不能说是编程语言,因为套路和准确度都不够统一 也没有生态和社区,但可以帮更多人更简短的完成任务,所以说是最好也没有错。
《程序员的心理疾病》
☝️文中提到的礼貌问题GPT全解决了,所以帮人用好它的人,就成了被口诛笔伐的“蠢货”
唉,不论是非只论善恶,也难怪中国的PL人都要出去留学呢
没点素质,真润出去的PL大佬哪会在意这点细节?多是一群连parser和IR都没构造过、OOP和trait多态都不知咋实现的愤青,看到自己模式匹配和English terminology 的技能被AI“抢”了,就破防到跨领域无论据追捕
#cs 的学生成千上万,但文化程度这么低的也是第二次见 👏😓
#algorithm #cpp https://www.youtube.com/watch?v=jgQjes7MgTM
#cs https://www.youtube.com/watch?v=SzJ46YA_RaA
#py django 长视频 freeCodeCamp.org
#cs https://www.youtube.com/watch?v=SzJ46YA_RaA
#py django 长视频 freeCodeCamp.org
YouTube
The BEST Coding Interview Roadmap in 2023 (free)
🚀 https://neetcode.io/ - Checkout the FREE roadmap!
Checkout my second Channel: @NeetCodeIO
🧑💼 LinkedIn: https://www.linkedin.com/in/navdeep-singh-3aaa14161/
🥷 Discord: https://discord.gg/ddjKRXPqtk
🐦 Twitter: https://twitter.com/neetcode1
📷 Instagram:…
Checkout my second Channel: @NeetCodeIO
🧑💼 LinkedIn: https://www.linkedin.com/in/navdeep-singh-3aaa14161/
🥷 Discord: https://discord.gg/ddjKRXPqtk
🐦 Twitter: https://twitter.com/neetcode1
📷 Instagram:…
#cs #math markov 链 BV1xa4y1w7aT https://www.youtube.com/watch?v=i3AkTO9HLXo&t=1s
#algorithm 随机游走 、稳态矩阵
#algorithm 随机游走 、稳态矩阵
有时也觉得 #CS 界 #IT 界挺魔幻的,60~70年前的矩阵和协程,Lisp式的DSL,到今天还有框架 😔
当然,numpy和 Go func, kotlin.coro, Rust derive宏 已经远不是Fortran,OpenResty那些东西可比拟的
但究其根本,我觉得今天CS+IT的佼佼者,不少lib依然在犯70年前它们先辈的错误。
对于协程这个特性,究竟是DOM,node那样不靠package就包揽一切,还是像Go那样作为噱头,Erlang那样基于Actor,Kt这样与时俱进 最为正统呢?
拿js模拟过……
可能直到AI广泛辅助编程,这些问题都不会有答案
但我清楚AI无法完成写法的形式化,只能从根源上,让用户指定开多大线程池完成多少种Task,这些术语的差异才会伴随着“优化选项”消失
C 那种argc+argvec 的list,也只是术语的差异吗? 恐怕除了样板代码的多少,这些语言作为“app设计器”,也有根本不同
——
在我看来,无论是工业界最流行的语言,还是协程的理论讨论, 都是没有取得统一模型的
换句话说,每个语言有它的优点
这不是一件好事。 一个没有取得共识的工具,会阻碍人的泛化思考,会把编程当成一件机械的编码任务
其实明白编程和数学里的泛用性,又如何呢? 有人为此挣到钱,有人选择删了公开博客, 但到最后随着时代向前,知识也没啥可稀奇的吧
即便如此,我选择把编程视为一种乐趣和创作。
我不需要言辞间的“朴素” “平凡不难”,对于创作者来说,灵感,才能成为汗水里掷地有声的内核。 🕊
当然,numpy和 Go func, kotlin.coro, Rust derive宏 已经远不是Fortran,OpenResty那些东西可比拟的
但究其根本,我觉得今天CS+IT的佼佼者,不少lib依然在犯70年前它们先辈的错误。
对于协程这个特性,究竟是DOM,node那样不靠package就包揽一切,还是像Go那样作为噱头,Erlang那样基于Actor,Kt这样与时俱进 最为正统呢?
拿js模拟过……
总之就当自动传f1(回调),f局部变量在回调中, 所以调用f()能选择何时何处执行我想,大家都被限制在自己的编程生态圈,不去思考这些差异背后的进步方向,可能才是编程之道吧……
Kt的结构化并发确实很有意思,但要谈可用性,JS的手动撤销和自动Dispatch更实在
btw一句,我讲的比较详细,但我对CPS不感兴趣,
主要是为了把回调链表与callstack、OS线程 做类比。确实编译原理和OS是分不开
本群人均素质挺高啊,都知道coroutine是靠CPS
但我更喜欢不纯粹的理论
有时我觉得这些也没必要说的, 我反复思考有好几年了,但它们终究是三句话讲完的程度呢
因为JS最开始是 func*(){} yield Promise,没有async
async是因为JS不能直接把函续交给then,要先yield给执行器(对等协程vs上下级协程)
Ruby的call/cc, C的"setjmp" 就是对等协程,它们符合CPS的刻板印象但不好用…… 总之异步编程反人类
异步编程也可以很美好的,比如 Reactive 就遥遥领先于Java,PHP这一套。 Nextjs应该是新时代的服务端语言
可能直到AI广泛辅助编程,这些问题都不会有答案
但我清楚AI无法完成写法的形式化,只能从根源上,让用户指定开多大线程池完成多少种Task,这些术语的差异才会伴随着“优化选项”消失
C 那种argc+argvec 的list,也只是术语的差异吗? 恐怕除了样板代码的多少,这些语言作为“app设计器”,也有根本不同
——
在我看来,无论是工业界最流行的语言,还是协程的理论讨论, 都是没有取得统一模型的
换句话说,每个语言有它的优点
这不是一件好事。 一个没有取得共识的工具,会阻碍人的泛化思考,会把编程当成一件机械的编码任务
其实明白编程和数学里的泛用性,又如何呢? 有人为此挣到钱,有人选择删了公开博客, 但到最后随着时代向前,知识也没啥可稀奇的吧
即便如此,我选择把编程视为一种乐趣和创作。
我不需要言辞间的“朴素” “平凡不难”,对于创作者来说,灵感,才能成为汗水里掷地有声的内核。 🕊
Telegram
duangsuse::Echo
#FP #math 的一些 #statement
#tool html bookmarklet data:text/html;utf8,<body ContentEditable>
—10÷3=3…1
被大佬建议写成 =(3)3+1 即m=qn+r (r<q)形式的“短除法” ,理由是...没交换律
“理论家布尔巴基有个笑话: 1+2当然是2加1,因为整数对加法构成阿贝尔群”
当然,纠结这些除和除以工程意义不大
ax+i=b; x,i=divmod(b,a) 的可变量元组数学里可是没有。函数只是“…
#tool html bookmarklet data:text/html;utf8,<body ContentEditable>
—10÷3=3…1
被大佬建议写成 =(3)3+1 即m=qn+r (r<q)形式的“短除法” ,理由是...没交换律
“理论家布尔巴基有个笑话: 1+2当然是2加1,因为整数对加法构成阿贝尔群”
当然,纠结这些除和除以工程意义不大
ax+i=b; x,i=divmod(b,a) 的可变量元组数学里可是没有。函数只是“…
duangsuse::Echo
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
*编程的赞歌就是(组合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