你对LabVIEW的哪些特定功能感到沮丧?

17

请耐心等待:这不是语言争论或攻击。这是一个真正请求意见的要求。

有时,我需要帮助传统文本编码人员学习如何思考LabVIEW(LV)。在这个过程中,我经常听到他们抱怨LV的问题。很少有理性观察附带这种洞察力,除了“语言X就是好得多!”虽然这个声明对他们来说很满足,但它并没有帮助我理解他们的挫败感。

因此,对于那些既有LabVIEW又有文本语言经验的人,LV的哪些具体问题让你们感到疯狂?

------ 总结 -------

感谢所有回答!一些问题已在下面的评论中得到回答,一些问题存在于其他网站上,一些问题只是LV的真正问题。为了回答原始问题,我不会在这里尝试回答所有这些问题:请查看LAVANI的网站,您会惊喜地发现其中有多少问题可以克服。

  • 非预期并发
  • 无法访问传统文本操作工具
  • 仅有二进制源代码控制
  • 分支和合并困难
  • 窗口过多
  • 文本具有更清晰、更明确、更表达的语法
  • 清洁的编码需要大量时间和操作
  • 大型、难以访问的API/调色板系统
  • 需要鼠标
  • 文件命名空间:内存中不存在相同名称的重复文件
  • LV对象仅本地按值处理
  • 需要开发环境才能查看代码
  • 缺乏缩放功能
  • 启动缓慢
  • 占用内存较多
  • “巨大”的代码难以处理
  • UI锁定很容易发生
  • 触摸板和LV不兼容
  • 字符串操作图形化臃肿
  • UI定制性有限
  • “隐藏”的基元(是的,这些存在)
  • 缺乏官方元编程能力(不过这种情况很快就会改变)
  • 缺乏Unicode支持

我觉得原标题只是在邀请“主观和争议性”的结论。 - EBGreen
你所提到的隐藏原语是什么? - Manoj
1
@Manoj:http://lavag.org/topic/1875-vi-scripting-readme-first/。代码生成和“私有方法”。 - Joe Z
19个回答

12

LabVIEW让并发/并行编程的实现更加容易,这是真的。然而,它并没有使得调试、测试或者思考并发/并行编程变得更加容易。你仍然可以在LabVIEW中编写有bug的并发代码,并且(与任何语言、平台或工具集一样),并不存在可以使并发“完美运行”的银弹或魔法棒。

如果说有什么不同的话,那就是你必须更加谨慎地处理并发问题,因为如果你没有明确考虑和声明它,LabVIEW可能会使你原本不希望并发的部分变成并发。

还有其他问题:它不是文本。以一种使得数据流有意义的方式来表示意味着使用图形化语言,这意味着你无法使用我们几十年来一直在使用的处理文本的工具,从sed到emacs。这也意味着源代码控制应用程序必须将你的代码视为不透明二进制文件,而不是源代码。这反过来使得分支合并变成了一项痛苦的事情。


12

我非常欣赏LabView的许多方面,尤其是易于驱动硬件(当然,这只适用于National Instruments的硬件)和并发编程功能。但在代码导航方面,它与文本编程语言相比还有很大提升空间:

  • 浏览代码时,您会打开大量窗口,因为您不断地打开子VI
  • 由于单词比图标更具表现力,因此与文本语言相比,特别是像Python这样具有表现力语法的语言,您可以在一个屏幕上看到较少的指令。
  • 与其他语言不同,LabView没有我们所熟知的异常处理;错误以结构体的形式表达,并从一个VI传输到另一个VI,对于每个VI,您必须添加一段if error return; else do stuff代码。
  • 在调试期间,没有办法在错误引发时停止程序。

+1 在这个问题上,但我预计那些对LabView比对基于文本的语言更自信的人可能无法欣赏到这一点。当处理一个大型未知项目时,这尤其困难。只需想想grep如何帮助你处理文本源文件... - mghie
1
你让错误处理听起来很痛苦,但实际上并不是这样;你可以使用case结构和错误输入/输出终端创建一个模板。然后,你可以决定在哪里以及如何处理错误,如果你有多个进程同时运行,这可能是正确的做法,而这也是LabVIEW擅长的。此外,“自动错误处理”选项会在引发错误时停止执行 - 我相信这个选项从版本7开始就存在了。 - nekomatic
@nekomatic 我知道这一点,我几乎总是使用模板来处理错误情况。而且自动错误处理必须手动为每个 VI 启用。 - CharlesB
@CharlesB 有一个偏好选项可以默认为新的VI开启自动错误处理,据我所知这是新的LabVIEW安装的默认设置。这让经验丰富的用户感到疯狂;-) - nekomatic

