LabVIEW — первое знакомство
В относительно небольшой статье мне хотелось бы рассказать о языке программирования LabVIEW. Этот весьма любопытный продукт к сожалению не пользуется широкой популярностью, и мне хотелось бы в некоторой степени восполнить имеющийся пробел.

Что же такое «LabVIEW»?
LabVIEW — это один из основных продуктов компании National Instruments. Прежде всего надо отметить, что LabVIEW — это аббревиатура, которая расшифровывается как Laboratory Virtual Instrumentation Engineering Workbench. Уже в названии прослеживается ориентация на лабораторные исследования, измерения и сбор данных. Действительно, построить SCADA — систему в LabVIEW несколько проще чем при использовании «традиционных» средств разработки. В данной статье мне хотелось бы показать, что возможная область применения LabVIEW несколько шире. Это принципиально иной язык программирования, или если хотите целая «философия» программирования. Функциональный язык, заставляющий несколько иначе мыслить и порой предоставляющий совершенно фантастические возможности для разработчика. Является ли LabVIEW языком программирования вообще? Это спорный вопрос — здесь нет стандарта, как, например ANSI C. В узких кругах разработчиков мы говорим, что пишем на языке «G». Формально такого языка не существует, но в этом и заключается прелесть этого средства разработки: от версии к версии в язык вводятся всё новые конструкции. Сложно представить, что в следующей реинкарнации Си появится, например, новая структура для for-цикла. А в LabVIEW такое вполне возможно.
Впрочем надо заметить, что LabVIEW входит в рейтинг языков программирования TIOBE, занимая на данный момент тридцатое место — где-то между Прологом и Фортраном.
NI LabVIEW — история создания
Компания National Instruments была создана в 1976 году тремя основателями — Джеффом Кодоски (Jeff Kodosky), Джеймсом Тручардом (James Truchard) и Биллом Новлиным (Bill Nowlin) в американском городе Остин (Austin), штат Техас. Основной специализацией компании являлись инструментальные средства для измерений и автоматизация производства.
Первая версия LabVIEW увидела свет спустя десять лет после создания компании — в 1986 году (это была версия для Apple Mac). Инженеры NI решили бросить вызов «традиционным» языкам программирования и создали полностью графическую среду разработки. Основным идеологом графического подхода стал Джефф. Год за годом выпускались новые версии. Первой кроссплатформенной версией (включая Windows) была третья версия, выпущенная в 1993 году. Актуальной на данный момент является версия 8.6, вышедшая в прошлом году.
В Остине и по сегодняшний день располагается головной офис компании. Сегодня в компании работают почти четыре тысячи человек, а офисы находятся почти в сорока странах (есть также офис и в России)
Моё знакомство с LabVIEW
Моё знакомство с LabVIEW произошло почти десять лет назад. Я начал трудиться по новому контракту, и мой тогдашний шеф вручил мне пачку дисков со словами «теперь ты будешь работать на этом». Я установил LabVIEW (это была пятая версия), и поигравшись некоторое время заявил, что на ЭТОМ ничего серьёзного не сделать, уж лучше я «по старинке» на Delphi… На что он мне сказал — ты просто не распробовал. Поработай недельку-другую. Через некоторое время я пойму, что ни на чём другом, кроме LabVIEW, я уже писать не смогу. Я просто влюбился в этот язык, хотя это и не была «любовь с первого взгляда».
Вообще говоря, довольно сложно сравнивать графический и текстовый языки программирования. Это, пожалуй, сравнение из разряда «PC» против «MAC» или «Windows» против «Linux» — можно спорить сколько угодно, но спор абсолютно лишён смысла — каждая система имеет право на существование и у каждой найдутся как сторонники так и противники, кроме того у каждого продукта своя ниша. LabVIEW – всего лишь инструмент, хотя и весьма гибкий.
Так что же такое LabVIEW?
LabVIEW — это кроссплатформенная графическая среда разработки приложений. LabVIEW — в принципе универсальный язык программирования. И хотя этот продукт порой тесно связан с аппаратным обеспечением National Instruments, он тем не менее не связан с конкретной машиной. Существуют версии для Windows, Linux, MacOS. Исходные тексты переносимы, а программы будут выглядеть одинаково во всех системах. Код, сгенерированный LabVIEW также может быть также исполнен на Windows Mobile или PalmOS (справедливости ради надо отметить, что поддержка PalmOS прекращена, впрочем здесь сама Palm больше виновата). Этот язык может с успехом использоваться для создания больших систем, для обработки текстов, изображений и работы с базами данных.
- переменные (локальные или глобальные)
- ветвление (case structure)
- For – циклы с проверкой завершения и без.
- While – циклы
- Группировка операций.
LabVIEW – программа и возможности языка
В LabVIEW разрабатываемые программные модули называются «Virtual Instruments» (Виртуальные Инструменты) или по-простому VI. Они сохраняются в файлах с расширением *.vi. VIs – это кирпичики, из которых состоит LabVIEW – программа. Любая LabVIEW программа содержит как минимум один VI. В терминах языка Си можно достаточно смело провести аналогию с функцией с той лишь разницей, что в LabVIEW одна функция содержится в одном файле (можно также создавать библиотеки инструментов). Само собой разумеется, один VI может быть вызван из другого VI. В принципе каждый VI состоит из двух частей — Блок-Диаграмма (Block Diagram) и Передняя Панель (Front Panel). Блок-диаграмма — это программный код (точнее визуальное графическое представление кода), а Передняя панель — это интерфейс. Вот как выглядит классический пример Hello, World!:

