瞄了一眼 c# 的博客。发现我也想过这个 source generator,
各种语言的宏,和 c++ 的 template 本质上都是在编译期生成代码。c 宏太过于简单,c++ template 则非常强大图灵完备。这两个办法都没有利用好语言本身的语法,而是生造了另外一套语法进去。而且 c++ 的 template<> 只拥有部分被描述代码的信息,qt 不得不搞了 moc 预编译分析 c++ 代码。无论怎么搞,C++ 的 template 都是半残,这条路走死了。
lisp 以及各种函数式编程语言的宏运行在语法解析阶段,好处是灵活容易学习,坏处是太过于灵活. 每个人的 DSL 各不一样,很难看懂。
正常人都想要可阅读性更好的编译期代码生成,最折衷的办法是把编译器分析出来的语法树交给用户元代码再处理。而这个 c# 的 source generator 就是新时代更强的 template<>,更好的 lisp macro. 能够根据编译期已经分析过的语法来生成新的代码。又没有产生新的语法。
这个思路不是新的,我记得 nim 也是类似的办法。
【 在 keygen (失落灵魂之囚) 的大作中提到: 】
: 所以 C# 9.0 搞了个 Source Generator 出来
: 后面大家发力一起把运行时反射搞成编译时反射,后面框架就抛弃运行时反射了,又改善性能,又轻松 aot
: 不过现在反射也是一样可以 aot 的,就是要自己一边搞一边测试看是不是又把要用的东西给编没了,编没了就到描述文件里面加一条,然后再搞一次。碰到直接 emit il 的库直接吐血三升。
: ...................
--
修改:hgoldfish FROM 60.188.58.*
FROM 60.188.58.*