您的位置:首页 > 编程语言

自从有了这个工具,一键代码迁移不在话下

2021-06-22 16:03 633 查看
摘要:鲲鹏开发套件Kunpeng DevKit可实现两人天快速完成代码迁移,提供全栈开发工具,集代码迁移、编译调试、性能调优、异常诊断等工具和功能于一体。

本文分享自华为云社区《【云驻共创】鲲鹏DevKit实现两人天高效迁移汇编代码》,原文作者:Victue。

一、鲲鹏之志

1.1 鲲鹏平台

鲲鹏平台,为全世界的开发者提供了一种新的算力选择。从硬件的开放,到系统软件的开源,涵盖从底层硬件、基础软件到上层行业应用的全产业链条,在国计民生的各个行业取得了重大效果或者进展。工欲善其事必先利其器,鲲鹏开发套件Kunpeng DevKit是华为公司为了广大鲲鹏开发者打造的一把屠龙之刃,帮助开发者高效开发,一键迁移。

1.2 Kunpeng DevKit

鲲鹏开发套件Kunpeng DevKit提供全栈开发工具,集代码迁移、编译调试、性能调优、异常诊断等工具和功能于一体。将开发者的工作各个环节一一串联,提供了一个方便、快捷和专业的工具包,通过鲲鹏DevKit可以帮助用户高效开发,一展宏图。

真正的武林高手,内功很强,外功同样很强!DevKit产品设计和用户体验同样优秀!

时间有限,本文着重分享汇编翻译技术和Kunpeng DevKit产品体验。

二、汇编自动翻译

2.1 汇编代码

众所周知,汇编语言历史悠久,上手难度较高,是任何一种计算机或其他可编程器件的低级语言。在不同的设备中,汇编语言对应着不同的机器语言指令集。

一种汇编语言专用于某种计算机系统结构,如x86_64或aarch64汇编。这意味着在某种程度上汇编语言可以真正的操控硬件,可以完成高级语言不能完成的任务。同样,正因为汇编语言接近硬件平台,所以汇编语言也是晦涩难懂、难以上手。

2.2 汇编样式

每一个计算机平台都对应着自己的计算机平台,内存、寄存器等语法格式错综复杂。

汇编语言使用方式也多样,单指令简单嵌入汇编、多指令简单嵌入汇编、全汇编文件。这相当于在我们现代社会讲古文古诗,全篇都使用文言文或者其中引用两句古诗词。

2.3 意义和挑战

将代码从一个平台迁移到另一个平台,如果其中需要牵涉到汇编语言翻译,其代码迁移难度巨大。

目标是两人天完成应用迁移,然而如果代码中包含汇编语言,有可能12人都无法完成迁移。不行,不可以!华为必须开发汇编迁移工具!

“代码千万行,汇编就几行,迁移没工具,开发泪两行”

2.4 使用场景

在使用汇编语言时,嵌入汇编的指令数大部分是小于三条指令,使用都较简单,指令也比较集中。

全汇编文件中SIMD指令占了绝大多数,指令相对集中。

可以发现,常用汇编指令和SIMD指令占了汇编语言大半江山。只要能够解决常用指令和SIMD指令,项目就成功了一大半。

2.5 总体思路

目标是识别所有X86汇编,自动翻译(大多数场景且性能尽量不衰减)。

在开始时,对于常用的指令进行翻译,而后随着用户规模的扩大和使用量的增加,根据用户需求,逐步加入用户所需要的指令。

第一个技术点:自动化

第二个技术点:技术复用

整体技术架构面向未来,拥有生命力。所有就有了下列设计原则

设计原则

  • 使用便利 - 一键迁移
  • 可扩展性 - 翻译范围
  • 可维护性 - 源码翻译
  • 架构重用 - 不同场景
  • 技术复用 - 不造轮子

2.6 总体设计

W + 二

“二”,直接翻译,实现从X86-64 → AArch64

“W”,庖丁解牛,虽然操作较为复杂,但是利用编译技术的现有能力,加以改造为翻译所用,实现翻译效率最优化。依据上文所述汇编复杂特性以及平台便捷化目标,产生以下设计原则和设计方案

设计原则

  • 汇编样式复杂
  • 平台间差异大
  • 目标要求很高

设计方案

  • 能用则用
  • 需改尽改
  • 当快则快
  • 曲折前行

三、汇编自动翻译部分技术

3.1 嵌入汇编的识别

