编译的目的是将源码转化为机器可识别的可执行程序,在早期,每次编译都需要重新构建所有东西,后来人们意识到可以让编译器自动完成一些工作,从而提升编译效率。但“编译器不过是用于代码生成的软机器,你可以使用你想要的任何语言来生成代码”,真的是必要的吗?
作者
OleksandrKaleniuk
译者
虎说
责编
仲培艺
诚然,编译器可以为你生成高性能的代码,但是你真的需要编译器吗?另一种方法是用Assembly编写程序,虽然有点夸大,但这种方法有两个主要缺陷:
1.汇编代码不可移植;
2.虽然在现代工具的辅助下变得容易了些,但Assembly编程仍然需要大量繁琐的工作。
值得庆幸的是,我们都生活在二十一世纪,这两个问题都已得到解决。第一个解决方案是LLVM,最初,它意味着“低级虚拟机”,这正是我们可以确保可移植性的原因。简而言之,它需要用一些非常低级别的与硬件无关语言编写的代码,并为特定的硬件平台返回一些高度优化的原生代码。使用LLVM,我们既具有低级编程的强大功能,又具有面向硬件微优化的自动化功能。
第二个问题的解决方法是使用“脚本”语言,Scheme、Python、Perl,甚至bash或AWK都可以消除繁琐的工作。
实验计划
首先,让我们生成一个完全内联展开的解决方案,并将其嵌入到基准测试代码中。该计划如下:
1.使用Clang为基准生成LLVM中间代码,该基准用于测量solve_5,一个不存在的函数;
2.使Python在LLVM中生成线性求解器(linearsolver)代码;
3.使用Python脚本测试基准,用生成求解器替换solve_5调用;
4.使用LLVM静态编译器将中间代码转换为机器代码;
5.使用GNU汇编器和Clang的链接器将机器代码转换为可执行的二进制文件。
这就是它在Makefile中的样子:
Python部分
我们需要Python中的线性求解器(linearsolver),就像我们使用C和C++一样,此处代码为:
#thisgeneratesn-solverinLLVMcodewithLLVMCodeobjects.#NoLLVMstuffyet,just