NI LabVIEW 编译器:深层分析

上传人:夏** 文档编号:563751268 上传时间:2023-07-29 格式:DOCX 页数:16 大小:407.39KB
返回 下载 相关 举报
NI LabVIEW 编译器:深层分析_第1页
第1页 / 共16页
NI LabVIEW 编译器:深层分析_第2页
第2页 / 共16页
NI LabVIEW 编译器:深层分析_第3页
第3页 / 共16页
NI LabVIEW 编译器:深层分析_第4页
第4页 / 共16页
NI LabVIEW 编译器:深层分析_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《NI LabVIEW 编译器:深层分析》由会员分享,可在线阅读,更多相关《NI LabVIEW 编译器:深层分析(16页珍藏版)》请在金锄头文库上搜索。

1、NI LabVIEW 编译器:深层分析概览即便对无足轻重的编程语言来说,编译器的设计往往也是一个复杂的课题。即使 对专业的软件工程师们来说,编译理论也需要考虑专业知识。现代的 NI LabVIEW 软件是一种多范例语言,包括广泛的多种类型的概念,包括数据流,支持面向对 象,以及事件驱动编程。LabVIEW也覆盖了各种平台,服务多种操作系统(Windows, Linux, Mac),多种芯片组(PowerPC, In tel),甚至可以服务于嵌入式设备和现场 可编程门阵列(FPGAs),它与传统的PC结构有明显不同。也许您会猜想,LabVIEW 编译器是一个精密的系统,远远超出一般书面描述的范围

2、。目录1. 编译与解释2. LabVIEW编译器的历史回顾3. 当今的编译器4. DFIR与LLVM协同工作本专业论文介绍了 LabVIEW编译器,简明地讲解了它从1986年LabVIEW 1.0版 本开始的发展变化,并描述了它今天的形式。另外,本文也探究了最近编译器的 创新,并突出了这些新特点对LabVIEW的益处以及对您的帮助。编译与解释LabVIEW是一种编译语言,它令人惊奇,因为它在一般的G开发过程没有任何明 晰的编译步骤。取而代之的是,您可以对您的 VI 做出改动并简单地按下运行键 来执行它。编译意味着您所写的G代码被转化为本地机器码然后被主机电脑直接 执行。这种方法可供选择的另一种

3、途径是解释,程序被另外的软件程序(叫做解 释程序)间接地执行,而不是直接由电脑执行。LabVIEW语言并没有要求其本身被编译或者解释;事实上,LabVIEW的第一个版 本使用解释程序。在后来的版本,编译器取代了解释程序以提高VI运行时的性 能,这是编译器与解释程序相比最常见的区别。解释程序更容易编写,并以较差 的运行性能为代价,而编译器执行起来更加复杂但是却能提供更快的执行时间。LabVIEW编译器最主要的好处之一就是编译器对所有VIs的提高显而易见,而不 必做出任何改变。实际上, LabVIEW 2010正式版的编译器进行了内部优化以加 快 VI 的执行时间。LabVIEW 编译器的历史回顾

4、在急于深入讨论现在编译器内部组成之前,很值得总结一下编译器从 20年前最 早期版本到现在的发展。这里介绍的一些算法,例如类型传播法,聚丛法,以及 内嵌法(inplaceness),在现代的LabVIEW编译器讨论中会更加详细地描述。LabVIEWl.O版本于1986上市。如前面提到的,LabVIEW在其第一个版本使用了 解释程序并且仅为摩托罗拉68000服务。那时的LabVIEW语言非常简单,也减弱 了其对编译器的需求(当时是解释程序)。例如,它不存在任何的多态数据类型, 唯一的数据类型是扩展精度浮点数据。 LabVIEW 1. 1版本首次引入了内嵌(inplaceness)算法,或者称之为“

5、内嵌程序”。此算法支持数据分配,因此 您可以在执行的时候重新使用数据,避免了不必要的数据副本,相应地,常常能 显著地提高执行性能。在LabVIEW 2.0版本,解释程序被当前的编译器所取代。仍然专门为摩托罗拉 68000服务,LabVIEW可以生成本地机器码。在2.0版本还增加了类传播算法, 可以在不断完善的LabVIEW语言中发挥其它职能,处理语法检查与类型解析。 LabVIEW 2.0另外一项重大的创新是聚丛程序的引入。聚丛算法支持LabVIEW图 表的并行输入,并将节点归类为“丛”,它可以并行运行。类传播算法,嵌入法 (inplaceness)以及聚丛算法直到目前也是现代LabVIEW编