8
Labview非常适用于控制硬件。我已经编写了几个Labview应用程序来收集数据(来自各种传感器的模拟电压)和控制硬件(主要是压电电机)。Labview使得同时执行多项任务相当容易。
现在回答您的问题。我对Labview感到沮丧的是什么。
1.花费时间组织块图 - 移动电线 - 组织节点
也许,由于我是自学的,我花费了太多时间试图清理电线并尝试跟随它们以解密它们所携带的数据及其去向。
2.通过工具箱进行指针点击,寻找我想要放置在块图或前面板中的节点/函数。
我应该只能够键入我需要的函数/方法名称和参数,然后开始工作,而不是...
“嗯...我需要计算RMS vi,现在在哪里?现在我需要一个AND操作。好的,回到顶层,到逻辑函数,这些函数中的哪一个是AND,哦,对了,就是那个。将其拖到图表上并连接测试!嗯,这只花了15分钟!”
但是,可能有一种更有效的使用Labview的方法,我只是不知道它!

1
请查看最新版本中的Quick Drop:http://zone.ni.com/devzone/cda/tut/p/id/7423 - nekomatic
看起来 Quick Drop 是在 Labview 8.6 中引入的。我猜我需要从 v8.5 升级。我会去看看它,它看起来很有用。谢谢你的提示。 - Azim J
为了清理电线和块,您可以使用自动清理命令。 工具栏上有一个按钮(右上方),可以自动清理整个图表或选定的部分。 清理设置也是可调节的(工具>选项>块图)。 - Kamran Bigdely

7

1. LabVIEW对象不通过引用传递。
2. 没有其他查看器(尤其是免费的)可用于查看块图。
3. 需要打开大量窗口来查看项目。希望它成为MDI,以减少窗口数量。


1
在2009年的版本中,有本地的按引用对象:http://zone.ni.com/devzone/cda/tut/p/id/9386。在http://tinyurl.com/mg9et3上,NI的一位开发人员表示:“迄今为止尝试过的MDI环境都没有像单独窗口的当前情况那样好。”他们正在考虑这个问题,但显然还没有解决。 - Joe Z

6

不再仅限于英语了。我们现在支持多种语言,包括中文。 - Kamran Bigdely

6
我最沮丧的事情是它让我离开了键盘。我是一个触摸打字员,在文本语言中可以编写相当快的代码。LabVIEW强制你使用鼠标从菜单中选择VI和程序节点,并将节点连接在一起。如果你习惯于在图形环境中设计电路,那么这确实很快捷方便,但如果你习惯于在代码中输入文本,则会很痛苦。
披露:距离我上次使用LabVIEW已经有大约两年时间了,所以下面的两个问题可能已经被解决了。
下一个烦恼是源代码控制。你最常做的事情之一就是将当前版本与以前的版本进行比较以查找更改。你不能用像LabVIEW这样的图形化语言来做到这一点。流行的版本控制系统如CVS和SVN在幕后使用基于文本的diff工具。我希望国家仪器为所有仍在使用LabVIEW的人提供他们自己的版本控制解决方案。
我最后的烦恼是缺乏真正的面向对象语言特性。我使用的最后一个版本是LabVIEW 6i,最多只能算是基于对象。没有人能真正地声称它是面向对象的。我无法使用继承创建真正的类层次结构,并且多态性仅适用于少数内置类型。我知道6i已经过时了,所以我真的希望这个问题已经解决了。

面向对象编程(OOP)自至少7版本以来就已经有了外部工具包。8.0版本引入了本地对象。您可以将LabVIEW与CVS和SVN一起使用。存储库可能会变得有点大,但磁盘空间很便宜。LVDiff是一个免费的LabVIEW差异工具。 - eaolson
LabVIEW自7.1版(专业开发系统及以上版本)开始内置了图形化差异比较功能。 - nekomatic
LVDiff是免费的,但需要LabVIEW专业开发系统或更高版本。 - Don Kirkby

5
  • 打开太多窗口确实很烦人。
  • 由更大的显示器编辑过的vi需要调整大小。
  • 处理其他事情时,UI会暂时锁定(也许我还没发现labview的多线程潜力)。
  • 使用触控板的笔记本电脑进行编辑非常糟糕(不要忘记小屏幕问题)。
  • 复杂的字符串操作需要大量空间(有一个用于方程的函数节点,为什么没有用于字符串操作的正则表达式节点?)
  • 有时我会在别人的代码中找到原始的vi,但在菜单中找不到它们。
  • UI只能自定义到一定程度。

我想补充一下,我认为LabVIEW非常强大和设计良好。很少有东西让我希望我能使用其他语言。


1
我真的希望Shift或Alt滚轮可以进行水平滚动。我已经在其他程序中习惯了它,而且它非常棒。 - Craig McQueen
避免UI锁定应该很容易。这可能只是正确理解数据流程,或者您可能需要更仔细地查看如何使用事件结构(如果有)或强制切换到用户界面线程的操作。请参阅帮助文档。 - nekomatic
我喜欢事件结构,导致我的代码UI锁定的原因是当我查询DAQ卡时,我相信这可以在单独的线程上完成以避免锁定问题,但这还不足以让我重新设计应用程序以避免它。 - Atilio Jobson

