数据流驱动的编程语言

    在面向对象的编程思想出现以前,文本编程语言主要采用的是面向过程的编程方法。面向过程有时候也被称为控制流驱动的编程方法。想我以前编程序,经常要先设计一个流程图,然后,照着流程图翻译成 C 代码就行了。

    LabVIEW 程序是数据流驱动的,这与面向过程的程序还是比较相似的,但是也有一些区别。
    面向过程的程序执行起来,就只有一条线,代码按照设计好的顺序一条一条执行下去。代码中的某一条语句,即便它的输入条件都已经被满足,它也要等到它前面的代码都被执行完后,才能被运行。
    数据有时候不仅是在一条线上流动:数据线可能有分叉。而一个程序上也可能同时有多个数据在不同的线上流动。程序可以被扩展成一张网(有时候 LabVIEW 程序的框图线连得乱七八糟,就像一张网:)。一个节点运行完,数据从这个节点输出,会同时被传给所有用到它的其它节点去。一个节点只要它所有的输入都已经准备好了,就会被执行,不需要等待其它节点执行完。这样一来,经常有多个节点同时运行着的,LabVIEW 会自动把他们放到不同的线程中去运行。这就是数据流驱动的程序的一大特性:是自动多线程运行的。一般的文本编程语言,除非有显示的调用开辟新线程函数,否则所有代码都在同一个线程内顺序执行。

    自动多线程,为编程人员带来的不少方便。但是,由于多线程程序更为复杂,可能导致出错的隐患更多,LabVIEW 不得不做一些其它语言不需要做的工作,来保证用户可以方便的用 LabVIEW 开发出安全高效的程序。
    多线程程序中最常见的问题就是多个线程访问同一资源或内存时发生冲突。先以内存中的数据为例,程序运行在单线程状态下,写进这块内存的数据是什么,下次读出来一定就是你写进去的。而多线程状态下就不一定了,说不定在读写之间,内存被别的线程修改了,读出来的数据就是错误的。一般的文本语言不需要编译器来考虑如何防止用户做出类似的错误操作,因为他们默认情况下只会使用一个线程。多线程一定是在用户有意识开辟的。既然是有意识开辟的,用户在使用多线程的时候就也会留心类似的不安全问题。LabVIEW 却不能像其它语言编译器一样,不去考虑这个问题,LabVIEW 用户会在无意识的状态下就编写出多线程的程序来。如果用 LabVIEW 写出来的程序总是出错,LabVIEW 就会渐渐失去客户。
     LabVIEW 采取的保护措施之一就是它的传参方式。

相关文章:
    我和 LabVIEW

Advertisements

11 thoughts on “数据流驱动的编程语言

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

  2. 阮先生:
          您好,我想向您请教一个问题: 我现在在用labview 做测试系统,但想结合agent 的思想把整个测试系统作成多agent的形式(也就是说分成驱动agent、测试agent、数据管理agent等),请问,labview有这样的功能吗?我是不是应该先用其他的软件(如java等)先编写,然后在labview中合成呢? 

  3. 当然不能完全替代C或者java,每个语言都有自己的特色,是是和应用的场合。在某种情况下,使用LabVIEW很方便,但另一些情况就是使用其它语言更适合。如果那种语言能够被完全替代,它的生命就结束了,你也就看不到它了。LabVIEW 不是万能的,做不了的事情,比做的了的要多:)

  4. 感觉楼主说的很有道理,但是想问下,LabVIEW到底是否可以完全替换C和JAVA代码?
    感觉有的地方不能实现啊?

  5. 这个对于理解LabVIEW很有用,期待你早点写完。
    呵呵,正在拜读。
    LV中,race condition很容易就会出现。虽然它是即时编译的,也无法避免。

  6. 好奇问一下,您的专业是什么?应该是计算机吧?!不是HRM的吧?!知识涉猎面真广
    想来在企业做管理信息系统一定没问题

  7. 专业不同
       不是很懂。。不过看起来很认真。
          有时间多来你这学习学习。。

  8. 前辈,还是那句话,您适合出本书或者做讲师
    什么时候来吉大我一定去听,虽然专业南辕北辙 哈哈
    虾仁的点击和朋友数~

发表评论

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