6、译器的重要组成部 分,并随时间的推移显现出更多的新增改进。 LabVIEW2.5 中新的编译器基本结 构增加了对多种后端设备的支持,尤其是英特尔x86与Sparc。LabVIEW 2.5也 引入了连接器,当VIs需要被重新编译的时候,它可以管理VIs路径之间的从属 关系。在LabVIEW 3.1,除常数合并外,也增加了两个新的后端,PowerPC与HPPA-RISC。 LabVIEW 5.0与6.0更新了编码生成程序,并增加了 GenAPI, 一种与多种后端连 接的常用接口。 GenAPI 交叉编译对实时开发来说,是非常重要的。实时开发者 一般在主机PC上编写VIs,而将其部署到(将它们编译到

7、)实时对象。另外, 一种循环不变代码移出的有限形式也包含在内。最终,LabVIEW多任务执行系统 被扩展到支持多线程。LabVIEW 8.0创建的基于5.0版本引入的GenAPI基本结构,新增了寄存器分配 算法。在 GenAPI 引入之前,每个节点的生成码都是由寄存器硬件编码的。不可 执行编码的有限形式以及死码删除也被引入。LabVIEW 2009具有64位LabVIEW 与数据流中间表示(DFIR)。DFIR立即被用于创建更先进形式的循环不变代码移 出,常数合并,死码删除以及不可执行编码删除。 2009新语言的特点,例如并 行循环,都是基于DFIR创建。最终,在LabVIEW 2010,DF

8、IR提供了新的编译器优化,例如代数重组,公共子 表达式消除,循环展开,以及subVI直接插入。此正式版本也包括在LabVIEW 编译器链中采用了低阶虚拟机(LLVM)。LLVM是一种开放源代码的编译器基本结 构,广泛应用于工业生产。使用LLVM,新增了很多优化,例如指令调度,循环 外提,指令组合,条件传播,以及一种更精密的寄存器分配程序。当今的编译器当对 LabVIEW 编译器的历史有了基本了解后,您现在可以探索现代 LabVIEW 的编 译器了。首先,回顾高级的多种类型编译步骤概述,然后更加详细地浏览每一部 分。一个 VI 编译的第一步是类传播算法。这复杂的一步是为了解析适于终端输入的 隐含

9、类型,并检测语法错误。在G编程语言所有可能的语法错误都在类传播算法 这一步被检测。如果算法确定VI有效,编译继续。在类传播后, VI 首先被从结构图编辑器使用的模型转化为编译器使用的 DFIR。 一旦转化为DFIR,编译器对DFIR图执行几个变换,分解它,优化它,并使其 为生成代码做好准备。很多编译器的优化例如,内嵌程序(inplacer)与丛 聚程序被执行转化并在本步运行。在DFIR图标被优化与简化后,它被翻译成LLVM中间表示。对LLVM 一些列的扫 描被执行,通过中间表示来进一步优化并降低其阶次,最终变为机器码。类传播如先前提到的,类传播算法解析类型并检测程序错误。实际上,此算法包括如下

10、 几个方面的功能:解析隐藏类型使其适于终端输入解析subVI调用并确定其合法性 计算纵向 检验 VI 的周期 检测并报告语法错误此算法在您对 VI 进行每个改动后运行,以确定 VI 是否仍然完好,因此,这步是 否是“编译”的真正部分还存在少许争议。无论如何,它是LabVIEW编译链的一 环,非常明显地相当于传统编译器的词法分析,句法分析,或者是语义分析。一个适于终端输入的简单例子是LabVIEW加法基元。如果您将两个整数相加,结 果是整数,但是如果您将两个浮点数相加,结果是一个浮点数。类似的案例出现 在符合类型的数据,例如阵列和簇。存在其它语言结构,例如对移位寄存器来说, 有更复杂的输入规则。

