当前位置: 首页 > news >正文

浅谈营销型网站建设的市场费用高校网站建设方案

浅谈营销型网站建设的市场费用,高校网站建设方案,wordpress 增加页面,动态wordpress动态主题背景随着业务的迅速发展#xff0c;业务代码逻辑的复杂度增加。QA测试的质量对于产品上线后的稳定性更加重要。一般QA测试的工作流程分为两大项#xff1a;自动化测试和人工测试。这两种测试后都需要得到代码覆盖率。自动化测试的覆盖率#xff0c;在双端都有比较成熟的方案…背景随着业务的迅速发展业务代码逻辑的复杂度增加。QA测试的质量对于产品上线后的稳定性更加重要。一般QA测试的工作流程分为两大项自动化测试和人工测试。这两种测试后都需要得到代码覆盖率。自动化测试的覆盖率在双端都有比较成熟的方案。​本文着重介绍人工测试过程中怎么得到对应的代码覆盖率。涉及到的技术主要是代码染色。以下会先介绍整体的工作流程再对涉及到的技术一一阐述。染色流程流程图中涉及到了双端的关键节点以及技术点。我们重点介绍编译阶段。· 编译阶段生成染色包 (对IR文件插桩)需要在编译中增加编译选项编译后会为每个可执行文件生成对应的 .gcno文件。· 运行阶段生成二进制覆盖率文件。在测试代码中调用覆盖率分发函数会生成对应的 .gcda文件。· 解析阶段将二进制覆盖率文件可视化。 编译阶段在上文可以看出编译阶段最核心的操作是对IR文件进行插桩。什么是IR文件插桩逻辑是什么我们往下看。语言处理系统一个完整的语言处理系统中从源程序到可执行的机器代码如下图所示历经几个重要模块。而我们上文提到的IR文件是编译器模块中的产物插桩处理也是在这个模块中进行。这里重点讨论下编译器。编译器说起编译器我们了解到的传统编译器架构分为前端、优化器和后端。传统编译器的劣势是前端和后端没有完全分离耦合在了一起因而如果要支持一门新的语言或硬件平台需要做大量的工作。一种更加灵活适应性更好的编译器套件应运而生——LLVM.LLVM官网http://www.aosabook.org/en/llvm.htmlLLVM是一个开源的模块化和可重用的编译器和工具链技术的集合或者说是一个编译器套件。可以使用LLVM来编译KotlinRubyPythonHaskellJavaDPHPPureLua和许多其他语言。LLVM核心库还提供一个优化器对流行的CPU做代码生成支持。LLVM同时支持AOT预先编译和JIT即时编译。2012年LLVM获得美国计算机协会ACM的软件系统大奖和UNIXWWWTCP/IPTexJAVA等齐名。LLVM和传统编译器最大的不同点在于前端输入的任何语言在经过编译器前端处理后生成的中间码都是IR格式的。接下来看下LLVM架构下的巨大优势iOSMacOS平台的编译器。iOSMacOS平台编译器iOS、MacOS平台开发用的IDE:Xcode。在 Xcode 5版本前使用的是GCC编译器在 Xcode 5中将GCC彻底抛弃替换为LLVM 。LLVM包含了编译器前端、优化器和编译器后端三大模块。其中Swift除了在编译器前端和Objective-C稍有不同其他模块都是相同的。如下图所示能看出LLVM的优势对于一门新的编程语言只需要提供对应的编译前端生成IR。就可以完成整个新语言的处理。聊过了IR文件在整个语言处理过程中的位置下面我们看下IR文件生成逻辑以及插桩相关的逻辑。这不得不提到Clang。ClangClang是LLVM的子项目是C、C和Objective-C的编译器。Clang在整个Objective-C编译过程中扮演了编译器前端的角色同时也参与到了Swift编译过程中的Objective-C API映射阶段。 Clang的特点是编译速度快模块化代码简单易懂诊断信息可读性强占用内存小以及容易扩展和重用等。Clang的主要功能是输出代码对应的抽象语法树AST针对用户发生的编译错误准确地给出建议并将代码编译成LLVM IR。以Xcode为例Clang编译Objective-C代码的速度是Xcode 5版本前使用的GCC的3倍其生成的AST所耗用掉的内存仅仅是GCC的五分之一左右。关于iOS项目可以使用对应的命令获取本文不作详细介绍。 关于编译器前端的主要工作项感兴趣的读者阅读《编译原理》——龙书。介绍完了IR的“生成器”。接下来我们详细介绍IR文件。LLVM IRLLVM Intermediate Representation。LLVM的中间代码是编译器前端的输出和编译器后端的输入。是连接编译器前端与LLVM后端的一个桥梁。通常常见的文件格式为ll 和bt 。做过iOS开发的读者应该了解bitcode。bt就是编译器开启bitcode后的一种中间代码格式。IR提供了独立于任何特定机器架构的源语因此它是LLVM优化和进行代码生成的关键也是LLVM有别于其他编译器的最大特点。LLVM的核心功能都是围绕IR建立的。通常中间代码的表示形式分为语法树syntax tree、三地址指令序列。为了更好的了解IR文件。这里介绍下三地址指令。三地址指令也可以称为三地址代码。之所以被称为三地址指令是源于它的指令形式x y op z 其中op是一个二目运算符y和z是运算分量的地址x是运算结果的存放地址。三地址指令最多只执行一个运算通常是计算比较或者分支跳转运算。 三地址代码拆分了多运算符算术表达式以及控制流语句的嵌套结构所以适用于目标代码的生成和优化。 //像 xy*z 这样的源代码被翻译成三地址指令序列 t1y*z t2xt1//源码do i i 1; while(a[i] 10); 被翻译成如下的三地址指令 i i 1 t1 a[i] if t1 10 goto 6 其中t1t2是编译器产生的临时名字。但是程序运行过程中每个模块并不是完全独立的。存在着模块间的跳转。这些被翻译出的三地址指令又被组合成另一种便于理解的形式——BB块。基本块基本块(Basic Block)是满足下列条件的最大的连续三地址指令序列· 控制流只能从基本块中的第一个指令进入该块。 · 除了基本块的最后一个指令控制流在离开基本块之前不会停机或者跳转。· 只要基本块中的第一个指令被执行那么基本块中的所有指令都会得到执行其中中间代码指令序列生成BB块的算法如下 · 确定中间代码序列中哪些指令是首指令中间代码的第一个三地址指令是一个首指令。任意一个条件或无条件转移指令之后的目标指令是一个首指令。紧跟在一个条件或无条件转移指令之后的指令是一个首指令。· 每个首指令对应的基本块包括了从它自己开始直到下一个首指令不含或者中间代码的结尾指令之间的所有指令。 举例i 1 //第一个三地址指令所以作为首指令 j 1 //第11行跳转语句的目标指令。所以作为首指令 t1 10*i t2 t1j t3 8*t2 t4 t3-88 a[t4] 0.0 j j1 if j10 goto (3) //本身作为跳转指令所以是首指令 i i1 if i10 goto (2) //本身作为跳转指令所以是首指令 i 1 t5 i – 1 //第17行跳转语句的目标指令。所以是首指令 t6 88*t5 a[t6] 1.0 i i1 if i10 goto (13)//本身作为跳转指令所以是首指令//把一个10x10的矩阵设置成单位矩阵中的中间代码 for(i1;i10;i){for(j1;j10;j){a[i,j] 0.0;} } for(i1;i10;i){a[i,j] 1.0; }对应被划分的BB块在了解了BB块之后。我们距离怎么对IR文件进行插桩的真相已经越来越近了下面我们来看下最后一个最重要的环节。流图当将一个中间代码程序划分成为基本块之后我们用一个流图来表示它们之间的控制流。流图(flow graph)的结点就是这些基本块。流图就是通常的图它可以用任何适合表示图的数据结构来表示。从基本块B到基本块C之间有一条边当且仅当基本块C的第一个指令紧跟在B的最后一个指令之后执行。存在这样一条边的原因有两种· 有一个从B的结尾跳转到C的开头的条件或无条件跳转语句。· 按照原来的三地址语句序列中的顺序C紧跟在B之后且B的结尾不存在无条件跳转语句。我们说B是C的前驱(predecessor), 而C是B的一个后继(successor)。通常会增加两个分部称为入口entry和出口exit的结点。它们不和任何可执行的中间指令对应。从入口到流图的第一个可执行结点有一条边edges。从任何包含了可能是程序的最后执行指令的基本块到出口有一条边。如果程序的最后指令不是一个无条件转移指令那么包含了程序的最后一条指令的基本块是出口结点的一个前驱。但任何包含了跳转到程序之外的跳转指令的基本块也是出口结点的前驱。其中B0-B7是BB块。E0-E7是边edges 插桩逻辑覆盖率计数指令的插入会进行两次循环外层循环遍历编译单元中的函数内层循环遍历函数的基本块。函数遍历用来向gcno文件中写入函数位置信息。一个函数中基本块的插桩方法如下· 统计所有BB的后继数n创建和后继数大小相同的数组ctr[n]。 · 以后继数编号为序号将执行次数依次记录在 ctr[i] 位置对于多后继情况根据条件判断插入。根据生成流图的规则可以很容易得到桩点位置[]处就是插入的桩点序号。 关于工程配置可以参考GCOV的官网https://gcc.gnu.org/onlinedocs/gcc/Gcov.html下面简单介绍下gcovgcnogcda这三个gcc家族的关键成员。GCOVGCOV是一个GNU的本地覆盖测试工具, 伴随GCC发布配合GCC共同实现对C或者C文件的语句覆盖和分支覆盖测试。是一个命令行方式的控制台程序。需要工具链的支持。GCNO利用Clang分别生成源文件的AST和IR文件对比发现AST中不存在计数指令而IR中存在用来记录执行次数的代码。覆盖率映射关系生成源码是LLVM的一个Pass用来向IR中插入计数代码并生成.gcno文件关联计数指令和源文件。上图右侧。即为gcno的可视化格式。本质上gcno是二进制内容。需要借助gcov工具(gcov -dump xxx.gcno)将文件转换为这种可视的格式。其中每个字段的含义· 函数所在文件的绝对路径如上图红框所示。· Block 0-7 代表BB文件的编号。· Counter为插桩后生成的存储执行次数的字段。· Source Edges是前继。· Destination是后继。· Lines是指令在代码文件中行数。GCDAgcda是由加了-fprofile-arcs编译参数的编译后的文件运行所产生的它包含了弧跳变的次数和其他的概要信息。借助gcov工具可以查看gcda文件的大致内容gcda文件已经是一个包括了函数执行情况的文件。剩余的工作就是将执行情况更加可视化和源码进行匹配。了解了三个gc的重要成员。借助一些前端工具我们就可以得到一份详细的覆盖率报告了。关于前端工具大家可以自行搜索。最后附上覆盖率的一个报告片段技术扩展了解上述基础知识后我们更加容易理解LLVM中的架构及各个模块的功能。我们可以在插桩过程中修改原有的插桩逻辑。我们可以编写XCode编译器插件。总之借助LLVM的源码及我们了解到的知识。在一个语言的任意处理阶段我们都可以对其进行定制甚至我们可以创造一个自己的专属语言。源码参考https://github.com/llvm-mirror/llvm/blob/release_70/lib/Transforms/Instrumentation/GCOVProfiling.cpphttps://llvm.org/doxygen/group__LLVMCCoreValueBasicBlock.html#ga444a4024b92a990e9ab311c336e74633https://gcc.gnu.org/onlinedocs/gcc/Gcov.html
http://www.zqtcl.cn/news/387030/