4
个人认为,LabView是一个非常优秀的程序,它可以高效快速地组合各种过程控制、自动化、测试和测量系统。除了继承糟糕的代码(这在任何语言中都是一个问题),通过良好的实践,LabView非常高效。就像文本编码一样,LabView也存在着良好的实践方法 - 如果你有一个混乱的VI,那么这真的是程序员的问题,而不是语言的问题。文本编码语言也可能变得非常混乱 - 责任在于程序员不要创造不必要的混乱或难以理解的代码。
如果您从未使用过LabView,建议您花时间学习它,因为只有这样,您才能更好地利用其功能。如果您开始编写代码时考虑到未来的扩展,那么创建可随程序需要增长而不会变得笨重的VI并不难。与文本代码一样,如果您带着短期的视角草率编写代码,只会使代码变得混乱且难以维护。
如果LabView让您感到沮丧,那么您可能应该使用其他工具来创建程序,或者至少对程序的某些组件使用其他工具。例如,如果您需要处理大量字符串 - 多于使用LabView的字符串函数方便的量 - 但您真正想或需要使用LabView来创建应用程序,则有许多选择。您可以轻松地在C或您喜欢的任何语言中编写DLL,然后通过LabView的DLL接口访问这些函数。这适用于任何类型的高级或抽象功能,这些功能使用基本的LabView工具实现会很麻烦。
这有两个巨大的优点 - 首先,您可以将文本编码集中在编写函数或过程上。构建应用程序围绕您的函数的任务变得不存在了。通过与LabView混合,您获得了LabView快速而强大的UI构建器和仪表连接的第二个优点。
在源代码控制方面,您可以灵活运用LabView固有的模块化能力。虽然没有文本工具可以帮助您解决未知继承代码的问题,但它确实具有其他非常强大的功能,以抽象的方式可以实现许多相同的功能。它可能是存在的最容易重构的语言,这意味着通常可以在学习代码时进行重构。
如果您访问数据源并断开连接,您会立即看到它所连接的所有内容。例如:错误列表将提供一个完整的列表,显示由于依赖于该数据源而中断的所有内容,并且您可以立即开始创建捆绑和集群来清理LabView混乱的代码。它甚至会在后台面板上突出显示损坏的数据连接,以便您可以追踪每个连接的位置。如果明确表明某些内容正在主过程中造成混乱,则可以快速将其封装为子VI。当您弄清楚代码的含义时,它就变得整洁干净,容易维护。
唯一的例外是,如果程序使用了大量不必要的全局变量。令人惊讶的是,在LabView中,全局变量也会使事情变得复杂。在这种情况下,除了咒骂留下这个烂摊子的人之外,没有其他办法。但这并不是世界末日。
简而言之,LabView是一种非常不同的语言。如果它似乎令人沮丧,那并不是因为没有工具可以像文本编码那样做你想做的事情,而只是因为它们通常以根本不同的方式实现。例如,搜索代码并不是一个终点,而只是一个手段——目的是发现程序中的链接和引用。虽然您无法搜索LabView代码,但可以以完全不同的方式发现链接和引用。这需要学习曲线。

4
不能对块图进行缩放。是的,设计应该保持在一个屏幕上或只向一个方向滚动,但我收到过一些来自第三方供应商的代码,他们似乎使用了50英寸的显示器来开发 - 代码在各个方向上无限延伸!
(2009年1月23日):使用“查看->导航窗口”查看整个图表(前面和图表面板的鸟瞰图)。这在LabVIEW决定将从块图创建的新控件放在前面的随机位置时可能会有用。

4

缺乏Diff和Merge功能(除了“专业”许可证)

我们在工作中使用SVN和TortoiseSVN。我很沮丧,因为我不能做一个diff来查看文件的变化。在使用SVN时,“diffs”是日常工作流程的一部分,所以看到文件已经改变,但不知道它是微不足道的还是重大的改变,这让人感到沮丧。进行diffs还可以系统地审查变化。

我听说“专业版”有某种diff工具。但我将很难说服管理层,让我们为了一个“diff”功能而购买专业版。而且我还没有能够得出结论,它是否真正与TortoiseSVN无缝集成。

使用源代码控制被认为是行业最佳实践之一,因此NI全面支持它将是很好的,而不仅仅是在“专业”许可证中,否则NI可能被视为阻碍最佳实践的采用。


我没有尝试过,但 LVDiff 似乎将 LabVIEW 的内置 diff 与 TortoiseSVN 或 TortoiseCVS 集成在一起:http://meta-diff.sourceforge.net/#lvdiff - Don Kirkby
1
是的,我对此感到兴奋,但它在我的许可证上无法运行,因为我的许可证不是“专业版”,所以我无法尝试它。 - Craig McQueen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接