G 语言

    G 语言是图形化编程语言(Graphical Programing Language)的缩写。LabVIEW 有的时候也被叫做 G 语言。我们可以这样理解:LabVIEW 是一个开发环境(类似的如 Visual Studio 也是一个开发环境),在这个环境下编写的代码就是 G 语言代码(类似的如在 Visual Studio 下写出的C代码)。

    目前在中国,很多工程师认为 LabVIEW 是一个应用在工业测控领域的应用软件,并不理解他是一个编程语言。原因有两个,首先是因为它和以往其它的编程语言差距太大,第一次看到它的人倒是更容易联想到电路板布线、工业总线配置软件等;其次是因为 LabVIEW 在中国使用的年头不多,大多数用户仅用到了 LabVIEW 的一小部分功能,还没有真正体验到 LabVIEW 的强大。
    既然是一门编程语言,在使用 LabVIEW 的时候,就应该按照程序设计的思想来解决问题。举一个例子来说明如果用程序设计的思想来解决问题:

    我们需要解决的问题是求两个正整数的最大公约数,这是一个非常常见的编程例子。
    用 LabVIEW 来解决这个问题,应当与用其他语言求解这个问体的思路是一致的。按照程序设计的一般方法,解决这个问题可以三个步骤:

    第一:确定问题的需求,给出需求的详细说明。对于这个求最大公约数的问题,我们在这一步需要做的就是写出程序输入输出的详细定义。如果是用普通的文本语言编程,你至少应该以文档的方式吧问题需求记录下来。但是 LabVIEW 程序员在这一步有个更方便的设计方法——直接在 VI 的前面板上定义程序输入输出:程序需要两个输入值(a, b),用 Numeric control 代表,一个输出(x)用 indicator 代表。输入要求是正整数,我们可以把 Numeric control 的数据类型设置为 U32,并在这个控件的属性中设置最小值为1。再为 VI 和它每个控件添加上帮助信息,VI 的前面板就可以用户提供一个详细的 VI 的功能描述以及接口定义。

    第二:设计解决问题的算法。一个问题通常不只会有一种解决方法(算法),比如说我们的求最大公约数问题,你可以采用穷举算法,把1到a之间所有的整数都试一遍,然后找到那个最大的公约数;也可以使用g.c.d.算法
    多数情况下这一步骤和具体的语言环境无关,比如说我们的问题不论采用哪种语言编写,g.c.d.算法的效率都高于穷举法。但是某些时候可能要考虑 G 语言不同与文本语言的特性,在 G 语言下使用不同于其他语言的算法。比如要遍历一棵树,可以使用递归的算法,也可以使用循环的算法。在C语言下,一般会选择递归的算法,因为递归算法的思维方式更自然,更容易掌握,实现起来也比较方便;但是在 G 语言下,递归的实现并不那么容易,效率也比较低,所以在 G 语言中,选择循环的算法更加适合。
    对于我们要解决求最大公约数问题,我们还是选用g.c.d.算法,它的运算过程如下:
        Step1: If (a mod b == 0) goto Step3; else goto Step2;
        Step2: (a, b) = (b, a mod b); goto Step1;
        Step3: x=a; return;

    第三:在 LabVIEW 下实现设计好的算法。G 语言之所以被称之为图形化的编程语言,并不仅仅是因为它的程序又图形化的界面(前面板),最本质的原因是因为它的代码也是通过画图的方式来编写的(程序框图)。
    针对本例,可以使用 while 循环,a 和 b 分别用循环上的两对移位寄存器表示。在循环体内首先判断 a 是否被 b 整除,如果是,结束循环;否则把 b 和 a mod b 赋给两个移位寄存器,进入下一次循环。

    图形化编程语言是数据流驱动(以后再解释)的,与一般文本编程语言的过程驱动机制有很大差别,因而在程序设计的思路上也与文本编程语言有所区别。尤其是有过文本编程经验的程序员开始使用 LabVIEW 的时候,会感觉 LabVIEW 缺失了很多文本语言常用的功能,比如使用局部变量、跳出循环等等,因而 LabVIEW 用起来不是太方便。另外 LabVIEW 编写出来的的代码连线乱七八糟,造成程序阅读和维护的困难。不过这些问题其实不能算是 LabVIEW 本身的问题,主要是由于编程者还没有掌握 G 语言的编程思想造成的。
    LabVIEW 虽然不能覆盖所有文本语言的优点,但它具有自己的特色。在编写与工业领域设计、测量、控制等相关的程序或系统时,其开发效率大大高于其它语言。
    在 LabVIEW 中可以为代码添加图文并茂的注释,再加上人类对图形的识别速度远远超过对文本的分析速度,一个优秀程序员编写的 G 语言代码的可读性要高于文本语言一个层次。

相关文章:
    我和 LabVIEW

编辑

Advertisements

7 thoughts on “G 语言

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

  2. 那算來HP/ Agilent 的 VEE 也是 "G語言" 一族了http://zh.wikipedia.org/zh-tw/%E8%A6%96%E8%A6%BA%E5%8C%96%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88%E8%AA%9E%E8%A8%80

  3. 您好,得到您的指点非常高兴。
    我们的平台其实都是ivi驱动,但是不能直接用labview.我想我们新的平台可能会用labview.
    谢谢,有什么问题我还会麻烦您的。
    从您这儿得到了答案,真好。

  4. 看您的文章受益匪浅,请问可以再写写您对G语言编程思想的理解吗?
    我现在也正在用LabVIEW编程,但是很多时候想问题还是文本语言的想法,然后再转成LabVIEW的思想来实现功能的,感觉有些不对!

  5. 把 VI 编译成 DLL,我在 LabVIEW 7 下没有做过这件事情,所以不能肯定。但是 LabVIEW 8.2 我是用过的,多个 VI 可以编译在同一个 DLL 内,每个 VI 为一个被包装成一个外部函数。既然你们买了 8.2,还是用 8.2 吧。
    NI DAQ 我也没有太用过,他们提供的驱动主要是针对 LabVIEW 的,在LabVIEW下使用会比在其他语言下使用方便的多。你们的整个系统软件为什么不用 LabVIEW 开发呢?
     

  6. 你好,好不容易发现有关labview的blog,内容很好,我已经将其收藏。:)
    我是一个developer, 要写一些测试设备的驱动,但是我对labview还是无从下手。现在主要是一个对labview比较熟悉的同事先编写vi,将其编译成dll, 然后我再将它import到我的driver里,但是第一,labview编译成de动态库到了我的程序里就成了unmanaged代码,而且,这个dll居然只能包含一个成员函数,请问,这是真的吗?
    我们已经采购了labview8.20,但是还没有用它,现在只用7.1,我真想自己编写labview的vi, 这样就能把握整个driver的质量。
    第二,我们正在开发ni daq 卡的driver, 如果我们用daq的api开发,是不是自由度更大一些。
    我说了这些,不知道您能不能听懂我说什么,其实,我对labview有先天的惧怕心里,虽然有软件,但是没有真正弄懂它。

  7. 我感觉,从8.0开始有了project之后,LV才离通用的编程语言更进一步。呵呵。
    LV做递归确实复杂了一点,而且错误难以捕获。
    最近一直在看清华的那本LV的高级编程,收获不小。
    楼主的本篇Blog,稍显深度不够,嘿嘿。

发表评论

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

WordPress.com Logo

You are commenting using your WordPress.com 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 / 更改 )

Google+ photo

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

Connecting to %s