CN118092936A - 一种生成可视化数据流的方法及系统 - Google Patents

一种生成可视化数据流的方法及系统 Download PDF

Info

Publication number
CN118092936A
CN118092936A CN202410247680.0A CN202410247680A CN118092936A CN 118092936 A CN118092936 A CN 118092936A CN 202410247680 A CN202410247680 A CN 202410247680A CN 118092936 A CN118092936 A CN 118092936A
Authority
CN
China
Prior art keywords
data stream
generating
intermediate representation
pass
visual data
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202410247680.0A
Other languages
English (en)
Inventor
刘敏
姜凯
赵鑫鑫
薛海军
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shandong Inspur Science Research Institute Co Ltd
Original Assignee
Shandong Inspur Science Research Institute Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shandong Inspur Science Research Institute Co Ltd filed Critical Shandong Inspur Science Research Institute Co Ltd
Priority to CN202410247680.0A priority Critical patent/CN118092936A/zh
Publication of CN118092936A publication Critical patent/CN118092936A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种生成可视化数据流的方法及系统,属于计算机软件技术领域,该方法基于LLVM编译器框架,通过添加自定义Pass,对中间表示进行遍历;并通过插桩的方式在中间表示中添加对function信息及监视遍历的记录,并在实际运行中将数据流可视化。本发明支持多种编程语言,支持各target的特性,不需要依赖其他任何IDE存在,具有可用性好,跨平台,与具体编程语言无关的优点;有助于提升工程师对源码尤其是数据流复杂的源码的梳理效率,可以大大提高工程师对软件工程的维护能力。

Description

