遗留代码的MapReduce并行化重构方法探讨

发布时间:2022-09-01 14:41:35 论文编辑:vicky

本文是一篇计算机论文,本文针对重构后代码的并行化程度低的问题,通过对不同的代码模式应用对应的规则进行解决。生成的MapReduce程序最后通过自定义的映射规则和代码模板重构到目标平台。

第一章 引言

1.1 研究背景与意义

随着技术和环境的不断变化,现有组织的软件系统终将成为遗留系统。遗留系统通常使用老旧或过时的技术开发[1],其中保存着重要的历史数据、关键业务过程以及可靠逻辑实现,加之组织在系统的开发与维护过程中投入大量的财力和物力,遗留系统不能直接被丢弃,所以即使出现新技术,大多组织仍然继续使用这样的系统。

随着业务功能的不断扩展和数据量的飞速增长,遗留系统在面向大数据量的业务处理时愈发力不从心。同时随着时间的推移,遗留系统虽仍在使用,但因存在代码体系结构单一、平台和技术老旧、技术文档缺失、缺乏可扩展性等问题,导致维护成本日益增加。若要其继续发挥作用,最直接的方式是从头开始重新开发,但是重新构建遗留系统存在不小的挑战。遗留系统大都缺乏完善的业务需求书,只能通过源代码进行反推业务逻辑[2],而且遗留系统蕴含着大量的领域知识和关键资源,重新设计开发会造成较大的资源浪费。所以为响应应用程序需求的变化,同时保护组织对遗留系统的已有投资,许多组织开始利用软件移植技术最大限度地重用遗留系统[3]。

云计算作为一种新兴的计算模式,其存储、网络、计算和各项应用服务以公共设施的方式提供给组织机构[4]。企业可以选择按需使用的付费模式,不必购买大量的基础设施,从而大大地节省成本[5]。同时,云计算具有虚拟化、高可靠以及计算资源可扩展和并行计算等特点[6-8],这些特点使得系统的数据处理速度获得极大的提升。云计算平台能够保留原有系统的功能价值并提升其业务处理能力,因此当前许多公司希望将遗留系统迁移到云端[9]。

1.2 国内外研究现状

针对并行化重构的研究工作已经取得较多的成果。大多集中在串行程序的并行化重构方法和工具的研究,同时也存在着关于脚本语言向MapReduce编程模型的重构方法和工具的研究。但是关于编程语言向MapReduce编程模型的重构方法和工具的相关研究还不够完善。

1.2.1 串行程序的并行化重构

对顺序代码进行并行化重构,使其能够在多处理器系统上或多线程环境中运行,从而加快代码的执行速度。对此方向的研究集中在通过对可并行执行任务进行标识并重新编程,使其计算分布在多个处理器或线程上,从而实现顺序代码的并行化。现有研究中对可并行代码的重新编程分别从编译层面或者代码层面实现。

编译层面的并行化研究中,Parinaz等人提出一个并行化编译器iC etus从编译层面对顺序代码进行并行化处理,该编译器支持用户完成程序转换过程的所有阶段,包括程序分析、并行化和优化。第一阶段包括静态和动态分析,指出代表性能瓶颈并应改进的循环,并行化阶段提供了多种选项以满足不同级别的用户技能[28]。文献[29]中实现一个基于 OpenMP 的自动并行化编译器AutoPar-Clava,它使用静态分析方法检测应用程序中的可并行化循环,并根据访问模式对目标循环中使用的变量进行分类,最后将输入的顺序代码转换成并行代码。文献[30]中提出一个并行编译器T4,其利用新的编译器并行化技术将顺序程序分解为由几十条指令组成的小任务,任务之间并行开展,以实现最大程度的并行化。编译时利用数组的下标模式并行化循环一直是并行化编译器面临的一个挑战,文献[31]中提出用于表示和推理数组下标的代数方法,并提出基于符号范围聚合的编译时算法,该算法可以证明循环的单调性和并行性。结果表明,该算法不仅在并行循环中取得显著的性能提升,而且在整体应用中效果显著。

第二章 基于GSA形式的中间代码生成

2.1 GSA形式概述

重构方案的第一步是将源程序转换为中间代码。转换基于程序等效的表示实现,以保证转换前后的语义等效。为实现该目标,本文借助于GSA形式实现中间代码的生成。不同于以往的研究中使用SSA(Single Static Assignment)帮助程序转换,输入程序首先转换为GSA形式。GSA是基于SSA的一种中间表示形式[64],它可以反映出程序中所包含的全部语义信息,常用于程序转换之中,利用该形式获取更高层级表示的中间代码,它是一种比SSA形式更完整的程序表示,并且比SSA形式更适合表示符号表达式。SSA形式中,变量的每个定义都有一个新的名称,变量的每次使用都被命名为引用该变量的单个到达定义。这样对于每个变量的每次使用,将会只有一个到达定义。当代码中出现对变量的多个到达定义的合并时,其中引入特殊的函数赋值语句V1=φ(V2,V3 …)将其合并为一个新的定义,其中V1,V2,V3 …是变量。但是,SSA中该函数不是引用透明的,它的结果不仅取决于它的输入,还取决于控制流的执行。如果在程序的其他地方遇到一个具有相同输入的函数,不能确定它们是否是等价的。同时,SSA不能有效处理针对数组的操作。GSA形式通过扩展 SSA形式解决这些问题。GSA通过使用门控函数(µ、γ、η)扩展 SSA 形式解决引用透明的问题,在门控函数中对值的合并进行编码控制。针对数组的处理,GSA中在数组的每次写入时为数组变量生成一个新名称。对数组的任何后续读取都使用新名称,从而简化对数组的数据流跟踪,并且使用下标确定被赋值的元素。