对于全汇编,识别方式较为简单,通过文件的后缀即可识别汇编文件,问题在于嵌入汇编的识别。我们使用Clang-Tidy编译技术实现该目标。

Clang-Tidy:基于LLVM的静态语法检查框架,提供语法(AST)解析能力。

基于Clang-Tidy工具集拓展汇编识别和替换规则,使得AST关键节点暴露。定位汇编代码后即可为所欲为,进行翻译处理。

识别流程图如下:

下面给出一个小案例:

3.2 简单嵌入汇编的自动翻译

基于规则的自动翻译,即通过某种特征匹配规则识别和转换相应的代码。

1.指令操作数映射

2.汇编语句特征分析(绑定步骤1)

3.规则库规则匹配(绑定步骤2)

4.根据规则进行代码翻译

首先对汇编语句进行语法解析,解析完以后可以得到各个特征,再在规则库中进行特征规则匹配,即与语法结构进行匹配,在规则进行转换时,相对应的语法结构也进行转换,两者合一,即代码翻译完成。

3.3 复杂汇编的自动翻译

对于复杂汇编,指令条数多,语法结构复杂,千变万化,也可能存在外部引用等问题。

1.指令组合无法穷举

2.汇编模块引用外部变量

3.消除平台间调用差异

4.SIMD指令对等翻译

上文中“W + 二”设计结构在复杂汇编翻译中发挥重要作用。下“一”进行SIMD直接翻译。

3.4 汇编翻译举例

将X86-64一键翻译为AArch64,并且提供两种方案,旧的路径依旧可以在X86上执行,没有任何问题,并且创建的新分支可以运行在Kunpeng平台上。生成代码后,可以一键替换掉旧代码。提供一个main函数,可以看作一个驱动,测试驱动可以在X86和Kunpeng平台同时运行。运行结果一致。保留X86平台的兼容性,代码在不同的平台运行可以保持100%的兼容和正确。

简单汇编翻译:

复杂汇编翻译:

天啦,这也太快了。朋友们,赶紧下载使用吧,一键翻译,迁移你的应用至鲲鹏平台。冲起来!

四、体验设计

Kunpeng DevKit功能强大,使用优雅。采用超级方便的一站式解决方案,帮助开发者加速软件开发、迁移和算力升级。一站式开发套件、全流程效率提升。一站式迁移、编译、测试、分析。

4.1 应用迁移体验设计

开发者依照个人经验和习惯可以大致分为三类:

经验较少的用户,重度依赖自动化,希望全自动化迁移

有一定经验,合理依赖自动化,希望自己主要迁移过程

经验丰富,浅度依赖自动化,自己纯手工迁移

鲲鹏DevKit针对上述三种不同类型的用户,做了大量产品体验层的设计。

第一类开发者,通过系统全面自动化能力,做到无感知迁移。提供动态二进制翻译工具,自动的将X86平台指令集翻译成Kunpeng平台指令集。整个过程透明、全自动,无需额外工作,整个应用即可应用在Kunpeng平台上。

第二类开发者,希望参与整个应用迁移的过程和环节中,了解翻译过程。鲲鹏DevKit自动识别问题、提供建议辅助决策、提供替换代码─键修改,极简体验。

第三类开发者,可能存在开发者认为自动化重构是一个黑盒子,不可信任,在这方面,困DevKit提供了透明展示等内容,使得用户相信,该工具是安全的。

4.2 性能调优体验设计

设计架构时,将人的思想行为融入其中,使得工具的使用更加自然化、更加符合人类认知的思考,从整体到局部,从宏观到微观。

4.3 小例子

举几个小例子可以说明上述体验设计,一个是硬件调优3D可视化,基于认知模型、表现模型极简抽象,从物理世界到虚拟世界的映射。

第二个例子是性能分析时,进程/线程拥塞的直观可视化。

在系统设计时,运行大量的信息可视化表达,一目了然,清晰可见,优雅体验。

五、总结

无需多言,一图流概括!

鲲鹏DevKit产品从设计到功能都是极好的,可以发现为了鲲鹏的发展和壮大,华为在此花了很多心思,希望各位开发者朋友们多多尝试,或许鲲鹏比你我想象的更加强大、友好、便利。

“北冥有鱼,其名为鲲。鲲之大,不知其几千里也。化而为鸟,其名为鹏。鹏之背,不知其几千里也;怒而飞,其翼若垂天之云。”

 

点击关注,第一时间了解华为云新鲜技术~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