最近所想和所做

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                    好久没写博客了,原因之一是最近习惯了用evernote去记录自己所想和所看的,另外一个原因是CSDN关闭了live writer的写blog的功能后,就没多大兴趣在csdn的网页编辑框里面写东西了,一来崩溃了写的东西全部丢了,一来手机上不好写。CSDN的标题是“全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台”,但我觉得现在的CSDN并不是面向于IT人员了,对于IT人员,特别是程序员而言,界面美不美观,操作好不好倒是其次,但功能没有确是不行的。CSDN的改版关闭了blog的很多功能,使得我也没多大兴趣在CSDN上写Blog了。
    最近在空闲时间在做一个东西:给C++添加元数据,添加反射功能,添加函数的聚合能力。
    大致做法是:用clang分析c++头文件,然后通过AST生成元数据。clang的AST里面信息非常丰富,例如结构体的大小,类的信息,函数参数信息,函数的调用方式(例如__cdecl,__stdcall)等都可以获取到,这样根据c++生成MetaData时,不需要像COM那样还需要写IDL文件。
    反射功能其实就是对元数据进行访问,然后根据元数据调整堆栈,然后call就可以了。
    函数的聚合能力主要是想实现一种类似于windows的HOOK机制,可以将多个函数附加在一个函数上,当这个函数被调用,附加在这个函数上的函数也会被调用。一个容易理解的例子就是:我们通常会写一些函数,但有时候会添加log功能,需要在这个函数调用之前或之后打log,这时一种简便的方法就是将log函数聚合到这个函数上。函数的聚合能力与Aspect编程里面的Aspect比较像。我做函数的聚合能力主要是想用于以下几个地方:1. 插件 2. Webkit中渲染时动态添加特效 3. 回调(callback)。对我而言,回调其实是函数聚合的一种特例,只不过被聚合的函数是一个空函数而已。例如js里面常见onclick callback,其实可以将onclick看作节点对于c++实现里面的一个方法,只不个这个方法是一个空实现,注册回调时,其实就是将一些函数聚合到onclick这个方法上,当onclick被调用时,注册的回调函数也会被调用。
    还有一个基本准则是:不改变现有的C++语法,不改变编译器实现,而是用外部工具做处理(也就是预编译),例如用Clang分析头文件然后生成元信息,用专门的lib或dll工具分析lib或dll,以便在链接时做一些事情。这样做的好处是可以最大程度地使得现有的C++程序可以利用这些特性。当然利用这些特性时,调用方式上也会做一些变动,例如原来是foo.bar(1234)会改成wrapper<foo>.bar(1234)。这里面的wrapper其实是一个模板,是在生成元数据时一块生成的。这个在Elastos里面叫做夹壁墙代码,我觉得这是一个比较直观的形容。
    这个东西的另外一个好处是:外部工具做处理(也就是预处理)可以对很多地方做优化,例如反射时函数堆栈调整,参数转换。因为这个信息在编译时就已经确定,运行时也不会改变,就没必要去动态获取了。这样做一个坏处是程序的大小会稍微变大,但现在的内存一般够用,所以用空间换取时间是值得的。
    上面说道参数转换,其实我是想实现一种通用些的参数转换方式,例如js调用C++或者java调用C++时,C++有元信息只是做到了第一步,还需要对参数做转换。所谓参数转换,其实就是将一种类型A转换为另外一种类型B,我们可以写一个函数A2B(a, b)去实现这个转换。类型A是可以转换为其他几种类型的,但一般是可以转换为一个基本类型(例如int,char×)或者几种基本类型的集合,而某种基本类型是可以转换为类型B的。因此类型转换可以被看成图论里面的路径,效率最高的转换其实就是最短路径。这样我们只需要写类型A和基本类型的转换函数,那么类型A和其他类型的转换是可以通过预处理生成的。每条路径的cost是通过预处理时得到的:也就是将这个函数编译进一个测试函数,然后运行,得出的运行时间就是cost。           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/tduycc/article/details/84195686