一种生成可视化数据流的方法及系统
技术领域
本发明涉及计算机软件技术领域,具体地说是一种生成可视化数据流的方法及系统。
背景技术
随着软件行业在全球的快速发展,代码复杂度越来越高,尤其随着应用程序的不断维护升级扩展,代码的规模也越来越大,不仅新加入的员工难以梳理清楚代码,即便一些老员工对于一些不断升级的代码也会比较陌生。
目前存在的一些代码分析的工具具有各种不足,例如支持的语言比较少、需要依赖各种IDE、不支持跨平台等问题。
发明内容
本发明的技术任务是针对以上不足之处,提供一种生成可视化数据流的方法及系统,支持多种编程语言,支持各target的特性,不需要依赖其他任何IDE存在,具有可用性好,跨平台,与具体编程语言无关的优点;有助于提升工程师对源码尤其是数据流复杂的源码的梳理效率,可以大大提高工程师对软件工程的维护能力。
本发明解决其技术问题所采用的技术方案是:
一种生成可视化数据流的方法,基于LLVM编译器框架,通过添加自定义Pass,对中间表示进行遍历;并通过插桩的方式在中间表示中添加对function信息及监视遍历的记录,并在实际运行中将数据流可视化。
LLVM是一个开源的编译器框架,它以“Low Level Virtual Machine”的缩写命名,尽管名称中包含了“虚拟机”一词,但LLVM不仅仅是一个虚拟机,而是一个综合的编译器工具链。LLVM提供了一套通用的工具和库,用于开发编译器、优化器、代码生成器等。
本方法提出的基于LLVM编译器生成可视化数据流的方法,基于LLVM编译器来进行二次开发,也具有支持多种编程语言,支持各target的特性,并且因为是在中间表示上进行插桩操作,因此是与后端无关的,同时不需要依赖其他任何IDE存在,可用性极好。
进一步的,该方法的实现包括以下步骤:
1)在LLVM编译器中添加自定义PASS,对输入的中间表示(IR)进行处理,通过插桩的方式在中间表示中写入生成可视化数据流的逻辑;
2)用户通过命令行的方式运行LLVM编译器,指定需要,运行自定义PASS生成可视化数据流;
3)LLVM编译器对源码进行编译,通过词法分析、语法分析、语义分析并生成中间表示(IR);
4)自定义PASS对中间表示进行插桩,对中间表示中的每个function进行处理,并生成经过PASS处理后的中间表示(IR);
5)LLVM编译器继续对中间表示(IR)进行编译,通过生成SelectionDAG,并通过指令选择、指令调度、寄存器分配生成二进制程序,然后链接生成可执行程序;
6)用户执行可执行程序,生成数据流可视化图。
进一步的,所述用户通过命令行的方式运行LLVM编译器,支持通过命令行对指定的变量进行监视,包括全局变量及局部变量;并可以同时支持多个需要监视的变量。
进一步的,所述自定义PASS对中间表示进行插桩,如果有指定需要监视的变量,则同样对此变量进行插桩处理。
进一步的,所述LLVM编译器包括前端部分、优化器部分、后端部分,
前端部分,用于对代码进行词法分析,语法分析,语义分析检查源代码是否存在错误,然后构建抽象语法树;
优化器部分,用于对与机器无关的中间表示进行优化,改善代码的运行时间,例如对控制语句做优化,去除一些无用的冗余代码;
后端部分,用于将代码映射到目标指令集,生成机器指令,同时进行机器相关的代码优化;
在优化器部分添加自定义PASS,自定义PASS继承自FunctionPass,用于遍历中间表示中的function,采集其主要信息,包括其函数名,参数,返回值;并在中间表示中添加对这些信息的输出,同时输出用户指定的变量的信息,最终在执行可执行程序后,生成数据流可视化图。
进一步的,所述数据流可视化图直观的展示程序中各函数之间的调用关系、各个函数的执行时间、监视的变量值的变化。
进一步的,所述前端部分,对于不同的语言使用不同的FrontEnd。
本发明还要求保护一种生成可视化数据流的系统,该系统基于LLVM编译器框架,通过添加自定义Pass,对中间表示进行遍历;并通过插桩的方式在中间表示中添加对function信息及监视遍历的记录,并在实际运行中将数据流可视化;
该系统实现上述的生成可视化数据流的方法。
进一步,所述LLVM编译器框架包括FrontEnd、Optimizer、BackEnd,
FrontEnd,用于对代码进行词法分析,语法分析,语义分析检查源代码是否存在错误,然后构建抽象语法树;
Optimizer,用于对与机器无关的中间表示进行优化,改善代码的运行时间,例如对控制语句做优化,去除一些无用的冗余代码;
BackEnd,用于将代码映射到目标指令集,生成机器指令,同时进行机器相关的代码优化;
在Optimizer中添加自定义PASS,自定义PASS继承自FunctionPass,用于遍历中间表示中的function,采集其主要信息,包括其函数名,参数,返回值;并在中间表示中添加对这些信息的输出,同时输出用户指定的变量的信息,最终在执行可执行程序后,生成数据流可视化图。
本发明还要求保护一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法。
本发明的一种生成可视化数据流的方法及系统与现有技术相比,具有以下
有益效果:
目前已有的对代码进行分析的方法中,基本上都是局限于各个操作系统,或者支持的语言较少,或者需要依赖于IDE以插件的形式存在,对用户不够友好。LLVM编译器本身就以解耦性好在业界广为使用,通过添加FrontEnd可以支持各种语言,通过添加BackEnd可以支持各种后端,包括riscv、arm、x86等target。本发明基于LLVM编译器来进行二次开发,也具有支持多种编程语言,支持各target的特性,并且因为是在中间表示上进行插桩操作,因此是与后端无关的,同时本发明不需要依赖其他任何IDE存在,可用性极好。
附图说明
图1是本发明一个实施例提供的生成可视化数据流的方法实现流程图;
图2是本发明一个实施例提供的LLVM架构设计示图;
图3是本发明一个实施例提供的实例效果图。
具体实施方式
下面结合具体实施例对本发明作进一步说明。
本发明实施例提供一种生成可视化数据流的方法,基于LLVM编译器框架,通过添加自定义Pass,对中间表示进行遍历;并通过插桩的方式在中间表示中添加对function信息及监视遍历的记录,并在实际运行中将数据流可视化。
LLVM是一个开源的编译器框架,它以“Low Level Virtual Machine”的缩写命名,尽管名称中包含了“虚拟机”一词,但LLVM不仅仅是一个虚拟机,而是一个综合的编译器工具链。LLVM提供了一套通用的工具和库,用于开发编译器、优化器、代码生成器等。
如图1所示,该方法的实现包括以下步骤:
1、在LLVM编译器中添加自定义PASS,对输入的中间表示(IR)进行处理,通过插桩的方式在中间表示中写入生成可视化数据流的逻辑。
2、用户通过命令行的方式运行LLVM编译器,指定需要,运行自定义PASS生成可视化数据流;同时也支持通过命令行对指定的变量进行监视,包括全局变量及局部变量;可以同时支持多个需要监视的变量。
3、LLVM编译器对源码进行编译,通过词法分析、语法分析、语义分析并生成中间表示(IR)。
4、自定义PASS对中间表示进行插桩,对中间表示中的每个function进行处理,并生成经过PASS处理后的中间表示(IR);如果有指定需要监视的变量,则同样对此变量进行插桩处理。
5、LLVM编译器继续对中间表示(IR)进行编译,通过生成SelectionDAG,并通过指令选择、指令调度、寄存器分配生成二进制程序,然后链接生成可执行程序。
6、用户执行可执行程序,生成数据流可视化图。
本方法的核心在于添加自定义PASS对中间表示进行插桩;LLVM编译器采用三段式设计,如图2所示,所述LLVM编译器包括前端部分(FrontEnd)、优化器部分(Optimizer)、后端部分(BackEnd),
对于不同的语言使用不同的FrontEnd,FrontEnd主要工作是对代码进行词法分析,语法分析,语义分析检查源代码是否存在错误,然后构建抽象语法树;
优化器Optimizer主要是对与机器无关的中间表示进行优化,改善代码的运行时间,例如对控制语句做优化,去除一些无用的冗余代码;
BackEnd则是将代码映射到目标指令集,生成机器指令,同时进行机器相关的代码优化。
在Optimizer中添加自定义PASS,自定义PASS继承自FunctionPass,主要作用是遍历中间表示中的function,采集其主要信息,主要包括其函数名,参数,返回值;并在中间表示中添加对这些信息的输出,同时输出用户指定的变量的信息,最终在执行可执行程序后,可以生成数据流可视化图。用户通过数据流可视化图可以直观的查看程序中各函数之间的调用关系、各个函数的执行时间、监视的变量值的变化。
下面以具体应用实例来进一步说明本方法的实现过程。
待输入的C++源码举例如下:
用户通过命令行指定自定义pass,同时指定对参数input进行监控。
llvm FrontEnd对输入的源码进行词法分析、语法分析、生成AST(抽象语法树)、语义分析,最后遍历AST树,生成中间表示。
Optimizer对中间表示进行各种pass的优化,在各种pass优化的基础上,最后通过自定义pass进行优化,自定义pass对中间表示进行遍历,在每个function中做插桩操作,获取function的信息,例如函数名、形参、返回值等,并在function中添加输出信息,此处获取到main函数、a函数、b函数的信息,同时对需要监控的变量input进行插桩,通过对input参数进行def-use分析,获取其在每个function中的值的变化。
BackEnd对中间表示进行指令选择,指令调度,寄存器分配,最后将其转化为二进制代码,并同其他二进制代码链接至可执行程序。
用户执行可执行程序,此时对整个数据流进行可视化操作,并输出可视化数据流图。
针对上述用例,假如输入input参数为1,用户在命令行指定使用自定义Pass及针对input参数进行监视。在main函数中通过分支判断,调用b函数,则最终输出的数据流可视化图如图3所示。数据流从main函数至b函数,最终返回main函数,同时input在每个函数中的变化也会被捕捉到。因为a函数没有被调用,因此在可视化图中不会对其显示。数据流可视化图是串行的,因为其是在实际运行中生成的,在所有的分支判断中都会通过具体的值而进入确定的分支中。
本方法基于LLVM编译器来进行二次开发,也具有支持多种编程语言,支持各target的特性,并且因为是在中间表示上进行插桩操作,因此是与后端无关的,同时本方法不需要依赖其他任何IDE存在,可用性极好。
本发明实施例还提供一种生成可视化数据流的系统,该系统基于LLVM编译器框架,通过添加自定义Pass,对中间表示进行遍历;并通过插桩的方式在中间表示中添加对function信息及监视遍历的记录,并在实际运行中将数据流可视化;该系统实现上述实施例所述的生成可视化数据流的方法:
1、在LLVM编译器中添加自定义PASS,对输入的中间表示(IR)进行处理,通过插桩的方式在中间表示中写入生成可视化数据流的逻辑。
2、用户通过命令行的方式运行LLVM编译器,指定需要,运行自定义PASS生成可视化数据流;同时也支持通过命令行对指定的变量进行监视,包括全局变量及局部变量;可以同时支持多个需要监视的变量。
3、LLVM编译器对源码进行编译,通过词法分析、语法分析、语义分析并生成中间表示(IR)。
4、自定义PASS对中间表示进行插桩,对中间表示中的每个function进行处理,并生成经过PASS处理后的中间表示(IR);如果有指定需要监视的变量,则同样对此变量进行插桩处理。
5、LLVM编译器继续对中间表示(IR)进行编译,通过生成SelectionDAG,并通过指令选择、指令调度、寄存器分配生成二进制程序,然后链接生成可执行程序。
6、用户执行可执行程序,生成数据流可视化图。
其中,所述LLVM编译器框架包括FrontEnd、Optimizer、BackEnd,
FrontEnd,用于对代码进行词法分析,语法分析,语义分析检查源代码是否存在错误,然后构建抽象语法树;对于不同的语言使用不同的FrontEnd。
Optimizer,用于对与机器无关的中间表示进行优化,改善代码的运行时间,例如对控制语句做优化,去除一些无用的冗余代码;
BackEnd,用于将代码映射到目标指令集,生成机器指令,同时进行机器相关的代码优化;
在Optimizer中添加自定义PASS,自定义PASS继承自FunctionPass,用于遍历中间表示中的function,采集其主要信息,包括其函数名,参数,返回值;并在中间表示中添加对这些信息的输出,同时输出用户指定的变量的信息,最终在执行可执行程序后,生成数据流可视化图。用户通过数据流可视化图可以直观的查看程序中各函数之间的调用关系、各个函数的执行时间、监视的变量值的变化。
本发明实施例还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述实施例所述的方法的步骤。
通过上面具体实施方式,所述技术领域的技术人员可容易的实现本发明。但是应当理解,本发明并不限于上述的具体实施方式。在公开的实施方式的基础上,所述技术领域的技术人员可任意组合不同的技术特征,从而实现不同的技术方案。
除说明书所述的技术特征外,均为本专业技术人员的已知技术。