计算机论文怎么写

2.2 中间代码

中间代码是重构过程的核心,它与目标平台相关。中间代码作为一种抽象的程序式语言,是源程序的等效表现形式。本文的中间代码设计为函数式的λ演算。λ演算中包含MapReduce程序中的基本运算符,由其所编写的程序能够抽象出语法差异并描述出基本运算符的功能。文中同时对中间代码定义评估规则,规则实现中间代码中表达式的计算,精简中间代码的结构,提升并行化程度。

2.2.1 中间代码的表示形式

本文的中间代码采用的是类型化的λ演算。它是函数式的,与目标程序的编程范式一致。λ演算源于Church、Curry等人的工作,它是一种简单、强大和优雅的编程语言[65]。λ演算中存在三类表达式,分别是函数定义、变量引用以及函数应用。其中变量引用中存在两类变量,分别是绑定变量和自由变量,它们的定义如下。

定义2.1 函数定义

λ演算中,函数由一个表达式表示,形式化表示为λ x: .Body,其表示为一个含有 类型参数x的函数,它的返回值通过Body计算[65]。

定义2.2 变量引用

变量引用是一个名称,通过该名称匹配函数表达式中的某个参数[65]。

定义2.3 函数应用

λ演算中,函数应用形式化表示为(λ x: .Body)y。其中y为参数[65]。

定义2.4 绑定变量

如果一个变量是一个 表达式中的参数,则称该变量是一个绑定的变量。

第三章 中间代码的并行化与目标代码生成 ........................................ 28

3.1 重构规则概述 ............................................ 28

3.2 并行化重构流程 .......................................... 29

第四章 重构工具的设计实现与实验评估 ........................................ 40

4.1 重构工具JMRT的设计与实现 .................................................... 40

4.2 实验数据与实验环境 ......................................... 43

第五章 总结与展望 ................................................ 54

5.1 工作总结 ........................................................... 54

5.2 工作展望 ............................................... 54

第四章 重构工具的设计实现与实验评估

4.1 重构工具JMRT的设计与实现

并非遗留系统中的全部代码都可以向MapReduce模型重构,需要对能够并行重构的程序进行判定。当前本研究小组的工作中已经提出针对遗留代码的并行化判定方法,该方法通过使用特定的标记标注可并行化的代码[73][74]。本文将在标注代码的基础上对遗留系统中的代码进行重构。根据本文提出的方案,实现重构工具JMRT,它由接收器、处理器、转换器、翻译器以及生成器五个组件构成。JMRT的工作流程如下图4.1所示。首先,接收器接收待重构的串行程序。接着,处理器生成与源程序等效的GSA形式,转换器利用转换规则将GSA代码转换成中间代码。然后,翻译器利用并行化重构规则实现并行程序的生成。最后,生成器使用映射规则生成Spark平台下的目标代码,完成代码重构。

JMRT各个组件的功能如下:

(1)接收器:该组件接受可并行的Java顺序代码,找到代码中打过并行标记的代码,然后将该部分代码发送到处理器。

(2)处理器:处理器生成与源程序等效的GSA形式。

(3)转换器:转换器实现转换规则,完成GSA代码向中间代码的转换。同时借助于Kiama库[75]实现中间代码的评估,完成中间代码的归约和求值。

(4)翻译器:该部分输入是中间代码,经过并行重构输出为具备MapReduce范式的并行程序。

计算机论文参考

第五章 总结与展望

5.1 工作总结

本文针对Java遗留代码的并行化重构研究中存在重构过程中代码的语义等效性无法保证、重构后代码的并行化程度低、自动化能力不足等问题,提出一种基于中间代码和MapReduce模型的重构方案,设计并开发重构工具。该方案在保证代码语义等效的同时,实现代码的并行程度最大化。论文中的工作主要集中在以下几个方面:

(1)提出一种基于GSA的中间代码生成方法。该方法通过程序分析框架和自定义的转换规则,实现顺序代码向中间代码的转换。该方法引入中间代码,确保重构过程中代码的语义等效,同时充分考虑循环在并行化重构过程中的作用,保留了循环结构。这使得并行化重构阶段能够充分利用循环信息,实现代码的并行程度最大化,有效提升程序执行效率。

(2)提出一组基于MapReduce的并行化重构规则。规则通过引入MapReduce中的并行操作实现代码的重构。针对重构后代码的并行化程度低的问题,通过对不同的代码模式应用对应的规则进行解决。生成的MapReduce程序最后通过自定义的映射规则和代码模板重构到目标平台。

(3)重构工具开发与实验验证。文中开发重构工具JMRT实现遗留代码的重构。JMRT具有可并行代码接收、GSA代码的生成、中间代码的生成、中间代码的并行化重构以及目标代码生成五项功能。通过实验对重构工具以及重构方案的有效性进行检验。实验结果表明,重构工具不仅能完成顺序代码的并行化重构,并且重构后的代码在处理大数据量的业务时具有比串行代码更高的执行效率。

参考文献(略)