LabVIEW 是编译型语言还是解释型语言

    LabVIEW 和常用的 VC++、VB 一样,是编译型语言。LabVIEW 的语法定义比较严格,在程序运行之前会检查所有语句的语法,一旦查出有差错,程序会报错,不能运行。
    在LabVIEW是否是编译型语言的问题上容易引起混淆的原因,一是用户看不到编译时生成的目标文件(在 LabVIEW 的环境中,可以直接运行一个 VI,并不生成任何其他可执行文件);二是 LabVIEW 没有编译这个按钮。此外,VI 运行前似乎也没有占用编译时间。
 
    我们可以把 LabVIEW 和 C 语言的存储与编译方法作一比较:C 语言的原文件存储在 .c 文件中。需要编译时,要显式地告知编译器进行编译。在耗费一段编译时间后,可以看到编译后生成的含有可执行二进制代码的 .obj 文件。而LabVIEW 的原代码是存储在 .vi 文件中的。
一个 .c 文件中通常保存了多个函数,一个由几十个函数构成的 C 语言工程,也许只由两三个 .c 文件组成。而通常情况下,一个 .vi 文件只存储一个 VI,即相当于 C 语言中的一个函数。所以,一个小型 LabVIEW 工程也可能由几十个 .vi 文件组成。
    但在某些情况下,一个 .vi 文件也可能包含了某些子 VI(子函数),即这些子函数没有他们自己的 .vi 文件。这样的子 VI 被称为实例 VI(Instance VI)。LabVIEW 7版本中出现的、目前很常用的 Express VI就是这种 Instance VI。他们都是被存储在调用他们的 VI 中的。
 
    .c 文件只保存程序的原代码;而 .vi 文件不仅保存了 LabVIEW 程序的原代码,也保存了程序编译之后生成的目标代码。在 LabVIEW 的工程中看不到类似 .obj 这样的文件,就是因为编译后的代码也已经被保存在了 .vi 中的缘故。
 
    LabVIEW 在运行VI 之前无需编译,是因为 LabVIEW 在把 VI 装入内存的时候、以及在编辑 VI 的同时进行了编译。
 
   当把一个 VI 装入内存时,LabVIEW 先要判断一下这个 VI 是否需要被编译。一般情况下,如果不对VI的代码做改动,是不需要重新编译的。但是在两种情况下需要重新编译。第一种,是在高版本 LabVIEW 中打开一个用低版本LabVIEW 保存的 VI;第二种,是在不同的操作系统下装入和打开了同一个 VI。
    比如,要在 LabVIEW 8.0 中打开一个原来用 LabVIEW 7.0 编写保存的 VI,则被装入的 VI 需要被重新编译,因为不同版本的 LabVIEW 生成的目标代码会稍有不同。如果你的工程包含有上百个 VI,在新版本的 LabVIEW 中打开顶层 VI,就会明显地察觉到编译所占用的时间。第二种情况的例子是,在 Linux 中打开一个原来是在 Windows XP 下编写保存的 VI,LabVIEW 也需要重新编译。LabVIEW 为不同操作系统生成的目标代码也是不同的。
    在以上两种情况下,打开一个 VI 后,会发现 VI 窗口的标题栏中的标题后面出现一个星号,这表示需要重新保存 VI。此时,虽然 VI 中的程序原代码没有改变,但是编译生成的目标代码已经变了,所以需要重新保存。
    在LabVIEW 安装了升级补丁之后(比如从8.0升级到8.01),程序会提示你是否需要把 LabVIEW 自带的 VI 全部批量编译(mass compile)。如果你选择“是”,则可能需要占用几个小时的时间才能完成编译。
 
    LabVIEW 在你编辑程序原代码的同时,就会对它进行编译。LabVIEW 只编译你当前正在编辑的这个 VI,它的子 VI 已经保存有已编译好的目标代码,所以不需要重新编译了。因为每个 .vi 只相当于一个函数,代码量不会很大,编译速度就相当快,用户基本上是察觉不到的。 你在编写一个LabVIEW程序时,假如你把两个类型不同的接线端联在一起,会看到程序的运行按钮立即断裂,它表示程序已经编译了,并且编译后的代码不可执行。程序编写完毕,所有 VI也都已是被编译好了,程序直接运行即可。
 
    有时会出现这种情况:打开一个 VI,VI 左上方运行按钮上的箭头是断裂的,表示 VI 不能运行。但是点击断裂的箭头,在错误列表里却没有列出任何错误信息。此时箭头断裂是由于 VI 保存的编译后的代码不能执行引起的。例如在上一次打开这个 VI 时,有一个被此VI 调用的 DLL 文件没有找到,编译后的代码自然不能执行。而后关闭 VI 再把缺失的 DLL 文件放回去。下次打开始 VI 时,理论上 VI 应当可以运行了,但是这时 LabVIEW 没有重新编译这个 VI,VI 中保存的是上一次不可执行的代码,所以运行按钮的箭头仍然断裂。而程序原代码没有任何错误,所以错误列表中什么都看不到。
    修复箭头状态的方法是按住 Ctrl + Shift 键,再用鼠标左键点击运行按钮(断裂的箭头)。在 LabVIEW 中按住 Ctrl + Shift 键 + 鼠标左键点击运行按钮表示编译,但不运行,这相当于其他语言的 Compile 按钮。
 
    LabVIEW 采用的把可执行代码与源程序保存在同一文件,分散编译的方式,与其它语言相比是相当特殊的。它既有优点也有缺点。
    它最大的缺点是不利于代码管理。比较正规的做法,程序代码需要每天都上传至代码管理服务器。因此,源代码管理需要占用大量的硬盘空间。如果只是程序代码还好,把编译好的执行代码也存在同一个文件里,这就大大加重了代码管理的负担。程序开发的时候,经常需要回头查看过去的修改历史。如果某个文件发生了变化,代码管理软件就会意识到这是代码作了修改。但是VI中有时只是它包含的执行代码发生的变化,因此代码管理软件无法正确的判断出是否代码有变化。
    它的优点主要有两条:1. 运行子 VI 极为方便。其它语言要运行,只能从主入口进入,不能够单独运行某一个函数。而 LabVIEW 则可以直接运行任何一个VI;2. 分散了编译时间。大型的C++程序,编译起来很花时间,有时要用几天。LabVIEW 把编译时间分散到了写代码的同时,因此用户基本感觉不到 LabVIEW 编译占用的时间。
 
