Thrift之代码生成器Compiler原理及源码详细解析..doc

Thrift之代码生成器Compiler原理及源码详细解析..doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Thrift之代码生成器Compiler原理及源码详细解析.

最近忙着研究GlusterFS,本来周末打算写几篇博客的,但是由于调试GlusterFS的一些新增功能就用了整整的一天,还有一天就陪老婆大人逛街去了!今晚浏览完微博发现时间还早就来博客一篇,本篇博客内容主要是前一段时间研究的Thrift的代码生成器的源码详细分析,没有具体分析语法解析,因为是工具字段生成的代码,人是没有办法阅读的----到处都是跳转表!由于Thrift支持N多种语言,但是生成代码原理都差不多,我主要分析了C++相关代码生成。关于Thrift的使用及原理、代码网上基本上都有,代码的注释很好,基本上都是英文注释。下面就是我之前分析写的文档,希望对学习使用代码生成代码的爱好者有一定帮助。 Thrift之代码生成器Compiler原理及源码详细解析1 这个功能是一个单独的工具程序,它会独立的生成一个可执行文件。 第一节?类关系图 本节主要展示了这个部分的整体类图,然后对这个类图做了简要的说明,有了这个类图让我在阅读这个部分源代码时不会找不到方向,让我更加清楚这个部分中的类是怎样协同工作的,类关系图如下所示: ? 注意:实线代表继承关系;而虚线代表依赖关系。 由类关系图可以看出Compiler 它们的共同基类都是t_generator类,但是面向对象的语言并不是直接从它继承,而是又把面向对象的共同特性提取出来用一个类来实现,这个类就是t_oop_generator,其他面向对象语言的生成类都是从这个类继承。总基类的实现是依赖于左边的t_program类,这个类表示一个程序代码需要的所有特征和要素。左边部分就是解决一个程序需要拥有的数据类型和函数,根据接口定义语言(IDL)解析和生成相应的数据和函数等。左边部分就显示thrift定义的中间语言(IDL)能够支持的数据类型,t_type类是所有数据类型类的基类。 第二节?程序流程图 这个部分整体的流程图如下图所示: ? 以上流程图简要的说明了Compilerlinux上的工具flex自动生成c语言程序,解析中间定义语言的时候直接调用yyparse函数即可。 另一部分重点内容就是生成各种程序语言代码的功能,每一种语言用一个类来生成,后面不会详细分析每一种语言的生成实现的代码,主要分析三种主流语言(C++、java、python)。 第三节?源代码详细分析 1??Main.cc 这个文件是这个部分的入口文件,因为它定义mainmain函数以外还定义了其它很多的全局函数和变量,其中比较重要的函数有:parse解析函数、generate生成代码的函数;比较重要的全局变量主要是:g_program程序类的变量和各种数据类型的类的变量。 (1main函数 首先定义一个用于存放源代码输出路径的字符串变量:std::string?out_path;然后生成一个基于时间的字符串保存到一个全局变量中,如下代码实现: 1 time_t now = time(NULL); 2 3 g_time_str = ctime(now); ? 然后检查参数个数是否满足最低要求,不满足就调用使用说明函数,这个函数就是简单打印这个工具的使用说明,然后退出程序。代码如下: 1 if (argc 2) { 2 3 usage(); 4 5 } ? 下面定义一个用于保存需要生成语言的代表字符串的向量数组:vectorstring?generator_strings;后面就根据参数的个数解析参数,然后根据参数的内容执行相应的功能。解析参数的时候用到了一个函数strtokNULL就继续下一个被分割下来的字符串,如果没有了就返回NULL。上面说了根据参数内容执行相应的功能:主要包括查看版本信息、是否打印详细的执行过程信息、警告级别等,最主要的还是解析需要生产哪些语言的参数,然后将能够代表需要生产某种语言的字符串保存到generator_strings字符串数组当中。 下面的代码开始根据参数得到中间语言定义的文件,然后根据文件名生成一个t_program 1 if (saferealpath(argv[i], rp) == NULL) { 2 3 failure(Could not open input file with realpath: %s, argv[i]); 4 5 } 6 7 string input_file(rp); 8 9 t_program* program = new t_program(input_file); 10 11 if (out_path.size()) { 12 13 program-set_out_path(out_path); 14 15 } 16 17 string input_filename = arg

文档评论(0)

sa1fs5g1xc1I + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档