В основе LabVIEW лежит парадигма потоков данных. В вышеприведённом примере константа и терминал индикатора соединены между собой линией. Эта линия называется Wire. Можно назвать её «проводом». По проводам передаются данные от одних элементов другим. Вся эта концепция называется Data Flow. Суть Блок Диаграммы — это узлы (ноды), выходы одних узлов присоединены ко входам других узлов. Узел начнёт выполнение только тогда, когда прибудут все необходимые для работы данные. На диаграмме вверху две ноды. Одна из них — константа. Этот узел самодостаточен — он начинает выполнение немедленно. Второй узел — индикатор. Он отобразит данные, которые передаёт константа (но не сразу, а как только данные прибудут от константы).
Вот чуть более сложный пример: сложение и умножение двух чисел. В традиционных языках мы напишем что-то вроде
int a, b, sum, mul;
//.
sum = a + b;
mul = a * b;
Вот как это выглядит в LabVIEW:

Обратите внимание на то, что сложение и умножение автоматически выполняются параллельно. На двухпроцессорной машине будут автоматически задействованы оба процессора.
А вот как выглядят while / for циклы и if / then / else структура:

Как уже упоминалось, все элементы будут выполняться параллельно. Вам не нужно задумываться о том, как распараллелить задачу на несколько потоков, которые можно выполнять параллельно на нескольких процессорах. В последних версиях можно даже явно указать на каком из процессоров должен выполняться тот или иной while-цикл. Сейчас существуют надстройки и для текстовых языков, позволяющие запросто добиться поддержки многопроцессорных систем, однако так просто, как на LabVIEW, это пожалуй нигде не реализовано. (ну вот, я всё же скатился на сравнение с текстовыми языками). Если уж мы заговорили о многопоточности, то надо также отметить, что в распоряжении разработчика богатый выбор инструментов для синхронизации потоков — семафоры, очереди, рандеву, и т.д.
LabVIEW включает в себя богатые наборы элементов для построения пользовательских интерфейсов. Уж на что быстро «набрасывались» интерфейсы в Дельфи, а в LabVIEW этот процесс происходит ещё стремительнее.

Стандартная поставка LabVIEW включает в себя также блоки для работы с ini файлами, реестром, функции для работы с двоичными и тестовыми файлами, математические функции, мощные инструменты для построения графиков (а куда же без этого в лаборатории-то), а в дополнение к уже упомянутой возможности вызовов DLL, LabVIEW позволяет работать с ActiveX компонентами и .net. Начиная с восьмой версии в LabVIEW была добавлена поддержка классов — язык стал объектно-ориентированным. Реализованную поддержку нельзя назвать полной, однако основные черты объектно-ориентированных языков — наследование и полиморфизм присутствуют. Также функциональность языка можно расширить дополнительными модулями, например NI Vision Toolkit – для обработки изображений и машинного зрения и другие. А при помощи модуля Applcation Builder можно сгенерировать исполняемый exe-файл. С помощью Internet Toolkit можно работать с ftp серверами, c помощью Database Connectivity Toolkit — с базами данных и т.д.
Часто можно услышать мнение, что графический код плохо читаем. Действительно, с непривычки обилие иконок и проводников несколько шокирует. Также начинающие разработчики создают программы-«простыни» и программы-«спагетти». Однако опытный LabVIEW-разработчик никогда не создаст диаграмм, превышающих размер экрана, даже если программа состоит из сотен модулей. Хорошо разработанная программа фактически «самодокументируется», поскольку в основе уже лежит графическое представление.