Claims (10)

1.一种生成可视化数据流的方法,其特征在于,基于LLVM编译器框架,通过添加自定义Pass,对中间表示进行遍历;并通过插桩的方式在中间表示中添加对function信息及监视遍历的记录,并在实际运行中将数据流可视化。
2.根据权利要求1所述的一种生成可视化数据流的方法,其特征在于,该方法的实现包括以下步骤:
1)在LLVM编译器中添加自定义PASS,对输入的中间表示进行处理,通过插桩的方式在中间表示中写入生成可视化数据流的逻辑;
2)用户通过命令行的方式运行LLVM编译器,指定需要,运行自定义PASS生成可视化数据流;
3)LLVM编译器对源码进行编译,通过词法分析、语法分析、语义分析并生成中间表示;
4)自定义PASS对中间表示进行插桩,对中间表示中的每个function进行处理,并生成经过PASS处理后的中间表示;
5)LLVM编译器继续对中间表示进行编译,通过生成SelectionDAG,并通过指令选择、指令调度、寄存器分配生成二进制程序,然后链接生成可执行程序;
6)用户执行可执行程序,生成数据流可视化图。
3.根据权利要求2所述的一种生成可视化数据流的方法,其特征在于,所述用户通过命令行的方式运行LLVM编译器,支持通过命令行对指定的变量进行监视,包括全局变量及局部变量;并同时支持多个需要监视的变量。
4.根据权利要求3所述的一种生成可视化数据流的方法,其特征在于,所述自定义PASS对中间表示进行插桩,如果有指定需要监视的变量,则同样对此变量进行插桩处理。
5.根据权利要求1所述的一种生成可视化数据流的方法,其特征在于,所述LLVM编译器包括前端部分、优化器部分、后端部分,
前端部分,用于对代码进行词法分析,语法分析,语义分析检查源代码是否存在错误,然后构建抽象语法树;
优化器部分,用于对与机器无关的中间表示进行优化,改善代码的运行时间;
后端部分,用于将代码映射到目标指令集,生成机器指令,同时进行机器相关的代码优化;
在优化器部分添加自定义PASS,自定义PASS继承自FunctionPass,用于遍历中间表示中的function,采集其主要信息,包括其函数名,参数,返回值;并在中间表示中添加对这些信息的输出,同时输出用户指定的变量的信息,最终在执行可执行程序后,生成数据流可视化图。
6.根据权利要求5所述的一种生成可视化数据流的方法,其特征在于,所述数据流可视化图直观的展示程序中各函数之间的调用关系、各个函数的执行时间、监视的变量值的变化。
7.根据权利要求5所述的一种生成可视化数据流的方法,其特征在于,所述前端部分,对于不同的语言使用不同的FrontEnd。
8.一种生成可视化数据流的系统,其特征在于,该系统基于LLVM编译器框架,通过添加自定义Pass,对中间表示进行遍历;并通过插桩的方式在中间表示中添加对function信息及监视遍历的记录,并在实际运行中将数据流可视化;
该系统实现权利要求1至7任一项所述的生成可视化数据流的方法。
9.根据权利要求8所述的一种生成可视化数据流的系统,其特征在于,所述LLVM编译器框架包括FrontEnd、Optimizer、BackEnd,
FrontEnd,用于对代码进行词法分析,语法分析,语义分析检查源代码是否存在错误,然后构建抽象语法树;
Optimizer,用于对与机器无关的中间表示进行优化,改善代码的运行时间;
BackEnd,用于将代码映射到目标指令集,生成机器指令,同时进行机器相关的代码优化;
在Optimizer中添加自定义PASS,自定义PASS继承自FunctionPass,用于遍历中间表示中的function,采集其主要信息,包括其函数名,参数,返回值;并在中间表示中添加对这些信息的输出,同时输出用户指定的变量的信息,最终在执行可执行程序后,生成数据流可视化图。
10.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至7中任一项所述方法。
CN202410247680.0A 2024-03-05 2024-03-05 一种生成可视化数据流的方法及系统 Pending CN118092936A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202410247680.0A CN118092936A (zh) 2024-03-05 2024-03-05 一种生成可视化数据流的方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202410247680.0A CN118092936A (zh) 2024-03-05 2024-03-05 一种生成可视化数据流的方法及系统