相关文章:

  • 网站开发设置网页端口wordpress 知识库
  • 网站建设的方法有四种开发一款新闻app需要多少钱
  • 成都网站建站公司2023年防疫新政策
  • 17做网店一样的网站十大互联网培训机构
  • 中企网络科技建站施工企业oa办公系统
  • 成都网站推广公司排名淘宝商家网站建设
  • 平台网站建设报价网站建设企业蛋糕
  • 上海创意网站建设电子商务毕业设计网站建设
  • 如何让网站打不开 解析wordpress pdf检索
  • 网站建设大作业感想台州企业网站模板建站
  • 淄博网站的优化上海营销网站建站公司
  • 长春网站建设硕成传媒长春电商网站建设哪家好
  • 舟山建设管理网站手表交易网站
  • 如何电话推销客户做网站沉浸式展厅搭建商
  • 重庆网站建设开发e福州官方网站
  • 网站怎么可以被收录广州网站建设全包
  • 网站备案期间如何采购需求网站建设
  • 东莞seo网站优化运营南通网站排名外包
  • 新能源网站建设唐山专业网站建设公司
  • 石基网站建设临沂网站优化哪家好
  • 用node.js可以做网站吗上海做网站 公司有哪些
  • 淄博网站建设详细策划一个域名解析多个网站
  • 无锡网站建设首选捷搜网站优化大赛
  • 部门网站建设多少钱百度关键词挖掘查询工具
  • 做游戏直播那个网站asp做网站教程
  • 网站建设小程序开发情侣头像制作素材图片
  • spoc课程网站建设专业彩票网站建设
  • 创建网站需要注意什么忻州市城乡建设管理局网站
  • 万江做网站wordpress 动静
  • 北京自助模板建站遂宁企业网络推广方案