Довольно долгое время, программируя на LabVIEW, я пребывал в полной уверенности, что LabVIEW — это интерпретатор и блок-диаграммы постоянно интерпретируются ядром. После разговоров с инженерами NI выяснилось, что это не так. LabVIEW — это компилятор (качество кодогенерации, впрочем оставляет желать лучшего). Зато компиляция происходит «на лету» — в любой момент разработки программа всегда готова к запуску. Также LabVIEW-код может быть скомпилирован в полноценный исполнямый файл, который может быть запущен на компьютере без установленной LabVIEW (правда он требует LabVIEW Run-Time). Также можно собрать установочный пакет-инсталлятор, сторонних утилит типа InstallShield при этом не требуется.
Дальнейшее и более детальное описание возможностей пакета выходит за рамки данной статьи, я же просто предлагаю попробовать (ссылки даны ниже). Как говорили великие «… единственный способ освоить новый язык программирования — писать на нём программы». Ну а опытные программисты смогут экстраполировать полученные знания на свои собственные нужды.
Преимущества графического программирования NI LabVIEW
Чтобы лучше понять основные преимущества концепции графического программирования, стоит обратиться к истории появления первого высокоуровневого языка. В середине 50-х годов XX века, на заре развития компьютерной техники, небольшое подразделение в IBM разработало альтернативный способ программирования суперкомпьютеров IBM 704 – язык FORTRAN. В отличие от существовавшего в то время низкоуровневого языка, предложенный специалистами язык был ближе к прикладной области, проще воспринимался человеком и позволял ускорить процесс разработки.
Сперва инженерное сообщество скептически отнеслось к появлению нового языка. Способность программ, написанных на FORTRAN, работать столь же быстро, как и кропотливо созданные на низкоуровневых языках, вызывала большие сомнения. Однако довольно скоро стало ясно, что разница в производительности практически отсутствует. С другой стороны, FORTRAN позволял сократить размер исходного кода в десятки раз, поэтому не удивительно, что он быстро завоевал популярность.
Несмотря на то, что высокоуровневые языки все время совершенствуются, вопрос повышения удобства и скорости работы остается актуальным и на сегодняшний день. Это объясняет популярность и широкое распространение языка G, с тех пор как он появился в 1986 году. Этот язык предоставляет максимально возможный уровень абстракции, что позволяет пользователям работать более эффективно, практически не проигрывая в производительности кода таким языка как FORTRAN, C и C++.
LabVIEW: графическое потоковое программирование

