实际上,像Java、Python、Perl这种跨平台的开发语言,它的迁移的技术难度相对来说是比较低的,主要是因为Java有一个JBM,Python中存在一个解释器,它们屏蔽了大部分的平台架构上的差异。与之相反,C和C++的难度相对来说要高一些,原因是如内敛函数还有x86加速的一些指令,无法支持像微软这种闭源的开发架构。
典型的如C/C++/Go语言,都属于编译型语言。编译型语言开发的程序在从x86处理器迁移到鲲鹏处理器时,必须经过重新编译才能运行。如下图所示,源码需要由编译器、汇编器翻译成机器指令,再通过链接器链接库函数才能生成机器语言程序。
接下来就是C/C++代码的编译构建了,这个过程一共分为六步:
获取源码:通过github或第三方开源社区获取
准备编译环境:安装编译器gcc等
使用源码中的CMakeLists.txt或configure脚本生成makefile
执行makefile编译可执行程序
替换依赖库:重编译或替换依赖x86平台的so库
将可执行程序安装部署到生产或测试系统
既然是最为复杂的,C/C++语言的迁移问题也是涉猎最广泛的,主要涉及到七类问题:
编译脚本和编译选项的移植:以x86 下 -m64 代码为例,其主要功能是将应用程序编译为 64 位,对应到鲲鹏上是用 -mabi=lp64 的编译选项,此类编译选项需要在脚本中修改;此外, x86 平台上默认的 char 类型是一种有符号的类型,对应到鲲鹏上则是无符号类型,在移植过程中需要显示定义并将 char 类型定义为有符号,方法一是在源代码里加上 signed char,方法二是直接用 fsigned-char 来修改