跳到主要内容

LabVIEW 编译器的发展历史

· 阅读需 6 分钟

https://labview.qizhen.xyz/

前阵子为了准备一个关于LabVIEW编译器的讲座,查找整理了一些关于LabVIEW早先版本编译器的信息。

LabVIEW 1.0 版本是在1986年(NI公司成立的第十年)发布的。第一个版本的LabVIEW只能能运行在当时最流行的个人电脑:苹果机上;那时的Apple电脑的CPU采用的是摩托罗拉68000。LabVIEW 1与之后的LabVIEW语言都不同,它是解释型语言。语法和功能都相当简单,比如:每个函数只能用于一种类型的数据;唯一的数值类型是浮点数等。

LabVIEW 1.1 中引入了LabVIEW的一个重要优化技术:缓存重用。LabVIEW程序采用的数据流驱动方式,最大的效率隐患就是产生了过多的数据拷贝。采取缓存重用机制,LabVIEW会尽量减少不必要的数据复制、利用已有的内存控件,从而大大提高的LabVIEW的效率。知道今天,LabVIEW程序员在为自己的程序做内存优化时,主要考虑的依旧是如何有效利用LabVIEW的缓存重用机制。

LabVIEW 2.0 最重要的革命性改进是它使用编译器代替来原来的解释器,LabVIEW从此变成编译型语言了。它首先把一段程序编译成为针对摩托罗拉68000 CPU机器码,然后再运行。这样执行速度就有了质的飞跃。LabVIEW 2.0 在编译程序时同时会对程序做语法检查,比如:把两个不同数据类型的控件连在一起,LabVIEW 会给出相应错误提示。LabVIEW 2.0另外一项重大的创新是开始支持并行计算。当时的LabVIEW并不支持多线程,但是,它在程序内部实现了类似多线程的调度。LabVIEW 会把代码中没有先后顺序依赖的部分分成不同的“模块”,然后快速交替执行各个模块,让它们在宏观上看起来是并行执行的。

LabVIEW 跨平台是从 LabVIEW 2.5开始的。在这个版本中,它首次开始支持x86架构的CPU。在之后的版本中,LabVIEW陆续开始支持PowerPC以及其它一些当年比较常用的CPU。

为了更有效的支持多种硬件设备,LabVIEW从5.0版开始引入了一项新的模块GenAPI。GenAPI可以生成多种CPU的程序执行代码,这样一来,LabVIEW就具备了交叉编译的能力,比如在一台x86的电脑上,可以编译出在RT设备上运行的程序。LabVIEW 5.0的另一项重大改进是它开始支持多线程了。

LabVIEW 8.0针对于编译器最主要的改进是优化了CPU寄存器的分配机制。再此之前,LabVIEW采用固定的模式为数据分配寄存器,8.0开始采用了动态分配方式。同时8.0的编译器也开始加入优化方式,比如移除无效代码分支等。

LabVIEW 2009是编译器改进比较重大的一个版本。首先,它加入了64位的编译器,可以生成64位的执行程序。再有,它开始对LabVIEW的编译器分层化。首先细分出来的是DFIR(Dataflow Intermediate Representation)-位于程序框图和可执行代码之间的逻辑表达层。有了这样一层中间层,LabVIEW编译器可以做更多的优化工作了,比如:常数合并,无效代码删除,循环内不变代码移出等。

在LabVIEW 2010中,编译器在DFIR与机器码之间又细化出一层:LLVM(Low-Level Virtual Machine),底层虚拟机。在这一层上,编译器可以进行如:指令调度,循环判断条件外提,指令组合,以及更复杂的寄存器分配等优化。2010在已有的DFIR层上也引进了新的优化方式,比如:运算关联,相同代码合并,达式消除,循环展开,以及子VI内联等。