Вторая отличительная особенность LabVIEW — это поддержка выполнения кода, написанного на языке G, в режиме потока данных (потоковое программирование), в то время как традиционные текстовые языки (например, C и C++) обеспечивают выполнение кода в виде последовательности команд. В основе языков потокового программирования (таких как G, Agilent VEE, Microsoft Visual Programming Language и Apple Quartz Composer) лежит концепция потока данных, который и определяет последовательность выполнения функциональных узлов программы.
Поначалу может показаться, что отличие подобного подхода от традиционного не существенно, однако на практике оказывается иначе. А именно, потоковое программирование в среде LabVIEW позволяет разработчику полностью сфокусироваться на данных и путях их обработки. Узлы программы — функции, циклы и прочие конструкции языка — получают данные через входы, производят их обработку и выводят данные с помощью выходов. Как только значения параметров поступают на каждый из входных терминалов узла, происходит выполнение кода узла (обработка поступивших данных), после чего значения выходных параметров оказываются доступными на выходных терминалах узла для дальнейшей их передачи на другие узлы согласно логике потока данных. Соответственно, из двух последовательно связанных узлов, второй сможет быть выполнен только после получения данных от предыдущего.
Интуитивное использование средств графического языка
Как и большинство людей, многие инженеры и ученые решают поставленные перед собой задачи, оперируя образами или символами. Подобный поход развивается в процессе обучения и применения соответствующих инструментов обработки информации – различных схем и диаграмм. Однако большинство языков программирования требуют изучения специфического синтаксиса и адаптации моделей прикладной области к возможностям языка. В тоже время, графический язык G позволяет работать с интуитивно понятными структурами.
Код языка LabVIEW удобнее для инженеров и ученых, потому что они привыкли к визуальной работе с данными, моделированию процессов с помощью блок-схем и диаграмм состояний, которые так же отражают потоки данных. Помимо этого, потоковое программирование обусловливает необходимость работать в терминологическом поле прикладной области задачи. Например, типичное приложение на LabVIEW сперва получает данные с нескольких каналов датчиков температуры, затем передает данные функции, выполняющей анализ, и, наконец, сохраняет данные на диск. Графическое представление программы наглядно демонстрирует порядок выполнение операций и потоки данных.

Интерактивные средства отладки
Поскольку концепция языка G проста для понимания, LabVIEW предоставляет в распоряжение пользователя столь же удобные и интуитивно понятные инструменты среды разработки. Например, уникальные средства отладки позволяют наглядно отобразить процесс распространения данных по проводникам, а также отобразить соответствующие значения на входах и выходах узлов кода (речь идет об анимации выполнения).

Кроме того, LabVIEW предоставляет разработчику набор инструментов отладки, аналогичных имеющимся в других средах разработки. С помощью пиктограмм на инструментальной панели блок-диаграммы вы можете запустить пошаговое выполнение кода, установить точки остановки и включить анимацию выполнения.
Отладочные средства позволяют установить пробники одновременно на многих участках программы, приостановить выполнение и выполнить вход в подпрограмму. Подобный функционал есть и в других средах разработки, однако LabVIEW, благодаря графической сути языка G, в более удобной форме отображает текущее состояние программы и взаимосвязи параллельных участков кода.

Одна из отличительных особенностей процесса отладки в LabVIEW – это скрытое компилирование кода. Пока вы работаете с кодом, компилятор постоянно проводит семантический и синтаксический анализ кода. В случае обнаружения ошибок, блокируется возможность выполнения программы, а на инструментальной панели отображается пиктограмма со сломанной стрелкой.
В такой ситуации, нажатие на кнопку запуска приводит к отображению окна с перечнем ошибок, которые необходимо исправить. Как только они буду устранены, программа может быть скомпилирована, а ее производительность будет сопоставима с программами, написанными на большинстве традиционных языков типа языка C.

Автоматическое распараллеливание
Языки потокового программирования, такие как LabVIEW, позволяют автоматически распараллеливать выполнение кода. В отличие от языков с последовательным выполнением команд, таких как C и C++, графические языки изначально содержат в себе информацию о том, какие участи кода следует выполнять параллельно. Рассмотрим, к примеру, шаблон проектирования «Производитель/Потребитель», в котором два цикла While выполняются независимо: первый цикл генерирует или получает данные, а второй – обрабатывает их. Несмотря на то, что циклы выполняются параллельно, данные между ними успешно передаются с помощью механизма очередей, которые поддерживаются и в стандартных языках.

Параллелизм также позволяет увеличить производительность программ. В настоящее время становится все более популярной новая архитектура процессоров — многоядерные процессоры.
Чтобы до конца использовать все преимущества многоядерной архитектуры процессора, программы должны содержать участки кода, которые могут выполняться независимо (т.е. быть многопоточными). В обычных текстовых языках создание и управление потоками является сложной задачей для неопытного специалиста в программировании.
Явное преимущество языка LabVIEW по сравнению с обычными текстовыми языками программирования заключается в том, что реализация многопоточных приложений является весьма простой задачей. Встроенный компилятор самостоятельно определяет участки кода, имеющие параллельно расположенные узлы, и организует раздельные потоки для их параллельного исполнения. В компьютерной терминологии такой механизм называется «неявный параллелизм», т.е. реализация параллелизма осуществляется автоматически средствами разработки, а не специально написанным кодом.
Помимо поддержки многопоточности на многоядерных системах, LabVIEW позволяет создавать приложения для параллельных вычислений на ПЛИС – интегральных микросхемах с программируемой логикой, в которых выполнение независимых участков кода организуется абсолютно независимыми участками микросхемы, которые не влияют на производительность друг друга. LabVIEW очень хорошо подходит для программирования ПЛИС, потому что в его основе лежит работа с параллельными потоками данных. Именно поэтому он становится всё более популярным среди разработчиков, которым требуются параллельные детерминированные вычисления.

