编译器设计是一个复杂的课题,甚至在专业的软件工程师中也被认为是专业知识。倪虚拟仪器软件是一个多范例的图形化编程环境,它包含了各种各样的概念,包括数据流、面向对象和事件驱动编程。LabVIEW也是非常跨平台的,针对多种操作系统、芯片组、嵌入式设备和现场可编程门阵列(fpga).
国家仪器网站有很多关于LabVIEW编译器的信息。在这篇博文中,我已经尽力提供了一个简化的解释。

1.虚拟仪器编译过程
在VI的编译中,首先是类型传播,它负责为能够适应类型的终端解析隐含类型并检测语法错误。在类型传播之后,VI将从编辑器模型转换为数据流中间表示(DFIR)编译器使用的图形。
编译器在DFIR图上执行一些转换,例如死代码消除,以分解、优化它,并为代码生成做准备。然后将DFIR图转换为低级虚拟机(LLVM)中间表示(红外),然后对IR进行一系列的遍历,以进一步优化和降低它——最终——到机器码。
2.DFIR提供高级中间表示
DFIR是一种层次化的、基于图形的方框图代码的IR。与G-code类似,DFIR由各种节点组成,节点的终端可以与其他终端连接。有些节点,如循环,包含图,而图又可能包含其他节点。
上面的图片显示了一个简单的VI的初始DFIR。随着编译的进行,DFIR节点可能会被移动、分离或注入,但是编译器仍然会保留开发人员G代码中固有的特性,比如并行性。
3.DFIR分解和优化
进入DFIR后,VI将执行一系列分解转换,以减少或规范化DFIR图。在对DFIR图进行彻底分解后,开始进行DFIR优化。有超过30种分解和优化可以提高LabVIEW代码的性能。
4.DFIR端转换
在分解和优化DFIR图之后,执行后端转换。这些变换对DFIR图进行评估和注释,为最终将DFIR图降至LLVM IR做准备。
集群器负责将节点分组成集群,这些集群可以并行运行。inplacer标识什么时候可以重用分配,什么时候必须创建副本。inplacer运行后,分配器会保留VI执行所需的内存。
最后,代码生成器负责将DFIR图转换为目标处理器的可执行机器指令。
5.LLVM提供一种低级别的中间表示
LLVM是一个通用的、高性能的开源编译器框架。由于其灵活、清洁的API和非限制性许可,LLVM现在被广泛应用于学术界和工业界。
LabVIEW使用LLVM来执行指令组合、跳转线程、聚合的标量替换、条件传播、尾部调用消除、循环不变代码移动、死代码消除和循环展开。
6.DFIR和LLVM协同工作
DFIR是一种保持并行性的高水平红外,LLVM是一种具有目标机器特征的低水平红外,两者协同工作以优化目标机器虚拟仪器代码开发人员为执行代码的处理器体系结构编写代码。

感谢您阅读我的博客文章,并对LabVIEW如何工作进行了更技术性的解释链接.如果你对自己试用LabVIEW感兴趣,你可以购买一份LabVIEW 2014家庭版其中包括运行所需的一切LINX 3.0.如果您有任何问题或意见,请在下面发表评论。