11、在加法基元的情况下,输出类型取决于输入类型,类型被 叫做通过图表“传播”,这也是算法名字的由来。这个加法基元的例子也表明类传播算法的语法检查职能。假设您连接一个整数和 一个字符串到一个加法基元会发生什么?在这种情况下,将二者的值相加没 有意义,所以类传播算法将其报告为一个错误并将 VI 标记为“坏的”,它会引 起运行箭头中断。中间表示是什么与为什么在类传播确定V是有效的,编译器继续并将VI转化成DFIR。一般来说在详细 设计DFIR之前要考虑中间表示(IRs)。IR是由编译过程通过多阶段编辑过的用户程序的表示。IR的概念常见于现代编 译文献并能应用于任何编程语言。请考虑一些例子。当今有多种流行

12、的IRs。两种常见的例子是抽象语法树(AST) 与三地址码。图 1. AST IR 实例t0-yt1-3t2-t0*t1t3-xt4-t3+t2表1三地址码IR实例图1显示了 “x + y * 3”表达的AST表示,而表1显示了三地址码表示两种表示方式之间最明显的一处不同是AST是更高级的。它更类似于程序(C)的 源表示而不是对象表示(机器码)。三地址码相比之下,是低级的并且更类似于 汇编。不论高级或低级表示都有各自的优点。例如,语法分析,比如可靠性分析,对类 似于AST的高级表示比类似于三地址码的低级表示更容易实现。其它的优化,例 如寄存器分配或指令调度,一般用低级表示,比如三地址码来执行。

13、因为不同的IR有不同的优势和劣势,所以很多编译器(包括LabVIEW)会使用多 种IR。在LabVIEW中,DFIR作为高级IR使用,而LLVM IR作为低级IR使用。DFIR在 LabVIEW 中,作为高级表示的是 DFIR ,它是分等级且基于图形的,其本身类 似于G代码。如同G代码,DFIR也是由很多包含接线端的节点组成。每个接线 端可以连接到其它接线端。一些节点,例如包含图表的循环,也可以相应地包含 其它节点。2. LabVIEW G代码与相应的DFIR图表图2显示了一个简单的VI以及它的初步DFIR表示。当首次创建一个VI的DFIR 图表时,它是G代码的直接翻译,DFIR图表的节点一般

14、与G代码中的其它节点 进行一对一的通信。随着编译的进行,DFIR节点有可能被移动或者分开,或者 新的DFIR节点被加入。DFIR 一个最关键的优势是它保留了 G代码的固有特性, 如并行机制等。用三地址码表示的并行机制相比之下更难识别。DFIR为LabVIEW编译器提供了两个显著的优势。首先,DFIR从VI编译器的表示 分离出编辑器。其次,DFIR能用作拥有多个前端和后端的编译器的公共端。以 下是每一个优势的详细解读。DFIR图表从编译器表示分离出编辑器在DFIR出现之前,LabVIEW有一个单独的VI表示,由编辑器和编译器共享。这 样阻止了编译器在编译过程中修改表示,这样一来,进行编译器优化就

15、变得困难 了。图3. DFIR提供一种构架,允许编译过程中优化您的代码图 3 显示了对应于刚才提到的 VI 的 DFIR 图表。此图表描述了编译器过程较靠后 的部分,此时它已被几个变换分解并优化过。您可以看到,这个图表与之前的图 表看起来有很大的不同。例如:分解变换已经移走了控制,指示,以及子VI节点,而用新的节点替代它们lAccessor, UlUpdater, FunctionResolver和 FunctionCall。 循环不变式代码已从循环内将增量和乘法节点移出。 聚丛法在 For 循环内部增加了 YieldlfNeeded 节点,可以使执行线程与其它竞争的工 作项目共享执行。我们将会在后面的章节对变换进行更深入探讨。DFIR IR可以作为多个编译器前端与后端的公共端LabVIEW 可以在数个不同的终端上工作,而其中一些终端与其它终端差别很大, 例如,一台x86台式PC与一个Xilinx FPGA。同样地,LabVIEW为用户提供了 多种计算模型。除了使用G语言的图形化编程,LabVIEW也在提供了例如 MathScript 的基于文本的数学运算。这就带来了前端与后端的集中,它们都需 要在LabVIEW编译器下工作。使用DFIR作为公共IR,前端进行生产而后端进行 消费,这样便促进了不同组合之间的重新使用。例如,运行于DFIR图表的常数 合并优化执行过程可以

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号