- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- TCP/IP協议分析_7.doc
- TCR型SVC電弧炉补偿设计.doc
- TD-SCDMA網规网优标准化试题(初级).doc
- TD-SCDMA設备验收规范_RNS_V1.0(试验网外场测试分册).doc
- TDC3000順序控制应用案例.doc
- TC實战项目测试过程.doc
- TDSCDMA的無线网络优化(毕业论文).docx
- TDT1013-2000土地開发整理项目验收规程.doc
- TDS液壓系统原理及故障分析.doc
- TD_SCDMA網络测试仪IP数据采集卡的研制.doc
- 商场物业管理顾客体验方案.docx
- 信息管理学 模拟习题集 学习资料.doc
- 兽药行业:创新与趋势-全面解析兽药市场的技术革新与行业动态.pptx
- 《肖邦《第四叙事曲Op·52》曲谱版本比较分析》.docx
- 《金融科技对商业银行小微企业信贷业务的影响研究》.docx
- 《开郁化痰降气方治疗非糜烂性胃食管反流病(气郁痰阻证)的临床观察》.docx
- 《外周血嗜酸性粒细胞对AECOPD疗效预测和预后评估的价值》.docx
- 《除风益损汤对兔眼钝挫伤急性期的干预作用》.docx
- 《融合骨骼信息的抢救行为评价系统的设计与实现》.docx
- 《电针预处理抑制NEK7-NLRP3炎症小体减轻脓毒症急性肺损伤大鼠肺部损伤的作用研究》.docx
文档评论(0)