相关文章:
   
我和 LabVIEW
 
 
Advertisements

12 thoughts on “LabVIEW 是编译型语言还是解释型语言

  1. Pingback引用通告: 可执行代码与源代码分离 « 凡人琐忆

  2. Pingback引用通告: 博客版《我和LabVIEW》目录 « 凡人琐忆

  3. Pingback引用通告: LabVIEW 程序的内存优化 1 « 凡人琐忆

  4. 如果是编写测试测量、控制、仿真等领域的应用程序,LabVIEW 比 C 的运行效率和开发效率都高。因为 LabVIEW 特别为这些领域做了优化….
    开发效率高是真的,运行效率高就未必了

  5. 曾经同NI的技术支持关于LabVIEW参考书问题打听过,他们的见解是目前市面上的LabVIEW参考书最新版的也只是7.1的,他们的推荐是杨乐平主编的《LabVIEW程序设计与应用》与《LabVIEW高级程序设计》。

  6. 我以前看的书比较少,觉得 NI 公司自己编写的教程是最好的。
    不过,我现在也打算买些 LabVIEW 的书看看别人是如何理解它的。
    在 LabVIEW 论坛上打听打听会有读者来推荐的。

  7. 谢谢大牛的耐心解答。明白了很多。
    对大侠的敬仰有如滔滔江水(此处500字省略。。。)
    自己开始学习一些关于数据采集的东东,用到是NI的采集卡(像PXI-4472,6062E,6023E等)。感觉很深奥哦。还需要进一步学习labVIEW和信号处理的知识阿!

  8. 回答问题 :)
    1. LabVIEW 一般来说是靠牺牲运行效率来提高开发效率。所以某些 LabVIEW 程序运行效率会比 C 语言低。不过 C 语言运行效率比汇编低,选用哪种语言要综合考虑。但是,如果是编写测试测量、控制、仿真等领域的应用程序,LabVIEW 比 C 的运行效率和开发效率都高。因为 LabVIEW 特别为这些领域做了优化。
     
    2. LabVIEW 适合大型程序开发,比如我刚做完的一个项目由上千个 VI 组成。应该算是比较大的了,用 LabVIEW 做完全没有问题。
     
    3. 对 NI 的培训我一无所知,要打电话问相关的人员了。

  9. 有些问题想请教一下这位大侠^_^
    1.是不是labVIEW的执行效率会低些呢(与C比较)?
    2.labVIEW适合开发大型程序吗?
    3.另外关于NI培训的问题:在NI网站上没有看到培训的费用信息,不过我猜想很贵。能否透露一二?
    谢谢。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s