Уровень абстракции низкоуровневых операций
В примере с языком FORTRAN было показано, что уровни абстракции, обеспечиваемые языками высокого уровня – их главное преимущество, которое проявляется в более наглядном виде кода по сравнению с низкоуровневыми языками. LabVIEW автоматически обеспечивает выполнение ряда задач (например, управление памятью), которое в текстовых языках обычно ложится на плечи разработчика. В подобных случаях вы самостоятельно должны обеспечить выделение памяти перед ее использованием и освобождение – после, а также следить за тем, чтобы не выйти за границы выделенной области.
Автоматическое управление памятью – одно из главных преимуществ языка LabVIEW. Когда вы пишите программу на графическом языке программирования, вам не нужно ни выделять память для переменных, ни присваивать им значения. Вместо этого, вы создаете блок-диаграмму, отражающую движение данных. Узлы блок-диаграммы, которые генерируют данные, автоматически обеспечивают выделение памяти для данных. Высвобождение памяти происходит автоматически после того как данные оказываются не нужны. Как только вы добавляете дополнительные данные в массив или строку, вызываются процедуры выделение дополнительного объема памяти. Таким образом, вы можете сосредоточиться на решении поставленной задачи, а не разбираться в тонкостях языка и не допускать ошибок при программировании.
В то же время, если вам необходимо управление памятью на низком уровне, вы можете задействовать встроенные утилиты мониторинга использования памяти, чтобы оценить эффективность разных техник программирования.

Если программа на LabVIEW демонстрирует неожиданные результаты, вы можете воспользоваться как упомянутыми выше средствами отладки, так и инструментарием для продвинутых пользователей, а именно – тулкитом Desktop Execution Trace Toolkit, который позволяет провести динамический анализ кода на наличие:
• Утечек памяти и ошибки ссылок/указателей
• Участков кода, вызывающих не желаемое поведение программы
• Участков программы, на которых может быть увеличена производительность
• Определение вызова предшествующего ошибке
• Сравнение работы кода на разных платформах

Интеграция LabVIEW с другими языками
Несмотря на то, что LabVIEW идеально подходит для организации распараллеливания кода, а также скрывает тонкости управления памятью, он не является наиболее оптимальным выбором для решения некоторых задач. В частности, математические формулы и уравнения могут быть более наглядно представлены в текстовом виде, поэтому в LabVIEW реализованы механизмы добавления на блок-диаграмму текстового кода.
Например, в LabVIEW есть узел, называющийся Formula Node, который позволяет рассчитывать значения по текстовым формулам и выполнять текстовые программы с C-подобным синтаксисом.
What Is LabVIEW?
LabVIEW is a graphical programming environment engineers use to develop automated research, validation, and production test systems.
Graphical Programming for Test and Measurement
LabVIEW has what you need to build automated test systems, fast.
- Thousands of available analysis functions
- Configurable, interactive display elements
- Drivers for automating every instrument and data acquisition hardware
- Connectivity to other languages and industry-standard protocols
LabVIEW Applications
What Can I Do with LabVIEW?
For the past 35 years, LabVIEW has been engineers’ tool of choice for developing automated test systems. From performing a simple voltage measurement to advancing space missions, discover how LabVIEW can advance your next project:
LabVIEW Editions
LabVIEW is available in three editions and is a part of the Test Workflow bundle, which scale in features and capabilities to meet your application requirements. Consider the Test Workflow bundle for LabVIEW and more NI Software. Licenses are sold as one-year subscriptions that include access to online training, degreed engineers for technical support, and software updates.