Publications (1)

Publication Number Publication Date
CN118092936A true CN118092936A (zh) 2024-05-28

Family

ID=91141823

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202410247680.0A Pending CN118092936A (zh) 2024-03-05 2024-03-05 一种生成可视化数据流的方法及系统

Country Status (1)

Country Link
CN (1) CN118092936A (zh)

Similar Documents

Publication Publication Date Title
CN109254776B (zh) 多语言代码编译方法及编译器
EP3465428B1 (en) Sample driven profile guided optimization with precise correlation
US7509632B2 (en) Method and apparatus for analyzing call history data derived from execution of a computer program
CN110825384A (zh) 一种基于llvm的st语言编译方法及编译系统和编译器
Mens et al. Refactoring: Current research and future trends
EP1918812A1 (en) A software development system
EP2687981B1 (en) Automated compiler specialisation for global optimisation
JPH08202545A (ja) ターゲット言語コードを生成するためのオブジェクト指向システム及びその方法
JPH09330233A (ja) 最適目的コード生成方法
JP2001166949A (ja) シンボリック実行を用いてソースコードをコンパイルするための方法及び装置
CN109933327A (zh) 基于代码融合编译框架的OpenCL编译器设计方法和系统
Huda et al. Automatic parallel pattern detection in the algorithm structure design space
CN110554861B (zh) 具有编译和读取-评估-打印-循环操作的软件开发环境
US8762974B1 (en) Context-sensitive compiler directives
CN113553057B (zh) 一种针对不同架构的gpu进行并行计算的优化系统
CN104750533B (zh) C程序编译方法及编译器
JP2001166946A (ja) 階層の平坦化によりソースコードをコンパイルする方法及び装置
US20170206068A1 (en) Program optimization based on directives for intermediate code
JP2009211424A (ja) 最適化箇所判定装置及び最適化箇所判定システム及びコンピュータプログラム及び最適化箇所判定方法
CN118092936A (zh) 一种生成可视化数据流的方法及系统
CN112527304A (zh) 基于异构平台的自适应节点融合编译优化方法
CN114780105A (zh) 一种基于值流分析的Golang程序高效过程间逃逸分析方法
Harrison et al. Tools for multiple-CPU environments
US9250877B2 (en) Assisting parallelization of a computer program
Zima et al. Automatic Restructuring for Parallel and Vector Computers

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination