位置:编程技术网 > 区块链 > 正文 >

都有 Python 了,还要什么编译器!

2019年02月19日 01:54来源:未知手机版

土元,色即是空2,覆手繁华,白起,heyzo-0408,福州万达影城

编译的目的是将源码转化为机器可识别的可执行程序,在早期,每次编译都需要重新构建所有东西,后来人们意识到可以让编译器自动完成一些工作,从而提升编译效率。

但 编译器不过是用于代码生成的软机器,你可以使用你想要的任何语言来生成代码 ,真的是必要的吗?

诚然,编译器可以为你生成高性能的代码,但是你真的需要编译器吗?另一种方法是用 Assembly 编写程序,虽然有点夸大,但这种方法有两个主要缺陷:

1. 汇编代码不可移植;

2. 虽然在现代工具的辅助下变得容易了些,但 Assembly 编程仍然需要大量繁琐的工作。

值得庆幸的是,我们都生活在二十一世纪,这两个问题都已得到解决。第一个解决方案是 LLVM,最初,它意味着 低级虚拟机 ,这正是我们可以确保可移植性的原因。简而言之,它需要用一些非常低级别的与硬件无关语言编写的代码,并为特定的硬件平台返回一些高度优化的原生代码。使用 LLVM,我们既具有低级编程的强大功能,又具有面向硬件微优化的自动化功能。

第二个问题的解决方法是使用 脚本 语言,Scheme、Python、Perl,甚至 bash 或 AWK 都可以消除繁琐的工作。

实验计划

首先,让我们生成一个完全内联展开的解决方案,并将其嵌入到基准测试代码中。该计划如下:

1. 使用 Clang 为基准生成 LLVM 中间代码,该基准用于测量 solve_5,一个不存在的函数;

2. 使 Python 在 LLVM 中生成线性求解器(linear solver)代码;

3. 使用 Python 脚本测试基准,用生成求解器替换 solve_5 调用;

4. 使用 LLVM 静态编译器将中间代码转换为机器代码;

5. 使用 GNU 汇编器和 Clang 的链接器将机器代码转换为可执行的二进制文件。

这就是它在 Makefile 中的样子:

Python 部分

我们需要 Python 中的线性求解器(linear solver),就像我们使用 C 和 C ++ 一样,此处代码为:

# this generates n-solver in LLVM code with LLVMCode objects.

# No LLVM stuff yet, just completely Pythonic solution

defsolve_linear_system(a_array, b_array, x_array, n_value):

defa(i, j, n):

ifn == n_value:

returna_array[i * n_value + j]

returna(i, j, n+1)*a(n, n, n+1) - a(i, n, n+1)*a(n, j, n+1)

defb(i, n):

ifn == n_value:

returnb_array[i]

returna(n, n, n+1)*b(i, n+1) - a(i, n, n+1)*b(n, n+1)

defx(i):

d = b(i,i+1)

forjinrange(i):

d -= a(i, j, i+1) * x_array[j]

returnd / a(i, i, i+1)

forkinrange(n_value):

x_array[k] = x(k)

returnx_array

当我们用数字运行时,我们可以得到数字。但我们想要代码,因此,我们需要制作一个假装成数字的对象(Object)来探测算法。该对象记录下算法想要执行的每一个操作,并准备好集成 LLVM 中间语言。

# this is basically the whole LLVM layer

I =

STACK = []

classLLVMCode:

# the only constructor for now is by double* instruction

def__init__(self, io, code = ):

self.io = io

self.code = code

def__getitem__(self, i):

global I, STACK

copy_code = % + str(I+1)

copy_code += = getelementptr inbounds double, double*

copy_code +=self.io + , i64 + str(i) + \n

copy_code += % + str(I+2)

copy_code += = load double, double* % + str(I+1)

本文地址:http://www.reviewcode.cn/qukuailian/32123.html 转载请注明出处!

今日热点资讯