= 用“解释器(Interpreter)”模拟“JIT 编译器”
在 C/C++ 环境,因为没有虚拟机(VM),没有内置的 JIT 编译器,程序一旦跑起来,不可能凭空生成一段全新的 C 代码并让 CPU 去执行(除非你外挂庞大的 LLVM JIT)。
所以,“模板驱动的动态导入”程序本质是一个“障眼法”:
- 表面看在生成结构体(Struct)? 实际是在堆内存里算出了几个数字(Offset 偏移量)。
- 表面看在生成执行代码? 实际转成sql执行,利用了sql的动态执行能力。
原程序的 fill_cols 函数,本质上是解释器(Interpreter)。它拿着这套“规则数据”,配合着底层的 switch-case 和指针位移,去“解释执行”文本切分。它不生成 C 代码,而是通过解析配置,拼出让数据库驱动(OCI/ODBC)的 SQL 语句和参数绑定内存块。
这一段无比的正确,是你自己想的还是AI说的?
我做了几十年,事后才总结出这个说法。
这件事的开端是在1995年,一个大项目(至少对我来说),要解决C/S模式的数据库访问效率问题,ODBC太慢了,达不到要求。一哥们想到3层C/S,就是中间加一个应用服务器,客户端负责收集业务数据,提交给应用服务器,进行复杂的业务算法,频繁的访问数据库,最终结果返回客户端。这样极高的提高了糟糕的低速网络的业务性能。
遇到的第一个拦路虎就是各种struct在CS间传送问题,两边可能不是一种机器,也不是一个操作系统和编译器。要用struct处理业务,也用它访问数据库,还要用它传送数据。
那哥们做了第一个版本,承担了服务器的开发工作,技术鉴定时问他,这工作最重要最难的技术是什么?答曰,打包拆包。那时没有序列化反序列化的说法。当时就是把任意struct序列化反序列化为类似CSV格式,就两个库程序,不参加应用模块的编译,客户端服务器都用,模板手写,一边一份。就这两个程序,开创了编程新天地。
到自动生成模板和虚结构,是10年以后的事了。
那时SQL语句的生成是这样的:
sprintf(stmt,"select %s from %s where %s",mkfield(template),tabname,where);
如果修改数据结构,就修改struct和模板,重新编译,这个程序基本不用改。
这时只能算是半泛化了,模板还得自己写。终于一天,一个人不干了,数据库里啥都有为啥让我写模板!搁现在找AI问一下数据库表结构怎么读,那时就得找个大侠弄一下了。没费太大事,就搞成由数据库产生结构和模板的东西,把这个东西include到合适的文件里就行,应用程序只管使用,还是显式使用结构和模板,数据结构改了,重新生成一下,编译一下。这已经基本达到hibernate的水准,但是随时而来的数据还是解决不了,这就需要全泛化的程序,例子就是sqlldr,来啥都行。于是就有了DAU,Data Access Unit。把结构模板数据库句柄,绑定树,游标集成,实现了自动绑定,完全泛化。SdbcDao只是一个DAU的壳。
【 在 DoorWay 的大作中提到: 】
: 我的感觉 JIT,类似C#在运行生成类型(生成代码、编译)的能力,更符合你干的活。本质上是解析配置文件,生成 sql 语句(障眼法,无法生成c代码).
: 本质上就是一个受限于 C 语言静态特性的JIT 引擎。
: == C# / Java 的运行时类型生成 (JIT Emit)
: ...................
--
修改:ylh1969 FROM 221.221.54.*
FROM 221.221.54.*